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
@@ -19,13 +19,11 @@ import { clearActivityLogState } from "./activity-log.js";
19
19
  import { synthesizeCrashRecovery, getDeepDiagnostic, } from "./session-forensics.js";
20
20
  import { writeLock, clearLock, readCrashLock, isLockProcessAlive, } from "./crash-recovery.js";
21
21
  import { acquireSessionLock, getSessionLockStatus, releaseSessionLock, updateSessionLock, } from "./session-lock.js";
22
- import { clearUnitRuntimeRecord, readUnitRuntimeRecord, writeUnitRuntimeRecord, } from "./unit-runtime.js";
23
22
  import { resolveAutoSupervisorConfig, loadEffectiveGSDPreferences, getIsolationMode, } from "./preferences.js";
24
23
  import { sendDesktopNotification } from "./notifications.js";
25
24
  import { getBudgetAlertLevel, getNewBudgetAlertLevel, getBudgetEnforcementAction, } from "./auto-budget.js";
26
25
  import { markToolStart as _markToolStart, markToolEnd as _markToolEnd, getOldestInFlightToolAgeMs as _getOldestInFlightToolAgeMs, clearInFlightTools, } from "./auto-tool-tracking.js";
27
26
  import { closeoutUnit } from "./auto-unit-closeout.js";
28
- import { selfHealRuntimeRecords } from "./auto-recovery.js";
29
27
  import { selectAndApplyModel, resolveModelId } from "./auto-model-selection.js";
30
28
  import { syncProjectRootToWorktree, checkResourcesStale, escapeStaleWorktree, } from "./auto-worktree-sync.js";
31
29
  import { resetRoutingHistory, recordOutcome } from "./routing-history.js";
@@ -44,7 +42,7 @@ import { getPriorSliceCompletionBlocker } from "./dispatch-guard.js";
44
42
  import { createAutoWorktree, enterAutoWorktree, teardownAutoWorktree, isInAutoWorktree, getAutoWorktreePath, mergeMilestoneToMain, autoWorktreeBranch, syncWorktreeStateBack, } from "./auto-worktree.js";
45
43
  import { pruneQueueOrder } from "./queue-order.js";
46
44
  import { debugLog, isDebugEnabled, writeDebugSummary } from "./debug-logger.js";
47
- import { verifyExpectedArtifact, reconcileMergeState, } from "./auto-recovery.js";
45
+ import { reconcileMergeState, } from "./auto-recovery.js";
48
46
  import { resolveDispatch, DISPATCH_RULES } from "./auto-dispatch.js";
49
47
  import { initRegistry, convertDispatchRules } from "./rule-registry.js";
50
48
  import { emitJournalEvent as _emitJournalEvent } from "./journal.js";
@@ -82,11 +80,10 @@ const s = new AutoSession();
82
80
  const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
83
81
  export function shouldUseWorktreeIsolation() {
84
82
  const prefs = loadEffectiveGSDPreferences()?.preferences?.git;
85
- if (prefs?.isolation === "none")
86
- return false;
87
- if (prefs?.isolation === "branch")
88
- return false;
89
- return true; // default: worktree
83
+ if (prefs?.isolation === "worktree")
84
+ return true;
85
+ // Default is false — worktree isolation requires explicit opt-in
86
+ return false;
90
87
  }
91
88
  /** Crash recovery prompt — set by startAuto, consumed by the main loop */
92
89
  /** Pending verification retry — set when gate fails with retries remaining, consumed by autoLoop */
@@ -146,7 +143,6 @@ export function getAutoDashboardData() {
146
143
  ? (s.autoStartTime > 0 ? Date.now() - s.autoStartTime : 0)
147
144
  : 0,
148
145
  currentUnit: s.currentUnit ? { ...s.currentUnit } : null,
149
- completedUnits: [...s.completedUnits],
150
146
  basePath: s.basePath,
151
147
  totalCost: totals?.cost ?? 0,
152
148
  totalTokens: totals?.tokens.total ?? 0,
@@ -245,7 +241,6 @@ export function checkRemoteAutoSession(projectRoot) {
245
241
  unitType: lock.unitType,
246
242
  unitId: lock.unitId,
247
243
  startedAt: lock.startedAt,
248
- completedUnits: lock.completedUnits,
249
244
  };
250
245
  }
251
246
  export function isStepMode() {
@@ -270,16 +265,12 @@ function clearUnitTimeout() {
270
265
  }
271
266
  clearInFlightTools();
272
267
  }
