gsd-pi 2.43.0 → 2.44.0-dev.0b97ffd
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 +30 -12
- package/dist/cli.js +13 -1
- package/dist/help-text.js +24 -0
- package/dist/resources/extensions/bg-shell/overlay.js +3 -0
- package/dist/resources/extensions/github-sync/sync.js +2 -1
- package/dist/resources/extensions/gsd/auto/loop.js +0 -2
- package/dist/resources/extensions/gsd/auto/phases.js +7 -12
- package/dist/resources/extensions/gsd/auto-dashboard.js +19 -18
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +34 -19
- package/dist/resources/extensions/gsd/auto-dispatch.js +36 -21
- package/dist/resources/extensions/gsd/auto-post-unit.js +128 -14
- package/dist/resources/extensions/gsd/auto-prompts.js +202 -92
- package/dist/resources/extensions/gsd/auto-recovery.js +83 -135
- package/dist/resources/extensions/gsd/auto-start.js +10 -0
- package/dist/resources/extensions/gsd/auto-supervisor.js +14 -0
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +4 -7
- package/dist/resources/extensions/gsd/auto-verification.js +5 -10
- package/dist/resources/extensions/gsd/auto-worktree.js +123 -30
- package/dist/resources/extensions/gsd/auto.js +1 -4
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +611 -0
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +28 -3
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -0
- package/dist/resources/extensions/gsd/commands/catalog.js +3 -1
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +15 -1
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
- package/dist/resources/extensions/gsd/commands-maintenance.js +78 -3
- package/dist/resources/extensions/gsd/dashboard-overlay.js +32 -31
- package/dist/resources/extensions/gsd/db-writer.js +95 -4
- package/dist/resources/extensions/gsd/dispatch-guard.js +35 -30
- package/dist/resources/extensions/gsd/doctor-checks.js +28 -11
- package/dist/resources/extensions/gsd/doctor-environment.js +28 -0
- package/dist/resources/extensions/gsd/doctor-types.js +0 -15
- package/dist/resources/extensions/gsd/doctor.js +46 -282
- package/dist/resources/extensions/gsd/file-watcher.js +5 -1
- package/dist/resources/extensions/gsd/files.js +14 -198
- package/dist/resources/extensions/gsd/git-service.js +4 -0
- package/dist/resources/extensions/gsd/gitignore.js +4 -0
- package/dist/resources/extensions/gsd/gsd-db.js +819 -197
- package/dist/resources/extensions/gsd/guided-flow.js +18 -8
- package/dist/resources/extensions/gsd/markdown-renderer.js +862 -0
- package/dist/resources/extensions/gsd/md-importer.js +182 -4
- package/dist/resources/extensions/gsd/native-git-bridge.js +10 -1
- package/dist/resources/extensions/gsd/parallel-eligibility.js +14 -19
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +38 -0
- package/dist/resources/extensions/gsd/parsers-legacy.js +239 -0
- package/dist/resources/extensions/gsd/preferences-types.js +1 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +9 -0
- package/dist/resources/extensions/gsd/preferences.js +1 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +22 -9
- package/dist/resources/extensions/gsd/prompts/discuss.md +2 -2
- package/dist/resources/extensions/gsd/prompts/execute-task.md +15 -5
- package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -7
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +6 -6
- package/dist/resources/extensions/gsd/reactive-graph.js +33 -3
- package/dist/resources/extensions/gsd/skill-health.js +3 -1
- package/dist/resources/extensions/gsd/state.js +484 -30
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +128 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +244 -0
- package/dist/resources/extensions/gsd/tools/complete-task.js +204 -0
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +205 -0
- package/dist/resources/extensions/gsd/tools/plan-slice.js +155 -0
- package/dist/resources/extensions/gsd/tools/plan-task.js +94 -0
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +152 -0
- package/dist/resources/extensions/gsd/tools/replan-slice.js +146 -0
- package/dist/resources/extensions/gsd/triage-resolution.js +17 -1
- package/dist/resources/extensions/gsd/undo.js +197 -3
- package/dist/resources/extensions/gsd/visualizer-data.js +53 -16
- package/dist/resources/extensions/gsd/workspace-index.js +63 -39
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +18 -17
- 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 +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
- 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 -4
- 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 -2
- 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/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/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 +5 -5
- 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 -0
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -0
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -0
- 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 +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 +5 -5
- 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 -5
- 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 -4
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- 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 +18 -17
- package/dist/web/standalone/.next/server/chunks/229.js +3 -3
- package/dist/web/standalone/.next/server/chunks/471.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/alS4hoANx0TK4UVZY27da/_buildManifest.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{4024.c195dc1fdd2adbea.js → 4024.0de81b543b28b9fe.js} +2 -2
- package/dist/web/standalone/.next/static/chunks/app/_global-error/{page-d07a2c023f1aef1e.js → page-d83ba70a25a85472.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-f2a7482d42a5614b.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/boot/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{main-app-2f2ee7b85712c2bd.js → main-app-fdab67f7802d7832.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d83ba70a25a85472.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-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-fa307370fcf9fb2c.js → webpack-9014b5adb127a98a.js} +1 -1
- package/dist/web/standalone/.next/static/css/8a727f372cf53002.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 +4 -4
- package/packages/pi-ai/dist/models.custom.d.ts +173 -0
- package/packages/pi-ai/dist/models.custom.d.ts.map +1 -0
- package/packages/pi-ai/dist/models.custom.js +170 -0
- package/packages/pi-ai/dist/models.custom.js.map +1 -0
- package/packages/pi-ai/dist/models.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.js +16 -1
- package/packages/pi-ai/dist/models.js.map +1 -1
- package/packages/pi-ai/dist/models.test.d.ts +2 -0
- package/packages/pi-ai/dist/models.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/models.test.js +67 -0
- package/packages/pi-ai/dist/models.test.js.map +1 -0
- package/packages/pi-ai/src/models.custom.ts +172 -0
- package/packages/pi-ai/src/models.test.ts +85 -0
- package/packages/pi-ai/src/models.ts +17 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +10 -3
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +21 -34
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +4 -4
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +6 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +80 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.test.js +63 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +24 -26
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +37 -0
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/fallback-resolver.js +2 -3
- package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +12 -2
- package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
- package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +38 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +192 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/lsp/client.d.ts +5 -0
- package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/client.js +69 -21
- package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +255 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +15 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-commands.d.ts +25 -0
- package/packages/pi-coding-agent/dist/core/package-commands.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/package-commands.js +253 -0
- package/packages/pi-coding-agent/dist/core/package-commands.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.js +225 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +34 -44
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +4 -0
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.test.js +30 -34
- package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +3 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -0
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +11 -199
- package/packages/pi-coding-agent/dist/main.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts +6 -0
- 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 +21 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +8 -15
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/print-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/print-mode.js +45 -34
- package/packages/pi-coding-agent/dist/modes/print-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js +7 -2
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +2 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +26 -37
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
- package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +2 -2
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +3 -3
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +4 -4
- package/packages/pi-coding-agent/src/core/extensions/index.ts +5 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.test.ts +96 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +89 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
- package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -0
- package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +15 -2
- package/packages/pi-coding-agent/src/core/fallback-resolver.ts +2 -3
- package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
- package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +274 -0
- package/packages/pi-coding-agent/src/core/lsp/client.ts +83 -21
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +288 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +39 -3
- package/packages/pi-coding-agent/src/core/package-commands.test.ts +240 -0
- package/packages/pi-coding-agent/src/core/package-commands.ts +310 -0
- package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
- package/packages/pi-coding-agent/src/core/sdk.ts +4 -0
- package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
- package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
- package/packages/pi-coding-agent/src/index.ts +7 -0
- package/packages/pi-coding-agent/src/main.ts +11 -232
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +20 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +9 -16
- package/packages/pi-coding-agent/src/modes/print-mode.ts +42 -32
- package/packages/pi-coding-agent/src/modes/rpc/rpc-client.ts +8 -2
- package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -1
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
- package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.js +8 -15
- package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/bg-shell/overlay.ts +4 -0
- package/src/resources/extensions/github-sync/sync.ts +2 -1
- package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -8
- package/src/resources/extensions/gsd/auto/loop.ts +0 -2
- package/src/resources/extensions/gsd/auto/phases.ts +7 -20
- package/src/resources/extensions/gsd/auto/types.ts +0 -1
- package/src/resources/extensions/gsd/auto-dashboard.ts +20 -16
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +34 -19
- package/src/resources/extensions/gsd/auto-dispatch.ts +38 -21
- package/src/resources/extensions/gsd/auto-post-unit.ts +150 -15
- package/src/resources/extensions/gsd/auto-prompts.ts +186 -103
- package/src/resources/extensions/gsd/auto-recovery.ts +77 -142
- package/src/resources/extensions/gsd/auto-start.ts +14 -0
- package/src/resources/extensions/gsd/auto-supervisor.ts +14 -0
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +6 -7
- package/src/resources/extensions/gsd/auto-verification.ts +4 -9
- package/src/resources/extensions/gsd/auto-worktree.ts +126 -30
- package/src/resources/extensions/gsd/auto.ts +0 -9
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +675 -4
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +31 -3
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -0
- package/src/resources/extensions/gsd/commands/catalog.ts +3 -1
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +15 -1
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
- package/src/resources/extensions/gsd/commands-maintenance.ts +86 -3
- package/src/resources/extensions/gsd/dashboard-overlay.ts +17 -13
- package/src/resources/extensions/gsd/db-writer.ts +105 -4
- package/src/resources/extensions/gsd/dispatch-guard.ts +32 -30
- package/src/resources/extensions/gsd/doctor-checks.ts +25 -11
- package/src/resources/extensions/gsd/doctor-environment.ts +31 -0
- package/src/resources/extensions/gsd/doctor-types.ts +0 -23
- package/src/resources/extensions/gsd/doctor.ts +45 -295
- package/src/resources/extensions/gsd/file-watcher.ts +4 -1
- package/src/resources/extensions/gsd/files.ts +16 -220
- package/src/resources/extensions/gsd/git-service.ts +4 -0
- package/src/resources/extensions/gsd/gitignore.ts +4 -0
- package/src/resources/extensions/gsd/gsd-db.ts +1157 -370
- package/src/resources/extensions/gsd/guided-flow.ts +20 -8
- package/src/resources/extensions/gsd/markdown-renderer.ts +1098 -0
- package/src/resources/extensions/gsd/md-importer.ts +211 -2
- package/src/resources/extensions/gsd/native-git-bridge.ts +12 -1
- package/src/resources/extensions/gsd/parallel-eligibility.ts +14 -18
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +43 -0
- package/src/resources/extensions/gsd/parsers-legacy.ts +271 -0
- package/src/resources/extensions/gsd/preferences-types.ts +3 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +9 -0
- package/src/resources/extensions/gsd/preferences.ts +1 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +22 -9
- package/src/resources/extensions/gsd/prompts/discuss.md +2 -2
- package/src/resources/extensions/gsd/prompts/execute-task.md +15 -5
- package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
- package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -7
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
- package/src/resources/extensions/gsd/prompts/replan-slice.md +6 -6
- package/src/resources/extensions/gsd/reactive-graph.ts +33 -3
- package/src/resources/extensions/gsd/skill-health.ts +2 -1
- package/src/resources/extensions/gsd/state.ts +547 -29
- package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
- package/src/resources/extensions/gsd/tests/atomic-task-closeout.test.ts +8 -120
- package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +14 -16
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +20 -11
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
- package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +600 -513
- package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
- package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
- package/src/resources/extensions/gsd/tests/auto-stash-merge.test.ts +121 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +540 -668
- package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
- package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
- package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
- package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
- package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
- package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
- package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +39 -60
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +375 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +387 -0
- package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
- package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
- package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +27 -35
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -2
- package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +390 -420
- package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +512 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +644 -84
- package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
- package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
- package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +192 -161
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
- package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
- package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +30 -90
- package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
- package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +57 -80
- package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +164 -0
- package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
- package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +55 -153
- package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
- package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
- package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +53 -97
- package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
- package/src/resources/extensions/gsd/tests/doctor.test.ts +109 -149
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
- package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
- package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
- package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +278 -0
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +232 -0
- package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
- package/src/resources/extensions/gsd/tests/git-service.test.ts +291 -390
- package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
- package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +440 -0
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +81 -270
- package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
- package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
- package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
- package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
- package/src/resources/extensions/gsd/tests/integration-proof.test.ts +643 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1161 -0
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +81 -94
- package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
- package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +429 -0
- package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +89 -97
- package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +127 -164
- package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +35 -36
- package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +40 -47
- package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +25 -28
- package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
- package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
- package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
- package/src/resources/extensions/gsd/tests/parsers.test.ts +548 -612
- package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +176 -113
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +145 -0
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +305 -0
- package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
- package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
- package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
- package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +325 -0
- package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
- package/src/resources/extensions/gsd/tests/replan-handler.test.ts +410 -0
- package/src/resources/extensions/gsd/tests/replan-slice.test.ts +73 -80
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
- package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
- package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +296 -0
- package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
- package/src/resources/extensions/gsd/tests/schema-v9-sequence.test.ts +176 -0
- package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -44
- package/src/resources/extensions/gsd/tests/shared-wal.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
- package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
- package/src/resources/extensions/gsd/tests/token-cost-display.test.ts +118 -0
- package/src/resources/extensions/gsd/tests/token-savings.test.ts +54 -56
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +23 -25
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +19 -13
- package/src/resources/extensions/gsd/tests/undo.test.ts +321 -1
- package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +0 -142
- package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -22
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
- package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
- package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +50 -52
- package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
- package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +12 -5
- package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
- package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
- package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +176 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +300 -0
- package/src/resources/extensions/gsd/tools/complete-task.ts +245 -0
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +249 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +194 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +116 -0
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +203 -0
- package/src/resources/extensions/gsd/tools/replan-slice.ts +192 -0
- package/src/resources/extensions/gsd/triage-resolution.ts +20 -1
- package/src/resources/extensions/gsd/types.ts +50 -0
- package/src/resources/extensions/gsd/undo.ts +247 -3
- package/src/resources/extensions/gsd/visualizer-data.ts +54 -17
- package/src/resources/extensions/gsd/workspace-index.ts +64 -46
- package/dist/resources/extensions/gsd/auto-observability.js +0 -56
- package/dist/resources/extensions/gsd/observability-validator.js +0 -422
- package/dist/resources/extensions/gsd/roadmap-mutations.js +0 -110
- package/dist/web/standalone/.next/static/VvclDCW6TAWjEyLU-EYL1/_buildManifest.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-e07acdb7dd069836.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/layout-745c6ed5fea5fb06.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-801b53eff6e83579.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-e6255954dccfcf0a.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/css/123c0bb039697968.css +0 -1
- package/src/resources/extensions/gsd/auto-observability.ts +0 -74
- package/src/resources/extensions/gsd/observability-validator.ts +0 -456
- package/src/resources/extensions/gsd/roadmap-mutations.ts +0 -134
- package/src/resources/extensions/gsd/tests/doctor-task-done-missing-summary-slice-loop.test.ts +0 -174
- package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -474
- /package/dist/web/standalone/.next/static/{VvclDCW6TAWjEyLU-EYL1 → alS4hoANx0TK4UVZY27da}/_ssgManifest.js +0 -0
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
// GSD Extension — State Derivation
|
|
2
|
-
//
|
|
2
|
+
// DB-primary state derivation with filesystem fallback for unmigrated projects.
|
|
3
3
|
// Pure TypeScript, zero Pi dependencies.
|
|
4
|
-
import { parseRoadmap, parsePlan,
|
|
4
|
+
import { parseRoadmap, parsePlan, } from './parsers-legacy.js';
|
|
5
|
+
import { parseSummary, loadFile, parseRequirementCounts, parseContextDependsOn, } from './files.js';
|
|
5
6
|
import { resolveMilestoneFile, resolveSlicePath, resolveSliceFile, resolveTaskFile, resolveTasksDir, resolveGsdRootFile, gsdRoot, } from './paths.js';
|
|
6
7
|
import { findMilestoneIds } from './milestone-ids.js';
|
|
7
8
|
import { nativeBatchParseGsdFiles } from './native-parser-bridge.js';
|
|
8
9
|
import { join, resolve } from 'path';
|
|
9
10
|
import { existsSync, readdirSync } from 'node:fs';
|
|
10
11
|
import { debugCount, debugTime } from './debug-logger.js';
|
|
12
|
+
import { isDbAvailable, getAllMilestones, getMilestoneSlices, getSliceTasks, getReplanHistory, getSlice, } from './gsd-db.js';
|
|
11
13
|
/**
|
|
12
14
|
* A "ghost" milestone directory contains only META.json (and no substantive
|
|
13
15
|
* files like CONTEXT, CONTEXT-DRAFT, ROADMAP, or SUMMARY). These appear when
|
|
@@ -66,40 +68,48 @@ export function invalidateStateCache() {
|
|
|
66
68
|
* Returns the ID of the first incomplete milestone, or null if all are complete.
|
|
67
69
|
*/
|
|
68
70
|
export async function getActiveMilestoneId(basePath) {
|
|
69
|
-
const milestoneIds = findMilestoneIds(basePath);
|
|
70
71
|
// Parallel worker isolation
|
|
71
72
|
const milestoneLock = process.env.GSD_MILESTONE_LOCK;
|
|
72
73
|
if (milestoneLock) {
|
|
74
|
+
const milestoneIds = findMilestoneIds(basePath);
|
|
73
75
|
if (!milestoneIds.includes(milestoneLock))
|
|
74
76
|
return null;
|
|
75
|
-
// Locked milestone that is parked should not be active
|
|
76
77
|
const lockedParked = resolveMilestoneFile(basePath, milestoneLock, "PARKED");
|
|
77
78
|
if (lockedParked)
|
|
78
79
|
return null;
|
|
79
80
|
return milestoneLock;
|
|
80
81
|
}
|
|
82
|
+
// DB-first: query milestones table for the first non-complete, non-parked milestone
|
|
83
|
+
if (isDbAvailable()) {
|
|
84
|
+
const allMilestones = getAllMilestones();
|
|
85
|
+
if (allMilestones.length > 0) {
|
|
86
|
+
const sorted = [...allMilestones].sort((a, b) => a.id.localeCompare(b.id));
|
|
87
|
+
for (const m of sorted) {
|
|
88
|
+
if (m.status === "complete" || m.status === "done" || m.status === "parked")
|
|
89
|
+
continue;
|
|
90
|
+
return m.id;
|
|
91
|
+
}
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Filesystem fallback for unmigrated projects or empty DB
|
|
96
|
+
const milestoneIds = findMilestoneIds(basePath);
|
|
81
97
|
for (const mid of milestoneIds) {
|
|
82
|
-
// Skip parked milestones — they are not eligible for active status
|
|
83
98
|
const parkedFile = resolveMilestoneFile(basePath, mid, "PARKED");
|
|
84
99
|
if (parkedFile)
|
|
85
100
|
continue;
|
|
86
101
|
const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
|
|
87
102
|
const content = roadmapFile ? await loadFile(roadmapFile) : null;
|
|
88
103
|
if (!content) {
|
|
89
|
-
// No roadmap — but if a summary exists, the milestone is already complete
|
|
90
104
|
const summaryFile = resolveMilestoneFile(basePath, mid, "SUMMARY");
|
|
91
105
|
if (summaryFile)
|
|
92
|
-
continue;
|
|
106
|
+
continue;
|
|
93
107
|
if (isGhostMilestone(basePath, mid))
|
|
94
|
-
continue;
|
|
95
|
-
return mid;
|
|
96
|
-
// Note: draft-awareness (CONTEXT-DRAFT.md) is handled in deriveState(), not here.
|
|
97
|
-
// A draft milestone is still "active" — this function only determines which milestone is current.
|
|
108
|
+
continue;
|
|
109
|
+
return mid;
|
|
98
110
|
}
|
|
99
111
|
const roadmap = parseRoadmap(content);
|
|
100
112
|
if (!isMilestoneComplete(roadmap)) {
|
|
101
|
-
// Summary is the terminal artifact — if it exists, the milestone is
|
|
102
|
-
// complete even when roadmap checkboxes weren't ticked (#864).
|
|
103
113
|
const summaryFile = resolveMilestoneFile(basePath, mid, "SUMMARY");
|
|
104
114
|
if (!summaryFile)
|
|
105
115
|
return mid;
|
|
@@ -108,13 +118,12 @@ export async function getActiveMilestoneId(basePath) {
|
|
|
108
118
|
return null;
|
|
109
119
|
}
|
|
110
120
|
/**
|
|
111
|
-
* Reconstruct GSD state from
|
|
112
|
-
*
|
|
121
|
+
* Reconstruct GSD state from DB (primary) or filesystem (fallback).
|
|
122
|
+
* STATE.md is a rendered cache of this output.
|
|
113
123
|
*
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
* Falls back to sequential JS file reads when the native module is absent.
|
|
124
|
+
* When DB is available, queries milestone/slice/task tables directly.
|
|
125
|
+
* Falls back to filesystem parsing for unmigrated projects or when DB
|
|
126
|
+
* has zero milestones (e.g. first run before migration).
|
|
118
127
|
*/
|
|
119
128
|
export async function deriveState(basePath) {
|
|
120
129
|
// Return cached result if within the TTL window for the same basePath
|
|
@@ -124,7 +133,23 @@ export async function deriveState(basePath) {
|
|
|
124
133
|
return _stateCache.result;
|
|
125
134
|
}
|
|
126
135
|
const stopTimer = debugTime("derive-state-impl");
|
|
127
|
-
|
|
136
|
+
let result;
|
|
137
|
+
// Dual-path: try DB-backed derivation first when hierarchy tables are populated
|
|
138
|
+
if (isDbAvailable()) {
|
|
139
|
+
const dbMilestones = getAllMilestones();
|
|
140
|
+
if (dbMilestones.length > 0) {
|
|
141
|
+
const stopDbTimer = debugTime("derive-state-db");
|
|
142
|
+
result = await deriveStateFromDb(basePath);
|
|
143
|
+
stopDbTimer({ phase: result.phase, milestone: result.activeMilestone?.id });
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
// DB open but empty hierarchy tables — pre-migration project, use filesystem
|
|
147
|
+
result = await _deriveStateImpl(basePath);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
result = await _deriveStateImpl(basePath);
|
|
152
|
+
}
|
|
128
153
|
stopTimer({ phase: result.phase, milestone: result.activeMilestone?.id });
|
|
129
154
|
debugCount("deriveStateCalls");
|
|
130
155
|
_stateCache = { basePath, result, timestamp: Date.now() };
|
|
@@ -134,6 +159,13 @@ export async function deriveState(basePath) {
|
|
|
134
159
|
* Extract milestone title from CONTEXT.md or CONTEXT-DRAFT.md heading.
|
|
135
160
|
* Falls back to the provided fallback (usually the milestone ID).
|
|
136
161
|
*/
|
|
162
|
+
/**
|
|
163
|
+
* Strip the "M001: " prefix from a milestone title to get the human-readable name.
|
|
164
|
+
* Used by both DB and filesystem paths for consistency.
|
|
165
|
+
*/
|
|
166
|
+
function stripMilestonePrefix(title) {
|
|
167
|
+
return title.replace(/^M\d+(?:-[a-z0-9]{6})?[^:]*:\s*/, '') || title;
|
|
168
|
+
}
|
|
137
169
|
function extractContextTitle(content, fallback) {
|
|
138
170
|
if (!content)
|
|
139
171
|
return fallback;
|
|
@@ -141,9 +173,434 @@ function extractContextTitle(content, fallback) {
|
|
|
141
173
|
if (!h1)
|
|
142
174
|
return fallback;
|
|
143
175
|
// Extract title from "# M005: Platform Foundation & Separation" format
|
|
144
|
-
return h1.slice(2).trim()
|
|
176
|
+
return stripMilestonePrefix(h1.slice(2).trim()) || fallback;
|
|
177
|
+
}
|
|
178
|
+
// ─── DB-backed State Derivation ────────────────────────────────────────────
|
|
179
|
+
/**
|
|
180
|
+
* Helper: check if a DB status counts as "done" (handles K002 ambiguity).
|
|
181
|
+
*/
|
|
182
|
+
function isStatusDone(status) {
|
|
183
|
+
return status === 'complete' || status === 'done';
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Derive GSD state from the milestones/slices/tasks DB tables.
|
|
187
|
+
* Flag files (PARKED, VALIDATION, CONTINUE, REPLAN, REPLAN-TRIGGER, CONTEXT-DRAFT)
|
|
188
|
+
* are still checked on the filesystem since they aren't in DB tables.
|
|
189
|
+
* Requirements also stay file-based via parseRequirementCounts().
|
|
190
|
+
*
|
|
191
|
+
* Must produce field-identical GSDState to _deriveStateImpl() for the same project.
|
|
192
|
+
*/
|
|
193
|
+
export async function deriveStateFromDb(basePath) {
|
|
194
|
+
const requirements = parseRequirementCounts(await loadFile(resolveGsdRootFile(basePath, "REQUIREMENTS")));
|
|
195
|
+
const allMilestones = getAllMilestones();
|
|
196
|
+
// Parallel worker isolation: when locked, filter to just the locked milestone
|
|
197
|
+
const milestoneLock = process.env.GSD_MILESTONE_LOCK;
|
|
198
|
+
const milestones = milestoneLock
|
|
199
|
+
? allMilestones.filter(m => m.id === milestoneLock)
|
|
200
|
+
: allMilestones;
|
|
201
|
+
if (milestones.length === 0) {
|
|
202
|
+
return {
|
|
203
|
+
activeMilestone: null,
|
|
204
|
+
activeSlice: null,
|
|
205
|
+
activeTask: null,
|
|
206
|
+
phase: 'pre-planning',
|
|
207
|
+
recentDecisions: [],
|
|
208
|
+
blockers: [],
|
|
209
|
+
nextAction: 'No milestones found. Run /gsd to create one.',
|
|
210
|
+
registry: [],
|
|
211
|
+
requirements,
|
|
212
|
+
progress: { milestones: { done: 0, total: 0 } },
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
// Phase 1: Build completeness set (which milestones count as "done" for dep resolution)
|
|
216
|
+
const completeMilestoneIds = new Set();
|
|
217
|
+
const parkedMilestoneIds = new Set();
|
|
218
|
+
for (const m of milestones) {
|
|
219
|
+
// Check disk for PARKED flag (not stored in DB status reliably — disk is truth for flag files)
|
|
220
|
+
const parkedFile = resolveMilestoneFile(basePath, m.id, "PARKED");
|
|
221
|
+
if (parkedFile || m.status === 'parked') {
|
|
222
|
+
parkedMilestoneIds.add(m.id);
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
if (isStatusDone(m.status)) {
|
|
226
|
+
completeMilestoneIds.add(m.id);
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
// Check if milestone has a summary on disk (terminal artifact per #864)
|
|
230
|
+
const summaryFile = resolveMilestoneFile(basePath, m.id, "SUMMARY");
|
|
231
|
+
if (summaryFile) {
|
|
232
|
+
completeMilestoneIds.add(m.id);
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
// Check roadmap: all slices done means milestone is complete
|
|
236
|
+
const slices = getMilestoneSlices(m.id);
|
|
237
|
+
if (slices.length > 0 && slices.every(s => isStatusDone(s.status))) {
|
|
238
|
+
// All slices done but no summary — still counts as complete for dep resolution
|
|
239
|
+
// if a summary file exists
|
|
240
|
+
// Note: without summary file, the milestone is in validating/completing state, not complete
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// Phase 2: Build registry and find active milestone
|
|
244
|
+
const registry = [];
|
|
245
|
+
let activeMilestone = null;
|
|
246
|
+
let activeMilestoneSlices = [];
|
|
247
|
+
let activeMilestoneFound = false;
|
|
248
|
+
let activeMilestoneHasDraft = false;
|
|
249
|
+
for (const m of milestones) {
|
|
250
|
+
if (parkedMilestoneIds.has(m.id)) {
|
|
251
|
+
registry.push({ id: m.id, title: stripMilestonePrefix(m.title) || m.id, status: 'parked' });
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
// Ghost milestone check: no slices in DB AND no substantive files on disk
|
|
255
|
+
const slices = getMilestoneSlices(m.id);
|
|
256
|
+
if (slices.length === 0 && !isStatusDone(m.status)) {
|
|
257
|
+
// Check disk for ghost detection
|
|
258
|
+
if (isGhostMilestone(basePath, m.id))
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
const summaryFile = resolveMilestoneFile(basePath, m.id, "SUMMARY");
|
|
262
|
+
// Determine if this milestone is complete
|
|
263
|
+
if (completeMilestoneIds.has(m.id) || (summaryFile !== null)) {
|
|
264
|
+
// Get title from DB or summary
|
|
265
|
+
let title = stripMilestonePrefix(m.title) || m.id;
|
|
266
|
+
if (summaryFile && !m.title) {
|
|
267
|
+
const summaryContent = await loadFile(summaryFile);
|
|
268
|
+
if (summaryContent) {
|
|
269
|
+
title = parseSummary(summaryContent).title || m.id;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
registry.push({ id: m.id, title, status: 'complete' });
|
|
273
|
+
completeMilestoneIds.add(m.id); // ensure it's in the set
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
// Not complete — determine if it should be active
|
|
277
|
+
const allSlicesDone = slices.length > 0 && slices.every(s => isStatusDone(s.status));
|
|
278
|
+
// Get title — prefer DB, fall back to context file extraction
|
|
279
|
+
let title = stripMilestonePrefix(m.title) || m.id;
|
|
280
|
+
if (title === m.id) {
|
|
281
|
+
const contextFile = resolveMilestoneFile(basePath, m.id, "CONTEXT");
|
|
282
|
+
const draftFile = resolveMilestoneFile(basePath, m.id, "CONTEXT-DRAFT");
|
|
283
|
+
const contextContent = contextFile ? await loadFile(contextFile) : null;
|
|
284
|
+
const draftContent = draftFile && !contextContent ? await loadFile(draftFile) : null;
|
|
285
|
+
title = extractContextTitle(contextContent || draftContent, m.id);
|
|
286
|
+
}
|
|
287
|
+
if (!activeMilestoneFound) {
|
|
288
|
+
// Check milestone-level dependencies
|
|
289
|
+
const deps = m.depends_on;
|
|
290
|
+
const depsUnmet = deps.some(dep => !completeMilestoneIds.has(dep));
|
|
291
|
+
if (depsUnmet) {
|
|
292
|
+
registry.push({ id: m.id, title, status: 'pending', dependsOn: deps });
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
// Handle all-slices-done case (validating/completing)
|
|
296
|
+
if (allSlicesDone) {
|
|
297
|
+
const validationFile = resolveMilestoneFile(basePath, m.id, "VALIDATION");
|
|
298
|
+
const validationContent = validationFile ? await loadFile(validationFile) : null;
|
|
299
|
+
const validationTerminal = validationContent ? isValidationTerminal(validationContent) : false;
|
|
300
|
+
if (!validationTerminal || (validationTerminal && !summaryFile)) {
|
|
301
|
+
// Validating or completing — still active
|
|
302
|
+
activeMilestone = { id: m.id, title };
|
|
303
|
+
activeMilestoneSlices = slices;
|
|
304
|
+
activeMilestoneFound = true;
|
|
305
|
+
registry.push({ id: m.id, title, status: 'active', ...(deps.length > 0 ? { dependsOn: deps } : {}) });
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
// Check for context draft (needs-discussion phase)
|
|
310
|
+
const contextFile = resolveMilestoneFile(basePath, m.id, "CONTEXT");
|
|
311
|
+
const draftFile = resolveMilestoneFile(basePath, m.id, "CONTEXT-DRAFT");
|
|
312
|
+
if (!contextFile && draftFile)
|
|
313
|
+
activeMilestoneHasDraft = true;
|
|
314
|
+
activeMilestone = { id: m.id, title };
|
|
315
|
+
activeMilestoneSlices = slices;
|
|
316
|
+
activeMilestoneFound = true;
|
|
317
|
+
registry.push({ id: m.id, title, status: 'active', ...(deps.length > 0 ? { dependsOn: deps } : {}) });
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
// After active milestone found — rest are pending
|
|
321
|
+
const deps = m.depends_on;
|
|
322
|
+
registry.push({ id: m.id, title, status: 'pending', ...(deps.length > 0 ? { dependsOn: deps } : {}) });
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
const milestoneProgress = {
|
|
326
|
+
done: registry.filter(e => e.status === 'complete').length,
|
|
327
|
+
total: registry.length,
|
|
328
|
+
};
|
|
329
|
+
// ── No active milestone ──────────────────────────────────────────────
|
|
330
|
+
if (!activeMilestone) {
|
|
331
|
+
const pendingEntries = registry.filter(e => e.status === 'pending');
|
|
332
|
+
const parkedEntries = registry.filter(e => e.status === 'parked');
|
|
333
|
+
if (pendingEntries.length > 0) {
|
|
334
|
+
const blockerDetails = pendingEntries
|
|
335
|
+
.filter(e => e.dependsOn && e.dependsOn.length > 0)
|
|
336
|
+
.map(e => `${e.id} is waiting on unmet deps: ${e.dependsOn.join(', ')}`);
|
|
337
|
+
return {
|
|
338
|
+
activeMilestone: null, activeSlice: null, activeTask: null,
|
|
339
|
+
phase: 'blocked',
|
|
340
|
+
recentDecisions: [], blockers: blockerDetails.length > 0
|
|
341
|
+
? blockerDetails
|
|
342
|
+
: ['All remaining milestones are dep-blocked but no deps listed — check CONTEXT.md files'],
|
|
343
|
+
nextAction: 'Resolve milestone dependencies before proceeding.',
|
|
344
|
+
registry, requirements,
|
|
345
|
+
progress: { milestones: milestoneProgress },
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
if (parkedEntries.length > 0) {
|
|
349
|
+
const parkedIds = parkedEntries.map(e => e.id).join(', ');
|
|
350
|
+
return {
|
|
351
|
+
activeMilestone: null, activeSlice: null, activeTask: null,
|
|
352
|
+
phase: 'pre-planning',
|
|
353
|
+
recentDecisions: [], blockers: [],
|
|
354
|
+
nextAction: `All remaining milestones are parked (${parkedIds}). Run /gsd unpark <id> or create a new milestone.`,
|
|
355
|
+
registry, requirements,
|
|
356
|
+
progress: { milestones: milestoneProgress },
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
if (registry.length === 0) {
|
|
360
|
+
return {
|
|
361
|
+
activeMilestone: null, activeSlice: null, activeTask: null,
|
|
362
|
+
phase: 'pre-planning',
|
|
363
|
+
recentDecisions: [], blockers: [],
|
|
364
|
+
nextAction: 'No milestones found. Run /gsd to create one.',
|
|
365
|
+
registry: [], requirements,
|
|
366
|
+
progress: { milestones: { done: 0, total: 0 } },
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
// All milestones complete
|
|
370
|
+
const lastEntry = registry[registry.length - 1];
|
|
371
|
+
const activeReqs = requirements.active ?? 0;
|
|
372
|
+
const completionNote = activeReqs > 0
|
|
373
|
+
? `All milestones complete. ${activeReqs} active requirement${activeReqs === 1 ? '' : 's'} in REQUIREMENTS.md ${activeReqs === 1 ? 'has' : 'have'} not been mapped to a milestone.`
|
|
374
|
+
: 'All milestones complete.';
|
|
375
|
+
return {
|
|
376
|
+
activeMilestone: lastEntry ? { id: lastEntry.id, title: lastEntry.title } : null,
|
|
377
|
+
activeSlice: null, activeTask: null,
|
|
378
|
+
phase: 'complete',
|
|
379
|
+
recentDecisions: [], blockers: [],
|
|
380
|
+
nextAction: completionNote,
|
|
381
|
+
registry, requirements,
|
|
382
|
+
progress: { milestones: milestoneProgress },
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
// ── Active milestone has no slices or no roadmap ────────────────────
|
|
386
|
+
const hasRoadmap = resolveMilestoneFile(basePath, activeMilestone.id, "ROADMAP") !== null;
|
|
387
|
+
if (activeMilestoneSlices.length === 0) {
|
|
388
|
+
if (!hasRoadmap) {
|
|
389
|
+
const phase = activeMilestoneHasDraft ? 'needs-discussion' : 'pre-planning';
|
|
390
|
+
const nextAction = activeMilestoneHasDraft
|
|
391
|
+
? `Discuss draft context for milestone ${activeMilestone.id}.`
|
|
392
|
+
: `Plan milestone ${activeMilestone.id}.`;
|
|
393
|
+
return {
|
|
394
|
+
activeMilestone, activeSlice: null, activeTask: null,
|
|
395
|
+
phase, recentDecisions: [], blockers: [],
|
|
396
|
+
nextAction, registry, requirements,
|
|
397
|
+
progress: { milestones: milestoneProgress },
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
// Has roadmap file but zero slices in DB — pre-planning (zero-slice roadmap guard)
|
|
401
|
+
return {
|
|
402
|
+
activeMilestone, activeSlice: null, activeTask: null,
|
|
403
|
+
phase: 'pre-planning',
|
|
404
|
+
recentDecisions: [], blockers: [],
|
|
405
|
+
nextAction: `Milestone ${activeMilestone.id} has a roadmap but no slices defined. Add slices to the roadmap.`,
|
|
406
|
+
registry, requirements,
|
|
407
|
+
progress: {
|
|
408
|
+
milestones: milestoneProgress,
|
|
409
|
+
slices: { done: 0, total: 0 },
|
|
410
|
+
},
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
// ── All slices done → validating/completing ─────────────────────────
|
|
414
|
+
const allSlicesDone = activeMilestoneSlices.every(s => isStatusDone(s.status));
|
|
415
|
+
if (allSlicesDone) {
|
|
416
|
+
const validationFile = resolveMilestoneFile(basePath, activeMilestone.id, "VALIDATION");
|
|
417
|
+
const validationContent = validationFile ? await loadFile(validationFile) : null;
|
|
418
|
+
const validationTerminal = validationContent ? isValidationTerminal(validationContent) : false;
|
|
419
|
+
const sliceProgress = {
|
|
420
|
+
done: activeMilestoneSlices.length,
|
|
421
|
+
total: activeMilestoneSlices.length,
|
|
422
|
+
};
|
|
423
|
+
if (!validationTerminal) {
|
|
424
|
+
return {
|
|
425
|
+
activeMilestone, activeSlice: null, activeTask: null,
|
|
426
|
+
phase: 'validating-milestone',
|
|
427
|
+
recentDecisions: [], blockers: [],
|
|
428
|
+
nextAction: `Validate milestone ${activeMilestone.id} before completion.`,
|
|
429
|
+
registry, requirements,
|
|
430
|
+
progress: { milestones: milestoneProgress, slices: sliceProgress },
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
return {
|
|
434
|
+
activeMilestone, activeSlice: null, activeTask: null,
|
|
435
|
+
phase: 'completing-milestone',
|
|
436
|
+
recentDecisions: [], blockers: [],
|
|
437
|
+
nextAction: `All slices complete in ${activeMilestone.id}. Write milestone summary.`,
|
|
438
|
+
registry, requirements,
|
|
439
|
+
progress: { milestones: milestoneProgress, slices: sliceProgress },
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
// ── Find active slice (first incomplete with deps satisfied) ─────────
|
|
443
|
+
const sliceProgress = {
|
|
444
|
+
done: activeMilestoneSlices.filter(s => isStatusDone(s.status)).length,
|
|
445
|
+
total: activeMilestoneSlices.length,
|
|
446
|
+
};
|
|
447
|
+
const doneSliceIds = new Set(activeMilestoneSlices.filter(s => isStatusDone(s.status)).map(s => s.id));
|
|
448
|
+
let activeSlice = null;
|
|
449
|
+
let activeSliceRow = null;
|
|
450
|
+
for (const s of activeMilestoneSlices) {
|
|
451
|
+
if (isStatusDone(s.status))
|
|
452
|
+
continue;
|
|
453
|
+
if (s.depends.every(dep => doneSliceIds.has(dep))) {
|
|
454
|
+
activeSlice = { id: s.id, title: s.title };
|
|
455
|
+
activeSliceRow = s;
|
|
456
|
+
break;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
if (!activeSlice) {
|
|
460
|
+
return {
|
|
461
|
+
activeMilestone, activeSlice: null, activeTask: null,
|
|
462
|
+
phase: 'blocked',
|
|
463
|
+
recentDecisions: [], blockers: ['No slice eligible — check dependency ordering'],
|
|
464
|
+
nextAction: 'Resolve dependency blockers or plan next slice.',
|
|
465
|
+
registry, requirements,
|
|
466
|
+
progress: { milestones: milestoneProgress, slices: sliceProgress },
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
// ── Check for slice plan file on disk ────────────────────────────────
|
|
470
|
+
const planFile = resolveSliceFile(basePath, activeMilestone.id, activeSlice.id, "PLAN");
|
|
471
|
+
if (!planFile) {
|
|
472
|
+
return {
|
|
473
|
+
activeMilestone, activeSlice, activeTask: null,
|
|
474
|
+
phase: 'planning',
|
|
475
|
+
recentDecisions: [], blockers: [],
|
|
476
|
+
nextAction: `Plan slice ${activeSlice.id} (${activeSlice.title}).`,
|
|
477
|
+
registry, requirements,
|
|
478
|
+
progress: { milestones: milestoneProgress, slices: sliceProgress },
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
// ── Get tasks from DB ────────────────────────────────────────────────
|
|
482
|
+
const tasks = getSliceTasks(activeMilestone.id, activeSlice.id);
|
|
483
|
+
const taskProgress = {
|
|
484
|
+
done: tasks.filter(t => isStatusDone(t.status)).length,
|
|
485
|
+
total: tasks.length,
|
|
486
|
+
};
|
|
487
|
+
const activeTaskRow = tasks.find(t => !isStatusDone(t.status));
|
|
488
|
+
if (!activeTaskRow && tasks.length > 0) {
|
|
489
|
+
// All tasks done but slice not marked complete → summarizing
|
|
490
|
+
return {
|
|
491
|
+
activeMilestone, activeSlice, activeTask: null,
|
|
492
|
+
phase: 'summarizing',
|
|
493
|
+
recentDecisions: [], blockers: [],
|
|
494
|
+
nextAction: `All tasks done in ${activeSlice.id}. Write slice summary and complete slice.`,
|
|
495
|
+
registry, requirements,
|
|
496
|
+
progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
|
|
497
|
+
};
|
|
498
|
+
}
|
|
499
|
+
// Empty plan — no tasks defined yet
|
|
500
|
+
if (!activeTaskRow) {
|
|
501
|
+
return {
|
|
502
|
+
activeMilestone, activeSlice, activeTask: null,
|
|
503
|
+
phase: 'planning',
|
|
504
|
+
recentDecisions: [], blockers: [],
|
|
505
|
+
nextAction: `Slice ${activeSlice.id} has a plan file but no tasks. Add tasks to the plan.`,
|
|
506
|
+
registry, requirements,
|
|
507
|
+
progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
|
|
508
|
+
};
|
|
509
|
+
}
|
|
510
|
+
const activeTask = { id: activeTaskRow.id, title: activeTaskRow.title };
|
|
511
|
+
// ── Task plan file check (#909) ─────────────────────────────────────
|
|
512
|
+
const tasksDir = resolveTasksDir(basePath, activeMilestone.id, activeSlice.id);
|
|
513
|
+
if (tasksDir && existsSync(tasksDir) && tasks.length > 0) {
|
|
514
|
+
const allFiles = readdirSync(tasksDir).filter(f => f.endsWith(".md"));
|
|
515
|
+
if (allFiles.length === 0) {
|
|
516
|
+
return {
|
|
517
|
+
activeMilestone, activeSlice, activeTask: null,
|
|
518
|
+
phase: 'planning',
|
|
519
|
+
recentDecisions: [], blockers: [],
|
|
520
|
+
nextAction: `Task plan files missing for ${activeSlice.id}. Run plan-slice to generate task plans.`,
|
|
521
|
+
registry, requirements,
|
|
522
|
+
progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
|
|
523
|
+
};
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
// ── Blocker detection: check completed tasks for blocker_discovered ──
|
|
527
|
+
const completedTasks = tasks.filter(t => isStatusDone(t.status));
|
|
528
|
+
let blockerTaskId = null;
|
|
529
|
+
for (const ct of completedTasks) {
|
|
530
|
+
if (ct.blocker_discovered) {
|
|
531
|
+
blockerTaskId = ct.id;
|
|
532
|
+
break;
|
|
533
|
+
}
|
|
534
|
+
// Also check disk summary in case DB doesn't have the flag
|
|
535
|
+
const summaryFile = resolveTaskFile(basePath, activeMilestone.id, activeSlice.id, ct.id, "SUMMARY");
|
|
536
|
+
if (!summaryFile)
|
|
537
|
+
continue;
|
|
538
|
+
const summaryContent = await loadFile(summaryFile);
|
|
539
|
+
if (!summaryContent)
|
|
540
|
+
continue;
|
|
541
|
+
const summary = parseSummary(summaryContent);
|
|
542
|
+
if (summary.frontmatter.blocker_discovered) {
|
|
543
|
+
blockerTaskId = ct.id;
|
|
544
|
+
break;
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
if (blockerTaskId) {
|
|
548
|
+
// Loop protection: if replan_history has entries for this slice, a replan
|
|
549
|
+
// was already performed — don't re-enter replanning phase.
|
|
550
|
+
const replanHistory = getReplanHistory(activeMilestone.id, activeSlice.id);
|
|
551
|
+
if (replanHistory.length === 0) {
|
|
552
|
+
return {
|
|
553
|
+
activeMilestone, activeSlice, activeTask,
|
|
554
|
+
phase: 'replanning-slice',
|
|
555
|
+
recentDecisions: [],
|
|
556
|
+
blockers: [`Task ${blockerTaskId} discovered a blocker requiring slice replan`],
|
|
557
|
+
nextAction: `Task ${blockerTaskId} reported blocker_discovered. Replan slice ${activeSlice.id} before continuing.`,
|
|
558
|
+
activeWorkspace: undefined,
|
|
559
|
+
registry, requirements,
|
|
560
|
+
progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
|
|
561
|
+
};
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
// ── REPLAN-TRIGGER detection ─────────────────────────────────────────
|
|
565
|
+
if (!blockerTaskId) {
|
|
566
|
+
const sliceRow = getSlice(activeMilestone.id, activeSlice.id);
|
|
567
|
+
if (sliceRow?.replan_triggered_at) {
|
|
568
|
+
// Loop protection: if replan_history has entries, replan was already done
|
|
569
|
+
const replanHistory = getReplanHistory(activeMilestone.id, activeSlice.id);
|
|
570
|
+
if (replanHistory.length === 0) {
|
|
571
|
+
return {
|
|
572
|
+
activeMilestone, activeSlice, activeTask,
|
|
573
|
+
phase: 'replanning-slice',
|
|
574
|
+
recentDecisions: [],
|
|
575
|
+
blockers: ['Triage replan trigger detected — slice replan required'],
|
|
576
|
+
nextAction: `Triage replan triggered for slice ${activeSlice.id}. Replan before continuing.`,
|
|
577
|
+
activeWorkspace: undefined,
|
|
578
|
+
registry, requirements,
|
|
579
|
+
progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
|
|
580
|
+
};
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
// ── Check for interrupted work ───────────────────────────────────────
|
|
585
|
+
const sDir = resolveSlicePath(basePath, activeMilestone.id, activeSlice.id);
|
|
586
|
+
const continueFile = sDir ? resolveSliceFile(basePath, activeMilestone.id, activeSlice.id, "CONTINUE") : null;
|
|
587
|
+
const hasInterrupted = !!(continueFile && await loadFile(continueFile)) ||
|
|
588
|
+
!!(sDir && await loadFile(join(sDir, "continue.md")));
|
|
589
|
+
return {
|
|
590
|
+
activeMilestone, activeSlice, activeTask,
|
|
591
|
+
phase: 'executing',
|
|
592
|
+
recentDecisions: [], blockers: [],
|
|
593
|
+
nextAction: hasInterrupted
|
|
594
|
+
? `Resume interrupted work on ${activeTask.id}: ${activeTask.title} in slice ${activeSlice.id}. Read continue.md first.`
|
|
595
|
+
: `Execute ${activeTask.id}: ${activeTask.title} in slice ${activeSlice.id}.`,
|
|
596
|
+
registry, requirements,
|
|
597
|
+
progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
|
|
598
|
+
};
|
|
145
599
|
}
|
|
146
|
-
|
|
600
|
+
// LEGACY: Filesystem-based state derivation for unmigrated projects.
|
|
601
|
+
// DB-backed projects use deriveStateFromDb() above. Target: extract to
|
|
602
|
+
// state-legacy.ts when all projects are DB-backed.
|
|
603
|
+
export async function _deriveStateImpl(basePath) {
|
|
147
604
|
const milestoneIds = findMilestoneIds(basePath);
|
|
148
605
|
// ── Parallel worker isolation ──────────────────────────────────────────
|
|
149
606
|
// When GSD_MILESTONE_LOCK is set, this process is a parallel worker
|
|
@@ -162,12 +619,9 @@ async function _deriveStateImpl(basePath) {
|
|
|
162
619
|
// This eliminates O(N) individual fs.readFile calls during traversal.
|
|
163
620
|
const fileContentCache = new Map();
|
|
164
621
|
const gsdDir = gsdRoot(basePath);
|
|
165
|
-
//
|
|
166
|
-
// The DB
|
|
167
|
-
//
|
|
168
|
-
// plan checkbox changes). Using stale DB content causes deriveState to
|
|
169
|
-
// return incorrect phase/slice state, leading to infinite skip loops.
|
|
170
|
-
// The native Rust batch parser is fast enough for state derivation.
|
|
622
|
+
// Filesystem fallback: used when deriveStateFromDb() is not available
|
|
623
|
+
// (pre-migration projects). The DB-backed path is preferred when available
|
|
624
|
+
// — see deriveStateFromDb() above.
|
|
171
625
|
const batchFiles = nativeBatchParseGsdFiles(gsdDir);
|
|
172
626
|
if (batchFiles) {
|
|
173
627
|
for (const f of batchFiles) {
|
|
@@ -258,7 +712,7 @@ async function _deriveStateImpl(basePath) {
|
|
|
258
712
|
if (parkedMilestoneIds.has(mid)) {
|
|
259
713
|
const roadmap = roadmapCache.get(mid) ?? null;
|
|
260
714
|
const title = roadmap
|
|
261
|
-
? roadmap.title
|
|
715
|
+
? stripMilestonePrefix(roadmap.title)
|
|
262
716
|
: mid;
|
|
263
717
|
registry.push({ id: mid, title, status: 'parked' });
|
|
264
718
|
continue;
|
|
@@ -317,7 +771,7 @@ async function _deriveStateImpl(basePath) {
|
|
|
317
771
|
}
|
|
318
772
|
continue;
|
|
319
773
|
}
|
|
320
|
-
const title = roadmap.title
|
|
774
|
+
const title = stripMilestonePrefix(roadmap.title);
|
|
321
775
|
const complete = isMilestoneComplete(roadmap);
|
|
322
776
|
if (complete) {
|
|
323
777
|
// All slices done — check validation and summary state
|