diff --git a/manifest.json b/manifest.json index e6925dc..16820d5 100644 --- a/manifest.json +++ b/manifest.json @@ -46,7 +46,7 @@ "version": "0.0.1" }, "databricks-apps": { - "description": "Databricks Apps development and deployment (evaluates analytics vs synced tables data access)", + "description": "Build apps on Databricks Apps platform.", "files": [ "SKILL.md", "agents/openai.yaml", @@ -93,7 +93,7 @@ "version": "0.0.1" }, "databricks-core": { - "description": "Core Databricks skill for CLI, auth, and data exploration", + "description": "Databricks CLI operations: auth, profiles, data exploration, and bundles. Contains up-to-date guidelines for Databricks-related CLI tasks.", "files": [ "SKILL.md", "agents/openai.yaml", @@ -107,7 +107,7 @@ "version": "0.1.0" }, "databricks-dabs": { - "description": "Declarative Automation Bundles (DABs) for deploying and managing Databricks resources", + "description": "Create, configure, validate, deploy, run, and manage Declarative Automation Bundles (DABs, formerly Databricks Asset Bundles).", "files": [ "SKILL.md", "agents/openai.yaml", @@ -181,7 +181,7 @@ "version": "0.0.1" }, "databricks-jobs": { - "description": "Develop and deploy Lakeflow Jobs on Databricks via DABs, Python SDK, or the CLI \u2014 covers all task types, triggers, notifications, and worked examples", + "description": "Develop and deploy Lakeflow Jobs on Databricks via DABs, Python SDK, or the CLI.", "files": [ "SKILL.md", "agents/openai.yaml", @@ -196,7 +196,7 @@ "version": "0.2.0" }, "databricks-lakebase": { - "description": "Databricks Lakebase Postgres: projects, scaling, connectivity, synced tables, and Data API", + "description": "Databricks Lakebase Postgres: projects, scaling, connectivity, Lakebase synced tables, and Data API.", "files": [ "SKILL.md", "agents/openai.yaml", @@ -249,7 +249,7 @@ "version": "0.0.1" }, "databricks-model-serving": { - "description": "Databricks Model Serving endpoint management", + "description": "Manage Databricks Model Serving endpoints via CLI.", "files": [ "SKILL.md", "agents/openai.yaml", @@ -261,7 +261,7 @@ "version": "0.1.0" }, "databricks-pipelines": { - "description": "Databricks Spark Declarative Pipelines (SDP) for ETL and streaming", + "description": "Develop Lakeflow Spark Declarative Pipelines (formerly Delta Live Tables) on Databricks.", "files": [ "SKILL.md", "agents/openai.yaml", @@ -330,7 +330,7 @@ "version": "0.0.1" }, "databricks-serverless-migration": { - "description": "Migrate Databricks workloads from classic compute to serverless compute, including compatibility checks and concrete fixes", + "description": "Migrate Databricks workloads from classic compute to serverless compute.", "files": [ "SKILL.md", "agents/openai.yaml", diff --git a/scripts/skills.py b/scripts/skills.py index d678d36..45a464c 100644 --- a/scripts/skills.py +++ b/scripts/skills.py @@ -20,39 +20,19 @@ STABLE_REPO_DIR = "skills" EXPERIMENTAL_REPO_DIR = "experimental" +# Stable-skill -> Claude marketplace plugin keyword. Used by +# check_plugin_manifest to verify .claude-plugin/plugin.json keywords stay +# aligned with the shipped skills. Descriptions live in each skill's SKILL.md +# frontmatter and are synthesized into the manifest via _build_stable_entry. SKILL_METADATA = { - "databricks-core": { - "description": "Core Databricks skill for CLI, auth, and data exploration", - "plugin_keyword": "cli", - }, - "databricks-apps": { - "description": "Databricks Apps development and deployment (evaluates analytics vs synced tables data access)", - "plugin_keyword": "apps", - }, - "databricks-jobs": { - "description": "Develop and deploy Lakeflow Jobs on Databricks via DABs, Python SDK, or the CLI — covers all task types, triggers, notifications, and worked examples", - "plugin_keyword": "jobs", - }, - "databricks-lakebase": { - "description": "Databricks Lakebase Postgres: projects, scaling, connectivity, synced tables, and Data API", - "plugin_keyword": "lakebase", - }, - "databricks-dabs": { - "description": "Declarative Automation Bundles (DABs) for deploying and managing Databricks resources", - "plugin_keyword": "dabs", - }, - "databricks-model-serving": { - "description": "Databricks Model Serving endpoint management", - "plugin_keyword": "model-serving", - }, - "databricks-pipelines": { - "description": "Databricks Spark Declarative Pipelines (SDP) for ETL and streaming", - "plugin_keyword": "pipelines", - }, - "databricks-serverless-migration": { - "description": "Migrate Databricks workloads from classic compute to serverless compute, including compatibility checks and concrete fixes", - "plugin_keyword": "serverless", - }, + "databricks-core": {"plugin_keyword": "cli"}, + "databricks-apps": {"plugin_keyword": "apps"}, + "databricks-jobs": {"plugin_keyword": "jobs"}, + "databricks-lakebase": {"plugin_keyword": "lakebase"}, + "databricks-dabs": {"plugin_keyword": "dabs"}, + "databricks-model-serving": {"plugin_keyword": "model-serving"}, + "databricks-pipelines": {"plugin_keyword": "pipelines"}, + "databricks-serverless-migration": {"plugin_keyword": "serverless"}, } @@ -346,43 +326,29 @@ def _add_skill(skills: dict, entry: tuple[str, dict]) -> None: def _build_stable_entry(skill_dir: Path) -> tuple[str, dict]: - if skill_dir.name not in SKILL_METADATA: - raise ValueError( - f"Missing SKILL_METADATA entry for skill '{skill_dir.name}'. " - "Add it to SKILL_METADATA dict." - ) - - metadata = SKILL_METADATA[skill_dir.name] files = sorted(str(f.relative_to(skill_dir)) for f in iter_skill_files(skill_dir)) - skill_entry = { + return skill_dir.name, { "version": extract_version_from_skill(skill_dir), - "description": metadata.get("description", ""), + "description": synthesize_short_description(skill_dir), "repo_dir": STABLE_REPO_DIR, "files": files, } - if metadata.get("min_cli_version"): - skill_entry["min_cli_version"] = metadata["min_cli_version"] - - return skill_dir.name, skill_entry - # Experimental skills have a looser contract than stable: no agents/openai.yaml -# required, no shared-asset sync, no SKILL_METADATA entry required. Description -# is scraped from SKILL.md frontmatter on a best-effort basis. +# required and no shared-asset sync. Description comes from SKILL.md frontmatter +# verbatim (including "Use when..." triggers). def _build_experimental_entry(skill_dir: Path) -> tuple[str, dict]: files = sorted(str(f.relative_to(skill_dir)) for f in iter_skill_files(skill_dir)) - skill_entry = { + return skill_dir.name, { "version": extract_version_from_skill(skill_dir), "description": extract_description_from_skill(skill_dir), "repo_dir": EXPERIMENTAL_REPO_DIR, "files": files, } - return skill_dir.name, skill_entry - # --------------------------------------------------------------------------- # Validation diff --git a/skills/databricks-dabs/SKILL.md b/skills/databricks-dabs/SKILL.md index 4c91fd2..86cf1ce 100644 --- a/skills/databricks-dabs/SKILL.md +++ b/skills/databricks-dabs/SKILL.md @@ -1,6 +1,6 @@ --- name: databricks-dabs -description: 'Create, configure, validate, deploy, run, and manage DABs — Declarative Automation Bundles (formerly Databricks Asset Bundles) — for Databricks resources including dashboards, jobs, pipelines, alerts, volumes, and apps' +description: 'Create, configure, validate, deploy, run, and manage Declarative Automation Bundles (DABs, formerly Databricks Asset Bundles). Use when working with Databricks resources via DABs including dashboards, jobs, pipelines, alerts, volumes, and apps.' --- # Declarative Automation Bundles (DABs) diff --git a/skills/databricks-serverless-migration/SKILL.md b/skills/databricks-serverless-migration/SKILL.md index 859d01a..bac1dcd 100644 --- a/skills/databricks-serverless-migration/SKILL.md +++ b/skills/databricks-serverless-migration/SKILL.md @@ -1,6 +1,6 @@ --- name: databricks-serverless-migration -description: "Migrate Databricks workloads from classic compute to serverless compute. Scans code for serverless compatibility issues, provides concrete fixes for the serverless Spark Connect architecture, and guides the full migration to serverless environments. Use for classic-to-serverless migrations, serverless code compatibility checks, or writing new serverless-compatible notebooks and jobs. Not for classic DBR version upgrades or cluster configuration changes within classic compute." +description: "Migrate Databricks workloads from classic compute to serverless compute. Use when migrating from classic to serverless, checking serverless code compatibility, or writing new serverless-compatible notebooks and jobs. Scans code for compatibility issues, provides concrete fixes for the serverless Spark Connect architecture, and guides the full migration. Not for classic DBR version upgrades or cluster configuration changes within classic compute." compatibility: Requires databricks CLI (>= v0.292.0) metadata: version: "0.1.0"