gsd-pi 2.43.0 → 2.44.0-dev.0b97ffd

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 (693) hide show
  1. package/README.md +30 -12
  2. package/dist/cli.js +13 -1
  3. package/dist/help-text.js +24 -0
  4. package/dist/resources/extensions/bg-shell/overlay.js +3 -0
  5. package/dist/resources/extensions/github-sync/sync.js +2 -1
  6. package/dist/resources/extensions/gsd/auto/loop.js +0 -2
  7. package/dist/resources/extensions/gsd/auto/phases.js +7 -12
  8. package/dist/resources/extensions/gsd/auto-dashboard.js +19 -18
  9. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +34 -19
  10. package/dist/resources/extensions/gsd/auto-dispatch.js +36 -21
  11. package/dist/resources/extensions/gsd/auto-post-unit.js +128 -14
  12. package/dist/resources/extensions/gsd/auto-prompts.js +202 -92
  13. package/dist/resources/extensions/gsd/auto-recovery.js +83 -135
  14. package/dist/resources/extensions/gsd/auto-start.js +10 -0
  15. package/dist/resources/extensions/gsd/auto-supervisor.js +14 -0
  16. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +4 -7
  17. package/dist/resources/extensions/gsd/auto-verification.js +5 -10
  18. package/dist/resources/extensions/gsd/auto-worktree.js +123 -30
  19. package/dist/resources/extensions/gsd/auto.js +1 -4
  20. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +611 -0
  21. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +28 -3
  22. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -0
  23. package/dist/resources/extensions/gsd/commands/catalog.js +3 -1
  24. package/dist/resources/extensions/gsd/commands/handlers/ops.js +15 -1
  25. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
  26. package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
  27. package/dist/resources/extensions/gsd/commands-maintenance.js +78 -3
  28. package/dist/resources/extensions/gsd/dashboard-overlay.js +32 -31
  29. package/dist/resources/extensions/gsd/db-writer.js +95 -4
  30. package/dist/resources/extensions/gsd/dispatch-guard.js +35 -30
  31. package/dist/resources/extensions/gsd/doctor-checks.js +28 -11
  32. package/dist/resources/extensions/gsd/doctor-environment.js +28 -0
  33. package/dist/resources/extensions/gsd/doctor-types.js +0 -15
  34. package/dist/resources/extensions/gsd/doctor.js +46 -282
  35. package/dist/resources/extensions/gsd/file-watcher.js +5 -1
  36. package/dist/resources/extensions/gsd/files.js +14 -198
  37. package/dist/resources/extensions/gsd/git-service.js +4 -0
  38. package/dist/resources/extensions/gsd/gitignore.js +4 -0
  39. package/dist/resources/extensions/gsd/gsd-db.js +819 -197
  40. package/dist/resources/extensions/gsd/guided-flow.js +18 -8
  41. package/dist/resources/extensions/gsd/markdown-renderer.js +862 -0
  42. package/dist/resources/extensions/gsd/md-importer.js +182 -4
  43. package/dist/resources/extensions/gsd/native-git-bridge.js +10 -1
  44. package/dist/resources/extensions/gsd/parallel-eligibility.js +14 -19
  45. package/dist/resources/extensions/gsd/parallel-orchestrator.js +38 -0
  46. package/dist/resources/extensions/gsd/parsers-legacy.js +239 -0
  47. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  48. package/dist/resources/extensions/gsd/preferences-validation.js +9 -0
  49. package/dist/resources/extensions/gsd/preferences.js +1 -0
  50. package/dist/resources/extensions/gsd/prompts/complete-slice.md +22 -9
  51. package/dist/resources/extensions/gsd/prompts/discuss.md +2 -2
  52. package/dist/resources/extensions/gsd/prompts/execute-task.md +15 -5
  53. package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
  54. package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
  55. package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
  56. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
  57. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -7
  58. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
  59. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
  60. package/dist/resources/extensions/gsd/prompts/replan-slice.md +6 -6
  61. package/dist/resources/extensions/gsd/reactive-graph.js +33 -3
  62. package/dist/resources/extensions/gsd/skill-health.js +3 -1
  63. package/dist/resources/extensions/gsd/state.js +484 -30
  64. package/dist/resources/extensions/gsd/tools/complete-milestone.js +128 -0
  65. package/dist/resources/extensions/gsd/tools/complete-slice.js +244 -0
  66. package/dist/resources/extensions/gsd/tools/complete-task.js +204 -0
  67. package/dist/resources/extensions/gsd/tools/plan-milestone.js +205 -0
  68. package/dist/resources/extensions/gsd/tools/plan-slice.js +155 -0
  69. package/dist/resources/extensions/gsd/tools/plan-task.js +94 -0
  70. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +152 -0
  71. package/dist/resources/extensions/gsd/tools/replan-slice.js +146 -0
  72. package/dist/resources/extensions/gsd/triage-resolution.js +17 -1
  73. package/dist/resources/extensions/gsd/undo.js +197 -3
  74. package/dist/resources/extensions/gsd/visualizer-data.js +53 -16
  75. package/dist/resources/extensions/gsd/workspace-index.js +63 -39
  76. package/dist/web/standalone/.next/BUILD_ID +1 -1
  77. package/dist/web/standalone/.next/app-path-routes-manifest.json +18 -17
  78. package/dist/web/standalone/.next/build-manifest.json +4 -4
  79. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  80. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  81. package/dist/web/standalone/.next/required-server-files.json +4 -4
  82. package/dist/web/standalone/.next/routes-manifest.json +6 -0
  83. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  84. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  85. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  86. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  91. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  94. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  95. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  96. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  97. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  98. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  100. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  103. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  110. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  148. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  154. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -0
  166. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -0
  167. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -0
  168. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  171. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  173. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  175. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/index.html +1 -1
  185. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  186. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  187. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  188. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  189. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  190. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  191. package/dist/web/standalone/.next/server/app/page.js +2 -2
  192. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app-paths-manifest.json +18 -17
  194. package/dist/web/standalone/.next/server/chunks/229.js +3 -3
  195. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  196. package/dist/web/standalone/.next/server/functions-config-manifest.json +1 -0
  197. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/middleware.js +2 -2
  200. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  202. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  203. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  204. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  205. package/dist/web/standalone/.next/static/alS4hoANx0TK4UVZY27da/_buildManifest.js +1 -0
  206. package/dist/web/standalone/.next/static/chunks/{4024.c195dc1fdd2adbea.js → 4024.0de81b543b28b9fe.js} +2 -2
  207. package/dist/web/standalone/.next/static/chunks/app/_global-error/{page-d07a2c023f1aef1e.js → page-d83ba70a25a85472.js} +1 -1
  208. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-f2a7482d42a5614b.js +1 -0
  209. package/dist/web/standalone/.next/static/chunks/app/api/boot/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  210. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  211. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  212. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d83ba70a25a85472.js +1 -0
  213. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d83ba70a25a85472.js +1 -0
  214. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d83ba70a25a85472.js +1 -0
  215. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d83ba70a25a85472.js +1 -0
  216. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d83ba70a25a85472.js +1 -0
  217. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d83ba70a25a85472.js +1 -0
  218. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d83ba70a25a85472.js +1 -0
  219. package/dist/web/standalone/.next/static/chunks/app/api/files/route-d83ba70a25a85472.js +1 -0
  220. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d83ba70a25a85472.js +1 -0
  221. package/dist/web/standalone/.next/static/chunks/app/api/git/route-d83ba70a25a85472.js +1 -0
  222. package/dist/web/standalone/.next/static/chunks/app/api/history/route-d83ba70a25a85472.js +1 -0
  223. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d83ba70a25a85472.js +1 -0
  224. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d83ba70a25a85472.js +1 -0
  225. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d83ba70a25a85472.js +1 -0
  226. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d83ba70a25a85472.js +1 -0
  227. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d83ba70a25a85472.js +1 -0
  228. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d83ba70a25a85472.js +1 -0
  229. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d83ba70a25a85472.js +1 -0
  230. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d83ba70a25a85472.js +1 -0
  231. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d83ba70a25a85472.js +1 -0
  232. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d83ba70a25a85472.js +1 -0
  233. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d83ba70a25a85472.js +1 -0
  234. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d83ba70a25a85472.js +1 -0
  235. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d83ba70a25a85472.js +1 -0
  236. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d83ba70a25a85472.js +1 -0
  237. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d83ba70a25a85472.js +1 -0
  238. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d83ba70a25a85472.js +1 -0
  239. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d83ba70a25a85472.js +1 -0
  240. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-d83ba70a25a85472.js +1 -0
  241. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d83ba70a25a85472.js +1 -0
  242. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d83ba70a25a85472.js +1 -0
  243. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d83ba70a25a85472.js +1 -0
  244. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d83ba70a25a85472.js +1 -0
  245. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d83ba70a25a85472.js +1 -0
  246. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d83ba70a25a85472.js +1 -0
  247. package/dist/web/standalone/.next/static/chunks/app/api/update/route-d83ba70a25a85472.js +1 -0
  248. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d83ba70a25a85472.js +1 -0
  249. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +1 -0
  250. package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +1 -0
  251. package/dist/web/standalone/.next/static/chunks/{main-app-2f2ee7b85712c2bd.js → main-app-fdab67f7802d7832.js} +1 -1
  252. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d83ba70a25a85472.js +1 -0
  253. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d83ba70a25a85472.js +1 -0
  254. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  255. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d83ba70a25a85472.js +1 -0
  256. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d83ba70a25a85472.js +1 -0
  257. package/dist/web/standalone/.next/static/chunks/{webpack-fa307370fcf9fb2c.js → webpack-9014b5adb127a98a.js} +1 -1
  258. package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +1 -0
  259. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  260. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  261. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  262. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  263. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  264. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  265. package/dist/web/standalone/server.js +1 -1
  266. package/package.json +4 -4
  267. package/packages/pi-ai/dist/models.custom.d.ts +173 -0
  268. package/packages/pi-ai/dist/models.custom.d.ts.map +1 -0
  269. package/packages/pi-ai/dist/models.custom.js +170 -0
  270. package/packages/pi-ai/dist/models.custom.js.map +1 -0
  271. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  272. package/packages/pi-ai/dist/models.js +16 -1
  273. package/packages/pi-ai/dist/models.js.map +1 -1
  274. package/packages/pi-ai/dist/models.test.d.ts +2 -0
  275. package/packages/pi-ai/dist/models.test.d.ts.map +1 -0
  276. package/packages/pi-ai/dist/models.test.js +67 -0
  277. package/packages/pi-ai/dist/models.test.js.map +1 -0
  278. package/packages/pi-ai/src/models.custom.ts +172 -0
  279. package/packages/pi-ai/src/models.test.ts +85 -0
  280. package/packages/pi-ai/src/models.ts +17 -1
  281. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +10 -3
  282. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  283. package/packages/pi-coding-agent/dist/core/agent-session.js +21 -34
  284. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  285. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
  286. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  287. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts +2 -2
  288. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  289. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
  290. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +2 -2
  291. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  292. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +4 -4
  294. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  295. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  296. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  297. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  298. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +6 -0
  299. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  300. package/packages/pi-coding-agent/dist/core/extensions/loader.js +80 -0
  301. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/core/extensions/loader.test.js +63 -0
  303. package/packages/pi-coding-agent/dist/core/extensions/loader.test.js.map +1 -1
  304. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +24 -26
  305. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  306. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +37 -0
  307. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  308. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  309. package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts.map +1 -1
  310. package/packages/pi-coding-agent/dist/core/fallback-resolver.js +2 -3
  311. package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -1
  312. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +12 -2
  313. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -1
  314. package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
  315. package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
  316. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +38 -0
  317. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -0
  318. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +192 -0
  319. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -0
  320. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts +5 -0
  321. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
  322. package/packages/pi-coding-agent/dist/core/lsp/client.js +69 -21
  323. package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts +2 -0
  325. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts.map +1 -0
  326. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +255 -0
  327. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -0
  328. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +15 -0
  329. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  330. package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
  331. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  332. package/packages/pi-coding-agent/dist/core/package-commands.d.ts +25 -0
  333. package/packages/pi-coding-agent/dist/core/package-commands.d.ts.map +1 -0
  334. package/packages/pi-coding-agent/dist/core/package-commands.js +253 -0
  335. package/packages/pi-coding-agent/dist/core/package-commands.js.map +1 -0
  336. package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts +2 -0
  337. package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts.map +1 -0
  338. package/packages/pi-coding-agent/dist/core/package-commands.test.js +225 -0
  339. package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -0
  340. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +34 -44
  341. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
  342. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  343. package/packages/pi-coding-agent/dist/core/sdk.js +4 -0
  344. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  345. package/packages/pi-coding-agent/dist/core/session-manager.test.js +30 -34
  346. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
  347. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
  348. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/index.d.ts +3 -1
  350. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/index.js +1 -0
  352. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  353. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  354. package/packages/pi-coding-agent/dist/main.js +11 -199
  355. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  356. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts +6 -0
  357. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  358. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +21 -0
  359. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  360. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
  361. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  362. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +8 -15
  363. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  364. package/packages/pi-coding-agent/dist/modes/print-mode.d.ts.map +1 -1
  365. package/packages/pi-coding-agent/dist/modes/print-mode.js +45 -34
  366. package/packages/pi-coding-agent/dist/modes/print-mode.js.map +1 -1
  367. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts +1 -0
  368. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  369. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js +7 -2
  370. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js.map +1 -1
  371. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  372. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +2 -1
  373. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  374. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
  375. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
  376. package/packages/pi-coding-agent/package.json +1 -1
  377. package/packages/pi-coding-agent/src/core/agent-session.ts +26 -37
  378. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
  379. package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +2 -2
  380. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +3 -3
  381. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +4 -4
  382. package/packages/pi-coding-agent/src/core/extensions/index.ts +5 -0
  383. package/packages/pi-coding-agent/src/core/extensions/loader.test.ts +96 -0
  384. package/packages/pi-coding-agent/src/core/extensions/loader.ts +89 -0
  385. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
  386. package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -0
  387. package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +15 -2
  388. package/packages/pi-coding-agent/src/core/fallback-resolver.ts +2 -3
  389. package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
  390. package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +274 -0
  391. package/packages/pi-coding-agent/src/core/lsp/client.ts +83 -21
  392. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +288 -0
  393. package/packages/pi-coding-agent/src/core/model-registry.ts +39 -3
  394. package/packages/pi-coding-agent/src/core/package-commands.test.ts +240 -0
  395. package/packages/pi-coding-agent/src/core/package-commands.ts +310 -0
  396. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
  397. package/packages/pi-coding-agent/src/core/sdk.ts +4 -0
  398. package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
  399. package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
  400. package/packages/pi-coding-agent/src/index.ts +7 -0
  401. package/packages/pi-coding-agent/src/main.ts +11 -232
  402. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +20 -0
  403. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +9 -16
  404. package/packages/pi-coding-agent/src/modes/print-mode.ts +42 -32
  405. package/packages/pi-coding-agent/src/modes/rpc/rpc-client.ts +8 -2
  406. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -1
  407. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
  408. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
  409. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  410. package/pkg/dist/modes/interactive/theme/theme.js +8 -15
  411. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  412. package/pkg/package.json +1 -1
  413. package/src/resources/extensions/bg-shell/overlay.ts +4 -0
  414. package/src/resources/extensions/github-sync/sync.ts +2 -1
  415. package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -8
  416. package/src/resources/extensions/gsd/auto/loop.ts +0 -2
  417. package/src/resources/extensions/gsd/auto/phases.ts +7 -20
  418. package/src/resources/extensions/gsd/auto/types.ts +0 -1
  419. package/src/resources/extensions/gsd/auto-dashboard.ts +20 -16
  420. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +34 -19
  421. package/src/resources/extensions/gsd/auto-dispatch.ts +38 -21
  422. package/src/resources/extensions/gsd/auto-post-unit.ts +150 -15
  423. package/src/resources/extensions/gsd/auto-prompts.ts +186 -103
  424. package/src/resources/extensions/gsd/auto-recovery.ts +77 -142
  425. package/src/resources/extensions/gsd/auto-start.ts +14 -0
  426. package/src/resources/extensions/gsd/auto-supervisor.ts +14 -0
  427. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +6 -7
  428. package/src/resources/extensions/gsd/auto-verification.ts +4 -9
  429. package/src/resources/extensions/gsd/auto-worktree.ts +126 -30
  430. package/src/resources/extensions/gsd/auto.ts +0 -9
  431. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +675 -4
  432. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +31 -3
  433. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -0
  434. package/src/resources/extensions/gsd/commands/catalog.ts +3 -1
  435. package/src/resources/extensions/gsd/commands/handlers/ops.ts +15 -1
  436. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
  437. package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
  438. package/src/resources/extensions/gsd/commands-maintenance.ts +86 -3
  439. package/src/resources/extensions/gsd/dashboard-overlay.ts +17 -13
  440. package/src/resources/extensions/gsd/db-writer.ts +105 -4
  441. package/src/resources/extensions/gsd/dispatch-guard.ts +32 -30
  442. package/src/resources/extensions/gsd/doctor-checks.ts +25 -11
  443. package/src/resources/extensions/gsd/doctor-environment.ts +31 -0
  444. package/src/resources/extensions/gsd/doctor-types.ts +0 -23
  445. package/src/resources/extensions/gsd/doctor.ts +45 -295
  446. package/src/resources/extensions/gsd/file-watcher.ts +4 -1
  447. package/src/resources/extensions/gsd/files.ts +16 -220
  448. package/src/resources/extensions/gsd/git-service.ts +4 -0
  449. package/src/resources/extensions/gsd/gitignore.ts +4 -0
  450. package/src/resources/extensions/gsd/gsd-db.ts +1157 -370
  451. package/src/resources/extensions/gsd/guided-flow.ts +20 -8
  452. package/src/resources/extensions/gsd/markdown-renderer.ts +1098 -0
  453. package/src/resources/extensions/gsd/md-importer.ts +211 -2
  454. package/src/resources/extensions/gsd/native-git-bridge.ts +12 -1
  455. package/src/resources/extensions/gsd/parallel-eligibility.ts +14 -18
  456. package/src/resources/extensions/gsd/parallel-orchestrator.ts +43 -0
  457. package/src/resources/extensions/gsd/parsers-legacy.ts +271 -0
  458. package/src/resources/extensions/gsd/preferences-types.ts +3 -0
  459. package/src/resources/extensions/gsd/preferences-validation.ts +9 -0
  460. package/src/resources/extensions/gsd/preferences.ts +1 -0
  461. package/src/resources/extensions/gsd/prompts/complete-slice.md +22 -9
  462. package/src/resources/extensions/gsd/prompts/discuss.md +2 -2
  463. package/src/resources/extensions/gsd/prompts/execute-task.md +15 -5
  464. package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
  465. package/src/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
  466. package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
  467. package/src/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
  468. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -7
  469. package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
  470. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
  471. package/src/resources/extensions/gsd/prompts/replan-slice.md +6 -6
  472. package/src/resources/extensions/gsd/reactive-graph.ts +33 -3
  473. package/src/resources/extensions/gsd/skill-health.ts +2 -1
  474. package/src/resources/extensions/gsd/state.ts +547 -29
  475. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
  476. package/src/resources/extensions/gsd/tests/atomic-task-closeout.test.ts +8 -120
  477. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +14 -16
  478. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +20 -11
  479. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
  480. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
  481. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +600 -513
  482. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
  483. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
  484. package/src/resources/extensions/gsd/tests/auto-stash-merge.test.ts +121 -0
  485. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +540 -668
  486. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
  487. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
  488. package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
  489. package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
  490. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
  491. package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
  492. package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
  493. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +39 -60
  494. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +375 -0
  495. package/src/resources/extensions/gsd/tests/complete-task.test.ts +387 -0
  496. package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
  497. package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
  498. package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
  499. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +27 -35
  500. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -2
  501. package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
  502. package/src/resources/extensions/gsd/tests/db-writer.test.ts +390 -420
  503. package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
  504. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +512 -0
  505. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +644 -84
  506. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
  507. package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
  508. package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
  509. package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
  510. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +192 -161
  511. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
  512. package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
  513. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +30 -90
  514. package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
  515. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +57 -80
  516. package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +164 -0
  517. package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
  518. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +55 -153
  519. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
  520. package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
  521. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +53 -97
  522. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
  523. package/src/resources/extensions/gsd/tests/doctor.test.ts +109 -149
  524. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
  525. package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
  526. package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
  527. package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
  528. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +278 -0
  529. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +232 -0
  530. package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
  531. package/src/resources/extensions/gsd/tests/git-service.test.ts +291 -390
  532. package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
  533. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
  534. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
  535. package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
  536. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +440 -0
  537. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
  538. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
  539. package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
  540. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +81 -270
  541. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
  542. package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
  543. package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
  544. package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
  545. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +643 -0
  546. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
  547. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1161 -0
  548. package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
  549. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
  550. package/src/resources/extensions/gsd/tests/memory-store.test.ts +81 -94
  551. package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
  552. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +429 -0
  553. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
  554. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
  555. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
  556. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +89 -97
  557. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +127 -164
  558. package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
  559. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +35 -36
  560. package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
  561. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +40 -47
  562. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +25 -28
  563. package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
  564. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
  565. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
  566. package/src/resources/extensions/gsd/tests/parsers.test.ts +548 -612
  567. package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
  568. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +176 -113
  569. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +7 -0
  570. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +179 -0
  571. package/src/resources/extensions/gsd/tests/plan-task.test.ts +145 -0
  572. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +305 -0
  573. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
  574. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +139 -0
  575. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
  576. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
  577. package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
  578. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
  579. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
  580. package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
  581. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +325 -0
  582. package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
  583. package/src/resources/extensions/gsd/tests/replan-handler.test.ts +410 -0
  584. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +73 -80
  585. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
  586. package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
  587. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
  588. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
  589. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +1 -1
  590. package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +296 -0
  591. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
  592. package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
  593. package/src/resources/extensions/gsd/tests/schema-v9-sequence.test.ts +176 -0
  594. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
  595. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -44
  596. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +209 -0
  597. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
  598. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
  599. package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
  600. package/src/resources/extensions/gsd/tests/token-cost-display.test.ts +118 -0
  601. package/src/resources/extensions/gsd/tests/token-savings.test.ts +54 -56
  602. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +23 -25
  603. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +19 -13
  604. package/src/resources/extensions/gsd/tests/undo.test.ts +321 -1
  605. package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
  606. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
  607. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +1 -1
  608. package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +0 -142
  609. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -22
  610. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
  611. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
  612. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
  613. package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
  614. package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
  615. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +50 -52
  616. package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
  617. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
  618. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
  619. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
  620. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +12 -5
  621. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
  622. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
  623. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
  624. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
  625. package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
  626. package/src/resources/extensions/gsd/tools/complete-milestone.ts +176 -0
  627. package/src/resources/extensions/gsd/tools/complete-slice.ts +300 -0
  628. package/src/resources/extensions/gsd/tools/complete-task.ts +245 -0
  629. package/src/resources/extensions/gsd/tools/plan-milestone.ts +249 -0
  630. package/src/resources/extensions/gsd/tools/plan-slice.ts +194 -0
  631. package/src/resources/extensions/gsd/tools/plan-task.ts +116 -0
  632. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +203 -0
  633. package/src/resources/extensions/gsd/tools/replan-slice.ts +192 -0
  634. package/src/resources/extensions/gsd/triage-resolution.ts +20 -1
  635. package/src/resources/extensions/gsd/types.ts +50 -0
  636. package/src/resources/extensions/gsd/undo.ts +247 -3
  637. package/src/resources/extensions/gsd/visualizer-data.ts +54 -17
  638. package/src/resources/extensions/gsd/workspace-index.ts +64 -46
  639. package/dist/resources/extensions/gsd/auto-observability.js +0 -56
  640. package/dist/resources/extensions/gsd/observability-validator.js +0 -422
  641. package/dist/resources/extensions/gsd/roadmap-mutations.js +0 -110
  642. package/dist/web/standalone/.next/static/VvclDCW6TAWjEyLU-EYL1/_buildManifest.js +0 -1
  643. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-e07acdb7dd069836.js +0 -1
  644. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d07a2c023f1aef1e.js +0 -1
  645. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d07a2c023f1aef1e.js +0 -1
  646. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d07a2c023f1aef1e.js +0 -1
  647. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d07a2c023f1aef1e.js +0 -1
  648. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d07a2c023f1aef1e.js +0 -1
  649. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d07a2c023f1aef1e.js +0 -1
  650. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d07a2c023f1aef1e.js +0 -1
  651. package/dist/web/standalone/.next/static/chunks/app/api/files/route-d07a2c023f1aef1e.js +0 -1
  652. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d07a2c023f1aef1e.js +0 -1
  653. package/dist/web/standalone/.next/static/chunks/app/api/git/route-d07a2c023f1aef1e.js +0 -1
  654. package/dist/web/standalone/.next/static/chunks/app/api/history/route-d07a2c023f1aef1e.js +0 -1
  655. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d07a2c023f1aef1e.js +0 -1
  656. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d07a2c023f1aef1e.js +0 -1
  657. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d07a2c023f1aef1e.js +0 -1
  658. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d07a2c023f1aef1e.js +0 -1
  659. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d07a2c023f1aef1e.js +0 -1
  660. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d07a2c023f1aef1e.js +0 -1
  661. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d07a2c023f1aef1e.js +0 -1
  662. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d07a2c023f1aef1e.js +0 -1
  663. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d07a2c023f1aef1e.js +0 -1
  664. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d07a2c023f1aef1e.js +0 -1
  665. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d07a2c023f1aef1e.js +0 -1
  666. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d07a2c023f1aef1e.js +0 -1
  667. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d07a2c023f1aef1e.js +0 -1
  668. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d07a2c023f1aef1e.js +0 -1
  669. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d07a2c023f1aef1e.js +0 -1
  670. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d07a2c023f1aef1e.js +0 -1
  671. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d07a2c023f1aef1e.js +0 -1
  672. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d07a2c023f1aef1e.js +0 -1
  673. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d07a2c023f1aef1e.js +0 -1
  674. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d07a2c023f1aef1e.js +0 -1
  675. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d07a2c023f1aef1e.js +0 -1
  676. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d07a2c023f1aef1e.js +0 -1
  677. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d07a2c023f1aef1e.js +0 -1
  678. package/dist/web/standalone/.next/static/chunks/app/api/update/route-d07a2c023f1aef1e.js +0 -1
  679. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d07a2c023f1aef1e.js +0 -1
  680. package/dist/web/standalone/.next/static/chunks/app/layout-745c6ed5fea5fb06.js +0 -1
  681. package/dist/web/standalone/.next/static/chunks/app/page-801b53eff6e83579.js +0 -1
  682. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d07a2c023f1aef1e.js +0 -1
  683. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d07a2c023f1aef1e.js +0 -1
  684. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-e6255954dccfcf0a.js +0 -1
  685. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d07a2c023f1aef1e.js +0 -1
  686. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d07a2c023f1aef1e.js +0 -1
  687. package/dist/web/standalone/.next/static/css/123c0bb039697968.css +0 -1
  688. package/src/resources/extensions/gsd/auto-observability.ts +0 -74
  689. package/src/resources/extensions/gsd/observability-validator.ts +0 -456
  690. package/src/resources/extensions/gsd/roadmap-mutations.ts +0 -134
  691. package/src/resources/extensions/gsd/tests/doctor-task-done-missing-summary-slice-loop.test.ts +0 -174
  692. package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -474
  693. /package/dist/web/standalone/.next/static/{VvclDCW6TAWjEyLU-EYL1 → alS4hoANx0TK4UVZY27da}/_ssgManifest.js +0 -0
