gsd-pi 2.44.0-dev.848dd4c → 2.44.0

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 (298) hide show
  1. package/README.md +12 -30
  2. package/dist/resources/extensions/gsd/auto-start.js +0 -10
  3. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +0 -5
  4. package/dist/web/standalone/.next/BUILD_ID +1 -1
  5. package/dist/web/standalone/.next/app-path-routes-manifest.json +14 -14
  6. package/dist/web/standalone/.next/build-manifest.json +3 -3
  7. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  8. package/dist/web/standalone/.next/required-server-files.json +3 -3
  9. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  10. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  11. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  12. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  13. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  14. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  15. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  16. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  17. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  18. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  19. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  20. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  21. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  22. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  23. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  24. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  25. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  26. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  27. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  28. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  29. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  30. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  31. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  32. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  33. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  34. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  35. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  36. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  37. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  38. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  39. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  40. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  41. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  42. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  43. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  44. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  45. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  46. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  47. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  48. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  49. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  50. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  51. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  52. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  53. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  54. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  55. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  56. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  57. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  58. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  59. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  60. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  61. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  62. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  63. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  64. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  65. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  66. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  67. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  68. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  69. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  70. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  71. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  72. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  73. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  74. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  75. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  76. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  77. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  78. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  79. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  80. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  81. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  82. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  83. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  84. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  85. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  86. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  87. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  88. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  89. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  90. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  91. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  92. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  93. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  94. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  95. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  96. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  98. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  100. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/index.html +1 -1
  110. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  111. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  112. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  113. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  115. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/page.js +2 -2
  117. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app-paths-manifest.json +14 -14
  119. package/dist/web/standalone/.next/server/chunks/229.js +1 -1
  120. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  121. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/middleware.js +2 -2
  123. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  125. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  126. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  127. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  128. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
  129. package/dist/web/standalone/.next/static/chunks/app/{layout-a16c7a7ecdf0c2cf.js → layout-9ecfd95f343793f0.js} +1 -1
  130. package/dist/web/standalone/.next/static/chunks/app/page-7e9530a7122506c5.js +1 -0
  131. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
  132. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +1 -0
  133. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  134. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  135. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  136. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  137. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  138. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  139. package/dist/web/standalone/server.js +1 -1
  140. package/package.json +1 -1
  141. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +8 -6
  142. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  143. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +26 -24
  144. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  145. package/packages/pi-coding-agent/dist/core/fs-utils.test.js +48 -29
  146. package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
  147. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +44 -34
  148. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
  149. package/packages/pi-coding-agent/dist/core/session-manager.test.js +34 -30
  150. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
  151. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +12 -10
  152. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
  153. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +47 -43
  154. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
  155. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
  156. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
  157. package/packages/pi-coding-agent/src/core/fs-utils.test.ts +43 -31
  158. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +45 -40
  159. package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
  160. package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
  161. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
  162. package/src/resources/extensions/gsd/auto-start.ts +0 -14
  163. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +0 -8
  164. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
  165. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +16 -14
  166. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +57 -43
  167. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +13 -11
  168. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +523 -465
  169. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +75 -73
  170. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +56 -34
  171. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +656 -533
  172. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +143 -165
  173. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +52 -29
  174. package/src/resources/extensions/gsd/tests/captures.test.ts +176 -148
  175. package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +33 -32
  176. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +143 -141
  177. package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
  178. package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
  179. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +59 -38
  180. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +263 -228
  181. package/src/resources/extensions/gsd/tests/complete-task.test.ts +302 -250
  182. package/src/resources/extensions/gsd/tests/context-store.test.ts +367 -354
  183. package/src/resources/extensions/gsd/tests/continue-here.test.ts +72 -68
  184. package/src/resources/extensions/gsd/tests/cost-projection.test.ts +106 -92
  185. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +35 -27
  186. package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +237 -220
  187. package/src/resources/extensions/gsd/tests/db-writer.test.ts +420 -390
  188. package/src/resources/extensions/gsd/tests/definition-loader.test.ts +92 -76
  189. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +83 -68
  190. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +183 -152
  191. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +101 -78
  192. package/src/resources/extensions/gsd/tests/derive-state.test.ts +227 -192
  193. package/src/resources/extensions/gsd/tests/detection.test.ts +278 -232
  194. package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +34 -30
  195. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +180 -164
  196. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +49 -43
  197. package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +32 -28
  198. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +29 -27
  199. package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +38 -34
  200. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +75 -54
  201. package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +32 -21
  202. package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +97 -72
  203. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +44 -38
  204. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +145 -104
  205. package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +106 -84
  206. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +60 -54
  207. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +93 -72
  208. package/src/resources/extensions/gsd/tests/doctor.test.ts +134 -104
  209. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +131 -123
  210. package/src/resources/extensions/gsd/tests/exit-command.test.ts +24 -20
  211. package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +57 -48
  212. package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +7 -5
  213. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +42 -30
  214. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +206 -198
  215. package/src/resources/extensions/gsd/tests/git-locale.test.ts +27 -13
  216. package/src/resources/extensions/gsd/tests/git-service.test.ts +388 -285
  217. package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +39 -31
  218. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +69 -63
  219. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +264 -255
  220. package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +119 -108
  221. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +103 -81
  222. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +262 -229
  223. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
  224. package/src/resources/extensions/gsd/tests/health-widget.test.ts +37 -29
  225. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +102 -81
  226. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +18 -16
  227. package/src/resources/extensions/gsd/tests/integration-edge.test.ts +46 -41
  228. package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +53 -42
  229. package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +91 -75
  230. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +18 -18
  231. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +194 -150
  232. package/src/resources/extensions/gsd/tests/md-importer.test.ts +125 -101
  233. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +54 -45
  234. package/src/resources/extensions/gsd/tests/memory-store.test.ts +93 -80
  235. package/src/resources/extensions/gsd/tests/migrate-command.test.ts +66 -57
  236. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +93 -83
  237. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +170 -161
  238. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +141 -125
  239. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +131 -107
  240. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +96 -87
  241. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +164 -125
  242. package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +94 -81
  243. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +36 -35
  244. package/src/resources/extensions/gsd/tests/overrides.test.ts +106 -99
  245. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +47 -40
  246. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +28 -25
  247. package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +83 -66
  248. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +77 -54
  249. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +115 -68
  250. package/src/resources/extensions/gsd/tests/parsers.test.ts +611 -546
  251. package/src/resources/extensions/gsd/tests/paths.test.ts +87 -72
  252. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +117 -77
  253. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
  254. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +119 -93
  255. package/src/resources/extensions/gsd/tests/queue-order.test.ts +82 -70
  256. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +55 -42
  257. package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +73 -45
  258. package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +38 -28
  259. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +80 -73
  260. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +74 -71
  261. package/src/resources/extensions/gsd/tests/requirements.test.ts +75 -70
  262. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +66 -44
  263. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +181 -114
  264. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +65 -63
  265. package/src/resources/extensions/gsd/tests/run-uat.test.ts +128 -66
  266. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +25 -18
  267. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +44 -37
  268. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +26 -19
  269. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +8 -6
  270. package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +28 -22
  271. package/src/resources/extensions/gsd/tests/token-savings.test.ts +56 -54
  272. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +25 -23
  273. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +11 -9
  274. package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +82 -66
  275. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +47 -46
  276. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +22 -20
  277. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +86 -84
  278. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +43 -41
  279. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +96 -94
  280. package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +13 -11
  281. package/src/resources/extensions/gsd/tests/worker-registry.test.ts +29 -27
  282. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +52 -50
  283. package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +13 -10
  284. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +18 -14
  285. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +39 -38
  286. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +21 -17
  287. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +30 -25
  288. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +37 -30
  289. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +22 -15
  290. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +66 -59
  291. package/src/resources/extensions/gsd/tests/worktree.test.ts +50 -44
  292. package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +0 -1
  293. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +0 -1
  294. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
  295. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +0 -100
  296. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +0 -63
  297. /package/dist/web/standalone/.next/static/{-zps1Q9mQmioAKLcQiCr8 → mgkxN0mGP6gSUmGPEzbk_}/_buildManifest.js +0 -0
  298. /package/dist/web/standalone/.next/static/{-zps1Q9mQmioAKLcQiCr8 → mgkxN0mGP6gSUmGPEzbk_}/_ssgManifest.js +0 -0
