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
|
@@ -9,10 +9,10 @@
|
|
|
9
9
|
* without modifying orchestration code.
|
|
10
10
|
*/
|
|
11
11
|
import { loadFile, extractUatType, loadActiveOverrides } from "./files.js";
|
|
12
|
-
import { isDbAvailable, getMilestoneSlices, getPendingGates, markAllGatesOmitted
|
|
12
|
+
import { isDbAvailable, getMilestoneSlices, getPendingGates, markAllGatesOmitted } from "./gsd-db.js";
|
|
13
13
|
import { extractVerdict, isAcceptableUatVerdict } from "./verdict-parser.js";
|
|
14
|
-
import {
|
|
15
|
-
import { existsSync, mkdirSync,
|
|
14
|
+
import { resolveMilestoneFile, resolveMilestonePath, resolveSliceFile, resolveTaskFile, relSliceFile, buildMilestoneFileName, } from "./paths.js";
|
|
15
|
+
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
16
16
|
import { join } from "node:path";
|
|
17
17
|
import { hasImplementationArtifacts } from "./auto-recovery.js";
|
|
18
18
|
import { buildDiscussMilestonePrompt, buildResearchMilestonePrompt, buildPlanMilestonePrompt, buildResearchSlicePrompt, buildPlanSlicePrompt, buildExecuteTaskPrompt, buildCompleteSlicePrompt, buildCompleteMilestonePrompt, buildValidateMilestonePrompt, buildReplanSlicePrompt, buildRunUatPrompt, buildReassessRoadmapPrompt, buildRewriteDocsPrompt, buildReactiveExecutePrompt, buildGateEvaluatePrompt, checkNeedsReassessment, checkNeedsRunUat, } from "./auto-prompts.js";
|
|
@@ -23,42 +23,8 @@ function missingSliceStop(mid, phase) {
|
|
|
23
23
|
level: "error",
|
|
24
24
|
};
|
|
25
25
|
}
|
|
26
|
-
/**
|
|
27
|
-
* Check for milestone slices missing SUMMARY files.
|
|
28
|
-
* Returns array of missing slice IDs, or empty array if all present or DB unavailable.
|
|
29
|
-
*/
|
|
30
|
-
function findMissingSummaries(basePath, mid) {
|
|
31
|
-
if (!isDbAvailable())
|
|
32
|
-
return [];
|
|
33
|
-
const sliceIds = getMilestoneSlices(mid).map(s => s.id);
|
|
34
|
-
return sliceIds.filter(sid => {
|
|
35
|
-
const summaryPath = resolveSliceFile(basePath, mid, sid, "SUMMARY");
|
|
36
|
-
return !summaryPath || !existsSync(summaryPath);
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
26
|
// ─── Rewrite Circuit Breaker ──────────────────────────────────────────────
|
|
40
27
|
const MAX_REWRITE_ATTEMPTS = 3;
|
|
41
|
-
// ─── Disk-persisted rewrite attempt counter ──────────────────────────────────
|
|
42
|
-
// The counter must survive session restarts (crash recovery, pause/resume,
|
|
43
|
-
// step-mode). Storing it on the in-memory session object caused the circuit
|
|
44
|
-
// breaker to never trip — see https://github.com/gsd-build/gsd-2/issues/2203
|
|
45
|
-
function rewriteCountPath(basePath) {
|
|
46
|
-
return join(gsdRoot(basePath), "runtime", "rewrite-count.json");
|
|
47
|
-
}
|
|
48
|
-
export function getRewriteCount(basePath) {
|
|
49
|
-
try {
|
|
50
|
-
const data = JSON.parse(readFileSync(rewriteCountPath(basePath), "utf-8"));
|
|
51
|
-
return typeof data.count === "number" ? data.count : 0;
|
|
52
|
-
}
|
|
53
|
-
catch {
|
|
54
|
-
return 0;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
export function setRewriteCount(basePath, count) {
|
|
58
|
-
const filePath = rewriteCountPath(basePath);
|
|
59
|
-
mkdirSync(join(gsdRoot(basePath), "runtime"), { recursive: true });
|
|
60
|
-
writeFileSync(filePath, JSON.stringify({ count, updatedAt: new Date().toISOString() }) + "\n");
|
|
61
|
-
}
|
|
62
28
|
// ─── Rules ────────────────────────────────────────────────────────────────
|
|
63
29
|
export const DISPATCH_RULES = [
|
|
64
30
|
{
|
|
@@ -67,14 +33,16 @@ export const DISPATCH_RULES = [
|
|
|
67
33
|
const pendingOverrides = await loadActiveOverrides(basePath);
|
|
68
34
|
if (pendingOverrides.length === 0)
|
|
69
35
|
return null;
|
|
70
|
-
const count =
|
|
36
|
+
const count = session?.rewriteAttemptCount ?? 0;
|
|
71
37
|
if (count >= MAX_REWRITE_ATTEMPTS) {
|
|
72
38
|
const { resolveAllOverrides } = await import("./files.js");
|
|
73
39
|
await resolveAllOverrides(basePath);
|
|
74
|
-
|
|
40
|
+
if (session)
|
|
41
|
+
session.rewriteAttemptCount = 0;
|
|
75
42
|
return null;
|
|
76
43
|
}
|
|
77
|
-
|
|
44
|
+
if (session)
|
|
45
|
+
session.rewriteAttemptCount++;
|
|
78
46
|
const unitId = state.activeSlice ? `${mid}/${state.activeSlice.id}` : mid;
|
|
79
47
|
return {
|
|
80
48
|
action: "dispatch",
|
|
@@ -440,14 +408,30 @@ export const DISPATCH_RULES = [
|
|
|
440
408
|
if (state.phase !== "validating-milestone")
|
|
441
409
|
return null;
|
|
442
410
|
// Safety guard (#1368): verify all roadmap slices have SUMMARY files before
|
|
443
|
-
// allowing milestone validation.
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
411
|
+
// allowing milestone validation. If any slice lacks a summary, the milestone
|
|
412
|
+
// is not genuinely complete — something skipped earlier slices.
|
|
413
|
+
let sliceIds;
|
|
414
|
+
if (isDbAvailable()) {
|
|
415
|
+
sliceIds = getMilestoneSlices(mid).map(s => s.id);
|
|
416
|
+
}
|
|
417
|
+
else {
|
|
418
|
+
sliceIds = [];
|
|
419
|
+
}
|
|
420
|
+
if (sliceIds.length > 0) {
|
|
421
|
+
const missingSlices = [];
|
|
422
|
+
for (const sid of sliceIds) {
|
|
423
|
+
const summaryPath = resolveSliceFile(basePath, mid, sid, "SUMMARY");
|
|
424
|
+
if (!summaryPath || !existsSync(summaryPath)) {
|
|
425
|
+
missingSlices.push(sid);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
if (missingSlices.length > 0) {
|
|
429
|
+
return {
|
|
430
|
+
action: "stop",
|
|
431
|
+
reason: `Cannot validate milestone ${mid}: slices ${missingSlices.join(", ")} are missing SUMMARY files. These slices may have been skipped.`,
|
|
432
|
+
level: "error",
|
|
433
|
+
};
|
|
434
|
+
}
|
|
451
435
|
}
|
|
452
436
|
// Skip preference: write a minimal pass-through VALIDATION file
|
|
453
437
|
if (prefs?.phases?.skip_milestone_validation) {
|
|
@@ -484,13 +468,28 @@ export const DISPATCH_RULES = [
|
|
|
484
468
|
if (state.phase !== "completing-milestone")
|
|
485
469
|
return null;
|
|
486
470
|
// Safety guard (#1368): verify all roadmap slices have SUMMARY files.
|
|
487
|
-
|
|
488
|
-
if (
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
471
|
+
let sliceIds;
|
|
472
|
+
if (isDbAvailable()) {
|
|
473
|
+
sliceIds = getMilestoneSlices(mid).map(s => s.id);
|
|
474
|
+
}
|
|
475
|
+
else {
|
|
476
|
+
sliceIds = [];
|
|
477
|
+
}
|
|
478
|
+
if (sliceIds.length > 0) {
|
|
479
|
+
const missingSlices = [];
|
|
480
|
+
for (const sid of sliceIds) {
|
|
481
|
+
const summaryPath = resolveSliceFile(basePath, mid, sid, "SUMMARY");
|
|
482
|
+
if (!summaryPath || !existsSync(summaryPath)) {
|
|
483
|
+
missingSlices.push(sid);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
if (missingSlices.length > 0) {
|
|
487
|
+
return {
|
|
488
|
+
action: "stop",
|
|
489
|
+
reason: `Cannot complete milestone ${mid}: slices ${missingSlices.join(", ")} are missing SUMMARY files. Run /gsd doctor to diagnose.`,
|
|
490
|
+
level: "error",
|
|
491
|
+
};
|
|
492
|
+
}
|
|
494
493
|
}
|
|
495
494
|
// Safety guard (#1703): verify the milestone produced implementation
|
|
496
495
|
// artifacts (non-.gsd/ files). A milestone with only plan files and
|
|
@@ -502,32 +501,6 @@ export const DISPATCH_RULES = [
|
|
|
502
501
|
level: "error",
|
|
503
502
|
};
|
|
504
503
|
}
|
|
505
|
-
// Verification class compliance: if operational verification was planned,
|
|
506
|
-
// ensure the validation output documents it before allowing completion.
|
|
507
|
-
try {
|
|
508
|
-
if (isDbAvailable()) {
|
|
509
|
-
const milestone = getMilestone(mid);
|
|
510
|
-
if (milestone?.verification_operational &&
|
|
511
|
-
milestone.verification_operational.toLowerCase() !== "none") {
|
|
512
|
-
const validationPath = resolveMilestoneFile(basePath, mid, "VALIDATION");
|
|
513
|
-
if (validationPath) {
|
|
514
|
-
const validationContent = await loadFile(validationPath);
|
|
515
|
-
if (validationContent) {
|
|
516
|
-
const hasOperationalCheck = validationContent.includes("Operational") &&
|
|
517
|
-
(validationContent.includes("MET") || validationContent.includes("N/A"));
|
|
518
|
-
if (!hasOperationalCheck) {
|
|
519
|
-
return {
|
|
520
|
-
action: "stop",
|
|
521
|
-
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.`,
|
|
522
|
-
level: "warning",
|
|
523
|
-
};
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
}
|
|
530
|
-
catch { /* fall through — don't block on DB errors */ }
|
|
531
504
|
return {
|
|
532
505
|
action: "dispatch",
|
|
533
506
|
unitType: "complete-milestone",
|
|
@@ -27,21 +27,6 @@ import { consumeSignal } from "./session-status-io.js";
|
|
|
27
27
|
import { checkPostUnitHooks, isRetryPending, consumeRetryTrigger, persistHookState, resolveHookArtifactPath, } from "./post-unit-hooks.js";
|
|
28
28
|
import { hasPendingCaptures, loadPendingCaptures } from "./captures.js";
|
|
29
29
|
import { debugLog } from "./debug-logger.js";
|
|
30
|
-
import { runSafely } from "./auto-utils.js";
|
|
31
|
-
/** Enqueue a sidecar item (hook, triage, or quick-task) for the main loop to
|
|
32
|
-
* drain via runUnit. Logs the enqueue event and notifies the UI. */
|
|
33
|
-
function enqueueSidecar(s, ctx, entry, debugExtra, notification) {
|
|
34
|
-
s.sidecarQueue.push(entry);
|
|
35
|
-
debugLog("postUnitPostVerification", {
|
|
36
|
-
phase: "sidecar-enqueue",
|
|
37
|
-
kind: entry.kind,
|
|
38
|
-
unitId: entry.unitId,
|
|
39
|
-
...debugExtra,
|
|
40
|
-
});
|
|
41
|
-
if (notification)
|
|
42
|
-
ctx.ui.notify(notification, "info");
|
|
43
|
-
return "continue";
|
|
44
|
-
}
|
|
45
30
|
/** Unit types that only touch `.gsd/` internal state files (no code changes).
|
|
46
31
|
* Auto-commit is skipped for these — their state files are picked up by the
|
|
47
32
|
* next actual task commit via `smartStage()`. */
|
|
@@ -189,7 +174,6 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
189
174
|
}
|
|
190
175
|
// Auto-commit
|
|
191
176
|
if (s.currentUnit) {
|
|
192
|
-
const unit = s.currentUnit;
|
|
193
177
|
try {
|
|
194
178
|
let taskContext;
|
|
195
179
|
if (s.currentUnit.type === "execute-task") {
|
|
@@ -246,51 +230,65 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
246
230
|
ctx.ui.notify(`Auto-commit failed: ${String(e).split("\n")[0]}`, "warning");
|
|
247
231
|
}
|
|
248
232
|
// GitHub sync (non-blocking, opt-in)
|
|
249
|
-
|
|
233
|
+
try {
|
|
250
234
|
const { runGitHubSync } = await import("../github-sync/sync.js");
|
|
251
|
-
await runGitHubSync(s.basePath,
|
|
252
|
-
}
|
|
235
|
+
await runGitHubSync(s.basePath, s.currentUnit.type, s.currentUnit.id);
|
|
236
|
+
}
|
|
237
|
+
catch (e) {
|
|
238
|
+
debugLog("postUnit", { phase: "github-sync", error: String(e) });
|
|
239
|
+
}
|
|
253
240
|
// Prune dead bg-shell processes
|
|
254
|
-
|
|
241
|
+
try {
|
|
255
242
|
const { pruneDeadProcesses } = await import("../bg-shell/process-manager.js");
|
|
256
243
|
pruneDeadProcesses();
|
|
257
|
-
}
|
|
244
|
+
}
|
|
245
|
+
catch (e) {
|
|
246
|
+
debugLog("postUnit", { phase: "prune-bg-shell", error: String(e) });
|
|
247
|
+
}
|
|
258
248
|
// Tear down browser between units to prevent Chrome process accumulation (#1733)
|
|
259
|
-
|
|
249
|
+
try {
|
|
260
250
|
const { getBrowser } = await import("../browser-tools/state.js");
|
|
261
251
|
if (getBrowser()) {
|
|
262
252
|
const { closeBrowser } = await import("../browser-tools/lifecycle.js");
|
|
263
253
|
await closeBrowser();
|
|
264
254
|
debugLog("postUnit", { phase: "browser-teardown", status: "closed" });
|
|
265
255
|
}
|
|
266
|
-
}
|
|
256
|
+
}
|
|
257
|
+
catch (e) {
|
|
258
|
+
debugLog("postUnit", { phase: "browser-teardown", error: String(e) });
|
|
259
|
+
}
|
|
267
260
|
// Sync worktree state back to project root (skipped for lightweight sidecars)
|
|
268
261
|
if (!opts?.skipWorktreeSync && s.originalBasePath && s.originalBasePath !== s.basePath) {
|
|
269
|
-
|
|
262
|
+
try {
|
|
270
263
|
syncStateToProjectRoot(s.basePath, s.originalBasePath, s.currentMilestoneId);
|
|
271
|
-
}
|
|
264
|
+
}
|
|
265
|
+
catch (e) {
|
|
266
|
+
debugLog("postUnit", { phase: "worktree-sync", error: String(e) });
|
|
267
|
+
}
|
|
272
268
|
}
|
|
273
269
|
// Rewrite-docs completion
|
|
274
270
|
if (s.currentUnit.type === "rewrite-docs") {
|
|
275
|
-
|
|
271
|
+
try {
|
|
276
272
|
await resolveAllOverrides(s.basePath);
|
|
277
|
-
// Reset both disk and in-memory counters. Disk counter is authoritative
|
|
278
|
-
// (survives restarts); in-memory is kept in sync for the current session.
|
|
279
|
-
const { setRewriteCount } = await import("./auto-dispatch.js");
|
|
280
|
-
setRewriteCount(s.basePath, 0);
|
|
281
273
|
s.rewriteAttemptCount = 0;
|
|
282
274
|
ctx.ui.notify("Override(s) resolved — rewrite-docs completed.", "info");
|
|
283
|
-
}
|
|
275
|
+
}
|
|
276
|
+
catch (e) {
|
|
277
|
+
debugLog("postUnit", { phase: "rewrite-docs-resolve", error: String(e) });
|
|
278
|
+
}
|
|
284
279
|
}
|
|
285
280
|
// Reactive state cleanup on slice completion
|
|
286
281
|
if (s.currentUnit.type === "complete-slice") {
|
|
287
|
-
|
|
288
|
-
const { milestone: mid, slice: sid } = parseUnitId(
|
|
282
|
+
try {
|
|
283
|
+
const { milestone: mid, slice: sid } = parseUnitId(s.currentUnit.id);
|
|
289
284
|
if (mid && sid) {
|
|
290
285
|
const { clearReactiveState } = await import("./reactive-graph.js");
|
|
291
286
|
clearReactiveState(s.basePath, mid, sid);
|
|
292
287
|
}
|
|
293
|
-
}
|
|
288
|
+
}
|
|
289
|
+
catch (e) {
|
|
290
|
+
debugLog("postUnit", { phase: "reactive-state-cleanup", error: String(e) });
|
|
291
|
+
}
|
|
294
292
|
}
|
|
295
293
|
// Post-triage: execute actionable resolutions
|
|
296
294
|
if (s.currentUnit.type === "triage-captures") {
|
|
@@ -417,7 +415,21 @@ export async function postUnitPostVerification(pctx) {
|
|
|
417
415
|
await closeoutUnit(ctx, s.basePath, s.currentUnit.type, s.currentUnit.id, s.currentUnit.startedAt, buildSnapshotOpts(s.currentUnit.type, s.currentUnit.id));
|
|
418
416
|
}
|
|
419
417
|
persistHookState(s.basePath);
|
|
420
|
-
|
|
418
|
+
s.sidecarQueue.push({
|
|
419
|
+
kind: "hook",
|
|
420
|
+
unitType: hookUnit.unitType,
|
|
421
|
+
unitId: hookUnit.unitId,
|
|
422
|
+
prompt: hookUnit.prompt,
|
|
423
|
+
model: hookUnit.model,
|
|
424
|
+
});
|
|
425
|
+
debugLog("postUnitPostVerification", {
|
|
426
|
+
phase: "sidecar-enqueue",
|
|
427
|
+
kind: "hook",
|
|
428
|
+
unitType: hookUnit.unitType,
|
|
429
|
+
unitId: hookUnit.unitId,
|
|
430
|
+
hookName: hookUnit.hookName,
|
|
431
|
+
});
|
|
432
|
+
return "continue";
|
|
421
433
|
}
|
|
422
434
|
// Check if a hook requested a retry of the trigger unit
|
|
423
435
|
if (isRetryPending()) {
|
|
@@ -498,7 +510,20 @@ export async function postUnitPostVerification(pctx) {
|
|
|
498
510
|
await closeoutUnit(ctx, s.basePath, s.currentUnit.type, s.currentUnit.id, s.currentUnit.startedAt);
|
|
499
511
|
}
|
|
500
512
|
const triageUnitId = `${mid}/${sid}/triage`;
|
|
501
|
-
|
|
513
|
+
s.sidecarQueue.push({
|
|
514
|
+
kind: "triage",
|
|
515
|
+
unitType: "triage-captures",
|
|
516
|
+
unitId: triageUnitId,
|
|
517
|
+
prompt,
|
|
518
|
+
});
|
|
519
|
+
debugLog("postUnitPostVerification", {
|
|
520
|
+
phase: "sidecar-enqueue",
|
|
521
|
+
kind: "triage",
|
|
522
|
+
unitId: triageUnitId,
|
|
523
|
+
pendingCount: pending.length,
|
|
524
|
+
});
|
|
525
|
+
ctx.ui.notify(`Triaging ${pending.length} pending capture${pending.length === 1 ? "" : "s"}...`, "info");
|
|
526
|
+
return "continue";
|
|
502
527
|
}
|
|
503
528
|
}
|
|
504
529
|
}
|
|
@@ -522,7 +547,21 @@ export async function postUnitPostVerification(pctx) {
|
|
|
522
547
|
}
|
|
523
548
|
markCaptureExecuted(s.basePath, capture.id);
|
|
524
549
|
const qtUnitId = `${s.currentMilestoneId}/${capture.id}`;
|
|
525
|
-
|
|
550
|
+
s.sidecarQueue.push({
|
|
551
|
+
kind: "quick-task",
|
|
552
|
+
unitType: "quick-task",
|
|
553
|
+
unitId: qtUnitId,
|
|
554
|
+
prompt,
|
|
555
|
+
captureId: capture.id,
|
|
556
|
+
});
|
|
557
|
+
debugLog("postUnitPostVerification", {
|
|
558
|
+
phase: "sidecar-enqueue",
|
|
559
|
+
kind: "quick-task",
|
|
560
|
+
unitId: qtUnitId,
|
|
561
|
+
captureId: capture.id,
|
|
562
|
+
});
|
|
563
|
+
ctx.ui.notify(`Executing quick-task: ${capture.id} — "${capture.text}"`, "info");
|
|
564
|
+
return "continue";
|
|
526
565
|
}
|
|
527
566
|
catch (e) {
|
|
528
567
|
debugLog("postUnit", { phase: "quick-task-dispatch", error: String(e) });
|
|
@@ -675,15 +675,6 @@ export async function checkNeedsRunUat(base, mid, state, prefs) {
|
|
|
675
675
|
// If the UAT file already contains a verdict, UAT has been run — skip
|
|
676
676
|
if (hasVerdict(uatContent))
|
|
677
677
|
return null;
|
|
678
|
-
// Also check the ASSESSMENT file — the run-uat prompt writes the verdict
|
|
679
|
-
// there (via gsd_summary_save artifact_type:"ASSESSMENT"), not into the
|
|
680
|
-
// UAT spec file. Without this check the unit re-dispatches indefinitely.
|
|
681
|
-
const assessmentFile = resolveSliceFile(base, mid, sid, "ASSESSMENT");
|
|
682
|
-
if (assessmentFile) {
|
|
683
|
-
const assessmentContent = await loadFile(assessmentFile);
|
|
684
|
-
if (assessmentContent && hasVerdict(assessmentContent))
|
|
685
|
-
return null;
|
|
686
|
-
}
|
|
687
678
|
const uatType = getUatType(uatContent);
|
|
688
679
|
return { sliceId: sid, uatType };
|
|
689
680
|
}
|
|
@@ -715,14 +706,6 @@ export async function checkNeedsRunUat(base, mid, state, prefs) {
|
|
|
715
706
|
// If the UAT file already contains a verdict, UAT has been run — skip
|
|
716
707
|
if (hasVerdict(uatContentFb))
|
|
717
708
|
return null;
|
|
718
|
-
// Also check the ASSESSMENT file for the file-based fallback path (same
|
|
719
|
-
// reason as the DB path above — verdict lives in ASSESSMENT, not UAT).
|
|
720
|
-
const assessmentFileFb = resolveSliceFile(base, mid, uatSid, "ASSESSMENT");
|
|
721
|
-
if (assessmentFileFb) {
|
|
722
|
-
const assessmentContentFb = await loadFile(assessmentFileFb);
|
|
723
|
-
if (assessmentContentFb && hasVerdict(assessmentContentFb))
|
|
724
|
-
return null;
|
|
725
|
-
}
|
|
726
709
|
const uatTypeFb = getUatType(uatContentFb);
|
|
727
710
|
return { sliceId: uatSid, uatType: uatTypeFb };
|
|
728
711
|
}
|
|
@@ -1190,28 +1173,6 @@ export async function buildValidateMilestonePrompt(mid, midTitle, base, level) {
|
|
|
1190
1173
|
const roadmapRel = relMilestoneFile(base, mid, "ROADMAP");
|
|
1191
1174
|
const inlined = [];
|
|
1192
1175
|
inlined.push(await inlineFile(roadmapPath, roadmapRel, "Milestone Roadmap"));
|
|
1193
|
-
// Inline verification classes from planning (if available in DB)
|
|
1194
|
-
try {
|
|
1195
|
-
const { isDbAvailable, getMilestone } = await import("./gsd-db.js");
|
|
1196
|
-
if (isDbAvailable()) {
|
|
1197
|
-
const milestone = getMilestone(mid);
|
|
1198
|
-
if (milestone) {
|
|
1199
|
-
const classes = [];
|
|
1200
|
-
if (milestone.verification_contract)
|
|
1201
|
-
classes.push(`- **Contract:** ${milestone.verification_contract}`);
|
|
1202
|
-
if (milestone.verification_integration)
|
|
1203
|
-
classes.push(`- **Integration:** ${milestone.verification_integration}`);
|
|
1204
|
-
if (milestone.verification_operational)
|
|
1205
|
-
classes.push(`- **Operational:** ${milestone.verification_operational}`);
|
|
1206
|
-
if (milestone.verification_uat)
|
|
1207
|
-
classes.push(`- **UAT:** ${milestone.verification_uat}`);
|
|
1208
|
-
if (classes.length > 0) {
|
|
1209
|
-
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")}`);
|
|
1210
|
-
}
|
|
1211
|
-
}
|
|
1212
|
-
}
|
|
1213
|
-
}
|
|
1214
|
-
catch { /* fall through */ }
|
|
1215
1176
|
// Inline all slice summaries and UAT results
|
|
1216
1177
|
let valSliceIds = [];
|
|
1217
1178
|
try {
|
|
@@ -1242,24 +1203,6 @@ export async function buildValidateMilestonePrompt(mid, midTitle, base, level) {
|
|
|
1242
1203
|
if (uatInline)
|
|
1243
1204
|
inlined.push(uatInline);
|
|
1244
1205
|
}
|
|
1245
|
-
// Aggregate unresolved follow-ups and known limitations across slices
|
|
1246
|
-
const outstandingItems = [];
|
|
1247
|
-
for (const sid of valSliceIds) {
|
|
1248
|
-
const summaryPath = resolveSliceFile(base, mid, sid, "SUMMARY");
|
|
1249
|
-
if (!summaryPath)
|
|
1250
|
-
continue;
|
|
1251
|
-
const content = await loadFile(summaryPath);
|
|
1252
|
-
if (!content)
|
|
1253
|
-
continue;
|
|
1254
|
-
const summary = parseSummary(content);
|
|
1255
|
-
if (summary.followUps)
|
|
1256
|
-
outstandingItems.push(`- **${sid} Follow-ups:** ${summary.followUps.trim()}`);
|
|
1257
|
-
if (summary.knownLimitations)
|
|
1258
|
-
outstandingItems.push(`- **${sid} Known Limitations:** ${summary.knownLimitations.trim()}`);
|
|
1259
|
-
}
|
|
1260
|
-
if (outstandingItems.length > 0) {
|
|
1261
|
-
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')}`);
|
|
1262
|
-
}
|
|
1263
1206
|
// Inline existing VALIDATION file if this is a re-validation round
|
|
1264
1207
|
const validationPath = resolveMilestoneFile(base, mid, "VALIDATION");
|
|
1265
1208
|
const validationRel = relMilestoneFile(base, mid, "VALIDATION");
|
|
@@ -6,10 +6,9 @@
|
|
|
6
6
|
* Pure functions that receive all needed state as parameters — no module-level
|
|
7
7
|
* globals or AutoContext dependency.
|
|
8
8
|
*/
|
|
9
|
-
import { parseUnitId } from "./unit-id.js";
|
|
10
9
|
import { clearParseCache } from "./files.js";
|
|
11
10
|
import { parseRoadmap as parseLegacyRoadmap, parsePlan as parseLegacyPlan } from "./parsers-legacy.js";
|
|
12
|
-
import { isDbAvailable, getTask, getSlice, getSliceTasks
|
|
11
|
+
import { isDbAvailable, getTask, getSlice, getSliceTasks } from "./gsd-db.js";
|
|
13
12
|
import { isValidationTerminal } from "./state.js";
|
|
14
13
|
import { nativeConflictFiles, nativeCommit, nativeCheckoutTheirs, nativeAddPaths, nativeMergeAbort, nativeResetHard, } from "./native-git-bridge.js";
|
|
15
14
|
import { resolveSlicePath, resolveSliceFile, resolveTasksDir, resolveTaskFiles, relMilestoneFile, relSliceFile, buildSliceFileName, resolveMilestoneFile, clearPathCache, resolveGsdRootFile, } from "./paths.js";
|
|
@@ -149,9 +148,13 @@ export function verifyExpectedArtifact(unitType, unitId, base) {
|
|
|
149
148
|
// Reactive-execute: verify that each dispatched task's summary exists.
|
|
150
149
|
// The unitId encodes the batch: "{mid}/{sid}/reactive+T02,T03"
|
|
151
150
|
if (unitType === "reactive-execute") {
|
|
152
|
-
const
|
|
153
|
-
|
|
151
|
+
const parts = unitId.split("/");
|
|
152
|
+
const mid = parts[0];
|
|
153
|
+
const sidAndBatch = parts[1];
|
|
154
|
+
const batchPart = parts[2]; // "reactive+T02,T03"
|
|
155
|
+
if (!mid || !sidAndBatch || !batchPart)
|
|
154
156
|
return false;
|
|
157
|
+
const sid = sidAndBatch;
|
|
155
158
|
const plusIdx = batchPart.indexOf("+");
|
|
156
159
|
if (plusIdx === -1) {
|
|
157
160
|
// Legacy format "reactive" without batch IDs — fall back to "any summary"
|
|
@@ -178,7 +181,10 @@ export function verifyExpectedArtifact(unitType, unitId, base) {
|
|
|
178
181
|
// Gate-evaluate: verify that each dispatched gate has been resolved in the DB.
|
|
179
182
|
// The unitId encodes the batch: "{mid}/{sid}/gates+Q3,Q4"
|
|
180
183
|
if (unitType === "gate-evaluate") {
|
|
181
|
-
const
|
|
184
|
+
const parts = unitId.split("/");
|
|
185
|
+
const mid = parts[0];
|
|
186
|
+
const sid = parts[1];
|
|
187
|
+
const batchPart = parts[2]; // "gates+Q3,Q4"
|
|
182
188
|
if (!mid || !sid || !batchPart)
|
|
183
189
|
return false;
|
|
184
190
|
const plusIdx = batchPart.indexOf("+");
|
|
@@ -230,7 +236,10 @@ export function verifyExpectedArtifact(unitType, unitId, base) {
|
|
|
230
236
|
// execute-task: DB status is authoritative. Fall back to heading-style plan
|
|
231
237
|
// detection when the DB is unavailable (unmigrated projects).
|
|
232
238
|
if (unitType === "execute-task") {
|
|
233
|
-
const
|
|
239
|
+
const parts = unitId.split("/");
|
|
240
|
+
const mid = parts[0];
|
|
241
|
+
const sid = parts[1];
|
|
242
|
+
const tid = parts[2];
|
|
234
243
|
if (mid && sid && tid) {
|
|
235
244
|
const dbTask = getTask(mid, sid, tid);
|
|
236
245
|
if (dbTask) {
|
|
@@ -262,7 +271,9 @@ export function verifyExpectedArtifact(unitType, unitId, base) {
|
|
|
262
271
|
// but omitted T{tid}-PLAN.md files would be marked complete, causing execute-task
|
|
263
272
|
// to dispatch with a missing task plan (see issue #739).
|
|
264
273
|
if (unitType === "plan-slice") {
|
|
265
|
-
const
|
|
274
|
+
const parts = unitId.split("/");
|
|
275
|
+
const mid = parts[0];
|
|
276
|
+
const sid = parts[1];
|
|
266
277
|
if (mid && sid) {
|
|
267
278
|
try {
|
|
268
279
|
// DB primary path — get task IDs to verify task plan files exist
|
|
@@ -298,7 +309,9 @@ export function verifyExpectedArtifact(unitType, unitId, base) {
|
|
|
298
309
|
// complete-slice: DB status is authoritative for whether the slice is done.
|
|
299
310
|
// Fall back to file-based check (roadmap [x]) when DB is unavailable.
|
|
300
311
|
if (unitType === "complete-slice") {
|
|
301
|
-
const
|
|
312
|
+
const parts = unitId.split("/");
|
|
313
|
+
const mid = parts[0];
|
|
314
|
+
const sid = parts[1];
|
|
302
315
|
if (mid && sid) {
|
|
303
316
|
const dir = resolveSlicePath(base, mid, sid);
|
|
304
317
|
if (dir) {
|
|
@@ -364,18 +377,6 @@ export function writeBlockerPlaceholder(unitType, unitId, base, reason) {
|
|
|
364
377
|
`Review and replace this file before relying on downstream artifacts.`,
|
|
365
378
|
].join("\n");
|
|
366
379
|
writeFileSync(absPath, content, "utf-8");
|
|
367
|
-
// Mark the task as complete in the DB so verifyExpectedArtifact passes.
|
|
368
|
-
// Without this, the DB status stays "pending" and the dispatch loop
|
|
369
|
-
// re-derives the same task indefinitely (#2531).
|
|
370
|
-
if (unitType === "execute-task" && isDbAvailable()) {
|
|
371
|
-
const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
|
|
372
|
-
if (mid && sid && tid) {
|
|
373
|
-
try {
|
|
374
|
-
updateTaskStatus(mid, sid, tid, "complete", new Date().toISOString());
|
|
375
|
-
}
|
|
376
|
-
catch { /* non-fatal */ }
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
380
|
return diagnoseExpectedArtifact(unitType, unitId, base);
|
|
380
381
|
}
|
|
381
382
|
// ─── Merge State Reconciliation ───────────────────────────────────────────────
|
|
@@ -475,7 +476,10 @@ export function reconcileMergeState(basePath, ctx) {
|
|
|
475
476
|
* These are shown when automatic reconciliation is not possible.
|
|
476
477
|
*/
|
|
477
478
|
export function buildLoopRemediationSteps(unitType, unitId, base) {
|
|
478
|
-
const
|
|
479
|
+
const parts = unitId.split("/");
|
|
480
|
+
const mid = parts[0];
|
|
481
|
+
const sid = parts[1];
|
|
482
|
+
const tid = parts[2];
|
|
479
483
|
switch (unitType) {
|
|
480
484
|
case "execute-task": {
|
|
481
485
|
if (!mid || !sid || !tid)
|
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
* telling the LLM which files to read and what to do.
|
|
11
11
|
*/
|
|
12
12
|
import { deriveState } from "./state.js";
|
|
13
|
-
import { parseUnitId } from "./unit-id.js";
|
|
14
13
|
import { getManifestStatus } from "./files.js";
|
|
15
14
|
export { inlinePriorMilestoneSummary } from "./files.js";
|
|
16
15
|
import { collectSecretsFromManifest } from "../get-secrets-from-user.js";
|
|
@@ -32,7 +31,6 @@ import { runGSDDoctor, rebuildState } from "./doctor.js";
|
|
|
32
31
|
import { preDispatchHealthGate, resetProactiveHealing, setLevelChangeCallback, } from "./doctor-proactive.js";
|
|
33
32
|
import { clearSkillSnapshot } from "./skill-discovery.js";
|
|
34
33
|
import { captureAvailableSkills, resetSkillTelemetry, } from "./skill-telemetry.js";
|
|
35
|
-
import { getRtkSessionSavings } from "../shared/rtk-session-stats.js";
|
|
36
34
|
import { initMetrics, resetMetrics, getLedger, getProjectTotals, formatCost, formatTokenCount, } from "./metrics.js";
|
|
37
35
|
import { join } from "node:path";
|
|
38
36
|
import { readFileSync, existsSync, mkdirSync, writeFileSync, unlinkSync } from "node:fs";
|
|
@@ -124,11 +122,6 @@ function deregisterSigtermHandler() {
|
|
|
124
122
|
export function getAutoDashboardData() {
|
|
125
123
|
const ledger = getLedger();
|
|
126
124
|
const totals = ledger ? getProjectTotals(ledger.units) : null;
|
|
127
|
-
const sessionId = s.cmdCtx?.sessionManager?.getSessionId?.() ?? null;
|
|
128
|
-
const rtkSavings = sessionId && s.basePath
|
|
129
|
-
? getRtkSessionSavings(s.basePath, sessionId)
|
|
130
|
-
: null;
|
|
131
|
-
const rtkEnabled = loadEffectiveGSDPreferences()?.preferences.experimental?.rtk === true;
|
|
132
125
|
// Pending capture count — lazy check, non-fatal
|
|
133
126
|
let pendingCaptureCount = 0;
|
|
134
127
|
try {
|
|
@@ -152,8 +145,6 @@ export function getAutoDashboardData() {
|
|
|
152
145
|
totalCost: totals?.cost ?? 0,
|
|
153
146
|
totalTokens: totals?.tokens.total ?? 0,
|
|
154
147
|
pendingCaptureCount,
|
|
155
|
-
rtkSavings,
|
|
156
|
-
rtkEnabled,
|
|
157
148
|
};
|
|
158
149
|
}
|
|
159
150
|
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
@@ -370,11 +361,8 @@ export async function stopAuto(ctx, pi, reason) {
|
|
|
370
361
|
// When the milestone is complete (has a SUMMARY), merge the worktree branch
|
|
371
362
|
// back to main so code isn't stranded on the worktree branch (#2317).
|
|
372
363
|
// For incomplete milestones, preserve the branch for later resumption.
|
|
373
|
-
//
|
|
374
|
-
// Skip if phases.ts already merged this milestone — avoids the double
|
|
375
|
-
// mergeAndExit that fails because the branch was already deleted (#2645).
|
|
376
364
|
try {
|
|
377
|
-
if (s.currentMilestoneId
|
|
365
|
+
if (s.currentMilestoneId) {
|
|
378
366
|
const notifyCtx = ctx
|
|
379
367
|
? { notify: ctx.ui.notify.bind(ctx.ui) }
|
|
380
368
|
: { notify: () => { } };
|
|
@@ -939,13 +927,15 @@ const widgetStateAccessors = {
|
|
|
939
927
|
* dispatching a unit. The LLM should never need to mkdir or git checkout.
|
|
940
928
|
*/
|
|
941
929
|
function ensurePreconditions(unitType, unitId, base, state) {
|
|
942
|
-
const
|
|
930
|
+
const parts = unitId.split("/");
|
|
931
|
+
const mid = parts[0];
|
|
943
932
|
const mDir = resolveMilestonePath(base, mid);
|
|
944
933
|
if (!mDir) {
|
|
945
934
|
const newDir = join(milestonesDir(base), mid);
|
|
946
935
|
mkdirSync(join(newDir, "slices"), { recursive: true });
|
|
947
936
|
}
|
|
948
|
-
if (
|
|
937
|
+
if (parts.length >= 2) {
|
|
938
|
+
const sid = parts[1];
|
|
949
939
|
const mDirResolved = resolveMilestonePath(base, mid);
|
|
950
940
|
if (mDirResolved) {
|
|
951
941
|
const slicesDir = join(mDirResolved, "slices");
|