gsd-pi 2.60.0 → 2.61.0-dev.7aed0bf

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 (308) hide show
  1. package/dist/resources/extensions/ask-user-questions.js +7 -4
  2. package/dist/resources/extensions/gsd/auto/phases.js +15 -7
  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 +58 -9
  6. package/dist/resources/extensions/gsd/auto-post-unit.js +3 -2
  7. package/dist/resources/extensions/gsd/auto-prompts.js +36 -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 +2 -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 +7 -0
  20. package/dist/resources/extensions/gsd/bootstrap/system-context.js +11 -10
  21. package/dist/resources/extensions/gsd/commands/catalog.js +2 -0
  22. package/dist/resources/extensions/gsd/commands-codebase.js +48 -21
  23. package/dist/resources/extensions/gsd/commands-inspect.js +2 -1
  24. package/dist/resources/extensions/gsd/commands-maintenance.js +32 -19
  25. package/dist/resources/extensions/gsd/complexity-classifier.js +8 -4
  26. package/dist/resources/extensions/gsd/custom-verification.js +3 -2
  27. package/dist/resources/extensions/gsd/gsd-db.js +33 -13
  28. package/dist/resources/extensions/gsd/guided-flow.js +19 -9
  29. package/dist/resources/extensions/gsd/init-wizard.js +12 -0
  30. package/dist/resources/extensions/gsd/markdown-renderer.js +11 -9
  31. package/dist/resources/extensions/gsd/md-importer.js +5 -4
  32. package/dist/resources/extensions/gsd/milestone-actions.js +3 -2
  33. package/dist/resources/extensions/gsd/milestone-ids.js +2 -1
  34. package/dist/resources/extensions/gsd/model-router.js +156 -121
  35. package/dist/resources/extensions/gsd/parallel-merge.js +5 -3
  36. package/dist/resources/extensions/gsd/parallel-orchestrator.js +26 -14
  37. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  38. package/dist/resources/extensions/gsd/preferences-validation.js +45 -0
  39. package/dist/resources/extensions/gsd/preferences.js +15 -3
  40. package/dist/resources/extensions/gsd/prompt-loader.js +3 -2
  41. package/dist/resources/extensions/gsd/prompts/rethink.md +1 -1
  42. package/dist/resources/extensions/gsd/rule-registry.js +7 -6
  43. package/dist/resources/extensions/gsd/safe-fs.js +6 -8
  44. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  45. package/dist/resources/extensions/gsd/tools/complete-slice.js +3 -2
  46. package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
  47. package/dist/resources/extensions/gsd/tools/plan-milestone.js +3 -2
  48. package/dist/resources/extensions/gsd/tools/plan-slice.js +3 -2
  49. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -1
  50. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +4 -4
  51. package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -1
  52. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -1
  53. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -1
  54. package/dist/resources/extensions/gsd/tools/validate-milestone.js +2 -1
  55. package/dist/resources/extensions/gsd/triage-resolution.js +11 -4
  56. package/dist/resources/extensions/gsd/workflow-events.js +2 -1
  57. package/dist/resources/extensions/gsd/workflow-logger.js +37 -4
  58. package/dist/resources/extensions/gsd/workflow-migration.js +14 -12
  59. package/dist/resources/extensions/gsd/workflow-projections.js +2 -2
  60. package/dist/resources/extensions/gsd/workflow-reconcile.js +2 -2
  61. package/dist/resources/extensions/gsd/worktree-manager.js +26 -14
  62. package/dist/resources/extensions/shared/interview-ui.js +3 -1
  63. package/dist/web/standalone/.next/BUILD_ID +1 -1
  64. package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -17
  65. package/dist/web/standalone/.next/build-manifest.json +3 -3
  66. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  67. package/dist/web/standalone/.next/required-server-files.json +3 -3
  68. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  69. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  70. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  71. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  72. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  73. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  74. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  75. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  76. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  77. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  78. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  79. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  80. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  81. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  82. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  83. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  85. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  89. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  90. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  91. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  92. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  93. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  94. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  95. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  96. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  98. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  100. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  107. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  135. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  141. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  155. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  157. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  159. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  161. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/index.html +1 -1
  171. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  172. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  173. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  174. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  176. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/page.js +2 -2
  178. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -17
  180. package/dist/web/standalone/.next/server/chunks/2229.js +1 -1
  181. package/dist/web/standalone/.next/server/chunks/7471.js +3 -3
  182. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/middleware.js +2 -2
  184. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  186. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  187. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  188. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  189. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  190. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  191. package/dist/web/standalone/.next/static/chunks/app/page-0c485498795110d6.js +1 -0
  192. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  193. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  194. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  195. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  196. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  197. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  198. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  199. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  200. package/dist/web/standalone/server.js +1 -1
  201. package/package.json +1 -1
  202. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  203. package/packages/pi-coding-agent/dist/core/extensions/loader.js +5 -0
  204. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  205. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +2 -1
  206. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  207. package/packages/pi-coding-agent/dist/core/extensions/runner.js +16 -0
  208. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  209. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +26 -0
  210. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  211. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  212. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts.map +1 -1
  213. package/packages/pi-coding-agent/dist/core/lsp/config.js +6 -1
  214. package/packages/pi-coding-agent/dist/core/lsp/config.js.map +1 -1
  215. package/packages/pi-coding-agent/dist/core/lsp/defaults.json +2 -2
  216. package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.d.ts +2 -0
  217. package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.d.ts.map +1 -0
  218. package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.js +47 -0
  219. package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.js.map +1 -0
  220. package/packages/pi-coding-agent/package.json +1 -1
  221. package/packages/pi-coding-agent/src/core/extensions/loader.ts +6 -0
  222. package/packages/pi-coding-agent/src/core/extensions/runner.ts +19 -0
  223. package/packages/pi-coding-agent/src/core/extensions/types.ts +26 -0
  224. package/packages/pi-coding-agent/src/core/lsp/config.ts +7 -1
  225. package/packages/pi-coding-agent/src/core/lsp/defaults.json +2 -2
  226. package/packages/pi-coding-agent/src/core/lsp/lsp-legacy-alias.test.ts +70 -0
  227. package/pkg/package.json +1 -1
  228. package/src/resources/extensions/ask-user-questions.ts +7 -3
  229. package/src/resources/extensions/gsd/auto/phases.ts +17 -7
  230. package/src/resources/extensions/gsd/auto-dashboard.ts +22 -8
  231. package/src/resources/extensions/gsd/auto-dispatch.ts +7 -3
  232. package/src/resources/extensions/gsd/auto-model-selection.ts +77 -15
  233. package/src/resources/extensions/gsd/auto-post-unit.ts +4 -4
  234. package/src/resources/extensions/gsd/auto-prompts.ts +37 -20
  235. package/src/resources/extensions/gsd/auto-recovery.ts +38 -18
  236. package/src/resources/extensions/gsd/auto-start.ts +10 -9
  237. package/src/resources/extensions/gsd/auto-timers.ts +12 -5
  238. package/src/resources/extensions/gsd/auto-unit-closeout.ts +6 -2
  239. package/src/resources/extensions/gsd/auto-verification.ts +3 -6
  240. package/src/resources/extensions/gsd/auto-worktree.ts +121 -55
  241. package/src/resources/extensions/gsd/auto.ts +40 -17
  242. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +4 -3
  243. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +2 -2
  244. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +4 -16
  245. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +2 -1
  246. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +8 -0
  247. package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -10
  248. package/src/resources/extensions/gsd/commands/catalog.ts +2 -0
  249. package/src/resources/extensions/gsd/commands-codebase.ts +52 -20
  250. package/src/resources/extensions/gsd/commands-inspect.ts +2 -1
  251. package/src/resources/extensions/gsd/commands-maintenance.ts +28 -19
  252. package/src/resources/extensions/gsd/complexity-classifier.ts +9 -4
  253. package/src/resources/extensions/gsd/custom-verification.ts +3 -2
  254. package/src/resources/extensions/gsd/gsd-db.ts +12 -14
  255. package/src/resources/extensions/gsd/guided-flow.ts +9 -8
  256. package/src/resources/extensions/gsd/init-wizard.ts +12 -0
  257. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -17
  258. package/src/resources/extensions/gsd/md-importer.ts +5 -4
  259. package/src/resources/extensions/gsd/milestone-actions.ts +3 -2
  260. package/src/resources/extensions/gsd/milestone-ids.ts +2 -1
  261. package/src/resources/extensions/gsd/model-router.ts +199 -173
  262. package/src/resources/extensions/gsd/parallel-merge.ts +5 -3
  263. package/src/resources/extensions/gsd/parallel-orchestrator.ts +18 -14
  264. package/src/resources/extensions/gsd/preferences-types.ts +13 -0
  265. package/src/resources/extensions/gsd/preferences-validation.ts +45 -0
  266. package/src/resources/extensions/gsd/preferences.ts +16 -3
  267. package/src/resources/extensions/gsd/prompt-loader.ts +3 -2
  268. package/src/resources/extensions/gsd/prompts/rethink.md +1 -1
  269. package/src/resources/extensions/gsd/rule-registry.ts +7 -6
  270. package/src/resources/extensions/gsd/safe-fs.ts +6 -5
  271. package/src/resources/extensions/gsd/tests/capability-router.test.ts +347 -0
  272. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +63 -0
  273. package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +27 -2
  274. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +4 -4
  275. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +1188 -0
  276. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +841 -0
  277. package/src/resources/extensions/gsd/tests/model-router.test.ts +403 -3
  278. package/src/resources/extensions/gsd/tests/preferences.test.ts +62 -0
  279. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +21 -0
  280. package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +284 -0
  281. package/src/resources/extensions/gsd/tests/workflow-logger-audit.test.ts +120 -0
  282. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +6 -6
  283. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -6
  284. package/src/resources/extensions/gsd/tools/complete-slice.ts +3 -6
  285. package/src/resources/extensions/gsd/tools/complete-task.ts +3 -6
  286. package/src/resources/extensions/gsd/tools/plan-milestone.ts +3 -6
  287. package/src/resources/extensions/gsd/tools/plan-slice.ts +3 -6
  288. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -3
  289. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +4 -6
  290. package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -3
  291. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -3
  292. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -3
  293. package/src/resources/extensions/gsd/tools/validate-milestone.ts +2 -3
  294. package/src/resources/extensions/gsd/triage-resolution.ts +11 -4
  295. package/src/resources/extensions/gsd/types.ts +1 -0
  296. package/src/resources/extensions/gsd/workflow-events.ts +2 -1
  297. package/src/resources/extensions/gsd/workflow-logger.ts +52 -5
  298. package/src/resources/extensions/gsd/workflow-migration.ts +14 -12
  299. package/src/resources/extensions/gsd/workflow-projections.ts +2 -2
  300. package/src/resources/extensions/gsd/workflow-reconcile.ts +2 -2
  301. package/src/resources/extensions/gsd/worktree-manager.ts +16 -14
  302. package/src/resources/extensions/shared/interview-ui.ts +3 -1
  303. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +144 -0
  304. package/dist/web/standalone/.next/static/chunks/app/page-62be3b5fa91e4c8f.js +0 -1
  305. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  306. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  307. /package/dist/web/standalone/.next/static/{qdTGLxuqgx_Md-LpUsbMx → b7FOoMHaUb3FPoLNbxar4}/_buildManifest.js +0 -0
  308. /package/dist/web/standalone/.next/static/{qdTGLxuqgx_Md-LpUsbMx → b7FOoMHaUb3FPoLNbxar4}/_ssgManifest.js +0 -0