273
- /** Build snapshot metric opts, enriching with continueHereFired from the runtime record. */
274
- function buildSnapshotOpts(unitType, unitId) {
275
- const runtime = s.currentUnit
276
- ? readUnitRuntimeRecord(s.basePath, unitType, unitId)
277
- : null;
268
+ /** Build snapshot metric opts. */
269
+ function buildSnapshotOpts(_unitType, _unitId) {
278
270
  return {
279
271
  promptCharCount: s.lastPromptCharCount,
280
272
  baselineCharCount: s.lastBaselineCharCount,
281
273
  ...(s.currentUnitRouting ?? {}),
282
- ...(runtime?.continueHereFired ? { continueHereFired: true } : {}),
283
274
  };
284
275
  }
285
276
  function handleLostSessionLock(ctx, lockStatus) {
@@ -369,14 +360,41 @@ export async function stopAuto(ctx, pi, reason) {
369
360
  debugLog("stop-cleanup-sigterm", { error: e instanceof Error ? e.message : String(e) });
370
361
  }
371
362
  // ── Step 4: Auto-worktree exit ──
363
+ // When the milestone is complete (has a SUMMARY), merge the worktree branch
364
+ // back to main so code isn't stranded on the worktree branch (#2317).
365
+ // For incomplete milestones, preserve the branch for later resumption.
372
366
  try {
373
367
  if (s.currentMilestoneId) {
374
368
  const notifyCtx = ctx
375
369
  ? { notify: ctx.ui.notify.bind(ctx.ui) }
376
370
  : { notify: () => { } };
377
- buildResolver().exitMilestone(s.currentMilestoneId, notifyCtx, {
378
- preserveBranch: true,
379
- });
371
+ const resolver = buildResolver();
372
+ // Check if the milestone is complete — SUMMARY file is the authoritative signal.
373
+ let milestoneComplete = false;
374
+ try {
375
+ const summaryPath = resolveMilestoneFile(s.originalBasePath || s.basePath, s.currentMilestoneId, "SUMMARY");
376
+ if (!summaryPath) {
377
+ // Also check in the worktree path (SUMMARY may not be synced yet)
378
+ const wtSummaryPath = resolveMilestoneFile(s.basePath, s.currentMilestoneId, "SUMMARY");
379
+ milestoneComplete = wtSummaryPath !== null;
380
+ }
381
+ else {
382
+ milestoneComplete = true;
383
+ }
384
+ }
385
+ catch {
386
+ // Non-fatal — fall through to preserveBranch path
387
+ }
388
+ if (milestoneComplete) {
389
+ // Milestone is complete — merge worktree branch back to main
390
+ resolver.mergeAndExit(s.currentMilestoneId, notifyCtx);
391
+ }
392
+ else {
393
+ // Milestone still in progress — preserve branch for later resumption
394
+ resolver.exitMilestone(s.currentMilestoneId, notifyCtx, {
395
+ preserveBranch: true,
396
+ });
397
+ }
380
398
  }
381
399
  }
382
400
  catch (e) {
@@ -560,12 +578,6 @@ export async function pauseAuto(ctx, _pi) {
560
578
  catch {
561
579
  // Non-fatal — best-effort closeout on pause
562
580
  }
563
- try {
564
- clearUnitRuntimeRecord(s.basePath, s.currentUnit.type, s.currentUnit.id);
565
- }
566
- catch {
567
- // Non-fatal
568
- }
569
581
  s.currentUnit = null;
570
582
  }
571
583
  if (lockBase()) {
@@ -684,9 +696,6 @@ function buildLoopDeps() {
684
696
  getMainBranch,
685
697
  // Unit closeout + runtime records
686
698
  closeoutUnit,
687
- verifyExpectedArtifact,
688
- clearUnitRuntimeRecord,
689
- writeUnitRuntimeRecord,
690
699
  recordOutcome,
691
700
  writeLock,
692
701
  captureAvailableSkills,
@@ -835,15 +844,6 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
835
844
  });
836
845
  }
837
846
  invalidateAllCaches();
838
- // Clean stale runtime records left from the paused session
839
- try {
840
- await selfHealRuntimeRecords(s.basePath, ctx);
841
- }
842
- catch (e) {
843
- debugLog("resume-self-heal-runtime-failed", {
844
- error: e instanceof Error ? e.message : String(e),
845
- });
846
- }
847
847
  if (s.pausedSessionFile) {
848
848
  const activityDir = join(gsdRoot(s.basePath), "activity");
849
849
  const recovery = synthesizeCrashRecovery(s.basePath, s.currentUnit?.type ?? "unknown", s.currentUnit?.id ?? "unknown", s.pausedSessionFile ?? undefined, activityDir);
@@ -853,11 +853,9 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
853
853
  }
854
854
  s.pausedSessionFile = null;
855
855
  }
856
- updateSessionLock(lockBase(), "resuming", s.currentMilestoneId ?? "unknown", s.completedUnits.length);
857
- writeLock(lockBase(), "resuming", s.currentMilestoneId ?? "unknown", s.completedUnits.length);
856
+ updateSessionLock(lockBase(), "resuming", s.currentMilestoneId ?? "unknown");
857
+ writeLock(lockBase(), "resuming", s.currentMilestoneId ?? "unknown");
858
858
  logCmuxEvent(loadEffectiveGSDPreferences()?.preferences, s.stepMode ? "Step-mode resumed." : "Auto-mode resumed.", "progress");
859
- // Clear orphaned runtime records from prior process deaths before entering the loop
860
- await selfHealRuntimeRecords(s.basePath, ctx);
861
859
  await autoLoop(ctx, pi, s, buildLoopDeps());
862
860
  cleanupAfterLoopExit(ctx);
863
861
  return;
@@ -879,8 +877,6 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
879
877
  // Best-effort only — sidebar sync must never block auto-mode startup
880
878
  }
