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
@@ -5,7 +5,7 @@ import type { DoctorIssue, DoctorIssueCode } from "./doctor-types.js";
5
5
  import { readRepoMeta, externalProjectsRoot, cleanNumberedGsdVariants } from "./repo-identity.js";
6
6
  import { loadFile } from "./files.js";
7
7
  import { parseRoadmap as parseLegacyRoadmap } from "./parsers-legacy.js";
8
- import { isDbAvailable, getMilestoneSlices } from "./gsd-db.js";
8
+ import { isDbAvailable, _getAdapter, getMilestoneSlices } from "./gsd-db.js";
9
9
  import { resolveMilestoneFile, milestonesDir, gsdRoot, resolveGsdRootFile, relGsdRootFile } from "./paths.js";
10
10
  import { deriveState, isMilestoneComplete } from "./state.js";
11
11
  import { saveFile } from "./files.js";
@@ -19,13 +19,15 @@ import { getAllWorktreeHealth } from "./worktree-health.js";
19
19
  import { readAllSessionStatuses, isSessionStale, removeSessionStatus } from "./session-status-io.js";
20
20
  import { recoverFailedMigration } from "./migrate-external.js";
21
21
  import { loadEffectiveGSDPreferences } from "./preferences.js";
22
+ import { readEvents } from "./workflow-events.js";
23
+ import { renderAllProjections } from "./workflow-projections.js";
22
24
 