@@ -27,6 +27,7 @@ import { computeBudgets, resolveExecutorContextWindow, truncateAtSectionBoundary
27
27
  import { getPendingGates } from "./gsd-db.js";
28
28
  import { formatDecisionsCompact, formatRequirementsCompact } from "./structured-data-formatter.js";
29
29
  import { readPhaseAnchor, formatAnchorForPrompt } from "./phase-anchor.js";
30
+ import { logWarning } from "./workflow-logger.js";
30
31
 
31
32
  // ─── Preamble Cap ─────────────────────────────────────────────────────────────
32
33
 
@@ -49,7 +50,8 @@ function formatExecutorConstraints(): string {
49
50
  try {
50
51
  const prefs = loadEffectiveGSDPreferences();
51
52
  windowTokens = resolveExecutorContextWindow(undefined, prefs?.preferences);
52
- } catch {
53
+ } catch (e) {
54
+ logWarning("prompt", `resolveExecutorContextWindow failed: ${(e as Error).message}`);
53
55
  windowTokens = 200_000; // safe default
54
56
  }
55
57
  const budgets = computeBudgets(windowTokens);
@@ -198,7 +200,9 @@ export async function inlineDependencySummaries(
198
200
  }
199
201
  // If slice not found in DB, fall through to file-based parsing
200
202
  }
201
- } catch { /* fall through */ }
203
+ } catch (err) {
204
+ logWarning("prompt", `inlineDependencySummaries DB lookup failed: ${err instanceof Error ? err.message : String(err)}`);
205
+ }
202
206
 
