Skip to content

feat: rebrand Chorus → Polyphony (npm @crypticpy/polyphony)#8

Merged
crypticpy merged 3 commits into
mainfrom
feat/polyphony-rebrand
May 18, 2026
Merged

feat: rebrand Chorus → Polyphony (npm @crypticpy/polyphony)#8
crypticpy merged 3 commits into
mainfrom
feat/polyphony-rebrand

Conversation

@crypticpy
Copy link
Copy Markdown
Owner

@crypticpy crypticpy commented May 18, 2026

Summary

The fork has diverged enough to be its own project. New product name is Polyphony — same multi-voice metaphor as Chorus but more distinct (Chorus = unison; polyphony = multiple independent voices interleaving, which is actually a better fit for the multi-LLM-disagreement-as-signal product).

  • package.json: name → @crypticpy/polyphony, repo/homepage → crypticpy/chorus, bin entries: both polyphony and chorus point to the same launcher.
  • README: title, tagline, badges (CI / npm / Status / Node), npm i -g install command, product-name prose throughout, and a new Compatibility section explaining what still works after the rename.
  • Visible CLI strings: "Welcome to Chorus" banner → Polyphony.
  • Visible daemon strings: startup banner, "daemon not running" error messages in the API route, MCP client, lib fetch client, page.tsx loader, onboarding submit.

Backward compatibility (deliberate, all preserved)

  • CLI binarychorus still works (added as a bin alias alongside polyphony).
  • Config dir~/.chorus/ unchanged. chorus.db, templates, logs, install-id, no-telemetry, secrets all stay where they were.
  • MCP server — still registers under the name chorus in editors, so prompts like "ask chorus to review …" and chorus.create_chat tool calls keep working.
  • Env varsCHORUS_TELEMETRY, CHORUS_DB_PATH, CHORUS_CODEX_HOME, CHORUS_LOG_LEVEL unchanged.
  • GitHub repo — stays at crypticpy/chorus for now.

Out of scope (separate follow-ups)

  • Renaming ~/.chorus/~/.polyphony/ (needs migration logic).
  • Renaming the GitHub repo (breaks every clone URL out there — defer until the rebrand is bedded in).
  • ROADMAP.md prose ("Chorus's depth comes from…") — wait until repo rename so it's one sweep.
  • Internal symbol / comment / log-namespace renames — not user-visible.

Test plan

  • pnpm typecheck — clean
  • pnpm test — 1085/1085 pass
  • npm pack produces a tarball named crypticpy-polyphony-0.8.26.tgz with both chorus and polyphony bins (will be verified locally before npm publish in a follow-up)
  • Bot review (CodeRabbit / Sourcery / Greptile / Codex)

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Introduced "Polyphony" as the primary product name; polyphony CLI provided alongside legacy chorus for compatibility.
  • Documentation

    • Rebranded docs and landing content to "Polyphony".
    • Added Compatibility section describing what remains backward-compatible (CLI binary, config dir, MCP naming, env vars).
  • Chores

    • Published package renamed to @crypticpy/polyphony and update flows now target the new package.
    • Updated user-facing system and CLI messages to use "Polyphony".

Review Change Stack

The fork has diverged enough to be its own project. New product name is
Polyphony — same multi-voice metaphor but more distinct (Chorus = unison;
polyphony = multiple independent voices interleaving, which is actually
a better fit for the multi-LLM-disagreement-as-signal product).

What this changes:
- package.json: name → @crypticpy/polyphony, repo/homepage → crypticpy/chorus,
  bin entries: `polyphony` and `chorus` both point to the same launcher
- README: title, tagline, badges, install command, product-name prose
- Visible CLI strings: "Welcome to Chorus" banner → Polyphony
- Visible daemon strings: startup banner, "daemon not running" errors
  in the API route, MCP client, fetch client, page.tsx, onboarding

Backward compat (deliberate, all preserved):
- `chorus` CLI binary still works (added as bin alias)
- `~/.chorus/` config directory unchanged (chorus.db, templates, logs,
  install-id, no-telemetry, secrets all live here)
- MCP server still registers under the name `chorus` so prompts like
  "ask chorus to review …" and `chorus.create_chat` tool calls keep
  working in Claude Code / Codex / Cursor / etc.
