feat: dev-workflows-fullstack plugin + sync-time deprecation/namespace hooks#123
Merged
Merged
Conversation
…nd namespace-rewrite hooks Introduces dev-workflows-fullstack as a single plugin combining backend and frontend workflows, so fullstack users can avoid the duplicate skill descriptions caused by installing dev-workflows and dev-workflows-frontend together. Adds two declarative sync hooks driven by a sidecar config file (.claude-plugin/sync-overrides.json) and applied by scripts/sync-plugins.mjs: - deprecations: prepends a (Deprecated) notice to a skill or agent description in a specific plugin output (idempotent, YAML-quoted to keep frontmatter parseable). - namespace_rewrites: rewrites subagent_type prefixes in copied .md files; longer "from" runs first to avoid prefix-overlap miswrites, and validation enforces trailing colons. Hooks live outside marketplace.json because `claude plugin validate` rejects unknown keys there. In dev-workflows, recipe-fullstack-build and recipe-fullstack-implement now carry a (Deprecated) prefix pointing users to dev-workflows-fullstack. The recipes still work in this release and will be removed from dev-workflows next release. README Quick Start, the duplicate-skills warning, and the recipe table are updated to match. Lefthook is extended to sync, validate, and re-add the new dev-workflows-fullstack subdirectory. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The .claude-plugin/ directory is reserved for official Claude Code plugin manifests (marketplace.json, plugin.json). Putting our private sync-tooling config there risks future collisions if the official tooling adds new recognized files or starts walking the directory more strictly. Co-locate the file with its consumer (scripts/sync-plugins.mjs) instead, and update lefthook globs and the inline note accordingly. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The double-quote wrapping in injectDeprecationNotice() was added when the
notice still contained "[Deprecated]", which collides with YAML flow
sequences. The current notice ("(Deprecated) ...") is YAML-safe as plain
text, so the wrapping is unnecessary work that produces uglier output.
Drop unquoteYamlDouble / quoteYamlDouble and prepend directly.
mergeOverrides() now restricts sync-overrides.json to deprecations and
namespace_rewrites; any other key (name, source, agents, skills, version,
etc.) raises an error so the file cannot accidentally hijack plugin shape.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
dev-workflows-fullstack, a single plugin combining backend and frontend workflows so fullstack users avoid the duplicate skill descriptions caused by installingdev-workflowsanddev-workflows-frontendtogether..claude-plugin/sync-overrides.json(kept outsidemarketplace.jsonbecauseclaude plugin validaterejects unknown keys):deprecations: prepends a(Deprecated)notice to a target skill/agent description in a specific plugin output. Idempotent. Description is YAML-double-quoted so the resulting frontmatter stays parseable.namespace_rewrites: rewritessubagent_typeprefixes in copied.mdfiles. Longerfromruns first to avoid prefix-overlap miswrites; validation enforces trailing colons.recipe-fullstack-buildandrecipe-fullstack-implementas(Deprecated)indev-workflows. The recipes still work in this release; they are scheduled for removal in the next release. README Quick Start, the duplicate-skills warning, and the recipe table are updated.lefthook.ymlto sync, validate, and re-add the newdev-workflows-fullstacksubdirectory.Why
Installing
dev-workflowsanddev-workflows-frontendside-by-side registers 12 shared skills twice (once per plugin namespace), pushing the skill-description budget toward Claude Code's ~2% context-window limit and causing skills to be silently dropped.dev-workflows-fullstackconsolidates both sides into one namespace.Direct removal of fullstack recipes from
dev-workflowswould break existing users on first upgrade. The(Deprecated)prefix makes the migration visible the moment a user types/recipe-fullstack-...while keeping the recipe functional for one release.Implementation notes
dev-workflows-fullstack/is a generated subdirectory (same pattern as the other in-repo plugins).pnpm syncregenerates it from canonical/skillsand/agents.claude -p --plugin-dir: bare agent names (echo-agent) fail to resolve, prefixed names (myplug:echo-agent) succeed. That is whynamespace_rewritesis needed instead of stripping prefixes from the canonical sources.claude plugin validateis strict and rejects unknown keys, so the sync hooks live in a sidecarsync-overrides.jsonrather than inmarketplace.json.Test plan
pnpm syncthenpnpm sync:check— drift-freeclaude plugin validatepasses for marketplace + all four in-repo pluginspnpm syncis idempotent (no double-prefixed deprecation notices, no double-rewritten namespaces)dev-workflows-fullstack/contains zero straydev-workflows:ordev-workflows-frontend:references; all 82 references are nowdev-workflows-fullstack:dev-workflows/anddev-workflows-frontend/are unchanged in their subagent prefixesnamespace_rewritesvalidation (missing trailing colon) reports a clear errordev-workflows-fullstackin a fresh Claude Code session and run/recipe-fullstack-implementwith a small prompt🤖 Generated with Claude Code