203
207
  // If DB didn't provide depends, fall back to roadmap parsing
204
208
  if (!depends) {
@@ -276,8 +280,8 @@ export async function inlineDecisionsFromDb(
276
280
  return `### Decisions\nSource: \`.gsd/DECISIONS.md\`\n\n${formatted}`;
277
281
  }
278
282
  }
279
- } catch {
280
- // DB not available fall through to filesystem
283
+ } catch (err) {
284
+ logWarning("prompt", `inlineDecisionsFromDb failed: ${err instanceof Error ? err.message : String(err)}`);
281
285
  }
282
286
  return inlineGsdRootFile(base, "decisions.md", "Decisions");
283
287
  }
@@ -303,8 +307,8 @@ export async function inlineRequirementsFromDb(
303
307
  return `### Requirements\nSource: \`.gsd/REQUIREMENTS.md\`\n\n${formatted}`;
304
308
  }
305
309
  }
306
- } catch {
307
- // DB not available fall through to filesystem
310
+ } catch (err) {
311
+ logWarning("prompt", `inlineRequirementsFromDb failed: ${err instanceof Error ? err.message : String(err)}`);
308
312
  }
309
313
  return inlineGsdRootFile(base, "requirements.md", "Requirements");
310
314
  }
@@ -325,8 +329,8 @@ export async function inlineProjectFromDb(
325
329
  return `### Project\nSource: \`.gsd/PROJECT.md\`\n\n${content}`;
326
330
  }
