gsd-pi 2.65.0 → 2.66.0-dev.e159299

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 (462) hide show
  1. package/dist/mcp-server.js +6 -2
  2. package/dist/resources/extensions/browser-tools/capture.js +20 -1
  3. package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +93 -0
  4. package/dist/resources/extensions/gsd/auto/finalize-timeout.js +2 -0
  5. package/dist/resources/extensions/gsd/auto/loop.js +2 -2
  6. package/dist/resources/extensions/gsd/auto/phases.js +48 -5
  7. package/dist/resources/extensions/gsd/auto/run-unit.js +13 -2
  8. package/dist/resources/extensions/gsd/auto/session.js +4 -0
  9. package/dist/resources/extensions/gsd/auto/types.js +2 -0
  10. package/dist/resources/extensions/gsd/auto-dashboard.js +2 -1
  11. package/dist/resources/extensions/gsd/auto-dispatch.js +99 -9
  12. package/dist/resources/extensions/gsd/auto-model-selection.js +7 -5
  13. package/dist/resources/extensions/gsd/auto-post-unit.js +17 -6
  14. package/dist/resources/extensions/gsd/auto-prompts.js +24 -0
  15. package/dist/resources/extensions/gsd/auto-recovery.js +40 -22
  16. package/dist/resources/extensions/gsd/auto-start.js +175 -12
  17. package/dist/resources/extensions/gsd/auto-tool-tracking.js +10 -0
  18. package/dist/resources/extensions/gsd/auto-worktree.js +29 -7
  19. package/dist/resources/extensions/gsd/auto.js +21 -15
  20. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +17 -4
  21. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -0
  22. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +6 -4
  23. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +5 -1
  24. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +11 -3
  25. package/dist/resources/extensions/gsd/bootstrap/system-context.js +3 -1
  26. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +31 -1
  27. package/dist/resources/extensions/gsd/commands/context.js +8 -1
  28. package/dist/resources/extensions/gsd/commands/handlers/core.js +23 -2
  29. package/dist/resources/extensions/gsd/commands-extensions.js +1 -1
  30. package/dist/resources/extensions/gsd/config-overlay.js +312 -0
  31. package/dist/resources/extensions/gsd/db-writer.js +13 -3
  32. package/dist/resources/extensions/gsd/detection.js +1 -1
  33. package/dist/resources/extensions/gsd/dispatch-guard.js +2 -1
  34. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -0
  35. package/dist/resources/extensions/gsd/doctor.js +2 -1
  36. package/dist/resources/extensions/gsd/files.js +17 -0
  37. package/dist/resources/extensions/gsd/gitignore.js +1 -0
  38. package/dist/resources/extensions/gsd/gsd-db.js +47 -4
  39. package/dist/resources/extensions/gsd/guided-flow.js +220 -29
  40. package/dist/resources/extensions/gsd/index.js +1 -1
  41. package/dist/resources/extensions/gsd/json-persistence.js +5 -2
  42. package/dist/resources/extensions/gsd/md-importer.js +14 -7
  43. package/dist/resources/extensions/gsd/notification-overlay.js +1 -1
  44. package/dist/resources/extensions/gsd/notification-widget.js +2 -1
  45. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +1 -1
  46. package/dist/resources/extensions/gsd/parallel-orchestrator.js +17 -11
  47. package/dist/resources/extensions/gsd/pre-execution-checks.js +26 -5
  48. package/dist/resources/extensions/gsd/preferences-types.js +3 -0
  49. package/dist/resources/extensions/gsd/preferences-validation.js +45 -1
  50. package/dist/resources/extensions/gsd/preferences.js +9 -2
  51. package/dist/resources/extensions/gsd/preparation.js +1092 -0
  52. package/dist/resources/extensions/gsd/prompt-validation.js +67 -0
  53. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +3 -3
  54. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  55. package/dist/resources/extensions/gsd/prompts/discuss-prepared.md +424 -0
  56. package/dist/resources/extensions/gsd/prompts/discuss.md +2 -0
  57. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +6 -1
  58. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -4
  59. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +23 -0
  60. package/dist/resources/extensions/gsd/prompts/queue.md +2 -0
  61. package/dist/resources/extensions/gsd/prompts/rethink.md +2 -1
  62. package/dist/resources/extensions/gsd/prompts/system.md +2 -2
  63. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +56 -23
  64. package/dist/resources/extensions/gsd/quick.js +19 -15
  65. package/dist/resources/extensions/gsd/reactive-graph.js +12 -0
  66. package/dist/resources/extensions/gsd/roadmap-slices.js +24 -5
  67. package/dist/resources/extensions/gsd/safety/content-validator.js +3 -3
  68. package/dist/resources/extensions/gsd/session-lock.js +23 -1
  69. package/dist/resources/extensions/gsd/state.js +115 -28
  70. package/dist/resources/extensions/gsd/templates/context-enhanced.md +138 -0
  71. package/dist/resources/extensions/gsd/tools/complete-milestone.js +15 -3
  72. package/dist/resources/extensions/gsd/tools/complete-slice.js +27 -6
  73. package/dist/resources/extensions/gsd/tools/complete-task.js +31 -7
  74. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -5
  75. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +5 -2
  76. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +119 -0
  77. package/dist/resources/extensions/gsd/tools/reopen-slice.js +30 -0
  78. package/dist/resources/extensions/gsd/tools/reopen-task.js +18 -0
  79. package/dist/resources/extensions/gsd/triage-resolution.js +33 -16
  80. package/dist/resources/extensions/gsd/undo.js +3 -2
  81. package/dist/resources/extensions/gsd/workflow-events.js +1 -0
  82. package/dist/resources/extensions/gsd/workflow-logger.js +1 -1
  83. package/dist/resources/extensions/gsd/workflow-projections.js +7 -9
  84. package/dist/resources/extensions/gsd/workflow-reconcile.js +100 -9
  85. package/dist/resources/extensions/gsd/workflow-templates.js +11 -2
  86. package/dist/resources/extensions/gsd/worktree-manager.js +5 -2
  87. package/dist/resources/extensions/gsd/worktree.js +9 -0
  88. package/dist/resources/extensions/shared/interview-ui.js +1 -1
  89. package/dist/resources/extensions/subagent/agents.js +19 -5
  90. package/dist/web/standalone/.next/BUILD_ID +1 -1
  91. package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -17
  92. package/dist/web/standalone/.next/build-manifest.json +4 -4
  93. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  94. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  95. package/dist/web/standalone/.next/required-server-files.json +3 -3
  96. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  97. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  98. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  99. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  100. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  104. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  107. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  108. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  109. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  110. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  111. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  113. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  123. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  135. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  155. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  165. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  171. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  185. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  187. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  189. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  191. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/index.html +1 -1
  201. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  202. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  203. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  204. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  206. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  207. package/dist/web/standalone/.next/server/app/page.js +2 -2
  208. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -17
  210. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  211. package/dist/web/standalone/.next/server/chunks/7471.js +3 -3
  212. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  214. package/dist/web/standalone/.next/server/middleware.js +2 -2
  215. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  216. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  217. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  218. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  219. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  220. package/dist/web/standalone/.next/static/chunks/6502.8874bcae249c02e1.js +9 -0
  221. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  222. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  223. package/dist/web/standalone/.next/static/chunks/app/page-0c485498795110d6.js +1 -0
  224. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  225. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  226. package/dist/web/standalone/.next/static/chunks/{webpack-a1c1e452c6b32d04.js → webpack-9fed74684e1c5bb1.js} +1 -1
  227. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  228. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  229. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  230. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  231. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  232. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  233. package/dist/web/standalone/server.js +1 -1
  234. package/package.json +1 -1
  235. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  236. package/packages/pi-coding-agent/dist/core/retry-handler.js +30 -19
  237. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  238. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +51 -0
  239. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
  240. package/packages/pi-coding-agent/dist/core/sdk.js +9 -9
  241. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  242. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts +2 -1
  243. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts.map +1 -1
  244. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +10 -1
  245. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
  246. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +1 -0
  247. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  248. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +20 -5
  249. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  250. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +15 -1
  251. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  252. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +18 -0
  253. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  254. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  255. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +4 -0
  256. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  257. package/packages/pi-coding-agent/package.json +1 -1
  258. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +80 -0
  259. package/packages/pi-coding-agent/src/core/retry-handler.ts +37 -25
  260. package/packages/pi-coding-agent/src/core/sdk.ts +9 -9
  261. package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +10 -0
  262. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +20 -4
  263. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +27 -0
  264. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +16 -1
  265. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +5 -0
  266. package/packages/pi-tui/dist/components/image.d.ts +2 -0
  267. package/packages/pi-tui/dist/components/image.d.ts.map +1 -1
  268. package/packages/pi-tui/dist/components/image.js +4 -0
  269. package/packages/pi-tui/dist/components/image.js.map +1 -1
  270. package/packages/pi-tui/dist/components/image.test.d.ts +6 -0
  271. package/packages/pi-tui/dist/components/image.test.d.ts.map +1 -0
  272. package/packages/pi-tui/dist/components/image.test.js +32 -0
  273. package/packages/pi-tui/dist/components/image.test.js.map +1 -0
  274. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  275. package/packages/pi-tui/dist/tui.js +3 -1
  276. package/packages/pi-tui/dist/tui.js.map +1 -1
  277. package/packages/pi-tui/src/components/image.test.ts +36 -0
  278. package/packages/pi-tui/src/components/image.ts +5 -0
  279. package/packages/pi-tui/src/tui.ts +3 -1
  280. package/pkg/package.json +1 -1
  281. package/src/resources/extensions/browser-tools/capture.ts +19 -1
  282. package/src/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +93 -0
  283. package/src/resources/extensions/gsd/auto/finalize-timeout.ts +3 -0
  284. package/src/resources/extensions/gsd/auto/loop.ts +2 -2
  285. package/src/resources/extensions/gsd/auto/phases.ts +68 -3
  286. package/src/resources/extensions/gsd/auto/run-unit.ts +12 -2
  287. package/src/resources/extensions/gsd/auto/session.ts +4 -0
  288. package/src/resources/extensions/gsd/auto/types.ts +5 -0
  289. package/src/resources/extensions/gsd/auto-dashboard.ts +2 -1
  290. package/src/resources/extensions/gsd/auto-dispatch.ts +110 -9
  291. package/src/resources/extensions/gsd/auto-model-selection.ts +7 -5
  292. package/src/resources/extensions/gsd/auto-post-unit.ts +16 -6
  293. package/src/resources/extensions/gsd/auto-prompts.ts +31 -0
  294. package/src/resources/extensions/gsd/auto-recovery.ts +29 -23
  295. package/src/resources/extensions/gsd/auto-start.ts +188 -10
  296. package/src/resources/extensions/gsd/auto-tool-tracking.ts +10 -0
  297. package/src/resources/extensions/gsd/auto-worktree.ts +28 -7
  298. package/src/resources/extensions/gsd/auto.ts +19 -8
  299. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +16 -4
  300. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +10 -0
  301. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +5 -4
  302. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +4 -1
  303. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +11 -3
  304. package/src/resources/extensions/gsd/bootstrap/system-context.ts +3 -1
  305. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +36 -1
  306. package/src/resources/extensions/gsd/commands/context.ts +7 -1
  307. package/src/resources/extensions/gsd/commands/handlers/core.ts +26 -2
  308. package/src/resources/extensions/gsd/commands-extensions.ts +1 -1
  309. package/src/resources/extensions/gsd/config-overlay.ts +331 -0
  310. package/src/resources/extensions/gsd/db-writer.ts +11 -3
  311. package/src/resources/extensions/gsd/detection.ts +1 -1
  312. package/src/resources/extensions/gsd/dispatch-guard.ts +2 -1
  313. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -0
  314. package/src/resources/extensions/gsd/doctor.ts +2 -1
  315. package/src/resources/extensions/gsd/files.ts +19 -0
  316. package/src/resources/extensions/gsd/gitignore.ts +1 -0
  317. package/src/resources/extensions/gsd/gsd-db.ts +46 -4
  318. package/src/resources/extensions/gsd/guided-flow.ts +254 -30
  319. package/src/resources/extensions/gsd/index.ts +1 -0
  320. package/src/resources/extensions/gsd/json-persistence.ts +6 -3
  321. package/src/resources/extensions/gsd/md-importer.ts +13 -6
  322. package/src/resources/extensions/gsd/notification-overlay.ts +1 -1
  323. package/src/resources/extensions/gsd/notification-widget.ts +2 -1
  324. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +1 -1
  325. package/src/resources/extensions/gsd/parallel-orchestrator.ts +19 -11
  326. package/src/resources/extensions/gsd/pre-execution-checks.ts +32 -7
  327. package/src/resources/extensions/gsd/preferences-types.ts +25 -0
  328. package/src/resources/extensions/gsd/preferences-validation.ts +45 -1
  329. package/src/resources/extensions/gsd/preferences.ts +9 -2
  330. package/src/resources/extensions/gsd/preparation.ts +1419 -0
  331. package/src/resources/extensions/gsd/prompt-validation.ts +88 -0
  332. package/src/resources/extensions/gsd/prompts/complete-milestone.md +3 -3
  333. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  334. package/src/resources/extensions/gsd/prompts/discuss-prepared.md +424 -0
  335. package/src/resources/extensions/gsd/prompts/discuss.md +2 -0
  336. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +6 -1
  337. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -4
  338. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +23 -0
  339. package/src/resources/extensions/gsd/prompts/queue.md +2 -0
  340. package/src/resources/extensions/gsd/prompts/rethink.md +2 -1
  341. package/src/resources/extensions/gsd/prompts/system.md +2 -2
  342. package/src/resources/extensions/gsd/prompts/validate-milestone.md +56 -23
  343. package/src/resources/extensions/gsd/quick.ts +20 -15
  344. package/src/resources/extensions/gsd/reactive-graph.ts +18 -0
  345. package/src/resources/extensions/gsd/roadmap-slices.ts +21 -5
  346. package/src/resources/extensions/gsd/safety/content-validator.ts +3 -3
  347. package/src/resources/extensions/gsd/session-lock.ts +17 -1
  348. package/src/resources/extensions/gsd/state.ts +115 -26
  349. package/src/resources/extensions/gsd/templates/context-enhanced.md +138 -0
  350. package/src/resources/extensions/gsd/tests/adversarial-review-fixes.test.ts +223 -0
  351. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +33 -2
  352. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +56 -0
  353. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +41 -0
  354. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +72 -0
  355. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +54 -0
  356. package/src/resources/extensions/gsd/tests/defer-milestone-stamp.test.ts +30 -0
  357. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -3
  358. package/src/resources/extensions/gsd/tests/discuss-incremental-persistence.test.ts +36 -0
  359. package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +46 -0
  360. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +33 -0
  361. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +37 -0
  362. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +37 -0
  363. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +125 -0
  364. package/src/resources/extensions/gsd/tests/find-missing-summaries-closed.test.ts +48 -0
  365. package/src/resources/extensions/gsd/tests/format-shortcut.test.ts +69 -0
  366. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +42 -0
  367. package/src/resources/extensions/gsd/tests/gitignore-bg-shell.test.ts +38 -0
  368. package/src/resources/extensions/gsd/tests/guided-flow-state-rebuild.test.ts +103 -0
  369. package/src/resources/extensions/gsd/tests/import-done-milestones.test.ts +42 -0
  370. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +11 -9
  371. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +4 -2
  372. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +28 -30
  373. package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
  374. package/src/resources/extensions/gsd/tests/integration-prepared-discussion.test.ts +525 -0
  375. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +62 -0
  376. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +11 -10
  377. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +48 -0
  378. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +46 -0
  379. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +189 -0
  380. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +77 -0
  381. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +55 -0
  382. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +39 -0
  383. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +68 -0
  384. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +284 -20
  385. package/src/resources/extensions/gsd/tests/pre-execution-fail-closed.test.ts +2 -2
  386. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +2 -2
  387. package/src/resources/extensions/gsd/tests/preparation.test.ts +1211 -0
  388. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +53 -0
  389. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +83 -0
  390. package/src/resources/extensions/gsd/tests/prompt-builder.test.ts +669 -0
  391. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +7 -4
  392. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +85 -0
  393. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -1
  394. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +47 -0
  395. package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +107 -0
  396. package/src/resources/extensions/gsd/tests/reactive-graph.test.ts +45 -0
  397. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +63 -0
  398. package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +4 -5
  399. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +51 -0
  400. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +56 -0
  401. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +31 -0
  402. package/src/resources/extensions/gsd/tests/skipped-validation-completion.test.ts +39 -0
  403. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +51 -0
  404. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +1 -1
  405. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +36 -0
  406. package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +147 -0
  407. package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +13 -0
  408. package/src/resources/extensions/gsd/tests/stash-pop-gsd-conflict.test.ts +21 -0
  409. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +21 -0
  410. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +6 -7
  411. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +47 -0
  412. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +1 -0
  413. package/src/resources/extensions/gsd/tests/subagent-agent-discovery.test.ts +47 -0
  414. package/src/resources/extensions/gsd/tests/symlink-extension-discovery.test.ts +125 -0
  415. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +65 -0
  416. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +29 -1
  417. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +2 -1
  418. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +3 -4
  419. package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +15 -0
  420. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +89 -0
  421. package/src/resources/extensions/gsd/tests/wave1-critical-regressions.test.ts +49 -0
  422. package/src/resources/extensions/gsd/tests/wave2-events-regressions.test.ts +48 -0
  423. package/src/resources/extensions/gsd/tests/wave3-session-regressions.test.ts +47 -0
  424. package/src/resources/extensions/gsd/tests/wave4-write-safety-regressions.test.ts +70 -0
  425. package/src/resources/extensions/gsd/tests/wave5-consistency-regressions.test.ts +165 -0
  426. package/src/resources/extensions/gsd/tests/worker-model-override.test.ts +48 -0
  427. package/src/resources/extensions/gsd/tests/workflow-logger-audit.test.ts +6 -3
  428. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +38 -0
  429. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +16 -0
  430. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -0
  431. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +16 -17
  432. package/src/resources/extensions/gsd/tests/worktree-sync-tasks.test.ts +13 -9
  433. package/src/resources/extensions/gsd/tests/worktree.test.ts +26 -9
  434. package/src/resources/extensions/gsd/tests/write-gate.test.ts +127 -2
  435. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -0
  436. package/src/resources/extensions/gsd/tools/complete-milestone.ts +13 -3
  437. package/src/resources/extensions/gsd/tools/complete-slice.ts +26 -6
  438. package/src/resources/extensions/gsd/tools/complete-task.ts +29 -7
  439. package/src/resources/extensions/gsd/tools/plan-milestone.ts +11 -9
  440. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +5 -2
  441. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +152 -0
  442. package/src/resources/extensions/gsd/tools/reopen-slice.ts +27 -0
  443. package/src/resources/extensions/gsd/tools/reopen-task.ts +17 -0
  444. package/src/resources/extensions/gsd/triage-resolution.ts +37 -17
  445. package/src/resources/extensions/gsd/types.ts +4 -0
  446. package/src/resources/extensions/gsd/undo.ts +3 -2
  447. package/src/resources/extensions/gsd/workflow-events.ts +5 -3
  448. package/src/resources/extensions/gsd/workflow-logger.ts +1 -1
  449. package/src/resources/extensions/gsd/workflow-projections.ts +7 -8
  450. package/src/resources/extensions/gsd/workflow-reconcile.ts +109 -8
  451. package/src/resources/extensions/gsd/workflow-templates.ts +11 -2
  452. package/src/resources/extensions/gsd/worktree-manager.ts +4 -2
  453. package/src/resources/extensions/gsd/worktree.ts +10 -0
  454. package/src/resources/extensions/shared/interview-ui.ts +1 -1
  455. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +8 -10
  456. package/src/resources/extensions/subagent/agents.ts +30 -6
  457. package/dist/web/standalone/.next/static/chunks/6502.7593d7797a4b3999.js +0 -9
  458. package/dist/web/standalone/.next/static/chunks/app/page-62be3b5fa91e4c8f.js +0 -1
  459. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  460. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  461. /package/dist/web/standalone/.next/static/{MRM3OSYIAa4HMDqVGQ9nt → h8aBiLMFjb__ogynY08cm}/_buildManifest.js +0 -0
  462. /package/dist/web/standalone/.next/static/{MRM3OSYIAa4HMDqVGQ9nt → h8aBiLMFjb__ogynY08cm}/_ssgManifest.js +0 -0
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Regression test for #3699 — import milestones with all-done slices as complete
3
+ *
4
+ * During DB migration, milestones whose roadmap slices are all marked done
5
+ * should be imported with status "complete" instead of "active".
6
+ */
7
+
8
+ import { describe, test } from 'node:test';
9
+ import assert from 'node:assert/strict';
10
+ import { readFileSync } from 'node:fs';
11
+ import { fileURLToPath } from 'node:url';
12
+ import { dirname, join } from 'node:path';
13
+
14
+ const __filename = fileURLToPath(import.meta.url);
15
+ const __dirname = dirname(__filename);
16
+
17
+ const importerSrc = readFileSync(
18
+ join(__dirname, '..', 'md-importer.ts'),
19
+ 'utf-8',
20
+ );
21
+
22
+ describe('import done milestones as complete (#3699)', () => {
23
+ test('all-slices-done check sets milestoneStatus to complete', () => {
24
+ // The importer should check if all roadmap slices are done
25
+ assert.match(importerSrc, /roadmap\.slices\.every\(s\s*=>\s*s\.done\)/,
26
+ 'should check roadmap.slices.every(s => s.done)');
27
+ });
28
+
29
+ test('milestoneStatus is set to complete when all slices done', () => {
30
+ // Find the all-done guard and verify it sets 'complete'
31
+ const everyIdx = importerSrc.indexOf('roadmap.slices.every(s => s.done)');
32
+ assert.ok(everyIdx > -1, 'all-slices-done check should exist');
33
+ const afterCheck = importerSrc.slice(everyIdx, everyIdx + 200);
34
+ assert.match(afterCheck, /milestoneStatus\s*=\s*'complete'/,
35
+ 'should set milestoneStatus to complete when all slices are done');
36
+ });
37
+
38
+ test('roadmap.slices.length > 0 guard prevents false positives', () => {
39
+ assert.match(importerSrc, /roadmap\.slices\.length\s*>\s*0/,
40
+ 'should guard against empty slices array');
41
+ });
42
+ });
@@ -454,7 +454,7 @@ test("verifyExpectedArtifact accepts plan-slice with colon-style heading tasks (
454
454
  );
