muonroi-cli 1.8.3 → 1.8.5
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 +21 -21
- package/README.md +133 -122
- 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-tee.d.ts +48 -0
- package/dist/packages/agent-harness-core/src/event-tee.js +77 -0
- package/dist/packages/agent-harness-core/src/mcp-server.d.ts +11 -0
- package/dist/packages/agent-harness-core/src/mcp-server.js +87 -15
- package/dist/packages/agent-harness-core/src/protocol.d.ts +66 -2
- 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 +28 -0
- package/dist/src/agent-harness/mock-model.js +63 -1
- package/dist/src/agent-harness/test-spawn.js +31 -0
- 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 +30 -15
- 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 +2 -2
- package/dist/src/cli/keys.js +19 -81
- package/dist/src/council/clarifier.d.ts +28 -2
- package/dist/src/council/clarifier.js +81 -15
- 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 +51 -3
- 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 +1210 -134
- package/dist/src/council/index.d.ts +85 -1
- package/dist/src/council/index.js +634 -196
- package/dist/src/council/leader.d.ts +26 -0
- package/dist/src/council/leader.js +150 -9
- package/dist/src/council/llm.d.ts +32 -0
- package/dist/src/council/llm.js +231 -38
- package/dist/src/council/panel-select.d.ts +30 -0
- package/dist/src/council/panel-select.js +72 -0
- package/dist/src/council/planner.js +23 -0
- package/dist/src/council/preflight.d.ts +7 -0
- package/dist/src/council/preflight.js +14 -2
- package/dist/src/council/prompts.d.ts +30 -3
- package/dist/src/council/prompts.js +254 -84
- 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 +128 -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 +1 -0
- package/dist/src/ee/auth.js +15 -2
- package/dist/src/ee/bridge.d.ts +10 -0
- package/dist/src/ee/bridge.js +58 -0
- package/dist/src/ee/client.js +81 -18
- 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 +45 -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 +13 -1
- package/dist/src/flow/compaction/index.js +70 -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/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 +55 -0
- package/dist/src/gsd/flags.js +83 -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 +251 -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/hooks/index.js +1 -1
- package/dist/src/index.js +44 -11
- 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 +1 -1
- package/dist/src/mcp/ee-tools.js +1 -0
- package/dist/src/mcp/oauth-callback.js +2 -2
- 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 +77 -76
- 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 +8 -8
- 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 +10 -0
- package/dist/src/orchestrator/compaction.js +27 -7
- package/dist/src/orchestrator/council-manager.d.ts +12 -3
- package/dist/src/orchestrator/council-manager.js +65 -24
- 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/message-processor.js +242 -33
- package/dist/src/orchestrator/orchestrator.d.ts +39 -3
- package/dist/src/orchestrator/orchestrator.js +651 -102
- package/dist/src/orchestrator/preprocessor.js +1 -1
- 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 +159 -159
- 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-intercept.d.ts +45 -0
- package/dist/src/orchestrator/safety-intercept.js +55 -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 +24 -3
- package/dist/src/orchestrator/stall-watchdog.js +47 -13
- package/dist/src/orchestrator/stream-runner.js +62 -29
- 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 +26 -0
- package/dist/src/orchestrator/tool-engine.js +669 -56
- 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 +37 -0
- package/dist/src/orchestrator/turn-watchdog.js +55 -0
- package/dist/src/pil/agent-operating-contract.d.ts +1 -1
- package/dist/src/pil/agent-operating-contract.js +1 -1
- 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.js +16 -11
- 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/layer2_5-ponytail.js +8 -8
- 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 +33 -2
- package/dist/src/pil/llm-classify.js +123 -131
- package/dist/src/pil/native-capabilities-workbook.d.ts +1 -1
- package/dist/src/pil/native-capabilities-workbook.js +1 -0
- package/dist/src/pil/pipeline.js +34 -2
- 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/backlog-builder.d.ts +14 -1
- package/dist/src/product-loop/backlog-builder.js +30 -6
- 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.js +32 -3
- package/dist/src/product-loop/discovery-schema.js +5 -1
- package/dist/src/product-loop/done-gate.js +3 -3
- 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 +333 -52
- package/dist/src/product-loop/loop-driver.d.ts +7 -0
- package/dist/src/product-loop/loop-driver.js +327 -116
- package/dist/src/product-loop/phase-plan.d.ts +5 -0
- package/dist/src/product-loop/phase-plan.js +39 -2
- package/dist/src/product-loop/phase-runner.js +9 -1
- package/dist/src/product-loop/progress-snapshot.js +4 -4
- package/dist/src/product-loop/sprint-runner.d.ts +111 -0
- package/dist/src/product-loop/sprint-runner.js +559 -16
- package/dist/src/product-loop/types.d.ts +36 -5
- package/dist/src/providers/adapter.d.ts +1 -1
- package/dist/src/providers/adapter.js +3 -4
- 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/openai-oauth.js +1 -1
- package/dist/src/providers/auth/registry.js +0 -34
- package/dist/src/providers/auth/token-store.js +4 -1
- package/dist/src/providers/auth/types.d.ts +1 -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/keychain.d.ts +1 -1
- package/dist/src/providers/keychain.js +7 -9
- package/dist/src/providers/mcp-vision-bridge.js +82 -172
- 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 +27 -2
- package/dist/src/providers/runtime.js +78 -15
- 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 +280 -1
- 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/wire-debug.js +95 -0
- package/dist/src/reporter/index.js +1 -1
- 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/bb-ecosystem-apply.js +47 -47
- package/dist/src/scaffold/bb-quality-gate.js +5 -5
- package/dist/src/scaffold/continuation-prompt.d.ts +11 -0
- package/dist/src/scaffold/continuation-prompt.js +86 -60
- package/dist/src/scaffold/init-new.js +453 -453
- 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 +22 -22
- 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/interaction-log.js +5 -5
- package/dist/src/storage/migrations.js +196 -126
- package/dist/src/storage/session-experience-store.js +4 -4
- package/dist/src/storage/sessions.d.ts +28 -10
- package/dist/src/storage/sessions.js +112 -55
- package/dist/src/storage/transcript-view.js +1 -1
- package/dist/src/storage/transcript.d.ts +51 -0
- package/dist/src/storage/transcript.js +383 -112
- package/dist/src/storage/usage.js +14 -14
- package/dist/src/storage/workspaces.js +12 -12
- package/dist/src/tools/file.d.ts +15 -0
- package/dist/src/tools/file.js +32 -0
- package/dist/src/tools/native-tools.js +5 -0
- package/dist/src/tools/registry.d.ts +3 -0
- package/dist/src/tools/registry.js +460 -22
- package/dist/src/tools/research.d.ts +29 -0
- package/dist/src/tools/research.js +233 -0
- package/dist/src/types/index.d.ts +118 -3
- package/dist/src/ui/app.js +0 -0
- package/dist/src/ui/cards/product-status-card.js +1 -1
- 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/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 +49 -15
- 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 +12 -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/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/containers/modals-layer.d.ts +2 -1
- 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/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-inspect.js +4 -4
- 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/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 +12 -18
- 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/format.d.ts +14 -0
- package/dist/src/ui/utils/format.js +23 -3
- package/dist/src/usage/downgrade.js +2 -2
- package/dist/src/usage/product-ledger.js +2 -2
- package/dist/src/utils/clipboard-image.js +23 -23
- package/dist/src/utils/install-manager.js +14 -11
- package/dist/src/utils/logger.js +2 -2
- package/dist/src/utils/permission-mode.js +5 -3
- package/dist/src/utils/redactor.js +1 -1
- package/dist/src/utils/settings.d.ts +153 -5
- package/dist/src/utils/settings.js +233 -29
- package/dist/src/utils/side-question.js +2 -2
- package/dist/src/utils/skills.js +3 -3
- 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 +1 -1
- package/dist/src/verify/recipes.d.ts +13 -0
- package/dist/src/verify/recipes.js +15 -0
- package/package.json +135 -132
- 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
|
@@ -17,6 +17,12 @@
|
|
|
17
17
|
* All directive text is English. The agent is responsible for translating
|
|
18
18
|
* user-facing prompts into the user's language at render time.
|
|
19
19
|
*/
|
|
20
|
+
/** When true and tier is standard/heavy, CHECK-PLAN points to gsd_plan_review tool. */
|
|
21
|
+
export function buildNativeCheckPlanHint() {
|
|
22
|
+
return (" 4. CHECK-PLAN — call gsd_plan_review (native council) BEFORE executing. " +
|
|
23
|
+
"Multi-perspective review spawns research/skeptic/architect sub-agents; leader synthesizes PLAN-VERIFY.md. " +
|
|
24
|
+
"gsd_execute is blocked until verdict: pass.");
|
|
25
|
+
}
|
|
20
26
|
const HEADER = "[playbook]";
|
|
21
27
|
/**
|
|
22
28
|
* High-precision predicate: is this turn about the Muonroi ECOSYSTEM (where the
|
|
@@ -60,12 +66,15 @@ export function buildLanguageNudge(lang) {
|
|
|
60
66
|
// senior-engineer reasoning over labeled scaffolds — feedback 12eceab7).
|
|
61
67
|
function buildHeavy(input) {
|
|
62
68
|
const phaseHint = input.phase ? ` (hint: this reads like a "${input.phase}" task)` : "";
|
|
69
|
+
const checkPlan = input.nativeGsd
|
|
70
|
+
? buildNativeCheckPlanHint()
|
|
71
|
+
: " 4. CHECK-PLAN — review your own plan BEFORE executing: does it cover the acceptance criteria, handle the edge cases, and match what the user actually asked? Revise until it does (update the todo_write list if steps change). Confirm with the user only if the plan diverges from their intent.";
|
|
63
72
|
return [
|
|
64
73
|
`${HEADER} This reads like a HEAVY task${phaseHint} — architectural, cross-cutting, multi-file, or with real unresolved design choices. Don't start editing yet; work through these phases:`,
|
|
65
74
|
" 1. DISCUSS — surface the decisions/ambiguities that actually change the design. For the ones the prompt doesn't already answer, ask up front with AskUserQuestion (put your recommended option first; write the question text in the user's language). Skip questions the prompt already settles — don't interrogate.",
|
|
66
|
-
" 2. RESEARCH — gather the codebase facts the task depends on: read/grep the relevant modules, and dispatch parallel research Agents when the areas are independent. When you delegate, give each sub-agent a NON-overlapping scope and tell it the exact return shape you need
|
|
67
|
-
" 3. PLAN — write a concrete, numbered plan: the change per file, the order, and the acceptance criteria (how you'll know it's done). Then record the plan as a todo_write checklist (one item per step) so the user sees a live progress list.",
|
|
68
|
-
|
|
75
|
+
" 2. RESEARCH — gather the codebase facts the task depends on: read/grep the relevant modules, and dispatch parallel research Agents when the areas are independent. When you delegate (via `delegate`), give each sub-agent a NON-overlapping scope and tell it the exact return shape you need. Regularly check background tasks and subagents using `delegation_list` / `delegation_read` (or `process_list` / `process_logs` for shell processes) to monitor progress, and terminate them with `delegation_kill` / `process_stop` if they are no longer needed.",
|
|
76
|
+
" 3. PLAN — write a concrete, numbered plan via gsd_plan (or PLAN.md): the change per file, the order, and the acceptance criteria (how you'll know it's done). Then record the plan as a todo_write checklist (one item per step) so the user sees a live progress list.",
|
|
77
|
+
checkPlan,
|
|
69
78
|
" 5. IMPLEMENT — execute in atomic steps; parallelize independent work. Keep the todo_write list accurate: mark each item in_progress before you start it and completed when it lands (exactly ONE item in_progress at a time). When you're in a git repo, COMMIT each completed chunk before starting the next one (small, logically-scoped commits; message ends with the mandatory attribution line) — do NOT pile the whole task into one commit at the end.",
|
|
70
79
|
" 6. VERIFY — run the relevant tests / lint / type-check and report evidence (command + result) before claiming done.",
|
|
71
80
|
"This depth is a recommendation from how the task reads. If, once you look, it's genuinely smaller than it appears, say so and drop to the STANDARD flow rather than over-processing it.",
|
|
@@ -92,10 +101,13 @@ function buildStandard(input) {
|
|
|
92
101
|
"If the limits are blown and you still have no fix, STOP and report what you tried + why you're stuck.",
|
|
93
102
|
].join("\n");
|
|
94
103
|
}
|
|
104
|
+
const checkStep = input.nativeGsd
|
|
105
|
+
? " 2. CHECK — call gsd_plan_review (lightweight council: research + skeptic perspectives) before editing files."
|
|
106
|
+
: " 2. CHECK — sanity-check that plan against the real code (read the key files you named) and against the user's intent; fix the plan if reality differs. If a genuine ambiguity blocks you, ask ONE focused question via AskUserQuestion instead of guessing.";
|
|
95
107
|
return [
|
|
96
108
|
`${HEADER} This reads like a STANDARD task${phaseHint} — work like a senior engineer, but keep it lightweight:`,
|
|
97
|
-
" 1. PLAN — state a short, concrete plan: the files/functions you'll touch and in what order. A few bullets in your reply, not an essay. If it breaks into ≥3 steps, also record them with todo_write so the user gets a live checklist.",
|
|
98
|
-
|
|
109
|
+
" 1. PLAN — state a short, concrete plan via gsd_plan: the files/functions you'll touch and in what order. A few bullets in your reply, not an essay. If it breaks into ≥3 steps, also record them with todo_write so the user gets a live checklist.",
|
|
110
|
+
checkStep,
|
|
99
111
|
" 3. IMPLEMENT — execute the plan in small steps with the appropriate tools. If you made a todo_write checklist, keep it updated as you go (exactly one item in_progress at a time). When you're in a git repo, COMMIT each cohesive chunk as it lands (small commits; message ends with the mandatory attribution line) rather than batching everything into one final commit.",
|
|
100
112
|
" 4. VERIFY — run the relevant tests / type-check / quick smoke and report evidence before claiming done.",
|
|
101
113
|
"You don't need subagents or a discussion round for this. But if it turns out to be architectural or spans many files, escalate to the HEAVY flow (discuss → research → checked plan) rather than charging ahead.",
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* — NO hardcoded model id or provider anywhere in this file.
|
|
9
9
|
*/
|
|
10
10
|
import type { ClarifiedSpec, CouncilLLM } from "../council/types.js";
|
|
11
|
-
import type { Backlog, ImplementationPlanArtifact } from "./types.js";
|
|
11
|
+
import type { Backlog, EffortPoints, ImplementationPlanArtifact } from "./types.js";
|
|
12
12
|
export interface BuildBacklogInput {
|
|
13
13
|
runId: string;
|
|
14
14
|
productSlug: string;
|
|
@@ -18,6 +18,19 @@ export interface BuildBacklogInput {
|
|
|
18
18
|
leaderModelId: string;
|
|
19
19
|
costAware: boolean;
|
|
20
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Deterministic keyword heuristic for a story-point prior (1 | 3 | 5).
|
|
23
|
+
*
|
|
24
|
+
* Used as the FALLBACK when the LLM effort estimate fails or returns unparseable
|
|
25
|
+
* JSON — cheap models (deepseek) often emit malformed arrays, and the previous
|
|
26
|
+
* flat-3 fallback made every item identical, so sprint bin-packing degenerated
|
|
27
|
+
* into a mechanical "≈2-3 items per sprint" split with no relation to real size
|
|
28
|
+
* (observed live: a "migrate 5 native modules" item and a "remove dependency"
|
|
29
|
+
* item both scored 3). A rough size signal from the title is strictly better than
|
|
30
|
+
* uniform. Verb-driven: creation/migration reads large, deletion/config reads
|
|
31
|
+
* small, everything else medium.
|
|
32
|
+
*/
|
|
33
|
+
export declare function heuristicEffort(title: string): EffortPoints;
|
|
21
34
|
/**
|
|
22
35
|
* Build a Backlog from a ClarifiedSpec + the Phase 1 implementation_plan artifact.
|
|
23
36
|
*
|
|
@@ -23,11 +23,35 @@ function hashSpec(spec) {
|
|
|
23
23
|
function keywordMatch(haystack, needle) {
|
|
24
24
|
return haystack.toLowerCase().includes(needle.toLowerCase());
|
|
25
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Deterministic keyword heuristic for a story-point prior (1 | 3 | 5).
|
|
28
|
+
*
|
|
29
|
+
* Used as the FALLBACK when the LLM effort estimate fails or returns unparseable
|
|
30
|
+
* JSON — cheap models (deepseek) often emit malformed arrays, and the previous
|
|
31
|
+
* flat-3 fallback made every item identical, so sprint bin-packing degenerated
|
|
32
|
+
* into a mechanical "≈2-3 items per sprint" split with no relation to real size
|
|
33
|
+
* (observed live: a "migrate 5 native modules" item and a "remove dependency"
|
|
34
|
+
* item both scored 3). A rough size signal from the title is strictly better than
|
|
35
|
+
* uniform. Verb-driven: creation/migration reads large, deletion/config reads
|
|
36
|
+
* small, everything else medium.
|
|
37
|
+
*/
|
|
38
|
+
export function heuristicEffort(title) {
|
|
39
|
+
const t = title.toLowerCase();
|
|
40
|
+
const large = /\b(implement|build|create|migrat\w*|rewrite|refactor|orchestrat\w*|engine|subsystem|native|integrat\w*|pipeline|architect\w*)\b/;
|
|
41
|
+
const small = /\b(remove|delete|drop|inventory|rename|config\w*|flag|doc\w*|cleanup|wire|rename|bump|stub|export)\b/;
|
|
42
|
+
if (large.test(t))
|
|
43
|
+
return 5;
|
|
44
|
+
if (small.test(t))
|
|
45
|
+
return 1;
|
|
46
|
+
return 3;
|
|
47
|
+
}
|
|
26
48
|
/**
|
|
27
49
|
* Ask the LLM to estimate effortPoints for a batch of feature titles in a
|
|
28
50
|
* single call. Parses JSON array response: [1, 3, 5, ...].
|
|
29
51
|
*
|
|
30
|
-
* Falls back to
|
|
52
|
+
* Falls back to a per-title keyword heuristic ({@link heuristicEffort}) — NOT a
|
|
53
|
+
* flat 3 — for any item the LLM fails to score, so sprint packing keeps a real
|
|
54
|
+
* size signal even when the cheap model returns garbage.
|
|
31
55
|
*
|
|
32
56
|
* Model selection: pickCouncilTaskModel("effort_estimate", leaderModelId, costAware)
|
|
33
57
|
*/
|
|
@@ -46,25 +70,25 @@ async function estimateEffortBatch(titles, llm, leaderModelId, costAware) {
|
|
|
46
70
|
raw = await llm.generate(model, system, prompt, 256);
|
|
47
71
|
}
|
|
48
72
|
catch {
|
|
49
|
-
// Graceful degrade:
|
|
50
|
-
return titles.map(() =>
|
|
73
|
+
// Graceful degrade: keyword heuristic prior per title (NOT flat 3).
|
|
74
|
+
return titles.map((t) => heuristicEffort(t));
|
|
51
75
|
}
|
|
52
76
|
try {
|
|
53
77
|
const match = raw.match(/\[[\s\S]*\]/);
|
|
54
78
|
if (match) {
|
|
55
79
|
const arr = JSON.parse(match[0]);
|
|
56
|
-
return titles.map((
|
|
80
|
+
return titles.map((t, i) => {
|
|
57
81
|
const v = arr[i];
|
|
58
82
|
if (v === 1 || v === 3 || v === 5)
|
|
59
83
|
return v;
|
|
60
|
-
return 3
|
|
84
|
+
return heuristicEffort(t); // this item unscored/invalid → heuristic, not flat 3
|
|
61
85
|
});
|
|
62
86
|
}
|
|
63
87
|
}
|
|
64
88
|
catch {
|
|
65
89
|
// JSON parse failed — fall through
|
|
66
90
|
}
|
|
67
|
-
return titles.map(() =>
|
|
91
|
+
return titles.map((t) => heuristicEffort(t));
|
|
68
92
|
}
|
|
69
93
|
/**
|
|
70
94
|
* Build a Backlog from a ClarifiedSpec + the Phase 1 implementation_plan artifact.
|
|
@@ -34,7 +34,9 @@ export function formatProjectContextForPrompt(ctx) {
|
|
|
34
34
|
lines.push(`Backend stack: ${lang} / ${fw}${runtime}`);
|
|
35
35
|
}
|
|
36
36
|
if (c.dbStrategy) {
|
|
37
|
-
lines.push(
|
|
37
|
+
lines.push(c.dbStrategy.mode === "none"
|
|
38
|
+
? "Database: none (stateless — no persistent storage)"
|
|
39
|
+
: `Database: ${c.dbStrategy.mode ?? "(unspecified)"} ${c.dbStrategy.engine ?? ""}`.trimEnd());
|
|
38
40
|
}
|
|
39
41
|
if (c.frontendApproach) {
|
|
40
42
|
const harness = c.frontendApproach.agentHarness
|
|
@@ -164,7 +164,10 @@ export function buildEcosystemPreamble() {
|
|
|
164
164
|
"- Angular with @muonroi/agent-harness-angular directive.",
|
|
165
165
|
'When recommending `frontendApproach`, ALWAYS fill the optional `agentHarness` slot — pick "react" for React/Next, "angular" for Angular, "opentui" for terminal UI, "core" for non-DOM integration. Only use "none" when the project has no UI at all.',
|
|
166
166
|
"",
|
|
167
|
-
"
|
|
167
|
+
"Strongest-default, still extensible:",
|
|
168
|
+
"- Keep the Muonroi/.NET path as the PRIMARY recommendation — it is the ecosystem's strongest, best-supported option.",
|
|
169
|
+
"- BUT for stack choices (architecture/stack/platform) ALWAYS include at least one mainstream NON-ecosystem alternative in `alternatives` (pick what genuinely fits the task — e.g. Python for data/ML/scripting, Go or Rust for a fast static-binary CLI, Node/TypeScript for JS-native tooling), with a one-line rationale. A user outside the Muonroi ecosystem must always see a real, viable path — never a .NET-only menu.",
|
|
170
|
+
"- Promote the non-ecosystem option to PRIMARY only when the prompt names another stack, or the task is a poor fit for .NET (e.g. a shell-glue one-liner, a data-science notebook, an npm-ecosystem plugin). Otherwise it stays a first-class alternative, not the default.",
|
|
168
171
|
].join("\n");
|
|
169
172
|
}
|
|
170
173
|
/**
|
|
@@ -3,6 +3,13 @@ import { appendUserOverride, buildProjectContextFromState, markDone, markUserGat
|
|
|
3
3
|
import { computePromptSpecificity, toEntry, } from "./discovery-recommender.js";
|
|
4
4
|
import { DISCOVERY_QUESTIONS, isFePolicyAccepted, isRequiredForPlatform, REQUIRED_QUESTION_IDS, validateAnswer, } from "./discovery-schema.js";
|
|
5
5
|
import { buildRepoBrief } from "./repo-brief.js";
|
|
6
|
+
/**
|
|
7
|
+
* Under existing-repo collapse, keep ONLY these questions as interactive
|
|
8
|
+
* per-field cards — they are the fields whose answers actually shape the
|
|
9
|
+
* technical change. Everything else in DISCOVERY_QUESTIONS is auto-filled and
|
|
10
|
+
* surfaced together on the compact __user_gate__ confirm card.
|
|
11
|
+
*/
|
|
12
|
+
const KEEP_CARD_FOR_EXISTING = new Set(["backendArchitecture"]);
|
|
6
13
|
export async function iterateInterview(opts) {
|
|
7
14
|
const { flowDir, runId, detection } = opts;
|
|
8
15
|
const _itvDbg = process.env.MUONROI_DEBUG_LEADER === "1";
|
|
@@ -20,7 +27,18 @@ export async function iterateInterview(opts) {
|
|
|
20
27
|
// but optional ones (baStatus, designStatus, deployment, frontendApproach when
|
|
21
28
|
// not web) are deferred unless the user explicitly re-runs with more context.
|
|
22
29
|
const specificity = computePromptSpecificity(opts.idea);
|
|
23
|
-
|
|
30
|
+
// Existing-codebase work (refactor / migration / feature-add on a repo that
|
|
31
|
+
// already has source) should NOT re-run the full greenfield product-scoping
|
|
32
|
+
// questionnaire. productType/audience/targetPlatform/frontend/design/deployment
|
|
33
|
+
// are derivable from the codebase and inert for the technical change — asking
|
|
34
|
+
// them per-field is the over-ask users complained about. For any non-greenfield
|
|
35
|
+
// classification (existing OR ambiguous polyglot) we collapse to the ONE
|
|
36
|
+
// decision-relevant card (backendArchitecture) plus the compact "assumed from
|
|
37
|
+
// codebase" confirm gate (the same __user_gate__ path used for minimal/detailed
|
|
38
|
+
// prompts). This mirrors the repoBrief-build condition below. Escape hatch:
|
|
39
|
+
// MUONROI_DISCOVERY_EXISTING_COLLAPSE=0 restores the full per-field interview.
|
|
40
|
+
const collapseForExisting = detection.classification !== "greenfield" && process.env.MUONROI_DISCOVERY_EXISTING_COLLAPSE !== "0";
|
|
41
|
+
const skipOptionalForMinimal = specificity === "minimal" || collapseForExisting;
|
|
24
42
|
// G2-b: for a minimal OR well-specified ("detailed") prompt the recommender's
|
|
25
43
|
// primary is high-confidence — minimal picks smallest-scope defaults, detailed
|
|
26
44
|
// respects the stated context. In both cases surfacing a card for EVERY
|
|
@@ -30,7 +48,8 @@ export async function iterateInterview(opts) {
|
|
|
30
48
|
// (the user gate) listing the assumptions so the user can proceed or adjust.
|
|
31
49
|
// "moderate" prompts keep the per-question cards (genuinely ambiguous). Escape
|
|
32
50
|
// hatch: MUONROI_DISCOVERY_AUTOFILL=0 restores per-question cards everywhere.
|
|
33
|
-
const autoFillRequired = (specificity === "minimal" || specificity === "detailed") &&
|
|
51
|
+
const autoFillRequired = (specificity === "minimal" || specificity === "detailed" || collapseForExisting) &&
|
|
52
|
+
process.env.MUONROI_DISCOVERY_AUTOFILL !== "0";
|
|
34
53
|
const assumed = [];
|
|
35
54
|
// G1 follow-up: keep the recommendation behind each auto-filled assumption so
|
|
36
55
|
// the user-gate "edit: <field>" path can re-render the SAME per-question card
|
|
@@ -94,7 +113,17 @@ export async function iterateInterview(opts) {
|
|
|
94
113
|
// policy) so a malformed recommendation falls back to the normal card flow.
|
|
95
114
|
// The assumed answers are surfaced together on the single user-gate card.
|
|
96
115
|
let autoAccepted = false;
|
|
97
|
-
|
|
116
|
+
// Keep backendArchitecture interactive under existing-repo collapse (the one
|
|
117
|
+
// field whose answer shapes the technical work), and NEVER silently auto-accept
|
|
118
|
+
// a weakly-grounded recommendation (synthFailed = the rationale failed the
|
|
119
|
+
// repo-brief citation check twice) — fall through to a per-question card so the
|
|
120
|
+
// user can catch a hallucinated value instead of it being assumed.
|
|
121
|
+
const keepInteractive = collapseForExisting && KEEP_CARD_FOR_EXISTING.has(question.id);
|
|
122
|
+
if (autoFillRequired &&
|
|
123
|
+
effectivelyRequired &&
|
|
124
|
+
recommendation.primary?.value != null &&
|
|
125
|
+
!recommendation.synthFailed &&
|
|
126
|
+
!keepInteractive) {
|
|
98
127
|
const v = recommendation.primary.value;
|
|
99
128
|
const validation = validateAnswer(question.id, v);
|
|
100
129
|
const feLib = question.id === "frontendApproach" ? v?.library : undefined;
|
|
@@ -18,7 +18,7 @@ export const DISCOVERY_QUESTIONS = [
|
|
|
18
18
|
id: "dbStrategy",
|
|
19
19
|
required: true,
|
|
20
20
|
recommendMode: "council",
|
|
21
|
-
prompt: "Database strategy: greenfield, existing schema, or migration?",
|
|
21
|
+
prompt: "Database strategy: none (stateless — no persistent storage), greenfield, existing schema, or migration? Choose none for a CLI/tool/filter that keeps no data.",
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
id: "frontendApproach",
|
|
@@ -74,6 +74,10 @@ export function getSchemaHintForLeader(questionId) {
|
|
|
74
74
|
return `value MUST be an object {"persona": string, "scale": one of ${Array.from(SCALES)
|
|
75
75
|
.map((s) => JSON.stringify(s))
|
|
76
76
|
.join("|")}, "geography": string}`;
|
|
77
|
+
case "dbStrategy":
|
|
78
|
+
// F7 — give the recommender an explicit "no persistence" option so it
|
|
79
|
+
// stops mis-ranking "greenfield" for stateless products (CLI/tool/filter).
|
|
80
|
+
return `value MUST be an object {"mode": one of "none"|"greenfield"|"existing-schema"|"migrate-from", "engine": string, "notes"?: string}. Pick "mode":"none" with "engine":"" when the product keeps NO persistent data (e.g. a stateless CLI, filter, or one-shot tool) — do NOT default to "greenfield" in that case.`;
|
|
77
81
|
case "frontendApproach":
|
|
78
82
|
return `value MUST be an object {"library": one of ${Array.from(ACCEPTED_FE_LIBRARIES)
|
|
79
83
|
.map((l) => JSON.stringify(l))
|
|
@@ -142,9 +142,9 @@ async function runCustomerDebate(ctx) {
|
|
|
142
142
|
const criteriaText = ctx.criteria
|
|
143
143
|
.map((c) => `- ${c.id}: ${c.status}${c.evidence ? ` (Evidence: ${c.evidence})` : ""}`)
|
|
144
144
|
.join("\n");
|
|
145
|
-
let conversation = `System: You are in a "Definition of Done" debate.
|
|
146
|
-
PO's goal: Prove the product is ready to ship.
|
|
147
|
-
Customer's goal: Ensure all requirements are met and it's high quality.
|
|
145
|
+
let conversation = `System: You are in a "Definition of Done" debate.
|
|
146
|
+
PO's goal: Prove the product is ready to ship.
|
|
147
|
+
Customer's goal: Ensure all requirements are met and it's high quality.
|
|
148
148
|
Criteria:\n${criteriaText}\n`;
|
|
149
149
|
for (let r = 1; r <= rounds; r++) {
|
|
150
150
|
const poPrompt = `${conversation}\nRound ${r}: PO, explain why this is ready to ship.`;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function isIdealTraceEnabled(): boolean;
|
|
2
|
+
/**
|
|
3
|
+
* Emit one diagnostic breadcrumb. `marker` is a stable dotted label
|
|
4
|
+
* (e.g. "council.persist.writeDecisionsLock.before"); `extra` carries small
|
|
5
|
+
* scalar context (sessionId, answer, lengths) — keep it tiny, this runs inline.
|
|
6
|
+
*/
|
|
7
|
+
export declare function idealTrace(marker: string, extra?: Record<string, unknown>): void;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// src/product-loop/ideal-trace.ts
|
|
2
|
+
//
|
|
3
|
+
// Env-gated diagnostic tracer for the /ideal → council → sprint path.
|
|
4
|
+
//
|
|
5
|
+
// WHY THIS EXISTS
|
|
6
|
+
// ---------------
|
|
7
|
+
// "blocker 5" — the observed but non-deterministic "Plan locked → idle" stall
|
|
8
|
+
// after the sprint-planning debate synthesis — could not be root-caused from a
|
|
9
|
+
// harness run because greenfield almost always halts at CB3 first, and the tail
|
|
10
|
+
// path (post-debate menu → persist → writeDecisionsLock → stats → return, then
|
|
11
|
+
// sprint-runner's Implementation stage) has no durable breadcrumb. When the flow
|
|
12
|
+
// goes idle mid-tail, there is nothing to say WHICH line was last reached.
|
|
13
|
+
//
|
|
14
|
+
// This tracer writes one synchronous JSONL line per choke point when
|
|
15
|
+
// `MUONROI_IDEAL_TRACE` is set. Synchronous (`appendFileSync`) is deliberate: if
|
|
16
|
+
// the process hangs or is killed at the stall, the LAST line in the file is the
|
|
17
|
+
// last point the flow reached — an async write could be lost to an unflushed
|
|
18
|
+
// buffer. Unset → zero behaviour change (no file, no stderr, single env read).
|
|
19
|
+
//
|
|
20
|
+
// USAGE
|
|
21
|
+
// MUONROI_IDEAL_TRACE=1 → <tmpdir>/muonroi-ideal-trace.jsonl
|
|
22
|
+
// MUONROI_IDEAL_TRACE=/path/to/ideal-trace.log → explicit path
|
|
23
|
+
// Then reproduce the stall and read the file; the trailing marker is the hang.
|
|
24
|
+
import { appendFileSync } from "node:fs";
|
|
25
|
+
import * as os from "node:os";
|
|
26
|
+
import * as path from "node:path";
|
|
27
|
+
/**
|
|
28
|
+
* Resolve the trace sink for the CURRENT env value, or null when disabled.
|
|
29
|
+
* Not cached — the flag is fixed for a CLI session, and re-reading env per call
|
|
30
|
+
* is trivial on this (slow, non-hot) council path; caching would wrongly pin an
|
|
31
|
+
* early "disabled" read for the whole process.
|
|
32
|
+
*/
|
|
33
|
+
function tracePath() {
|
|
34
|
+
const raw = process.env.MUONROI_IDEAL_TRACE;
|
|
35
|
+
if (!raw || raw === "0" || raw === "false")
|
|
36
|
+
return null;
|
|
37
|
+
return raw === "1" || raw === "true" ? path.join(os.tmpdir(), "muonroi-ideal-trace.jsonl") : raw;
|
|
38
|
+
}
|
|
39
|
+
export function isIdealTraceEnabled() {
|
|
40
|
+
return tracePath() !== null;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Emit one diagnostic breadcrumb. `marker` is a stable dotted label
|
|
44
|
+
* (e.g. "council.persist.writeDecisionsLock.before"); `extra` carries small
|
|
45
|
+
* scalar context (sessionId, answer, lengths) — keep it tiny, this runs inline.
|
|
46
|
+
*/
|
|
47
|
+
export function idealTrace(marker, extra) {
|
|
48
|
+
const file = tracePath();
|
|
49
|
+
if (!file)
|
|
50
|
+
return;
|
|
51
|
+
const record = { ts: new Date().toISOString(), marker, ...extra };
|
|
52
|
+
const line = JSON.stringify(record);
|
|
53
|
+
try {
|
|
54
|
+
appendFileSync(file, `${line}\n`, "utf8");
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
// Best-effort diagnostics: a bad path must never break the council/sprint
|
|
58
|
+
// flow. Surface once on stderr so a misconfigured path is noticed.
|
|
59
|
+
process.stderr.write(`[ideal-trace] append failed (${file}): ${err?.message}\n`);
|
|
60
|
+
}
|
|
61
|
+
// Mirror to stderr so it also lands in MUONROI_DEBUG_LLM_WIRE-style captures.
|
|
62
|
+
process.stderr.write(`[ideal-trace] ${line}\n`);
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=ideal-trace.js.map
|
|
@@ -18,7 +18,7 @@ export interface ProductLoopOptions {
|
|
|
18
18
|
/** Required for resume/abort/ship/status<runId>. */
|
|
19
19
|
runId?: string;
|
|
20
20
|
/** Subcommand selector. Default = start. */
|
|
21
|
-
subcommand?: "start" | "status" | "resume" | "abort" | "ship";
|
|
21
|
+
subcommand?: "start" | "status" | "resume" | "abort" | "ship" | "review";
|
|
22
22
|
flowDir: string;
|
|
23
23
|
/** Session model id from the orchestrator (this.modelId). Used to resolve real council models. */
|
|
24
24
|
sessionModelId: string;
|
|
@@ -29,6 +29,8 @@ export interface ProductLoopOptions {
|
|
|
29
29
|
/** Optional bridges; sprint-runner uses them when present. */
|
|
30
30
|
cwd?: string;
|
|
31
31
|
processMessageFn?: (message: string) => AsyncGenerator<StreamChunk, void, unknown>;
|
|
32
|
+
/** Isolated bounded task-runner bridge — see DriverContext.runIsolatedTask. */
|
|
33
|
+
runIsolatedTask?: (request: import("../types/index.js").TaskRequest) => Promise<import("../types/index.js").ToolResult>;
|
|
32
34
|
detectVerifyRecipe?: () => Promise<VerifyRecipe | null>;
|
|
33
35
|
/** Test hook: pre-resolved role assignments so the harness can pin model ids. */
|
|
34
36
|
roleAssignments?: Map<RoleSlot, {
|
|
@@ -53,6 +55,16 @@ export interface ProductLoopOptions {
|
|
|
53
55
|
* not set, the dispatcher routes to runHotPath (single sprint, no council debate).
|
|
54
56
|
*/
|
|
55
57
|
complexity?: "low" | "medium" | "high";
|
|
58
|
+
/**
|
|
59
|
+
* LLM-decided clarity signal (PIL Layer 1 `needsClarification`). When true the
|
|
60
|
+
* request is UNDERSPECIFIED — the model judged it lacks information it would
|
|
61
|
+
* need to proceed without guessing. It earns the interview/Council path even
|
|
62
|
+
* on an existing repo where a well-specified `standard` task would hot-path.
|
|
63
|
+
* Agent-first replacement for the regex sufficiency scorer: only `quick`
|
|
64
|
+
* (complexity=low) tasks still hot-path when underspecified — a trivial ask is
|
|
65
|
+
* not worth an interview no matter how terse.
|
|
66
|
+
*/
|
|
67
|
+
needsClarification?: boolean;
|
|
56
68
|
/**
|
|
57
69
|
* Sufficiency gaps from PIL Layer 1. When non-empty, the dispatcher forces
|
|
58
70
|
* the Council path regardless of complexity — vague prompts MUST go through
|