327
331
  }
328
- } catch {
329
- // DB not available fall through to filesystem
332
+ } catch (err) {
333
+ logWarning("prompt", `inlineProjectFromDb failed: ${err instanceof Error ? err.message : String(err)}`);
330
334
  }
331
335
  return inlineGsdRootFile(base, "project.md", "Project");
332
336
  }
@@ -486,8 +490,8 @@ export function buildSkillActivationBlock(params: {
486
490
  for (const skillName of taskPlan.frontmatter.skills_used) {
487
491
  matched.add(normalizeSkillReference(skillName));
488
492
  }
489
- } catch {
490
- // 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)}`);
491
495
  }
492
496
  }
493
497
 
@@ -736,7 +740,9 @@ export async function checkNeedsReassessment(
736
740
  return { sliceId: lastCompleted };
737
741
  }
738
742
  }
739
- } catch { /* fall through */ }
743
+ } catch (err) {
744
+ logWarning("prompt", `checkNeedsReassessment DB lookup failed: ${err instanceof Error ? err.message : String(err)}`);
745
+ }
740
746
 
741
747
  // File-based fallback using roadmap checkboxes
742
748
  const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
@@ -802,7 +808,9 @@ export async function checkNeedsRunUat(
802
808
  return { sliceId: sid, uatType };
803
809
  }
804
810
  }
805
- } catch { /* fall through */ }
811
+ } catch (err) {
812
+ logWarning("prompt", `checkNeedsRunUat DB lookup failed: ${err instanceof Error ? err.message : String(err)}`);
813
+ }
806
814
 
807
815
  // File-based fallback using roadmap checkboxes
808
816
  if (!prefs?.uat_dispatch) return null;
