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
|
@@ -44,7 +44,7 @@ import {
|
|
|
44
44
|
} from "./worktree.js";
|
|
45
45
|
import { MergeConflictError, readIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
|
|
46
46
|
import { debugLog } from "./debug-logger.js";
|
|
47
|
-
import { logWarning } from "./workflow-logger.js";
|
|
47
|
+
import { logWarning, logError } from "./workflow-logger.js";
|
|
48
48
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
49
49
|
import {
|
|
50
50
|
nativeGetCurrentBranch,
|
|
@@ -100,7 +100,8 @@ const ROOT_STATE_FILES = [
|
|
|
100
100
|
function isSamePath(a: string, b: string): boolean {
|
|
101
101
|
try {
|
|
102
102
|
return realpathSync(a) === realpathSync(b);
|
|
103
|
-
} catch {
|
|
103
|
+
} catch (e) {
|
|
104
|
+
logWarning("worktree", `isSamePath failed: ${(e as Error).message}`);
|
|
104
105
|
return false;
|
|
105
106
|
}
|
|
106
107
|
}
|
|
@@ -153,16 +154,19 @@ function forceOverwriteAssessmentsWithVerdict(
|
|
|
153
154
|
// Source has a verdict — force-copy into worktree
|
|
154
155
|
mkdirSync(dstSliceDir, { recursive: true });
|
|
155
156
|
safeCopy(srcFile, join(dstSliceDir, fileEntry.name), { force: true });
|
|
156
|
-
} catch {
|
|
157
|
+
} catch (err) {
|
|
157
158
|
/* non-fatal per file */
|
|
159
|
+
logWarning("worktree", `assessment force-copy failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
158
160
|
}
|
|
159
161
|
}
|
|
160
|
-
} catch {
|
|
162
|
+
} catch (err) {
|
|
161
163
|
/* non-fatal per slice */
|
|
164
|
+
logWarning("worktree", `assessment slice scan failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
162
165
|
}
|
|
163
166
|
}
|
|
164
|
-
} catch {
|
|
167
|
+
} catch (err) {
|
|
165
168
|
/* non-fatal */
|
|
169
|
+
logWarning("worktree", `assessment sync failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
166
170
|
}
|
|
167
171
|
}
|
|
168
172
|
|
|
@@ -182,8 +186,9 @@ function clearProjectRootStateFiles(basePath: string, milestoneId: string): void
|
|
|
182
186
|
for (const file of transientFiles) {
|
|
183
187
|
try {
|
|
184
188
|
unlinkSync(file);
|
|
185
|
-
} catch {
|
|
189
|
+
} catch (err) {
|
|
186
190
|
/* non-fatal — file may not exist */
|
|
191
|
+
logWarning("worktree", `file unlink failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
187
192
|
}
|
|
188
193
|
}
|
|
189
194
|
|
|
@@ -211,14 +216,16 @@ function clearProjectRootStateFiles(basePath: string, milestoneId: string): void
|
|
|
211
216
|
for (const f of untrackedOutput.split("\n").filter(Boolean)) {
|
|
212
217
|
try {
|
|
213
218
|
unlinkSync(join(basePath, f));
|
|
214
|
-
} catch {
|
|
219
|
+
} catch (err) {
|
|
215
220
|
/* non-fatal */
|
|
221
|
+
logWarning("worktree", `untracked file unlink failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
216
222
|
}
|
|
217
223
|
}
|
|
218
224
|
}
|
|
219
225
|
}
|
|
220
|
-
} catch {
|
|
226
|
+
} catch (err) {
|
|
221
227
|
/* non-fatal — git command may fail if not in repo */
|
|
228
|
+
logWarning("worktree", `untracked file cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
222
229
|
}
|
|
223
230
|
}
|
|
224
231
|
}
|
|
@@ -313,8 +320,9 @@ export function syncProjectRootToWorktree(
|
|
|
313
320
|
unlinkSync(wtDb);
|
|
314
321
|
}
|
|
315
322
|
}
|
|
316
|
-
} catch {
|
|
323
|
+
} catch (err) {
|
|
317
324
|
/* non-fatal */
|
|
325
|
+
logWarning("worktree", `worktree DB cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
318
326
|
}
|
|
319
327
|
}
|
|
320
328
|
|
|
@@ -383,7 +391,8 @@ export function readResourceVersion(): string | null {
|
|
|
383
391
|
return typeof manifest?.gsdVersion === "string"
|
|
384
392
|
? manifest.gsdVersion
|
|
385
393
|
: null;
|
|
386
|
-
} catch {
|
|
394
|
+
} catch (e) {
|
|
395
|
+
logWarning("worktree", `readResourceVersion failed: ${(e as Error).message}`);
|
|
387
396
|
return null;
|
|
388
397
|
}
|
|
389
398
|
}
|
|
@@ -449,8 +458,9 @@ export function escapeStaleWorktree(base: string): string {
|
|
|
449
458
|
|
|
450
459
|
try {
|
|
451
460
|
process.chdir(projectRoot);
|
|
452
|
-
} catch {
|
|
461
|
+
} catch (e) {
|
|
453
462
|
// If chdir fails, return the original — caller will handle errors downstream
|
|
463
|
+
logWarning("worktree", `escapeStaleWorktree chdir failed: ${(e as Error).message}`);
|
|
454
464
|
return base;
|
|
455
465
|
}
|
|
456
466
|
return projectRoot;
|
|
@@ -480,13 +490,15 @@ export function cleanStaleRuntimeUnits(
|
|
|
480
490
|
try {
|
|
481
491
|
unlinkSync(join(runtimeUnitsDir, file));
|
|
482
492
|
cleaned++;
|
|
483
|
-
} catch {
|
|
493
|
+
} catch (err) {
|
|
484
494
|
/* non-fatal */
|
|
495
|
+
logWarning("worktree", `stale runtime unit unlink failed (${file}): ${err instanceof Error ? err.message : String(err)}`);
|
|
485
496
|
}
|
|
486
497
|
}
|
|
487
498
|
}
|
|
488
|
-
} catch {
|
|
499
|
+
} catch (err) {
|
|
489
500
|
/* non-fatal */
|
|
501
|
+
logWarning("worktree", `stale runtime unit cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
490
502
|
}
|
|
491
503
|
return cleaned;
|
|
492
504
|
}
|
|
@@ -528,8 +540,9 @@ export function syncGsdStateToWorktree(
|
|
|
528
540
|
try {
|
|
529
541
|
cpSync(src, dst);
|
|
530
542
|
synced.push(f);
|
|
531
|
-
} catch {
|
|
543
|
+
} catch (err) {
|
|
532
544
|
/* non-fatal */
|
|
545
|
+
logWarning("worktree", `file copy failed (${f}): ${err instanceof Error ? err.message : String(err)}`);
|
|
533
546
|
}
|
|
534
547
|
}
|
|
535
548
|
}
|
|
@@ -548,8 +561,9 @@ export function syncGsdStateToWorktree(
|
|
|
548
561
|
try {
|
|
549
562
|
cpSync(src, dst);
|
|
550
563
|
synced.push(file);
|
|
551
|
-
} catch {
|
|
564
|
+
} catch (err) {
|
|
552
565
|
/* non-fatal */
|
|
566
|
+
logWarning("worktree", `preferences copy failed (${file}): ${err instanceof Error ? err.message : String(err)}`);
|
|
553
567
|
}
|
|
554
568
|
break;
|
|
555
569
|
}
|
|
@@ -578,8 +592,9 @@ export function syncGsdStateToWorktree(
|
|
|
578
592
|
try {
|
|
579
593
|
cpSync(srcDir, dstDir, { recursive: true });
|
|
580
594
|
synced.push(`milestones/${mid}/`);
|
|
581
|
-
} catch {
|
|
595
|
+
} catch (err) {
|
|
582
596
|
/* non-fatal */
|
|
597
|
+
logWarning("worktree", `milestone copy failed (${mid}): ${err instanceof Error ? err.message : String(err)}`);
|
|
583
598
|
}
|
|
584
599
|
} else {
|
|
585
600
|
// Milestone directory exists but may be missing files (stale snapshot).
|
|
@@ -598,8 +613,9 @@ export function syncGsdStateToWorktree(
|
|
|
598
613
|
cpSync(srcFile, dstFile);
|
|
599
614
|
synced.push(`milestones/${mid}/${f}`);
|
|
600
615
|
}
|
|
601
|
-
} catch {
|
|
616
|
+
} catch (err) {
|
|
602
617
|
/* non-fatal */
|
|
618
|
+
logWarning("worktree", `milestone file copy failed (${mid}/${f}): ${err instanceof Error ? err.message : String(err)}`);
|
|
603
619
|
}
|
|
604
620
|
}
|
|
605
621
|
}
|
|
@@ -611,8 +627,9 @@ export function syncGsdStateToWorktree(
|
|
|
611
627
|
try {
|
|
612
628
|
cpSync(srcSlicesDir, dstSlicesDir, { recursive: true });
|
|
613
629
|
synced.push(`milestones/${mid}/slices/`);
|
|
614
|
-
} catch {
|
|
630
|
+
} catch (err) {
|
|
615
631
|
/* non-fatal */
|
|
632
|
+
logWarning("worktree", `slices copy failed (${mid}): ${err instanceof Error ? err.message : String(err)}`);
|
|
616
633
|
}
|
|
617
634
|
} else if (existsSync(srcSlicesDir) && existsSync(dstSlicesDir)) {
|
|
618
635
|
// Both exist — sync missing slice directories
|
|
@@ -628,19 +645,22 @@ export function syncGsdStateToWorktree(
|
|
|
628
645
|
try {
|
|
629
646
|
cpSync(srcSlice, dstSlice, { recursive: true });
|
|
630
647
|
synced.push(`milestones/${mid}/slices/${sid}/`);
|
|
631
|
-
} catch {
|
|
648
|
+
} catch (err) {
|
|
632
649
|
/* non-fatal */
|
|
650
|
+
logWarning("worktree", `slice copy failed (${mid}/${sid}): ${err instanceof Error ? err.message : String(err)}`);
|
|
633
651
|
}
|
|
634
652
|
}
|
|
635
653
|
}
|
|
636
654
|
}
|
|
637
|
-
} catch {
|
|
655
|
+
} catch (err) {
|
|
638
656
|
/* non-fatal */
|
|
657
|
+
logWarning("worktree", `milestone file sync failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
639
658
|
}
|
|
640
659
|
}
|
|
641
660
|
}
|
|
642
|
-
} catch {
|
|
661
|
+
} catch (err) {
|
|
643
662
|
/* non-fatal */
|
|
663
|
+
logWarning("worktree", `milestone directory sync failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
644
664
|
}
|
|
645
665
|
}
|
|
646
666
|
|
|
@@ -692,8 +712,9 @@ export function syncWorktreeStateBack(
|
|
|
692
712
|
try {
|
|
693
713
|
reconcileWorktreeDb(mainDb, wtLocalDb);
|
|
694
714
|
synced.push("gsd.db (pre-upgrade reconcile)");
|
|
695
|
-
} catch {
|
|
715
|
+
} catch (err) {
|
|
696
716
|
// Non-fatal — file sync below is the fallback
|
|
717
|
+
logError("worktree", `DB reconciliation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
697
718
|
}
|
|
698
719
|
}
|
|
699
720
|
|
|
@@ -710,8 +731,9 @@ export function syncWorktreeStateBack(
|
|
|
710
731
|
try {
|
|
711
732
|
cpSync(src, dst, { force: true });
|
|
712
733
|
synced.push(f);
|
|
713
|
-
} catch {
|
|
734
|
+
} catch (err) {
|
|
714
735
|
/* non-fatal */
|
|
736
|
+
logWarning("worktree", `state file copy-back failed (${f}): ${err instanceof Error ? err.message : String(err)}`);
|
|
715
737
|
}
|
|
716
738
|
}
|
|
717
739
|
}
|
|
@@ -731,8 +753,9 @@ export function syncWorktreeStateBack(
|
|
|
731
753
|
for (const mid of wtMilestones) {
|
|
732
754
|
syncMilestoneDir(wtGsd, mainGsd, mid, synced);
|
|
733
755
|
}
|
|
734
|
-
} catch {
|
|
756
|
+
} catch (err) {
|
|
735
757
|
/* non-fatal */
|
|
758
|
+
logWarning("worktree", `milestone sync-back failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
736
759
|
}
|
|
737
760
|
|
|
738
761
|
return { synced };
|
|
@@ -756,12 +779,14 @@ function syncDirFiles(
|
|
|
756
779
|
try {
|
|
757
780
|
cpSync(join(srcDir, entry.name), join(dstDir, entry.name), { force: true });
|
|
758
781
|
synced.push(`${prefix}${entry.name}`);
|
|
759
|
-
} catch {
|
|
782
|
+
} catch (err) {
|
|
760
783
|
/* non-fatal */
|
|
784
|
+
logWarning("worktree", `file copy failed (${prefix}${entry.name}): ${err instanceof Error ? err.message : String(err)}`);
|
|
761
785
|
}
|
|
762
786
|
}
|
|
763
|
-
} catch {
|
|
787
|
+
} catch (err) {
|
|
764
788
|
/* non-fatal — srcDir may not be readable */
|
|
789
|
+
logWarning("worktree", `directory read failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
765
790
|
}
|
|
766
791
|
}
|
|
767
792
|
|
|
@@ -804,8 +829,9 @@ function syncMilestoneDir(
|
|
|
804
829
|
syncDirFiles(wtTasksDir, mainTasksDir, isMd, synced, `milestones/${mid}/slices/${sid}/tasks/`);
|
|
805
830
|
}
|
|
806
831
|
}
|
|
807
|
-
} catch {
|
|
832
|
+
} catch (err) {
|
|
808
833
|
/* non-fatal */
|
|
834
|
+
logWarning("worktree", `milestone slice sync failed (${mid}): ${err instanceof Error ? err.message : String(err)}`);
|
|
809
835
|
}
|
|
810
836
|
}
|
|
811
837
|
// ─── Worktree Post-Create Hook (#597) ────────────────────────────────────────
|
|
@@ -837,7 +863,9 @@ export function runWorktreePostCreateHook(
|
|
|
837
863
|
return `Worktree post-create hook not found: ${resolved}`;
|
|
838
864
|
}
|
|
839
865
|
if (process.platform === "win32") {
|
|
840
|
-
try { resolved = realpathSync.native(resolved); } catch { /* keep original */
|
|
866
|
+
try { resolved = realpathSync.native(resolved); } catch (err) { /* keep original */
|
|
867
|
+
logWarning("worktree", `realpath failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
868
|
+
}
|
|
841
869
|
}
|
|
842
870
|
|
|
843
871
|
try {
|
|
@@ -921,8 +949,9 @@ function reconcilePlanCheckboxes(
|
|
|
921
949
|
results.push(full);
|
|
922
950
|
}
|
|
923
951
|
}
|
|
924
|
-
} catch {
|
|
952
|
+
} catch (err) {
|
|
925
953
|
/* non-fatal */
|
|
954
|
+
logWarning("worktree", `walkMd directory read failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
926
955
|
}
|
|
927
956
|
return results;
|
|
928
957
|
}
|
|
@@ -937,7 +966,8 @@ function reconcilePlanCheckboxes(
|
|
|
937
966
|
try {
|
|
938
967
|
srcContent = readFileSync(srcFile, "utf-8");
|
|
939
968
|
dstContent = readFileSync(dstFile, "utf-8");
|
|
940
|
-
} catch {
|
|
969
|
+
} catch (e) {
|
|
970
|
+
logWarning("worktree", `reconcilePlanCheckboxes read failed: ${(e as Error).message}`);
|
|
941
971
|
continue;
|
|
942
972
|
}
|
|
943
973
|
|
|
@@ -972,8 +1002,9 @@ function reconcilePlanCheckboxes(
|
|
|
972
1002
|
if (changed) {
|
|
973
1003
|
try {
|
|
974
1004
|
atomicWriteSync(dstFile, updated, "utf-8");
|
|
975
|
-
} catch {
|
|
1005
|
+
} catch (err) {
|
|
976
1006
|
/* non-fatal */
|
|
1007
|
+
logWarning("worktree", `plan checkbox reconcile write failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
977
1008
|
}
|
|
978
1009
|
}
|
|
979
1010
|
}
|
|
@@ -1158,8 +1189,9 @@ export function teardownAutoWorktree(
|
|
|
1158
1189
|
// Attempt a direct filesystem removal as a fallback
|
|
1159
1190
|
try {
|
|
1160
1191
|
rmSync(wtDir, { recursive: true, force: true });
|
|
1161
|
-
} catch {
|
|
1192
|
+
} catch (err) {
|
|
1162
1193
|
// Non-fatal — the warning above tells the user how to clean up
|
|
1194
|
+
logWarning("worktree", `worktree directory removal failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1163
1195
|
}
|
|
1164
1196
|
}
|
|
1165
1197
|
}
|
|
@@ -1200,7 +1232,8 @@ export function getAutoWorktreePath(
|
|
|
1200
1232
|
try {
|
|
1201
1233
|
const content = readFileSync(gitPath, "utf8").trim();
|
|
1202
1234
|
if (!content.startsWith("gitdir: ")) return null;
|
|
1203
|
-
} catch {
|
|
1235
|
+
} catch (e) {
|
|
1236
|
+
logWarning("worktree", `getAutoWorktreePath .git read failed: ${(e as Error).message}`);
|
|
1204
1237
|
return null;
|
|
1205
1238
|
}
|
|
1206
1239
|
|
|
@@ -1359,8 +1392,9 @@ export function mergeMilestoneToMain(
|
|
|
1359
1392
|
if (!isSamePath(worktreeDbPath, mainDbPath)) {
|
|
1360
1393
|
reconcileWorktreeDb(mainDbPath, worktreeDbPath);
|
|
1361
1394
|
}
|
|
1362
|
-
} catch {
|
|
1395
|
+
} catch (err) {
|
|
1363
1396
|
/* non-fatal */
|
|
1397
|
+
logError("worktree", `DB reconciliation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1364
1398
|
}
|
|
1365
1399
|
}
|
|
1366
1400
|
|
|
@@ -1515,9 +1549,10 @@ export function mergeMilestoneToMain(
|
|
|
1515
1549
|
);
|
|
1516
1550
|
stashed = true;
|
|
1517
1551
|
}
|
|
1518
|
-
} catch {
|
|
1552
|
+
} catch (err) {
|
|
1519
1553
|
// Stash failure is non-fatal — proceed without stash and let the merge
|
|
1520
1554
|
// report the dirty tree if it fails.
|
|
1555
|
+
logWarning("worktree", `git stash failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1521
1556
|
}
|
|
1522
1557
|
|
|
1523
1558
|
// 7a. Shelter queued milestone directories before the squash merge (#2505).
|
|
@@ -1538,9 +1573,13 @@ export function mergeMilestoneToMain(
|
|
|
1538
1573
|
try {
|
|
1539
1574
|
mkdirSync(milestonesDir, { recursive: true });
|
|
1540
1575
|
cpSync(join(shelterDir, dirName), join(milestonesDir, dirName), { recursive: true, force: true });
|
|
1541
|
-
} catch { /* best-effort */
|
|
1576
|
+
} catch (err) { /* best-effort */
|
|
1577
|
+
logError("worktree", `shelter restore failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1578
|
+
}
|
|
1579
|
+
}
|
|
1580
|
+
try { rmSync(shelterDir, { recursive: true, force: true }); } catch (err) { /* best-effort */
|
|
1581
|
+
logWarning("worktree", `shelter cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1542
1582
|
}
|
|
1543
|
-
try { rmSync(shelterDir, { recursive: true, force: true }); } catch { /* best-effort */ }
|
|
1544
1583
|
};
|
|
1545
1584
|
|
|
1546
1585
|
try {
|
|
@@ -1557,13 +1596,15 @@ export function mergeMilestoneToMain(
|
|
|
1557
1596
|
cpSync(srcDir, dstDir, { recursive: true, force: true });
|
|
1558
1597
|
rmSync(srcDir, { recursive: true, force: true });
|
|
1559
1598
|
shelteredDirs.push(entry.name);
|
|
1560
|
-
} catch {
|
|
1599
|
+
} catch (err) {
|
|
1561
1600
|
// Non-fatal — if shelter fails, the merge may still succeed
|
|
1601
|
+
logWarning("worktree", `milestone shelter failed (${entry.name}): ${err instanceof Error ? err.message : String(err)}`);
|
|
1562
1602
|
}
|
|
1563
1603
|
}
|
|
1564
1604
|
}
|
|
1565
|
-
} catch {
|
|
1605
|
+
} catch (err) {
|
|
1566
1606
|
// Non-fatal — proceed with merge; untracked files may block it
|
|
1607
|
+
logWarning("worktree", `milestone shelter operation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1567
1608
|
}
|
|
1568
1609
|
|
|
1569
1610
|
// 7b. Clean up stale merge state before attempting squash merge (#2912).
|
|
@@ -1577,7 +1618,9 @@ export function mergeMilestoneToMain(
|
|
|
1577
1618
|
const p = join(gitDir_, f);
|
|
1578
1619
|
if (existsSync(p)) unlinkSync(p);
|
|
1579
1620
|
}
|
|
1580
|
-
} catch { /* best-effort */
|
|
1621
|
+
} catch (err) { /* best-effort */
|
|
1622
|
+
logError("worktree", `merge state cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1623
|
+
}
|
|
1581
1624
|
|
|
1582
1625
|
// 8. Squash merge — auto-resolve .gsd/ state file conflicts (#530)
|
|
1583
1626
|
const mergeResult = nativeMergeSquash(originalBasePath_, milestoneBranch);
|
|
@@ -1595,7 +1638,9 @@ export function mergeMilestoneToMain(
|
|
|
1595
1638
|
const p = join(gitDir_, f);
|
|
1596
1639
|
if (existsSync(p)) unlinkSync(p);
|
|
1597
1640
|
}
|
|
1598
|
-
} catch { /* best-effort */
|
|
1641
|
+
} catch (err) { /* best-effort */
|
|
1642
|
+
logError("worktree", `merge state cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1643
|
+
}
|
|
1599
1644
|
|
|
1600
1645
|
// Pop stash before throwing so local work is not lost.
|
|
1601
1646
|
if (stashed) {
|
|
@@ -1605,7 +1650,9 @@ export function mergeMilestoneToMain(
|
|
|
1605
1650
|
stdio: ["ignore", "pipe", "pipe"],
|
|
1606
1651
|
encoding: "utf-8",
|
|
1607
1652
|
});
|
|
1608
|
-
} catch { /* stash pop conflict is non-fatal */
|
|
1653
|
+
} catch (err) { /* stash pop conflict is non-fatal */
|
|
1654
|
+
logWarning("worktree", `git stash pop failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1655
|
+
}
|
|
1609
1656
|
}
|
|
1610
1657
|
restoreShelter();
|
|
1611
1658
|
// Restore cwd so the caller is not stranded on the integration branch
|
|
@@ -1644,9 +1691,10 @@ export function mergeMilestoneToMain(
|
|
|
1644
1691
|
try {
|
|
1645
1692
|
nativeCheckoutTheirs(originalBasePath_, [safeFile]);
|
|
1646
1693
|
nativeAddPaths(originalBasePath_, [safeFile]);
|
|
1647
|
-
} catch {
|
|
1694
|
+
} catch (e) {
|
|
1648
1695
|
// If checkout --theirs fails, try removing the file from the merge
|
|
1649
1696
|
// (it's a runtime file that shouldn't be committed anyway)
|
|
1697
|
+
logWarning("worktree", `checkout --theirs failed for ${safeFile}, removing: ${(e as Error).message}`);
|
|
1650
1698
|
nativeRmForce(originalBasePath_, [safeFile]);
|
|
1651
1699
|
}
|
|
1652
1700
|
}
|
|
@@ -1657,14 +1705,18 @@ export function mergeMilestoneToMain(
|
|
|
1657
1705
|
// Abort merge state so MERGE_HEAD is not left on disk (#2912).
|
|
1658
1706
|
// libgit2's merge creates MERGE_HEAD even for squash merges; if left
|
|
1659
1707
|
// dangling, subsequent merges fail and doctor reports corrupt state.
|
|
1660
|
-
try { nativeMergeAbort(originalBasePath_); } catch { /* best-effort */
|
|
1708
|
+
try { nativeMergeAbort(originalBasePath_); } catch (err) { /* best-effort */
|
|
1709
|
+
logError("worktree", `git merge-abort failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1710
|
+
}
|
|
1661
1711
|
try {
|
|
1662
1712
|
const gitDir_ = resolveGitDir(originalBasePath_);
|
|
1663
1713
|
for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_HEAD"]) {
|
|
1664
1714
|
const p = join(gitDir_, f);
|
|
1665
1715
|
if (existsSync(p)) unlinkSync(p);
|
|
1666
1716
|
}
|
|
1667
|
-
} catch { /* best-effort */
|
|
1717
|
+
} catch (err) { /* best-effort */
|
|
1718
|
+
logError("worktree", `merge state file cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1719
|
+
}
|
|
1668
1720
|
|
|
1669
1721
|
// Pop stash before throwing so local work is not lost (#2151).
|
|
1670
1722
|
if (stashed) {
|
|
@@ -1674,7 +1726,9 @@ export function mergeMilestoneToMain(
|
|
|
1674
1726
|
stdio: ["ignore", "pipe", "pipe"],
|
|
1675
1727
|
encoding: "utf-8",
|
|
1676
1728
|
});
|
|
1677
|
-
} catch { /* stash pop conflict is non-fatal */
|
|
1729
|
+
} catch (err) { /* stash pop conflict is non-fatal */
|
|
1730
|
+
logWarning("worktree", `git stash pop failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1731
|
+
}
|
|
1678
1732
|
}
|
|
1679
1733
|
restoreShelter();
|
|
1680
1734
|
throw new MergeConflictError(
|
|
@@ -1704,7 +1758,9 @@ export function mergeMilestoneToMain(
|
|
|
1704
1758
|
const p = join(gitDir_, f);
|
|
1705
1759
|
if (existsSync(p)) unlinkSync(p);
|
|
1706
1760
|
}
|
|
1707
|
-
} catch { /* best-effort */
|
|
1761
|
+
} catch (err) { /* best-effort */
|
|
1762
|
+
logError("worktree", `post-commit merge state cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1763
|
+
}
|
|
1708
1764
|
|
|
1709
1765
|
// 9a-ii. Restore stashed files now that the merge+commit is complete (#2151).
|
|
1710
1766
|
// Pop after commit so stashed changes do not interfere with the squash merge
|
|
@@ -1717,7 +1773,8 @@ export function mergeMilestoneToMain(
|
|
|
1717
1773
|
stdio: ["ignore", "pipe", "pipe"],
|
|
1718
1774
|
encoding: "utf-8",
|
|
1719
1775
|
});
|
|
1720
|
-
} catch {
|
|
1776
|
+
} catch (e) {
|
|
1777
|
+
logWarning("worktree", `git stash pop failed, attempting conflict resolution: ${(e as Error).message}`);
|
|
1721
1778
|
// Stash pop after squash merge can conflict on .gsd/ state files that
|
|
1722
1779
|
// diverged between branches. Left unresolved, these UU entries block
|
|
1723
1780
|
// every subsequent merge. Auto-resolve them the same way we handle
|
|
@@ -1737,8 +1794,9 @@ export function mergeMilestoneToMain(
|
|
|
1737
1794
|
encoding: "utf-8",
|
|
1738
1795
|
});
|
|
1739
1796
|
nativeAddPaths(originalBasePath_, [f]);
|
|
1740
|
-
} catch {
|
|
1797
|
+
} catch (e) {
|
|
1741
1798
|
// Last resort: remove the conflicted state file
|
|
1799
|
+
logWarning("worktree", `checkout HEAD failed for ${f}, removing: ${(e as Error).message}`);
|
|
1742
1800
|
nativeRmForce(originalBasePath_, [f]);
|
|
1743
1801
|
}
|
|
1744
1802
|
}
|
|
@@ -1752,7 +1810,9 @@ export function mergeMilestoneToMain(
|
|
|
1752
1810
|
stdio: ["ignore", "pipe", "pipe"],
|
|
1753
1811
|
encoding: "utf-8",
|
|
1754
1812
|
});
|
|
1755
|
-
} catch { /* stash may already be consumed */
|
|
1813
|
+
} catch (err) { /* stash may already be consumed */
|
|
1814
|
+
logWarning("worktree", `git stash drop failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1815
|
+
}
|
|
1756
1816
|
} else {
|
|
1757
1817
|
// Non-.gsd conflicts remain — leave stash for manual resolution
|
|
1758
1818
|
logWarning("reconcile", "Stash pop conflict on non-.gsd files after merge", {
|
|
@@ -1805,8 +1865,9 @@ export function mergeMilestoneToMain(
|
|
|
1805
1865
|
codeFilesChanged = mergedFiles.some(
|
|
1806
1866
|
(entry) => !entry.path.startsWith(".gsd/"),
|
|
1807
1867
|
);
|
|
1808
|
-
} catch {
|
|
1868
|
+
} catch (e) {
|
|
1809
1869
|
// If HEAD~1 doesn't exist (first commit), assume code was changed
|
|
1870
|
+
logWarning("worktree", `diff numstat failed (assuming code changed): ${(e as Error).message}`);
|
|
1810
1871
|
codeFilesChanged = true;
|
|
1811
1872
|
}
|
|
1812
1873
|
}
|
|
@@ -1822,8 +1883,9 @@ export function mergeMilestoneToMain(
|
|
|
1822
1883
|
encoding: "utf-8",
|
|
1823
1884
|
});
|
|
1824
1885
|
pushed = true;
|
|
1825
|
-
} catch {
|
|
1886
|
+
} catch (err) {
|
|
1826
1887
|
// Push failure is non-fatal
|
|
1888
|
+
logWarning("worktree", `git push failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1827
1889
|
}
|
|
1828
1890
|
}
|
|
1829
1891
|
|
|
@@ -1852,8 +1914,9 @@ export function mergeMilestoneToMain(
|
|
|
1852
1914
|
encoding: "utf-8",
|
|
1853
1915
|
});
|
|
1854
1916
|
prCreated = true;
|
|
1855
|
-
} catch {
|
|
1917
|
+
} catch (err) {
|
|
1856
1918
|
// PR creation failure is non-fatal — gh may not be installed or authenticated
|
|
1919
|
+
logWarning("worktree", `PR creation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1857
1920
|
}
|
|
1858
1921
|
}
|
|
1859
1922
|
|
|
@@ -1891,15 +1954,17 @@ export function mergeMilestoneToMain(
|
|
|
1891
1954
|
branch: null as unknown as string,
|
|
1892
1955
|
deleteBranch: false,
|
|
1893
1956
|
});
|
|
1894
|
-
} catch {
|
|
1957
|
+
} catch (err) {
|
|
1895
1958
|
// Best-effort -- worktree dir may already be gone
|
|
1959
|
+
logWarning("worktree", `worktree removal failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1896
1960
|
}
|
|
1897
1961
|
|
|
1898
1962
|
// 13. Delete milestone branch (after worktree removal so ref is unlocked)
|
|
1899
1963
|
try {
|
|
1900
1964
|
nativeBranchDelete(originalBasePath_, milestoneBranch);
|
|
1901
|
-
} catch {
|
|
1965
|
+
} catch (err) {
|
|
1902
1966
|
// Best-effort
|
|
1967
|
+
logWarning("worktree", `git branch-delete failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1903
1968
|
}
|
|
1904
1969
|
|
|
1905
1970
|
// 14. Clear module state
|
|
@@ -1908,3 +1973,4 @@ export function mergeMilestoneToMain(
|
|
|
1908
1973
|
|
|
1909
1974
|
return { commitMessage, pushed, prCreated, codeFilesChanged };
|
|
1910
1975
|
}
|
|
1976
|
+
|