gsd-pi 2.50.0 → 2.51.0-dev.7d435fe
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 +6 -4
- package/dist/cli.js +26 -0
- package/dist/headless-events.d.ts +18 -0
- package/dist/headless-events.js +36 -0
- package/dist/headless-types.d.ts +28 -0
- package/dist/headless-types.js +7 -0
- package/dist/headless.d.ts +8 -3
- package/dist/headless.js +47 -16
- package/dist/help-text.js +16 -5
- package/dist/loader.js +4 -0
- package/dist/onboarding.js +5 -4
- package/dist/remote-questions-config.js +1 -1
- 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 +32 -18
- 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/claude-code-cli/stream-adapter.js +18 -19
- 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 +98 -53
- 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-start.js +2 -0
- package/dist/resources/extensions/gsd/auto-timers.js +24 -2
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +25 -7
- package/dist/resources/extensions/gsd/auto-utils.js +20 -0
- package/dist/resources/extensions/gsd/auto-worktree.js +21 -0
- package/dist/resources/extensions/gsd/auto.js +19 -7
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +95 -69
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +12 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +17 -1
- package/dist/resources/extensions/gsd/claude-import.js +60 -9
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +69 -6
- package/dist/resources/extensions/gsd/commands-config.js +10 -5
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -1
- 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 +595 -9
- package/dist/resources/extensions/gsd/dispatch-guard.js +2 -1
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +18 -3
- package/dist/resources/extensions/gsd/error-classifier.js +105 -0
- package/dist/resources/extensions/gsd/files.js +5 -1
- package/dist/resources/extensions/gsd/gitignore.js +7 -7
- package/dist/resources/extensions/gsd/gsd-db.js +298 -45
- package/dist/resources/extensions/gsd/guided-flow.js +10 -0
- package/dist/resources/extensions/gsd/init-wizard.js +11 -3
- package/dist/resources/extensions/gsd/key-manager.js +7 -16
- package/dist/resources/extensions/gsd/memory-store.js +28 -13
- package/dist/resources/extensions/gsd/milestone-actions.js +19 -0
- 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-models.js +1 -13
- 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 +16 -13
- package/dist/resources/extensions/gsd/prompts/forensics.md +11 -7
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +6 -1
- package/dist/resources/extensions/gsd/provider-error-pause.js +0 -36
- 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 +11 -12
- package/dist/resources/extensions/gsd/service-tier.js +13 -2
- 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 +38 -7
- package/dist/resources/extensions/gsd/templates/{preferences.md → PREFERENCES.md} +2 -0
- package/dist/resources/extensions/gsd/templates/milestone-validation.md +12 -0
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +28 -9
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -10
- package/dist/resources/extensions/gsd/tools/complete-slice.js +3 -17
- package/dist/resources/extensions/gsd/tools/complete-task.js +7 -18
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +26 -17
- package/dist/resources/extensions/gsd/tools/plan-slice.js +25 -14
- package/dist/resources/extensions/gsd/tools/plan-task.js +21 -11
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +47 -37
- package/dist/resources/extensions/gsd/tools/replan-slice.js +49 -38
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +23 -16
- 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/gsd/workflow-logger.js +0 -1
- package/dist/resources/extensions/remote-questions/config.js +1 -1
- package/dist/resources/extensions/remote-questions/remote-command.js +1 -1
- package/dist/resources/extensions/search-the-web/native-search.js +1 -1
- package/dist/resources/extensions/search-the-web/provider.js +1 -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 +18 -17
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +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 +18 -17
- 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/RqOU-jOv9uZ1Q03P6L6nn/_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.21054f459af5cc78.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-024d82be84800e52.js +1 -0
- package/dist/web/standalone/.next/static/css/a58ef8a151aa0493.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/dist/wizard.js +4 -1
- package/package.json +2 -2
- package/packages/pi-ai/dist/models.d.ts +14 -3
- package/packages/pi-ai/dist/models.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.js +53 -10
- package/packages/pi-ai/dist/models.js.map +1 -1
- package/packages/pi-ai/dist/models.test.js +102 -1
- package/packages/pi-ai/dist/models.test.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +31 -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/models.test.ts +114 -1
- package/packages/pi-ai/src/models.ts +70 -13
- package/packages/pi-ai/src/types.ts +32 -1
- package/packages/pi-coding-agent/dist/cli/args.d.ts +2 -0
- package/packages/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/cli/args.js +3 -0
- package/packages/pi-coding-agent/dist/cli/args.js.map +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 +15 -2
- 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/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +9 -4
- package/packages/pi-coding-agent/dist/core/model-registry.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/core/tools/bash-spawn-windows.test.d.ts +19 -0
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +83 -0
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +5 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +3 -3
- 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/main.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +5 -3
- package/packages/pi-coding-agent/dist/main.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/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/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +0 -2
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.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/dist/modes/rpc/rpc-client.d.ts +28 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js +49 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +114 -6
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-protocol-v2.test.d.ts +9 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-protocol-v2.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-protocol-v2.test.js +831 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-protocol-v2.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +66 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.js +0 -1
- package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/cli/args.ts +4 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +2 -1
- package/packages/pi-coding-agent/src/core/bash-executor.ts +15 -3
- 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/model-registry.ts +10 -3
- 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/core/tools/bash-spawn-windows.test.ts +101 -0
- package/packages/pi-coding-agent/src/core/tools/bash.ts +5 -1
- package/packages/pi-coding-agent/src/index.ts +7 -0
- package/packages/pi-coding-agent/src/main.ts +5 -3
- package/packages/pi-coding-agent/src/modes/index.ts +8 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +3 -2
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +0 -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/packages/pi-coding-agent/src/modes/rpc/rpc-client.ts +54 -1
- package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +124 -6
- package/packages/pi-coding-agent/src/modes/rpc/rpc-protocol-v2.test.ts +971 -0
- package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +61 -4
- package/packages/pi-coding-agent/src/utils/shell.ts +0 -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 +25 -12
- 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/stream-adapter.ts +19 -20
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +105 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +21 -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 +102 -50
- 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-start.ts +2 -0
- package/src/resources/extensions/gsd/auto-timers.ts +25 -1
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +30 -6
- package/src/resources/extensions/gsd/auto-utils.ts +25 -0
- package/src/resources/extensions/gsd/auto-worktree.ts +21 -0
- package/src/resources/extensions/gsd/auto.ts +20 -7
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +115 -72
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +11 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +18 -1
- package/src/resources/extensions/gsd/claude-import.ts +58 -9
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +73 -6
- package/src/resources/extensions/gsd/commands-config.ts +11 -5
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -1
- 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 +668 -9
- package/src/resources/extensions/gsd/dispatch-guard.ts +2 -1
- package/src/resources/extensions/gsd/docs/preferences-reference.md +18 -3
- package/src/resources/extensions/gsd/error-classifier.ts +139 -0
- package/src/resources/extensions/gsd/files.ts +6 -1
- package/src/resources/extensions/gsd/gitignore.ts +7 -7
- package/src/resources/extensions/gsd/gsd-db.ts +355 -63
- package/src/resources/extensions/gsd/guided-flow.ts +11 -0
- package/src/resources/extensions/gsd/init-wizard.ts +11 -3
- package/src/resources/extensions/gsd/key-manager.ts +7 -16
- package/src/resources/extensions/gsd/memory-store.ts +29 -18
- package/src/resources/extensions/gsd/milestone-actions.ts +17 -0
- 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-models.ts +1 -13
- 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 +15 -13
- package/src/resources/extensions/gsd/prompts/forensics.md +11 -7
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +6 -1
- package/src/resources/extensions/gsd/provider-error-pause.ts +0 -48
- 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 +11 -12
- package/src/resources/extensions/gsd/service-tier.ts +14 -2
- 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 +38 -7
- package/src/resources/extensions/gsd/templates/{preferences.md → PREFERENCES.md} +2 -0
- package/src/resources/extensions/gsd/templates/milestone-validation.md +12 -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/auto-milestone-target.test.ts +61 -0
- package/src/resources/extensions/gsd/tests/claude-import-marketplace-discovery.test.ts +191 -0
- package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/commands-config.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/complete-task-rollback-evidence.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/complete-task.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 +39 -10
- package/src/resources/extensions/gsd/tests/detection.test.ts +839 -1
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +28 -9
- package/src/resources/extensions/gsd/tests/doctor-git.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/empty-db-reconciliation.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/git-service.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/idle-watchdog-stall-override.test.ts +125 -0
- package/src/resources/extensions/gsd/tests/init-wizard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/interactive-tool-idle-exemption.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/key-manager.test.ts +16 -1
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/model-router.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/notifications.test.ts +28 -6
- package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +474 -0
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +51 -1
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +77 -70
- 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/remediation-completion-guard.test.ts +110 -0
- package/src/resources/extensions/gsd/tests/remote-questions.test.ts +29 -0
- 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 +56 -21
- package/src/resources/extensions/gsd/tests/token-cost-display.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/vacuous-truth-slices.test.ts +115 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +81 -1
- package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +130 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -14
- package/src/resources/extensions/gsd/tools/complete-slice.ts +3 -21
- package/src/resources/extensions/gsd/tools/complete-task.ts +9 -22
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +28 -18
- package/src/resources/extensions/gsd/tools/plan-slice.ts +28 -16
- package/src/resources/extensions/gsd/tools/plan-task.ts +24 -12
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +54 -42
- package/src/resources/extensions/gsd/tools/replan-slice.ts +53 -40
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +26 -20
- 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/gsd/workflow-logger.ts +0 -1
- package/src/resources/extensions/remote-questions/config.ts +1 -1
- package/src/resources/extensions/remote-questions/remote-command.ts +1 -1
- package/src/resources/extensions/search-the-web/native-search.ts +1 -1
- package/src/resources/extensions/search-the-web/provider.ts +1 -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 → RqOU-jOv9uZ1Q03P6L6nn}/_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 } from "./gsd-db.js";
|
|
12
|
+
import { isDbAvailable, getMilestoneSlices, getPendingGates, markAllGatesOmitted, getMilestone } from "./gsd-db.js";
|
|
13
13
|
import { extractVerdict, isAcceptableUatVerdict } from "./verdict-parser.js";
|
|
14
|
-
import { resolveMilestoneFile, resolveMilestonePath, resolveSliceFile, resolveTaskFile, relSliceFile, buildMilestoneFileName, } from "./paths.js";
|
|
15
|
-
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
14
|
+
import { gsdRoot, resolveMilestoneFile, resolveMilestonePath, resolveSliceFile, resolveTaskFile, relSliceFile, buildMilestoneFileName, } from "./paths.js";
|
|
15
|
+
import { existsSync, mkdirSync, readFileSync, 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,8 +23,42 @@ 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
|
+
}
|
|
26
39
|
// ─── Rewrite Circuit Breaker ──────────────────────────────────────────────
|
|
27
40
|
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
|
+
}
|
|
28
62
|
// ─── Rules ────────────────────────────────────────────────────────────────
|
|
29
63
|
export const DISPATCH_RULES = [
|
|
30
64
|
{
|
|
@@ -33,16 +67,14 @@ export const DISPATCH_RULES = [
|
|
|
33
67
|
const pendingOverrides = await loadActiveOverrides(basePath);
|
|
34
68
|
if (pendingOverrides.length === 0)
|
|
35
69
|
return null;
|
|
36
|
-
const count =
|
|
70
|
+
const count = getRewriteCount(basePath);
|
|
37
71
|
if (count >= MAX_REWRITE_ATTEMPTS) {
|
|
38
72
|
const { resolveAllOverrides } = await import("./files.js");
|
|
39
73
|
await resolveAllOverrides(basePath);
|
|
40
|
-
|
|
41
|
-
session.rewriteAttemptCount = 0;
|
|
74
|
+
setRewriteCount(basePath, 0);
|
|
42
75
|
return null;
|
|
43
76
|
}
|
|
44
|
-
|
|
45
|
-
session.rewriteAttemptCount++;
|
|
77
|
+
setRewriteCount(basePath, count + 1);
|
|
46
78
|
const unitId = state.activeSlice ? `${mid}/${state.activeSlice.id}` : mid;
|
|
47
79
|
return {
|
|
48
80
|
action: "dispatch",
|
|
@@ -408,30 +440,14 @@ export const DISPATCH_RULES = [
|
|
|
408
440
|
if (state.phase !== "validating-milestone")
|
|
409
441
|
return null;
|
|
410
442
|
// Safety guard (#1368): verify all roadmap slices have SUMMARY files before
|
|
411
|
-
// allowing milestone validation.
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
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
|
-
}
|
|
443
|
+
// allowing milestone validation.
|
|
444
|
+
const missingSlices = findMissingSummaries(basePath, mid);
|
|
445
|
+
if (missingSlices.length > 0) {
|
|
446
|
+
return {
|
|
447
|
+
action: "stop",
|
|
448
|
+
reason: `Cannot validate milestone ${mid}: slices ${missingSlices.join(", ")} are missing SUMMARY files. These slices may have been skipped.`,
|
|
449
|
+
level: "error",
|
|
450
|
+
};
|
|
435
451
|
}
|
|
436
452
|
// Skip preference: write a minimal pass-through VALIDATION file
|
|
437
453
|
if (prefs?.phases?.skip_milestone_validation) {
|
|
@@ -467,29 +483,32 @@ export const DISPATCH_RULES = [
|
|
|
467
483
|
match: async ({ state, mid, midTitle, basePath }) => {
|
|
468
484
|
if (state.phase !== "completing-milestone")
|
|
469
485
|
return null;
|
|
470
|
-
// Safety guard (#
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
486
|
+
// Safety guard (#2675): block completion when VALIDATION verdict is
|
|
487
|
+
// needs-remediation. The state machine treats needs-remediation as
|
|
488
|
+
// terminal (to prevent validate-milestone loops per #832), but
|
|
489
|
+
// completing-milestone should NOT proceed — remediation work is needed.
|
|
490
|
+
const validationFile = resolveMilestoneFile(basePath, mid, "VALIDATION");
|
|
491
|
+
if (validationFile) {
|
|
492
|
+
const validationContent = await loadFile(validationFile);
|
|
493
|
+
if (validationContent) {
|
|
494
|
+
const verdict = extractVerdict(validationContent);
|
|
495
|
+
if (verdict === "needs-remediation") {
|
|
496
|
+
return {
|
|
497
|
+
action: "stop",
|
|
498
|
+
reason: `Cannot complete milestone ${mid}: VALIDATION verdict is "needs-remediation". Address the remediation findings and re-run validation, or update the verdict manually.`,
|
|
499
|
+
level: "warning",
|
|
500
|
+
};
|
|
484
501
|
}
|
|
485
502
|
}
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
503
|
+
}
|
|
504
|
+
// Safety guard (#1368): verify all roadmap slices have SUMMARY files.
|
|
505
|
+
const missingSlices = findMissingSummaries(basePath, mid);
|
|
506
|
+
if (missingSlices.length > 0) {
|
|
507
|
+
return {
|
|
508
|
+
action: "stop",
|
|
509
|
+
reason: `Cannot complete milestone ${mid}: slices ${missingSlices.join(", ")} are missing SUMMARY files. Run /gsd doctor to diagnose.`,
|
|
510
|
+
level: "error",
|
|
511
|
+
};
|
|
493
512
|
}
|
|
494
513
|
// Safety guard (#1703): verify the milestone produced implementation
|
|
495
514
|
// artifacts (non-.gsd/ files). A milestone with only plan files and
|
|
@@ -501,6 +520,32 @@ export const DISPATCH_RULES = [
|
|
|
501
520
|
level: "error",
|
|
502
521
|
};
|
|
503
522
|
}
|
|
523
|
+
// Verification class compliance: if operational verification was planned,
|
|
524
|
+
// ensure the validation output documents it before allowing completion.
|
|
525
|
+
try {
|
|
526
|
+
if (isDbAvailable()) {
|
|
527
|
+
const milestone = getMilestone(mid);
|
|
528
|
+
if (milestone?.verification_operational &&
|
|
529
|
+
milestone.verification_operational.toLowerCase() !== "none") {
|
|
530
|
+
const validationPath = resolveMilestoneFile(basePath, mid, "VALIDATION");
|
|
531
|
+
if (validationPath) {
|
|
532
|
+
const validationContent = await loadFile(validationPath);
|
|
533
|
+
if (validationContent) {
|
|
534
|
+
const hasOperationalCheck = validationContent.includes("Operational") &&
|
|
535
|
+
(validationContent.includes("MET") || validationContent.includes("N/A"));
|
|
536
|
+
if (!hasOperationalCheck) {
|
|
537
|
+
return {
|
|
538
|
+
action: "stop",
|
|
539
|
+
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.`,
|
|
540
|
+
level: "warning",
|
|
541
|
+
};
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
catch { /* fall through — don't block on DB errors */ }
|
|
504
549
|
return {
|
|
505
550
|
action: "dispatch",
|
|
506
551
|
unitType: "complete-milestone",
|
|
@@ -0,0 +1,54 @@
|
|
|
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
|
+
import { validatePlanBoundary, validateExecuteBoundary, validateCompleteBoundary, formatValidationIssues, } from "./observability-validator.js";
|
|
7
|
+
import { parseUnitId } from "./unit-id.js";
|
|
8
|
+
export async function collectObservabilityWarnings(ctx, basePath, unitType, unitId) {
|
|
9
|
+
// Hook units have custom artifacts — skip standard observability checks
|
|
10
|
+
if (unitType.startsWith("hook/"))
|
|
11
|
+
return [];
|
|
12
|
+
const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
|
|
13
|
+
if (!mid || !sid)
|
|
14
|
+
return [];
|
|
15
|
+
let issues = [];
|
|
16
|
+
if (unitType === "plan-slice") {
|
|
17
|
+
issues = await validatePlanBoundary(basePath, mid, sid);
|
|
18
|
+
}
|
|
19
|
+
else if (unitType === "execute-task" && tid) {
|
|
20
|
+
issues = await validateExecuteBoundary(basePath, mid, sid, tid);
|
|
21
|
+
}
|
|
22
|
+
else if (unitType === "complete-slice") {
|
|
23
|
+
issues = await validateCompleteBoundary(basePath, mid, sid);
|
|
24
|
+
}
|
|
25
|
+
if (issues.length > 0) {
|
|
26
|
+
ctx.ui.notify(`Observability check (${unitType}) found ${issues.length} warning${issues.length === 1 ? "" : "s"}:\n${formatValidationIssues(issues)}`, "warning");
|
|
27
|
+
}
|
|
28
|
+
return issues;
|
|
29
|
+
}
|
|
30
|
+
export function buildObservabilityRepairBlock(issues) {
|
|
31
|
+
if (issues.length === 0)
|
|
32
|
+
return "";
|
|
33
|
+
const items = issues.map(issue => {
|
|
34
|
+
const fileName = issue.file.split("/").pop() || issue.file;
|
|
35
|
+
let line = `- **${fileName}**: ${issue.message}`;
|
|
36
|
+
if (issue.suggestion)
|
|
37
|
+
line += ` → ${issue.suggestion}`;
|
|
38
|
+
return line;
|
|
39
|
+
});
|
|
40
|
+
return [
|
|
41
|
+
"",
|
|
42
|
+
"---",
|
|
43
|
+
"",
|
|
44
|
+
"## Pre-flight: Observability gaps to fix FIRST",
|
|
45
|
+
"",
|
|
46
|
+
"The following issues were detected in plan/summary files for this unit.",
|
|
47
|
+
"**Read each flagged file, apply the fix described, then proceed with the unit.**",
|
|
48
|
+
"",
|
|
49
|
+
...items,
|
|
50
|
+
"",
|
|
51
|
+
"---",
|
|
52
|
+
"",
|
|
53
|
+
].join("\n");
|
|
54
|
+
}
|
|
@@ -27,6 +27,21 @@ 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
|
+
}
|
|
30
45
|
/** Unit types that only touch `.gsd/` internal state files (no code changes).
|
|
31
46
|
* Auto-commit is skipped for these — their state files are picked up by the
|
|
32
47
|
* next actual task commit via `smartStage()`. */
|
|
@@ -174,6 +189,7 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
174
189
|
}
|
|
175
190
|
// Auto-commit
|
|
176
191
|
if (s.currentUnit) {
|
|
192
|
+
const unit = s.currentUnit;
|
|
177
193
|
try {
|
|
178
194
|
let taskContext;
|
|
179
195
|
if (s.currentUnit.type === "execute-task") {
|
|
@@ -230,65 +246,51 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
230
246
|
ctx.ui.notify(`Auto-commit failed: ${String(e).split("\n")[0]}`, "warning");
|
|
231
247
|
}
|
|
232
248
|
// GitHub sync (non-blocking, opt-in)
|
|
233
|
-
|
|
249
|
+
await runSafely("postUnit", "github-sync", async () => {
|
|
234
250
|
const { runGitHubSync } = await import("../github-sync/sync.js");
|
|
235
|
-
await runGitHubSync(s.basePath,
|
|
236
|
-
}
|
|
237
|
-
catch (e) {
|
|
238
|
-
debugLog("postUnit", { phase: "github-sync", error: String(e) });
|
|
239
|
-
}
|
|
251
|
+
await runGitHubSync(s.basePath, unit.type, unit.id);
|
|
252
|
+
});
|
|
240
253
|
// Prune dead bg-shell processes
|
|
241
|
-
|
|
254
|
+
await runSafely("postUnit", "prune-bg-shell", async () => {
|
|
242
255
|
const { pruneDeadProcesses } = await import("../bg-shell/process-manager.js");
|
|
243
256
|
pruneDeadProcesses();
|
|
244
|
-
}
|
|
245
|
-
catch (e) {
|
|
246
|
-
debugLog("postUnit", { phase: "prune-bg-shell", error: String(e) });
|
|
247
|
-
}
|
|
257
|
+
});
|
|
248
258
|
// Tear down browser between units to prevent Chrome process accumulation (#1733)
|
|
249
|
-
|
|
259
|
+
await runSafely("postUnit", "browser-teardown", async () => {
|
|
250
260
|
const { getBrowser } = await import("../browser-tools/state.js");
|
|
251
261
|
if (getBrowser()) {
|
|
252
262
|
const { closeBrowser } = await import("../browser-tools/lifecycle.js");
|
|
253
263
|
await closeBrowser();
|
|
254
264
|
debugLog("postUnit", { phase: "browser-teardown", status: "closed" });
|
|
255
265
|
}
|
|
256
|
-
}
|
|
257
|
-
catch (e) {
|
|
258
|
-
debugLog("postUnit", { phase: "browser-teardown", error: String(e) });
|
|
259
|
-
}
|
|
266
|
+
});
|
|
260
267
|
// Sync worktree state back to project root (skipped for lightweight sidecars)
|
|
261
268
|
if (!opts?.skipWorktreeSync && s.originalBasePath && s.originalBasePath !== s.basePath) {
|
|
262
|
-
|
|
269
|
+
await runSafely("postUnit", "worktree-sync", () => {
|
|
263
270
|
syncStateToProjectRoot(s.basePath, s.originalBasePath, s.currentMilestoneId);
|
|
264
|
-
}
|
|
265
|
-
catch (e) {
|
|
266
|
-
debugLog("postUnit", { phase: "worktree-sync", error: String(e) });
|
|
267
|
-
}
|
|
271
|
+
});
|
|
268
272
|
}
|
|
269
273
|
// Rewrite-docs completion
|
|
270
274
|
if (s.currentUnit.type === "rewrite-docs") {
|
|
271
|
-
|
|
275
|
+
await runSafely("postUnit", "rewrite-docs-resolve", async () => {
|
|
272
276
|
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);
|
|
273
281
|
s.rewriteAttemptCount = 0;
|
|
274
282
|
ctx.ui.notify("Override(s) resolved — rewrite-docs completed.", "info");
|
|
275
|
-
}
|
|
276
|
-
catch (e) {
|
|
277
|
-
debugLog("postUnit", { phase: "rewrite-docs-resolve", error: String(e) });
|
|
278
|
-
}
|
|
283
|
+
});
|
|
279
284
|
}
|
|
280
285
|
// Reactive state cleanup on slice completion
|
|
281
286
|
if (s.currentUnit.type === "complete-slice") {
|
|
282
|
-
|
|
283
|
-
const { milestone: mid, slice: sid } = parseUnitId(
|
|
287
|
+
await runSafely("postUnit", "reactive-state-cleanup", async () => {
|
|
288
|
+
const { milestone: mid, slice: sid } = parseUnitId(unit.id);
|
|
284
289
|
if (mid && sid) {
|
|
285
290
|
const { clearReactiveState } = await import("./reactive-graph.js");
|
|
286
291
|
clearReactiveState(s.basePath, mid, sid);
|
|
287
292
|
}
|
|
288
|
-
}
|
|
289
|
-
catch (e) {
|
|
290
|
-
debugLog("postUnit", { phase: "reactive-state-cleanup", error: String(e) });
|
|
291
|
-
}
|
|
293
|
+
});
|
|
292
294
|
}
|
|
293
295
|
// Post-triage: execute actionable resolutions
|
|
294
296
|
if (s.currentUnit.type === "triage-captures") {
|
|
@@ -415,21 +417,7 @@ export async function postUnitPostVerification(pctx) {
|
|
|
415
417
|
await closeoutUnit(ctx, s.basePath, s.currentUnit.type, s.currentUnit.id, s.currentUnit.startedAt, buildSnapshotOpts(s.currentUnit.type, s.currentUnit.id));
|
|
416
418
|
}
|
|
417
419
|
persistHookState(s.basePath);
|
|
418
|
-
s.
|
|
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";
|
|
420
|
+
return enqueueSidecar(s, ctx, { kind: "hook", unitType: hookUnit.unitType, unitId: hookUnit.unitId, prompt: hookUnit.prompt, model: hookUnit.model }, { hookName: hookUnit.hookName });
|
|
433
421
|
}
|
|
434
422
|
// Check if a hook requested a retry of the trigger unit
|
|
435
423
|
if (isRetryPending()) {
|
|
@@ -510,20 +498,7 @@ export async function postUnitPostVerification(pctx) {
|
|
|
510
498
|
await closeoutUnit(ctx, s.basePath, s.currentUnit.type, s.currentUnit.id, s.currentUnit.startedAt);
|
|
511
499
|
}
|
|
512
500
|
const triageUnitId = `${mid}/${sid}/triage`;
|
|
513
|
-
s.
|
|
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";
|
|
501
|
+
return enqueueSidecar(s, ctx, { kind: "triage", unitType: "triage-captures", unitId: triageUnitId, prompt }, { pendingCount: pending.length }, `Triaging ${pending.length} pending capture${pending.length === 1 ? "" : "s"}...`);
|
|
527
502
|
}
|
|
528
503
|
}
|
|
529
504
|
}
|
|
@@ -547,21 +522,7 @@ export async function postUnitPostVerification(pctx) {
|
|
|
547
522
|
}
|
|
548
523
|
markCaptureExecuted(s.basePath, capture.id);
|
|
549
524
|
const qtUnitId = `${s.currentMilestoneId}/${capture.id}`;
|
|
550
|
-
s.
|
|
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";
|
|
525
|
+
return enqueueSidecar(s, ctx, { kind: "quick-task", unitType: "quick-task", unitId: qtUnitId, prompt, captureId: capture.id }, { captureId: capture.id }, `Executing quick-task: ${capture.id} — "${capture.text}"`);
|
|
565
526
|
}
|
|
566
527
|
catch (e) {
|
|
567
528
|
debugLog("postUnit", { phase: "quick-task-dispatch", error: String(e) });
|
|
@@ -675,6 +675,15 @@ 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
|
+
}
|
|
678
687
|
const uatType = getUatType(uatContent);
|
|
679
688
|
return { sliceId: sid, uatType };
|
|
680
689
|
}
|
|
@@ -706,6 +715,14 @@ export async function checkNeedsRunUat(base, mid, state, prefs) {
|
|
|
706
715
|
// If the UAT file already contains a verdict, UAT has been run — skip
|
|
707
716
|
if (hasVerdict(uatContentFb))
|
|
708
717
|
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
|
+
}
|
|
709
726
|
const uatTypeFb = getUatType(uatContentFb);
|
|
710
727
|
return { sliceId: uatSid, uatType: uatTypeFb };
|
|
711
728
|
}
|
|
@@ -1173,6 +1190,28 @@ export async function buildValidateMilestonePrompt(mid, midTitle, base, level) {
|
|
|
1173
1190
|
const roadmapRel = relMilestoneFile(base, mid, "ROADMAP");
|
|
1174
1191
|
const inlined = [];
|
|
1175
1192
|
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 */ }
|
|
1176
1215
|
// Inline all slice summaries and UAT results
|
|
1177
1216
|
let valSliceIds = [];
|
|
1178
1217
|
try {
|
|
@@ -1203,6 +1242,24 @@ export async function buildValidateMilestonePrompt(mid, midTitle, base, level) {
|
|
|
1203
1242
|
if (uatInline)
|
|
1204
1243
|
inlined.push(uatInline);
|
|
1205
1244
|
}
|
|
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
|
+
}
|
|
1206
1263
|
// Inline existing VALIDATION file if this is a re-validation round
|
|
1207
1264
|
const validationPath = resolveMilestoneFile(base, mid, "VALIDATION");
|
|
1208
1265
|
const validationRel = relMilestoneFile(base, mid, "VALIDATION");
|
|
@@ -6,9 +6,10 @@
|
|
|
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";
|
|
9
10
|
import { clearParseCache } from "./files.js";
|
|
10
11
|
import { parseRoadmap as parseLegacyRoadmap, parsePlan as parseLegacyPlan } from "./parsers-legacy.js";
|
|
11
|
-
import { isDbAvailable, getTask, getSlice, getSliceTasks } from "./gsd-db.js";
|
|
12
|
+
import { isDbAvailable, getTask, getSlice, getSliceTasks, updateTaskStatus } from "./gsd-db.js";
|
|
12
13
|
import { isValidationTerminal } from "./state.js";
|
|
13
14
|
import { nativeConflictFiles, nativeCommit, nativeCheckoutTheirs, nativeAddPaths, nativeMergeAbort, nativeResetHard, } from "./native-git-bridge.js";
|
|
14
15
|
import { resolveSlicePath, resolveSliceFile, resolveTasksDir, resolveTaskFiles, relMilestoneFile, relSliceFile, buildSliceFileName, resolveMilestoneFile, clearPathCache, resolveGsdRootFile, } from "./paths.js";
|
|
@@ -148,13 +149,9 @@ export function verifyExpectedArtifact(unitType, unitId, base) {
|
|
|
148
149
|
// Reactive-execute: verify that each dispatched task's summary exists.
|
|
149
150
|
// The unitId encodes the batch: "{mid}/{sid}/reactive+T02,T03"
|
|
150
151
|
if (unitType === "reactive-execute") {
|
|
151
|
-
const
|
|
152
|
-
|
|
153
|
-
const sidAndBatch = parts[1];
|
|
154
|
-
const batchPart = parts[2]; // "reactive+T02,T03"
|
|
155
|
-
if (!mid || !sidAndBatch || !batchPart)
|
|
152
|
+
const { milestone: mid, slice: sid, task: batchPart } = parseUnitId(unitId);
|
|
153
|
+
if (!mid || !sid || !batchPart)
|
|
156
154
|
return false;
|
|
157
|
-
const sid = sidAndBatch;
|
|
158
155
|
const plusIdx = batchPart.indexOf("+");
|
|
159
156
|
if (plusIdx === -1) {
|
|
160
157
|
// Legacy format "reactive" without batch IDs — fall back to "any summary"
|
|
@@ -181,10 +178,7 @@ export function verifyExpectedArtifact(unitType, unitId, base) {
|
|
|
181
178
|
// Gate-evaluate: verify that each dispatched gate has been resolved in the DB.
|
|
182
179
|
// The unitId encodes the batch: "{mid}/{sid}/gates+Q3,Q4"
|
|
183
180
|
if (unitType === "gate-evaluate") {
|
|
184
|
-
const
|
|
185
|
-
const mid = parts[0];
|
|
186
|
-
const sid = parts[1];
|
|
187
|
-
const batchPart = parts[2]; // "gates+Q3,Q4"
|
|
181
|
+
const { milestone: mid, slice: sid, task: batchPart } = parseUnitId(unitId);
|
|
188
182
|
if (!mid || !sid || !batchPart)
|
|
189
183
|
return false;
|
|
190
184
|
const plusIdx = batchPart.indexOf("+");
|
|
@@ -236,10 +230,7 @@ export function verifyExpectedArtifact(unitType, unitId, base) {
|
|
|
236
230
|
// execute-task: DB status is authoritative. Fall back to heading-style plan
|
|
237
231
|
// detection when the DB is unavailable (unmigrated projects).
|
|
238
232
|
if (unitType === "execute-task") {
|
|
239
|
-
const
|
|
240
|
-
const mid = parts[0];
|
|
241
|
-
const sid = parts[1];
|
|
242
|
-
const tid = parts[2];
|
|
233
|
+
const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
|
|
243
234
|
if (mid && sid && tid) {
|
|
244
235
|
const dbTask = getTask(mid, sid, tid);
|
|
245
236
|
if (dbTask) {
|
|
@@ -271,9 +262,7 @@ export function verifyExpectedArtifact(unitType, unitId, base) {
|
|
|
271
262
|
// but omitted T{tid}-PLAN.md files would be marked complete, causing execute-task
|
|
272
263
|
// to dispatch with a missing task plan (see issue #739).
|
|
273
264
|
if (unitType === "plan-slice") {
|
|
274
|
-
const
|
|
275
|
-
const mid = parts[0];
|
|
276
|
-
const sid = parts[1];
|
|
265
|
+
const { milestone: mid, slice: sid } = parseUnitId(unitId);
|
|
277
266
|
if (mid && sid) {
|
|
278
267
|
try {
|
|
279
268
|
// DB primary path — get task IDs to verify task plan files exist
|
|
@@ -309,9 +298,7 @@ export function verifyExpectedArtifact(unitType, unitId, base) {
|
|
|
309
298
|
// complete-slice: DB status is authoritative for whether the slice is done.
|
|
310
299
|
// Fall back to file-based check (roadmap [x]) when DB is unavailable.
|
|
311
300
|
if (unitType === "complete-slice") {
|
|
312
|
-
const
|
|
313
|
-
const mid = parts[0];
|
|
314
|
-
const sid = parts[1];
|
|
301
|
+
const { milestone: mid, slice: sid } = parseUnitId(unitId);
|
|
315
302
|
if (mid && sid) {
|
|
316
303
|
const dir = resolveSlicePath(base, mid, sid);
|
|
317
304
|
if (dir) {
|
|
@@ -377,6 +364,18 @@ export function writeBlockerPlaceholder(unitType, unitId, base, reason) {
|
|
|
377
364
|
`Review and replace this file before relying on downstream artifacts.`,
|
|
378
365
|
].join("\n");
|
|
379
366
|
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
|
+
}
|
|
380
379
|
return diagnoseExpectedArtifact(unitType, unitId, base);
|
|
381
380
|
}
|
|
382
381
|
// ─── Merge State Reconciliation ───────────────────────────────────────────────
|
|
@@ -476,10 +475,7 @@ export function reconcileMergeState(basePath, ctx) {
|
|
|
476
475
|
* These are shown when automatic reconciliation is not possible.
|
|
477
476
|
*/
|
|
478
477
|
export function buildLoopRemediationSteps(unitType, unitId, base) {
|
|
479
|
-
const
|
|
480
|
-
const mid = parts[0];
|
|
481
|
-
const sid = parts[1];
|
|
482
|
-
const tid = parts[2];
|
|
478
|
+
const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
|
|
483
479
|
switch (unitType) {
|
|
484
480
|
case "execute-task": {
|
|
485
481
|
if (!mid || !sid || !tid)
|
|
@@ -34,6 +34,7 @@ import { isDbAvailable, getMilestone } from "./gsd-db.js";
|
|
|
34
34
|
import { hideFooter } from "./auto-dashboard.js";
|
|
35
35
|
import { debugLog, enableDebug, isDebugEnabled, getDebugLogPath, } from "./debug-logger.js";
|
|
36
36
|
import { parseUnitId } from "./unit-id.js";
|
|
37
|
+
import { setLogBasePath } from "./workflow-logger.js";
|
|
37
38
|
import { existsSync, mkdirSync, readdirSync, statSync, unlinkSync, } from "node:fs";
|
|
38
39
|
import { join } from "node:path";
|
|
39
40
|
import { sep as pathSep } from "node:path";
|
|
@@ -312,6 +313,7 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
|
|
|
312
313
|
s.verbose = verboseMode;
|
|
313
314
|
s.cmdCtx = ctx;
|
|
314
315
|
s.basePath = base;
|
|
316
|
+
setLogBasePath(base);
|
|
315
317
|
s.unitDispatchCount.clear();
|
|
316
318
|
s.unitRecoveryCount.clear();
|
|
317
319
|
s.lastBudgetAlertLevel = 0;
|