@@ -1312,7 +1320,9 @@ export async function buildCompleteMilestonePrompt(
1312
1320
  if (isDbAvailable()) {
1313
1321
  sliceIds = getMilestoneSlices(mid).map(s => s.id);
1314
1322
  }
1315
- } catch { /* fall through */ }
1323
+ } catch (err) {
1324
+ logWarning("prompt", `buildCompleteMilestonePrompt DB lookup failed: ${err instanceof Error ? err.message : String(err)}`);
1325
+ }
1316
1326
  // File-based fallback: parse roadmap for slice IDs when DB has no data
1317
1327
  if (sliceIds.length === 0 && roadmapPath) {
1318
1328
  const roadmapContent = await loadFile(roadmapPath);
@@ -1393,7 +1403,9 @@ export async function buildValidateMilestonePrompt(
1393
1403
  }
1394
1404
  }
1395
1405
  }
1396
- } catch { /* fall through */ }
1406
+ } catch (err) {
1407
+ logWarning("prompt", `buildValidateMilestonePrompt verification classes lookup failed: ${err instanceof Error ? err.message : String(err)}`);
1408
+ }
1397
1409
 
1398
1410
  // Inline all slice summaries and UAT results
1399
1411
  let valSliceIds: string[] = [];
@@ -1402,7 +1414,9 @@ export async function buildValidateMilestonePrompt(
1402
1414
  if (isDbAvailable()) {
1403
1415
  valSliceIds = getMilestoneSlices(mid).map(s => s.id);
1404
1416
  }
1405
- } catch { /* fall through */ }
1417
+ } catch (err) {
1418
+ logWarning("prompt", `buildValidateMilestonePrompt slice IDs lookup failed: ${err instanceof Error ? err.message : String(err)}`);
1419
+ }
1406
1420
  // File-based fallback: parse roadmap for slice IDs when DB has no data
1407
1421
  if (valSliceIds.length === 0 && roadmapPath) {
1408
1422
  const roadmapContent = await loadFile(roadmapPath);
@@ -1541,8 +1555,8 @@ export async function buildReplanSlicePrompt(
1541
1555
  `- **${c.id}**: "${c.text}" — ${c.rationale ?? "no rationale"}`
1542
1556
  ).join("\n");
1543
1557
  }
1544
- } catch {
1545
- // Non-fatal captures module may not be available
1558
+ } catch (err) {
1559
+ logWarning("prompt", `loadReplanCaptures failed: ${err instanceof Error ? err.message : String(err)}`);
1546
1560
  }
1547
1561
 
1548
1562
  return loadPrompt("replan-slice", {
@@ -1642,8 +1656,8 @@ export async function buildReassessRoadmapPrompt(
1642
1656
  `- **${c.id}**: "${c.text}" — ${c.rationale ?? "deferred during triage"}`
1643
1657
  ).join("\n");
1644
1658
  }
1645
- } catch {
1646
- // Non-fatal captures module may not be available
1659
+ } catch (err) {
1660
+ logWarning("prompt", `loadDeferredCaptures failed: ${err instanceof Error ? err.message : String(err)}`);
1647
1661
  }
1648
1662
 
1649
1663
  const reassessCommitInstruction = "Do not commit — .gsd/ planning docs are managed externally and not tracked in git.";
@@ -1859,7 +1873,9 @@ export async function buildRewriteDocsPrompt(
1859
1873
  .filter(t => t.status !== "complete" && t.status !== "done")
1860
1874
  .map(t => ({ id: t.id }));
1861
1875
  }
1862
- } catch { /* fall through */ }
1876
+ } catch (err) {
1877
+ logWarning("prompt", `buildRewriteDocsPrompt DB task lookup failed: ${err instanceof Error ? err.message : String(err)}`);
1878
+ }
1863
1879
 
1864
1880
  if (!incompleteTasks) {
1865
1881
  // DB unavailable — no task data to inline
@@ -1911,3 +1927,4 @@ export async function buildRewriteDocsPrompt(
1911
1927
  overridesPath: relGsdRootFile("OVERRIDES"),
1912
1928
  });
1913
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
  }