gsd-pi 2.43.0 → 2.44.0-dev.62b5d6c

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 (568) hide show
  1. package/dist/cli.js +13 -1
  2. package/dist/help-text.js +24 -0
  3. package/dist/resources/extensions/bg-shell/overlay.js +3 -0
  4. package/dist/resources/extensions/github-sync/sync.js +2 -1
  5. package/dist/resources/extensions/gsd/auto/loop.js +0 -2
  6. package/dist/resources/extensions/gsd/auto/phases.js +7 -12
  7. package/dist/resources/extensions/gsd/auto-dashboard.js +19 -18
  8. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +34 -19
  9. package/dist/resources/extensions/gsd/auto-dispatch.js +36 -21
  10. package/dist/resources/extensions/gsd/auto-post-unit.js +128 -14
  11. package/dist/resources/extensions/gsd/auto-prompts.js +202 -92
  12. package/dist/resources/extensions/gsd/auto-recovery.js +83 -135
  13. package/dist/resources/extensions/gsd/auto-supervisor.js +14 -0
  14. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +4 -7
  15. package/dist/resources/extensions/gsd/auto-verification.js +5 -10
  16. package/dist/resources/extensions/gsd/auto-worktree.js +123 -30
  17. package/dist/resources/extensions/gsd/auto.js +1 -4
  18. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +611 -0
  19. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +28 -3
  20. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -0
  21. package/dist/resources/extensions/gsd/commands/catalog.js +3 -1
  22. package/dist/resources/extensions/gsd/commands/handlers/ops.js +15 -1
  23. package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
  24. package/dist/resources/extensions/gsd/commands-maintenance.js +78 -3
  25. package/dist/resources/extensions/gsd/dashboard-overlay.js +32 -31
  26. package/dist/resources/extensions/gsd/db-writer.js +95 -4
  27. package/dist/resources/extensions/gsd/dispatch-guard.js +35 -30
  28. package/dist/resources/extensions/gsd/doctor-checks.js +28 -11
  29. package/dist/resources/extensions/gsd/doctor-environment.js +28 -0
  30. package/dist/resources/extensions/gsd/doctor-types.js +0 -15
  31. package/dist/resources/extensions/gsd/doctor.js +46 -282
  32. package/dist/resources/extensions/gsd/file-watcher.js +5 -1
  33. package/dist/resources/extensions/gsd/files.js +14 -198
  34. package/dist/resources/extensions/gsd/git-service.js +4 -0
  35. package/dist/resources/extensions/gsd/gitignore.js +4 -0
  36. package/dist/resources/extensions/gsd/gsd-db.js +819 -197
  37. package/dist/resources/extensions/gsd/guided-flow.js +18 -8
  38. package/dist/resources/extensions/gsd/markdown-renderer.js +862 -0
  39. package/dist/resources/extensions/gsd/md-importer.js +182 -4
  40. package/dist/resources/extensions/gsd/native-git-bridge.js +10 -1
  41. package/dist/resources/extensions/gsd/parallel-eligibility.js +14 -19
  42. package/dist/resources/extensions/gsd/parallel-orchestrator.js +38 -0
  43. package/dist/resources/extensions/gsd/parsers-legacy.js +239 -0
  44. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  45. package/dist/resources/extensions/gsd/preferences-validation.js +9 -0
  46. package/dist/resources/extensions/gsd/preferences.js +1 -0
  47. package/dist/resources/extensions/gsd/prompts/complete-slice.md +22 -9
  48. package/dist/resources/extensions/gsd/prompts/discuss.md +2 -2
  49. package/dist/resources/extensions/gsd/prompts/execute-task.md +15 -5
  50. package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
  51. package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
  52. package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
  53. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
  54. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -7
  55. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
  56. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
  57. package/dist/resources/extensions/gsd/prompts/replan-slice.md +6 -6
  58. package/dist/resources/extensions/gsd/reactive-graph.js +33 -3
  59. package/dist/resources/extensions/gsd/skill-health.js +3 -1
  60. package/dist/resources/extensions/gsd/state.js +484 -30
  61. package/dist/resources/extensions/gsd/tools/complete-milestone.js +128 -0
  62. package/dist/resources/extensions/gsd/tools/complete-slice.js +244 -0
  63. package/dist/resources/extensions/gsd/tools/complete-task.js +204 -0
  64. package/dist/resources/extensions/gsd/tools/plan-milestone.js +205 -0
  65. package/dist/resources/extensions/gsd/tools/plan-slice.js +155 -0
  66. package/dist/resources/extensions/gsd/tools/plan-task.js +94 -0
  67. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +152 -0
  68. package/dist/resources/extensions/gsd/tools/replan-slice.js +146 -0
  69. package/dist/resources/extensions/gsd/triage-resolution.js +17 -1
  70. package/dist/resources/extensions/gsd/undo.js +197 -3
  71. package/dist/resources/extensions/gsd/visualizer-data.js +53 -16
  72. package/dist/resources/extensions/gsd/workspace-index.js +63 -39
  73. package/dist/web/standalone/.next/BUILD_ID +1 -1
  74. package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -16
  75. package/dist/web/standalone/.next/build-manifest.json +4 -4
  76. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  77. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  78. package/dist/web/standalone/.next/required-server-files.json +4 -4
  79. package/dist/web/standalone/.next/routes-manifest.json +6 -0
  80. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  81. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  82. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  83. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  91. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  92. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  93. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  94. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  95. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  97. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  100. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  107. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  145. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  151. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -0
  163. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -0
  164. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -0
  165. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  168. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  170. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  172. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/index.html +1 -1
  182. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  183. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  184. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  185. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  187. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  188. package/dist/web/standalone/.next/server/app/page.js +2 -2
  189. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -16
  191. package/dist/web/standalone/.next/server/chunks/229.js +3 -3
  192. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  193. package/dist/web/standalone/.next/server/functions-config-manifest.json +1 -0
  194. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/middleware.js +2 -2
  197. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  199. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  200. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  201. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  202. package/dist/web/standalone/.next/static/chunks/{4024.c195dc1fdd2adbea.js → 4024.0de81b543b28b9fe.js} +2 -2
  203. package/dist/web/standalone/.next/static/chunks/app/_global-error/{page-d07a2c023f1aef1e.js → page-d83ba70a25a85472.js} +1 -1
  204. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-f2a7482d42a5614b.js +1 -0
  205. package/dist/web/standalone/.next/static/chunks/app/api/boot/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  206. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  207. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  208. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d83ba70a25a85472.js +1 -0
  209. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d83ba70a25a85472.js +1 -0
  210. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d83ba70a25a85472.js +1 -0
  211. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d83ba70a25a85472.js +1 -0
  212. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d83ba70a25a85472.js +1 -0
  213. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d83ba70a25a85472.js +1 -0
  214. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d83ba70a25a85472.js +1 -0
  215. package/dist/web/standalone/.next/static/chunks/app/api/files/route-d83ba70a25a85472.js +1 -0
  216. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d83ba70a25a85472.js +1 -0
  217. package/dist/web/standalone/.next/static/chunks/app/api/git/route-d83ba70a25a85472.js +1 -0
  218. package/dist/web/standalone/.next/static/chunks/app/api/history/route-d83ba70a25a85472.js +1 -0
  219. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d83ba70a25a85472.js +1 -0
  220. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d83ba70a25a85472.js +1 -0
  221. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d83ba70a25a85472.js +1 -0
  222. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d83ba70a25a85472.js +1 -0
  223. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d83ba70a25a85472.js +1 -0
  224. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d83ba70a25a85472.js +1 -0
  225. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d83ba70a25a85472.js +1 -0
  226. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d83ba70a25a85472.js +1 -0
  227. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d83ba70a25a85472.js +1 -0
  228. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d83ba70a25a85472.js +1 -0
  229. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d83ba70a25a85472.js +1 -0
  230. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d83ba70a25a85472.js +1 -0
  231. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d83ba70a25a85472.js +1 -0
  232. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d83ba70a25a85472.js +1 -0
  233. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d83ba70a25a85472.js +1 -0
  234. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d83ba70a25a85472.js +1 -0
  235. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d83ba70a25a85472.js +1 -0
  236. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-d83ba70a25a85472.js +1 -0
  237. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d83ba70a25a85472.js +1 -0
  238. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d83ba70a25a85472.js +1 -0
  239. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d83ba70a25a85472.js +1 -0
  240. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d83ba70a25a85472.js +1 -0
  241. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d83ba70a25a85472.js +1 -0
  242. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d83ba70a25a85472.js +1 -0
  243. package/dist/web/standalone/.next/static/chunks/app/api/update/route-d83ba70a25a85472.js +1 -0
  244. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d83ba70a25a85472.js +1 -0
  245. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +1 -0
  246. package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +1 -0
  247. package/dist/web/standalone/.next/static/chunks/{main-app-2f2ee7b85712c2bd.js → main-app-fdab67f7802d7832.js} +1 -1
  248. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d83ba70a25a85472.js +1 -0
  249. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d83ba70a25a85472.js +1 -0
  250. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  251. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d83ba70a25a85472.js +1 -0
  252. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d83ba70a25a85472.js +1 -0
  253. package/dist/web/standalone/.next/static/chunks/{webpack-fa307370fcf9fb2c.js → webpack-9014b5adb127a98a.js} +1 -1
  254. package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +1 -0
  255. package/dist/web/standalone/.next/static/fOnWQBjWXMKUs4bqTg530/_buildManifest.js +1 -0
  256. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  257. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  258. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  259. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  260. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  261. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  262. package/dist/web/standalone/server.js +1 -1
  263. package/package.json +4 -4
  264. package/packages/pi-ai/dist/models.custom.d.ts +173 -0
  265. package/packages/pi-ai/dist/models.custom.d.ts.map +1 -0
  266. package/packages/pi-ai/dist/models.custom.js +170 -0
  267. package/packages/pi-ai/dist/models.custom.js.map +1 -0
  268. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  269. package/packages/pi-ai/dist/models.js +16 -1
  270. package/packages/pi-ai/dist/models.js.map +1 -1
  271. package/packages/pi-ai/dist/models.test.d.ts +2 -0
  272. package/packages/pi-ai/dist/models.test.d.ts.map +1 -0
  273. package/packages/pi-ai/dist/models.test.js +67 -0
  274. package/packages/pi-ai/dist/models.test.js.map +1 -0
  275. package/packages/pi-ai/src/models.custom.ts +172 -0
  276. package/packages/pi-ai/src/models.test.ts +85 -0
  277. package/packages/pi-ai/src/models.ts +17 -1
  278. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +10 -3
  279. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  280. package/packages/pi-coding-agent/dist/core/agent-session.js +21 -34
  281. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  282. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts +2 -2
  283. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  284. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
  285. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +2 -2
  286. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  287. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  288. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +4 -4
  289. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  290. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  291. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  292. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +6 -0
  294. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  295. package/packages/pi-coding-agent/dist/core/extensions/loader.js +80 -0
  296. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  297. package/packages/pi-coding-agent/dist/core/extensions/loader.test.js +63 -0
  298. package/packages/pi-coding-agent/dist/core/extensions/loader.test.js.map +1 -1
  299. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +37 -0
  300. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  301. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts.map +1 -1
  303. package/packages/pi-coding-agent/dist/core/fallback-resolver.js +2 -3
  304. package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -1
  305. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +12 -2
  306. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -1
  307. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +38 -0
  308. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -0
  309. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +192 -0
  310. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -0
  311. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts +5 -0
  312. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
  313. package/packages/pi-coding-agent/dist/core/lsp/client.js +69 -21
  314. package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
  315. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts +2 -0
  316. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts.map +1 -0
  317. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +255 -0
  318. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -0
  319. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +15 -0
  320. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  321. package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
  322. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  323. package/packages/pi-coding-agent/dist/core/package-commands.d.ts +25 -0
  324. package/packages/pi-coding-agent/dist/core/package-commands.d.ts.map +1 -0
  325. package/packages/pi-coding-agent/dist/core/package-commands.js +253 -0
  326. package/packages/pi-coding-agent/dist/core/package-commands.js.map +1 -0
  327. package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts +2 -0
  328. package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts.map +1 -0
  329. package/packages/pi-coding-agent/dist/core/package-commands.test.js +225 -0
  330. package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -0
  331. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  332. package/packages/pi-coding-agent/dist/core/sdk.js +4 -0
  333. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  334. package/packages/pi-coding-agent/dist/index.d.ts +3 -1
  335. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/index.js +1 -0
  337. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  339. package/packages/pi-coding-agent/dist/main.js +11 -199
  340. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  341. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts +6 -0
  342. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  343. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +21 -0
  344. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  345. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
  346. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  347. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +8 -15
  348. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/modes/print-mode.d.ts.map +1 -1
  350. package/packages/pi-coding-agent/dist/modes/print-mode.js +45 -34
  351. package/packages/pi-coding-agent/dist/modes/print-mode.js.map +1 -1
  352. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts +1 -0
  353. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  354. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js +7 -2
  355. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js.map +1 -1
  356. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  357. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +2 -1
  358. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  359. package/packages/pi-coding-agent/package.json +1 -1
  360. package/packages/pi-coding-agent/src/core/agent-session.ts +26 -37
  361. package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +2 -2
  362. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +3 -3
  363. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +4 -4
  364. package/packages/pi-coding-agent/src/core/extensions/index.ts +5 -0
  365. package/packages/pi-coding-agent/src/core/extensions/loader.test.ts +96 -0
  366. package/packages/pi-coding-agent/src/core/extensions/loader.ts +89 -0
  367. package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -0
  368. package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +15 -2
  369. package/packages/pi-coding-agent/src/core/fallback-resolver.ts +2 -3
  370. package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +274 -0
  371. package/packages/pi-coding-agent/src/core/lsp/client.ts +83 -21
  372. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +288 -0
  373. package/packages/pi-coding-agent/src/core/model-registry.ts +39 -3
  374. package/packages/pi-coding-agent/src/core/package-commands.test.ts +240 -0
  375. package/packages/pi-coding-agent/src/core/package-commands.ts +310 -0
  376. package/packages/pi-coding-agent/src/core/sdk.ts +4 -0
  377. package/packages/pi-coding-agent/src/index.ts +7 -0
  378. package/packages/pi-coding-agent/src/main.ts +11 -232
  379. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +20 -0
  380. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +9 -16
  381. package/packages/pi-coding-agent/src/modes/print-mode.ts +42 -32
  382. package/packages/pi-coding-agent/src/modes/rpc/rpc-client.ts +8 -2
  383. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -1
  384. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
  385. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  386. package/pkg/dist/modes/interactive/theme/theme.js +8 -15
  387. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  388. package/pkg/package.json +1 -1
  389. package/src/resources/extensions/bg-shell/overlay.ts +4 -0
  390. package/src/resources/extensions/github-sync/sync.ts +2 -1
  391. package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -8
  392. package/src/resources/extensions/gsd/auto/loop.ts +0 -2
  393. package/src/resources/extensions/gsd/auto/phases.ts +7 -20
  394. package/src/resources/extensions/gsd/auto/types.ts +0 -1
  395. package/src/resources/extensions/gsd/auto-dashboard.ts +20 -16
  396. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +34 -19
  397. package/src/resources/extensions/gsd/auto-dispatch.ts +38 -21
  398. package/src/resources/extensions/gsd/auto-post-unit.ts +150 -15
  399. package/src/resources/extensions/gsd/auto-prompts.ts +186 -103
  400. package/src/resources/extensions/gsd/auto-recovery.ts +77 -142
  401. package/src/resources/extensions/gsd/auto-supervisor.ts +14 -0
  402. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +6 -7
  403. package/src/resources/extensions/gsd/auto-verification.ts +4 -9
  404. package/src/resources/extensions/gsd/auto-worktree.ts +126 -30
  405. package/src/resources/extensions/gsd/auto.ts +0 -9
  406. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +675 -4
  407. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +31 -3
  408. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -0
  409. package/src/resources/extensions/gsd/commands/catalog.ts +3 -1
  410. package/src/resources/extensions/gsd/commands/handlers/ops.ts +15 -1
  411. package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
  412. package/src/resources/extensions/gsd/commands-maintenance.ts +86 -3
  413. package/src/resources/extensions/gsd/dashboard-overlay.ts +17 -13
  414. package/src/resources/extensions/gsd/db-writer.ts +105 -4
  415. package/src/resources/extensions/gsd/dispatch-guard.ts +32 -30
  416. package/src/resources/extensions/gsd/doctor-checks.ts +25 -11
  417. package/src/resources/extensions/gsd/doctor-environment.ts +31 -0
  418. package/src/resources/extensions/gsd/doctor-types.ts +0 -23
  419. package/src/resources/extensions/gsd/doctor.ts +45 -295
  420. package/src/resources/extensions/gsd/file-watcher.ts +4 -1
  421. package/src/resources/extensions/gsd/files.ts +16 -220
  422. package/src/resources/extensions/gsd/git-service.ts +4 -0
  423. package/src/resources/extensions/gsd/gitignore.ts +4 -0
  424. package/src/resources/extensions/gsd/gsd-db.ts +1157 -370
  425. package/src/resources/extensions/gsd/guided-flow.ts +20 -8
  426. package/src/resources/extensions/gsd/markdown-renderer.ts +1098 -0
  427. package/src/resources/extensions/gsd/md-importer.ts +211 -2
  428. package/src/resources/extensions/gsd/native-git-bridge.ts +12 -1
  429. package/src/resources/extensions/gsd/parallel-eligibility.ts +14 -18
  430. package/src/resources/extensions/gsd/parallel-orchestrator.ts +43 -0
  431. package/src/resources/extensions/gsd/parsers-legacy.ts +271 -0
  432. package/src/resources/extensions/gsd/preferences-types.ts +3 -0
  433. package/src/resources/extensions/gsd/preferences-validation.ts +9 -0
  434. package/src/resources/extensions/gsd/preferences.ts +1 -0
  435. package/src/resources/extensions/gsd/prompts/complete-slice.md +22 -9
  436. package/src/resources/extensions/gsd/prompts/discuss.md +2 -2
  437. package/src/resources/extensions/gsd/prompts/execute-task.md +15 -5
  438. package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
  439. package/src/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
  440. package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
  441. package/src/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
  442. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -7
  443. package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
  444. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
  445. package/src/resources/extensions/gsd/prompts/replan-slice.md +6 -6
  446. package/src/resources/extensions/gsd/reactive-graph.ts +33 -3
  447. package/src/resources/extensions/gsd/skill-health.ts +2 -1
  448. package/src/resources/extensions/gsd/state.ts +547 -29
  449. package/src/resources/extensions/gsd/tests/atomic-task-closeout.test.ts +8 -120
  450. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +20 -11
  451. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +1 -1
  452. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +150 -5
  453. package/src/resources/extensions/gsd/tests/auto-stash-merge.test.ts +121 -0
  454. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +15 -20
  455. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +1 -1
  456. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +410 -0
  457. package/src/resources/extensions/gsd/tests/complete-task.test.ts +439 -0
  458. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -2
  459. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +527 -0
  460. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +593 -2
  461. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +104 -57
  462. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +22 -80
  463. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +5 -7
  464. package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +175 -0
  465. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -130
  466. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +38 -76
  467. package/src/resources/extensions/gsd/tests/doctor.test.ts +9 -19
  468. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +290 -0
  469. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +240 -0
  470. package/src/resources/extensions/gsd/tests/git-service.test.ts +6 -2
  471. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
  472. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +462 -0
  473. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +4 -172
  474. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +643 -0
  475. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
  476. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1205 -0
  477. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  478. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  479. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +439 -0
  480. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +2 -1
  481. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +2 -0
  482. package/src/resources/extensions/gsd/tests/parsers.test.ts +2 -1
  483. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +176 -113
  484. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +7 -0
  485. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +179 -0
  486. package/src/resources/extensions/gsd/tests/plan-task.test.ts +145 -0
  487. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +305 -0
  488. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +139 -0
  489. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +325 -0
  490. package/src/resources/extensions/gsd/tests/replan-handler.test.ts +410 -0
  491. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +1 -1
  492. package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +296 -0
  493. package/src/resources/extensions/gsd/tests/schema-v9-sequence.test.ts +176 -0
  494. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +216 -0
  495. package/src/resources/extensions/gsd/tests/token-cost-display.test.ts +118 -0
  496. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +11 -3
  497. package/src/resources/extensions/gsd/tests/undo.test.ts +321 -1
  498. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +1 -1
  499. package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +0 -142
  500. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +12 -5
  501. package/src/resources/extensions/gsd/tools/complete-milestone.ts +176 -0
  502. package/src/resources/extensions/gsd/tools/complete-slice.ts +300 -0
  503. package/src/resources/extensions/gsd/tools/complete-task.ts +245 -0
  504. package/src/resources/extensions/gsd/tools/plan-milestone.ts +249 -0
  505. package/src/resources/extensions/gsd/tools/plan-slice.ts +194 -0
  506. package/src/resources/extensions/gsd/tools/plan-task.ts +116 -0
  507. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +203 -0
  508. package/src/resources/extensions/gsd/tools/replan-slice.ts +192 -0
  509. package/src/resources/extensions/gsd/triage-resolution.ts +20 -1
  510. package/src/resources/extensions/gsd/types.ts +50 -0
  511. package/src/resources/extensions/gsd/undo.ts +247 -3
  512. package/src/resources/extensions/gsd/visualizer-data.ts +54 -17
  513. package/src/resources/extensions/gsd/workspace-index.ts +64 -46
  514. package/dist/resources/extensions/gsd/auto-observability.js +0 -56
  515. package/dist/resources/extensions/gsd/observability-validator.js +0 -422
  516. package/dist/resources/extensions/gsd/roadmap-mutations.js +0 -110
  517. package/dist/web/standalone/.next/static/VvclDCW6TAWjEyLU-EYL1/_buildManifest.js +0 -1
  518. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-e07acdb7dd069836.js +0 -1
  519. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d07a2c023f1aef1e.js +0 -1
  520. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d07a2c023f1aef1e.js +0 -1
  521. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d07a2c023f1aef1e.js +0 -1
  522. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d07a2c023f1aef1e.js +0 -1
  523. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d07a2c023f1aef1e.js +0 -1
  524. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d07a2c023f1aef1e.js +0 -1
  525. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d07a2c023f1aef1e.js +0 -1
  526. package/dist/web/standalone/.next/static/chunks/app/api/files/route-d07a2c023f1aef1e.js +0 -1
  527. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d07a2c023f1aef1e.js +0 -1
  528. package/dist/web/standalone/.next/static/chunks/app/api/git/route-d07a2c023f1aef1e.js +0 -1
  529. package/dist/web/standalone/.next/static/chunks/app/api/history/route-d07a2c023f1aef1e.js +0 -1
  530. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d07a2c023f1aef1e.js +0 -1
  531. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d07a2c023f1aef1e.js +0 -1
  532. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d07a2c023f1aef1e.js +0 -1
  533. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d07a2c023f1aef1e.js +0 -1
  534. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d07a2c023f1aef1e.js +0 -1
  535. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d07a2c023f1aef1e.js +0 -1
  536. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d07a2c023f1aef1e.js +0 -1
  537. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d07a2c023f1aef1e.js +0 -1
  538. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d07a2c023f1aef1e.js +0 -1
  539. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d07a2c023f1aef1e.js +0 -1
  540. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d07a2c023f1aef1e.js +0 -1
  541. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d07a2c023f1aef1e.js +0 -1
  542. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d07a2c023f1aef1e.js +0 -1
  543. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d07a2c023f1aef1e.js +0 -1
  544. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d07a2c023f1aef1e.js +0 -1
  545. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d07a2c023f1aef1e.js +0 -1
  546. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d07a2c023f1aef1e.js +0 -1
  547. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d07a2c023f1aef1e.js +0 -1
  548. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d07a2c023f1aef1e.js +0 -1
  549. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d07a2c023f1aef1e.js +0 -1
  550. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d07a2c023f1aef1e.js +0 -1
  551. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d07a2c023f1aef1e.js +0 -1
  552. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d07a2c023f1aef1e.js +0 -1
  553. package/dist/web/standalone/.next/static/chunks/app/api/update/route-d07a2c023f1aef1e.js +0 -1
  554. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d07a2c023f1aef1e.js +0 -1
  555. package/dist/web/standalone/.next/static/chunks/app/layout-745c6ed5fea5fb06.js +0 -1
  556. package/dist/web/standalone/.next/static/chunks/app/page-801b53eff6e83579.js +0 -1
  557. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d07a2c023f1aef1e.js +0 -1
  558. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d07a2c023f1aef1e.js +0 -1
  559. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-e6255954dccfcf0a.js +0 -1
  560. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d07a2c023f1aef1e.js +0 -1
  561. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d07a2c023f1aef1e.js +0 -1
  562. package/dist/web/standalone/.next/static/css/123c0bb039697968.css +0 -1
  563. package/src/resources/extensions/gsd/auto-observability.ts +0 -74
  564. package/src/resources/extensions/gsd/observability-validator.ts +0 -456
  565. package/src/resources/extensions/gsd/roadmap-mutations.ts +0 -134
  566. package/src/resources/extensions/gsd/tests/doctor-task-done-missing-summary-slice-loop.test.ts +0 -174
  567. package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -474
  568. /package/dist/web/standalone/.next/static/{VvclDCW6TAWjEyLU-EYL1 → fOnWQBjWXMKUs4bqTg530}/_ssgManifest.js +0 -0
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Tests for atomic task closeout (#1650):
3
- * 1. Doctor unmarks task checkbox when summary is missing (instead of creating stub)
4
- * 2. markTaskUndoneInPlan correctly unchecks a task in the slice plan
3
+ * Doctor no longer does checkbox reconciliation (reconciliation removed in S06).
4
+ * This file retains only the non-reconciliation behavior tests.
5
5
  */
6
6
 
7
7
  import { mkdirSync, writeFileSync, readFileSync, rmSync, existsSync } from "node:fs";
@@ -10,7 +10,6 @@ import { tmpdir } from "node:os";
10
10
  import test from "node:test";
11
11
  import assert from "node:assert/strict";
12
12
  import { runGSDDoctor } from "../doctor.ts";
13
- import { markTaskUndoneInPlan } from "../roadmap-mutations.ts";
14
13
 
15
14
  function makeTmp(name: string): string {
16
15
  const dir = join(tmpdir(), `atomic-closeout-${name}-${Date.now()}-${Math.random().toString(36).slice(2)}`);
@@ -18,121 +17,6 @@ function makeTmp(name: string): string {
18
17
  return dir;
19
18
  }
20
19
 
21
- // ── markTaskUndoneInPlan ─────────────────────────────────────────────────────
22
-
23
- test("markTaskUndoneInPlan unchecks a checked task", () => {
24
- const base = makeTmp("uncheck");
25
- const planPath = join(base, "PLAN.md");
26
- writeFileSync(planPath, `# S01: Demo
27
-
28
- ## Tasks
29
-
30
- - [x] **T01: First task** \`est:5m\`
31
- - [ ] **T02: Second task** \`est:10m\`
32
- `);
33
-
34
- const changed = markTaskUndoneInPlan(base, planPath, "T01");
35
- assert.ok(changed, "should return true when plan was modified");
36
-
37
- const content = readFileSync(planPath, "utf-8");
38
- assert.ok(content.includes("- [ ] **T01:"), "T01 should be unchecked");
39
- assert.ok(content.includes("- [ ] **T02:"), "T02 should remain unchecked");
40
-
41
- rmSync(base, { recursive: true, force: true });
42
- });
43
-
44
- test("markTaskUndoneInPlan is idempotent on already-unchecked task", () => {
45
- const base = makeTmp("uncheck-noop");
46
- const planPath = join(base, "PLAN.md");
47
- writeFileSync(planPath, `# S01: Demo
48
-
49
- ## Tasks
50
-
51
- - [ ] **T01: First task** \`est:5m\`
52
- `);
53
-
54
- const changed = markTaskUndoneInPlan(base, planPath, "T01");
55
- assert.ok(!changed, "should return false when no change needed");
56
-
57
- rmSync(base, { recursive: true, force: true });
58
- });
59
-
60
- test("markTaskUndoneInPlan handles indented checkboxes", () => {
61
- const base = makeTmp("uncheck-indent");
62
- const planPath = join(base, "PLAN.md");
63
- writeFileSync(planPath, `# S01: Demo
64
-
65
- ## Tasks
66
-
67
- - [x] **T01: First task** \`est:5m\`
68
- `);
69
-
70
- const changed = markTaskUndoneInPlan(base, planPath, "T01");
71
- assert.ok(changed, "should handle indented checkboxes");
72
-
73
- const content = readFileSync(planPath, "utf-8");
74
- assert.ok(content.includes("[ ] **T01:"), "T01 should be unchecked");
75
-
76
- rmSync(base, { recursive: true, force: true });
77
- });
78
-
79
- // ── Doctor: task_done_missing_summary unchecks instead of stubbing ────────────
80
-
81
- test("doctor unchecks task when checkbox is marked but summary is missing", async () => {
82
- const base = makeTmp("doctor-uncheck");
83
- const gsd = join(base, ".gsd");
84
- const m = join(gsd, "milestones", "M001");
85
- const s = join(m, "slices", "S01");
86
- const t = join(s, "tasks");
87
- mkdirSync(t, { recursive: true });
88
-
89
- writeFileSync(join(m, "M001-ROADMAP.md"), `# M001: Test
90
-
91
- ## Slices
92
-
93
- - [ ] **S01: Test Slice** \`risk:low\` \`depends:[]\`
94
- > Demo
95
- `);
96
-
97
- // Task is marked [x] in plan but has no summary file
98
- writeFileSync(join(s, "S01-PLAN.md"), `# S01: Test Slice
99
-
100
- **Goal:** test
101
-
102
- ## Tasks
103
-
104
- - [x] **T01: Do stuff** \`est:5m\`
105
- - [ ] **T02: Other stuff** \`est:5m\`
106
- `);
107
-
108
- // T02 has no summary either, but it's unchecked — should be left alone
109
-
110
- // Run doctor in diagnose mode first
111
- const diagnoseReport = await runGSDDoctor(base, { fix: false });
112
- const issue = diagnoseReport.issues.find(i => i.code === "task_done_missing_summary");
113
- assert.ok(issue, "should detect task_done_missing_summary");
114
- assert.equal(issue!.severity, "error");
115
-
116
- // Run doctor in fix mode
117
- const fixReport = await runGSDDoctor(base, { fix: true });
118
- const fixApplied = fixReport.fixesApplied.some(f => f.includes("unchecked T01"));
119
- assert.ok(fixApplied, "should have unchecked T01 in the fix log");
120
-
121
- // Verify the plan now has T01 unchecked
122
- const planContent = readFileSync(join(s, "S01-PLAN.md"), "utf-8");
123
- assert.ok(planContent.includes("- [ ] **T01:"), "T01 should be unchecked after doctor fix");
124
- assert.ok(planContent.includes("- [ ] **T02:"), "T02 should remain unchecked");
125
-
126
- // Verify no stub summary was created
127
- const stubPath = join(t, "T01-SUMMARY.md");
128
- assert.ok(
129
- !existsSync(stubPath),
130
- "should NOT create a stub summary — task should re-execute instead",
131
- );
132
-
133
- rmSync(base, { recursive: true, force: true });
134
- });
135
-
136
20
  test("doctor does not touch task with checkbox AND summary both present", async () => {
137
21
  const base = makeTmp("doctor-ok");
138
22
  const gsd = join(base, ".gsd");
@@ -173,8 +57,12 @@ Done.
173
57
  `);
174
58
 
175
59
  const report = await runGSDDoctor(base, { fix: true });
176
- const hasTaskIssue = report.issues.some(i => i.code === "task_done_missing_summary");
177
- assert.ok(!hasTaskIssue, "should not flag task_done_missing_summary when both exist");
60
+ // Doctor should not produce any task_done_missing_summary issue (code removed)
61
+ const hasOldCode = report.issues.some(i =>
62
+ i.code === "task_done_missing_summary" as any ||
63
+ i.code === "task_summary_without_done_checkbox" as any
64
+ );
65
+ assert.ok(!hasOldCode, "should not produce removed reconciliation issue codes");
178
66
 
179
67
  // Plan should still have T01 checked
180
68
  const planContent = readFileSync(join(s, "S01-PLAN.md"), "utf-8");
@@ -366,8 +366,6 @@ function makeMockDeps(
366
366
  runPreDispatchHooks: () => ({ firedHooks: [], action: "proceed" }),
367
367
  getPriorSliceCompletionBlocker: () => null,
368
368
  getMainBranch: () => "main",
369
- collectObservabilityWarnings: async () => [],
370
- buildObservabilityRepairBlock: () => null,
371
369
  closeoutUnit: async () => {},
372
370
  verifyExpectedArtifact: () => true,
373
371
  clearUnitRuntimeRecord: () => {},
@@ -2069,7 +2067,7 @@ test("autoLoop stops when worktree has no .git for execute-task (#1833)", async
2069
2067
  );
2070
2068
  });
2071
2069
 
2072
- test("autoLoop stops when worktree has no project files for execute-task (#1833)", async () => {
2070
+ test("autoLoop warns but proceeds for greenfield project (no project files) (#1833)", async () => {
2073
2071
  _resetPendingResolve();
2074
2072
 
2075
2073
  const ctx = makeMockCtx();
@@ -2078,10 +2076,17 @@ test("autoLoop stops when worktree has no project files for execute-task (#1833)
2078
2076
  const pi = makeMockPi();
2079
2077
 
2080
2078
  const notifications: string[] = [];
2081
- ctx.ui.notify = (msg: string) => { notifications.push(msg); };
2082
-
2083
2079
  const s = makeLoopSession({ basePath: "/tmp/empty-worktree" });
2084
2080
 
2081
+ ctx.ui.notify = (msg: string) => {
2082
+ notifications.push(msg);
2083
+ // Terminate the loop after the greenfield warning fires,
2084
+ // so we don't hang waiting for dispatch resolution.
2085
+ if (msg.includes("greenfield")) {
2086
+ s.active = false;
2087
+ }
2088
+ };
2089
+
2085
2090
  const deps = makeMockDeps({
2086
2091
  deriveState: async () => {
2087
2092
  deps.callLog.push("deriveState");
@@ -2100,15 +2105,19 @@ test("autoLoop stops when worktree has no project files for execute-task (#1833)
2100
2105
 
2101
2106
  await autoLoop(ctx, pi, s, deps);
2102
2107
 
2108
+ // Should NOT have stopped auto-mode due to health check — greenfield is allowed
2109
+ const stoppedForHealth = notifications.find(
2110
+ (n) => n.includes("Worktree health check failed"),
2111
+ );
2103
2112
  assert.ok(
2104
- deps.callLog.includes("stopAuto"),
2105
- "should stop auto-mode when worktree has no project files",
2113
+ !stoppedForHealth,
2114
+ "should not stop with health check failure for greenfield project",
2106
2115
  );
2107
- const healthNotification = notifications.find(
2108
- (n) => n.includes("Worktree health check failed") && n.includes("no recognized project files"),
2116
+ const greenfieldWarning = notifications.find(
2117
+ (n) => n.includes("no recognized project files") && n.includes("greenfield"),
2109
2118
  );
2110
2119
  assert.ok(
2111
- healthNotification,
2112
- "should notify about missing project files in worktree",
2120
+ greenfieldWarning,
2121
+ "should warn about greenfield project (no project files)",
2113
2122
  );
2114
2123
  });
@@ -33,7 +33,7 @@ test("auto-preflight scopes to active milestone, ignoring historical", async ()
33
33
 
34
34
  const historicalReport = await runGSDDoctor(tmpBase, { fix: false });
35
35
  const historicalWarnings = historicalReport.issues.filter(issue => issue.unitId.startsWith("M001/S01") && issue.severity === "warning");
36
- assert.ok(historicalWarnings.length > 0, "full repo still contains historical warning drift");
36
+ assert.equal(historicalWarnings.length, 0, "completed historical milestone produces no checkbox/file-mismatch warnings");
37
37
  } finally {
38
38
  rmSync(tmpBase, { recursive: true, force: true });
39
39
  }
@@ -13,9 +13,18 @@ import {
13
13
  selfHealRuntimeRecords,
14
14
  hasImplementationArtifacts,
15
15
  } from "../auto-recovery.ts";
16
- import { parseRoadmap, clearParseCache } from "../files.ts";
16
+ import { parseRoadmap, parsePlan } from "../parsers-legacy.ts";
17
+ import { parseTaskPlanFile, clearParseCache } from "../files.ts";
17
18
  import { invalidateAllCaches } from "../cache.ts";
18
19
  import { deriveState, invalidateStateCache } from "../state.ts";
20
+ import {
21
+ openDatabase,
22
+ closeDatabase,
23
+ insertMilestone,
24
+ insertSlice,
25
+ insertTask,
26
+ } from "../gsd-db.ts";
27
+ import { renderPlanFromDb } from "../markdown-renderer.ts";
19
28
 
20
29
  function makeTmpBase(): string {
21
30
  const base = join(tmpdir(), `gsd-test-${randomUUID()}`);
@@ -158,8 +167,7 @@ test("buildLoopRemediationSteps returns steps for execute-task", () => {
158
167
  const steps = buildLoopRemediationSteps("execute-task", "M001/S01/T01", base);
159
168
  assert.ok(steps);
160
169
  assert.ok(steps!.includes("T01"));
161
- assert.ok(steps!.includes("gsd doctor"));
162
- assert.ok(steps!.includes("[x]"));
170
+ assert.ok(steps!.includes("gsd undo-task"));
163
171
  } finally {
164
172
  cleanup(base);
165
173
  }
@@ -171,7 +179,7 @@ test("buildLoopRemediationSteps returns steps for plan-slice", () => {
171
179
  const steps = buildLoopRemediationSteps("plan-slice", "M001/S01", base);
172
180
  assert.ok(steps);
173
181
  assert.ok(steps!.includes("PLAN"));
174
- assert.ok(steps!.includes("gsd doctor"));
182
+ assert.ok(steps!.includes("gsd recover"));
175
183
  } finally {
176
184
  cleanup(base);
177
185
  }
@@ -183,7 +191,7 @@ test("buildLoopRemediationSteps returns steps for complete-slice", () => {
183
191
  const steps = buildLoopRemediationSteps("complete-slice", "M001/S01", base);
184
192
  assert.ok(steps);
185
193
  assert.ok(steps!.includes("S01"));
186
- assert.ok(steps!.includes("ROADMAP"));
194
+ assert.ok(steps!.includes("gsd reset-slice"));
187
195
  } finally {
188
196
  cleanup(base);
189
197
  }
@@ -471,6 +479,143 @@ test("verifyExpectedArtifact execute-task passes for heading-style plan entry (#
471
479
  }
472
480
  });
473
481
 
482
+ test("verifyExpectedArtifact plan-slice passes for rendered slice/task plan artifacts from DB", async () => {
483
+ const base = makeTmpBase();
484
+ const dbPath = join(base, ".gsd", "gsd.db");
485
+ openDatabase(dbPath);
486
+ try {
487
+ insertMilestone({ id: "M001", title: "Milestone", status: "active" });
488
+ insertSlice({
489
+ id: "S01",
490
+ milestoneId: "M001",
491
+ title: "Rendered slice",
492
+ status: "pending",
493
+ demo: "Rendered plan artifacts exist.",
494
+ planning: {
495
+ goal: "Render plans from DB rows.",
496
+ successCriteria: "- Slice plan parses\n- Task plan files exist on disk",
497
+ proofLevel: "integration",
498
+ integrationClosure: "DB rows are the source of truth for PLAN artifacts.",
499
+ observabilityImpact: "- Recovery verification fails if a task plan file is missing",
500
+ },
501
+ });
502
+ insertTask({
503
+ id: "T01",
504
+ sliceId: "S01",
505
+ milestoneId: "M001",
506
+ title: "Render plan",
507
+ status: "pending",
508
+ planning: {
509
+ description: "Create the slice plan from DB state.",
510
+ estimate: "30m",
511
+ files: ["src/resources/extensions/gsd/markdown-renderer.ts"],
512
+ verify: "node --test markdown-renderer.test.ts",
513
+ inputs: ["src/resources/extensions/gsd/gsd-db.ts"],
514
+ expectedOutput: ["src/resources/extensions/gsd/tests/markdown-renderer.test.ts"],
515
+ observabilityImpact: "Renderer tests cover the failure mode.",
516
+ },
517
+ });
518
+ insertTask({
519
+ id: "T02",
520
+ sliceId: "S01",
521
+ milestoneId: "M001",
522
+ title: "Verify recovery",
523
+ status: "pending",
524
+ planning: {
525
+ description: "Prove task plan files remain present for recovery.",
526
+ estimate: "20m",
527
+ files: ["src/resources/extensions/gsd/auto-recovery.ts"],
528
+ verify: "node --test auto-recovery.test.ts",
529
+ inputs: ["src/resources/extensions/gsd/auto-recovery.ts"],
530
+ expectedOutput: ["src/resources/extensions/gsd/tests/auto-recovery.test.ts"],
531
+ observabilityImpact: "Missing plan files surface as explicit verification failures.",
532
+ },
533
+ });
534
+
535
+ const rendered = await renderPlanFromDb(base, "M001", "S01");
536
+ assert.ok(existsSync(rendered.planPath), "renderPlanFromDb should write the slice plan");
537
+ assert.equal(rendered.taskPlanPaths.length, 2, "renderPlanFromDb should render one task plan per task");
538
+
539
+ const planContent = readFileSync(rendered.planPath, "utf-8");
540
+ const parsedPlan = parsePlan(planContent);
541
+ assert.equal(parsedPlan.tasks.length, 2, "rendered slice plan should parse into task entries");
542
+
543
+ const taskPlanContent = readFileSync(rendered.taskPlanPaths[0], "utf-8");
544
+ const taskPlan = parseTaskPlanFile(taskPlanContent);
545
+ assert.deepEqual(taskPlan.frontmatter.skills_used, [], "rendered task plans should use conservative empty skills_used");
546
+
547
+ const result = verifyExpectedArtifact("plan-slice", "M001/S01", base);
548
+ assert.equal(result, true, "plan-slice verification should pass when rendered task plan files exist");
549
+ } finally {
550
+ closeDatabase();
551
+ cleanup(base);
552
+ }
553
+ });
554
+
555
+ test("verifyExpectedArtifact plan-slice fails after deleting a rendered task plan file", async () => {
556
+ const base = makeTmpBase();
557
+ const dbPath = join(base, ".gsd", "gsd.db");
558
+ openDatabase(dbPath);
559
+ try {
560
+ insertMilestone({ id: "M001", title: "Milestone", status: "active" });
561
+ insertSlice({
562
+ id: "S01",
563
+ milestoneId: "M001",
564
+ title: "Rendered slice",
565
+ status: "pending",
566
+ demo: "Rendered plan artifacts exist.",
567
+ planning: {
568
+ goal: "Render plans from DB rows.",
569
+ successCriteria: "- Slice plan parses\n- Task plan files exist on disk",
570
+ proofLevel: "integration",
571
+ integrationClosure: "DB rows are the source of truth for PLAN artifacts.",
572
+ observabilityImpact: "- Recovery verification fails if a task plan file is missing",
573
+ },
574
+ });
575
+ insertTask({
576
+ id: "T01",
577
+ sliceId: "S01",
578
+ milestoneId: "M001",
579
+ title: "Render plan",
580
+ status: "pending",
581
+ planning: {
582
+ description: "Create the slice plan from DB state.",
583
+ estimate: "30m",
584
+ files: ["src/resources/extensions/gsd/markdown-renderer.ts"],
585
+ verify: "node --test markdown-renderer.test.ts",
586
+ inputs: ["src/resources/extensions/gsd/gsd-db.ts"],
587
+ expectedOutput: ["src/resources/extensions/gsd/tests/markdown-renderer.test.ts"],
588
+ observabilityImpact: "Renderer tests cover the failure mode.",
589
+ },
590
+ });
591
+ insertTask({
592
+ id: "T02",
593
+ sliceId: "S01",
594
+ milestoneId: "M001",
595
+ title: "Verify recovery",
596
+ status: "pending",
597
+ planning: {
598
+ description: "Prove task plan files remain present for recovery.",
599
+ estimate: "20m",
600
+ files: ["src/resources/extensions/gsd/auto-recovery.ts"],
601
+ verify: "node --test auto-recovery.test.ts",
602
+ inputs: ["src/resources/extensions/gsd/auto-recovery.ts"],
603
+ expectedOutput: ["src/resources/extensions/gsd/tests/auto-recovery.test.ts"],
604
+ observabilityImpact: "Missing plan files surface as explicit verification failures.",
605
+ },
606
+ });
607
+
608
+ const rendered = await renderPlanFromDb(base, "M001", "S01");
609
+ rmSync(rendered.taskPlanPaths[1]);
610
+
611
+ const result = verifyExpectedArtifact("plan-slice", "M001/S01", base);
612
+ assert.equal(result, false, "plan-slice verification should fail when a rendered task plan file is removed");
613
+ } finally {
614
+ closeDatabase();
615
+ cleanup(base);
616
+ }
617
+ });
618
+
474
619
  // ─── selfHealRuntimeRecords — worktree base path (#769) ──────────────────
475
620
 
476
621
  test("selfHealRuntimeRecords clears stale dispatched records (#769)", async () => {
@@ -0,0 +1,121 @@
1
+ /**
2
+ * auto-stash-merge.test.ts — Regression tests for #2151.
3
+ *
4
+ * Tests that mergeMilestoneToMain auto-stashes dirty files before squash merge,
5
+ * and that nativeMergeSquash returns dirty filenames from git stderr.
6
+ */
7
+
8
+ import test from "node:test";
9
+ import assert from "node:assert/strict";
10
+ import { mkdtempSync, mkdirSync, writeFileSync, rmSync, existsSync, readFileSync, realpathSync } from "node:fs";
11
+ import { join } from "node:path";
12
+ import { tmpdir } from "node:os";
13
+ import { execSync } from "node:child_process";
14
+
15
+ import { createAutoWorktree, mergeMilestoneToMain } from "../auto-worktree.ts";
16
+ import { nativeMergeSquash } from "../native-git-bridge.ts";
17
+
18
+ function run(cmd: string, cwd: string): string {
19
+ return execSync(cmd, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
20
+ }
21
+
22
+ function createTempRepo(): string {
23
+ const dir = realpathSync(mkdtempSync(join(tmpdir(), "wt-autostash-test-")));
24
+ run("git init", dir);
25
+ run("git config user.email test@test.com", dir);
26
+ run("git config user.name Test", dir);
27
+ writeFileSync(join(dir, "README.md"), "# test\n");
28
+ mkdirSync(join(dir, ".gsd"), { recursive: true });
29
+ writeFileSync(join(dir, ".gsd", "STATE.md"), "# State\n");
30
+ run("git add .", dir);
31
+ run("git commit -m init", dir);
32
+ run("git branch -M main", dir);
33
+ return dir;
34
+ }
35
+
36
+ function makeRoadmap(milestoneId: string, title: string, slices: Array<{ id: string; title: string }>): string {
37
+ const sliceLines = slices.map(s => `- [x] **${s.id}: ${s.title}**`).join("\n");
38
+ return `# ${milestoneId}: ${title}\n\n## Slices\n${sliceLines}\n`;
39
+ }
40
+
41
+ function addSliceToMilestone(
42
+ repo: string, wtPath: string, milestoneId: string,
43
+ sliceId: string, sliceTitle: string,
44
+ commits: Array<{ file: string; content: string; message: string }>,
45
+ ): void {
46
+ const normalizedPath = wtPath.replaceAll("\\", "/");
47
+ const worktreeName = normalizedPath.split("/").pop() || milestoneId;
48
+ const sliceBranch = `slice/${worktreeName}/${sliceId}`;
49
+ run(`git checkout -b "${sliceBranch}"`, wtPath);
50
+ for (const c of commits) {
51
+ writeFileSync(join(wtPath, c.file), c.content);
52
+ run("git add .", wtPath);
53
+ run(`git commit -m "${c.message}"`, wtPath);
54
+ }
55
+ const milestoneBranch = `milestone/${milestoneId}`;
56
+ run(`git checkout "${milestoneBranch}"`, wtPath);
57
+ run(`git merge --no-ff "${sliceBranch}" -m "merge ${sliceId}: ${sliceTitle}"`, wtPath);
58
+ }
59
+
60
+ test("#2151 bug 1: auto-stash unblocks merge when unrelated files are dirty", () => {
61
+ const repo = createTempRepo();
62
+ try {
63
+ const wtPath = createAutoWorktree(repo, "M200");
64
+
65
+ addSliceToMilestone(repo, wtPath, "M200", "S01", "Stash test", [
66
+ { file: "stash-test.ts", content: "export const stash = true;\n", message: "add stash test" },
67
+ ]);
68
+
69
+ // Dirty an unrelated tracked file in the project root — this previously
70
+ // blocked the squash merge with "local changes would be overwritten".
71
+ writeFileSync(join(repo, "README.md"), "# modified locally\n");
72
+
73
+ const roadmap = makeRoadmap("M200", "Auto-stash test", [
74
+ { id: "S01", title: "Stash test" },
75
+ ]);
76
+
77
+ // Should succeed — the dirty README.md is auto-stashed before merge.
78
+ const result = mergeMilestoneToMain(repo, "M200", roadmap);
79
+ assert.ok(result.commitMessage.includes("feat(M200)"), "merge succeeds with dirty unrelated file");
80
+ assert.ok(existsSync(join(repo, "stash-test.ts")), "milestone code merged to main");
81
+
82
+ // Verify the dirty file was restored (stash popped).
83
+ const readmeContent = readFileSync(join(repo, "README.md"), "utf-8");
84
+ assert.equal(readmeContent.replace(/\r\n/g, "\n"), "# modified locally\n", "stash popped — dirty file restored after merge");
85
+ } finally {
86
+ try { rmSync(repo, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* Windows EPERM: git holds locks on .git files */ }
87
+ }
88
+ });
89
+
90
+ test("#2151 bug 2: nativeMergeSquash returns dirty filenames", async () => {
91
+ const { nativeMergeSquash } = await import("../native-git-bridge.ts");
92
+ const repo = createTempRepo();
93
+ try {
94
+ run("git checkout -b milestone/M210", repo);
95
+ writeFileSync(join(repo, "overlap.ts"), "export const overlap = true;\n");
96
+ run("git add .", repo);
97
+ run('git commit -m "add overlap"', repo);
98
+ run("git checkout main", repo);
99
+
100
+ // Create the same file as a dirty local change
101
+ writeFileSync(join(repo, "overlap.ts"), "// local dirty version\n");
102
+
103
+ const result = nativeMergeSquash(repo, "milestone/M210");
104
+ assert.equal(result.success, false, "merge reports failure");
105
+ assert.ok(
106
+ result.conflicts.includes("__dirty_working_tree__"),
107
+ "conflicts include __dirty_working_tree__ sentinel",
108
+ );
109
+ assert.ok(
110
+ Array.isArray(result.dirtyFiles) && result.dirtyFiles.length > 0,
111
+ "dirtyFiles array is populated",
112
+ );
113
+ assert.ok(
114
+ result.dirtyFiles!.includes("overlap.ts"),
115
+ "dirtyFiles includes the actual dirty file name",
116
+ );
117
+ } finally {
118
+ run("git checkout -- . 2>/dev/null || true", repo);
119
+ try { rmSync(repo, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* Windows EPERM: git holds locks on .git files */ }
120
+ }
121
+ });
@@ -463,8 +463,11 @@ async function main(): Promise<void> {
463
463
  assertTrue(existsSync(join(repo, "sync-test.ts")), "sync-test.ts on main after merge");
464
464
  }
465
465
 
466
- // ─── Test 11: #1738 Bug 1+2 dirty tree merge preserves branch end-to-end ──
467
- console.log("\n=== #1738 e2e: dirty tree rejection preserves branch ===");
466
+ // ─── Test 11: #1738 Bug 1+2 #2151: dirty tree auto-stashed, merge succeeds ──
467
+ // Before #2151, a conflicting dirty file in the project root would cause
468
+ // the squash merge to reject. Now auto-stash moves it out of the way,
469
+ // the merge succeeds, and the user's local file goes to the stash.
470
+ console.log("\n=== #2151: dirty tree auto-stashed, merge succeeds ===");
468
471
  {
469
472
  const repo = freshRepo();
470
473
  const wtPath = createAutoWorktree(repo, "M100");
@@ -473,31 +476,21 @@ async function main(): Promise<void> {
473
476
  { file: "e2e.ts", content: "export const e2e = true;\n", message: "add e2e" },
474
477
  ]);
475
478
 
479
+ // Create a conflicting local file — previously blocked the merge.
476
480
  writeFileSync(join(repo, "e2e.ts"), "// conflicting local file\n");
477
481
 
478
482
  const roadmap = makeRoadmap("M100", "E2E dirty tree", [
479
483
  { id: "S01", title: "E2E test" },
480
484
  ]);
481
485
 
482
- let threw = false;
483
- let errorMsg = "";
484
- try {
485
- mergeMilestoneToMain(repo, "M100", roadmap);
486
- } catch (err: unknown) {
487
- threw = true;
488
- errorMsg = err instanceof Error ? err.message : String(err);
489
- }
490
- assertTrue(threw, "#1738 e2e: throws on dirty working tree");
491
- assertTrue(
492
- errorMsg.includes("dirty") || errorMsg.includes("untracked") || errorMsg.includes("overwritten"),
493
- "#1738 e2e: error identifies dirty tree cause",
494
- );
486
+ // With auto-stash (#2151), the merge should succeed.
487
+ const result = mergeMilestoneToMain(repo, "M100", roadmap);
488
+ assertTrue(result.commitMessage.includes("feat(M100)"), "#2151: merge succeeds after auto-stash");
495
489
 
496
- const branches = run("git branch", repo);
497
- assertTrue(
498
- branches.includes("milestone/M100"),
499
- "#1738 e2e: milestone branch preserved on dirty tree rejection",
500
- );
490
+ // The milestone code should be on main.
491
+ assertTrue(existsSync(join(repo, "e2e.ts")), "#2151: e2e.ts merged to main");
492
+ const content = readFileSync(join(repo, "e2e.ts"), "utf-8");
493
+ assertEq(content.replace(/\r\n/g, "\n"), "export const e2e = true;\n", "#2151: merged content is from milestone branch");
501
494
  }
502
495
 
503
496
  // ─── Test 12: Throw on unanchored code changes after empty commit (#1792) ─
@@ -771,6 +764,8 @@ async function main(): Promise<void> {
771
764
  assertTrue(existsSync(join(repo, "real-code.ts")), "real-code.ts merged to main");
772
765
  }
773
766
 
767
+ // Tests 20 and 21 for #2151 are in auto-stash-merge.test.ts (node:test format).
768
+
774
769
  } finally {
775
770
  process.chdir(savedCwd);
776
771
  for (const d of tempDirs) {
@@ -158,7 +158,7 @@ async function main(): Promise<void> {
158
158
  {
159
159
  const { deriveState, isMilestoneComplete } = await import("../state.ts");
160
160
  const { invalidateAllCaches: invalidateAllCachesDynamic } = await import("../cache.ts");
161
- const { parseRoadmap } = await import("../files.ts");
161
+ const { parseRoadmap } = await import("../parsers-legacy.ts");
162
162
 
163
163
  const base = createFixtureBase();
164
164
  try {