gsd-pi 2.59.0 → 2.60.0-dev.2580e65
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/dist/resources/extensions/ask-user-questions.js +7 -4
- package/dist/resources/extensions/gsd/auto/phases.js +62 -1
- package/dist/resources/extensions/gsd/auto-dashboard.js +21 -8
- package/dist/resources/extensions/gsd/auto-dispatch.js +6 -3
- package/dist/resources/extensions/gsd/auto-model-selection.js +57 -3
- package/dist/resources/extensions/gsd/auto-post-unit.js +43 -3
- package/dist/resources/extensions/gsd/auto-prompts.js +49 -20
- package/dist/resources/extensions/gsd/auto-recovery.js +37 -18
- package/dist/resources/extensions/gsd/auto-start.js +9 -5
- package/dist/resources/extensions/gsd/auto-timers.js +11 -5
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +5 -3
- package/dist/resources/extensions/gsd/auto-verification.js +3 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +120 -55
- package/dist/resources/extensions/gsd/auto.js +39 -17
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +6 -3
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +72 -2
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +4 -10
- package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +2 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +58 -5
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +11 -10
- package/dist/resources/extensions/gsd/captures.js +54 -1
- package/dist/resources/extensions/gsd/commands/catalog.js +2 -0
- package/dist/resources/extensions/gsd/commands-codebase.js +48 -21
- package/dist/resources/extensions/gsd/commands-inspect.js +2 -1
- package/dist/resources/extensions/gsd/commands-maintenance.js +32 -19
- package/dist/resources/extensions/gsd/complexity-classifier.js +9 -5
- package/dist/resources/extensions/gsd/context-masker.js +68 -0
- package/dist/resources/extensions/gsd/custom-verification.js +3 -2
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +7 -0
- package/dist/resources/extensions/gsd/gsd-db.js +35 -15
- package/dist/resources/extensions/gsd/guided-flow.js +19 -9
- package/dist/resources/extensions/gsd/init-wizard.js +12 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +11 -9
- package/dist/resources/extensions/gsd/md-importer.js +5 -4
- package/dist/resources/extensions/gsd/milestone-actions.js +3 -2
- package/dist/resources/extensions/gsd/milestone-ids.js +2 -1
- package/dist/resources/extensions/gsd/model-router.js +199 -45
- package/dist/resources/extensions/gsd/parallel-merge.js +5 -3
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +26 -14
- package/dist/resources/extensions/gsd/phase-anchor.js +56 -0
- package/dist/resources/extensions/gsd/preferences-types.js +2 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +91 -0
- package/dist/resources/extensions/gsd/preferences.js +15 -3
- package/dist/resources/extensions/gsd/prompt-loader.js +3 -2
- package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/dist/resources/extensions/gsd/prompts/rethink.md +7 -0
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +6 -1
- package/dist/resources/extensions/gsd/rethink.js +5 -2
- package/dist/resources/extensions/gsd/rule-registry.js +7 -6
- package/dist/resources/extensions/gsd/safe-fs.js +6 -8
- package/dist/resources/extensions/gsd/state.js +1 -1
- package/dist/resources/extensions/gsd/status-guards.js +4 -3
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/plan-slice.js +3 -2
- package/dist/resources/extensions/gsd/tools/plan-task.js +2 -1
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +4 -4
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -1
- package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -1
- package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -1
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +2 -1
- package/dist/resources/extensions/gsd/triage-resolution.js +135 -1
- package/dist/resources/extensions/gsd/triage-ui.js +12 -3
- package/dist/resources/extensions/gsd/workflow-events.js +2 -1
- package/dist/resources/extensions/gsd/workflow-logger.js +37 -4
- package/dist/resources/extensions/gsd/workflow-migration.js +14 -12
- package/dist/resources/extensions/gsd/workflow-projections.js +2 -2
- package/dist/resources/extensions/gsd/workflow-reconcile.js +2 -2
- package/dist/resources/extensions/gsd/worktree-manager.js +26 -14
- package/dist/resources/extensions/shared/interview-ui.js +3 -1
- package/dist/resources/skills/btw/SKILL.md +42 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -17
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- 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_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 +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- 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 +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js +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_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_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_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_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_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_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_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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_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_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_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_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_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_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_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_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_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_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_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_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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- 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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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 +4 -4
- 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 +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -17
- package/dist/web/standalone/.next/server/chunks/2229.js +1 -1
- package/dist/web/standalone/.next/server/chunks/7471.js +3 -3
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +2 -2
- 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/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- 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-0c485498795110d6.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/global-error-459824ffb8c323dd.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/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +5 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +2 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +16 -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 +26 -0
- 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/lsp/config.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/config.js +6 -1
- package/packages/pi-coding-agent/dist/core/lsp/config.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/defaults.json +2 -2
- package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.js +47 -0
- package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +6 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +122 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +1 -0
- 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 +30 -0
- 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.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +1 -7
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +6 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +19 -0
- package/packages/pi-coding-agent/src/core/extensions/types.ts +26 -0
- package/packages/pi-coding-agent/src/core/lsp/config.ts +7 -1
- package/packages/pi-coding-agent/src/core/lsp/defaults.json +2 -2
- package/packages/pi-coding-agent/src/core/lsp/lsp-legacy-alias.test.ts +70 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +156 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +7 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +38 -0
- package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +1 -8
- package/pkg/package.json +1 -1
- package/src/resources/extensions/ask-user-questions.ts +7 -3
- package/src/resources/extensions/gsd/auto/phases.ts +70 -1
- package/src/resources/extensions/gsd/auto-dashboard.ts +22 -8
- package/src/resources/extensions/gsd/auto-dispatch.ts +7 -3
- package/src/resources/extensions/gsd/auto-model-selection.ts +77 -6
- package/src/resources/extensions/gsd/auto-post-unit.ts +52 -5
- package/src/resources/extensions/gsd/auto-prompts.ts +54 -20
- package/src/resources/extensions/gsd/auto-recovery.ts +38 -18
- package/src/resources/extensions/gsd/auto-start.ts +10 -9
- package/src/resources/extensions/gsd/auto-timers.ts +12 -5
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +6 -2
- package/src/resources/extensions/gsd/auto-verification.ts +3 -6
- package/src/resources/extensions/gsd/auto-worktree.ts +121 -55
- package/src/resources/extensions/gsd/auto.ts +40 -17
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +4 -3
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +80 -2
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +4 -16
- package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +2 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +61 -4
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -10
- package/src/resources/extensions/gsd/captures.ts +71 -2
- package/src/resources/extensions/gsd/commands/catalog.ts +2 -0
- package/src/resources/extensions/gsd/commands-codebase.ts +52 -20
- package/src/resources/extensions/gsd/commands-inspect.ts +2 -1
- package/src/resources/extensions/gsd/commands-maintenance.ts +28 -19
- package/src/resources/extensions/gsd/complexity-classifier.ts +10 -5
- package/src/resources/extensions/gsd/context-masker.ts +74 -0
- package/src/resources/extensions/gsd/custom-verification.ts +3 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +7 -0
- package/src/resources/extensions/gsd/gsd-db.ts +14 -16
- package/src/resources/extensions/gsd/guided-flow.ts +9 -8
- package/src/resources/extensions/gsd/init-wizard.ts +12 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -17
- package/src/resources/extensions/gsd/md-importer.ts +5 -4
- package/src/resources/extensions/gsd/milestone-actions.ts +3 -2
- package/src/resources/extensions/gsd/milestone-ids.ts +2 -1
- package/src/resources/extensions/gsd/model-router.ts +245 -56
- package/src/resources/extensions/gsd/parallel-merge.ts +5 -3
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +18 -14
- package/src/resources/extensions/gsd/phase-anchor.ts +71 -0
- package/src/resources/extensions/gsd/preferences-types.ts +22 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +83 -0
- package/src/resources/extensions/gsd/preferences.ts +16 -3
- package/src/resources/extensions/gsd/prompt-loader.ts +3 -2
- package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/src/resources/extensions/gsd/prompts/rethink.md +7 -0
- package/src/resources/extensions/gsd/prompts/triage-captures.md +6 -1
- package/src/resources/extensions/gsd/rethink.ts +5 -2
- package/src/resources/extensions/gsd/rule-registry.ts +7 -6
- package/src/resources/extensions/gsd/safe-fs.ts +6 -5
- package/src/resources/extensions/gsd/state.ts +1 -1
- package/src/resources/extensions/gsd/status-guards.ts +4 -3
- package/src/resources/extensions/gsd/tests/capability-router.test.ts +347 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +27 -2
- package/src/resources/extensions/gsd/tests/context-masker.test.ts +122 -0
- package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +1188 -0
- package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +841 -0
- package/src/resources/extensions/gsd/tests/model-router.test.ts +488 -2
- package/src/resources/extensions/gsd/tests/phase-anchor.test.ts +83 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/remote-questions.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +284 -0
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/stop-backtrack.test.ts +216 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-logger-audit.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +6 -6
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -6
- package/src/resources/extensions/gsd/tools/complete-slice.ts +3 -6
- package/src/resources/extensions/gsd/tools/complete-task.ts +3 -6
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +3 -6
- package/src/resources/extensions/gsd/tools/plan-slice.ts +3 -6
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -3
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +4 -6
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -3
- package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -3
- package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -3
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +2 -3
- package/src/resources/extensions/gsd/triage-resolution.ts +151 -1
- package/src/resources/extensions/gsd/triage-ui.ts +12 -3
- package/src/resources/extensions/gsd/types.ts +1 -0
- package/src/resources/extensions/gsd/workflow-events.ts +2 -1
- package/src/resources/extensions/gsd/workflow-logger.ts +52 -5
- package/src/resources/extensions/gsd/workflow-migration.ts +14 -12
- package/src/resources/extensions/gsd/workflow-projections.ts +2 -2
- package/src/resources/extensions/gsd/workflow-reconcile.ts +2 -2
- package/src/resources/extensions/gsd/worktree-manager.ts +16 -14
- package/src/resources/extensions/shared/interview-ui.ts +3 -1
- package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +144 -0
- package/src/resources/skills/btw/SKILL.md +42 -0
- package/dist/web/standalone/.next/static/chunks/app/page-62be3b5fa91e4c8f.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/global-error-ab5a8926e07ec673.js +0 -1
- /package/dist/web/standalone/.next/static/{DGvT_c5Vb7Wu3X-fEOVUU → ogyMN7M-3bGGuRY08L5HR}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{DGvT_c5Vb7Wu3X-fEOVUU → ogyMN7M-3bGGuRY08L5HR}/_ssgManifest.js +0 -0
|
@@ -26,6 +26,8 @@ import { existsSync } from "node:fs";
|
|
|
26
26
|
import { computeBudgets, resolveExecutorContextWindow, truncateAtSectionBoundary } from "./context-budget.js";
|
|
27
27
|
import { getPendingGates } from "./gsd-db.js";
|
|
28
28
|
import { formatDecisionsCompact, formatRequirementsCompact } from "./structured-data-formatter.js";
|
|
29
|
+
import { readPhaseAnchor, formatAnchorForPrompt } from "./phase-anchor.js";
|
|
30
|
+
import { logWarning } from "./workflow-logger.js";
|
|
29
31
|
|
|
30
32
|
// ─── Preamble Cap ─────────────────────────────────────────────────────────────
|
|
31
33
|
|
|
@@ -48,7 +50,8 @@ function formatExecutorConstraints(): string {
|
|
|
48
50
|
try {
|
|
49
51
|
const prefs = loadEffectiveGSDPreferences();
|
|
50
52
|
windowTokens = resolveExecutorContextWindow(undefined, prefs?.preferences);
|
|
51
|
-
} catch {
|
|
53
|
+
} catch (e) {
|
|
54
|
+
logWarning("prompt", `resolveExecutorContextWindow failed: ${(e as Error).message}`);
|
|
52
55
|
windowTokens = 200_000; // safe default
|
|
53
56
|
}
|
|
54
57
|
const budgets = computeBudgets(windowTokens);
|
|
@@ -197,7 +200,9 @@ export async function inlineDependencySummaries(
|
|
|
197
200
|
}
|
|
198
201
|
// If slice not found in DB, fall through to file-based parsing
|
|
199
202
|
}
|
|
200
|
-
} catch {
|
|
203
|
+
} catch (err) {
|
|
204
|
+
logWarning("prompt", `inlineDependencySummaries DB lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
205
|
+
}
|
|
201
206
|
|
|
202
207
|
// If DB didn't provide depends, fall back to roadmap parsing
|
|
203
208
|
if (!depends) {
|
|
@@ -275,8 +280,8 @@ export async function inlineDecisionsFromDb(
|
|
|
275
280
|
return `### Decisions\nSource: \`.gsd/DECISIONS.md\`\n\n${formatted}`;
|
|
276
281
|
}
|
|
277
282
|
}
|
|
278
|
-
} catch {
|
|
279
|
-
|
|
283
|
+
} catch (err) {
|
|
284
|
+
logWarning("prompt", `inlineDecisionsFromDb failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
280
285
|
}
|
|
281
286
|
return inlineGsdRootFile(base, "decisions.md", "Decisions");
|
|
282
287
|
}
|
|
@@ -302,8 +307,8 @@ export async function inlineRequirementsFromDb(
|
|
|
302
307
|
return `### Requirements\nSource: \`.gsd/REQUIREMENTS.md\`\n\n${formatted}`;
|
|
303
308
|
}
|
|
304
309
|
}
|
|
305
|
-
} catch {
|
|
306
|
-
|
|
310
|
+
} catch (err) {
|
|
311
|
+
logWarning("prompt", `inlineRequirementsFromDb failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
307
312
|
}
|
|
308
313
|
return inlineGsdRootFile(base, "requirements.md", "Requirements");
|
|
309
314
|
}
|
|
@@ -324,8 +329,8 @@ export async function inlineProjectFromDb(
|
|
|
324
329
|
return `### Project\nSource: \`.gsd/PROJECT.md\`\n\n${content}`;
|
|
325
330
|
}
|
|
326
331
|
}
|
|
327
|
-
} catch {
|
|
328
|
-
|
|
332
|
+
} catch (err) {
|
|
333
|
+
logWarning("prompt", `inlineProjectFromDb failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
329
334
|
}
|
|
330
335
|
return inlineGsdRootFile(base, "project.md", "Project");
|
|
331
336
|
}
|
|
@@ -485,8 +490,8 @@ export function buildSkillActivationBlock(params: {
|
|
|
485
490
|
for (const skillName of taskPlan.frontmatter.skills_used) {
|
|
486
491
|
matched.add(normalizeSkillReference(skillName));
|
|
487
492
|
}
|
|
488
|
-
} catch {
|
|
489
|
-
|
|
493
|
+
} catch (err) {
|
|
494
|
+
logWarning("prompt", `parseTaskPlanFile failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
490
495
|
}
|
|
491
496
|
}
|
|
492
497
|
|
|
@@ -735,7 +740,9 @@ export async function checkNeedsReassessment(
|
|
|
735
740
|
return { sliceId: lastCompleted };
|
|
736
741
|
}
|
|
737
742
|
}
|
|
738
|
-
} catch {
|
|
743
|
+
} catch (err) {
|
|
744
|
+
logWarning("prompt", `checkNeedsReassessment DB lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
745
|
+
}
|
|
739
746
|
|
|
740
747
|
// File-based fallback using roadmap checkboxes
|
|
741
748
|
const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
|
|
@@ -801,7 +808,9 @@ export async function checkNeedsRunUat(
|
|
|
801
808
|
return { sliceId: sid, uatType };
|
|
802
809
|
}
|
|
803
810
|
}
|
|
804
|
-
} catch {
|
|
811
|
+
} catch (err) {
|
|
812
|
+
logWarning("prompt", `checkNeedsRunUat DB lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
813
|
+
}
|
|
805
814
|
|
|
806
815
|
// File-based fallback using roadmap checkboxes
|
|
807
816
|
if (!prefs?.uat_dispatch) return null;
|
|
@@ -906,6 +915,11 @@ export async function buildPlanMilestonePrompt(mid: string, midTitle: string, ba
|
|
|
906
915
|
const researchRel = relMilestoneFile(base, mid, "RESEARCH");
|
|
907
916
|
|
|
908
917
|
const inlined: string[] = [];
|
|
918
|
+
|
|
919
|
+
// Inject phase handoff anchor from research phase (if available)
|
|
920
|
+
const researchAnchor = readPhaseAnchor(base, mid, "research-milestone");
|
|
921
|
+
if (researchAnchor) inlined.push(formatAnchorForPrompt(researchAnchor));
|
|
922
|
+
|
|
909
923
|
inlined.push(await inlineFile(contextPath, contextRel, "Milestone Context"));
|
|
910
924
|
const researchInline = await inlineFileOptional(researchPath, researchRel, "Milestone Research");
|
|
911
925
|
if (researchInline) inlined.push(researchInline);
|
|
@@ -1033,6 +1047,11 @@ export async function buildPlanSlicePrompt(
|
|
|
1033
1047
|
const researchRel = relSliceFile(base, mid, sid, "RESEARCH");
|
|
1034
1048
|
|
|
1035
1049
|
const inlined: string[] = [];
|
|
1050
|
+
|
|
1051
|
+
// Inject phase handoff anchor from research phase (if available)
|
|
1052
|
+
const researchSliceAnchor = readPhaseAnchor(base, mid, "research-slice");
|
|
1053
|
+
if (researchSliceAnchor) inlined.push(formatAnchorForPrompt(researchSliceAnchor));
|
|
1054
|
+
|
|
1036
1055
|
inlined.push(await inlineFile(roadmapPath, roadmapRel, "Milestone Roadmap"));
|
|
1037
1056
|
const researchInline = await inlineFileOptional(researchPath, researchRel, "Slice Research");
|
|
1038
1057
|
if (researchInline) inlined.push(researchInline);
|
|
@@ -1100,6 +1119,9 @@ export async function buildExecuteTaskPrompt(
|
|
|
1100
1119
|
: { level: level as InlineLevel | undefined };
|
|
1101
1120
|
const inlineLevel = opts.level ?? resolveInlineLevel();
|
|
1102
1121
|
|
|
1122
|
+
// Inject phase handoff anchor from planning phase (if available)
|
|
1123
|
+
const planAnchor = readPhaseAnchor(base, mid, "plan-slice");
|
|
1124
|
+
|
|
1103
1125
|
const priorSummaries = opts.carryForwardPaths ?? await getPriorTaskSummaryPaths(mid, sid, tid, base);
|
|
1104
1126
|
const priorLines = priorSummaries.length > 0
|
|
1105
1127
|
? priorSummaries.map(p => `- \`${p}\``).join("\n")
|
|
@@ -1190,9 +1212,12 @@ export async function buildExecuteTaskPrompt(
|
|
|
1190
1212
|
? `### Runtime Context\nSource: \`.gsd/RUNTIME.md\`\n\n${runtimeContent.trim()}`
|
|
1191
1213
|
: "";
|
|
1192
1214
|
|
|
1215
|
+
const phaseAnchorSection = planAnchor ? formatAnchorForPrompt(planAnchor) : "";
|
|
1216
|
+
|
|
1193
1217
|
return loadPrompt("execute-task", {
|
|
1194
1218
|
overridesSection,
|
|
1195
1219
|
runtimeContext,
|
|
1220
|
+
phaseAnchorSection,
|
|
1196
1221
|
workingDirectory: base,
|
|
1197
1222
|
milestoneId: mid, sliceId: sid, sliceTitle: sTitle, taskId: tid, taskTitle: tTitle,
|
|
1198
1223
|
planPath: join(base, relSliceFile(base, mid, sid, "PLAN")),
|
|
@@ -1295,7 +1320,9 @@ export async function buildCompleteMilestonePrompt(
|
|
|
1295
1320
|
if (isDbAvailable()) {
|
|
1296
1321
|
sliceIds = getMilestoneSlices(mid).map(s => s.id);
|
|
1297
1322
|
}
|
|
1298
|
-
} catch {
|
|
1323
|
+
} catch (err) {
|
|
1324
|
+
logWarning("prompt", `buildCompleteMilestonePrompt DB lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1325
|
+
}
|
|
1299
1326
|
// File-based fallback: parse roadmap for slice IDs when DB has no data
|
|
1300
1327
|
if (sliceIds.length === 0 && roadmapPath) {
|
|
1301
1328
|
const roadmapContent = await loadFile(roadmapPath);
|
|
@@ -1376,7 +1403,9 @@ export async function buildValidateMilestonePrompt(
|
|
|
1376
1403
|
}
|
|
1377
1404
|
}
|
|
1378
1405
|
}
|
|
1379
|
-
} catch {
|
|
1406
|
+
} catch (err) {
|
|
1407
|
+
logWarning("prompt", `buildValidateMilestonePrompt verification classes lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1408
|
+
}
|
|
1380
1409
|
|
|
1381
1410
|
// Inline all slice summaries and UAT results
|
|
1382
1411
|
let valSliceIds: string[] = [];
|
|
@@ -1385,7 +1414,9 @@ export async function buildValidateMilestonePrompt(
|
|
|
1385
1414
|
if (isDbAvailable()) {
|
|
1386
1415
|
valSliceIds = getMilestoneSlices(mid).map(s => s.id);
|
|
1387
1416
|
}
|
|
1388
|
-
} catch {
|
|
1417
|
+
} catch (err) {
|
|
1418
|
+
logWarning("prompt", `buildValidateMilestonePrompt slice IDs lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1419
|
+
}
|
|
1389
1420
|
// File-based fallback: parse roadmap for slice IDs when DB has no data
|
|
1390
1421
|
if (valSliceIds.length === 0 && roadmapPath) {
|
|
1391
1422
|
const roadmapContent = await loadFile(roadmapPath);
|
|
@@ -1524,8 +1555,8 @@ export async function buildReplanSlicePrompt(
|
|
|
1524
1555
|
`- **${c.id}**: "${c.text}" — ${c.rationale ?? "no rationale"}`
|
|
1525
1556
|
).join("\n");
|
|
1526
1557
|
}
|
|
1527
|
-
} catch {
|
|
1528
|
-
|
|
1558
|
+
} catch (err) {
|
|
1559
|
+
logWarning("prompt", `loadReplanCaptures failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1529
1560
|
}
|
|
1530
1561
|
|
|
1531
1562
|
return loadPrompt("replan-slice", {
|
|
@@ -1625,8 +1656,8 @@ export async function buildReassessRoadmapPrompt(
|
|
|
1625
1656
|
`- **${c.id}**: "${c.text}" — ${c.rationale ?? "deferred during triage"}`
|
|
1626
1657
|
).join("\n");
|
|
1627
1658
|
}
|
|
1628
|
-
} catch {
|
|
1629
|
-
|
|
1659
|
+
} catch (err) {
|
|
1660
|
+
logWarning("prompt", `loadDeferredCaptures failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1630
1661
|
}
|
|
1631
1662
|
|
|
1632
1663
|
const reassessCommitInstruction = "Do not commit — .gsd/ planning docs are managed externally and not tracked in git.";
|
|
@@ -1842,7 +1873,9 @@ export async function buildRewriteDocsPrompt(
|
|
|
1842
1873
|
.filter(t => t.status !== "complete" && t.status !== "done")
|
|
1843
1874
|
.map(t => ({ id: t.id }));
|
|
1844
1875
|
}
|
|
1845
|
-
} catch {
|
|
1876
|
+
} catch (err) {
|
|
1877
|
+
logWarning("prompt", `buildRewriteDocsPrompt DB task lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1878
|
+
}
|
|
1846
1879
|
|
|
1847
1880
|
if (!incompleteTasks) {
|
|
1848
1881
|
// DB unavailable — no task data to inline
|
|
@@ -1894,3 +1927,4 @@ export async function buildRewriteDocsPrompt(
|
|
|
1894
1927
|
overridesPath: relGsdRootFile("OVERRIDES"),
|
|
1895
1928
|
});
|
|
1896
1929
|
}
|
|
1930
|
+
|
|
@@ -15,6 +15,7 @@ import { parseRoadmap as parseLegacyRoadmap, parsePlan as parseLegacyPlan } from
|
|
|
15
15
|
import { isDbAvailable, getTask, getSlice, getSliceTasks, updateTaskStatus } from "./gsd-db.js";
|
|
16
16
|
import { isValidationTerminal } from "./state.js";
|
|
17
17
|
import { getErrorMessage } from "./error-utils.js";
|
|
18
|
+
import { logWarning, logError } from "./workflow-logger.js";
|
|
18
19
|
import {
|
|
19
20
|
nativeConflictFiles,
|
|
20
21
|
nativeCommit,
|
|
@@ -72,7 +73,8 @@ export function hasImplementationArtifacts(basePath: string): boolean {
|
|
|
72
73
|
stdio: ["ignore", "pipe", "pipe"],
|
|
73
74
|
encoding: "utf-8",
|
|
74
75
|
});
|
|
75
|
-
} catch {
|
|
76
|
+
} catch (e) {
|
|
77
|
+
logWarning("recovery", `git rev-parse check failed: ${(e as Error).message}`);
|
|
76
78
|
return true;
|
|
77
79
|
}
|
|
78
80
|
|
|
@@ -92,8 +94,9 @@ export function hasImplementationArtifacts(basePath: string): boolean {
|
|
|
92
94
|
// implementation code (#1703).
|
|
93
95
|
const implFiles = changedFiles.filter(f => !f.startsWith(".gsd/") && !f.startsWith(".gsd\\"));
|
|
94
96
|
return implFiles.length > 0;
|
|
95
|
-
} catch {
|
|
97
|
+
} catch (e) {
|
|
96
98
|
// Non-fatal — if git operations fail, don't block the pipeline
|
|
99
|
+
logWarning("recovery", `implementation artifact check failed: ${(e as Error).message}`);
|
|
97
100
|
return true;
|
|
98
101
|
}
|
|
99
102
|
}
|
|
@@ -109,8 +112,9 @@ function detectMainBranch(basePath: string): string {
|
|
|
109
112
|
encoding: "utf-8",
|
|
110
113
|
});
|
|
111
114
|
if (result.trim()) return "main";
|
|
112
|
-
} catch {
|
|
113
|
-
// main doesn't exist
|
|
115
|
+
} catch (_) {
|
|
116
|
+
// Expected — main doesn't exist, try master next
|
|
117
|
+
void _;
|
|
114
118
|
}
|
|
115
119
|
try {
|
|
116
120
|
const result = execFileSync("git", ["rev-parse", "--verify", "master"], {
|
|
@@ -119,10 +123,13 @@ function detectMainBranch(basePath: string): string {
|
|
|
119
123
|
encoding: "utf-8",
|
|
120
124
|
});
|
|
121
125
|
if (result.trim()) return "master";
|
|
122
|
-
} catch {
|
|
123
|
-
// master doesn't exist either
|
|
126
|
+
} catch (_) {
|
|
127
|
+
// Expected — master doesn't exist either
|
|
128
|
+
void _;
|
|
124
129
|
}
|
|
125
|
-
|
|
130
|
+
// Neither main nor master found — warn and fall back
|
|
131
|
+
logWarning("recovery", "neither main nor master branch found, defaulting to main");
|
|
132
|
+
return "main";
|
|
126
133
|
}
|
|
127
134
|
|
|
128
135
|
/**
|
|
@@ -144,8 +151,9 @@ function getChangedFilesSinceBranch(basePath: string, targetBranch: string): str
|
|
|
144
151
|
).trim();
|
|
145
152
|
return result ? result.split("\n").filter(Boolean) : [];
|
|
146
153
|
}
|
|
147
|
-
} catch {
|
|
154
|
+
} catch (err) {
|
|
148
155
|
// merge-base failed — fall back
|
|
156
|
+
logWarning("recovery", `merge-base detection failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
149
157
|
}
|
|
150
158
|
|
|
151
159
|
// Fallback: check last 20 commits
|
|
@@ -155,7 +163,8 @@ function getChangedFilesSinceBranch(basePath: string, targetBranch: string): str
|
|
|
155
163
|
{ cwd: basePath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" },
|
|
156
164
|
).trim();
|
|
157
165
|
return result ? [...new Set(result.split("\n").filter(Boolean))] : [];
|
|
158
|
-
} catch {
|
|
166
|
+
} catch (e) {
|
|
167
|
+
logWarning("recovery", `git log fallback failed: ${(e as Error).message}`);
|
|
159
168
|
return [];
|
|
160
169
|
}
|
|
161
170
|
}
|
|
@@ -246,8 +255,9 @@ export function verifyExpectedArtifact(
|
|
|
246
255
|
for (const gid of gateIds) {
|
|
247
256
|
if (pendingIds.has(gid)) return false;
|
|
248
257
|
}
|
|
249
|
-
} catch {
|
|
258
|
+
} catch (err) {
|
|
250
259
|
// DB unavailable — treat as verified to avoid blocking
|
|
260
|
+
logWarning("recovery", `gate-evaluate DB check failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
251
261
|
}
|
|
252
262
|
return true;
|
|
253
263
|
}
|
|
@@ -335,8 +345,9 @@ export function verifyExpectedArtifact(
|
|
|
335
345
|
}
|
|
336
346
|
}
|
|
337
347
|
}
|
|
338
|
-
} catch {
|
|
348
|
+
} catch (err) {
|
|
339
349
|
// Parse failure — don't block; slice plan may have non-standard format
|
|
350
|
+
logWarning("recovery", `plan-slice task plan verification failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
340
351
|
}
|
|
341
352
|
}
|
|
342
353
|
}
|
|
@@ -366,7 +377,8 @@ export function verifyExpectedArtifact(
|
|
|
366
377
|
const roadmap = parseLegacyRoadmap(roadmapContent);
|
|
367
378
|
const slice = roadmap.slices.find((s) => s.id === sid);
|
|
368
379
|
if (slice && !slice.done) return false;
|
|
369
|
-
} catch {
|
|
380
|
+
} catch (e) {
|
|
381
|
+
logWarning("recovery", `roadmap parse failed: ${(e as Error).message}`);
|
|
370
382
|
return false;
|
|
371
383
|
}
|
|
372
384
|
}
|
|
@@ -418,7 +430,9 @@ export function writeBlockerPlaceholder(
|
|
|
418
430
|
if (unitType === "execute-task" && isDbAvailable()) {
|
|
419
431
|
const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
|
|
420
432
|
if (mid && sid && tid) {
|
|
421
|
-
try { updateTaskStatus(mid, sid, tid, "complete", new Date().toISOString()); } catch { /* non-fatal */
|
|
433
|
+
try { updateTaskStatus(mid, sid, tid, "complete", new Date().toISOString()); } catch (err) { /* non-fatal */
|
|
434
|
+
logError("recovery", `DB status update failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
435
|
+
}
|
|
422
436
|
}
|
|
423
437
|
}
|
|
424
438
|
|
|
@@ -439,20 +453,23 @@ function abortAndResetMerge(
|
|
|
439
453
|
if (hasMergeHead) {
|
|
440
454
|
try {
|
|
441
455
|
nativeMergeAbort(basePath);
|
|
442
|
-
} catch {
|
|
456
|
+
} catch (err) {
|
|
443
457
|
/* best-effort */
|
|
458
|
+
logWarning("recovery", `git merge-abort failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
444
459
|
}
|
|
445
460
|
} else if (squashMsgPath) {
|
|
446
461
|
try {
|
|
447
462
|
unlinkSync(squashMsgPath);
|
|
448
|
-
} catch {
|
|
463
|
+
} catch (err) {
|
|
449
464
|
/* best-effort */
|
|
465
|
+
logWarning("recovery", `file unlink failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
450
466
|
}
|
|
451
467
|
}
|
|
452
468
|
try {
|
|
453
469
|
nativeResetHard(basePath);
|
|
454
|
-
} catch {
|
|
470
|
+
} catch (err) {
|
|
455
471
|
/* best-effort */
|
|
472
|
+
logError("recovery", `git reset failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
456
473
|
}
|
|
457
474
|
}
|
|
458
475
|
|
|
@@ -500,7 +517,8 @@ export function reconcileMergeState(
|
|
|
500
517
|
try {
|
|
501
518
|
nativeCheckoutTheirs(basePath, gsdConflicts);
|
|
502
519
|
nativeAddPaths(basePath, gsdConflicts);
|
|
503
|
-
} catch {
|
|
520
|
+
} catch (e) {
|
|
521
|
+
logError("recovery", `auto-resolve .gsd/ conflicts failed: ${(e as Error).message}`);
|
|
504
522
|
resolved = false;
|
|
505
523
|
}
|
|
506
524
|
if (resolved) {
|
|
@@ -513,7 +531,8 @@ export function reconcileMergeState(
|
|
|
513
531
|
`Auto-resolved ${gsdConflicts.length} .gsd/ state file conflict(s) from prior merge.`,
|
|
514
532
|
"info",
|
|
515
533
|
);
|
|
516
|
-
} catch {
|
|
534
|
+
} catch (e) {
|
|
535
|
+
logError("recovery", `auto-commit .gsd/ conflict resolution failed: ${(e as Error).message}`);
|
|
517
536
|
resolved = false;
|
|
518
537
|
}
|
|
519
538
|
}
|
|
@@ -592,3 +611,4 @@ export function buildLoopRemediationSteps(
|
|
|
592
611
|
}
|
|
593
612
|
return null;
|
|
594
613
|
}
|
|
614
|
+
|
|
@@ -66,6 +66,7 @@ import {
|
|
|
66
66
|
isDebugEnabled,
|
|
67
67
|
getDebugLogPath,
|
|
68
68
|
} from "./debug-logger.js";
|
|
69
|
+
import { logWarning, logError } from "./workflow-logger.js";
|
|
69
70
|
import { parseUnitId } from "./unit-id.js";
|
|
70
71
|
import type { AutoSession } from "./auto/session.js";
|
|
71
72
|
import {
|
|
@@ -112,8 +113,9 @@ async function openProjectDbIfPresent(basePath: string): Promise<void> {
|
|
|
112
113
|
try {
|
|
113
114
|
const { openDatabase } = await import("./gsd-db.js");
|
|
114
115
|
openDatabase(gsdDbPath);
|
|
115
|
-
} catch {
|
|
116
|
+
} catch (err) {
|
|
116
117
|
/* non-fatal — DB lifecycle block below will retry */
|
|
118
|
+
logWarning("engine", `DB open failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
117
119
|
}
|
|
118
120
|
}
|
|
119
121
|
|
|
@@ -213,8 +215,9 @@ export async function bootstrapAutoSession(
|
|
|
213
215
|
try {
|
|
214
216
|
nativeAddAll(base);
|
|
215
217
|
nativeCommit(base, "chore: init gsd");
|
|
216
|
-
} catch {
|
|
218
|
+
} catch (err) {
|
|
217
219
|
/* nothing to commit */
|
|
220
|
+
logWarning("engine", `mkdir failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
218
221
|
}
|
|
219
222
|
}
|
|
220
223
|
|
|
@@ -575,9 +578,7 @@ export async function bootstrapAutoSession(
|
|
|
575
578
|
migrateFromMarkdown(s.basePath);
|
|
576
579
|
}
|
|
577
580
|
} catch (err) {
|
|
578
|
-
|
|
579
|
-
`gsd-migrate: auto-migration failed: ${(err as Error).message}\n`,
|
|
580
|
-
);
|
|
581
|
+
logError("engine", `auto-migration failed: ${(err as Error).message}`);
|
|
581
582
|
}
|
|
582
583
|
}
|
|
583
584
|
if (existsSync(gsdDbPath) && !isDbAvailable()) {
|
|
@@ -585,9 +586,7 @@ export async function bootstrapAutoSession(
|
|
|
585
586
|
const { openDatabase: openDb } = await import("./gsd-db.js");
|
|
586
587
|
openDb(gsdDbPath);
|
|
587
588
|
} catch (err) {
|
|
588
|
-
|
|
589
|
-
`gsd-db: failed to open existing database: ${(err as Error).message}\n`,
|
|
590
|
-
);
|
|
589
|
+
logError("engine", `failed to open existing database: ${(err as Error).message}`);
|
|
591
590
|
}
|
|
592
591
|
}
|
|
593
592
|
|
|
@@ -724,8 +723,9 @@ export async function bootstrapAutoSession(
|
|
|
724
723
|
}
|
|
725
724
|
}
|
|
726
725
|
}
|
|
727
|
-
} catch {
|
|
726
|
+
} catch (err) {
|
|
728
727
|
/* non-fatal */
|
|
728
|
+
logWarning("engine", `preflight validation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
729
729
|
}
|
|
730
730
|
|
|
731
731
|
return true;
|
|
@@ -735,3 +735,4 @@ export async function bootstrapAutoSession(
|
|
|
735
735
|
throw err;
|
|
736
736
|
}
|
|
737
737
|
}
|
|
738
|
+
|
|
@@ -24,6 +24,7 @@ import { saveActivityLog } from "./activity-log.js";
|
|
|
24
24
|
import { recoverTimedOutUnit, type RecoveryContext } from "./auto-timeout-recovery.js";
|
|
25
25
|
import { resolveAgentEndCancelled } from "./auto/resolve.js";
|
|
26
26
|
import type { AutoSession } from "./auto/session.js";
|
|
27
|
+
import { logWarning, logError } from "./workflow-logger.js";
|
|
27
28
|
|
|
28
29
|
export interface SupervisionContext {
|
|
29
30
|
s: AutoSession;
|
|
@@ -99,8 +100,9 @@ export function startUnitSupervision(sctx: SupervisionContext): void {
|
|
|
99
100
|
}
|
|
100
101
|
}
|
|
101
102
|
}
|
|
102
|
-
} catch {
|
|
103
|
+
} catch (err) {
|
|
103
104
|
// Non-fatal — fall through with no estimate
|
|
105
|
+
logWarning("timer", `operation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
104
106
|
}
|
|
105
107
|
}
|
|
106
108
|
const estimateMinutes = taskEstimate ? parseEstimateMinutes(taskEstimate) : null;
|
|
@@ -214,12 +216,14 @@ export function startUnitSupervision(sctx: SupervisionContext): void {
|
|
|
214
216
|
await pauseAuto(ctx, pi);
|
|
215
217
|
} catch (err) {
|
|
216
218
|
const message = err instanceof Error ? err.message : String(err);
|
|
217
|
-
|
|
219
|
+
logError("timer", `[idle-watchdog] Unhandled error: ${message}`);
|
|
218
220
|
// Unblock any pending unit promise so the auto-loop is not orphaned.
|
|
219
221
|
resolveAgentEndCancelled({ message: `Idle watchdog error: ${message}`, category: "idle", isTransient: true });
|
|
220
222
|
try {
|
|
221
223
|
ctx.ui.notify(`Idle watchdog error: ${message}`, "warning");
|
|
222
|
-
} catch { /* best effort */
|
|
224
|
+
} catch (err) { /* best effort */
|
|
225
|
+
logWarning("timer", `notification failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
226
|
+
}
|
|
223
227
|
}
|
|
224
228
|
}, 15000);
|
|
225
229
|
|
|
@@ -248,12 +252,14 @@ export function startUnitSupervision(sctx: SupervisionContext): void {
|
|
|
248
252
|
await pauseAuto(ctx, pi);
|
|
249
253
|
} catch (err) {
|
|
250
254
|
const message = err instanceof Error ? err.message : String(err);
|
|
251
|
-
|
|
255
|
+
logError("timer", `[hard-timeout] Unhandled error: ${message}`);
|
|
252
256
|
// Unblock any pending unit promise so the auto-loop is not orphaned.
|
|
253
257
|
resolveAgentEndCancelled({ message: `Hard timeout error: ${message}`, category: "timeout", isTransient: true });
|
|
254
258
|
try {
|
|
255
259
|
ctx.ui.notify(`Hard timeout error: ${message}`, "warning");
|
|
256
|
-
} catch { /* best effort */
|
|
260
|
+
} catch (err) { /* best effort */
|
|
261
|
+
logWarning("timer", `notification failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
262
|
+
}
|
|
257
263
|
}
|
|
258
264
|
}, hardTimeoutMs);
|
|
259
265
|
|
|
@@ -311,3 +317,4 @@ export function startUnitSupervision(sctx: SupervisionContext): void {
|
|
|
311
317
|
}
|
|
312
318
|
}, 15_000);
|
|
313
319
|
}
|
|
320
|
+
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import type { ExtensionContext } from "@gsd/pi-coding-agent";
|
|
8
8
|
import { snapshotUnitMetrics } from "./metrics.js";
|
|
9
9
|
import { saveActivityLog } from "./activity-log.js";
|
|
10
|
+
import { logWarning } from "./workflow-logger.js";
|
|
10
11
|
|
|
11
12
|
export interface CloseoutOptions {
|
|
12
13
|
promptCharCount?: number;
|
|
@@ -38,11 +39,14 @@ export async function closeoutUnit(
|
|
|
38
39
|
const llmCallFn = buildMemoryLLMCall(ctx);
|
|
39
40
|
if (llmCallFn) {
|
|
40
41
|
extractMemoriesFromUnit(activityFile, unitType, unitId, llmCallFn).catch((err) => {
|
|
41
|
-
|
|
42
|
+
logWarning("engine", `memory extraction failed for ${unitType}/${unitId}: ${(err as Error).message}`);
|
|
42
43
|
});
|
|
43
44
|
}
|
|
44
|
-
} catch { /* non-fatal */
|
|
45
|
+
} catch (err) { /* non-fatal */
|
|
46
|
+
logWarning("engine", `operation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
47
|
+
}
|
|
45
48
|
}
|
|
46
49
|
|
|
47
50
|
return activityFile ?? undefined;
|
|
48
51
|
}
|
|
52
|
+
|
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
runDependencyAudit,
|
|
23
23
|
} from "./verification-gate.js";
|
|
24
24
|
import { writeVerificationJSON } from "./verification-evidence.js";
|
|
25
|
+
import { logWarning } from "./workflow-logger.js";
|
|
25
26
|
import type { AutoSession } from "./auto/session.js";
|
|
26
27
|
import { join } from "node:path";
|
|
27
28
|
|
|
@@ -159,9 +160,7 @@ export async function runPostUnitVerification(
|
|
|
159
160
|
}
|
|
160
161
|
}
|
|
161
162
|
} catch (evidenceErr) {
|
|
162
|
-
|
|
163
|
-
`verification-evidence: write error — ${(evidenceErr as Error).message}\n`,
|
|
164
|
-
);
|
|
163
|
+
logWarning("engine", `verification-evidence write error: ${(evidenceErr as Error).message}`);
|
|
165
164
|
}
|
|
166
165
|
}
|
|
167
166
|
|
|
@@ -217,9 +216,7 @@ export async function runPostUnitVerification(
|
|
|
217
216
|
}
|
|
218
217
|
} catch (err) {
|
|
219
218
|
// Gate errors are non-fatal
|
|
220
|
-
|
|
221
|
-
`verification-gate: error — ${(err as Error).message}\n`,
|
|
222
|
-
);
|
|
219
|
+
logWarning("engine", `verification-gate error: ${(err as Error).message}`);
|
|
223
220
|
return "continue";
|
|
224
221
|
}
|
|
225
222
|
}
|