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.
- package/LICENSE +17 -5
- package/dist/packages/agent-harness-core/src/driver.d.ts +27 -1
- package/dist/packages/agent-harness-core/src/driver.js +46 -0
- package/dist/packages/agent-harness-core/src/event-filter.js +11 -0
- package/dist/packages/agent-harness-core/src/event-redact.js +7 -0
- package/dist/packages/agent-harness-core/src/event-tee.d.ts +64 -0
- package/dist/packages/agent-harness-core/src/event-tee.js +104 -0
- package/dist/packages/agent-harness-core/src/mcp-server.d.ts +25 -0
- package/dist/packages/agent-harness-core/src/mcp-server.js +169 -21
- package/dist/packages/agent-harness-core/src/predicate.d.ts +1 -1
- package/dist/packages/agent-harness-core/src/protocol.d.ts +90 -4
- package/dist/packages/agent-harness-core/src/protocol.js +15 -0
- package/dist/packages/agent-harness-core/src/visual-quality.d.ts +58 -0
- package/dist/packages/agent-harness-core/src/visual-quality.js +141 -0
- package/dist/packages/agent-harness-opentui/src/agent-mode.d.ts +6 -0
- package/dist/packages/agent-harness-opentui/src/agent-mode.js +14 -1
- package/dist/packages/agent-harness-opentui/src/input-bridge.d.ts +2 -10
- package/dist/packages/agent-harness-opentui/src/input-bridge.js +103 -16
- package/dist/packages/agent-harness-opentui/src/install.d.ts +8 -0
- package/dist/packages/agent-harness-opentui/src/install.js +10 -0
- package/dist/packages/agent-harness-opentui/src/semantic.js +12 -10
- package/dist/packages/agent-harness-opentui/src/visual-capture.d.ts +56 -0
- package/dist/packages/agent-harness-opentui/src/visual-capture.js +103 -0
- package/dist/src/agent-harness/mock-model.d.ts +38 -0
- package/dist/src/agent-harness/mock-model.js +69 -3
- package/dist/src/agent-harness/test-spawn.js +31 -0
- package/dist/src/chat/chat-keychain.d.ts +7 -12
- package/dist/src/chat/chat-keychain.js +19 -86
- package/dist/src/cli/config/screen-providers.js +1 -1
- package/dist/src/cli/cost-forensics.d.ts +10 -0
- package/dist/src/cli/cost-forensics.js +18 -3
- package/dist/src/cli/keys-bundle.d.ts +1 -1
- package/dist/src/cli/keys-bundle.js +1 -1
- package/dist/src/cli/keys.d.ts +10 -47
- package/dist/src/cli/keys.js +31 -399
- package/dist/src/council/clarifier.d.ts +31 -3
- package/dist/src/council/clarifier.js +220 -32
- package/dist/src/council/context.js +49 -15
- package/dist/src/council/debate-checkpoint.d.ts +129 -0
- package/dist/src/council/debate-checkpoint.js +176 -0
- package/dist/src/council/debate-planner.js +54 -5
- package/dist/src/council/debate-summary.d.ts +25 -0
- package/dist/src/council/debate-summary.js +85 -0
- package/dist/src/council/debate.d.ts +169 -2
- package/dist/src/council/debate.js +1265 -135
- package/dist/src/council/index.d.ts +108 -1
- package/dist/src/council/index.js +670 -197
- package/dist/src/council/leader.d.ts +26 -0
- package/dist/src/council/leader.js +150 -9
- package/dist/src/council/llm.d.ts +94 -0
- package/dist/src/council/llm.js +348 -55
- package/dist/src/council/panel-select.d.ts +30 -0
- package/dist/src/council/panel-select.js +82 -0
- package/dist/src/council/planner.js +40 -0
- package/dist/src/council/preflight.d.ts +17 -0
- package/dist/src/council/preflight.js +50 -2
- package/dist/src/council/prompts.d.ts +39 -4
- package/dist/src/council/prompts.js +256 -69
- package/dist/src/council/stance-recall.d.ts +42 -0
- package/dist/src/council/stance-recall.js +57 -0
- package/dist/src/council/strip-think.d.ts +17 -0
- package/dist/src/council/strip-think.js +33 -0
- package/dist/src/council/types.d.ts +138 -0
- package/dist/src/ee/artifact-cache.d.ts +16 -0
- package/dist/src/ee/artifact-cache.js +32 -0
- package/dist/src/ee/auth.d.ts +20 -0
- package/dist/src/ee/auth.js +54 -2
- package/dist/src/ee/bridge.d.ts +10 -0
- package/dist/src/ee/bridge.js +58 -0
- package/dist/src/ee/client.js +109 -21
- package/dist/src/ee/ee-onboarding.js +6 -26
- package/dist/src/ee/export-transcripts.d.ts +1 -0
- package/dist/src/ee/export-transcripts.js +8 -10
- package/dist/src/ee/extract-session.js +29 -0
- package/dist/src/ee/extract-style.d.ts +58 -0
- package/dist/src/ee/extract-style.js +270 -0
- package/dist/src/ee/recall-ledger.d.ts +9 -0
- package/dist/src/ee/recall-ledger.js +3 -0
- package/dist/src/ee/scope.d.ts +1 -0
- package/dist/src/ee/scope.js +26 -1
- package/dist/src/ee/search.d.ts +7 -0
- package/dist/src/ee/search.js +24 -0
- package/dist/src/ee/transcript-emit.js +2 -0
- package/dist/src/ee/types.d.ts +22 -0
- package/dist/src/ee/who-am-i-brain.d.ts +35 -0
- package/dist/src/ee/who-am-i-brain.js +220 -0
- package/dist/src/ee/who-am-i.d.ts +10 -3
- package/dist/src/ee/who-am-i.js +12 -0
- package/dist/src/ee/workflow-event.d.ts +48 -0
- package/dist/src/ee/workflow-event.js +81 -0
- package/dist/src/flow/compaction/compress.d.ts +3 -3
- package/dist/src/flow/compaction/compress.js +58 -8
- package/dist/src/flow/compaction/extract.d.ts +4 -7
- package/dist/src/flow/compaction/extract.js +50 -10
- package/dist/src/flow/compaction/index.d.ts +14 -1
- package/dist/src/flow/compaction/index.js +96 -3
- package/dist/src/flow/compaction/input-guard.d.ts +24 -0
- package/dist/src/flow/compaction/input-guard.js +43 -0
- package/dist/src/flow/compaction/progress.d.ts +35 -0
- package/dist/src/flow/compaction/progress.js +35 -0
- package/dist/src/flow/fold-planning.d.ts +36 -0
- package/dist/src/flow/fold-planning.js +83 -0
- package/dist/src/flow/hierarchy.d.ts +146 -0
- package/dist/src/flow/hierarchy.js +427 -0
- package/dist/src/flow/index.d.ts +1 -0
- package/dist/src/flow/index.js +2 -0
- package/dist/src/flow/run-artifacts.d.ts +102 -0
- package/dist/src/flow/run-artifacts.js +208 -0
- package/dist/src/generated/version.d.ts +1 -1
- package/dist/src/generated/version.js +1 -1
- package/dist/src/gsd/assessment-schema.d.ts +44 -0
- package/dist/src/gsd/assessment-schema.js +134 -0
- package/dist/src/gsd/capability-registry.d.ts +45 -0
- package/dist/src/gsd/capability-registry.js +337 -0
- package/dist/src/gsd/complexity-assessor.d.ts +39 -0
- package/dist/src/gsd/complexity-assessor.js +152 -0
- package/dist/src/gsd/config-bridge.d.ts +7 -0
- package/dist/src/gsd/config-bridge.js +114 -0
- package/dist/src/gsd/config-loader.d.ts +27 -0
- package/dist/src/gsd/config-loader.js +50 -0
- package/dist/src/gsd/council-context.d.ts +44 -0
- package/dist/src/gsd/council-context.js +114 -0
- package/dist/src/gsd/ee-closure.d.ts +28 -0
- package/dist/src/gsd/ee-closure.js +49 -0
- package/dist/src/gsd/flags.d.ts +66 -0
- package/dist/src/gsd/flags.js +102 -0
- package/dist/src/gsd/gsd-dispatch.d.ts +58 -0
- package/dist/src/gsd/gsd-dispatch.js +131 -0
- package/dist/src/gsd/gsd-runtime.d.ts +22 -0
- package/dist/src/gsd/gsd-runtime.js +37 -0
- package/dist/src/gsd/host-adapter.d.ts +11 -0
- package/dist/src/gsd/host-adapter.js +29 -0
- package/dist/src/gsd/index.d.ts +24 -1
- package/dist/src/gsd/index.js +27 -0
- package/dist/src/gsd/loop-host-contract.d.ts +21 -0
- package/dist/src/gsd/loop-host-contract.js +39 -0
- package/dist/src/gsd/loop-host.d.ts +69 -0
- package/dist/src/gsd/loop-host.js +245 -0
- package/dist/src/gsd/loop-resolver.d.ts +36 -0
- package/dist/src/gsd/loop-resolver.js +79 -0
- package/dist/src/gsd/model-tier.d.ts +13 -0
- package/dist/src/gsd/model-tier.js +45 -0
- package/dist/src/gsd/mutation-gate.d.ts +16 -0
- package/dist/src/gsd/mutation-gate.js +41 -0
- package/dist/src/gsd/native-roadmap.d.ts +89 -0
- package/dist/src/gsd/native-roadmap.js +343 -0
- package/dist/src/gsd/native-state.d.ts +47 -0
- package/dist/src/gsd/native-state.js +220 -0
- package/dist/src/gsd/paths.d.ts +23 -0
- package/dist/src/gsd/paths.js +66 -0
- package/dist/src/gsd/phase-dag.d.ts +12 -0
- package/dist/src/gsd/phase-dag.js +94 -0
- package/dist/src/gsd/phase-sync.d.ts +42 -0
- package/dist/src/gsd/phase-sync.js +321 -0
- package/dist/src/gsd/pil-gate-context.d.ts +13 -0
- package/dist/src/gsd/pil-gate-context.js +64 -0
- package/dist/src/gsd/pil-gate-critic.d.ts +19 -0
- package/dist/src/gsd/pil-gate-critic.js +74 -0
- package/dist/src/gsd/plan-council-prompts.d.ts +25 -0
- package/dist/src/gsd/plan-council-prompts.js +79 -0
- package/dist/src/gsd/plan-council.d.ts +44 -0
- package/dist/src/gsd/plan-council.js +283 -0
- package/dist/src/gsd/plan-gate-vocabulary.d.ts +40 -0
- package/dist/src/gsd/plan-gate-vocabulary.js +64 -0
- package/dist/src/gsd/product-workspace.d.ts +13 -0
- package/dist/src/gsd/product-workspace.js +124 -0
- package/dist/src/gsd/ship-bridge.d.ts +25 -0
- package/dist/src/gsd/ship-bridge.js +65 -0
- package/dist/src/gsd/state-document.d.ts +40 -0
- package/dist/src/gsd/state-document.js +163 -0
- package/dist/src/gsd/verdict-schema.d.ts +39 -0
- package/dist/src/gsd/verdict-schema.js +144 -0
- package/dist/src/gsd/verify-context.d.ts +22 -0
- package/dist/src/gsd/verify-context.js +27 -0
- package/dist/src/gsd/verify-council-prompts.d.ts +19 -0
- package/dist/src/gsd/verify-council-prompts.js +85 -0
- package/dist/src/gsd/verify-council.d.ts +25 -0
- package/dist/src/gsd/verify-council.js +119 -0
- package/dist/src/gsd/verify-gate-vocabulary.d.ts +25 -0
- package/dist/src/gsd/verify-gate-vocabulary.js +46 -0
- package/dist/src/gsd/workflow-engine.d.ts +60 -0
- package/dist/src/gsd/workflow-engine.js +207 -0
- package/dist/src/gsd/workflow-tools.d.ts +13 -0
- package/dist/src/gsd/workflow-tools.js +277 -0
- package/dist/src/headless/council-answers.js +4 -0
- package/dist/src/hooks/index.js +1 -1
- package/dist/src/index.js +172 -270
- package/dist/src/lsp/builtins.js +3 -1
- package/dist/src/lsp/manager.d.ts +5 -1
- package/dist/src/lsp/manager.js +249 -3
- package/dist/src/lsp/npm-cache.d.ts +11 -1
- package/dist/src/lsp/npm-cache.js +17 -1
- package/dist/src/lsp/runtime.d.ts +6 -1
- package/dist/src/lsp/runtime.js +17 -1
- package/dist/src/lsp/types.d.ts +83 -1
- package/dist/src/lsp/types.js +10 -0
- package/dist/src/maintain/pr-builder.js +23 -13
- package/dist/src/mcp/auto-setup.js +57 -32
- package/dist/src/mcp/client-pool.js +44 -16
- package/dist/src/mcp/lsp-tools.d.ts +5 -1
- package/dist/src/mcp/lsp-tools.js +93 -2
- package/dist/src/mcp/mcp-keychain.d.ts +3 -5
- package/dist/src/mcp/mcp-keychain.js +9 -49
- package/dist/src/mcp/research-onboarding.js +8 -7
- package/dist/src/mcp/runtime.js +34 -2
- package/dist/src/mcp/setup-guide-text.d.ts +1 -1
- package/dist/src/mcp/setup-guide-text.js +22 -2
- package/dist/src/mcp/tools-server.d.ts +10 -0
- package/dist/src/mcp/tools-server.js +10 -2
- package/dist/src/models/catalog-client.d.ts +87 -0
- package/dist/src/models/catalog-client.js +105 -38
- package/dist/src/models/catalog.json +528 -265
- package/dist/src/models/registry.d.ts +22 -7
- package/dist/src/models/registry.js +73 -10
- package/dist/src/ops/doctor.js +1 -1
- package/dist/src/orchestrator/ask-user.d.ts +61 -0
- package/dist/src/orchestrator/ask-user.js +65 -0
- package/dist/src/orchestrator/auto-commit.js +1 -1
- package/dist/src/orchestrator/batch-turn-runner.js +2 -2
- package/dist/src/orchestrator/cache-prefix.d.ts +67 -0
- package/dist/src/orchestrator/cache-prefix.js +83 -0
- package/dist/src/orchestrator/compact-request.d.ts +32 -0
- package/dist/src/orchestrator/compact-request.js +41 -0
- package/dist/src/orchestrator/compaction.d.ts +12 -3
- package/dist/src/orchestrator/compaction.js +35 -15
- package/dist/src/orchestrator/council-manager.d.ts +12 -3
- package/dist/src/orchestrator/council-manager.js +74 -32
- package/dist/src/orchestrator/council-request.d.ts +49 -0
- package/dist/src/orchestrator/council-request.js +62 -0
- package/dist/src/orchestrator/cross-turn-dedup.d.ts +6 -0
- package/dist/src/orchestrator/cross-turn-dedup.js +22 -1
- package/dist/src/orchestrator/error-utils.d.ts +29 -0
- package/dist/src/orchestrator/error-utils.js +132 -24
- package/dist/src/orchestrator/grounding-check.js +39 -1
- package/dist/src/orchestrator/interactive-pause.d.ts +26 -0
- package/dist/src/orchestrator/interactive-pause.js +36 -0
- package/dist/src/orchestrator/message-processor.d.ts +4 -0
- package/dist/src/orchestrator/message-processor.js +268 -41
- package/dist/src/orchestrator/orchestrator.d.ts +64 -3
- package/dist/src/orchestrator/orchestrator.js +823 -120
- package/dist/src/orchestrator/preprocessor.js +3 -3
- package/dist/src/orchestrator/proactive-compact-detector.d.ts +26 -0
- package/dist/src/orchestrator/proactive-compact-detector.js +36 -0
- package/dist/src/orchestrator/prompts.js +17 -17
- package/dist/src/orchestrator/reactive-delegation.d.ts +39 -0
- package/dist/src/orchestrator/reactive-delegation.js +59 -0
- package/dist/src/orchestrator/retry-classifier.d.ts +2 -1
- package/dist/src/orchestrator/retry-classifier.js +46 -2
- package/dist/src/orchestrator/safety-askcard.d.ts +1 -1
- package/dist/src/orchestrator/safety-askcard.js +5 -2
- package/dist/src/orchestrator/safety-intercept.d.ts +50 -0
- package/dist/src/orchestrator/safety-intercept.js +62 -0
- package/dist/src/orchestrator/scope-reminder.js +1 -1
- package/dist/src/orchestrator/session-experience.d.ts +2 -1
- package/dist/src/orchestrator/session-experience.js +2 -1
- package/dist/src/orchestrator/should-run-gate.d.ts +5 -0
- package/dist/src/orchestrator/should-run-gate.js +18 -0
- package/dist/src/orchestrator/stall-watchdog.d.ts +31 -3
- package/dist/src/orchestrator/stall-watchdog.js +65 -10
- package/dist/src/orchestrator/stream-runner.d.ts +13 -3
- package/dist/src/orchestrator/stream-runner.js +115 -49
- package/dist/src/orchestrator/sub-agent-cap.d.ts +13 -1
- package/dist/src/orchestrator/sub-agent-cap.js +16 -1
- package/dist/src/orchestrator/sub-agent-model-tier.d.ts +13 -1
- package/dist/src/orchestrator/sub-agent-model-tier.js +16 -2
- package/dist/src/orchestrator/subagent-compactor.d.ts +53 -1
- package/dist/src/orchestrator/subagent-compactor.js +126 -15
- package/dist/src/orchestrator/tool-engine.d.ts +41 -0
- package/dist/src/orchestrator/tool-engine.js +846 -66
- package/dist/src/orchestrator/tool-limit-auto-recover.d.ts +22 -0
- package/dist/src/orchestrator/tool-limit-auto-recover.js +30 -0
- package/dist/src/orchestrator/turn-runner-deps.d.ts +19 -0
- package/dist/src/orchestrator/turn-watchdog.d.ts +44 -0
- package/dist/src/orchestrator/turn-watchdog.js +84 -0
- package/dist/src/pil/agent-operating-contract.d.ts +1 -1
- package/dist/src/pil/agent-operating-contract.js +6 -4
- package/dist/src/pil/cheap-model-playbook.d.ts +1 -1
- package/dist/src/pil/cheap-model-playbook.js +5 -1
- package/dist/src/pil/cheap-model-workbooks.d.ts +1 -1
- package/dist/src/pil/cheap-model-workbooks.js +1 -1
- package/dist/src/pil/discovery-types.d.ts +1 -0
- package/dist/src/pil/discovery.d.ts +1 -1
- package/dist/src/pil/discovery.js +18 -13
- package/dist/src/pil/layer1-intent.d.ts +18 -6
- package/dist/src/pil/layer1-intent.js +66 -757
- package/dist/src/pil/layer15-context-scan.js +15 -1
- package/dist/src/pil/layer1_5-complexity-size.d.ts +7 -0
- package/dist/src/pil/layer1_5-complexity-size.js +31 -5
- package/dist/src/pil/layer3-ee-injection.js +23 -8
- package/dist/src/pil/layer4-gsd.js +69 -16
- package/dist/src/pil/layer5-context.js +7 -3
- package/dist/src/pil/layer6-output.d.ts +23 -0
- package/dist/src/pil/layer6-output.js +5 -1
- package/dist/src/pil/llm-classify.d.ts +111 -5
- package/dist/src/pil/llm-classify.js +421 -189
- package/dist/src/pil/native-capabilities-workbook.d.ts +1 -1
- package/dist/src/pil/native-capabilities-workbook.js +8 -0
- package/dist/src/pil/pipeline.js +36 -2
- package/dist/src/pil/repo-grounding-probe.d.ts +15 -0
- package/dist/src/pil/repo-grounding-probe.js +136 -0
- package/dist/src/pil/repo-structure-hints.d.ts +7 -0
- package/dist/src/pil/repo-structure-hints.js +45 -0
- package/dist/src/pil/response-tools.js +5 -3
- package/dist/src/pil/schema.d.ts +1 -0
- package/dist/src/pil/schema.js +2 -0
- package/dist/src/pil/types.d.ts +18 -0
- package/dist/src/playbook/directives.d.ts +4 -0
- package/dist/src/playbook/directives.js +17 -5
- package/dist/src/product-loop/artifact-io.js +4 -0
- package/dist/src/product-loop/backlog-builder.d.ts +14 -1
- package/dist/src/product-loop/backlog-builder.js +30 -6
- package/dist/src/product-loop/criteria-seed.d.ts +51 -0
- package/dist/src/product-loop/criteria-seed.js +200 -0
- package/dist/src/product-loop/discovery-context-format.js +3 -1
- package/dist/src/product-loop/discovery-ecosystem.js +4 -1
- package/dist/src/product-loop/discovery-interview.d.ts +9 -0
- package/dist/src/product-loop/discovery-interview.js +60 -12
- package/dist/src/product-loop/discovery-recommender.js +2 -1
- package/dist/src/product-loop/discovery-schema.js +19 -2
- package/dist/src/product-loop/discovery-triage.d.ts +23 -0
- package/dist/src/product-loop/discovery-triage.js +109 -0
- package/dist/src/product-loop/gather.js +150 -2
- package/dist/src/product-loop/ideal-trace.d.ts +7 -0
- package/dist/src/product-loop/ideal-trace.js +64 -0
- package/dist/src/product-loop/index.d.ts +13 -1
- package/dist/src/product-loop/index.js +340 -52
- package/dist/src/product-loop/loop-driver.d.ts +7 -0
- package/dist/src/product-loop/loop-driver.js +330 -106
- package/dist/src/product-loop/phase-plan.d.ts +21 -0
- package/dist/src/product-loop/phase-plan.js +81 -6
- package/dist/src/product-loop/phase-rituals.d.ts +3 -0
- package/dist/src/product-loop/phase-rituals.js +8 -3
- package/dist/src/product-loop/phase-runner.js +39 -12
- package/dist/src/product-loop/plan-adherence-review.d.ts +26 -0
- package/dist/src/product-loop/plan-adherence-review.js +144 -0
- package/dist/src/product-loop/sprint-runner.d.ts +173 -0
- package/dist/src/product-loop/sprint-runner.js +863 -19
- package/dist/src/product-loop/types.d.ts +61 -5
- package/dist/src/providers/adapter.d.ts +1 -1
- package/dist/src/providers/adapter.js +3 -4
- package/dist/src/providers/anthropic.d.ts +9 -8
- package/dist/src/providers/anthropic.js +13 -47
- package/dist/src/providers/auth/browser-flow.d.ts +1 -1
- package/dist/src/providers/auth/browser-flow.js +1 -1
- package/dist/src/providers/auth/grok-oauth.d.ts +1 -0
- package/dist/src/providers/auth/grok-oauth.js +30 -5
- package/dist/src/providers/auth/openai-oauth.d.ts +1 -0
- package/dist/src/providers/auth/openai-oauth.js +15 -1
- package/dist/src/providers/auth/registry.js +0 -34
- package/dist/src/providers/auth/token-store.d.ts +9 -9
- package/dist/src/providers/auth/token-store.js +8 -67
- package/dist/src/providers/auth/types.d.ts +9 -1
- package/dist/src/providers/auth/types.js +1 -1
- package/dist/src/providers/capabilities.d.ts +24 -5
- package/dist/src/providers/capabilities.js +42 -24
- package/dist/src/providers/endpoints.d.ts +2 -2
- package/dist/src/providers/endpoints.js +11 -10
- package/dist/src/providers/env-store.d.ts +17 -0
- package/dist/src/providers/env-store.js +228 -0
- package/dist/src/providers/keychain.d.ts +22 -18
- package/dist/src/providers/keychain.js +127 -140
- package/dist/src/providers/mcp-vision-bridge.js +56 -146
- package/dist/src/providers/openai-compatible.js +8 -1
- package/dist/src/providers/pricing.d.ts +2 -2
- package/dist/src/providers/pricing.js +3 -13
- package/dist/src/providers/runtime.d.ts +43 -3
- package/dist/src/providers/runtime.js +88 -14
- package/dist/src/providers/strategies/base.strategy.d.ts +16 -0
- package/dist/src/providers/strategies/base.strategy.js +24 -1
- package/dist/src/providers/strategies/{siliconflow.strategy.d.ts → opencode-go.strategy.d.ts} +3 -3
- package/dist/src/providers/strategies/opencode-go.strategy.js +83 -0
- package/dist/src/providers/strategies/registry.js +4 -4
- package/dist/src/providers/strategies/thinking-mode.d.ts +109 -0
- package/dist/src/providers/strategies/thinking-mode.js +288 -1
- package/dist/src/providers/strategies/xai.strategy.js +27 -0
- package/dist/src/providers/strategies/zai.strategy.d.ts +14 -0
- package/dist/src/providers/strategies/zai.strategy.js +44 -0
- package/dist/src/providers/types.d.ts +5 -6
- package/dist/src/providers/types.js +2 -2
- package/dist/src/providers/vision-backend.d.ts +47 -0
- package/dist/src/providers/vision-backend.js +258 -0
- package/dist/src/providers/vision-proxy.d.ts +22 -9
- package/dist/src/providers/vision-proxy.js +63 -132
- package/dist/src/providers/warm.d.ts +65 -0
- package/dist/src/providers/warm.js +145 -0
- package/dist/src/providers/wire-debug.js +95 -0
- package/dist/src/router/decide.d.ts +13 -0
- package/dist/src/router/decide.js +138 -36
- package/dist/src/router/peak-hour.d.ts +38 -0
- package/dist/src/router/peak-hour.js +107 -0
- package/dist/src/router/step-router.js +3 -2
- package/dist/src/router/warm.js +4 -5
- package/dist/src/scaffold/continuation-prompt.d.ts +11 -0
- package/dist/src/scaffold/continuation-prompt.js +26 -0
- package/dist/src/scaffold/point-to-existing.d.ts +21 -0
- package/dist/src/scaffold/point-to-existing.js +25 -0
- package/dist/src/self-qa/agentic-loop.js +6 -5
- package/dist/src/{ui/state → state}/active-run.d.ts +19 -0
- package/dist/src/{ui/state → state}/active-run.js +21 -0
- package/dist/src/{ui/status-bar/store.d.ts → state/status-bar-store.d.ts} +4 -1
- package/dist/src/{ui/status-bar/store.js → state/status-bar-store.js} +12 -9
- package/dist/src/state/turn-trace.d.ts +43 -0
- package/dist/src/state/turn-trace.js +32 -0
- package/dist/src/storage/db.js +2 -1
- package/dist/src/storage/index.d.ts +1 -1
- package/dist/src/storage/index.js +1 -1
- package/dist/src/storage/interaction-log.d.ts +1 -1
- package/dist/src/storage/migrations.js +71 -1
- package/dist/src/storage/sessions.d.ts +28 -10
- package/dist/src/storage/sessions.js +78 -21
- package/dist/src/storage/transcript-view.js +1 -1
- package/dist/src/storage/transcript.d.ts +51 -0
- package/dist/src/storage/transcript.js +340 -15
- package/dist/src/tools/file.d.ts +15 -0
- package/dist/src/tools/file.js +32 -0
- package/dist/src/tools/git-safety.d.ts +19 -0
- package/dist/src/tools/git-safety.js +168 -0
- package/dist/src/tools/native-tools.d.ts +1 -1
- package/dist/src/tools/native-tools.js +81 -1
- package/dist/src/tools/registry.d.ts +20 -0
- package/dist/src/tools/registry.js +576 -23
- package/dist/src/tools/research.d.ts +29 -0
- package/dist/src/tools/research.js +233 -0
- package/dist/src/types/index.d.ts +147 -4
- package/dist/src/ui/app.js +0 -0
- package/dist/src/ui/cards/product-status-card.js +1 -1
- package/dist/src/ui/components/agent-rail-activities.d.ts +26 -0
- package/dist/src/ui/components/agent-rail-activities.js +47 -0
- package/dist/src/ui/components/bubble-body-guard.d.ts +27 -0
- package/dist/src/ui/components/bubble-body-guard.js +50 -0
- package/dist/src/ui/components/compact-progress-card.d.ts +24 -0
- package/dist/src/ui/components/compact-progress-card.js +42 -0
- package/dist/src/ui/components/context-rail.d.ts +26 -0
- package/dist/src/ui/components/context-rail.js +33 -0
- package/dist/src/ui/components/council-conclusion-card.d.ts +73 -0
- package/dist/src/ui/components/council-conclusion-card.js +420 -0
- package/dist/src/ui/components/council-debate-pill.d.ts +36 -0
- package/dist/src/ui/components/council-debate-pill.js +34 -0
- package/dist/src/ui/components/council-info-card.js +2 -2
- package/dist/src/ui/components/council-leader-bubble.d.ts +10 -3
- package/dist/src/ui/components/council-leader-bubble.js +21 -11
- package/dist/src/ui/components/council-message-bubble.d.ts +15 -2
- package/dist/src/ui/components/council-message-bubble.js +16 -15
- package/dist/src/ui/components/council-phase-timeline.d.ts +9 -1
- package/dist/src/ui/components/council-phase-timeline.js +66 -17
- package/dist/src/ui/components/council-placeholder-bubble.d.ts +16 -9
- package/dist/src/ui/components/council-placeholder-bubble.js +32 -29
- package/dist/src/ui/components/council-question-card.js +13 -12
- package/dist/src/ui/components/council-rail-rounds.d.ts +26 -0
- package/dist/src/ui/components/council-rail-rounds.js +57 -0
- package/dist/src/ui/components/council-round-group.d.ts +38 -0
- package/dist/src/ui/components/council-round-group.js +88 -0
- package/dist/src/ui/components/council-status-list.d.ts +3 -1
- package/dist/src/ui/components/council-status-list.js +36 -24
- package/dist/src/ui/components/council-synthesis-banner.d.ts +7 -2
- package/dist/src/ui/components/council-synthesis-banner.js +20 -5
- package/dist/src/ui/components/halt-recovery-card.js +9 -5
- package/dist/src/ui/components/jump-to-latest-pill.d.ts +11 -0
- package/dist/src/ui/components/jump-to-latest-pill.js +14 -0
- package/dist/src/ui/components/message-view.d.ts +15 -0
- package/dist/src/ui/components/message-view.js +50 -1
- package/dist/src/ui/components/prompt-box.js +18 -16
- package/dist/src/ui/components/session-tree-card.d.ts +14 -0
- package/dist/src/ui/components/session-tree-card.js +46 -0
- package/dist/src/ui/components/slash-inline-menu.d.ts +12 -0
- package/dist/src/ui/components/slash-inline-menu.js +26 -5
- package/dist/src/ui/components/task-list-panel.d.ts +14 -1
- package/dist/src/ui/components/task-list-panel.js +22 -2
- package/dist/src/ui/components/tool-group.d.ts +15 -3
- package/dist/src/ui/components/tool-group.js +69 -11
- package/dist/src/ui/containers/modals-layer.d.ts +4 -2
- package/dist/src/ui/containers/modals-layer.js +2 -2
- package/dist/src/ui/council-harness-event.d.ts +57 -0
- package/dist/src/ui/council-harness-event.js +46 -0
- package/dist/src/ui/heartbeat-debug.d.ts +29 -0
- package/dist/src/ui/heartbeat-debug.js +45 -0
- package/dist/src/ui/hooks/use-session-picker.d.ts +3 -3
- package/dist/src/ui/mcp-modal.js +2 -4
- package/dist/src/ui/modals/api-key-modal.js +1 -1
- package/dist/src/ui/modals/connect-modal.js +4 -3
- package/dist/src/ui/modals/model-picker-modal.d.ts +8 -18
- package/dist/src/ui/modals/model-picker-modal.js +8 -10
- package/dist/src/ui/modals/session-picker-modal.d.ts +2 -2
- package/dist/src/ui/modals/session-picker-modal.js +3 -5
- package/dist/src/ui/picker-providers.d.ts +1 -1
- package/dist/src/ui/picker-providers.js +1 -1
- package/dist/src/ui/primitives/index.d.ts +1 -0
- package/dist/src/ui/primitives/index.js +2 -0
- package/dist/src/ui/primitives/semantic-primitives.d.ts +76 -0
- package/dist/src/ui/primitives/semantic-primitives.js +81 -0
- package/dist/src/ui/slash/compact.js +5 -7
- package/dist/src/ui/slash/cost.js +1 -1
- package/dist/src/ui/slash/council.js +19 -1
- package/dist/src/ui/slash/debug.d.ts +3 -31
- package/dist/src/ui/slash/debug.js +9 -20
- package/dist/src/ui/slash/ee.js +81 -0
- package/dist/src/ui/slash/ideal.d.ts +6 -2
- package/dist/src/ui/slash/ideal.js +97 -7
- package/dist/src/ui/slash/menu-items.d.ts +7 -0
- package/dist/src/ui/slash/menu-items.js +23 -20
- package/dist/src/ui/slash/registry.d.ts +2 -0
- package/dist/src/ui/slash/registry.js +4 -0
- package/dist/src/ui/status-bar/cache-hit.d.ts +6 -0
- package/dist/src/ui/status-bar/cache-hit.js +9 -0
- package/dist/src/ui/status-bar/index.d.ts +1 -1
- package/dist/src/ui/status-bar/index.js +7 -3
- package/dist/src/ui/status-bar/usd-meter.d.ts +5 -4
- package/dist/src/ui/status-bar/usd-meter.js +6 -4
- package/dist/src/ui/theme.d.ts +1 -0
- package/dist/src/ui/theme.js +2 -0
- package/dist/src/ui/types.d.ts +7 -0
- package/dist/src/ui/use-app-logic.js +0 -0
- package/dist/src/ui/utils/agent-activities.d.ts +39 -0
- package/dist/src/ui/utils/agent-activities.js +96 -0
- package/dist/src/ui/utils/format.d.ts +14 -0
- package/dist/src/ui/utils/format.js +23 -3
- package/dist/src/ui/utils/group-tool-entries.d.ts +26 -0
- package/dist/src/ui/utils/group-tool-entries.js +111 -0
- package/dist/src/ui/utils/tool-summary.d.ts +21 -0
- package/dist/src/ui/utils/tool-summary.js +91 -0
- package/dist/src/usage/downgrade.js +2 -2
- package/dist/src/usage/product-ledger.js +2 -2
- package/dist/src/utils/event-loop-monitor.d.ts +85 -0
- package/dist/src/utils/event-loop-monitor.js +107 -0
- package/dist/src/utils/install-manager.js +2 -1
- package/dist/src/utils/llm-deadline.d.ts +14 -0
- package/dist/src/utils/llm-deadline.js +19 -0
- package/dist/src/utils/logger.js +2 -2
- package/dist/src/utils/loop-profiler.d.ts +102 -0
- package/dist/src/utils/loop-profiler.js +202 -0
- package/dist/src/utils/permission-mode.js +5 -3
- package/dist/src/utils/redactor.js +1 -1
- package/dist/src/utils/settings.d.ts +180 -5
- package/dist/src/utils/settings.js +271 -31
- package/dist/src/utils/side-question.d.ts +1 -2
- package/dist/src/utils/side-question.js +2 -2
- package/dist/src/utils/visible-retry.d.ts +11 -0
- package/dist/src/utils/visible-retry.js +10 -1
- package/dist/src/verify/entrypoint.d.ts +1 -1
- package/dist/src/verify/entrypoint.js +52 -17
- package/dist/src/verify/orchestrator.d.ts +1 -1
- package/dist/src/verify/orchestrator.js +20 -3
- package/dist/src/verify/recipes.d.ts +13 -0
- package/dist/src/verify/recipes.js +15 -0
- package/package.json +134 -132
- package/dist/src/cli/bw-vault.d.ts +0 -55
- package/dist/src/cli/bw-vault.js +0 -133
- package/dist/src/mcp/ee-tools.d.ts +0 -46
- package/dist/src/mcp/ee-tools.js +0 -193
- package/dist/src/providers/auth/gcloud.d.ts +0 -28
- package/dist/src/providers/auth/gcloud.js +0 -102
- package/dist/src/providers/auth/gemini-oauth.d.ts +0 -82
- package/dist/src/providers/auth/gemini-oauth.js +0 -472
- package/dist/src/providers/gemini.d.ts +0 -11
- package/dist/src/providers/gemini.js +0 -45
- package/dist/src/providers/siliconflow-sse-repair.d.ts +0 -58
- package/dist/src/providers/siliconflow-sse-repair.js +0 -177
- package/dist/src/providers/strategies/google.strategy.d.ts +0 -22
- package/dist/src/providers/strategies/google.strategy.js +0 -174
- package/dist/src/providers/strategies/siliconflow.strategy.js +0 -29
- package/dist/src/ui/containers/chat-feed.d.ts +0 -40
- 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:
|
|
75
|
+
label: "Fetch (URL → markdown) [MCP legacy]",
|
|
76
|
+
enabled: false,
|
|
78
77
|
transport: "stdio",
|
|
79
|
-
command: "
|
|
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: "
|
|
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
|
-
|
|
242
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
259
|
-
|
|
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
|
-
|
|
263
|
-
|
|
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
|
-
|
|
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
|
|
5
|
-
*
|
|
6
|
-
* (
|
|
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
|
|
5
|
-
*
|
|
6
|
-
* (
|
|
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
|
-
|
|
32
|
-
|
|
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
|
|
70
|
-
|
|
71
|
-
|
|
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
|
|
57
|
-
io.log(" -
|
|
58
|
-
io.log(" -
|
|
59
|
-
io.log(" -
|
|
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
|
|
89
|
-
io.log(" -
|
|
90
|
-
io.log(" - Tavily
|
|
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 === "") {
|
package/dist/src/mcp/runtime.js
CHANGED
|
@@ -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
|
|
72
|
-
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 (
|
|
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 (
|
|
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);
|