gsd-pi 2.44.0 → 2.45.0-dev.e0ee972

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 (505) hide show
  1. package/README.md +30 -12
  2. package/dist/help-text.js +1 -1
  3. package/dist/loader.js +34 -0
  4. package/dist/resources/extensions/gsd/activity-log.js +7 -0
  5. package/dist/resources/extensions/gsd/auto/infra-errors.js +3 -0
  6. package/dist/resources/extensions/gsd/auto/phases.js +52 -45
  7. package/dist/resources/extensions/gsd/auto/run-unit.js +6 -3
  8. package/dist/resources/extensions/gsd/auto-prompts.js +24 -1
  9. package/dist/resources/extensions/gsd/auto-start.js +31 -2
  10. package/dist/resources/extensions/gsd/auto-timers.js +57 -3
  11. package/dist/resources/extensions/gsd/auto-worktree-sync.js +4 -0
  12. package/dist/resources/extensions/gsd/auto-worktree.js +14 -10
  13. package/dist/resources/extensions/gsd/auto.js +34 -8
  14. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +168 -11
  15. package/dist/resources/extensions/gsd/bootstrap/system-context.js +46 -12
  16. package/dist/resources/extensions/gsd/commands/catalog.js +7 -1
  17. package/dist/resources/extensions/gsd/commands/handlers/core.js +2 -0
  18. package/dist/resources/extensions/gsd/commands/handlers/ops.js +10 -0
  19. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
  20. package/dist/resources/extensions/gsd/commands-mcp-status.js +187 -0
  21. package/dist/resources/extensions/gsd/db-writer.js +40 -22
  22. package/dist/resources/extensions/gsd/doctor-checks.js +1 -1
  23. package/dist/resources/extensions/gsd/doctor.js +10 -2
  24. package/dist/resources/extensions/gsd/git-service.js +8 -3
  25. package/dist/resources/extensions/gsd/gsd-db.js +17 -2
  26. package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
  27. package/dist/resources/extensions/gsd/preferences-types.js +2 -2
  28. package/dist/resources/extensions/gsd/preferences.js +17 -5
  29. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +2 -4
  30. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  31. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
  32. package/dist/resources/extensions/gsd/prompts/replan-slice.md +3 -14
  33. package/dist/resources/extensions/gsd/prompts/rethink.md +78 -0
  34. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
  35. package/dist/resources/extensions/gsd/provider-error-pause.js +7 -0
  36. package/dist/resources/extensions/gsd/repo-identity.js +45 -7
  37. package/dist/resources/extensions/gsd/rethink.js +115 -0
  38. package/dist/resources/extensions/gsd/state.js +41 -3
  39. package/dist/resources/extensions/gsd/tools/plan-slice.js +1 -0
  40. package/dist/resources/extensions/gsd/tools/plan-task.js +1 -0
  41. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -0
  42. package/dist/resources/extensions/gsd/tools/validate-milestone.js +88 -0
  43. package/dist/resources/extensions/gsd/workflow-logger.js +138 -0
  44. package/dist/resources/extensions/gsd/worktree-manager.js +34 -3
  45. package/dist/resources/extensions/gsd/worktree-resolver.js +43 -0
  46. package/dist/resources/extensions/mcp-client/index.js +14 -0
  47. package/dist/resources/extensions/voice/index.js +11 -16
  48. package/dist/resources/extensions/voice/linux-ready.js +67 -0
  49. package/dist/web/standalone/.next/BUILD_ID +1 -1
  50. package/dist/web/standalone/.next/app-path-routes-manifest.json +15 -15
  51. package/dist/web/standalone/.next/build-manifest.json +4 -4
  52. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  53. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  54. package/dist/web/standalone/.next/required-server-files.json +3 -3
  55. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  56. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  57. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  58. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  59. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  60. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  61. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  62. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  63. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  64. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  65. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  66. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  67. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  68. package/dist/web/standalone/.next/server/app/_not-found.rsc +5 -5
  69. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +5 -5
  70. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  71. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  72. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  73. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  74. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  75. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  76. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  77. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  78. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  79. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  80. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  81. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  82. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  83. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  84. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  85. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  86. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  87. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  88. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  89. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  90. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  91. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  92. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  93. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  94. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  95. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  96. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  98. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  100. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  120. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  126. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  140. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  142. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  144. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  146. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/index.html +1 -1
  156. package/dist/web/standalone/.next/server/app/index.rsc +6 -6
  157. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  158. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +6 -6
  159. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  160. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  161. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  162. package/dist/web/standalone/.next/server/app/page.js +2 -2
  163. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app-paths-manifest.json +15 -15
  165. package/dist/web/standalone/.next/server/chunks/229.js +1 -1
  166. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  167. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/middleware.js +2 -2
  170. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  172. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  173. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  174. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  175. package/dist/web/standalone/.next/static/chunks/4024.11ca5c01938e5948.js +9 -0
  176. package/dist/web/standalone/.next/static/chunks/{3721.bf31263de6d5fa46.js → 485.243af25f0cdf50d6.js} +2 -2
  177. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  178. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  179. package/dist/web/standalone/.next/static/chunks/app/page-6654a8cca61a3d1c.js +1 -0
  180. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  181. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  182. package/dist/web/standalone/.next/static/chunks/webpack-0a4cd455ec4197d2.js +1 -0
  183. package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +1 -0
  184. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  185. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  186. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  187. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  188. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  189. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  190. package/dist/web/standalone/server.js +1 -1
  191. package/package.json +1 -1
  192. package/packages/native/dist/stream-process/index.js +2 -2
  193. package/packages/native/src/__tests__/stream-process.test.mjs +34 -0
  194. package/packages/native/src/stream-process/index.ts +2 -2
  195. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +3 -1
  196. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  197. package/packages/pi-coding-agent/dist/core/auth-storage.js +15 -1
  198. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  199. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
  200. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  201. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -1
  202. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +2 -0
  203. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  204. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +24 -26
  205. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  206. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +2 -1
  207. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  208. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  209. package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
  210. package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
  211. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +4 -0
  212. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -1
  213. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +10 -5
  214. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -1
  215. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.d.ts +2 -0
  216. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.d.ts.map +1 -0
  217. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.js +185 -0
  218. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.js.map +1 -0
  219. package/packages/pi-coding-agent/dist/core/local-model-check.d.ts +15 -0
  220. package/packages/pi-coding-agent/dist/core/local-model-check.d.ts.map +1 -0
  221. package/packages/pi-coding-agent/dist/core/local-model-check.js +41 -0
  222. package/packages/pi-coding-agent/dist/core/local-model-check.js.map +1 -0
  223. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +239 -10
  224. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  225. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +13 -1
  226. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  227. package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
  228. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  229. package/packages/pi-coding-agent/dist/core/package-commands.test.js +206 -195
  230. package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -1
  231. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +34 -44
  232. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
  233. package/packages/pi-coding-agent/dist/core/session-manager.test.js +30 -34
  234. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
  235. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  236. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  237. package/packages/pi-coding-agent/dist/core/settings-manager.js +6 -0
  238. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  239. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
  240. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
  241. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  242. package/packages/pi-coding-agent/dist/main.js +17 -0
  243. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  244. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts +2 -0
  245. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts.map +1 -0
  246. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js +32 -0
  247. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js.map +1 -0
  248. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +3 -1
  249. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  250. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +8 -1
  251. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  252. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  253. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  254. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +12 -0
  255. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  256. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts +15 -0
  257. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts.map +1 -0
  258. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js +40 -0
  259. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js.map +1 -0
  260. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  261. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +4 -1
  262. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  263. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +5 -2
  264. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  265. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +13 -2
  266. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  267. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  268. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +17 -8
  269. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  270. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  271. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +7 -3
  272. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  273. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
  274. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
  275. package/packages/pi-coding-agent/package.json +1 -1
  276. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
  277. package/packages/pi-coding-agent/src/core/auth-storage.ts +15 -1
  278. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +2 -0
  279. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
  280. package/packages/pi-coding-agent/src/core/extensions/types.ts +2 -1
  281. package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
  282. package/packages/pi-coding-agent/src/core/lifecycle-hooks.test.ts +227 -0
  283. package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +11 -5
  284. package/packages/pi-coding-agent/src/core/local-model-check.ts +45 -0
  285. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +297 -11
  286. package/packages/pi-coding-agent/src/core/model-registry.ts +51 -4
  287. package/packages/pi-coding-agent/src/core/package-commands.test.ts +227 -205
  288. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
  289. package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
  290. package/packages/pi-coding-agent/src/core/settings-manager.ts +9 -0
  291. package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
  292. package/packages/pi-coding-agent/src/main.ts +19 -0
  293. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/timestamp.test.ts +38 -0
  294. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +10 -0
  295. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
  296. package/packages/pi-coding-agent/src/modes/interactive/components/timestamp.ts +48 -0
  297. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +3 -1
  298. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +18 -3
  299. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +16 -7
  300. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +8 -1
  301. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
  302. package/pkg/package.json +1 -1
  303. package/src/resources/extensions/gsd/activity-log.ts +1 -0
  304. package/src/resources/extensions/gsd/auto/infra-errors.ts +3 -0
  305. package/src/resources/extensions/gsd/auto/phases.ts +61 -59
  306. package/src/resources/extensions/gsd/auto/run-unit.ts +6 -3
  307. package/src/resources/extensions/gsd/auto-prompts.ts +24 -1
  308. package/src/resources/extensions/gsd/auto-start.ts +39 -2
  309. package/src/resources/extensions/gsd/auto-timers.ts +64 -3
  310. package/src/resources/extensions/gsd/auto-worktree-sync.ts +5 -0
  311. package/src/resources/extensions/gsd/auto-worktree.ts +17 -11
  312. package/src/resources/extensions/gsd/auto.ts +40 -6
  313. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +160 -11
  314. package/src/resources/extensions/gsd/bootstrap/system-context.ts +48 -11
  315. package/src/resources/extensions/gsd/commands/catalog.ts +7 -1
  316. package/src/resources/extensions/gsd/commands/handlers/core.ts +2 -0
  317. package/src/resources/extensions/gsd/commands/handlers/ops.ts +10 -0
  318. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
  319. package/src/resources/extensions/gsd/commands-mcp-status.ts +247 -0
  320. package/src/resources/extensions/gsd/db-writer.ts +41 -27
  321. package/src/resources/extensions/gsd/doctor-checks.ts +1 -1
  322. package/src/resources/extensions/gsd/doctor.ts +9 -3
  323. package/src/resources/extensions/gsd/git-service.ts +6 -2
  324. package/src/resources/extensions/gsd/gsd-db.ts +21 -2
  325. package/src/resources/extensions/gsd/journal.ts +6 -1
  326. package/src/resources/extensions/gsd/markdown-renderer.ts +1 -1
  327. package/src/resources/extensions/gsd/preferences-types.ts +2 -2
  328. package/src/resources/extensions/gsd/preferences.ts +18 -4
  329. package/src/resources/extensions/gsd/prompts/complete-milestone.md +2 -4
  330. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  331. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
  332. package/src/resources/extensions/gsd/prompts/replan-slice.md +3 -14
  333. package/src/resources/extensions/gsd/prompts/rethink.md +78 -0
  334. package/src/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
  335. package/src/resources/extensions/gsd/provider-error-pause.ts +9 -0
  336. package/src/resources/extensions/gsd/repo-identity.ts +46 -7
  337. package/src/resources/extensions/gsd/rethink.ts +154 -0
  338. package/src/resources/extensions/gsd/state.ts +41 -1
  339. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
  340. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +14 -16
  341. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
  342. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +88 -0
  343. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
  344. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +465 -523
  345. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
  346. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
  347. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +533 -656
  348. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
  349. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
  350. package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
  351. package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
  352. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
  353. package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
  354. package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
  355. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +38 -59
  356. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +228 -263
  357. package/src/resources/extensions/gsd/tests/complete-task.test.ts +250 -302
  358. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +114 -0
  359. package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
  360. package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
  361. package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
  362. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +27 -35
  363. package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
  364. package/src/resources/extensions/gsd/tests/db-writer.test.ts +465 -416
  365. package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
  366. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +68 -83
  367. package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +121 -0
  368. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +210 -181
  369. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
  370. package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
  371. package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
  372. package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
  373. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +164 -180
  374. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
  375. package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
  376. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +27 -29
  377. package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
  378. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +54 -75
  379. package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +21 -32
  380. package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
  381. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -44
  382. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
  383. package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
  384. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +54 -60
  385. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
  386. package/src/resources/extensions/gsd/tests/doctor.test.ts +104 -134
  387. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
  388. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +120 -0
  389. package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
  390. package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
  391. package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
  392. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +30 -42
  393. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +198 -206
  394. package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
  395. package/src/resources/extensions/gsd/tests/git-service.test.ts +285 -388
  396. package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
  397. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
  398. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
  399. package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
  400. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +81 -103
  401. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
  402. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
  403. package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
  404. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +81 -102
  405. package/src/resources/extensions/gsd/tests/infra-error.test.ts +20 -2
  406. package/src/resources/extensions/gsd/tests/inherited-repo-home-dir.test.ts +121 -0
  407. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
  408. package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
  409. package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
  410. package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
  411. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +18 -18
  412. package/src/resources/extensions/gsd/tests/knowledge.test.ts +89 -0
  413. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +150 -194
  414. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +103 -0
  415. package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
  416. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
  417. package/src/resources/extensions/gsd/tests/memory-store.test.ts +80 -93
  418. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +66 -0
  419. package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
  420. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +83 -93
  421. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
  422. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
  423. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
  424. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +87 -96
  425. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +125 -164
  426. package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
  427. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +75 -37
  428. package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
  429. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +40 -47
  430. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +25 -28
  431. package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
  432. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
  433. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
  434. package/src/resources/extensions/gsd/tests/parsers.test.ts +546 -611
  435. package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
  436. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
  437. package/src/resources/extensions/gsd/tests/preferences.test.ts +34 -9
  438. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +11 -7
  439. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
  440. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
  441. package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
  442. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
  443. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
  444. package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
  445. package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
  446. package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +176 -0
  447. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +73 -80
  448. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
  449. package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
  450. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
  451. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
  452. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
  453. package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
  454. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
  455. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -44
  456. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +19 -26
  457. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
  458. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
  459. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +67 -0
  460. package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +108 -0
  461. package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
  462. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +49 -0
  463. package/src/resources/extensions/gsd/tests/token-savings.test.ts +54 -56
  464. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +23 -25
  465. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +10 -11
  466. package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
  467. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
  468. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -22
  469. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
  470. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
  471. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
  472. package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
  473. package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
  474. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +275 -0
  475. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +50 -52
  476. package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
  477. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
  478. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
  479. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
  480. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
  481. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
  482. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +220 -0
  483. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +65 -0
  484. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
  485. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
  486. package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
  487. package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -0
  488. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -0
  489. package/src/resources/extensions/gsd/tools/replan-slice.ts +3 -0
  490. package/src/resources/extensions/gsd/tools/validate-milestone.ts +127 -0
  491. package/src/resources/extensions/gsd/workflow-logger.ts +193 -0
  492. package/src/resources/extensions/gsd/worktree-manager.ts +41 -5
  493. package/src/resources/extensions/gsd/worktree-resolver.ts +44 -0
  494. package/src/resources/extensions/mcp-client/index.ts +20 -0
  495. package/src/resources/extensions/voice/index.ts +11 -21
  496. package/src/resources/extensions/voice/linux-ready.ts +87 -0
  497. package/src/resources/extensions/voice/tests/linux-ready.test.ts +124 -0
  498. package/dist/web/standalone/.next/static/chunks/4024.0de81b543b28b9fe.js +0 -9
  499. package/dist/web/standalone/.next/static/chunks/app/page-7e9530a7122506c5.js +0 -1
  500. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  501. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  502. package/dist/web/standalone/.next/static/chunks/webpack-9014b5adb127a98a.js +0 -1
  503. package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +0 -1
  504. /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → dFMji9G1LZ-Tv36el9pRT}/_buildManifest.js +0 -0
  505. /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → dFMji9G1LZ-Tv36el9pRT}/_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,116 @@ 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
