Skip to content

docs(upgrade): warn that v2 → v3 needs the compat plugins first (#135) - #136

Merged
oliver-kriska merged 1 commit into
mainfrom
fix/issue-135-upgrade-path
Aug 18, 2026
Merged

docs(upgrade): warn that v2 → v3 needs the compat plugins first (#135)#136
oliver-kriska merged 1 commit into
mainfrom
fix/issue-135-upgrade-path

Conversation

@oliver-kriska

Copy link
Copy Markdown
Owner

Closes #135 once released.

The reported bug

Claude Code namespaces plugin commands by the manifest name, not the install name. Through v2.14.3 the manifest said "name": "elixir-phoenix", so commands resolved as /elixir-phoenix:work while /phx:init wrote /phx:* into CLAUDE.md. The plugin never shipped a commands/ directory, so this was wrong for the whole v1/v2 line.

Already fixed in v3.0.0 (918f809) by renaming the manifest to phx. No code change needed here.

The bug that was actually still live

Checking the upgrade path turned up a second defect. v3 declares ecto and lv as manifest dependencies, and claude plugin update does not install dependencies that a new version newly declares. Because a missing dependency is a hard load failure, updating in place gives:

claude plugin update elixir-phoenix@oliver-kriska
✔ Plugin "elixir-phoenix" updated from 2.13.0 to 3.0.1

claude plugin list
❯ elixir-phoenix@oliver-kriska
  Status: ✘ failed to load
  Error: Dependency "ecto@oliver-kriska" is not installed

All 36 /phx:* commands disappear — taken down by the 3 compatibility commands. Reproduced on Claude Code 2.1.234 in an isolated CLAUDE_CONFIG_DIR, so this is not the 2.1.76–2.1.109 band found during #130; it affects every v2 user on every Claude Code version. Nothing self-heals, since auto-update is off by default for non-Anthropic marketplaces.

Also found: claude plugin install <dependent> resolves only one missing dependency per invocation, so recovery needs two runs here.

Changes

  • README.md — the staged upgrade block was already correct but described the failure as "a missing-dependency state" and sat below the fold. It now leads with a > [!WARNING], states the blast radius in commands lost, declares the 2.1.110 Claude Code floor, adds a recovery path for anyone who already updated in the wrong order, and explains the /phx: vs /elixir-phoenix: history for people searching the old prefix.
  • .claude/skills/release/ — new Iron Law 9 plus a template: upgrade-breaking releases open with the warning block carrying exact commands, phrased as what the user loses rather than as mechanism. v3.0.0 documented its staged upgrade at ~line 145 of a long changelog dump and users upgraded into a broken install anyway.
  • Makefilemake validate now covers all five manifests (elixir-phoenix, ecto, lv, catchup, marketplace) instead of two. That gap is how displayName shipped in four manifests while CI checked one.
  • CHANGELOG.md — two Fixed entries, one Changed entry under [Unreleased].

Doc-only, so no version bump — this folds into the next release.

Verification

make ci green: 236 tests, 5 manifests validated, 51 skills / 26 agents (avg 0.990 / 1.000), security scan clean.

Upgrade paths verified end-to-end in isolated config dirs on 2.1.234: broken-order repro, staged-order success, and both recovery paths.

🤖 Generated with Claude Code

Claude Code namespaces commands by the plugin manifest name, so pre-v3
versions shipped /elixir-phoenix:* while /phx:init wrote /phx:* into
CLAUDE.md. v3.0.0 fixed that by renaming the manifest to phx, and in the
same commit declared ecto and lv as dependencies.

Adding a dependency turns out to be a breaking change for installed
users. claude plugin update does not install dependencies a new version
newly declares, and a missing dependency is a hard load failure, so a
plain /plugin update leaves the plugin at "failed to load" with all 36
/phx:* commands gone. Verified on Claude Code 2.1.234, so this is not
the 2.1.76-2.1.109 band found during #130 - it hits every v2 user on
every Claude Code version, and nothing self-heals because auto-update is
off by default for non-Anthropic marketplaces.

The README's staged upgrade block was already correct but called the
failure "a missing-dependency state" and sat below the fold. It now
leads with a warning, states the blast radius in commands lost, declares
the 2.1.110 floor, adds a recovery path for anyone who already updated
in the wrong order, and explains the prefix history.

Also: the release skill gains an Iron Law and template for hoisting
upgrade warnings to the top of the release body, and make validate now
covers all five manifests instead of two - the same gap that let
displayName ship in four manifests while CI checked one.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@oliver-kriska
oliver-kriska merged commit 474793d into main Aug 18, 2026
6 checks passed
@oliver-kriska
oliver-kriska deleted the fix/issue-135-upgrade-path branch August 18, 2026 09:09
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.

command prefixes created with /elixir-phoenix:init

1 participant