@@ -1,4 +1,5 @@
1
- import { createTestContext } from './test-helpers.ts';
1
+ import { test } from 'node:test';
2
+ import assert from 'node:assert/strict';
2
3
  import * as fs from 'node:fs';
3
4
  import * as path from 'node:path';
4
5
  import * as os from 'node:os';
@@ -16,7 +17,6 @@ import {
16
17
  reconcileWorktreeDb,
17
18
  } from '../gsd-db.ts';
18
19
 
19
- const { assertEq, assertTrue, report } = createTestContext();
20
20
 
21
21
  // ═══════════════════════════════════════════════════════════════════════════
22
22
  // Helpers
@@ -91,18 +91,18 @@ console.log('\n=== worktree-db: copyWorktreeDb ===');
91
91
  closeDatabase();
92
92
 
93
93
  const result = copyWorktreeDb(srcDb, destDb);
94
- assertTrue(result === true, 'copyWorktreeDb returns true on success');
95
- assertTrue(fs.existsSync(destDb), 'dest DB file exists after copy');
94
+ assert.ok(result === true, 'copyWorktreeDb returns true on success');
95
+ assert.ok(fs.existsSync(destDb), 'dest DB file exists after copy');
96
96
 
97
97
  // Open the copy and verify data is queryable
98
98
  openDatabase(destDb);
