{ "//": "Single source of truth for the databricks plugin across all targets (Claude, Codex, Copilot, Cursor). Edit this file, then run `python3 scripts/skills.py generate`. Generated from here: the 4 plugin.json (under plugins/databricks/), the 4 marketplace.json catalogs (at the repo root), and the whole plugins/databricks/ bundle (a copy/transform of skills/hooks/commands/rules/assets that agents fetch scoped). CI fails on drift. Do not hand-edit the generated files. The release version lives in the sibling version.meta.json (current_version), not here.", "name": "databricks", "description": "Databricks skills for the CLI, Apps, Lakebase, Model Serving, Lakeflow Jobs, Spark Declarative Pipelines, Declarative Automation Bundles (DABs), and classic-to-serverless migration.", "category": "development", "author": { "name": "Databricks", "url": "https://databricks.com" }, "homepage": "https://github.com/databricks/databricks-agent-skills", "repository": "https://github.com/databricks/databricks-agent-skills", "license": "LicenseRef-Databricks", "keywords_lead": ["databricks"], "keywords_tail": ["data-engineering"], "marketplace": { "name": "databricks-agent-skills", "description": "Databricks agent skills for AI coding assistants.", "owner": { "name": "Databricks" }, "displayName": "Databricks Agent Skills", "//source": "How each catalog points at the built bundle. The four plugin.json live under //, so agents fetch only (a scoped/sparse clone). ref_template is the git ref the ref-capable catalogs (Claude/Codex/Copilot) use; it is `main`, where the committed bundle lives, so installs follow the latest committed bundle. The catalogs are not pinned to release tags by design. Cursor cannot pin a ref anyway and tracks the default branch. NOTE: the Codex entry still needs its `policy` block + a remote git-subdir-at-a-tag smoke test (open question in the proposal); add `codex_policy` here once verified.", "source": { "subdir": "plugins/databricks", "repo": "databricks/databricks-agent-skills", "git_url": "https://github.com/databricks/databricks-agent-skills.git", "ref_template": "main" } }, "targets": { "claude": { "dir": ".claude-plugin", "commands": "./commands/", "hooks_render": { "out": "hooks/hooks.json", "dialect": "nested", "env_root": "${CLAUDE_PLUGIN_ROOT}", "tool_matcher": "Bash", "description": true } }, "codex": { "dir": ".codex-plugin", "hooks_render": { "out": "hooks/codex-hooks.json", "dialect": "nested", "env_root": "${PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT}}", "tool_matcher": "(?i)bash|shell|exec", "description": false }, "interface": { "displayName": "Databricks", "shortDescription": "Databricks skills and hooks for Codex.", "category": "development", "brandColor": "#FF3621", "logo": "./assets/databricks.png", "composerIcon": "./assets/databricks.svg" } }, "copilot": { "dir": ".github/plugin", "displayName": "Databricks", "hooks_render": { "out": "hooks/copilot-hooks.json", "dialect": "copilot", "tool_matcher": "(?i)bash|shell|terminal" } }, "cursor": { "dir": ".cursor-plugin", "displayName": "Databricks Skills", "commands": "./commands/", "rules": "./rules/", "hooks_render": { "out": "hooks/cursor-hooks.json", "dialect": "cursor", "tool_matcher": "Shell", "platform_flag": "--platform cursor" } } }, "//skills": "Per-skill plugin metadata. Insertion order defines the keyword order in plugin.json: keywords = keywords_lead + [each skill's keyword] + keywords_tail. Repo-owned (does NOT live in SKILL.md frontmatter, which syncs from the internal source). Prompt-routing config lives in the separate routing block below.", "skills": { "databricks-core": { "keyword": "cli" }, "databricks-data-discovery": { "keyword": "data-discovery" }, "databricks-apps": { "keyword": "apps" }, "databricks-app-design": { "keyword": "app-design" }, "databricks-lakebase": { "keyword": "lakebase" }, "databricks-model-serving": { "keyword": "model-serving" }, "databricks-jobs": { "keyword": "jobs" }, "databricks-pipelines": { "keyword": "pipelines" }, "databricks-dabs": { "keyword": "dabs" }, "databricks-serverless-migration": { "keyword": "serverless" }, "databricks-vector-search": { "keyword": "vector-search" }, "databricks-agent-bricks": { "keyword": "agent-bricks" }, "databricks-ai-functions": { "keyword": "ai-functions" }, "databricks-aibi-dashboards": { "keyword": "aibi-dashboards" }, "databricks-apps-python": { "keyword": "apps-python" }, "databricks-dbsql": { "keyword": "dbsql" }, "databricks-docs": { "keyword": "docs" }, "databricks-execution-compute": { "keyword": "execution-compute" }, "databricks-genie-agents": { "keyword": "genie-agents" }, "databricks-iceberg": { "keyword": "iceberg" }, "databricks-lakeflow-connect": { "keyword": "lakeflow-connect" }, "databricks-metric-views": { "keyword": "metric-views" }, "databricks-ml-training": { "keyword": "ml-training" }, "databricks-mlflow-evaluation": { "keyword": "mlflow-evaluation" }, "databricks-python-sdk": { "keyword": "python-sdk" }, "databricks-spark-structured-streaming": { "keyword": "structured-streaming" }, "databricks-synthetic-data-gen": { "keyword": "synthetic-data" }, "databricks-unity-catalog": { "keyword": "unity-catalog" }, "databricks-unstructured-pdf-generation": { "keyword": "pdf-generation" }, "databricks-zerobus-ingest": { "keyword": "zerobus" } }, "//routing": "Prompt-router + Cursor-rule routing config, rendered by scripts/skills.py. strong/ambiguous/suppress are regex patterns (backslashes are doubled for JSON). The router (hooks/databricks-router.py) loads the generated hooks/_routing_data.json; the Cursor rule (rules/databricks-routing.mdc) and the router instruction are both rendered from the single `table`, so the two routing tables cannot drift.", "routing": { "strong": [ "\\bdatabricks\\b", "\\bunity\\s+catalog\\b", "\\blakeflow\\b", "\\blakebase\\b", "\\bdbfs\\b", "\\bdbutils\\b", "\\bdbsql\\b", "\\bdatabricks\\.yml\\b", "\\basset\\s+bundle\\b", "\\bdabs\\b", "\\b(?:lakeflow|spark)\\s+declarative\\s+pipelines?\\b", "\\bdelta\\s+live\\s+tables?\\b", "\\bmosaic\\s+ai\\b", "\\bdelta\\s+sharing\\b", "\\bcloudfiles\\b" ], "ambiguous": [ "\\bgenie\\b", "\\bdelta\\s+(lake|tables?)\\b", "\\bdeclarative\\s+pipelines?\\b", "\\bmodel\\s+serving\\b", "\\bvector\\s+search\\b", "\\bmlflow\\b", "\\bpyspark\\b", "\\bspark\\s*\\.\\s*(sql|read|write|table)\\b", "\\bserverless\\s+(compute|warehouse|migration)\\b", "\\bmedallion\\s+(architecture|tables?)\\b", "\\bsql\\s+warehouse\\b", "\\bauto\\s+loader\\b", "\\bwhat\\s+tables?\\b", "\\bwhich\\s+(catalog|schema)\\b", "\\b(list|show|find)\\s+(the\\s+)?tables?\\b", "\\bwhere\\s+does\\s+.{1,40}\\s+(data|table|live)\\b", "\\binformation_schema\\b" ], "suppress": [ "\\bbigquery\\b", "\\bredshift\\b", "\\bsynapse\\b", "\\bsnowflake\\b", "\\bgit\\s+(commit|push|pull|status|log|diff|branch|rebase|merge|clone|stash)\\b", "\\b(read|edit|open|write|create|delete)\\s+(the\\s+|this\\s+|a\\s+|that\\s+)?file\\b", "\\bunit\\s+tests?\\b", "\\bnpm\\b", "\\bpip\\s+install\\b", "\\bdocker\\b", "\\bkubernetes\\b", "\\bjenkins(?:file)?\\b" ], "//table": "Ordered product-skill routing table. Both the router instruction and the Cursor .mdc rule render their rows from here. A skill's `note` is appended after the skill name (Genie's experimental caveat).", "table": [ { "label": "Jobs / Lakeflow / workflows", "skill": "databricks-jobs" }, { "label": "Pipelines / Lakeflow Spark Declarative Pipelines (formerly DLT)", "skill": "databricks-pipelines" }, { "label": "Apps / AppKit", "skill": "databricks-apps" }, { "label": "Asset Bundles / DABs / databricks.yml", "skill": "databricks-dabs" }, { "label": "Model Serving / endpoints", "skill": "databricks-model-serving" }, { "label": "Lakebase / Postgres", "skill": "databricks-lakebase" }, { "label": "Vector Search / RAG", "skill": "databricks-vector-search" }, { "label": "Classic-to-serverless migration", "skill": "databricks-serverless-migration" }, { "label": "Data discovery / finding & exploring data / natural-language data Q&A / SQL generation (Genie)", "skill": "databricks-data-discovery" }, { "label": "Genie Agents (formerly Genie Spaces): building, managing & tuning a curated per-data Genie Agent", "skill": "databricks-genie-agents" }, { "label": "Agent Bricks / Knowledge Assistants / Genie Spaces / Multi-Agent Supervisor", "skill": "databricks-agent-bricks" }, { "label": "AI Functions (ai_query, ai_classify, ai_extract, ai_parse_document)", "skill": "databricks-ai-functions" }, { "label": "AI/BI dashboards", "skill": "databricks-aibi-dashboards" }, { "label": "Python data apps (Streamlit, Dash, Gradio, Flask, FastAPI)", "skill": "databricks-apps-python" }, { "label": "Databricks SQL warehouses", "skill": "databricks-dbsql" }, { "label": "Databricks documentation lookup (llms.txt)", "skill": "databricks-docs" }, { "label": "Executing code on Databricks compute", "skill": "databricks-execution-compute" }, { "label": "Apache Iceberg tables / UniForm / Iceberg REST Catalog", "skill": "databricks-iceberg" }, { "label": "Lakeflow Connect managed ingestion connectors", "skill": "databricks-lakeflow-connect" }, { "label": "Metric Views / governed metrics", "skill": "databricks-metric-views" }, { "label": "ML model training", "skill": "databricks-ml-training" }, { "label": "MLflow agent / GenAI evaluation", "skill": "databricks-mlflow-evaluation" }, { "label": "Python SDK / Databricks Connect / REST API", "skill": "databricks-python-sdk" }, { "label": "Spark Structured Streaming", "skill": "databricks-spark-structured-streaming" }, { "label": "Synthetic / test data generation (Faker)", "skill": "databricks-synthetic-data-gen" }, { "label": "Unity Catalog governance, access control & system tables", "skill": "databricks-unity-catalog" }, { "label": "Synthetic PDF generation for RAG", "skill": "databricks-unstructured-pdf-generation" }, { "label": "Zerobus streaming ingest", "skill": "databricks-zerobus-ingest" } ], "instruction_preamble": "[DATABRICKS] This request is Databricks-related. Handle it through the Databricks skills rather than ad hoc commands. Use the Skill tool to load `databricks-core` first (the parent skill: CLI, auth, profile selection, data exploration), then load the product skill that matches the request:", "instruction_closing": "Then follow the skill's guidance (it drives the `databricks` CLI). If no product skill fits, databricks-core alone is enough.", "reminder": "[DATABRICKS] Databricks-related prompt: keep routing through the Databricks skills (databricks-core plus the matching product skill); load any that are not already loaded.", "rule_description": "Routing for any Databricks task -- CLI, auth, profiles, data exploration, Jobs/Lakeflow, Spark Declarative Pipelines (formerly DLT), Apps/AppKit, Asset Bundles/DABs, Model Serving, Lakebase/Postgres, Vector Search/RAG, Genie, and classic-to-serverless migration. Apply when the request is Databricks-related so the Databricks skills are loaded instead of ad hoc commands.", "rule_preamble": [ "This request is Databricks-related. Handle it through the Databricks skills", "rather than ad hoc commands. Load the `databricks-core` skill first (the parent:", "CLI, auth, profile selection, data exploration), then load the product skill", "that matches the request:" ], "rule_closing": [ "Then follow the skill's guidance (it drives the `databricks` CLI). If no product", "skill fits, databricks-core alone is enough." ] }, "//hooks": "Canonical hook wiring, rendered into each target's dialect by scripts/skills.py: hooks/hooks.json (Claude, auto-loaded), codex-hooks.json, copilot-hooks.json, cursor-hooks.json. The shared content (the scripts, their events, the description, the session-start matcher) lives here once; per-target dialect knobs (schema shape, event casing, env var, command form, tool matcher, whether the router is wired) live under targets.*.hooks_render. The router is wired only on Claude + Codex (the other two cannot inject context from a prompt-submit hook).", "hooks": { "description": "Databricks plugin hooks: route Databricks prompts into the skills, prime session context, and hint on auth failures.", "session_start_matcher": "startup|clear|compact", "entries": [ { "id": "router", "event": "prompt_submit", "script": "databricks-router.py" }, { "id": "context", "event": "session_start", "script": "databricks-context.py" }, { "id": "auth", "event": "post_tool", "script": "databricks-auth-helper.py" } ] } }