Skip to content

feat(branding): rename marketplace + plugin identifiers from recoupable to recoup (3/4)#28

Closed
sidneyswift wants to merge 4 commits into
feat/catalog-pluginfrom
feat/recoup-rename
Closed

feat(branding): rename marketplace + plugin identifiers from recoupable to recoup (3/4)#28
sidneyswift wants to merge 4 commits into
feat/catalog-pluginfrom
feat/recoup-rename

Conversation

@sidneyswift

@sidneyswift sidneyswift commented May 12, 2026

Copy link
Copy Markdown
Contributor

Replaces #23 — split into 4 stacked PRs

This is PR 3 of 4, stacked on PR 2 (#27). GitHub will auto-rebase to main after PRs 1 and 2 land.

# Branch Status
1 feat/marketplace-machinery (off main) #25
2 feat/catalog-plugin (stacked on 1) #27
3 feat/recoup-renameyou are here (stacked on 2) open
4 feat/orchestrator (independent) #26

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 recoupable to the shorter recoup. Same product, cleaner identifier.

After this lands:

/plugin marketplace add recoupable/skills        # repo path unchanged
/plugin install recoup-skills@recoup             # new identifier branding
/plugin install music-catalog-diligence@recoup

What's renamed

Before After
Marketplace name recoupable recoup
Plugin name recoupable-skills recoup-skills
Display names "Recoupable Skills" "Recoup Skills"
developerName "Recoupable" "Recoup"
Owner/author name "Recoupable" "Recoup"
Install paths @recoupable @recoup
MCP server key "recoupable": "recoup":
Brand references in skill bodies + README/AGENTS/CHANGELOG/contributing.md "Recoupable" "Recoup"

What's intentionally NOT renamed

These are 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.

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/skills repo path stays unchanged

GitHub 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 0
  • python3 scripts/validate-manifests.py — exit 0
  • Sanity grep: no remaining recoupable-skills or @recoupable[^./] outside the legitimate exceptions

Evidence I'll attach

  • Terminal screenshot of validator passing
  • Grep result confirming the legitimate exceptions are the only recoupable references remaining
  • (No Loom needed — pure mechanical rename)

What's intentionally NOT in this PR

  • No marketplace machinery (PR 1 — #25)
  • No catalog plugin (PR 2 — #27)
  • No getting-started/SKILL.md rename. 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 recoupable to recoup to simplify install commands and display names. Manifests, docs, and the generator are updated; product, repo paths, and URLs stay the same.

  • Refactors

    • Marketplace id: recoupablerecoup across marketplace.source.json and generated files.
    • Virtual skills plugin: recoupable-skillsrecoup-skills; display names and developerName now "Recoup".
    • Updated references in README.md, AGENTS.md, CHANGELOG.md, contributing.md, and skills.
    • Regenerated .agents/plugins/, .claude-plugin/, .cursor-plugin/ marketplace files; minor tweaks to scripts/generate-marketplaces.py.
  • Migration

    • Install with /plugin install recoup-skills@recoup and /plugin install music-catalog-diligence@recoup.
    • Repo path unchanged: /plugin marketplace add recoupable/skills.
    • No changes to recoupable.com URLs, agent@recoupable.com, GitHub org recoupable, or @recoupable/cli.

Written for commit d565793. Summary will update on new commits.

sidneyswift and others added 4 commits May 12, 2026 18:49
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>
…95c90f0cda9685554ea085c'

git-subtree-dir: plugins/music-catalog-diligence
git-subtree-mainline: 7993be6
git-subtree-split: a95f3dc
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>
@coderabbitai

coderabbitai Bot commented May 12, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 168310e8-de23-4723-a4d0-e0fc6b277ddc

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/recoup-rename

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No issues found across 17 files

@sidneyswift sidneyswift force-pushed the feat/catalog-plugin branch from f293c51 to 73718a6 Compare May 13, 2026 03:43
@sidneyswift

Copy link
Copy Markdown
Contributor Author

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.

@sidneyswift sidneyswift deleted the feat/recoup-rename branch May 13, 2026 03:44
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.

1 participant