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.
Files changed (354) hide show
  1. package/dist/resources/extensions/ask-user-questions.js +7 -4
  2. package/dist/resources/extensions/gsd/auto/phases.js +62 -1
  3. package/dist/resources/extensions/gsd/auto-dashboard.js +21 -8
  4. package/dist/resources/extensions/gsd/auto-dispatch.js +6 -3
  5. package/dist/resources/extensions/gsd/auto-model-selection.js +57 -3
  6. package/dist/resources/extensions/gsd/auto-post-unit.js +43 -3
  7. package/dist/resources/extensions/gsd/auto-prompts.js +49 -20
  8. package/dist/resources/extensions/gsd/auto-recovery.js +37 -18
  9. package/dist/resources/extensions/gsd/auto-start.js +9 -5
  10. package/dist/resources/extensions/gsd/auto-timers.js +11 -5
  11. package/dist/resources/extensions/gsd/auto-unit-closeout.js +5 -3
  12. package/dist/resources/extensions/gsd/auto-verification.js +3 -2
  13. package/dist/resources/extensions/gsd/auto-worktree.js +120 -55
  14. package/dist/resources/extensions/gsd/auto.js +39 -17
  15. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +6 -3
  16. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +72 -2
  17. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +4 -10
  18. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +2 -1
  19. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +58 -5
  20. package/dist/resources/extensions/gsd/bootstrap/system-context.js +11 -10
  21. package/dist/resources/extensions/gsd/captures.js +54 -1
  22. package/dist/resources/extensions/gsd/commands/catalog.js +2 -0
  23. package/dist/resources/extensions/gsd/commands-codebase.js +48 -21
  24. package/dist/resources/extensions/gsd/commands-inspect.js +2 -1
  25. package/dist/resources/extensions/gsd/commands-maintenance.js +32 -19
  26. package/dist/resources/extensions/gsd/complexity-classifier.js +9 -5
  27. package/dist/resources/extensions/gsd/context-masker.js +68 -0
  28. package/dist/resources/extensions/gsd/custom-verification.js +3 -2
  29. package/dist/resources/extensions/gsd/docs/preferences-reference.md +7 -0
  30. package/dist/resources/extensions/gsd/gsd-db.js +35 -15
  31. package/dist/resources/extensions/gsd/guided-flow.js +19 -9
  32. package/dist/resources/extensions/gsd/init-wizard.js +12 -0
  33. package/dist/resources/extensions/gsd/markdown-renderer.js +11 -9
  34. package/dist/resources/extensions/gsd/md-importer.js +5 -4
  35. package/dist/resources/extensions/gsd/milestone-actions.js +3 -2
  36. package/dist/resources/extensions/gsd/milestone-ids.js +2 -1
  37. package/dist/resources/extensions/gsd/model-router.js +199 -45
  38. package/dist/resources/extensions/gsd/parallel-merge.js +5 -3
  39. package/dist/resources/extensions/gsd/parallel-orchestrator.js +26 -14
  40. package/dist/resources/extensions/gsd/phase-anchor.js +56 -0
  41. package/dist/resources/extensions/gsd/preferences-types.js +2 -0
  42. package/dist/resources/extensions/gsd/preferences-validation.js +91 -0
  43. package/dist/resources/extensions/gsd/preferences.js +15 -3
  44. package/dist/resources/extensions/gsd/prompt-loader.js +3 -2
  45. package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
  46. package/dist/resources/extensions/gsd/prompts/rethink.md +7 -0
  47. package/dist/resources/extensions/gsd/prompts/triage-captures.md +6 -1
  48. package/dist/resources/extensions/gsd/rethink.js +5 -2
  49. package/dist/resources/extensions/gsd/rule-registry.js +7 -6
  50. package/dist/resources/extensions/gsd/safe-fs.js +6 -8
  51. package/dist/resources/extensions/gsd/state.js +1 -1
  52. package/dist/resources/extensions/gsd/status-guards.js +4 -3
  53. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  54. package/dist/resources/extensions/gsd/tools/complete-slice.js +3 -2
  55. package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
  56. package/dist/resources/extensions/gsd/tools/plan-milestone.js +3 -2
  57. package/dist/resources/extensions/gsd/tools/plan-slice.js +3 -2
  58. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -1
  59. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +4 -4
  60. package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -1
  61. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -1
  62. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -1
  63. package/dist/resources/extensions/gsd/tools/validate-milestone.js +2 -1
  64. package/dist/resources/extensions/gsd/triage-resolution.js +135 -1
  65. package/dist/resources/extensions/gsd/triage-ui.js +12 -3
  66. package/dist/resources/extensions/gsd/workflow-events.js +2 -1
  67. package/dist/resources/extensions/gsd/workflow-logger.js +37 -4
  68. package/dist/resources/extensions/gsd/workflow-migration.js +14 -12
  69. package/dist/resources/extensions/gsd/workflow-projections.js +2 -2
  70. package/dist/resources/extensions/gsd/workflow-reconcile.js +2 -2
  71. package/dist/resources/extensions/gsd/worktree-manager.js +26 -14
  72. package/dist/resources/extensions/shared/interview-ui.js +3 -1
  73. package/dist/resources/skills/btw/SKILL.md +42 -0
  74. package/dist/web/standalone/.next/BUILD_ID +1 -1
  75. package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -17
  76. package/dist/web/standalone/.next/build-manifest.json +3 -3
  77. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  78. package/dist/web/standalone/.next/required-server-files.json +3 -3
  79. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  80. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  81. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  82. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  83. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  90. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  91. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  92. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  93. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  94. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  96. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  100. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  106. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  118. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  146. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  152. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  166. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  168. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  170. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  172. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/index.html +1 -1
  182. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  183. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  184. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  185. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  187. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  188. package/dist/web/standalone/.next/server/app/page.js +2 -2
  189. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -17
  191. package/dist/web/standalone/.next/server/chunks/2229.js +1 -1
  192. package/dist/web/standalone/.next/server/chunks/7471.js +3 -3
  193. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/middleware.js +2 -2
  195. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  197. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  198. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  199. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  200. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  201. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  202. package/dist/web/standalone/.next/static/chunks/app/page-0c485498795110d6.js +1 -0
  203. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  204. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  205. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  206. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  207. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  208. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  209. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  210. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  211. package/dist/web/standalone/server.js +1 -1
  212. package/package.json +1 -1
  213. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  214. package/packages/pi-coding-agent/dist/core/extensions/loader.js +5 -0
  215. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  216. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +2 -1
  217. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  218. package/packages/pi-coding-agent/dist/core/extensions/runner.js +16 -0
  219. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  220. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +26 -0
  221. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  222. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  223. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts.map +1 -1
  224. package/packages/pi-coding-agent/dist/core/lsp/config.js +6 -1
  225. package/packages/pi-coding-agent/dist/core/lsp/config.js.map +1 -1
  226. package/packages/pi-coding-agent/dist/core/lsp/defaults.json +2 -2
  227. package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.d.ts +2 -0
  228. package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.d.ts.map +1 -0
  229. package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.js +47 -0
  230. package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.js.map +1 -0
  231. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts +1 -0
  232. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  233. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +6 -0
  234. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  235. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.d.ts +2 -0
  236. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.d.ts.map +1 -0
  237. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +122 -0
  238. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -0
  239. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +1 -0
  240. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  241. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +30 -0
  242. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  243. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
  244. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +1 -7
  245. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  246. package/packages/pi-coding-agent/package.json +1 -1
  247. package/packages/pi-coding-agent/src/core/extensions/loader.ts +6 -0
  248. package/packages/pi-coding-agent/src/core/extensions/runner.ts +19 -0
  249. package/packages/pi-coding-agent/src/core/extensions/types.ts +26 -0
  250. package/packages/pi-coding-agent/src/core/lsp/config.ts +7 -1
  251. package/packages/pi-coding-agent/src/core/lsp/defaults.json +2 -2
  252. package/packages/pi-coding-agent/src/core/lsp/lsp-legacy-alias.test.ts +70 -0
  253. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +156 -0
  254. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +7 -0
  255. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +38 -0
  256. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +1 -8
  257. package/pkg/package.json +1 -1
  258. package/src/resources/extensions/ask-user-questions.ts +7 -3
  259. package/src/resources/extensions/gsd/auto/phases.ts +70 -1
  260. package/src/resources/extensions/gsd/auto-dashboard.ts +22 -8
  261. package/src/resources/extensions/gsd/auto-dispatch.ts +7 -3
  262. package/src/resources/extensions/gsd/auto-model-selection.ts +77 -6
  263. package/src/resources/extensions/gsd/auto-post-unit.ts +52 -5
  264. package/src/resources/extensions/gsd/auto-prompts.ts +54 -20
  265. package/src/resources/extensions/gsd/auto-recovery.ts +38 -18
  266. package/src/resources/extensions/gsd/auto-start.ts +10 -9
  267. package/src/resources/extensions/gsd/auto-timers.ts +12 -5
  268. package/src/resources/extensions/gsd/auto-unit-closeout.ts +6 -2
  269. package/src/resources/extensions/gsd/auto-verification.ts +3 -6
  270. package/src/resources/extensions/gsd/auto-worktree.ts +121 -55
  271. package/src/resources/extensions/gsd/auto.ts +40 -17
  272. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +4 -3
  273. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +80 -2
  274. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +4 -16
  275. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +2 -1
  276. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +61 -4
  277. package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -10
  278. package/src/resources/extensions/gsd/captures.ts +71 -2
  279. package/src/resources/extensions/gsd/commands/catalog.ts +2 -0
  280. package/src/resources/extensions/gsd/commands-codebase.ts +52 -20
  281. package/src/resources/extensions/gsd/commands-inspect.ts +2 -1
  282. package/src/resources/extensions/gsd/commands-maintenance.ts +28 -19
  283. package/src/resources/extensions/gsd/complexity-classifier.ts +10 -5
  284. package/src/resources/extensions/gsd/context-masker.ts +74 -0
  285. package/src/resources/extensions/gsd/custom-verification.ts +3 -2
  286. package/src/resources/extensions/gsd/docs/preferences-reference.md +7 -0
  287. package/src/resources/extensions/gsd/gsd-db.ts +14 -16
  288. package/src/resources/extensions/gsd/guided-flow.ts +9 -8
  289. package/src/resources/extensions/gsd/init-wizard.ts +12 -0
  290. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -17
  291. package/src/resources/extensions/gsd/md-importer.ts +5 -4
  292. package/src/resources/extensions/gsd/milestone-actions.ts +3 -2
  293. package/src/resources/extensions/gsd/milestone-ids.ts +2 -1
  294. package/src/resources/extensions/gsd/model-router.ts +245 -56
  295. package/src/resources/extensions/gsd/parallel-merge.ts +5 -3
  296. package/src/resources/extensions/gsd/parallel-orchestrator.ts +18 -14
  297. package/src/resources/extensions/gsd/phase-anchor.ts +71 -0
  298. package/src/resources/extensions/gsd/preferences-types.ts +22 -0
  299. package/src/resources/extensions/gsd/preferences-validation.ts +83 -0
  300. package/src/resources/extensions/gsd/preferences.ts +16 -3
  301. package/src/resources/extensions/gsd/prompt-loader.ts +3 -2
  302. package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
  303. package/src/resources/extensions/gsd/prompts/rethink.md +7 -0
  304. package/src/resources/extensions/gsd/prompts/triage-captures.md +6 -1
  305. package/src/resources/extensions/gsd/rethink.ts +5 -2
  306. package/src/resources/extensions/gsd/rule-registry.ts +7 -6
  307. package/src/resources/extensions/gsd/safe-fs.ts +6 -5
  308. package/src/resources/extensions/gsd/state.ts +1 -1
  309. package/src/resources/extensions/gsd/status-guards.ts +4 -3
  310. package/src/resources/extensions/gsd/tests/capability-router.test.ts +347 -0
  311. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +63 -0
  312. package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +27 -2
  313. package/src/resources/extensions/gsd/tests/context-masker.test.ts +122 -0
  314. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +4 -4
  315. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +1188 -0
  316. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +841 -0
  317. package/src/resources/extensions/gsd/tests/model-router.test.ts +488 -2
  318. package/src/resources/extensions/gsd/tests/phase-anchor.test.ts +83 -0
  319. package/src/resources/extensions/gsd/tests/preferences.test.ts +62 -0
  320. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +21 -0
  321. package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +284 -0
  322. package/src/resources/extensions/gsd/tests/status-guards.test.ts +4 -0
  323. package/src/resources/extensions/gsd/tests/stop-backtrack.test.ts +216 -0
  324. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +1 -1
  325. package/src/resources/extensions/gsd/tests/workflow-logger-audit.test.ts +120 -0
  326. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +6 -6
  327. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -6
  328. package/src/resources/extensions/gsd/tools/complete-slice.ts +3 -6
  329. package/src/resources/extensions/gsd/tools/complete-task.ts +3 -6
  330. package/src/resources/extensions/gsd/tools/plan-milestone.ts +3 -6
  331. package/src/resources/extensions/gsd/tools/plan-slice.ts +3 -6
  332. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -3
  333. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +4 -6
  334. package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -3
  335. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -3
  336. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -3
  337. package/src/resources/extensions/gsd/tools/validate-milestone.ts +2 -3
  338. package/src/resources/extensions/gsd/triage-resolution.ts +151 -1
  339. package/src/resources/extensions/gsd/triage-ui.ts +12 -3
  340. package/src/resources/extensions/gsd/types.ts +1 -0
  341. package/src/resources/extensions/gsd/workflow-events.ts +2 -1
  342. package/src/resources/extensions/gsd/workflow-logger.ts +52 -5
  343. package/src/resources/extensions/gsd/workflow-migration.ts +14 -12
  344. package/src/resources/extensions/gsd/workflow-projections.ts +2 -2
  345. package/src/resources/extensions/gsd/workflow-reconcile.ts +2 -2
  346. package/src/resources/extensions/gsd/worktree-manager.ts +16 -14
  347. package/src/resources/extensions/shared/interview-ui.ts +3 -1
  348. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +144 -0
  349. package/src/resources/skills/btw/SKILL.md +42 -0
  350. package/dist/web/standalone/.next/static/chunks/app/page-62be3b5fa91e4c8f.js +0 -1
  351. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  352. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  353. /package/dist/web/standalone/.next/static/{DGvT_c5Vb7Wu3X-fEOVUU → ogyMN7M-3bGGuRY08L5HR}/_buildManifest.js +0 -0
  354. /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 { /* fall through */ }
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
- // DB not available fall through to filesystem
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
- // DB not available fall through to filesystem
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
- // DB not available fall through to filesystem
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
- // Non-fatal malformed task plan should not break prompt construction
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 { /* fall through */ }
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 { /* fall through */ }
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 { /* fall through */ }
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 { /* fall through */ }
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 { /* fall through */ }
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
- // Non-fatal captures module may not be available
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
- // Non-fatal captures module may not be available
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 { /* fall through */ }
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
- return "main"; // default fallback
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
- process.stderr.write(
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
- process.stderr.write(
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
- console.error(`[idle-watchdog] Unhandled error: ${message}`);
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
- console.error(`[hard-timeout] Unhandled error: ${message}`);
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
- if (process.env.GSD_DEBUG) console.error(`[gsd] memory extraction failed for ${unitType}/${unitId}:`, err);
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
- process.stderr.write(
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
- process.stderr.write(
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
  }