- Env vars (CHORUS_TELEMETRY, CHORUS_DB_PATH, CHORUS_CODEX_HOME,
  CHORUS_LOG_LEVEL) unchanged
- GitHub repo stays at crypticpy/chorus for now

Out of scope (separate follow-ups):
- Rename ~/.chorus/ → ~/.polyphony/ (needs migration)
- Rename the GitHub repo (breaks every clone URL in the wild)
- ROADMAP.md prose ("Chorus's depth comes from…") — wait until repo
  rename so it's one sweep
- Internal symbol/comment/log-namespace renames

Tests: 1085/1085 pass. Typecheck clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown

@sourcery-ai sourcery-ai Bot left a comment

Choose a reason for hiding this comment

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

Sorry @crypticpy, you have reached your weekly rate limit of 2500000 diff characters.

Please try again later or upgrade to continue using Sourcery

Copy link
Copy Markdown

@greptile-apps greptile-apps Bot left a comment

Choose a reason for hiding this comment

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

crypticpy has reached the 50-review limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 18, 2026

Warning

Rate limit exceeded

@crypticpy has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 4 minutes and 50 seconds before requesting another review.

You’ve run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 63efbc7f-0c7b-4462-b523-1980c26e1900

📥 Commits

Reviewing files that changed from the base of the PR and between ef877bf and 524df8d.

📒 Files selected for processing (1)
  • src/cli/commands/update.ts
📝 Walkthrough

Walkthrough

This PR rebrands the project from Chorus to Polyphony across documentation, package identity, CLI/help text, onboarding/home UI copy, daemon/API messages, and the CLI update flow (now targeting @crypticpy/polyphony) while preserving existing runtime behavior and compatibility.

Changes

Chorus to Polyphony rebrand

Layer / File(s) Summary
README documentation and compatibility guide
README.md
README.md comprehensively rebrands marketing copy, examples, feature descriptions, diagrams, and Quick start instructions to Polyphony and adds a Compatibility section documenting the npm rename to @crypticpy/polyphony while noting backward-compatible elements (the chorus binary, ~/.chorus/ directory, MCP server name chorus, env vars).
Package identity and CLI help text
package.json, src/cli/index.ts
Updates package.json name to @crypticpy/polyphony and adjusts repository/metadata. CLI quick-start/help text now references Polyphony in the pre-help banner and ui/connect subcommand descriptions.
CLI start/stop/update command strings & update logic
src/cli/commands/start.ts, src/cli/commands/stop.ts, src/cli/commands/update.ts
Rebrands user-facing strings in start/stop flows to Polyphony, normalizes quoting in stop, and changes the update command to check/install @crypticpy/polyphony with updated messaging and npm invocation handling.
Onboarding and home page UI updates
src/app/onboarding/page.tsx, src/app/onboarding/submit.ts, src/app/page.tsx
Updates onboarding titles, descriptions, validation messages, and state/function formatting to reference Polyphony; home page daemon error string updated. Code formatting/signature changes preserve behavior.
Daemon, API, and MCP client messages & routes
src/app/api/daemon/[...path]/route.ts, src/daemon/index.ts, src/lib/api/client.ts, src/daemon/routes/system.ts, src/mcp/client.ts
Updates daemon-unreachable and startup messages to Polyphony, adjusts API/route handler formatting, and makes /update-check query the new package name; MCP client auto-start failure text updated. Core logic and handler semantics unchanged.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Poem

🐰 Hopping through strings, a gentle rename cheer,

