chorus-codes 0.7.0 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +3 -3
- package/.next/cache/.previewinfo +1 -1
- package/.next/cache/.rscinfo +1 -1
- package/.next/cache/.tsbuildinfo +1 -1
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +1 -1
- package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/new.html +1 -1
- package/.next/server/app/new.rsc +1 -1
- package/.next/server/app/new.segments/_full.segment.rsc +1 -1
- package/.next/server/app/new.segments/_head.segment.rsc +1 -1
- package/.next/server/app/new.segments/_index.segment.rsc +1 -1
- package/.next/server/app/new.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/new.segments/new/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/new.segments/new.segment.rsc +1 -1
- package/.next/server/app/onboarding.html +1 -1
- package/.next/server/app/onboarding.rsc +1 -1
- package/.next/server/app/onboarding.segments/_full.segment.rsc +1 -1
- package/.next/server/app/onboarding.segments/_head.segment.rsc +1 -1
- package/.next/server/app/onboarding.segments/_index.segment.rsc +1 -1
- package/.next/server/app/onboarding.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/onboarding.segments/onboarding/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/onboarding.segments/onboarding.segment.rsc +1 -1
- package/.next/server/app/personas.html +1 -1
- package/.next/server/app/personas.rsc +1 -1
- package/.next/server/app/personas.segments/_full.segment.rsc +1 -1
- package/.next/server/app/personas.segments/_head.segment.rsc +1 -1
- package/.next/server/app/personas.segments/_index.segment.rsc +1 -1
- package/.next/server/app/personas.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/personas.segments/personas/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/personas.segments/personas.segment.rsc +1 -1
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +1 -1
- package/.next/server/app/settings.segments/_full.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/.next/server/app/templates.html +1 -1
- package/.next/server/app/templates.rsc +1 -1
- package/.next/server/app/templates.segments/_full.segment.rsc +1 -1
- package/.next/server/app/templates.segments/_head.segment.rsc +1 -1
- package/.next/server/app/templates.segments/_index.segment.rsc +1 -1
- package/.next/server/app/templates.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/templates.segments/templates/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/templates.segments/templates.segment.rsc +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/trace +1 -1
- package/.next/trace-build +1 -1
- package/README.md +38 -15
- package/dist/cli/commands/doctor.js +116 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/init.js +211 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/start.js +298 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.js +54 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.js +97 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/connect.js +108 -0
- package/dist/cli/connect.js.map +1 -0
- package/dist/cli/index.js +99 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/port-utils.js +260 -0
- package/dist/cli/port-utils.js.map +1 -0
- package/dist/cli/runtime-env.js +60 -0
- package/dist/cli/runtime-env.js.map +1 -0
- package/dist/cli/shared.js +54 -0
- package/dist/cli/shared.js.map +1 -0
- package/dist/cli/ui.js +60 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/daemon/agents/claude.js +98 -0
- package/dist/daemon/agents/claude.js.map +1 -0
- package/dist/daemon/agents/codex.js +160 -0
- package/dist/daemon/agents/codex.js.map +1 -0
- package/dist/daemon/agents/gemini.js +111 -0
- package/dist/daemon/agents/gemini.js.map +1 -0
- package/dist/daemon/agents/index.js +59 -0
- package/dist/daemon/agents/index.js.map +1 -0
- package/dist/daemon/agents/kimi.js +206 -0
- package/dist/daemon/agents/kimi.js.map +1 -0
- package/dist/daemon/agents/opencode.js +228 -0
- package/dist/daemon/agents/opencode.js.map +1 -0
- package/dist/daemon/agents/openrouter.js +274 -0
- package/dist/daemon/agents/openrouter.js.map +1 -0
- package/dist/daemon/agents/parsers/claude.js +63 -0
- package/dist/daemon/agents/parsers/claude.js.map +1 -0
- package/dist/daemon/agents/parsers/codex.js +51 -0
- package/dist/daemon/agents/parsers/codex.js.map +1 -0
- package/dist/daemon/agents/parsers/gemini.js +144 -0
- package/dist/daemon/agents/parsers/gemini.js.map +1 -0
- package/dist/daemon/agents/parsers/index.js +31 -0
- package/dist/daemon/agents/parsers/index.js.map +1 -0
- package/dist/daemon/agents/parsers/kimi.js +8 -0
- package/dist/daemon/agents/parsers/kimi.js.map +1 -0
- package/dist/daemon/agents/parsers/opencode.js +105 -0
- package/dist/daemon/agents/parsers/opencode.js.map +1 -0
- package/dist/daemon/agents/parsers/openrouter.js +69 -0
- package/dist/daemon/agents/parsers/openrouter.js.map +1 -0
- package/dist/daemon/agents/parsers/shared.js +17 -0
- package/dist/daemon/agents/parsers/shared.js.map +1 -0
- package/dist/daemon/agents/preflight.js +83 -0
- package/dist/daemon/agents/preflight.js.map +1 -0
- package/dist/daemon/agents/quote.js +45 -0
- package/dist/daemon/agents/quote.js.map +1 -0
- package/dist/daemon/agents/sandbox-guard.js +69 -0
- package/dist/daemon/agents/sandbox-guard.js.map +1 -0
- package/dist/daemon/agents/types.js +6 -0
- package/dist/daemon/agents/types.js.map +1 -0
- package/dist/daemon/api-response.js +65 -0
- package/dist/daemon/api-response.js.map +1 -0
- package/dist/daemon/error-detector.js +329 -0
- package/dist/daemon/error-detector.js.map +1 -0
- package/dist/daemon/headless.js +533 -0
- package/dist/daemon/headless.js.map +1 -0
- package/dist/daemon/index.js +333 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/openrouter.js +192 -0
- package/dist/daemon/openrouter.js.map +1 -0
- package/dist/daemon/orchestrators/claude.js +163 -0
- package/dist/daemon/orchestrators/claude.js.map +1 -0
- package/dist/daemon/orchestrators/codex.js +101 -0
- package/dist/daemon/orchestrators/codex.js.map +1 -0
- package/dist/daemon/orchestrators/cursor-windsurf.js +118 -0
- package/dist/daemon/orchestrators/cursor-windsurf.js.map +1 -0
- package/dist/daemon/orchestrators/gemini.js +108 -0
- package/dist/daemon/orchestrators/gemini.js.map +1 -0
- package/dist/daemon/orchestrators/index.js +90 -0
- package/dist/daemon/orchestrators/index.js.map +1 -0
- package/dist/daemon/orchestrators/kimi.js +108 -0
- package/dist/daemon/orchestrators/kimi.js.map +1 -0
- package/dist/daemon/orchestrators/opencode.js +152 -0
- package/dist/daemon/orchestrators/opencode.js.map +1 -0
- package/dist/daemon/orchestrators/shared.js +60 -0
- package/dist/daemon/orchestrators/shared.js.map +1 -0
- package/dist/daemon/output-watcher.js +131 -0
- package/dist/daemon/output-watcher.js.map +1 -0
- package/dist/daemon/participant-aborts.js +123 -0
- package/dist/daemon/participant-aborts.js.map +1 -0
- package/dist/daemon/reaper.js +46 -0
- package/dist/daemon/reaper.js.map +1 -0
- package/dist/daemon/routes/chats-events.js +62 -0
- package/dist/daemon/routes/chats-events.js.map +1 -0
- package/dist/daemon/routes/chats-stream.js +241 -0
- package/dist/daemon/routes/chats-stream.js.map +1 -0
- package/dist/daemon/routes/chats-validation.js +13 -0
- package/dist/daemon/routes/chats-validation.js.map +1 -0
- package/dist/daemon/routes/chats.js +545 -0
- package/dist/daemon/routes/chats.js.map +1 -0
- package/dist/daemon/routes/openrouter.js +103 -0
- package/dist/daemon/routes/openrouter.js.map +1 -0
- package/dist/daemon/routes/settings.js +199 -0
- package/dist/daemon/routes/settings.js.map +1 -0
- package/dist/daemon/routes/stats.js +155 -0
- package/dist/daemon/routes/stats.js.map +1 -0
- package/dist/daemon/routes/system.js +208 -0
- package/dist/daemon/routes/system.js.map +1 -0
- package/dist/daemon/routes/templates-personas.js +254 -0
- package/dist/daemon/routes/templates-personas.js.map +1 -0
- package/dist/daemon/routes/voices.js +139 -0
- package/dist/daemon/routes/voices.js.map +1 -0
- package/dist/daemon/runner/doer-driver.js +346 -0
- package/dist/daemon/runner/doer-driver.js.map +1 -0
- package/dist/daemon/runner/doer.js +336 -0
- package/dist/daemon/runner/doer.js.map +1 -0
- package/dist/daemon/runner/prior-round.js +140 -0
- package/dist/daemon/runner/prior-round.js.map +1 -0
- package/dist/daemon/runner/prompt-builder.js +292 -0
- package/dist/daemon/runner/prompt-builder.js.map +1 -0
- package/dist/daemon/runner/review-only-phase.js +103 -0
- package/dist/daemon/runner/review-only-phase.js.map +1 -0
- package/dist/daemon/runner/reviewer-driver.js +410 -0
- package/dist/daemon/runner/reviewer-driver.js.map +1 -0
- package/dist/daemon/runner/reviewer.js +384 -0
- package/dist/daemon/runner/reviewer.js.map +1 -0
- package/dist/daemon/runner/run-with-fallback.js +56 -0
- package/dist/daemon/runner/run-with-fallback.js.map +1 -0
- package/dist/daemon/runner/sanitize-name.js +8 -0
- package/dist/daemon/runner/sanitize-name.js.map +1 -0
- package/dist/daemon/runner/stream-file-writer.js +116 -0
- package/dist/daemon/runner/stream-file-writer.js.map +1 -0
- package/dist/daemon/runner/swap-sidecar.js +102 -0
- package/dist/daemon/runner/swap-sidecar.js.map +1 -0
- package/dist/daemon/runner/template-fallback.js +119 -0
- package/dist/daemon/runner/template-fallback.js.map +1 -0
- package/dist/daemon/runner/types.js +3 -0
- package/dist/daemon/runner/types.js.map +1 -0
- package/dist/daemon/runner/verdict.js +51 -0
- package/dist/daemon/runner/verdict.js.map +1 -0
- package/dist/daemon/runner-multiplex.js +364 -0
- package/dist/daemon/runner-multiplex.js.map +1 -0
- package/dist/daemon/runner.js +427 -0
- package/dist/daemon/runner.js.map +1 -0
- package/dist/daemon/ship.js +340 -0
- package/dist/daemon/ship.js.map +1 -0
- package/dist/daemon/template-cache.js +37 -0
- package/dist/daemon/template-cache.js.map +1 -0
- package/dist/daemon/tmux-types.js +9 -0
- package/dist/daemon/tmux-types.js.map +1 -0
- package/dist/daemon/tmux.js +341 -0
- package/dist/daemon/tmux.js.map +1 -0
- package/dist/lib/atomic-write.js +55 -0
- package/dist/lib/atomic-write.js.map +1 -0
- package/dist/lib/chat-events-bus.js +27 -0
- package/dist/lib/chat-events-bus.js.map +1 -0
- package/dist/lib/chat-slug.js +105 -0
- package/dist/lib/chat-slug.js.map +1 -0
- package/dist/lib/cli-detect.js +388 -0
- package/dist/lib/cli-detect.js.map +1 -0
- package/dist/lib/cli-health.js +156 -0
- package/dist/lib/cli-health.js.map +1 -0
- package/dist/lib/cli-paths.js +113 -0
- package/dist/lib/cli-paths.js.map +1 -0
- package/dist/lib/cli-precheck.js +141 -0
- package/dist/lib/cli-precheck.js.map +1 -0
- package/dist/lib/db/chats.js +244 -0
- package/dist/lib/db/chats.js.map +1 -0
- package/dist/lib/db/connection.js +254 -0
- package/dist/lib/db/connection.js.map +1 -0
- package/dist/lib/db/index.js +34 -0
- package/dist/lib/db/index.js.map +1 -0
- package/dist/lib/db/personas.js +65 -0
- package/dist/lib/db/personas.js.map +1 -0
- package/dist/lib/db/phase-events.js +172 -0
- package/dist/lib/db/phase-events.js.map +1 -0
- package/dist/lib/db/secrets.js +53 -0
- package/dist/lib/db/secrets.js.map +1 -0
- package/dist/lib/db/settings.js +47 -0
- package/dist/lib/db/settings.js.map +1 -0
- package/dist/lib/db/templates.js +75 -0
- package/dist/lib/db/templates.js.map +1 -0
- package/dist/lib/db/voices.js +184 -0
- package/dist/lib/db/voices.js.map +1 -0
- package/dist/lib/lineage-maps.js +200 -0
- package/dist/lib/lineage-maps.js.map +1 -0
- package/dist/lib/logger.js +186 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/personas.js +117 -0
- package/dist/lib/personas.js.map +1 -0
- package/dist/lib/runtime-path.js +222 -0
- package/dist/lib/runtime-path.js.map +1 -0
- package/dist/lib/settings/billing.js +58 -0
- package/dist/lib/settings/billing.js.map +1 -0
- package/dist/lib/settings/permissions.js +81 -0
- package/dist/lib/settings/permissions.js.map +1 -0
- package/dist/lib/settings/transport.js +113 -0
- package/dist/lib/settings/transport.js.map +1 -0
- package/dist/lib/telemetry.js +290 -0
- package/dist/lib/telemetry.js.map +1 -0
- package/dist/lib/template-schema.js +319 -0
- package/dist/lib/template-schema.js.map +1 -0
- package/dist/lib/template-validation.js +82 -0
- package/dist/lib/template-validation.js.map +1 -0
- package/dist/lib/voices.js +533 -0
- package/dist/lib/voices.js.map +1 -0
- package/dist/mcp/client.js +138 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/index.js +178 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/tools.js +355 -0
- package/dist/mcp/tools.js.map +1 -0
- package/package.json +2 -1
- package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0beh7rg._.js +0 -6077
- package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0beh7rg._.js.map +0 -69
- package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0pjsj.j._.js +0 -6318
- package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0pjsj.j._.js.map +0 -71
- package/.next/dev/types/cache-life.d.ts +0 -145
- package/.next/dev/types/routes.d.ts +0 -84
- package/.next/dev/types/validator.ts +0 -178
- /package/.next/static/{dJlbRLlhISA0JGtHKVqgQ → 9cD3yIOGe_Aqr17uJHTQS}/_buildManifest.js +0 -0
- /package/.next/static/{dJlbRLlhISA0JGtHKVqgQ → 9cD3yIOGe_Aqr17uJHTQS}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{dJlbRLlhISA0JGtHKVqgQ → 9cD3yIOGe_Aqr17uJHTQS}/_ssgManifest.js +0 -0
package/README.md
CHANGED
|
@@ -84,12 +84,49 @@ Reproduces 1-in-20, no obvious pattern. Drop the failing test + suspect code int
|
|
|
84
84
|
|
|
85
85
|
```bash
|
|
86
86
|
npm i -g chorus-codes # install
|
|
87
|
-
chorus init # finds AI tools you already have
|
|
87
|
+
chorus init # finds AI tools you already have, wires up MCP
|
|
88
88
|
chorus start --ui # opens http://localhost:5050
|
|
89
89
|
```
|
|
90
90
|
|
|
91
91
|
Paste a task. Hit submit. Watch the AIs argue.
|
|
92
92
|
|
|
93
|
+
### Or drive it from any AI CLI you already use
|
|
94
|
+
|
|
95
|
+
`chorus init` registers Chorus as an MCP server with every CLI / IDE it detects (Claude Code, Codex, Gemini CLI, Cursor, Windsurf, Kimi, OpenCode). After that, just ask the assistant in plain English:
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
> Use chorus to review the staged diff against main
|
|
99
|
+
> Ask chorus to run the architect-review template on src/payments/*.ts
|
|
100
|
+
> chorus, get a second opinion on this function from claude + gemini
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Or invoke a specific MCP tool directly — every CLI uses the same name (`chorus`) and exposes nine tools:
|
|
104
|
+
|
|
105
|
+
| Tool | What it does |
|
|
106
|
+
|---|---|
|
|
107
|
+
| `create_chat` | Kick off a review (returns a `chatId` + URL) |
|
|
108
|
+
| `wait_for_chat` | Block until the run reaches a terminal state |
|
|
109
|
+
| `get_chat_status` | Poll a running chat without blocking |
|
|
110
|
+
| `cancel_chat` / `resume_chat` | Stop or restart |
|
|
111
|
+
| `list_templates` / `list_personas` | Discover what's available |
|
|
112
|
+
| `invoke_persona` | Run a single persona (skip multi-reviewer fan-out) |
|
|
113
|
+
| `list_blocked` | See chats that need human input |
|
|
114
|
+
|
|
115
|
+
Example raw invocation (from any MCP client):
|
|
116
|
+
|
|
117
|
+
```jsonc
|
|
118
|
+
// tool: chorus.create_chat
|
|
119
|
+
{
|
|
120
|
+
"template": "code-review",
|
|
121
|
+
"work": "Review the staged diff vs main. Flag race conditions and missing tests."
|
|
122
|
+
}
|
|
123
|
+
// → { "chatId": "abc123", "url": "http://localhost:5050/runs/abc123", "status": "reviewing" }
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Stream results back into your editor, or open the URL to watch live.
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
93
130
|
**Requires** Node 20+ and at least *one* of these (you probably already have one):
|
|
94
131
|
|
|
95
132
|
- Claude Code, Codex CLI, Gemini CLI, OpenCode, or Kimi CLI — uses your existing subscription, no extra cost
|
|
@@ -257,20 +294,6 @@ Configure on first run, or anytime at *Settings → Permissions*.
|
|
|
257
294
|
|
|
258
295
|
---
|
|
259
296
|
|
|
260
|
-
## Use it from inside another AI tool
|
|
261
|
-
|
|
262
|
-
Chorus speaks MCP — the protocol Claude Code, Cursor, Codex, Gemini CLI etc. use to talk to other tools. So you can trigger a Chorus run *from inside* the AI tool you're already using.
|
|
263
|
-
|
|
264
|
-
Example, inside Claude Code:
|
|
265
|
-
|
|
266
|
-
> *"Run code-review on the diff against main using Chorus"*
|
|
267
|
-
|
|
268
|
-
Claude Code calls Chorus → Chorus fans out to other AI tools → results stream back into Claude Code. Useful when you want a second opinion without leaving the editor.
|
|
269
|
-
|
|
270
|
-
`chorus init` wires up MCP for the orchestrators it detects (Claude / Codex / Gemini / Cursor / Windsurf, etc.).
|
|
271
|
-
|
|
272
|
-
---
|
|
273
|
-
|
|
274
297
|
## Compared to other code-review tools
|
|
275
298
|
|
|
276
299
|
| | **Chorus** | CodeRabbit | Greptile | Cursor Review | GitHub Copilot |
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerDoctorCommand = registerDoctorCommand;
|
|
4
|
+
const ui_js_1 = require("../ui.js");
|
|
5
|
+
async function gatherReport() {
|
|
6
|
+
const { detectAllClis } = await import('../../lib/cli-detect.js');
|
|
7
|
+
const { loadCapturedPath } = await import('../../lib/runtime-path.js');
|
|
8
|
+
const { cliPaths } = await import('../../lib/cli-paths.js');
|
|
9
|
+
await cliPaths.refreshCache();
|
|
10
|
+
const detection = detectAllClis(true);
|
|
11
|
+
const capturedPath = await loadCapturedPath();
|
|
12
|
+
const manualPaths = await cliPaths.listAll();
|
|
13
|
+
const compactManual = {};
|
|
14
|
+
for (const [id, p] of Object.entries(manualPaths)) {
|
|
15
|
+
if (p)
|
|
16
|
+
compactManual[id] = p;
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
detection,
|
|
20
|
+
capturedPath,
|
|
21
|
+
daemonPath: process.env.PATH ?? '',
|
|
22
|
+
manualPaths: compactManual,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function printReport(r) {
|
|
26
|
+
const labelMap = {
|
|
27
|
+
'claude-code': 'claude',
|
|
28
|
+
'codex-cli': 'codex',
|
|
29
|
+
'gemini-cli': 'gemini',
|
|
30
|
+
'opencode-cli': 'opencode',
|
|
31
|
+
'kimi-cli': 'kimi',
|
|
32
|
+
};
|
|
33
|
+
console.log('');
|
|
34
|
+
console.log((0, ui_js_1.header)(ui_js_1.sym.pointer, 'Chorus doctor'));
|
|
35
|
+
console.log('');
|
|
36
|
+
console.log(ui_js_1.c.bold(' CLI detection'));
|
|
37
|
+
console.log('');
|
|
38
|
+
for (const d of r.detection) {
|
|
39
|
+
const name = labelMap[d.id] ?? d.id;
|
|
40
|
+
if (d.found) {
|
|
41
|
+
const sourceTag = d.source === 'manual'
|
|
42
|
+
? ui_js_1.c.cyan('manual')
|
|
43
|
+
: d.source === 'fallback'
|
|
44
|
+
? ui_js_1.c.yellow('fallback')
|
|
45
|
+
: ui_js_1.c.dim('PATH');
|
|
46
|
+
console.log(` ${ui_js_1.sym.ok} ${ui_js_1.c.bold(name.padEnd(10))} ${ui_js_1.c.dim(d.path ?? '')} ${ui_js_1.c.dim('(')}${sourceTag}${ui_js_1.c.dim(')')}`);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
const reason = d.reason ? ui_js_1.c.dim(` — ${d.reason}`) : '';
|
|
50
|
+
console.log(` ${ui_js_1.sym.err} ${ui_js_1.c.bold(name.padEnd(10))} ${ui_js_1.c.red('not found')}${reason}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
console.log('');
|
|
54
|
+
console.log(ui_js_1.c.bold(' PATH visibility'));
|
|
55
|
+
console.log('');
|
|
56
|
+
console.log(` daemon PATH: ${ui_js_1.c.dim(`${r.daemonPath.split(':').length} dirs`)} ${r.daemonPath ? ui_js_1.c.dim(`(${r.daemonPath.slice(0, 80)}${r.daemonPath.length > 80 ? '…' : ''})`) : ''}`);
|
|
57
|
+
if (r.capturedPath) {
|
|
58
|
+
console.log(` captured shell: ${ui_js_1.c.dim(`${r.capturedPath.split(':').length} dirs`)} ${ui_js_1.c.dim(`(${r.capturedPath.slice(0, 80)}${r.capturedPath.length > 80 ? '…' : ''})`)}`);
|
|
59
|
+
const inDaemon = new Set(r.daemonPath.split(':'));
|
|
60
|
+
const missing = r.capturedPath
|
|
61
|
+
.split(':')
|
|
62
|
+
.filter((p) => p && !inDaemon.has(p));
|
|
63
|
+
if (missing.length > 0) {
|
|
64
|
+
console.log('');
|
|
65
|
+
console.log(` ${ui_js_1.c.yellow('!')} ${missing.length} dirs in your shell PATH but NOT in the daemon's PATH:`);
|
|
66
|
+
for (const p of missing.slice(0, 8)) {
|
|
67
|
+
console.log(` ${ui_js_1.c.dim(p)}`);
|
|
68
|
+
}
|
|
69
|
+
if (missing.length > 8) {
|
|
70
|
+
console.log(` ${ui_js_1.c.dim(`… +${missing.length - 8} more`)}`);
|
|
71
|
+
}
|
|
72
|
+
console.log('');
|
|
73
|
+
console.log(` ${ui_js_1.c.dim('Tip:')} restart the daemon with ${ui_js_1.c.bold('chorus stop && chorus start')} to re-capture.`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
console.log(` captured shell: ${ui_js_1.c.dim('not captured yet — run ')}${ui_js_1.c.bold('chorus init')}${ui_js_1.c.dim(' or ')}${ui_js_1.c.bold('chorus start')}`);
|
|
78
|
+
}
|
|
79
|
+
if (Object.keys(r.manualPaths).length > 0) {
|
|
80
|
+
console.log('');
|
|
81
|
+
console.log(ui_js_1.c.bold(' Manual overrides'));
|
|
82
|
+
console.log('');
|
|
83
|
+
for (const [id, p] of Object.entries(r.manualPaths)) {
|
|
84
|
+
const name = labelMap[id] ?? id;
|
|
85
|
+
console.log(` ${ui_js_1.sym.ok} ${ui_js_1.c.bold(name.padEnd(10))} ${ui_js_1.c.dim(p)}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Final hint when something looks off
|
|
89
|
+
const missingCli = r.detection.filter((d) => !d.found);
|
|
90
|
+
if (missingCli.length > 0) {
|
|
91
|
+
console.log('');
|
|
92
|
+
console.log(ui_js_1.c.bold(' Next steps'));
|
|
93
|
+
console.log('');
|
|
94
|
+
console.log(` ${ui_js_1.c.dim('•')} Visit ${ui_js_1.c.cyan('http://127.0.0.1:5050/onboarding')} → "I know where it is"`);
|
|
95
|
+
console.log(` to paste a path for any missing CLI.`);
|
|
96
|
+
console.log(` ${ui_js_1.c.dim('•')} Or run ${ui_js_1.c.bold('chorus stop && chorus start')} from your usual terminal so`);
|
|
97
|
+
console.log(` we re-capture the PATH that has the CLI.`);
|
|
98
|
+
}
|
|
99
|
+
console.log('');
|
|
100
|
+
}
|
|
101
|
+
function registerDoctorCommand(program) {
|
|
102
|
+
program
|
|
103
|
+
.command('doctor')
|
|
104
|
+
.description('Diagnose CLI detection + PATH issues — what the daemon sees vs what your shell sees')
|
|
105
|
+
.action(async () => {
|
|
106
|
+
try {
|
|
107
|
+
const report = await gatherReport();
|
|
108
|
+
printReport(report);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
console.error('doctor failed:', err instanceof Error ? err.message : err);
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.registerInitCommand = registerInitCommand;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const os_1 = __importDefault(require("os"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const index_js_1 = require("../../lib/db/index.js");
|
|
11
|
+
const shared_js_1 = require("../shared.js");
|
|
12
|
+
const ui_js_1 = require("../ui.js");
|
|
13
|
+
/**
|
|
14
|
+
* Detect which reviewer CLIs (claude/codex/gemini/opencode/kimi) are
|
|
15
|
+
* usable on the host. Returns the list of human-friendly names that
|
|
16
|
+
* passed the full detect-and-verify probe. Used by `chorus init` to
|
|
17
|
+
* warn when zero are installed — the cockpit would otherwise look
|
|
18
|
+
* healthy but every run would hang on first dispatch.
|
|
19
|
+
*/
|
|
20
|
+
async function detectReviewerClis() {
|
|
21
|
+
try {
|
|
22
|
+
const { detectAllClis } = await import('../../lib/cli-detect.js');
|
|
23
|
+
const all = detectAllClis();
|
|
24
|
+
const labelMap = {
|
|
25
|
+
'claude-code': 'claude',
|
|
26
|
+
'codex-cli': 'codex',
|
|
27
|
+
'gemini-cli': 'gemini',
|
|
28
|
+
'opencode-cli': 'opencode',
|
|
29
|
+
'kimi-cli': 'kimi',
|
|
30
|
+
};
|
|
31
|
+
return {
|
|
32
|
+
clis: all.filter((d) => d.found).map((d) => labelMap[d.id] ?? d.id),
|
|
33
|
+
detectFailed: false,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
return {
|
|
38
|
+
clis: [],
|
|
39
|
+
detectFailed: true,
|
|
40
|
+
detectError: err instanceof Error ? err.message : String(err),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Detect Claude Code / Codex / Gemini / OpenCode and wire each one.
|
|
46
|
+
* If the user passed `--connect <list>` we only touch those.
|
|
47
|
+
*/
|
|
48
|
+
async function runOrchestratorAutoConnect(connectFlag) {
|
|
49
|
+
const { autoConnectAll } = await import('../../daemon/orchestrators/index.js');
|
|
50
|
+
const binPath = shared_js_1.CHORUS_BIN_PATH;
|
|
51
|
+
const ALL_NAMES = [
|
|
52
|
+
'claude',
|
|
53
|
+
'codex',
|
|
54
|
+
'gemini',
|
|
55
|
+
'opencode',
|
|
56
|
+
'kimi',
|
|
57
|
+
'cursor',
|
|
58
|
+
'windsurf',
|
|
59
|
+
];
|
|
60
|
+
let only;
|
|
61
|
+
if (connectFlag) {
|
|
62
|
+
const wanted = connectFlag.split(',').map((s) => s.trim().toLowerCase());
|
|
63
|
+
only = [];
|
|
64
|
+
for (const w of wanted) {
|
|
65
|
+
if (ALL_NAMES.includes(w)) {
|
|
66
|
+
only.push(w);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
console.error(`Unknown orchestrator '${w}' in --connect. Valid: ${ALL_NAMES.join(', ')}`);
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
console.log('');
|
|
75
|
+
console.log(` ${ui_js_1.c.dim('Detecting orchestrators...')}`);
|
|
76
|
+
const result = await autoConnectAll({ binPath, ...(only ? { only } : {}) });
|
|
77
|
+
for (const step of result.steps) {
|
|
78
|
+
if (!step.detected) {
|
|
79
|
+
console.log(` ${ui_js_1.c.gray('○')} ${ui_js_1.c.gray(step.label.padEnd(14))} ${ui_js_1.c.dim('not detected')}`);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (step.error) {
|
|
83
|
+
console.log(` ${ui_js_1.c.yellow('!')} ${ui_js_1.c.yellow(step.label.padEnd(14))} ${ui_js_1.c.dim(step.error)}`);
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const parts = [];
|
|
87
|
+
if (step.registered)
|
|
88
|
+
parts.push('MCP registered');
|
|
89
|
+
else
|
|
90
|
+
parts.push('MCP already registered');
|
|
91
|
+
if (step.toolsAdded > 0)
|
|
92
|
+
parts.push(`${step.toolsAdded} tool(s) approved`);
|
|
93
|
+
else if (step.name === 'claude')
|
|
94
|
+
parts.push('all tools approved');
|
|
95
|
+
if (step.slashCommand === 'installed')
|
|
96
|
+
parts.push('/chorus installed');
|
|
97
|
+
else if (step.slashCommand === 'updated')
|
|
98
|
+
parts.push('/chorus updated');
|
|
99
|
+
console.log(` ${ui_js_1.sym.ok} ${ui_js_1.c.bold(step.label.padEnd(14))} ${ui_js_1.c.dim(parts.join(' · '))}`);
|
|
100
|
+
}
|
|
101
|
+
if (!result.anyConnected) {
|
|
102
|
+
console.log('');
|
|
103
|
+
console.log(` ${ui_js_1.sym.info} ${ui_js_1.c.dim('No supported editors found. Connect manually later with')} ${ui_js_1.c.bold('chorus connect')}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function registerInitCommand(program) {
|
|
107
|
+
program
|
|
108
|
+
.command('init')
|
|
109
|
+
.description('Initialize Chorus: create ~/.chorus/, seed database, register MCP with detected editors')
|
|
110
|
+
.option('--no-register', 'Skip auto-detecting orchestrators')
|
|
111
|
+
.option('--connect <list>', 'Comma-separated list of CLIs to connect (claude,codex,gemini,opencode,kimi,cursor,windsurf). Default: all detected.')
|
|
112
|
+
.action(async (opts) => {
|
|
113
|
+
try {
|
|
114
|
+
const chorusDir = path_1.default.join(os_1.default.homedir(), '.chorus');
|
|
115
|
+
console.log('');
|
|
116
|
+
console.log((0, ui_js_1.header)(ui_js_1.sym.pointer, 'Initializing Chorus...'));
|
|
117
|
+
console.log('');
|
|
118
|
+
if (!fs_1.default.existsSync(chorusDir)) {
|
|
119
|
+
fs_1.default.mkdirSync(chorusDir, { recursive: true });
|
|
120
|
+
console.log(` ${ui_js_1.sym.ok} ${ui_js_1.c.dim('created')} ${chorusDir}`);
|
|
121
|
+
}
|
|
122
|
+
// Seed the DB. resolveDbPath() honours CHORUS_DB_PATH so the
|
|
123
|
+
// line we print matches what the daemon will actually open —
|
|
124
|
+
// hardcoding ~/.chorus/chorus.db here misled users who'd set
|
|
125
|
+
// the env var and then asked "where's my DB?".
|
|
126
|
+
const { getDb } = await import('../../lib/db/index.js');
|
|
127
|
+
await getDb();
|
|
128
|
+
console.log(` ${ui_js_1.sym.ok} ${ui_js_1.c.dim('database ready at')} ${(0, index_js_1.resolveDbPath)()}`);
|
|
129
|
+
// Capture interactive PATH so the daemon can find CLIs in
|
|
130
|
+
// ~/.opencode/bin etc. when it later spawns reviewers from a
|
|
131
|
+
// non-interactive shell. Best-effort: skipped silently when
|
|
132
|
+
// capture fails (CI, no $SHELL, exotic shells we don't model).
|
|
133
|
+
try {
|
|
134
|
+
const { captureInteractivePath, persistCapturedPath } = await import('../../lib/runtime-path.js');
|
|
135
|
+
const captured = captureInteractivePath();
|
|
136
|
+
if (captured) {
|
|
137
|
+
await persistCapturedPath(captured);
|
|
138
|
+
console.log(` ${ui_js_1.sym.ok} ${ui_js_1.c.dim('captured shell PATH (')} ${captured.split(':').length} ${ui_js_1.c.dim('dirs)')}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
/* non-fatal — daemon falls back to known-install probes */
|
|
143
|
+
}
|
|
144
|
+
const templatesDir = path_1.default.join(__dirname, '..', '..', '..', 'templates');
|
|
145
|
+
if (fs_1.default.existsSync(templatesDir)) {
|
|
146
|
+
const files = fs_1.default
|
|
147
|
+
.readdirSync(templatesDir)
|
|
148
|
+
.filter((f) => f.endsWith('.yaml'));
|
|
149
|
+
const seeded = [];
|
|
150
|
+
for (const file of files) {
|
|
151
|
+
const id = file.replace('.yaml', '');
|
|
152
|
+
const yamlPath = path_1.default.join(templatesDir, file);
|
|
153
|
+
const yamlContent = fs_1.default.readFileSync(yamlPath, 'utf-8');
|
|
154
|
+
const existing = await index_js_1.templates.getById(id);
|
|
155
|
+
if (!existing) {
|
|
156
|
+
await index_js_1.templates.create(id, yamlContent, 'builtin');
|
|
157
|
+
seeded.push(id);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (seeded.length > 0) {
|
|
161
|
+
console.log(` ${ui_js_1.sym.ok} ${ui_js_1.c.dim('seeded templates:')} ${ui_js_1.c.cyan(seeded.join(', '))}`);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
console.log(` ${ui_js_1.sym.ok} ${ui_js_1.c.dim('templates already up to date')}`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Auto-detect & register every supported orchestrator. Skipped
|
|
168
|
+
// if user passes --no-register; restricted via --connect <list>.
|
|
169
|
+
if (opts.register !== false) {
|
|
170
|
+
await runOrchestratorAutoConnect(opts.connect);
|
|
171
|
+
}
|
|
172
|
+
// Reviewer-CLI presence check — separate from orchestrator wiring
|
|
173
|
+
// above. Without at least one of claude/codex/gemini/opencode/
|
|
174
|
+
// kimi installed OR an OpenRouter API key configured, Chorus
|
|
175
|
+
// has nothing to dispatch chats to.
|
|
176
|
+
const detect = await detectReviewerClis();
|
|
177
|
+
if (detect.detectFailed) {
|
|
178
|
+
console.log('');
|
|
179
|
+
console.log(` ${ui_js_1.c.yellow('!')} ${ui_js_1.c.bold(ui_js_1.c.yellow('CLI detection crashed:'))} ${detect.detectError ?? 'unknown error'}`);
|
|
180
|
+
console.log(ui_js_1.c.dim(' Init continued anyway — verify reviewers in Settings → Voices once you start the cockpit.'));
|
|
181
|
+
}
|
|
182
|
+
else if (detect.clis.length === 0) {
|
|
183
|
+
console.log('');
|
|
184
|
+
console.log(` ${ui_js_1.c.yellow('!')} ${ui_js_1.c.bold(ui_js_1.c.yellow('No AI CLIs detected on this machine.'))}`);
|
|
185
|
+
console.log(ui_js_1.c.dim(' Chorus needs at least one of these (or an OpenRouter API key):'));
|
|
186
|
+
console.log(ui_js_1.c.dim(' claude — https://docs.anthropic.com/en/docs/claude-code'));
|
|
187
|
+
console.log(ui_js_1.c.dim(' codex — https://github.com/openai/codex'));
|
|
188
|
+
console.log(ui_js_1.c.dim(' gemini — https://github.com/google-gemini/gemini-cli'));
|
|
189
|
+
console.log(ui_js_1.c.dim(' opencode — https://opencode.ai'));
|
|
190
|
+
console.log(ui_js_1.c.dim(' kimi — https://github.com/MoonshotAI/kimi-cli'));
|
|
191
|
+
console.log(ui_js_1.c.dim(' openrouter — Settings → Voices → Add OpenRouter (uses your API key)'));
|
|
192
|
+
console.log(ui_js_1.c.dim(' Install at least one CLI, or add an OpenRouter voice after `chorus start`.'));
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
console.log('');
|
|
196
|
+
console.log(` ${ui_js_1.sym.ok} ${ui_js_1.c.dim('AI CLIs ready:')} ${ui_js_1.c.cyan(detect.clis.join(', '))}`);
|
|
197
|
+
}
|
|
198
|
+
console.log('');
|
|
199
|
+
console.log((0, ui_js_1.header)(ui_js_1.sym.ok, 'Chorus initialized'));
|
|
200
|
+
console.log('');
|
|
201
|
+
console.log(` ${ui_js_1.c.dim('Next:')} ${ui_js_1.c.bold('chorus start')} ${ui_js_1.c.dim('— bring up the daemon and cockpit.')}`);
|
|
202
|
+
console.log(` ${ui_js_1.c.dim('Then restart any editor we just registered (Claude Code, etc.) so it picks up the MCP server.')}`);
|
|
203
|
+
console.log('');
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
console.error(`${ui_js_1.sym.err} ${ui_js_1.c.red('Initialization failed:')}`, error);
|
|
207
|
+
process.exit(1);
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|