gsd-pi 2.64.0 → 2.65.0-dev.16e10d7
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/dist/headless.js +3 -1
- package/dist/mcp-server.js +6 -2
- package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.js +22 -7
- package/dist/resources/extensions/bg-shell/process-manager.js +6 -1
- package/dist/resources/extensions/browser-tools/capture.js +20 -1
- package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +93 -0
- package/dist/resources/extensions/gsd/auto/run-unit.js +13 -2
- package/dist/resources/extensions/gsd/auto-dashboard.js +5 -5
- package/dist/resources/extensions/gsd/auto-dispatch.js +94 -8
- package/dist/resources/extensions/gsd/auto-model-selection.js +7 -5
- package/dist/resources/extensions/gsd/auto-post-unit.js +115 -7
- package/dist/resources/extensions/gsd/auto-prompts.js +24 -0
- package/dist/resources/extensions/gsd/auto-recovery.js +12 -8
- package/dist/resources/extensions/gsd/auto-start.js +35 -1
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +10 -0
- package/dist/resources/extensions/gsd/auto-verification.js +138 -1
- package/dist/resources/extensions/gsd/auto-worktree.js +29 -7
- package/dist/resources/extensions/gsd/auto.js +7 -2
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +17 -4
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +34 -13
- package/dist/resources/extensions/gsd/bootstrap/notify-interceptor.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +6 -4
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +5 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +12 -1
- package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +16 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +20 -0
- package/dist/resources/extensions/gsd/commands/catalog.js +7 -1
- package/dist/resources/extensions/gsd/commands/context.js +8 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +21 -0
- package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +104 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
- package/dist/resources/extensions/gsd/commands-extensions.js +1 -1
- package/dist/resources/extensions/gsd/config-overlay.js +312 -0
- package/dist/resources/extensions/gsd/detection.js +1 -1
- package/dist/resources/extensions/gsd/dispatch-guard.js +2 -1
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -0
- package/dist/resources/extensions/gsd/doctor.js +2 -1
- package/dist/resources/extensions/gsd/gitignore.js +1 -0
- package/dist/resources/extensions/gsd/gsd-db.js +11 -2
- package/dist/resources/extensions/gsd/guided-flow.js +220 -29
- package/dist/resources/extensions/gsd/md-importer.js +14 -7
- package/dist/resources/extensions/gsd/notification-overlay.js +256 -0
- package/dist/resources/extensions/gsd/notification-store.js +273 -0
- package/dist/resources/extensions/gsd/notification-widget.js +56 -0
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +17 -11
- package/dist/resources/extensions/gsd/post-execution-checks.js +407 -0
- package/dist/resources/extensions/gsd/pre-execution-checks.js +471 -0
- package/dist/resources/extensions/gsd/preferences-types.js +7 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +78 -1
- package/dist/resources/extensions/gsd/preferences.js +13 -2
- package/dist/resources/extensions/gsd/preparation.js +1092 -0
- package/dist/resources/extensions/gsd/prompt-validation.js +67 -0
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +3 -3
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/discuss-prepared.md +424 -0
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +4 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -4
- package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +23 -0
- package/dist/resources/extensions/gsd/prompts/rethink.md +2 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +56 -23
- package/dist/resources/extensions/gsd/quick.js +19 -15
- package/dist/resources/extensions/gsd/reactive-graph.js +12 -0
- package/dist/resources/extensions/gsd/roadmap-slices.js +24 -5
- package/dist/resources/extensions/gsd/safety/content-validator.js +3 -3
- package/dist/resources/extensions/gsd/session-lock.js +23 -1
- package/dist/resources/extensions/gsd/state.js +100 -12
- package/dist/resources/extensions/gsd/templates/context-enhanced.md +138 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +12 -3
- package/dist/resources/extensions/gsd/tools/complete-task.js +16 -4
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -5
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +5 -2
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +119 -0
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +30 -0
- package/dist/resources/extensions/gsd/tools/reopen-task.js +18 -0
- package/dist/resources/extensions/gsd/triage-resolution.js +25 -9
- package/dist/resources/extensions/gsd/verification-evidence.js +18 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +8 -0
- package/dist/resources/extensions/gsd/workflow-projections.js +4 -7
- package/dist/resources/extensions/gsd/workflow-reconcile.js +2 -4
- package/dist/resources/extensions/gsd/workflow-templates.js +11 -2
- package/dist/resources/extensions/gsd/worktree-manager.js +5 -2
- package/dist/resources/extensions/gsd/worktree.js +9 -0
- package/dist/resources/extensions/shared/interview-ui.js +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +15 -14
- 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 +1 -1
- package/dist/web/standalone/.next/required-server-files.json +4 -4
- package/dist/web/standalone/.next/routes-manifest.json +6 -0
- 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 +2 -2
- 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_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 +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- 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 +1 -1
- 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 +3 -0
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -0
- package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -0
- 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 +2 -2
- 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 +2 -2
- 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 +4 -4
- 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 +4 -4
- 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 +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +15 -14
- package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
- package/dist/web/standalone/.next/server/chunks/7471.js +3 -3
- package/dist/web/standalone/.next/server/functions-config-manifest.json +1 -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/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 +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/Z3TgDP0c7kG9j8CVQVGcl/_buildManifest.js +1 -0
- package/dist/web/standalone/.next/static/chunks/6502.8874bcae249c02e1.js +9 -0
- package/dist/web/standalone/.next/static/chunks/app/_global-error/page-8805a20e15762c3c.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/api/boot/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/experimental/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/notifications/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-0c485498795110d6.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/app-error-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-8805a20e15762c3c.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/next/dist/client/components/builtin/not-found-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-8805a20e15762c3c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-a1c1e452c6b32d04.js → webpack-9fed74684e1c5bb1.js} +1 -1
- 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 +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +26 -9
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.test.ts +100 -4
- package/packages/pi-agent-core/src/agent-loop.ts +43 -12
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +38 -0
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +11 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js +24 -0
- package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +4 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js +30 -19
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js +51 -0
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +9 -9
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts +2 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +10 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +28 -5
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +15 -1
- 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 +18 -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.d.ts +6 -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 +40 -0
- 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-tool-refresh.test.ts +64 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +10 -0
- package/packages/pi-coding-agent/src/core/resource-loader-cache-reset.test.ts +42 -0
- package/packages/pi-coding-agent/src/core/resource-loader.ts +5 -1
- package/packages/pi-coding-agent/src/core/retry-handler.test.ts +80 -0
- package/packages/pi-coding-agent/src/core/retry-handler.ts +37 -25
- package/packages/pi-coding-agent/src/core/sdk.ts +9 -9
- package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +10 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +29 -4
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +27 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +16 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +38 -0
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +66 -0
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -0
- package/packages/pi-tui/dist/components/image.d.ts +2 -0
- package/packages/pi-tui/dist/components/image.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/image.js +4 -0
- package/packages/pi-tui/dist/components/image.js.map +1 -1
- package/packages/pi-tui/dist/components/image.test.d.ts +6 -0
- package/packages/pi-tui/dist/components/image.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/image.test.js +32 -0
- package/packages/pi-tui/dist/components/image.test.js.map +1 -0
- package/packages/pi-tui/dist/components/loader.d.ts +4 -2
- package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/loader.js +27 -9
- package/packages/pi-tui/dist/components/loader.js.map +1 -1
- package/packages/pi-tui/dist/components/text.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/text.js +2 -0
- package/packages/pi-tui/dist/components/text.js.map +1 -1
- package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -1
- package/packages/pi-tui/dist/overlay-layout.js +12 -1
- package/packages/pi-tui/dist/overlay-layout.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +4 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +35 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +82 -0
- package/packages/pi-tui/src/components/image.test.ts +36 -0
- package/packages/pi-tui/src/components/image.ts +5 -0
- package/packages/pi-tui/src/components/loader.ts +27 -10
- package/packages/pi-tui/src/components/text.ts +1 -0
- package/packages/pi-tui/src/overlay-layout.ts +13 -1
- package/packages/pi-tui/src/tui.ts +34 -0
- package/pkg/package.json +1 -1
- package/src/resources/extensions/bg-shell/bg-shell-lifecycle.ts +19 -7
- package/src/resources/extensions/bg-shell/process-manager.ts +8 -2
- package/src/resources/extensions/browser-tools/capture.ts +19 -1
- package/src/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +93 -0
- package/src/resources/extensions/gsd/auto/run-unit.ts +12 -2
- package/src/resources/extensions/gsd/auto-dashboard.ts +5 -4
- package/src/resources/extensions/gsd/auto-dispatch.ts +105 -8
- package/src/resources/extensions/gsd/auto-model-selection.ts +7 -5
- package/src/resources/extensions/gsd/auto-post-unit.ts +138 -6
- package/src/resources/extensions/gsd/auto-prompts.ts +31 -0
- package/src/resources/extensions/gsd/auto-recovery.ts +10 -8
- package/src/resources/extensions/gsd/auto-start.ts +38 -0
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +10 -0
- package/src/resources/extensions/gsd/auto-verification.ts +190 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +28 -7
- package/src/resources/extensions/gsd/auto.ts +6 -1
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +16 -4
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +35 -13
- package/src/resources/extensions/gsd/bootstrap/notify-interceptor.ts +34 -0
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +5 -4
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +4 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +12 -1
- package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +20 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +28 -0
- package/src/resources/extensions/gsd/commands/catalog.ts +7 -1
- package/src/resources/extensions/gsd/commands/context.ts +7 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +24 -0
- package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +140 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
- package/src/resources/extensions/gsd/commands-extensions.ts +1 -1
- package/src/resources/extensions/gsd/config-overlay.ts +331 -0
- package/src/resources/extensions/gsd/detection.ts +1 -1
- package/src/resources/extensions/gsd/dispatch-guard.ts +2 -1
- package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -0
- package/src/resources/extensions/gsd/doctor.ts +2 -1
- package/src/resources/extensions/gsd/gitignore.ts +1 -0
- package/src/resources/extensions/gsd/gsd-db.ts +13 -2
- package/src/resources/extensions/gsd/guided-flow.ts +254 -30
- package/src/resources/extensions/gsd/md-importer.ts +13 -6
- package/src/resources/extensions/gsd/notification-overlay.ts +295 -0
- package/src/resources/extensions/gsd/notification-store.ts +293 -0
- package/src/resources/extensions/gsd/notification-widget.ts +68 -0
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +19 -11
- package/src/resources/extensions/gsd/post-execution-checks.ts +539 -0
- package/src/resources/extensions/gsd/pre-execution-checks.ts +581 -0
- package/src/resources/extensions/gsd/preferences-types.ts +53 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +78 -1
- package/src/resources/extensions/gsd/preferences.ts +13 -2
- package/src/resources/extensions/gsd/preparation.ts +1419 -0
- package/src/resources/extensions/gsd/prompt-validation.ts +88 -0
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +3 -3
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/discuss-prepared.md +424 -0
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +4 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -4
- package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +23 -0
- package/src/resources/extensions/gsd/prompts/rethink.md +2 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +56 -23
- package/src/resources/extensions/gsd/quick.ts +20 -15
- package/src/resources/extensions/gsd/reactive-graph.ts +18 -0
- package/src/resources/extensions/gsd/roadmap-slices.ts +21 -5
- package/src/resources/extensions/gsd/safety/content-validator.ts +3 -3
- package/src/resources/extensions/gsd/session-lock.ts +17 -1
- package/src/resources/extensions/gsd/state.ts +101 -11
- package/src/resources/extensions/gsd/templates/context-enhanced.md +138 -0
- package/src/resources/extensions/gsd/tests/adversarial-review-fixes.test.ts +223 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +33 -2
- package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/complete-slice-string-coercion.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +72 -0
- package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/defer-milestone-stamp.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/discuss-incremental-persistence.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +526 -0
- package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/find-missing-summaries-closed.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/gitignore-bg-shell.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/guided-flow-state-rebuild.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/import-done-milestones.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +28 -30
- package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
- package/src/resources/extensions/gsd/tests/integration-prepared-discussion.test.ts +525 -0
- package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +282 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +312 -0
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +813 -0
- package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +1197 -0
- package/src/resources/extensions/gsd/tests/pre-execution-fail-closed.test.ts +266 -0
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +457 -0
- package/src/resources/extensions/gsd/tests/preparation.test.ts +1211 -0
- package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +83 -0
- package/src/resources/extensions/gsd/tests/prompt-builder.test.ts +669 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +7 -4
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/reactive-graph.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +4 -5
- package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/skipped-validation-completion.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +147 -0
- package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +13 -0
- package/src/resources/extensions/gsd/tests/stash-pop-gsd-conflict.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +6 -7
- package/src/resources/extensions/gsd/tests/status-db-open.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/symlink-extension-discovery.test.ts +125 -0
- package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +3 -4
- package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/worker-model-override.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +16 -17
- package/src/resources/extensions/gsd/tests/worktree-sync-tasks.test.ts +13 -9
- package/src/resources/extensions/gsd/tests/worktree.test.ts +26 -9
- package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +13 -3
- package/src/resources/extensions/gsd/tools/complete-task.ts +16 -4
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +11 -9
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +5 -2
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +152 -0
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +27 -0
- package/src/resources/extensions/gsd/tools/reopen-task.ts +17 -0
- package/src/resources/extensions/gsd/triage-resolution.ts +29 -10
- package/src/resources/extensions/gsd/types.ts +4 -0
- package/src/resources/extensions/gsd/verification-evidence.ts +68 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +13 -0
- package/src/resources/extensions/gsd/workflow-projections.ts +4 -6
- package/src/resources/extensions/gsd/workflow-reconcile.ts +2 -3
- package/src/resources/extensions/gsd/workflow-templates.ts +11 -2
- package/src/resources/extensions/gsd/worktree-manager.ts +4 -2
- package/src/resources/extensions/gsd/worktree.ts +10 -0
- package/src/resources/extensions/shared/interview-ui.ts +1 -1
- package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +8 -10
- package/dist/web/standalone/.next/static/chunks/6502.7593d7797a4b3999.js +0 -9
- package/dist/web/standalone/.next/static/chunks/app/_global-error/page-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/boot/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/experimental/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-62be3b5fa91e4c8f.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/app-error-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-c4cc189e7b117ea2.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/chunks/next/dist/client/components/builtin/not-found-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/eebXKteM9EaWyseHKTjqp/_buildManifest.js +0 -1
- /package/dist/web/standalone/.next/static/{eebXKteM9EaWyseHKTjqp → Z3TgDP0c7kG9j8CVQVGcl}/_ssgManifest.js +0 -0
|
@@ -1,48 +1,81 @@
|
|
|
1
|
-
|
|
1
|
+
# Milestone Validation — Parallel Review
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
You are the validation orchestrator for **{{milestoneId}} — {{milestoneTitle}}**.
|
|
4
4
|
|
|
5
5
|
## Working Directory
|
|
6
6
|
|
|
7
7
|
Your working directory is `{{workingDirectory}}`. All file reads, writes, and shell commands MUST operate relative to this directory. Do NOT `cd` to any other directory.
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## Mission
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
Dispatch 3 independent parallel reviewers, then synthesize their findings into the final VALIDATION verdict.
|
|
12
12
|
|
|
13
13
|
This is remediation round {{remediationRound}}. If this is round 0, this is the first validation pass. If > 0, prior validation found issues and remediation slices were added and executed — verify those remediation slices resolved the issues.
|
|
14
14
|
|
|
15
|
+
## Context
|
|
16
|
+
|
|
15
17
|
All relevant context has been preloaded below — the roadmap, all slice summaries, UAT results, requirements, decisions, and project context are inlined. Start working immediately without re-reading these files.
|
|
16
18
|
|
|
17
19
|
{{inlinedContext}}
|
|
18
20
|
|
|
19
|
-
|
|
21
|
+
## Execution Protocol
|
|
22
|
+
|
|
23
|
+
### Step 1 — Dispatch Parallel Reviewers
|
|
24
|
+
|
|
25
|
+
Call `subagent` with `tasks: [...]` containing ALL THREE reviewers simultaneously:
|
|
26
|
+
|
|
27
|
+
**Reviewer A — Requirements Coverage**
|
|
28
|
+
Prompt: "Review milestone {{milestoneId}} requirements coverage. Working directory: {{workingDirectory}}. Read `.gsd/{{milestoneId}}/REQUIREMENTS.md` (or equivalent requirements file). For each requirement, check the slice SUMMARY files in `.gsd/{{milestoneId}}/` to determine if it is: COVERED (clearly demonstrated), PARTIAL (mentioned but not fully demonstrated), or MISSING (no evidence). Output a markdown table with columns: Requirement | Status | Evidence. End with a one-line verdict: PASS if all covered, NEEDS-ATTENTION if partials exist, FAIL if any missing."
|
|
29
|
+
|
|
30
|
+
**Reviewer B — Cross-Slice Integration**
|
|
31
|
+
Prompt: "Review milestone {{milestoneId}} cross-slice integration. Working directory: {{workingDirectory}}. Read `{{roadmapPath}}` and find the boundary map (produces/consumes contracts). For each boundary, check that the producing slice's SUMMARY confirms it produced the artifact, and the consuming slice's SUMMARY confirms it consumed it. Output a markdown table: Boundary | Producer Summary | Consumer Summary | Status. End with a one-line verdict: PASS if all boundaries honored, NEEDS-ATTENTION if any gaps."
|
|
32
|
+
|
|
33
|
+
**Reviewer C — UAT & Acceptance Criteria**
|
|
34
|
+
Prompt: "Review milestone {{milestoneId}} UAT and acceptance criteria. Working directory: {{workingDirectory}}. Read `.gsd/{{milestoneId}}/CONTEXT.md` for acceptance criteria. Check for UAT-RESULT files in each slice directory. Verify each acceptance criterion maps to either a passing UAT result or clear SUMMARY evidence. Output a checklist: [ ] Criterion | Evidence. End with a one-line verdict: PASS if all criteria met, NEEDS-ATTENTION if gaps exist."
|
|
35
|
+
|
|
36
|
+
### Step 2 — Synthesize Findings
|
|
20
37
|
|
|
21
|
-
|
|
38
|
+
After all reviewers complete, aggregate their verdicts:
|
|
39
|
+
- If ALL reviewers say PASS → overall verdict: `pass`
|
|
40
|
+
- If any reviewer says NEEDS-ATTENTION → overall verdict: `needs-attention`
|
|
41
|
+
- If any reviewer says FAIL → overall verdict: `needs-remediation`
|
|
22
42
|
|
|
23
|
-
|
|
24
|
-
2. For each **slice** in the roadmap, verify its demo/deliverable claim against its summary. Flag any slice whose summary does not substantiate its claimed output.
|
|
25
|
-
3. Check **cross-slice integration points** — do boundary map entries (produces/consumes) align with what was actually built?
|
|
26
|
-
4. Check **requirement coverage** — are all active requirements addressed by at least one slice?
|
|
27
|
-
5. If **Verification Classes** are provided in the inlined context above, check each non-empty class:
|
|
28
|
-
- For each verification class (Contract, Integration, Operational, UAT), determine whether slice summaries, UAT results, or observable behavior provide evidence that this verification tier was addressed.
|
|
29
|
-
- Document the compliance status of each class in a dedicated verification classes section.
|
|
30
|
-
- If `Operational` verification is non-empty and no evidence of operational verification exists, flag this explicitly — it means planned operational checks (migrations, deployments, runtime verification) were not proven.
|
|
31
|
-
- A milestone with unaddressed verification classes may still pass if the gaps are minor, but the gaps MUST be documented in the Deferred Work Inventory.
|
|
32
|
-
6. Determine a verdict:
|
|
33
|
-
- `pass` — all criteria met, all slices delivered, no gaps
|
|
34
|
-
- `needs-attention` — minor gaps that do not block completion (document them)
|
|
35
|
-
- `needs-remediation` — material gaps found; remediation slices must be added to the roadmap
|
|
43
|
+
### Step 3 — Write VALIDATION File
|
|
36
44
|
|
|
37
|
-
|
|
45
|
+
Write to `{{validationPath}}`:
|
|
38
46
|
|
|
39
|
-
|
|
47
|
+
```markdown
|
|
48
|
+
---
|
|
49
|
+
verdict: <pass|needs-attention|needs-remediation>
|
|
50
|
+
remediation_round: {{remediationRound}}
|
|
51
|
+
reviewers: 3
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
# Milestone Validation: {{milestoneId}}
|
|
55
|
+
|
|
56
|
+
## Reviewer A — Requirements Coverage
|
|
57
|
+
<paste Reviewer A output>
|
|
58
|
+
|
|
59
|
+
## Reviewer B — Cross-Slice Integration
|
|
60
|
+
<paste Reviewer B output>
|
|
61
|
+
|
|
62
|
+
## Reviewer C — UAT & Acceptance Criteria
|
|
63
|
+
<paste Reviewer C output>
|
|
64
|
+
|
|
65
|
+
## Synthesis
|
|
66
|
+
<2-3 sentences summarizing overall findings and verdict rationale>
|
|
67
|
+
|
|
68
|
+
## Remediation Plan
|
|
69
|
+
<if verdict is not pass: specific actions required>
|
|
70
|
+
```
|
|
40
71
|
|
|
41
72
|
**DB access safety:** Do NOT query `.gsd/gsd.db` directly via `sqlite3` or `node -e require('better-sqlite3')` — the engine owns the WAL connection. Use `gsd_milestone_status` to read milestone and slice state. All data you need is already inlined in the context above or accessible via the `gsd_*` tools. Direct DB access corrupts the WAL and bypasses tool-level validation.
|
|
42
73
|
|
|
43
74
|
If verdict is `needs-remediation`:
|
|
44
|
-
-
|
|
45
|
-
- These
|
|
75
|
+
- Add new slices to `{{roadmapPath}}` with unchecked `[ ]` status
|
|
76
|
+
- These slices will be planned and executed before validation re-runs
|
|
77
|
+
|
|
78
|
+
**You MUST write `{{validationPath}}` before finishing.**
|
|
46
79
|
|
|
47
80
|
**File system safety:** When scanning milestone directories for evidence, use `ls` or `find` to list directory contents first — never pass a directory path (e.g. `tasks/`, `slices/`) directly to the `read` tool. The `read` tool only accepts file paths, not directories.
|
|
48
81
|
|
|
@@ -151,28 +151,32 @@ export async function handleQuick(args, ctx, pi) {
|
|
|
151
151
|
const taskDir = ensureQuickDir(basePath, taskNum, slug);
|
|
152
152
|
const taskDirRel = `.gsd/quick/${taskNum}-${slug}`;
|
|
153
153
|
const date = new Date().toISOString().split("T")[0];
|
|
154
|
-
// Create git branch for the quick task
|
|
154
|
+
// Create git branch for the quick task (unless isolation:none — #3337)
|
|
155
155
|
const gitPrefs = loadEffectiveGSDPreferences()?.preferences?.git ?? {};
|
|
156
156
|
const git = new GitServiceImpl(basePath, gitPrefs);
|
|
157
157
|
const branchName = `gsd/quick/${taskNum}-${slug}`;
|
|
158
158
|
let originalBranch = git.getCurrentBranch();
|
|
159
|
+
const { getIsolationMode } = await import("./preferences.js");
|
|
160
|
+
const usesBranch = getIsolationMode() !== "none";
|
|
159
161
|
let branchCreated = false;
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
162
|
+
if (usesBranch) {
|
|
163
|
+
try {
|
|
164
|
+
const current = originalBranch;
|
|
165
|
+
if (current !== branchName) {
|
|
166
|
+
// Auto-commit any dirty state before switching
|
|
167
|
+
try {
|
|
168
|
+
git.autoCommit("quick-task", `Q${taskNum}`, []);
|
|
169
|
+
}
|
|
170
|
+
catch { /* nothing to commit — fine */ }
|
|
171
|
+
runGit(basePath, ["checkout", "-b", branchName]);
|
|
172
|
+
branchCreated = true;
|
|
166
173
|
}
|
|
167
|
-
catch { /* nothing to commit — fine */ }
|
|
168
|
-
runGit(basePath, ["checkout", "-b", branchName]);
|
|
169
|
-
branchCreated = true;
|
|
170
174
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
175
|
+
catch (err) {
|
|
176
|
+
// Branch creation failed — continue on current branch
|
|
177
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
178
|
+
ctx.ui.notify(`Could not create branch ${branchName}: ${message}. Working on current branch.`, "warning");
|
|
179
|
+
}
|
|
176
180
|
}
|
|
177
181
|
const actualBranch = branchCreated ? branchName : git.getCurrentBranch();
|
|
178
182
|
if (actualBranch === branchName && originalBranch !== branchName) {
|
|
@@ -110,6 +110,18 @@ export function isGraphAmbiguous(graph) {
|
|
|
110
110
|
node.inputFiles.length === 0 &&
|
|
111
111
|
node.outputFiles.length === 0);
|
|
112
112
|
}
|
|
113
|
+
/**
|
|
114
|
+
* Returns tasks that are missing IO annotations (no inputFiles and no outputFiles).
|
|
115
|
+
* These tasks prevent parallel dispatch by making the graph ambiguous.
|
|
116
|
+
* Used to surface actionable diagnostics when parallel execution falls back to sequential.
|
|
117
|
+
*/
|
|
118
|
+
export function getMissingAnnotationTasks(graph) {
|
|
119
|
+
return graph
|
|
120
|
+
.filter((node) => !node.done &&
|
|
121
|
+
node.inputFiles.length === 0 &&
|
|
122
|
+
node.outputFiles.length === 0)
|
|
123
|
+
.map((node) => ({ id: node.id, title: node.title }));
|
|
124
|
+
}
|
|
113
125
|
/**
|
|
114
126
|
* Detect deadlock: no tasks are ready and none are in-flight, yet incomplete
|
|
115
127
|
* tasks remain. This indicates a circular dependency or impossible state.
|
|
@@ -59,6 +59,19 @@ function extractSlicesSection(content) {
|
|
|
59
59
|
function parseTableSlices(section) {
|
|
60
60
|
const lines = section.split("\n");
|
|
61
61
|
const slices = [];
|
|
62
|
+
// Detect dependency column index from the header row (#3383, #3336).
|
|
63
|
+
// Only parse deps from this column (or cells with explicit "depends"/"deps" keywords).
|
|
64
|
+
let depColumnIndex = -1;
|
|
65
|
+
for (const line of lines) {
|
|
66
|
+
if (!line.includes("|"))
|
|
67
|
+
continue;
|
|
68
|
+
if (/S\d+/.test(line))
|
|
69
|
+
break; // reached data rows
|
|
70
|
+
const headerCells = line.split("|").map(c => c.trim()).filter(Boolean);
|
|
71
|
+
depColumnIndex = headerCells.findIndex(c => /^(depends|deps|depend)/i.test(c));
|
|
72
|
+
if (depColumnIndex >= 0)
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
62
75
|
for (const line of lines) {
|
|
63
76
|
// Skip non-table lines, separator lines (|---|---|), and header rows
|
|
64
77
|
if (!line.includes("|"))
|
|
@@ -94,12 +107,18 @@ function parseTableSlices(section) {
|
|
|
94
107
|
break;
|
|
95
108
|
}
|
|
96
109
|
}
|
|
97
|
-
// Extract dependencies from
|
|
110
|
+
// Extract dependencies only from the dependency column or cells with
|
|
111
|
+
// explicit "depends"/"deps" keywords — never from title cells (#3383).
|
|
98
112
|
let depends = [];
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
113
|
+
if (depColumnIndex >= 0 && cells[depColumnIndex]) {
|
|
114
|
+
const depCell = cells[depColumnIndex];
|
|
115
|
+
const depIds = (depCell.match(/S\d+/g) ?? []).filter(d => d !== id);
|
|
116
|
+
depends = expandDependencies(depIds);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
for (const cell of cells) {
|
|
120
|
+
if (/depends|deps/i.test(cell)) {
|
|
121
|
+
const depIds = (cell.match(/S\d+/g) ?? []).filter(d => d !== id);
|
|
103
122
|
depends = expandDependencies(depIds);
|
|
104
123
|
break;
|
|
105
124
|
}
|
|
@@ -35,12 +35,12 @@ const VALIDATORS = {
|
|
|
35
35
|
};
|
|
36
36
|
function validatePlanSlice(content) {
|
|
37
37
|
const violations = [];
|
|
38
|
-
// Must have at least
|
|
38
|
+
// Must have at least 1 task entry — single-task slices are valid (#3649)
|
|
39
39
|
const taskCount = (content.match(/- \[[ x]\] \*\*T\d+/g) || []).length;
|
|
40
|
-
if (taskCount <
|
|
40
|
+
if (taskCount < 1) {
|
|
41
41
|
violations.push({
|
|
42
42
|
severity: "warning",
|
|
43
|
-
reason: `Slice plan has
|
|
43
|
+
reason: `Slice plan has ${taskCount} task(s) — expected at least 1`,
|
|
44
44
|
});
|
|
45
45
|
}
|
|
46
46
|
// Should have a Files Likely Touched section
|
|
@@ -242,6 +242,26 @@ export function acquireSessionLock(basePath) {
|
|
|
242
242
|
}
|
|
243
243
|
const gsdDir = gsdRoot(basePath);
|
|
244
244
|
const lockTarget = effectiveLockTarget(gsdDir);
|
|
245
|
+
// #3218: Pre-flight stale lock cleanup — if the .lock/ directory exists but
|
|
246
|
+
// no auto.lock metadata is present (or the PID is dead), remove the lock
|
|
247
|
+
// directory before attempting acquisition. This prevents the 30-min stale
|
|
248
|
+
// window from blocking /gsd after crashes, SIGKILL, or laptop sleep.
|
|
249
|
+
const lockDir = lockTarget + ".lock";
|
|
250
|
+
if (existsSync(lockDir)) {
|
|
251
|
+
const existingData = readExistingLockData(lp);
|
|
252
|
+
const isOrphan = !existingData || (existingData.pid && !isPidAlive(existingData.pid));
|
|
253
|
+
if (isOrphan) {
|
|
254
|
+
try {
|
|
255
|
+
rmSync(lockDir, { recursive: true, force: true });
|
|
256
|
+
}
|
|
257
|
+
catch { /* best-effort */ }
|
|
258
|
+
try {
|
|
259
|
+
if (existsSync(lp))
|
|
260
|
+
unlinkSync(lp);
|
|
261
|
+
}
|
|
262
|
+
catch { /* best-effort */ }
|
|
263
|
+
}
|
|
264
|
+
}
|
|
245
265
|
try {
|
|
246
266
|
// Try to acquire an exclusive OS-level lock on the lock target.
|
|
247
267
|
// We lock a directory since proper-lockfile works best on directories,
|
|
@@ -292,9 +312,11 @@ export function acquireSessionLock(basePath) {
|
|
|
292
312
|
// Retry also failed — fall through to the error path
|
|
293
313
|
}
|
|
294
314
|
}
|
|
315
|
+
// #3218: Provide actionable workaround when lock recovery fails
|
|
316
|
+
const lockDirPath = lockTarget + ".lock";
|
|
295
317
|
const reason = existingPid
|
|
296
318
|
? `Another auto-mode session (PID ${existingPid}) appears to be running.\nStop it with \`kill ${existingPid}\` before starting a new session.`
|
|
297
|
-
: `Another auto-mode session is
|
|
319
|
+
: `Another auto-mode session lock is stuck on this project.\nRun: rm -rf "${lockDirPath}" && rm -f "${lp}"`;
|
|
298
320
|
return { acquired: false, reason, existingPid };
|
|
299
321
|
}
|
|
300
322
|
}
|
|
@@ -13,7 +13,7 @@ import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
|
13
13
|
import { debugCount, debugTime } from './debug-logger.js';
|
|
14
14
|
import { logWarning, logError } from './workflow-logger.js';
|
|
15
15
|
import { extractVerdict } from './verdict-parser.js';
|
|
16
|
-
import { isDbAvailable, getAllMilestones, getMilestone, getMilestoneSlices, getSliceTasks, getReplanHistory, getSlice, insertMilestone, insertSlice, updateTaskStatus, getPendingSliceGateCount, } from './gsd-db.js';
|
|
16
|
+
import { isDbAvailable, getAllMilestones, getMilestone, getMilestoneSlices, getSliceTasks, getReplanHistory, getSlice, insertMilestone, insertSlice, insertTask, updateTaskStatus, getPendingSliceGateCount, } from './gsd-db.js';
|
|
17
17
|
/**
|
|
18
18
|
* A "ghost" milestone directory contains only META.json (and no substantive
|
|
19
19
|
* files like CONTEXT, CONTEXT-DRAFT, ROADMAP, or SUMMARY). These appear when
|
|
@@ -30,11 +30,20 @@ import { isDbAvailable, getAllMilestones, getMilestone, getMilestoneSlices, getS
|
|
|
30
30
|
* as ghosts, causing auto-mode to skip them entirely.
|
|
31
31
|
*/
|
|
32
32
|
export function isGhostMilestone(basePath, mid) {
|
|
33
|
-
// If the milestone has a DB row, it's a known milestone — not a ghost.
|
|
33
|
+
// If the milestone has a DB row, it's usually a known milestone — not a ghost.
|
|
34
|
+
// Exception: a "queued" row with no disk artifacts is a phantom from
|
|
35
|
+
// gsd_milestone_generate_id that was never planned (#3645).
|
|
34
36
|
if (isDbAvailable()) {
|
|
35
37
|
const dbRow = getMilestone(mid);
|
|
36
|
-
if (dbRow)
|
|
38
|
+
if (dbRow) {
|
|
39
|
+
if (dbRow.status === 'queued') {
|
|
40
|
+
const hasContent = resolveMilestoneFile(basePath, mid, "CONTEXT")
|
|
41
|
+
|| resolveMilestoneFile(basePath, mid, "ROADMAP")
|
|
42
|
+
|| resolveMilestoneFile(basePath, mid, "SUMMARY");
|
|
43
|
+
return !hasContent;
|
|
44
|
+
}
|
|
37
45
|
return false;
|
|
46
|
+
}
|
|
38
47
|
}
|
|
39
48
|
// If a worktree exists for this milestone, it was legitimately created.
|
|
40
49
|
const root = gsdRoot(basePath);
|
|
@@ -367,14 +376,19 @@ export async function deriveStateFromDb(basePath) {
|
|
|
367
376
|
let activeMilestoneSlices = [];
|
|
368
377
|
let activeMilestoneFound = false;
|
|
369
378
|
let activeMilestoneHasDraft = false;
|
|
379
|
+
// Queued shells (DB row, no slices, no content files) are deferred during
|
|
380
|
+
// the main loop so they don't eclipse real active milestones (#3470).
|
|
381
|
+
// If no real active milestone is found, the first deferred shell is promoted.
|
|
382
|
+
let firstDeferredQueuedShell = null;
|
|
370
383
|
for (const m of milestones) {
|
|
371
384
|
if (parkedMilestoneIds.has(m.id)) {
|
|
372
385
|
registry.push({ id: m.id, title: stripMilestonePrefix(m.title) || m.id, status: 'parked' });
|
|
373
386
|
continue;
|
|
374
387
|
}
|
|
375
|
-
// Ghost milestone check: no slices in DB AND no substantive files on disk
|
|
388
|
+
// Ghost milestone check: no slices in DB AND no substantive files on disk.
|
|
389
|
+
// Skip queued milestones — they are handled by the deferred-shell logic below (#3470).
|
|
376
390
|
const slices = getMilestoneSlices(m.id);
|
|
377
|
-
if (slices.length === 0 && !isStatusDone(m.status)) {
|
|
391
|
+
if (slices.length === 0 && !isStatusDone(m.status) && m.status !== 'queued') {
|
|
378
392
|
// Check disk for ghost detection
|
|
379
393
|
if (isGhostMilestone(basePath, m.id))
|
|
380
394
|
continue;
|
|
@@ -413,6 +427,22 @@ export async function deriveStateFromDb(basePath) {
|
|
|
413
427
|
registry.push({ id: m.id, title, status: 'pending', dependsOn: deps });
|
|
414
428
|
continue;
|
|
415
429
|
}
|
|
430
|
+
// Defer queued shell milestones with no substantive content (#3470).
|
|
431
|
+
// A queued milestone with no slices and no context/draft file is a
|
|
432
|
+
// placeholder that should not block later real active milestones.
|
|
433
|
+
// If no real active milestone is found after the loop, the first
|
|
434
|
+
// deferred shell is promoted to active (#2921).
|
|
435
|
+
if (m.status === 'queued' && slices.length === 0) {
|
|
436
|
+
const contextFile = resolveMilestoneFile(basePath, m.id, "CONTEXT");
|
|
437
|
+
const draftFile = resolveMilestoneFile(basePath, m.id, "CONTEXT-DRAFT");
|
|
438
|
+
if (!contextFile && !draftFile) {
|
|
439
|
+
if (!firstDeferredQueuedShell) {
|
|
440
|
+
firstDeferredQueuedShell = { id: m.id, title, deps };
|
|
441
|
+
}
|
|
442
|
+
registry.push({ id: m.id, title, status: 'pending', ...(deps.length > 0 ? { dependsOn: deps } : {}) });
|
|
443
|
+
continue;
|
|
444
|
+
}
|
|
445
|
+
}
|
|
416
446
|
// Handle all-slices-done case (validating/completing)
|
|
417
447
|
if (allSlicesDone) {
|
|
418
448
|
const validationFile = resolveMilestoneFile(basePath, m.id, "VALIDATION");
|
|
@@ -443,6 +473,16 @@ export async function deriveStateFromDb(basePath) {
|
|
|
443
473
|
registry.push({ id: m.id, title, status: 'pending', ...(deps.length > 0 ? { dependsOn: deps } : {}) });
|
|
444
474
|
}
|
|
445
475
|
}
|
|
476
|
+
// Promote deferred queued shell if no real active milestone was found (#3470/#2921).
|
|
477
|
+
if (!activeMilestoneFound && firstDeferredQueuedShell) {
|
|
478
|
+
const shell = firstDeferredQueuedShell;
|
|
479
|
+
activeMilestone = { id: shell.id, title: shell.title };
|
|
480
|
+
activeMilestoneSlices = [];
|
|
481
|
+
activeMilestoneFound = true;
|
|
482
|
+
const entry = registry.find(e => e.id === shell.id);
|
|
483
|
+
if (entry)
|
|
484
|
+
entry.status = 'active';
|
|
485
|
+
}
|
|
446
486
|
const milestoneProgress = {
|
|
447
487
|
done: registry.filter(e => e.status === 'complete').length,
|
|
448
488
|
total: registry.length,
|
|
@@ -538,11 +578,14 @@ export async function deriveStateFromDb(basePath) {
|
|
|
538
578
|
const validationFile = resolveMilestoneFile(basePath, activeMilestone.id, "VALIDATION");
|
|
539
579
|
const validationContent = validationFile ? await loadFile(validationFile) : null;
|
|
540
580
|
const validationTerminal = validationContent ? isValidationTerminal(validationContent) : false;
|
|
581
|
+
const verdict = validationContent ? extractVerdict(validationContent) : undefined;
|
|
541
582
|
const sliceProgress = {
|
|
542
583
|
done: activeMilestoneSlices.length,
|
|
543
584
|
total: activeMilestoneSlices.length,
|
|
544
585
|
};
|
|
545
|
-
|
|
586
|
+
// Force re-validation when verdict is needs-remediation — remediation slices
|
|
587
|
+
// may have completed since the stale validation was written (#3596).
|
|
588
|
+
if (!validationTerminal || verdict === 'needs-remediation') {
|
|
546
589
|
return {
|
|
547
590
|
activeMilestone, activeSlice: null, activeTask: null,
|
|
548
591
|
phase: 'validating-milestone',
|
|
@@ -632,6 +675,45 @@ export async function deriveStateFromDb(basePath) {
|
|
|
632
675
|
}
|
|
633
676
|
// ── Get tasks from DB ────────────────────────────────────────────────
|
|
634
677
|
let tasks = getSliceTasks(activeMilestone.id, activeSlice.id);
|
|
678
|
+
// ── Reconcile missing tasks: plan file has tasks but DB is empty (#3600) ──
|
|
679
|
+
// When the planning agent writes S##-PLAN.md with task entries but never
|
|
680
|
+
// calls the gsd_plan_slice persistence tool, the DB has zero task rows
|
|
681
|
+
// even though the plan file contains valid tasks. Without this reconciliation,
|
|
682
|
+
// deriveState returns phase='planning' forever — the dispatcher re-dispatches
|
|
683
|
+
// plan-slice in an infinite loop.
|
|
684
|
+
if (tasks.length === 0 && planFile) {
|
|
685
|
+
try {
|
|
686
|
+
const planContent = await loadFile(planFile);
|
|
687
|
+
if (planContent) {
|
|
688
|
+
const diskPlan = parsePlan(planContent);
|
|
689
|
+
if (diskPlan.tasks.length > 0) {
|
|
690
|
+
for (let i = 0; i < diskPlan.tasks.length; i++) {
|
|
691
|
+
const t = diskPlan.tasks[i];
|
|
692
|
+
try {
|
|
693
|
+
insertTask({
|
|
694
|
+
id: t.id,
|
|
695
|
+
sliceId: activeSlice.id,
|
|
696
|
+
milestoneId: activeMilestone.id,
|
|
697
|
+
title: t.title,
|
|
698
|
+
status: t.done ? 'complete' : 'pending',
|
|
699
|
+
sequence: i + 1,
|
|
700
|
+
});
|
|
701
|
+
}
|
|
702
|
+
catch (insertErr) {
|
|
703
|
+
// Task may already exist from a partial previous import — skip
|
|
704
|
+
logWarning("reconcile", `failed to insert task ${t.id} from plan file: ${insertErr instanceof Error ? insertErr.message : String(insertErr)}`);
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
tasks = getSliceTasks(activeMilestone.id, activeSlice.id);
|
|
708
|
+
logWarning("reconcile", `imported ${tasks.length} tasks from plan file for ${activeMilestone.id}/${activeSlice.id} — DB was empty (#3600)`, { mid: activeMilestone.id, sid: activeSlice.id });
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
catch (err) {
|
|
713
|
+
// Non-fatal — fall through to the existing "empty plan" logic
|
|
714
|
+
logError("reconcile", `plan-file task import failed for ${activeMilestone.id}/${activeSlice.id}: ${err instanceof Error ? err.message : String(err)}`);
|
|
715
|
+
}
|
|
716
|
+
}
|
|
635
717
|
// ── Reconcile stale task status (#2514) ──────────────────────────────
|
|
636
718
|
// When a session disconnects after the agent writes SUMMARY + VERIFY
|
|
637
719
|
// artifacts but before postUnitPostVerification updates the DB, tasks
|
|
@@ -973,24 +1055,27 @@ export async function _deriveStateImpl(basePath) {
|
|
|
973
1055
|
const validationFile = resolveMilestoneFile(basePath, mid, "VALIDATION");
|
|
974
1056
|
const validationContent = validationFile ? await cachedLoadFile(validationFile) : null;
|
|
975
1057
|
const validationTerminal = validationContent ? isValidationTerminal(validationContent) : false;
|
|
1058
|
+
const verdict = validationContent ? extractVerdict(validationContent) : undefined;
|
|
1059
|
+
// needs-remediation is terminal but requires re-validation (#3596)
|
|
1060
|
+
const needsRevalidation = !validationTerminal || verdict === 'needs-remediation';
|
|
976
1061
|
if (summaryFile) {
|
|
977
1062
|
// Summary exists → milestone is complete regardless of validation state.
|
|
978
1063
|
// The summary is the terminal artifact (#864).
|
|
979
1064
|
registry.push({ id: mid, title, status: 'complete' });
|
|
980
1065
|
}
|
|
981
|
-
else if (
|
|
982
|
-
// No summary and
|
|
1066
|
+
else if (needsRevalidation && !activeMilestoneFound) {
|
|
1067
|
+
// No summary and needs (re-)validation → validating-milestone
|
|
983
1068
|
activeMilestone = { id: mid, title };
|
|
984
1069
|
activeRoadmap = roadmap;
|
|
985
1070
|
activeMilestoneFound = true;
|
|
986
1071
|
registry.push({ id: mid, title, status: 'active' });
|
|
987
1072
|
}
|
|
988
|
-
else if (
|
|
989
|
-
//
|
|
1073
|
+
else if (needsRevalidation && activeMilestoneFound) {
|
|
1074
|
+
// Needs (re-)validation, but another milestone is already active
|
|
990
1075
|
registry.push({ id: mid, title, status: 'pending' });
|
|
991
1076
|
}
|
|
992
1077
|
else if (!activeMilestoneFound) {
|
|
993
|
-
// Terminal validation but no summary → completing-milestone
|
|
1078
|
+
// Terminal validation (pass/needs-attention) but no summary → completing-milestone
|
|
994
1079
|
activeMilestone = { id: mid, title };
|
|
995
1080
|
activeRoadmap = roadmap;
|
|
996
1081
|
activeMilestoneFound = true;
|
|
@@ -1175,11 +1260,14 @@ export async function _deriveStateImpl(basePath) {
|
|
|
1175
1260
|
const validationFile = resolveMilestoneFile(basePath, activeMilestone.id, "VALIDATION");
|
|
1176
1261
|
const validationContent = validationFile ? await cachedLoadFile(validationFile) : null;
|
|
1177
1262
|
const validationTerminal = validationContent ? isValidationTerminal(validationContent) : false;
|
|
1263
|
+
const verdict = validationContent ? extractVerdict(validationContent) : undefined;
|
|
1178
1264
|
const sliceProgress = {
|
|
1179
1265
|
done: activeRoadmap.slices.length,
|
|
1180
1266
|
total: activeRoadmap.slices.length,
|
|
1181
1267
|
};
|
|
1182
|
-
|
|
1268
|
+
// Force re-validation when verdict is needs-remediation — remediation slices
|
|
1269
|
+
// may have completed since the stale validation was written (#3596).
|
|
1270
|
+
if (!validationTerminal || verdict === 'needs-remediation') {
|
|
1183
1271
|
return {
|
|
1184
1272
|
activeMilestone,
|
|
1185
1273
|
activeSlice: null,
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# {{milestoneId}}: {{milestoneTitle}}
|
|
2
|
+
|
|
3
|
+
**Gathered:** {{date}}
|
|
4
|
+
**Status:** Ready for planning
|
|
5
|
+
|
|
6
|
+
## Project Description
|
|
7
|
+
|
|
8
|
+
{{description}}
|
|
9
|
+
|
|
10
|
+
## Why This Milestone
|
|
11
|
+
|
|
12
|
+
{{whatProblemThisSolves_AND_whyNow}}
|
|
13
|
+
|
|
14
|
+
## Codebase Brief
|
|
15
|
+
|
|
16
|
+
### Technology Stack
|
|
17
|
+
|
|
18
|
+
{{techStack}}
|
|
19
|
+
|
|
20
|
+
### Key Modules
|
|
21
|
+
|
|
22
|
+
{{keyModules}}
|
|
23
|
+
|
|
24
|
+
### Patterns in Use
|
|
25
|
+
|
|
26
|
+
{{patternsInUse}}
|
|
27
|
+
|
|
28
|
+
## User-Visible Outcome
|
|
29
|
+
|
|
30
|
+
### When this milestone is complete, the user can:
|
|
31
|
+
|
|
32
|
+
- {{literalUserActionInRealEnvironment}}
|
|
33
|
+
- {{literalUserActionInRealEnvironment}}
|
|
34
|
+
|
|
35
|
+
### Entry point / environment
|
|
36
|
+
|
|
37
|
+
- Entry point: {{CLI command / URL / bot / extension / service / workflow}}
|
|
38
|
+
- Environment: {{local dev / browser / mobile / launchd / CI / production-like}}
|
|
39
|
+
- Live dependencies involved: {{telegram / database / webhook / rpc subprocess / none}}
|
|
40
|
+
|
|
41
|
+
## Completion Class
|
|
42
|
+
|
|
43
|
+
- Contract complete means: {{what can be proven by tests / fixtures / artifacts}}
|
|
44
|
+
- Integration complete means: {{what must work across real subsystems}}
|
|
45
|
+
- Operational complete means: {{what must work under real lifecycle conditions, or none}}
|
|
46
|
+
|
|
47
|
+
## Architectural Decisions
|
|
48
|
+
|
|
49
|
+
### {{decisionTitle}}
|
|
50
|
+
|
|
51
|
+
**Decision:** {{decisionStatement}}
|
|
52
|
+
|
|
53
|
+
**Rationale:** {{rationale}}
|
|
54
|
+
|
|
55
|
+
**Evidence:** {{evidence}}
|
|
56
|
+
|
|
57
|
+
**Alternatives Considered:**
|
|
58
|
+
- {{alternative1}} — {{whyNotChosen1}}
|
|
59
|
+
- {{alternative2}} — {{whyNotChosen2}}
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
> Add additional decisions as separate `### Decision Title` blocks following the same structure above.
|
|
64
|
+
|
|
65
|
+
## Interface Contracts
|
|
66
|
+
|
|
67
|
+
{{interfaceContracts}}
|
|
68
|
+
|
|
69
|
+
> Document API boundaries, function signatures, data shapes, or protocol agreements that must be honored. Leave blank or remove if not applicable to this milestone.
|
|
70
|
+
|
|
71
|
+
## Error Handling Strategy
|
|
72
|
+
|
|
73
|
+
{{errorHandlingStrategy}}
|
|
74
|
+
|
|
75
|
+
> Describe the approach for handling failures, edge cases, and error propagation. Include retry policies, fallback behaviors, and user-facing error messages where relevant.
|
|
76
|
+
|
|
77
|
+
## Final Integrated Acceptance
|
|
78
|
+
|
|
79
|
+
To call this milestone complete, we must prove:
|
|
80
|
+
|
|
81
|
+
- {{one real end-to-end scenario}}
|
|
82
|
+
- {{one real end-to-end scenario}}
|
|
83
|
+
- {{what cannot be simulated if this milestone is to be considered truly done}}
|
|
84
|
+
|
|
85
|
+
## Testing Requirements
|
|
86
|
+
|
|
87
|
+
{{testingRequirements}}
|
|
88
|
+
|
|
89
|
+
> Specify test types (unit, integration, e2e), coverage expectations, and any specific test scenarios that must pass.
|
|
90
|
+
|
|
91
|
+
## Acceptance Criteria
|
|
92
|
+
|
|
93
|
+
{{acceptanceCriteria}}
|
|
94
|
+
|
|
95
|
+
> Per-slice acceptance criteria gathered during discussion. Each slice should have clear, testable criteria.
|
|
96
|
+
|
|
97
|
+
## Risks and Unknowns
|
|
98
|
+
|
|
99
|
+
- {{riskOrUnknown}} — {{whyItMatters}}
|
|
100
|
+
|
|
101
|
+
## Existing Codebase / Prior Art
|
|
102
|
+
|
|
103
|
+
- `{{fileOrModule}}` — {{howItRelates}}
|
|
104
|
+
- `{{fileOrModule}}` — {{howItRelates}}
|
|
105
|
+
|
|
106
|
+
> See `.gsd/DECISIONS.md` for all architectural and pattern decisions — it is an append-only register; read it during planning, append to it during execution.
|
|
107
|
+
|
|
108
|
+
## Relevant Requirements
|
|
109
|
+
|
|
110
|
+
- {{requirementId}} — {{howThisMilestoneAdvancesIt}}
|
|
111
|
+
|
|
112
|
+
## Scope
|
|
113
|
+
|
|
114
|
+
### In Scope
|
|
115
|
+
|
|
116
|
+
- {{inScopeItem}}
|
|
117
|
+
|
|
118
|
+
### Out of Scope / Non-Goals
|
|
119
|
+
|
|
120
|
+
- {{outOfScopeItem}}
|
|
121
|
+
|
|
122
|
+
## Technical Constraints
|
|
123
|
+
|
|
124
|
+
- {{constraint}}
|
|
125
|
+
|
|
126
|
+
## Integration Points
|
|
127
|
+
|
|
128
|
+
- {{systemOrService}} — {{howThisMilestoneInteractsWithIt}}
|
|
129
|
+
|
|
130
|
+
## Ecosystem Notes
|
|
131
|
+
|
|
132
|
+
{{ecosystemNotes}}
|
|
133
|
+
|
|
134
|
+
> Research findings, best practices, known issues, and relevant external documentation discovered during preparation.
|
|
135
|
+
|
|
136
|
+
## Open Questions
|
|
137
|
+
|
|
138
|
+
- {{question}} — {{currentThinking}}
|