gsd-pi 2.44.0-dev.62b5d6c → 2.44.0-dev.73f2fd5

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 (326) hide show
  1. package/README.md +30 -12
  2. package/dist/resources/extensions/gsd/auto/infra-errors.js +3 -0
  3. package/dist/resources/extensions/gsd/auto/phases.js +36 -36
  4. package/dist/resources/extensions/gsd/auto-prompts.js +24 -1
  5. package/dist/resources/extensions/gsd/auto-start.js +10 -0
  6. package/dist/resources/extensions/gsd/auto-timers.js +57 -3
  7. package/dist/resources/extensions/gsd/auto-worktree-sync.js +4 -0
  8. package/dist/resources/extensions/gsd/auto-worktree.js +9 -6
  9. package/dist/resources/extensions/gsd/auto.js +30 -3
  10. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +156 -0
  11. package/dist/resources/extensions/gsd/bootstrap/system-context.js +46 -12
  12. package/dist/resources/extensions/gsd/commands/catalog.js +6 -1
  13. package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -0
  14. package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
  15. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
  16. package/dist/resources/extensions/gsd/commands-mcp-status.js +187 -0
  17. package/dist/resources/extensions/gsd/db-writer.js +34 -16
  18. package/dist/resources/extensions/gsd/doctor.js +8 -0
  19. package/dist/resources/extensions/gsd/git-service.js +8 -3
  20. package/dist/resources/extensions/gsd/gsd-db.js +12 -1
  21. package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
  22. package/dist/resources/extensions/gsd/preferences.js +9 -1
  23. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +2 -4
  24. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  25. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
  26. package/dist/resources/extensions/gsd/prompts/replan-slice.md +3 -14
  27. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
  28. package/dist/resources/extensions/gsd/provider-error-pause.js +7 -0
  29. package/dist/resources/extensions/gsd/state.js +19 -2
  30. package/dist/resources/extensions/gsd/tools/plan-slice.js +1 -0
  31. package/dist/resources/extensions/gsd/tools/plan-task.js +1 -0
  32. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -0
  33. package/dist/resources/extensions/gsd/tools/validate-milestone.js +88 -0
  34. package/dist/resources/extensions/gsd/worktree-resolver.js +6 -0
  35. package/dist/resources/extensions/mcp-client/index.js +14 -0
  36. package/dist/web/standalone/.next/BUILD_ID +1 -1
  37. package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -17
  38. package/dist/web/standalone/.next/build-manifest.json +2 -2
  39. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  40. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  41. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  42. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  43. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  44. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  45. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  46. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  47. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  48. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  49. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  50. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  51. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  52. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  53. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  54. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  55. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  56. package/dist/web/standalone/.next/server/app/index.html +1 -1
  57. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  58. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  59. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  60. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  61. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  62. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  63. package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -17
  64. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  65. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  66. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  67. package/package.json +1 -1
  68. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +3 -1
  69. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  70. package/packages/pi-coding-agent/dist/core/auth-storage.js +15 -1
  71. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  72. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
  73. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  74. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +24 -26
  75. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  76. package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
  77. package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
  78. package/packages/pi-coding-agent/dist/core/local-model-check.d.ts +15 -0
  79. package/packages/pi-coding-agent/dist/core/local-model-check.d.ts.map +1 -0
  80. package/packages/pi-coding-agent/dist/core/local-model-check.js +41 -0
  81. package/packages/pi-coding-agent/dist/core/local-model-check.js.map +1 -0
  82. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +11 -0
  83. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  84. package/packages/pi-coding-agent/dist/core/model-registry.js +20 -1
  85. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  86. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +34 -44
  87. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
  88. package/packages/pi-coding-agent/dist/core/session-manager.test.js +30 -34
  89. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
  90. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  91. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  92. package/packages/pi-coding-agent/dist/core/settings-manager.js +6 -0
  93. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  94. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
  95. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
  96. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  97. package/packages/pi-coding-agent/dist/main.js +17 -0
  98. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  99. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts +2 -0
  100. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts.map +1 -0
  101. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js +32 -0
  102. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js.map +1 -0
  103. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +3 -1
  104. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  105. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +8 -1
  106. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  107. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  108. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  109. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +12 -0
  110. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  111. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts +15 -0
  112. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts.map +1 -0
  113. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js +40 -0
  114. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js.map +1 -0
  115. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  116. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +4 -1
  117. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  118. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +5 -2
  119. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  120. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +13 -2
  121. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  122. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  123. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +17 -8
  124. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  125. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  126. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +7 -3
  127. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  128. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
  129. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
  130. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
  131. package/packages/pi-coding-agent/src/core/auth-storage.ts +15 -1
  132. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
  133. package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
  134. package/packages/pi-coding-agent/src/core/local-model-check.ts +45 -0
  135. package/packages/pi-coding-agent/src/core/model-registry.ts +21 -1
  136. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
  137. package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
  138. package/packages/pi-coding-agent/src/core/settings-manager.ts +9 -0
  139. package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
  140. package/packages/pi-coding-agent/src/main.ts +19 -0
  141. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/timestamp.test.ts +38 -0
  142. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +10 -0
  143. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
  144. package/packages/pi-coding-agent/src/modes/interactive/components/timestamp.ts +48 -0
  145. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +3 -1
  146. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +18 -3
  147. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +16 -7
  148. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +8 -1
  149. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
  150. package/src/resources/extensions/gsd/auto/infra-errors.ts +3 -0
  151. package/src/resources/extensions/gsd/auto/phases.ts +45 -48
  152. package/src/resources/extensions/gsd/auto-prompts.ts +24 -1
  153. package/src/resources/extensions/gsd/auto-start.ts +14 -0
  154. package/src/resources/extensions/gsd/auto-timers.ts +64 -3
  155. package/src/resources/extensions/gsd/auto-worktree-sync.ts +5 -0
  156. package/src/resources/extensions/gsd/auto-worktree.ts +9 -6
  157. package/src/resources/extensions/gsd/auto.ts +37 -3
  158. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +148 -0
  159. package/src/resources/extensions/gsd/bootstrap/system-context.ts +48 -11
  160. package/src/resources/extensions/gsd/commands/catalog.ts +6 -1
  161. package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -0
  162. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
  163. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
  164. package/src/resources/extensions/gsd/commands-mcp-status.ts +247 -0
  165. package/src/resources/extensions/gsd/db-writer.ts +39 -17
  166. package/src/resources/extensions/gsd/doctor.ts +7 -1
  167. package/src/resources/extensions/gsd/git-service.ts +6 -2
  168. package/src/resources/extensions/gsd/gsd-db.ts +16 -1
  169. package/src/resources/extensions/gsd/markdown-renderer.ts +1 -1
  170. package/src/resources/extensions/gsd/preferences.ts +11 -1
  171. package/src/resources/extensions/gsd/prompts/complete-milestone.md +2 -4
  172. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  173. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
  174. package/src/resources/extensions/gsd/prompts/replan-slice.md +3 -14
  175. package/src/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
  176. package/src/resources/extensions/gsd/provider-error-pause.ts +9 -0
  177. package/src/resources/extensions/gsd/state.ts +19 -1
  178. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
  179. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +14 -16
  180. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
  181. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +88 -0
  182. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
  183. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +465 -523
  184. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
  185. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
  186. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +533 -656
  187. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
  188. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
  189. package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
  190. package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
  191. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
  192. package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
  193. package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
  194. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +38 -59
  195. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +228 -263
  196. package/src/resources/extensions/gsd/tests/complete-task.test.ts +250 -302
  197. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +114 -0
  198. package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
  199. package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
  200. package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
  201. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +27 -35
  202. package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
  203. package/src/resources/extensions/gsd/tests/db-writer.test.ts +465 -416
  204. package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
  205. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +68 -83
  206. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +210 -181
  207. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
  208. package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
  209. package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
  210. package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
  211. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +164 -180
  212. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
  213. package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
  214. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +27 -29
  215. package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
  216. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +54 -75
  217. package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +21 -32
  218. package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
  219. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -44
  220. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
  221. package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
  222. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +54 -60
  223. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
  224. package/src/resources/extensions/gsd/tests/doctor.test.ts +104 -134
  225. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
  226. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +120 -0
  227. package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
  228. package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
  229. package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
  230. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +30 -42
  231. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +198 -206
  232. package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
  233. package/src/resources/extensions/gsd/tests/git-service.test.ts +285 -388
  234. package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
  235. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
  236. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
  237. package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
  238. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +81 -103
  239. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
  240. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
  241. package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
  242. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +81 -102
  243. package/src/resources/extensions/gsd/tests/infra-error.test.ts +20 -2
  244. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
  245. package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
  246. package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
  247. package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
  248. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +18 -18
  249. package/src/resources/extensions/gsd/tests/knowledge.test.ts +89 -0
  250. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +150 -194
  251. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +103 -0
  252. package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
  253. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
  254. package/src/resources/extensions/gsd/tests/memory-store.test.ts +80 -93
  255. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +66 -0
  256. package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
  257. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +83 -93
  258. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
  259. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
  260. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
  261. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +87 -96
  262. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +125 -164
  263. package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
  264. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +35 -36
  265. package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
  266. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +40 -47
  267. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +25 -28
  268. package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
  269. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
  270. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
  271. package/src/resources/extensions/gsd/tests/parsers.test.ts +546 -611
  272. package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
  273. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
  274. package/src/resources/extensions/gsd/tests/preferences.test.ts +27 -0
  275. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +11 -7
  276. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
  277. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
  278. package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
  279. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
  280. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
  281. package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
  282. package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
  283. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +73 -80
  284. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
  285. package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
  286. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
  287. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
  288. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
  289. package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
  290. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
  291. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -44
  292. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +19 -26
  293. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
  294. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
  295. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +67 -0
  296. package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
  297. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +49 -0
  298. package/src/resources/extensions/gsd/tests/token-savings.test.ts +54 -56
  299. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +23 -25
  300. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +10 -11
  301. package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
  302. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
  303. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -22
  304. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
  305. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
  306. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
  307. package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
  308. package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
  309. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +50 -52
  310. package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
  311. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
  312. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
  313. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
  314. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
  315. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
  316. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
  317. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
  318. package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
  319. package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -0
  320. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -0
  321. package/src/resources/extensions/gsd/tools/replan-slice.ts +3 -0
  322. package/src/resources/extensions/gsd/tools/validate-milestone.ts +127 -0
  323. package/src/resources/extensions/gsd/worktree-resolver.ts +7 -0
  324. package/src/resources/extensions/mcp-client/index.ts +20 -0
  325. /package/dist/web/standalone/.next/static/{fOnWQBjWXMKUs4bqTg530 → kxxAA66bah_yhPYqLBHE2}/_buildManifest.js +0 -0
  326. /package/dist/web/standalone/.next/static/{fOnWQBjWXMKUs4bqTg530 → kxxAA66bah_yhPYqLBHE2}/_ssgManifest.js +0 -0