99
99
  const d = getDecisionById('D001');
100
- assertTrue(d !== null, 'decision queryable in copied DB');
101
- assertEq(d?.choice, 'node:sqlite', 'decision data preserved in copy');
100
+ assert.ok(d !== null, 'decision queryable in copied DB');
101
+ assert.deepStrictEqual(d?.choice, 'node:sqlite', 'decision data preserved in copy');
102
102
 
103
103
  const r = getRequirementById('R001');
104
- assertTrue(r !== null, 'requirement queryable in copied DB');
105
- assertEq(r?.description, 'Must store decisions', 'requirement data preserved in copy');
104
+ assert.ok(r !== null, 'requirement queryable in copied DB');
105
+ assert.deepStrictEqual(r?.description, 'Must store decisions', 'requirement data preserved in copy');
106
106
 
107
107
  cleanup(srcDir, destDir);
108
108
  }
@@ -123,9 +123,9 @@ console.log('\n=== worktree-db: copyWorktreeDb ===');
123
123
 
124
124
  copyWorktreeDb(srcDb, destDb);
125
125
 
126
- assertTrue(fs.existsSync(destDb), 'DB file copied');
127
- assertTrue(!fs.existsSync(destDb + '-wal'), 'WAL file NOT copied');
128
- assertTrue(!fs.existsSync(destDb + '-shm'), 'SHM file NOT copied');
126
+ assert.ok(fs.existsSync(destDb), 'DB file copied');
127
+ assert.ok(!fs.existsSync(destDb + '-wal'), 'WAL file NOT copied');
128
+ assert.ok(!fs.existsSync(destDb + '-shm'), 'SHM file NOT copied');
129
129
 
