Skip to content

fix(setup): the headless reconfigure recipe drops install scope and the non-TTY uninstall confirmation in 19 plugins #1406

Description

@kyle-sexton

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.

Metadata

Metadata

Assignees

Labels

agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.priority: mediumReal value, no hard deadline; normal backlog flow.status: readyTriaged, unblocked, and fully specified; eligible to pick up.work-class: mechanicalDeterministic, trivially reversible maintenance: dependency bumps, lint/format, sync.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions