muonroi-cli 1.8.4 → 1.9.0

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 (562) hide show
  1. package/LICENSE +17 -5
  2. package/dist/packages/agent-harness-core/src/driver.d.ts +27 -1
  3. package/dist/packages/agent-harness-core/src/driver.js +46 -0
  4. package/dist/packages/agent-harness-core/src/event-filter.js +11 -0
  5. package/dist/packages/agent-harness-core/src/event-redact.js +7 -0
  6. package/dist/packages/agent-harness-core/src/event-tee.d.ts +64 -0
  7. package/dist/packages/agent-harness-core/src/event-tee.js +104 -0
  8. package/dist/packages/agent-harness-core/src/mcp-server.d.ts +25 -0
  9. package/dist/packages/agent-harness-core/src/mcp-server.js +169 -21
  10. package/dist/packages/agent-harness-core/src/predicate.d.ts +1 -1
  11. package/dist/packages/agent-harness-core/src/protocol.d.ts +90 -4
  12. package/dist/packages/agent-harness-core/src/protocol.js +15 -0
  13. package/dist/packages/agent-harness-core/src/visual-quality.d.ts +58 -0
  14. package/dist/packages/agent-harness-core/src/visual-quality.js +141 -0
  15. package/dist/packages/agent-harness-opentui/src/agent-mode.d.ts +6 -0
  16. package/dist/packages/agent-harness-opentui/src/agent-mode.js +14 -1
  17. package/dist/packages/agent-harness-opentui/src/input-bridge.d.ts +2 -10
  18. package/dist/packages/agent-harness-opentui/src/input-bridge.js +103 -16
  19. package/dist/packages/agent-harness-opentui/src/install.d.ts +8 -0
  20. package/dist/packages/agent-harness-opentui/src/install.js +10 -0
  21. package/dist/packages/agent-harness-opentui/src/semantic.js +12 -10
  22. package/dist/packages/agent-harness-opentui/src/visual-capture.d.ts +56 -0
  23. package/dist/packages/agent-harness-opentui/src/visual-capture.js +103 -0
  24. package/dist/src/agent-harness/mock-model.d.ts +38 -0
  25. package/dist/src/agent-harness/mock-model.js +69 -3
  26. package/dist/src/agent-harness/test-spawn.js +31 -0
  27. package/dist/src/chat/chat-keychain.d.ts +7 -12
  28. package/dist/src/chat/chat-keychain.js +19 -86
  29. package/dist/src/cli/config/screen-providers.js +1 -1
  30. package/dist/src/cli/cost-forensics.d.ts +10 -0
  31. package/dist/src/cli/cost-forensics.js +18 -3
  32. package/dist/src/cli/keys-bundle.d.ts +1 -1
  33. package/dist/src/cli/keys-bundle.js +1 -1
  34. package/dist/src/cli/keys.d.ts +10 -47
  35. package/dist/src/cli/keys.js +31 -399
  36. package/dist/src/council/clarifier.d.ts +31 -3
  37. package/dist/src/council/clarifier.js +220 -32
  38. package/dist/src/council/context.js +49 -15
  39. package/dist/src/council/debate-checkpoint.d.ts +129 -0
  40. package/dist/src/council/debate-checkpoint.js +176 -0
  41. package/dist/src/council/debate-planner.js +54 -5
  42. package/dist/src/council/debate-summary.d.ts +25 -0
  43. package/dist/src/council/debate-summary.js +85 -0
  44. package/dist/src/council/debate.d.ts +169 -2
  45. package/dist/src/council/debate.js +1265 -135
  46. package/dist/src/council/index.d.ts +108 -1
  47. package/dist/src/council/index.js +670 -197
  48. package/dist/src/council/leader.d.ts +26 -0
  49. package/dist/src/council/leader.js +150 -9
  50. package/dist/src/council/llm.d.ts +94 -0
  51. package/dist/src/council/llm.js +348 -55
  52. package/dist/src/council/panel-select.d.ts +30 -0
  53. package/dist/src/council/panel-select.js +82 -0
  54. package/dist/src/council/planner.js +40 -0
  55. package/dist/src/council/preflight.d.ts +17 -0
  56. package/dist/src/council/preflight.js +50 -2
  57. package/dist/src/council/prompts.d.ts +39 -4
  58. package/dist/src/council/prompts.js +256 -69
  59. package/dist/src/council/stance-recall.d.ts +42 -0
  60. package/dist/src/council/stance-recall.js +57 -0
  61. package/dist/src/council/strip-think.d.ts +17 -0
  62. package/dist/src/council/strip-think.js +33 -0
  63. package/dist/src/council/types.d.ts +138 -0
  64. package/dist/src/ee/artifact-cache.d.ts +16 -0
  65. package/dist/src/ee/artifact-cache.js +32 -0
  66. package/dist/src/ee/auth.d.ts +20 -0
  67. package/dist/src/ee/auth.js +54 -2
  68. package/dist/src/ee/bridge.d.ts +10 -0
  69. package/dist/src/ee/bridge.js +58 -0
  70. package/dist/src/ee/client.js +109 -21
  71. package/dist/src/ee/ee-onboarding.js +6 -26
  72. package/dist/src/ee/export-transcripts.d.ts +1 -0
  73. package/dist/src/ee/export-transcripts.js +8 -10
  74. package/dist/src/ee/extract-session.js +29 -0
  75. package/dist/src/ee/extract-style.d.ts +58 -0
  76. package/dist/src/ee/extract-style.js +270 -0
  77. package/dist/src/ee/recall-ledger.d.ts +9 -0
  78. package/dist/src/ee/recall-ledger.js +3 -0
  79. package/dist/src/ee/scope.d.ts +1 -0
  80. package/dist/src/ee/scope.js +26 -1
  81. package/dist/src/ee/search.d.ts +7 -0
  82. package/dist/src/ee/search.js +24 -0
  83. package/dist/src/ee/transcript-emit.js +2 -0
  84. package/dist/src/ee/types.d.ts +22 -0
  85. package/dist/src/ee/who-am-i-brain.d.ts +35 -0
  86. package/dist/src/ee/who-am-i-brain.js +220 -0
  87. package/dist/src/ee/who-am-i.d.ts +10 -3
  88. package/dist/src/ee/who-am-i.js +12 -0
  89. package/dist/src/ee/workflow-event.d.ts +48 -0
  90. package/dist/src/ee/workflow-event.js +81 -0
  91. package/dist/src/flow/compaction/compress.d.ts +3 -3
  92. package/dist/src/flow/compaction/compress.js +58 -8
  93. package/dist/src/flow/compaction/extract.d.ts +4 -7
  94. package/dist/src/flow/compaction/extract.js +50 -10
  95. package/dist/src/flow/compaction/index.d.ts +14 -1
  96. package/dist/src/flow/compaction/index.js +96 -3
  97. package/dist/src/flow/compaction/input-guard.d.ts +24 -0
  98. package/dist/src/flow/compaction/input-guard.js +43 -0
  99. package/dist/src/flow/compaction/progress.d.ts +35 -0
  100. package/dist/src/flow/compaction/progress.js +35 -0
  101. package/dist/src/flow/fold-planning.d.ts +36 -0
  102. package/dist/src/flow/fold-planning.js +83 -0
  103. package/dist/src/flow/hierarchy.d.ts +146 -0
  104. package/dist/src/flow/hierarchy.js +427 -0
  105. package/dist/src/flow/index.d.ts +1 -0
  106. package/dist/src/flow/index.js +2 -0
  107. package/dist/src/flow/run-artifacts.d.ts +102 -0
  108. package/dist/src/flow/run-artifacts.js +208 -0
  109. package/dist/src/generated/version.d.ts +1 -1
  110. package/dist/src/generated/version.js +1 -1
  111. package/dist/src/gsd/assessment-schema.d.ts +44 -0
  112. package/dist/src/gsd/assessment-schema.js +134 -0
  113. package/dist/src/gsd/capability-registry.d.ts +45 -0
  114. package/dist/src/gsd/capability-registry.js +337 -0
  115. package/dist/src/gsd/complexity-assessor.d.ts +39 -0
  116. package/dist/src/gsd/complexity-assessor.js +152 -0
  117. package/dist/src/gsd/config-bridge.d.ts +7 -0
  118. package/dist/src/gsd/config-bridge.js +114 -0
  119. package/dist/src/gsd/config-loader.d.ts +27 -0
  120. package/dist/src/gsd/config-loader.js +50 -0
  121. package/dist/src/gsd/council-context.d.ts +44 -0
  122. package/dist/src/gsd/council-context.js +114 -0
  123. package/dist/src/gsd/ee-closure.d.ts +28 -0
  124. package/dist/src/gsd/ee-closure.js +49 -0
  125. package/dist/src/gsd/flags.d.ts +66 -0
  126. package/dist/src/gsd/flags.js +102 -0
  127. package/dist/src/gsd/gsd-dispatch.d.ts +58 -0
  128. package/dist/src/gsd/gsd-dispatch.js +131 -0
  129. package/dist/src/gsd/gsd-runtime.d.ts +22 -0
  130. package/dist/src/gsd/gsd-runtime.js +37 -0
  131. package/dist/src/gsd/host-adapter.d.ts +11 -0
  132. package/dist/src/gsd/host-adapter.js +29 -0
  133. package/dist/src/gsd/index.d.ts +24 -1
  134. package/dist/src/gsd/index.js +27 -0
  135. package/dist/src/gsd/loop-host-contract.d.ts +21 -0
  136. package/dist/src/gsd/loop-host-contract.js +39 -0
  137. package/dist/src/gsd/loop-host.d.ts +69 -0
  138. package/dist/src/gsd/loop-host.js +245 -0
  139. package/dist/src/gsd/loop-resolver.d.ts +36 -0
  140. package/dist/src/gsd/loop-resolver.js +79 -0
  141. package/dist/src/gsd/model-tier.d.ts +13 -0
  142. package/dist/src/gsd/model-tier.js +45 -0
  143. package/dist/src/gsd/mutation-gate.d.ts +16 -0
  144. package/dist/src/gsd/mutation-gate.js +41 -0
  145. package/dist/src/gsd/native-roadmap.d.ts +89 -0
  146. package/dist/src/gsd/native-roadmap.js +343 -0
  147. package/dist/src/gsd/native-state.d.ts +47 -0
  148. package/dist/src/gsd/native-state.js +220 -0
  149. package/dist/src/gsd/paths.d.ts +23 -0
  150. package/dist/src/gsd/paths.js +66 -0
  151. package/dist/src/gsd/phase-dag.d.ts +12 -0
  152. package/dist/src/gsd/phase-dag.js +94 -0
  153. package/dist/src/gsd/phase-sync.d.ts +42 -0
  154. package/dist/src/gsd/phase-sync.js +321 -0
  155. package/dist/src/gsd/pil-gate-context.d.ts +13 -0
  156. package/dist/src/gsd/pil-gate-context.js +64 -0
  157. package/dist/src/gsd/pil-gate-critic.d.ts +19 -0
  158. package/dist/src/gsd/pil-gate-critic.js +74 -0
  159. package/dist/src/gsd/plan-council-prompts.d.ts +25 -0
  160. package/dist/src/gsd/plan-council-prompts.js +79 -0
  161. package/dist/src/gsd/plan-council.d.ts +44 -0
  162. package/dist/src/gsd/plan-council.js +283 -0
  163. package/dist/src/gsd/plan-gate-vocabulary.d.ts +40 -0
  164. package/dist/src/gsd/plan-gate-vocabulary.js +64 -0
  165. package/dist/src/gsd/product-workspace.d.ts +13 -0
  166. package/dist/src/gsd/product-workspace.js +124 -0
  167. package/dist/src/gsd/ship-bridge.d.ts +25 -0
  168. package/dist/src/gsd/ship-bridge.js +65 -0
  169. package/dist/src/gsd/state-document.d.ts +40 -0
  170. package/dist/src/gsd/state-document.js +163 -0
  171. package/dist/src/gsd/verdict-schema.d.ts +39 -0
  172. package/dist/src/gsd/verdict-schema.js +144 -0
  173. package/dist/src/gsd/verify-context.d.ts +22 -0
  174. package/dist/src/gsd/verify-context.js +27 -0
  175. package/dist/src/gsd/verify-council-prompts.d.ts +19 -0
  176. package/dist/src/gsd/verify-council-prompts.js +85 -0
  177. package/dist/src/gsd/verify-council.d.ts +25 -0
  178. package/dist/src/gsd/verify-council.js +119 -0
  179. package/dist/src/gsd/verify-gate-vocabulary.d.ts +25 -0
  180. package/dist/src/gsd/verify-gate-vocabulary.js +46 -0
  181. package/dist/src/gsd/workflow-engine.d.ts +60 -0
  182. package/dist/src/gsd/workflow-engine.js +207 -0
  183. package/dist/src/gsd/workflow-tools.d.ts +13 -0
  184. package/dist/src/gsd/workflow-tools.js +277 -0
  185. package/dist/src/headless/council-answers.js +4 -0
  186. package/dist/src/hooks/index.js +1 -1
  187. package/dist/src/index.js +172 -270
  188. package/dist/src/lsp/builtins.js +3 -1
  189. package/dist/src/lsp/manager.d.ts +5 -1
  190. package/dist/src/lsp/manager.js +249 -3
  191. package/dist/src/lsp/npm-cache.d.ts +11 -1
  192. package/dist/src/lsp/npm-cache.js +17 -1
  193. package/dist/src/lsp/runtime.d.ts +6 -1
  194. package/dist/src/lsp/runtime.js +17 -1
  195. package/dist/src/lsp/types.d.ts +83 -1
  196. package/dist/src/lsp/types.js +10 -0
  197. package/dist/src/maintain/pr-builder.js +23 -13
  198. package/dist/src/mcp/auto-setup.js +57 -32
  199. package/dist/src/mcp/client-pool.js +44 -16
  200. package/dist/src/mcp/lsp-tools.d.ts +5 -1
  201. package/dist/src/mcp/lsp-tools.js +93 -2
  202. package/dist/src/mcp/mcp-keychain.d.ts +3 -5
  203. package/dist/src/mcp/mcp-keychain.js +9 -49
  204. package/dist/src/mcp/research-onboarding.js +8 -7
  205. package/dist/src/mcp/runtime.js +34 -2
  206. package/dist/src/mcp/setup-guide-text.d.ts +1 -1
  207. package/dist/src/mcp/setup-guide-text.js +22 -2
  208. package/dist/src/mcp/tools-server.d.ts +10 -0
  209. package/dist/src/mcp/tools-server.js +10 -2
  210. package/dist/src/models/catalog-client.d.ts +87 -0
  211. package/dist/src/models/catalog-client.js +105 -38
  212. package/dist/src/models/catalog.json +528 -265
  213. package/dist/src/models/registry.d.ts +22 -7
  214. package/dist/src/models/registry.js +73 -10
  215. package/dist/src/ops/doctor.js +1 -1
  216. package/dist/src/orchestrator/ask-user.d.ts +61 -0
  217. package/dist/src/orchestrator/ask-user.js +65 -0
  218. package/dist/src/orchestrator/auto-commit.js +1 -1
  219. package/dist/src/orchestrator/batch-turn-runner.js +2 -2
  220. package/dist/src/orchestrator/cache-prefix.d.ts +67 -0
  221. package/dist/src/orchestrator/cache-prefix.js +83 -0
  222. package/dist/src/orchestrator/compact-request.d.ts +32 -0
  223. package/dist/src/orchestrator/compact-request.js +41 -0
  224. package/dist/src/orchestrator/compaction.d.ts +12 -3
  225. package/dist/src/orchestrator/compaction.js +35 -15
  226. package/dist/src/orchestrator/council-manager.d.ts +12 -3
  227. package/dist/src/orchestrator/council-manager.js +74 -32
  228. package/dist/src/orchestrator/council-request.d.ts +49 -0
  229. package/dist/src/orchestrator/council-request.js +62 -0
  230. package/dist/src/orchestrator/cross-turn-dedup.d.ts +6 -0
  231. package/dist/src/orchestrator/cross-turn-dedup.js +22 -1
  232. package/dist/src/orchestrator/error-utils.d.ts +29 -0
  233. package/dist/src/orchestrator/error-utils.js +132 -24
  234. package/dist/src/orchestrator/grounding-check.js +39 -1
  235. package/dist/src/orchestrator/interactive-pause.d.ts +26 -0
  236. package/dist/src/orchestrator/interactive-pause.js +36 -0
  237. package/dist/src/orchestrator/message-processor.d.ts +4 -0
  238. package/dist/src/orchestrator/message-processor.js +268 -41
  239. package/dist/src/orchestrator/orchestrator.d.ts +64 -3
  240. package/dist/src/orchestrator/orchestrator.js +823 -120
  241. package/dist/src/orchestrator/preprocessor.js +3 -3
  242. package/dist/src/orchestrator/proactive-compact-detector.d.ts +26 -0
  243. package/dist/src/orchestrator/proactive-compact-detector.js +36 -0
  244. package/dist/src/orchestrator/prompts.js +17 -17
  245. package/dist/src/orchestrator/reactive-delegation.d.ts +39 -0
  246. package/dist/src/orchestrator/reactive-delegation.js +59 -0
  247. package/dist/src/orchestrator/retry-classifier.d.ts +2 -1
  248. package/dist/src/orchestrator/retry-classifier.js +46 -2
  249. package/dist/src/orchestrator/safety-askcard.d.ts +1 -1
  250. package/dist/src/orchestrator/safety-askcard.js +5 -2
  251. package/dist/src/orchestrator/safety-intercept.d.ts +50 -0
  252. package/dist/src/orchestrator/safety-intercept.js +62 -0
  253. package/dist/src/orchestrator/scope-reminder.js +1 -1
  254. package/dist/src/orchestrator/session-experience.d.ts +2 -1
  255. package/dist/src/orchestrator/session-experience.js +2 -1
  256. package/dist/src/orchestrator/should-run-gate.d.ts +5 -0
  257. package/dist/src/orchestrator/should-run-gate.js +18 -0
  258. package/dist/src/orchestrator/stall-watchdog.d.ts +31 -3
  259. package/dist/src/orchestrator/stall-watchdog.js +65 -10
  260. package/dist/src/orchestrator/stream-runner.d.ts +13 -3
  261. package/dist/src/orchestrator/stream-runner.js +115 -49
  262. package/dist/src/orchestrator/sub-agent-cap.d.ts +13 -1
  263. package/dist/src/orchestrator/sub-agent-cap.js +16 -1
  264. package/dist/src/orchestrator/sub-agent-model-tier.d.ts +13 -1
  265. package/dist/src/orchestrator/sub-agent-model-tier.js +16 -2
  266. package/dist/src/orchestrator/subagent-compactor.d.ts +53 -1
  267. package/dist/src/orchestrator/subagent-compactor.js +126 -15
  268. package/dist/src/orchestrator/tool-engine.d.ts +41 -0
  269. package/dist/src/orchestrator/tool-engine.js +846 -66
  270. package/dist/src/orchestrator/tool-limit-auto-recover.d.ts +22 -0
  271. package/dist/src/orchestrator/tool-limit-auto-recover.js +30 -0
  272. package/dist/src/orchestrator/turn-runner-deps.d.ts +19 -0
  273. package/dist/src/orchestrator/turn-watchdog.d.ts +44 -0
  274. package/dist/src/orchestrator/turn-watchdog.js +84 -0
  275. package/dist/src/pil/agent-operating-contract.d.ts +1 -1
  276. package/dist/src/pil/agent-operating-contract.js +6 -4
  277. package/dist/src/pil/cheap-model-playbook.d.ts +1 -1
  278. package/dist/src/pil/cheap-model-playbook.js +5 -1
  279. package/dist/src/pil/cheap-model-workbooks.d.ts +1 -1
  280. package/dist/src/pil/cheap-model-workbooks.js +1 -1
  281. package/dist/src/pil/discovery-types.d.ts +1 -0
  282. package/dist/src/pil/discovery.d.ts +1 -1
  283. package/dist/src/pil/discovery.js +18 -13
  284. package/dist/src/pil/layer1-intent.d.ts +18 -6
  285. package/dist/src/pil/layer1-intent.js +66 -757
  286. package/dist/src/pil/layer15-context-scan.js +15 -1
  287. package/dist/src/pil/layer1_5-complexity-size.d.ts +7 -0
  288. package/dist/src/pil/layer1_5-complexity-size.js +31 -5
  289. package/dist/src/pil/layer3-ee-injection.js +23 -8
  290. package/dist/src/pil/layer4-gsd.js +69 -16
  291. package/dist/src/pil/layer5-context.js +7 -3
  292. package/dist/src/pil/layer6-output.d.ts +23 -0
  293. package/dist/src/pil/layer6-output.js +5 -1
  294. package/dist/src/pil/llm-classify.d.ts +111 -5
  295. package/dist/src/pil/llm-classify.js +421 -189
  296. package/dist/src/pil/native-capabilities-workbook.d.ts +1 -1
  297. package/dist/src/pil/native-capabilities-workbook.js +8 -0
  298. package/dist/src/pil/pipeline.js +36 -2
  299. package/dist/src/pil/repo-grounding-probe.d.ts +15 -0
  300. package/dist/src/pil/repo-grounding-probe.js +136 -0
  301. package/dist/src/pil/repo-structure-hints.d.ts +7 -0
  302. package/dist/src/pil/repo-structure-hints.js +45 -0
  303. package/dist/src/pil/response-tools.js +5 -3
  304. package/dist/src/pil/schema.d.ts +1 -0
  305. package/dist/src/pil/schema.js +2 -0
  306. package/dist/src/pil/types.d.ts +18 -0
  307. package/dist/src/playbook/directives.d.ts +4 -0
  308. package/dist/src/playbook/directives.js +17 -5
  309. package/dist/src/product-loop/artifact-io.js +4 -0
  310. package/dist/src/product-loop/backlog-builder.d.ts +14 -1
  311. package/dist/src/product-loop/backlog-builder.js +30 -6
  312. package/dist/src/product-loop/criteria-seed.d.ts +51 -0
  313. package/dist/src/product-loop/criteria-seed.js +200 -0
  314. package/dist/src/product-loop/discovery-context-format.js +3 -1
  315. package/dist/src/product-loop/discovery-ecosystem.js +4 -1
  316. package/dist/src/product-loop/discovery-interview.d.ts +9 -0
  317. package/dist/src/product-loop/discovery-interview.js +60 -12
  318. package/dist/src/product-loop/discovery-recommender.js +2 -1
  319. package/dist/src/product-loop/discovery-schema.js +19 -2
  320. package/dist/src/product-loop/discovery-triage.d.ts +23 -0
  321. package/dist/src/product-loop/discovery-triage.js +109 -0
  322. package/dist/src/product-loop/gather.js +150 -2
  323. package/dist/src/product-loop/ideal-trace.d.ts +7 -0
  324. package/dist/src/product-loop/ideal-trace.js +64 -0
  325. package/dist/src/product-loop/index.d.ts +13 -1
  326. package/dist/src/product-loop/index.js +340 -52
  327. package/dist/src/product-loop/loop-driver.d.ts +7 -0
  328. package/dist/src/product-loop/loop-driver.js +330 -106
  329. package/dist/src/product-loop/phase-plan.d.ts +21 -0
  330. package/dist/src/product-loop/phase-plan.js +81 -6
  331. package/dist/src/product-loop/phase-rituals.d.ts +3 -0
  332. package/dist/src/product-loop/phase-rituals.js +8 -3
  333. package/dist/src/product-loop/phase-runner.js +39 -12
  334. package/dist/src/product-loop/plan-adherence-review.d.ts +26 -0
  335. package/dist/src/product-loop/plan-adherence-review.js +144 -0
  336. package/dist/src/product-loop/sprint-runner.d.ts +173 -0
  337. package/dist/src/product-loop/sprint-runner.js +863 -19
  338. package/dist/src/product-loop/types.d.ts +61 -5
  339. package/dist/src/providers/adapter.d.ts +1 -1
  340. package/dist/src/providers/adapter.js +3 -4
  341. package/dist/src/providers/anthropic.d.ts +9 -8
  342. package/dist/src/providers/anthropic.js +13 -47
  343. package/dist/src/providers/auth/browser-flow.d.ts +1 -1
  344. package/dist/src/providers/auth/browser-flow.js +1 -1
  345. package/dist/src/providers/auth/grok-oauth.d.ts +1 -0
  346. package/dist/src/providers/auth/grok-oauth.js +30 -5
  347. package/dist/src/providers/auth/openai-oauth.d.ts +1 -0
  348. package/dist/src/providers/auth/openai-oauth.js +15 -1
  349. package/dist/src/providers/auth/registry.js +0 -34
  350. package/dist/src/providers/auth/token-store.d.ts +9 -9
  351. package/dist/src/providers/auth/token-store.js +8 -67
  352. package/dist/src/providers/auth/types.d.ts +9 -1
  353. package/dist/src/providers/auth/types.js +1 -1
  354. package/dist/src/providers/capabilities.d.ts +24 -5
  355. package/dist/src/providers/capabilities.js +42 -24
  356. package/dist/src/providers/endpoints.d.ts +2 -2
  357. package/dist/src/providers/endpoints.js +11 -10
  358. package/dist/src/providers/env-store.d.ts +17 -0
  359. package/dist/src/providers/env-store.js +228 -0
  360. package/dist/src/providers/keychain.d.ts +22 -18
  361. package/dist/src/providers/keychain.js +127 -140
  362. package/dist/src/providers/mcp-vision-bridge.js +56 -146
  363. package/dist/src/providers/openai-compatible.js +8 -1
  364. package/dist/src/providers/pricing.d.ts +2 -2
  365. package/dist/src/providers/pricing.js +3 -13
  366. package/dist/src/providers/runtime.d.ts +43 -3
  367. package/dist/src/providers/runtime.js +88 -14
  368. package/dist/src/providers/strategies/base.strategy.d.ts +16 -0
  369. package/dist/src/providers/strategies/base.strategy.js +24 -1
  370. package/dist/src/providers/strategies/{siliconflow.strategy.d.ts → opencode-go.strategy.d.ts} +3 -3
  371. package/dist/src/providers/strategies/opencode-go.strategy.js +83 -0
  372. package/dist/src/providers/strategies/registry.js +4 -4
  373. package/dist/src/providers/strategies/thinking-mode.d.ts +109 -0
  374. package/dist/src/providers/strategies/thinking-mode.js +288 -1
  375. package/dist/src/providers/strategies/xai.strategy.js +27 -0
  376. package/dist/src/providers/strategies/zai.strategy.d.ts +14 -0
  377. package/dist/src/providers/strategies/zai.strategy.js +44 -0
  378. package/dist/src/providers/types.d.ts +5 -6
  379. package/dist/src/providers/types.js +2 -2
  380. package/dist/src/providers/vision-backend.d.ts +47 -0
  381. package/dist/src/providers/vision-backend.js +258 -0
  382. package/dist/src/providers/vision-proxy.d.ts +22 -9
  383. package/dist/src/providers/vision-proxy.js +63 -132
  384. package/dist/src/providers/warm.d.ts +65 -0
  385. package/dist/src/providers/warm.js +145 -0
  386. package/dist/src/providers/wire-debug.js +95 -0
  387. package/dist/src/router/decide.d.ts +13 -0
  388. package/dist/src/router/decide.js +138 -36
  389. package/dist/src/router/peak-hour.d.ts +38 -0
  390. package/dist/src/router/peak-hour.js +107 -0
  391. package/dist/src/router/step-router.js +3 -2
  392. package/dist/src/router/warm.js +4 -5
  393. package/dist/src/scaffold/continuation-prompt.d.ts +11 -0
  394. package/dist/src/scaffold/continuation-prompt.js +26 -0
  395. package/dist/src/scaffold/point-to-existing.d.ts +21 -0
  396. package/dist/src/scaffold/point-to-existing.js +25 -0
  397. package/dist/src/self-qa/agentic-loop.js +6 -5
  398. package/dist/src/{ui/state → state}/active-run.d.ts +19 -0
  399. package/dist/src/{ui/state → state}/active-run.js +21 -0
  400. package/dist/src/{ui/status-bar/store.d.ts → state/status-bar-store.d.ts} +4 -1
  401. package/dist/src/{ui/status-bar/store.js → state/status-bar-store.js} +12 -9
  402. package/dist/src/state/turn-trace.d.ts +43 -0
  403. package/dist/src/state/turn-trace.js +32 -0
  404. package/dist/src/storage/db.js +2 -1
  405. package/dist/src/storage/index.d.ts +1 -1
  406. package/dist/src/storage/index.js +1 -1
  407. package/dist/src/storage/interaction-log.d.ts +1 -1
  408. package/dist/src/storage/migrations.js +71 -1
  409. package/dist/src/storage/sessions.d.ts +28 -10
  410. package/dist/src/storage/sessions.js +78 -21
  411. package/dist/src/storage/transcript-view.js +1 -1
  412. package/dist/src/storage/transcript.d.ts +51 -0
  413. package/dist/src/storage/transcript.js +340 -15
  414. package/dist/src/tools/file.d.ts +15 -0
  415. package/dist/src/tools/file.js +32 -0
  416. package/dist/src/tools/git-safety.d.ts +19 -0
  417. package/dist/src/tools/git-safety.js +168 -0
  418. package/dist/src/tools/native-tools.d.ts +1 -1
  419. package/dist/src/tools/native-tools.js +81 -1
  420. package/dist/src/tools/registry.d.ts +20 -0
  421. package/dist/src/tools/registry.js +576 -23
  422. package/dist/src/tools/research.d.ts +29 -0
  423. package/dist/src/tools/research.js +233 -0
  424. package/dist/src/types/index.d.ts +147 -4
  425. package/dist/src/ui/app.js +0 -0
  426. package/dist/src/ui/cards/product-status-card.js +1 -1
  427. package/dist/src/ui/components/agent-rail-activities.d.ts +26 -0
  428. package/dist/src/ui/components/agent-rail-activities.js +47 -0
  429. package/dist/src/ui/components/bubble-body-guard.d.ts +27 -0
  430. package/dist/src/ui/components/bubble-body-guard.js +50 -0
  431. package/dist/src/ui/components/compact-progress-card.d.ts +24 -0
  432. package/dist/src/ui/components/compact-progress-card.js +42 -0
  433. package/dist/src/ui/components/context-rail.d.ts +26 -0
  434. package/dist/src/ui/components/context-rail.js +33 -0
  435. package/dist/src/ui/components/council-conclusion-card.d.ts +73 -0
  436. package/dist/src/ui/components/council-conclusion-card.js +420 -0
  437. package/dist/src/ui/components/council-debate-pill.d.ts +36 -0
  438. package/dist/src/ui/components/council-debate-pill.js +34 -0
  439. package/dist/src/ui/components/council-info-card.js +2 -2
  440. package/dist/src/ui/components/council-leader-bubble.d.ts +10 -3
  441. package/dist/src/ui/components/council-leader-bubble.js +21 -11
  442. package/dist/src/ui/components/council-message-bubble.d.ts +15 -2
  443. package/dist/src/ui/components/council-message-bubble.js +16 -15
  444. package/dist/src/ui/components/council-phase-timeline.d.ts +9 -1
  445. package/dist/src/ui/components/council-phase-timeline.js +66 -17
  446. package/dist/src/ui/components/council-placeholder-bubble.d.ts +16 -9
  447. package/dist/src/ui/components/council-placeholder-bubble.js +32 -29
  448. package/dist/src/ui/components/council-question-card.js +13 -12
  449. package/dist/src/ui/components/council-rail-rounds.d.ts +26 -0
  450. package/dist/src/ui/components/council-rail-rounds.js +57 -0
  451. package/dist/src/ui/components/council-round-group.d.ts +38 -0
  452. package/dist/src/ui/components/council-round-group.js +88 -0
  453. package/dist/src/ui/components/council-status-list.d.ts +3 -1
  454. package/dist/src/ui/components/council-status-list.js +36 -24
  455. package/dist/src/ui/components/council-synthesis-banner.d.ts +7 -2
  456. package/dist/src/ui/components/council-synthesis-banner.js +20 -5
  457. package/dist/src/ui/components/halt-recovery-card.js +9 -5
  458. package/dist/src/ui/components/jump-to-latest-pill.d.ts +11 -0
  459. package/dist/src/ui/components/jump-to-latest-pill.js +14 -0
  460. package/dist/src/ui/components/message-view.d.ts +15 -0
  461. package/dist/src/ui/components/message-view.js +50 -1
  462. package/dist/src/ui/components/prompt-box.js +18 -16
  463. package/dist/src/ui/components/session-tree-card.d.ts +14 -0
  464. package/dist/src/ui/components/session-tree-card.js +46 -0
  465. package/dist/src/ui/components/slash-inline-menu.d.ts +12 -0
  466. package/dist/src/ui/components/slash-inline-menu.js +26 -5
  467. package/dist/src/ui/components/task-list-panel.d.ts +14 -1
  468. package/dist/src/ui/components/task-list-panel.js +22 -2
  469. package/dist/src/ui/components/tool-group.d.ts +15 -3
  470. package/dist/src/ui/components/tool-group.js +69 -11
  471. package/dist/src/ui/containers/modals-layer.d.ts +4 -2
  472. package/dist/src/ui/containers/modals-layer.js +2 -2
  473. package/dist/src/ui/council-harness-event.d.ts +57 -0
  474. package/dist/src/ui/council-harness-event.js +46 -0
  475. package/dist/src/ui/heartbeat-debug.d.ts +29 -0
  476. package/dist/src/ui/heartbeat-debug.js +45 -0
  477. package/dist/src/ui/hooks/use-session-picker.d.ts +3 -3
  478. package/dist/src/ui/mcp-modal.js +2 -4
  479. package/dist/src/ui/modals/api-key-modal.js +1 -1
  480. package/dist/src/ui/modals/connect-modal.js +4 -3
  481. package/dist/src/ui/modals/model-picker-modal.d.ts +8 -18
  482. package/dist/src/ui/modals/model-picker-modal.js +8 -10
  483. package/dist/src/ui/modals/session-picker-modal.d.ts +2 -2
  484. package/dist/src/ui/modals/session-picker-modal.js +3 -5
  485. package/dist/src/ui/picker-providers.d.ts +1 -1
  486. package/dist/src/ui/picker-providers.js +1 -1
  487. package/dist/src/ui/primitives/index.d.ts +1 -0
  488. package/dist/src/ui/primitives/index.js +2 -0
  489. package/dist/src/ui/primitives/semantic-primitives.d.ts +76 -0
  490. package/dist/src/ui/primitives/semantic-primitives.js +81 -0
  491. package/dist/src/ui/slash/compact.js +5 -7
  492. package/dist/src/ui/slash/cost.js +1 -1
  493. package/dist/src/ui/slash/council.js +19 -1
  494. package/dist/src/ui/slash/debug.d.ts +3 -31
  495. package/dist/src/ui/slash/debug.js +9 -20
  496. package/dist/src/ui/slash/ee.js +81 -0
  497. package/dist/src/ui/slash/ideal.d.ts +6 -2
  498. package/dist/src/ui/slash/ideal.js +97 -7
  499. package/dist/src/ui/slash/menu-items.d.ts +7 -0
  500. package/dist/src/ui/slash/menu-items.js +23 -20
  501. package/dist/src/ui/slash/registry.d.ts +2 -0
  502. package/dist/src/ui/slash/registry.js +4 -0
  503. package/dist/src/ui/status-bar/cache-hit.d.ts +6 -0
  504. package/dist/src/ui/status-bar/cache-hit.js +9 -0
  505. package/dist/src/ui/status-bar/index.d.ts +1 -1
  506. package/dist/src/ui/status-bar/index.js +7 -3
  507. package/dist/src/ui/status-bar/usd-meter.d.ts +5 -4
  508. package/dist/src/ui/status-bar/usd-meter.js +6 -4
  509. package/dist/src/ui/theme.d.ts +1 -0
  510. package/dist/src/ui/theme.js +2 -0
  511. package/dist/src/ui/types.d.ts +7 -0
  512. package/dist/src/ui/use-app-logic.js +0 -0
  513. package/dist/src/ui/utils/agent-activities.d.ts +39 -0
  514. package/dist/src/ui/utils/agent-activities.js +96 -0
  515. package/dist/src/ui/utils/format.d.ts +14 -0
  516. package/dist/src/ui/utils/format.js +23 -3
  517. package/dist/src/ui/utils/group-tool-entries.d.ts +26 -0
  518. package/dist/src/ui/utils/group-tool-entries.js +111 -0
  519. package/dist/src/ui/utils/tool-summary.d.ts +21 -0
  520. package/dist/src/ui/utils/tool-summary.js +91 -0
  521. package/dist/src/usage/downgrade.js +2 -2
  522. package/dist/src/usage/product-ledger.js +2 -2
  523. package/dist/src/utils/event-loop-monitor.d.ts +85 -0
  524. package/dist/src/utils/event-loop-monitor.js +107 -0
  525. package/dist/src/utils/install-manager.js +2 -1
  526. package/dist/src/utils/llm-deadline.d.ts +14 -0
  527. package/dist/src/utils/llm-deadline.js +19 -0
  528. package/dist/src/utils/logger.js +2 -2
  529. package/dist/src/utils/loop-profiler.d.ts +102 -0
  530. package/dist/src/utils/loop-profiler.js +202 -0
  531. package/dist/src/utils/permission-mode.js +5 -3
  532. package/dist/src/utils/redactor.js +1 -1
  533. package/dist/src/utils/settings.d.ts +180 -5
  534. package/dist/src/utils/settings.js +271 -31
  535. package/dist/src/utils/side-question.d.ts +1 -2
  536. package/dist/src/utils/side-question.js +2 -2
  537. package/dist/src/utils/visible-retry.d.ts +11 -0
  538. package/dist/src/utils/visible-retry.js +10 -1
  539. package/dist/src/verify/entrypoint.d.ts +1 -1
  540. package/dist/src/verify/entrypoint.js +52 -17
  541. package/dist/src/verify/orchestrator.d.ts +1 -1
  542. package/dist/src/verify/orchestrator.js +20 -3
  543. package/dist/src/verify/recipes.d.ts +13 -0
  544. package/dist/src/verify/recipes.js +15 -0
  545. package/package.json +134 -132
  546. package/dist/src/cli/bw-vault.d.ts +0 -55
  547. package/dist/src/cli/bw-vault.js +0 -133
  548. package/dist/src/mcp/ee-tools.d.ts +0 -46
  549. package/dist/src/mcp/ee-tools.js +0 -193
  550. package/dist/src/providers/auth/gcloud.d.ts +0 -28
  551. package/dist/src/providers/auth/gcloud.js +0 -102
  552. package/dist/src/providers/auth/gemini-oauth.d.ts +0 -82
  553. package/dist/src/providers/auth/gemini-oauth.js +0 -472
  554. package/dist/src/providers/gemini.d.ts +0 -11
  555. package/dist/src/providers/gemini.js +0 -45
  556. package/dist/src/providers/siliconflow-sse-repair.d.ts +0 -58
  557. package/dist/src/providers/siliconflow-sse-repair.js +0 -177
  558. package/dist/src/providers/strategies/google.strategy.d.ts +0 -22
  559. package/dist/src/providers/strategies/google.strategy.js +0 -174
  560. package/dist/src/providers/strategies/siliconflow.strategy.js +0 -29
  561. package/dist/src/ui/containers/chat-feed.d.ts +0 -40
  562. package/dist/src/ui/containers/chat-feed.js +0 -66
@@ -27,6 +27,27 @@ function removeDeprecatedToolsMcp(servers) {
27
27
  console.error("[mcp:auto-setup] removed deprecated self-spawned muonroi-tools server — its tools are now native in-process builtins");
28
28
  return true;
29
29
  }
30
+ /**
31
+ * Remove deprecated external MCP servers that are no longer seeded by default.
32
+ *
33
+ * - memory: superseded by native Experience Engine (ee_query + ee_write)
34
+ * - playwright: heavy browser automation; native research tools (fetch_url/web_search) cover most needs. Can be added manually.
35
+ * - figma: requires API key + specific workflow; removed from defaults. Can be added manually if needed.
36
+ */
37
+ function removeDeprecatedExternalMcps(servers) {
38
+ const idsToRemove = new Set(["memory", "playwright", "figma"]);
39
+ let removed = false;
40
+ for (let i = servers.length - 1; i >= 0; i--) {
41
+ if (idsToRemove.has(servers[i].id)) {
42
+ servers.splice(i, 1);
43
+ removed = true;
44
+ }
45
+ }
46
+ if (removed) {
47
+ console.error("[mcp:auto-setup] removed deprecated external MCPs (memory/playwright/figma). Use native EE for memory; fetch_url + web_search for research. Add playwright/figma manually only if full integration required.");
48
+ }
49
+ return removed;
50
+ }
30
51
  const DEFAULT_CONFIGS = [
31
52
  {
32
53
  // Authoritative source for the Muonroi ecosystem (BB/.NET template recipes,
@@ -39,31 +60,6 @@ const DEFAULT_CONFIGS = [
39
60
  transport: "http",
40
61
  url: "https://docs-mcp.muonroi.com/mcp",
41
62
  },
42
- {
43
- id: "playwright",
44
- label: "Playwright",
45
- enabled: true,
46
- transport: "stdio",
47
- command: "npx",
48
- args: ["-y", "@playwright/mcp"],
49
- },
50
- {
51
- id: "memory",
52
- label: "Memory",
53
- enabled: false,
54
- transport: "stdio",
55
- command: "npx",
56
- args: ["-y", "@modelcontextprotocol/server-memory"],
57
- },
58
- {
59
- id: "figma",
60
- label: "Figma",
61
- enabled: false,
62
- transport: "stdio",
63
- command: "npx",
64
- args: ["-y", "figma-developer-mcp", "--stdio"],
65
- env: { FIGMA_API_KEY: "" },
66
- },
67
63
  {
68
64
  id: "context7",
69
65
  label: "Context7 (Library Docs)",
@@ -71,21 +67,24 @@ const DEFAULT_CONFIGS = [
71
67
  transport: "http",
72
68
  url: "https://mcp.context7.com/mcp",
73
69
  },
70
+ // fetch and tavily are now provided as *native* builtins (fetch_url / web_search).
71
+ // The external MCP versions are kept in the catalog for users who explicitly want them,
72
+ // but are no longer enabled by default for the inner agent.
74
73
  {
75
74
  id: "fetch",
76
- label: "Fetch (URL → markdown)",
77
- enabled: true,
75
+ label: "Fetch (URL → markdown) [MCP legacy]",
76
+ enabled: false,
78
77
  transport: "stdio",
79
- command: "npx",
80
- args: ["-y", "mcp-fetch-server"],
78
+ command: "bun",
79
+ args: ["x", "-y", "mcp-fetch-server"],
81
80
  },
82
81
  {
83
82
  id: "tavily",
84
- label: "Tavily Web Search",
83
+ label: "Tavily Web Search [MCP legacy]",
85
84
  enabled: false,
86
85
  transport: "stdio",
87
- command: "npx",
88
- args: ["-y", "tavily-mcp"],
86
+ command: "bun",
87
+ args: ["x", "-y", "tavily-mcp"],
89
88
  env: { TAVILY_API_KEY: "" },
90
89
  },
91
90
  ];
@@ -108,10 +107,36 @@ function migrateServers(servers) {
108
107
  }
109
108
  return changed;
110
109
  }
110
+ /**
111
+ * Migrate any legacy "npx" stdio entries (from older default seeds or manual config)
112
+ * to "bun x" form. npx shims frequently produce immediate "Connection closed"
113
+ * under Bun on Windows; bun x gives clean stdio pipes. Idempotent.
114
+ */
115
+ function migrateNpxToBunx(servers) {
116
+ let changed = false;
117
+ for (const server of servers) {
118
+ if (server.transport === "stdio" && server.command === "npx") {
119
+ server.command = "bun";
120
+ const rest = (server.args ?? []).filter((a) => a !== "-y");
121
+ server.args = ["x", "-y", ...rest];
122
+ changed = true;
123
+ }
124
+ }
125
+ if (changed) {
126
+ console.error("[mcp:auto-setup] migrated legacy npx-based MCP servers to bun x (fixes Connection closed on Bun/Windows)");
127
+ }
128
+ return changed;
129
+ }
111
130
  export function ensureDefaultMcpServers() {
112
131
  try {
113
132
  const existing = loadMcpServers();
114
133
  let dirty = migrateServers(existing);
134
+ // Upgrade legacy npx runners (most important fix for "Connection closed" during warm-up).
135
+ if (migrateNpxToBunx(existing))
136
+ dirty = true;
137
+ // Remove deprecated external MCPs (memory/playwright/figma) — replaced by native or manual opt-in.
138
+ if (removeDeprecatedExternalMcps(existing))
139
+ dirty = true;
115
140
  // muonroi-tools is no longer self-spawned by the CLI — its capabilities
116
141
  // (ee_query/ee_feedback/ee_health/usage_forensics/lsp_query/setup_guide/
117
142
  // selfverify_*) are NATIVE in-process builtins now (src/tools/native-tools.ts).
@@ -237,30 +237,58 @@ export async function acquireMcpTools(servers, opts) {
237
237
  * evicted by getOrConnect so a real turn retries.
238
238
  */
239
239
  export async function warmMcpClients(servers, syncAndLog = false) {
240
- const validServers = servers.filter(s => s.enabled && validateMcpServerConfig(s).ok);
241
- if (syncAndLog && validServers.length > 0) {
242
- console.log(`[MCP] Warming up ${validServers.length} server(s)...`);
240
+ const validServers = servers.filter((s) => s.enabled && validateMcpServerConfig(s).ok);
241
+ // Fire-and-forget background warmup no user-facing output.
242
+ if (!syncAndLog) {
243
+ void Promise.all(validServers.map((s) => getOrConnect(s).catch((e) => {
244
+ // Intentionally non-fatal: getOrConnect evicts the failed entry so a
245
+ // real turn retries. Surface at debug level only (No Silent Catch).
246
+ if (process.env.MUONROI_DEBUG_MCP) {
247
+ console.error(`[mcp:warm] background warmup failed for ${s.id}: ${e instanceof Error ? e.message : String(e)}`);
248
+ }
249
+ })));
250
+ return;
243
251
  }
244
- const promises = validServers.map(async (s) => {
252
+ if (validServers.length === 0)
253
+ return;
254
+ // Synchronous warmup (fresh start): render ONE compact in-place progress line
255
+ // instead of a line per server — e.g. "⏳ Starting MCP servers (0/4): a, b, c".
256
+ const total = validServers.length;
257
+ const names = validServers.map((s) => s.id).join(", ");
258
+ const isTTY = Boolean(process.stdout.isTTY);
259
+ let done = 0;
260
+ const failures = [];
261
+ const render = () => {
262
+ // \r + clear-line (\x1b[2K) rewrites the same terminal row each tick.
263
+ process.stdout.write(`\r\x1b[2K⏳ Starting MCP servers (${done}/${total}): ${names}`);
264
+ };
265
+ if (isTTY)
266
+ render();
267
+ else
268
+ console.log(`[MCP] Starting ${total} server(s): ${names}`);
269
+ await Promise.all(validServers.map(async (s) => {
245
270
  try {
246
271
  await getOrConnect(s);
247
- if (syncAndLog) {
248
- console.log(`[MCP] ✅ ${s.id}: healthy`);
249
- }
250
272
  }
251
273
  catch (e) {
252
- if (syncAndLog) {
253
- const msg = e instanceof Error ? e.message : String(e);
254
- console.log(`[MCP] ❌ ${s.id}: failed - ${msg}`);
255
- }
274
+ failures.push(`${s.id}: ${e instanceof Error ? e.message : String(e)}`);
256
275
  }
257
- });
258
- if (syncAndLog) {
259
- await Promise.all(promises);
276
+ finally {
277
+ done += 1;
278
+ if (isTTY)
279
+ render();
280
+ }
281
+ }));
282
+ const ok = total - failures.length;
283
+ if (isTTY) {
284
+ process.stdout.write(`\r\x1b[2K✅ MCP servers ready (${ok}/${total})\n`);
260
285
  }
261
286
  else {
262
- // Fire-and-forget for background warmup
263
- void Promise.all(promises);
287
+ console.log(`[MCP] ${ok}/${total} server(s) ready`);
288
+ }
289
+ // Compact failure summary (one line, not per-server spam) — keeps errors visible.
290
+ if (failures.length > 0) {
291
+ console.warn(`[MCP] ⚠️ ${failures.length} unavailable: ${failures.join(" | ")}`);
264
292
  }
265
293
  }
266
294
  /** Tear down every pooled client. Call on orchestrator/process shutdown. */
@@ -8,9 +8,13 @@
8
8
  * deps are injected so unit tests never spawn a real language server.
9
9
  */
10
10
  import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
11
- import { type LspQueryInput, type LspToolResponse } from "../lsp/types.js";
11
+ import { type ImpactOfChangeResult, type LspQueryInput, type LspQueryResult, type LspToolResponse, type MutationPreviewResult, type PolicyAction } from "../lsp/types.js";
12
12
  export interface LspToolDeps {
13
13
  query?: (cwd: string, input: LspQueryInput) => Promise<LspToolResponse>;
14
14
  enabled?: (cwd: string) => boolean | Promise<boolean>;
15
+ waitForDiagnostics?: (cwd: string, filePath: string, timeout?: number) => Promise<LspQueryResult>;
16
+ impactOfChange?: (cwd: string, filePath: string, query?: string) => Promise<ImpactOfChangeResult>;
17
+ lspMutationPreview?: (cwd: string, filePath: string, change: string) => Promise<MutationPreviewResult>;
18
+ lspBeforeGrep?: (cwd: string, filePath: string, query?: string) => Promise<PolicyAction>;
15
19
  }
16
20
  export declare function registerLspTools(server: McpServer, deps?: LspToolDeps): void;
@@ -8,7 +8,7 @@
8
8
  * deps are injected so unit tests never spawn a real language server.
9
9
  */
10
10
  import { z } from "zod";
11
- import { LSP_TOOL_OPERATIONS } from "../lsp/types.js";
11
+ import { LSP_TOOL_OPERATIONS, } from "../lsp/types.js";
12
12
  function ok(data) {
13
13
  return { content: [{ type: "text", text: JSON.stringify(data) }] };
14
14
  }
@@ -18,6 +18,17 @@ function fail(error, message) {
18
18
  isError: true,
19
19
  };
20
20
  }
21
+ /** Map a thrown error to the LspError tagged-union shape. */
22
+ function mapLspError(e) {
23
+ if (e && typeof e === "object" && "kind" in e && "message" in e) {
24
+ const lspErr = e;
25
+ return { error: lspErr.kind, message: lspErr.message };
26
+ }
27
+ return {
28
+ error: "lsp_error",
29
+ message: e instanceof Error ? e.message : String(e),
30
+ };
31
+ }
21
32
  async function defaultQuery(cwd, input) {
22
33
  const { queryLsp } = await import("../lsp/runtime.js");
23
34
  return queryLsp(cwd, input);
@@ -26,9 +37,29 @@ async function defaultEnabled(cwd) {
26
37
  const { isLspToolEnabled } = await import("../lsp/runtime.js");
27
38
  return isLspToolEnabled(cwd);
28
39
  }
40
+ async function defaultWaitForDiagnostics(cwd, filePath, timeout = 1500) {
41
+ const { getOrCreateManager } = await import("../lsp/runtime.js");
42
+ return getOrCreateManager(cwd).waitForDiagnostics(filePath, timeout);
43
+ }
44
+ async function defaultImpactOfChange(cwd, filePath, query) {
45
+ const { getOrCreateManager } = await import("../lsp/runtime.js");
46
+ return getOrCreateManager(cwd).impactOfChange(filePath, query);
47
+ }
48
+ async function defaultMutationPreview(cwd, filePath, change) {
49
+ const { getOrCreateManager } = await import("../lsp/runtime.js");
50
+ return getOrCreateManager(cwd).lspMutationPreview(filePath, change);
51
+ }
52
+ async function defaultBeforeGrep(cwd, filePath, query) {
53
+ const { getOrCreateManager } = await import("../lsp/runtime.js");
54
+ return getOrCreateManager(cwd).lspBeforeGrep(filePath, query);
55
+ }
29
56
  export function registerLspTools(server, deps = {}) {
30
57
  const query = deps.query ?? defaultQuery;
31
58
  const enabled = deps.enabled ?? defaultEnabled;
59
+ const waitForDiagnostics = deps.waitForDiagnostics ?? defaultWaitForDiagnostics;
60
+ const impactOfChange = deps.impactOfChange ?? defaultImpactOfChange;
61
+ const mutationPreview = deps.lspMutationPreview ?? defaultMutationPreview;
62
+ const lspBeforeGrep = deps.lspBeforeGrep ?? defaultBeforeGrep;
32
63
  server.registerTool("lsp_query", {
33
64
  description: "Semantic code intelligence via language servers. operation is one of: goToDefinition, findReferences, hover, documentSymbol, workspaceSymbol, goToImplementation, prepareCallHierarchy, incomingCalls, outgoingCalls. " +
34
65
  "filePath: absolute, or relative to the workspace root (cwd). line/character: 1-based (line 1 = first line, like an editor or file:line reference) — required for position-based ops; omit for documentSymbol; use query (not position) for workspaceSymbol. " +
@@ -48,7 +79,8 @@ export function registerLspTools(server, deps = {}) {
48
79
  isEnabled = await enabled(cwd);
49
80
  }
50
81
  catch (e) {
51
- return fail("lsp_error", e instanceof Error ? e.message : String(e));
82
+ const m = mapLspError(e);
83
+ return fail(m.error, m.message);
52
84
  }
53
85
  if (!isEnabled) {
54
86
  return fail("lsp_disabled", "LSP tool is disabled in settings (lsp.enabled / lsp.tool)");
@@ -57,9 +89,68 @@ export function registerLspTools(server, deps = {}) {
57
89
  const resp = await query(cwd, args);
58
90
  return ok(resp);
59
91
  }
92
+ catch (e) {
93
+ const m = mapLspError(e);
94
+ return fail(m.error, m.message);
95
+ }
96
+ });
97
+ server.registerTool("lsp_waitForDiagnostics", {
98
+ description: "Wait for LSP diagnostics for a file. Returns { diagnostics, lspStatus, clean, metadata }. " +
99
+ "lspStatus: 'ok'|'partial'|'unavailable'. clean: true when zero error-level diagnostics. " +
100
+ "timeout defaults to 1500ms, max 5000ms. The lsp-before-grep policy allows grep fallback when lspStatus !== 'ok'.",
101
+ inputSchema: {
102
+ operation: z.literal("waitForDiagnostics"),
103
+ filePath: z.string().min(1).max(1000),
104
+ timeout: z.number().int().min(0).optional(),
105
+ },
106
+ }, async (args) => {
107
+ const cwd = process.cwd();
108
+ let isEnabled;
109
+ try {
110
+ isEnabled = await enabled(cwd);
111
+ }
112
+ catch (e) {
113
+ return fail("lsp_error", e instanceof Error ? e.message : String(e));
114
+ }
115
+ if (!isEnabled) {
116
+ return fail("lsp_disabled", "LSP tool is disabled in settings (lsp.enabled / lsp.tool)");
117
+ }
118
+ return ok(await waitForDiagnostics(cwd, args.filePath, args.timeout));
119
+ });
120
+ server.registerTool("lsp_impactOfChange", {
121
+ description: "Composite LSP analysis: returns { references, diagnostics, referencesComplete, safeToRename, clean, " +
122
+ "suggestedGuard, degraded, lspStatus, metadata }. Fans in diagnostics + references + rename safety over the " +
123
+ "frozen union (symbol file + reference files). Grep fallback allowed when lspStatus !== 'ok'.",
124
+ inputSchema: {
125
+ operation: z.literal("impactOfChange"),
126
+ filePath: z.string().min(1).max(1000),
127
+ query: z.string().max(1000).optional(),
128
+ },
129
+ }, async (args) => {
130
+ const cwd = process.cwd();
131
+ let isEnabled;
132
+ try {
133
+ isEnabled = await enabled(cwd);
134
+ }
60
135
  catch (e) {
61
136
  return fail("lsp_error", e instanceof Error ? e.message : String(e));
62
137
  }
138
+ if (!isEnabled) {
139
+ return fail("lsp_disabled", "LSP tool is disabled in settings (lsp.enabled / lsp.tool)");
140
+ }
141
+ return ok(await impactOfChange(cwd, args.filePath, args.query));
142
+ });
143
+ server.registerTool("lsp_mutationPreview", {
144
+ description: "Preview an LSP code mutation (stub). Returns { preview: [] }. " +
145
+ "No side-effects in slice 1. Registered in MUTATION_TOOLS set for routing through the mutation gate.",
146
+ inputSchema: {
147
+ operation: z.literal("mutationPreview"),
148
+ filePath: z.string().min(1).max(1000),
149
+ change: z.string().min(1).max(10000),
150
+ },
151
+ }, async (args) => {
152
+ const cwd = process.cwd();
153
+ return ok(await mutationPreview(cwd, args.filePath, args.change));
63
154
  });
64
155
  }
65
156
  //# sourceMappingURL=lsp-tools.js.map
@@ -1,11 +1,9 @@
1
1
  /**
2
2
  * src/mcp/mcp-keychain.ts
3
3
  *
4
- * Per-MCP keychain loader with env-var fallback.
5
- * Parallel module to src/providers/keychain.ts but keyed by McpKeyId
6
- * (MCP servers like Tavily) instead of ProviderId (LLM providers).
7
- *
8
- * Priority: OS keychain (keytar) > environment variable > null.
4
+ * Per-MCP key store, keyed by McpKeyId (MCP servers like Tavily). Backed by the
5
+ * env-store (`.env` file + process.env + Windows registry mirror) — the OS
6
+ * keychain (keytar) has been removed. Reads come straight from process.env.
9
7
  */
10
8
  export type McpKeyId = "tavily";
11
9
  export declare function setMcpKey(id: McpKeyId, key: string): Promise<boolean>;
@@ -1,63 +1,24 @@
1
1
  /**
2
2
  * src/mcp/mcp-keychain.ts
3
3
  *
4
- * Per-MCP keychain loader with env-var fallback.
5
- * Parallel module to src/providers/keychain.ts but keyed by McpKeyId
6
- * (MCP servers like Tavily) instead of ProviderId (LLM providers).
7
- *
8
- * Priority: OS keychain (keytar) > environment variable > null.
4
+ * Per-MCP key store, keyed by McpKeyId (MCP servers like Tavily). Backed by the
5
+ * env-store (`.env` file + process.env + Windows registry mirror) — the OS
6
+ * keychain (keytar) has been removed. Reads come straight from process.env.
9
7
  */
8
+ import { clearEnvVar, persistEnvVar } from "../providers/env-store.js";
10
9
  import { redactor } from "../utils/redactor.js";
11
- const KEYCHAIN_SERVICE = "muonroi-cli";
12
- const ACCOUNT_BY_MCP = {
13
- tavily: "mcp-tavily",
14
- };
15
10
  const ENV_BY_MCP = {
16
11
  tavily: "TAVILY_API_KEY",
17
12
  };
18
13
  const MIN_KEY_LEN = 16;
19
- async function loadKeytar() {
20
- try {
21
- return (await import("keytar"));
22
- }
23
- catch {
24
- return null;
25
- }
26
- }
27
14
  export async function setMcpKey(id, key) {
28
15
  if (!key || key.length < MIN_KEY_LEN) {
29
16
  throw new Error(`Key for MCP '${id}' is too short (< ${MIN_KEY_LEN} chars).`);
30
17
  }
31
- const kt = await loadKeytar();
32
- if (!kt?.setPassword)
33
- return false;
34
- redactor.enrollSecret(key);
35
- try {
36
- await kt.setPassword(KEYCHAIN_SERVICE, ACCOUNT_BY_MCP[id], key);
37
- return true;
38
- }
39
- catch (err) {
40
- // Runtime backend failure (e.g. Linux without libsecret or no active secret service).
41
- if (process.env.DEBUG || process.env.MUONROI_DEBUG_KEYCHAIN) {
42
- console.error(`[mcp-keychain] setPassword backend error for ${id}:`, err?.message || err);
43
- }
44
- return false;
45
- }
18
+ persistEnvVar(ENV_BY_MCP[id], key);
19
+ return true;
46
20
  }
47
21
  export async function getMcpKey(id) {
48
- const kt = await loadKeytar();
49
- if (kt) {
50
- try {
51
- const k = await kt.getPassword(KEYCHAIN_SERVICE, ACCOUNT_BY_MCP[id]);
52
- if (k && k.length >= MIN_KEY_LEN) {
53
- redactor.enrollSecret(k);
54
- return k;
55
- }
56
- }
57
- catch {
58
- /* keytar backend failure → fall through to env */
59
- }
60
- }
61
22
  const envKey = process.env[ENV_BY_MCP[id]];
62
23
  if (envKey && envKey.length >= MIN_KEY_LEN) {
63
24
  redactor.enrollSecret(envKey);
@@ -66,9 +27,8 @@ export async function getMcpKey(id) {
66
27
  return null;
67
28
  }
68
29
  export async function deleteMcpKey(id) {
69
- const kt = await loadKeytar();
70
- if (!kt?.deletePassword)
71
- return false;
72
- return kt.deletePassword(KEYCHAIN_SERVICE, ACCOUNT_BY_MCP[id]);
30
+ const had = !!process.env[ENV_BY_MCP[id]];
31
+ clearEnvVar(ENV_BY_MCP[id]);
32
+ return had;
73
33
  }
74
34
  //# sourceMappingURL=mcp-keychain.js.map
@@ -53,10 +53,10 @@ async function promptForKeyWithRetry(io) {
53
53
  return null;
54
54
  }
55
55
  export async function runResearchOnboarding(io) {
56
- io.log("\nWeb research is available via MCP servers:\n");
57
- io.log(" - context7 - version-pinned library docs (free, no key)\n");
58
- io.log(" - fetch - URL to markdown extraction (free, no key)\n");
59
- io.log(" - tavily - LLM-tuned web search (free tier 1k/mo, needs API key)\n");
56
+ io.log("\nWeb research tools (native builtins):\n");
57
+ io.log(" - fetch_url fetch any public URL and return clean markdown/text (always available)\n");
58
+ io.log(" - web_search — Tavily-powered web search (free tier, needs API key)\n");
59
+ io.log(" - context7 / muonroi-docs still available via MCP (library + ecosystem docs)\n");
60
60
  io.log("\nTip: if you keep keys in Bitwarden, run `muonroi-cli mcp import-bw tavily` instead.\n\n");
61
61
  const yn = (await io.askYesNo("Enable Tavily web search now? [Y/n]: ")).trim().toLowerCase();
62
62
  let tavilyEnabled = false;
@@ -85,9 +85,10 @@ export async function runResearchMigrationPrompt(io) {
85
85
  if (settings.webResearchPrompted === true) {
86
86
  return { shown: false, tavilyEnabled: false };
87
87
  }
88
- io.log("\nNew: web research is available.\n");
89
- io.log(" - context7 (library docs) and fetch (URL extraction) - already enabled.\n");
90
- io.log(" - Tavily web search needs a free API key (tavily.com).\n\n");
88
+ io.log("\nNew: web research tools are available natively.\n");
89
+ io.log(" - fetch_url (URL markdown) is always available.\n");
90
+ io.log(" - web_search (Tavily) needs a free API key (tavily.com).\n");
91
+ io.log(" - context7 + muonroi-docs remain as optional MCP for specialized docs.\n\n");
91
92
  const choice = (await io.askChoice("Set up Tavily now? [Y/n/never]: ")).trim().toLowerCase();
92
93
  let tavilyEnabled = false;
93
94
  if (choice === "y" || choice === "yes" || choice === "") {
@@ -65,11 +65,34 @@ function stripMcpInputSchema(tool) {
65
65
  inputSchema: jsonSchema(LAZY_MCP_INPUT_SCHEMA),
66
66
  };
67
67
  }
68
+ function getMcpStdioRunner() {
69
+ // Prefer Bun's runner because:
70
+ // - The CLI is launched via `bun run`
71
+ // - npx .cmd shims have been observed to cause immediate "Connection closed"
72
+ // (MCPClientError) for StdioClientTransport on Windows + Bun (see probe results).
73
+ // - bun x resolves + spawns package bins with clean stdio pipes.
74
+ return { command: "bun", prefixArgs: ["x", "-y"] };
75
+ }
76
+ /**
77
+ * Upgrade legacy "npx" (or npm exec) invocations recorded in user settings
78
+ * to the bun-based runner. This heals persisted configs from before the fix
79
+ * without requiring the user to re-run setup.
80
+ */
81
+ function normalizeStdioCommand(command, args) {
82
+ const a = args ?? [];
83
+ if (command === "npx" || (command === "npm" && a[0] === "exec")) {
84
+ const r = getMcpStdioRunner();
85
+ const pkgArgs = a.filter((x) => x !== "-y");
86
+ return { command: r.command, args: [...r.prefixArgs, ...pkgArgs] };
87
+ }
88
+ return { command, args: a };
89
+ }
68
90
  function toTransport(server, authProvider) {
69
91
  if (server.transport === "stdio") {
92
+ const { command, args } = normalizeStdioCommand(server.command ?? "", server.args);
70
93
  return new StdioClientTransport({
71
- command: server.command ?? "",
72
- args: server.args,
94
+ command,
95
+ args,
73
96
  env: server.env ? { ...getDefaultEnvironment(), ...server.env } : undefined,
74
97
  cwd: server.cwd,
75
98
  stderr: "pipe",
@@ -111,6 +134,15 @@ export async function connectOneServer(rawServer, opts) {
111
134
  // Hydrate env vars from the OS keychain before spawning — e.g. inject
112
135
  // TAVILY_API_KEY for the tavily MCP if stored via the research-onboarding wizard.
113
136
  const server = await hydrateServerEnv(rawServer);
137
+ // Fast-fail for servers that require keys but have none. Prevents "Connection closed"
138
+ // with zero actionable info. The server binary may start and list tools, but first
139
+ // use would fail — better to give clear guidance at warmup time.
140
+ if (server.id === "tavily") {
141
+ const key = server.env?.TAVILY_API_KEY;
142
+ if (!key || key.length < 16) {
143
+ throw new Error("Tavily is enabled but TAVILY_API_KEY is missing. Run `muonroi-cli mcp setup-research` or `muonroi-cli mcp key tavily`, or disable the server in /mcp config.");
144
+ }
145
+ }
114
146
  let authProvider;
115
147
  let cleanup;
116
148
  if (server.transport !== "stdio" && opts?.onOAuthRequired) {
@@ -6,4 +6,4 @@
6
6
  * and the muonroi-tools MCP server (src/mcp/tools-server.ts, for external agents).
7
7
  * Keeping it here avoids duplicating ~70 lines across the two.
8
8
  */
9
- export declare const SETUP_GUIDE_TEXT = "# muonroi-cli Setup Guide\n\n## Install (Recommended \u2014 NPM/Bun global install)\nNPM (requires Node >= 20):\n npm install -g muonroi-cli\n\nBun (requires Bun >= 1.3):\n bun add -g muonroi-cli\n\n## Install (Alternative \u2014 Prebuilt standalone binary, requires repo access)\nLinux / macOS:\n curl -fsSL https://raw.githubusercontent.com/muonroi/muonroi-cli/master/install.sh | bash\n\nWindows PowerShell:\n irm https://raw.githubusercontent.com/muonroi/muonroi-cli/master/install.ps1 | iex\n\nThe installers fetch a pre-compiled single binary from GitHub Releases.\n\n## First run\n- Wizard appears automatically.\n- Lists supported providers (DeepSeek + SiliconFlow ready; others via BYOK).\n- Four credential options: paste key, Bitwarden sync (B in /providers), keys export/import (encrypted bundle), or skip for later.\n- Keys land in OS keychain (keytar). Settings written to ~/.muonroi-cli/user-settings.json.\n- Role routing (leader/implement/verify/research) is configured for you.\n\nAfter setup: run `muonroi-cli doctor` to validate.\n\n## Essential commands\n- Interactive TUI: `muonroi-cli` (or `node dist/index.js` after build)\n- Headless one-shot: `muonroi-cli --prompt \"your task\" --max-tool-rounds 8`\n- Health + MCP nudge: `muonroi-cli doctor`\n- Update: `muonroi-cli update` (or set \"autoUpdate\": true in user-settings)\n- Keys move between machines: `muonroi-cli keys export file.json` then import on target\n- Native tools MCP (for external agents): `muonroi-cli tools-mcp` (stdio)\n- Harness driver MCP: `muonroi-cli mcp-driver`\n\n## MCP integration (for Claude Desktop, Cursor, other agents)\nAdd to your MCP client config:\n\n{\n \"mcpServers\": {\n \"muonroi-tools\": {\n \"command\": \"bun\",\n \"args\": [\"run\", \"/absolute/path/to/muonroi-cli/src/index.ts\", \"tools-mcp\"]\n }\n }\n}\n\n(Use absolute path. After `bun run build`: \"node\", \"dist/index.js\", \"tools-mcp\")\n\nThe CLI's OWN inner agent exposes these as NATIVE in-process tools (no MCP self-spawn):\n- setup_guide (this document)\n- ee_query / ee_health / ee_feedback \u2014 Experience Engine semantic recall + compaction checkpoints + feedback for learning\n- usage_forensics <id-prefix> \u2014 per-session cost/token forensics (peak input, cache hits, anomalies)\n- lsp_query \u2014 goToDefinition, findReferences, hover, symbols, call hierarchy etc.\n- selfverify_* \u2014 Tier-1 heuristic + Tier-2 agentic self-QA harness runs (start/poll/result/cancel/list)\n\nFor BB/.NET template recipes and package docs, also connect an external \"muonroi-docs\" MCP server if available (provides docs_search + setup_guide for the templates).\n\n## Development\ngit clone https://github.com/muonroi/muonroi-cli.git\ncd muonroi-cli && bun install\n\nbun run dev # run from source (TUI)\nbun run typecheck # tsc --noEmit\nbun run test # vitest (unit + headless)\nbunx vitest -c vitest.harness.config.ts run tests/harness/ # TUI E2E (named-pipes on Win, fd3/4 on POSIX)\nbun run build # or build:binary for standalone exe\n\nSee AGENTS.md (quick ref + rules), CLAUDE.md (harness verification), README.md.\n\n## Verify\nmuonroi-cli doctor\n# Checks runtimes, catalog load, keychain, MCP servers enabled, council research MCP nudge, EE reachability, recent error rate.\n# Any \"warn\" entries tell you exactly what to enable (e.g. tavily for web research in council).\n\nFor BB-aware scaffolding (/ideal on a muonroi-building-block target): ensure dotnet SDK + the three Muonroi.*.Template packages are installed via NuGet; doctor surfaces missing feed/template cases.\n";
9
+ export declare const SETUP_GUIDE_TEXT = "# muonroi-cli Setup Guide\n\n## Install (Recommended \u2014 NPM/Bun global install)\nNPM (requires Node >= 20):\n npm install -g muonroi-cli\n\nBun (requires Bun >= 1.3):\n bun add -g muonroi-cli\n\n## Install (Alternative \u2014 Prebuilt standalone binary, requires repo access)\nLinux / macOS:\n curl -fsSL https://raw.githubusercontent.com/muonroi/muonroi-cli/master/install.sh | bash\n\nWindows PowerShell:\n irm https://raw.githubusercontent.com/muonroi/muonroi-cli/master/install.ps1 | iex\n\nThe installers fetch a pre-compiled single binary from GitHub Releases.\n\n## First run\n- Wizard appears automatically.\n- Lists supported providers (DeepSeek + SiliconFlow ready; others via BYOK).\n- Four credential options: paste key, Bitwarden sync (bw in /providers), keys export/import (encrypted bundle), or skip for later.\n- Keys land in OS keychain (keytar). Settings written to ~/.muonroi-cli/user-settings.json.\n- Role routing (leader/implement/verify/research) is configured for you.\n\nAfter setup: run `muonroi-cli doctor` to validate.\n\n## Essential commands\n- Interactive TUI: `muonroi-cli` (or `node dist/index.js` after build)\n- Headless one-shot: `muonroi-cli --prompt \"your task\" --max-tool-rounds 8`\n- Health + MCP nudge: `muonroi-cli doctor`\n- Update: `muonroi-cli update` (or set \"autoUpdate\": true in user-settings)\n- Keys move between machines: `muonroi-cli keys export file.json` then import on target\n- Native tools MCP (for external agents): `muonroi-cli tools-mcp` (stdio)\n- Harness driver MCP: `muonroi-cli mcp-driver`\n\n## MCP integration (for Claude Desktop, Cursor, other agents)\nAdd to your MCP client config:\n\n{\n \"mcpServers\": {\n \"muonroi-tools\": {\n \"command\": \"bun\",\n \"args\": [\"run\", \"/absolute/path/to/muonroi-cli/src/index.ts\", \"tools-mcp\"]\n }\n }\n}\n\n(Use absolute path. After `bun run build`: \"node\", \"dist/index.js\", \"tools-mcp\")\n\nThe CLI's OWN inner agent exposes these as NATIVE in-process tools (no MCP self-spawn):\n- setup_guide (this document)\n- ee_query / ee_health / ee_feedback / ee_write \u2014 Experience Engine semantic recall + compaction checkpoints + feedback for learning\n- usage_forensics <id-prefix> \u2014 per-session cost/token forensics (peak input, cache hits, anomalies)\n- lsp_query \u2014 goToDefinition, findReferences, hover, symbols, call hierarchy etc.\n- selfverify_* \u2014 Tier-1 heuristic + Tier-2 agentic self-QA harness runs (start/poll/result/cancel/list)\n\n## Experience Engine over MCP (other agents)\n\nThe ee_* tools above are native to this CLI's agent. To give ANOTHER agent\n(Claude Code, Codex, Gemini CLI\u2026) the same brain, install the engine and register\nits own MCP server \u2014 no muonroi-cli needed:\n\n npm i -g @muonroi/experience-engine\n claude mcp add experience-engine -- exp-mcp\n\nOr in any mcpServers config:\n\n{\n \"mcpServers\": {\n \"experience-engine\": { \"command\": \"exp-mcp\" }\n }\n}\n\nThe \"muonroi-tools\" server above deliberately does NOT serve ee_* \u2014 same brain,\none implementation, reachable without installing a CLI you have no use for.\n\nFor BB/.NET template recipes and package docs, also connect an external \"muonroi-docs\" MCP server if available (provides docs_search + setup_guide for the templates).\n\n## Development\ngit clone https://github.com/muonroi/muonroi-cli.git\ncd muonroi-cli && bun install\n\nbun run dev # run from source (TUI)\nbun run typecheck # tsc --noEmit\nbun run test # vitest (unit + headless)\nbunx vitest -c vitest.harness.config.ts run tests/harness/ # TUI E2E (named-pipes on Win, fd3/4 on POSIX)\nbun run build # or build:binary for standalone exe\n\nSee AGENTS.md (quick ref + rules), CLAUDE.md (harness verification), README.md.\n\n## Verify\nmuonroi-cli doctor\n# Checks runtimes, catalog load, keychain, MCP servers enabled, council research MCP nudge, EE reachability, recent error rate.\n# Any \"warn\" entries tell you exactly what to enable (e.g. tavily for web research in council).\n\nFor BB-aware scaffolding (/ideal on a muonroi-building-block target): ensure dotnet SDK + the three Muonroi.*.Template packages are installed via NuGet; doctor surfaces missing feed/template cases.\n";
@@ -27,7 +27,7 @@ The installers fetch a pre-compiled single binary from GitHub Releases.
27
27
  ## First run
28
28
  - Wizard appears automatically.
29
29
  - Lists supported providers (DeepSeek + SiliconFlow ready; others via BYOK).
30
- - Four credential options: paste key, Bitwarden sync (B in /providers), keys export/import (encrypted bundle), or skip for later.
30
+ - Four credential options: paste key, Bitwarden sync (bw in /providers), keys export/import (encrypted bundle), or skip for later.
31
31
  - Keys land in OS keychain (keytar). Settings written to ~/.muonroi-cli/user-settings.json.
32
32
  - Role routing (leader/implement/verify/research) is configured for you.
33
33
 
@@ -58,11 +58,31 @@ Add to your MCP client config:
58
58
 
59
59
  The CLI's OWN inner agent exposes these as NATIVE in-process tools (no MCP self-spawn):
60
60
  - setup_guide (this document)
61
- - ee_query / ee_health / ee_feedback — Experience Engine semantic recall + compaction checkpoints + feedback for learning
61
+ - ee_query / ee_health / ee_feedback / ee_write — Experience Engine semantic recall + compaction checkpoints + feedback for learning
62
62
  - usage_forensics <id-prefix> — per-session cost/token forensics (peak input, cache hits, anomalies)
63
63
  - lsp_query — goToDefinition, findReferences, hover, symbols, call hierarchy etc.
64
64
  - selfverify_* — Tier-1 heuristic + Tier-2 agentic self-QA harness runs (start/poll/result/cancel/list)
65
65
 
66
+ ## Experience Engine over MCP (other agents)
67
+
68
+ The ee_* tools above are native to this CLI's agent. To give ANOTHER agent
69
+ (Claude Code, Codex, Gemini CLI…) the same brain, install the engine and register
70
+ its own MCP server — no muonroi-cli needed:
71
+
72
+ npm i -g @muonroi/experience-engine
73
+ claude mcp add experience-engine -- exp-mcp
74
+
75
+ Or in any mcpServers config:
76
+
77
+ {
78
+ "mcpServers": {
79
+ "experience-engine": { "command": "exp-mcp" }
80
+ }
81
+ }
82
+
83
+ The "muonroi-tools" server above deliberately does NOT serve ee_* — same brain,
84
+ one implementation, reachable without installing a CLI you have no use for.
85
+
66
86
  For BB/.NET template recipes and package docs, also connect an external "muonroi-docs" MCP server if available (provides docs_search + setup_guide for the templates).
67
87
 
68
88
  ## Development
@@ -12,6 +12,16 @@
12
12
  * (src/tools/native-tools.ts) — it no longer self-spawns this server. The two
13
13
  * surfaces share their cores (self-verify-runner.ts, setup-guide-text.ts, the
14
14
  * ee/forensics/lsp modules) so behaviour is identical.
15
+ *
16
+ * The ee_* tools are deliberately NOT here. The brain is the product and
17
+ * muonroi-cli is one consumer of it, so serving the brain to foreign agents is
18
+ * experience-engine's job, not ours: `npm i -g @muonroi/experience-engine` then
19
+ * `claude mcp add experience-engine -- exp-mcp`. Shipping them from here forced
20
+ * anyone who wanted the brain over MCP to install a whole CLI they had no use
21
+ * for, and left two implementations of the same four tools to drift apart. The
22
+ * CLI's own agent is unaffected — it calls the brain natively via
23
+ * src/ee/search.ts (no MCP hop), which is where ee_query/ee_write/ee_feedback
24
+ * live for us.
15
25
  */
16
26
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
17
27
  import { JobManager, type Runner } from "./self-verify-jobs.js";
@@ -12,11 +12,20 @@
12
12
  * (src/tools/native-tools.ts) — it no longer self-spawns this server. The two
13
13
  * surfaces share their cores (self-verify-runner.ts, setup-guide-text.ts, the
14
14
  * ee/forensics/lsp modules) so behaviour is identical.
15
+ *
16
+ * The ee_* tools are deliberately NOT here. The brain is the product and
17
+ * muonroi-cli is one consumer of it, so serving the brain to foreign agents is
18
+ * experience-engine's job, not ours: `npm i -g @muonroi/experience-engine` then
19
+ * `claude mcp add experience-engine -- exp-mcp`. Shipping them from here forced
20
+ * anyone who wanted the brain over MCP to install a whole CLI they had no use
21
+ * for, and left two implementations of the same four tools to drift apart. The
22
+ * CLI's own agent is unaffected — it calls the brain natively via
23
+ * src/ee/search.ts (no MCP hop), which is where ee_query/ee_write/ee_feedback
24
+ * live for us.
15
25
  */
16
26
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
17
27
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
18
28
  import { z } from "zod";
19
- import { registerEETools } from "./ee-tools.js";
20
29
  import { registerForensicsTools } from "./forensics-tools.js";
21
30
  import { registerLspTools } from "./lsp-tools.js";
22
31
  import { JobManager } from "./self-verify-jobs.js";
@@ -129,7 +138,6 @@ export function createToolsServer(runner = defaultRunner) {
129
138
  const server = new McpServer({ name: "muonroi-tools", version: "0.1.0" });
130
139
  const jm = new JobManager(runner);
131
140
  registerSelfVerifyTools(server, jm);
132
- registerEETools(server);
133
141
  registerForensicsTools(server);
134
142
  registerLspTools(server);
135
143
  registerSetupGuideTool(server);