feat(branding): rename marketplace + plugin identifiers from recoupable to recoup (3/4)#28
feat(branding): rename marketplace + plugin identifiers from recoupable to recoup (3/4)#28sidneyswift wants to merge 4 commits into
Conversation
Sets up the single-source-of-truth marketplace pattern. After this lands, adding a new plugin is one entry in marketplace.source.json + a regen. No end-user behavior change yet — this PR ships the infrastructure only. The catalog plugin (separate PR) and the recoup rename (separate PR) sit on top of this. What this PR adds - marketplace.source.json — single source of truth for the marketplace + the recoupable-skills virtual plugin (the existing 12 broad music skills). - scripts/generate-marketplaces.py — emits the three platform manifests: .claude-plugin/marketplace.json, .agents/plugins/marketplace.json, .cursor-plugin/marketplace.json. --check mode detects drift. - scripts/validate-manifests.py — checks generator parity, plugin source paths, .claude/.codex/.cursor plugin manifests on each plugins/ folder, and SKILL.md frontmatter (name + description) on every skill. - .github/workflows/validate.yml — runs both scripts on every PR. - AGENTS.md, README.md, contributing.md, CHANGELOG.md — rewritten to describe the source-of-truth + generated-files pattern. - Removes the now-superseded root .claude-plugin/plugin.json and .codex-plugin/plugin.json (the recoupable-skills virtual plugin entry in the marketplace replaces them). Why this is small enough to review - 13 files, +1,101 / -137. All-new infrastructure, zero behavior change for end users (no skill paths under skills/ moved). - Generated files (.claude-plugin/, .agents/plugins/, .cursor-plugin/ marketplace.json) are mechanically derivable from marketplace.source.json. Spot-check the source file; trust the generator. - Validator + CI workflow keep the source and generated files in sync going forward. What's intentionally NOT in this PR - No catalog plugin (separate PR — adds the plugins/music-catalog-diligence/ directory and registers it in marketplace.source.json). - No recoupable→recoup rename (separate PR — pure search/replace on identifiers and display names). - No getting-started orchestrator rewrite (separate PR — single skill file). Test plan - python3 scripts/generate-marketplaces.py --check → exit 0 - python3 scripts/validate-manifests.py → exit 0 - CI workflow .github/workflows/validate.yml runs both on every PR. Replaces #23 (split into 4 stacked PRs). Co-authored-by: Cursor <cursoragent@cursor.com>
After the subtree import, two follow-ups make the catalog plugin
production-ready:
1. Register the plugin in marketplace.source.json so customers can
/plugin install music-catalog-diligence@recoupable. Regenerated the
three platform marketplace files.
2. Catalog-only hardening from the original PR's bot-review passes:
Plugin manifests:
- .{claude,codex,cursor}-plugin/plugin.json: repository field now
points at recoupable/skills (the actual home repo), not the
pre-merge recoupable/music-catalog-diligence repo.
Hooks:
- hooks.json: quote ${CLAUDE_PLUGIN_ROOT} so paths with spaces survive
shell tokenization.
- protect-source-files.sh: extend deny glob to match relative
(deals/.../source), dot-relative (./deals/.../source), and absolute
(/abs/deals/.../source) paths so the immutable-evidence guard
cannot be bypassed.
Diligence script hardening:
- calculate-nps-nls-bridge.py: switch monetary math to Decimal,
reject non-object top-level and non-dict adjustment entries.
- extract-pdf-statement.py: guard period_index against short rows;
return summary status "partial" and exit 1 when any PDF errored.
- normalize-royalty-statement.py: treat zero normalized rows as
partial, never ok.
- validate-deal-workspace.py: catch OSError and UnicodeDecodeError
so unreadable files surface as validation errors instead of crashes.
- validate-evidence-ledger.py: validate non-object top-level JSON
and require evidence_id to be a string before deduping.
- validate-normalized-ledger.py: flag blank ledger_line_id rows so
unidentified rows do not pass silently.
- test-normalize-royalty-statement.py: guard write_csv against
empty rows.
- requirements.txt: pin pillow>=12.2.0 to avoid vulnerable
transitive versions pulled in by pdfplumber.
Docs and templates:
- evidence-ledger.json: ship empty entries (no fake placeholder
row with confidence="example").
- skills/catalog-analysis/references/output-templates.md: align
quality-of-earnings bridge with the canonical adjustment ladder
from catalog-analysis SKILL.md and add the separate
sensitivity-table section the skill requires.
- references/normalization.md: document expected-status.json for
partial fixtures.
- references/tooling-landscape.md: fix awkward "needs standardized"
phrasing.
- commands/catalog-analyze.md: show the required positional input
args for calculate-concentration.py and calculate-nps-nls-bridge.py.
- skills/{royalty-audit,catalog-analysis}/SKILL.md: move
pro-performance-income.md to plugin-level references/ so the two
skills no longer cross-depend.
Tests pass:
- python3 plugins/music-catalog-diligence/scripts/test-helpers.py
- python3 plugins/music-catalog-diligence/scripts/test-validate-deal-workspace.py
- python3 plugins/music-catalog-diligence/scripts/test-normalize-royalty-statement.py
- python3 scripts/validate-manifests.py
Co-authored-by: Cursor <cursoragent@cursor.com>
…ble" to "recoup" Renames the brand inside our agent surface — what users type into install commands and what's displayed in plugin manifests — from "recoupable" to the shorter "recoup". Same product, cleaner identifier. Renamed (identifiers + display names): - Marketplace name: `recoupable` → `recoup` - Plugin name: `recoupable-skills` → `recoup-skills` - Display names: "Recoupable Skills" → "Recoup Skills", developerName "Recoupable" → "Recoup" - Owner/author name: "Recoupable" → "Recoup" (in marketplace.source.json + catalog plugin manifests) - Install paths: `@recoupable` → `@recoup` - MCP server key: `"recoupable":` → `"recoup":` (in getting-started skill's MCP config snippet) - Brand references in skill bodies + README/AGENTS/CHANGELOG/contributing.md: "Recoupable" → "Recoup" Intentionally NOT renamed (real-world resources that can't just rebrand): - All `recoupable.com` URLs (recoupable.com, chat.recoupable.com, developers.recoupable.com, api.recoupable.com) - Email address `agent@recoupable.com` (real account, real `agent+*@...` signup pattern) - GitHub repo paths `recoupable/skills`, `recoupable/music-catalog-diligence`, `recoupable/plugins` - NPM package `@recoupable/cli` - LICENSE legal entity `Copyright 2026 Recoupable Inc.` After this change, users install with: /plugin marketplace add recoupable/skills # repo path unchanged /plugin install recoup-skills@recoup # new identifier branding /plugin install music-catalog-diligence@recoup Regenerated all three platform marketplace JSONs from marketplace.source.json. Validator passes (`python3 scripts/validate-manifests.py`). Co-authored-by: Cursor <cursoragent@cursor.com>
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
f293c51 to
73718a6
Compare
|
Closing in favor of baking the recoupable→recoup rename into each PR directly:
No more separate rename PR needed. Each PR now self-contains its own renames. Stack reduced from 4 PRs to 3. |
Replaces #23 — split into 4 stacked PRs
This is PR 3 of 4, stacked on PR 2 (
#27). GitHub will auto-rebase tomainafter PRs 1 and 2 land.feat/marketplace-machinery(off main)feat/catalog-plugin(stacked on 1)feat/recoup-rename← you are here (stacked on 2)feat/orchestrator(independent)What this PR does
Renames the brand inside our agent surface — what users type into install commands and what's displayed in plugin manifests — from
recoupableto the shorterrecoup. Same product, cleaner identifier.After this lands:
What's renamed
recoupablerecouprecoupable-skillsrecoup-skills@recoupable@recoup"recoupable":"recoup":What's intentionally NOT renamed
These are real-world resources that can't just rebrand:
recoupable.comURLs (recoupable.com,chat.recoupable.com,developers.recoupable.com,api.recoupable.com)agent@recoupable.com(real account, realagent+*@...signup pattern)recoupable/skills,recoupable/music-catalog-diligence,recoupable/plugins@recoupable/cliCopyright 2026 Recoupable Inc.Why this PR is small enough to review
17 files, +66 / -66 — pure search/replace on identifiers. Read the table above; spot-check the diff; merge.
Why the
recoupable/skillsrepo path stays unchangedGitHub repo paths are real-world references (CLI installers, npm cache keys, customer bookmarks). Renaming would break every existing consumer. Only the marketplace and plugin identifiers are renamed — what users type into install commands.
Test plan
python3 scripts/generate-marketplaces.py --check— exit 0python3 scripts/validate-manifests.py— exit 0recoupable-skillsor@recoupable[^./]outside the legitimate exceptionsEvidence I'll attach
recoupablereferences remainingWhat's intentionally NOT in this PR
#25)#27)getting-started/SKILL.mdrename. PR 4 (#26) ships the orchestrator rewrite which already uses the new identifiers, so this PR leaves the pre-orchestrator file untouched. PR 4 supersedes it whenever it lands.Merge preference
Please merge yourself when satisfied. I'd rather you push the button than approve.
🤖 Made with Cursor
Made with Cursor
Summary by cubic
Renamed marketplace and plugin identifiers from
recoupabletorecoupto simplify install commands and display names. Manifests, docs, and the generator are updated; product, repo paths, and URLs stay the same.Refactors
recoupable→recoupacrossmarketplace.source.jsonand generated files.recoupable-skills→recoup-skills; display names anddeveloperNamenow "Recoup".README.md,AGENTS.md,CHANGELOG.md,contributing.md, and skills..agents/plugins/,.claude-plugin/,.cursor-plugin/marketplace files; minor tweaks toscripts/generate-marketplaces.py.Migration
/plugin install recoup-skills@recoupand/plugin install music-catalog-diligence@recoup./plugin marketplace add recoupable/skills.recoupable.comURLs,agent@recoupable.com, GitHub orgrecoupable, or@recoupable/cli.Written for commit d565793. Summary will update on new commits.