455
455
  });
456
456
 
457
- test("verifyExpectedArtifact execute-task passes for heading-style plan entry (#1691)", (t) => {
457
+ test("verifyExpectedArtifact execute-task rejects heading-style plan without checked checkbox (#3607)", (t) => {
458
458
  const base = makeTmpBase();
459
459
  t.after(() => cleanup(base));
460
460
 
@@ -471,10 +471,12 @@ test("verifyExpectedArtifact execute-task passes for heading-style plan entry (#
471
471
  "Feature description.",
472
472
  ].join("\n"));
473
473
  writeFileSync(join(tasksDir, "T01-SUMMARY.md"), "# T01 Summary\n\nDone.");
474
+ // Heading-style entries no longer count as verified — only checked
475
+ // checkboxes prove gsd_complete_task ran (#3607).
474
476
  assert.strictEqual(
475
477
  verifyExpectedArtifact("execute-task", "M001/S01/T01", base),
476
- true,
477
- "execute-task should pass for heading-style plan entry when summary exists",
478
+ false,
479
+ "heading-style without checked checkbox should NOT pass verification",
478
480
  );
479
481
  });
480
482
 
@@ -682,7 +684,7 @@ function makeGitBase(): string {
682
684
  return base;
683
685
  }
684
686
 
685
- test("hasImplementationArtifacts returns false when only .gsd/ files committed (#1703)", (t) => {
687
+ test("hasImplementationArtifacts returns 'absent' when only .gsd/ files committed (#1703)", (t) => {
686
688
  const base = makeGitBase();
687
689
  t.after(() => cleanup(base));
688
690
 
@@ -695,10 +697,10 @@ test("hasImplementationArtifacts returns false when only .gsd/ files committed (
695
697
  execFileSync("git", ["commit", "-m", "chore: add plan files"], { cwd: base, stdio: "ignore" });
696
698
 
697
699
  const result = hasImplementationArtifacts(base);
698
- assert.equal(result, false, "should return false when only .gsd/ files were committed");
700
+ assert.equal(result, "absent", "should return 'absent' when only .gsd/ files were committed");
699
701
  });
700
702
 
701
- test("hasImplementationArtifacts returns true when implementation files committed (#1703)", (t) => {
703
+ test("hasImplementationArtifacts returns 'present' when implementation files committed (#1703)", (t) => {
702
704
  const base = makeGitBase();
703
705
  t.after(() => cleanup(base));
704
706
 
@@ -712,16 +714,16 @@ test("hasImplementationArtifacts returns true when implementation files committe
712
714
  execFileSync("git", ["commit", "-m", "feat: add feature"], { cwd: base, stdio: "ignore" });
713
715
 
714
716
  const result = hasImplementationArtifacts(base);
715
- assert.equal(result, true, "should return true when implementation files are present");
717
+ assert.equal(result, "present", "should return 'present' when implementation files are present");
716
718
  });
717
719
 
718
- test("hasImplementationArtifacts returns true on non-git directory (fail-open)", (t) => {
720
+ test("hasImplementationArtifacts returns 'unknown' on non-git directory (fail-open)", (t) => {
719
721
  const base = join(tmpdir(), `gsd-test-nogit-${randomUUID()}`);
720
722
  mkdirSync(base, { recursive: true });
721
723
  t.after(() => cleanup(base));
722
724
 
723
725
  const result = hasImplementationArtifacts(base);
724
- assert.equal(result, true, "should return true (fail-open) in non-git directory");
726
+ assert.equal(result, "unknown", "should return 'unknown' (fail-open) in non-git directory");
725
727
  });
726
728
 
727
729
  // ─── verifyExpectedArtifact: complete-milestone requires impl artifacts (#1703) ──
@@ -920,8 +920,10 @@ describe("completion and verification failures", () => {
920
920
  base = createFullFixture();
921
921
  openDatabase(join(base, ".gsd", "gsd.db"));
922
922
  insertMilestone({ id: "M001", title: "Active", status: "active" });
923
- insertSlice({ id: "S01", milestoneId: "M001", title: "First", status: "complete" });
924
- insertSlice({ id: "S02", milestoneId: "M001", title: "Second", status: "complete" });
923
+ // Use "pending" status closed slices (complete/done/skipped) are
924
+ // excluded from SUMMARY checks per #3620.
925
+ insertSlice({ id: "S01", milestoneId: "M001", title: "First", status: "pending" });
926
+ insertSlice({ id: "S02", milestoneId: "M001", title: "Second", status: "pending" });
925
927
  // No S01-SUMMARY.md or S02-SUMMARY.md on disk
926
928
 
927
929
  const ctx = buildDispatchCtx(base, "M001", {
@@ -11,6 +11,8 @@
11
11
 
12
12
  // GSD State Machine Live Validation (#3161)
13
13
 
14
+
15
+
14
16
  import { describe, test, beforeEach, afterEach } from "node:test";
15
17
  import assert from "node:assert/strict";
16
18
  import {
@@ -721,10 +723,10 @@ describe("state-machine-live-validation", () => {
721
723
  const result = await handleCompleteTask(makeTaskParams("T01", "S99", "M099") as any, base);
722
724
  assert.ok(!("error" in result), `expected success: ${JSON.stringify(result)}`);
723
725
 
724
- // Phantom milestone created
726
+ // Phantom milestone created — H6 fix: now uses ID as title instead of empty string
725
727
  const milestone = getMilestone("M099");
726
728
  assert.ok(milestone, "phantom milestone M099 should exist");
727
- assert.equal(milestone!.title, "", "phantom milestone has empty title");
729
+ assert.equal(milestone!.title, "M099", "H6 fix: phantom milestone uses ID as title");
728
730
 
729
731
  // Phantom slice created
730
732
  const slice = getSlice("M099", "S99");
@@ -895,13 +897,10 @@ describe("state-machine-live-validation", () => {
895
897
  // ─────────────────────────────────────────────────────────────────────────
896
898
 
897
899
  describe("reopen-then-redo cycle", () => {
898
- test("complete → reopen → M12: stale SUMMARY causes immediate auto-reconcile", async () => {
899
- // Finding M12: reopen-task does NOT delete the SUMMARY.md from disk.
900
- // The reopen handler's own post-mutation hook calls renderAllProjections
901
- // which triggers deriveStateFromDb, which sees the stale SUMMARY.md and
902
- // auto-reconciles the task BACK to "complete" (#2514) within the same call.
903
- //
904
- // Result: the reopen is effectively a no-op when filesystem artifacts exist.
900
+ test("complete → reopen → re-complete task works end-to-end (M12 fixed)", async () => {
901
+ // M12 fix: reopen-task now deletes SUMMARY.md from disk before the
902
+ // post-mutation hook runs, preventing the reconciler from auto-correcting
903
+ // the task back to "complete".
905
904
  base = createFullFixture();
906
905
  openDatabase(join(base, ".gsd", "gsd.db"));
907
906
  insertMilestone({ id: "M001", title: "Active", status: "active" });
@@ -915,23 +914,23 @@ describe("state-machine-live-validation", () => {
915
914
  const summaryPath = join(base, ".gsd", "milestones", "M001", "slices", "S01", "tasks", "T01-SUMMARY.md");
916
915
  assert.ok(existsSync(summaryPath), "SUMMARY.md exists after completion");
917
916
 
918
- // Reopen — handler sets DB to "pending" in transaction, but post-mutation
919
- // hook triggers reconciler which immediately sets it back to "complete"
917
+ // Reopen — now deletes SUMMARY.md from disk (M12 fix)
920
918
  const r2 = await handleReopenTask({ milestoneId: "M001", sliceId: "S01", taskId: "T01" }, base);
921
- assert.ok(!("error" in r2), `reopen handler succeeded: ${JSON.stringify(r2)}`);
919
+ assert.ok(!("error" in r2), `reopen: ${JSON.stringify(r2)}`);
922
920
 
923
- // M12: After reopen completes, DB shows "complete" not "pending" because
924
- // the reconciler auto-corrected it from the stale SUMMARY.md
925
- const task = getTask("M001", "S01", "T01");
926
- assert.equal(task!.status, "complete", "M12: reconciler overrides reopen — task is back to complete");
927
- assert.ok(existsSync(summaryPath), "M12: SUMMARY.md was never cleaned up");
921
+ // Task is now properly pending SUMMARY.md was cleaned up
922
+ assert.equal(getTask("M001", "S01", "T01")!.status, "pending");
923
+ assert.ok(!existsSync(summaryPath), "M12 fix: SUMMARY.md cleaned up by reopen");
924
+
925
+ // Re-complete succeeds
926
+ const r3 = await handleCompleteTask(makeTaskParams("T01", "S01", "M001") as any, base);
927
+ assert.ok(!("error" in r3), `re-complete: ${JSON.stringify(r3)}`);
928
+ assert.ok(isClosedStatus(getTask("M001", "S01", "T01")!.status));
928
929
  });
929
930
 
930
- test("complete slice → reopen → M12: reconciler overrides task reset via stale SUMMARY", async () => {
931
- // Same M12 pattern at the slice level: reopen-slice resets all tasks to
932
- // "pending" in DB, but task SUMMARY.md artifacts remain on disk. The
933
- // reopen handler's post-mutation hook triggers reconciler which sees the
934
- // stale artifacts and auto-corrects tasks back to "complete".
931
+ test("complete slice → reopen → re-complete all works end-to-end (M12 fixed)", async () => {
932
+ // M12 fix: reopen-slice now deletes all SUMMARY.md and UAT.md artifacts
933
+ // from disk, preventing reconciler interference.
935
934
  base = createFullFixture();
936
935
  openDatabase(join(base, ".gsd", "gsd.db"));
937
936
  insertMilestone({ id: "M001", title: "Active", status: "active" });
@@ -943,17 +942,16 @@ describe("state-machine-live-validation", () => {
943
942
  await handleCompleteSlice(makeSliceParams("S01", "M001") as any, base);
944
943
  assert.ok(isClosedStatus(getSlice("M001", "S01")!.status));
945
944
 
946
- // Reopen slice — transaction resets slice to in_progress and task to pending,
947
- // but post-mutation hook triggers reconciler which sees stale SUMMARY.md
945
+ // Reopen slice — now cleans up all artifacts (M12 fix)
948
946
  await handleReopenSlice({ milestoneId: "M001", sliceId: "S01" }, base);
949
-
950
- // Slice status is correctly in_progress (no slice SUMMARY reconciliation)
951
947
  assert.equal(getSlice("M001", "S01")!.status, "in_progress");
948
+ assert.equal(getTask("M001", "S01", "T01")!.status, "pending");
952
949
 
953
- // M12: Task was reset to "pending" in the transaction, but reconciler
954
- // already corrected it back to "complete" from the stale SUMMARY.md
955
- const task = getTask("M001", "S01", "T01");
956
- assert.equal(task!.status, "complete", "M12: reconciler overrides reopen — task back to complete");
950
+ // Re-complete task + slice succeeds
951
+ await handleCompleteTask(makeTaskParams("T01", "S01", "M001") as any, base);
952
+ const r = await handleCompleteSlice(makeSliceParams("S01", "M001") as any, base);
953
+ assert.ok(!("error" in r), `re-complete slice: ${JSON.stringify(r)}`);
954
+ assert.ok(isClosedStatus(getSlice("M001", "S01")!.status));
957
955
  });
958
956
  });
959
957
  });
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Test isolation utilities for integration tests.
3
+ *
4
+ * Integration tests often call `mergeMilestoneToMain` and other functions that
5
+ * load preferences. If the user's global ~/.gsd/preferences.md has
6
+ * `git.main_branch: master`, tests fail because test repos use `main`.
7
+ *
8
+ * These utilities isolate tests from the user's global environment.
9
+ */
10
+
11
+ import { mkdtempSync, rmSync, realpathSync } from "node:fs";
12
+ import { tmpdir } from "node:os";
13
+ import { join } from "node:path";
14
+
15
+ import { _resetServiceCache } from "../../worktree.ts";
16
+ import { _clearGsdRootCache } from "../../paths.ts";
17
+
18
+ let originalHome: string | undefined;
19
+ let fakeHome: string | null = null;
20
+
21
+ /**
22
+ * Isolate the test environment from user's global preferences.
23
+ * Creates a fake HOME directory so loadEffectiveGSDPreferences() returns
24
+ * empty global preferences instead of the user's ~/.gsd/preferences.md.
25
+ *
26
+ * Call this in a test.before() hook.
27
+ */
28
+ export function isolateFromGlobalPreferences(): void {
29
+ originalHome = process.env.HOME;
30
+ fakeHome = realpathSync(mkdtempSync(join(tmpdir(), "gsd-test-home-")));
31
+ process.env.HOME = fakeHome;
32
+ _clearGsdRootCache();
33
+ _resetServiceCache();
34
+ }
35
+
36
+ /**
37
+ * Restore the original HOME and clean up the fake home directory.
38
+ *
39
+ * Call this in a test.after() hook.
40
+ */
41
+ export function restoreGlobalPreferences(): void {
42
+ if (originalHome !== undefined) {
43
+ process.env.HOME = originalHome;
44
+ } else {
45
+ delete process.env.HOME;
46
+ }
47
+ _clearGsdRootCache();
48
+ _resetServiceCache();
49
+ if (fakeHome) {
50
+ rmSync(fakeHome, { recursive: true, force: true });
51
+ fakeHome = null;
52
+ }
53
+ }