Skip to content

fix(cli): carry the catalog's recommended field under metadata, where Claude Code does not warn - #803

Merged
blafourcade merged 1 commit into
nextfrom
fix/recommended-under-metadata
Sep 9, 2026
Merged

fix(cli): carry the catalog's recommended field under metadata, where Claude Code does not warn#803
blafourcade merged 1 commit into
nextfrom
fix/recommended-under-metadata

Conversation

@blafourcade

Copy link
Copy Markdown
Contributor

🎯 What & why

claude plugin validate warned plugins[7].recommended: Unknown field 'recommended'. Claude Code ignores it at load time on our source catalog and on every claude build, and #795 made CI run that validation on each pull request. A warning that never goes away trains everyone to ignore the next one. The field is ours: aidd setup and plugin search --recommended draw the curated install path from it.

🛠️ How it works

  • Measured against Claude Code's validator with a throwaway marketplace: a plugin entry's metadata object is the one placement that passes silently (metadata.recommended, any content). category, tags, keywords pass too but are official fields with their own meaning; x-recommended, a top-level x-aidd, and metadata.* at marketplace level all warn.
  • The field moves under each entry's metadata: the source catalog (8 entries), the five fixtures, assets/schemas/claude-marketplace-manifest.json, scripts/validate-json.mjs, the parser in distribution/domain/catalog.ts (which reads no other spelling), and the claude-style catalog every build writes (tools/domain/marketplace-catalog.ts).
  • The nine-cell golden is re-baselined for claude and cursor, whose marketplace-mode catalogs now carry metadata.recommended; the seven other cells are byte-identical.
  • docs/CREATE_PLUGIN.md says where the field goes and why.

🧪 How to verify

  • claude plugin validate . at the repository root → ✔ Validation passed, no warning.
  • node scripts/check-claude-accepts-build.cjs✔ Validation passed, no warning (was "passed with warnings").
  • cd cli && pnpm vitest run tests/contexts/distribution/domain/catalog.unit.test.ts tests/contexts/tools/domain/marketplace-catalog.unit.test.ts
  • Red first: expected false to be true (parser), expected undefined to strictly equal { recommended: false } (builder).
  • Locally green: typecheck, lint, arch (126), knip, unit+integration (4282), e2e (297, golden included), build, smoke (FAIL 0), repository scripts (441), type honesty, doc checks.

⚠️ Heads-up

  • A CLI older than this one reads a catalog carrying the new spelling as "nothing recommended": setup then proposes no curated set until aidd update. The CLI and the catalog release together, so only a user pinning an old CLI against the new marketplace ref sees it.
  • The parser reads one spelling on purpose; a third-party catalog written with a top-level recommended (none known) is read as not recommended.

🔗 Linked issue

Closes #800

✅ I certify

  • I DO CERTIFY I READ EACH LINE OF THE PULL REQUEST BECAUSE I AM A SOFTWARE ENGINEER, NOT A AI PUPPY.

🤖 Generated with Claude Code

https://claude.ai/code/session_011x4ms5qcGuZgYhCxfdHMUb

… Claude Code does not warn

`claude plugin validate` warned `Unknown field 'recommended'` on our source catalog and on
every claude build, and CI now runs that validation on each pull request. Measured against
Claude Code's validator: a plugin entry's `metadata` object is the one place a catalog may
carry its own field without a warning, while `category`, `tags` and `keywords` are official
and mean something else. The field moves there: the source catalog, the fixtures, the schema,
the repository validator, the parser (which reads no other spelling) and the claude-style
catalog every build writes. The nine-cell golden is re-baselined for claude and cursor, whose
catalogs now carry `metadata.recommended`.

Red first: the parser test failed with `expected false to be true`, the catalog builder test
with `expected undefined to strictly equal { recommended: false }`.

Closes #800

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011x4ms5qcGuZgYhCxfdHMUb
AIDD-Session-Id: 4acc9a1c-19bc-4468-b8b6-e86644bcba60
@blafourcade
blafourcade requested a review from a team as a code owner September 9, 2026 17:20
@blafourcade
blafourcade merged commit 4531b74 into next Sep 9, 2026
28 checks passed
@aidd-bot aidd-bot Bot mentioned this pull request Sep 9, 2026
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.

1 participant