gsd-pi 2.44.0 → 2.45.0-dev.1afbdaa

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 (608) hide show
  1. package/README.md +30 -12
  2. package/dist/help-text.js +1 -1
  3. package/dist/loader.js +34 -0
  4. package/dist/resources/extensions/gsd/activity-log.js +7 -0
  5. package/dist/resources/extensions/gsd/auto/infra-errors.js +3 -0
  6. package/dist/resources/extensions/gsd/auto/phases.js +63 -77
  7. package/dist/resources/extensions/gsd/auto/run-unit.js +6 -3
  8. package/dist/resources/extensions/gsd/auto/session.js +0 -11
  9. package/dist/resources/extensions/gsd/auto-artifact-paths.js +112 -0
  10. package/dist/resources/extensions/gsd/auto-post-unit.js +25 -96
  11. package/dist/resources/extensions/gsd/auto-prompts.js +24 -1
  12. package/dist/resources/extensions/gsd/auto-start.js +33 -5
  13. package/dist/resources/extensions/gsd/auto-timers.js +57 -3
  14. package/dist/resources/extensions/gsd/auto-worktree-sync.js +4 -0
  15. package/dist/resources/extensions/gsd/auto-worktree.js +14 -10
  16. package/dist/resources/extensions/gsd/auto.js +42 -60
  17. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +170 -11
  18. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +18 -0
  19. package/dist/resources/extensions/gsd/bootstrap/system-context.js +46 -12
  20. package/dist/resources/extensions/gsd/commands/catalog.js +7 -1
  21. package/dist/resources/extensions/gsd/commands/context.js +0 -4
  22. package/dist/resources/extensions/gsd/commands/handlers/core.js +2 -0
  23. package/dist/resources/extensions/gsd/commands/handlers/ops.js +10 -0
  24. package/dist/resources/extensions/gsd/commands/handlers/parallel.js +1 -1
  25. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
  26. package/dist/resources/extensions/gsd/commands-mcp-status.js +187 -0
  27. package/dist/resources/extensions/gsd/crash-recovery.js +2 -4
  28. package/dist/resources/extensions/gsd/dashboard-overlay.js +0 -44
  29. package/dist/resources/extensions/gsd/db-writer.js +40 -22
  30. package/dist/resources/extensions/gsd/doctor-checks.js +167 -2
  31. package/dist/resources/extensions/gsd/doctor.js +13 -3
  32. package/dist/resources/extensions/gsd/git-service.js +8 -3
  33. package/dist/resources/extensions/gsd/gsd-db.js +28 -4
  34. package/dist/resources/extensions/gsd/guided-flow.js +1 -2
  35. package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
  36. package/dist/resources/extensions/gsd/parallel-merge.js +1 -1
  37. package/dist/resources/extensions/gsd/parallel-orchestrator.js +5 -18
  38. package/dist/resources/extensions/gsd/preferences-types.js +2 -2
  39. package/dist/resources/extensions/gsd/preferences.js +17 -5
  40. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +21 -10
  41. package/dist/resources/extensions/gsd/prompts/complete-slice.md +10 -23
  42. package/dist/resources/extensions/gsd/prompts/discuss.md +2 -2
  43. package/dist/resources/extensions/gsd/prompts/execute-task.md +5 -15
  44. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  45. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  46. package/dist/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
  47. package/dist/resources/extensions/gsd/prompts/guided-research-slice.md +1 -1
  48. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  49. package/dist/resources/extensions/gsd/prompts/plan-slice.md +5 -3
  50. package/dist/resources/extensions/gsd/prompts/queue.md +2 -2
  51. package/dist/resources/extensions/gsd/prompts/quick-task.md +2 -0
  52. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  53. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
  54. package/dist/resources/extensions/gsd/prompts/replan-slice.md +3 -14
  55. package/dist/resources/extensions/gsd/prompts/research-slice.md +3 -3
  56. package/dist/resources/extensions/gsd/prompts/rethink.md +83 -0
  57. package/dist/resources/extensions/gsd/prompts/system.md +1 -1
  58. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
  59. package/dist/resources/extensions/gsd/provider-error-pause.js +7 -0
  60. package/dist/resources/extensions/gsd/repo-identity.js +45 -7
  61. package/dist/resources/extensions/gsd/rethink.js +115 -0
  62. package/dist/resources/extensions/gsd/session-lock.js +1 -3
  63. package/dist/resources/extensions/gsd/state.js +48 -3
  64. package/dist/resources/extensions/gsd/sync-lock.js +89 -0
  65. package/dist/resources/extensions/gsd/tools/complete-milestone.js +61 -11
  66. package/dist/resources/extensions/gsd/tools/complete-slice.js +56 -11
  67. package/dist/resources/extensions/gsd/tools/complete-task.js +50 -2
  68. package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -1
  69. package/dist/resources/extensions/gsd/tools/plan-slice.js +31 -1
  70. package/dist/resources/extensions/gsd/tools/plan-task.js +28 -1
  71. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +32 -2
  72. package/dist/resources/extensions/gsd/tools/reopen-slice.js +86 -0
  73. package/dist/resources/extensions/gsd/tools/reopen-task.js +90 -0
  74. package/dist/resources/extensions/gsd/tools/replan-slice.js +34 -2
  75. package/dist/resources/extensions/gsd/tools/validate-milestone.js +88 -0
  76. package/dist/resources/extensions/gsd/unit-ownership.js +85 -0
  77. package/dist/resources/extensions/gsd/workflow-events.js +102 -0
  78. package/dist/resources/extensions/gsd/workflow-logger.js +193 -0
  79. package/dist/resources/extensions/gsd/workflow-manifest.js +244 -0
  80. package/dist/resources/extensions/gsd/workflow-migration.js +280 -0
  81. package/dist/resources/extensions/gsd/workflow-projections.js +373 -0
  82. package/dist/resources/extensions/gsd/workflow-reconcile.js +411 -0
  83. package/dist/resources/extensions/gsd/worktree-manager.js +34 -3
  84. package/dist/resources/extensions/gsd/worktree-resolver.js +43 -0
  85. package/dist/resources/extensions/gsd/write-intercept.js +84 -0
  86. package/dist/resources/extensions/mcp-client/index.js +14 -0
  87. package/dist/resources/extensions/voice/index.js +11 -16
  88. package/dist/resources/extensions/voice/linux-ready.js +67 -0
  89. package/dist/web/standalone/.next/BUILD_ID +1 -1
  90. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  91. package/dist/web/standalone/.next/build-manifest.json +4 -4
  92. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  93. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  94. package/dist/web/standalone/.next/required-server-files.json +3 -3
  95. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  96. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  97. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  98. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  100. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  104. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  106. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  108. package/dist/web/standalone/.next/server/app/_not-found.rsc +5 -5
  109. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +5 -5
  110. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  112. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  115. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  122. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  160. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  166. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  180. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  182. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  184. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  186. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/index.html +1 -1
  196. package/dist/web/standalone/.next/server/app/index.rsc +6 -6
  197. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  198. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +6 -6
  199. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  200. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  201. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  202. package/dist/web/standalone/.next/server/app/page.js +2 -2
  203. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  205. package/dist/web/standalone/.next/server/chunks/229.js +1 -1
  206. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  207. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/middleware.js +2 -2
  210. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  212. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  213. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  214. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  215. package/dist/web/standalone/.next/static/chunks/4024.11ca5c01938e5948.js +9 -0
  216. package/dist/web/standalone/.next/static/chunks/{3721.bf31263de6d5fa46.js → 485.243af25f0cdf50d6.js} +2 -2
  217. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  218. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  219. package/dist/web/standalone/.next/static/chunks/app/page-6654a8cca61a3d1c.js +1 -0
  220. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  221. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  222. package/dist/web/standalone/.next/static/chunks/webpack-0a4cd455ec4197d2.js +1 -0
  223. package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +1 -0
  224. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  225. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  226. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  227. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  228. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  229. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  230. package/dist/web/standalone/server.js +1 -1
  231. package/package.json +2 -1
  232. package/packages/native/dist/stream-process/index.js +2 -2
  233. package/packages/native/src/__tests__/stream-process.test.mjs +34 -0
  234. package/packages/native/src/stream-process/index.ts +2 -2
  235. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +3 -1
  236. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  237. package/packages/pi-coding-agent/dist/core/auth-storage.js +15 -1
  238. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  239. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
  240. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  241. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -1
  242. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +2 -0
  243. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  244. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +24 -26
  245. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  246. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +2 -1
  247. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  248. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  249. package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
  250. package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
  251. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +4 -0
  252. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -1
  253. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +10 -5
  254. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -1
  255. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.d.ts +2 -0
  256. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.d.ts.map +1 -0
  257. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.js +185 -0
  258. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.js.map +1 -0
  259. package/packages/pi-coding-agent/dist/core/local-model-check.d.ts +15 -0
  260. package/packages/pi-coding-agent/dist/core/local-model-check.d.ts.map +1 -0
  261. package/packages/pi-coding-agent/dist/core/local-model-check.js +41 -0
  262. package/packages/pi-coding-agent/dist/core/local-model-check.js.map +1 -0
  263. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +239 -10
  264. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  265. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +13 -1
  266. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  267. package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
  268. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  269. package/packages/pi-coding-agent/dist/core/package-commands.test.js +206 -195
  270. package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -1
  271. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +34 -44
  272. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
  273. package/packages/pi-coding-agent/dist/core/session-manager.test.js +30 -34
  274. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
  275. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  276. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  277. package/packages/pi-coding-agent/dist/core/settings-manager.js +6 -0
  278. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  279. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
  280. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
  281. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  282. package/packages/pi-coding-agent/dist/main.js +17 -0
  283. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  284. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts +2 -0
  285. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts.map +1 -0
  286. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js +32 -0
  287. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js.map +1 -0
  288. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +3 -1
  289. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  290. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +8 -1
  291. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  292. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  293. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  294. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +12 -0
  295. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  296. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts +15 -0
  297. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts.map +1 -0
  298. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js +40 -0
  299. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js.map +1 -0
  300. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  301. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +4 -1
  302. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  303. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +5 -2
  304. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  305. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +13 -2
  306. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  307. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  308. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +17 -8
  309. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  310. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  311. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +7 -3
  312. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  313. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
  314. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
  315. package/packages/pi-coding-agent/package.json +1 -1
  316. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
  317. package/packages/pi-coding-agent/src/core/auth-storage.ts +15 -1
  318. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +2 -0
  319. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
  320. package/packages/pi-coding-agent/src/core/extensions/types.ts +2 -1
  321. package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
  322. package/packages/pi-coding-agent/src/core/lifecycle-hooks.test.ts +227 -0
  323. package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +11 -5
  324. package/packages/pi-coding-agent/src/core/local-model-check.ts +45 -0
  325. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +297 -11
  326. package/packages/pi-coding-agent/src/core/model-registry.ts +51 -4
  327. package/packages/pi-coding-agent/src/core/package-commands.test.ts +227 -205
  328. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
  329. package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
  330. package/packages/pi-coding-agent/src/core/settings-manager.ts +9 -0
  331. package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
  332. package/packages/pi-coding-agent/src/main.ts +19 -0
  333. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/timestamp.test.ts +38 -0
  334. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +10 -0
  335. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
  336. package/packages/pi-coding-agent/src/modes/interactive/components/timestamp.ts +48 -0
  337. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +3 -1
  338. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +18 -3
  339. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +16 -7
  340. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +8 -1
  341. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
  342. package/pkg/package.json +1 -1
  343. package/src/resources/extensions/gsd/activity-log.ts +1 -0
  344. package/src/resources/extensions/gsd/auto/infra-errors.ts +3 -0
  345. package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -19
  346. package/src/resources/extensions/gsd/auto/phases.ts +69 -91
  347. package/src/resources/extensions/gsd/auto/run-unit.ts +6 -3
  348. package/src/resources/extensions/gsd/auto/session.ts +0 -18
  349. package/src/resources/extensions/gsd/auto-artifact-paths.ts +131 -0
  350. package/src/resources/extensions/gsd/auto-dashboard.ts +0 -1
  351. package/src/resources/extensions/gsd/auto-post-unit.ts +25 -106
  352. package/src/resources/extensions/gsd/auto-prompts.ts +24 -1
  353. package/src/resources/extensions/gsd/auto-start.ts +40 -5
  354. package/src/resources/extensions/gsd/auto-timers.ts +64 -3
  355. package/src/resources/extensions/gsd/auto-worktree-sync.ts +5 -0
  356. package/src/resources/extensions/gsd/auto-worktree.ts +17 -11
  357. package/src/resources/extensions/gsd/auto.ts +44 -86
  358. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +162 -11
  359. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
  360. package/src/resources/extensions/gsd/bootstrap/system-context.ts +48 -11
  361. package/src/resources/extensions/gsd/commands/catalog.ts +7 -1
  362. package/src/resources/extensions/gsd/commands/context.ts +0 -5
  363. package/src/resources/extensions/gsd/commands/handlers/core.ts +2 -0
  364. package/src/resources/extensions/gsd/commands/handlers/ops.ts +10 -0
  365. package/src/resources/extensions/gsd/commands/handlers/parallel.ts +1 -1
  366. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
  367. package/src/resources/extensions/gsd/commands-mcp-status.ts +247 -0
  368. package/src/resources/extensions/gsd/crash-recovery.ts +1 -5
  369. package/src/resources/extensions/gsd/dashboard-overlay.ts +0 -50
  370. package/src/resources/extensions/gsd/db-writer.ts +41 -27
  371. package/src/resources/extensions/gsd/doctor-checks.ts +180 -2
  372. package/src/resources/extensions/gsd/doctor-types.ts +7 -1
  373. package/src/resources/extensions/gsd/doctor.ts +13 -4
  374. package/src/resources/extensions/gsd/git-service.ts +6 -2
  375. package/src/resources/extensions/gsd/gsd-db.ts +32 -4
  376. package/src/resources/extensions/gsd/guided-flow.ts +1 -2
  377. package/src/resources/extensions/gsd/journal.ts +6 -1
  378. package/src/resources/extensions/gsd/markdown-renderer.ts +1 -1
  379. package/src/resources/extensions/gsd/parallel-merge.ts +1 -1
  380. package/src/resources/extensions/gsd/parallel-orchestrator.ts +5 -21
  381. package/src/resources/extensions/gsd/preferences-types.ts +2 -2
  382. package/src/resources/extensions/gsd/preferences.ts +18 -4
  383. package/src/resources/extensions/gsd/prompts/complete-milestone.md +21 -10
  384. package/src/resources/extensions/gsd/prompts/complete-slice.md +10 -23
  385. package/src/resources/extensions/gsd/prompts/discuss.md +2 -2
  386. package/src/resources/extensions/gsd/prompts/execute-task.md +5 -15
  387. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  388. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  389. package/src/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
  390. package/src/resources/extensions/gsd/prompts/guided-research-slice.md +1 -1
  391. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  392. package/src/resources/extensions/gsd/prompts/plan-slice.md +5 -3
  393. package/src/resources/extensions/gsd/prompts/queue.md +2 -2
  394. package/src/resources/extensions/gsd/prompts/quick-task.md +2 -0
  395. package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  396. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
  397. package/src/resources/extensions/gsd/prompts/replan-slice.md +3 -14
  398. package/src/resources/extensions/gsd/prompts/research-slice.md +3 -3
  399. package/src/resources/extensions/gsd/prompts/rethink.md +83 -0
  400. package/src/resources/extensions/gsd/prompts/system.md +1 -1
  401. package/src/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
  402. package/src/resources/extensions/gsd/provider-error-pause.ts +9 -0
  403. package/src/resources/extensions/gsd/repo-identity.ts +46 -7
  404. package/src/resources/extensions/gsd/rethink.ts +154 -0
  405. package/src/resources/extensions/gsd/session-lock.ts +0 -4
  406. package/src/resources/extensions/gsd/state.ts +49 -1
  407. package/src/resources/extensions/gsd/sync-lock.ts +94 -0
  408. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
  409. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +19 -29
  410. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +6 -10
  411. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
  412. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +88 -0
  413. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
  414. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +465 -523
  415. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
  416. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
  417. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +533 -656
  418. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
  419. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
  420. package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
  421. package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
  422. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
  423. package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
  424. package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
  425. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +134 -59
  426. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +15 -14
  427. package/src/resources/extensions/gsd/tests/complete-task.test.ts +27 -12
  428. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +114 -0
  429. package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
  430. package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
  431. package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
  432. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +26 -40
  433. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -3
  434. package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
  435. package/src/resources/extensions/gsd/tests/db-writer.test.ts +465 -416
  436. package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
  437. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +68 -83
  438. package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +121 -0
  439. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +210 -181
  440. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
  441. package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
  442. package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
  443. package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
  444. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +164 -180
  445. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
  446. package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
  447. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +27 -29
  448. package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
  449. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +54 -75
  450. package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +21 -32
  451. package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
  452. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -44
  453. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
  454. package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
  455. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +54 -60
  456. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
  457. package/src/resources/extensions/gsd/tests/doctor.test.ts +104 -134
  458. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
  459. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +120 -0
  460. package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
  461. package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
  462. package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
  463. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +30 -42
  464. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +198 -206
  465. package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
  466. package/src/resources/extensions/gsd/tests/git-service.test.ts +285 -388
  467. package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
  468. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
  469. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
  470. package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
  471. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +81 -103
  472. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
  473. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
  474. package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
  475. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +82 -103
  476. package/src/resources/extensions/gsd/tests/infra-error.test.ts +20 -2
  477. package/src/resources/extensions/gsd/tests/inherited-repo-home-dir.test.ts +121 -0
  478. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
  479. package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
  480. package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
  481. package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
  482. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +33 -42
  483. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
  484. package/src/resources/extensions/gsd/tests/knowledge.test.ts +89 -0
  485. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +150 -194
  486. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +103 -0
  487. package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
  488. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
  489. package/src/resources/extensions/gsd/tests/memory-store.test.ts +81 -94
  490. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +66 -0
  491. package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
  492. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +83 -93
  493. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
  494. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
  495. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
  496. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +87 -96
  497. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +125 -164
  498. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +8 -9
  499. package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
  500. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +75 -37
  501. package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
  502. package/src/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +0 -1
  503. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +39 -53
  504. package/src/resources/extensions/gsd/tests/parallel-merge.test.ts +7 -8
  505. package/src/resources/extensions/gsd/tests/parallel-orchestration.test.ts +20 -24
  506. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +24 -29
  507. package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
  508. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
  509. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
  510. package/src/resources/extensions/gsd/tests/parsers.test.ts +546 -611
  511. package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
  512. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +9 -6
  513. package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +171 -0
  514. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
  515. package/src/resources/extensions/gsd/tests/preferences.test.ts +34 -9
  516. package/src/resources/extensions/gsd/tests/projection-regression.test.ts +174 -0
  517. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +26 -21
  518. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
  519. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
  520. package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
  521. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
  522. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
  523. package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
  524. package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
  525. package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +176 -0
  526. package/src/resources/extensions/gsd/tests/reopen-slice.test.ts +155 -0
  527. package/src/resources/extensions/gsd/tests/reopen-task.test.ts +165 -0
  528. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +73 -80
  529. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
  530. package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
  531. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
  532. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
  533. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
  534. package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
  535. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
  536. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -47
  537. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +19 -26
  538. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
  539. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
  540. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +67 -0
  541. package/src/resources/extensions/gsd/tests/stop-auto-remote.test.ts +2 -3
  542. package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +108 -0
  543. package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
  544. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +122 -0
  545. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +49 -0
  546. package/src/resources/extensions/gsd/tests/token-savings.test.ts +54 -56
  547. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +23 -25
  548. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +10 -11
  549. package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
  550. package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +175 -0
  551. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
  552. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -22
  553. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
  554. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
  555. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
  556. package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
  557. package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
  558. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +205 -0
  559. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +275 -0
  560. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +186 -0
  561. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +171 -0
  562. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +50 -52
  563. package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
  564. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
  565. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
  566. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
  567. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
  568. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
  569. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +220 -0
  570. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +65 -0
  571. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
  572. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
  573. package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
  574. package/src/resources/extensions/gsd/tests/write-intercept.test.ts +76 -0
  575. package/src/resources/extensions/gsd/tools/complete-milestone.ts +74 -11
  576. package/src/resources/extensions/gsd/tools/complete-slice.ts +68 -11
  577. package/src/resources/extensions/gsd/tools/complete-task.ts +63 -1
  578. package/src/resources/extensions/gsd/tools/plan-milestone.ts +45 -0
  579. package/src/resources/extensions/gsd/tools/plan-slice.ts +40 -0
  580. package/src/resources/extensions/gsd/tools/plan-task.ts +37 -1
  581. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +39 -1
  582. package/src/resources/extensions/gsd/tools/reopen-slice.ts +125 -0
  583. package/src/resources/extensions/gsd/tools/reopen-task.ts +129 -0
  584. package/src/resources/extensions/gsd/tools/replan-slice.ts +41 -1
  585. package/src/resources/extensions/gsd/tools/validate-milestone.ts +127 -0
  586. package/src/resources/extensions/gsd/types.ts +8 -0
  587. package/src/resources/extensions/gsd/unit-ownership.ts +104 -0
  588. package/src/resources/extensions/gsd/workflow-events.ts +154 -0
  589. package/src/resources/extensions/gsd/workflow-logger.ts +243 -0
  590. package/src/resources/extensions/gsd/workflow-manifest.ts +334 -0
  591. package/src/resources/extensions/gsd/workflow-migration.ts +345 -0
  592. package/src/resources/extensions/gsd/workflow-projections.ts +425 -0
  593. package/src/resources/extensions/gsd/workflow-reconcile.ts +503 -0
  594. package/src/resources/extensions/gsd/worktree-manager.ts +41 -5
  595. package/src/resources/extensions/gsd/worktree-resolver.ts +44 -0
  596. package/src/resources/extensions/gsd/write-intercept.ts +90 -0
  597. package/src/resources/extensions/mcp-client/index.ts +20 -0
  598. package/src/resources/extensions/voice/index.ts +11 -21
  599. package/src/resources/extensions/voice/linux-ready.ts +87 -0
  600. package/src/resources/extensions/voice/tests/linux-ready.test.ts +124 -0
  601. package/dist/web/standalone/.next/static/chunks/4024.0de81b543b28b9fe.js +0 -9
  602. package/dist/web/standalone/.next/static/chunks/app/page-7e9530a7122506c5.js +0 -1
  603. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  604. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  605. package/dist/web/standalone/.next/static/chunks/webpack-9014b5adb127a98a.js +0 -1
  606. package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +0 -1
  607. /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → j-BskPs0nxxPeYY-bSrab}/_buildManifest.js +0 -0
  608. /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → j-BskPs0nxxPeYY-bSrab}/_ssgManifest.js +0 -0
