feat(skills): add metadata and branch fields to skill packs and marketplace skills

This commit is contained in:
Abhimanyu Saharan
2026-02-14 12:26:45 +05:30
parent 5b9e81aa6d
commit 40dcf50f4b
17 changed files with 1049 additions and 51 deletions

View File

@@ -23,6 +23,13 @@ def _has_table(table_name: str) -> bool:
return sa.inspect(op.get_bind()).has_table(table_name)
def _has_column(table_name: str, column_name: str) -> bool:
if not _has_table(table_name):
return False
columns = sa.inspect(op.get_bind()).get_columns(table_name)
return any(column["name"] == column_name for column in columns)
def _has_index(table_name: str, index_name: str) -> bool:
if not _has_table(table_name):
return False
@@ -30,6 +37,13 @@ def _has_index(table_name: str, index_name: str) -> bool:
return any(index["name"] == index_name for index in indexes)
def _has_constraint(table_name: str, constraint_name: str) -> bool:
if not _has_table(table_name):
return False
constraints = sa.inspect(op.get_bind()).get_check_constraints(table_name)
return any(constraint["name"] == constraint_name for constraint in constraints)
def upgrade() -> None:
if not _has_table("marketplace_skills"):
op.create_table(
@@ -42,6 +56,12 @@ def upgrade() -> None:
sa.Column("risk", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
sa.Column("source", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
sa.Column("source_url", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
sa.Column(
"metadata",
sa.JSON(),
nullable=False,
server_default=sa.text("'{}'"),
),
sa.Column("created_at", sa.DateTime(), nullable=False),
sa.Column("updated_at", sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(
@@ -55,6 +75,32 @@ def upgrade() -> None:
name="uq_marketplace_skills_org_source_url",
),
)
if not _has_column("marketplace_skills", "metadata"):
op.add_column(
"marketplace_skills",
sa.Column(
"metadata",
sa.JSON(),
nullable=False,
server_default=sa.text("'{}'"),
),
)
if _has_column("marketplace_skills", "resolution_metadata") and not _has_column(
"marketplace_skills", "metadata",
):
op.execute(
sa.text(
"UPDATE marketplace_skills SET metadata = resolution_metadata WHERE resolution_metadata IS NOT NULL"
)
)
elif _has_column("marketplace_skills", "path_metadata") and not _has_column(
"marketplace_skills", "metadata"
):
op.execute(
sa.text(
"UPDATE marketplace_skills SET metadata = path_metadata WHERE path_metadata IS NOT NULL"
)
)
marketplace_org_idx = op.f("ix_marketplace_skills_organization_id")
if not _has_index("marketplace_skills", marketplace_org_idx):
@@ -116,6 +162,18 @@ def upgrade() -> None:
sa.Column("name", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
sa.Column("description", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
sa.Column("source_url", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
sa.Column(
"branch",
sqlmodel.sql.sqltypes.AutoString(),
nullable=False,
server_default=sa.text("'main'"),
),
sa.Column(
"metadata",
sa.JSON(),
nullable=False,
server_default=sa.text("'{}'"),
),
sa.Column("created_at", sa.DateTime(), nullable=False),
sa.Column("updated_at", sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(
@@ -129,6 +187,51 @@ def upgrade() -> None:
name="uq_skill_packs_org_source_url",
),
)
if not _has_constraint(
"skill_packs",
"ck_skill_packs_source_url_github",
):
op.create_check_constraint(
"ck_skill_packs_source_url_github",
"skill_packs",
"source_url LIKE 'https://github.com/%/%'",
)
if not _has_column("skill_packs", "branch"):
op.add_column(
"skill_packs",
sa.Column(
"branch",
sqlmodel.sql.sqltypes.AutoString(),
nullable=False,
server_default=sa.text("'main'"),
),
)
if not _has_column("skill_packs", "metadata"):
op.add_column(
"skill_packs",
sa.Column(
"metadata",
sa.JSON(),
nullable=False,
server_default=sa.text("'{}'"),
),
)
if _has_column("skill_packs", "resolution_metadata") and not _has_column(
"skill_packs", "metadata"
):
op.execute(
sa.text(
"UPDATE skill_packs SET metadata = resolution_metadata WHERE resolution_metadata IS NOT NULL"
)
)
elif _has_column("skill_packs", "path_metadata") and not _has_column(
"skill_packs", "metadata"
):
op.execute(
sa.text(
"UPDATE skill_packs SET metadata = path_metadata WHERE path_metadata IS NOT NULL"
)
)
skill_packs_org_idx = op.f("ix_skill_packs_organization_id")
if not _has_index("skill_packs", skill_packs_org_idx):
@@ -141,6 +244,14 @@ def upgrade() -> None:
def downgrade() -> None:
skill_pack_github_constraint = "ck_skill_packs_source_url_github"
if _has_constraint("skill_packs", skill_pack_github_constraint):
op.drop_constraint(
skill_pack_github_constraint,
"skill_packs",
type_="check",
)
skill_packs_org_idx = op.f("ix_skill_packs_organization_id")
if _has_index("skill_packs", skill_packs_org_idx):
op.drop_index(