@@ -1,13 +1,12 @@
1
1
  import { parseTaskPlanMustHaves } from '../files.ts';
2
- import { createTestContext } from './test-helpers.ts';
2
+ import { describe, test, beforeEach, afterEach } from 'node:test';
3
+ import assert from 'node:assert/strict';
3
4
 
4
- const { assertEq, assertTrue, report } = createTestContext();
5
5
  // ═══════════════════════════════════════════════════════════════════════════
6
6
  // (a) Standard unchecked format: - [ ] text
7
7
  // ═══════════════════════════════════════════════════════════════════════════
8
8
 
9
- console.log('\n=== parseTaskPlanMustHaves: standard unchecked ===');
10
- {
9
+ test('parseTaskPlanMustHaves: standard unchecked', () => {
11
10
  const content = `# T01: Test Task
12
11
 
13
12
  ## Must-Haves
@@ -16,56 +15,53 @@ console.log('\n=== parseTaskPlanMustHaves: standard unchecked ===');
16
15
  - [ ] Second must-have item
17
16
  `;
18
17
  const result = parseTaskPlanMustHaves(content);
19
- assertEq(result.length, 2, 'should return 2 items');
20
- assertEq(result[0].text, 'First must-have item', 'first item text');
21
- assertEq(result[0].checked, false, 'first item unchecked');
22
- assertEq(result[1].text, 'Second must-have item', 'second item text');
23
- assertEq(result[1].checked, false, 'second item unchecked');
24
- }
18
+ assert.deepStrictEqual(result.length, 2, 'should return 2 items');
19
+ assert.deepStrictEqual(result[0].text, 'First must-have item', 'first item text');
20
+ assert.deepStrictEqual(result[0].checked, false, 'first item unchecked');
21
+ assert.deepStrictEqual(result[1].text, 'Second must-have item', 'second item text');
22
+ assert.deepStrictEqual(result[1].checked, false, 'second item unchecked');
23
+ });
25
24
 
