gsd-pi 2.50.0 → 2.51.0-dev.859cedb
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/async-jobs/job-manager.js +4 -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/claude-code-cli/stream-adapter.js +18 -19
- package/dist/resources/extensions/gsd/auto/phases.js +22 -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 +23 -9
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +105 -70
- 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 +19 -18
- 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 +19 -18
- 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/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/.next/static/hFpSn70hOfLw7RhKUl_eK/_buildManifest.js +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/mcp-server/README.md +202 -0
- package/packages/mcp-server/package.json +36 -0
- package/packages/mcp-server/src/cli.ts +68 -0
- package/packages/mcp-server/src/index.ts +14 -0
- package/packages/mcp-server/src/mcp-server.test.ts +628 -0
- package/packages/mcp-server/src/server.ts +278 -0
- package/packages/mcp-server/src/session-manager.ts +328 -0
- package/packages/mcp-server/src/types.ts +107 -0
- package/packages/mcp-server/tsconfig.json +24 -0
- 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/packages/rpc-client/package.json +20 -0
- 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/async-jobs/job-manager.ts +4 -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/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 +21 -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 +25 -9
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +125 -73
- 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/agent-end-retry.test.ts +1 -1
- 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 → hFpSn70hOfLw7RhKUl_eK}/_ssgManifest.js +0 -0
|
@@ -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");
|
|
@@ -12,7 +12,7 @@ import { parseUnitId } from "./unit-id.js";
|
|
|
12
12
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
13
13
|
import { clearParseCache } from "./files.js";
|
|
14
14
|
import { parseRoadmap as parseLegacyRoadmap, parsePlan as parseLegacyPlan } from "./parsers-legacy.js";
|
|
15
|
-
import { isDbAvailable, getTask, getSlice, getSliceTasks } from "./gsd-db.js";
|
|
15
|
+
import { isDbAvailable, getTask, getSlice, getSliceTasks, updateTaskStatus } from "./gsd-db.js";
|
|
16
16
|
import { isValidationTerminal } from "./state.js";
|
|
17
17
|
import {
|
|
18
18
|
nativeConflictFiles,
|
|
@@ -195,13 +195,8 @@ export function verifyExpectedArtifact(
|
|
|
195
195
|
// Reactive-execute: verify that each dispatched task's summary exists.
|
|
196
196
|
// The unitId encodes the batch: "{mid}/{sid}/reactive+T02,T03"
|
|
197
197
|
if (unitType === "reactive-execute") {
|
|
198
|
-
const
|
|
199
|
-
|
|
200
|
-
const sidAndBatch = parts[1];
|
|
201
|
-
const batchPart = parts[2]; // "reactive+T02,T03"
|
|
202
|
-
if (!mid || !sidAndBatch || !batchPart) return false;
|
|
203
|
-
|
|
204
|
-
const sid = sidAndBatch;
|
|
198
|
+
const { milestone: mid, slice: sid, task: batchPart } = parseUnitId(unitId);
|
|
199
|
+
if (!mid || !sid || !batchPart) return false;
|
|
205
200
|
const plusIdx = batchPart.indexOf("+");
|
|
206
201
|
if (plusIdx === -1) {
|
|
207
202
|
// Legacy format "reactive" without batch IDs — fall back to "any summary"
|
|
@@ -233,10 +228,7 @@ export function verifyExpectedArtifact(
|
|
|
233
228
|
// Gate-evaluate: verify that each dispatched gate has been resolved in the DB.
|
|
234
229
|
// The unitId encodes the batch: "{mid}/{sid}/gates+Q3,Q4"
|
|
235
230
|
if (unitType === "gate-evaluate") {
|
|
236
|
-
const
|
|
237
|
-
const mid = parts[0];
|
|
238
|
-
const sid = parts[1];
|
|
239
|
-
const batchPart = parts[2]; // "gates+Q3,Q4"
|
|
231
|
+
const { milestone: mid, slice: sid, task: batchPart } = parseUnitId(unitId);
|
|
240
232
|
if (!mid || !sid || !batchPart) return false;
|
|
241
233
|
|
|
242
234
|
const plusIdx = batchPart.indexOf("+");
|
|
@@ -286,10 +278,7 @@ export function verifyExpectedArtifact(
|
|
|
286
278
|
// execute-task: DB status is authoritative. Fall back to heading-style plan
|
|
287
279
|
// detection when the DB is unavailable (unmigrated projects).
|
|
288
280
|
if (unitType === "execute-task") {
|
|
289
|
-
const
|
|
290
|
-
const mid = parts[0];
|
|
291
|
-
const sid = parts[1];
|
|
292
|
-
const tid = parts[2];
|
|
281
|
+
const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
|
|
293
282
|
if (mid && sid && tid) {
|
|
294
283
|
const dbTask = getTask(mid, sid, tid);
|
|
295
284
|
if (dbTask) {
|
|
@@ -319,9 +308,7 @@ export function verifyExpectedArtifact(
|
|
|
319
308
|
// but omitted T{tid}-PLAN.md files would be marked complete, causing execute-task
|
|
320
309
|
// to dispatch with a missing task plan (see issue #739).
|
|
321
310
|
if (unitType === "plan-slice") {
|
|
322
|
-
const
|
|
323
|
-
const mid = parts[0];
|
|
324
|
-
const sid = parts[1];
|
|
311
|
+
const { milestone: mid, slice: sid } = parseUnitId(unitId);
|
|
325
312
|
if (mid && sid) {
|
|
326
313
|
try {
|
|
327
314
|
// DB primary path — get task IDs to verify task plan files exist
|
|
@@ -356,9 +343,7 @@ export function verifyExpectedArtifact(
|
|
|
356
343
|
// complete-slice: DB status is authoritative for whether the slice is done.
|
|
357
344
|
// Fall back to file-based check (roadmap [x]) when DB is unavailable.
|
|
358
345
|
if (unitType === "complete-slice") {
|
|
359
|
-
const
|
|
360
|
-
const mid = parts[0];
|
|
361
|
-
const sid = parts[1];
|
|
346
|
+
const { milestone: mid, slice: sid } = parseUnitId(unitId);
|
|
362
347
|
if (mid && sid) {
|
|
363
348
|
const dir = resolveSlicePath(base, mid, sid);
|
|
364
349
|
if (dir) {
|
|
@@ -425,6 +410,17 @@ export function writeBlockerPlaceholder(
|
|
|
425
410
|
`Review and replace this file before relying on downstream artifacts.`,
|
|
426
411
|
].join("\n");
|
|
427
412
|
writeFileSync(absPath, content, "utf-8");
|
|
413
|
+
|
|
414
|
+
// Mark the task as complete in the DB so verifyExpectedArtifact passes.
|
|
415
|
+
// Without this, the DB status stays "pending" and the dispatch loop
|
|
416
|
+
// re-derives the same task indefinitely (#2531).
|
|
417
|
+
if (unitType === "execute-task" && isDbAvailable()) {
|
|
418
|
+
const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
|
|
419
|
+
if (mid && sid && tid) {
|
|
420
|
+
try { updateTaskStatus(mid, sid, tid, "complete", new Date().toISOString()); } catch { /* non-fatal */ }
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
428
424
|
return diagnoseExpectedArtifact(unitType, unitId, base);
|
|
429
425
|
}
|
|
430
426
|
|
|
@@ -544,10 +540,7 @@ export function buildLoopRemediationSteps(
|
|
|
544
540
|
unitId: string,
|
|
545
541
|
base: string,
|
|
546
542
|
): string | null {
|
|
547
|
-
const
|
|
548
|
-
const mid = parts[0];
|
|
549
|
-
const sid = parts[1];
|
|
550
|
-
const tid = parts[2];
|
|
543
|
+
const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
|
|
551
544
|
switch (unitType) {
|
|
552
545
|
case "execute-task": {
|
|
553
546
|
if (!mid || !sid || !tid) break;
|
|
@@ -67,6 +67,7 @@ import {
|
|
|
67
67
|
getDebugLogPath,
|
|
68
68
|
} from "./debug-logger.js";
|
|
69
69
|
import { parseUnitId } from "./unit-id.js";
|
|
70
|
+
import { setLogBasePath } from "./workflow-logger.js";
|
|
70
71
|
import type { AutoSession } from "./auto/session.js";
|
|
71
72
|
import {
|
|
72
73
|
existsSync,
|
|
@@ -461,6 +462,7 @@ export async function bootstrapAutoSession(
|
|
|
461
462
|
s.verbose = verboseMode;
|
|
462
463
|
s.cmdCtx = ctx;
|
|
463
464
|
s.basePath = base;
|
|
465
|
+
setLogBasePath(base);
|
|
464
466
|
s.unitDispatchCount.clear();
|
|
465
467
|
s.unitRecoveryCount.clear();
|
|
466
468
|
s.lastBudgetAlertLevel = 0;
|
|
@@ -15,6 +15,8 @@ import { computeBudgets, resolveExecutorContextWindow } from "./context-budget.j
|
|
|
15
15
|
import {
|
|
16
16
|
getInFlightToolCount,
|
|
17
17
|
getOldestInFlightToolStart,
|
|
18
|
+
clearInFlightTools,
|
|
19
|
+
hasInteractiveToolInFlight,
|
|
18
20
|
} from "./auto-tool-tracking.js";
|
|
19
21
|
import { detectWorkingTreeActivity } from "./auto-supervisor.js";
|
|
20
22
|
import { closeoutUnit, type CloseoutOptions } from "./auto-unit-closeout.js";
|
|
@@ -146,7 +148,17 @@ export function startUnitSupervision(sctx: SupervisionContext): void {
|
|
|
146
148
|
|
|
147
149
|
// Agent has tool calls currently executing — not idle, just waiting.
|
|
148
150
|
// But only suppress recovery if the tool started recently.
|
|
151
|
+
let stalledToolDetected = false;
|
|
149
152
|
if (getInFlightToolCount() > 0) {
|
|
153
|
+
// User-interactive tools (ask_user_questions, secure_env_collect) block
|
|
154
|
+
// waiting for human input by design — never treat them as stalled (#2676).
|
|
155
|
+
if (hasInteractiveToolInFlight()) {
|
|
156
|
+
writeUnitRuntimeRecord(s.basePath, unitType, unitId, s.currentUnit.startedAt, {
|
|
157
|
+
lastProgressAt: Date.now(),
|
|
158
|
+
lastProgressKind: "interactive-tool-waiting",
|
|
159
|
+
});
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
150
162
|
const oldestStart = getOldestInFlightToolStart()!;
|
|
151
163
|
const toolAgeMs = Date.now() - oldestStart;
|
|
152
164
|
if (toolAgeMs < idleTimeoutMs) {
|
|
@@ -156,6 +168,12 @@ export function startUnitSupervision(sctx: SupervisionContext): void {
|
|
|
156
168
|
});
|
|
157
169
|
return;
|
|
158
170
|
}
|
|
171
|
+
// Tool has been in-flight longer than idle timeout — treat as hung.
|
|
172
|
+
// Clear the stale entries so subsequent ticks don't re-detect them,
|
|
173
|
+
// and set the flag so the filesystem-activity check below does not
|
|
174
|
+
// override the stall verdict (#2527).
|
|
175
|
+
stalledToolDetected = true;
|
|
176
|
+
clearInFlightTools();
|
|
159
177
|
ctx.ui.notify(
|
|
160
178
|
`Stalled tool detected: a tool has been in-flight for ${Math.round(toolAgeMs / 60000)}min. Treating as hung — attempting idle recovery.`,
|
|
161
179
|
"warning",
|
|
@@ -163,7 +181,9 @@ export function startUnitSupervision(sctx: SupervisionContext): void {
|
|
|
163
181
|
}
|
|
164
182
|
|
|
165
183
|
// Check if the agent is producing work on disk.
|
|
166
|
-
|
|
184
|
+
// Skip this when a stalled tool was just detected — filesystem changes
|
|
185
|
+
// from earlier in the task should not override the stall verdict (#2527).
|
|
186
|
+
if (!stalledToolDetected && detectWorkingTreeActivity(s.basePath)) {
|
|
167
187
|
writeUnitRuntimeRecord(s.basePath, unitType, unitId, s.currentUnit.startedAt, {
|
|
168
188
|
lastProgressAt: Date.now(),
|
|
169
189
|
lastProgressKind: "filesystem-activity",
|
|
@@ -180,6 +200,10 @@ export function startUnitSupervision(sctx: SupervisionContext): void {
|
|
|
180
200
|
const recovery = await recoverTimedOutUnit(ctx, pi, unitType, unitId, "idle", buildRecoveryContext());
|
|
181
201
|
if (recovery === "recovered") return;
|
|
182
202
|
|
|
203
|
+
// Guard: recoverTimedOutUnit is async — pauseAuto/stopAuto may have
|
|
204
|
+
// set s.currentUnit = null during the await (#2527).
|
|
205
|
+
if (!s.currentUnit) return;
|
|
206
|
+
|
|
183
207
|
writeUnitRuntimeRecord(s.basePath, unitType, unitId, s.currentUnit.startedAt, {
|
|
184
208
|
phase: "paused",
|
|
185
209
|
});
|
|
@@ -4,15 +4,27 @@
|
|
|
4
4
|
* can distinguish "waiting for tool completion" from "truly idle".
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
interface InFlightTool {
|
|
8
|
+
startedAt: number;
|
|
9
|
+
toolName: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const inFlightTools = new Map<string, InFlightTool>();
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Tools that block waiting for human input by design.
|
|
16
|
+
* The idle watchdog must not treat these as stalled.
|
|
17
|
+
*/
|
|
18
|
+
const INTERACTIVE_TOOLS = new Set(["ask_user_questions", "secure_env_collect"]);
|
|
8
19
|
|
|
9
20
|
/**
|
|
10
21
|
* Mark a tool execution as in-flight.
|
|
11
|
-
* Records start time so the idle watchdog can detect tools
|
|
22
|
+
* Records start time and tool name so the idle watchdog can detect tools
|
|
23
|
+
* hung longer than the idle timeout while exempting interactive tools.
|
|
12
24
|
*/
|
|
13
|
-
export function markToolStart(toolCallId: string, isActive: boolean): void {
|
|
25
|
+
export function markToolStart(toolCallId: string, isActive: boolean, toolName?: string): void {
|
|
14
26
|
if (!isActive) return;
|
|
15
|
-
inFlightTools.set(toolCallId, Date.now());
|
|
27
|
+
inFlightTools.set(toolCallId, { startedAt: Date.now(), toolName: toolName ?? "unknown" });
|
|
16
28
|
}
|
|
17
29
|
|
|
18
30
|
/**
|
|
@@ -29,7 +41,7 @@ export function getOldestInFlightToolAgeMs(): number {
|
|
|
29
41
|
if (inFlightTools.size === 0) return 0;
|
|
30
42
|
let oldestStart = Infinity;
|
|
31
43
|
for (const t of inFlightTools.values()) {
|
|
32
|
-
if (t < oldestStart) oldestStart = t;
|
|
44
|
+
if (t.startedAt < oldestStart) oldestStart = t.startedAt;
|
|
33
45
|
}
|
|
34
46
|
return Date.now() - oldestStart;
|
|
35
47
|
}
|
|
@@ -48,11 +60,23 @@ export function getOldestInFlightToolStart(): number | undefined {
|
|
|
48
60
|
if (inFlightTools.size === 0) return undefined;
|
|
49
61
|
let oldest = Infinity;
|
|
50
62
|
for (const t of inFlightTools.values()) {
|
|
51
|
-
if (t < oldest) oldest = t;
|
|
63
|
+
if (t.startedAt < oldest) oldest = t.startedAt;
|
|
52
64
|
}
|
|
53
65
|
return oldest;
|
|
54
66
|
}
|
|
55
67
|
|
|
68
|
+
/**
|
|
69
|
+
* Returns true if any currently in-flight tool is a user-interactive tool
|
|
70
|
+
* (e.g. ask_user_questions, secure_env_collect) that blocks waiting for
|
|
71
|
+
* human input. These must be exempt from idle stall detection.
|
|
72
|
+
*/
|
|
73
|
+
export function hasInteractiveToolInFlight(): boolean {
|
|
74
|
+
for (const { toolName } of inFlightTools.values()) {
|
|
75
|
+
if (INTERACTIVE_TOOLS.has(toolName)) return true;
|
|
76
|
+
}
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
|
|
56
80
|
/**
|
|
57
81
|
* Clear all in-flight tool tracking state.
|
|
58
82
|
*/
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// Shared utilities for the auto-loop modules (auto-post-unit, auto, etc.).
|
|
2
|
+
|
|
3
|
+
import { debugLog } from "./debug-logger.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Run a non-fatal operation, logging any error via `debugLog` and continuing.
|
|
7
|
+
*
|
|
8
|
+
* Replaces the repeated try-catch-debugLog-continue boilerplate that wraps
|
|
9
|
+
* operations whose failure should not abort the post-unit pipeline.
|
|
10
|
+
*
|
|
11
|
+
* @param context - The debugLog event name (e.g. "postUnit")
|
|
12
|
+
* @param phase - The phase label attached to the debug entry
|
|
13
|
+
* @param fn - The operation to execute (may be sync or async)
|
|
14
|
+
*/
|
|
15
|
+
export async function runSafely(
|
|
16
|
+
context: string,
|
|
17
|
+
phase: string,
|
|
18
|
+
fn: () => Promise<void> | void,
|
|
19
|
+
): Promise<void> {
|
|
20
|
+
try {
|
|
21
|
+
await fn();
|
|
22
|
+
} catch (e) {
|
|
23
|
+
debugLog(context, { phase, error: String(e) });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -82,6 +82,10 @@ const ROOT_STATE_FILES = [
|
|
|
82
82
|
"QUEUE.md",
|
|
83
83
|
"completed-units.json",
|
|
84
84
|
"metrics.json",
|
|
85
|
+
// NOTE: preferences.md is intentionally NOT in ROOT_STATE_FILES.
|
|
86
|
+
// Forward-sync (main → worktree) is handled explicitly in syncGsdStateToWorktree().
|
|
87
|
+
// Back-sync (worktree → main) must NEVER overwrite the project root's copy
|
|
88
|
+
// because the project root is authoritative for preferences (#2684).
|
|
85
89
|
] as const;
|
|
86
90
|
|
|
87
91
|
/**
|
|
@@ -416,6 +420,22 @@ export function syncGsdStateToWorktree(
|
|
|
416
420
|
}
|
|
417
421
|
}
|
|
418
422
|
|
|
423
|
+
// Forward-sync preferences.md from project root to worktree (additive only).
|
|
424
|
+
// NOT in ROOT_STATE_FILES because syncWorktreeStateBack() must never overwrite
|
|
425
|
+
// the project root's preferences — the project root is authoritative (#2684).
|
|
426
|
+
{
|
|
427
|
+
const src = join(mainGsd, "preferences.md");
|
|
428
|
+
const dst = join(wtGsd, "preferences.md");
|
|
429
|
+
if (existsSync(src) && !existsSync(dst)) {
|
|
430
|
+
try {
|
|
431
|
+
cpSync(src, dst);
|
|
432
|
+
synced.push("preferences.md");
|
|
433
|
+
} catch {
|
|
434
|
+
/* non-fatal */
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
|
|
419
439
|
// Sync milestones: copy entire milestone directories that are missing
|
|
420
440
|
const mainMilestonesDir = join(mainGsd, "milestones");
|
|
421
441
|
const wtMilestonesDir = join(wtGsd, "milestones");
|
|
@@ -946,6 +966,7 @@ function copyPlanningArtifacts(srcBase: string, wtPath: string): void {
|
|
|
946
966
|
"STATE.md",
|
|
947
967
|
"KNOWLEDGE.md",
|
|
948
968
|
"OVERRIDES.md",
|
|
969
|
+
"preferences.md",
|
|
949
970
|
]) {
|
|
950
971
|
safeCopy(join(srcGsd, file), join(dstGsd, file), { force: true });
|
|
951
972
|
}
|