Skip to content

feat: dev-workflows-fullstack plugin + sync-time deprecation/namespace hooks#123

Merged
shinpr merged 3 commits into
mainfrom
feat/fullstack-plugin-and-deprecation-sync
May 7, 2026
Merged

feat: dev-workflows-fullstack plugin + sync-time deprecation/namespace hooks#123
shinpr merged 3 commits into
mainfrom
feat/fullstack-plugin-and-deprecation-sync

Conversation

@shinpr
Copy link
Copy Markdown
Owner

@shinpr shinpr commented May 7, 2026

Summary

  • Adds dev-workflows-fullstack, a single plugin combining backend and frontend workflows so fullstack users avoid the duplicate skill descriptions caused by installing dev-workflows and dev-workflows-frontend together.
  • Adds two declarative sync hooks in .claude-plugin/sync-overrides.json (kept outside marketplace.json because claude plugin validate rejects 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: rewrites subagent_type prefixes in copied .md files. Longer from runs first to avoid prefix-overlap miswrites; validation enforces trailing colons.
  • Marks recipe-fullstack-build and recipe-fullstack-implement as (Deprecated) in dev-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.
  • Updates lefthook.yml to sync, validate, and re-add the new dev-workflows-fullstack subdirectory.

Why

Installing dev-workflows and dev-workflows-frontend side-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-fullstack consolidates both sides into one namespace.

Direct removal of fullstack recipes from dev-workflows would 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 sync regenerates it from canonical /skills and /agents.
  • Verified end-to-end with claude -p --plugin-dir: bare agent names (echo-agent) fail to resolve, prefixed names (myplug:echo-agent) succeed. That is why namespace_rewrites is needed instead of stripping prefixes from the canonical sources.
  • claude plugin validate is strict and rejects unknown keys, so the sync hooks live in a sidecar sync-overrides.json rather than in marketplace.json.

Test plan

  • pnpm sync then pnpm sync:check — drift-free
  • claude plugin validate passes for marketplace + all four in-repo plugins
  • Re-running pnpm sync is idempotent (no double-prefixed deprecation notices, no double-rewritten namespaces)
  • dev-workflows-fullstack/ contains zero stray dev-workflows: or dev-workflows-frontend: references; all 82 references are now dev-workflows-fullstack:
  • dev-workflows/ and dev-workflows-frontend/ are unchanged in their subagent prefixes
  • Negative test on namespace_rewrites validation (missing trailing colon) reports a clear error
  • Manual smoke: install dev-workflows-fullstack in a fresh Claude Code session and run /recipe-fullstack-implement with a small prompt

🤖 Generated with Claude Code

shinpr and others added 2 commits May 7, 2026 17:43
…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>
@shinpr shinpr self-assigned this May 7, 2026
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>
@shinpr shinpr merged commit c371835 into main May 7, 2026
1 check passed
@shinpr shinpr deleted the feat/fullstack-plugin-and-deprecation-sync branch May 7, 2026 09:00
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