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
@@ -1,5 +1,3 @@
1
- import { describe, test } from 'node:test';
2
- import assert from 'node:assert/strict';
3
1
  import { mkdtempSync, mkdirSync, rmSync, writeFileSync, existsSync, readFileSync } from 'node:fs';
4
2
  import { join } from 'node:path';
5
3
  import { tmpdir } from 'node:os';
@@ -8,7 +6,26 @@ import { deriveState, invalidateStateCache, getActiveMilestoneId } from '../stat
8
6
  import { clearPathCache } from '../paths.ts';
9
7
  import { parkMilestone, unparkMilestone, discardMilestone, isParked, getParkedReason } from '../milestone-actions.ts';
10
8
 
9
+ let passed = 0;
10
+ let failed = 0;
11
11
 
12
+ function assert(condition: boolean, message: string): void {
13
+ if (condition) {
14
+ passed++;
15
+ } else {
16
+ failed++;
17
+ console.error(` FAIL: ${message}`);
18
+ }
19
+ }
20
+
21
+ function assertEq<T>(actual: T, expected: T, message: string): void {
22
+ if (JSON.stringify(actual) === JSON.stringify(expected)) {
23
+ passed++;
24
+ } else {
25
+ failed++;
26
+ console.error(` FAIL: ${message} — expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`);
27
+ }
28
+ }
12
29
 
13
30
  // ─── Fixture Helpers ───────────────────────────────────────────────────────
14
31
 