26
25
  // ═══════════════════════════════════════════════════════════════════════════
27
26
  // (b) Checked variants: - [x] and - [X]
28
27
  // ═══════════════════════════════════════════════════════════════════════════
29
28
 
30
- console.log('\n=== parseTaskPlanMustHaves: checked [x] and [X] ===');
31
- {
29
+ test('parseTaskPlanMustHaves: checked [x] and [X]', () => {
32
30
  const content = `## Must-Haves
33
31
 
34
32
  - [x] Lowercase checked item
35
33
  - [X] Uppercase checked item
36
34
  `;
37
35
  const result = parseTaskPlanMustHaves(content);
38
- assertEq(result.length, 2, 'should return 2 items');
39
- assertEq(result[0].checked, true, 'lowercase x is checked');
40
- assertEq(result[0].text, 'Lowercase checked item', 'lowercase x text');
41
- assertEq(result[1].checked, true, 'uppercase X is checked');
42
- assertEq(result[1].text, 'Uppercase checked item', 'uppercase X text');
43
- }
36
+ assert.deepStrictEqual(result.length, 2, 'should return 2 items');
37
+ assert.deepStrictEqual(result[0].checked, true, 'lowercase x is checked');
38
+ assert.deepStrictEqual(result[0].text, 'Lowercase checked item', 'lowercase x text');
39
+ assert.deepStrictEqual(result[1].checked, true, 'uppercase X is checked');
40
+ assert.deepStrictEqual(result[1].text, 'Uppercase checked item', 'uppercase X text');
41
+ });
44
42
 