23
25
  export async function checkGitHealth(
24
26
  basePath: string,
25
27
  issues: DoctorIssue[],
26
28
  fixesApplied: string[],
27
29
  shouldFix: (code: DoctorIssueCode) => boolean,
28
- isolationMode: "none" | "worktree" | "branch" = "worktree",
30
+ isolationMode: "none" | "worktree" | "branch" = "none",
29
31
  ): Promise<void> {
30
32
  // Degrade gracefully if not a git repo
31
33
  if (!nativeIsRepo(basePath)) {
@@ -1111,3 +1113,179 @@ export async function checkGlobalHealth(
1111
1113
  // Non-fatal — global health check must not block per-project doctor
1112
1114
  }
1113
1115
  }
1116
+
1117
+ // ── Engine Health Checks ────────────────────────────────────────────────────
1118
+ // DB constraint violation detection and projection drift checks.
1119
+
1120
+ export async function checkEngineHealth(
1121
+ basePath: string,
1122
+ issues: DoctorIssue[],
1123
+ fixesApplied: string[],
1124
+ ): Promise<void> {
1125
+ // ── DB constraint violation detection (full doctor only, not pre-dispatch per D-10) ──
1126
+ try {
1127
+ if (isDbAvailable()) {
1128
+ const adapter = _getAdapter()!;
1129
+
1130
+ // a. Orphaned tasks (task.slice_id points to non-existent slice)
1131
+ try {
1132
+ const orphanedTasks = adapter
1133
+ .prepare(
1134
+ `SELECT t.id, t.slice_id, t.milestone_id
1135
+ FROM tasks t
1136
+ LEFT JOIN slices s ON t.milestone_id = s.milestone_id AND t.slice_id = s.id
1137
+ WHERE s.id IS NULL`,
1138
+ )
1139
+ .all() as Array<{ id: string; slice_id: string; milestone_id: string }>;
1140
+
1141
+ for (const row of orphanedTasks) {
1142
+ issues.push({
1143
+ severity: "error",
1144
+ code: "db_orphaned_task",
1145
+ scope: "task",
1146
+ unitId: `${row.milestone_id}/${row.slice_id}/${row.id}`,
1147
+ message: `Task ${row.id} references slice ${row.slice_id} in milestone ${row.milestone_id} but no such slice exists in the database`,
1148
+ fixable: false,
1149
+ });
1150
+ }
1151
+ } catch {
1152
+ // Non-fatal — orphaned task check failed
1153
+ }
1154
+
1155
+ // b. Orphaned slices (slice.milestone_id points to non-existent milestone)
1156
+ try {
1157
+ const orphanedSlices = adapter
1158
+ .prepare(
1159
+ `SELECT s.id, s.milestone_id
1160
+ FROM slices s
1161
+ LEFT JOIN milestones m ON s.milestone_id = m.id
1162
+ WHERE m.id IS NULL`,
1163
+ )
1164
+ .all() as Array<{ id: string; milestone_id: string }>;
1165
+
1166
+ for (const row of orphanedSlices) {
1167
+ issues.push({
1168
+ severity: "error",
1169
+ code: "db_orphaned_slice",
1170
+ scope: "slice",
1171
+ unitId: `${row.milestone_id}/${row.id}`,
1172
+ message: `Slice ${row.id} references milestone ${row.milestone_id} but no such milestone exists in the database`,
1173
+ fixable: false,
1174
+ });
1175
+ }
1176
+ } catch {
1177
+ // Non-fatal — orphaned slice check failed
1178
+ }
1179
+
1180
+ // c. Tasks marked complete without summaries
1181
+ try {
1182
+ const doneTasks = adapter
1183
+ .prepare(
1184
+ `SELECT id, slice_id, milestone_id FROM tasks
1185
+ WHERE status = 'done' AND (summary IS NULL OR summary = '')`,
1186
+ )
1187
+ .all() as Array<{ id: string; slice_id: string; milestone_id: string }>;
1188
+
1189
+ for (const row of doneTasks) {
1190
+ issues.push({
1191
+ severity: "warning",
1192
+ code: "db_done_task_no_summary",
1193
+ scope: "task",
1194
+ unitId: `${row.milestone_id}/${row.slice_id}/${row.id}`,
1195
+ message: `Task ${row.id} is marked done but has no summary in the database`,
1196
+ fixable: false,
1197
+ });
1198
+ }
1199
+ } catch {
1200
+ // Non-fatal — done-task-no-summary check failed
1201
+ }
1202
+
1203
+ // d. Duplicate entity IDs (safety check)
1204
+ try {
1205
+ const dupMilestones = adapter
1206
+ .prepare("SELECT id, COUNT(*) as cnt FROM milestones GROUP BY id HAVING cnt > 1")
1207
+ .all() as Array<{ id: string; cnt: number }>;
1208
+ for (const row of dupMilestones) {
1209
+ issues.push({
1210
+ severity: "error",
1211
+ code: "db_duplicate_id",
1212
+ scope: "milestone",
1213
+ unitId: row.id,
1214
+ message: `Duplicate milestone ID "${row.id}" appears ${row.cnt} times in the database`,
1215
+ fixable: false,
1216
+ });
1217
+ }
1218
+
1219
+ const dupSlices = adapter
1220
+ .prepare("SELECT id, milestone_id, COUNT(*) as cnt FROM slices GROUP BY id, milestone_id HAVING cnt > 1")
1221
+ .all() as Array<{ id: string; milestone_id: string; cnt: number }>;
1222
+ for (const row of dupSlices) {
1223
+ issues.push({
1224
+ severity: "error",
1225
+ code: "db_duplicate_id",
1226
+ scope: "slice",
1227
+ unitId: `${row.milestone_id}/${row.id}`,
1228
+ message: `Duplicate slice ID "${row.id}" in milestone ${row.milestone_id} appears ${row.cnt} times`,
1229
+ fixable: false,
1230
+ });
1231
+ }
1232
+
1233
+ const dupTasks = adapter
1234
+ .prepare("SELECT id, slice_id, milestone_id, COUNT(*) as cnt FROM tasks GROUP BY id, slice_id, milestone_id HAVING cnt > 1")
1235
+ .all() as Array<{ id: string; slice_id: string; milestone_id: string; cnt: number }>;
1236
+ for (const row of dupTasks) {
1237
+ issues.push({
1238
+ severity: "error",
1239
+ code: "db_duplicate_id",
1240
+ scope: "task",
1241
+ unitId: `${row.milestone_id}/${row.slice_id}/${row.id}`,
1242
+ message: `Duplicate task ID "${row.id}" in slice ${row.slice_id} appears ${row.cnt} times`,
1243
+ fixable: false,
1244
+ });
1245
+ }
1246
+ } catch {
1247
+ // Non-fatal — duplicate ID check failed
1248
+ }
1249
+ }
1250
+ } catch {
1251
+ // Non-fatal — DB constraint checks failed entirely
1252
+ }
1253
+
1254
+ // ── Projection drift detection ──────────────────────────────────────────
1255
+ // If the DB is available, check whether markdown projections are stale
1256
+ // relative to the event log and re-render them.
1257
+ try {
1258
+ if (isDbAvailable()) {
1259
+ const eventLogPath = join(basePath, ".gsd", "event-log.jsonl");
1260
+ const events = readEvents(eventLogPath);
1261
+ if (events.length > 0) {
1262
+ const lastEventTs = new Date(events[events.length - 1]!.ts).getTime();
1263
+ const state = await deriveState(basePath);
1264
+ for (const milestone of state.registry) {
1265
+ if (milestone.status === "complete") continue;
1266
+ const roadmapPath = resolveMilestoneFile(basePath, milestone.id, "ROADMAP");
1267
+ if (!roadmapPath || !existsSync(roadmapPath)) {
1268
+ try {
1269
+ await renderAllProjections(basePath, milestone.id);
1270
+ fixesApplied.push(`re-rendered missing projections for ${milestone.id}`);
1271
+ } catch {
1272
+ // Non-fatal — projection re-render failed
1273
+ }
1274
+ continue;
1275
+ }
1276
+ const projectionMtime = statSync(roadmapPath).mtimeMs;
1277
+ if (lastEventTs > projectionMtime) {
1278
+ try {
1279
+ await renderAllProjections(basePath, milestone.id);
1280
+ fixesApplied.push(`re-rendered stale projections for ${milestone.id}`);
1281
+ } catch {
1282
+ // Non-fatal — projection re-render failed
1283
+ }
1284
+ }
1285
+ }
1286
+ }
1287
+ }
1288
+ } catch {
1289
+ // Non-fatal — projection drift check must never block doctor
1290
+ }
1291
+ }
@@ -70,7 +70,13 @@ export type DoctorIssueCode =
70
70
  | "large_planning_file"
71
71
  // Slow environment checks (opt-in via --build / --test flags)
72
72
  | "env_build"
73
- | "env_test";
73
+ | "env_test"
74
+ // Engine health checks (Phase 4)
75
+ | "db_orphaned_task"
76
+ | "db_orphaned_slice"
77
+ | "db_done_task_no_summary"
78
+ | "db_duplicate_id"
79
+ | "projection_drift";
74
80
 
75
81
  /**
76
82
  * Issue codes that represent global or completion-critical state.
@@ -12,7 +12,7 @@ import { loadEffectiveGSDPreferences, type GSDPreferences } from "./preferences.
12
12
  import type { DoctorIssue, DoctorIssueCode, DoctorReport } from "./doctor-types.js";
13
13
  import { GLOBAL_STATE_CODES } from "./doctor-types.js";
14
14
  import type { RoadmapSliceEntry } from "./types.js";
15
- import { checkGitHealth, checkRuntimeHealth, checkGlobalHealth } from "./doctor-checks.js";
15
+ import { checkGitHealth, checkRuntimeHealth, checkGlobalHealth, checkEngineHealth } from "./doctor-checks.js";
16
16
  import { checkEnvironmentHealth } from "./doctor-environment.js";
17
17
  import { runProviderChecks } from "./doctor-providers.js";
18
18
 
@@ -360,8 +360,8 @@ export async function runGSDDoctor(basePath: string, options?: { fix?: boolean;
360
360
  // Git health checks — timed
361
361
  const t0git = Date.now();
362
362
  const isolationMode: "none" | "worktree" | "branch" = options?.isolationMode ??
363
- (prefs?.preferences?.git?.isolation === "none" ? "none" :
364
- prefs?.preferences?.git?.isolation === "branch" ? "branch" : "worktree");
363
+ (prefs?.preferences?.git?.isolation === "worktree" ? "worktree" :
364
+ prefs?.preferences?.git?.isolation === "branch" ? "branch" : "none");
365
365
  await checkGitHealth(basePath, issues, fixesApplied, shouldFix, isolationMode);
366
366
  const gitMs = Date.now() - t0git;
367
367
 
@@ -382,6 +382,9 @@ export async function runGSDDoctor(basePath: string, options?: { fix?: boolean;
382
382
  });
383
383
  const envMs = Date.now() - t0env;
384
384
 
385
+ // Engine health checks — DB constraints and projection drift
386
+ await checkEngineHealth(basePath, issues, fixesApplied);
387
+
385
388
  const milestonesPath = milestonesDir(basePath);
386
389
  if (!existsSync(milestonesPath)) {
387
390
  const report: DoctorReport = { ok: issues.every(i => i.severity !== "error"), basePath, issues, fixesApplied, timing: { git: gitMs, runtime: runtimeMs, environment: envMs, gsdState: 0 } };
@@ -470,7 +473,7 @@ export async function runGSDDoctor(basePath: string, options?: { fix?: boolean;
470
473
  if (!roadmapContent) continue;
471
474
 
472
475
  // Normalize slices: prefer DB, fall back to parser
473
- type NormSlice = RoadmapSliceEntry;
476
+ type NormSlice = RoadmapSliceEntry & { pending?: boolean };
474
477
  let slices: NormSlice[];
475
478
  if (isDbAvailable()) {
476
479
  const dbSlices = getMilestoneSlices(milestoneId);
@@ -478,6 +481,7 @@ export async function runGSDDoctor(basePath: string, options?: { fix?: boolean;
478
481
  id: s.id,
479
482
  title: s.title,
480
483
  done: s.status === "complete",
484
+ pending: s.status === "pending",
481
485
  risk: (s.risk || "medium") as RoadmapSliceEntry["risk"],
482
486
  depends: s.depends,
483
487
  demo: s.demo,
@@ -564,6 +568,9 @@ export async function runGSDDoctor(basePath: string, options?: { fix?: boolean;
564
568
 
565
569
  const slicePath = resolveSlicePath(basePath, milestoneId, slice.id);
566
570
  if (!slicePath) {
571
+ // Pending slices haven't been planned yet — directories are created
572
+ // lazily by ensurePreconditions() at dispatch time. Skip them.
573
+ if (slice.pending) continue;
567
574
  const expectedPath = relSlicePath(basePath, milestoneId, slice.id);
568
575
  issues.push({
569
576
  severity: slice.done ? "warning" : "error",
@@ -586,6 +593,8 @@ export async function runGSDDoctor(basePath: string, options?: { fix?: boolean;
586
593
 
587
594
  const tasksDir = resolveTasksDir(basePath, milestoneId, slice.id);
588
595
  if (!tasksDir) {
596
+ // Pending slices haven't been planned yet — tasks/ is created on demand.
597
+ if (slice.pending) continue;
589
598
  issues.push({
590
599
  severity: slice.done ? "warning" : "error",
591
600
  code: "missing_tasks_dir",
@@ -684,13 +684,17 @@ export function createDraftPR(
684
684
  milestoneId: string,
685
685
  title: string,
686
686
  body: string,
687
+ opts?: { head?: string; base?: string },
687
688
  ): string | null {
688
689
  try {
689
- const result = execFileSync("gh", [
690
+ const args = [
690
691
  "pr", "create", "--draft",
691
692
  "--title", title,
692
693
  "--body", body,
693
- ], { cwd: basePath, encoding: "utf8", timeout: 30000, env: GIT_NO_PROMPT_ENV });
694
+ ];
695
+ if (opts?.head) args.push("--head", opts.head);
696
+ if (opts?.base) args.push("--base", opts.base);
697
+ const result = execFileSync("gh", args, { cwd: basePath, encoding: "utf8", timeout: 30000, env: GIT_NO_PROMPT_ENV });
694
698
  return result.trim();
695
699
  } catch {
696
700
  return null;
@@ -78,8 +78,12 @@ function loadProvider(): void {
78
78
  // unavailable
79
79
  }
80
80
 
81
+ const nodeMajor = parseInt(process.versions.node.split(".")[0], 10);
82
+ const versionHint = nodeMajor < 22
83
+ ? ` GSD requires Node >= 22.0.0 (current: v${process.versions.node}). Upgrade Node to fix this.`
84
+ : "";
81
85
  process.stderr.write(
82
- "gsd-db: No SQLite provider available (tried node:sqlite, better-sqlite3)\n",
86
+ `gsd-db: No SQLite provider available (tried node:sqlite, better-sqlite3).${versionHint}\n`,
83
87
  );
84
88
  }
85
89
 
@@ -145,7 +149,7 @@ function openRawDb(path: string): unknown {
145
149
  return new Database(path);
146
150
  }
147
151
 
148
- const SCHEMA_VERSION = 10;
152
+ const SCHEMA_VERSION = 11;
149
153
 
150
154
  function initSchema(db: DbAdapter, fileBacked: boolean): void {
151
155
  if (fileBacked) db.exec("PRAGMA journal_mode=WAL");
@@ -301,6 +305,7 @@ function initSchema(db: DbAdapter, fileBacked: boolean): void {
301
305
  inputs TEXT NOT NULL DEFAULT '[]',
302
306
  expected_output TEXT NOT NULL DEFAULT '[]',
303
307
  observability_impact TEXT NOT NULL DEFAULT '',
308
+ full_plan_md TEXT NOT NULL DEFAULT '',
304
309
  sequence INTEGER DEFAULT 0, -- DEAD CODE: no tool exposes sequence — always 0
305
310
  PRIMARY KEY (milestone_id, slice_id, id),
306
311
  FOREIGN KEY (milestone_id, slice_id) REFERENCES slices(milestone_id, id)
@@ -616,6 +621,22 @@ function migrateSchema(db: DbAdapter): void {
616
621
  });
617
622
  }
618
623
 
624
+ if (currentVersion < 11) {
625
+ ensureColumn(db, "tasks", "full_plan_md", `ALTER TABLE tasks ADD COLUMN full_plan_md TEXT NOT NULL DEFAULT ''`);
626
+ // Add unique constraint to replan_history for idempotency:
627
+ // one replan record per blocker task per slice per milestone.
628
+ db.exec(`
629
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_replan_history_unique
630
+ ON replan_history(milestone_id, slice_id, task_id)
631
+ WHERE slice_id IS NOT NULL AND task_id IS NOT NULL
632
+ `);
633
+
634
+ db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
635
+ ":version": 11,
636
+ ":applied_at": new Date().toISOString(),
637
+ });
638
+ }
639
+
619
640
  db.exec("COMMIT");
620
641
  } catch (err) {
621
642
  db.exec("ROLLBACK");
@@ -923,6 +944,7 @@ export interface TaskPlanningRecord {
923
944
  inputs: string[];
924
945
  expectedOutput: string[];
925
946
  observabilityImpact: string;
947
+ fullPlanMd?: string;
926
948
  }
927
949
 
928
950
  export function insertMilestone(m: {
@@ -1163,7 +1185,8 @@ export function upsertTaskPlanning(milestoneId: string, sliceId: string, taskId:
1163
1185
  verify = COALESCE(:verify, verify),
1164
1186
  inputs = COALESCE(:inputs, inputs),
1165
1187
  expected_output = COALESCE(:expected_output, expected_output),
1166
- observability_impact = COALESCE(:observability_impact, observability_impact)
1188
+ observability_impact = COALESCE(:observability_impact, observability_impact),
1189
+ full_plan_md = COALESCE(:full_plan_md, full_plan_md)
1167
1190
  WHERE milestone_id = :milestone_id AND slice_id = :slice_id AND id = :id`,
1168
1191
  ).run({
1169
1192
  ":milestone_id": milestoneId,
@@ -1177,6 +1200,7 @@ export function upsertTaskPlanning(milestoneId: string, sliceId: string, taskId:
1177
1200
  ":inputs": planning.inputs ? JSON.stringify(planning.inputs) : null,
1178
1201
  ":expected_output": planning.expectedOutput ? JSON.stringify(planning.expectedOutput) : null,
1179
1202
  ":observability_impact": planning.observabilityImpact ?? null,
1203
+ ":full_plan_md": planning.fullPlanMd ?? null,
1180
1204
  });
1181
1205
  }
1182
1206
 
@@ -1268,6 +1292,7 @@ export interface TaskRow {
1268
1292
  inputs: string[];
1269
1293
  expected_output: string[];
1270
1294
  observability_impact: string;
1295
+ full_plan_md: string;
1271
1296
  sequence: number;
1272
1297
  }
1273
1298
 
@@ -1296,6 +1321,7 @@ function rowToTask(row: Record<string, unknown>): TaskRow {
1296
1321
  inputs: JSON.parse((row["inputs"] as string) || "[]"),
1297
1322
  expected_output: JSON.parse((row["expected_output"] as string) || "[]"),
1298
1323
  observability_impact: (row["observability_impact"] as string) ?? "",
1324
+ full_plan_md: (row["full_plan_md"] as string) ?? "",
1299
1325
  sequence: (row["sequence"] as number) ?? 0,
1300
1326
  };
1301
1327
  }
@@ -1587,8 +1613,10 @@ export function insertReplanHistory(entry: {
1587
1613
  replacementArtifactPath?: string | null;
1588
1614
  }): void {
1589
1615
  if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
1616
+ // INSERT OR REPLACE: idempotent on (milestone_id, slice_id, task_id) via schema v11 unique index.
1617
+ // Retrying the same replan silently updates summary instead of accumulating duplicate rows.
1590
1618
  currentDb.prepare(
1591
- `INSERT INTO replan_history (milestone_id, slice_id, task_id, summary, previous_artifact_path, replacement_artifact_path, created_at)
1619
+ `INSERT OR REPLACE INTO replan_history (milestone_id, slice_id, task_id, summary, previous_artifact_path, replacement_artifact_path, created_at)
1592
1620
  VALUES (:milestone_id, :slice_id, :task_id, :summary, :previous_artifact_path, :replacement_artifact_path, :created_at)`,
1593
1621
  ).run({
1594
1622
  ":milestone_id": entry.milestoneId,
@@ -910,8 +910,7 @@ export async function showSmartEntry(
910
910
  // when the user exits during init wizard or discuss phase before any
911
911
  // real auto-mode work begins.
912
912
  const isBootstrapCrash = crashLock.unitType === "starting"
913
- && crashLock.unitId === "bootstrap"
914
- && crashLock.completedUnits === 0;
913
+ && crashLock.unitId === "bootstrap";
915
914
 
916
915
  if (!isBootstrapCrash) {
917
916
  const resume = await showNextAction(ctx, {
@@ -32,7 +32,12 @@ export type JournalEventType =
32
32
  | "milestone-transition"
33
33
  | "stuck-detected"
34
34
  | "sidecar-dequeue"
35
- | "iteration-end";
35
+ | "iteration-end"
36
+ | "worktree-enter"
37
+ | "worktree-create-failed"
38
+ | "worktree-skip"
39
+ | "worktree-merge-start"
40
+ | "worktree-merge-failed";
36
41
 
37
42
  /** A single structured event in the journal. */
38
43
  export interface JournalEntry {
@@ -387,7 +387,7 @@ export async function renderTaskPlanFromDb(
387
387
  mkdirSync(tasksDir, { recursive: true });
388
388
  const absPath = join(tasksDir, buildTaskFileName(taskId, "PLAN"));
389
389
  const artifactPath = toArtifactPath(absPath, basePath);
390
- const content = renderTaskPlanMarkdown(task);
390
+ const content = task.full_plan_md.trim() ? task.full_plan_md : renderTaskPlanMarkdown(task);
391
391
 
392
392
  await writeAndStore(absPath, artifactPath, content, {
393
393
  artifact_type: "PLAN",
@@ -37,7 +37,7 @@ export function determineMergeOrder(
37
37
  workers: WorkerInfo[],
38
38
  order: MergeOrder = "sequential",
39
39
  ): string[] {
40
- const completed = workers.filter(w => w.state === "stopped" && w.completedUnits > 0);
40
+ const completed = workers.filter(w => w.state === "stopped");
41
41
  if (order === "by-completion") {
42
42
  return completed
43
43
  .sort((a, b) => a.startedAt - b.startedAt) // earliest first
@@ -52,7 +52,6 @@ export interface WorkerInfo {
52
52
  worktreePath: string;
53
53
  startedAt: number;
54
54
  state: "running" | "paused" | "stopped" | "error";
55
- completedUnits: number;
56
55
  cost: number;
57
56
  cleanup?: () => void;
58
57
  }
@@ -83,7 +82,6 @@ export interface PersistedState {
83
82
  worktreePath: string;
84
83
  startedAt: number;
85
84
  state: "running" | "paused" | "stopped" | "error";
86
- completedUnits: number;
87
85
  cost: number;
88
86
  }>;
89
87
  totalCost: number;
@@ -114,7 +112,6 @@ export function persistState(basePath: string): void {
114
112
  worktreePath: w.worktreePath,
115
113
  startedAt: w.startedAt,
116
114
  state: w.state,
117
- completedUnits: w.completedUnits,
118
115
  cost: w.cost,
119
116
  })),
120
117
  totalCost: state.totalCost,
@@ -226,7 +223,6 @@ function restoreRuntimeState(basePath: string): boolean {
226
223
  worktreePath: diskStatus?.worktreePath ?? w.worktreePath,
227
224
  startedAt: w.startedAt,
228
225
  state: diskStatus?.state ?? w.state,
229
- completedUnits: diskStatus?.completedUnits ?? w.completedUnits,
230
226
  cost: diskStatus?.cost ?? w.cost,
231
227
  });
232
228
  }
@@ -261,7 +257,6 @@ function restoreRuntimeState(basePath: string): boolean {
261
257
  worktreePath: status.worktreePath,
262
258
  startedAt: status.startedAt,
263
259
  state: status.state,
264
- completedUnits: status.completedUnits,
265
260
  cost: status.cost,
266
261
  });
267
262
  state.totalCost += status.cost;
@@ -389,7 +384,6 @@ export async function startParallel(
389
384
  worktreePath: w.worktreePath,
390
385
  startedAt: w.startedAt,
391
386
  state: "running",
392
- completedUnits: w.completedUnits,
393
387
  cost: w.cost,
394
388
  });
395
389
  adopted.push(w.milestoneId);
@@ -440,7 +434,6 @@ export async function startParallel(
440
434
  worktreePath: wtPath,
441
435
  startedAt: now,
442
436
  state: "running",
443
- completedUnits: 0,
444
437
  cost: 0,
445
438
  };
446
439
 
@@ -602,7 +595,7 @@ export function spawnWorker(
602
595
  pid: worker.pid,
603
596
  state: "running",
604
597
  currentUnit: null,
605
- completedUnits: worker.completedUnits,
598
+ completedUnits: 0,
606
599
  cost: worker.cost,
607
600
  lastHeartbeat: Date.now(),
608
601
  startedAt: worker.startedAt,
@@ -645,7 +638,7 @@ export function spawnWorker(
645
638
  pid: w.pid,
646
639
  state: w.state,
647
640
  currentUnit: null,
648
- completedUnits: w.completedUnits,
641
+ completedUnits: 0,
649
642
  cost: w.cost,
650
643
  lastHeartbeat: Date.now(),
651
644
  startedAt: w.startedAt,
@@ -727,14 +720,6 @@ function processWorkerLine(basePath: string, milestoneId: string, line: string):
727
720
  }
728
721
  }
729
722
 
730
- // Track completed units (each message_end from assistant = progress)
731
- if (msg.role === "assistant") {
732
- const worker = state.workers.get(milestoneId);
733
- if (worker) {
734
- worker.completedUnits++;
735
- }
736
- }
737
-
738
723
  // Update session status file so dashboard sees live cost
739
724
  const worker = state.workers.get(milestoneId);
740
725
  if (worker) {
@@ -743,7 +728,7 @@ function processWorkerLine(basePath: string, milestoneId: string, line: string):
743
728
  pid: worker.pid,
744
729
  state: worker.state,
745
730
  currentUnit: null,
746
- completedUnits: worker.completedUnits,
731
+ completedUnits: 0,
747
732
  cost: worker.cost,
748
733
  lastHeartbeat: Date.now(),
749
734
  startedAt: worker.startedAt,
@@ -762,7 +747,7 @@ function processWorkerLine(basePath: string, milestoneId: string, line: string):
762
747
  pid: worker.pid,
763
748
  state: worker.state,
764
749
  currentUnit: null,
765
- completedUnits: worker.completedUnits,
750
+ completedUnits: 0,
766
751
  cost: worker.cost,
767
752
  lastHeartbeat: Date.now(),
768
753
  startedAt: worker.startedAt,
@@ -930,14 +915,13 @@ export function refreshWorkerStatuses(
930
915
  if (!isPidAlive(worker.pid)) {
931
916
  worker.cleanup?.();
932
917
  worker.cleanup = undefined;
933
- worker.state = worker.completedUnits > 0 ? "stopped" : "error";
918
+ worker.state = "error";
934
919
  worker.process = null;
935
920
  }
936
921
  continue;
937
922
  }
938
923
 
939
924
  worker.state = diskStatus.state;
940
- worker.completedUnits = diskStatus.completedUnits;
941
925
  worker.cost = diskStatus.cost;
942
926
  worker.pid = diskStatus.pid;
943
927
  }
@@ -34,7 +34,7 @@ export const MODE_DEFAULTS: Record<WorkflowMode, Partial<GSDPreferences>> = {
34
34
  push_branches: false,
35
35
  pre_merge_check: false,
36
36
  merge_strategy: "squash",
37
- isolation: "worktree",
37
+ isolation: "none",
38
38
  },
39
39
  unique_milestone_ids: false,
40
40
  },