881
879
  logCmuxEvent(loadEffectiveGSDPreferences()?.preferences, requestedStepMode ? "Step-mode started." : "Auto-mode started.", "progress");
882
- // Clear orphaned runtime records from prior process deaths before entering the loop
883
- await selfHealRuntimeRecords(s.basePath, ctx);
884
880
  // Dispatch the first unit
885
881
  await autoLoop(ctx, pi, s, buildLoopDeps());
886
882
  cleanupAfterLoopExit(ctx);
@@ -979,7 +975,6 @@ export async function dispatchHookUnit(ctx, pi, hookName, triggerUnitType, trigg
979
975
  s.basePath = targetBasePath;
980
976
  s.autoStartTime = Date.now();
981
977
  s.currentUnit = null;
982
- s.completedUnits = [];
983
978
  s.pendingQuickTasks = [];
984
979
  }
985
980
  const hookUnitType = `hook/${hookName}`;
@@ -999,14 +994,6 @@ export async function dispatchHookUnit(ctx, pi, hookName, triggerUnitType, trigg
999
994
  id: triggerUnitId,
1000
995
  startedAt: hookStartedAt,
1001
996
  };
1002
- writeUnitRuntimeRecord(s.basePath, hookUnitType, triggerUnitId, hookStartedAt, {
1003
- phase: "dispatched",
1004
- wrapupWarningSent: false,
1005
- timeoutAt: null,
1006
- lastProgressAt: hookStartedAt,
1007
- progressCount: 0,
1008
- lastProgressKind: "dispatch",
1009
- });
1010
997
  if (hookModel) {
1011
998
  const availableModels = ctx.modelRegistry.getAvailable();
1012
999
  const match = resolveModelId(hookModel, availableModels, ctx.model?.provider);
@@ -1024,7 +1011,7 @@ export async function dispatchHookUnit(ctx, pi, hookName, triggerUnitType, trigg
1024
1011
  }
1025
1012
  }
1026
1013
  const sessionFile = ctx.sessionManager.getSessionFile();
1027
- writeLock(lockBase(), hookUnitType, triggerUnitId, s.completedUnits.length, sessionFile);
1014
+ writeLock(lockBase(), hookUnitType, triggerUnitId, sessionFile);
1028
1015
  clearUnitTimeout();
1029
1016
  const supervisor = resolveAutoSupervisorConfig();
1030
1017
  const hookHardTimeoutMs = (supervisor.hard_timeout_minutes ?? 30) * 60 * 1000;