130
130
  cleanup(srcDir, destDir);
131
131
  }
@@ -134,7 +134,7 @@ console.log('\n=== worktree-db: copyWorktreeDb ===');
134
134
  {
135
135
  const destDir = tempDir();
136
136
  const result = copyWorktreeDb('/nonexistent/path/gsd.db', path.join(destDir, 'gsd.db'));
137
- assertEq(result, false, 'returns false for missing source');
137
+ assert.deepStrictEqual(result, false, 'returns false for missing source');
138
138
  cleanup(destDir);
139
139
  }
140
140
 
@@ -149,8 +149,8 @@ console.log('\n=== worktree-db: copyWorktreeDb ===');
149
149
  closeDatabase();
150
150
 
151
151
  const result = copyWorktreeDb(srcDb, deepDest);
152
- assertTrue(result === true, 'copyWorktreeDb succeeds with nested dest');
153
- assertTrue(fs.existsSync(deepDest), 'DB file created at deeply nested path');
152
+ assert.ok(result === true, 'copyWorktreeDb succeeds with nested dest');
153
+ assert.ok(fs.existsSync(deepDest), 'DB file created at deeply nested path');
154
154
 
155
155
  cleanup(srcDir, destDir);
156
156
  }
@@ -192,10 +192,10 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
192
192
  openDatabase(mainDb);
193
193
  const result = reconcileWorktreeDb(mainDb, wtDb);
194
194
 
195
- assertTrue(result.decisions > 0, 'decisions merged count > 0');
195
+ assert.ok(result.decisions > 0, 'decisions merged count > 0');
196
196
  const d2 = getDecisionById('D002');
197
- assertTrue(d2 !== null, 'D002 from worktree now in main');
198
- assertEq(d2?.choice, 'WAL', 'D002 data correct after merge');
197
+ assert.ok(d2 !== null, 'D002 from worktree now in main');
198
+ assert.deepStrictEqual(d2?.choice, 'WAL', 'D002 data correct after merge');
199
199
 