@@ -44,7 +44,7 @@ export const MODE_DEFAULTS: Record<WorkflowMode, Partial<GSDPreferences>> = {
44
44
  push_branches: true,
45
45
  pre_merge_check: true,
46
46
  merge_strategy: "squash",
47
- isolation: "worktree",
47
+ isolation: "none",
48
48
  },
49
49
  unique_milestone_ids: true,
50
50
  },
@@ -196,6 +196,13 @@ function loadPreferencesFile(path: string, scope: "global" | "project"): LoadedG
196
196
  };
197
197
  }
198
198
 
199
+ let _warnedUnrecognizedFormat = false;
200
+
201
+ /** @internal Reset the warn-once flag — exported for testing only. */
202
+ export function _resetParseWarningFlag(): void {
203
+ _warnedUnrecognizedFormat = false;
204
+ }
205
+
199
206
  /** @internal Exported for testing only */
200
207
  export function parsePreferencesMarkdown(content: string): GSDPreferences | null {
201
208
  // Use indexOf instead of [\s\S]*? regex to avoid backtracking (#468)
@@ -214,7 +221,10 @@ export function parsePreferencesMarkdown(content: string): GSDPreferences | null
214
221
  return parseHeadingListFormat(content);
215
222
  }
216
223
 
217
- console.warn("[parsePreferencesMarkdown] preferences.md exists but uses an unrecognized format — skipping.");
224
+ if (!_warnedUnrecognizedFormat) {
225
+ _warnedUnrecognizedFormat = true;
226
+ console.warn("[parsePreferencesMarkdown] preferences.md exists but uses an unrecognized format — skipping.");
227
+ }
218
228
  return null;
219
229
  }
220
230
 
@@ -487,13 +497,17 @@ export function resolvePreDispatchHooks(): PreDispatchHookConfig[] {
487
497
 
488
498
  /**
489
499
  * Resolve the effective git isolation mode from preferences.
490
- * Returns "worktree" (default), "branch", or "none".
500
+ * Returns "none" (default), "worktree", or "branch".
501
+ *
502
+ * Default is "none" so GSD works out of the box without preferences.md.
503
+ * Worktree isolation requires explicit opt-in because it depends on git
504
+ * branch infrastructure that must be set up before use.
491
505
  */
492
506
  export function getIsolationMode(): "none" | "worktree" | "branch" {
493
507
  const prefs = loadEffectiveGSDPreferences()?.preferences?.git;
494
- if (prefs?.isolation === "none") return "none";
508
+ if (prefs?.isolation === "worktree") return "worktree";
495
509
  if (prefs?.isolation === "branch") return "branch";
496
- return "worktree"; // default
510
+ return "none"; // default — no isolation, work on current branch
497
511
  }
498
512
 
499
513
  export function resolveParallelConfig(prefs: GSDPreferences | undefined): import("./types.js").ParallelConfig {