45
43
  // ═══════════════════════════════════════════════════════════════════════════
46
44
  // (c) No-checkbox bullets: - text
47
45
  // ═══════════════════════════════════════════════════════════════════════════
48
46
 
49
- console.log('\n=== parseTaskPlanMustHaves: no-checkbox bullets ===');
50
- {
47
+ test('parseTaskPlanMustHaves: no-checkbox bullets', () => {
51
48
  const content = `## Must-Haves
52
49
 
53
50
  - Plain bullet item
54
51
  - Another plain item
55
52
  `;
56
53
  const result = parseTaskPlanMustHaves(content);
57
- assertEq(result.length, 2, 'should return 2 items');
58
- assertEq(result[0].text, 'Plain bullet item', 'plain bullet text');
59
- assertEq(result[0].checked, false, 'plain bullet defaults to unchecked');
60
- assertEq(result[1].text, 'Another plain item', 'second plain bullet text');
61
- }
54
+ assert.deepStrictEqual(result.length, 2, 'should return 2 items');
55
+ assert.deepStrictEqual(result[0].text, 'Plain bullet item', 'plain bullet text');
56
+ assert.deepStrictEqual(result[0].checked, false, 'plain bullet defaults to unchecked');
57
+ assert.deepStrictEqual(result[1].text, 'Another plain item', 'second plain bullet text');
58
+ });
62
59
 
63
60
  // ═══════════════════════════════════════════════════════════════════════════
64
61
  // (d) Indented variants
65
62
  // ═══════════════════════════════════════════════════════════════════════════
66
63
 
67
- console.log('\n=== parseTaskPlanMustHaves: indented variants ===');
68
- {
64
+ test('parseTaskPlanMustHaves: indented variants', () => {
69
65
  const content = `## Must-Haves
70
66
 
71
67
  - [ ] Indented unchecked item
@@ -73,21 +69,20 @@ console.log('\n=== parseTaskPlanMustHaves: indented variants ===');
73
69
  - Plain indented item
74
70
  `;
75
71
  const result = parseTaskPlanMustHaves(content);
76
- assertEq(result.length, 3, 'should return 3 items');
77
- assertEq(result[0].text, 'Indented unchecked item', 'indented unchecked text');
78
- assertEq(result[0].checked, false, 'indented unchecked state');
79
- assertEq(result[1].text, 'Indented checked item', 'indented checked text');
80
- assertEq(result[1].checked, true, 'indented checked state');
81
- assertEq(result[2].text, 'Plain indented item', 'indented plain text');
82
- assertEq(result[2].checked, false, 'indented plain state');
83
- }
72
+ assert.deepStrictEqual(result.length, 3, 'should return 3 items');
73
+ assert.deepStrictEqual(result[0].text, 'Indented unchecked item', 'indented unchecked text');
74
+ assert.deepStrictEqual(result[0].checked, false, 'indented unchecked state');
75
+ assert.deepStrictEqual(result[1].text, 'Indented checked item', 'indented checked text');
76
+ assert.deepStrictEqual(result[1].checked, true, 'indented checked state');
77
+ assert.deepStrictEqual(result[2].text, 'Plain indented item', 'indented plain text');
78
+ assert.deepStrictEqual(result[2].checked, false, 'indented plain state');
79
+ });
84
80
 
