The headless-reconfigure recipe (claude plugin uninstall <p> then claude plugin install <p>@<marketplace> --config ...) appears in 21 setup skills. Two of them — session-flow and rate-limit-guard — are fixed in #1393, where a review caught the defect. The other 19 carry the same two bugs.
The defects
1. Scope is not preserved. Both claude plugin uninstall and claude plugin install default to -s user (verified against claude plugin uninstall --help / claude plugin install --help on 2.1.220). When a plugin is installed at project or local scope, the unscoped recipe removes a separate user record while the effective project/local install keeps loading, and the reinstall lands at a scope that does not load. Scope precedence is local > project > user per plugins/claude-ops/skills/plugins/context/scope-semantics.md.
2. The headless uninstall has no non-interactive confirmation. plugins/claude-ops/skills/plugins/context/converge.md records that a non-TTY uninstall requires -y. Every one of these recipes is explicitly the headless route, so in a genuine headless/CI invocation it stops at the uninstall.
The fix
Both halves take -s <scope>; the uninstall takes -y. claude plugin list reports the installed scope per plugin, and a project/local scope also requires running from that project's directory. -y is warranted only because the caller explicitly asked to reconfigure — never to bypass a confirm the operator has not given (converge.md's own caveat).
See the fixed wording in #1393: plugins/session-flow/skills/setup/SKILL.md and plugins/rate-limit-guard/skills/setup/SKILL.md.
Remaining 19
actionlint, ai-briefing, bash-format, biome-format, claude-ops, desktop-notification, disk-hygiene, eol-normalizer, go-format, guardrails, knowledge, machine-health, markdown-format, planning, powershell-format, ruff-format, skill-quality, source-control, typos-format
Each needs a patch bump and a CHANGELOG entry alongside the wording change.
Worth considering
Twenty-one hand-copied restatements of one CLI contract is the drift surface that produced this. A single owned home for the recipe, cited rather than restated, would have made this a one-line fix — but ${CLAUDE_PLUGIN_ROOT} is per-plugin, so a shared source needs a real mechanism (sync, or a generated block), not just a pointer.
The headless-reconfigure recipe (
claude plugin uninstall <p>thenclaude plugin install <p>@<marketplace> --config ...) appears in 21 setup skills. Two of them —session-flowandrate-limit-guard— are fixed in #1393, where a review caught the defect. The other 19 carry the same two bugs.The defects
1. Scope is not preserved. Both
claude plugin uninstallandclaude plugin installdefault to-s user(verified againstclaude plugin uninstall --help/claude plugin install --helpon 2.1.220). When a plugin is installed atprojectorlocalscope, the unscoped recipe removes a separate user record while the effective project/local install keeps loading, and the reinstall lands at a scope that does not load. Scope precedence islocal > project > userperplugins/claude-ops/skills/plugins/context/scope-semantics.md.2. The headless uninstall has no non-interactive confirmation.
plugins/claude-ops/skills/plugins/context/converge.mdrecords that a non-TTYuninstallrequires-y. Every one of these recipes is explicitly the headless route, so in a genuine headless/CI invocation it stops at the uninstall.The fix
Both halves take
-s <scope>; the uninstall takes-y.claude plugin listreports the installed scope per plugin, and aproject/localscope also requires running from that project's directory.-yis warranted only because the caller explicitly asked to reconfigure — never to bypass a confirm the operator has not given (converge.md's own caveat).See the fixed wording in #1393:
plugins/session-flow/skills/setup/SKILL.mdandplugins/rate-limit-guard/skills/setup/SKILL.md.Remaining 19
actionlint,ai-briefing,bash-format,biome-format,claude-ops,desktop-notification,disk-hygiene,eol-normalizer,go-format,guardrails,knowledge,machine-health,markdown-format,planning,powershell-format,ruff-format,skill-quality,source-control,typos-formatEach needs a patch bump and a CHANGELOG entry alongside the wording change.
Worth considering
Twenty-one hand-copied restatements of one CLI contract is the drift surface that produced this. A single owned home for the recipe, cited rather than restated, would have made this a one-line fix — but
${CLAUDE_PLUGIN_ROOT}is per-plugin, so a shared source needs a real mechanism (sync, or a generated block), not just a pointer.