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
@@ -1,6 +1,7 @@
1
1
  import { clearParseCache } from "../files.js";
2
2
  import {
3
3
  transaction,
4
+ getMilestone,
4
5
  insertMilestone,
5
6
  insertSlice,
6
7
  upsertMilestonePlanning,
@@ -9,6 +10,9 @@ import {
9
10
  } from "../gsd-db.js";
10
11
  import { invalidateStateCache } from "../state.js";
11
12
  import { renderRoadmapFromDb } from "../markdown-renderer.js";
13
+ import { renderAllProjections } from "../workflow-projections.js";
14
+ import { writeManifest } from "../workflow-manifest.js";
15
+ import { appendEvent } from "../workflow-events.js";
12
16
 
13
17
  export interface PlanMilestoneSliceInput {
14
18
  sliceId: string;
@@ -28,6 +32,10 @@ export interface PlanMilestoneParams {
28
32
  title: string;
29
33
  status?: string;
30
34
  dependsOn?: string[];
35
+ /** Optional caller-provided identity for audit trail */
36
+ actorName?: string;
37
+ /** Optional caller-provided reason this action was triggered */
38
+ triggerReason?: string;
31
39
  vision: string;
32
40
  successCriteria: string[];
33
41
  keyRisks: Array<{ risk: string; whyItMatters: string }>;
@@ -181,6 +189,25 @@ export async function handlePlanMilestone(
181
189
  return { error: `validation failed: ${(err as Error).message}` };
182
190
  }
183
191
 
192
+ // ── State machine preconditions ─────────────────────────────────────────
193
+ const existingMilestone = getMilestone(params.milestoneId);
194
+ if (existingMilestone && (existingMilestone.status === "complete" || existingMilestone.status === "done")) {
195
+ return { error: `cannot re-plan milestone ${params.milestoneId}: it is already complete` };
196
+ }
197
+
198
+ // Validate depends_on: all dependencies must exist and be complete
199
+ if (params.dependsOn && params.dependsOn.length > 0) {
200
+ for (const depId of params.dependsOn) {
201
+ const dep = getMilestone(depId);
202
+ if (!dep) {
203
+ return { error: `depends_on references unknown milestone: ${depId}` };
204
+ }
205
+ if (dep.status !== "complete" && dep.status !== "done") {
206
+ return { error: `depends_on milestone ${depId} is not yet complete (status: ${dep.status})` };
207
+ }
208
+ }
209
+ }
210
+
184
211
  try {
185
212
  transaction(() => {
186
213
  insertMilestone({
@@ -242,6 +269,24 @@ export async function handlePlanMilestone(
242
269
  invalidateStateCache();
243
270
  clearParseCache();
244
271
 
272
+ // ── Post-mutation hook: projections, manifest, event log ───────────────
273
+ try {
274
+ await renderAllProjections(basePath, params.milestoneId);
275
+ writeManifest(basePath);
276
+ appendEvent(basePath, {
277
+ cmd: "plan-milestone",
278
+ params: { milestoneId: params.milestoneId },
279
+ ts: new Date().toISOString(),
280
+ actor: "agent",
281
+ actor_name: params.actorName,
282
+ trigger_reason: params.triggerReason,
283
+ });
284
+ } catch (hookErr) {
285
+ process.stderr.write(
286
+ `gsd: plan-milestone post-mutation hook warning: ${(hookErr as Error).message}\n`,
287
+ );
288
+ }
289
+
245
290
  return {
246
291
  milestoneId: params.milestoneId,
247
292
  roadmapPath,
@@ -1,6 +1,7 @@
1
1
  import { clearParseCache } from "../files.js";
2
2
  import {
3
3
  transaction,
4
+ getMilestone,
4
5
  getSlice,
5
6
  insertTask,
6
7
  upsertSlicePlanning,
@@ -9,6 +10,9 @@ import {
9
10
  } from "../gsd-db.js";
10
11
  import { invalidateStateCache } from "../state.js";
11
12
  import { renderPlanFromDb } from "../markdown-renderer.js";
13
+ import { renderAllProjections } from "../workflow-projections.js";
14
+ import { writeManifest } from "../workflow-manifest.js";
15
+ import { appendEvent } from "../workflow-events.js";
12
16
 
13
17
  export interface PlanSliceTaskInput {
14
18
  taskId: string;
@@ -20,6 +24,7 @@ export interface PlanSliceTaskInput {
20
24
  inputs: string[];
21
25
  expectedOutput: string[];
22
26
  observabilityImpact?: string;
27
+ fullPlanMd?: string;
23
28
  }
24
29
 
25
30
  export interface PlanSliceParams {
@@ -31,6 +36,10 @@ export interface PlanSliceParams {
31
36
  integrationClosure: string;
32
37
  observabilityImpact: string;
33
38
  tasks: PlanSliceTaskInput[];
39
+ /** Optional caller-provided identity for audit trail */
40
+ actorName?: string;
41
+ /** Optional caller-provided reason this action was triggered */
42
+ triggerReason?: string;
34
43
  }
35
44
 
36
45
  export interface PlanSliceResult {
@@ -135,10 +144,21 @@ export async function handlePlanSlice(
135
144
  return { error: `validation failed: ${(err as Error).message}` };
136
145
  }
137
146
 
147
+ const parentMilestone = getMilestone(params.milestoneId);
148
+ if (!parentMilestone) {
149
+ return { error: `milestone not found: ${params.milestoneId}` };
150
+ }
151
+ if (parentMilestone.status === "complete" || parentMilestone.status === "done") {
152
+ return { error: `cannot plan slice in a closed milestone: ${params.milestoneId} (status: ${parentMilestone.status})` };
153
+ }
154
+
138
155
  const parentSlice = getSlice(params.milestoneId, params.sliceId);
139
156
  if (!parentSlice) {
140
157
  return { error: `missing parent slice: ${params.milestoneId}/${params.sliceId}` };
141
158
  }
159
+ if (parentSlice.status === "complete" || parentSlice.status === "done") {
160
+ return { error: `cannot re-plan slice ${params.sliceId}: it is already complete — use gsd_slice_reopen first` };
161
+ }
142
162
 
143
163
  try {
144
164
  transaction(() => {
@@ -167,6 +187,7 @@ export async function handlePlanSlice(
167
187
  inputs: task.inputs,
168
188
  expectedOutput: task.expectedOutput,
169
189
  observabilityImpact: task.observabilityImpact ?? "",
190
+ fullPlanMd: task.fullPlanMd,
170
191
  });
171
192
  }
172
193
  });
@@ -178,6 +199,25 @@ export async function handlePlanSlice(
178
199
  const renderResult = await renderPlanFromDb(basePath, params.milestoneId, params.sliceId);
179
200
  invalidateStateCache();
180
201
  clearParseCache();
202
+
203
+ // ── Post-mutation hook: projections, manifest, event log ─────────────
204
+ try {
205
+ await renderAllProjections(basePath, params.milestoneId);
206
+ writeManifest(basePath);
207
+ appendEvent(basePath, {
208
+ cmd: "plan-slice",
209
+ params: { milestoneId: params.milestoneId, sliceId: params.sliceId },
210
+ ts: new Date().toISOString(),
211
+ actor: "agent",
212
+ actor_name: params.actorName,
213
+ trigger_reason: params.triggerReason,
214
+ });
215
+ } catch (hookErr) {
216
+ process.stderr.write(
217
+ `gsd: plan-slice post-mutation hook warning: ${(hookErr as Error).message}\n`,
218
+ );
219
+ }
220
+
181
221
  return {
182
222
  milestoneId: params.milestoneId,
183
223
  sliceId: params.sliceId,
@@ -2,6 +2,9 @@ import { clearParseCache } from "../files.js";
2
2
  import { transaction, getSlice, getTask, insertTask, upsertTaskPlanning } from "../gsd-db.js";
3
3
  import { invalidateStateCache } from "../state.js";
4
4
  import { renderTaskPlanFromDb } from "../markdown-renderer.js";
5
+ import { renderAllProjections } from "../workflow-projections.js";
6
+ import { writeManifest } from "../workflow-manifest.js";
7
+ import { appendEvent } from "../workflow-events.js";
5
8
 
6
9
  export interface PlanTaskParams {
7
10
  milestoneId: string;
@@ -15,6 +18,11 @@ export interface PlanTaskParams {
15
18
  inputs: string[];
16
19
  expectedOutput: string[];
17
20
  observabilityImpact?: string;
21
+ fullPlanMd?: string;
22
+ /** Optional caller-provided identity for audit trail */
23
+ actorName?: string;
24
+ /** Optional caller-provided reason this action was triggered */
25
+ triggerReason?: string;
18
26
  }
19
27
 
20
28
  export interface PlanTaskResult {
@@ -73,10 +81,18 @@ export async function handlePlanTask(
73
81
  if (!parentSlice) {
74
82
  return { error: `missing parent slice: ${params.milestoneId}/${params.sliceId}` };
75
83
  }
84
+ if (parentSlice.status === "complete" || parentSlice.status === "done") {
85
+ return { error: `cannot plan task in a closed slice: ${params.sliceId} (status: ${parentSlice.status})` };
86
+ }
87
+
88
+ const existingTask = getTask(params.milestoneId, params.sliceId, params.taskId);
89
+ if (existingTask && (existingTask.status === "complete" || existingTask.status === "done")) {
90
+ return { error: `cannot re-plan task ${params.taskId}: it is already complete — use gsd_task_reopen first` };
91
+ }
76
92
 
77
93
  try {
78
94
  transaction(() => {
79
- if (!getTask(params.milestoneId, params.sliceId, params.taskId)) {
95
+ if (!existingTask) {
80
96
  insertTask({
81
97
  id: params.taskId,
82
98
  sliceId: params.sliceId,
@@ -94,6 +110,7 @@ export async function handlePlanTask(
94
110
  inputs: params.inputs,
95
111
  expectedOutput: params.expectedOutput,
96
112
  observabilityImpact: params.observabilityImpact ?? "",
113
+ fullPlanMd: params.fullPlanMd,
97
114
  });
98
115
  });
99
116
  } catch (err) {
@@ -104,6 +121,25 @@ export async function handlePlanTask(
104
121
  const renderResult = await renderTaskPlanFromDb(basePath, params.milestoneId, params.sliceId, params.taskId);
105
122
  invalidateStateCache();
106
123
  clearParseCache();
124
+
125
+ // ── Post-mutation hook: projections, manifest, event log ─────────────
126
+ try {
127
+ await renderAllProjections(basePath, params.milestoneId);
128
+ writeManifest(basePath);
129
+ appendEvent(basePath, {
130
+ cmd: "plan-task",
131
+ params: { milestoneId: params.milestoneId, sliceId: params.sliceId, taskId: params.taskId },
132
+ ts: new Date().toISOString(),
133
+ actor: "agent",
134
+ actor_name: params.actorName,
135
+ trigger_reason: params.triggerReason,
136
+ });
137
+ } catch (hookErr) {
138
+ process.stderr.write(
139
+ `gsd: plan-task post-mutation hook warning: ${(hookErr as Error).message}\n`,
140
+ );
141
+ }
142
+
107
143
  return {
108
144
  milestoneId: params.milestoneId,
109
145
  sliceId: params.sliceId,
@@ -3,6 +3,7 @@ import {
3
3
  transaction,
4
4
  getMilestone,
5
5
  getMilestoneSlices,
6
+ getSlice,
6
7
  insertSlice,
7
8
  updateSliceFields,
8
9
  insertAssessment,
@@ -10,6 +11,9 @@ import {
10
11
  } from "../gsd-db.js";
11
12
  import { invalidateStateCache } from "../state.js";
12
13
  import { renderRoadmapFromDb, renderAssessmentFromDb } from "../markdown-renderer.js";
14
+ import { renderAllProjections } from "../workflow-projections.js";
15
+ import { writeManifest } from "../workflow-manifest.js";
16
+ import { appendEvent } from "../workflow-events.js";
13
17
  import { join } from "node:path";
14
18
 
15
19
  export interface SliceChangeInput {
@@ -30,6 +34,10 @@ export interface ReassessRoadmapParams {
30
34
  added: SliceChangeInput[];
31
35
  removed: string[];
32
36
  };
37
+ /** Optional caller-provided identity for audit trail */
38
+ actorName?: string;
39
+ /** Optional caller-provided reason this action was triggered */
40
+ triggerReason?: string;
33
41
  }
34
42
 
35
43
  export interface ReassessRoadmapResult {
@@ -96,11 +104,23 @@ export async function handleReassessRoadmap(
96
104
  return { error: `validation failed: ${(err as Error).message}` };
97
105
  }
98
106
 
99
- // ── Verify milestone exists ───────────────────────────────────────
107
+ // ── Verify milestone exists and is active ────────────────────────
100
108
  const milestone = getMilestone(params.milestoneId);
101
109
  if (!milestone) {
102
110
  return { error: `milestone not found: ${params.milestoneId}` };
103
111
  }
112
+ if (milestone.status === "complete" || milestone.status === "done") {
113
+ return { error: `cannot reassess a closed milestone: ${params.milestoneId} (status: ${milestone.status})` };
114
+ }
115
+
116
+ // ── Verify completedSliceId is actually complete ──────────────────
117
+ const completedSlice = getSlice(params.milestoneId, params.completedSliceId);
118
+ if (!completedSlice) {
119
+ return { error: `completedSliceId not found: ${params.milestoneId}/${params.completedSliceId}` };
120
+ }
121
+ if (completedSlice.status !== "complete" && completedSlice.status !== "done") {
122
+ return { error: `completedSliceId ${params.completedSliceId} is not complete (status: ${completedSlice.status}) — reassess can only be called after a slice finishes` };
123
+ }
104
124
 
105
125
  // ── Structural enforcement ────────────────────────────────────────
106
126
  const existingSlices = getMilestoneSlices(params.milestoneId);
@@ -191,6 +211,24 @@ export async function handleReassessRoadmap(
191
211
  invalidateStateCache();
192
212
  clearParseCache();
193
213
 
214
+ // ── Post-mutation hook: projections, manifest, event log ─────
215
+ try {
216
+ await renderAllProjections(basePath, params.milestoneId);
217
+ writeManifest(basePath);
218
+ appendEvent(basePath, {
219
+ cmd: "reassess-roadmap",
220
+ params: { milestoneId: params.milestoneId, completedSliceId: params.completedSliceId },
221
+ ts: new Date().toISOString(),
222
+ actor: "agent",
223
+ actor_name: params.actorName,
224
+ trigger_reason: params.triggerReason,
225
+ });
226
+ } catch (hookErr) {
227
+ process.stderr.write(
228
+ `gsd: reassess-roadmap post-mutation hook warning: ${(hookErr as Error).message}\n`,
229
+ );
230
+ }
231
+
194
232
  return {
195
233
  milestoneId: params.milestoneId,
196
234
  completedSliceId: params.completedSliceId,
@@ -0,0 +1,125 @@
1
+ /**
2
+ * reopen-slice handler — the core operation behind gsd_slice_reopen.
3
+ *
4
+ * Resets a completed slice back to "in_progress" and resets ALL of its
5
+ * tasks back to "pending". This is intentional — if you're reopening a
6
+ * slice, you're re-doing the work. Partial resets create ambiguous state.
7
+ *
8
+ * The parent milestone must still be open (not complete).
9
+ */
10
+
11
+ // GSD — reopen-slice tool handler
12
+ // Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
13
+
14
+ import {
15
+ getMilestone,
16
+ getSlice,
17
+ getSliceTasks,
18
+ updateSliceStatus,
19
+ updateTaskStatus,
20
+ transaction,
21
+ } from "../gsd-db.js";
22
+ import { invalidateStateCache } from "../state.js";
23
+ import { renderAllProjections } from "../workflow-projections.js";
24
+ import { writeManifest } from "../workflow-manifest.js";
25
+ import { appendEvent } from "../workflow-events.js";
26
+
27
+ export interface ReopenSliceParams {
28
+ milestoneId: string;
29
+ sliceId: string;
30
+ reason?: string;
31
+ /** Optional caller-provided identity for audit trail */
32
+ actorName?: string;
33
+ /** Optional caller-provided reason this action was triggered */
34
+ triggerReason?: string;
35
+ }
36
+
37
+ export interface ReopenSliceResult {
38
+ milestoneId: string;
39
+ sliceId: string;
40
+ tasksReset: number;
41
+ }
42
+
43
+ export async function handleReopenSlice(
44
+ params: ReopenSliceParams,
45
+ basePath: string,
46
+ ): Promise<ReopenSliceResult | { error: string }> {
47
+ // ── Validate required fields ────────────────────────────────────────────
48
+ if (!params.sliceId || typeof params.sliceId !== "string" || params.sliceId.trim() === "") {
49
+ return { error: "sliceId is required and must be a non-empty string" };
50
+ }
51
+ if (!params.milestoneId || typeof params.milestoneId !== "string" || params.milestoneId.trim() === "") {
52
+ return { error: "milestoneId is required and must be a non-empty string" };
53
+ }
54
+
55
+ // ── Guards + DB writes inside a single transaction (prevents TOCTOU) ───
56
+ let guardError: string | null = null;
57
+ let tasksResetCount = 0;
58
+
59
+ transaction(() => {
60
+ const milestone = getMilestone(params.milestoneId);
61
+ if (!milestone) {
62
+ guardError = `milestone not found: ${params.milestoneId}`;
63
+ return;
64
+ }
65
+ if (milestone.status === "complete" || milestone.status === "done") {
66
+ guardError = `cannot reopen slice inside a closed milestone: ${params.milestoneId} (status: ${milestone.status})`;
67
+ return;
68
+ }
69
+
70
+ const slice = getSlice(params.milestoneId, params.sliceId);
71
+ if (!slice) {
72
+ guardError = `slice not found: ${params.milestoneId}/${params.sliceId}`;
73
+ return;
74
+ }
75
+ if (slice.status !== "complete" && slice.status !== "done") {
76
+ guardError = `slice ${params.sliceId} is not complete (status: ${slice.status}) — nothing to reopen`;
77
+ return;
78
+ }
79
+
80
+ // Fetch tasks inside txn so the list is consistent with the slice status check
81
+ const tasks = getSliceTasks(params.milestoneId, params.sliceId);
82
+ tasksResetCount = tasks.length;
83
+
84
+ updateSliceStatus(params.milestoneId, params.sliceId, "in_progress");
85
+ for (const task of tasks) {
86
+ updateTaskStatus(params.milestoneId, params.sliceId, task.id, "pending");
87
+ }
88
+ });
89
+
90
+ if (guardError) {
91
+ return { error: guardError };
92
+ }
93
+
94
+ // ── Invalidate caches ────────────────────────────────────────────────────
95
+ invalidateStateCache();
96
+
97
+ // ── Post-mutation hook ───────────────────────────────────────────────────
98
+ try {
99
+ await renderAllProjections(basePath, params.milestoneId);
100
+ writeManifest(basePath);
101
+ appendEvent(basePath, {
102
+ cmd: "reopen-slice",
103
+ params: {
104
+ milestoneId: params.milestoneId,
105
+ sliceId: params.sliceId,
106
+ reason: params.reason ?? null,
107
+ tasksReset: tasksResetCount,
108
+ },
109
+ ts: new Date().toISOString(),
110
+ actor: "agent",
111
+ actor_name: params.actorName,
112
+ trigger_reason: params.triggerReason,
113
+ });
114
+ } catch (hookErr) {
115
+ process.stderr.write(
116
+ `gsd: reopen-slice post-mutation hook warning: ${(hookErr as Error).message}\n`,
117
+ );
118
+ }
119
+
120
+ return {
121
+ milestoneId: params.milestoneId,
122
+ sliceId: params.sliceId,
123
+ tasksReset: tasksResetCount,
124
+ };
125
+ }
@@ -0,0 +1,129 @@
1
+ /**
2
+ * reopen-task handler — the core operation behind gsd_task_reopen.
3
+ *
4
+ * Resets a completed task back to "pending" so it can be re-done
5
+ * without manual SQL surgery. The parent slice and milestone must
6
+ * still be open (not complete) — you cannot reopen tasks inside a
7
+ * closed slice.
8
+ */
9
+
10
+ // GSD — reopen-task tool handler
11
+ // Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
12
+
13
+ import {
14
+ getMilestone,
15
+ getSlice,
16
+ getTask,
17
+ updateTaskStatus,
18
+ transaction,
19
+ } from "../gsd-db.js";
20
+ import { invalidateStateCache } from "../state.js";
21
+ import { renderAllProjections } from "../workflow-projections.js";
22
+ import { writeManifest } from "../workflow-manifest.js";
23
+ import { appendEvent } from "../workflow-events.js";
24
+
25
+ export interface ReopenTaskParams {
26
+ milestoneId: string;
27
+ sliceId: string;
28
+ taskId: string;
29
+ reason?: string;
30
+ /** Optional caller-provided identity for audit trail */
31
+ actorName?: string;
32
+ /** Optional caller-provided reason this action was triggered */
33
+ triggerReason?: string;
34
+ }
35
+
36
+ export interface ReopenTaskResult {
37
+ milestoneId: string;
38
+ sliceId: string;
39
+ taskId: string;
40
+ }
41
+
42
+ export async function handleReopenTask(
43
+ params: ReopenTaskParams,
44
+ basePath: string,
45
+ ): Promise<ReopenTaskResult | { error: string }> {
46
+ // ── Validate required fields ────────────────────────────────────────────
47
+ if (!params.taskId || typeof params.taskId !== "string" || params.taskId.trim() === "") {
48
+ return { error: "taskId is required and must be a non-empty string" };
49
+ }
50
+ if (!params.sliceId || typeof params.sliceId !== "string" || params.sliceId.trim() === "") {
51
+ return { error: "sliceId is required and must be a non-empty string" };
52
+ }
53
+ if (!params.milestoneId || typeof params.milestoneId !== "string" || params.milestoneId.trim() === "") {
54
+ return { error: "milestoneId is required and must be a non-empty string" };
55
+ }
56
+
57
+ // ── Guards + DB write inside a single transaction (prevents TOCTOU) ────
58
+ let guardError: string | null = null;
59
+
60
+ transaction(() => {
61
+ const milestone = getMilestone(params.milestoneId);
62
+ if (!milestone) {
63
+ guardError = `milestone not found: ${params.milestoneId}`;
64
+ return;
65
+ }
66
+ if (milestone.status === "complete" || milestone.status === "done") {
67
+ guardError = `cannot reopen task in a closed milestone: ${params.milestoneId} (status: ${milestone.status})`;
68
+ return;
69
+ }
70
+
71
+ const slice = getSlice(params.milestoneId, params.sliceId);
72
+ if (!slice) {
73
+ guardError = `slice not found: ${params.milestoneId}/${params.sliceId}`;
74
+ return;
75
+ }
76
+ if (slice.status === "complete" || slice.status === "done") {
77
+ guardError = `cannot reopen task inside a closed slice: ${params.sliceId} (status: ${slice.status}) — use gsd_slice_reopen first`;
78
+ return;
79
+ }
80
+
81
+ const task = getTask(params.milestoneId, params.sliceId, params.taskId);
82
+ if (!task) {
83
+ guardError = `task not found: ${params.milestoneId}/${params.sliceId}/${params.taskId}`;
84
+ return;
85
+ }
86
+ if (task.status !== "complete" && task.status !== "done") {
87
+ guardError = `task ${params.taskId} is not complete (status: ${task.status}) — nothing to reopen`;
88
+ return;
89
+ }
90
+
91
+ updateTaskStatus(params.milestoneId, params.sliceId, params.taskId, "pending");
92
+ });
93
+
94
+ if (guardError) {
95
+ return { error: guardError };
96
+ }
97
+
98
+ // ── Invalidate caches ────────────────────────────────────────────────────
99
+ invalidateStateCache();
100
+
101
+ // ── Post-mutation hook ───────────────────────────────────────────────────
102
+ try {
103
+ await renderAllProjections(basePath, params.milestoneId);
104
+ writeManifest(basePath);
105
+ appendEvent(basePath, {
106
+ cmd: "reopen-task",
107
+ params: {
108
+ milestoneId: params.milestoneId,
109
+ sliceId: params.sliceId,
110
+ taskId: params.taskId,
111
+ reason: params.reason ?? null,
112
+ },
113
+ ts: new Date().toISOString(),
114
+ actor: "agent",
115
+ actor_name: params.actorName,
116
+ trigger_reason: params.triggerReason,
117
+ });
118
+ } catch (hookErr) {
119
+ process.stderr.write(
120
+ `gsd: reopen-task post-mutation hook warning: ${(hookErr as Error).message}\n`,
121
+ );
122
+ }
123
+
124
+ return {
125
+ milestoneId: params.milestoneId,
126
+ sliceId: params.sliceId,
127
+ taskId: params.taskId,
128
+ };
129
+ }
@@ -11,6 +11,9 @@ import {
11
11
  } from "../gsd-db.js";
12
12
  import { invalidateStateCache } from "../state.js";
13
13
  import { renderPlanFromDb, renderReplanFromDb } from "../markdown-renderer.js";
14
+ import { renderAllProjections } from "../workflow-projections.js";
15
+ import { writeManifest } from "../workflow-manifest.js";
16
+ import { appendEvent } from "../workflow-events.js";
14
17
 
15
18
  export interface ReplanSliceTaskInput {
16
19
  taskId: string;
@@ -21,6 +24,7 @@ export interface ReplanSliceTaskInput {
21
24
  verify: string;
22
25
  inputs: string[];
23
26
  expectedOutput: string[];
27
+ fullPlanMd?: string;
24
28
  }
25
29
 
26
30
  export interface ReplanSliceParams {
@@ -31,6 +35,10 @@ export interface ReplanSliceParams {
31
35
  whatChanged: string;
32
36
  updatedTasks: ReplanSliceTaskInput[];
33
37
  removedTaskIds: string[];
38
+ /** Optional caller-provided identity for audit trail */
39
+ actorName?: string;
40
+ /** Optional caller-provided reason this action was triggered */
41
+ triggerReason?: string;
34
42
  }
35
43
 
36
44
  export interface ReplanSliceResult {
@@ -82,11 +90,23 @@ export async function handleReplanSlice(
82
90
  return { error: `validation failed: ${(err as Error).message}` };
83
91
  }
84
92
 
85
- // ── Verify parent slice exists ────────────────────────────────────
93
+ // ── Verify parent slice exists and is not closed ─────────────────
86
94
  const parentSlice = getSlice(params.milestoneId, params.sliceId);
87
95
  if (!parentSlice) {
88
96
  return { error: `missing parent slice: ${params.milestoneId}/${params.sliceId}` };
89
97
  }
98
+ if (parentSlice.status === "complete" || parentSlice.status === "done") {
99
+ return { error: `cannot replan a closed slice: ${params.sliceId} (status: ${parentSlice.status})` };
100
+ }
101
+
102
+ // ── Verify blocker task exists and is complete ────────────────────
103
+ const blockerTask = getTask(params.milestoneId, params.sliceId, params.blockerTaskId);
104
+ if (!blockerTask) {
105
+ return { error: `blockerTaskId not found: ${params.milestoneId}/${params.sliceId}/${params.blockerTaskId}` };
106
+ }
107
+ if (blockerTask.status !== "complete" && blockerTask.status !== "done") {
108
+ return { error: `blockerTaskId ${params.blockerTaskId} is not complete (status: ${blockerTask.status}) — the blocker task must be finished before a replan is triggered` };
109
+ }
90
110
 
91
111
  // ── Structural enforcement ────────────────────────────────────────
92
112
  const existingTasks = getSliceTasks(params.milestoneId, params.sliceId);
@@ -136,6 +156,7 @@ export async function handleReplanSlice(
136
156
  verify: updatedTask.verify || "",
137
157
  inputs: updatedTask.inputs || [],
138
158
  expectedOutput: updatedTask.expectedOutput || [],
159
+ fullPlanMd: updatedTask.fullPlanMd,
139
160
  });
140
161
  } else {
141
162
  // Insert new task then set planning fields
@@ -154,6 +175,7 @@ export async function handleReplanSlice(
154
175
  verify: updatedTask.verify || "",
155
176
  inputs: updatedTask.inputs || [],
156
177
  expectedOutput: updatedTask.expectedOutput || [],
178
+ fullPlanMd: updatedTask.fullPlanMd,
157
179
  });
158
180
  }
159
181
  }
@@ -180,6 +202,24 @@ export async function handleReplanSlice(
180
202
  invalidateStateCache();
181
203
  clearParseCache();
182
204
 
205
+ // ── Post-mutation hook: projections, manifest, event log ─────
206
+ try {
207
+ await renderAllProjections(basePath, params.milestoneId);
208
+ writeManifest(basePath);
209
+ appendEvent(basePath, {
210
+ cmd: "replan-slice",
211
+ params: { milestoneId: params.milestoneId, sliceId: params.sliceId, blockerTaskId: params.blockerTaskId },
212
+ ts: new Date().toISOString(),
213
+ actor: "agent",
214
+ actor_name: params.actorName,
215
+ trigger_reason: params.triggerReason,
216
+ });
217
+ } catch (hookErr) {
218
+ process.stderr.write(
219
+ `gsd: replan-slice post-mutation hook warning: ${(hookErr as Error).message}\n`,
220
+ );
221
+ }
222
+
183
223
  return {
184
224
  milestoneId: params.milestoneId,
185
225
  sliceId: params.sliceId,