@@ -18,8 +18,9 @@ import {
18
18
  getActiveTaskFromDb,
19
19
  } from '../gsd-db.ts';
20
20
  import { migrateHierarchyToDb } from '../md-importer.ts';
21
- import { describe, test, beforeEach, afterEach } from 'node:test';
22
- import assert from 'node:assert/strict';
21
+ import { createTestContext } from './test-helpers.ts';
22
+
23
+ const { assertEq, assertTrue, report } = createTestContext();
23
24
 
24
25
  // ─── Fixture Helpers ───────────────────────────────────────────────────────
25
26
 
@@ -97,9 +98,11 @@ const PLAN_S02_1_TASK = `# S02: Second Slice
97
98
  // Test Cases
98
99
  // ═══════════════════════════════════════════════════════════════════════════
99
100
 
100
- // ─── Test (a): Single milestone with 2 slices, 3 tasks ────────────────
101
+ async function main(): Promise<void> {
101
102
 
102
- test('migrate-hier: single milestone with 2 slices, 3 tasks', () => {
103
+ // ─── Test (a): Single milestone with 2 slices, 3 tasks ────────────────
104
+ console.log('\n=== migrate-hier: single milestone with 2 slices, 3 tasks ===');
105
+ {
103
106
  const base = createFixtureBase();
104
107
  try {
105
108
  writeFile(base, 'milestones/M001/M001-ROADMAP.md', ROADMAP_2_SLICES);
@@ -109,48 +112,48 @@ test('migrate-hier: single milestone with 2 slices, 3 tasks', () => {
109
112
  openDatabase(':memory:');
110
113
  const counts = migrateHierarchyToDb(base);
111
114
 
112
- assert.deepStrictEqual(counts.milestones, 1, 'single-ms: 1 milestone inserted');
113
- assert.deepStrictEqual(counts.slices, 2, 'single-ms: 2 slices inserted');
114
- assert.deepStrictEqual(counts.tasks, 4, 'single-ms: 4 tasks inserted (3 + 1)');
115
+ assertEq(counts.milestones, 1, 'single-ms: 1 milestone inserted');
116
+ assertEq(counts.slices, 2, 'single-ms: 2 slices inserted');
117
+ assertEq(counts.tasks, 4, 'single-ms: 4 tasks inserted (3 + 1)');
115
118
 
116
119
  const milestones = getAllMilestones();
117
- assert.deepStrictEqual(milestones.length, 1, 'single-ms: 1 milestone in DB');
118
- assert.deepStrictEqual(milestones[0]!.id, 'M001', 'single-ms: milestone ID is M001');
119
- assert.deepStrictEqual(milestones[0]!.title, 'M001: Test Milestone', 'single-ms: milestone title correct');
120
- assert.deepStrictEqual(milestones[0]!.status, 'active', 'single-ms: milestone status is active');
120
+ assertEq(milestones.length, 1, 'single-ms: 1 milestone in DB');
121
+ assertEq(milestones[0]!.id, 'M001', 'single-ms: milestone ID is M001');
122
+ assertEq(milestones[0]!.title, 'M001: Test Milestone', 'single-ms: milestone title correct');
123
+ assertEq(milestones[0]!.status, 'active', 'single-ms: milestone status is active');
121
124
 
122
125
  const slices = getMilestoneSlices('M001');
123
- assert.deepStrictEqual(slices.length, 2, 'single-ms: 2 slices in DB');
124
- assert.deepStrictEqual(slices[0]!.id, 'S01', 'single-ms: first slice is S01');
125
- assert.deepStrictEqual(slices[0]!.title, 'First Slice', 'single-ms: S01 title correct');
126
- assert.deepStrictEqual(slices[0]!.risk, 'low', 'single-ms: S01 risk is low');
127
- assert.deepStrictEqual(slices[0]!.status, 'pending', 'single-ms: S01 status is pending');
128
- assert.deepStrictEqual(slices[1]!.id, 'S02', 'single-ms: second slice is S02');
129
- assert.deepStrictEqual(slices[1]!.risk, 'high', 'single-ms: S02 risk is high');
126
+ assertEq(slices.length, 2, 'single-ms: 2 slices in DB');
127
+ assertEq(slices[0]!.id, 'S01', 'single-ms: first slice is S01');
128
+ assertEq(slices[0]!.title, 'First Slice', 'single-ms: S01 title correct');
129
+ assertEq(slices[0]!.risk, 'low', 'single-ms: S01 risk is low');
130
+ assertEq(slices[0]!.status, 'pending', 'single-ms: S01 status is pending');
131
+ assertEq(slices[1]!.id, 'S02', 'single-ms: second slice is S02');
132
+ assertEq(slices[1]!.risk, 'high', 'single-ms: S02 risk is high');
130
133
 
131
134
  const s01Tasks = getSliceTasks('M001', 'S01');
132
- assert.deepStrictEqual(s01Tasks.length, 3, 'single-ms: 3 tasks for S01');
133
- assert.deepStrictEqual(s01Tasks[0]!.id, 'T01', 'single-ms: first task is T01');
134
- assert.deepStrictEqual(s01Tasks[0]!.title, 'First Task', 'single-ms: T01 title correct');
135
- assert.deepStrictEqual(s01Tasks[0]!.status, 'pending', 'single-ms: T01 status is pending');
136
- assert.deepStrictEqual(s01Tasks[1]!.id, 'T02', 'single-ms: second task is T02');
137
- assert.deepStrictEqual(s01Tasks[1]!.status, 'complete', 'single-ms: T02 status is complete (was [x])');
138
- assert.deepStrictEqual(s01Tasks[2]!.id, 'T03', 'single-ms: third task is T03');
135
+ assertEq(s01Tasks.length, 3, 'single-ms: 3 tasks for S01');
136
+ assertEq(s01Tasks[0]!.id, 'T01', 'single-ms: first task is T01');
137
+ assertEq(s01Tasks[0]!.title, 'First Task', 'single-ms: T01 title correct');
138
+ assertEq(s01Tasks[0]!.status, 'pending', 'single-ms: T01 status is pending');
139
+ assertEq(s01Tasks[1]!.id, 'T02', 'single-ms: second task is T02');
140
+ assertEq(s01Tasks[1]!.status, 'complete', 'single-ms: T02 status is complete (was [x])');
141
+ assertEq(s01Tasks[2]!.id, 'T03', 'single-ms: third task is T03');
139
142
 
140
143
  const s02Tasks = getSliceTasks('M001', 'S02');
141
- assert.deepStrictEqual(s02Tasks.length, 1, 'single-ms: 1 task for S02');
142
- assert.deepStrictEqual(s02Tasks[0]!.id, 'T01', 'single-ms: S02 T01 correct');
144
+ assertEq(s02Tasks.length, 1, 'single-ms: 1 task for S02');
145
+ assertEq(s02Tasks[0]!.id, 'T01', 'single-ms: S02 T01 correct');
143
146
 
144
147
  closeDatabase();
145
148
  } finally {
146
149
  closeDatabase();
147
150
  cleanup(base);
148
151
  }
149
- });
152
+ }
150
153
 
151
154
  // ─── Test (b): Multi-milestone — M001 complete, M002 active with deps ─
152
-
153
- test('migrate-hier: multi-milestone with deps', () => {
155
+ console.log('\n=== migrate-hier: multi-milestone with deps ===');
156
+ {
154
157
  const base = createFixtureBase();
155
158
  try {
156
159
  // M001: complete (has SUMMARY)
@@ -194,35 +197,35 @@ Depends on M001 completion.
194
197
  openDatabase(':memory:');
195
198
  const counts = migrateHierarchyToDb(base);
196
199
 
197
- assert.deepStrictEqual(counts.milestones, 2, 'multi-ms: 2 milestones inserted');
200
+ assertEq(counts.milestones, 2, 'multi-ms: 2 milestones inserted');
198
201
 
199
202
  const m001 = getMilestone('M001');
200
- assert.ok(m001 !== null, 'multi-ms: M001 exists');
201
- assert.deepStrictEqual(m001!.status, 'complete', 'multi-ms: M001 is complete');
203
+ assertTrue(m001 !== null, 'multi-ms: M001 exists');
204
+ assertEq(m001!.status, 'complete', 'multi-ms: M001 is complete');
202
205
 
203
206
  const m002 = getMilestone('M002');
204
- assert.ok(m002 !== null, 'multi-ms: M002 exists');
205
- assert.deepStrictEqual(m002!.status, 'active', 'multi-ms: M002 is active');
206
- assert.deepStrictEqual(m002!.depends_on, ['M001'], 'multi-ms: M002 depends on M001');
207
+ assertTrue(m002 !== null, 'multi-ms: M002 exists');
208
+ assertEq(m002!.status, 'active', 'multi-ms: M002 is active');
209
+ assertEq(m002!.depends_on, ['M001'], 'multi-ms: M002 depends on M001');
207
210
 
208
211
  // Active milestone should be M002
209
212
  const active = getActiveMilestoneFromDb();
210
- assert.deepStrictEqual(active?.id, 'M002', 'multi-ms: active milestone is M002');
213
+ assertEq(active?.id, 'M002', 'multi-ms: active milestone is M002');
211
214
 
212
215
  // Active slice in M002 should be S01 (S02 depends on S01)
213
216
  const activeSlice = getActiveSliceFromDb('M002');
214
- assert.deepStrictEqual(activeSlice?.id, 'S01', 'multi-ms: active slice is S01');
217
+ assertEq(activeSlice?.id, 'S01', 'multi-ms: active slice is S01');
215
218
 
216
219
  closeDatabase();
217
220
  } finally {
218
221
  closeDatabase();
219
222
  cleanup(base);
220
223
  }
221
- });
224
+ }
222
225
 
223
226
  // ─── Test (c): Partially-completed slice — some tasks [x], some [ ] ───
224
-
225
- test('migrate-hier: partially-completed slice', () => {
227
+ console.log('\n=== migrate-hier: partially-completed slice ===');
228
+ {
226
229
  const base = createFixtureBase();
227
230
  try {
228
231
  const roadmap = `# M001: Partial