@@ -1032,12 +1019,6 @@ export async function dispatchHookUnit(ctx, pi, hookName, triggerUnitType, trigg
1032
1019
  s.unitTimeoutHandle = null;
1033
1020
  if (!s.active)
1034
1021
  return;
1035
- if (s.currentUnit) {
1036
- writeUnitRuntimeRecord(s.basePath, hookUnitType, triggerUnitId, hookStartedAt, {
1037
- phase: "timeout",
1038
- timeoutAt: Date.now(),
1039
- });
1040
- }
1041
1022
  ctx.ui.notify(`Hook ${hookName} exceeded ${supervisor.hard_timeout_minutes ?? 30}min timeout. Pausing auto-mode.`, "warning");
1042
1023
  resetHookState();
1043
1024
  await pauseAuto(ctx, pi);
@@ -1060,4 +1041,5 @@ export async function dispatchHookUnit(ctx, pi, hookName, triggerUnitType, trigg
1060
1041
  // Direct phase dispatch → auto-direct-dispatch.ts
1061
1042
  export { dispatchDirectPhase } from "./auto-direct-dispatch.js";
1062
1043
  // Re-export recovery functions for external consumers
1063
- export { resolveExpectedArtifactPath, verifyExpectedArtifact, writeBlockerPlaceholder, buildLoopRemediationSteps, } from "./auto-recovery.js";
1044
+ export { buildLoopRemediationSteps, } from "./auto-recovery.js";
1045
+ export { resolveExpectedArtifactPath } from "./auto-artifact-paths.js";
@@ -1,7 +1,10 @@
1
1
  import { Type } from "@sinclair/typebox";
2
+ import { Text } from "@gsd/pi-tui";
2
3
  import { findMilestoneIds, nextMilestoneId, claimReservedId, getReservedMilestoneIds } from "../guided-flow.js";
3
4
  import { loadEffectiveGSDPreferences } from "../preferences.js";
4
5
  import { ensureDbOpen } from "./dynamic-tools.js";
6
+ import { StringEnum } from "@gsd/pi-ai";
7
+ import { logError } from "../workflow-logger.js";
5
8
  /**
6
9
  * Register an alias tool that shares the same execute function as its canonical counterpart.
7
10
  * The alias description and promptGuidelines direct the LLM to prefer the canonical name.
@@ -43,7 +46,7 @@ export function registerDbTools(pi) {
43
46
  }
44
47
  catch (err) {
45
48
  const msg = err instanceof Error ? err.message : String(err);
46
- process.stderr.write(`gsd-db: gsd_decision_save tool failed: ${msg}\n`);
49
+ logError("tool", `gsd_decision_save tool failed: ${msg}`, { tool: "gsd_decision_save", error: String(err) });
47
50
  return {
48
51
  content: [{ type: "text", text: `Error saving decision: ${msg}` }],
49
52
  details: { operation: "save_decision", error: msg },
@@ -77,6 +80,26 @@ export function registerDbTools(pi) {
77
80
  ], { description: "Who made this decision: 'human' (user directed), 'agent' (LLM decided autonomously), or 'collaborative' (discussed and agreed). Default: 'agent'" })),
78
81
  }),
79
82
  execute: decisionSaveExecute,
83
+ renderCall(args, theme) {
84
+ let text = theme.fg("toolTitle", theme.bold("decision_save "));
85
+ if (args.scope)
86
+ text += theme.fg("accent", `[${args.scope}] `);
87
+ if (args.decision)
88
+ text += theme.fg("muted", args.decision);
89
+ if (args.choice)
90
+ text += theme.fg("dim", ` — ${args.choice}`);
91
+ return new Text(text, 0, 0);
92
+ },
93
+ renderResult(result, _options, theme) {
94
+ const d = result.details;
95
+ if (result.isError || d?.error) {
96
+ return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
97
+ }
98
+ let text = theme.fg("success", `Decision ${d?.id ?? ""} saved`);
99
+ if (d?.id)
100
+ text += theme.fg("dim", ` → DECISIONS.md`);
101
+ return new Text(text, 0, 0);
102
+ },
80
103
  };
81
104
  pi.registerTool(decisionSaveTool);
82
105
  registerAlias(pi, decisionSaveTool, "gsd_save_decision", "gsd_decision_save");
@@ -120,7 +143,7 @@ export function registerDbTools(pi) {
120
143
  }
121
144
  catch (err) {
122
145
  const msg = err instanceof Error ? err.message : String(err);
123
- process.stderr.write(`gsd-db: gsd_requirement_update tool failed: ${msg}\n`);
146
+ logError("tool", `gsd_requirement_update tool failed: ${msg}`, { tool: "gsd_requirement_update", error: String(err) });
124
147
  return {
125
148
  content: [{ type: "text", text: `Error updating requirement: ${msg}` }],
126
149
  details: { operation: "update_requirement", id: params.id, error: msg },
@@ -149,6 +172,24 @@ export function registerDbTools(pi) {
149
172
  supporting_slices: Type.Optional(Type.String({ description: "Supporting slices" })),
150
173
  }),
151
174
  execute: requirementUpdateExecute,
175
+ renderCall(args, theme) {
176
+ let text = theme.fg("toolTitle", theme.bold("requirement_update "));
177
+ if (args.id)
178
+ text += theme.fg("accent", args.id);
179
+ const fields = ["status", "validation", "notes", "description"].filter((f) => args[f]);
180
+ if (fields.length > 0)
181
+ text += theme.fg("dim", ` (${fields.join(", ")})`);
182
+ return new Text(text, 0, 0);
183
+ },
184
+ renderResult(result, _options, theme) {
185
+ const d = result.details;
186
+ if (result.isError || d?.error) {
187
+ return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
188
+ }
189
+ let text = theme.fg("success", `Requirement ${d?.id ?? ""} updated`);
190
+ text += theme.fg("dim", ` → REQUIREMENTS.md`);
191
+ return new Text(text, 0, 0);
192
+ },
152
193
  };
153
194
  pi.registerTool(requirementUpdateTool);
154
195
  registerAlias(pi, requirementUpdateTool, "gsd_update_requirement", "gsd_requirement_update");
@@ -195,7 +236,7 @@ export function registerDbTools(pi) {
195
236
  }
196
237
  catch (err) {
197
238
  const msg = err instanceof Error ? err.message : String(err);
198
- process.stderr.write(`gsd-db: gsd_summary_save tool failed: ${msg}\n`);
239
+ logError("tool", `gsd_summary_save tool failed: ${msg}`, { tool: "gsd_summary_save", error: String(err) });
199
240
  return {
200
241
  content: [{ type: "text", text: `Error saving artifact: ${msg}` }],
201
242
  details: { operation: "save_summary", error: msg },
@@ -222,6 +263,25 @@ export function registerDbTools(pi) {
222
263
  content: Type.String({ description: "The full markdown content of the artifact" }),
223
264
  }),
224
265
  execute: summarySaveExecute,
266
+ renderCall(args, theme) {
267
+ let text = theme.fg("toolTitle", theme.bold("summary_save "));
268
+ if (args.artifact_type)
269
+ text += theme.fg("accent", args.artifact_type);
270
+ const path = [args.milestone_id, args.slice_id, args.task_id].filter(Boolean).join("/");
271
+ if (path)
272
+ text += theme.fg("dim", ` ${path}`);
273
+ return new Text(text, 0, 0);
274
+ },
275
+ renderResult(result, _options, theme) {
276
+ const d = result.details;
277
+ if (result.isError || d?.error) {
278
+ return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
279
+ }
280
+ let text = theme.fg("success", `${d?.artifact_type ?? "Artifact"} saved`);
281
+ if (d?.path)
282
+ text += theme.fg("dim", ` → ${d.path}`);
283
+ return new Text(text, 0, 0);
284
+ },
225
285
  };
226
286
  pi.registerTool(summarySaveTool);
227
287
  registerAlias(pi, summarySaveTool, "gsd_save_summary", "gsd_summary_save");
@@ -232,6 +292,7 @@ export function registerDbTools(pi) {
232
292
  // This guarantees the ID shown in the UI matches the one materialised on disk.
233
293
  const reserved = claimReservedId();
234
294
  if (reserved) {
295
+ await ensureMilestoneDbRow(reserved);
235
296
  return {
236
297
  content: [{ type: "text", text: reserved }],
237
298
  details: { operation: "generate_milestone_id", id: reserved, source: "reserved" },
@@ -242,6 +303,7 @@ export function registerDbTools(pi) {
242
303
  const uniqueEnabled = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
243
304
  const allIds = [...new Set([...existingIds, ...getReservedMilestoneIds()])];
244
305
  const newId = nextMilestoneId(allIds, uniqueEnabled);
306
+ await ensureMilestoneDbRow(newId);
245
307
  return {
246
308
  content: [{ type: "text", text: newId }],
247
309
  details: { operation: "generate_milestone_id", id: newId, existingCount: existingIds.length, uniqueEnabled },
@@ -255,6 +317,24 @@ export function registerDbTools(pi) {
255
317
  };
256
318
  }
257
319
  };
320
+ /**
321
+ * Insert a minimal DB row for a milestone ID so it's visible to the state
322
+ * machine. Uses INSERT OR IGNORE — safe to call even if gsd_plan_milestone
323
+ * later writes the full row. Silently skips if the DB isn't available yet
324
+ * (pre-migration).
325
+ */
326
+ async function ensureMilestoneDbRow(milestoneId) {
327
+ const dbAvailable = await ensureDbOpen();
328
+ if (!dbAvailable)
329
+ return;
330
+ try {
331
+ const { insertMilestone } = await import("../gsd-db.js");
332
+ insertMilestone({ id: milestoneId, status: "queued" });
333
+ }
334
+ catch {
335
+ // Non-fatal — the safety-net in deriveStateFromDb will catch this
336
+ }
337
+ }
258
338
  const milestoneGenerateIdTool = {
259
339
  name: "gsd_milestone_generate_id",
260
340
  label: "Generate Milestone ID",
@@ -270,6 +350,19 @@ export function registerDbTools(pi) {
270
350
  ],
271
351
  parameters: Type.Object({}),
272
352
  execute: milestoneGenerateIdExecute,
353
+ renderCall(_args, theme) {
354
+ return new Text(theme.fg("toolTitle", theme.bold("milestone_generate_id")), 0, 0);
355
+ },
356
+ renderResult(result, _options, theme) {
357
+ const d = result.details;
358
+ if (result.isError || d?.error) {
359
+ return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
360
+ }
361
+ let text = theme.fg("success", `Generated ${d?.id ?? "ID"}`);
362
+ if (d?.source === "reserved")
363
+ text += theme.fg("dim", " (reserved)");
364
+ return new Text(text, 0, 0);
365
+ },
273
366
  };
274
367
  pi.registerTool(milestoneGenerateIdTool);
275
368
  registerAlias(pi, milestoneGenerateIdTool, "gsd_generate_milestone_id", "gsd_milestone_generate_id");
@@ -302,7 +395,7 @@ export function registerDbTools(pi) {
302
395
  }
303
396
  catch (err) {
304
397
  const msg = err instanceof Error ? err.message : String(err);
305
- process.stderr.write(`gsd-db: plan_milestone tool failed: ${msg}\n`);
398
+ logError("tool", `plan_milestone tool failed: ${msg}`, { tool: "gsd_plan_milestone", error: String(err) });
306
399
  return {
307
400
  content: [{ type: "text", text: `Error planning milestone: ${msg}` }],
308
401
  details: { operation: "plan_milestone", error: msg },
@@ -391,7 +484,7 @@ export function registerDbTools(pi) {
391
484
  }
392
485
  catch (err) {
393
486
  const msg = err instanceof Error ? err.message : String(err);
394
- process.stderr.write(`gsd-db: plan_slice tool failed: ${msg}\n`);
487
+ logError("tool", `plan_slice tool failed: ${msg}`, { tool: "gsd_plan_slice", error: String(err) });
395
488
  return {
396
489
  content: [{ type: "text", text: `Error planning slice: ${msg}` }],
397
490
  details: { operation: "plan_slice", error: msg },
@@ -464,7 +557,7 @@ export function registerDbTools(pi) {
464
557
  }
465
558
  catch (err) {
466
559
  const msg = err instanceof Error ? err.message : String(err);
467
- process.stderr.write(`gsd-db: plan_task tool failed: ${msg}\n`);
560
+ logError("tool", `plan_task tool failed: ${msg}`, { tool: "gsd_plan_task", error: String(err) });
468
561
  return {
469
562
  content: [{ type: "text", text: `Error planning task: ${msg}` }],
470
563
  details: { operation: "plan_task", error: msg },
@@ -530,7 +623,7 @@ export function registerDbTools(pi) {
530
623
  }
531
624
  catch (err) {
532
625
  const msg = err instanceof Error ? err.message : String(err);
533
- process.stderr.write(`gsd-db: complete_task tool failed: ${msg}\n`);
626
+ logError("tool", `complete_task tool failed: ${msg}`, { tool: "gsd_task_complete", error: String(err) });
534
627
  return {
535
628
  content: [{ type: "text", text: `Error completing task: ${msg}` }],
536
629
  details: { operation: "complete_task", error: msg },
@@ -604,7 +697,7 @@ export function registerDbTools(pi) {
604
697
  }
605
698
  catch (err) {
606
699
  const msg = err instanceof Error ? err.message : String(err);
607
- process.stderr.write(`gsd-db: complete_slice tool failed: ${msg}\n`);
700
+ logError("tool", `complete_slice tool failed: ${msg}`, { tool: "gsd_slice_complete", error: String(err) });
608
701
  return {
609
702
  content: [{ type: "text", text: `Error completing slice: ${msg}` }],
610
703
  details: { operation: "complete_slice", error: msg },
@@ -696,7 +789,7 @@ export function registerDbTools(pi) {
696
789
  }
697
790
  catch (err) {
698
791
  const msg = err instanceof Error ? err.message : String(err);
699
- process.stderr.write(`gsd-db: complete_milestone tool failed: ${msg}\n`);
792
+ logError("tool", `complete_milestone tool failed: ${msg}`, { tool: "gsd_complete_milestone", error: String(err) });
700
793
  return {
701
794
  content: [{ type: "text", text: `Error completing milestone: ${msg}` }],
702
795
  details: { operation: "complete_milestone", error: msg },
@@ -712,6 +805,7 @@ export function registerDbTools(pi) {
712
805
  promptGuidelines: [
713
806
  "Use gsd_complete_milestone when all slices in a milestone are finished and the milestone needs to be recorded.",
714
807
  "All slices in the milestone must have status 'complete' — the handler validates this before proceeding.",
808
+ "verificationPassed must be explicitly set to true — the handler rejects completion if verification did not pass.",
715
809
  "On success, returns summaryPath where the MILESTONE-SUMMARY.md was written.",
716
810
  ],
717
811
  parameters: Type.Object({
@@ -727,11 +821,76 @@ export function registerDbTools(pi) {
727
821
  lessonsLearned: Type.Array(Type.String(), { description: "Lessons learned during the milestone" }),
728
822
  followUps: Type.Optional(Type.String({ description: "Follow-up items for future milestones" })),
729
823
  deviations: Type.Optional(Type.String({ description: "Deviations from the original plan" })),
824
+ verificationPassed: Type.Boolean({ description: "Must be true — confirms that code change verification, success criteria, and definition of done checks all passed before completion" }),
730
825
  }),
731
826
  execute: milestoneCompleteExecute,
732
827
  };
733
828
  pi.registerTool(milestoneCompleteTool);
734
829
  registerAlias(pi, milestoneCompleteTool, "gsd_milestone_complete", "gsd_complete_milestone");
830
+ // ─── gsd_validate_milestone (gsd_milestone_validate alias) ─────────────
831
+ const milestoneValidateExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
832
+ const dbAvailable = await ensureDbOpen();
833
+ if (!dbAvailable) {
834
+ return {
835
+ content: [{ type: "text", text: "Error: GSD database is not available. Cannot validate milestone." }],
836
+ details: { operation: "validate_milestone", error: "db_unavailable" },
837
+ };
838
+ }
839
+ try {
840
+ const { handleValidateMilestone } = await import("../tools/validate-milestone.js");
841
+ const result = await handleValidateMilestone(params, process.cwd());
842
+ if ("error" in result) {
843
+ return {
844
+ content: [{ type: "text", text: `Error validating milestone: ${result.error}` }],
845
+ details: { operation: "validate_milestone", error: result.error },
846
+ };
847
+ }
848
+ return {
849
+ content: [{ type: "text", text: `Validated milestone ${result.milestoneId} — verdict: ${result.verdict}. Written to ${result.validationPath}` }],
850
+ details: {
851
+ operation: "validate_milestone",
852
+ milestoneId: result.milestoneId,
853
+ verdict: result.verdict,
854
+ validationPath: result.validationPath,
855
+ },
856
+ };
857
+ }
858
+ catch (err) {
859
+ const msg = err instanceof Error ? err.message : String(err);
860
+ logError("tool", `validate_milestone tool failed: ${msg}`, { tool: "gsd_validate_milestone", error: String(err) });
861
+ return {
862
+ content: [{ type: "text", text: `Error validating milestone: ${msg}` }],
863
+ details: { operation: "validate_milestone", error: msg },
864
+ };
865
+ }
866
+ };
867
+ const milestoneValidateTool = {
868
+ name: "gsd_validate_milestone",
869
+ label: "Validate Milestone",
870
+ description: "Validate a milestone before completion — persist validation results to the DB, render VALIDATION.md to disk. " +
871
+ "Records verdict (pass/needs-attention/needs-remediation) and rationale.",
872
+ promptSnippet: "Validate a GSD milestone (DB write + VALIDATION.md render)",
873
+ promptGuidelines: [
874
+ "Use gsd_validate_milestone when all slices are done and the milestone needs validation before completion.",
875
+ "Parameters: milestoneId, verdict, remediationRound, successCriteriaChecklist, sliceDeliveryAudit, crossSliceIntegration, requirementCoverage, verdictRationale, remediationPlan (optional).",
876
+ "If verdict is 'needs-remediation', also provide remediationPlan and use gsd_reassess_roadmap to add remediation slices to the roadmap.",
877
+ "On success, returns validationPath where VALIDATION.md was written.",
878
+ ],
879
+ parameters: Type.Object({
880
+ milestoneId: Type.String({ description: "Milestone ID (e.g. M001)" }),
881
+ verdict: StringEnum(["pass", "needs-attention", "needs-remediation"], { description: "Validation verdict" }),
882
+ remediationRound: Type.Number({ description: "Remediation round (0 for first validation)" }),
883
+ successCriteriaChecklist: Type.String({ description: "Markdown checklist of success criteria with pass/fail and evidence" }),
884
+ sliceDeliveryAudit: Type.String({ description: "Markdown table auditing each slice's claimed vs delivered output" }),
885
+ crossSliceIntegration: Type.String({ description: "Markdown describing any cross-slice boundary mismatches" }),
886
+ requirementCoverage: Type.String({ description: "Markdown describing any unaddressed requirements" }),
887
+ verdictRationale: Type.String({ description: "Why this verdict was chosen" }),
888
+ remediationPlan: Type.Optional(Type.String({ description: "Remediation plan (required if verdict is needs-remediation)" })),
889
+ }),
890
+ execute: milestoneValidateExecute,
891
+ };
892
+ pi.registerTool(milestoneValidateTool);
893
+ registerAlias(pi, milestoneValidateTool, "gsd_milestone_validate", "gsd_validate_milestone");
735
894
  // ─── gsd_replan_slice (gsd_slice_replan alias) ─────────────────────────
736
895
  const replanSliceExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
737
896
  const dbAvailable = await ensureDbOpen();
@@ -763,7 +922,7 @@ export function registerDbTools(pi) {
763
922
  }
764
923
  catch (err) {
765
924
  const msg = err instanceof Error ? err.message : String(err);
766
- process.stderr.write(`gsd-db: replan_slice tool failed: ${msg}\n`);
925
+ logError("tool", `replan_slice tool failed: ${msg}`, { tool: "gsd_replan_slice", error: String(err) });
767
926
  return {
768
927
  content: [{ type: "text", text: `Error replanning slice: ${msg}` }],
769
928
  details: { operation: "replan_slice", error: msg },
@@ -836,7 +995,7 @@ export function registerDbTools(pi) {
836
995
  }
837
996
  catch (err) {
838
997
  const msg = err instanceof Error ? err.message : String(err);
839
- process.stderr.write(`gsd-db: reassess_roadmap tool failed: ${msg}\n`);
998
+ logError("tool", `reassess_roadmap tool failed: ${msg}`, { tool: "gsd_reassess_roadmap", error: String(err) });
840
999
  return {
841
1000
  content: [{ type: "text", text: `Error reassessing roadmap: ${msg}` }],
842
1001
  details: { operation: "reassess_roadmap", error: msg },
@@ -4,6 +4,7 @@ import { buildMilestoneFileName, resolveMilestonePath, resolveSliceFile, resolve
4
4
  import { buildBeforeAgentStartResult } from "./system-context.js";
5
5
  import { handleAgentEnd } from "./agent-end-recovery.js";
6
6
  import { isDepthVerified, isQueuePhaseActive, markDepthVerified, resetWriteGateState, shouldBlockContextWrite } from "./write-gate.js";
7
+ import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
7
8
  import { getDiscussionMilestoneId } from "../guided-flow.js";
8
9
  import { loadToolApiKeys } from "../commands-config.js";
9
10
  import { loadFile, saveFile, formatContinue } from "../files.js";
@@ -128,6 +129,23 @@ export function registerHooks(pi) {
128
129
  if (loopCheck.block) {
129
130
  return { block: true, reason: loopCheck.reason };
130
131
  }
132
+ // ── Single-writer engine: block direct writes to STATE.md ──────────
133
+ // Covers write, edit, and bash tools to prevent bypass vectors.
134
+ if (isToolCallEventType("write", event)) {
135
+ if (isBlockedStateFile(event.input.path)) {
136
+ return { block: true, reason: BLOCKED_WRITE_ERROR };
137
+ }
138
+ }
139
+ if (isToolCallEventType("edit", event)) {
140
+ if (isBlockedStateFile(event.input.path)) {
141
+ return { block: true, reason: BLOCKED_WRITE_ERROR };
142
+ }
143
+ }
144
+ if (isToolCallEventType("bash", event)) {
145
+ if (isBashWriteToStateFile(event.input.command)) {
146
+ return { block: true, reason: BLOCKED_WRITE_ERROR };
147
+ }
148
+ }
131
149
  if (!isToolCallEventType("write", event))
132
150
  return;
133
151
  const result = shouldBlockContextWrite(event.toolName, event.input.path, getDiscussionMilestoneId(), isDepthVerified(), isQueuePhaseActive());
@@ -45,18 +45,9 @@ export async function buildBeforeAgentStartResult(event, ctx) {
45
45
  ctx.ui.notify(`GSD skill preferences: ${report.warnings.length} unresolved skill${report.warnings.length === 1 ? "" : "s"}: ${report.warnings.join(", ")}`, "warning");
46
46
  }
47
47
  }
48
- let knowledgeBlock = "";
49
- const knowledgePath = resolveGsdRootFile(process.cwd(), "KNOWLEDGE");
50
- if (existsSync(knowledgePath)) {
51
- try {
52
- const content = readFileSync(knowledgePath, "utf-8").trim();
53
- if (content) {
54
- knowledgeBlock = `\n\n[PROJECT KNOWLEDGE — Rules, patterns, and lessons learned]\n\n${content}`;
55
- }
56
- }
57
- catch {
58
- // skip
59
- }
48
+ const { block: knowledgeBlock, globalSizeKb } = loadKnowledgeBlock(gsdHome, process.cwd());
49
+ if (globalSizeKb > 4) {
50
+ ctx.ui.notify(`GSD: ~/.gsd/agent/KNOWLEDGE.md is ${globalSizeKb.toFixed(1)}KB — consider trimming to keep system prompt lean.`, "warning");
60
51
  }
61
52
  let memoryBlock = "";
62
53
  try {
@@ -102,6 +93,49 @@ export async function buildBeforeAgentStartResult(event, ctx) {
102
93
  : {}),
103
94
  };
104
95
  }
96
+ export function loadKnowledgeBlock(gsdHomeDir, cwd) {
97
+ // 1. Global knowledge (~/.gsd/agent/KNOWLEDGE.md) — cross-project, user-maintained
98
+ let globalKnowledge = "";
99
+ let globalSizeKb = 0;
100
+ const globalKnowledgePath = join(gsdHomeDir, "agent", "KNOWLEDGE.md");
101
+ if (existsSync(globalKnowledgePath)) {
102
+ try {
103
+ const content = readFileSync(globalKnowledgePath, "utf-8").trim();
104
+ if (content) {
105
+ globalSizeKb = Buffer.byteLength(content, "utf-8") / 1024;
106
+ globalKnowledge = content;
107
+ }
108
+ }
109
+ catch {
110
+ // skip
111
+ }
112
+ }
113
+ // 2. Project knowledge (.gsd/KNOWLEDGE.md) — project-specific
114
+ let projectKnowledge = "";
115
+ const knowledgePath = resolveGsdRootFile(cwd, "KNOWLEDGE");
116
+ if (existsSync(knowledgePath)) {
117
+ try {
118
+ const content = readFileSync(knowledgePath, "utf-8").trim();
119
+ if (content)
120
+ projectKnowledge = content;
121
+ }
122
+ catch {
123
+ // skip
124
+ }
125
+ }
126
+ if (!globalKnowledge && !projectKnowledge) {
127
+ return { block: "", globalSizeKb: 0 };
128
+ }
129
+ const parts = [];
130
+ if (globalKnowledge)
131
+ parts.push(`## Global Knowledge\n\n${globalKnowledge}`);
132
+ if (projectKnowledge)
133
+ parts.push(`## Project Knowledge\n\n${projectKnowledge}`);
134
+ return {
135
+ block: `\n\n[KNOWLEDGE — Rules, patterns, and lessons learned]\n\n${parts.join("\n\n")}`,
136
+ globalSizeKb,
137
+ };
138
+ }
105
139
  function buildWorktreeContextBlock() {
106
140
  const worktreeName = getActiveWorktreeName();
107
141
  const worktreeMainCwd = getWorktreeOriginalCwd();