85
81
  // ═══════════════════════════════════════════════════════════════════════════
86
82
  // (e) Mixed checkbox states in one section
87
83
  // ═══════════════════════════════════════════════════════════════════════════
88
84
 
89
- console.log('\n=== parseTaskPlanMustHaves: mixed states ===');
90
- {
85
+ test('parseTaskPlanMustHaves: mixed states', () => {
91
86
  const content = `## Must-Haves
92
87
 
93
88
  - [ ] Unchecked one
@@ -97,20 +92,19 @@ console.log('\n=== parseTaskPlanMustHaves: mixed states ===');
97
92
  - [ ] Another unchecked
98
93
  `;
99
94
  const result = parseTaskPlanMustHaves(content);
100
- assertEq(result.length, 5, 'should return 5 items');
101
- assertEq(result[0].checked, false, 'first is unchecked');
102
- assertEq(result[1].checked, true, 'second is checked');
103
- assertEq(result[2].checked, true, 'third is checked (uppercase)');
104
- assertEq(result[3].checked, false, 'fourth (plain) is unchecked');
105
- assertEq(result[4].checked, false, 'fifth is unchecked');
106
- }
95
+ assert.deepStrictEqual(result.length, 5, 'should return 5 items');
96
+ assert.deepStrictEqual(result[0].checked, false, 'first is unchecked');
97
+ assert.deepStrictEqual(result[1].checked, true, 'second is checked');
98
+ assert.deepStrictEqual(result[2].checked, true, 'third is checked (uppercase)');
99
+ assert.deepStrictEqual(result[3].checked, false, 'fourth (plain) is unchecked');
100
+ assert.deepStrictEqual(result[4].checked, false, 'fifth is unchecked');
101
+ });
107
102
 
108
103
  // ═══════════════════════════════════════════════════════════════════════════
109
104
  // (f) Missing Must-Haves section → empty array
110
105
  // ═══════════════════════════════════════════════════════════════════════════
111
106
 
112
- console.log('\n=== parseTaskPlanMustHaves: missing section ===');
113
- {
107
+ test('parseTaskPlanMustHaves: missing section', () => {
114
108
  const content = `# T01: Some Task
115
109
 
116
110
  ## Description
@@ -122,16 +116,15 @@ Some description here.
122
116
  - Run tests
123
117
  `;
124
118
  const result = parseTaskPlanMustHaves(content);
125
- assertEq(result.length, 0, 'returns empty array when section missing');
126
- assertTrue(Array.isArray(result), 'result is an array');
127
- }
119
+ assert.deepStrictEqual(result.length, 0, 'returns empty array when section missing');
120
+ assert.ok(Array.isArray(result), 'result is an array');
121
+ });
128
122
 
129
123
  // ═══════════════════════════════════════════════════════════════════════════
130
124
  // (g) Empty Must-Haves section → empty array
131
125
  // ═══════════════════════════════════════════════════════════════════════════
132
126
 
133
- console.log('\n=== parseTaskPlanMustHaves: empty section ===');
134
- {
127
+ test('parseTaskPlanMustHaves: empty section', () => {
135
128
  const content = `## Must-Haves
136
129
 
137
130
  ## Verification
@@ -139,15 +132,14 @@ console.log('\n=== parseTaskPlanMustHaves: empty section ===');
139
132
  - Run tests
140
133
  `;
141
134
  const result = parseTaskPlanMustHaves(content);
142
- assertEq(result.length, 0, 'returns empty array when section is empty');
143
- }
135
+ assert.deepStrictEqual(result.length, 0, 'returns empty array when section is empty');
136
+ });
144
137
 
145
138
  // ═══════════════════════════════════════════════════════════════════════════
146
139
  // (h) Content with YAML frontmatter
147
140
  // ═══════════════════════════════════════════════════════════════════════════
148
141
 