@@ -257,25 +260,25 @@ test('migrate-hier: partially-completed slice', () => {
257
260
  migrateHierarchyToDb(base);
258
261
 
259
262
  const tasks = getSliceTasks('M001', 'S01');
260
- assert.deepStrictEqual(tasks.length, 3, 'partial: 3 tasks');
261
- assert.deepStrictEqual(tasks[0]!.status, 'complete', 'partial: T01 is complete');
262
- assert.deepStrictEqual(tasks[1]!.status, 'complete', 'partial: T02 is complete');
263
- assert.deepStrictEqual(tasks[2]!.status, 'pending', 'partial: T03 is pending');
263
+ assertEq(tasks.length, 3, 'partial: 3 tasks');
264
+ assertEq(tasks[0]!.status, 'complete', 'partial: T01 is complete');
265
+ assertEq(tasks[1]!.status, 'complete', 'partial: T02 is complete');
266
+ assertEq(tasks[2]!.status, 'pending', 'partial: T03 is pending');
264
267
 
265
268
  // Active task should be T03
266
269
  const activeTask = getActiveTaskFromDb('M001', 'S01');
267
- assert.deepStrictEqual(activeTask?.id, 'T03', 'partial: active task is T03');
270
+ assertEq(activeTask?.id, 'T03', 'partial: active task is T03');
268
271
 
269
272
  closeDatabase();
270
273
  } finally {
271
274
  closeDatabase();
272
275
  cleanup(base);
273
276
  }
274
- });
277
+ }
275
278
 
