From 6f034f4632baf7dabed300438de3e32241262fae Mon Sep 17 00:00:00 2001 From: Rehan Masood Date: Tue, 20 Oct 2026 18:57:48 -0400 Subject: [PATCH 1/2] Migrate titan-receipts installs to commitproof with a renames entry Installs made under the old plugin name broke when the plugin became commitproof: after a marketplace update, `claude plugin update titan-receipts@titan-receipts-marketplace` failed with "Plugin titan-receipts not found" and the plugin showed "failed to load". marketplace.json now maps titan-receipts to commitproof in a top-level renames map, the documented way to migrate users after a plugin rename. Checked end to end in an isolated Claude Code 2.1.299 config: an existing titan-receipts 1.2.0 install loads again after the marketplace update, its enabledPlugins key is rewritten to commitproof, and one `claude plugin install commitproof@titan-receipts-marketplace` brings it to 1.3.1. CHANGELOG.md tells existing users that one step. test_rename.py pins the map. The old-name check now allows the old name only inside it. Co-Authored-By: Claude Opus 5.5 --- .claude-plugin/marketplace.json | 3 +++ CHANGELOG.md | 21 +++++++++++++++++++++ tests/test_rename.py | 15 ++++++++++++++- 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index aa251ac..6d6c099 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -5,6 +5,9 @@ "name": "Rehan Masood", "url": "https://github.com/Rmasood1122" }, + "renames": { + "titan-receipts": "commitproof" + }, "plugins": [ { "name": "commitproof", diff --git a/CHANGELOG.md b/CHANGELOG.md index 18e6f5f..a914e00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,26 @@ # Changelog +## Unreleased + +Installs made under the old name (`titan-receipts@titan-receipts-marketplace`) +stopped loading after a marketplace update once the plugin became +`commitproof`: Claude Code reported `Plugin "titan-receipts" not found` and the +plugin showed "failed to load". The marketplace now carries a `renames` entry +(`titan-receipts` -> `commitproof`), so those installs load again and their +settings move to the new name on the next marketplace update. Claude Code has +followed `renames` automatically since 2.1.193, per its changelog. + +To get the current version, run this once in a Claude Code session: + +``` +/plugin marketplace update titan-receipts-marketplace +/plugin install commitproof@titan-receipts-marketplace +``` + +- `.claude-plugin/marketplace.json`: the `renames` map. +- `tests/test_rename.py`: pins the map; the old-name check now allows the old + name only inside it. + ## 1.3.1 — 2026-10-20 No behavior change. The directory held 1.3.0 under its credential-forward diff --git a/tests/test_rename.py b/tests/test_rename.py index f686473..146e091 100644 --- a/tests/test_rename.py +++ b/tests/test_rename.py @@ -41,11 +41,24 @@ def test_old_public_name_is_gone_from_user_facing_files(): "skills/receipt-integrity/SKILL.md")] files += sorted((ROOT / "commands").glob("*.md")) for f in files: - text = f.read_text(encoding="utf-8").lower() + text = f.read_text(encoding="utf-8") + if f.name == "marketplace.json": # the renames map is the one place the old name must stay + data = json.loads(text) + data.pop("renames", None) + text = json.dumps(data) + text = text.lower() assert "titan-receipts" not in text and "titan receipts" not in text, f assert "titan-gate-plugin" not in text, f +def test_old_installs_migrate_through_a_renames_entry(): + """Installs of titan-receipts@... broke when the plugin became commitproof: after a + marketplace update the old name was "not found" and the plugin failed to load. The + marketplace's renames map points the old name at this plugin, so they load again.""" + mp = json.loads((ROOT / ".claude-plugin/marketplace.json").read_text()) + assert mp.get("renames") == {"titan-receipts": NAME} + assert NAME in [p["name"] for p in mp["plugins"]] # the chain must end at a listed plugin + def sh(cmd, cwd): r = subprocess.run(shell_argv(cmd), cwd=cwd, capture_output=True, text=True) assert r.returncode == 0, r.stderr From eb81941d74f7f3e497dc6345f0393e264ceff0e5 Mon Sep 17 00:00:00 2001 From: Rehan Masood Date: Tue, 20 Oct 2026 19:18:30 -0400 Subject: [PATCH 2/2] Scope the upgrade steps to installs made under the old name The steps read as if everyone should run them. They are now for titan-receipts installs only; anyone who also installed commitproof@commitproof removes the old marketplace instead, so two copies do not both record receipts; and the README's "Formerly Titan Receipts" section is named as the way onto the current name for good. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a914e00..fa667d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,13 +10,20 @@ plugin showed "failed to load". The marketplace now carries a `renames` entry settings move to the new name on the next marketplace update. Claude Code has followed `renames` automatically since 2.1.193, per its changelog. -To get the current version, run this once in a Claude Code session: +If you installed it as `titan-receipts`, run this once in a Claude Code +session to get the current version: ``` /plugin marketplace update titan-receipts-marketplace /plugin install commitproof@titan-receipts-marketplace ``` +If you also installed `commitproof@commitproof`, remove the old marketplace +instead (`/plugin marketplace remove titan-receipts-marketplace`), so only one +copy records receipts. To move onto the current name for good, follow +"Formerly Titan Receipts" in the README. If you installed it as `commitproof`, +nothing changes: `/plugin marketplace update commitproof` keeps you current. + - `.claude-plugin/marketplace.json`: the `renames` map. - `tests/test_rename.py`: pins the map; the old-name check now allows the old name only inside it.