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.
Files changed (293) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/cache/.previewinfo +1 -1
  4. package/.next/cache/.rscinfo +1 -1
  5. package/.next/cache/.tsbuildinfo +1 -1
  6. package/.next/fallback-build-manifest.json +3 -3
  7. package/.next/prerender-manifest.json +3 -3
  8. package/.next/server/app/_global-error.html +1 -1
  9. package/.next/server/app/_global-error.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  15. package/.next/server/app/_not-found.html +1 -1
  16. package/.next/server/app/_not-found.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  21. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  22. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  23. package/.next/server/app/new.html +1 -1
  24. package/.next/server/app/new.rsc +1 -1
  25. package/.next/server/app/new.segments/_full.segment.rsc +1 -1
  26. package/.next/server/app/new.segments/_head.segment.rsc +1 -1
  27. package/.next/server/app/new.segments/_index.segment.rsc +1 -1
  28. package/.next/server/app/new.segments/_tree.segment.rsc +1 -1
  29. package/.next/server/app/new.segments/new/__PAGE__.segment.rsc +1 -1
  30. package/.next/server/app/new.segments/new.segment.rsc +1 -1
  31. package/.next/server/app/onboarding.html +1 -1
  32. package/.next/server/app/onboarding.rsc +1 -1
  33. package/.next/server/app/onboarding.segments/_full.segment.rsc +1 -1
  34. package/.next/server/app/onboarding.segments/_head.segment.rsc +1 -1
  35. package/.next/server/app/onboarding.segments/_index.segment.rsc +1 -1
  36. package/.next/server/app/onboarding.segments/_tree.segment.rsc +1 -1
  37. package/.next/server/app/onboarding.segments/onboarding/__PAGE__.segment.rsc +1 -1
  38. package/.next/server/app/onboarding.segments/onboarding.segment.rsc +1 -1
  39. package/.next/server/app/personas.html +1 -1
  40. package/.next/server/app/personas.rsc +1 -1
  41. package/.next/server/app/personas.segments/_full.segment.rsc +1 -1
  42. package/.next/server/app/personas.segments/_head.segment.rsc +1 -1
  43. package/.next/server/app/personas.segments/_index.segment.rsc +1 -1
  44. package/.next/server/app/personas.segments/_tree.segment.rsc +1 -1
  45. package/.next/server/app/personas.segments/personas/__PAGE__.segment.rsc +1 -1
  46. package/.next/server/app/personas.segments/personas.segment.rsc +1 -1
  47. package/.next/server/app/settings.html +1 -1
  48. package/.next/server/app/settings.rsc +1 -1
  49. package/.next/server/app/settings.segments/_full.segment.rsc +1 -1
  50. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  51. package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  52. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  53. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
  54. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  55. package/.next/server/app/templates.html +1 -1
  56. package/.next/server/app/templates.rsc +1 -1
  57. package/.next/server/app/templates.segments/_full.segment.rsc +1 -1
  58. package/.next/server/app/templates.segments/_head.segment.rsc +1 -1
  59. package/.next/server/app/templates.segments/_index.segment.rsc +1 -1
  60. package/.next/server/app/templates.segments/_tree.segment.rsc +1 -1
  61. package/.next/server/app/templates.segments/templates/__PAGE__.segment.rsc +1 -1
  62. package/.next/server/app/templates.segments/templates.segment.rsc +1 -1
  63. package/.next/server/middleware-build-manifest.js +3 -3
  64. package/.next/server/pages/404.html +1 -1
  65. package/.next/server/pages/500.html +1 -1
  66. package/.next/server/server-reference-manifest.js +1 -1
  67. package/.next/server/server-reference-manifest.json +1 -1
  68. package/.next/trace +1 -1
  69. package/.next/trace-build +1 -1
  70. package/README.md +38 -15
  71. package/dist/cli/commands/doctor.js +116 -0
  72. package/dist/cli/commands/doctor.js.map +1 -0
  73. package/dist/cli/commands/init.js +211 -0
  74. package/dist/cli/commands/init.js.map +1 -0
  75. package/dist/cli/commands/start.js +298 -0
  76. package/dist/cli/commands/start.js.map +1 -0
  77. package/dist/cli/commands/status.js +54 -0
  78. package/dist/cli/commands/status.js.map +1 -0
  79. package/dist/cli/commands/stop.js +97 -0
  80. package/dist/cli/commands/stop.js.map +1 -0
  81. package/dist/cli/connect.js +108 -0
  82. package/dist/cli/connect.js.map +1 -0
  83. package/dist/cli/index.js +99 -0
  84. package/dist/cli/index.js.map +1 -0
  85. package/dist/cli/port-utils.js +260 -0
  86. package/dist/cli/port-utils.js.map +1 -0
  87. package/dist/cli/runtime-env.js +60 -0
  88. package/dist/cli/runtime-env.js.map +1 -0
  89. package/dist/cli/shared.js +54 -0
  90. package/dist/cli/shared.js.map +1 -0
  91. package/dist/cli/ui.js +60 -0
  92. package/dist/cli/ui.js.map +1 -0
  93. package/dist/daemon/agents/claude.js +98 -0
  94. package/dist/daemon/agents/claude.js.map +1 -0
  95. package/dist/daemon/agents/codex.js +160 -0
  96. package/dist/daemon/agents/codex.js.map +1 -0
  97. package/dist/daemon/agents/gemini.js +111 -0
  98. package/dist/daemon/agents/gemini.js.map +1 -0
  99. package/dist/daemon/agents/index.js +59 -0
  100. package/dist/daemon/agents/index.js.map +1 -0
  101. package/dist/daemon/agents/kimi.js +206 -0
  102. package/dist/daemon/agents/kimi.js.map +1 -0
  103. package/dist/daemon/agents/opencode.js +228 -0
  104. package/dist/daemon/agents/opencode.js.map +1 -0
  105. package/dist/daemon/agents/openrouter.js +274 -0
  106. package/dist/daemon/agents/openrouter.js.map +1 -0
  107. package/dist/daemon/agents/parsers/claude.js +63 -0
  108. package/dist/daemon/agents/parsers/claude.js.map +1 -0
  109. package/dist/daemon/agents/parsers/codex.js +51 -0
  110. package/dist/daemon/agents/parsers/codex.js.map +1 -0
  111. package/dist/daemon/agents/parsers/gemini.js +144 -0
  112. package/dist/daemon/agents/parsers/gemini.js.map +1 -0
  113. package/dist/daemon/agents/parsers/index.js +31 -0
  114. package/dist/daemon/agents/parsers/index.js.map +1 -0
  115. package/dist/daemon/agents/parsers/kimi.js +8 -0
  116. package/dist/daemon/agents/parsers/kimi.js.map +1 -0
  117. package/dist/daemon/agents/parsers/opencode.js +105 -0
  118. package/dist/daemon/agents/parsers/opencode.js.map +1 -0
  119. package/dist/daemon/agents/parsers/openrouter.js +69 -0
  120. package/dist/daemon/agents/parsers/openrouter.js.map +1 -0
  121. package/dist/daemon/agents/parsers/shared.js +17 -0
  122. package/dist/daemon/agents/parsers/shared.js.map +1 -0
  123. package/dist/daemon/agents/preflight.js +83 -0
  124. package/dist/daemon/agents/preflight.js.map +1 -0
  125. package/dist/daemon/agents/quote.js +45 -0
  126. package/dist/daemon/agents/quote.js.map +1 -0
  127. package/dist/daemon/agents/sandbox-guard.js +69 -0
  128. package/dist/daemon/agents/sandbox-guard.js.map +1 -0
  129. package/dist/daemon/agents/types.js +6 -0
  130. package/dist/daemon/agents/types.js.map +1 -0
  131. package/dist/daemon/api-response.js +65 -0
  132. package/dist/daemon/api-response.js.map +1 -0
  133. package/dist/daemon/error-detector.js +329 -0
  134. package/dist/daemon/error-detector.js.map +1 -0
  135. package/dist/daemon/headless.js +533 -0
  136. package/dist/daemon/headless.js.map +1 -0
  137. package/dist/daemon/index.js +333 -0
  138. package/dist/daemon/index.js.map +1 -0
  139. package/dist/daemon/openrouter.js +192 -0
  140. package/dist/daemon/openrouter.js.map +1 -0
  141. package/dist/daemon/orchestrators/claude.js +163 -0
  142. package/dist/daemon/orchestrators/claude.js.map +1 -0
  143. package/dist/daemon/orchestrators/codex.js +101 -0
  144. package/dist/daemon/orchestrators/codex.js.map +1 -0
  145. package/dist/daemon/orchestrators/cursor-windsurf.js +118 -0
  146. package/dist/daemon/orchestrators/cursor-windsurf.js.map +1 -0
  147. package/dist/daemon/orchestrators/gemini.js +108 -0
  148. package/dist/daemon/orchestrators/gemini.js.map +1 -0
  149. package/dist/daemon/orchestrators/index.js +90 -0
  150. package/dist/daemon/orchestrators/index.js.map +1 -0
  151. package/dist/daemon/orchestrators/kimi.js +108 -0
  152. package/dist/daemon/orchestrators/kimi.js.map +1 -0
  153. package/dist/daemon/orchestrators/opencode.js +152 -0
  154. package/dist/daemon/orchestrators/opencode.js.map +1 -0
  155. package/dist/daemon/orchestrators/shared.js +60 -0
  156. package/dist/daemon/orchestrators/shared.js.map +1 -0
  157. package/dist/daemon/output-watcher.js +131 -0
  158. package/dist/daemon/output-watcher.js.map +1 -0
  159. package/dist/daemon/participant-aborts.js +123 -0
  160. package/dist/daemon/participant-aborts.js.map +1 -0
  161. package/dist/daemon/reaper.js +46 -0
  162. package/dist/daemon/reaper.js.map +1 -0
  163. package/dist/daemon/routes/chats-events.js +62 -0
  164. package/dist/daemon/routes/chats-events.js.map +1 -0
  165. package/dist/daemon/routes/chats-stream.js +241 -0
  166. package/dist/daemon/routes/chats-stream.js.map +1 -0
  167. package/dist/daemon/routes/chats-validation.js +13 -0
  168. package/dist/daemon/routes/chats-validation.js.map +1 -0
  169. package/dist/daemon/routes/chats.js +545 -0
  170. package/dist/daemon/routes/chats.js.map +1 -0
  171. package/dist/daemon/routes/openrouter.js +103 -0
  172. package/dist/daemon/routes/openrouter.js.map +1 -0
  173. package/dist/daemon/routes/settings.js +199 -0
  174. package/dist/daemon/routes/settings.js.map +1 -0
  175. package/dist/daemon/routes/stats.js +155 -0
  176. package/dist/daemon/routes/stats.js.map +1 -0
  177. package/dist/daemon/routes/system.js +208 -0
  178. package/dist/daemon/routes/system.js.map +1 -0
  179. package/dist/daemon/routes/templates-personas.js +254 -0
  180. package/dist/daemon/routes/templates-personas.js.map +1 -0
  181. package/dist/daemon/routes/voices.js +139 -0
  182. package/dist/daemon/routes/voices.js.map +1 -0
  183. package/dist/daemon/runner/doer-driver.js +346 -0
  184. package/dist/daemon/runner/doer-driver.js.map +1 -0
  185. package/dist/daemon/runner/doer.js +336 -0
  186. package/dist/daemon/runner/doer.js.map +1 -0
  187. package/dist/daemon/runner/prior-round.js +140 -0
  188. package/dist/daemon/runner/prior-round.js.map +1 -0
  189. package/dist/daemon/runner/prompt-builder.js +292 -0
  190. package/dist/daemon/runner/prompt-builder.js.map +1 -0
  191. package/dist/daemon/runner/review-only-phase.js +103 -0
  192. package/dist/daemon/runner/review-only-phase.js.map +1 -0
  193. package/dist/daemon/runner/reviewer-driver.js +410 -0
  194. package/dist/daemon/runner/reviewer-driver.js.map +1 -0
  195. package/dist/daemon/runner/reviewer.js +384 -0
  196. package/dist/daemon/runner/reviewer.js.map +1 -0
  197. package/dist/daemon/runner/run-with-fallback.js +56 -0
  198. package/dist/daemon/runner/run-with-fallback.js.map +1 -0
  199. package/dist/daemon/runner/sanitize-name.js +8 -0
  200. package/dist/daemon/runner/sanitize-name.js.map +1 -0
  201. package/dist/daemon/runner/stream-file-writer.js +116 -0
  202. package/dist/daemon/runner/stream-file-writer.js.map +1 -0
  203. package/dist/daemon/runner/swap-sidecar.js +102 -0
  204. package/dist/daemon/runner/swap-sidecar.js.map +1 -0
  205. package/dist/daemon/runner/template-fallback.js +119 -0
  206. package/dist/daemon/runner/template-fallback.js.map +1 -0
  207. package/dist/daemon/runner/types.js +3 -0
  208. package/dist/daemon/runner/types.js.map +1 -0
  209. package/dist/daemon/runner/verdict.js +51 -0
  210. package/dist/daemon/runner/verdict.js.map +1 -0
  211. package/dist/daemon/runner-multiplex.js +364 -0
  212. package/dist/daemon/runner-multiplex.js.map +1 -0
  213. package/dist/daemon/runner.js +427 -0
  214. package/dist/daemon/runner.js.map +1 -0
  215. package/dist/daemon/ship.js +340 -0
  216. package/dist/daemon/ship.js.map +1 -0
  217. package/dist/daemon/template-cache.js +37 -0
  218. package/dist/daemon/template-cache.js.map +1 -0
  219. package/dist/daemon/tmux-types.js +9 -0
  220. package/dist/daemon/tmux-types.js.map +1 -0
  221. package/dist/daemon/tmux.js +341 -0
  222. package/dist/daemon/tmux.js.map +1 -0
  223. package/dist/lib/atomic-write.js +55 -0
  224. package/dist/lib/atomic-write.js.map +1 -0
  225. package/dist/lib/chat-events-bus.js +27 -0
  226. package/dist/lib/chat-events-bus.js.map +1 -0
  227. package/dist/lib/chat-slug.js +105 -0
  228. package/dist/lib/chat-slug.js.map +1 -0
  229. package/dist/lib/cli-detect.js +388 -0
  230. package/dist/lib/cli-detect.js.map +1 -0
  231. package/dist/lib/cli-health.js +156 -0
  232. package/dist/lib/cli-health.js.map +1 -0
  233. package/dist/lib/cli-paths.js +113 -0
  234. package/dist/lib/cli-paths.js.map +1 -0
  235. package/dist/lib/cli-precheck.js +141 -0
  236. package/dist/lib/cli-precheck.js.map +1 -0
  237. package/dist/lib/db/chats.js +244 -0
  238. package/dist/lib/db/chats.js.map +1 -0
  239. package/dist/lib/db/connection.js +254 -0
  240. package/dist/lib/db/connection.js.map +1 -0
  241. package/dist/lib/db/index.js +34 -0
  242. package/dist/lib/db/index.js.map +1 -0
  243. package/dist/lib/db/personas.js +65 -0
  244. package/dist/lib/db/personas.js.map +1 -0
  245. package/dist/lib/db/phase-events.js +172 -0
  246. package/dist/lib/db/phase-events.js.map +1 -0
  247. package/dist/lib/db/secrets.js +53 -0
  248. package/dist/lib/db/secrets.js.map +1 -0
  249. package/dist/lib/db/settings.js +47 -0
  250. package/dist/lib/db/settings.js.map +1 -0
  251. package/dist/lib/db/templates.js +75 -0
  252. package/dist/lib/db/templates.js.map +1 -0
  253. package/dist/lib/db/voices.js +184 -0
  254. package/dist/lib/db/voices.js.map +1 -0
  255. package/dist/lib/lineage-maps.js +200 -0
  256. package/dist/lib/lineage-maps.js.map +1 -0
  257. package/dist/lib/logger.js +186 -0
  258. package/dist/lib/logger.js.map +1 -0
  259. package/dist/lib/personas.js +117 -0
  260. package/dist/lib/personas.js.map +1 -0
  261. package/dist/lib/runtime-path.js +222 -0
  262. package/dist/lib/runtime-path.js.map +1 -0
  263. package/dist/lib/settings/billing.js +58 -0
  264. package/dist/lib/settings/billing.js.map +1 -0
  265. package/dist/lib/settings/permissions.js +81 -0
  266. package/dist/lib/settings/permissions.js.map +1 -0
  267. package/dist/lib/settings/transport.js +113 -0
  268. package/dist/lib/settings/transport.js.map +1 -0
  269. package/dist/lib/telemetry.js +290 -0
  270. package/dist/lib/telemetry.js.map +1 -0
  271. package/dist/lib/template-schema.js +319 -0
  272. package/dist/lib/template-schema.js.map +1 -0
  273. package/dist/lib/template-validation.js +82 -0
  274. package/dist/lib/template-validation.js.map +1 -0
  275. package/dist/lib/voices.js +533 -0
  276. package/dist/lib/voices.js.map +1 -0
  277. package/dist/mcp/client.js +138 -0
  278. package/dist/mcp/client.js.map +1 -0
  279. package/dist/mcp/index.js +178 -0
  280. package/dist/mcp/index.js.map +1 -0
  281. package/dist/mcp/tools.js +355 -0
  282. package/dist/mcp/tools.js.map +1 -0
  283. package/package.json +2 -1
  284. package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0beh7rg._.js +0 -6077
  285. package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0beh7rg._.js.map +0 -69
  286. package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0pjsj.j._.js +0 -6318
  287. package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0pjsj.j._.js.map +0 -71
  288. package/.next/dev/types/cache-life.d.ts +0 -145
  289. package/.next/dev/types/routes.d.ts +0 -84
  290. package/.next/dev/types/validator.ts +0 -178
  291. /package/.next/static/{dJlbRLlhISA0JGtHKVqgQ → 9cD3yIOGe_Aqr17uJHTQS}/_buildManifest.js +0 -0
  292. /package/.next/static/{dJlbRLlhISA0JGtHKVqgQ → 9cD3yIOGe_Aqr17uJHTQS}/_clientMiddlewareManifest.js +0 -0
  293. /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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"}