gsd-pi 2.50.0 → 2.51.0-dev.ae8f7cb
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 +2 -0
- package/dist/cli.js +26 -0
- package/dist/loader.js +4 -0
- package/dist/resource-loader.d.ts +4 -1
- package/dist/resource-loader.js +138 -3
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +3 -1
- package/dist/resources/extensions/bg-shell/interaction.js +3 -1
- package/dist/resources/extensions/bg-shell/process-manager.js +4 -1
- package/dist/resources/extensions/claude-code-cli/partial-builder.js +5 -0
- package/dist/resources/extensions/gsd/auto/phases.js +16 -1
- package/dist/resources/extensions/gsd/auto/session.js +5 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +22 -3
- package/dist/resources/extensions/gsd/auto-dispatch.js +81 -54
- package/dist/resources/extensions/gsd/auto-observability.js +54 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +37 -76
- package/dist/resources/extensions/gsd/auto-prompts.js +57 -0
- package/dist/resources/extensions/gsd/auto-recovery.js +21 -25
- package/dist/resources/extensions/gsd/auto-utils.js +20 -0
- package/dist/resources/extensions/gsd/auto.js +15 -5
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +16 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +6 -2
- package/dist/resources/extensions/gsd/custom-execution-policy.js +3 -2
- package/dist/resources/extensions/gsd/custom-verification.js +3 -1
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +3 -2
- package/dist/resources/extensions/gsd/dashboard-overlay.js +4 -0
- package/dist/resources/extensions/gsd/detection.js +589 -3
- package/dist/resources/extensions/gsd/dispatch-guard.js +2 -1
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +15 -0
- package/dist/resources/extensions/gsd/files.js +5 -1
- package/dist/resources/extensions/gsd/guided-flow.js +10 -0
- package/dist/resources/extensions/gsd/init-wizard.js +9 -1
- package/dist/resources/extensions/gsd/model-router.js +25 -0
- package/dist/resources/extensions/gsd/notifications.js +23 -0
- package/dist/resources/extensions/gsd/observability-validator.js +422 -0
- package/dist/resources/extensions/gsd/preferences-skills.js +11 -5
- package/dist/resources/extensions/gsd/preferences-types.js +1 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +25 -0
- package/dist/resources/extensions/gsd/preferences.js +3 -0
- package/dist/resources/extensions/gsd/prompts/forensics.md +11 -7
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +6 -1
- package/dist/resources/extensions/gsd/provider-error-pause.js +8 -0
- package/dist/resources/extensions/gsd/roadmap-mutations.js +110 -0
- package/dist/resources/extensions/gsd/rtk-status.js +43 -0
- package/dist/resources/extensions/gsd/rule-registry.js +10 -11
- package/dist/resources/extensions/gsd/session-forensics.js +7 -3
- package/dist/resources/extensions/gsd/skill-catalog.js +1026 -0
- package/dist/resources/extensions/gsd/skill-discovery.js +3 -2
- package/dist/resources/extensions/gsd/skill-health.js +2 -2
- package/dist/resources/extensions/gsd/skill-telemetry.js +15 -5
- package/dist/resources/extensions/gsd/state.js +17 -5
- package/dist/resources/extensions/gsd/templates/milestone-validation.md +12 -0
- package/dist/resources/extensions/gsd/templates/preferences.md +2 -0
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +28 -9
- package/dist/resources/extensions/gsd/undo.js +8 -7
- package/dist/resources/extensions/gsd/unit-runtime.js +2 -1
- package/dist/resources/extensions/gsd/verification-gate.js +3 -1
- package/dist/resources/extensions/shared/rtk-session-stats.js +189 -0
- package/dist/resources/extensions/shared/rtk.js +100 -0
- package/dist/rtk.d.ts +52 -0
- package/dist/rtk.js +332 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -11
- 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 +6 -0
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.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/experimental/route.js +3 -0
- package/dist/web/standalone/.next/server/app/api/experimental/route.js.nft.json +1 -0
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -0
- 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 +2 -26
- 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 +12 -11
- package/dist/web/standalone/.next/server/chunks/2229.js +12 -0
- package/dist/web/standalone/.next/server/chunks/2331.js +25 -0
- package/dist/web/standalone/.next/server/chunks/{741.js → 4741.js} +1 -1
- package/dist/web/standalone/.next/server/chunks/5822.js +2 -0
- package/dist/web/standalone/.next/server/chunks/7471.js +13 -0
- package/dist/web/standalone/.next/server/functions-config-manifest.json +1 -0
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +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/5_KeZz1X0tXJK-d_4OhjB/_buildManifest.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{485.243af25f0cdf50d6.js → 2008.817d0885545aaea9.js} +6 -6
- package/dist/web/standalone/.next/static/chunks/4024.9ad5def014d90ce4.js +9 -0
- package/dist/web/standalone/.next/static/chunks/app/_global-error/page-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/api/boot/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/experimental/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-b950e4e384cc62b3.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/webpack-cfc9a116e6450a6b.js +1 -0
- package/dist/web/standalone/.next/static/css/de141508b083f922.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 +1 -0
- 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/src/types.ts +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/bash-executor.d.ts +3 -1
- package/packages/pi-coding-agent/dist/core/bash-executor.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/bash-executor.js +10 -1
- 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 +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +13 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +19 -1
- 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 +8 -0
- 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 +8 -1
- package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.d.ts +11 -1
- package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.js +30 -8
- 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 +1 -0
- 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 +3 -2
- 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 +6 -4
- 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 +5 -0
- 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 +12 -0
- 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 +2 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +2 -1
- package/packages/pi-coding-agent/src/core/bash-executor.ts +10 -2
- package/packages/pi-coding-agent/src/core/extensions/index.ts +2 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +18 -0
- package/packages/pi-coding-agent/src/core/extensions/types.ts +21 -0
- package/packages/pi-coding-agent/src/core/extensions/wrapper.ts +9 -0
- package/packages/pi-coding-agent/src/core/package-manager.ts +10 -1
- package/packages/pi-coding-agent/src/core/skills.ts +35 -10
- package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -0
- package/packages/pi-coding-agent/src/index.ts +4 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +3 -2
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +6 -4
- package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +15 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +2 -1
- package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +2 -1
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/pkg/package.json +1 -1
- package/scripts/postinstall.js +163 -6
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +3 -1
- package/src/resources/extensions/bg-shell/interaction.ts +3 -1
- package/src/resources/extensions/bg-shell/process-manager.ts +4 -1
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +5 -0
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +105 -0
- package/src/resources/extensions/gsd/auto/phases.ts +15 -1
- package/src/resources/extensions/gsd/auto/session.ts +6 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +31 -3
- package/src/resources/extensions/gsd/auto-dispatch.ts +84 -51
- package/src/resources/extensions/gsd/auto-observability.ts +72 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +56 -83
- package/src/resources/extensions/gsd/auto-prompts.ts +48 -0
- package/src/resources/extensions/gsd/auto-recovery.ts +19 -26
- package/src/resources/extensions/gsd/auto-utils.ts +25 -0
- package/src/resources/extensions/gsd/auto.ts +15 -5
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +17 -0
- package/src/resources/extensions/gsd/crash-recovery.ts +6 -2
- package/src/resources/extensions/gsd/custom-execution-policy.ts +3 -2
- package/src/resources/extensions/gsd/custom-verification.ts +3 -1
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +3 -2
- package/src/resources/extensions/gsd/dashboard-overlay.ts +7 -0
- package/src/resources/extensions/gsd/detection.ts +662 -3
- package/src/resources/extensions/gsd/dispatch-guard.ts +2 -1
- package/src/resources/extensions/gsd/docs/preferences-reference.md +15 -0
- package/src/resources/extensions/gsd/files.ts +6 -1
- package/src/resources/extensions/gsd/guided-flow.ts +11 -0
- package/src/resources/extensions/gsd/init-wizard.ts +9 -1
- package/src/resources/extensions/gsd/model-router.ts +25 -0
- package/src/resources/extensions/gsd/notifications.ts +23 -0
- package/src/resources/extensions/gsd/observability-validator.ts +456 -0
- package/src/resources/extensions/gsd/preferences-skills.ts +11 -5
- package/src/resources/extensions/gsd/preferences-types.ts +20 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +26 -0
- package/src/resources/extensions/gsd/preferences.ts +3 -0
- package/src/resources/extensions/gsd/prompts/forensics.md +11 -7
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +6 -1
- package/src/resources/extensions/gsd/provider-error-pause.ts +9 -0
- package/src/resources/extensions/gsd/roadmap-mutations.ts +134 -0
- package/src/resources/extensions/gsd/rtk-status.ts +53 -0
- package/src/resources/extensions/gsd/rule-registry.ts +10 -11
- package/src/resources/extensions/gsd/session-forensics.ts +7 -3
- package/src/resources/extensions/gsd/skill-catalog.ts +1085 -0
- package/src/resources/extensions/gsd/skill-discovery.ts +3 -2
- package/src/resources/extensions/gsd/skill-health.ts +2 -2
- package/src/resources/extensions/gsd/skill-telemetry.ts +15 -5
- package/src/resources/extensions/gsd/state.ts +16 -5
- package/src/resources/extensions/gsd/templates/milestone-validation.md +12 -0
- package/src/resources/extensions/gsd/templates/preferences.md +2 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/custom-verification.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/detection.test.ts +838 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +28 -9
- package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/model-router.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/notifications.test.ts +28 -6
- package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +474 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/retry-diagnostic-reasoning.test.ts +161 -0
- package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +4 -5
- package/src/resources/extensions/gsd/tests/rewrite-count-persist.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +146 -0
- package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +12 -12
- package/src/resources/extensions/gsd/tests/skill-catalog.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +2 -2
- package/src/resources/extensions/gsd/types.ts +2 -0
- package/src/resources/extensions/gsd/undo.ts +8 -7
- package/src/resources/extensions/gsd/unit-runtime.ts +2 -1
- package/src/resources/extensions/gsd/verification-gate.ts +3 -1
- package/src/resources/extensions/shared/rtk-session-stats.ts +249 -0
- package/src/resources/extensions/shared/rtk.ts +120 -0
- package/dist/web/standalone/.next/server/chunks/229.js +0 -12
- package/dist/web/standalone/.next/server/chunks/441.js +0 -2
- package/dist/web/standalone/.next/server/chunks/471.js +0 -13
- package/dist/web/standalone/.next/static/MQOhBnkC_TLtNn_JvZWDj/_buildManifest.js +0 -1
- package/dist/web/standalone/.next/static/chunks/4024.7c75ac378de0f2b5.js +0 -9
- package/dist/web/standalone/.next/static/chunks/app/_global-error/page-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/boot/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-12dd5ece0df4badc.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/webpack-2473ce2c3879fff4.js +0 -1
- package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +0 -1
- package/packages/pi-ai/pnpm-lock.yaml +0 -2022
- package/packages/pi-coding-agent/pnpm-lock.yaml +0 -454
- /package/dist/web/standalone/.next/static/{MQOhBnkC_TLtNn_JvZWDj → 5_KeZz1X0tXJK-d_4OhjB}/_ssgManifest.js +0 -0
|
@@ -26,6 +26,11 @@ import { getActiveWorktreeName } from "./worktree-command.js";
|
|
|
26
26
|
import { loadEffectiveGSDPreferences, getGlobalGSDPreferencesPath } from "./preferences.js";
|
|
27
27
|
import { resolveServiceTierIcon, getEffectiveServiceTier } from "./service-tier.js";
|
|
28
28
|
import { parseUnitId } from "./unit-id.js";
|
|
29
|
+
import {
|
|
30
|
+
formatRtkSavingsLabel,
|
|
31
|
+
getRtkSessionSavings,
|
|
32
|
+
type RtkSessionSavings,
|
|
33
|
+
} from "../shared/rtk-session-stats.js";
|
|
29
34
|
|
|
30
35
|
// ─── UAT Slice Extraction ─────────────────────────────────────────────────────
|
|
31
36
|
|
|
@@ -59,6 +64,10 @@ export interface AutoDashboardData {
|
|
|
59
64
|
profileDowngraded?: boolean;
|
|
60
65
|
/** Number of pending captures awaiting triage (0 if none or file missing) */
|
|
61
66
|
pendingCaptureCount: number;
|
|
67
|
+
/** RTK token savings for the current session, or null when unavailable. */
|
|
68
|
+
rtkSavings?: RtkSessionSavings | null;
|
|
69
|
+
/** Whether RTK is enabled via experimental.rtk preference. False when not opted in. */
|
|
70
|
+
rtkEnabled?: boolean;
|
|
62
71
|
/** Cross-process: another auto-mode session detected via auto.lock (PID, startedAt) */
|
|
63
72
|
remoteSession?: { pid: number; startedAt: string; unitType: string; unitId: string };
|
|
64
73
|
}
|
|
@@ -476,6 +485,19 @@ export function updateProgressWidget(
|
|
|
476
485
|
let pulseBright = true;
|
|
477
486
|
let cachedLines: string[] | undefined;
|
|
478
487
|
let cachedWidth: number | undefined;
|
|
488
|
+
let cachedRtkLabel: string | null | undefined;
|
|
489
|
+
|
|
490
|
+
const refreshRtkLabel = (): void => {
|
|
491
|
+
try {
|
|
492
|
+
const sessionId = ctx.sessionManager.getSessionId();
|
|
493
|
+
const savings = sessionId ? getRtkSessionSavings(accessors.getBasePath(), sessionId) : null;
|
|
494
|
+
cachedRtkLabel = formatRtkSavingsLabel(savings);
|
|
495
|
+
} catch {
|
|
496
|
+
cachedRtkLabel = null;
|
|
497
|
+
}
|
|
498
|
+
};
|
|
499
|
+
|
|
500
|
+
refreshRtkLabel();
|
|
479
501
|
|
|
480
502
|
const pulseTimer = setInterval(() => {
|
|
481
503
|
pulseBright = !pulseBright;
|
|
@@ -487,12 +509,15 @@ export function updateProgressWidget(
|
|
|
487
509
|
// task/slice completion mid-unit. Without this, the progress bar only
|
|
488
510
|
// updates at dispatch time, appearing frozen during long-running units.
|
|
489
511
|
// 15s (vs 5s) reduces synchronous file I/O on the hot path.
|
|
490
|
-
const progressRefreshTimer =
|
|
512
|
+
const progressRefreshTimer = setInterval(() => {
|
|
491
513
|
try {
|
|
492
|
-
|
|
514
|
+
if (mid) {
|
|
515
|
+
updateSliceProgressCache(accessors.getBasePath(), mid.id, slice?.id);
|
|
516
|
+
}
|
|
517
|
+
refreshRtkLabel();
|
|
493
518
|
cachedLines = undefined;
|
|
494
519
|
} catch { /* non-fatal */ }
|
|
495
|
-
}, 15_000)
|
|
520
|
+
}, 15_000);
|
|
496
521
|
|
|
497
522
|
return {
|
|
498
523
|
render(width: number): string[] {
|
|
@@ -776,6 +801,9 @@ export function updateProgressWidget(
|
|
|
776
801
|
if (statsLine) {
|
|
777
802
|
lines.push(rightAlign("", statsLine, width));
|
|
778
803
|
}
|
|
804
|
+
if (cachedRtkLabel) {
|
|
805
|
+
lines.push(rightAlign("", theme.fg("dim", cachedRtkLabel), width));
|
|
806
|
+
}
|
|
779
807
|
}
|
|
780
808
|
// PWD line with last commit info right-aligned
|
|
781
809
|
const lastCommit = getLastCommit(accessors.getBasePath());
|
|
@@ -13,10 +13,11 @@ 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 } from "./gsd-db.js";
|
|
16
|
+
import { isDbAvailable, getMilestoneSlices, getPendingGates, markAllGatesOmitted, getMilestone } from "./gsd-db.js";
|
|
17
17
|
import { extractVerdict, isAcceptableUatVerdict } from "./verdict-parser.js";
|
|
18
18
|
|
|
19
19
|
import {
|
|
20
|
+
gsdRoot,
|
|
20
21
|
resolveMilestoneFile,
|
|
21
22
|
resolveMilestonePath,
|
|
22
23
|
resolveSliceFile,
|
|
@@ -26,7 +27,7 @@ import {
|
|
|
26
27
|
buildMilestoneFileName,
|
|
27
28
|
buildSliceFileName,
|
|
28
29
|
} from "./paths.js";
|
|
29
|
-
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
30
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
30
31
|
import { join } from "node:path";
|
|
31
32
|
import { hasImplementationArtifacts } from "./auto-recovery.js";
|
|
32
33
|
import {
|
|
@@ -88,10 +89,46 @@ function missingSliceStop(mid: string, phase: string): DispatchAction {
|
|
|
88
89
|
};
|
|
89
90
|
}
|
|
90
91
|
|
|
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
|
+
|
|
91
105
|
// ─── Rewrite Circuit Breaker ──────────────────────────────────────────────
|
|
92
106
|
|
|
93
107
|
const MAX_REWRITE_ATTEMPTS = 3;
|
|
94
108
|
|
|
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
|
+
|
|
95
132
|
// ─── Rules ────────────────────────────────────────────────────────────────
|
|
96
133
|
|
|
97
134
|
export const DISPATCH_RULES: DispatchRule[] = [
|
|
@@ -100,14 +137,14 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
100
137
|
match: async ({ mid, midTitle, state, basePath, session }) => {
|
|
101
138
|
const pendingOverrides = await loadActiveOverrides(basePath);
|
|
102
139
|
if (pendingOverrides.length === 0) return null;
|
|
103
|
-
const count =
|
|
140
|
+
const count = getRewriteCount(basePath);
|
|
104
141
|
if (count >= MAX_REWRITE_ATTEMPTS) {
|
|
105
142
|
const { resolveAllOverrides } = await import("./files.js");
|
|
106
143
|
await resolveAllOverrides(basePath);
|
|
107
|
-
|
|
144
|
+
setRewriteCount(basePath, 0);
|
|
108
145
|
return null;
|
|
109
146
|
}
|
|
110
|
-
|
|
147
|
+
setRewriteCount(basePath, count + 1);
|
|
111
148
|
const unitId = state.activeSlice ? `${mid}/${state.activeSlice.id}` : mid;
|
|
112
149
|
return {
|
|
113
150
|
action: "dispatch",
|
|
@@ -543,30 +580,14 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
543
580
|
if (state.phase !== "validating-milestone") return null;
|
|
544
581
|
|
|
545
582
|
// Safety guard (#1368): verify all roadmap slices have SUMMARY files before
|
|
546
|
-
// allowing milestone validation.
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
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
|
-
}
|
|
583
|
+
// allowing milestone validation.
|
|
584
|
+
const missingSlices = findMissingSummaries(basePath, mid);
|
|
585
|
+
if (missingSlices.length > 0) {
|
|
586
|
+
return {
|
|
587
|
+
action: "stop",
|
|
588
|
+
reason: `Cannot validate milestone ${mid}: slices ${missingSlices.join(", ")} are missing SUMMARY files. These slices may have been skipped.`,
|
|
589
|
+
level: "error",
|
|
590
|
+
};
|
|
570
591
|
}
|
|
571
592
|
|
|
572
593
|
// Skip preference: write a minimal pass-through VALIDATION file
|
|
@@ -606,28 +627,13 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
606
627
|
if (state.phase !== "completing-milestone") return null;
|
|
607
628
|
|
|
608
629
|
// Safety guard (#1368): verify all roadmap slices have SUMMARY files.
|
|
609
|
-
|
|
610
|
-
if (
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
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
|
-
}
|
|
630
|
+
const missingSlices = findMissingSummaries(basePath, mid);
|
|
631
|
+
if (missingSlices.length > 0) {
|
|
632
|
+
return {
|
|
633
|
+
action: "stop",
|
|
634
|
+
reason: `Cannot complete milestone ${mid}: slices ${missingSlices.join(", ")} are missing SUMMARY files. Run /gsd doctor to diagnose.`,
|
|
635
|
+
level: "error",
|
|
636
|
+
};
|
|
631
637
|
}
|
|
632
638
|
|
|
633
639
|
// Safety guard (#1703): verify the milestone produced implementation
|
|
@@ -641,6 +647,33 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
641
647
|
};
|
|
642
648
|
}
|
|
643
649
|
|
|
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
|
+
|
|
644
677
|
return {
|
|
645
678
|
action: "dispatch",
|
|
646
679
|
unitType: "complete-milestone",
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-dispatch observability checks for auto-mode units.
|
|
3
|
+
* Validates plan/summary file quality and builds repair instructions
|
|
4
|
+
* for the agent to fix gaps before proceeding with the unit.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { ExtensionContext } from "@gsd/pi-coding-agent";
|
|
8
|
+
import {
|
|
9
|
+
validatePlanBoundary,
|
|
10
|
+
validateExecuteBoundary,
|
|
11
|
+
validateCompleteBoundary,
|
|
12
|
+
formatValidationIssues,
|
|
13
|
+
} from "./observability-validator.js";
|
|
14
|
+
import type { ValidationIssue } from "./observability-validator.js";
|
|
15
|
+
import { parseUnitId } from "./unit-id.js";
|
|
16
|
+
|
|
17
|
+
export async function collectObservabilityWarnings(
|
|
18
|
+
ctx: ExtensionContext,
|
|
19
|
+
basePath: string,
|
|
20
|
+
unitType: string,
|
|
21
|
+
unitId: string,
|
|
22
|
+
): Promise<ValidationIssue[]> {
|
|
23
|
+
// Hook units have custom artifacts — skip standard observability checks
|
|
24
|
+
if (unitType.startsWith("hook/")) return [];
|
|
25
|
+
|
|
26
|
+
const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
|
|
27
|
+
|
|
28
|
+
if (!mid || !sid) return [];
|
|
29
|
+
|
|
30
|
+
let issues = [] as Awaited<ReturnType<typeof validatePlanBoundary>>;
|
|
31
|
+
|
|
32
|
+
if (unitType === "plan-slice") {
|
|
33
|
+
issues = await validatePlanBoundary(basePath, mid, sid);
|
|
34
|
+
} else if (unitType === "execute-task" && tid) {
|
|
35
|
+
issues = await validateExecuteBoundary(basePath, mid, sid, tid);
|
|
36
|
+
} else if (unitType === "complete-slice") {
|
|
37
|
+
issues = await validateCompleteBoundary(basePath, mid, sid);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (issues.length > 0) {
|
|
41
|
+
ctx.ui.notify(
|
|
42
|
+
`Observability check (${unitType}) found ${issues.length} warning${issues.length === 1 ? "" : "s"}:\n${formatValidationIssues(issues)}`,
|
|
43
|
+
"warning",
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return issues;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function buildObservabilityRepairBlock(issues: ValidationIssue[]): string {
|
|
51
|
+
if (issues.length === 0) return "";
|
|
52
|
+
const items = issues.map(issue => {
|
|
53
|
+
const fileName = issue.file.split("/").pop() || issue.file;
|
|
54
|
+
let line = `- **${fileName}**: ${issue.message}`;
|
|
55
|
+
if (issue.suggestion) line += ` → ${issue.suggestion}`;
|
|
56
|
+
return line;
|
|
57
|
+
});
|
|
58
|
+
return [
|
|
59
|
+
"",
|
|
60
|
+
"---",
|
|
61
|
+
"",
|
|
62
|
+
"## Pre-flight: Observability gaps to fix FIRST",
|
|
63
|
+
"",
|
|
64
|
+
"The following issues were detected in plan/summary files for this unit.",
|
|
65
|
+
"**Read each flagged file, apply the fix described, then proceed with the unit.**",
|
|
66
|
+
"",
|
|
67
|
+
...items,
|
|
68
|
+
"",
|
|
69
|
+
"---",
|
|
70
|
+
"",
|
|
71
|
+
].join("\n");
|
|
72
|
+
}
|
|
@@ -47,8 +47,29 @@ 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
|
-
|
|
50
|
+
import { runSafely } from "./auto-utils.js";
|
|
51
|
+
import type { AutoSession, SidecarItem } from "./auto/session.js";
|
|
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
|
+
}
|
|
52
73
|
/** Unit types that only touch `.gsd/` internal state files (no code changes).
|
|
53
74
|
* Auto-commit is skipped for these — their state files are picked up by the
|
|
54
75
|
* next actual task commit via `smartStage()`. */
|
|
@@ -239,6 +260,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
239
260
|
|
|
240
261
|
// Auto-commit
|
|
241
262
|
if (s.currentUnit) {
|
|
263
|
+
const unit = s.currentUnit;
|
|
242
264
|
try {
|
|
243
265
|
let taskContext: TaskCommitContext | undefined;
|
|
244
266
|
|
|
@@ -297,64 +319,56 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
297
319
|
}
|
|
298
320
|
|
|
299
321
|
// GitHub sync (non-blocking, opt-in)
|
|
300
|
-
|
|
322
|
+
await runSafely("postUnit", "github-sync", async () => {
|
|
301
323
|
const { runGitHubSync } = await import("../github-sync/sync.js");
|
|
302
|
-
await runGitHubSync(s.basePath,
|
|
303
|
-
}
|
|
304
|
-
debugLog("postUnit", { phase: "github-sync", error: String(e) });
|
|
305
|
-
}
|
|
324
|
+
await runGitHubSync(s.basePath, unit.type, unit.id);
|
|
325
|
+
});
|
|
306
326
|
|
|
307
327
|
// Prune dead bg-shell processes
|
|
308
|
-
|
|
328
|
+
await runSafely("postUnit", "prune-bg-shell", async () => {
|
|
309
329
|
const { pruneDeadProcesses } = await import("../bg-shell/process-manager.js");
|
|
310
330
|
pruneDeadProcesses();
|
|
311
|
-
}
|
|
312
|
-
debugLog("postUnit", { phase: "prune-bg-shell", error: String(e) });
|
|
313
|
-
}
|
|
331
|
+
});
|
|
314
332
|
|
|
315
333
|
// Tear down browser between units to prevent Chrome process accumulation (#1733)
|
|
316
|
-
|
|
334
|
+
await runSafely("postUnit", "browser-teardown", async () => {
|
|
317
335
|
const { getBrowser } = await import("../browser-tools/state.js");
|
|
318
336
|
if (getBrowser()) {
|
|
319
337
|
const { closeBrowser } = await import("../browser-tools/lifecycle.js");
|
|
320
338
|
await closeBrowser();
|
|
321
339
|
debugLog("postUnit", { phase: "browser-teardown", status: "closed" });
|
|
322
340
|
}
|
|
323
|
-
}
|
|
324
|
-
debugLog("postUnit", { phase: "browser-teardown", error: String(e) });
|
|
325
|
-
}
|
|
341
|
+
});
|
|
326
342
|
|
|
327
343
|
// Sync worktree state back to project root (skipped for lightweight sidecars)
|
|
328
344
|
if (!opts?.skipWorktreeSync && s.originalBasePath && s.originalBasePath !== s.basePath) {
|
|
329
|
-
|
|
330
|
-
syncStateToProjectRoot(s.basePath, s.originalBasePath
|
|
331
|
-
}
|
|
332
|
-
debugLog("postUnit", { phase: "worktree-sync", error: String(e) });
|
|
333
|
-
}
|
|
345
|
+
await runSafely("postUnit", "worktree-sync", () => {
|
|
346
|
+
syncStateToProjectRoot(s.basePath, s.originalBasePath!, s.currentMilestoneId);
|
|
347
|
+
});
|
|
334
348
|
}
|
|
335
349
|
|
|
336
350
|
// Rewrite-docs completion
|
|
337
351
|
if (s.currentUnit.type === "rewrite-docs") {
|
|
338
|
-
|
|
352
|
+
await runSafely("postUnit", "rewrite-docs-resolve", async () => {
|
|
339
353
|
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);
|
|
340
358
|
s.rewriteAttemptCount = 0;
|
|
341
359
|
ctx.ui.notify("Override(s) resolved — rewrite-docs completed.", "info");
|
|
342
|
-
}
|
|
343
|
-
debugLog("postUnit", { phase: "rewrite-docs-resolve", error: String(e) });
|
|
344
|
-
}
|
|
360
|
+
});
|
|
345
361
|
}
|
|
346
362
|
|
|
347
363
|
// Reactive state cleanup on slice completion
|
|
348
364
|
if (s.currentUnit.type === "complete-slice") {
|
|
349
|
-
|
|
350
|
-
const { milestone: mid, slice: sid } = parseUnitId(
|
|
365
|
+
await runSafely("postUnit", "reactive-state-cleanup", async () => {
|
|
366
|
+
const { milestone: mid, slice: sid } = parseUnitId(unit.id);
|
|
351
367
|
if (mid && sid) {
|
|
352
368
|
const { clearReactiveState } = await import("./reactive-graph.js");
|
|
353
369
|
clearReactiveState(s.basePath, mid, sid);
|
|
354
370
|
}
|
|
355
|
-
}
|
|
356
|
-
debugLog("postUnit", { phase: "reactive-state-cleanup", error: String(e) });
|
|
357
|
-
}
|
|
371
|
+
});
|
|
358
372
|
}
|
|
359
373
|
|
|
360
374
|
// Post-triage: execute actionable resolutions
|
|
@@ -502,23 +516,11 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
|
|
|
502
516
|
}
|
|
503
517
|
persistHookState(s.basePath);
|
|
504
518
|
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
unitType: hookUnit.unitType,
|
|
508
|
-
|
|
509
|
-
|
|
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";
|
|
519
|
+
return enqueueSidecar(
|
|
520
|
+
s, ctx,
|
|
521
|
+
{ kind: "hook", unitType: hookUnit.unitType, unitId: hookUnit.unitId, prompt: hookUnit.prompt, model: hookUnit.model },
|
|
522
|
+
{ hookName: hookUnit.hookName },
|
|
523
|
+
);
|
|
522
524
|
}
|
|
523
525
|
|
|
524
526
|
// Check if a hook requested a retry of the trigger unit
|
|
@@ -617,26 +619,12 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
|
|
|
617
619
|
}
|
|
618
620
|
|
|
619
621
|
const triageUnitId = `${mid}/${sid}/triage`;
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
unitType: "triage-captures",
|
|
623
|
-
|
|
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(
|
|
622
|
+
return enqueueSidecar(
|
|
623
|
+
s, ctx,
|
|
624
|
+
{ kind: "triage", unitType: "triage-captures", unitId: triageUnitId, prompt },
|
|
625
|
+
{ pendingCount: pending.length },
|
|
635
626
|
`Triaging ${pending.length} pending capture${pending.length === 1 ? "" : "s"}...`,
|
|
636
|
-
"info",
|
|
637
627
|
);
|
|
638
|
-
|
|
639
|
-
return "continue";
|
|
640
628
|
}
|
|
641
629
|
}
|
|
642
630
|
}
|
|
@@ -665,27 +653,12 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
|
|
|
665
653
|
markCaptureExecuted(s.basePath, capture.id);
|
|
666
654
|
|
|
667
655
|
const qtUnitId = `${s.currentMilestoneId}/${capture.id}`;
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
unitType: "quick-task",
|
|
671
|
-
|
|
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(
|
|
656
|
+
return enqueueSidecar(
|
|
657
|
+
s, ctx,
|
|
658
|
+
{ kind: "quick-task", unitType: "quick-task", unitId: qtUnitId, prompt, captureId: capture.id },
|
|
659
|
+
{ captureId: capture.id },
|
|
684
660
|
`Executing quick-task: ${capture.id} — "${capture.text}"`,
|
|
685
|
-
"info",
|
|
686
661
|
);
|
|
687
|
-
|
|
688
|
-
return "continue";
|
|
689
662
|
} catch (e) {
|
|
690
663
|
debugLog("postUnit", { phase: "quick-task-dispatch", error: String(e) });
|
|
691
664
|
}
|
|
@@ -784,6 +784,14 @@ 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
|
+
}
|
|
787
795
|
const uatType = getUatType(uatContent);
|
|
788
796
|
return { sliceId: sid, uatType };
|
|
789
797
|
}
|
|
@@ -808,6 +816,13 @@ export async function checkNeedsRunUat(
|
|
|
808
816
|
if (!uatContentFb) return null;
|
|
809
817
|
// If the UAT file already contains a verdict, UAT has been run — skip
|
|
810
818
|
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
|
+
}
|
|
811
826
|
const uatTypeFb = getUatType(uatContentFb);
|
|
812
827
|
return { sliceId: uatSid, uatType: uatTypeFb };
|
|
813
828
|
}
|
|
@@ -1330,6 +1345,24 @@ export async function buildValidateMilestonePrompt(
|
|
|
1330
1345
|
const inlined: string[] = [];
|
|
1331
1346
|
inlined.push(await inlineFile(roadmapPath, roadmapRel, "Milestone Roadmap"));
|
|
1332
1347
|
|
|
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
|
+
|
|
1333
1366
|
// Inline all slice summaries and UAT results
|
|
1334
1367
|
let valSliceIds: string[] = [];
|
|
1335
1368
|
try {
|
|
@@ -1359,6 +1392,21 @@ export async function buildValidateMilestonePrompt(
|
|
|
1359
1392
|
if (uatInline) inlined.push(uatInline);
|
|
1360
1393
|
}
|
|
1361
1394
|
|
|
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
|
+
|
|
1362
1410
|
// Inline existing VALIDATION file if this is a re-validation round
|
|
1363
1411
|
const validationPath = resolveMilestoneFile(base, mid, "VALIDATION");
|
|
1364
1412
|
const validationRel = relMilestoneFile(base, mid, "VALIDATION");
|