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
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* native-state.ts — Native replacements for the STATE.md-oriented gsd-tools
|
|
3
|
+
* subcommands (`state update`, `state json`, `init progress`).
|
|
4
|
+
*
|
|
5
|
+
* Part B: these fully replace the former `@opengsd/gsd-core` subprocess (removed
|
|
6
|
+
* in step 2). Output shapes follow the old gsd-tools `--raw`/JSON contract:
|
|
7
|
+
* state update → {updated:boolean, reason?}, state json → frontmatter object,
|
|
8
|
+
* init progress → progress projection.
|
|
9
|
+
*/
|
|
10
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
|
|
11
|
+
import { planningArtifact, planningPhasesRoot, planningRoot } from "./paths.js";
|
|
12
|
+
import { computeProgressPercent, normalizeStateStatus, stateExtractField, stateReplaceField, } from "./state-document.js";
|
|
13
|
+
/** Split a STATE.md into (frontmatter, body). Frontmatter is the text between
|
|
14
|
+
* the leading `---` fences (exclusive); body is everything after. */
|
|
15
|
+
function splitFrontmatter(content) {
|
|
16
|
+
const m = content.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
|
|
17
|
+
if (!m)
|
|
18
|
+
return { frontmatter: null, body: content };
|
|
19
|
+
return { frontmatter: m[1], body: m[2] };
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Native `state update <field> <value>`.
|
|
23
|
+
* Mirrors gsd-core updateCore: strip frontmatter, `stateReplaceField` on the
|
|
24
|
+
* BODY only, reassemble. Returns {updated:false, reason} when the field is not
|
|
25
|
+
* present or STATE.md is missing (never throws). Caller invalidates cache.
|
|
26
|
+
*/
|
|
27
|
+
export function nativeStateUpdate(cwd, field, value) {
|
|
28
|
+
const path = planningArtifact(cwd, "STATE.md");
|
|
29
|
+
if (!existsSync(path))
|
|
30
|
+
return { updated: false, reason: "STATE.md not found" };
|
|
31
|
+
let content;
|
|
32
|
+
try {
|
|
33
|
+
content = readFileSync(path, "utf8");
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return { updated: false, reason: "STATE.md not found" };
|
|
37
|
+
}
|
|
38
|
+
const { frontmatter, body } = splitFrontmatter(content);
|
|
39
|
+
const replaced = stateReplaceField(body, field, value);
|
|
40
|
+
if (replaced === null) {
|
|
41
|
+
return { updated: false, reason: `Field "${field}" not found in STATE.md` };
|
|
42
|
+
}
|
|
43
|
+
const next = frontmatter !== null ? `---\n${frontmatter}\n---\n\n${replaced.replace(/^\n+/, "")}` : replaced;
|
|
44
|
+
try {
|
|
45
|
+
// gsd-core writes under lock; a plain write matches the prior subprocess
|
|
46
|
+
// behavior for the single-writer product loop.
|
|
47
|
+
writeFileSync(path, next, "utf8");
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
return { updated: false, reason: err.message };
|
|
51
|
+
}
|
|
52
|
+
return { updated: true };
|
|
53
|
+
}
|
|
54
|
+
/** Count digit-prefixed phase headings in a ROADMAP.md milestone body. */
|
|
55
|
+
function countRoadmapPhases(cwd) {
|
|
56
|
+
const roadmap = planningArtifact(cwd, "ROADMAP.md");
|
|
57
|
+
if (!existsSync(roadmap))
|
|
58
|
+
return 0;
|
|
59
|
+
try {
|
|
60
|
+
const text = readFileSync(roadmap, "utf8");
|
|
61
|
+
const re = /#{2,4}\s*(?:\[[^\]]+\]\s*)?Phase\s+(\d+[A-Za-z]?(?:[.-]\d+)*)\s*:/gi;
|
|
62
|
+
const seen = new Set();
|
|
63
|
+
for (let m = re.exec(text); m; m = re.exec(text)) {
|
|
64
|
+
const n = m[1];
|
|
65
|
+
if (n === "0" || n.startsWith("999"))
|
|
66
|
+
continue;
|
|
67
|
+
seen.add(n);
|
|
68
|
+
}
|
|
69
|
+
return seen.size;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return 0;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/** List phase directories with lightweight disk counts. */
|
|
76
|
+
function scanPhaseDirs(cwd) {
|
|
77
|
+
const root = planningPhasesRoot(cwd);
|
|
78
|
+
if (!existsSync(root))
|
|
79
|
+
return [];
|
|
80
|
+
try {
|
|
81
|
+
return readdirSync(root, { withFileTypes: true })
|
|
82
|
+
.filter((e) => e.isDirectory())
|
|
83
|
+
.map((e) => {
|
|
84
|
+
let plan_count = 0;
|
|
85
|
+
let summary_count = 0;
|
|
86
|
+
try {
|
|
87
|
+
for (const f of readdirSync(`${root}/${e.name}`)) {
|
|
88
|
+
if (/PLAN.*\.md$/i.test(f))
|
|
89
|
+
plan_count += 1;
|
|
90
|
+
if (/SUMMARY.*\.md$/i.test(f))
|
|
91
|
+
summary_count += 1;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
/* unreadable phase dir — count as empty */
|
|
96
|
+
}
|
|
97
|
+
return { dir: e.name, plan_count, summary_count };
|
|
98
|
+
})
|
|
99
|
+
.sort((a, b) => a.dir.localeCompare(b.dir));
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Native `state json` — frontmatter snapshot derived from STATE.md body fields
|
|
107
|
+
* + roadmap phase count. Note: gsd-core emits a fresh `last_updated` ISO stamp;
|
|
108
|
+
* we OMIT that non-deterministic field so consumers/tests get a stable object
|
|
109
|
+
* (workflow-engine only reads it loosely as `state_frontmatter`).
|
|
110
|
+
*/
|
|
111
|
+
export function nativeStateJson(cwd) {
|
|
112
|
+
const path = planningArtifact(cwd, "STATE.md");
|
|
113
|
+
if (!existsSync(path))
|
|
114
|
+
return { error: "STATE.md not found" };
|
|
115
|
+
const content = readFileSync(path, "utf8");
|
|
116
|
+
const get = (f) => stateExtractField(content, f);
|
|
117
|
+
const totalPhasesFromRoadmap = countRoadmapPhases(cwd);
|
|
118
|
+
const totalPhases = Number.parseInt(get("Total Phases") ?? "", 10);
|
|
119
|
+
const completedPhases = Number.parseInt(get("Completed Phases") ?? "", 10);
|
|
120
|
+
const totalPlans = Number.parseInt(get("Total Plans in Phase") ?? get("Total Plans") ?? "", 10);
|
|
121
|
+
const completedPlans = Number.parseInt(get("Completed Plans") ?? "", 10);
|
|
122
|
+
const tp = Number.isFinite(totalPhases) ? totalPhases : totalPhasesFromRoadmap || null;
|
|
123
|
+
const cp = Number.isFinite(completedPhases) ? completedPhases : null;
|
|
124
|
+
const tpl = Number.isFinite(totalPlans) ? totalPlans : null;
|
|
125
|
+
const cpl = Number.isFinite(completedPlans) ? completedPlans : null;
|
|
126
|
+
const out = { gsd_state_version: "1.0" };
|
|
127
|
+
const currentPhase = get("Current Phase") ?? get("Phase");
|
|
128
|
+
if (currentPhase)
|
|
129
|
+
out.current_phase = currentPhase;
|
|
130
|
+
const currentPlan = get("Current Plan");
|
|
131
|
+
if (currentPlan)
|
|
132
|
+
out.current_plan = currentPlan;
|
|
133
|
+
out.status = normalizeStateStatus(get("Status") ?? "", get("Paused At") ?? undefined);
|
|
134
|
+
const lastActivity = get("Last Activity");
|
|
135
|
+
if (lastActivity)
|
|
136
|
+
out.last_activity = lastActivity;
|
|
137
|
+
const progress = {};
|
|
138
|
+
if (tp !== null)
|
|
139
|
+
progress.total_phases = tp;
|
|
140
|
+
if (cp !== null)
|
|
141
|
+
progress.completed_phases = cp;
|
|
142
|
+
if (tpl !== null)
|
|
143
|
+
progress.total_plans = tpl;
|
|
144
|
+
if (cpl !== null)
|
|
145
|
+
progress.completed_plans = cpl;
|
|
146
|
+
const percent = computeProgressPercent(cpl, tpl, cp, tp);
|
|
147
|
+
if (percent !== null)
|
|
148
|
+
progress.percent = percent;
|
|
149
|
+
if (Object.keys(progress).length > 0)
|
|
150
|
+
out.progress = progress;
|
|
151
|
+
return out;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Native `init progress` — the projection consumed by workflow-engine.readProgress.
|
|
155
|
+
* Mirrors the subset of gsd-core's cmdInitProgress that muonroi actually reads:
|
|
156
|
+
* existence flags, phase list + counts, current/next phase.
|
|
157
|
+
*/
|
|
158
|
+
export function nativeInitProgress(cwd) {
|
|
159
|
+
const stateExists = existsSync(planningArtifact(cwd, "STATE.md"));
|
|
160
|
+
const roadmapExists = existsSync(planningArtifact(cwd, "ROADMAP.md"));
|
|
161
|
+
const projectExists = existsSync(planningArtifact(cwd, "PROJECT.md"));
|
|
162
|
+
const phaseDirs = scanPhaseDirs(cwd);
|
|
163
|
+
const phases = phaseDirs.map((p) => {
|
|
164
|
+
const numMatch = p.dir.match(/(\d+)/);
|
|
165
|
+
return {
|
|
166
|
+
number: numMatch ? numMatch[1] : p.dir,
|
|
167
|
+
directory: p.dir,
|
|
168
|
+
plan_count: p.plan_count,
|
|
169
|
+
summary_count: p.summary_count,
|
|
170
|
+
status: p.summary_count >= p.plan_count && p.plan_count > 0
|
|
171
|
+
? "complete"
|
|
172
|
+
: p.plan_count > 0
|
|
173
|
+
? "in_progress"
|
|
174
|
+
: "not_started",
|
|
175
|
+
};
|
|
176
|
+
});
|
|
177
|
+
const completed = phases.filter((p) => p.status === "complete").length;
|
|
178
|
+
const inProgress = phases.filter((p) => p.status === "in_progress").length;
|
|
179
|
+
const current = phases.find((p) => p.status !== "complete");
|
|
180
|
+
return {
|
|
181
|
+
phases,
|
|
182
|
+
phase_count: Math.max(phases.length, countRoadmapPhases(cwd)),
|
|
183
|
+
completed_count: completed,
|
|
184
|
+
in_progress_count: inProgress,
|
|
185
|
+
current_phase: current?.number ?? null,
|
|
186
|
+
project_exists: projectExists,
|
|
187
|
+
roadmap_exists: roadmapExists,
|
|
188
|
+
state_exists: stateExists,
|
|
189
|
+
state_path: planningArtifact(cwd, "STATE.md"),
|
|
190
|
+
roadmap_path: planningArtifact(cwd, "ROADMAP.md"),
|
|
191
|
+
project_root: planningRoot(cwd),
|
|
192
|
+
has_work_in_progress: inProgress > 0,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
/** True when STATE.md exists (used by callers to decide native vs. bootstrap). */
|
|
196
|
+
export function stateFileMtime(cwd) {
|
|
197
|
+
try {
|
|
198
|
+
const p = planningArtifact(cwd, "STATE.md");
|
|
199
|
+
return existsSync(p) ? statSync(p).mtimeMs : 0;
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
return 0;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Native `config-ensure-section` — ensure the `.planning/` directory exists.
|
|
207
|
+
* muonroi's only caller (loop-host.ensureHost) invokes this immediately before
|
|
208
|
+
* `ensurePlanningWorkspace`, which writes the real model-bound config.json. So
|
|
209
|
+
* native config-ensure MUST NOT write a stub config here — that would shadow the
|
|
210
|
+
* proper config (ensurePlanningWorkspace only writes when config.json is absent).
|
|
211
|
+
* We just guarantee the directory, matching the pair's net effect.
|
|
212
|
+
*/
|
|
213
|
+
export function nativeConfigEnsure(cwd) {
|
|
214
|
+
const root = planningRoot(cwd);
|
|
215
|
+
const existed = existsSync(root);
|
|
216
|
+
if (!existed)
|
|
217
|
+
mkdirSync(root, { recursive: true });
|
|
218
|
+
return { ok: true, created: !existed };
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=native-state.js.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare const PLANNING_DIR = ".planning";
|
|
2
|
+
/**
|
|
3
|
+
* Consolidated home for GSD planning state once it is folded under the flow
|
|
4
|
+
* directory (`.muonroi-flow/planning/`). See `src/flow/fold-planning.ts`.
|
|
5
|
+
*/
|
|
6
|
+
export declare const FOLDED_PLANNING_DIR: string;
|
|
7
|
+
/**
|
|
8
|
+
* Resolve the active GSD planning root.
|
|
9
|
+
*
|
|
10
|
+
* Sprint-2 (Part A, staged per REV-3 Kill B): `.planning/` still WINS whenever
|
|
11
|
+
* it exists — that is where the `gsd-tools.cjs` subprocess writes phases today,
|
|
12
|
+
* so reads and writes stay in sync and behavior is byte-identical to before.
|
|
13
|
+
* The folded location (`.muonroi-flow/planning/`) is used only as a READ
|
|
14
|
+
* fallback — i.e. once the subprocess writer is removed (Part B) and `.planning/`
|
|
15
|
+
* no longer exists, GSD reads transparently continue from the consolidated tree.
|
|
16
|
+
* This is purely additive: no live cutover, no desync risk.
|
|
17
|
+
*/
|
|
18
|
+
export declare function planningRoot(cwd: string): string;
|
|
19
|
+
export declare function planningArtifact(cwd: string, name: string): string;
|
|
20
|
+
export declare function planningPhasesRoot(cwd: string): string;
|
|
21
|
+
export declare function listPhaseDirs(cwd: string): string[];
|
|
22
|
+
export declare function latestPhaseDir(cwd: string): string | null;
|
|
23
|
+
export declare function phaseDirPath(cwd: string, dirName: string, artifact?: string): string;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { existsSync, readdirSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
export const PLANNING_DIR = ".planning";
|
|
4
|
+
/**
|
|
5
|
+
* Consolidated home for GSD planning state once it is folded under the flow
|
|
6
|
+
* directory (`.muonroi-flow/planning/`). See `src/flow/fold-planning.ts`.
|
|
7
|
+
*/
|
|
8
|
+
export const FOLDED_PLANNING_DIR = join(".muonroi-flow", "planning");
|
|
9
|
+
/**
|
|
10
|
+
* Resolve the active GSD planning root.
|
|
11
|
+
*
|
|
12
|
+
* Sprint-2 (Part A, staged per REV-3 Kill B): `.planning/` still WINS whenever
|
|
13
|
+
* it exists — that is where the `gsd-tools.cjs` subprocess writes phases today,
|
|
14
|
+
* so reads and writes stay in sync and behavior is byte-identical to before.
|
|
15
|
+
* The folded location (`.muonroi-flow/planning/`) is used only as a READ
|
|
16
|
+
* fallback — i.e. once the subprocess writer is removed (Part B) and `.planning/`
|
|
17
|
+
* no longer exists, GSD reads transparently continue from the consolidated tree.
|
|
18
|
+
* This is purely additive: no live cutover, no desync risk.
|
|
19
|
+
*/
|
|
20
|
+
export function planningRoot(cwd) {
|
|
21
|
+
const canonical = join(cwd, PLANNING_DIR);
|
|
22
|
+
// Existing `.planning/` projects keep using it (back-compat, no disruption).
|
|
23
|
+
if (existsSync(canonical))
|
|
24
|
+
return canonical;
|
|
25
|
+
const folded = join(cwd, FOLDED_PLANNING_DIR);
|
|
26
|
+
if (existsSync(folded))
|
|
27
|
+
return folded;
|
|
28
|
+
// Part B step 2 — LIVE CUTOVER: now that native code owns all GSD path
|
|
29
|
+
// resolution (the subprocess that hardcoded `.planning/` is gone), a FRESH
|
|
30
|
+
// project consolidates its GSD state under `.muonroi-flow/planning/` — one
|
|
31
|
+
// state tree alongside the /ideal `.muonroi-flow/runs/`. Opt back into the
|
|
32
|
+
// legacy split location with MUONROI_GSD_LEGACY_PLANNING=1.
|
|
33
|
+
if (process.env.MUONROI_GSD_LEGACY_PLANNING === "1")
|
|
34
|
+
return canonical;
|
|
35
|
+
return folded;
|
|
36
|
+
}
|
|
37
|
+
export function planningArtifact(cwd, name) {
|
|
38
|
+
return join(planningRoot(cwd), name);
|
|
39
|
+
}
|
|
40
|
+
export function planningPhasesRoot(cwd) {
|
|
41
|
+
return join(planningRoot(cwd), "phases");
|
|
42
|
+
}
|
|
43
|
+
export function listPhaseDirs(cwd) {
|
|
44
|
+
const root = planningPhasesRoot(cwd);
|
|
45
|
+
if (!existsSync(root))
|
|
46
|
+
return [];
|
|
47
|
+
try {
|
|
48
|
+
return readdirSync(root, { withFileTypes: true })
|
|
49
|
+
.filter((e) => e.isDirectory())
|
|
50
|
+
.map((e) => e.name)
|
|
51
|
+
.sort();
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
console.error(`[gsd-paths] listPhaseDirs failed: ${err.message}`);
|
|
55
|
+
return [];
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export function latestPhaseDir(cwd) {
|
|
59
|
+
const dirs = listPhaseDirs(cwd);
|
|
60
|
+
return dirs.length ? dirs[dirs.length - 1] : null;
|
|
61
|
+
}
|
|
62
|
+
export function phaseDirPath(cwd, dirName, artifact) {
|
|
63
|
+
const base = join(planningPhasesRoot(cwd), dirName);
|
|
64
|
+
return artifact ? join(base, artifact) : base;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Phase } from "../product-loop/types.js";
|
|
2
|
+
/** Kahn topological sort — same algorithm as legacy phase-runner orderByDeps. */
|
|
3
|
+
export declare function topologicalPhaseOrder(phases: Phase[]): Phase[];
|
|
4
|
+
/**
|
|
5
|
+
* Resolve phase execution order: gsd-core roadmap analyze when native + ROADMAP.md,
|
|
6
|
+
* otherwise legacy topological sort on dependsOn.
|
|
7
|
+
*/
|
|
8
|
+
export declare function orderPhasesForExecution(cwd: string, phases: Phase[]): Phase[];
|
|
9
|
+
export declare function syncPhasePlanToRoadmap(cwd: string, idea: string, plan: {
|
|
10
|
+
phases: Phase[];
|
|
11
|
+
}): void;
|
|
12
|
+
export declare function mapPhaseDependsToRoadmapNumbers(phases: Phase[]): Record<string, string>;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { isGsdNativeEnabled } from "./flags.js";
|
|
2
|
+
import { dispatchRoadmapAnalyze } from "./gsd-dispatch.js";
|
|
3
|
+
import { syncRoadmapFromPhasePlan } from "./product-workspace.js";
|
|
4
|
+
/** Kahn topological sort — same algorithm as legacy phase-runner orderByDeps. */
|
|
5
|
+
export function topologicalPhaseOrder(phases) {
|
|
6
|
+
const remaining = new Map(phases.map((p) => [p.id, new Set(p.dependsOn.filter((d) => phases.some((x) => x.id === d)))]));
|
|
7
|
+
const byId = new Map(phases.map((p) => [p.id, p]));
|
|
8
|
+
const out = [];
|
|
9
|
+
while (remaining.size > 0) {
|
|
10
|
+
let progressed = false;
|
|
11
|
+
for (const [id, deps] of remaining) {
|
|
12
|
+
if (deps.size === 0) {
|
|
13
|
+
out.push(byId.get(id));
|
|
14
|
+
remaining.delete(id);
|
|
15
|
+
for (const [, set] of remaining)
|
|
16
|
+
set.delete(id);
|
|
17
|
+
progressed = true;
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (!progressed)
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
if (out.length < phases.length) {
|
|
25
|
+
const stuck = phases.filter((p) => !out.some((o) => o.id === p.id));
|
|
26
|
+
console.error(`[gsd-phase-dag] dependency cycle or unresolved deps — falling back to declaration order for: ${stuck.map((p) => p.id).join(", ")}`);
|
|
27
|
+
for (const p of phases) {
|
|
28
|
+
if (!out.some((o) => o.id === p.id))
|
|
29
|
+
out.push(p);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return out;
|
|
33
|
+
}
|
|
34
|
+
function phaseIdToRoadmapNumber(phaseId) {
|
|
35
|
+
const match = phaseId.match(/phase-(\d+)/i);
|
|
36
|
+
return match ? match[1] : null;
|
|
37
|
+
}
|
|
38
|
+
function reorderByRoadmapAnalyze(phases, analysis) {
|
|
39
|
+
if (!analysis.phases?.length)
|
|
40
|
+
return topologicalPhaseOrder(phases);
|
|
41
|
+
const byNum = new Map();
|
|
42
|
+
for (const p of phases) {
|
|
43
|
+
const num = phaseIdToRoadmapNumber(p.id);
|
|
44
|
+
if (num)
|
|
45
|
+
byNum.set(num, p);
|
|
46
|
+
}
|
|
47
|
+
const ordered = [];
|
|
48
|
+
for (const entry of analysis.phases) {
|
|
49
|
+
const num = entry.number;
|
|
50
|
+
if (!num)
|
|
51
|
+
continue;
|
|
52
|
+
const phase = byNum.get(String(num));
|
|
53
|
+
if (phase && !ordered.some((o) => o.id === phase.id)) {
|
|
54
|
+
ordered.push(phase);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
for (const p of phases) {
|
|
58
|
+
if (!ordered.some((o) => o.id === p.id))
|
|
59
|
+
ordered.push(p);
|
|
60
|
+
}
|
|
61
|
+
return ordered.length ? ordered : topologicalPhaseOrder(phases);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Resolve phase execution order: gsd-core roadmap analyze when native + ROADMAP.md,
|
|
65
|
+
* otherwise legacy topological sort on dependsOn.
|
|
66
|
+
*/
|
|
67
|
+
export function orderPhasesForExecution(cwd, phases) {
|
|
68
|
+
if (!isGsdNativeEnabled())
|
|
69
|
+
return topologicalPhaseOrder(phases);
|
|
70
|
+
const analysis = dispatchRoadmapAnalyze(cwd);
|
|
71
|
+
if (analysis.ok && analysis.data && !analysis.data.error) {
|
|
72
|
+
return reorderByRoadmapAnalyze(phases, analysis.data);
|
|
73
|
+
}
|
|
74
|
+
return topologicalPhaseOrder(phases);
|
|
75
|
+
}
|
|
76
|
+
export function syncPhasePlanToRoadmap(cwd, idea, plan) {
|
|
77
|
+
if (!isGsdNativeEnabled())
|
|
78
|
+
return;
|
|
79
|
+
syncRoadmapFromPhasePlan(cwd, idea, plan);
|
|
80
|
+
const analysis = dispatchRoadmapAnalyze(cwd);
|
|
81
|
+
if (!analysis.ok) {
|
|
82
|
+
console.error(`[gsd-phase-dag] roadmap analyze after sync failed: ${analysis.error ?? "unknown"}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
export function mapPhaseDependsToRoadmapNumbers(phases) {
|
|
86
|
+
const out = {};
|
|
87
|
+
for (const p of phases) {
|
|
88
|
+
const num = phaseIdToRoadmapNumber(p.id);
|
|
89
|
+
if (num)
|
|
90
|
+
out[p.id] = num;
|
|
91
|
+
}
|
|
92
|
+
return out;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=phase-dag.js.map
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { TaskListSnapshot } from "../types/index.js";
|
|
2
|
+
export interface PhaseSyncStep {
|
|
3
|
+
op: string;
|
|
4
|
+
ok: boolean;
|
|
5
|
+
detail?: string;
|
|
6
|
+
error?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface PhaseSyncResult {
|
|
9
|
+
ok: boolean;
|
|
10
|
+
skipped: boolean;
|
|
11
|
+
skipReason?: string;
|
|
12
|
+
phaseNumber?: string;
|
|
13
|
+
phaseDirName?: string;
|
|
14
|
+
error?: string;
|
|
15
|
+
steps: PhaseSyncStep[];
|
|
16
|
+
}
|
|
17
|
+
export declare function extractPlanTitle(planBody: string): string;
|
|
18
|
+
export declare function derivePhaseSlug(title: string): string;
|
|
19
|
+
export declare function findPhaseDirBySlug(cwd: string, slug: string): string | null;
|
|
20
|
+
export declare function readMilestonePhaseDir(cwd: string): string | null;
|
|
21
|
+
/** Minimal gsd-compatible ROADMAP required before `phase add`. */
|
|
22
|
+
export declare function ensureTaskRoadmap(cwd: string, milestoneTitle: string): void;
|
|
23
|
+
export declare function copyPlanToPhaseDir(cwd: string, phaseDirName: string, planBody: string): void;
|
|
24
|
+
export declare function writePhaseVerificationPassed(cwd: string, phaseDirName: string, phaseNumber: string, evidence?: string): string;
|
|
25
|
+
export declare function writePhaseSummaryStub(cwd: string, phaseDirName: string, evidence?: string): string;
|
|
26
|
+
/** After gsd_plan writes PLAN.md — task workflow only. */
|
|
27
|
+
export declare function syncTaskPhaseOnPlan(cwd: string, opts: {
|
|
28
|
+
planTitle: string;
|
|
29
|
+
planBody: string;
|
|
30
|
+
sessionId?: string;
|
|
31
|
+
}): PhaseSyncResult;
|
|
32
|
+
/** After gsd_verify pass — task workflow only. */
|
|
33
|
+
export declare function syncTaskPhaseOnVerifyPass(cwd: string, opts?: {
|
|
34
|
+
evidence?: string;
|
|
35
|
+
sessionId?: string;
|
|
36
|
+
}): PhaseSyncResult;
|
|
37
|
+
/** Copy root VERIFY.md into phase dir when present (best-effort). */
|
|
38
|
+
export declare function mirrorVerifyMdToPhaseDir(cwd: string, phaseDirName: string): void;
|
|
39
|
+
/** Automatically append user AskCard answers as clarifications to CONTEXT.md under GSD. */
|
|
40
|
+
export declare function appendClarificationToContext(cwd: string, question: string, answer: string): void;
|
|
41
|
+
/** Build TaskListSnapshot directly from GSD PLAN.md and STATE.md for automatic TUI checklist synchronization. */
|
|
42
|
+
export declare function getTaskListSnapshotFromGsd(cwd: string): TaskListSnapshot | null;
|