gsd-pi 2.82.0-dev.ed17d078d → 3.0.0-dev.2e8b124f7
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/README.md +93 -18
- package/dist/cli.js +20 -9
- package/dist/headless-ui.js +13 -6
- package/dist/headless.js +9 -2
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +10 -1
- package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +44 -6
- package/dist/resources/extensions/cmux/index.js +5 -0
- package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
- package/dist/resources/extensions/gsd/auto/loop.js +110 -37
- package/dist/resources/extensions/gsd/auto/orchestrator.js +13 -2
- package/dist/resources/extensions/gsd/auto/phases.js +104 -38
- package/dist/resources/extensions/gsd/auto/session.js +6 -0
- package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -1
- package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
- package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +66 -1
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +71 -20
- package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +278 -137
- package/dist/resources/extensions/gsd/auto-prompts.js +36 -10
- package/dist/resources/extensions/gsd/auto-recovery.js +79 -14
- package/dist/resources/extensions/gsd/auto-start.js +90 -14
- package/dist/resources/extensions/gsd/auto-timers.js +11 -3
- package/dist/resources/extensions/gsd/auto-verification.js +102 -34
- package/dist/resources/extensions/gsd/auto-worktree.js +178 -11
- package/dist/resources/extensions/gsd/auto.js +107 -54
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +31 -7
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -9
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +5 -4
- package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
- package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
- package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +38 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
- package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +2 -0
- package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +10 -2
- package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +52 -7
- package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
- package/dist/resources/extensions/gsd/db-base-schema.js +2 -0
- package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
- package/dist/resources/extensions/gsd/db-task-slice-rows.js +2 -0
- package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +8 -0
- package/dist/resources/extensions/gsd/doctor-git-checks.js +46 -1
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
- package/dist/resources/extensions/gsd/doctor.js +2 -28
- package/dist/resources/extensions/gsd/export-html.js +27 -425
- package/dist/resources/extensions/gsd/forensics.js +10 -3
- package/dist/resources/extensions/gsd/git-service.js +138 -10
- package/dist/resources/extensions/gsd/gsd-db.js +76 -33
- package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
- package/dist/resources/extensions/gsd/guided-flow.js +110 -117
- package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
- package/dist/resources/extensions/gsd/init-wizard.js +17 -2
- package/dist/resources/extensions/gsd/markdown-renderer.js +14 -11
- package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
- package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
- package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
- package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
- package/dist/resources/extensions/gsd/native-git-bridge.js +57 -14
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
- package/dist/resources/extensions/gsd/paths.js +4 -0
- package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
- package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
- package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
- package/dist/resources/extensions/gsd/pre-execution-checks.js +38 -11
- package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
- package/dist/resources/extensions/gsd/preferences-types.js +2 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +138 -0
- package/dist/resources/extensions/gsd/preferences.js +2 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
- package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
- package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
- package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
- package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
- package/dist/resources/extensions/gsd/repository-registry.js +44 -0
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +59 -2
- package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
- package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
- package/dist/resources/extensions/gsd/state.js +14 -4
- package/dist/resources/extensions/gsd/status-guards.js +14 -2
- package/dist/resources/extensions/gsd/templates/plan.md +9 -5
- package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -8
- package/dist/resources/extensions/gsd/tools/complete-slice.js +6 -8
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
- package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +2 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +69 -17
- package/dist/resources/extensions/gsd/validation.js +23 -1
- package/dist/resources/extensions/gsd/verification-gate.js +142 -7
- package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
- package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
- package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +83 -19
- package/dist/resources/extensions/gsd/worktree-manager.js +11 -2
- package/dist/resources/extensions/gsd/worktree-safety.js +33 -1
- package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
- package/dist/resources/extensions/shared/html-shell.js +388 -0
- package/dist/resources/extensions/shared/interview-ui.js +6 -4
- package/dist/resources/extensions/subagent/index.js +448 -78
- package/dist/resources/extensions/subagent/launch.js +77 -0
- package/dist/resources/extensions/subagent/run-store.js +148 -0
- package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
- package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
- package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
- package/dist/resources/extensions/visual-brief/index.js +5 -0
- package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
- package/dist/resources/extensions/visual-brief/prompts.js +140 -0
- package/dist/resources/skills/forensics/SKILL.md +1 -1
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
- package/dist/web/standalone/.next/required-server-files.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +4 -7
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -7
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
- package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
- package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
- package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
- package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
- package/dist/web/standalone/server.js +1 -1
- package/package.json +4 -4
- package/packages/contracts/dist/rpc.test.js +7 -0
- package/packages/contracts/dist/rpc.test.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +21 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +24 -0
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/src/rpc.test.ts +8 -0
- package/packages/contracts/src/workflow.ts +24 -0
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/README.md +13 -4
- package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +80 -0
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
- package/packages/mcp-server/src/workflow-tools.ts +168 -0
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/native/tsconfig.json +2 -1
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
- package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.js +5 -6
- package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
- package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
- package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
- package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
- package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
- package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
- package/packages/pi-ai/src/providers/simple-options.ts +5 -6
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +8 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +71 -97
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
- package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
- package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +17 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +75 -102
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/tui.test.js +45 -2
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
- package/packages/pi-tui/dist/terminal.d.ts +2 -0
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +12 -0
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +106 -27
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
- package/packages/pi-tui/src/__tests__/tui.test.ts +59 -2
- package/packages/pi-tui/src/terminal.ts +11 -0
- package/packages/pi-tui/src/tui.ts +108 -27
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/package.json +1 -1
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +10 -1
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
- package/src/resources/extensions/cmux/index.ts +6 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +17 -6
- package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
- package/src/resources/extensions/gsd/auto/loop.ts +111 -38
- package/src/resources/extensions/gsd/auto/orchestrator.ts +13 -2
- package/src/resources/extensions/gsd/auto/phases.ts +127 -49
- package/src/resources/extensions/gsd/auto/session.ts +16 -0
- package/src/resources/extensions/gsd/auto/types.ts +3 -0
- package/src/resources/extensions/gsd/auto/unit-runner-events.ts +6 -2
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
- package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +72 -1
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +74 -20
- package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +312 -148
- package/src/resources/extensions/gsd/auto-prompts.ts +36 -13
- package/src/resources/extensions/gsd/auto-recovery.ts +83 -11
- package/src/resources/extensions/gsd/auto-start.ts +99 -12
- package/src/resources/extensions/gsd/auto-timers.ts +10 -3
- package/src/resources/extensions/gsd/auto-verification.ts +124 -42
- package/src/resources/extensions/gsd/auto-worktree.ts +195 -11
- package/src/resources/extensions/gsd/auto.ts +100 -42
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +42 -7
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +10 -9
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +5 -4
- package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
- package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
- package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +41 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
- package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
- package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +11 -3
- package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
- package/src/resources/extensions/gsd/crash-recovery.ts +52 -6
- package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
- package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
- package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
- package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
- package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +8 -0
- package/src/resources/extensions/gsd/doctor-git-checks.ts +45 -1
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
- package/src/resources/extensions/gsd/doctor-types.ts +1 -0
- package/src/resources/extensions/gsd/doctor.ts +2 -27
- package/src/resources/extensions/gsd/export-html.ts +27 -427
- package/src/resources/extensions/gsd/forensics.ts +9 -3
- package/src/resources/extensions/gsd/git-service.ts +166 -11
- package/src/resources/extensions/gsd/gsd-db.ts +80 -31
- package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
- package/src/resources/extensions/gsd/guided-flow.ts +142 -134
- package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
- package/src/resources/extensions/gsd/init-wizard.ts +17 -2
- package/src/resources/extensions/gsd/journal.ts +8 -1
- package/src/resources/extensions/gsd/markdown-renderer.ts +14 -11
- package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
- package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
- package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
- package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
- package/src/resources/extensions/gsd/native-git-bridge.ts +63 -14
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
- package/src/resources/extensions/gsd/paths.ts +5 -0
- package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
- package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
- package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
- package/src/resources/extensions/gsd/pre-execution-checks.ts +49 -11
- package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
- package/src/resources/extensions/gsd/preferences-types.ts +33 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +145 -0
- package/src/resources/extensions/gsd/preferences.ts +5 -0
- package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
- package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
- package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
- package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
- package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
- package/src/resources/extensions/gsd/prompts/queue.md +4 -4
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
- package/src/resources/extensions/gsd/repository-registry.ts +77 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +52 -1
- package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
- package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
- package/src/resources/extensions/gsd/state.ts +15 -4
- package/src/resources/extensions/gsd/status-guards.ts +16 -2
- package/src/resources/extensions/gsd/templates/plan.md +9 -5
- package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +10 -1
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +300 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +197 -11
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
- package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +129 -6
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
- package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
- package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +5 -9
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +104 -2
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
- package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +111 -1
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
- package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
- package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
- package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +199 -2
- package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
- package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
- package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
- package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
- package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
- package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +78 -0
- package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
- package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
- package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +21 -1
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +72 -1
- package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +86 -2
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
- package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
- package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +131 -9
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +173 -1
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
- package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
- package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +57 -2
- package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +8 -10
- package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -8
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
- package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
- package/src/resources/extensions/gsd/types.ts +1 -1
- package/src/resources/extensions/gsd/unit-context-composer.ts +3 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +86 -19
- package/src/resources/extensions/gsd/validation.ts +23 -1
- package/src/resources/extensions/gsd/verification-gate.ts +170 -6
- package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
- package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
- package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +93 -20
- package/src/resources/extensions/gsd/worktree-manager.ts +14 -2
- package/src/resources/extensions/gsd/worktree-safety.ts +45 -6
- package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
- package/src/resources/extensions/shared/html-shell.ts +412 -0
- package/src/resources/extensions/shared/interview-ui.ts +6 -4
- package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
- package/src/resources/extensions/subagent/index.ts +567 -103
- package/src/resources/extensions/subagent/launch.ts +131 -0
- package/src/resources/extensions/subagent/run-store.ts +218 -0
- package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
- package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
- package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
- package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
- package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
- package/src/resources/extensions/visual-brief/index.ts +8 -0
- package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
- package/src/resources/extensions/visual-brief/prompts.ts +183 -0
- package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
- package/src/resources/skills/forensics/SKILL.md +1 -1
- package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
- package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
- package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
- package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +0 -1
- package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
- package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
- package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
- /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → zCegwxH2e6vLp1vEZLLuZ}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → zCegwxH2e6vLp1vEZLLuZ}/_ssgManifest.js +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
1
2
|
import { computeProgressScore, formatProgressLine } from "../../progress-score.js";
|
|
2
3
|
import { getGlobalGSDPreferencesPath, getProjectGSDPreferencesPath } from "../../preferences.js";
|
|
3
4
|
import { ensurePreferencesFile, handlePrefs, handlePrefsMode, handlePrefsWizard, handleLanguage } from "../../commands-prefs-wizard.js";
|
|
@@ -7,6 +8,8 @@ import { handleCmux } from "../../commands-cmux.js";
|
|
|
7
8
|
import { setSessionModelOverride } from "../../session-model-override.js";
|
|
8
9
|
import { projectRoot } from "../context.js";
|
|
9
10
|
import { formattedShortcutPair } from "../../shortcut-defs.js";
|
|
11
|
+
import { getVisualBriefOutputDir } from "../../../visual-brief/artifact-policy.js";
|
|
12
|
+
import { buildVisualBriefPrompt, parseVisualBriefArgs, VISUAL_BRIEF_USAGE } from "../../../visual-brief/prompts.js";
|
|
10
13
|
export function showHelp(ctx, args = "") {
|
|
11
14
|
const summaryLines = [
|
|
12
15
|
"GSD — Get Shit Done\n",
|
|
@@ -22,6 +25,7 @@ export function showHelp(ctx, args = "") {
|
|
|
22
25
|
` /gsd parallel watch Parallel monitor (${formattedShortcutPair("parallel")})`,
|
|
23
26
|
` /gsd notifications Notification history (${formattedShortcutPair("notifications")})`,
|
|
24
27
|
" /gsd visualize Interactive 10-tab TUI",
|
|
28
|
+
" /gsd brief <mode> Visual HTML brief (diagram, plan, diff, recap, table, slides)",
|
|
25
29
|
" /gsd queue Show queued/dispatched units",
|
|
26
30
|
"",
|
|
27
31
|
"COURSE CORRECTION",
|
|
@@ -61,6 +65,7 @@ export function showHelp(ctx, args = "") {
|
|
|
61
65
|
" /gsd new-project Bootstrap a new project (use --deep for staged project-level discovery)",
|
|
62
66
|
" /gsd quick Execute a quick task without full planning overhead",
|
|
63
67
|
" /gsd dispatch Dispatch a specific phase directly [research|plan|execute|complete|uat|replan]",
|
|
68
|
+
" /gsd verdict <v> Override milestone validation verdict [pass|needs-attention|needs-remediation] [--milestone Mxxx] [--rationale \"...\"]",
|
|
64
69
|
" /gsd parallel Parallel milestone orchestration [start|status|stop|pause|resume|merge|watch]",
|
|
65
70
|
" /gsd workflow Custom workflow lifecycle [new|run|list|validate|pause|resume]",
|
|
66
71
|
"",
|
|
@@ -69,6 +74,7 @@ export function showHelp(ctx, args = "") {
|
|
|
69
74
|
` /gsd parallel watch Open parallel worker monitor (${formattedShortcutPair("parallel")})`,
|
|
70
75
|
" /gsd widget Cycle status widget [full|small|min|off]",
|
|
71
76
|
" /gsd visualize Interactive 10-tab TUI (progress, timeline, deps, metrics, health, agent, changes, knowledge, captures, export)",
|
|
77
|
+
" /gsd brief <mode> Generate a visual HTML brief [diagram|plan|diff|recap|table|slides] [topic] [--slides]",
|
|
72
78
|
" /gsd queue Show queued/dispatched units and execution order",
|
|
73
79
|
" /gsd history View execution history [--cost] [--phase] [--model] [N]",
|
|
74
80
|
" /gsd changelog Show categorized release notes [version]",
|
|
@@ -182,6 +188,34 @@ export async function handleVisualize(ctx) {
|
|
|
182
188
|
ctx.ui.notify("Visualizer requires an interactive terminal. Use /gsd status for a text-based overview.", "warning");
|
|
183
189
|
}
|
|
184
190
|
}
|
|
191
|
+
export async function handleBrief(args, ctx, pi) {
|
|
192
|
+
const request = parseVisualBriefArgs(args);
|
|
193
|
+
if (!request) {
|
|
194
|
+
ctx.ui.notify(VISUAL_BRIEF_USAGE, "info");
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
if (!pi?.sendUserMessage) {
|
|
198
|
+
ctx.ui.notify("Visual brief generation is unavailable in this context.", "warning");
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
const outputDir = getVisualBriefOutputDir();
|
|
202
|
+
const version = resolveGsdVersion();
|
|
203
|
+
pi.sendUserMessage(buildVisualBriefPrompt(request, { outputDir, version }));
|
|
204
|
+
}
|
|
205
|
+
const briefRequire = createRequire(import.meta.url);
|
|
206
|
+
function resolveGsdVersion() {
|
|
207
|
+
const envVersion = process.env.GSD_VERSION?.trim();
|
|
208
|
+
if (envVersion)
|
|
209
|
+
return envVersion;
|
|
210
|
+
try {
|
|
211
|
+
const pkg = briefRequire("../../../../../../package.json");
|
|
212
|
+
const fromPkg = typeof pkg.version === "string" ? pkg.version.trim() : "";
|
|
213
|
+
return fromPkg || undefined;
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return undefined;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
185
219
|
export async function handleSetup(args, ctx, pi) {
|
|
186
220
|
const { detectProjectState, hasGlobalSetup } = await import("../../detection.js");
|
|
187
221
|
const { isOnboardingComplete, readOnboardingRecord } = await import("../../onboarding-state.js");
|
|
@@ -370,6 +404,10 @@ export async function handleCoreCommand(trimmed, ctx, pi) {
|
|
|
370
404
|
await handleVisualize(ctx);
|
|
371
405
|
return true;
|
|
372
406
|
}
|
|
407
|
+
if (trimmed === "brief" || trimmed.startsWith("brief ")) {
|
|
408
|
+
await handleBrief(trimmed.replace(/^brief\s*/, "").trim(), ctx, pi);
|
|
409
|
+
return true;
|
|
410
|
+
}
|
|
373
411
|
if (trimmed === "widget" || trimmed.startsWith("widget ")) {
|
|
374
412
|
const { cycleWidgetMode, setWidgetMode, getWidgetMode } = await import("../../auto-dashboard.js");
|
|
375
413
|
const arg = trimmed.replace(/^widget\s*/, "").trim();
|
|
@@ -14,6 +14,21 @@ import { handleSessionReport } from "../../commands-session-report.js";
|
|
|
14
14
|
import { handlePrBranch } from "../../commands-pr-branch.js";
|
|
15
15
|
import { currentDirectoryRoot, projectRoot } from "../context.js";
|
|
16
16
|
export async function handleOpsCommand(trimmed, ctx, pi) {
|
|
17
|
+
const directDispatchAlias = new Map([
|
|
18
|
+
["research-milestone", "research"],
|
|
19
|
+
["research-slice", "research"],
|
|
20
|
+
["plan-milestone", "plan"],
|
|
21
|
+
["plan-slice", "plan"],
|
|
22
|
+
["execute-task", "execute"],
|
|
23
|
+
["complete-slice", "complete"],
|
|
24
|
+
["validate-milestone", "uat"],
|
|
25
|
+
["complete-milestone", "complete"],
|
|
26
|
+
]);
|
|
27
|
+
const aliasPhase = directDispatchAlias.get(trimmed);
|
|
28
|
+
if (aliasPhase) {
|
|
29
|
+
await dispatchDirectPhase(ctx, pi, aliasPhase, projectRoot());
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
17
32
|
if (trimmed === "init") {
|
|
18
33
|
const { detectProjectState } = await import("../../detection.js");
|
|
19
34
|
const { handleReinit, showProjectInit } = await import("../../init-wizard.js");
|
|
@@ -183,6 +198,11 @@ Examples:
|
|
|
183
198
|
await dispatchDirectPhase(ctx, pi, phase, projectRoot());
|
|
184
199
|
return true;
|
|
185
200
|
}
|
|
201
|
+
if (trimmed === "verdict" || trimmed.startsWith("verdict ")) {
|
|
202
|
+
const { handleVerdict } = await import("../../commands-verdict.js");
|
|
203
|
+
await handleVerdict(trimmed.replace(/^verdict\s*/, "").trim(), ctx, projectRoot());
|
|
204
|
+
return true;
|
|
205
|
+
}
|
|
186
206
|
if (trimmed === "notifications" || trimmed.startsWith("notifications ")) {
|
|
187
207
|
const { handleNotificationsCommand } = await import("./notifications-handler.js");
|
|
188
208
|
await handleNotificationsCommand(trimmed.replace(/^notifications\s*/, "").trim(), ctx, pi);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { importExtensionModule } from "@gsd/pi-coding-agent";
|
|
2
|
+
import { VISUAL_BRIEF_MODES } from "../visual-brief/prompts.js";
|
|
2
3
|
const TOP_LEVEL_SUBCOMMANDS = [
|
|
3
4
|
{ cmd: "help", desc: "Categorized command reference with descriptions" },
|
|
4
5
|
{ cmd: "next", desc: "Explicit step mode (same as /gsd)" },
|
|
@@ -7,6 +8,7 @@ const TOP_LEVEL_SUBCOMMANDS = [
|
|
|
7
8
|
{ cmd: "pause", desc: "Pause auto-mode (preserves state, /gsd auto to resume)" },
|
|
8
9
|
{ cmd: "status", desc: "Progress dashboard" },
|
|
9
10
|
{ cmd: "visualize", desc: "Open workflow visualizer" },
|
|
11
|
+
{ cmd: "brief", desc: "Generate a visual HTML brief" },
|
|
10
12
|
{ cmd: "queue", desc: "Queue and reorder future milestones" },
|
|
11
13
|
{ cmd: "quick", desc: "Execute a quick task without full planning overhead" },
|
|
12
14
|
{ cmd: "discuss", desc: "Discuss architecture and decisions" },
|
|
@@ -75,6 +77,9 @@ function getGsdArgumentCompletions(prefix) {
|
|
|
75
77
|
{ cmd: "--dry-run", desc: "Preview next step without executing" },
|
|
76
78
|
], "next");
|
|
77
79
|
}
|
|
80
|
+
if (parts[0] === "brief" && parts.length <= 2) {
|
|
81
|
+
return filterStartsWith(partial, VISUAL_BRIEF_MODES.map((mode) => ({ cmd: mode.mode, desc: mode.description })), "brief");
|
|
82
|
+
}
|
|
78
83
|
if ((parts[0] === "new-project" || parts[0] === "new-milestone") && parts.length <= 2) {
|
|
79
84
|
return filterStartsWith(partial, [
|
|
80
85
|
{ cmd: "--deep", desc: "Enable deep planning mode (staged project-level discovery)" },
|
|
@@ -101,6 +101,8 @@ export async function handleDoctor(args, ctx, pi) {
|
|
|
101
101
|
const { jsonMode, dryRun, fixFlag, includeBuild, includeTests, mode, requestedScope } = parseDoctorArgs(args);
|
|
102
102
|
const scope = await selectDoctorScope(projectRoot(), requestedScope);
|
|
103
103
|
const effectiveScope = mode === "audit" ? requestedScope : scope;
|
|
104
|
+
const { ensureDbOpen } = await import("./bootstrap/dynamic-tools.js");
|
|
105
|
+
await ensureDbOpen(projectRoot());
|
|
104
106
|
const report = await runGSDDoctor(projectRoot(), {
|
|
105
107
|
fix: mode === "fix" || mode === "heal" || dryRun || fixFlag,
|
|
106
108
|
dryRun,
|
|
@@ -13,6 +13,10 @@ import { existsSync, readFileSync } from "node:fs";
|
|
|
13
13
|
import { join, resolve } from "node:path";
|
|
14
14
|
import { ensureProjectWorkflowMcpConfig } from "./mcp-project-config.js";
|
|
15
15
|
import { gsdHome } from "./gsd-home.js";
|
|
16
|
+
export function hasHostMcpTool(systemPrompt, serverName) {
|
|
17
|
+
const marker = `mcp__${serverName}__`;
|
|
18
|
+
return systemPrompt.includes(marker);
|
|
19
|
+
}
|
|
16
20
|
export function formatMcpInitResult(status, configPath, targetPath) {
|
|
17
21
|
const summary = status === "created"
|
|
18
22
|
? "Created project MCP config."
|
|
@@ -132,6 +136,7 @@ export async function handleMcpStatus(args, ctx) {
|
|
|
132
136
|
const trimmed = args.trim();
|
|
133
137
|
const lowered = trimmed.toLowerCase();
|
|
134
138
|
const configs = readMcpConfigs();
|
|
139
|
+
const systemPrompt = ctx.getSystemPrompt();
|
|
135
140
|
// /gsd mcp init [dir]
|
|
136
141
|
if (!lowered || lowered === "status") {
|
|
137
142
|
// handled below
|
|
@@ -175,6 +180,8 @@ export async function handleMcpStatus(args, ctx) {
|
|
|
175
180
|
catch {
|
|
176
181
|
// mcp-client may not expose status helpers — that's fine
|
|
177
182
|
}
|
|
183
|
+
if (!connected && !error && hasHostMcpTool(systemPrompt, serverName))
|
|
184
|
+
connected = true;
|
|
178
185
|
ctx.ui.notify(formatMcpServerDetail({
|
|
179
186
|
name: config.name,
|
|
180
187
|
transport: config.transport,
|
|
@@ -206,6 +213,8 @@ export async function handleMcpStatus(args, ctx) {
|
|
|
206
213
|
catch {
|
|
207
214
|
// Fall back to unknown state
|
|
208
215
|
}
|
|
216
|
+
if (!connected && !error && hasHostMcpTool(systemPrompt, config.name))
|
|
217
|
+
connected = true;
|
|
209
218
|
statuses.push({
|
|
210
219
|
name: config.name,
|
|
211
220
|
transport: config.transport,
|
|
@@ -571,10 +571,18 @@ async function configureModels(ctx, prefs) {
|
|
|
571
571
|
];
|
|
572
572
|
const models = prefs.models ?? {};
|
|
573
573
|
const availableModels = ctx.modelRegistry.getAvailable();
|
|
574
|
-
|
|
574
|
+
// Call getAllWithDiscovered as a method so `this` stays bound to the
|
|
575
|
+
// registry — invoking a detached reference loses `this` and the method's
|
|
576
|
+
// internal `this.models` access throws.
|
|
577
|
+
const registry = ctx.modelRegistry;
|
|
578
|
+
const availableProviders = new Set(availableModels.map((m) => m.provider));
|
|
579
|
+
const selectableModels = typeof registry.getAllWithDiscovered === "function"
|
|
580
|
+
? registry.getAllWithDiscovered().filter((m) => availableProviders.has(m.provider))
|
|
581
|
+
: availableModels;
|
|
582
|
+
if (selectableModels.length > 0) {
|
|
575
583
|
// Group models by provider, sorted alphabetically
|
|
576
584
|
const byProvider = new Map();
|
|
577
|
-
for (const m of
|
|
585
|
+
for (const m of selectableModels) {
|
|
578
586
|
let group = byProvider.get(m.provider);
|
|
579
587
|
if (!group) {
|
|
580
588
|
group = [];
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { loadFile } from "./files.js";
|
|
2
|
+
import { resolveMilestoneFile } from "./paths.js";
|
|
3
|
+
import { deriveState } from "./state.js";
|
|
4
|
+
import { executeValidateMilestone } from "./tools/workflow-tool-executors.js";
|
|
5
|
+
import { VALIDATION_VERDICTS, extractVerdict, isValidMilestoneVerdict, } from "./verdict-parser.js";
|
|
6
|
+
const USAGE = 'Usage: /gsd verdict <pass|needs-attention|needs-remediation> [--milestone Mxxx] [--rationale "..."]';
|
|
7
|
+
function tokenize(raw) {
|
|
8
|
+
const tokens = [];
|
|
9
|
+
const re = /"([^"]*)"|(\S+)/g;
|
|
10
|
+
let match;
|
|
11
|
+
while ((match = re.exec(raw)) !== null) {
|
|
12
|
+
tokens.push(match[1] ?? match[2]);
|
|
13
|
+
}
|
|
14
|
+
return tokens;
|
|
15
|
+
}
|
|
16
|
+
function parseArgs(raw) {
|
|
17
|
+
const tokens = tokenize(raw);
|
|
18
|
+
const out = {};
|
|
19
|
+
for (let i = 0; i < tokens.length; i++) {
|
|
20
|
+
const t = tokens[i];
|
|
21
|
+
if (t === "--milestone") {
|
|
22
|
+
const next = tokens[++i];
|
|
23
|
+
if (!next)
|
|
24
|
+
return { error: "--milestone requires a milestone ID" };
|
|
25
|
+
out.milestoneId = next;
|
|
26
|
+
}
|
|
27
|
+
else if (t === "--rationale") {
|
|
28
|
+
const next = tokens[++i];
|
|
29
|
+
if (next == null)
|
|
30
|
+
return { error: "--rationale requires a value" };
|
|
31
|
+
out.rationale = next;
|
|
32
|
+
}
|
|
33
|
+
else if (!out.verdict) {
|
|
34
|
+
if (!isValidMilestoneVerdict(t)) {
|
|
35
|
+
return {
|
|
36
|
+
error: `Invalid verdict "${t}". Must be one of: ${VALIDATION_VERDICTS.join(", ")}`,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
out.verdict = t;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
return { error: `Unexpected argument: ${t}` };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
function extractRemediationRound(content) {
|
|
48
|
+
const fm = content.match(/^---\n([\s\S]*?)\n---/);
|
|
49
|
+
if (!fm)
|
|
50
|
+
return 0;
|
|
51
|
+
const m = fm[1].match(/^remediation_round:\s*(\d+)/im);
|
|
52
|
+
return m ? Number.parseInt(m[1], 10) : 0;
|
|
53
|
+
}
|
|
54
|
+
function extractSection(content, heading) {
|
|
55
|
+
const escaped = heading.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
56
|
+
// Match section bodies bounded by the next "## " heading or end-of-string.
|
|
57
|
+
// Leading "\n" prefix lets a single pattern handle first-line headings too.
|
|
58
|
+
// No /m flag — we want `$` to mean end-of-string, not end-of-line.
|
|
59
|
+
const re = new RegExp(`\\n## ${escaped}\\s*\\n([\\s\\S]*?)(?=\\n## |$)`);
|
|
60
|
+
const m = ("\n" + content).match(re);
|
|
61
|
+
if (!m)
|
|
62
|
+
return undefined;
|
|
63
|
+
return m[1].replace(/\s+$/, "");
|
|
64
|
+
}
|
|
65
|
+
export function parseValidationFile(content) {
|
|
66
|
+
return {
|
|
67
|
+
verdict: extractVerdict(content),
|
|
68
|
+
remediationRound: extractRemediationRound(content),
|
|
69
|
+
successCriteriaChecklist: extractSection(content, "Success Criteria Checklist") ?? "",
|
|
70
|
+
sliceDeliveryAudit: extractSection(content, "Slice Delivery Audit") ?? "",
|
|
71
|
+
crossSliceIntegration: extractSection(content, "Cross-Slice Integration") ?? "",
|
|
72
|
+
requirementCoverage: extractSection(content, "Requirement Coverage") ?? "",
|
|
73
|
+
verificationClasses: extractSection(content, "Verification Class Compliance"),
|
|
74
|
+
verdictRationale: extractSection(content, "Verdict Rationale") ?? "",
|
|
75
|
+
remediationPlan: extractSection(content, "Remediation Plan"),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export async function handleVerdict(rawArgs, ctx, basePath) {
|
|
79
|
+
if (!rawArgs.trim()) {
|
|
80
|
+
ctx.ui.notify(USAGE, "warning");
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const parsed = parseArgs(rawArgs);
|
|
84
|
+
if ("error" in parsed) {
|
|
85
|
+
ctx.ui.notify(`${parsed.error}\n${USAGE}`, "warning");
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (!parsed.verdict) {
|
|
89
|
+
ctx.ui.notify(USAGE, "warning");
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
let milestoneId = parsed.milestoneId;
|
|
93
|
+
if (!milestoneId) {
|
|
94
|
+
const state = await deriveState(basePath);
|
|
95
|
+
if (!state.activeMilestone) {
|
|
96
|
+
ctx.ui.notify("No active milestone — pass --milestone Mxxx to target a specific milestone.", "warning");
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
milestoneId = state.activeMilestone.id;
|
|
100
|
+
}
|
|
101
|
+
const validationPath = resolveMilestoneFile(basePath, milestoneId, "VALIDATION");
|
|
102
|
+
if (!validationPath) {
|
|
103
|
+
ctx.ui.notify(`No VALIDATION file found for ${milestoneId}. Run gsd_validate_milestone first to produce one.`, "warning");
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const existing = await loadFile(validationPath);
|
|
107
|
+
if (!existing) {
|
|
108
|
+
ctx.ui.notify(`Could not read VALIDATION file for ${milestoneId} (${validationPath}).`, "warning");
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const current = parseValidationFile(existing);
|
|
112
|
+
if (parsed.verdict !== "pass" && !parsed.rationale) {
|
|
113
|
+
ctx.ui.notify(`--rationale is required when overriding to ${parsed.verdict}.`, "warning");
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const verdictRationale = parsed.rationale ?? "Manually overridden via /gsd verdict";
|
|
117
|
+
const result = await executeValidateMilestone({
|
|
118
|
+
milestoneId,
|
|
119
|
+
verdict: parsed.verdict,
|
|
120
|
+
remediationRound: current.remediationRound,
|
|
121
|
+
successCriteriaChecklist: current.successCriteriaChecklist,
|
|
122
|
+
sliceDeliveryAudit: current.sliceDeliveryAudit,
|
|
123
|
+
crossSliceIntegration: current.crossSliceIntegration,
|
|
124
|
+
requirementCoverage: current.requirementCoverage,
|
|
125
|
+
verificationClasses: current.verificationClasses,
|
|
126
|
+
verdictRationale,
|
|
127
|
+
remediationPlan: current.remediationPlan,
|
|
128
|
+
}, basePath);
|
|
129
|
+
if (result.isError) {
|
|
130
|
+
const msg = result.content[0]?.type === "text" ? result.content[0].text : "Unknown error";
|
|
131
|
+
ctx.ui.notify(msg, "error");
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const prevVerdict = current.verdict ?? "unknown";
|
|
135
|
+
ctx.ui.notify(`Milestone ${milestoneId} verdict: ${prevVerdict} -> ${parsed.verdict}`, "success");
|
|
136
|
+
if (parsed.verdict === "needs-remediation") {
|
|
137
|
+
ctx.ui.notify("Follow up with gsd_reassess_roadmap to add remediation slices, then re-run /gsd auto.", "info");
|
|
138
|
+
}
|
|
139
|
+
}
|
|
@@ -23,7 +23,9 @@
|
|
|
23
23
|
import { emitJournalEvent, queryJournal, } from "./journal.js";
|
|
24
24
|
import { readFileSync, unlinkSync, existsSync } from "node:fs";
|
|
25
25
|
import { join } from "node:path";
|
|
26
|
-
import { findStaleWorkerForProject, getAllAutoWorkers, } from "./db/auto-workers.js";
|
|
26
|
+
import { findStaleWorkerForProject, getAllAutoWorkers, markWorkerCrashed, markWorkerStopping, } from "./db/auto-workers.js";
|
|
27
|
+
import { forceReleaseLeasesForWorker } from "./db/milestone-leases.js";
|
|
28
|
+
import { markLatestActiveForWorkerCanceled } from "./db/unit-dispatches.js";
|
|
27
29
|
import { getRuntimeKv, setRuntimeKv, deleteRuntimeKv } from "./db/runtime-kv.js";
|
|
28
30
|
import { _getAdapter, isDbAvailable } from "./gsd-db.js";
|
|
29
31
|
import { gsdRoot, normalizeRealPath } from "./paths.js";
|
|
@@ -34,6 +36,16 @@ const SESSION_FILE_KV_KEY = "session_file";
|
|
|
34
36
|
function lockPath(basePath) {
|
|
35
37
|
return join(gsdRoot(basePath), effectiveLockFile());
|
|
36
38
|
}
|
|
39
|
+
function clearLegacyLockFile(basePath) {
|
|
40
|
+
try {
|
|
41
|
+
const p = lockPath(basePath);
|
|
42
|
+
if (existsSync(p))
|
|
43
|
+
unlinkSync(p);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// Best-effort.
|
|
47
|
+
}
|
|
48
|
+
}
|
|
37
49
|
function readLegacyLock(basePath) {
|
|
38
50
|
try {
|
|
39
51
|
const p = lockPath(basePath);
|
|
@@ -145,14 +157,21 @@ export function writeLock(basePath, unitType, unitId, sessionFile) {
|
|
|
145
157
|
catch {
|
|
146
158
|
// Best-effort — never throw from the lock writer.
|
|
147
159
|
}
|
|
148
|
-
if (!isDbAvailable()
|
|
160
|
+
if (!isDbAvailable())
|
|
149
161
|
return;
|
|
150
162
|
try {
|
|
151
163
|
const projectRoot = normalizeRealPath(basePath);
|
|
152
164
|
const worker = findActiveWorkerForCurrentProcess(projectRoot);
|
|
153
165
|
if (!worker)
|
|
154
166
|
return;
|
|
155
|
-
|
|
167
|
+
if (sessionFile) {
|
|
168
|
+
setRuntimeKv("worker", worker.worker_id, SESSION_FILE_KV_KEY, sessionFile);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
// Preliminary unit locks (before runUnit/newSession settles) must clear
|
|
172
|
+
// any prior pointer so crash recovery cannot ingest stale cross-unit context.
|
|
173
|
+
deleteRuntimeKv("worker", worker.worker_id, SESSION_FILE_KV_KEY);
|
|
174
|
+
}
|
|
156
175
|
}
|
|
157
176
|
catch {
|
|
158
177
|
// Best-effort — never throw from the lock writer.
|
|
@@ -166,21 +185,47 @@ export function writeLock(basePath, unitType, unitId, sessionFile) {
|
|
|
166
185
|
* stale session-file pointer.
|
|
167
186
|
*/
|
|
168
187
|
export function clearLock(basePath) {
|
|
188
|
+
clearLegacyLockFile(basePath);
|
|
189
|
+
if (!isDbAvailable())
|
|
190
|
+
return;
|
|
169
191
|
try {
|
|
170
|
-
const
|
|
171
|
-
|
|
172
|
-
|
|
192
|
+
const projectRoot = normalizeRealPath(basePath);
|
|
193
|
+
const staleWorker = findStaleWorkerForProject(projectRoot);
|
|
194
|
+
if (staleWorker) {
|
|
195
|
+
markWorkerCrashed(staleWorker.worker_id);
|
|
196
|
+
forceReleaseLeasesForWorker(staleWorker.worker_id);
|
|
197
|
+
deleteRuntimeKv("worker", staleWorker.worker_id, SESSION_FILE_KV_KEY);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
const worker = findActiveWorkerForCurrentProcess(projectRoot);
|
|
201
|
+
if (worker)
|
|
202
|
+
deleteRuntimeKv("worker", worker.worker_id, SESSION_FILE_KV_KEY);
|
|
203
|
+
const stale = findStaleWorkerForProject(projectRoot);
|
|
204
|
+
if (stale) {
|
|
205
|
+
markWorkerStopping(stale.worker_id);
|
|
206
|
+
deleteRuntimeKv("worker", stale.worker_id, SESSION_FILE_KV_KEY);
|
|
207
|
+
}
|
|
173
208
|
}
|
|
174
209
|
catch {
|
|
175
210
|
// Best-effort.
|
|
176
211
|
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Clear a stale DB-backed worker lock after readCrashLock/findStaleWorkerForProject
|
|
215
|
+
* has identified a dead worker. Unlike clearLock(), this targets the stale
|
|
216
|
+
* worker row instead of the current process's active worker.
|
|
217
|
+
*/
|
|
218
|
+
export function clearStaleWorkerLock(basePath) {
|
|
219
|
+
clearLegacyLockFile(basePath);
|
|
177
220
|
if (!isDbAvailable())
|
|
178
221
|
return;
|
|
179
222
|
try {
|
|
180
223
|
const projectRoot = normalizeRealPath(basePath);
|
|
181
|
-
const worker =
|
|
224
|
+
const worker = findStaleWorkerForProject(projectRoot);
|
|
182
225
|
if (!worker)
|
|
183
226
|
return;
|
|
227
|
+
markLatestActiveForWorkerCanceled(worker.worker_id, "crash-recovered");
|
|
228
|
+
markWorkerCrashed(worker.worker_id);
|
|
184
229
|
deleteRuntimeKv("worker", worker.worker_id, SESSION_FILE_KV_KEY);
|
|
185
230
|
}
|
|
186
231
|
catch {
|
|
@@ -193,6 +193,30 @@ export function releaseMilestoneLease(workerId, milestoneId, fencingToken) {
|
|
|
193
193
|
return changes === 1;
|
|
194
194
|
});
|
|
195
195
|
}
|
|
196
|
+
/**
|
|
197
|
+
* Force-release all held leases for a worker.
|
|
198
|
+
*
|
|
199
|
+
* Used by crash recovery once PID liveness has confirmed the worker is dead.
|
|
200
|
+
* No fencing token is required because this path is cleanup-only for a
|
|
201
|
+
* non-running process.
|
|
202
|
+
*/
|
|
203
|
+
export function forceReleaseLeasesForWorker(workerId) {
|
|
204
|
+
if (!isDbAvailable())
|
|
205
|
+
return 0;
|
|
206
|
+
const db = _getAdapter();
|
|
207
|
+
let changes = 0;
|
|
208
|
+
transaction(() => {
|
|
209
|
+
const result = db.prepare(`UPDATE milestone_leases
|
|
210
|
+
SET status = 'released'
|
|
211
|
+
WHERE worker_id = :worker_id
|
|
212
|
+
AND status = 'held'`).run({ ":worker_id": workerId });
|
|
213
|
+
changes =
|
|
214
|
+
typeof result.changes === "number"
|
|
215
|
+
? result.changes
|
|
216
|
+
: 0;
|
|
217
|
+
});
|
|
218
|
+
return changes;
|
|
219
|
+
}
|
|
196
220
|
/**
|
|
197
221
|
* Read current lease row for diagnostics. Returns null if no row exists.
|
|
198
222
|
*/
|
|
@@ -391,16 +391,17 @@ export function getRecentUnitKeysForProjectRoot(projectRootRealpath, limit = 20)
|
|
|
391
391
|
if (!isDbAvailable())
|
|
392
392
|
return [];
|
|
393
393
|
const db = _getAdapter();
|
|
394
|
-
const rows = db.prepare(`SELECT ud.unit_id
|
|
394
|
+
const rows = db.prepare(`SELECT ud.unit_type, ud.unit_id
|
|
395
395
|
FROM unit_dispatches ud
|
|
396
396
|
INNER JOIN workers w ON w.worker_id = ud.worker_id
|
|
397
397
|
WHERE w.project_root_realpath = :project_root_realpath
|
|
398
|
+
AND w.status != 'crashed'
|
|
398
399
|
ORDER BY ud.started_at DESC, ud.id DESC
|
|
399
400
|
LIMIT :limit`).all({
|
|
400
401
|
":project_root_realpath": projectRootRealpath,
|
|
401
402
|
":limit": limit,
|
|
402
403
|
});
|
|
403
|
-
return rows.reverse().map((r) => ({ key: r.unit_id }));
|
|
404
|
+
return rows.reverse().map((r) => ({ key: `${r.unit_type}/${r.unit_id}` }));
|
|
404
405
|
}
|
|
405
406
|
/**
|
|
406
407
|
* Fetch dispatches for a milestone filtered by status. Useful for janitors
|
|
@@ -149,6 +149,7 @@ export function createBaseSchemaObjects(db, hooks) {
|
|
|
149
149
|
proof_level TEXT NOT NULL DEFAULT '',
|
|
150
150
|
integration_closure TEXT NOT NULL DEFAULT '',
|
|
151
151
|
observability_impact TEXT NOT NULL DEFAULT '',
|
|
152
|
+
target_repositories TEXT NOT NULL DEFAULT '[]',
|
|
152
153
|
sequence INTEGER DEFAULT 0,
|
|
153
154
|
replan_triggered_at TEXT DEFAULT NULL,
|
|
154
155
|
is_sketch INTEGER NOT NULL DEFAULT 0,
|
|
@@ -188,6 +189,7 @@ export function createBaseSchemaObjects(db, hooks) {
|
|
|
188
189
|
expected_output TEXT NOT NULL DEFAULT '[]',
|
|
189
190
|
observability_impact TEXT NOT NULL DEFAULT '',
|
|
190
191
|
full_plan_md TEXT NOT NULL DEFAULT '',
|
|
192
|
+
target_repositories TEXT NOT NULL DEFAULT '[]',
|
|
191
193
|
sequence INTEGER DEFAULT 0,
|
|
192
194
|
PRIMARY KEY (milestone_id, slice_id, id),
|
|
193
195
|
FOREIGN KEY (milestone_id, slice_id) REFERENCES slices(milestone_id, id)
|
|
@@ -385,6 +385,10 @@ export function applyMigrationV27ArtifactHash(db) {
|
|
|
385
385
|
export function applyMigrationV28MemoryLastHitAt(db) {
|
|
386
386
|
ensureColumn(db, "memories", "last_hit_at", "ALTER TABLE memories ADD COLUMN last_hit_at TEXT DEFAULT NULL");
|
|
387
387
|
}
|
|
388
|
+
export function applyMigrationV29RepositoryTargets(db) {
|
|
389
|
+
ensureColumn(db, "slices", "target_repositories", "ALTER TABLE slices ADD COLUMN target_repositories TEXT NOT NULL DEFAULT '[]'");
|
|
390
|
+
ensureColumn(db, "tasks", "target_repositories", "ALTER TABLE tasks ADD COLUMN target_repositories TEXT NOT NULL DEFAULT '[]'");
|
|
391
|
+
}
|
|
388
392
|
export function applyMigrationV22QualityGateRepair(db, hooks) {
|
|
389
393
|
const qgInfo = db.prepare("PRAGMA table_info(quality_gates)").all();
|
|
390
394
|
const taskIdCol = qgInfo.find((r) => r["name"] === "task_id");
|
|
@@ -48,6 +48,7 @@ export function rowToSlice(row) {
|
|
|
48
48
|
replan_triggered_at: row["replan_triggered_at"] ?? null,
|
|
49
49
|
is_sketch: row["is_sketch"] ?? 0,
|
|
50
50
|
sketch_scope: row["sketch_scope"] ?? "",
|
|
51
|
+
target_repositories: parseTaskArrayColumn(row["target_repositories"]),
|
|
51
52
|
};
|
|
52
53
|
}
|
|
53
54
|
export function rowToTask(row) {
|
|
@@ -82,5 +83,6 @@ export function rowToTask(row) {
|
|
|
82
83
|
escalation_awaiting_review: row["escalation_awaiting_review"] ?? 0,
|
|
83
84
|
escalation_artifact_path: row["escalation_artifact_path"] ?? null,
|
|
84
85
|
escalation_override_applied_at: row["escalation_override_applied_at"] ?? null,
|
|
86
|
+
target_repositories: parseTaskArrayColumn(row["target_repositories"]),
|
|
85
87
|
};
|
|
86
88
|
}
|
|
@@ -4,7 +4,7 @@ import { findMilestoneIds } from "./guided-flow.js";
|
|
|
4
4
|
import { parseUnitId } from "./unit-id.js";
|
|
5
5
|
import { isDbAvailable, getMilestoneSlices, getMilestone } from "./gsd-db.js";
|
|
6
6
|
import { parseRoadmap } from "./parsers-legacy.js";
|
|
7
|
-
import { isClosedStatus } from "./status-guards.js";
|
|
7
|
+
import { isClosedStatus, isSkippedForDispatch } from "./status-guards.js";
|
|
8
8
|
import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
|
|
9
9
|
import { readFileSync } from "node:fs";
|
|
10
10
|
const SLICE_DISPATCH_TYPES = new Set([
|
|
@@ -14,6 +14,50 @@ const SLICE_DISPATCH_TYPES = new Set([
|
|
|
14
14
|
"execute-task",
|
|
15
15
|
"complete-slice",
|
|
16
16
|
]);
|
|
17
|
+
const CONSECUTIVE_SAME_UNIT_CAP_TYPES = new Set([
|
|
18
|
+
"complete-milestone",
|
|
19
|
+
"validate-milestone",
|
|
20
|
+
"research-slice",
|
|
21
|
+
]);
|
|
22
|
+
const CONSECUTIVE_SAME_UNIT_CAP = 2;
|
|
23
|
+
/**
|
|
24
|
+
* Prevent repeated dispatches of the same unit within the same phase.
|
|
25
|
+
*
|
|
26
|
+
* Applies only to unit types in `CONSECUTIVE_SAME_UNIT_CAP_TYPES`. The first
|
|
27
|
+
* dispatch for a unit/phase pair starts a counter, unit or phase changes reset
|
|
28
|
+
* tracking, and dispatch is blocked once the counter reaches
|
|
29
|
+
* `CONSECUTIVE_SAME_UNIT_CAP`.
|
|
30
|
+
*
|
|
31
|
+
* Side effects: mutates `state.consecutiveDispatchCount`,
|
|
32
|
+
* `state.lastDispatchedKey`, and `state.lastDispatchPhase`.
|
|
33
|
+
*
|
|
34
|
+
* Returns `null` when dispatch is allowed, or a blocker message (including
|
|
35
|
+
* guidance to run `/gsd resume`) when the cap is reached.
|
|
36
|
+
*/
|
|
37
|
+
export function getConsecutiveDispatchBlocker(state, phase, unitType, unitId) {
|
|
38
|
+
if (!CONSECUTIVE_SAME_UNIT_CAP_TYPES.has(unitType))
|
|
39
|
+
return null;
|
|
40
|
+
if (!state.consecutiveDispatchCount)
|
|
41
|
+
state.consecutiveDispatchCount = new Map();
|
|
42
|
+
const key = `${unitType}:${unitId}`;
|
|
43
|
+
const phaseChanged = state.lastDispatchPhase !== phase;
|
|
44
|
+
const switchedUnit = state.lastDispatchedKey !== key;
|
|
45
|
+
if (phaseChanged || switchedUnit) {
|
|
46
|
+
state.consecutiveDispatchCount.clear();
|
|
47
|
+
state.consecutiveDispatchCount.set(key, 1);
|
|
48
|
+
state.lastDispatchedKey = key;
|
|
49
|
+
state.lastDispatchPhase = phase;
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
const count = state.consecutiveDispatchCount.get(key) ?? 0;
|
|
53
|
+
if (count >= CONSECUTIVE_SAME_UNIT_CAP) {
|
|
54
|
+
return `Cannot dispatch ${unitType} ${unitId}: dispatched ${count} consecutive times; same-unit repeat cap reached. Resolve via /gsd resume.`;
|
|
55
|
+
}
|
|
56
|
+
state.consecutiveDispatchCount.set(key, count + 1);
|
|
57
|
+
state.lastDispatchedKey = key;
|
|
58
|
+
state.lastDispatchPhase = phase;
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
17
61
|
export function getPriorSliceCompletionBlocker(base, _mainBranch, unitType, unitId) {
|
|
18
62
|
if (!SLICE_DISPATCH_TYPES.has(unitType))
|
|
19
63
|
return null;
|
|
@@ -49,7 +93,7 @@ export function getPriorSliceCompletionBlocker(base, _mainBranch, unitType, unit
|
|
|
49
93
|
// DB-backed projects must not treat SUMMARY.md as authoritative.
|
|
50
94
|
if (isDbAvailable()) {
|
|
51
95
|
const milestoneRow = getMilestone(mid);
|
|
52
|
-
if (milestoneRow &&
|
|
96
|
+
if (milestoneRow && isSkippedForDispatch(milestoneRow.status))
|
|
53
97
|
continue;
|
|
54
98
|
}
|
|
55
99
|
else {
|
|
@@ -147,6 +147,14 @@ Setting `prefer_skills: []` does **not** disable skill discovery — it just mea
|
|
|
147
147
|
|
|
148
148
|
- `unique_milestone_ids`: boolean — when `true`, generates milestone IDs in `M{seq}-{rand6}` format (e.g. `M001-eh88as`) instead of plain sequential `M001`. Prevents ID collisions in team workflows where multiple contributors create milestones concurrently. Both formats coexist — existing `M001`-style milestones remain valid. Default: `false`.
|
|
149
149
|
|
|
150
|
+
- `workspace`: optional parent-workspace repository registry. Keys:
|
|
151
|
+
- `mode`: `"project"` or `"parent"` — registry mode for repository lookup. Default: `"project"`.
|
|
152
|
+
- `repositories`: object keyed by repository id. A default `"project"` repository pointing at the project root is always available, even when not listed here (and can be overridden by explicitly defining `"project"`). Each repository supports:
|
|
153
|
+
- `path`: string — repository root path relative to project root.
|
|
154
|
+
- `role`: string — optional human label for prompts/reporting.
|
|
155
|
+
- `verification`: string[] — optional default verification commands.
|
|
156
|
+
- `commit_policy`: `"auto"` or `"skip"` — optional turn-commit policy for auto-mode commit actions. Defaults to `"auto"` when omitted. `"skip"` suppresses commit execution for that target repo.
|
|
157
|
+
|
|
150
158
|
- `budget_ceiling`: number — maximum dollar amount to spend on auto-mode. When reached, behavior is controlled by `budget_enforcement`. Default: no limit.
|
|
151
159
|
|
|
152
160
|
- `budget_enforcement`: `"warn"`, `"pause"`, or `"halt"` — action taken when `budget_ceiling` is reached.
|