gsd-pi 2.82.0 → 3.0.0-dev.8b8d129d7
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 +125 -32
- package/dist/cli.js +20 -9
- 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/browser-tools/tools/screenshot.js +1 -0
- package/dist/resources/extensions/browser-tools/tools/zoom.js +1 -0
- 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 +124 -6
- package/dist/resources/extensions/gsd/auto/phases.js +106 -38
- package/dist/resources/extensions/gsd/auto/session.js +6 -0
- 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 +20 -19
- 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 +47 -13
- package/dist/resources/extensions/gsd/auto-recovery.js +79 -14
- package/dist/resources/extensions/gsd/auto-start.js +87 -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 +216 -81
- 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 +10 -4
- package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
- 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 +39 -1
- 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 +17 -2
- package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +7 -2
- package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
- package/dist/resources/extensions/gsd/context-store.js +112 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +43 -5
- 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/db-writer.js +150 -84
- package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -1
- package/dist/resources/extensions/gsd/doctor-git-checks.js +87 -7
- 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 +8 -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/knowledge-backfill.js +144 -0
- package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
- package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
- package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +16 -9
- package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
- package/dist/resources/extensions/gsd/md-importer.js +1 -1
- package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
- package/dist/resources/extensions/gsd/migrate/command.js +5 -0
- package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
- package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
- package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
- package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
- 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/prompts/system.md +2 -2
- package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
- 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/knowledge.md +2 -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-manifest.js +36 -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 +54 -10
- package/dist/resources/extensions/gsd/worktree-manager.js +1 -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 +9 -9
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- 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/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +5 -8
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -8
- 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 +9 -9
- package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
- package/dist/web/standalone/.next/server/chunks/63.js +3 -3
- package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
- 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/middleware.js +2 -2
- 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/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.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/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/package.json +6 -5
- 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 +14 -3
- 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-parity.test.ts +244 -0
- 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-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/index.d.ts +2 -2
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +1 -1
- package/packages/pi-ai/dist/index.js.map +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/dist/providers/transform-messages.d.ts +11 -0
- package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
- package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/src/index.ts +7 -2
- 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/src/providers/transform-messages.ts +24 -0
- 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/core/system-prompt.js +4 -4
- package/packages/pi-coding-agent/dist/core/system-prompt.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/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/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
- 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/core/system-prompt.ts +4 -4
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
- 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/src/tests/system-prompt-file-safety.test.ts +22 -0
- 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 +108 -24
- 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 +111 -24
- 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/browser-tools/tools/screenshot.ts +1 -0
- package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
- 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 +62 -16
- 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 +129 -6
- package/src/resources/extensions/gsd/auto/phases.ts +129 -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/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 +21 -19
- 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 +47 -16
- package/src/resources/extensions/gsd/auto-recovery.ts +83 -11
- package/src/resources/extensions/gsd/auto-start.ts +94 -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 +217 -70
- 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 +11 -4
- package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
- 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 +42 -1
- 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 +21 -2
- package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +8 -3
- package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
- package/src/resources/extensions/gsd/context-store.ts +120 -1
- package/src/resources/extensions/gsd/crash-recovery.ts +44 -4
- 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/db-writer.ts +167 -84
- package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -1
- package/src/resources/extensions/gsd/doctor-git-checks.ts +89 -7
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
- package/src/resources/extensions/gsd/doctor-types.ts +3 -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 +7 -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/knowledge-backfill.ts +164 -0
- package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
- package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
- package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +16 -9
- package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
- package/src/resources/extensions/gsd/md-importer.ts +1 -1
- package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
- package/src/resources/extensions/gsd/migrate/command.ts +5 -0
- package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
- package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
- package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
- package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
- 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/prompts/system.md +2 -2
- package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
- 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/knowledge.md +2 -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-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 +375 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +578 -8
- 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-runtime-state.test.ts +4 -4
- 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/browser-tools-compatibility-declarations.test.ts +62 -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/context-store-decisions-from-memories.test.ts +312 -0
- package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +86 -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/db-writer.test.ts +13 -8
- package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
- package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -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 +66 -0
- 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/freeform-decisions.test.ts +8 -4
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
- 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-git.test.ts +44 -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/integration-lifecycle.test.ts +13 -5
- package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
- 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/knowledge-backfill-projection.test.ts +323 -0
- package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
- package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -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/memory-consolidation-scanner.test.ts +316 -0
- package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -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-sketch-render.test.ts +157 -0
- 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 +70 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -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/provider-switch-observer.test.ts +252 -0
- 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-start-footer.test.ts +16 -4
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +10 -0
- 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 +53 -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-manifest.test.ts +128 -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 +25 -0
- package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -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-manifest.ts +51 -18
- 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-logger.ts +4 -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 +61 -10
- package/src/resources/extensions/gsd/worktree-manager.ts +1 -1
- 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-9ecfd95f343793f0.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.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/{S44UQTFCUdA44dkjfYt6S → _kljR-_Miq_YV1IW0wpRO}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → _kljR-_Miq_YV1IW0wpRO}/_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]",
|
|
@@ -90,7 +96,7 @@ export function showHelp(ctx, args = "") {
|
|
|
90
96
|
" /gsd unpark [id] Reactivate a parked milestone",
|
|
91
97
|
"",
|
|
92
98
|
"PROJECT KNOWLEDGE",
|
|
93
|
-
" /gsd knowledge <type> <text> Add rule
|
|
99
|
+
" /gsd knowledge <type> <text> Add a rule to KNOWLEDGE.md or capture a pattern/lesson to memories",
|
|
94
100
|
" /gsd codebase [generate|update|stats] Manage the CODEBASE.md cache used in prompt context",
|
|
95
101
|
"",
|
|
96
102
|
"SHIPPING & BACKLOG",
|
|
@@ -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,
|
|
@@ -303,8 +305,21 @@ export async function handleKnowledge(args, ctx) {
|
|
|
303
305
|
const scope = state.activeMilestone?.id
|
|
304
306
|
? `${state.activeMilestone.id}${state.activeSlice ? `/${state.activeSlice.id}` : ""}`
|
|
305
307
|
: "global";
|
|
306
|
-
|
|
307
|
-
|
|
308
|
+
// ADR-013 Stage 2c: Patterns and Lessons land in the memories table; the
|
|
309
|
+
// next session-start projection render emits them back into KNOWLEDGE.md.
|
|
310
|
+
// Rules stay file-canonical per ADR-013 line 39 — Rules are not migrated.
|
|
311
|
+
if (type === "rule") {
|
|
312
|
+
await appendKnowledge(basePath, type, entryText, scope);
|
|
313
|
+
ctx.ui.notify(`Added rule to KNOWLEDGE.md: "${entryText}"`, "success");
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
const { captureKnowledgeEntry } = await import("./knowledge-capture.js");
|
|
317
|
+
const { id, written } = captureKnowledgeEntry(basePath, type, entryText, scope);
|
|
318
|
+
if (!written) {
|
|
319
|
+
ctx.ui.notify(`Could not persist ${type} — see logs for details.`, "error");
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
ctx.ui.notify(`Captured ${type} ${id} to memories; KNOWLEDGE.md will render it on next session start.`, "success");
|
|
308
323
|
}
|
|
309
324
|
export async function handleRunHook(args, ctx, pi) {
|
|
310
325
|
const parts = args.trim().split(/\s+/);
|
|
@@ -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,15 @@ async function configureModels(ctx, prefs) {
|
|
|
571
571
|
];
|
|
572
572
|
const models = prefs.models ?? {};
|
|
573
573
|
const availableModels = ctx.modelRegistry.getAvailable();
|
|
574
|
-
|
|
574
|
+
const getAllWithDiscovered = ctx.modelRegistry.getAllWithDiscovered;
|
|
575
|
+
const availableProviders = new Set(availableModels.map((m) => m.provider));
|
|
576
|
+
const selectableModels = typeof getAllWithDiscovered === "function"
|
|
577
|
+
? getAllWithDiscovered().filter((m) => availableProviders.has(m.provider))
|
|
578
|
+
: availableModels;
|
|
579
|
+
if (selectableModels.length > 0) {
|
|
575
580
|
// Group models by provider, sorted alphabetically
|
|
576
581
|
const byProvider = new Map();
|
|
577
|
-
for (const m of
|
|
582
|
+
for (const m of selectableModels) {
|
|
578
583
|
let group = byProvider.get(m.provider);
|
|
579
584
|
if (!group) {
|
|
580
585
|
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
|
+
}
|
|
@@ -47,6 +47,118 @@ export function queryDecisions(opts) {
|
|
|
47
47
|
return [];
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Internal: shared core for the two memory-sourced decision queries. Reads
|
|
52
|
+
* memory rows tagged with `sourceDecisionId` and reconstructs `Decision[]`
|
|
53
|
+
* from their `structured_fields` JSON.
|
|
54
|
+
*
|
|
55
|
+
* @param includeSuperseded — when false, drops rows whose
|
|
56
|
+
* `structured_fields.superseded_by` is non-null. The supersedes-chain is
|
|
57
|
+
* captured by the backfill (`memory-backfill.ts`) and kept in sync by
|
|
58
|
+
* the backfill's drift auto-heal pass.
|
|
59
|
+
*/
|
|
60
|
+
function readDecisionsFromMemories(opts, includeSuperseded) {
|
|
61
|
+
if (!isDbAvailable())
|
|
62
|
+
return [];
|
|
63
|
+
const adapter = _getAdapter();
|
|
64
|
+
if (!adapter)
|
|
65
|
+
return [];
|
|
66
|
+
try {
|
|
67
|
+
const clauses = [
|
|
68
|
+
"category = 'architecture'",
|
|
69
|
+
"structured_fields LIKE '%\"sourceDecisionId\":\"%'",
|
|
70
|
+
];
|
|
71
|
+
const params = {};
|
|
72
|
+
if (opts?.milestoneId) {
|
|
73
|
+
// when_context is a free-text JSON value; substring match preserves the
|
|
74
|
+
// semantics of `when_context LIKE '%milestoneId%'` on the legacy table.
|
|
75
|
+
clauses.push("json_extract(structured_fields, '$.when_context') LIKE :milestone_pattern");
|
|
76
|
+
params[':milestone_pattern'] = `%${opts.milestoneId}%`;
|
|
77
|
+
}
|
|
78
|
+
if (opts?.scope) {
|
|
79
|
+
// Stage 1 used `json_extract` in main (post-merge); preserve that
|
|
80
|
+
// style here. Exact equality on the JSON value avoids the prefix
|
|
81
|
+
// collision risk LIKE patterns had (scope=M001 vs scope=M001-S01).
|
|
82
|
+
clauses.push("json_extract(structured_fields, '$.scope') = :scope");
|
|
83
|
+
params[':scope'] = opts.scope;
|
|
84
|
+
}
|
|
85
|
+
const sql = `SELECT seq, structured_fields FROM memories WHERE ${clauses.join(' AND ')} ORDER BY seq`;
|
|
86
|
+
const rows = adapter.prepare(sql).all(params);
|
|
87
|
+
const decisions = [];
|
|
88
|
+
for (const row of rows) {
|
|
89
|
+
const seq = row['seq'];
|
|
90
|
+
const sfRaw = row['structured_fields'];
|
|
91
|
+
if (!sfRaw)
|
|
92
|
+
continue;
|
|
93
|
+
let sf;
|
|
94
|
+
try {
|
|
95
|
+
sf = JSON.parse(sfRaw);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
const sourceId = sf['sourceDecisionId'];
|
|
101
|
+
if (typeof sourceId !== 'string' || sourceId.length === 0)
|
|
102
|
+
continue;
|
|
103
|
+
// Decision-level superseded status lives in structured_fields.superseded_by
|
|
104
|
+
// (written by mirrorDecisionToMemory / memory-backfill.ts). The top-level
|
|
105
|
+
// memories.superseded_by column is intentionally never set for decision mirrors,
|
|
106
|
+
// so active-only filtering must be done here in the JS loop.
|
|
107
|
+
const supersededBy = typeof sf['superseded_by'] === 'string' ? sf['superseded_by'] : null;
|
|
108
|
+
if (!includeSuperseded && supersededBy)
|
|
109
|
+
continue;
|
|
110
|
+
decisions.push({
|
|
111
|
+
seq,
|
|
112
|
+
id: sourceId,
|
|
113
|
+
when_context: typeof sf['when_context'] === 'string' ? sf['when_context'] : '',
|
|
114
|
+
scope: typeof sf['scope'] === 'string' ? sf['scope'] : '',
|
|
115
|
+
decision: typeof sf['decision'] === 'string' ? sf['decision'] : '',
|
|
116
|
+
choice: typeof sf['choice'] === 'string' ? sf['choice'] : '',
|
|
117
|
+
rationale: typeof sf['rationale'] === 'string' ? sf['rationale'] : '',
|
|
118
|
+
revisable: typeof sf['revisable'] === 'string' ? sf['revisable'] : '',
|
|
119
|
+
made_by: (typeof sf['made_by'] === 'string' ? sf['made_by'] : 'agent'),
|
|
120
|
+
superseded_by: supersededBy,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
return decisions;
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* ADR-013 Phase 6 cutover (Stage 1): read **active** decisions from the
|
|
131
|
+
* `memories` table instead of the legacy `decisions` table. Returns the
|
|
132
|
+
* same `Decision[]` shape as `queryDecisions` so downstream formatters
|
|
133
|
+
* work unchanged.
|
|
134
|
+
*
|
|
135
|
+
* Filter semantics match `queryDecisions` exactly:
|
|
136
|
+
* - active only (skips rows where `structured_fields.superseded_by` is set)
|
|
137
|
+
* - `milestoneId`: substring match on `structured_fields.when_context`
|
|
138
|
+
* - `scope`: exact match on `structured_fields.scope`
|
|
139
|
+
*
|
|
140
|
+
* Used by the prompt-inline path (`inlineDecisionsFromDb` in
|
|
141
|
+
* `auto-prompts.ts`). For the projection regen (which renders superseded
|
|
142
|
+
* rows too), see `getAllDecisionsFromMemories`.
|
|
143
|
+
*/
|
|
144
|
+
export function queryDecisionsFromMemories(opts) {
|
|
145
|
+
return readDecisionsFromMemories(opts, /* includeSuperseded */ false);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* ADR-013 Phase 6 cutover (Stage 2a): read **all** decisions (active +
|
|
149
|
+
* superseded) from the `memories` table. Used by the DECISIONS.md
|
|
150
|
+
* projection regen in `saveDecisionToDb`, which must render the full
|
|
151
|
+
* supersedes-chain for the canonical register format.
|
|
152
|
+
*
|
|
153
|
+
* Equivalent to `SELECT * FROM decisions ORDER BY seq` over the legacy
|
|
154
|
+
* table — but sourced from memories so the legacy table can be retired
|
|
155
|
+
* in Stage 3. Includes `superseded_by` reconstructed from
|
|
156
|
+
* `structured_fields.superseded_by` (populated by the backfill's drift
|
|
157
|
+
* auto-heal pass).
|
|
158
|
+
*/
|
|
159
|
+
export function getAllDecisionsFromMemories() {
|
|
160
|
+
return readDecisionsFromMemories(undefined, /* includeSuperseded */ true);
|
|
161
|
+
}
|
|
50
162
|
/**
|
|
51
163
|
* Query active (non-superseded) requirements with optional filters.
|
|
52
164
|
* - milestoneId: combined with sliceId for precise filtering (e.g. %M005/S01%)
|
|
@@ -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);
|
|
@@ -166,21 +178,47 @@ export function writeLock(basePath, unitType, unitId, sessionFile) {
|
|
|
166
178
|
* stale session-file pointer.
|
|
167
179
|
*/
|
|
168
180
|
export function clearLock(basePath) {
|
|
181
|
+
clearLegacyLockFile(basePath);
|
|
182
|
+
if (!isDbAvailable())
|
|
183
|
+
return;
|
|
169
184
|
try {
|
|
170
|
-
const
|
|
171
|
-
|
|
172
|
-
|
|
185
|
+
const projectRoot = normalizeRealPath(basePath);
|
|
186
|
+
const staleWorker = findStaleWorkerForProject(projectRoot);
|
|
187
|
+
if (staleWorker) {
|
|
188
|
+
markWorkerCrashed(staleWorker.worker_id);
|
|
189
|
+
forceReleaseLeasesForWorker(staleWorker.worker_id);
|
|
190
|
+
deleteRuntimeKv("worker", staleWorker.worker_id, SESSION_FILE_KV_KEY);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const worker = findActiveWorkerForCurrentProcess(projectRoot);
|
|
194
|
+
if (worker)
|
|
195
|
+
deleteRuntimeKv("worker", worker.worker_id, SESSION_FILE_KV_KEY);
|
|
196
|
+
const stale = findStaleWorkerForProject(projectRoot);
|
|
197
|
+
if (stale) {
|
|
198
|
+
markWorkerStopping(stale.worker_id);
|
|
199
|
+
deleteRuntimeKv("worker", stale.worker_id, SESSION_FILE_KV_KEY);
|
|
200
|
+
}
|
|
173
201
|
}
|
|
174
202
|
catch {
|
|
175
203
|
// Best-effort.
|
|
176
204
|
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Clear a stale DB-backed worker lock after readCrashLock/findStaleWorkerForProject
|
|
208
|
+
* has identified a dead worker. Unlike clearLock(), this targets the stale
|
|
209
|
+
* worker row instead of the current process's active worker.
|
|
210
|
+
*/
|
|
211
|
+
export function clearStaleWorkerLock(basePath) {
|
|
212
|
+
clearLegacyLockFile(basePath);
|
|
177
213
|
if (!isDbAvailable())
|
|
178
214
|
return;
|
|
179
215
|
try {
|
|
180
216
|
const projectRoot = normalizeRealPath(basePath);
|
|
181
|
-
const worker =
|
|
217
|
+
const worker = findStaleWorkerForProject(projectRoot);
|
|
182
218
|
if (!worker)
|
|
183
219
|
return;
|
|
220
|
+
markLatestActiveForWorkerCanceled(worker.worker_id, "crash-recovered");
|
|
221
|
+
markWorkerCrashed(worker.worker_id);
|
|
184
222
|
deleteRuntimeKv("worker", worker.worker_id, SESSION_FILE_KV_KEY);
|
|
185
223
|
}
|
|
186
224
|
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");
|