@@ -72,28 +89,30 @@ function clearCaches(): void {
72
89
  // Tests
73
90
  // ═══════════════════════════════════════════════════════════════════════════
74
91
 
75
- // ─── Test 1: parkMilestone creates PARKED.md ──────────────────────────
92
+ async function main(): Promise<void> {
76
93
 
77
- describe('park-milestone', () => {
78
- test('parkMilestone creates PARKED.md', () => {
94
+ // ─── Test 1: parkMilestone creates PARKED.md ──────────────────────────
95
+ console.log('\n=== parkMilestone creates PARKED.md ===');
96
+ {
79
97
  const base = createFixtureBase();
80
98
  try {
81
99
  createMilestone(base, 'M001', { withRoadmap: true });
82
100
  clearCaches();
83
101
 
84
102
  const success = parkMilestone(base, 'M001', 'Priority shift');
85
- assert.ok(success, 'parkMilestone returns true');
86
- assert.ok(isParked(base, 'M001'), 'isParked returns true after parking');
103
+ assert(success, 'parkMilestone returns true');
104
+ assert(isParked(base, 'M001'), 'isParked returns true after parking');
87
105
 
88
106
  const reason = getParkedReason(base, 'M001');
89
- assert.deepStrictEqual(reason, 'Priority shift', 'reason matches');
107
+ assertEq(reason, 'Priority shift', 'reason matches');
90
108
  } finally {
91
109
  cleanup(base);
92
110
  }
93
- });
111
+ }
94
112
 
95
113
  // ─── Test 2: parkMilestone is idempotent — fails if already parked ────
96
- test('parkMilestone fails if already parked', () => {
114
+ console.log('\n=== parkMilestone fails if already parked ===');
115
+ {
97
116
  const base = createFixtureBase();
98
117
  try {
99
118
  createMilestone(base, 'M001', { withRoadmap: true });
@@ -101,47 +120,50 @@ test('parkMilestone fails if already parked', () => {
101
120
 
102
121
  parkMilestone(base, 'M001', 'First park');
103
122
  const secondPark = parkMilestone(base, 'M001', 'Second park');
104
- assert.ok(!secondPark, 'second parkMilestone returns false');
105
- assert.deepStrictEqual(getParkedReason(base, 'M001'), 'First park', 'reason unchanged from first park');
123
+ assert(!secondPark, 'second parkMilestone returns false');
124
+ assertEq(getParkedReason(base, 'M001'), 'First park', 'reason unchanged from first park');
106
125
  } finally {
107
126
  cleanup(base);
108
127
  }
109
- });
128
+ }
110
129
 
111
130
  // ─── Test 3: unparkMilestone removes PARKED.md ────────────────────────
112
- test('unparkMilestone removes PARKED.md', () => {
131
+ console.log('\n=== unparkMilestone removes PARKED.md ===');
132
+ {
113
133
  const base = createFixtureBase();
114
134
  try {
115
135
  createMilestone(base, 'M001', { withRoadmap: true });
116
136
  clearCaches();
117
137
 
118
138
  parkMilestone(base, 'M001', 'Test reason');
119
- assert.ok(isParked(base, 'M001'), 'milestone is parked');
139
+ assert(isParked(base, 'M001'), 'milestone is parked');
120
140
 
121
141
  const success = unparkMilestone(base, 'M001');
122
- assert.ok(success, 'unparkMilestone returns true');
123
- assert.ok(!isParked(base, 'M001'), 'isParked returns false after unpark');
142
+ assert(success, 'unparkMilestone returns true');
143
+ assert(!isParked(base, 'M001'), 'isParked returns false after unpark');
124
144
  } finally {
125
145
  cleanup(base);
126
146
  }
127
- });
147
+ }
128
148
 
129
149
  // ─── Test 4: unparkMilestone fails if not parked ──────────────────────
130
- test('unparkMilestone fails if not parked', () => {
150
+ console.log('\n=== unparkMilestone fails if not parked ===');
151
+ {
131
152
  const base = createFixtureBase();
132
153
  try {
133
154
  createMilestone(base, 'M001', { withRoadmap: true });
134
155
  clearCaches();
135
156
 
136
157
  const result = unparkMilestone(base, 'M001');
137
- assert.ok(!result, 'unparkMilestone returns false when not parked');
158
+ assert(!result, 'unparkMilestone returns false when not parked');
138
159
  } finally {
139
160
  cleanup(base);
140
161
  }
141
- });
162
+ }
142
163
 
143
164
  // ─── Test 5: deriveState returns 'parked' status ──────────────────────
144
- test('deriveState returns parked status', async () => {
165
+ console.log('\n=== deriveState returns parked status ===');
166
+ {
145
167
  const base = createFixtureBase();
146
168
  try {
147
169
  createMilestone(base, 'M001', { withRoadmap: true });
@@ -151,15 +173,16 @@ test('deriveState returns parked status', async () => {
151
173
 
152
174
  const state = await deriveState(base);
153
175
  const entry = state.registry.find(e => e.id === 'M001');
154
- assert.ok(!!entry, 'M001 in registry');
155
- assert.deepStrictEqual(entry?.status, 'parked', 'status is parked');
176
+ assert(!!entry, 'M001 in registry');
177
+ assertEq(entry?.status, 'parked', 'status is parked');
156
178
  } finally {
157
179
  cleanup(base);
158
180
  }
159
- });
181
+ }
160
182
 
161
183
  // ─── Test 6: deriveState skips parked milestone for active ─────────────
162
- test('deriveState skips parked milestone', async () => {
184
+ console.log('\n=== deriveState skips parked milestone ===');
185
+ {
163
186
  const base = createFixtureBase();
164
187
  try {
165
188
  createMilestone(base, 'M001', { withRoadmap: true });
@@ -168,28 +191,29 @@ test('deriveState skips parked milestone', async () => {
168
191
 
169
192
  // Before park: M001 is active
170
193
  const stateBefore = await deriveState(base);
171
- assert.deepStrictEqual(stateBefore.activeMilestone?.id, 'M001', 'before park: M001 is active');
194
+ assertEq(stateBefore.activeMilestone?.id, 'M001', 'before park: M001 is active');
172
195
 
173
196
  parkMilestone(base, 'M001', 'Testing');
174
197
 
175
198
  // After park: M002 becomes active
176
199
  const stateAfter = await deriveState(base);
177
- assert.deepStrictEqual(stateAfter.activeMilestone?.id, 'M002', 'after park: M002 is active');
200
+ assertEq(stateAfter.activeMilestone?.id, 'M002', 'after park: M002 is active');
178
201
 
179
202
  // M001 still in registry as parked
180
203
  const m001 = stateAfter.registry.find(e => e.id === 'M001');
181
- assert.deepStrictEqual(m001?.status, 'parked', 'M001 has parked status');
204
+ assertEq(m001?.status, 'parked', 'M001 has parked status');
182
205
 
183
206
  // M002 is active
184
207
  const m002 = stateAfter.registry.find(e => e.id === 'M002');
185
- assert.deepStrictEqual(m002?.status, 'active', 'M002 has active status');
208
+ assertEq(m002?.status, 'active', 'M002 has active status');
186
209
  } finally {
187
210
  cleanup(base);
188
211
  }
189
- });
212
+ }
190
213
 
191
214
  // ─── Test 7: getActiveMilestoneId skips parked ────────────────────────
192
- test('getActiveMilestoneId skips parked', async () => {
215
+ console.log('\n=== getActiveMilestoneId skips parked ===');
216
+ {
193
217
  const base = createFixtureBase();
194
218
  try {
195
219
  createMilestone(base, 'M001', { withRoadmap: true });
@@ -199,14 +223,15 @@ test('getActiveMilestoneId skips parked', async () => {
199
223
  parkMilestone(base, 'M001', 'Testing');
200
224
 
201
225
  const activeId = await getActiveMilestoneId(base);
202
- assert.deepStrictEqual(activeId, 'M002', 'getActiveMilestoneId returns M002');
226
+ assertEq(activeId, 'M002', 'getActiveMilestoneId returns M002');
203
227
  } finally {
204
228
  cleanup(base);
205
229
  }
206
- });
230
+ }
207
231
 
208
232
  // ─── Test 8: Parked milestone does NOT satisfy depends_on ─────────────
209
- test('Parked milestone does not satisfy depends_on', async () => {
233
+ console.log('\n=== Parked milestone does not satisfy depends_on ===');
234
+ {
210
235
  const base = createFixtureBase();
211
236
  try {
212
237
  createMilestone(base, 'M001', { withRoadmap: true });
@@ -218,17 +243,18 @@ test('Parked milestone does not satisfy depends_on', async () => {
218
243
  const state = await deriveState(base);
219
244
  // M001 is parked, M002 depends on M001 → M002 should be pending, not active
220
245
  const m002 = state.registry.find(e => e.id === 'M002');
221
- assert.deepStrictEqual(m002?.status, 'pending', 'M002 stays pending when M001 is parked');
246
+ assertEq(m002?.status, 'pending', 'M002 stays pending when M001 is parked');
222
247
 
223
248
  // No active milestone (both are blocked/parked)
224
- assert.deepStrictEqual(state.activeMilestone, null, 'no active milestone');
249
+ assertEq(state.activeMilestone, null, 'no active milestone');
225
250
  } finally {
226
251
  cleanup(base);
227
252
  }
228
- });
253
+ }
229
254
 
230
255
  // ─── Test 9: Park then unpark restores correct status ─────────────────
231
- test('Park then unpark restores status', async () => {
256
+ console.log('\n=== Park then unpark restores status ===');
257
+ {
232
258
  const base = createFixtureBase();
233
259
  try {
234
260
  createMilestone(base, 'M001', { withRoadmap: true });
@@ -238,41 +264,43 @@ test('Park then unpark restores status', async () => {
238
264
  // Park M001
239
265
  parkMilestone(base, 'M001', 'Testing');
240
266
  const stateParked = await deriveState(base);
241
- assert.deepStrictEqual(stateParked.activeMilestone?.id, 'M002', 'while parked: M002 is active');
267
+ assertEq(stateParked.activeMilestone?.id, 'M002', 'while parked: M002 is active');
242
268
 
243
269
  // Unpark M001 — M001 should become active again (it's first in queue)
244
270
  unparkMilestone(base, 'M001');
245
271
  const stateUnparked = await deriveState(base);
246
- assert.deepStrictEqual(stateUnparked.activeMilestone?.id, 'M001', 'after unpark: M001 is active again');
247
- assert.deepStrictEqual(stateUnparked.registry.find(e => e.id === 'M001')?.status, 'active', 'M001 is active status');
272
+ assertEq(stateUnparked.activeMilestone?.id, 'M001', 'after unpark: M001 is active again');
273
+ assertEq(stateUnparked.registry.find(e => e.id === 'M001')?.status, 'active', 'M001 is active status');
248
274
  } finally {
249
275
  cleanup(base);
250
276
  }
251
- });
277
+ }
252
278
 
253
279
  // ─── Test 10: discardMilestone removes directory ──────────────────────
254
- test('discardMilestone removes directory', async () => {
280
+ console.log('\n=== discardMilestone removes directory ===');
281
+ {
255
282
  const base = createFixtureBase();
256
283
  try {
257
284
  createMilestone(base, 'M001', { withRoadmap: true });
258
285
  clearCaches();
259
286
 
260
287
  const mDir = join(base, '.gsd', 'milestones', 'M001');
261
- assert.ok(existsSync(mDir), 'milestone dir exists before discard');
288
+ assert(existsSync(mDir), 'milestone dir exists before discard');
262
289
 
263
290
  const success = discardMilestone(base, 'M001');
264
- assert.ok(success, 'discardMilestone returns true');
265
- assert.ok(!existsSync(mDir), 'milestone dir removed after discard');
291
+ assert(success, 'discardMilestone returns true');
292
+ assert(!existsSync(mDir), 'milestone dir removed after discard');
266
293
 
267
294
  const state = await deriveState(base);
268
- assert.ok(!state.registry.some(e => e.id === 'M001'), 'M001 not in registry after discard');
295
+ assert(!state.registry.some(e => e.id === 'M001'), 'M001 not in registry after discard');
269
296
  } finally {
270
297
  cleanup(base);
271
298
  }
272
- });
299
+ }
273
300
 
274
301
  // ─── Test 11: discardMilestone updates queue order ────────────────────
275
- test('discardMilestone updates queue order', () => {
302
+ console.log('\n=== discardMilestone updates queue order ===');
303
+ {
276
304
  const base = createFixtureBase();
277
305
  try {
278
306
  createMilestone(base, 'M001', { withRoadmap: true });
@@ -287,15 +315,16 @@ test('discardMilestone updates queue order', () => {
287
315
 
288
316
  // Queue order should no longer include M001
289
317
  const queueContent = JSON.parse(readFileSync(queuePath, 'utf-8'));
290
- assert.ok(!queueContent.order.includes('M001'), 'M001 removed from queue order');
291
- assert.ok(queueContent.order.includes('M002'), 'M002 still in queue order');
318
+ assert(!queueContent.order.includes('M001'), 'M001 removed from queue order');
319
+ assert(queueContent.order.includes('M002'), 'M002 still in queue order');
292
320
  } finally {
293
321
  cleanup(base);
294
322
  }
295
- });
323
+ }
296
324
 
297
325
  // ─── Test 12: All milestones parked → no active milestone ─────────────
298
- test('All milestones parked → no active', async () => {
326
+ console.log('\n=== All milestones parked → no active ===');
327
+ {
299
328
  const base = createFixtureBase();
300
329
  try {
301
330
  createMilestone(base, 'M001', { withRoadmap: true });
@@ -304,17 +333,18 @@ test('All milestones parked → no active', async () => {
304
333
  parkMilestone(base, 'M001', 'Testing');
305
334
 
306
335
  const state = await deriveState(base);
307
- assert.deepStrictEqual(state.activeMilestone, null, 'no active milestone when all parked');
308
- assert.deepStrictEqual(state.phase, 'pre-planning', 'phase is pre-planning');
309
- assert.ok(state.registry.length === 1, 'registry still has 1 entry');
310
- assert.deepStrictEqual(state.registry[0]?.status, 'parked', 'entry is parked');
336
+ assertEq(state.activeMilestone, null, 'no active milestone when all parked');
337
+ assertEq(state.phase, 'pre-planning', 'phase is pre-planning');
338
+ assert(state.registry.length === 1, 'registry still has 1 entry');
339
+ assertEq(state.registry[0]?.status, 'parked', 'entry is parked');
311
340
  } finally {
312
341
  cleanup(base);
313
342
  }
314
- });
343
+ }
315
344
 
316
345
  // ─── Test 13: Parked milestone without roadmap ────────────────────────
317
- test('Park milestone without roadmap', async () => {
346
+ console.log('\n=== Park milestone without roadmap ===');
347
+ {
318
348
  const base = createFixtureBase();
319
349
  try {
320
350
  createMilestone(base, 'M001'); // No roadmap
@@ -324,15 +354,16 @@ test('Park milestone without roadmap', async () => {
324
354
  parkMilestone(base, 'M001', 'Not ready yet');
325
355
 
326
356
  const state = await deriveState(base);
327
- assert.deepStrictEqual(state.activeMilestone?.id, 'M002', 'M002 is active when M001 (no roadmap) is parked');
328
- assert.deepStrictEqual(state.registry.find(e => e.id === 'M001')?.status, 'parked', 'M001 is parked');
357
+ assertEq(state.activeMilestone?.id, 'M002', 'M002 is active when M001 (no roadmap) is parked');
358
+ assertEq(state.registry.find(e => e.id === 'M001')?.status, 'parked', 'M001 is parked');
329
359
  } finally {
330
360
  cleanup(base);
331
361
  }
332
- });
362
+ }
333
363
 
334
364
  // ─── Test 14: Progress counts with parked milestone ───────────────────
335
- test('Progress counts with parked', async () => {
365
+ console.log('\n=== Progress counts with parked ===');
366
+ {
336
367
  const base = createFixtureBase();
337
368
  try {
338
369
  createMilestone(base, 'M001', { withRoadmap: true, withSummary: true }); // complete
@@ -343,12 +374,28 @@ test('Progress counts with parked', async () => {
343
374
  parkMilestone(base, 'M002', 'Parked');
344
375
 
345
376
  const state = await deriveState(base);
346
- assert.deepStrictEqual(state.progress?.milestones.done, 1, '1 complete milestone');
347
- assert.deepStrictEqual(state.progress?.milestones.total, 3, '3 total milestones (including parked)');
348
- assert.deepStrictEqual(state.activeMilestone?.id, 'M003', 'M003 is active');
377
+ assertEq(state.progress?.milestones.done, 1, '1 complete milestone');
378
+ assertEq(state.progress?.milestones.total, 3, '3 total milestones (including parked)');
379
+ assertEq(state.activeMilestone?.id, 'M003', 'M003 is active');
349
380
  } finally {
350
381
  cleanup(base);
351
382
  }
352
- });
383
+ }
384
+
385
+ // ═══════════════════════════════════════════════════════════════════════════
386
+ // Results
387
+ // ═══════════════════════════════════════════════════════════════════════════
388
+
389
+ console.log(`\n${'='.repeat(40)}`);
390
+ console.log(`Results: ${passed} passed, ${failed} failed`);
391
+ if (failed > 0) {
392
+ process.exit(1);
393
+ } else {
394
+ console.log('All tests passed ✓');
395
+ }
396
+ }
353
397
 
398
+ main().catch((error) => {
399
+ console.error(error);
400
+ process.exit(1);
354
401
  });