- // Test 4: shouldUseWorktreeIsolation returns true for no prefs (default)
73
+ // Test 4: shouldUseWorktreeIsolation returns false for no prefs (default: none)
74
+ // Worktree isolation requires explicit opt-in — default is "none" so GSD
75
+ // works out of the box without preferences.md (#2480).
75
76
  // Skip if global prefs exist — they override the default and this test
76
77
  // 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();
78
+
79
+ test('shouldUseWorktreeIsolation returns false for no prefs (default: none)', () => {
80
+ const globalPrefsExist = existsSync(join(homedir(), ".gsd", "preferences.md"))
81
+ || existsSync(join(homedir(), ".gsd", "PREFERENCES.md"));
82
+ if (!globalPrefsExist) {
83
+ try {
84
+ removeRunnerPreferences(); // ensure no prefs file
85
+ invalidateAllCaches();
86
+ assert.deepStrictEqual(shouldUseWorktreeIsolation(), false, "shouldUseWorktreeIsolation() with no prefs (default none)");
87
+ } finally {
88
+ invalidateAllCaches();
89
+ }
90
+ } else {
87
91
  }
88
- } else {
89
- console.log("Test 4: SKIPPED — global prefs file exists, cannot test bare default");
90
- }
92
+ });
93
+
94
+ // Test 5: getIsolationMode returns "none" when no preferences.md exists (#2480)
95
+ test('getIsolationMode returns "none" with no prefs (default)', () => {
96
+ const globalPrefsExist = existsSync(join(homedir(), ".gsd", "preferences.md"))
97
+ || existsSync(join(homedir(), ".gsd", "PREFERENCES.md"));
98
+ if (!globalPrefsExist) {
99
+ try {
100
+ removeRunnerPreferences();
101
+ invalidateAllCaches();
102
+ assert.deepStrictEqual(getIsolationMode(), "none", "getIsolationMode() with no prefs defaults to none");
103
+ } finally {
104
+ invalidateAllCaches();
105
+ }
106
+ }
107
+ });
91
108
 