149
- console.log('\n=== parseTaskPlanMustHaves: YAML frontmatter ===');
150
- {
142
+ test('parseTaskPlanMustHaves: YAML frontmatter', () => {
151
143
  const content = `---
152
144
  estimated_steps: 5
153
145
  estimated_files: 3
@@ -161,16 +153,16 @@ estimated_files: 3
161
153
  - [x] Checked must-have after frontmatter
162
154
  `;
163
155
  const result = parseTaskPlanMustHaves(content);
164
- assertEq(result.length, 2, 'frontmatter does not pollute results');
165
- assertEq(result[0].text, 'Real must-have after frontmatter', 'first item text correct');
166
- assertEq(result[0].checked, false, 'first item unchecked');
167
- assertEq(result[1].text, 'Checked must-have after frontmatter', 'second item text correct');
168
- assertEq(result[1].checked, true, 'second item checked');
169
- }
156
+ assert.deepStrictEqual(result.length, 2, 'frontmatter does not pollute results');
157
+ assert.deepStrictEqual(result[0].text, 'Real must-have after frontmatter', 'first item text correct');
158
+ assert.deepStrictEqual(result[0].checked, false, 'first item unchecked');
159
+ assert.deepStrictEqual(result[1].text, 'Checked must-have after frontmatter', 'second item text correct');
160
+ assert.deepStrictEqual(result[1].checked, true, 'second item checked');
161
+ });
170
162
 
171
163
  // Verify frontmatter content is not misinterpreted as must-haves
172
- console.log('\n=== parseTaskPlanMustHaves: frontmatter-only content ===');
173
- {
164
+
165
+ test('parseTaskPlanMustHaves: frontmatter-only content', () => {
174
166
  const content = `---
175
167
  estimated_steps: 5
176
168
  estimated_files: 3
@@ -183,15 +175,14 @@ estimated_files: 3
183
175
  No must-haves section here.
184
176
  `;
185
177
  const result = parseTaskPlanMustHaves(content);
186
- assertEq(result.length, 0, 'frontmatter-only content returns empty array');
187
- }
178
+ assert.deepStrictEqual(result.length, 0, 'frontmatter-only content returns empty array');
179
+ });
188
180
 
189
181
  // ═══════════════════════════════════════════════════════════════════════════
190
182
  // (i) Real task plan format (based on S01/T01-PLAN.md structure)
191
183
  // ═══════════════════════════════════════════════════════════════════════════
192
184
 
193
- console.log('\n=== parseTaskPlanMustHaves: real task plan format ===');
194
- {
185
+ test('parseTaskPlanMustHaves: real task plan format', () => {
195
186
  const content = `---
196
187
  estimated_steps: 5
197
188
  estimated_files: 3
@@ -239,40 +230,37 @@ Add the \`completing-milestone\` phase to the GSD state machine.
239
230
  - \`agent/extensions/gsd/types.ts\` — Phase union includes \`'completing-milestone'\`
240
231
  `;
241
232
  const result = parseTaskPlanMustHaves(content);
242
- assertEq(result.length, 5, 'real plan has 5 must-haves');
243
- assertTrue(result[0].text.includes('`Phase` type includes'), 'first must-have text matches');
244
- assertTrue(result[1].text.includes('`deriveState` returns'), 'second must-have text matches');
245
- assertEq(result[0].checked, false, 'all real must-haves are unchecked');
246
- assertEq(result[4].checked, false, 'last real must-have is unchecked');
247
- assertTrue(result[4].text.includes('multi-milestone'), 'last must-have references multi-milestone');
248
- }
233
+ assert.deepStrictEqual(result.length, 5, 'real plan has 5 must-haves');
234
+ assert.ok(result[0].text.includes('`Phase` type includes'), 'first must-have text matches');
235
+ assert.ok(result[1].text.includes('`deriveState` returns'), 'second must-have text matches');
236
+ assert.deepStrictEqual(result[0].checked, false, 'all real must-haves are unchecked');
237
+ assert.deepStrictEqual(result[4].checked, false, 'last real must-have is unchecked');
238
+ assert.ok(result[4].text.includes('multi-milestone'), 'last must-have references multi-milestone');
239
+ });
249
240
 
250
241
  // ═══════════════════════════════════════════════════════════════════════════
251
242
  // Edge cases
252
243
  // ═══════════════════════════════════════════════════════════════════════════
253
244
 
254
- console.log('\n=== parseTaskPlanMustHaves: empty string ===');
255
- {
245
+ test('parseTaskPlanMustHaves: empty string', () => {
256
246
  const result = parseTaskPlanMustHaves('');
257
- assertEq(result.length, 0, 'empty string returns empty array');
258
- }
247
+ assert.deepStrictEqual(result.length, 0, 'empty string returns empty array');
248
+ });
259
249
 
