Skip to content

Polish plugin manifest + add self-marketplace; rename Claude plugin to 'databricks'#77

Merged
jamesbroadhead merged 9 commits into
mainfrom
polish-plugin-json-for-anthropic-marketplace
May 27, 2026
Merged

Polish plugin manifest + add self-marketplace; rename Claude plugin to 'databricks'#77
jamesbroadhead merged 9 commits into
mainfrom
polish-plugin-json-for-anthropic-marketplace

Conversation

@jamesbroadhead
Copy link
Copy Markdown
Contributor

@jamesbroadhead jamesbroadhead commented May 18, 2026

Summary

Polish for submitting this repo to the official Anthropic Claude Code marketplace via claude.ai/settings/plugins/submit:

  • Refresh .claude-plugin/plugin.json description to match the 8 skills shipped today (drop the lingering "Unity Catalog" mention; add Lakebase, Jobs, Pipelines, serverless migration explicitly)
  • Add homepage, explicit license: LicenseRef-Databricks, author.url
  • Bump version 0.1.0 → 0.2.0
  • Rename the Claude Code plugin databricks-skillsdatabricks to match the github/gitlab/terraform/linear single-brand-word convention. Claude side only — never published, no breakage.
  • Add .claude-plugin/marketplace.json (with source: "./", verified against the official claude plugin validate .source: "." was caught by /ace-review and fixed)
  • Wire .claude-plugin/** into scripts/skills.py validate so CI fails when (a) a new skill is added without a matching plugin_keyword in plugin.json keywords, or (b) plugin/marketplace descriptions drift apart. Caught and fixed a real drift on this PR ("DABs" vs "Declarative Automation Bundles (DABs)")

Cursor side intentionally NOT renamed. .cursor-plugin/plugin.json name stays as databricks-skills and the README /add-plugin command matches. The Cursor marketplace URL slug databricks is display-only — actual install command is /add-plugin databricks-skills, and renaming would orphan existing user installs from auto-updates. Documented in new .cursor-plugin/NOTES.md. Long-term rename tracked as #78.

Why

Slack thread — fresh ask to release a Databricks Claude plugin in the official Anthropic marketplace. This repo already meets the Anthropic plugin manifest spec; this PR polishes the metadata so a reviewer doesn't bounce it for stale claims (UC) or missing fields (homepage/license), and the new CI check keeps it from drifting again as more skills land.

Review trail

Reviewed with /ace-review (two parallel GPT models). Both flagged source: "." as invalid; claude plugin validate . confirmed → fixed to "./" in commit 8841de4. Other findings (type-checking in-tree JSON, alleged install-path breakage from rename) were false positives. The Cursor-side rename was applied and then reverted after manually verifying that the Cursor marketplace install ID is databricks-skills, not databricks (commit 54ec175).

Test plan

  • python3 scripts/skills.py validate passes (verified locally — clean tree, dropped-keyword negative, description-drift negative all behave correctly)
  • claude plugin validate . passes (verified locally)
  • jq empty .claude-plugin/plugin.json && jq empty .claude-plugin/marketplace.json && jq empty .cursor-plugin/plugin.json

This pull request and its description were written by Isaac.

…arketplace submission

Polish for submission to the official Anthropic Claude Code marketplace
(claude.ai/settings/plugins/submit):

- Refresh plugin.json description to match the 8 skills actually
  shipped today (drop "Unity Catalog", add Lakebase, Jobs, Pipelines,
  serverless migration).
- Add `homepage` and explicit `license` (LicenseRef-Databricks) fields.
- Add `author.url` for the marketplace listing.
- Bump version 0.1.0 -> 0.2.0 to reflect the additional skills shipped
  since 0.1.0.

Also add a top-level .claude-plugin/marketplace.json so the repo is
directly installable in Claude Code without waiting on the official
marketplace review:

  /plugin marketplace add databricks/databricks-agent-skills
  /plugin install databricks-skills@databricks-agent-skills

README updated to document the new install path and to enumerate all 8
shipped skills (was only listing databricks-apps).

Co-authored-by: Isaac
Signed-off-by: James Broadhead <james.broadhead@databricks.com>
We don't want to advertise marketplace-style install in the README;
`databricks experimental aitools install` stays as the recommended,
client-agnostic path. The `.claude-plugin/marketplace.json` from the
previous commit is still useful (anyone who explicitly wants the
plugin-style install can use it, and it's what the Anthropic marketplace
submission references), but the README shouldn't push users there.

Co-authored-by: Isaac
Signed-off-by: James Broadhead <james.broadhead@databricks.com>
When a new skill lands without a corresponding bump in
.claude-plugin/plugin.json / .claude-plugin/marketplace.json, the
Claude Code marketplace listing silently goes stale. Extend the
existing `scripts/skills.py validate` (already a required CI gate via
.github/workflows/validate-manifest.yml) to catch this drift.

What's enforced:

  - SKILL_METADATA now carries a `plugin_keyword` per skill. validate
    fails if any skill's plugin_keyword is missing from plugin.json
    `keywords` — so adding a new skill forces a thoughtful keyword
    update.
  - plugin.json `description` and marketplace.json plugin entry
    `description` must match exactly. They drift independently
    otherwise (already happened on this PR — caught and fixed:
    "DABs" vs "Declarative Automation Bundles (DABs)").

Also widen the validate-manifest.yml `paths:` filter to cover
.claude-plugin/** so edits to the manifests themselves get checked.

Tested locally:
  - clean tree: `python3 scripts/skills.py validate` -> "Everything is up to date."
  - drop a keyword: surfaces the missing-keyword error.
  - drift the descriptions: surfaces the mismatch error.

Co-authored-by: Isaac
Signed-off-by: James Broadhead <james.broadhead@databricks.com>
Match the github/gitlab/firebase/terraform/linear naming convention in
the official Anthropic Claude Code marketplace — a brand-owner plugin
gets the brand-owner name. Scoped to .claude-plugin/ only.

.cursor-plugin/plugin.json is intentionally left as "databricks-skills"
— that's Cursor's marketplace namespace, already published, and a
rename there would break existing Cursor installs.

Skill names (databricks-core, databricks-apps, ...) are unchanged, so
they'll surface in Claude Code as /databricks:databricks-core etc.
The prefix doubling is awkward but not user-visible in skill
auto-discovery; renaming the skills themselves is a separate, larger
change that would need to roll through Cursor too.

Co-authored-by: Isaac
Signed-off-by: James Broadhead <james.broadhead@databricks.com>
@jamesbroadhead jamesbroadhead changed the title Polish plugin manifest + add self-marketplace for Anthropic Claude marketplace submission Polish plugin manifest + add self-marketplace; rename Claude plugin to 'databricks' May 18, 2026
Copy link
Copy Markdown
Member

@pkosiec pkosiec left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚀 LGTM

The official `claude plugin validate .` tool rejects `source: "."`:

  ✘ plugins.0.source: Invalid input
  ✘ Validation failed

The Anthropic canonical convention (anthropics/claude-code,
anthropics/claude-plugins-official) is always `./<subdir>` paths.
`"./"` is the minimum-touch fix that satisfies the schema while
keeping the plugin rooted at the repo root.

Caught by two-of-two parallel GPT reviewers via /ace-review against
this PR before merge.

Co-authored-by: Isaac
Signed-off-by: James Broadhead <james.broadhead@databricks.com>
…ide)

The name disparity between .claude-plugin (databricks) and .cursor-plugin
(databricks-skills) was a footgun for anyone reading the repo. Align
them — the Cursor plugin uses the brand name too, matching the
github/gitlab/terraform/linear convention used by both marketplaces.

Also update the README install instruction:
  /add-plugin databricks-skills  ->  /add-plugin databricks

TODO (post-merge): re-publish to the Cursor marketplace under the new
slug. The existing listing at cursor.com/marketplace/skills/databricks
will need updating; Eric Zakariasson (cursor) filed the original
.cursor-plugin/plugin.json (PR #14) and is the right contact for
whether the rename needs a fresh submission or an in-place update.
Tracked as a follow-up issue on this repo.

Co-authored-by: Isaac
Signed-off-by: James Broadhead <james.broadhead@databricks.com>
Earlier in this PR I renamed .cursor-plugin/plugin.json name from
databricks-skills -> databricks to match the Claude side. That was a
mistake: the Cursor marketplace listing at cursor.com/marketplace/databricks
shows the actual install command as `/add-plugin databricks-skills` —
the URL slug `databricks` is a display-only marketing slug Cursor picked,
not the install identifier. The install ID has been databricks-skills
since the plugin was first listed (~2026-02-12), and multiple
Databricks teams have been pointing customers at that listing for months.

Renaming the install ID would orphan every existing Cursor user's
~/.cursor/plugins/databricks-skills/ cache from auto-updates until they
manually reinstall under the new name. Not worth the consistency win.

Restore:
  .cursor-plugin/plugin.json: name -> "databricks-skills"
  README.md: /add-plugin databricks-skills

Add .cursor-plugin/NOTES.md explaining why the asymmetry between
.cursor-plugin (databricks-skills) and .claude-plugin (databricks) is
deliberate, with the long-term rename plan deferred to issue #78.

Claude side is unchanged — never published anywhere as databricks-skills,
so it's free to use the cleaner brand-name identifier.

Co-authored-by: Isaac
Signed-off-by: James Broadhead <james.broadhead@databricks.com>
Issue #78 closed as not planned. Replace the speculative "future
major-version bump" language with an explicit "this asymmetry is
permanent; leave it alone."

Co-authored-by: Isaac
Signed-off-by: James Broadhead <james.broadhead@databricks.com>
…r-anthropic-marketplace

# Conflicts:
#	.claude-plugin/marketplace.json
#	scripts/skills.py
@jamesbroadhead jamesbroadhead merged commit a6da289 into main May 27, 2026
1 check passed
@jamesbroadhead jamesbroadhead deleted the polish-plugin-json-for-anthropic-marketplace branch May 27, 2026 14:39
simonfaltum added a commit that referenced this pull request May 27, 2026
Resolves scripts/skills.py conflicts with #91 (unified Codex metadata)
and #77 (plugin manifest validation).

- Strip `description` field from SKILL_METADATA (point of this PR);
  keep `plugin_keyword` field because #77 added a validation that
  consumes it for .claude-plugin/plugin.json keyword coverage checks.
- Drop the openai_yaml existence check from `_build_stable_entry`;
  #91 moved that check into `check_codex_metadata` at validate time.

Co-authored-by: Isaac
simonfaltum added a commit that referenced this pull request May 28, 2026
…atter (#100)

Follow-up to #95 (per
[comment](#95 (comment))).

## Why

`SKILL_METADATA` in `scripts/skills.py` carried one field per stable
skill (`description`). Each skill already has the same `description:` in
its `SKILL.md` frontmatter, and `_build_experimental_entry` already
reads from frontmatter via `extract_description_from_skill`. Stable
skills duplicated, and the dict copy won silently. The two had drifted
on main (e.g. `databricks-apps`: dict said "Databricks Apps development
and deployment (evaluates analytics vs synced tables data access)" while
frontmatter says "Build apps on Databricks Apps platform. Use when
...").

Frontmatter is the natural source of truth: it is what agents see when
deciding whether to activate the skill, and the agents/openai.yaml
`short_description` is already derived from it. Making the manifest
description follow the same path closes the gap.

## Changes

`_build_stable_entry` now calls
`synthesize_short_description(skill_dir)` (the same helper used to build
`agents/openai.yaml` short_description). It reads from frontmatter and
strips the `. Use when ...` / `. Use this ...` / `. Triggers ...` / `.
ALWAYS ...` trigger phrases, leaving a clean marketplace blurb.

The `description` field is dropped from the `SKILL_METADATA` dict. The
dict stays (per-skill `plugin_keyword`) because #77's
`check_plugin_manifest` validation looks them up to verify
`.claude-plugin/plugin.json` keyword coverage. Only the duplicated
description field goes.

Diff for the 8 stable skill descriptions in `manifest.json`:

| Skill | Before (dict) | After (synthesized from SKILL.md) |
|---|---|---|
| `databricks-apps` | Databricks Apps development and deployment
(evaluates analytics vs synced tables data access) | Build apps on
Databricks Apps platform. |
| `databricks-core` | Core Databricks skill for CLI, auth, and data
exploration | Databricks CLI operations: auth, profiles, data
exploration, and bundles. Contains up-to-date guidelines for
Databricks-related CLI tasks. |
| `databricks-dabs` | Declarative Automation Bundles (DABs) for
deploying and managing Databricks resources | Create, configure,
validate, deploy, run, and manage Declarative Automation Bundles (DABs,
formerly Databricks Asset Bundles). |
| `databricks-jobs` | Develop and deploy Lakeflow Jobs on Databricks via
DABs, Python SDK, or the CLI, covers all task types, triggers,
notifications, and worked examples | Develop and deploy Lakeflow Jobs on
Databricks via DABs, Python SDK, or the CLI. |
| `databricks-lakebase` | Databricks Lakebase Postgres: projects,
scaling, connectivity, synced tables, and Data API | Databricks Lakebase
Postgres: projects, scaling, connectivity, Lakebase synced tables, and
Data API. |
| `databricks-model-serving` | Databricks Model Serving endpoint
management | Manage Databricks Model Serving endpoints via CLI. |
| `databricks-pipelines` | Databricks Spark Declarative Pipelines (SDP)
for ETL and streaming | Develop Lakeflow Spark Declarative Pipelines
(formerly Delta Live Tables) on Databricks. |
| `databricks-serverless-migration` | Migrate Databricks workloads from
classic compute to serverless compute, including compatibility checks
and concrete fixes | Migrate Databricks workloads from classic compute
to serverless compute. |

Two stable skills had frontmatter descriptions that didn't synthesize
cleanly (long single sentence, no trigger marker, so the 200-char length
cap kicked in mid-word). Reshaped both to put the blurb in the first
sentence followed by `Use when ...`:

- `databricks-dabs`: split `DABs ... for Databricks resources including
...` into `manage DABs. Use when working with Databricks resources
including ...`. Also dropped em dashes per house style.
- `databricks-serverless-migration`: moved the `Use for ...` trigger
list up to the second sentence (rephrased as `Use when ...`), kept the
rest.

Also dropped the unused `min_cli_version` branch in
`_build_stable_entry`. No stable skill currently sets it; same
dead-plumbing rationale as #95.

Experimental skills are untouched, they still use
`extract_description_from_skill` (verbatim frontmatter, including any
`Use when ...` triggers). That contract was deliberate and is out of
scope for this change.

## Test plan

- [x] `python3 scripts/skills.py generate` clean.
- [x] `python3 scripts/skills.py validate` passes.
- [x] All 8 stable descriptions in `manifest.json` are complete
sentences (no mid-word truncation).
- [x] Experimental descriptions in `manifest.json` unchanged (`git diff
manifest.json` shows only stable description deltas).
- [ ] CI green on this branch.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants