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..fa667d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,33 @@ # 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. + +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. + ## 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