260
- console.log('\n=== parseTaskPlanMustHaves: must-haves with inline code and backticks ===');
261
- {
250
+ test('parseTaskPlanMustHaves: must-haves with inline code and backticks', () => {
262
251
  const content = `## Must-Haves
263
252
 
264
253
  - [ ] \`functionName\` is exported from \`module.ts\`
265
254
  - [x] Returns \`Array<{ text: string }>\` with correct extraction
266
255
  `;
267
256
  const result = parseTaskPlanMustHaves(content);
268
- assertEq(result.length, 2, 'handles backtick content');
269
- assertTrue(result[0].text.includes('`functionName`'), 'preserves backticks in text');
270
- assertEq(result[0].checked, false, 'backtick item unchecked');
271
- assertEq(result[1].checked, true, 'backtick item checked');
272
- }
273
-
274
- console.log('\n=== parseTaskPlanMustHaves: asterisk bullets ===');
275
- {
257
+ assert.deepStrictEqual(result.length, 2, 'handles backtick content');
258
+ assert.ok(result[0].text.includes('`functionName`'), 'preserves backticks in text');
259
+ assert.deepStrictEqual(result[0].checked, false, 'backtick item unchecked');
260
+ assert.deepStrictEqual(result[1].checked, true, 'backtick item checked');
261
+ });
262
+
263
+ test('parseTaskPlanMustHaves: asterisk bullets', () => {
276
264
  const content = `## Must-Haves
277
265
 
278
266
  * [ ] Asterisk unchecked
@@ -280,12 +268,11 @@ console.log('\n=== parseTaskPlanMustHaves: asterisk bullets ===');
280
268
  * Plain asterisk
281
269
  `;
282
270
  const result = parseTaskPlanMustHaves(content);
283
- assertEq(result.length, 3, 'handles asterisk bullets');
284
- assertEq(result[0].checked, false, 'asterisk unchecked');
285
- assertEq(result[1].checked, true, 'asterisk checked');
286
- assertEq(result[2].checked, false, 'plain asterisk unchecked');
287
- }
271
+ assert.deepStrictEqual(result.length, 3, 'handles asterisk bullets');
272
+ assert.deepStrictEqual(result[0].checked, false, 'asterisk unchecked');
273
+ assert.deepStrictEqual(result[1].checked, true, 'asterisk checked');
274
+ assert.deepStrictEqual(result[2].checked, false, 'plain asterisk unchecked');
275
+ });
288
276
 
289
277
  // ═══════════════════════════════════════════════════════════════════════════
290
278
 
291
- report();
@@ -19,9 +19,8 @@ import { shouldUseWorktreeIsolation } from "../auto.ts";
19
19
  import { getIsolationMode } from "../preferences.ts";
20
20
  import { getActiveAutoWorktreeContext } from "../auto-worktree.ts";
21
21
  import { invalidateAllCaches } from "../cache.ts";
22
- import { createTestContext } from "./test-helpers.ts";
23
-
24
- const { assertEq, assertTrue, report } = createTestContext();
22
+ import { describe, test, beforeEach, afterEach } from 'node:test';
23
+ import assert from 'node:assert/strict';
25
24
 
26
25
  // --- Preferences helpers (same pattern as doctor-git.test.ts K001) ---
27
26
 
