gsd-pi 2.50.0-dev.d210a87 → 2.50.0
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 +0 -2
- package/dist/cli.js +0 -26
- package/dist/loader.js +0 -4
- package/dist/resource-loader.d.ts +1 -4
- package/dist/resource-loader.js +3 -138
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +1 -3
- package/dist/resources/extensions/bg-shell/interaction.js +1 -3
- package/dist/resources/extensions/bg-shell/process-manager.js +1 -4
- package/dist/resources/extensions/claude-code-cli/partial-builder.js +0 -5
- package/dist/resources/extensions/gsd/auto/phases.js +1 -16
- package/dist/resources/extensions/gsd/auto/session.js +0 -5
- package/dist/resources/extensions/gsd/auto-dashboard.js +3 -22
- package/dist/resources/extensions/gsd/auto-dispatch.js +54 -81
- package/dist/resources/extensions/gsd/auto-post-unit.js +76 -37
- package/dist/resources/extensions/gsd/auto-prompts.js +0 -57
- package/dist/resources/extensions/gsd/auto-recovery.js +25 -21
- package/dist/resources/extensions/gsd/auto.js +5 -15
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +0 -16
- package/dist/resources/extensions/gsd/crash-recovery.js +2 -6
- package/dist/resources/extensions/gsd/custom-execution-policy.js +2 -3
- package/dist/resources/extensions/gsd/custom-verification.js +1 -3
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +2 -3
- package/dist/resources/extensions/gsd/dashboard-overlay.js +0 -4
- package/dist/resources/extensions/gsd/detection.js +3 -589
- package/dist/resources/extensions/gsd/dispatch-guard.js +1 -2
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +0 -15
- package/dist/resources/extensions/gsd/files.js +1 -5
- package/dist/resources/extensions/gsd/guided-flow.js +0 -10
- package/dist/resources/extensions/gsd/init-wizard.js +1 -9
- package/dist/resources/extensions/gsd/model-router.js +0 -25
- package/dist/resources/extensions/gsd/notifications.js +0 -23
- package/dist/resources/extensions/gsd/preferences-skills.js +5 -11
- package/dist/resources/extensions/gsd/preferences-types.js +0 -1
- package/dist/resources/extensions/gsd/preferences-validation.js +0 -25
- package/dist/resources/extensions/gsd/preferences.js +0 -3
- package/dist/resources/extensions/gsd/prompts/forensics.md +7 -11
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -6
- package/dist/resources/extensions/gsd/provider-error-pause.js +0 -8
- package/dist/resources/extensions/gsd/rule-registry.js +11 -10
- package/dist/resources/extensions/gsd/session-forensics.js +3 -7
- package/dist/resources/extensions/gsd/skill-discovery.js +2 -3
- package/dist/resources/extensions/gsd/skill-health.js +2 -2
- package/dist/resources/extensions/gsd/skill-telemetry.js +5 -15
- package/dist/resources/extensions/gsd/state.js +5 -17
- package/dist/resources/extensions/gsd/templates/milestone-validation.md +0 -12
- package/dist/resources/extensions/gsd/templates/preferences.md +0 -2
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +9 -28
- package/dist/resources/extensions/gsd/undo.js +7 -8
- package/dist/resources/extensions/gsd/unit-runtime.js +1 -2
- package/dist/resources/extensions/gsd/verification-gate.js +1 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +16 -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 +2 -2
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/routes-manifest.json +0 -6
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- 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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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 +26 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js.nft.json +1 -1
- 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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- 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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- 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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- 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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +16 -17
- package/dist/web/standalone/.next/server/chunks/229.js +12 -0
- package/dist/web/standalone/.next/server/chunks/441.js +2 -0
- package/dist/web/standalone/.next/server/chunks/471.js +13 -0
- package/dist/web/standalone/.next/server/chunks/{4741.js → 741.js} +1 -1
- package/dist/web/standalone/.next/server/functions-config-manifest.json +0 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +3 -3
- 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/server/webpack-runtime.js +1 -1
- package/dist/web/standalone/.next/static/MQOhBnkC_TLtNn_JvZWDj/_buildManifest.js +1 -0
- package/dist/web/standalone/.next/static/chunks/4024.7c75ac378de0f2b5.js +9 -0
- package/dist/web/standalone/.next/static/chunks/{2008.817d0885545aaea9.js → 485.243af25f0cdf50d6.js} +6 -6
- package/dist/web/standalone/.next/static/chunks/app/_global-error/page-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/api/boot/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-d83ba70a25a85472.js +1 -0
- 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 → layout-9ecfd95f343793f0.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-12dd5ece0df4badc.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
- 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-ab5a8926e07ec673.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-2473ce2c3879fff4.js +1 -0
- package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.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 +1 -1
- package/packages/pi-ai/dist/types.d.ts +0 -1
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/pnpm-lock.yaml +2022 -0
- package/packages/pi-ai/src/types.ts +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +0 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +0 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/bash-executor.d.ts +1 -3
- package/packages/pi-coding-agent/dist/core/bash-executor.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/bash-executor.js +1 -10
- package/packages/pi-coding-agent/dist/core/bash-executor.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/runner.d.ts +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +0 -13
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +1 -19
- 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/extensions/wrapper.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/wrapper.js +0 -8
- package/packages/pi-coding-agent/dist/core/extensions/wrapper.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.js +1 -8
- package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.d.ts +1 -11
- package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.js +8 -30
- package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.js +0 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +2 -2
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +2 -3
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- 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 +4 -6
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts +0 -5
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +0 -12
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +1 -2
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/pnpm-lock.yaml +454 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +1 -2
- package/packages/pi-coding-agent/src/core/bash-executor.ts +2 -10
- package/packages/pi-coding-agent/src/core/extensions/index.ts +0 -2
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +0 -18
- package/packages/pi-coding-agent/src/core/extensions/types.ts +0 -21
- package/packages/pi-coding-agent/src/core/extensions/wrapper.ts +0 -9
- package/packages/pi-coding-agent/src/core/package-manager.ts +1 -10
- package/packages/pi-coding-agent/src/core/skills.ts +10 -35
- package/packages/pi-coding-agent/src/core/slash-commands.ts +0 -1
- package/packages/pi-coding-agent/src/index.ts +0 -4
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +2 -3
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +4 -6
- package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +0 -15
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +1 -2
- package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +1 -2
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/scripts/postinstall.js +6 -163
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +1 -3
- package/src/resources/extensions/bg-shell/interaction.ts +1 -3
- package/src/resources/extensions/bg-shell/process-manager.ts +1 -4
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +0 -5
- package/src/resources/extensions/gsd/auto/phases.ts +1 -15
- package/src/resources/extensions/gsd/auto/session.ts +0 -6
- package/src/resources/extensions/gsd/auto-dashboard.ts +3 -31
- package/src/resources/extensions/gsd/auto-dispatch.ts +51 -84
- package/src/resources/extensions/gsd/auto-post-unit.ts +83 -56
- package/src/resources/extensions/gsd/auto-prompts.ts +0 -48
- package/src/resources/extensions/gsd/auto-recovery.ts +26 -19
- package/src/resources/extensions/gsd/auto.ts +5 -15
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +0 -17
- package/src/resources/extensions/gsd/crash-recovery.ts +2 -6
- package/src/resources/extensions/gsd/custom-execution-policy.ts +2 -3
- package/src/resources/extensions/gsd/custom-verification.ts +1 -3
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +2 -3
- package/src/resources/extensions/gsd/dashboard-overlay.ts +0 -7
- package/src/resources/extensions/gsd/detection.ts +3 -662
- package/src/resources/extensions/gsd/dispatch-guard.ts +1 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +0 -15
- package/src/resources/extensions/gsd/files.ts +1 -6
- package/src/resources/extensions/gsd/guided-flow.ts +0 -11
- package/src/resources/extensions/gsd/init-wizard.ts +1 -9
- package/src/resources/extensions/gsd/model-router.ts +0 -25
- package/src/resources/extensions/gsd/notifications.ts +0 -23
- package/src/resources/extensions/gsd/preferences-skills.ts +5 -11
- package/src/resources/extensions/gsd/preferences-types.ts +0 -20
- package/src/resources/extensions/gsd/preferences-validation.ts +0 -26
- package/src/resources/extensions/gsd/preferences.ts +0 -3
- package/src/resources/extensions/gsd/prompts/forensics.md +7 -11
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -6
- package/src/resources/extensions/gsd/provider-error-pause.ts +0 -9
- package/src/resources/extensions/gsd/rule-registry.ts +11 -10
- package/src/resources/extensions/gsd/session-forensics.ts +3 -7
- package/src/resources/extensions/gsd/skill-discovery.ts +2 -3
- package/src/resources/extensions/gsd/skill-health.ts +2 -2
- package/src/resources/extensions/gsd/skill-telemetry.ts +5 -15
- package/src/resources/extensions/gsd/state.ts +5 -16
- package/src/resources/extensions/gsd/templates/milestone-validation.md +0 -12
- package/src/resources/extensions/gsd/templates/preferences.md +0 -2
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +0 -16
- package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +0 -68
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +3 -5
- package/src/resources/extensions/gsd/tests/custom-verification.test.ts +0 -33
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +3 -4
- package/src/resources/extensions/gsd/tests/detection.test.ts +0 -838
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +9 -28
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +0 -63
- package/src/resources/extensions/gsd/tests/model-router.test.ts +0 -40
- package/src/resources/extensions/gsd/tests/notifications.test.ts +6 -28
- package/src/resources/extensions/gsd/tests/preferences.test.ts +0 -50
- package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +0 -40
- package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +5 -4
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +0 -146
- package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +12 -12
- package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +0 -24
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +2 -2
- package/src/resources/extensions/gsd/types.ts +0 -2
- package/src/resources/extensions/gsd/undo.ts +7 -8
- package/src/resources/extensions/gsd/unit-runtime.ts +1 -2
- package/src/resources/extensions/gsd/verification-gate.ts +1 -3
- package/dist/resources/extensions/gsd/auto-observability.js +0 -54
- package/dist/resources/extensions/gsd/auto-utils.js +0 -20
- package/dist/resources/extensions/gsd/observability-validator.js +0 -422
- package/dist/resources/extensions/gsd/roadmap-mutations.js +0 -110
- package/dist/resources/extensions/gsd/rtk-status.js +0 -43
- package/dist/resources/extensions/gsd/skill-catalog.js +0 -1026
- package/dist/resources/extensions/shared/rtk-session-stats.js +0 -189
- package/dist/resources/extensions/shared/rtk.js +0 -100
- package/dist/rtk.d.ts +0 -52
- package/dist/rtk.js +0 -332
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +0 -3
- package/dist/web/standalone/.next/server/app/api/experimental/route.js.nft.json +0 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +0 -1
- package/dist/web/standalone/.next/server/chunks/2229.js +0 -12
- package/dist/web/standalone/.next/server/chunks/2331.js +0 -25
- package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
- package/dist/web/standalone/.next/server/chunks/7471.js +0 -13
- package/dist/web/standalone/.next/static/chunks/4024.9ad5def014d90ce4.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-b950e4e384cc62b3.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.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-459824ffb8c323dd.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/chunks/webpack-cfc9a116e6450a6b.js +0 -1
- package/dist/web/standalone/.next/static/css/de141508b083f922.css +0 -1
- package/dist/web/standalone/.next/static/yJIyd5cXPNpmXTv18ZlyC/_buildManifest.js +0 -1
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +0 -105
- package/src/resources/extensions/gsd/auto-observability.ts +0 -72
- package/src/resources/extensions/gsd/auto-utils.ts +0 -25
- 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/rtk-status.ts +0 -53
- package/src/resources/extensions/gsd/skill-catalog.ts +0 -1085
- package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +0 -97
- package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -474
- package/src/resources/extensions/gsd/tests/retry-diagnostic-reasoning.test.ts +0 -161
- package/src/resources/extensions/gsd/tests/rewrite-count-persist.test.ts +0 -82
- package/src/resources/extensions/gsd/tests/skill-catalog.test.ts +0 -193
- package/src/resources/extensions/shared/rtk-session-stats.ts +0 -249
- package/src/resources/extensions/shared/rtk.ts +0 -120
- /package/dist/web/standalone/.next/static/{yJIyd5cXPNpmXTv18ZlyC → MQOhBnkC_TLtNn_JvZWDj}/_ssgManifest.js +0 -0
|
@@ -13,11 +13,10 @@ import type { GSDState } from "./types.js";
|
|
|
13
13
|
import type { GSDPreferences } from "./preferences.js";
|
|
14
14
|
import type { UatType } from "./files.js";
|
|
15
15
|
import { loadFile, extractUatType, loadActiveOverrides } from "./files.js";
|
|
16
|
-
import { isDbAvailable, getMilestoneSlices, getPendingGates, markAllGatesOmitted
|
|
16
|
+
import { isDbAvailable, getMilestoneSlices, getPendingGates, markAllGatesOmitted } from "./gsd-db.js";
|
|
17
17
|
import { extractVerdict, isAcceptableUatVerdict } from "./verdict-parser.js";
|
|
18
18
|
|
|
19
19
|
import {
|
|
20
|
-
gsdRoot,
|
|
21
20
|
resolveMilestoneFile,
|
|
22
21
|
resolveMilestonePath,
|
|
23
22
|
resolveSliceFile,
|
|
@@ -27,7 +26,7 @@ import {
|
|
|
27
26
|
buildMilestoneFileName,
|
|
28
27
|
buildSliceFileName,
|
|
29
28
|
} from "./paths.js";
|
|
30
|
-
import { existsSync, mkdirSync,
|
|
29
|
+
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
31
30
|
import { join } from "node:path";
|
|
32
31
|
import { hasImplementationArtifacts } from "./auto-recovery.js";
|
|
33
32
|
import {
|
|
@@ -89,46 +88,10 @@ function missingSliceStop(mid: string, phase: string): DispatchAction {
|
|
|
89
88
|
};
|
|
90
89
|
}
|
|
91
90
|
|
|
92
|
-
/**
|
|
93
|
-
* Check for milestone slices missing SUMMARY files.
|
|
94
|
-
* Returns array of missing slice IDs, or empty array if all present or DB unavailable.
|
|
95
|
-
*/
|
|
96
|
-
function findMissingSummaries(basePath: string, mid: string): string[] {
|
|
97
|
-
if (!isDbAvailable()) return [];
|
|
98
|
-
const sliceIds = getMilestoneSlices(mid).map(s => s.id);
|
|
99
|
-
return sliceIds.filter(sid => {
|
|
100
|
-
const summaryPath = resolveSliceFile(basePath, mid, sid, "SUMMARY");
|
|
101
|
-
return !summaryPath || !existsSync(summaryPath);
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
|
|
105
91
|
// ─── Rewrite Circuit Breaker ──────────────────────────────────────────────
|
|
106
92
|
|
|
107
93
|
const MAX_REWRITE_ATTEMPTS = 3;
|
|
108
94
|
|
|
109
|
-
// ─── Disk-persisted rewrite attempt counter ──────────────────────────────────
|
|
110
|
-
// The counter must survive session restarts (crash recovery, pause/resume,
|
|
111
|
-
// step-mode). Storing it on the in-memory session object caused the circuit
|
|
112
|
-
// breaker to never trip — see https://github.com/gsd-build/gsd-2/issues/2203
|
|
113
|
-
function rewriteCountPath(basePath: string): string {
|
|
114
|
-
return join(gsdRoot(basePath), "runtime", "rewrite-count.json");
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
export function getRewriteCount(basePath: string): number {
|
|
118
|
-
try {
|
|
119
|
-
const data = JSON.parse(readFileSync(rewriteCountPath(basePath), "utf-8"));
|
|
120
|
-
return typeof data.count === "number" ? data.count : 0;
|
|
121
|
-
} catch {
|
|
122
|
-
return 0;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
export function setRewriteCount(basePath: string, count: number): void {
|
|
127
|
-
const filePath = rewriteCountPath(basePath);
|
|
128
|
-
mkdirSync(join(gsdRoot(basePath), "runtime"), { recursive: true });
|
|
129
|
-
writeFileSync(filePath, JSON.stringify({ count, updatedAt: new Date().toISOString() }) + "\n");
|
|
130
|
-
}
|
|
131
|
-
|
|
132
95
|
// ─── Rules ────────────────────────────────────────────────────────────────
|
|
133
96
|
|
|
134
97
|
export const DISPATCH_RULES: DispatchRule[] = [
|
|
@@ -137,14 +100,14 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
137
100
|
match: async ({ mid, midTitle, state, basePath, session }) => {
|
|
138
101
|
const pendingOverrides = await loadActiveOverrides(basePath);
|
|
139
102
|
if (pendingOverrides.length === 0) return null;
|
|
140
|
-
const count =
|
|
103
|
+
const count = session?.rewriteAttemptCount ?? 0;
|
|
141
104
|
if (count >= MAX_REWRITE_ATTEMPTS) {
|
|
142
105
|
const { resolveAllOverrides } = await import("./files.js");
|
|
143
106
|
await resolveAllOverrides(basePath);
|
|
144
|
-
|
|
107
|
+
if (session) session.rewriteAttemptCount = 0;
|
|
145
108
|
return null;
|
|
146
109
|
}
|
|
147
|
-
|
|
110
|
+
if (session) session.rewriteAttemptCount++;
|
|
148
111
|
const unitId = state.activeSlice ? `${mid}/${state.activeSlice.id}` : mid;
|
|
149
112
|
return {
|
|
150
113
|
action: "dispatch",
|
|
@@ -580,14 +543,30 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
580
543
|
if (state.phase !== "validating-milestone") return null;
|
|
581
544
|
|
|
582
545
|
// Safety guard (#1368): verify all roadmap slices have SUMMARY files before
|
|
583
|
-
// allowing milestone validation.
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
546
|
+
// allowing milestone validation. If any slice lacks a summary, the milestone
|
|
547
|
+
// is not genuinely complete — something skipped earlier slices.
|
|
548
|
+
let sliceIds: string[];
|
|
549
|
+
if (isDbAvailable()) {
|
|
550
|
+
sliceIds = getMilestoneSlices(mid).map(s => s.id);
|
|
551
|
+
} else {
|
|
552
|
+
sliceIds = [];
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
if (sliceIds.length > 0) {
|
|
556
|
+
const missingSlices: string[] = [];
|
|
557
|
+
for (const sid of sliceIds) {
|
|
558
|
+
const summaryPath = resolveSliceFile(basePath, mid, sid, "SUMMARY");
|
|
559
|
+
if (!summaryPath || !existsSync(summaryPath)) {
|
|
560
|
+
missingSlices.push(sid);
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
if (missingSlices.length > 0) {
|
|
564
|
+
return {
|
|
565
|
+
action: "stop",
|
|
566
|
+
reason: `Cannot validate milestone ${mid}: slices ${missingSlices.join(", ")} are missing SUMMARY files. These slices may have been skipped.`,
|
|
567
|
+
level: "error",
|
|
568
|
+
};
|
|
569
|
+
}
|
|
591
570
|
}
|
|
592
571
|
|
|
593
572
|
// Skip preference: write a minimal pass-through VALIDATION file
|
|
@@ -627,13 +606,28 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
627
606
|
if (state.phase !== "completing-milestone") return null;
|
|
628
607
|
|
|
629
608
|
// Safety guard (#1368): verify all roadmap slices have SUMMARY files.
|
|
630
|
-
|
|
631
|
-
if (
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
609
|
+
let sliceIds: string[];
|
|
610
|
+
if (isDbAvailable()) {
|
|
611
|
+
sliceIds = getMilestoneSlices(mid).map(s => s.id);
|
|
612
|
+
} else {
|
|
613
|
+
sliceIds = [];
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
if (sliceIds.length > 0) {
|
|
617
|
+
const missingSlices: string[] = [];
|
|
618
|
+
for (const sid of sliceIds) {
|
|
619
|
+
const summaryPath = resolveSliceFile(basePath, mid, sid, "SUMMARY");
|
|
620
|
+
if (!summaryPath || !existsSync(summaryPath)) {
|
|
621
|
+
missingSlices.push(sid);
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
if (missingSlices.length > 0) {
|
|
625
|
+
return {
|
|
626
|
+
action: "stop",
|
|
627
|
+
reason: `Cannot complete milestone ${mid}: slices ${missingSlices.join(", ")} are missing SUMMARY files. Run /gsd doctor to diagnose.`,
|
|
628
|
+
level: "error",
|
|
629
|
+
};
|
|
630
|
+
}
|
|
637
631
|
}
|
|
638
632
|
|
|
639
633
|
// Safety guard (#1703): verify the milestone produced implementation
|
|
@@ -647,33 +641,6 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
647
641
|
};
|
|
648
642
|
}
|
|
649
643
|
|
|
650
|
-
// Verification class compliance: if operational verification was planned,
|
|
651
|
-
// ensure the validation output documents it before allowing completion.
|
|
652
|
-
try {
|
|
653
|
-
if (isDbAvailable()) {
|
|
654
|
-
const milestone = getMilestone(mid);
|
|
655
|
-
if (milestone?.verification_operational &&
|
|
656
|
-
milestone.verification_operational.toLowerCase() !== "none") {
|
|
657
|
-
const validationPath = resolveMilestoneFile(basePath, mid, "VALIDATION");
|
|
658
|
-
if (validationPath) {
|
|
659
|
-
const validationContent = await loadFile(validationPath);
|
|
660
|
-
if (validationContent) {
|
|
661
|
-
const hasOperationalCheck =
|
|
662
|
-
validationContent.includes("Operational") &&
|
|
663
|
-
(validationContent.includes("MET") || validationContent.includes("N/A"));
|
|
664
|
-
if (!hasOperationalCheck) {
|
|
665
|
-
return {
|
|
666
|
-
action: "stop" as const,
|
|
667
|
-
reason: `Milestone ${mid} has planned operational verification ("${milestone.verification_operational.substring(0, 100)}") but the validation output does not address it. Re-run validation with verification class awareness, or update the validation to document operational compliance.`,
|
|
668
|
-
level: "warning" as const,
|
|
669
|
-
};
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
}
|
|
673
|
-
}
|
|
674
|
-
}
|
|
675
|
-
} catch { /* fall through — don't block on DB errors */ }
|
|
676
|
-
|
|
677
644
|
return {
|
|
678
645
|
action: "dispatch",
|
|
679
646
|
unitType: "complete-milestone",
|
|
@@ -47,29 +47,8 @@ import {
|
|
|
47
47
|
} from "./post-unit-hooks.js";
|
|
48
48
|
import { hasPendingCaptures, loadPendingCaptures } from "./captures.js";
|
|
49
49
|
import { debugLog } from "./debug-logger.js";
|
|
50
|
-
import {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
/** Enqueue a sidecar item (hook, triage, or quick-task) for the main loop to
|
|
55
|
-
* drain via runUnit. Logs the enqueue event and notifies the UI. */
|
|
56
|
-
function enqueueSidecar(
|
|
57
|
-
s: AutoSession,
|
|
58
|
-
ctx: ExtensionContext,
|
|
59
|
-
entry: SidecarItem,
|
|
60
|
-
debugExtra: Record<string, unknown>,
|
|
61
|
-
notification?: string,
|
|
62
|
-
): "continue" {
|
|
63
|
-
s.sidecarQueue.push(entry);
|
|
64
|
-
debugLog("postUnitPostVerification", {
|
|
65
|
-
phase: "sidecar-enqueue",
|
|
66
|
-
kind: entry.kind,
|
|
67
|
-
unitId: entry.unitId,
|
|
68
|
-
...debugExtra,
|
|
69
|
-
});
|
|
70
|
-
if (notification) ctx.ui.notify(notification, "info");
|
|
71
|
-
return "continue";
|
|
72
|
-
}
|
|
50
|
+
import type { AutoSession } from "./auto/session.js";
|
|
51
|
+
|
|
73
52
|
/** Unit types that only touch `.gsd/` internal state files (no code changes).
|
|
74
53
|
* Auto-commit is skipped for these — their state files are picked up by the
|
|
75
54
|
* next actual task commit via `smartStage()`. */
|
|
@@ -260,7 +239,6 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
260
239
|
|
|
261
240
|
// Auto-commit
|
|
262
241
|
if (s.currentUnit) {
|
|
263
|
-
const unit = s.currentUnit;
|
|
264
242
|
try {
|
|
265
243
|
let taskContext: TaskCommitContext | undefined;
|
|
266
244
|
|
|
@@ -319,56 +297,64 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
319
297
|
}
|
|
320
298
|
|
|
321
299
|
// GitHub sync (non-blocking, opt-in)
|
|
322
|
-
|
|
300
|
+
try {
|
|
323
301
|
const { runGitHubSync } = await import("../github-sync/sync.js");
|
|
324
|
-
await runGitHubSync(s.basePath,
|
|
325
|
-
})
|
|
302
|
+
await runGitHubSync(s.basePath, s.currentUnit.type, s.currentUnit.id);
|
|
303
|
+
} catch (e) {
|
|
304
|
+
debugLog("postUnit", { phase: "github-sync", error: String(e) });
|
|
305
|
+
}
|
|
326
306
|
|
|
327
307
|
// Prune dead bg-shell processes
|
|
328
|
-
|
|
308
|
+
try {
|
|
329
309
|
const { pruneDeadProcesses } = await import("../bg-shell/process-manager.js");
|
|
330
310
|
pruneDeadProcesses();
|
|
331
|
-
})
|
|
311
|
+
} catch (e) {
|
|
312
|
+
debugLog("postUnit", { phase: "prune-bg-shell", error: String(e) });
|
|
313
|
+
}
|
|
332
314
|
|
|
333
315
|
// Tear down browser between units to prevent Chrome process accumulation (#1733)
|
|
334
|
-
|
|
316
|
+
try {
|
|
335
317
|
const { getBrowser } = await import("../browser-tools/state.js");
|
|
336
318
|
if (getBrowser()) {
|
|
337
319
|
const { closeBrowser } = await import("../browser-tools/lifecycle.js");
|
|
338
320
|
await closeBrowser();
|
|
339
321
|
debugLog("postUnit", { phase: "browser-teardown", status: "closed" });
|
|
340
322
|
}
|
|
341
|
-
})
|
|
323
|
+
} catch (e) {
|
|
324
|
+
debugLog("postUnit", { phase: "browser-teardown", error: String(e) });
|
|
325
|
+
}
|
|
342
326
|
|
|
343
327
|
// Sync worktree state back to project root (skipped for lightweight sidecars)
|
|
344
328
|
if (!opts?.skipWorktreeSync && s.originalBasePath && s.originalBasePath !== s.basePath) {
|
|
345
|
-
|
|
346
|
-
syncStateToProjectRoot(s.basePath, s.originalBasePath
|
|
347
|
-
})
|
|
329
|
+
try {
|
|
330
|
+
syncStateToProjectRoot(s.basePath, s.originalBasePath, s.currentMilestoneId);
|
|
331
|
+
} catch (e) {
|
|
332
|
+
debugLog("postUnit", { phase: "worktree-sync", error: String(e) });
|
|
333
|
+
}
|
|
348
334
|
}
|
|
349
335
|
|
|
350
336
|
// Rewrite-docs completion
|
|
351
337
|
if (s.currentUnit.type === "rewrite-docs") {
|
|
352
|
-
|
|
338
|
+
try {
|
|
353
339
|
await resolveAllOverrides(s.basePath);
|
|
354
|
-
// Reset both disk and in-memory counters. Disk counter is authoritative
|
|
355
|
-
// (survives restarts); in-memory is kept in sync for the current session.
|
|
356
|
-
const { setRewriteCount } = await import("./auto-dispatch.js");
|
|
357
|
-
setRewriteCount(s.basePath, 0);
|
|
358
340
|
s.rewriteAttemptCount = 0;
|
|
359
341
|
ctx.ui.notify("Override(s) resolved — rewrite-docs completed.", "info");
|
|
360
|
-
})
|
|
342
|
+
} catch (e) {
|
|
343
|
+
debugLog("postUnit", { phase: "rewrite-docs-resolve", error: String(e) });
|
|
344
|
+
}
|
|
361
345
|
}
|
|
362
346
|
|
|
363
347
|
// Reactive state cleanup on slice completion
|
|
364
348
|
if (s.currentUnit.type === "complete-slice") {
|
|
365
|
-
|
|
366
|
-
const { milestone: mid, slice: sid } = parseUnitId(
|
|
349
|
+
try {
|
|
350
|
+
const { milestone: mid, slice: sid } = parseUnitId(s.currentUnit.id);
|
|
367
351
|
if (mid && sid) {
|
|
368
352
|
const { clearReactiveState } = await import("./reactive-graph.js");
|
|
369
353
|
clearReactiveState(s.basePath, mid, sid);
|
|
370
354
|
}
|
|
371
|
-
})
|
|
355
|
+
} catch (e) {
|
|
356
|
+
debugLog("postUnit", { phase: "reactive-state-cleanup", error: String(e) });
|
|
357
|
+
}
|
|
372
358
|
}
|
|
373
359
|
|
|
374
360
|
// Post-triage: execute actionable resolutions
|
|
@@ -516,11 +502,23 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
|
|
|
516
502
|
}
|
|
517
503
|
persistHookState(s.basePath);
|
|
518
504
|
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
505
|
+
s.sidecarQueue.push({
|
|
506
|
+
kind: "hook",
|
|
507
|
+
unitType: hookUnit.unitType,
|
|
508
|
+
unitId: hookUnit.unitId,
|
|
509
|
+
prompt: hookUnit.prompt,
|
|
510
|
+
model: hookUnit.model,
|
|
511
|
+
});
|
|
512
|
+
|
|
513
|
+
debugLog("postUnitPostVerification", {
|
|
514
|
+
phase: "sidecar-enqueue",
|
|
515
|
+
kind: "hook",
|
|
516
|
+
unitType: hookUnit.unitType,
|
|
517
|
+
unitId: hookUnit.unitId,
|
|
518
|
+
hookName: hookUnit.hookName,
|
|
519
|
+
});
|
|
520
|
+
|
|
521
|
+
return "continue";
|
|
524
522
|
}
|
|
525
523
|
|
|
526
524
|
// Check if a hook requested a retry of the trigger unit
|
|
@@ -619,12 +617,26 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
|
|
|
619
617
|
}
|
|
620
618
|
|
|
621
619
|
const triageUnitId = `${mid}/${sid}/triage`;
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
620
|
+
s.sidecarQueue.push({
|
|
621
|
+
kind: "triage",
|
|
622
|
+
unitType: "triage-captures",
|
|
623
|
+
unitId: triageUnitId,
|
|
624
|
+
prompt,
|
|
625
|
+
});
|
|
626
|
+
|
|
627
|
+
debugLog("postUnitPostVerification", {
|
|
628
|
+
phase: "sidecar-enqueue",
|
|
629
|
+
kind: "triage",
|
|
630
|
+
unitId: triageUnitId,
|
|
631
|
+
pendingCount: pending.length,
|
|
632
|
+
});
|
|
633
|
+
|
|
634
|
+
ctx.ui.notify(
|
|
626
635
|
`Triaging ${pending.length} pending capture${pending.length === 1 ? "" : "s"}...`,
|
|
636
|
+
"info",
|
|
627
637
|
);
|
|
638
|
+
|
|
639
|
+
return "continue";
|
|
628
640
|
}
|
|
629
641
|
}
|
|
630
642
|
}
|
|
@@ -653,12 +665,27 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
|
|
|
653
665
|
markCaptureExecuted(s.basePath, capture.id);
|
|
654
666
|
|
|
655
667
|
const qtUnitId = `${s.currentMilestoneId}/${capture.id}`;
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
668
|
+
s.sidecarQueue.push({
|
|
669
|
+
kind: "quick-task",
|
|
670
|
+
unitType: "quick-task",
|
|
671
|
+
unitId: qtUnitId,
|
|
672
|
+
prompt,
|
|
673
|
+
captureId: capture.id,
|
|
674
|
+
});
|
|
675
|
+
|
|
676
|
+
debugLog("postUnitPostVerification", {
|
|
677
|
+
phase: "sidecar-enqueue",
|
|
678
|
+
kind: "quick-task",
|
|
679
|
+
unitId: qtUnitId,
|
|
680
|
+
captureId: capture.id,
|
|
681
|
+
});
|
|
682
|
+
|
|
683
|
+
ctx.ui.notify(
|
|
660
684
|
`Executing quick-task: ${capture.id} — "${capture.text}"`,
|
|
685
|
+
"info",
|
|
661
686
|
);
|
|
687
|
+
|
|
688
|
+
return "continue";
|
|
662
689
|
} catch (e) {
|
|
663
690
|
debugLog("postUnit", { phase: "quick-task-dispatch", error: String(e) });
|
|
664
691
|
}
|
|
@@ -784,14 +784,6 @@ export async function checkNeedsRunUat(
|
|
|
784
784
|
if (!uatContent) return null;
|
|
785
785
|
// If the UAT file already contains a verdict, UAT has been run — skip
|
|
786
786
|
if (hasVerdict(uatContent)) return null;
|
|
787
|
-
// Also check the ASSESSMENT file — the run-uat prompt writes the verdict
|
|
788
|
-
// there (via gsd_summary_save artifact_type:"ASSESSMENT"), not into the
|
|
789
|
-
// UAT spec file. Without this check the unit re-dispatches indefinitely.
|
|
790
|
-
const assessmentFile = resolveSliceFile(base, mid, sid, "ASSESSMENT");
|
|
791
|
-
if (assessmentFile) {
|
|
792
|
-
const assessmentContent = await loadFile(assessmentFile);
|
|
793
|
-
if (assessmentContent && hasVerdict(assessmentContent)) return null;
|
|
794
|
-
}
|
|
795
787
|
const uatType = getUatType(uatContent);
|
|
796
788
|
return { sliceId: sid, uatType };
|
|
797
789
|
}
|
|
@@ -816,13 +808,6 @@ export async function checkNeedsRunUat(
|
|
|
816
808
|
if (!uatContentFb) return null;
|
|
817
809
|
// If the UAT file already contains a verdict, UAT has been run — skip
|
|
818
810
|
if (hasVerdict(uatContentFb)) return null;
|
|
819
|
-
// Also check the ASSESSMENT file for the file-based fallback path (same
|
|
820
|
-
// reason as the DB path above — verdict lives in ASSESSMENT, not UAT).
|
|
821
|
-
const assessmentFileFb = resolveSliceFile(base, mid, uatSid, "ASSESSMENT");
|
|
822
|
-
if (assessmentFileFb) {
|
|
823
|
-
const assessmentContentFb = await loadFile(assessmentFileFb);
|
|
824
|
-
if (assessmentContentFb && hasVerdict(assessmentContentFb)) return null;
|
|
825
|
-
}
|
|
826
811
|
const uatTypeFb = getUatType(uatContentFb);
|
|
827
812
|
return { sliceId: uatSid, uatType: uatTypeFb };
|
|
828
813
|
}
|
|
@@ -1345,24 +1330,6 @@ export async function buildValidateMilestonePrompt(
|
|
|
1345
1330
|
const inlined: string[] = [];
|
|
1346
1331
|
inlined.push(await inlineFile(roadmapPath, roadmapRel, "Milestone Roadmap"));
|
|
1347
1332
|
|
|
1348
|
-
// Inline verification classes from planning (if available in DB)
|
|
1349
|
-
try {
|
|
1350
|
-
const { isDbAvailable, getMilestone } = await import("./gsd-db.js");
|
|
1351
|
-
if (isDbAvailable()) {
|
|
1352
|
-
const milestone = getMilestone(mid);
|
|
1353
|
-
if (milestone) {
|
|
1354
|
-
const classes: string[] = [];
|
|
1355
|
-
if (milestone.verification_contract) classes.push(`- **Contract:** ${milestone.verification_contract}`);
|
|
1356
|
-
if (milestone.verification_integration) classes.push(`- **Integration:** ${milestone.verification_integration}`);
|
|
1357
|
-
if (milestone.verification_operational) classes.push(`- **Operational:** ${milestone.verification_operational}`);
|
|
1358
|
-
if (milestone.verification_uat) classes.push(`- **UAT:** ${milestone.verification_uat}`);
|
|
1359
|
-
if (classes.length > 0) {
|
|
1360
|
-
inlined.push(`### Verification Classes (from planning)\n\nThese verification tiers were defined during milestone planning. Each non-empty class must be checked for evidence during validation.\n\n${classes.join("\n")}`);
|
|
1361
|
-
}
|
|
1362
|
-
}
|
|
1363
|
-
}
|
|
1364
|
-
} catch { /* fall through */ }
|
|
1365
|
-
|
|
1366
1333
|
// Inline all slice summaries and UAT results
|
|
1367
1334
|
let valSliceIds: string[] = [];
|
|
1368
1335
|
try {
|
|
@@ -1392,21 +1359,6 @@ export async function buildValidateMilestonePrompt(
|
|
|
1392
1359
|
if (uatInline) inlined.push(uatInline);
|
|
1393
1360
|
}
|
|
1394
1361
|
|
|
1395
|
-
// Aggregate unresolved follow-ups and known limitations across slices
|
|
1396
|
-
const outstandingItems: string[] = [];
|
|
1397
|
-
for (const sid of valSliceIds) {
|
|
1398
|
-
const summaryPath = resolveSliceFile(base, mid, sid, "SUMMARY");
|
|
1399
|
-
if (!summaryPath) continue;
|
|
1400
|
-
const content = await loadFile(summaryPath);
|
|
1401
|
-
if (!content) continue;
|
|
1402
|
-
const summary = parseSummary(content);
|
|
1403
|
-
if (summary.followUps) outstandingItems.push(`- **${sid} Follow-ups:** ${summary.followUps.trim()}`);
|
|
1404
|
-
if (summary.knownLimitations) outstandingItems.push(`- **${sid} Known Limitations:** ${summary.knownLimitations.trim()}`);
|
|
1405
|
-
}
|
|
1406
|
-
if (outstandingItems.length > 0) {
|
|
1407
|
-
inlined.push(`### Outstanding Items (aggregated from slice summaries)\n\nThese follow-ups and known limitations were documented during slice completion but have not been resolved.\n\n${outstandingItems.join('\n')}`);
|
|
1408
|
-
}
|
|
1409
|
-
|
|
1410
1362
|
// Inline existing VALIDATION file if this is a re-validation round
|
|
1411
1363
|
const validationPath = resolveMilestoneFile(base, mid, "VALIDATION");
|
|
1412
1364
|
const validationRel = relMilestoneFile(base, mid, "VALIDATION");
|
|
@@ -12,7 +12,7 @@ import { parseUnitId } from "./unit-id.js";
|
|
|
12
12
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
13
13
|
import { clearParseCache } from "./files.js";
|
|
14
14
|
import { parseRoadmap as parseLegacyRoadmap, parsePlan as parseLegacyPlan } from "./parsers-legacy.js";
|
|
15
|
-
import { isDbAvailable, getTask, getSlice, getSliceTasks
|
|
15
|
+
import { isDbAvailable, getTask, getSlice, getSliceTasks } from "./gsd-db.js";
|
|
16
16
|
import { isValidationTerminal } from "./state.js";
|
|
17
17
|
import {
|
|
18
18
|
nativeConflictFiles,
|
|
@@ -195,8 +195,13 @@ export function verifyExpectedArtifact(
|
|
|
195
195
|
// Reactive-execute: verify that each dispatched task's summary exists.
|
|
196
196
|
// The unitId encodes the batch: "{mid}/{sid}/reactive+T02,T03"
|
|
197
197
|
if (unitType === "reactive-execute") {
|
|
198
|
-
const
|
|
199
|
-
|
|
198
|
+
const parts = unitId.split("/");
|
|
199
|
+
const mid = parts[0];
|
|
200
|
+
const sidAndBatch = parts[1];
|
|
201
|
+
const batchPart = parts[2]; // "reactive+T02,T03"
|
|
202
|
+
if (!mid || !sidAndBatch || !batchPart) return false;
|
|
203
|
+
|
|
204
|
+
const sid = sidAndBatch;
|
|
200
205
|
const plusIdx = batchPart.indexOf("+");
|
|
201
206
|
if (plusIdx === -1) {
|
|
202
207
|
// Legacy format "reactive" without batch IDs — fall back to "any summary"
|
|
@@ -228,7 +233,10 @@ export function verifyExpectedArtifact(
|
|
|
228
233
|
// Gate-evaluate: verify that each dispatched gate has been resolved in the DB.
|
|
229
234
|
// The unitId encodes the batch: "{mid}/{sid}/gates+Q3,Q4"
|
|
230
235
|
if (unitType === "gate-evaluate") {
|
|
231
|
-
const
|
|
236
|
+
const parts = unitId.split("/");
|
|
237
|
+
const mid = parts[0];
|
|
238
|
+
const sid = parts[1];
|
|
239
|
+
const batchPart = parts[2]; // "gates+Q3,Q4"
|
|
232
240
|
if (!mid || !sid || !batchPart) return false;
|
|
233
241
|
|
|
234
242
|
const plusIdx = batchPart.indexOf("+");
|
|
@@ -278,7 +286,10 @@ export function verifyExpectedArtifact(
|
|
|
278
286
|
// execute-task: DB status is authoritative. Fall back to heading-style plan
|
|
279
287
|
// detection when the DB is unavailable (unmigrated projects).
|
|
280
288
|
if (unitType === "execute-task") {
|
|
281
|
-
const
|
|
289
|
+
const parts = unitId.split("/");
|
|
290
|
+
const mid = parts[0];
|
|
291
|
+
const sid = parts[1];
|
|
292
|
+
const tid = parts[2];
|
|
282
293
|
if (mid && sid && tid) {
|
|
283
294
|
const dbTask = getTask(mid, sid, tid);
|
|
284
295
|
if (dbTask) {
|
|
@@ -308,7 +319,9 @@ export function verifyExpectedArtifact(
|
|
|
308
319
|
// but omitted T{tid}-PLAN.md files would be marked complete, causing execute-task
|
|
309
320
|
// to dispatch with a missing task plan (see issue #739).
|
|
310
321
|
if (unitType === "plan-slice") {
|
|
311
|
-
const
|
|
322
|
+
const parts = unitId.split("/");
|
|
323
|
+
const mid = parts[0];
|
|
324
|
+
const sid = parts[1];
|
|
312
325
|
if (mid && sid) {
|
|
313
326
|
try {
|
|
314
327
|
// DB primary path — get task IDs to verify task plan files exist
|
|
@@ -343,7 +356,9 @@ export function verifyExpectedArtifact(
|
|
|
343
356
|
// complete-slice: DB status is authoritative for whether the slice is done.
|
|
344
357
|
// Fall back to file-based check (roadmap [x]) when DB is unavailable.
|
|
345
358
|
if (unitType === "complete-slice") {
|
|
346
|
-
const
|
|
359
|
+
const parts = unitId.split("/");
|
|
360
|
+
const mid = parts[0];
|
|
361
|
+
const sid = parts[1];
|
|
347
362
|
if (mid && sid) {
|
|
348
363
|
const dir = resolveSlicePath(base, mid, sid);
|
|
349
364
|
if (dir) {
|
|
@@ -410,17 +425,6 @@ export function writeBlockerPlaceholder(
|
|
|
410
425
|
`Review and replace this file before relying on downstream artifacts.`,
|
|
411
426
|
].join("\n");
|
|
412
427
|
writeFileSync(absPath, content, "utf-8");
|
|
413
|
-
|
|
414
|
-
// Mark the task as complete in the DB so verifyExpectedArtifact passes.
|
|
415
|
-
// Without this, the DB status stays "pending" and the dispatch loop
|
|
416
|
-
// re-derives the same task indefinitely (#2531).
|
|
417
|
-
if (unitType === "execute-task" && isDbAvailable()) {
|
|
418
|
-
const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
|
|
419
|
-
if (mid && sid && tid) {
|
|
420
|
-
try { updateTaskStatus(mid, sid, tid, "complete", new Date().toISOString()); } catch { /* non-fatal */ }
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
|
|
424
428
|
return diagnoseExpectedArtifact(unitType, unitId, base);
|
|
425
429
|
}
|
|
426
430
|
|
|
@@ -540,7 +544,10 @@ export function buildLoopRemediationSteps(
|
|
|
540
544
|
unitId: string,
|
|
541
545
|
base: string,
|
|
542
546
|
): string | null {
|
|
543
|
-
const
|
|
547
|
+
const parts = unitId.split("/");
|
|
548
|
+
const mid = parts[0];
|
|
549
|
+
const sid = parts[1];
|
|
550
|
+
const tid = parts[2];
|
|
544
551
|
switch (unitType) {
|
|
545
552
|
case "execute-task": {
|
|
546
553
|
if (!mid || !sid || !tid) break;
|
|
@@ -17,7 +17,6 @@ import type {
|
|
|
17
17
|
} from "@gsd/pi-coding-agent";
|
|
18
18
|
|
|
19
19
|
import { deriveState } from "./state.js";
|
|
20
|
-
import { parseUnitId } from "./unit-id.js";
|
|
21
20
|
import type { GSDState } from "./types.js";
|
|
22
21
|
import { getManifestStatus } from "./files.js";
|
|
23
22
|
export { inlinePriorMilestoneSummary } from "./files.js";
|
|
@@ -105,7 +104,6 @@ import {
|
|
|
105
104
|
captureAvailableSkills,
|
|
106
105
|
resetSkillTelemetry,
|
|
107
106
|
} from "./skill-telemetry.js";
|
|
108
|
-
import { getRtkSessionSavings } from "../shared/rtk-session-stats.js";
|
|
109
107
|
import {
|
|
110
108
|
initMetrics,
|
|
111
109
|
resetMetrics,
|
|
@@ -303,11 +301,6 @@ export { type AutoDashboardData } from "./auto-dashboard.js";
|
|
|
303
301
|
export function getAutoDashboardData(): AutoDashboardData {
|
|
304
302
|
const ledger = getLedger();
|
|
305
303
|
const totals = ledger ? getProjectTotals(ledger.units) : null;
|
|
306
|
-
const sessionId = s.cmdCtx?.sessionManager?.getSessionId?.() ?? null;
|
|
307
|
-
const rtkSavings = sessionId && s.basePath
|
|
308
|
-
? getRtkSessionSavings(s.basePath, sessionId)
|
|
309
|
-
: null;
|
|
310
|
-
const rtkEnabled = loadEffectiveGSDPreferences()?.preferences.experimental?.rtk === true;
|
|
311
304
|
// Pending capture count — lazy check, non-fatal
|
|
312
305
|
let pendingCaptureCount = 0;
|
|
313
306
|
try {
|
|
@@ -330,8 +323,6 @@ export function getAutoDashboardData(): AutoDashboardData {
|
|
|
330
323
|
totalCost: totals?.cost ?? 0,
|
|
331
324
|
totalTokens: totals?.tokens.total ?? 0,
|
|
332
325
|
pendingCaptureCount,
|
|
333
|
-
rtkSavings,
|
|
334
|
-
rtkEnabled,
|
|
335
326
|
};
|
|
336
327
|
}
|
|
337
328
|
|
|
@@ -599,11 +590,8 @@ export async function stopAuto(
|
|
|
599
590
|
// When the milestone is complete (has a SUMMARY), merge the worktree branch
|
|
600
591
|
// back to main so code isn't stranded on the worktree branch (#2317).
|
|
601
592
|
// For incomplete milestones, preserve the branch for later resumption.
|
|
602
|
-
//
|
|
603
|
-
// Skip if phases.ts already merged this milestone — avoids the double
|
|
604
|
-
// mergeAndExit that fails because the branch was already deleted (#2645).
|
|
605
593
|
try {
|
|
606
|
-
if (s.currentMilestoneId
|
|
594
|
+
if (s.currentMilestoneId) {
|
|
607
595
|
const notifyCtx = ctx
|
|
608
596
|
? { notify: ctx.ui.notify.bind(ctx.ui) }
|
|
609
597
|
: { notify: () => {} };
|
|
@@ -1289,7 +1277,8 @@ function ensurePreconditions(
|
|
|
1289
1277
|
base: string,
|
|
1290
1278
|
state: GSDState,
|
|
1291
1279
|
): void {
|
|
1292
|
-
const
|
|
1280
|
+
const parts = unitId.split("/");
|
|
1281
|
+
const mid = parts[0]!;
|
|
1293
1282
|
|
|
1294
1283
|
const mDir = resolveMilestonePath(base, mid);
|
|
1295
1284
|
if (!mDir) {
|
|
@@ -1297,7 +1286,8 @@ function ensurePreconditions(
|
|
|
1297
1286
|
mkdirSync(join(newDir, "slices"), { recursive: true });
|
|
1298
1287
|
}
|
|
1299
1288
|
|
|
1300
|
-
if (
|
|
1289
|
+
if (parts.length >= 2) {
|
|
1290
|
+
const sid = parts[1]!;
|
|
1301
1291
|
|
|
1302
1292
|
const mDirResolved = resolveMilestonePath(base, mid);
|
|
1303
1293
|
if (mDirResolved) {
|