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
@@ -3,8 +3,8 @@
3
3
  // Tests the RuleRegistry class, UnifiedRule types, singleton accessors,
4
4
  // and evaluation methods using mock rules.
5
5
 
6
- import assert from 'node:assert/strict';
7
6
  import { test, describe, beforeEach } from "node:test";
7
+ import { createTestContext } from "./test-helpers.ts";
8
8
  import {
9
9
  RuleRegistry,
10
10
  getRegistry,
@@ -64,7 +64,9 @@ function makeContext(phase: string): DispatchContext {
64
64
  // ─── Tests ────────────────────────────────────────────────────────────────
65
65
 
66
66
  describe("RuleRegistry", () => {
67
- beforeEach(() => {
67
+ const { assertEq, assertTrue } = createTestContext();
68
+
69
+ beforeEach(() => {
68
70
  resetRegistry();
69
71
  });
70
72
 
@@ -79,10 +81,10 @@ describe("RuleRegistry", () => {
79
81
 
80
82
  // At minimum, dispatch rules are returned (hook rules depend on prefs)
81
83
  const dispatchRules = listed.filter(r => r.when === "dispatch");
82
- assert.deepStrictEqual(dispatchRules.length, 3, "listRules returns 3 dispatch rules");
83
- assert.deepStrictEqual(dispatchRules[0].name, "rule-a", "first rule name is rule-a");
84
- assert.deepStrictEqual(dispatchRules[1].name, "rule-b", "second rule name is rule-b");
85
- assert.deepStrictEqual(dispatchRules[2].name, "rule-c", "third rule name is rule-c");
84
+ assertEq(dispatchRules.length, 3, "listRules returns 3 dispatch rules");
85
+ assertEq(dispatchRules[0].name, "rule-a", "first rule name is rule-a");
86
+ assertEq(dispatchRules[1].name, "rule-b", "second rule name is rule-b");
87
+ assertEq(dispatchRules[2].name, "rule-c", "third rule name is rule-c");
86
88
  });
87
89
 
88
90
  test("listRules returns correct fields on each rule", () => {
@@ -93,12 +95,12 @@ describe("RuleRegistry", () => {
93
95
  const listed = registry.listRules();
94
96
  const rule = listed.find(r => r.name === "check-fields")!;
95
97
 
96
- assert.ok(rule !== undefined, "rule found by name");
97
- assert.deepStrictEqual(rule.when, "dispatch", "when field is dispatch");
98
- assert.deepStrictEqual(rule.evaluation, "first-match", "evaluation is first-match");
99
- assert.ok(typeof rule.where === "function", "where is a function");
100
- assert.ok(typeof rule.then === "function", "then is a function");
101
- assert.deepStrictEqual(rule.description, "Mock rule for planning", "description is set");
98
+ assertTrue(rule !== undefined, "rule found by name");
99
+ assertEq(rule.when, "dispatch", "when field is dispatch");
100
+ assertEq(rule.evaluation, "first-match", "evaluation is first-match");
101
+ assertTrue(typeof rule.where === "function", "where is a function");
102
+ assertTrue(typeof rule.then === "function", "then is a function");
103
+ assertEq(rule.description, "Mock rule for planning", "description is set");
102
104
  });
103
105
 
104
106
  test("evaluateDispatch returns first matching rule", async () => {
@@ -111,10 +113,10 @@ describe("RuleRegistry", () => {
111
113
  const ctx = makeContext("executing");
112
114
  const result = await registry.evaluateDispatch(ctx);
113
115
 
114
- assert.deepStrictEqual(result.action, "dispatch", "result is a dispatch action");
116
+ assertEq(result.action, "dispatch", "result is a dispatch action");
115
117
  if (result.action === "dispatch") {
116
- assert.deepStrictEqual(result.unitType, "test-executing", "matched the executing rule");
117
- assert.deepStrictEqual(result.prompt, "Prompt for executing", "prompt from matched rule");
118
+ assertEq(result.unitType, "test-executing", "matched the executing rule");
119
+ assertEq(result.prompt, "Prompt for executing", "prompt from matched rule");
118
120
  }
119
121
  });
120
122
 
@@ -126,9 +128,9 @@ describe("RuleRegistry", () => {
126
128
  const ctx = makeContext("blocked");
127
129
  const result = await registry.evaluateDispatch(ctx);
128
130
 
129
- assert.deepStrictEqual(result.action, "stop", "result is a stop action");
131
+ assertEq(result.action, "stop", "result is a stop action");
130
132
  if (result.action === "stop") {
131
- assert.ok(result.reason.includes("blocked"), "stop reason mentions phase");
133
+ assertTrue(result.reason.includes("blocked"), "stop reason mentions phase");
132
134
  }
133
135
  });
134
136
 
@@ -157,9 +159,9 @@ describe("RuleRegistry", () => {
157
159
  const ctx = makeContext("planning");
158
160
  const result = await registry.evaluateDispatch(ctx);
159
161
 
160
- assert.deepStrictEqual(result.action, "dispatch", "async dispatch resolved");
162
+ assertEq(result.action, "dispatch", "async dispatch resolved");
161
163
  if (result.action === "dispatch") {
162
- assert.deepStrictEqual(result.unitType, "async-test", "async rule matched");
164
+ assertEq(result.unitType, "async-test", "async rule matched");
163
165
  }
164
166
  });
165
167
 
@@ -186,11 +188,11 @@ describe("RuleRegistry", () => {
186
188
  // Reset
187
189
  registry.resetState();
188
190
 
189
- assert.deepStrictEqual(registry.getActiveHook(), null, "activeHook cleared");
190
- assert.deepStrictEqual(registry.hookQueue.length, 0, "hookQueue cleared");
191
- assert.deepStrictEqual(registry.cycleCounts.size, 0, "cycleCounts cleared");
192
- assert.deepStrictEqual(registry.isRetryPending(), false, "retryPending cleared");
193
- assert.deepStrictEqual(registry.consumeRetryTrigger(), null, "retryTrigger cleared");
191
+ assertEq(registry.getActiveHook(), null, "activeHook cleared");
192
+ assertEq(registry.hookQueue.length, 0, "hookQueue cleared");
193
+ assertEq(registry.cycleCounts.size, 0, "cycleCounts cleared");
194
+ assertEq(registry.isRetryPending(), false, "retryPending cleared");
195
+ assertEq(registry.consumeRetryTrigger(), null, "retryTrigger cleared");
194
196
  });
195
197
 
196
198
  test("singleton getRegistry throws when not initialized", () => {
@@ -199,9 +201,9 @@ describe("RuleRegistry", () => {
199
201
  getRegistry();
200
202
  } catch (e: any) {
201
203
  threw = true;
202
- assert.ok(e.message.includes("not initialized"), "error mentions not initialized");
204
+ assertTrue(e.message.includes("not initialized"), "error mentions not initialized");
203
205
  }
204
- assert.ok(threw, "getRegistry threw");
206
+ assertTrue(threw, "getRegistry threw");
205
207
  });
206
208
 
207
209
  test("setRegistry / getRegistry round-trips", () => {
@@ -209,20 +211,20 @@ describe("RuleRegistry", () => {
209
211
  setRegistry(registry);
210
212
 
211
213
  const retrieved = getRegistry();
212
- assert.deepStrictEqual(retrieved, registry, "getRegistry returns the same instance");
214
+ assertEq(retrieved, registry, "getRegistry returns the same instance");
213
215
 
214
216
  const listed = retrieved.listRules().filter(r => r.when === "dispatch");
215
- assert.deepStrictEqual(listed.length, 1, "singleton has 1 dispatch rule");
216
- assert.deepStrictEqual(listed[0].name, "singleton-test", "rule name matches");
217
+ assertEq(listed.length, 1, "singleton has 1 dispatch rule");
218
+ assertEq(listed[0].name, "singleton-test", "rule name matches");
217
219
  });
218
220
 
219
221
  test("initRegistry creates and sets singleton", () => {
220
222
  const rules = [mockDispatchRule("init-test", "executing")];
221
223
  const registry = initRegistry(rules);
222
224
 
223
- assert.deepStrictEqual(getRegistry(), registry, "initRegistry sets the singleton");
225
+ assertEq(getRegistry(), registry, "initRegistry sets the singleton");
224
226
  const listed = getRegistry().listRules().filter(r => r.when === "dispatch");
225
- assert.deepStrictEqual(listed.length, 1, "singleton has the rule");
227
+ assertEq(listed.length, 1, "singleton has the rule");
226
228
  });
227
229
 
228
230
  test("evaluateDispatch respects rule order (first match wins)", async () => {
@@ -256,9 +258,9 @@ describe("RuleRegistry", () => {
256
258
  const ctx = makeContext("planning");
257
259
  const result = await registry.evaluateDispatch(ctx);
258
260
 
259
- assert.deepStrictEqual(result.action, "dispatch", "dispatch action returned");
261
+ assertEq(result.action, "dispatch", "dispatch action returned");
260
262
  if (result.action === "dispatch") {
261
- assert.deepStrictEqual(result.unitType, "first-wins", "first rule won over second");
263
+ assertEq(result.unitType, "first-wins", "first rule won over second");
262
264
  }
263
265
  });
264
266
 
@@ -266,18 +268,18 @@ describe("RuleRegistry", () => {
266
268
 
267
269
  test("convertDispatchRules produces correct count of UnifiedRule objects", () => {
268
270
  const converted = convertDispatchRules(DISPATCH_RULES);
269
- assert.deepStrictEqual(converted.length, DISPATCH_RULES.length, `convertDispatchRules produces ${DISPATCH_RULES.length} rules`);
271
+ assertEq(converted.length, DISPATCH_RULES.length, `convertDispatchRules produces ${DISPATCH_RULES.length} rules`);
270
272
  });
271
273
 
272
274
  test("each converted rule has correct when, evaluation, and original name", () => {
273
275
  const converted = convertDispatchRules(DISPATCH_RULES);
274
276
  for (let i = 0; i < converted.length; i++) {
275
277
  const rule = converted[i];
276
- assert.deepStrictEqual(rule.when, "dispatch", `rule ${i} has when:"dispatch"`);
277
- assert.deepStrictEqual(rule.evaluation, "first-match", `rule ${i} has evaluation:"first-match"`);
278
- assert.deepStrictEqual(rule.name, DISPATCH_RULES[i].name, `rule ${i} preserves name "${DISPATCH_RULES[i].name}"`);
279
- assert.ok(typeof rule.where === "function", `rule ${i} has a where function`);
280
- assert.ok(typeof rule.then === "function", `rule ${i} has a then function`);
278
+ assertEq(rule.when, "dispatch", `rule ${i} has when:"dispatch"`);
279
+ assertEq(rule.evaluation, "first-match", `rule ${i} has evaluation:"first-match"`);
280
+ assertEq(rule.name, DISPATCH_RULES[i].name, `rule ${i} preserves name "${DISPATCH_RULES[i].name}"`);
281
+ assertTrue(typeof rule.where === "function", `rule ${i} has a where function`);
282
+ assertTrue(typeof rule.then === "function", `rule ${i} has a then function`);
281
283
  }
282
284
  });
283
285
 
@@ -285,7 +287,7 @@ describe("RuleRegistry", () => {
285
287
  const converted = convertDispatchRules(DISPATCH_RULES);
286
288
  const registry = new RuleRegistry(converted);
287
289
  const listed = registry.listRules().filter(r => r.when === "dispatch");
288
- assert.deepStrictEqual(listed.length, DISPATCH_RULES.length, `listRules returns ${DISPATCH_RULES.length} dispatch rules`);
290
+ assertEq(listed.length, DISPATCH_RULES.length, `listRules returns ${DISPATCH_RULES.length} dispatch rules`);
289
291
  });
290
292
 
291
293
  test("rule names from listRules match getDispatchRuleNames in exact order", () => {
@@ -296,9 +298,9 @@ describe("RuleRegistry", () => {
296
298
  .map(r => r.name);
297
299
  const originalNames = getDispatchRuleNames();
298
300
 
299
- assert.deepStrictEqual(listedNames.length, originalNames.length, "same number of names");
301
+ assertEq(listedNames.length, originalNames.length, "same number of names");
300
302
  for (let i = 0; i < originalNames.length; i++) {
301
- assert.deepStrictEqual(listedNames[i], originalNames[i], `name at index ${i} matches: "${originalNames[i]}"`);
303
+ assertEq(listedNames[i], originalNames[i], `name at index ${i} matches: "${originalNames[i]}"`);
302
304
  }
303
305
  });
304
306
 
@@ -307,18 +309,18 @@ describe("RuleRegistry", () => {
307
309
  test("getOrCreateRegistry lazily creates a registry with empty dispatch rules", () => {
308
310
  // After resetRegistry(), getRegistry() would throw. getOrCreateRegistry() should not.
309
311
  const registry = getOrCreateRegistry();
310
- assert.ok(registry instanceof RuleRegistry, "returns a RuleRegistry instance");
312
+ assertTrue(registry instanceof RuleRegistry, "returns a RuleRegistry instance");
311
313
  const dispatchRules = registry.listRules().filter(r => r.when === "dispatch");
312
- assert.deepStrictEqual(dispatchRules.length, 0, "lazily-created registry has 0 dispatch rules");
314
+ assertEq(dispatchRules.length, 0, "lazily-created registry has 0 dispatch rules");
313
315
  });
314
316
 
315
317
  test("getOrCreateRegistry returns existing registry when initialized", () => {
316
318
  const rules = [mockDispatchRule("explicit-init", "planning")];
317
319
  const explicit = initRegistry(rules);
318
320
  const lazy = getOrCreateRegistry();
319
- assert.deepStrictEqual(lazy, explicit, "getOrCreateRegistry returns the same singleton as initRegistry");
321
+ assertEq(lazy, explicit, "getOrCreateRegistry returns the same singleton as initRegistry");
320
322
  const dispatchRules = lazy.listRules().filter(r => r.when === "dispatch");
321
- assert.deepStrictEqual(dispatchRules.length, 1, "singleton has the explicitly initialized dispatch rule");
323
+ assertEq(dispatchRules.length, 1, "singleton has the explicitly initialized dispatch rule");
322
324
  });
323
325
 
324
326
  // ── Hook-derived rules in listRules ────────────────────────────────
@@ -331,9 +333,9 @@ describe("RuleRegistry", () => {
331
333
  const preDispatchRules = allRules.filter(r => r.when === "pre-dispatch");
332
334
 
333
335
  // No preferences file = no hooks
334
- assert.deepStrictEqual(postUnitRules.length, 0, "no post-unit rules when no hooks configured");
335
- assert.deepStrictEqual(preDispatchRules.length, 0, "no pre-dispatch rules when no hooks configured");
336
- assert.deepStrictEqual(allRules.length, DISPATCH_RULES.length, "total rules equals dispatch rules only");
336
+ assertEq(postUnitRules.length, 0, "no post-unit rules when no hooks configured");
337
+ assertEq(preDispatchRules.length, 0, "no pre-dispatch rules when no hooks configured");
338
+ assertEq(allRules.length, DISPATCH_RULES.length, "total rules equals dispatch rules only");
337
339
  });
338
340
 
339
341
  test("listRules dispatch rules appear first, hooks after", () => {
@@ -343,8 +345,8 @@ describe("RuleRegistry", () => {
343
345
 
344
346
  // Verify dispatch rules come first (indices 0..N-1)
345
347
  for (let i = 0; i < converted.length; i++) {
346
- assert.deepStrictEqual(allRules[i].when, "dispatch", `rule at index ${i} is a dispatch rule`);
347
- assert.deepStrictEqual(allRules[i].name, converted[i].name, `dispatch rule at index ${i} has correct name`);
348
+ assertEq(allRules[i].when, "dispatch", `rule at index ${i} is a dispatch rule`);
349
+ assertEq(allRules[i].name, converted[i].name, `dispatch rule at index ${i} has correct name`);
348
350
  }
349
351
  });
350
352
 
@@ -353,34 +355,34 @@ describe("RuleRegistry", () => {
353
355
  test("evaluatePostUnit returns null for hook-on-hook prevention", () => {
354
356
  const registry = new RuleRegistry([]);
355
357
  const result = registry.evaluatePostUnit("hook/code-review", "M001/S01/T01", "/tmp/test");
356
- assert.deepStrictEqual(result, null, "hook units don't trigger other hooks");
358
+ assertEq(result, null, "hook units don't trigger other hooks");
357
359
  });
358
360
 
359
361
  test("evaluatePostUnit returns null for triage-captures", () => {
360
362
  const registry = new RuleRegistry([]);
361
363
  const result = registry.evaluatePostUnit("triage-captures", "M001/S01/T01", "/tmp/test");
362
- assert.deepStrictEqual(result, null, "triage-captures skipped");
364
+ assertEq(result, null, "triage-captures skipped");
363
365
  });
364
366
 
365
367
  test("evaluatePostUnit returns null for quick-task", () => {
366
368
  const registry = new RuleRegistry([]);
367
369
  const result = registry.evaluatePostUnit("quick-task", "M001/S01/T01", "/tmp/test");
368
- assert.deepStrictEqual(result, null, "quick-task skipped");
370
+ assertEq(result, null, "quick-task skipped");
369
371
  });
370
372
 
371
373
  test("evaluatePreDispatch bypasses hook units", () => {
372
374
  const registry = new RuleRegistry([]);
373
375
  const result = registry.evaluatePreDispatch("hook/review", "M001/S01/T01", "prompt", "/tmp/test");
374
- assert.deepStrictEqual(result.action, "proceed", "hook units always proceed");
375
- assert.deepStrictEqual(result.prompt, "prompt", "prompt unchanged");
376
- assert.deepStrictEqual(result.firedHooks.length, 0, "no hooks fired");
376
+ assertEq(result.action, "proceed", "hook units always proceed");
377
+ assertEq(result.prompt, "prompt", "prompt unchanged");
378
+ assertEq(result.firedHooks.length, 0, "no hooks fired");
377
379
  });
378
380
 
379
381
  test("evaluatePreDispatch proceeds with empty hooks", () => {
380
382
  const registry = new RuleRegistry([]);
381
383
  const result = registry.evaluatePreDispatch("execute-task", "M001/S01/T01", "original prompt", "/tmp/test");
382
- assert.deepStrictEqual(result.action, "proceed", "proceeds when no hooks");
383
- assert.deepStrictEqual(result.prompt, "original prompt", "prompt unchanged");
384
+ assertEq(result.action, "proceed", "proceeds when no hooks");
385
+ assertEq(result.prompt, "original prompt", "prompt unchanged");
384
386
  });
385
387
 
386
388
  // ── matchedRule provenance (S02 journal support) ───────────────────
@@ -393,8 +395,8 @@ describe("RuleRegistry", () => {
393
395
  const ctx = makeContext("planning");
394
396
  const result = await registry.evaluateDispatch(ctx);
395
397
 
396
- assert.deepStrictEqual(result.action, "dispatch", "result is a dispatch action");
397
- assert.deepStrictEqual(result.matchedRule, "my-planning-rule", "matchedRule is the rule name");
398
+ assertEq(result.action, "dispatch", "result is a dispatch action");
399
+ assertEq(result.matchedRule, "my-planning-rule", "matchedRule is the rule name");
398
400
  });
399
401
 
400
402
  test("evaluateDispatch result includes matchedRule '<no-match>' on fallback stop", async () => {
@@ -405,7 +407,7 @@ describe("RuleRegistry", () => {
405
407
  const ctx = makeContext("some-unknown-phase");
406
408
  const result = await registry.evaluateDispatch(ctx);
407
409
 
408
- assert.deepStrictEqual(result.action, "stop", "result is a stop action");
409
- assert.deepStrictEqual(result.matchedRule, "<no-match>", "matchedRule is '<no-match>' on fallback");
410
+ assertEq(result.action, "stop", "result is a stop action");
411
+ assertEq(result.matchedRule, "<no-match>", "matchedRule is '<no-match>' on fallback");
410
412
  });
411
413
  });