Chorus to Polyphony — the new name is here.
Docs and CLI shimmer, banners take flight,
Backward compat hums through the quiet night. 🎶

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 42.31% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately and concisely describes the primary change: rebranding the project from Chorus to Polyphony with the new npm package name, which is the main focus across all modified files.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


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

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4a72f2f859

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread package.json
@@ -1,15 +1,16 @@
{
"name": "chorus-codes",
"name": "@crypticpy/polyphony",
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Point self-update at the renamed npm package

Now that the published package is renamed to @crypticpy/polyphony, the existing update paths still target chorus-codes: chorus update fetches that package and runs npm install -g chorus-codes@..., chorus start uses the same default check, and /update-check explicitly calls fetchLatestVersion('chorus-codes'). For users who install this scoped package, update banners will compare against the wrong registry entry and the update command will install/conflict with the old package instead of upgrading Polyphony.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Fixed in ef877bffetchLatestVersion now defaults to @crypticpy/polyphony and the daemon's /update-check route passes the same scoped name, so chorus update, the start-up nudge, and the cockpit banner all compare/install the right package. Update command now runs npm install -g @crypticpy/polyphony@<latest>.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/app/onboarding/page.tsx`:
- Around line 308-311: Replace the old brand name "Chorus" with "Polyphony" in
the onboarding intro paragraph: locate the JSX paragraph element with className
"mb-8 text-sm leading-relaxed text-muted-foreground" (the <p> that starts
"Chorus runs your prompt...") in the onboarding page component and change the
leading word to "Polyphony" so the copy matches the rest of the rebrand.

In `@src/cli/commands/start.ts`:
- Line 47: Update the rebrand strings in the start command so runtime
banners/help no longer reference "Chorus" or "chorus-codes": in
src/cli/commands/start.ts (the start command’s .description and any banner/help/
recovery/install messages in that module) replace occurrences of "Chorus" with
"Polyphony" and replace "chorus-codes" with the new package/CLI name used across
the repo (e.g., "polyphony" or "polyphony-cli"), ensuring all banner text, help
text, and recovery/install prompts in functions like the start command handler,
banner printer, and recovery/installer messages are updated for consistency.

In `@src/cli/commands/stop.ts`:
- Line 29: Update the CLI strings in src/cli/commands/stop.ts so all user-facing
text uses the new product name "Polyphony" instead of "Chorus": change the
.description("Stop the Polyphony daemon and cockpit") entry and replace any
remaining "Chorus" occurrences used in status or error output (e.g., in the stop
command handler/runner, status messages, and error messages) to "Polyphony" to
ensure consistent messaging across the command (look for the .description call
and the stop command's status/error logging statements).

In `@src/cli/index.ts`:
- Line 42: Update the remaining help strings in this file that still reference
“Chorus” so they consistently say “Polyphony”; locate the help text for the CLI
commands (look for the UI and MCP command descriptions / variables referenced by
identifiers like the ui command help, mcp command help, or any constants near
the welcome line such as the array of help lines) and replace “Chorus” with
“Polyphony” in those string literals, ensuring casing matches existing branding
and preserving any surrounding punctuation or dim/bold styling calls.

In `@src/mcp/client.ts`:
- Around line 178-179: Update the rebranded error string in src/mcp/client.ts to
use Polyphony-first wording: replace "Run 'chorus start' first" with "Run
'polyphony start' first (or 'chorus start' for compatibility)" so users see the
new command but compatibility alias is preserved; keep the existing
CHORUS_AUTOSTART reference unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 8e174bc1-e05c-4376-9e1a-4f2799a7b836

📥 Commits

Reviewing files that changed from the base of the PR and between 2b2bfeb and 4a72f2f.

📒 Files selected for processing (12)
  • README.md
  • package.json
  • src/app/api/daemon/[...path]/route.ts
  • src/app/onboarding/page.tsx
  • src/app/onboarding/submit.ts
  • src/app/page.tsx
  • src/cli/commands/start.ts
  • src/cli/commands/stop.ts
  • src/cli/index.ts
  • src/daemon/index.ts
  • src/lib/api/client.ts
  • src/mcp/client.ts

Comment thread src/app/onboarding/page.tsx
Comment thread src/cli/commands/start.ts
Comment thread src/cli/commands/stop.ts
Comment thread src/cli/index.ts
Comment thread src/mcp/client.ts Outdated
…te target

- update.ts: fetchLatestVersion defaults to @crypticpy/polyphony so
  `chorus update`, `chorus start` checkForUpdate, and the daemon's
  /update-check route compare/install the right scoped package (Codex P1).
- start/stop/update/index CLI strings: rebrand user-visible banners,
  recovery prompts, install commands, and command descriptions to
  Polyphony with chorus shown as compat alias where the user is
  expected to retype the command.
- mcp/client.ts: error message recommends `polyphony start` first with
  `chorus start` as compatibility alias.
- onboarding/page.tsx: intro paragraph rebranded.
- system.ts: update-check route queries @crypticpy/polyphony, not
  chorus-codes.

Out-of-scope per PR: did NOT rename chorus CLI binary, ~/.chorus/
config dir, MCP server registration name, env vars, or GitHub repo
(see PR body for the deliberate compat invariants).
Copy link
Copy Markdown

@greptile-apps greptile-apps Bot left a comment

Choose a reason for hiding this comment

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

crypticpy has reached the 50-review limit for trial accounts. To continue receiving code reviews, upgrade your plan.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/cli/commands/update.ts (1)

212-220: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Encode scoped package names before calling npm dist-tags endpoint.

The code interpolates @crypticpy/polyphony directly into the URL path without encoding. According to the npm registry API specification, scoped packages must have their forward slash encoded as %2F in URL paths; failure to do so results in 404 errors as the registry interprets the slash as a directory separator. Since fetchLatestVersion("@crypticpy/polyphony") is actively called in src/daemon/routes/system.ts, this bug manifests in production.

Use encodeURIComponent(packageName) before URL interpolation:

Suggested fix
 export async function fetchLatestVersion(
   packageName = "`@crypticpy/polyphony`",
 ): Promise<string | null> {
   try {
+    const escapedPackageName = encodeURIComponent(packageName);
     const ac = new AbortController();
     const timer = setTimeout(() => ac.abort(), 5000);
     const res = await fetch(
-      `https://registry.npmjs.org/-/package/${packageName}/dist-tags`,
+      `https://registry.npmjs.org/-/package/${escapedPackageName}/dist-tags`,
       { signal: ac.signal },
     );
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/cli/commands/update.ts` around lines 212 - 220, The fetchLatestVersion
function currently injects packageName directly into the npm dist-tags URL
causing 404s for scoped packages; update the URL construction in
fetchLatestVersion to use encodeURIComponent(packageName) (i.e., encode the
packageName before interpolating into
`https://registry.npmjs.org/-/package/.../dist-tags`) so scoped names like
"`@crypticpy/polyphony`" have their slash encoded as %2F; keep the
AbortController/timer logic and existing fetch call otherwise unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@src/cli/commands/update.ts`:
- Around line 212-220: The fetchLatestVersion function currently injects
packageName directly into the npm dist-tags URL causing 404s for scoped
packages; update the URL construction in fetchLatestVersion to use
encodeURIComponent(packageName) (i.e., encode the packageName before
interpolating into `https://registry.npmjs.org/-/package/.../dist-tags`) so
scoped names like "`@crypticpy/polyphony`" have their slash encoded as %2F; keep
the AbortController/timer logic and existing fetch call otherwise unchanged.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 4206b913-3bed-46b1-848c-3e0bda30aaad

📥 Commits

Reviewing files that changed from the base of the PR and between 4a72f2f and ef877bf.

📒 Files selected for processing (7)
  • src/app/onboarding/page.tsx
  • src/cli/commands/start.ts
  • src/cli/commands/stop.ts
  • src/cli/commands/update.ts
  • src/cli/index.ts
  • src/daemon/routes/system.ts
  • src/mcp/client.ts

Scoped npm names (`@scope/pkg`) need the `/` percent-encoded as `%2F`
for the dist-tags endpoint to resolve them. encodeURIComponent is a
no-op for unscoped names, so the legacy `chorus-codes` callsite stays
correct. Found by CodeRabbit on review of the prior commit.
Copy link
Copy Markdown

@greptile-apps greptile-apps Bot left a comment

Choose a reason for hiding this comment

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

crypticpy has reached the 50-review limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@crypticpy
Copy link
Copy Markdown
Owner Author

@coderabbitai re: src/cli/commands/update.ts lines 212-220 (Encode scoped package names) — fixed in 524df8d. Wrapped packageName with encodeURIComponent before interpolating into the dist-tags URL so @crypticpy/polyphony resolves correctly once published; no-op for the legacy unscoped chorus-codes path.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 18, 2026

Tip

For best results, initiate chat on the files or code changes.

@crypticpy: Thanks for the heads-up! The encodeURIComponent wrap is exactly the right fix — @crypticpy/polyphony becomes %40crypticpy%2Fpolyphony in the URL, which is what the npm registry expects for scoped packages. And as you noted, it's a no-op for the existing unscoped chorus-codes path, so no regression there. ✅

@crypticpy crypticpy merged commit 483341b into main May 18, 2026
1 check passed
@crypticpy crypticpy deleted the feat/polyphony-rebrand branch May 18, 2026 05:22
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