276
279
  // ─── Test (d): Ghost milestone skipped ────────────────────────────────
277
-
278
- test('migrate-hier: ghost milestone skipped', () => {
280
+ console.log('\n=== migrate-hier: ghost milestone skipped ===');
281
+ {
279
282
  const base = createFixtureBase();
280
283
  try {
281
284
  // M001: real milestone
@@ -286,21 +289,21 @@ test('migrate-hier: ghost milestone skipped', () => {
286
289
  openDatabase(':memory:');
287
290
  const counts = migrateHierarchyToDb(base);
288
291
 
289
- assert.deepStrictEqual(counts.milestones, 1, 'ghost: only 1 milestone inserted');
292
+ assertEq(counts.milestones, 1, 'ghost: only 1 milestone inserted');
290
293
  const milestones = getAllMilestones();
291
- assert.deepStrictEqual(milestones.length, 1, 'ghost: 1 milestone in DB');
292
- assert.deepStrictEqual(milestones[0]!.id, 'M001', 'ghost: only M001 in DB');
294
+ assertEq(milestones.length, 1, 'ghost: 1 milestone in DB');
295
+ assertEq(milestones[0]!.id, 'M001', 'ghost: only M001 in DB');
293
296
 
294
297
  closeDatabase();
295
298
  } finally {
296
299
  closeDatabase();
297
300
  cleanup(base);
298
301
  }
299
- });
302
+ }
300
303
 
301
304
  // ─── Test (e): Idempotent re-run — calling twice doesn't duplicate ────
302
-
303
- test('migrate-hier: idempotent re-run', () => {
305
+ console.log('\n=== migrate-hier: idempotent re-run ===');
306
+ {
304
307
  const base = createFixtureBase();
305
308
  try {
306
309
  writeFile(base, 'milestones/M001/M001-ROADMAP.md', ROADMAP_2_SLICES);
@@ -310,31 +313,31 @@ test('migrate-hier: idempotent re-run', () => {
310
313
 
311
314
  // First run
312
315
  const counts1 = migrateHierarchyToDb(base);
313
- assert.deepStrictEqual(counts1.milestones, 1, 'idempotent-1: 1 milestone first run');
314
- assert.deepStrictEqual(counts1.slices, 2, 'idempotent-1: 2 slices first run');
315
- assert.deepStrictEqual(counts1.tasks, 3, 'idempotent-1: 3 tasks first run');
316
+ assertEq(counts1.milestones, 1, 'idempotent-1: 1 milestone first run');
317
+ assertEq(counts1.slices, 2, 'idempotent-1: 2 slices first run');
318
+ assertEq(counts1.tasks, 3, 'idempotent-1: 3 tasks first run');
316
319
 
317
320
  // Second run — INSERT OR IGNORE means no duplicates
318
321
  const counts2 = migrateHierarchyToDb(base);
319
322
  // Counts reflect attempts, not actual inserts (INSERT OR IGNORE silently skips)
320
323
  // The important thing: DB doesn't have duplicates
321
324
  const milestones = getAllMilestones();
322
- assert.deepStrictEqual(milestones.length, 1, 'idempotent-2: still 1 milestone after second run');
325
+ assertEq(milestones.length, 1, 'idempotent-2: still 1 milestone after second run');
323
326
  const slices = getMilestoneSlices('M001');
324
- assert.deepStrictEqual(slices.length, 2, 'idempotent-2: still 2 slices after second run');
327
+ assertEq(slices.length, 2, 'idempotent-2: still 2 slices after second run');
325
328
  const tasks = getSliceTasks('M001', 'S01');
326
- assert.deepStrictEqual(tasks.length, 3, 'idempotent-2: still 3 tasks for S01 after second run');
329
+ assertEq(tasks.length, 3, 'idempotent-2: still 3 tasks for S01 after second run');
327
330
 
328
331
  closeDatabase();
329
332
  } finally {
330
333
  closeDatabase();
331
334
  cleanup(base);
332
335
  }
333
- });
336
+ }
334
337
 
335
338
  // ─── Test (f): Empty roadmap — milestone inserted but no slices ───────
336
-
337
- test('migrate-hier: empty roadmap, no slices', () => {
339
+ console.log('\n=== migrate-hier: empty roadmap, no slices ===');
340
+ {
338
341
  const base = createFixtureBase();
339
342
  try {
340
343
  const emptyRoadmap = `# M001: Empty Milestone
@@ -350,27 +353,27 @@ test('migrate-hier: empty roadmap, no slices', () => {
350
353
  openDatabase(':memory:');
351
354
  const counts = migrateHierarchyToDb(base);
352
355
 
353
- assert.deepStrictEqual(counts.milestones, 1, 'empty-roadmap: 1 milestone inserted');
354
- assert.deepStrictEqual(counts.slices, 0, 'empty-roadmap: 0 slices inserted');
355
- assert.deepStrictEqual(counts.tasks, 0, 'empty-roadmap: 0 tasks inserted');
356
+ assertEq(counts.milestones, 1, 'empty-roadmap: 1 milestone inserted');
357
+ assertEq(counts.slices, 0, 'empty-roadmap: 0 slices inserted');
358
+ assertEq(counts.tasks, 0, 'empty-roadmap: 0 tasks inserted');
356
359
 
357
360
  const milestones = getAllMilestones();
358
- assert.deepStrictEqual(milestones.length, 1, 'empty-roadmap: 1 milestone in DB');
359
- assert.deepStrictEqual(milestones[0]!.title, 'M001: Empty Milestone', 'empty-roadmap: title correct');
361
+ assertEq(milestones.length, 1, 'empty-roadmap: 1 milestone in DB');
362
+ assertEq(milestones[0]!.title, 'M001: Empty Milestone', 'empty-roadmap: title correct');
360
363
 
361
364
  const slices = getMilestoneSlices('M001');
362
- assert.deepStrictEqual(slices.length, 0, 'empty-roadmap: no slices in DB');
365
+ assertEq(slices.length, 0, 'empty-roadmap: no slices in DB');
363
366
 
364
367
  closeDatabase();
365
368
  } finally {
366
369
  closeDatabase();
367
370
  cleanup(base);
368
371
  }
369
- });
372
+ }
370
373
 
371
374
  // ─── Test (g): Slice depends parsed correctly ─────────────────────────
372
-
373
- test('migrate-hier: slice depends parsed', () => {
375
+ console.log('\n=== migrate-hier: slice depends parsed ===');
376
+ {
374
377
  const base = createFixtureBase();
375
378
  try {
376
379
  const roadmap = `# M001: Deps Test
@@ -394,21 +397,21 @@ test('migrate-hier: slice depends parsed', () => {
394
397
  migrateHierarchyToDb(base);
395
398
 
396
399
  const slices = getMilestoneSlices('M001');
397
- assert.deepStrictEqual(slices.length, 3, 'depends: 3 slices');
398
- assert.deepStrictEqual(slices[0]!.depends, [], 'depends: S01 has no deps');
399
- assert.deepStrictEqual(slices[1]!.depends, ['S01'], 'depends: S02 depends on S01');
400
- assert.deepStrictEqual(slices[2]!.depends, ['S01', 'S02'], 'depends: S03 depends on S01,S02');
400
+ assertEq(slices.length, 3, 'depends: 3 slices');
401
+ assertEq(slices[0]!.depends, [], 'depends: S01 has no deps');
402
+ assertEq(slices[1]!.depends, ['S01'], 'depends: S02 depends on S01');
403
+ assertEq(slices[2]!.depends, ['S01', 'S02'], 'depends: S03 depends on S01,S02');
401
404
 
402
405
  closeDatabase();
403
406
  } finally {
404
407
  closeDatabase();
405
408
  cleanup(base);
406
409
  }
407
- });
410
+ }
408
411
 
409
412
  // ─── Test (h): Demo text extracted from roadmap ───────────────────────
410
-
411
- test('migrate-hier: demo text extracted', () => {
413
+ console.log('\n=== migrate-hier: demo text extracted ===');
414
+ {
412
415
  const base = createFixtureBase();
413
416
  try {
414
417
  writeFile(base, 'milestones/M001/M001-ROADMAP.md', ROADMAP_2_SLICES);
@@ -417,13 +420,20 @@ test('migrate-hier: demo text extracted', () => {
417
420
  migrateHierarchyToDb(base);
418
421
 
419
422
  const slices = getMilestoneSlices('M001');
420
- assert.deepStrictEqual(slices[0]!.demo, 'First slice done.', 'demo: S01 demo text correct');
421
- assert.deepStrictEqual(slices[1]!.demo, 'All slices done.', 'demo: S02 demo text correct');
423
+ assertEq(slices[0]!.demo, 'First slice done.', 'demo: S01 demo text correct');
424
+ assertEq(slices[1]!.demo, 'All slices done.', 'demo: S02 demo text correct');
422
425
 
423
426
  closeDatabase();
424
427
  } finally {
425
428
  closeDatabase();
426
429
  cleanup(base);
427
430
  }
428
- });
431
+ }
429
432
 
433
+ report();
434
+ }
435
+
436
+ main().catch((error) => {
437
+ console.error(error);
438
+ process.exit(1);
439
+ });