200
200
  cleanup(mainDir, wtDir);
201
201
  }
@@ -231,10 +231,10 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
231
231
  openDatabase(mainDb);
232
232
  const result = reconcileWorktreeDb(mainDb, wtDb);
233
233
 
234
- assertTrue(result.requirements > 0, 'requirements merged count > 0');
234
+ assert.ok(result.requirements > 0, 'requirements merged count > 0');
235
235
  const r2 = getRequirementById('R002');
236
- assertTrue(r2 !== null, 'R002 from worktree now in main');
237
- assertEq(r2?.description, 'Must be fast', 'R002 data correct after merge');
236
+ assert.ok(r2 !== null, 'R002 from worktree now in main');
237
+ assert.deepStrictEqual(r2?.description, 'Must be fast', 'R002 data correct after merge');
238
238
 
239
239
  cleanup(mainDir, wtDir);
240
240
  }
@@ -264,11 +264,11 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
264
264
  openDatabase(mainDb);
265
265
  const result = reconcileWorktreeDb(mainDb, wtDb);
266
266
 
267
- assertTrue(result.artifacts > 0, 'artifacts merged count > 0');
267
+ assert.ok(result.artifacts > 0, 'artifacts merged count > 0');
268
268
  const adapter = _getAdapter()!;
269
269
  const row = adapter.prepare('SELECT * FROM artifacts WHERE path = ?').get('docs/api.md');
270
- assertTrue(row !== null, 'artifact from worktree now in main');
271
- assertEq(row?.['artifact_type'], 'reference', 'artifact data correct after merge');
270
+ assert.ok(row !== null, 'artifact from worktree now in main');
271
+ assert.deepStrictEqual(row?.['artifact_type'], 'reference', 'artifact data correct after merge');
272
272
 
273
273
  cleanup(mainDir, wtDir);
274
274
  }
@@ -305,15 +305,15 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
305
305
  openDatabase(mainDb);
306
306
  const result = reconcileWorktreeDb(mainDb, wtDb);
307
307
 
308
- assertTrue(result.conflicts.length > 0, 'conflicts detected');
309
- assertTrue(
308
+ assert.ok(result.conflicts.length > 0, 'conflicts detected');
309
+ assert.ok(
310
310
  result.conflicts.some(c => c.includes('D001')),
311
311
  'conflict mentions D001',
312
312
  );
313
313
 
314
314
  // Worktree-wins: D001 should now have worktree's value
315
315
  const d1 = getDecisionById('D001');
316
- assertEq(d1?.choice, 'sql.js', 'worktree wins on conflict (INSERT OR REPLACE)');
316
+ assert.deepStrictEqual(d1?.choice, 'sql.js', 'worktree wins on conflict (INSERT OR REPLACE)');
317
317
 
318
318
  cleanup(mainDir, wtDir);
319
319
  }
@@ -326,10 +326,10 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
326
326
  seedMainDb(mainDb);
327
327
 
328
328
  const result = reconcileWorktreeDb(mainDb, '/nonexistent/worktree.db');
329
- assertEq(result.decisions, 0, 'no decisions merged for missing worktree DB');
330
- assertEq(result.requirements, 0, 'no requirements merged for missing worktree DB');
331
- assertEq(result.artifacts, 0, 'no artifacts merged for missing worktree DB');
332
- assertEq(result.conflicts.length, 0, 'no conflicts for missing worktree DB');
329
+ assert.deepStrictEqual(result.decisions, 0, 'no decisions merged for missing worktree DB');
330
+ assert.deepStrictEqual(result.requirements, 0, 'no requirements merged for missing worktree DB');
331
+ assert.deepStrictEqual(result.artifacts, 0, 'no artifacts merged for missing worktree DB');
332
+ assert.deepStrictEqual(result.conflicts.length, 0, 'no conflicts for missing worktree DB');
333
333
 
334
334
  cleanup(mainDir);
335
335
  }
@@ -366,9 +366,9 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
366
366
 
367
367
  openDatabase(mainDb);
368
368
  const result = reconcileWorktreeDb(mainDb, wtDb);
369
- assertTrue(result.decisions > 0, 'reconciliation works with spaces in path');
369
+ assert.ok(result.decisions > 0, 'reconciliation works with spaces in path');
370
370
  const d3 = getDecisionById('D003');
371
- assertTrue(d3 !== null, 'D003 merged from worktree with spaces in path');
371
+ assert.ok(d3 !== null, 'D003 merged from worktree with spaces in path');
372
372
 
373
373
  cleanup(baseDir);
374
374
  }
@@ -388,7 +388,7 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
388
388
  reconcileWorktreeDb(mainDb, wtDb);
389
389
 
390
390
  // Verify main DB is still fully usable after DETACH
391
- assertTrue(isDbAvailable(), 'DB still available after reconciliation');
391
+ assert.ok(isDbAvailable(), 'DB still available after reconciliation');
392
392
 
393
393
  insertDecision({
394
394
  id: 'D099',
@@ -403,8 +403,8 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
403
403
  });
404
404
 
405
405
  const d99 = getDecisionById('D099');
406
- assertTrue(d99 !== null, 'can insert and query after reconciliation');
407
- assertEq(d99?.choice, 'works', 'post-reconcile data correct');
406
+ assert.ok(d99 !== null, 'can insert and query after reconciliation');
407
+ assert.deepStrictEqual(d99?.choice, 'works', 'post-reconcile data correct');
408
408
 
409
409
  // Verify no "wt" database still attached
410
410
  const adapter = _getAdapter()!;
@@ -415,7 +415,7 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
415
415
  } catch {
416
416
  // Expected — wt should be detached
417
417
  }
418
- assertTrue(!wtAccessible, 'wt database is detached after reconciliation');
418
+ assert.ok(!wtAccessible, 'wt database is detached after reconciliation');
419
419
 
420
420
  cleanup(mainDir, wtDir);
421
421
  }
@@ -436,11 +436,10 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
436
436
  const result = reconcileWorktreeDb(mainDb, wtDb);
437
437
 
438
438
  // Should still report counts for the existing rows (INSERT OR REPLACE touches them)
439
- assertTrue(result.conflicts.length === 0, 'no conflicts when DBs are identical');
440
- assertTrue(isDbAvailable(), 'DB usable after no-change reconciliation');
439
+ assert.ok(result.conflicts.length === 0, 'no conflicts when DBs are identical');
440
+ assert.ok(isDbAvailable(), 'DB usable after no-change reconciliation');
441
441
 
442
442
  cleanup(mainDir, wtDir);
443
443
  }
444
444
 
445
445
  // ─── Final Report ──────────────────────────────────────────────────────────
