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
  /**
4
2
  * doctor-runtime.test.ts — Tests for doctor runtime health checks.
5
3
  *
@@ -15,6 +13,10 @@ import { tmpdir } from "node:os";
15
13
  import { execSync } from "node:child_process";
16
14
 
17
15
  import { runGSDDoctor } from "../doctor.ts";
16
+ import { createTestContext } from "./test-helpers.ts";
17
+
18
+ const { assertEq, assertTrue, report } = createTestContext();
19
+
18
20
  function run(cmd: string, cwd: string): string {
19
21
  return execSync(cmd, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
20
22
  }
@@ -55,12 +57,13 @@ function createGitProject(): string {
55
57
  return dir;
56
58
  }
57
59
 
58
- describe('doctor-runtime', async () => {
60
+ async function main(): Promise<void> {
59
61
  const cleanups: string[] = [];
60
62
 
61
63
  try {
62
64
  // ─── Test 1: Stale crash lock detection & fix ─────────────────────
63
- test('stale_crash_lock', async () => {
65
+ console.log("\n=== stale_crash_lock ===");
66
+ {
64
67
  const dir = createMinimalProject();
65
68
  cleanups.push(dir);
66
69
 
@@ -77,27 +80,29 @@ describe('doctor-runtime', async () => {
77
80
 
78
81
  const detect = await runGSDDoctor(dir);
79
82
  const lockIssues = detect.issues.filter(i => i.code === "stale_crash_lock");
80
- assert.ok(lockIssues.length > 0, "detects stale crash lock");
81
- assert.ok(lockIssues[0]?.message.includes("9999999"), "message includes PID");
82
- assert.ok(lockIssues[0]?.fixable === true, "stale lock is fixable");
83
+ assertTrue(lockIssues.length > 0, "detects stale crash lock");
84
+ assertTrue(lockIssues[0]?.message.includes("9999999"), "message includes PID");
85
+ assertTrue(lockIssues[0]?.fixable === true, "stale lock is fixable");
83
86
 
84
87
  const fixed = await runGSDDoctor(dir, { fix: true });
85
- assert.ok(fixed.fixesApplied.some(f => f.includes("cleared stale auto.lock")), "fix clears stale lock");
86
- assert.ok(!existsSync(join(dir, ".gsd", "auto.lock")), "auto.lock removed after fix");
87
- });
88
+ assertTrue(fixed.fixesApplied.some(f => f.includes("cleared stale auto.lock")), "fix clears stale lock");
89
+ assertTrue(!existsSync(join(dir, ".gsd", "auto.lock")), "auto.lock removed after fix");
90
+ }
88
91
 
89
92
  // ─── Test 2: No false positive for missing lock ───────────────────
90
- test('stale_crash_lock — no false positive', async () => {
93
+ console.log("\n=== stale_crash_lock — no false positive ===");
94
+ {
91
95
  const dir = createMinimalProject();
92
96
  cleanups.push(dir);
93
97
 
94
98
  const detect = await runGSDDoctor(dir);
95
99
  const lockIssues = detect.issues.filter(i => i.code === "stale_crash_lock");
96
- assert.deepStrictEqual(lockIssues.length, 0, "no stale lock issue when no lock file exists");
97
- });
100
+ assertEq(lockIssues.length, 0, "no stale lock issue when no lock file exists");
101
+ }
98
102
 
99
103
  // ─── Test 3: Stale hook state detection & fix ─────────────────────
100
- test('stale_hook_state', async () => {
104
+ console.log("\n=== stale_hook_state ===");
105
+ {
101
106
  const dir = createMinimalProject();
102
107
  cleanups.push(dir);
103
108
 
@@ -113,19 +118,20 @@ describe('doctor-runtime', async () => {
113
118
 
114
119
  const detect = await runGSDDoctor(dir);
115
120
  const hookIssues = detect.issues.filter(i => i.code === "stale_hook_state");
116
- assert.ok(hookIssues.length > 0, "detects stale hook state");
117
- assert.ok(hookIssues[0]?.message.includes("2 residual cycle count"), "message includes count");
121
+ assertTrue(hookIssues.length > 0, "detects stale hook state");
122
+ assertTrue(hookIssues[0]?.message.includes("2 residual cycle count"), "message includes count");
118
123
 
119
124
  const fixed = await runGSDDoctor(dir, { fix: true });
120
- assert.ok(fixed.fixesApplied.some(f => f.includes("cleared stale hook-state.json")), "fix clears hook state");
125
+ assertTrue(fixed.fixesApplied.some(f => f.includes("cleared stale hook-state.json")), "fix clears hook state");
121
126
 
122
127
  // Verify the file was cleaned
123
128
  const content = JSON.parse(readFileSync(join(dir, ".gsd", "hook-state.json"), "utf-8"));
124
- assert.deepStrictEqual(Object.keys(content.cycleCounts).length, 0, "hook state cycle counts cleared");
125
- });
129
+ assertEq(Object.keys(content.cycleCounts).length, 0, "hook state cycle counts cleared");
130
+ }
126
131
 
127
132
  // ─── Test 4: Activity log bloat detection ─────────────────────────
128
- test('activity_log_bloat', async () => {
133
+ console.log("\n=== activity_log_bloat ===");
134
+ {
129
135
  const dir = createMinimalProject();
130
136
  cleanups.push(dir);
131
137
 
@@ -138,37 +144,39 @@ describe('doctor-runtime', async () => {
138
144
 
139
145
  const detect = await runGSDDoctor(dir);
140
146
  const bloatIssues = detect.issues.filter(i => i.code === "activity_log_bloat");
141
- assert.ok(bloatIssues.length > 0, "detects activity log bloat");
142
- assert.ok(bloatIssues[0]?.message.includes("510 files"), "message includes file count");
143
- });
147
+ assertTrue(bloatIssues.length > 0, "detects activity log bloat");
148
+ assertTrue(bloatIssues[0]?.message.includes("510 files"), "message includes file count");
149
+ }
144
150
 
145
151
  // ─── Test 5: STATE.md missing detection & fix ─────────────────────
146
- test('state_file_missing', async () => {
152
+ console.log("\n=== state_file_missing ===");
153
+ {
147
154
  const dir = createMinimalProject();
148
155
  cleanups.push(dir);
149
156
 
150
157
  // No STATE.md exists by default in our minimal setup
151
158
  const stateFilePath = join(dir, ".gsd", "STATE.md");
152
- assert.ok(!existsSync(stateFilePath), "STATE.md does not exist initially");
159
+ assertTrue(!existsSync(stateFilePath), "STATE.md does not exist initially");
153
160
 
154
161
  const detect = await runGSDDoctor(dir);
155
162
  const stateIssues = detect.issues.filter(i => i.code === "state_file_missing");
156
- assert.ok(stateIssues.length > 0, "detects missing STATE.md");
157
- assert.ok(stateIssues[0]?.fixable === true, "missing STATE.md is fixable");
158
- assert.deepStrictEqual(stateIssues[0]?.severity, "warning", "missing STATE.md is a warning (derived file)");
163
+ assertTrue(stateIssues.length > 0, "detects missing STATE.md");
164
+ assertTrue(stateIssues[0]?.fixable === true, "missing STATE.md is fixable");
165
+ assertEq(stateIssues[0]?.severity, "warning", "missing STATE.md is a warning (derived file)");
159
166
 
160
167
  const fixed = await runGSDDoctor(dir, { fix: true });
161
- assert.ok(fixed.fixesApplied.some(f => f.includes("created STATE.md")), "fix creates STATE.md");
162
- assert.ok(existsSync(stateFilePath), "STATE.md exists after fix");
168
+ assertTrue(fixed.fixesApplied.some(f => f.includes("created STATE.md")), "fix creates STATE.md");
169
+ assertTrue(existsSync(stateFilePath), "STATE.md exists after fix");
163
170
 
164
171
  // Verify content has expected structure
165
172
  const content = readFileSync(stateFilePath, "utf-8");
166
- assert.ok(content.includes("# GSD State"), "STATE.md has header");
167
- assert.ok(content.includes("M001"), "STATE.md references milestone");
168
- });
173
+ assertTrue(content.includes("# GSD State"), "STATE.md has header");
174
+ assertTrue(content.includes("M001"), "STATE.md references milestone");
175
+ }
169
176
 
170
177
  // ─── Test 6: STATE.md stale detection & fix ───────────────────────
171
- test('state_file_stale', async () => {
178
+ console.log("\n=== state_file_stale ===");
179
+ {
172
180
  const dir = createMinimalProject();
173
181
  cleanups.push(dir);
174
182
 
@@ -194,20 +202,21 @@ None
194
202
 
195
203
  const detect = await runGSDDoctor(dir);
196
204
  const staleIssues = detect.issues.filter(i => i.code === "state_file_stale");
197
- assert.ok(staleIssues.length > 0, "detects stale STATE.md");
198
- assert.ok(staleIssues[0]?.message.includes("idle"), "message references old phase");
205
+ assertTrue(staleIssues.length > 0, "detects stale STATE.md");
206
+ assertTrue(staleIssues[0]?.message.includes("idle"), "message references old phase");
199
207
 
200
208
  const fixed = await runGSDDoctor(dir, { fix: true });
201
- assert.ok(fixed.fixesApplied.some(f => f.includes("rebuilt STATE.md")), "fix rebuilds STATE.md");
209
+ assertTrue(fixed.fixesApplied.some(f => f.includes("rebuilt STATE.md")), "fix rebuilds STATE.md");
202
210
 
203
211
  // Verify updated content matches derived state
204
212
  const content = readFileSync(stateFilePath, "utf-8");
205
- assert.ok(content.includes("M001"), "rebuilt STATE.md references milestone");
206
- });
213
+ assertTrue(content.includes("M001"), "rebuilt STATE.md references milestone");
214
+ }
207
215
 
208
216
  // ─── Test 7: Gitignore missing patterns detection & fix ───────────
209
217
  if (process.platform !== "win32") {
210
- test('gitignore_missing_patterns', async () => {
218
+ console.log("\n=== gitignore_missing_patterns ===");
219
+ {
211
220
  const dir = createGitProject();
212
221
  cleanups.push(dir);
213
222
 
@@ -221,22 +230,24 @@ None
221
230
 
222
231
  const detect = await runGSDDoctor(dir);
223
232
  const gitignoreIssues = detect.issues.filter(i => i.code === "gitignore_missing_patterns");
224
- assert.ok(gitignoreIssues.length > 0, "detects missing gitignore patterns");
225
- assert.ok(gitignoreIssues[0]?.message.includes(".gsd"), "message lists missing .gsd pattern");
233
+ assertTrue(gitignoreIssues.length > 0, "detects missing gitignore patterns");
234
+ assertTrue(gitignoreIssues[0]?.message.includes(".gsd"), "message lists missing .gsd pattern");
226
235
 
227
236
  const fixed = await runGSDDoctor(dir, { fix: true });
228
- assert.ok(fixed.fixesApplied.some(f => f.includes("added missing GSD runtime patterns")), "fix adds patterns");
237
+ assertTrue(fixed.fixesApplied.some(f => f.includes("added missing GSD runtime patterns")), "fix adds patterns");
229
238
 
230
239
  // Verify .gsd entry was added (external state symlink)
231
240
  const content = readFileSync(join(dir, ".gitignore"), "utf-8");
232
- assert.ok(content.includes(".gsd"), "gitignore now has .gsd entry");
233
- });
241
+ assertTrue(content.includes(".gsd"), "gitignore now has .gsd entry");
242
+ }
234
243
  } else {
244
+ console.log("\n=== gitignore_missing_patterns (skipped on Windows) ===");
235
245
  }
236
246
 
237
247
  // ─── Test 8: No false positive when gitignore has blanket .gsd/ ───
238
248
  if (process.platform !== "win32") {
239
- test('gitignore — blanket .gsd/', async () => {
249
+ console.log("\n=== gitignore — blanket .gsd/ ===");
250
+ {
240
251
  const dir = createGitProject();
241
252
  cleanups.push(dir);
242
253
 
@@ -247,13 +258,15 @@ node_modules/
247
258
 
248
259
  const detect = await runGSDDoctor(dir);
249
260
  const gitignoreIssues = detect.issues.filter(i => i.code === "gitignore_missing_patterns");
250
- assert.deepStrictEqual(gitignoreIssues.length, 0, "no missing patterns when blanket .gsd/ present");
251
- });
261
+ assertEq(gitignoreIssues.length, 0, "no missing patterns when blanket .gsd/ present");
262
+ }
252
263
  } else {
264
+ console.log("\n=== gitignore — blanket .gsd/ (skipped on Windows) ===");
253
265
  }
254
266
 
255
267
  // ─── Test 9: Orphaned completed-units detection & fix ─────────────
256
- test('orphaned_completed_units', async () => {
268
+ console.log("\n=== orphaned_completed_units ===");
269
+ {
257
270
  const dir = createMinimalProject();
258
271
  cleanups.push(dir);
259
272
 
@@ -266,23 +279,24 @@ node_modules/
266
279
 
267
280
  const detect = await runGSDDoctor(dir);
268
281
  const orphanIssues = detect.issues.filter(i => i.code === "orphaned_completed_units");
269
- assert.ok(orphanIssues.length > 0, "detects orphaned completed-unit keys");
270
- assert.ok(orphanIssues[0]?.message.includes("2 completed-unit key"), "message includes count");
282
+ assertTrue(orphanIssues.length > 0, "detects orphaned completed-unit keys");
283
+ assertTrue(orphanIssues[0]?.message.includes("2 completed-unit key"), "message includes count");
271
284
 
272
285
  const fixed = await runGSDDoctor(dir, { fix: true });
273
- assert.ok(fixed.fixesApplied.some(f => f.includes("removed") && f.includes("orphaned")), "fix removes orphaned keys");
286
+ assertTrue(fixed.fixesApplied.some(f => f.includes("removed") && f.includes("orphaned")), "fix removes orphaned keys");
274
287
 
275
288
  // Verify keys were cleaned
276
289
  const content = JSON.parse(readFileSync(join(dir, ".gsd", "completed-units.json"), "utf-8"));
277
- assert.deepStrictEqual(content.length, 0, "all orphaned keys removed");
278
- });
290
+ assertEq(content.length, 0, "all orphaned keys removed");
291
+ }
279
292
 
280
293
  // ─── Test: Stranded lock directory detection & fix ────────────────
281
294
  // Skip on Windows: proper-lockfile uses advisory file locking on Windows,
282
295
  // not the directory-based mechanism. The .gsd.lock/ directory pattern is
283
296
  // a POSIX-specific lockfile implementation detail.
284
297
  if (process.platform !== "win32") {
285
- test('stranded_lock_directory', async () => {
298
+ console.log("\n=== stranded_lock_directory ===");
299
+ {
286
300
  const dir = createMinimalProject();
287
301
  cleanups.push(dir);
288
302
 
@@ -293,20 +307,21 @@ node_modules/
293
307
 
294
308
  const detect = await runGSDDoctor(dir);
295
309
  const strandedIssues = detect.issues.filter(i => i.code === "stranded_lock_directory");
296
- assert.ok(strandedIssues.length > 0, "detects stranded lock directory");
297
- assert.ok(strandedIssues[0]?.message.includes("lock directory"), "message describes stranded lock directory");
298
- assert.ok(strandedIssues[0]?.fixable === true, "stranded lock dir is fixable");
310
+ assertTrue(strandedIssues.length > 0, "detects stranded lock directory");
311
+ assertTrue(strandedIssues[0]?.message.includes("lock directory"), "message describes stranded lock directory");
312
+ assertTrue(strandedIssues[0]?.fixable === true, "stranded lock dir is fixable");
299
313
 
300
314
  const fixed = await runGSDDoctor(dir, { fix: true });
301
- assert.ok(
315
+ assertTrue(
302
316
  fixed.fixesApplied.some(f => f.includes("removed stranded lock directory")),
303
317
  "fix removes stranded lock directory",
304
318
  );
305
- assert.ok(!existsSync(lockDir), "lock directory removed after fix");
306
- });
319
+ assertTrue(!existsSync(lockDir), "lock directory removed after fix");
320
+ }
307
321
 
308
322
  // ─── Test: Stranded lock dir with live lock holder — NOT flagged ───
309
- test('stranded_lock_directory (live holder not flagged)', async () => {
323
+ console.log("\n=== stranded_lock_directory (live holder not flagged) ===");
324
+ {
310
325
  const dir = createMinimalProject();
311
326
  cleanups.push(dir);
312
327
 
@@ -325,16 +340,18 @@ node_modules/
325
340
 
326
341
  const detect = await runGSDDoctor(dir);
327
342
  const strandedIssues = detect.issues.filter(i => i.code === "stranded_lock_directory");
328
- assert.deepStrictEqual(strandedIssues.length, 0, "live lock holder: stranded_lock_directory NOT detected");
329
- });
343
+ assertEq(strandedIssues.length, 0, "live lock holder: stranded_lock_directory NOT detected");
344
+ }
330
345
  } else {
346
+ console.log("\n=== stranded_lock_directory (skipped on Windows) ===");
331
347
  }
332
348
 
333
349
  // ─── Test: orphaned_completed_units NOT auto-fixed at fixLevel="task" (#1809) ──
334
350
  // Regression: task-level doctor was removing completed-unit keys whose artifacts
335
351
  // were temporarily missing, causing deriveState to revert the user to S01 and
336
352
  // effectively discarding hours of work.
337
- test('orphaned_completed_units protected at fixLevel=task (#1809)', async () => {
353
+ console.log("\n=== orphaned_completed_units protected at fixLevel=task (#1809) ===");
354
+ {
338
355
  const dir = createMinimalProject();
339
356
  cleanups.push(dir);
340
357
 
@@ -349,29 +366,33 @@ node_modules/
349
366
  // fixLevel="task" — the level used by auto-post-unit after every task
350
367
  const taskLevelFix = await runGSDDoctor(dir, { fix: true, fixLevel: "task" });
351
368
  const taskLevelOrphan = taskLevelFix.issues.filter(i => i.code === "orphaned_completed_units");
352
- assert.ok(taskLevelOrphan.length > 0, "orphaned_completed_units detected at task fixLevel");
369
+ assertTrue(taskLevelOrphan.length > 0, "orphaned_completed_units detected at task fixLevel");
353
370
 
354
371
  // Verify keys were NOT removed — the fix must be suppressed at task level
355
372
  const afterTaskFix = JSON.parse(readFileSync(join(dir, ".gsd", "completed-units.json"), "utf-8"));
356
- assert.deepStrictEqual(afterTaskFix.length, 2, "completed-unit keys preserved at fixLevel=task (data loss prevention)");
357
- assert.ok(
373
+ assertEq(afterTaskFix.length, 2, "completed-unit keys preserved at fixLevel=task (data loss prevention)");
374
+ assertTrue(
358
375
  !taskLevelFix.fixesApplied.some(f => f.includes("orphaned")),
359
376
  "no orphaned-units fix applied at fixLevel=task",
360
377
  );
361
378
 
362
379
  // fixLevel="all" (explicit manual doctor) — fix SHOULD apply
363
380
  const allLevelFix = await runGSDDoctor(dir, { fix: true, fixLevel: "all" });
364
- assert.ok(
381
+ assertTrue(
365
382
  allLevelFix.fixesApplied.some(f => f.includes("orphaned")),
366
383
  "orphaned-units fix applied at fixLevel=all (manual doctor)",
367
384
  );
368
385
  const afterAllFix = JSON.parse(readFileSync(join(dir, ".gsd", "completed-units.json"), "utf-8"));
369
- assert.deepStrictEqual(afterAllFix.length, 0, "orphaned keys removed at fixLevel=all");
370
- });
386
+ assertEq(afterAllFix.length, 0, "orphaned keys removed at fixLevel=all");
387
+ }
371
388
 
372
389
  } finally {
373
390
  for (const dir of cleanups) {
374
391
  try { rmSync(dir, { recursive: true, force: true }); } catch { /* ignore */ }
375
392
  }
376
393
  }
377
- });
394
+
395
+ report();
396
+ }
397
+
398
+ main();