@@ -52,12 +52,6 @@ import {
52
52
  updateSessionLock,
53
53
  } from "./session-lock.js";
54
54
  import type { SessionLockStatus } from "./session-lock.js";
55
- import {
56
- clearUnitRuntimeRecord,
57
- inspectExecuteTaskDurability,
58
- readUnitRuntimeRecord,
59
- writeUnitRuntimeRecord,
60
- } from "./unit-runtime.js";
61
55
  import {
62
56
  resolveAutoSupervisorConfig,
63
57
  loadEffectiveGSDPreferences,
@@ -81,7 +75,6 @@ import {
81
75
  } from "./auto-tool-tracking.js";
82
76
  import { closeoutUnit } from "./auto-unit-closeout.js";
83
77
  import { recoverTimedOutUnit } from "./auto-timeout-recovery.js";
84
- import { selfHealRuntimeRecords } from "./auto-recovery.js";
85
78
  import { selectAndApplyModel, resolveModelId } from "./auto-model-selection.js";
86
79
  import {
87
80
  syncProjectRootToWorktree,
@@ -155,10 +148,6 @@ import { pruneQueueOrder } from "./queue-order.js";
155
148
 
156
149
  import { debugLog, isDebugEnabled, writeDebugSummary } from "./debug-logger.js";
157
150
  import {
158
- resolveExpectedArtifactPath,
159
- verifyExpectedArtifact,
160
- writeBlockerPlaceholder,
161
- diagnoseExpectedArtifact,
162
151
  buildLoopRemediationSteps,
163
152
  reconcileMergeState,
164
153
  } from "./auto-recovery.js";
@@ -213,7 +202,6 @@ import {
213
202
  NEW_SESSION_TIMEOUT_MS,
214
203
  } from "./auto/session.js";
215
204
  import type {
216
- CompletedUnit,
217
205
  CurrentUnit,
218
206
  UnitRouting,
219
207
  StartModel,
@@ -225,7 +213,6 @@ export {
225
213
  NEW_SESSION_TIMEOUT_MS,
226
214
  } from "./auto/session.js";
227
215
  export type {
228
- CompletedUnit,
229
216
  CurrentUnit,
230
217
  UnitRouting,
231
218
  StartModel,
@@ -250,9 +237,9 @@ const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
250
237
 
251
238
  export function shouldUseWorktreeIsolation(): boolean {
252
239
  const prefs = loadEffectiveGSDPreferences()?.preferences?.git;
253
- if (prefs?.isolation === "none") return false;
254
- if (prefs?.isolation === "branch") return false;
255
- return true; // default: worktree
240
+ if (prefs?.isolation === "worktree") return true;
241
+ // Default is false — worktree isolation requires explicit opt-in
242
+ return false;
256
243
  }
257
244
 
258
245
  /** Crash recovery prompt — set by startAuto, consumed by the main loop */
@@ -335,7 +322,6 @@ export function getAutoDashboardData(): AutoDashboardData {
335
322
  ? (s.autoStartTime > 0 ? Date.now() - s.autoStartTime : 0)
336
323
  : 0,
337
324
  currentUnit: s.currentUnit ? { ...s.currentUnit } : null,
338
- completedUnits: [...s.completedUnits],
339
325
  basePath: s.basePath,
340
326
  totalCost: totals?.cost ?? 0,
341
327
  totalTokens: totals?.tokens.total ?? 0,
@@ -447,7 +433,6 @@ export function checkRemoteAutoSession(projectRoot: string): {
447
433
  unitType?: string;
448
434
  unitId?: string;
449
435
  startedAt?: string;
450
- completedUnits?: number;
451
436
  } {
452
437
  const lock = readCrashLock(projectRoot);
453
438
  if (!lock) return { running: false };
@@ -463,7 +448,6 @@ export function checkRemoteAutoSession(projectRoot: string): {
463
448
  unitType: lock.unitType,
464
449
  unitId: lock.unitId,
465
450
  startedAt: lock.startedAt,
466
- completedUnits: lock.completedUnits,
467
451
  };
468
452
  }
469
453
 
@@ -491,23 +475,19 @@ function clearUnitTimeout(): void {
491
475
  clearInFlightTools();
492
476
  }
493
477
 
494
- /** Build snapshot metric opts, enriching with continueHereFired from the runtime record. */
478
+ /** Build snapshot metric opts. */
495
479
  function buildSnapshotOpts(
496
- unitType: string,
497
- unitId: string,
480
+ _unitType: string,
481
+ _unitId: string,
498
482
  ): {
499
483
  continueHereFired?: boolean;
500
484
  promptCharCount?: number;
501
485
  baselineCharCount?: number;
502
486
  } & Record<string, unknown> {
503
- const runtime = s.currentUnit
504
- ? readUnitRuntimeRecord(s.basePath, unitType, unitId)
505
- : null;
506
487
  return {
507
488
  promptCharCount: s.lastPromptCharCount,
508
489
  baselineCharCount: s.lastBaselineCharCount,
509
490
  ...(s.currentUnitRouting ?? {}),
510
- ...(runtime?.continueHereFired ? { continueHereFired: true } : {}),
511
491
  };
512
492
  }
513
493
 
@@ -610,14 +590,48 @@ export async function stopAuto(
610
590
  }
611
591
 
612
592
  // ── Step 4: Auto-worktree exit ──
593
+ // When the milestone is complete (has a SUMMARY), merge the worktree branch
594
+ // back to main so code isn't stranded on the worktree branch (#2317).
595
+ // For incomplete milestones, preserve the branch for later resumption.
613
596
  try {
614
597
  if (s.currentMilestoneId) {
615
598
  const notifyCtx = ctx
616
599
  ? { notify: ctx.ui.notify.bind(ctx.ui) }
617
600
  : { notify: () => {} };
618
- buildResolver().exitMilestone(s.currentMilestoneId, notifyCtx, {
619
- preserveBranch: true,
620
- });
601
+ const resolver = buildResolver();
602
+
603
+ // Check if the milestone is complete — SUMMARY file is the authoritative signal.
604
+ let milestoneComplete = false;
605
+ try {
606
+ const summaryPath = resolveMilestoneFile(
607
+ s.originalBasePath || s.basePath,
608
+ s.currentMilestoneId,
609
+ "SUMMARY",
610
+ );
611
+ if (!summaryPath) {
612
+ // Also check in the worktree path (SUMMARY may not be synced yet)
613
+ const wtSummaryPath = resolveMilestoneFile(
614
+ s.basePath,
615
+ s.currentMilestoneId,
616
+ "SUMMARY",
617
+ );
618
+ milestoneComplete = wtSummaryPath !== null;
619
+ } else {
620
+ milestoneComplete = true;
621
+ }
622
+ } catch {
623
+ // Non-fatal — fall through to preserveBranch path
624
+ }
625
+
626
+ if (milestoneComplete) {
627
+ // Milestone is complete — merge worktree branch back to main
628
+ resolver.mergeAndExit(s.currentMilestoneId, notifyCtx);
629
+ } else {
630
+ // Milestone still in progress — preserve branch for later resumption
631
+ resolver.exitMilestone(s.currentMilestoneId, notifyCtx, {
632
+ preserveBranch: true,
633
+ });
634
+ }
621
635
  }
622
636
  } catch (e) {
623
637
  debugLog("stop-cleanup-worktree", { error: e instanceof Error ? e.message : String(e) });
@@ -814,11 +828,6 @@ export async function pauseAuto(
814
828
  } catch {
815
829
  // Non-fatal — best-effort closeout on pause
816
830
  }
817
- try {
818
- clearUnitRuntimeRecord(s.basePath, s.currentUnit.type, s.currentUnit.id);
819
- } catch {
820
- // Non-fatal
821
- }
822
831
  s.currentUnit = null;
823
832
  }
824
833
 
@@ -959,9 +968,6 @@ function buildLoopDeps(): LoopDeps {
959
968
  getMainBranch,
960
969
  // Unit closeout + runtime records
961
970
  closeoutUnit,
962
- verifyExpectedArtifact,
963
- clearUnitRuntimeRecord,
964
- writeUnitRuntimeRecord,
965
971
  recordOutcome,
966
972
  writeLock,
967
973
  captureAvailableSkills,
@@ -1134,15 +1140,6 @@ export async function startAuto(
1134
1140
  }
1135
1141
  invalidateAllCaches();
1136
1142
 
1137
- // Clean stale runtime records left from the paused session
1138
- try {
1139
- await selfHealRuntimeRecords(s.basePath, ctx);
1140
- } catch (e) {
1141
- debugLog("resume-self-heal-runtime-failed", {
1142
- error: e instanceof Error ? e.message : String(e),
1143
- });
1144
- }
1145
-
1146
1143
  if (s.pausedSessionFile) {
1147
1144
  const activityDir = join(gsdRoot(s.basePath), "activity");
1148
1145
  const recovery = synthesizeCrashRecovery(
@@ -1166,19 +1163,14 @@ export async function startAuto(
1166
1163
  lockBase(),
1167
1164
  "resuming",
1168
1165
  s.currentMilestoneId ?? "unknown",
1169
- s.completedUnits.length,
1170
1166
  );
1171
1167
  writeLock(
1172
1168
  lockBase(),
1173
1169
  "resuming",
1174
1170
  s.currentMilestoneId ?? "unknown",
1175
- s.completedUnits.length,
1176
1171
  );
1177
1172
  logCmuxEvent(loadEffectiveGSDPreferences()?.preferences, s.stepMode ? "Step-mode resumed." : "Auto-mode resumed.", "progress");
1178
1173
 
1179
- // Clear orphaned runtime records from prior process deaths before entering the loop
1180
- await selfHealRuntimeRecords(s.basePath, ctx);
1181
-
1182
1174
  await autoLoop(ctx, pi, s, buildLoopDeps());
1183
1175
  cleanupAfterLoopExit(ctx);
1184
1176
  return;
@@ -1210,9 +1202,6 @@ export async function startAuto(
1210
1202
  }
1211
1203
  logCmuxEvent(loadEffectiveGSDPreferences()?.preferences, requestedStepMode ? "Step-mode started." : "Auto-mode started.", "progress");
1212
1204
 
1213
- // Clear orphaned runtime records from prior process deaths before entering the loop
1214
- await selfHealRuntimeRecords(s.basePath, ctx);
1215
-
1216
1205
  // Dispatch the first unit
1217
1206
  await autoLoop(ctx, pi, s, buildLoopDeps());
1218
1207
  cleanupAfterLoopExit(ctx);
@@ -1353,7 +1342,6 @@ export async function dispatchHookUnit(
1353
1342
  s.basePath = targetBasePath;
1354
1343
  s.autoStartTime = Date.now();
1355
1344
  s.currentUnit = null;
1356
- s.completedUnits = [];
1357
1345
  s.pendingQuickTasks = [];
1358
1346
  }
1359
1347
 
@@ -1378,21 +1366,6 @@ export async function dispatchHookUnit(
1378
1366
  startedAt: hookStartedAt,
1379
1367
  };
1380
1368
 
1381
- writeUnitRuntimeRecord(
1382
- s.basePath,
1383
- hookUnitType,
1384
- triggerUnitId,
1385
- hookStartedAt,
1386
- {
1387
- phase: "dispatched",
1388
- wrapupWarningSent: false,
1389
- timeoutAt: null,
1390
- lastProgressAt: hookStartedAt,
1391
- progressCount: 0,
1392
- lastProgressKind: "dispatch",
1393
- },
1394
- );
1395
-
1396
1369
  if (hookModel) {
1397
1370
  const availableModels = ctx.modelRegistry.getAvailable();
1398
1371
  const match = resolveModelId(hookModel, availableModels, ctx.model?.provider);
@@ -1416,7 +1389,6 @@ export async function dispatchHookUnit(
1416
1389
  lockBase(),
1417
1390
  hookUnitType,
1418
1391
  triggerUnitId,
1419
- s.completedUnits.length,
1420
1392
  sessionFile,
1421
1393
  );
1422
1394
 
@@ -1426,18 +1398,6 @@ export async function dispatchHookUnit(
1426
1398
  s.unitTimeoutHandle = setTimeout(async () => {
1427
1399
  s.unitTimeoutHandle = null;
1428
1400
  if (!s.active) return;
1429
- if (s.currentUnit) {
1430
- writeUnitRuntimeRecord(
1431
- s.basePath,
1432
- hookUnitType,
1433
- triggerUnitId,
1434
- hookStartedAt,
1435
- {
1436
- phase: "timeout",
1437
- timeoutAt: Date.now(),
1438
- },
1439
- );
1440
- }
1441
1401
  ctx.ui.notify(
1442
1402
  `Hook ${hookName} exceeded ${supervisor.hard_timeout_minutes ?? 30}min timeout. Pausing auto-mode.`,
1443
1403
  "warning",
@@ -1469,8 +1429,6 @@ export { dispatchDirectPhase } from "./auto-direct-dispatch.js";
1469
1429
 
1470
1430
  // Re-export recovery functions for external consumers
1471
1431
  export {
1472
- resolveExpectedArtifactPath,
1473
- verifyExpectedArtifact,
1474
- writeBlockerPlaceholder,
1475
1432
  buildLoopRemediationSteps,
1476
1433
  } from "./auto-recovery.js";
1434
+ export { resolveExpectedArtifactPath } from "./auto-artifact-paths.js";
@@ -1,10 +1,12 @@
1
1
  import { Type } from "@sinclair/typebox";
2
2
  import type { ExtensionAPI } from "@gsd/pi-coding-agent";
3
+ import { Text } from "@gsd/pi-tui";
3
4
 
4
5
  import { findMilestoneIds, nextMilestoneId, claimReservedId, getReservedMilestoneIds } from "../guided-flow.js";
5
6
  import { loadEffectiveGSDPreferences } from "../preferences.js";
6
7
  import { ensureDbOpen } from "./dynamic-tools.js";
7
8
  import { StringEnum } from "@gsd/pi-ai";
9
+ import { logError } from "../workflow-logger.js";
8
10
 
9
11
  /**
10
12
  * Register an alias tool that shares the same execute function as its canonical counterpart.
@@ -51,7 +53,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
51
53
  };
52
54
  } catch (err) {
53
55
  const msg = err instanceof Error ? err.message : String(err);
54
- process.stderr.write(`gsd-db: gsd_decision_save tool failed: ${msg}\n`);
56
+ logError("tool", `gsd_decision_save tool failed: ${msg}`, { tool: "gsd_decision_save", error: String(err) });
55
57
  return {
56
58
  content: [{ type: "text" as const, text: `Error saving decision: ${msg}` }],
57
59
  details: { operation: "save_decision", error: msg } as any,
@@ -87,6 +89,22 @@ export function registerDbTools(pi: ExtensionAPI): void {
87
89
  ], { description: "Who made this decision: 'human' (user directed), 'agent' (LLM decided autonomously), or 'collaborative' (discussed and agreed). Default: 'agent'" })),
88
90
  }),
89
91
  execute: decisionSaveExecute,
92
+ renderCall(args: any, theme: any) {
93
+ let text = theme.fg("toolTitle", theme.bold("decision_save "));
94
+ if (args.scope) text += theme.fg("accent", `[${args.scope}] `);
95
+ if (args.decision) text += theme.fg("muted", args.decision);
96
+ if (args.choice) text += theme.fg("dim", ` — ${args.choice}`);
97
+ return new Text(text, 0, 0);
98
+ },
99
+ renderResult(result: any, _options: any, theme: any) {
100
+ const d = result.details;
101
+ if (result.isError || d?.error) {
102
+ return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
103
+ }
104
+ let text = theme.fg("success", `Decision ${d?.id ?? ""} saved`);
105
+ if (d?.id) text += theme.fg("dim", ` → DECISIONS.md`);
106
+ return new Text(text, 0, 0);
107
+ },
90
108
  };
91
109
 
92
110
  pi.registerTool(decisionSaveTool);
@@ -126,7 +144,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
126
144
  };
127
145
  } catch (err) {
128
146
  const msg = err instanceof Error ? err.message : String(err);
129
- process.stderr.write(`gsd-db: gsd_requirement_update tool failed: ${msg}\n`);
147
+ logError("tool", `gsd_requirement_update tool failed: ${msg}`, { tool: "gsd_requirement_update", error: String(err) });
130
148
  return {
131
149
  content: [{ type: "text" as const, text: `Error updating requirement: ${msg}` }],
132
150
  details: { operation: "update_requirement", id: params.id, error: msg } as any,
@@ -157,6 +175,22 @@ export function registerDbTools(pi: ExtensionAPI): void {
157
175
  supporting_slices: Type.Optional(Type.String({ description: "Supporting slices" })),
158
176
  }),
159
177
  execute: requirementUpdateExecute,
178
+ renderCall(args: any, theme: any) {
179
+ let text = theme.fg("toolTitle", theme.bold("requirement_update "));
180
+ if (args.id) text += theme.fg("accent", args.id);
181
+ const fields = ["status", "validation", "notes", "description"].filter((f) => args[f]);
182
+ if (fields.length > 0) text += theme.fg("dim", ` (${fields.join(", ")})`);
183
+ return new Text(text, 0, 0);
184
+ },
185
+ renderResult(result: any, _options: any, theme: any) {
186
+ const d = result.details;
187
+ if (result.isError || d?.error) {
188
+ return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
189
+ }
190
+ let text = theme.fg("success", `Requirement ${d?.id ?? ""} updated`);
191
+ text += theme.fg("dim", ` → REQUIREMENTS.md`);
192
+ return new Text(text, 0, 0);
193
+ },
160
194
  };
161
195
 
162
196
  pi.registerTool(requirementUpdateTool);
@@ -206,7 +240,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
206
240
  };
207
241
  } catch (err) {
208
242
  const msg = err instanceof Error ? err.message : String(err);
209
- process.stderr.write(`gsd-db: gsd_summary_save tool failed: ${msg}\n`);
243
+ logError("tool", `gsd_summary_save tool failed: ${msg}`, { tool: "gsd_summary_save", error: String(err) });
210
244
  return {
211
245
  content: [{ type: "text" as const, text: `Error saving artifact: ${msg}` }],
212
246
  details: { operation: "save_summary", error: msg } as any,
@@ -235,6 +269,22 @@ export function registerDbTools(pi: ExtensionAPI): void {
235
269
  content: Type.String({ description: "The full markdown content of the artifact" }),
236
270
  }),
237
271
  execute: summarySaveExecute,
272
+ renderCall(args: any, theme: any) {
273
+ let text = theme.fg("toolTitle", theme.bold("summary_save "));
274
+ if (args.artifact_type) text += theme.fg("accent", args.artifact_type);
275
+ const path = [args.milestone_id, args.slice_id, args.task_id].filter(Boolean).join("/");
276
+ if (path) text += theme.fg("dim", ` ${path}`);
277
+ return new Text(text, 0, 0);
278
+ },
279
+ renderResult(result: any, _options: any, theme: any) {
280
+ const d = result.details;
281
+ if (result.isError || d?.error) {
282
+ return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
283
+ }
284
+ let text = theme.fg("success", `${d?.artifact_type ?? "Artifact"} saved`);
285
+ if (d?.path) text += theme.fg("dim", ` → ${d.path}`);
286
+ return new Text(text, 0, 0);
287
+ },
238
288
  };
239
289
 
240
290
  pi.registerTool(summarySaveTool);
@@ -248,6 +298,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
248
298
  // This guarantees the ID shown in the UI matches the one materialised on disk.
249
299
  const reserved = claimReservedId();
250
300
  if (reserved) {
301
+ await ensureMilestoneDbRow(reserved);
251
302
  return {
252
303
  content: [{ type: "text" as const, text: reserved }],
253
304
  details: { operation: "generate_milestone_id", id: reserved, source: "reserved" } as any,
@@ -259,6 +310,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
259
310
  const uniqueEnabled = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
260
311
  const allIds = [...new Set([...existingIds, ...getReservedMilestoneIds()])];
261
312
  const newId = nextMilestoneId(allIds, uniqueEnabled);
313
+ await ensureMilestoneDbRow(newId);
262
314
  return {
263
315
  content: [{ type: "text" as const, text: newId }],
264
316
  details: { operation: "generate_milestone_id", id: newId, existingCount: existingIds.length, uniqueEnabled } as any,
@@ -272,6 +324,23 @@ export function registerDbTools(pi: ExtensionAPI): void {
272
324
  }
273
325
  };
274
326
 
327
+ /**
328
+ * Insert a minimal DB row for a milestone ID so it's visible to the state
329
+ * machine. Uses INSERT OR IGNORE — safe to call even if gsd_plan_milestone
330
+ * later writes the full row. Silently skips if the DB isn't available yet
331
+ * (pre-migration).
332
+ */
333
+ async function ensureMilestoneDbRow(milestoneId: string): Promise<void> {
334
+ const dbAvailable = await ensureDbOpen();
335
+ if (!dbAvailable) return;
336
+ try {
337
+ const { insertMilestone } = await import("../gsd-db.js");
338
+ insertMilestone({ id: milestoneId, status: "queued" });
339
+ } catch {
340
+ // Non-fatal — the safety-net in deriveStateFromDb will catch this
341
+ }
342
+ }
343
+
275
344
  const milestoneGenerateIdTool = {
276
345
  name: "gsd_milestone_generate_id",
277
346
  label: "Generate Milestone ID",
@@ -288,6 +357,18 @@ export function registerDbTools(pi: ExtensionAPI): void {
288
357
  ],
289
358
  parameters: Type.Object({}),
290
359
  execute: milestoneGenerateIdExecute,
360
+ renderCall(_args: any, theme: any) {
361
+ return new Text(theme.fg("toolTitle", theme.bold("milestone_generate_id")), 0, 0);
362
+ },
363
+ renderResult(result: any, _options: any, theme: any) {
364
+ const d = result.details;
365
+ if (result.isError || d?.error) {
366
+ return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
367
+ }
368
+ let text = theme.fg("success", `Generated ${d?.id ?? "ID"}`);
369
+ if (d?.source === "reserved") text += theme.fg("dim", " (reserved)");
370
+ return new Text(text, 0, 0);
371
+ },
291
372
  };
292
373
 
293
374
  pi.registerTool(milestoneGenerateIdTool);
@@ -322,7 +403,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
322
403
  };
323
404
  } catch (err) {
324
405
  const msg = err instanceof Error ? err.message : String(err);
325
- process.stderr.write(`gsd-db: plan_milestone tool failed: ${msg}\n`);
406
+ logError("tool", `plan_milestone tool failed: ${msg}`, { tool: "gsd_plan_milestone", error: String(err) });
326
407
  return {
327
408
  content: [{ type: "text" as const, text: `Error planning milestone: ${msg}` }],
328
409
  details: { operation: "plan_milestone", error: msg } as any,
@@ -415,7 +496,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
415
496
  };
416
497
  } catch (err) {
417
498
  const msg = err instanceof Error ? err.message : String(err);
418
- process.stderr.write(`gsd-db: plan_slice tool failed: ${msg}\n`);
499
+ logError("tool", `plan_slice tool failed: ${msg}`, { tool: "gsd_plan_slice", error: String(err) });
419
500
  return {
420
501
  content: [{ type: "text" as const, text: `Error planning slice: ${msg}` }],
421
502
  details: { operation: "plan_slice", error: msg } as any,
@@ -492,7 +573,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
492
573
  };
493
574
  } catch (err) {
494
575
  const msg = err instanceof Error ? err.message : String(err);
495
- process.stderr.write(`gsd-db: plan_task tool failed: ${msg}\n`);
576
+ logError("tool", `plan_task tool failed: ${msg}`, { tool: "gsd_plan_task", error: String(err) });
496
577
  return {
497
578
  content: [{ type: "text" as const, text: `Error planning task: ${msg}` }],
498
579
  details: { operation: "plan_task", error: msg } as any,
@@ -562,7 +643,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
562
643
  };
563
644
  } catch (err) {
564
645
  const msg = err instanceof Error ? err.message : String(err);
565
- process.stderr.write(`gsd-db: complete_task tool failed: ${msg}\n`);
646
+ logError("tool", `complete_task tool failed: ${msg}`, { tool: "gsd_task_complete", error: String(err) });
566
647
  return {
567
648
  content: [{ type: "text" as const, text: `Error completing task: ${msg}` }],
568
649
  details: { operation: "complete_task", error: msg } as any,
@@ -643,7 +724,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
643
724
  };
644
725
  } catch (err) {
645
726
  const msg = err instanceof Error ? err.message : String(err);
646
- process.stderr.write(`gsd-db: complete_slice tool failed: ${msg}\n`);
727
+ logError("tool", `complete_slice tool failed: ${msg}`, { tool: "gsd_slice_complete", error: String(err) });
647
728
  return {
648
729
  content: [{ type: "text" as const, text: `Error completing slice: ${msg}` }],
649
730
  details: { operation: "complete_slice", error: msg } as any,
@@ -754,7 +835,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
754
835
  };
755
836
  } catch (err) {
756
837
  const msg = err instanceof Error ? err.message : String(err);
757
- process.stderr.write(`gsd-db: complete_milestone tool failed: ${msg}\n`);
838
+ logError("tool", `complete_milestone tool failed: ${msg}`, { tool: "gsd_complete_milestone", error: String(err) });
758
839
  return {
759
840
  content: [{ type: "text" as const, text: `Error completing milestone: ${msg}` }],
760
841
  details: { operation: "complete_milestone", error: msg } as any,
@@ -772,6 +853,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
772
853
  promptGuidelines: [
773
854
  "Use gsd_complete_milestone when all slices in a milestone are finished and the milestone needs to be recorded.",
774
855
  "All slices in the milestone must have status 'complete' — the handler validates this before proceeding.",
856
+ "verificationPassed must be explicitly set to true — the handler rejects completion if verification did not pass.",
775
857
  "On success, returns summaryPath where the MILESTONE-SUMMARY.md was written.",
776
858
  ],
777
859
  parameters: Type.Object({
@@ -787,6 +869,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
787
869
  lessonsLearned: Type.Array(Type.String(), { description: "Lessons learned during the milestone" }),
788
870
  followUps: Type.Optional(Type.String({ description: "Follow-up items for future milestones" })),
789
871
  deviations: Type.Optional(Type.String({ description: "Deviations from the original plan" })),
872
+ verificationPassed: Type.Boolean({ description: "Must be true — confirms that code change verification, success criteria, and definition of done checks all passed before completion" }),
790
873
  }),
791
874
  execute: milestoneCompleteExecute,
792
875
  };
@@ -794,6 +877,74 @@ export function registerDbTools(pi: ExtensionAPI): void {
794
877
  pi.registerTool(milestoneCompleteTool);
795
878
  registerAlias(pi, milestoneCompleteTool, "gsd_milestone_complete", "gsd_complete_milestone");
796
879
 
880
+ // ─── gsd_validate_milestone (gsd_milestone_validate alias) ─────────────
881
+
882
+ const milestoneValidateExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
883
+ const dbAvailable = await ensureDbOpen();
884
+ if (!dbAvailable) {
885
+ return {
886
+ content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot validate milestone." }],
887
+ details: { operation: "validate_milestone", error: "db_unavailable" } as any,
888
+ };
889
+ }
890
+ try {
891
+ const { handleValidateMilestone } = await import("../tools/validate-milestone.js");
892
+ const result = await handleValidateMilestone(params, process.cwd());
893
+ if ("error" in result) {
894
+ return {
895
+ content: [{ type: "text" as const, text: `Error validating milestone: ${result.error}` }],
896
+ details: { operation: "validate_milestone", error: result.error } as any,
897
+ };
898
+ }
899
+ return {
900
+ content: [{ type: "text" as const, text: `Validated milestone ${result.milestoneId} — verdict: ${result.verdict}. Written to ${result.validationPath}` }],
901
+ details: {
902
+ operation: "validate_milestone",
903
+ milestoneId: result.milestoneId,
904
+ verdict: result.verdict,
905
+ validationPath: result.validationPath,
906
+ } as any,
907
+ };
908
+ } catch (err) {
909
+ const msg = err instanceof Error ? err.message : String(err);
910
+ logError("tool", `validate_milestone tool failed: ${msg}`, { tool: "gsd_validate_milestone", error: String(err) });
911
+ return {
912
+ content: [{ type: "text" as const, text: `Error validating milestone: ${msg}` }],
913
+ details: { operation: "validate_milestone", error: msg } as any,
914
+ };
915
+ }
916
+ };
917
+
918
+ const milestoneValidateTool = {
919
+ name: "gsd_validate_milestone",
920
+ label: "Validate Milestone",
921
+ description:
922
+ "Validate a milestone before completion — persist validation results to the DB, render VALIDATION.md to disk. " +
923
+ "Records verdict (pass/needs-attention/needs-remediation) and rationale.",
924
+ promptSnippet: "Validate a GSD milestone (DB write + VALIDATION.md render)",
925
+ promptGuidelines: [
926
+ "Use gsd_validate_milestone when all slices are done and the milestone needs validation before completion.",
927
+ "Parameters: milestoneId, verdict, remediationRound, successCriteriaChecklist, sliceDeliveryAudit, crossSliceIntegration, requirementCoverage, verdictRationale, remediationPlan (optional).",
928
+ "If verdict is 'needs-remediation', also provide remediationPlan and use gsd_reassess_roadmap to add remediation slices to the roadmap.",
929
+ "On success, returns validationPath where VALIDATION.md was written.",
930
+ ],
931
+ parameters: Type.Object({
932
+ milestoneId: Type.String({ description: "Milestone ID (e.g. M001)" }),
933
+ verdict: StringEnum(["pass", "needs-attention", "needs-remediation"], { description: "Validation verdict" }),
934
+ remediationRound: Type.Number({ description: "Remediation round (0 for first validation)" }),
935
+ successCriteriaChecklist: Type.String({ description: "Markdown checklist of success criteria with pass/fail and evidence" }),
936
+ sliceDeliveryAudit: Type.String({ description: "Markdown table auditing each slice's claimed vs delivered output" }),
937
+ crossSliceIntegration: Type.String({ description: "Markdown describing any cross-slice boundary mismatches" }),
938
+ requirementCoverage: Type.String({ description: "Markdown describing any unaddressed requirements" }),
939
+ verdictRationale: Type.String({ description: "Why this verdict was chosen" }),
940
+ remediationPlan: Type.Optional(Type.String({ description: "Remediation plan (required if verdict is needs-remediation)" })),
941
+ }),
942
+ execute: milestoneValidateExecute,
943
+ };
944
+
945
+ pi.registerTool(milestoneValidateTool);
946
+ registerAlias(pi, milestoneValidateTool, "gsd_milestone_validate", "gsd_validate_milestone");
947
+
797
948
  // ─── gsd_replan_slice (gsd_slice_replan alias) ─────────────────────────
798
949
 
799
950
  const replanSliceExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
@@ -825,7 +976,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
825
976
  };
826
977
  } catch (err) {
827
978
  const msg = err instanceof Error ? err.message : String(err);
828
- process.stderr.write(`gsd-db: replan_slice tool failed: ${msg}\n`);
979
+ logError("tool", `replan_slice tool failed: ${msg}`, { tool: "gsd_replan_slice", error: String(err) });
829
980
  return {
830
981
  content: [{ type: "text" as const, text: `Error replanning slice: ${msg}` }],
831
982
  details: { operation: "replan_slice", error: msg } as any,
@@ -905,7 +1056,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
905
1056
  };
906
1057
  } catch (err) {
907
1058
  const msg = err instanceof Error ? err.message : String(err);
908
- process.stderr.write(`gsd-db: reassess_roadmap tool failed: ${msg}\n`);
1059
+ logError("tool", `reassess_roadmap tool failed: ${msg}`, { tool: "gsd_reassess_roadmap", error: String(err) });
909
1060
  return {
910
1061
  content: [{ type: "text" as const, text: `Error reassessing roadmap: ${msg}` }],
911
1062
  details: { operation: "reassess_roadmap", error: msg } as any,
@@ -7,6 +7,7 @@ import { buildMilestoneFileName, resolveMilestonePath, resolveSliceFile, resolve
7
7
  import { buildBeforeAgentStartResult } from "./system-context.js";
8
8
  import { handleAgentEnd } from "./agent-end-recovery.js";
9
9
  import { clearDiscussionFlowState, isDepthVerified, isQueuePhaseActive, markDepthVerified, resetWriteGateState, shouldBlockContextWrite } from "./write-gate.js";
10
+ import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
10
11
  import { getDiscussionMilestoneId } from "../guided-flow.js";
11
12
  import { loadToolApiKeys } from "../commands-config.js";
12
13
  import { loadFile, saveFile, formatContinue } from "../files.js";
@@ -135,7 +136,28 @@ export function registerHooks(pi: ExtensionAPI): void {
135
136
  return { block: true, reason: loopCheck.reason };
136
137
  }
137
138
 
139
+ // ── Single-writer engine: block direct writes to STATE.md ──────────
140
+ // Covers write, edit, and bash tools to prevent bypass vectors.
141
+ if (isToolCallEventType("write", event)) {
142
+ if (isBlockedStateFile(event.input.path)) {
143
+ return { block: true, reason: BLOCKED_WRITE_ERROR };
144
+ }
145
+ }
146
+
147
+ if (isToolCallEventType("edit", event)) {
148
+ if (isBlockedStateFile(event.input.path)) {
149
+ return { block: true, reason: BLOCKED_WRITE_ERROR };
150
+ }
151
+ }
152
+
153
+ if (isToolCallEventType("bash", event)) {
154
+ if (isBashWriteToStateFile(event.input.command)) {
155
+ return { block: true, reason: BLOCKED_WRITE_ERROR };
156
+ }
157
+ }
158
+
138
159
  if (!isToolCallEventType("write", event)) return;
160
+
139
161
  const result = shouldBlockContextWrite(
140
162
  event.toolName,
141
163
  event.input.path,