446
- report();
@@ -22,9 +22,9 @@ import {
22
22
  import { getSliceBranchName } from "../worktree.ts";
23
23
  import { abortAndReset } from "../git-self-heal.ts";
24
24
  import { runGSDDoctor } from "../doctor.ts";
25
- import { createTestContext } from "./test-helpers.ts";
25
+ import { describe, test } from 'node:test';
26
+ import assert from 'node:assert/strict';
26
27
 
27
- const { assertEq, assertTrue, assertMatch, report } = createTestContext();
28
28
 
29
29
  // ---- Helpers ----
30
30
 
@@ -80,7 +80,7 @@ function addSliceToMilestone(
80
80
  run(`git merge --no-ff ${sliceBranch} -m "merge ${sliceId}"`, wtPath);
81
81
  }
82
82
 
83
- async function main(): Promise<void> {
83
+ describe('worktree-e2e', async () => {
84
84
  const savedCwd = process.cwd();
85
85
  const tempDirs: string[] = [];
86
86
 
@@ -100,7 +100,7 @@ async function main(): Promise<void> {
100
100
  // Create worktree for M001
101
101
  const wtPath = createAutoWorktree(repo, "M001");
102
102
  tempDirs.push(wtPath);
103
- assertTrue(existsSync(wtPath), "worktree directory created");
103
+ assert.ok(existsSync(wtPath), "worktree directory created");
104
104
 
105
105
  // Add two slices with commits
106
106
  addSliceToMilestone(repo, wtPath, "M001", "S01", "Add auth", [
@@ -124,19 +124,19 @@ async function main(): Promise<void> {
124
124
  // Assert exactly one new commit on main
125
125
  const mainLogAfter = run("git log --oneline main", repo);
126
126
  const commitCountAfter = mainLogAfter.split("\n").length;
127
- assertEq(commitCountAfter, commitCountBefore + 1, "exactly one new commit on main");
127
+ assert.deepStrictEqual(commitCountAfter, commitCountBefore + 1, "exactly one new commit on main");
128
128
 
129
129
  // Commit message contains both slice titles
130
130
  const lastCommitMsg = run("git log -1 --format=%B main", repo);
131
- assertMatch(lastCommitMsg, /Add auth/, "commit message contains S01 title");
132
- assertMatch(lastCommitMsg, /Add dashboard/, "commit message contains S02 title");
131
+ assert.match(lastCommitMsg, /Add auth/, "commit message contains S01 title");
132
+ assert.match(lastCommitMsg, /Add dashboard/, "commit message contains S02 title");
133
133
 
134
134
  // Worktree directory removed
135
- assertTrue(!existsSync(wtPath), "worktree directory removed after merge");
135
+ assert.ok(!existsSync(wtPath), "worktree directory removed after merge");
136
136
 
137
137
  // Milestone branch deleted
138
138
  const branches = run("git branch", repo);
139
- assertTrue(!branches.includes("milestone/M001"), "milestone branch deleted");
139
+ assert.ok(!branches.includes("milestone/M001"), "milestone branch deleted");
140
140
  }
141
141
 
142
142
  // ================================================================
@@ -159,11 +159,11 @@ async function main(): Promise<void> {
159
159
 
160
160
  // Trigger merge conflict
161
161
  try { run("git merge feature", repo); } catch { /* expected */ }
162
- assertTrue(existsSync(join(repo, ".git", "MERGE_HEAD")), "MERGE_HEAD exists before abort");
162
+ assert.ok(existsSync(join(repo, ".git", "MERGE_HEAD")), "MERGE_HEAD exists before abort");
163
163
 
164
164
  const abortResult = abortAndReset(repo);
165
- assertTrue(!existsSync(join(repo, ".git", "MERGE_HEAD")), "MERGE_HEAD removed after abort");
166
- assertTrue(abortResult.cleaned.length > 0, "abortAndReset reports cleaned items");
165
+ assert.ok(!existsSync(join(repo, ".git", "MERGE_HEAD")), "MERGE_HEAD removed after abort");
166
+ assert.ok(abortResult.cleaned.length > 0, "abortAndReset reports cleaned items");
167
167
  }
168
168
 
169
169
  // ================================================================
@@ -211,19 +211,19 @@ _None_
211
211
  // Detect
212
212
  const detect = await runGSDDoctor(repo, { isolationMode: "worktree" });
213
213
  const orphanIssues = detect.issues.filter(i => i.code === "orphaned_auto_worktree");
214
- assertTrue(orphanIssues.length > 0, "doctor detects orphaned worktree");
215
- assertEq(orphanIssues[0]?.unitId, "M001", "orphaned worktree unitId is M001");
214
+ assert.ok(orphanIssues.length > 0, "doctor detects orphaned worktree");
215
+ assert.deepStrictEqual(orphanIssues[0]?.unitId, "M001", "orphaned worktree unitId is M001");
216
216
 
217
217
  // Fix
218
218
  const fixed = await runGSDDoctor(repo, { fix: true, isolationMode: "worktree" });
219
- assertTrue(
219
+ assert.ok(
220
220
  fixed.fixesApplied.some(f => f.includes("removed orphaned worktree")),
221
221
  "doctor fix removes orphaned worktree",
222
222
  );
223
223
 
224
224
  // Verify gone
225
225
  const wtList = run("git worktree list", repo);
226
- assertTrue(!wtList.includes("milestone/M001"), "worktree gone after doctor fix");
226
+ assert.ok(!wtList.includes("milestone/M001"), "worktree gone after doctor fix");
227
227
  }
228
228
  } else {
229
229
  console.log("\n=== Doctor: orphaned worktree detection (skipped on Windows) ===");
@@ -234,8 +234,4 @@ _None_
234
234
  try { rmSync(d, { recursive: true, force: true }); } catch { /* ignore */ }
235
235
  }
236
236
  }
237
-
238
- report();
239
- }
240
-
241
- main();
237
+ });
@@ -36,18 +36,24 @@ function createGitRepo(): string {
36
36
  * Returns true when the directory would PASS the health check (dispatch
37
37
  * proceeds), false when it would FAIL (dispatch blocked).
38
38
  *
39
- * This mirrors the fixed logic: .git must exist, AND at least one
40
- * PROJECT_FILES entry or a src/ directory must exist.
39
+ * The only hard gate is .git project files are advisory (greenfield
40
+ * projects won't have them yet). Returns { pass, greenfield } to
41
+ * distinguish "pass with project files" from "pass as greenfield".
41
42
  */
42
43
  function wouldPassHealthCheck(basePath: string, existsSyncFn: (p: string) => boolean): boolean {
43
44
  const hasGit = existsSyncFn(join(basePath, ".git"));
44
45
  if (!hasGit) return false;
45
46
 
47
+ // .git is sufficient — greenfield projects proceed with a warning
48
+ return true;
49
+ }
50
+
51
+ /** Whether the directory has recognized project files (used for greenfield detection). */
52
+ function hasRecognizedProjectFiles(basePath: string, existsSyncFn: (p: string) => boolean): boolean {
46
53
  for (const file of PROJECT_FILES) {
47
54
  if (existsSyncFn(join(basePath, file))) return true;
48
55
  }
49
56
  if (existsSyncFn(join(basePath, "src"))) return true;
50
-
51
57
  return false;
52
58
  }
53
59
 
@@ -118,8 +124,9 @@ describe("health check with git repo", () => {
118
124
  assert.ok(wouldPassHealthCheck(dir, existsSync), "src/-only project should pass health check");
119
125
  });
120
126
 
121
- test("health check fails for empty git repo with no project files", () => {
122
- assert.ok(!wouldPassHealthCheck(dir, existsSync), "empty git repo should fail health check");
127
+ test("health check passes for empty git repo (greenfield project)", () => {
128
+ assert.ok(wouldPassHealthCheck(dir, existsSync), "empty git repo should pass health check (greenfield)");
129
+ assert.ok(!hasRecognizedProjectFiles(dir, existsSync), "empty git repo has no recognized project files");
123
130
  });
124
131
  });
125
132
 
@@ -12,9 +12,9 @@ import { execSync } from "node:child_process";
12
12
 
13
13
  import { getWorktreeHealth, formatWorktreeStatusLine } from "../worktree-health.ts";
14
14
  import { listWorktrees } from "../worktree-manager.ts";
15
- import { createTestContext } from "./test-helpers.ts";
15
+ import { describe, test } from 'node:test';
16
+ import assert from 'node:assert/strict';
16
17
 
17
- const { assertEq, assertTrue, report } = createTestContext();
18
18
 
19
19
  function run(cmd: string, cwd: string): string {
20
20
  return execSync(cmd, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
@@ -32,11 +32,10 @@ function createBaseRepo(): string {
32
32
  return dir;
33
33
  }
34
34
 
35
- async function main(): Promise<void> {
35
+ describe('worktree-health', async () => {
36
36
  // Skip all tests on Windows — git worktree path resolution issues
37
37
  if (process.platform === "win32") {
38
38
  console.log("(all worktree-health tests skipped on Windows)");
39
- report();
40
39
  return;
41
40
  }
42
41
 
@@ -59,16 +58,16 @@ async function main(): Promise<void> {
59
58
 
60
59
  const worktrees = listWorktrees(dir);
61
60
  const wt = worktrees.find(w => w.name === "done-feature");
62
- assertTrue(!!wt, "worktree found");
61
+ assert.ok(!!wt, "worktree found");
63
62
 
64
63
  const health = getWorktreeHealth(dir, wt!);
65
- assertTrue(health.mergedIntoMain, "branch detected as merged");
66
- assertTrue(!health.dirty, "not dirty");
67
- assertTrue(health.safeToRemove, "safe to remove");
64
+ assert.ok(health.mergedIntoMain, "branch detected as merged");
65
+ assert.ok(!health.dirty, "not dirty");
66
+ assert.ok(health.safeToRemove, "safe to remove");
68
67
 
69
68
  const line = formatWorktreeStatusLine(health);
70
- assertTrue(line.includes("merged"), "status line mentions merged");
71
- assertTrue(line.includes("safe to remove"), "status line mentions safe to remove");
69
+ assert.ok(line.includes("merged"), "status line mentions merged");
70
+ assert.ok(line.includes("safe to remove"), "status line mentions safe to remove");
72
71
  }
73
72
 
74
73
  // ─── Test: unmerged worktree with dirty files ──────────────────────
@@ -89,13 +88,13 @@ async function main(): Promise<void> {
89
88
 
90
89
  const worktrees = listWorktrees(dir);
91
90
  const wt = worktrees.find(w => w.name === "dirty-wip");
92
- assertTrue(!!wt, "worktree found");
91
+ assert.ok(!!wt, "worktree found");
93
92
 
94
93
  const health = getWorktreeHealth(dir, wt!);
95
- assertTrue(!health.mergedIntoMain, "not merged");
96
- assertTrue(health.dirty, "dirty detected");
97
- assertTrue(health.dirtyFileCount > 0, "dirty file count > 0");
98
- assertTrue(!health.safeToRemove, "not safe to remove");
94
+ assert.ok(!health.mergedIntoMain, "not merged");
95
+ assert.ok(health.dirty, "dirty detected");
96
+ assert.ok(health.dirtyFileCount > 0, "dirty file count > 0");
97
+ assert.ok(!health.safeToRemove, "not safe to remove");
99
98
  }
100
99
 
101
100
  // ─── Test: unmerged worktree with unpushed commits ─────────────────
@@ -113,12 +112,12 @@ async function main(): Promise<void> {
113
112
 
114
113
  const worktrees = listWorktrees(dir);
115
114
  const wt = worktrees.find(w => w.name === "unpushed");
116
- assertTrue(!!wt, "worktree found");
115
+ assert.ok(!!wt, "worktree found");
117
116
 
118
117
  const health = getWorktreeHealth(dir, wt!);
119
- assertTrue(!health.mergedIntoMain, "not merged");
120
- assertTrue(health.unpushedCommits > 0, "unpushed commits detected");
121
- assertTrue(!health.safeToRemove, "not safe to remove");
118
+ assert.ok(!health.mergedIntoMain, "not merged");
119
+ assert.ok(health.unpushedCommits > 0, "unpushed commits detected");
120
+ assert.ok(!health.safeToRemove, "not safe to remove");
122
121
  }
123
122
 
124
123
  // ─── Test: stale detection with short threshold ────────────────────
@@ -137,17 +136,17 @@ async function main(): Promise<void> {
137
136
 
138
137
  const worktrees = listWorktrees(dir);
139
138
  const wt = worktrees.find(w => w.name === "stale-test");
140
- assertTrue(!!wt, "worktree found");
139
+ assert.ok(!!wt, "worktree found");
141
140
 
142
141
  // With staleDays=0, any worktree should be stale (commit was just now, but threshold is 0)
143
142
  // Actually, a just-created worktree has lastCommitAgeDays ~0 which is >= 0
144
143
  const health = getWorktreeHealth(dir, wt!, 0);
145
- assertTrue(health.stale, "stale with 0-day threshold");
146
- assertTrue(health.lastCommitAgeDays >= 0, "last commit age is non-negative");
144
+ assert.ok(health.stale, "stale with 0-day threshold");
145
+ assert.ok(health.lastCommitAgeDays >= 0, "last commit age is non-negative");
147
146
 
148
147
  // With staleDays=9999, should NOT be stale
149
148
  const healthNotStale = getWorktreeHealth(dir, wt!, 9999);
150
- assertTrue(!healthNotStale.stale, "not stale with high threshold");
149
+ assert.ok(!healthNotStale.stale, "not stale with high threshold");
151
150
  }
152
151
 
153
152
  // ─── Test: formatWorktreeStatusLine for clean active worktree ──────
@@ -166,12 +165,12 @@ async function main(): Promise<void> {
166
165
 
167
166
  const worktrees = listWorktrees(dir);
168
167
  const wt = worktrees.find(w => w.name === "clean-active");
169
- assertTrue(!!wt, "worktree found");
168
+ assert.ok(!!wt, "worktree found");
170
169
 
171
170
  const health = getWorktreeHealth(dir, wt!, 9999); // high threshold so not stale
172
171
  const line = formatWorktreeStatusLine(health);
173
172
  // Should show last commit age since it's not merged and not stale
174
- assertTrue(line.includes("last commit"), "shows last commit age for active worktree");
173
+ assert.ok(line.includes("last commit"), "shows last commit age for active worktree");
175
174
  }
176
175
 
177
176
  } finally {
@@ -179,8 +178,4 @@ async function main(): Promise<void> {
179
178
  try { rmSync(dir, { recursive: true, force: true }); } catch { /* ignore */ }
180
179
  }
181
180
  }
182
-
183
- report();
184
- }
185
-
186
- main();
181
+ });
@@ -29,9 +29,9 @@ import {
29
29
  } from "../worktree.ts";
30
30
 
31
31
  import { deriveState } from "../state.ts";
32
- import { createTestContext } from './test-helpers.ts';
32
+ import { describe, test } from 'node:test';
33
+ import assert from 'node:assert/strict';
33
34
 
34
- const { assertEq, assertTrue, report } = createTestContext();
35
35
  function run(command: string, cwd: string): string {
36
36
  return execSync(command, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
37
37
  }
@@ -73,42 +73,42 @@ writeFileSync(
73
73
  run("git add .", base);
74
74
  run('git commit -m "chore: init"', base);
75
75
 
76
- async function main(): Promise<void> {
76
+ describe('worktree-integration', async () => {
77
77
  // ── Verify main tree baseline ──────────────────────────────────────────────
78
78
 
79
79
  console.log("\n=== Main tree baseline ===");
80
- assertEq(getMainBranch(base), "main", "main tree getMainBranch returns main");
81
- assertEq(detectWorktreeName(base), null, "main tree not detected as worktree");
80
+ assert.deepStrictEqual(getMainBranch(base), "main", "main tree getMainBranch returns main");
81
+ assert.deepStrictEqual(detectWorktreeName(base), null, "main tree not detected as worktree");
82
82
 
83
83
  // ── Create worktree and verify detection ───────────────────────────────────
84
84
 
85
85
  console.log("\n=== Create worktree ===");
86
86
  const wt = createWorktree(base, "alpha");
87
- assertTrue(existsSync(wt.path), "worktree created on disk");
88
- assertEq(wt.branch, "worktree/alpha", "worktree branch name");
87
+ assert.ok(existsSync(wt.path), "worktree created on disk");
88
+ assert.deepStrictEqual(wt.branch, "worktree/alpha", "worktree branch name");
89
89
 
90
90
  console.log("\n=== Worktree detection ===");
91
- assertEq(detectWorktreeName(wt.path), "alpha", "detectWorktreeName inside worktree");
92
- assertEq(getMainBranch(wt.path), "worktree/alpha", "getMainBranch returns worktree branch inside worktree");
91
+ assert.deepStrictEqual(detectWorktreeName(wt.path), "alpha", "detectWorktreeName inside worktree");
92
+ assert.deepStrictEqual(getMainBranch(wt.path), "worktree/alpha", "getMainBranch returns worktree branch inside worktree");
93
93
 
94
94
  // ── Verify current branch inside worktree ──────────────────────────────────
95
95
 
96
96
  console.log("\n=== Worktree initial branch ===");
97
- assertEq(getCurrentBranch(wt.path), "worktree/alpha", "worktree starts on its own branch");
97
+ assert.deepStrictEqual(getCurrentBranch(wt.path), "worktree/alpha", "worktree starts on its own branch");
98
98
 
99
99
  // ── Verify branch name helper ──────────────────────────────────────────────
100
100
 
101
101
  console.log("\n=== getSliceBranchName with worktree ===");
102
- assertEq(getSliceBranchName("M001", "S01", "alpha"), "gsd/alpha/M001/S01", "explicit worktree param");
103
- assertEq(getSliceBranchName("M001", "S01"), "gsd/M001/S01", "no worktree param = plain branch");
102
+ assert.deepStrictEqual(getSliceBranchName("M001", "S01", "alpha"), "gsd/alpha/M001/S01", "explicit worktree param");
103
+ assert.deepStrictEqual(getSliceBranchName("M001", "S01"), "gsd/M001/S01", "no worktree param = plain branch");
104
104
 
105
105
  // ── Slice branch creation and detection inside worktree ────────────────────
106
106
 
107
107
  console.log("\n=== Slice branch in worktree ===");
108
108
  const sliceBranch = getSliceBranchName("M001", "S01", "alpha");
109
109
  run(`git checkout -b ${sliceBranch}`, wt.path);
110
- assertEq(getCurrentBranch(wt.path), "gsd/alpha/M001/S01", "worktree-namespaced slice branch");
111
- assertTrue(SLICE_BRANCH_RE.test(getCurrentBranch(wt.path)), "slice branch regex matches namespaced branch");
110
+ assert.deepStrictEqual(getCurrentBranch(wt.path), "gsd/alpha/M001/S01", "worktree-namespaced slice branch");
111
+ assert.ok(SLICE_BRANCH_RE.test(getCurrentBranch(wt.path)), "slice branch regex matches namespaced branch");
112
112
 
113
113
  // ── Do work on slice branch, then merge to worktree branch ─────────────────
114
114
 
@@ -119,23 +119,23 @@ async function main(): Promise<void> {
119
119
 
120
120
  // Checkout worktree base branch and merge slice branch
121
121
  run("git checkout worktree/alpha", wt.path);
122
- assertEq(getCurrentBranch(wt.path), "worktree/alpha", "back on worktree branch");
122
+ assert.deepStrictEqual(getCurrentBranch(wt.path), "worktree/alpha", "back on worktree branch");
123
123
 
124
124
  run(`git merge --no-ff ${sliceBranch} -m "feat(M001/S01): First"`, wt.path);
125
125
  run(`git branch -d ${sliceBranch}`, wt.path);
126
- assertEq(getCurrentBranch(wt.path), "worktree/alpha", "still on worktree branch after merge");
127
- assertTrue(readFileSync(join(wt.path, "feature.txt"), "utf-8").includes("new feature"), "merge brought feature to worktree branch");
126
+ assert.deepStrictEqual(getCurrentBranch(wt.path), "worktree/alpha", "still on worktree branch after merge");
127
+ assert.ok(readFileSync(join(wt.path, "feature.txt"), "utf-8").includes("new feature"), "merge brought feature to worktree branch");
128
128
 
129
129
  // Verify slice branch is gone
130
130
  const branches = run("git branch", base);
131
- assertTrue(!branches.includes("gsd/alpha/M001/S01"), "slice branch cleaned up");
131
+ assert.ok(!branches.includes("gsd/alpha/M001/S01"), "slice branch cleaned up");
132
132
 
133
133
  // ── Second slice in same worktree ──────────────────────────────────────────
134
134
 
135
135
  console.log("\n=== Second slice in worktree ===");
136
136
  const sliceBranch2 = getSliceBranchName("M001", "S02", "alpha");
137
137
  run(`git checkout -b ${sliceBranch2}`, wt.path);
138
- assertEq(getCurrentBranch(wt.path), "gsd/alpha/M001/S02", "on S02 namespaced branch");
138
+ assert.deepStrictEqual(getCurrentBranch(wt.path), "gsd/alpha/M001/S02", "on S02 namespaced branch");
139
139
 
140
140
  writeFileSync(join(wt.path, "feature2.txt"), "second feature\n", "utf-8");
141
141
  run("git add .", wt.path);
@@ -144,28 +144,28 @@ async function main(): Promise<void> {
144
144
  run("git checkout worktree/alpha", wt.path);
145
145
  run(`git merge --no-ff ${sliceBranch2} -m "feat(M001/S02): Second"`, wt.path);
146
146
  run(`git branch -d ${sliceBranch2}`, wt.path);
147
- assertEq(getCurrentBranch(wt.path), "worktree/alpha", "back on worktree branch");
147
+ assert.deepStrictEqual(getCurrentBranch(wt.path), "worktree/alpha", "back on worktree branch");
148
148
 
149
149
  // ── Parallel worktrees don't conflict ──────────────────────────────────────
150
150
 
151
151
  console.log("\n=== Parallel worktrees ===");
152
152
  const wt2 = createWorktree(base, "beta");
153
- assertEq(getMainBranch(wt2.path), "worktree/beta", "second worktree has its own base branch");
153
+ assert.deepStrictEqual(getMainBranch(wt2.path), "worktree/beta", "second worktree has its own base branch");
154
154
 
155
155
  // Both worktrees can create S01 branches without conflict
156
156
  const betaBranch = getSliceBranchName("M001", "S01", "beta");
157
157
  run(`git checkout -b ${betaBranch}`, wt2.path);
158
- assertEq(getCurrentBranch(wt2.path), "gsd/beta/M001/S01", "beta has its own namespaced branch");
158
+ assert.deepStrictEqual(getCurrentBranch(wt2.path), "gsd/beta/M001/S01", "beta has its own namespaced branch");
159
159
 
160
160
  // Alpha worktree can re-create S01 too (it was already merged+deleted earlier)
161
161
  const alphaReBranch = getSliceBranchName("M001", "S01", "alpha");
162
162
  run(`git checkout -b ${alphaReBranch}`, wt.path);
163
- assertEq(getCurrentBranch(wt.path), "gsd/alpha/M001/S01", "alpha re-created S01");
163
+ assert.deepStrictEqual(getCurrentBranch(wt.path), "gsd/alpha/M001/S01", "alpha re-created S01");
164
164
 
165
165
  // Both exist simultaneously
166
166
  const allBranches = run("git branch", base);
167
- assertTrue(allBranches.includes("gsd/alpha/M001/S01"), "alpha S01 branch exists");
168
- assertTrue(allBranches.includes("gsd/beta/M001/S01"), "beta S01 branch exists");
167
+ assert.ok(allBranches.includes("gsd/alpha/M001/S01"), "alpha S01 branch exists");
168
+ assert.ok(allBranches.includes("gsd/beta/M001/S01"), "beta S01 branch exists");
169
169
 
170
170
  // ── State derivation in worktree ───────────────────────────────────────────
171
171
 
@@ -173,8 +173,8 @@ async function main(): Promise<void> {
173
173
  // Switch alpha back to its base so deriveState sees milestone files
174
174
  run("git checkout worktree/alpha", wt.path);
175
175
  const state = await deriveState(wt.path);
176
- assertTrue(state.activeMilestone !== null, "worktree has active milestone");
177
- assertEq(state.activeMilestone?.id, "M001", "correct milestone");
176
+ assert.ok(state.activeMilestone !== null, "worktree has active milestone");
177
+ assert.deepStrictEqual(state.activeMilestone?.id, "M001", "correct milestone");
178
178
 
179
179
  // ── autoCommitCurrentBranch in worktree ────────────────────────────────────
180
180
 
@@ -183,8 +183,8 @@ async function main(): Promise<void> {
183
183
  run(`git checkout ${betaBranch}`, wt2.path);
184
184
  writeFileSync(join(wt2.path, "dirty.txt"), "uncommitted\n", "utf-8");
185
185
  const commitMsg = autoCommitCurrentBranch(wt2.path, "execute-task", "M001/S01/T01");
186
- assertTrue(commitMsg !== null, "auto-commit works in worktree");
187
- assertEq(run("git status --short", wt2.path), "", "worktree clean after auto-commit");
186
+ assert.ok(commitMsg !== null, "auto-commit works in worktree");
187
+ assert.deepStrictEqual(run("git status --short", wt2.path), "", "worktree clean after auto-commit");
188
188
 
189
189
  // ── Cleanup ────────────────────────────────────────────────────────────────
190
190
 
@@ -194,14 +194,7 @@ async function main(): Promise<void> {
194
194
  run("git checkout worktree/beta", wt2.path);
195
195
  removeWorktree(base, "alpha", { deleteBranch: true });
196
196
  removeWorktree(base, "beta", { deleteBranch: true });
197
- assertEq(listWorktrees(base).length, 0, "all worktrees removed");
197
+ assert.deepStrictEqual(listWorktrees(base).length, 0, "all worktrees removed");
198
198
 
199
199
  rmSync(base, { recursive: true, force: true });
200
-
201
- report();
202
- }
203
-
204
- main().catch((error) => {
205
- console.error(error);
206
- process.exit(1);
207
200
  });