@@ -38,77 +37,77 @@ function removeRunnerPreferences(): void {
38
37
 
39
38
  // --- Tests ---
40
39
 
41
- // Test 1: shouldUseWorktreeIsolation returns false for none
42
- console.log("Test 1: shouldUseWorktreeIsolation returns false for none");
40
+ test('shouldUseWorktreeIsolation returns false for none', () => {
43
41
  try {
44
42
  writeRunnerPreferences("none");
45
43
  invalidateAllCaches();
46
- assertEq(shouldUseWorktreeIsolation(), false, "shouldUseWorktreeIsolation() with none prefs");
44
+ assert.deepStrictEqual(shouldUseWorktreeIsolation(), false, "shouldUseWorktreeIsolation() with none prefs");
47
45
  } finally {
48
46
  removeRunnerPreferences();
49
47
  invalidateAllCaches();
50
48
  }
49
+ });
51
50
 
52
- // Test 2: shouldUseWorktreeIsolation returns false for branch
53
- console.log("Test 2: shouldUseWorktreeIsolation returns false for branch");
51
+ test('shouldUseWorktreeIsolation returns false for branch', () => {
54
52
  try {
55
53
  writeRunnerPreferences("branch");
56
54
  invalidateAllCaches();
57
- assertEq(shouldUseWorktreeIsolation(), false, "shouldUseWorktreeIsolation() with branch prefs");
55
+ assert.deepStrictEqual(shouldUseWorktreeIsolation(), false, "shouldUseWorktreeIsolation() with branch prefs");
58
56
  } finally {
59
57
  removeRunnerPreferences();
60
58
  invalidateAllCaches();
61
59
  }
60
+ });
62
61
 
63
- // Test 3: shouldUseWorktreeIsolation returns true for worktree
64
- console.log("Test 3: shouldUseWorktreeIsolation returns true for worktree");
62
+ test('shouldUseWorktreeIsolation returns true for worktree', () => {
65
63
  try {
66
64
  writeRunnerPreferences("worktree");
67
65
  invalidateAllCaches();
68
- assertEq(shouldUseWorktreeIsolation(), true, "shouldUseWorktreeIsolation() with worktree prefs");
66
+ assert.deepStrictEqual(shouldUseWorktreeIsolation(), true, "shouldUseWorktreeIsolation() with worktree prefs");
69
67
  } finally {
70
68
  removeRunnerPreferences();
71
69
  invalidateAllCaches();
72
70
  }
71
+ });
73
72
 
74
73
  // Test 4: shouldUseWorktreeIsolation returns true for no prefs (default)
75
74
  // Skip if global prefs exist — they override the default and this test
76
75
  // cannot control ~/.gsd/preferences.md.
77
- const globalPrefsExist = existsSync(join(homedir(), ".gsd", "preferences.md"))
78
- || existsSync(join(homedir(), ".gsd", "PREFERENCES.md"));
79
- if (!globalPrefsExist) {
80
- console.log("Test 4: shouldUseWorktreeIsolation returns true for no prefs (default)");
81
- try {
82
- removeRunnerPreferences(); // ensure no prefs file
83
- invalidateAllCaches();
84
- assertEq(shouldUseWorktreeIsolation(), true, "shouldUseWorktreeIsolation() with no prefs (default worktree)");
85
- } finally {
86
- invalidateAllCaches();
76
+
77
+ test('shouldUseWorktreeIsolation returns true for no prefs (default)', () => {
78
+ const globalPrefsExist = existsSync(join(homedir(), ".gsd", "preferences.md"))
79
+ || existsSync(join(homedir(), ".gsd", "PREFERENCES.md"));
80
+ if (!globalPrefsExist) {
81
+ try {
82
+ removeRunnerPreferences(); // ensure no prefs file
83
+ invalidateAllCaches();
84
+ assert.deepStrictEqual(shouldUseWorktreeIsolation(), true, "shouldUseWorktreeIsolation() with no prefs (default worktree)");
85
+ } finally {
86
+ invalidateAllCaches();
87
+ }
88
+ } else {
87
89
  }
88
- } else {
89
- console.log("Test 4: SKIPPED — global prefs file exists, cannot test bare default");
90
- }
90
+ });
91
91
 
92
- // Test 5: getIsolationMode returns "none" with none prefs
93
- console.log("Test 5: getIsolationMode returns 'none' with none prefs");
92
+ test('getIsolationMode returns "none" with none prefs', () => {
94
93
  try {
95
94
  writeRunnerPreferences("none");
96
95
  invalidateAllCaches();
97
- assertEq(getIsolationMode(), "none", "getIsolationMode() with none prefs");
96
+ assert.deepStrictEqual(getIsolationMode(), "none", "getIsolationMode() with none prefs");
98
97
  } finally {
99
98
  removeRunnerPreferences();
100
99
  invalidateAllCaches();
101
100
  }
101
+ });
102
102
 
103
- // Test 6: getActiveAutoWorktreeContext returns null at baseline
104
- console.log("Test 6: getActiveAutoWorktreeContext returns null at baseline");
105
- assertEq(getActiveAutoWorktreeContext(), null, "getActiveAutoWorktreeContext() returns null without enterAutoWorktree()");
103
+ test('getActiveAutoWorktreeContext returns null at baseline', () => {
104
+ assert.deepStrictEqual(getActiveAutoWorktreeContext(), null, "getActiveAutoWorktreeContext() returns null without enterAutoWorktree()");
105
+ });
106
106
 
107
107
  // Test 7: System prompt worktree block absent without active worktree
108
- console.log("Test 7: System prompt worktree block absent without active worktree");
109
- {
108
+
109
+ test('Test 7: System prompt worktree block absent without active worktree', () => {
110
110
  const ctx = getActiveAutoWorktreeContext();
111
- assertTrue(ctx === null, "getActiveAutoWorktreeContext() null confirms system prompt worktree block will not be injected");
112
- }
111
+ assert.ok(ctx === null, "getActiveAutoWorktreeContext() null confirms system prompt worktree block will not be injected");
112
+ });
113
113
 
114
- report();