92
- // Test 5: getIsolationMode returns "none" with none prefs
93
- console.log("Test 5: getIsolationMode returns 'none' with none prefs");
109
+ test('getIsolationMode returns "none" with none prefs', () => {
94
110
  try {
95
111
  writeRunnerPreferences("none");
96
112
  invalidateAllCaches();
97
- assertEq(getIsolationMode(), "none", "getIsolationMode() with none prefs");
113
+ assert.deepStrictEqual(getIsolationMode(), "none", "getIsolationMode() with none prefs");
114
+ } finally {
115
+ removeRunnerPreferences();
116
+ invalidateAllCaches();
117
+ }
118
+ });
119
+
120
+ test('getIsolationMode returns "worktree" with worktree prefs', () => {
121
+ try {
122
+ writeRunnerPreferences("worktree");
123
+ invalidateAllCaches();
124
+ assert.deepStrictEqual(getIsolationMode(), "worktree", "getIsolationMode() with worktree prefs");
98
125
  } finally {
99
126
  removeRunnerPreferences();
100
127
  invalidateAllCaches();
101
128
  }
129
+ });
102
130
 
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()");
131
+ test('getIsolationMode returns "branch" with branch prefs', () => {
132
+ try {
133
+ writeRunnerPreferences("branch");
134
+ invalidateAllCaches();
135
+ assert.deepStrictEqual(getIsolationMode(), "branch", "getIsolationMode() with branch prefs");
136
+ } finally {
137
+ removeRunnerPreferences();
138
+ invalidateAllCaches();
139
+ }
140
+ });
141
+
142
+ test('getActiveAutoWorktreeContext returns null at baseline', () => {
143
+ assert.deepStrictEqual(getActiveAutoWorktreeContext(), null, "getActiveAutoWorktreeContext() returns null without enterAutoWorktree()");
144
+ });
106
145
 
107
146
  // Test 7: System prompt worktree block absent without active worktree
108
- console.log("Test 7: System prompt worktree block absent without active worktree");
109
- {
147
+
148
+ test('Test 7: System prompt worktree block absent without active worktree', () => {
110
149
  const ctx = getActiveAutoWorktreeContext();
111
- assertTrue(ctx === null, "getActiveAutoWorktreeContext() null confirms system prompt worktree block will not be injected");
112
- }
150
+ assert.ok(ctx === null, "getActiveAutoWorktreeContext() null confirms system prompt worktree block will not be injected");
151
+ });
113
152
 
114
- report();