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
@@ -4,58 +4,92 @@ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
4
4
  import { join } from "node:path";
5
5
  import { tmpdir } from "node:os";
6
6
  import { getPriorSliceCompletionBlocker } from "../dispatch-guard.ts";
7
+ import { openDatabase, closeDatabase, insertMilestone, insertSlice } from "../gsd-db.ts";
7
8
 
8
- test("dispatch guard blocks when prior milestone has incomplete slices", () => {
9
+ /** Helper: create temp dir and open an in-dir DB for dispatch-guard tests */
10
+ function setupRepo(): string {
9
11
  const repo = mkdtempSync(join(tmpdir(), "gsd-dispatch-guard-"));
12
+ mkdirSync(join(repo, ".gsd"), { recursive: true });
13
+ openDatabase(join(repo, ".gsd", "gsd.db"));
14
+ return repo;
15
+ }
16
+
17
+ /** Helper: tear down repo (close DB then remove dir) */
18
+ function teardownRepo(repo: string): void {
19
+ closeDatabase();
20
+ rmSync(repo, { recursive: true, force: true });
21
+ }
22
+
23
+ test("dispatch guard blocks when prior milestone has incomplete slices", () => {
24
+ const repo = setupRepo();
10
25
  try {
11
26
  mkdirSync(join(repo, ".gsd", "milestones", "M002"), { recursive: true });
12
27
  mkdirSync(join(repo, ".gsd", "milestones", "M003"), { recursive: true });
13
28
 
14
- writeFileSync(join(repo, ".gsd", "milestones", "M002", "M002-ROADMAP.md"),
15
- "# M002: Previous\n\n## Slices\n- [x] **S01: Done** `risk:low` `depends:[]`\n- [ ] **S02: Pending** `risk:low` `depends:[S01]`\n");
16
- writeFileSync(join(repo, ".gsd", "milestones", "M003", "M003-ROADMAP.md"),
17
- "# M003: Current\n\n## Slices\n- [ ] **S01: First** `risk:low` `depends:[]`\n- [ ] **S02: Second** `risk:low` `depends:[S01]`\n");
29
+ // Seed DB: M002 with S01 complete, S02 pending
30
+ insertMilestone({ id: "M002", title: "Previous" });
31
+ insertSlice({ id: "S01", milestoneId: "M002", title: "Done", status: "complete", depends: [], sequence: 1 });
32
+ insertSlice({ id: "S02", milestoneId: "M002", title: "Pending", status: "pending", depends: ["S01"], sequence: 2 });
33
+
34
+ // M003 with two pending slices
35
+ insertMilestone({ id: "M003", title: "Current" });
36
+ insertSlice({ id: "S01", milestoneId: "M003", title: "First", status: "pending", depends: [], sequence: 1 });
37
+ insertSlice({ id: "S02", milestoneId: "M003", title: "Second", status: "pending", depends: ["S01"], sequence: 2 });
38
+
39
+ // Need ROADMAP files for milestone discovery (findMilestoneIds reads disk)
40
+ writeFileSync(join(repo, ".gsd", "milestones", "M002", "M002-ROADMAP.md"), "# M002\n");
41
+ writeFileSync(join(repo, ".gsd", "milestones", "M003", "M003-ROADMAP.md"), "# M003\n");
18
42
 
19
43
  assert.equal(
20
44
  getPriorSliceCompletionBlocker(repo, "main", "plan-slice", "M003/S01"),
21
45
  "Cannot dispatch plan-slice M003/S01: earlier slice M002/S02 is not complete.",
22
46
  );
23
47
  } finally {
24
- rmSync(repo, { recursive: true, force: true });
48
+ teardownRepo(repo);
25
49
  }
26
50
  });
27
51
 
28
52
  test("dispatch guard blocks later slice in same milestone when earlier incomplete", () => {
29
- const repo = mkdtempSync(join(tmpdir(), "gsd-dispatch-guard-"));
53
+ const repo = setupRepo();
30
54
  try {
31
55
  mkdirSync(join(repo, ".gsd", "milestones", "M002"), { recursive: true });
32
56
  mkdirSync(join(repo, ".gsd", "milestones", "M003"), { recursive: true });
33
57
 
34
- writeFileSync(join(repo, ".gsd", "milestones", "M002", "M002-ROADMAP.md"),
35
- "# M002: Previous\n\n## Slices\n- [x] **S01: Done** `risk:low` `depends:[]`\n- [x] **S02: Done** `risk:low` `depends:[S01]`\n");
36
- writeFileSync(join(repo, ".gsd", "milestones", "M003", "M003-ROADMAP.md"),
37
- "# M003: Current\n\n## Slices\n- [ ] **S01: First** `risk:low` `depends:[]`\n- [ ] **S02: Second** `risk:low` `depends:[S01]`\n");
58
+ insertMilestone({ id: "M002", title: "Previous" });
59
+ insertSlice({ id: "S01", milestoneId: "M002", title: "Done", status: "complete", depends: [], sequence: 1 });
60
+ insertSlice({ id: "S02", milestoneId: "M002", title: "Done", status: "complete", depends: ["S01"], sequence: 2 });
61
+
62
+ insertMilestone({ id: "M003", title: "Current" });
63
+ insertSlice({ id: "S01", milestoneId: "M003", title: "First", status: "pending", depends: [], sequence: 1 });
64
+ insertSlice({ id: "S02", milestoneId: "M003", title: "Second", status: "pending", depends: ["S01"], sequence: 2 });
65
+
66
+ writeFileSync(join(repo, ".gsd", "milestones", "M002", "M002-ROADMAP.md"), "# M002\n");
67
+ writeFileSync(join(repo, ".gsd", "milestones", "M003", "M003-ROADMAP.md"), "# M003\n");
38
68
 
39
69
  assert.equal(
40
70
  getPriorSliceCompletionBlocker(repo, "main", "execute-task", "M003/S02/T01"),
41
71
  "Cannot dispatch execute-task M003/S02/T01: dependency slice M003/S01 is not complete.",
42
72
  );
43
73
  } finally {
44
- rmSync(repo, { recursive: true, force: true });
74
+ teardownRepo(repo);
45
75
  }
46
76
  });
47
77
 
48
78
  test("dispatch guard allows dispatch when all earlier slices complete", () => {
49
- const repo = mkdtempSync(join(tmpdir(), "gsd-dispatch-guard-"));
79
+ const repo = setupRepo();
50
80
  try {
51
81
  mkdirSync(join(repo, ".gsd", "milestones", "M003"), { recursive: true });
52
- writeFileSync(join(repo, ".gsd", "milestones", "M003", "M003-ROADMAP.md"),
53
- "# M003: Current\n\n## Slices\n- [x] **S01: First** `risk:low` `depends:[]`\n- [ ] **S02: Second** `risk:low` `depends:[S01]`\n");
82
+
83
+ insertMilestone({ id: "M003", title: "Current" });
84
+ insertSlice({ id: "S01", milestoneId: "M003", title: "First", status: "complete", depends: [], sequence: 1 });
85
+ insertSlice({ id: "S02", milestoneId: "M003", title: "Second", status: "pending", depends: ["S01"], sequence: 2 });
86
+
87
+ writeFileSync(join(repo, ".gsd", "milestones", "M003", "M003-ROADMAP.md"), "# M003\n");
54
88
 
55
89
  assert.equal(getPriorSliceCompletionBlocker(repo, "main", "execute-task", "M003/S02/T01"), null);
56
90
  assert.equal(getPriorSliceCompletionBlocker(repo, "main", "plan-milestone", "M003"), null);
57
91
  } finally {
58
- rmSync(repo, { recursive: true, force: true });
92
+ teardownRepo(repo);
59
93
  }
60
94
  });
61
95
 
@@ -63,17 +97,19 @@ test("dispatch guard unblocks slice when positionally-earlier slice depends on i
63
97
  // S05 depends on S06, but S05 appears first positionally.
64
98
  // Old behavior: S06 blocked because S05 (positionally earlier) is incomplete.
65
99
  // Fixed behavior: S06 has no unmet dependencies, so it can dispatch.
66
- const repo = mkdtempSync(join(tmpdir(), "gsd-dispatch-guard-"));
100
+ const repo = setupRepo();
67
101
  try {
68
102
  mkdirSync(join(repo, ".gsd", "milestones", "M001"), { recursive: true });
69
- writeFileSync(join(repo, ".gsd", "milestones", "M001", "M001-ROADMAP.md"),
70
- "# M001: Test\n\n## Slices\n" +
71
- "- [x] **S01: Setup** `risk:low` `depends:[]`\n" +
72
- "- [x] **S02: Core** `risk:low` `depends:[S01]`\n" +
73
- "- [x] **S03: API** `risk:low` `depends:[S02]`\n" +
74
- "- [x] **S04: Auth** `risk:low` `depends:[S03]`\n" +
75
- "- [ ] **S05: Integration** `risk:high` `depends:[S04,S06]`\n" +
76
- "- [ ] **S06: Data Layer** `risk:medium` `depends:[S04]`\n");
103
+
104
+ insertMilestone({ id: "M001", title: "Test" });
105
+ insertSlice({ id: "S01", milestoneId: "M001", title: "Setup", status: "complete", depends: [], sequence: 1 });
106
+ insertSlice({ id: "S02", milestoneId: "M001", title: "Core", status: "complete", depends: ["S01"], sequence: 2 });
107
+ insertSlice({ id: "S03", milestoneId: "M001", title: "API", status: "complete", depends: ["S02"], sequence: 3 });
108
+ insertSlice({ id: "S04", milestoneId: "M001", title: "Auth", status: "complete", depends: ["S03"], sequence: 4 });
109
+ insertSlice({ id: "S05", milestoneId: "M001", title: "Integration", status: "pending", depends: ["S04", "S06"], sequence: 5 });
110
+ insertSlice({ id: "S06", milestoneId: "M001", title: "Data Layer", status: "pending", depends: ["S04"], sequence: 6 });
111
+
112
+ writeFileSync(join(repo, ".gsd", "milestones", "M001", "M001-ROADMAP.md"), "# M001\n");
77
113
 
78
114
  // S06 depends only on S04 (complete) — should be unblocked
79
115
  assert.equal(
@@ -87,19 +123,21 @@ test("dispatch guard unblocks slice when positionally-earlier slice depends on i
87
123
  "Cannot dispatch plan-slice M001/S05: dependency slice M001/S06 is not complete.",
88
124
  );
89
125
  } finally {
90
- rmSync(repo, { recursive: true, force: true });
126
+ teardownRepo(repo);
91
127
  }
92
128
  });
93
129
 
94
130
  test("dispatch guard falls back to positional ordering when no dependencies declared", () => {
95
- const repo = mkdtempSync(join(tmpdir(), "gsd-dispatch-guard-"));
131
+ const repo = setupRepo();
96
132
  try {
97
133
  mkdirSync(join(repo, ".gsd", "milestones", "M001"), { recursive: true });
98
- writeFileSync(join(repo, ".gsd", "milestones", "M001", "M001-ROADMAP.md"),
99
- "# M001: Test\n\n## Slices\n" +
100
- "- [x] **S01: First** `risk:low` `depends:[]`\n" +
101
- "- [ ] **S02: Second** `risk:low` `depends:[]`\n" +
102
- "- [ ] **S03: Third** `risk:low` `depends:[]`\n");
134
+
135
+ insertMilestone({ id: "M001", title: "Test" });
136
+ insertSlice({ id: "S01", milestoneId: "M001", title: "First", status: "complete", depends: [], sequence: 1 });
137
+ insertSlice({ id: "S02", milestoneId: "M001", title: "Second", status: "pending", depends: [], sequence: 2 });
138
+ insertSlice({ id: "S03", milestoneId: "M001", title: "Third", status: "pending", depends: [], sequence: 3 });
139
+
140
+ writeFileSync(join(repo, ".gsd", "milestones", "M001", "M001-ROADMAP.md"), "# M001\n");
103
141
 
104
142
  // S03 has no dependencies — positional fallback blocks on S02
105
143
  assert.equal(
@@ -113,20 +151,22 @@ test("dispatch guard falls back to positional ordering when no dependencies decl
113
151
  null,
114
152
  );
115
153
  } finally {
116
- rmSync(repo, { recursive: true, force: true });
154
+ teardownRepo(repo);
117
155
  }
118
156
  });
119
157
 
120
158
  test("dispatch guard allows slice with all declared dependencies complete", () => {
121
- const repo = mkdtempSync(join(tmpdir(), "gsd-dispatch-guard-"));
159
+ const repo = setupRepo();
122
160
  try {
123
161
  mkdirSync(join(repo, ".gsd", "milestones", "M001"), { recursive: true });
124
- writeFileSync(join(repo, ".gsd", "milestones", "M001", "M001-ROADMAP.md"),
125
- "# M001: Test\n\n## Slices\n" +
126
- "- [x] **S01: Setup** `risk:low` `depends:[]`\n" +
127
- "- [x] **S02: Core** `risk:low` `depends:[S01]`\n" +
128
- "- [ ] **S03: Feature A** `risk:low` `depends:[S01,S02]`\n" +
129
- "- [ ] **S04: Feature B** `risk:low` `depends:[S01]`\n");
162
+
163
+ insertMilestone({ id: "M001", title: "Test" });
164
+ insertSlice({ id: "S01", milestoneId: "M001", title: "Setup", status: "complete", depends: [], sequence: 1 });
165
+ insertSlice({ id: "S02", milestoneId: "M001", title: "Core", status: "complete", depends: ["S01"], sequence: 2 });
166
+ insertSlice({ id: "S03", milestoneId: "M001", title: "Feature A", status: "pending", depends: ["S01", "S02"], sequence: 3 });
167
+ insertSlice({ id: "S04", milestoneId: "M001", title: "Feature B", status: "pending", depends: ["S01"], sequence: 4 });
168
+
169
+ writeFileSync(join(repo, ".gsd", "milestones", "M001", "M001-ROADMAP.md"), "# M001\n");
130
170
 
131
171
  // S03 depends on S01 (done) and S02 (done) — unblocked
132
172
  assert.equal(
@@ -140,28 +180,31 @@ test("dispatch guard allows slice with all declared dependencies complete", () =
140
180
  null,
141
181
  );
142
182
  } finally {
143
- rmSync(repo, { recursive: true, force: true });
183
+ teardownRepo(repo);
144
184
  }
145
185
  });
146
186
 
147
187
  test("dispatch guard skips completed milestone with SUMMARY even if it has unchecked remediation slices (#1716)", () => {
148
- const repo = mkdtempSync(join(tmpdir(), "gsd-dispatch-guard-"));
188
+ const repo = setupRepo();
149
189
  try {
150
190
  mkdirSync(join(repo, ".gsd", "milestones", "M001"), { recursive: true });
151
191
  mkdirSync(join(repo, ".gsd", "milestones", "M002"), { recursive: true });
152
192
 
153
- // M001 is complete (has SUMMARY) but has unchecked remediation slices
154
- writeFileSync(join(repo, ".gsd", "milestones", "M001", "M001-ROADMAP.md"),
155
- "# M001: Previous\n\n## Slices\n" +
156
- "- [x] **S01: Core** `risk:low` `depends:[]`\n" +
157
- "- [x] **S02: Tests** `risk:low` `depends:[S01]`\n" +
158
- "- [ ] **S03-R: Remediation** `risk:low` `depends:[S02]`\n" +
159
- "- [ ] **S04-R: Remediation 2** `risk:low` `depends:[S02]`\n");
193
+ // M001 is complete (has SUMMARY) but has unchecked remediation slices in DB
194
+ insertMilestone({ id: "M001", title: "Previous" });
195
+ insertSlice({ id: "S01", milestoneId: "M001", title: "Core", status: "complete", depends: [], sequence: 1 });
196
+ insertSlice({ id: "S02", milestoneId: "M001", title: "Tests", status: "complete", depends: ["S01"], sequence: 2 });
197
+ insertSlice({ id: "S03-R", milestoneId: "M001", title: "Remediation", status: "pending", depends: ["S02"], sequence: 3 });
198
+ insertSlice({ id: "S04-R", milestoneId: "M001", title: "Remediation 2", status: "pending", depends: ["S02"], sequence: 4 });
199
+
200
+ insertMilestone({ id: "M002", title: "Current" });
201
+ insertSlice({ id: "S01", milestoneId: "M002", title: "Start", status: "pending", depends: [], sequence: 1 });
202
+
203
+ // M001 SUMMARY on disk triggers skip
204
+ writeFileSync(join(repo, ".gsd", "milestones", "M001", "M001-ROADMAP.md"), "# M001\n");
160
205
  writeFileSync(join(repo, ".gsd", "milestones", "M001", "M001-SUMMARY.md"),
161
206
  "---\nstatus: complete\n---\n# M001 Summary\nDone.\n");
162
-
163
- writeFileSync(join(repo, ".gsd", "milestones", "M002", "M002-ROADMAP.md"),
164
- "# M002: Current\n\n## Slices\n- [ ] **S01: Start** `risk:low` `depends:[]`\n");
207
+ writeFileSync(join(repo, ".gsd", "milestones", "M002", "M002-ROADMAP.md"), "# M002\n");
165
208
 
166
209
  // M001 has SUMMARY — should be skipped, not block M002/S01
167
210
  assert.equal(
@@ -169,19 +212,23 @@ test("dispatch guard skips completed milestone with SUMMARY even if it has unche
169
212
  null,
170
213
  );
171
214
  } finally {
172
- rmSync(repo, { recursive: true, force: true });
215
+ teardownRepo(repo);
173
216
  }
174
217
  });
175
218
 
176
219
  test("dispatch guard works without git repo", () => {
177
- const repo = mkdtempSync(join(tmpdir(), "gsd-dispatch-guard-nogit-"));
220
+ const repo = setupRepo();
178
221
  try {
179
222
  mkdirSync(join(repo, ".gsd", "milestones", "M001"), { recursive: true });
180
- writeFileSync(join(repo, ".gsd", "milestones", "M001", "M001-ROADMAP.md"),
181
- "# M001: Test\n\n## Slices\n- [x] **S01: Done** `risk:low` `depends:[]`\n- [ ] **S02: Pending** `risk:low` `depends:[S01]`\n");
223
+
224
+ insertMilestone({ id: "M001", title: "Test" });
225
+ insertSlice({ id: "S01", milestoneId: "M001", title: "Done", status: "complete", depends: [], sequence: 1 });
226
+ insertSlice({ id: "S02", milestoneId: "M001", title: "Pending", status: "pending", depends: ["S01"], sequence: 2 });
227
+
228
+ writeFileSync(join(repo, ".gsd", "milestones", "M001", "M001-ROADMAP.md"), "# M001\n");
182
229
 
183
230
  assert.equal(getPriorSliceCompletionBlocker(repo, "main", "plan-slice", "M001/S02"), null);
184
231
  } finally {
185
- rmSync(repo, { recursive: true, force: true });
232
+ teardownRepo(repo);
186
233
  }
187
234
  });
@@ -1,20 +1,16 @@
1
1
  /**
2
- * Regression test for #1808: Completion-transition doctor fix deferral
3
- * creates fragile handoff window.
2
+ * Regression test for #1808: Completion-transition doctor fix deferral.
4
3
  *
5
- * Only slice summary should be deferred (needs LLM content).
6
- * Roadmap checkbox and UAT stub are mechanical bookkeeping and must be
7
- * fixed immediately at task fixLevel to prevent inconsistent state if the
8
- * session stops between last task and complete-slice.
4
+ * Reconciliation codes are removed doctor no longer creates summary/UAT
5
+ * stubs or reports checkbox/file mismatch issues.
9
6
  */
10
7
 
11
- import { mkdirSync, writeFileSync, rmSync, readFileSync, existsSync } from "node:fs";
8
+ import { mkdirSync, writeFileSync, rmSync, existsSync } from "node:fs";
12
9
  import { join } from "node:path";
13
10
  import { tmpdir } from "node:os";
14
11
  import test from "node:test";
15
12
  import assert from "node:assert/strict";
16
13
  import { runGSDDoctor } from "../doctor.ts";
17
- import { COMPLETION_TRANSITION_CODES } from "../doctor-types.ts";
18
14
 
19
15
  function makeTmp(name: string): string {
20
16
  const dir = join(tmpdir(), `doctor-deferral-${name}-${Date.now()}-${Math.random().toString(36).slice(2)}`);
@@ -22,11 +18,6 @@ function makeTmp(name: string): string {
22
18
  return dir;
23
19
  }
24
20
 
25
- /**
26
- * Build a minimal .gsd structure: milestone with one slice, one task
27
- * marked done with a summary — but no slice summary, no UAT, and
28
- * roadmap unchecked. This is the state after the last task completes.
29
- */
30
21
  function buildScaffold(base: string) {
31
22
  const gsd = join(base, ".gsd");
32
23
  const m = join(gsd, "milestones", "M001");
@@ -65,83 +56,34 @@ Done.
65
56
  `);
66
57
  }
67
58
 
68
- test("COMPLETION_TRANSITION_CODES only contains slice summary code", () => {
69
- assert.ok(
70
- COMPLETION_TRANSITION_CODES.has("all_tasks_done_missing_slice_summary"),
71
- "summary code should still be deferred"
72
- );
73
- assert.ok(
74
- !COMPLETION_TRANSITION_CODES.has("all_tasks_done_missing_slice_uat"),
75
- "UAT code should NOT be deferred"
76
- );
77
- assert.ok(
78
- !COMPLETION_TRANSITION_CODES.has("all_tasks_done_roadmap_not_checked"),
79
- "roadmap code should NOT be deferred"
80
- );
81
- });
82
-
83
- test("fixLevel:task — fixes UAT stub immediately, defers summary and roadmap checkbox (#1808, #1910)", async () => {
84
- const tmp = makeTmp("partial-deferral");
59
+ test("doctor does not report any reconciliation issue codes", async () => {
60
+ const tmp = makeTmp("no-reconciliation");
85
61
  try {
86
62
  buildScaffold(tmp);
87
63
 
88
64
  const report = await runGSDDoctor(tmp, { fix: true, fixLevel: "task" });
89
65
 
90
- // Should detect all three issues
66
+ const REMOVED_CODES = [
67
+ "task_done_missing_summary",
68
+ "task_summary_without_done_checkbox",
69
+ "all_tasks_done_missing_slice_summary",
70
+ "all_tasks_done_missing_slice_uat",
71
+ "all_tasks_done_roadmap_not_checked",
72
+ "slice_checked_missing_summary",
73
+ "slice_checked_missing_uat",
74
+ ];
75
+
91
76
  const codes = report.issues.map(i => i.code);
92
- assert.ok(codes.includes("all_tasks_done_missing_slice_summary"), "should detect missing summary");
93
- assert.ok(codes.includes("all_tasks_done_missing_slice_uat"), "should detect missing UAT");
94
- assert.ok(codes.includes("all_tasks_done_roadmap_not_checked"), "should detect unchecked roadmap");
77
+ for (const removed of REMOVED_CODES) {
78
+ assert.ok(!codes.includes(removed as any), `should NOT report removed code: ${removed}`);
79
+ }
95
80
 
96
- // Summary should NOT be created (still deferred — needs LLM content)
81
+ // No summary or UAT stubs should be created
97
82
  const sliceSummaryPath = join(tmp, ".gsd", "milestones", "M001", "slices", "S01", "S01-SUMMARY.md");
98
- assert.ok(!existsSync(sliceSummaryPath), "should NOT have created summary stub (deferred)");
83
+ assert.ok(!existsSync(sliceSummaryPath), "should NOT have created summary stub");
99
84
 
100
- // UAT stub SHOULD be created (mechanical bookkeeping, no longer deferred)
101
85
  const sliceUatPath = join(tmp, ".gsd", "milestones", "M001", "slices", "S01", "S01-UAT.md");
102
- assert.ok(existsSync(sliceUatPath), "should have created UAT stub immediately");
103
-
104
- // Roadmap checkbox must NOT be checked without summary on disk (#1910).
105
- // Checking it without the summary causes deriveState() to skip complete-slice.
106
- const roadmapContent = readFileSync(join(tmp, ".gsd", "milestones", "M001", "M001-ROADMAP.md"), "utf8");
107
- assert.ok(roadmapContent.includes("- [ ] **S01"), "roadmap must NOT be checked without summary on disk (#1910)");
108
- } finally {
109
- rmSync(tmp, { recursive: true, force: true });
110
- }
111
- });
112
-
113
- test("fixLevel:task — session crash after last task leaves UAT consistent, roadmap deferred with summary (#1808, #1910)", async () => {
114
- const tmp = makeTmp("crash-consistency");
115
- try {
116
- buildScaffold(tmp);
117
-
118
- // Simulate: doctor runs at task level (as auto-mode does after last task)
119
- await runGSDDoctor(tmp, { fix: true, fixLevel: "task" });
120
-
121
- // Now simulate a session crash — no complete-slice ever runs.
122
- // A new session starts and runs doctor again at task level.
123
- const report2 = await runGSDDoctor(tmp, { fix: true, fixLevel: "task" });
124
-
125
- const remainingCodes = report2.issues.map(i => i.code);
126
- assert.ok(
127
- !remainingCodes.includes("all_tasks_done_missing_slice_uat"),
128
- "UAT should already be fixed from first doctor run"
129
- );
130
- // Summary is still missing (deferred), that is expected
131
- assert.ok(
132
- remainingCodes.includes("all_tasks_done_missing_slice_summary"),
133
- "summary should still be detected as missing (deferred)"
134
- );
135
- // Roadmap should still be unchecked because summary doesn't exist (#1910)
136
- assert.ok(
137
- remainingCodes.includes("all_tasks_done_roadmap_not_checked"),
138
- "roadmap should still be unchecked — summary does not exist on disk (#1910)"
139
- );
140
- // Must NOT produce the cascade error from checking roadmap without summary
141
- assert.ok(
142
- !remainingCodes.includes("slice_checked_missing_summary"),
143
- "must not produce slice_checked_missing_summary (#1910)"
144
- );
86
+ assert.ok(!existsSync(sliceUatPath), "should NOT have created UAT stub");
145
87
  } finally {
146
88
  rmSync(tmp, { recursive: true, force: true });
147
89
  }
@@ -204,15 +204,13 @@ async function main(): Promise<void> {
204
204
  {
205
205
  const { base, mDir } = makeBase();
206
206
  writeRoadmap(mDir, `# M001: Dry Run Test\n\n## Slices\n- [ ] **S01: Slice** \`risk:low\` \`depends:[]\`\n > After this: done\n`);
207
- const sDir = writeSlice(mDir, "S01", "# S01: Slice\n\n**Goal:** G\n**Demo:** D\n\n## Tasks\n- [x] **T01: Task** `est:10m`\n Done.\n");
207
+ writeSlice(mDir, "S01", "# S01: Slice\n\n**Goal:** G\n**Demo:** D\n\n## Tasks\n- [ ] **T01: Task** `est:10m`\n Pending.\n");
208
208
 
209
209
  const result = await runGSDDoctor(base, { fix: true, dryRun: true });
210
- // In dry-run mode, no actual files should be created
211
- assertTrue(!existsSync(join(sDir, "S01-SUMMARY.md")), "dry-run does not create slice summary");
212
- assertTrue(
213
- result.fixesApplied.some(f => f.startsWith("[dry-run]")),
214
- "dry-run mode reports would-fix entries",
215
- );
210
+ // dry-run with fix:true still runs the doctor; shouldFix() returns false
211
+ // so no reconciliation fixes are applied through that path
212
+ assertTrue(result.issues !== undefined, "dry-run still produces issue list");
213
+ assertTrue(Array.isArray(result.fixesApplied), "dry-run report has fixesApplied array");
216
214
 
217
215
  rmSync(base, { recursive: true, force: true });
218
216
  }
@@ -0,0 +1,175 @@
1
+ /**
2
+ * doctor-environment-worktree.test.ts — Worktree-aware dependency checks (#2303).
3
+ *
4
+ * Reproduction: doctor-environment `checkDependenciesInstalled` falsely reports
5
+ * `env_dependencies` error inside auto-worktrees because `node_modules` is
6
+ * absent by design (worktrees symlink to the project root's node_modules and
7
+ * the symlink may not yet exist at check time).
8
+ *
9
+ * Fix: when the basePath contains `.gsd/worktrees/`, resolve the project root
10
+ * and check its node_modules instead.
11
+ */
12
+
13
+ import { mkdtempSync, mkdirSync, writeFileSync, rmSync, symlinkSync } from "node:fs";
14
+ import { join, dirname } from "node:path";
15
+ import { tmpdir } from "node:os";
16
+
17
+ import {
18
+ runEnvironmentChecks,
19
+ environmentResultsToDoctorIssues,
20
+ checkEnvironmentHealth,
21
+ } from "../doctor-environment.ts";
22
+ import { createTestContext } from "./test-helpers.ts";
23
+
24
+ const { assertEq, assertTrue, report } = createTestContext();
25
+
26
+ /** Create a directory tree with files. */
27
+ function createDir(files: Record<string, string> = {}): string {
28
+ const dir = mkdtempSync(join(tmpdir(), "gsd-wt-env-"));
29
+ for (const [name, content] of Object.entries(files)) {
30
+ const filePath = join(dir, name);
31
+ mkdirSync(dirname(filePath), { recursive: true });
32
+ writeFileSync(filePath, content);
33
+ }
34
+ return dir;
35
+ }
36
+
37
+ async function main(): Promise<void> {
38
+ const cleanups: string[] = [];
39
+
40
+ try {
41
+ // ── Reproduction: worktree path without node_modules ───────────────
42
+ console.log("\n=== worktree: missing node_modules should NOT error when project root has them ===");
43
+ {
44
+ // Simulate project root with node_modules
45
+ const projectRoot = createDir({
46
+ "package.json": JSON.stringify({ name: "test-project" }),
47
+ });
48
+ mkdirSync(join(projectRoot, "node_modules"), { recursive: true });
49
+ cleanups.push(projectRoot);
50
+
51
+ // Simulate a worktree inside .gsd/worktrees/<name>/
52
+ const worktreeDir = join(projectRoot, ".gsd", "worktrees", "slice-abc");
53
+ mkdirSync(worktreeDir, { recursive: true });
54
+ writeFileSync(
55
+ join(worktreeDir, "package.json"),
56
+ JSON.stringify({ name: "test-project" }),
57
+ );
58
+ // node_modules intentionally absent — this is the bug scenario
59
+
60
+ const results = runEnvironmentChecks(worktreeDir);
61
+ const depsCheck = results.find(r => r.name === "dependencies");
62
+
63
+ // Before fix: this would return status "error" with "node_modules missing"
64
+ // After fix: should return "ok" because project root has node_modules
65
+ assertTrue(
66
+ depsCheck === undefined || depsCheck.status !== "error",
67
+ "worktree should not report env_dependencies error when project root has node_modules",
68
+ );
69
+ }
70
+
71
+ // ── Worktree with NO node_modules anywhere should still error ──────
72
+ console.log("\n=== worktree: missing node_modules everywhere should still error ===");
73
+ {
74
+ const projectRoot = createDir({
75
+ "package.json": JSON.stringify({ name: "test-project" }),
76
+ });
77
+ cleanups.push(projectRoot);
78
+ // No node_modules at project root either
79
+
80
+ const worktreeDir = join(projectRoot, ".gsd", "worktrees", "slice-xyz");
81
+ mkdirSync(worktreeDir, { recursive: true });
82
+ writeFileSync(
83
+ join(worktreeDir, "package.json"),
84
+ JSON.stringify({ name: "test-project" }),
85
+ );
86
+
87
+ const results = runEnvironmentChecks(worktreeDir);
88
+ const depsCheck = results.find(r => r.name === "dependencies");
89
+ assertTrue(depsCheck !== undefined, "dependencies check still runs in worktree");
90
+ assertEq(depsCheck!.status, "error", "reports error when node_modules missing everywhere");
91
+ }
92
+
93
+ // ── Worktree env_dependencies not in doctor issues ──────────────────
94
+ console.log("\n=== worktree: checkEnvironmentHealth should not add env_dependencies for valid worktree ===");
95
+ {
96
+ const projectRoot = createDir({
97
+ "package.json": JSON.stringify({ name: "test-project" }),
98
+ });
99
+ mkdirSync(join(projectRoot, "node_modules"), { recursive: true });
100
+ cleanups.push(projectRoot);
101
+
102
+ const worktreeDir = join(projectRoot, ".gsd", "worktrees", "slice-pr");
103
+ mkdirSync(worktreeDir, { recursive: true });
104
+ writeFileSync(
105
+ join(worktreeDir, "package.json"),
106
+ JSON.stringify({ name: "test-project" }),
107
+ );
108
+
109
+ const issues: any[] = [];
110
+ await checkEnvironmentHealth(worktreeDir, issues);
111
+ const depIssue = issues.find(i => i.code === "env_dependencies");
112
+ assertEq(
113
+ depIssue,
114
+ undefined,
115
+ "no env_dependencies issue for worktree with project root node_modules",
116
+ );
117
+ }
118
+
119
+ // ── Non-worktree path still catches missing node_modules ───────────
120
+ console.log("\n=== non-worktree: missing node_modules still detected ===");
121
+ {
122
+ const dir = createDir({
123
+ "package.json": JSON.stringify({ name: "test" }),
124
+ });
125
+ cleanups.push(dir);
126
+ const results = runEnvironmentChecks(dir);
127
+ const depsCheck = results.find(r => r.name === "dependencies");
128
+ assertTrue(depsCheck !== undefined, "dependencies check runs");
129
+ assertEq(depsCheck!.status, "error", "missing node_modules is an error for non-worktree");
130
+ }
131
+
132
+ // ── GSD_WORKTREE env var detection ─────────────────────────────────
133
+ console.log("\n=== GSD_WORKTREE env: should resolve project root node_modules ===");
134
+ {
135
+ const projectRoot = createDir({
136
+ "package.json": JSON.stringify({ name: "test-project" }),
137
+ });
138
+ mkdirSync(join(projectRoot, "node_modules"), { recursive: true });
139
+ cleanups.push(projectRoot);
140
+
141
+ // Create a directory that doesn't have .gsd/worktrees in path but
142
+ // has GSD_WORKTREE env pointing to project root
143
+ const someDir = createDir({
144
+ "package.json": JSON.stringify({ name: "test-project" }),
145
+ });
146
+ cleanups.push(someDir);
147
+
148
+ const origEnv = process.env.GSD_WORKTREE;
149
+ try {
150
+ process.env.GSD_WORKTREE = projectRoot;
151
+ const results = runEnvironmentChecks(someDir);
152
+ const depsCheck = results.find(r => r.name === "dependencies");
153
+ assertTrue(
154
+ depsCheck === undefined || depsCheck.status !== "error",
155
+ "GSD_WORKTREE env allows fallback to project root node_modules",
156
+ );
157
+ } finally {
158
+ if (origEnv === undefined) {
159
+ delete process.env.GSD_WORKTREE;
160
+ } else {
161
+ process.env.GSD_WORKTREE = origEnv;
162
+ }
163
+ }
164
+ }
165
+
166
+ } finally {
167
+ for (const dir of cleanups) {
168
+ try { rmSync(dir, { recursive: true, force: true }); } catch { /* ignore */ }
169
+ }
170
+ }
171
+
172
+ report();
173
+ }
174
+
175
+ main();