gsd-pi 2.44.0 → 2.45.0-dev.6b9da3e

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 (463) hide show
  1. package/README.md +30 -12
  2. package/dist/resources/extensions/gsd/activity-log.js +7 -0
  3. package/dist/resources/extensions/gsd/auto/infra-errors.js +3 -0
  4. package/dist/resources/extensions/gsd/auto/phases.js +37 -36
  5. package/dist/resources/extensions/gsd/auto-prompts.js +24 -1
  6. package/dist/resources/extensions/gsd/auto-start.js +31 -2
  7. package/dist/resources/extensions/gsd/auto-timers.js +57 -3
  8. package/dist/resources/extensions/gsd/auto-worktree-sync.js +4 -0
  9. package/dist/resources/extensions/gsd/auto-worktree.js +9 -6
  10. package/dist/resources/extensions/gsd/auto.js +30 -3
  11. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +156 -0
  12. package/dist/resources/extensions/gsd/bootstrap/system-context.js +46 -12
  13. package/dist/resources/extensions/gsd/commands/catalog.js +7 -1
  14. package/dist/resources/extensions/gsd/commands/handlers/core.js +2 -0
  15. package/dist/resources/extensions/gsd/commands/handlers/ops.js +10 -0
  16. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
  17. package/dist/resources/extensions/gsd/commands-mcp-status.js +187 -0
  18. package/dist/resources/extensions/gsd/db-writer.js +34 -16
  19. package/dist/resources/extensions/gsd/doctor.js +8 -0
  20. package/dist/resources/extensions/gsd/git-service.js +8 -3
  21. package/dist/resources/extensions/gsd/gsd-db.js +12 -1
  22. package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
  23. package/dist/resources/extensions/gsd/preferences.js +9 -1
  24. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +2 -4
  25. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  26. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
  27. package/dist/resources/extensions/gsd/prompts/replan-slice.md +3 -14
  28. package/dist/resources/extensions/gsd/prompts/rethink.md +78 -0
  29. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
  30. package/dist/resources/extensions/gsd/provider-error-pause.js +7 -0
  31. package/dist/resources/extensions/gsd/repo-identity.js +45 -7
  32. package/dist/resources/extensions/gsd/rethink.js +115 -0
  33. package/dist/resources/extensions/gsd/state.js +41 -3
  34. package/dist/resources/extensions/gsd/tools/plan-slice.js +1 -0
  35. package/dist/resources/extensions/gsd/tools/plan-task.js +1 -0
  36. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -0
  37. package/dist/resources/extensions/gsd/tools/validate-milestone.js +88 -0
  38. package/dist/resources/extensions/gsd/worktree-manager.js +32 -2
  39. package/dist/resources/extensions/gsd/worktree-resolver.js +6 -0
  40. package/dist/resources/extensions/mcp-client/index.js +14 -0
  41. package/dist/web/standalone/.next/BUILD_ID +1 -1
  42. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  43. package/dist/web/standalone/.next/build-manifest.json +4 -4
  44. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  45. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  46. package/dist/web/standalone/.next/required-server-files.json +3 -3
  47. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  48. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  49. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  50. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  51. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  52. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  53. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  54. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  55. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  56. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  57. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  58. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  59. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  60. package/dist/web/standalone/.next/server/app/_not-found.rsc +5 -5
  61. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +5 -5
  62. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  63. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  64. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  65. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  66. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  67. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  68. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  69. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  70. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  71. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  72. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  73. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  74. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  75. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  76. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  77. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  78. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  79. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  80. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  81. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  82. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  83. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  84. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  85. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  86. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  87. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  88. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  89. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  90. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  91. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  92. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  93. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  94. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  95. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  96. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  98. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  100. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  112. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  118. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  132. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  134. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  136. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  138. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/index.html +1 -1
  148. package/dist/web/standalone/.next/server/app/index.rsc +6 -6
  149. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  150. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +6 -6
  151. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  152. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  153. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  154. package/dist/web/standalone/.next/server/app/page.js +2 -2
  155. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  157. package/dist/web/standalone/.next/server/chunks/229.js +1 -1
  158. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  159. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/middleware.js +2 -2
  162. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  164. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  165. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  166. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  167. package/dist/web/standalone/.next/static/chunks/4024.11ca5c01938e5948.js +9 -0
  168. package/dist/web/standalone/.next/static/chunks/{3721.bf31263de6d5fa46.js → 485.243af25f0cdf50d6.js} +2 -2
  169. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  170. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  171. package/dist/web/standalone/.next/static/chunks/app/page-6654a8cca61a3d1c.js +1 -0
  172. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  173. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  174. package/dist/web/standalone/.next/static/chunks/webpack-0a4cd455ec4197d2.js +1 -0
  175. package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +1 -0
  176. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  177. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  178. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  179. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  180. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  181. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  182. package/dist/web/standalone/server.js +1 -1
  183. package/package.json +1 -1
  184. package/packages/native/dist/stream-process/index.js +2 -2
  185. package/packages/native/src/__tests__/stream-process.test.mjs +34 -0
  186. package/packages/native/src/stream-process/index.ts +2 -2
  187. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +3 -1
  188. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  189. package/packages/pi-coding-agent/dist/core/auth-storage.js +15 -1
  190. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  191. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
  192. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  193. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +24 -26
  194. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  195. package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
  196. package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
  197. package/packages/pi-coding-agent/dist/core/local-model-check.d.ts +15 -0
  198. package/packages/pi-coding-agent/dist/core/local-model-check.d.ts.map +1 -0
  199. package/packages/pi-coding-agent/dist/core/local-model-check.js +41 -0
  200. package/packages/pi-coding-agent/dist/core/local-model-check.js.map +1 -0
  201. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +11 -0
  202. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  203. package/packages/pi-coding-agent/dist/core/model-registry.js +20 -1
  204. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  205. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +34 -44
  206. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
  207. package/packages/pi-coding-agent/dist/core/session-manager.test.js +30 -34
  208. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
  209. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  210. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  211. package/packages/pi-coding-agent/dist/core/settings-manager.js +6 -0
  212. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  213. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
  214. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
  215. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  216. package/packages/pi-coding-agent/dist/main.js +17 -0
  217. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  218. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts +2 -0
  219. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts.map +1 -0
  220. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js +32 -0
  221. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js.map +1 -0
  222. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +3 -1
  223. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  224. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +8 -1
  225. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  226. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  227. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  228. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +12 -0
  229. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  230. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts +15 -0
  231. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts.map +1 -0
  232. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js +40 -0
  233. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js.map +1 -0
  234. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  235. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +4 -1
  236. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  237. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +5 -2
  238. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  239. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +13 -2
  240. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  241. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  242. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +17 -8
  243. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  244. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  245. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +7 -3
  246. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  247. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
  248. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
  249. package/packages/pi-coding-agent/package.json +1 -1
  250. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
  251. package/packages/pi-coding-agent/src/core/auth-storage.ts +15 -1
  252. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
  253. package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
  254. package/packages/pi-coding-agent/src/core/local-model-check.ts +45 -0
  255. package/packages/pi-coding-agent/src/core/model-registry.ts +21 -1
  256. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
  257. package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
  258. package/packages/pi-coding-agent/src/core/settings-manager.ts +9 -0
  259. package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
  260. package/packages/pi-coding-agent/src/main.ts +19 -0
  261. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/timestamp.test.ts +38 -0
  262. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +10 -0
  263. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
  264. package/packages/pi-coding-agent/src/modes/interactive/components/timestamp.ts +48 -0
  265. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +3 -1
  266. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +18 -3
  267. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +16 -7
  268. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +8 -1
  269. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
  270. package/pkg/package.json +1 -1
  271. package/src/resources/extensions/gsd/activity-log.ts +1 -0
  272. package/src/resources/extensions/gsd/auto/infra-errors.ts +3 -0
  273. package/src/resources/extensions/gsd/auto/phases.ts +46 -48
  274. package/src/resources/extensions/gsd/auto-prompts.ts +24 -1
  275. package/src/resources/extensions/gsd/auto-start.ts +39 -2
  276. package/src/resources/extensions/gsd/auto-timers.ts +64 -3
  277. package/src/resources/extensions/gsd/auto-worktree-sync.ts +5 -0
  278. package/src/resources/extensions/gsd/auto-worktree.ts +9 -6
  279. package/src/resources/extensions/gsd/auto.ts +37 -3
  280. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +148 -0
  281. package/src/resources/extensions/gsd/bootstrap/system-context.ts +48 -11
  282. package/src/resources/extensions/gsd/commands/catalog.ts +7 -1
  283. package/src/resources/extensions/gsd/commands/handlers/core.ts +2 -0
  284. package/src/resources/extensions/gsd/commands/handlers/ops.ts +10 -0
  285. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
  286. package/src/resources/extensions/gsd/commands-mcp-status.ts +247 -0
  287. package/src/resources/extensions/gsd/db-writer.ts +39 -17
  288. package/src/resources/extensions/gsd/doctor.ts +7 -1
  289. package/src/resources/extensions/gsd/git-service.ts +6 -2
  290. package/src/resources/extensions/gsd/gsd-db.ts +16 -1
  291. package/src/resources/extensions/gsd/markdown-renderer.ts +1 -1
  292. package/src/resources/extensions/gsd/preferences.ts +11 -1
  293. package/src/resources/extensions/gsd/prompts/complete-milestone.md +2 -4
  294. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  295. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
  296. package/src/resources/extensions/gsd/prompts/replan-slice.md +3 -14
  297. package/src/resources/extensions/gsd/prompts/rethink.md +78 -0
  298. package/src/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
  299. package/src/resources/extensions/gsd/provider-error-pause.ts +9 -0
  300. package/src/resources/extensions/gsd/repo-identity.ts +46 -7
  301. package/src/resources/extensions/gsd/rethink.ts +154 -0
  302. package/src/resources/extensions/gsd/state.ts +41 -1
  303. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
  304. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +14 -16
  305. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
  306. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +88 -0
  307. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
  308. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +465 -523
  309. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
  310. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
  311. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +533 -656
  312. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
  313. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
  314. package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
  315. package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
  316. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
  317. package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
  318. package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
  319. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +38 -59
  320. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +228 -263
  321. package/src/resources/extensions/gsd/tests/complete-task.test.ts +250 -302
  322. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +114 -0
  323. package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
  324. package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
  325. package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
  326. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +27 -35
  327. package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
  328. package/src/resources/extensions/gsd/tests/db-writer.test.ts +465 -416
  329. package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
  330. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +68 -83
  331. package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +121 -0
  332. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +210 -181
  333. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
  334. package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
  335. package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
  336. package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
  337. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +164 -180
  338. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
  339. package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
  340. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +27 -29
  341. package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
  342. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +54 -75
  343. package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +21 -32
  344. package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
  345. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -44
  346. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
  347. package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
  348. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +54 -60
  349. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
  350. package/src/resources/extensions/gsd/tests/doctor.test.ts +104 -134
  351. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
  352. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +120 -0
  353. package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
  354. package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
  355. package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
  356. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +30 -42
  357. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +198 -206
  358. package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
  359. package/src/resources/extensions/gsd/tests/git-service.test.ts +285 -388
  360. package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
  361. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
  362. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
  363. package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
  364. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +81 -103
  365. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
  366. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
  367. package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
  368. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +81 -102
  369. package/src/resources/extensions/gsd/tests/infra-error.test.ts +20 -2
  370. package/src/resources/extensions/gsd/tests/inherited-repo-home-dir.test.ts +121 -0
  371. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
  372. package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
  373. package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
  374. package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
  375. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +18 -18
  376. package/src/resources/extensions/gsd/tests/knowledge.test.ts +89 -0
  377. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +150 -194
  378. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +103 -0
  379. package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
  380. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
  381. package/src/resources/extensions/gsd/tests/memory-store.test.ts +80 -93
  382. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +66 -0
  383. package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
  384. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +83 -93
  385. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
  386. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
  387. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
  388. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +87 -96
  389. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +125 -164
  390. package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
  391. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +35 -36
  392. package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
  393. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +40 -47
  394. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +25 -28
  395. package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
  396. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
  397. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
  398. package/src/resources/extensions/gsd/tests/parsers.test.ts +546 -611
  399. package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
  400. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
  401. package/src/resources/extensions/gsd/tests/preferences.test.ts +27 -0
  402. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +11 -7
  403. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
  404. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
  405. package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
  406. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
  407. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
  408. package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
  409. package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
  410. package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +176 -0
  411. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +73 -80
  412. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
  413. package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
  414. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
  415. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
  416. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
  417. package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
  418. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
  419. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -44
  420. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +19 -26
  421. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
  422. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
  423. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +67 -0
  424. package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +108 -0
  425. package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
  426. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +49 -0
  427. package/src/resources/extensions/gsd/tests/token-savings.test.ts +54 -56
  428. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +23 -25
  429. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +10 -11
  430. package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
  431. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
  432. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -22
  433. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
  434. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
  435. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
  436. package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
  437. package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
  438. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +50 -52
  439. package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
  440. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
  441. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
  442. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
  443. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
  444. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
  445. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +65 -0
  446. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
  447. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
  448. package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
  449. package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -0
  450. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -0
  451. package/src/resources/extensions/gsd/tools/replan-slice.ts +3 -0
  452. package/src/resources/extensions/gsd/tools/validate-milestone.ts +127 -0
  453. package/src/resources/extensions/gsd/worktree-manager.ts +43 -2
  454. package/src/resources/extensions/gsd/worktree-resolver.ts +7 -0
  455. package/src/resources/extensions/mcp-client/index.ts +20 -0
  456. package/dist/web/standalone/.next/static/chunks/4024.0de81b543b28b9fe.js +0 -9
  457. package/dist/web/standalone/.next/static/chunks/app/page-7e9530a7122506c5.js +0 -1
  458. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  459. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  460. package/dist/web/standalone/.next/static/chunks/webpack-9014b5adb127a98a.js +0 -1
  461. package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +0 -1
  462. /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → rzO54ZboyINyEt7cVM_uS}/_buildManifest.js +0 -0
  463. /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → rzO54ZboyINyEt7cVM_uS}/_ssgManifest.js +0 -0
@@ -1,3 +1,5 @@
1
+ import { describe, test } from 'node:test';
2
+ import assert from 'node:assert/strict';
1
3
  /**
2
4
  * doctor-proactive.test.ts — Tests for proactive healing layer.
3
5
  *
@@ -22,10 +24,6 @@ import {
22
24
  resetProactiveHealing,
23
25
  formatHealthSummary,
24
26
  } from "../doctor-proactive.ts";
25
- import { createTestContext } from "./test-helpers.ts";
26
-
27
- const { assertEq, assertTrue, report } = createTestContext();
28
-
29
27
  function run(cmd: string, cwd: string): string {
30
28
  return execSync(cmd, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
31
29
  }
@@ -70,44 +68,40 @@ _None_
70
68
  return dir;
71
69
  }
72
70
 
73
- async function main(): Promise<void> {
71
+ describe('doctor-proactive', async () => {
74
72
  const cleanups: string[] = [];
75
73
 
76
74
  try {
77
75
  // ─── Health Score Tracking ─────────────────────────────────────────
78
- console.log("\n=== health tracking: initial state ===");
79
- {
76
+ test('health tracking: initial state', () => {
80
77
  resetProactiveHealing();
81
- assertEq(getHealthTrend(), "unknown", "trend is unknown with no data");
82
- assertEq(getConsecutiveErrorUnits(), 0, "no consecutive errors initially");
83
- assertEq(getHealthHistory().length, 0, "no history initially");
84
- }
78
+ assert.deepStrictEqual(getHealthTrend(), "unknown", "trend is unknown with no data");
79
+ assert.deepStrictEqual(getConsecutiveErrorUnits(), 0, "no consecutive errors initially");
80
+ assert.deepStrictEqual(getHealthHistory().length, 0, "no history initially");
81
+ });
85
82
 
86
- console.log("\n=== health tracking: recording snapshots ===");
87
- {
83
+ test('health tracking: recording snapshots', () => {
88
84
  resetProactiveHealing();
89
85
  recordHealthSnapshot(0, 2, 1);
90
86
  recordHealthSnapshot(0, 1, 0);
91
87
  recordHealthSnapshot(0, 0, 0);
92
88
 
93
- assertEq(getHealthHistory().length, 3, "3 snapshots recorded");
94
- assertEq(getConsecutiveErrorUnits(), 0, "no consecutive errors after clean units");
95
- }
89
+ assert.deepStrictEqual(getHealthHistory().length, 3, "3 snapshots recorded");
90
+ assert.deepStrictEqual(getConsecutiveErrorUnits(), 0, "no consecutive errors after clean units");
91
+ });
96
92
 
97
- console.log("\n=== health tracking: consecutive error counting ===");
98
- {
93
+ test('health tracking: consecutive error counting', () => {
99
94
  resetProactiveHealing();
100
95
  recordHealthSnapshot(2, 1, 0); // errors
101
96
  recordHealthSnapshot(1, 0, 0); // errors
102
97
  recordHealthSnapshot(1, 0, 0); // errors
103
- assertEq(getConsecutiveErrorUnits(), 3, "3 consecutive error units");
98
+ assert.deepStrictEqual(getConsecutiveErrorUnits(), 3, "3 consecutive error units");
104
99
 
105
100
  recordHealthSnapshot(0, 0, 0); // clean
106
- assertEq(getConsecutiveErrorUnits(), 0, "streak reset on clean unit");
107
- }
101
+ assert.deepStrictEqual(getConsecutiveErrorUnits(), 0, "streak reset on clean unit");
102
+ });
108
103
 
109
- console.log("\n=== health tracking: trend detection ===");
110
- {
104
+ test('health tracking: trend detection', () => {
111
105
  resetProactiveHealing();
112
106
  // Record 5 older snapshots with low issues
113
107
  for (let i = 0; i < 5; i++) {
@@ -117,11 +111,10 @@ async function main(): Promise<void> {
117
111
  for (let i = 0; i < 5; i++) {
118
112
  recordHealthSnapshot(3, 5, 0);
119
113
  }
120
- assertEq(getHealthTrend(), "degrading", "detects degrading trend");
121
- }
114
+ assert.deepStrictEqual(getHealthTrend(), "degrading", "detects degrading trend");
115
+ });
122
116
 
123
- console.log("\n=== health tracking: improving trend ===");
124
- {
117
+ test('health tracking: improving trend', () => {
125
118
  resetProactiveHealing();
126
119
  // Record 5 older snapshots with high issues
127
120
  for (let i = 0; i < 5; i++) {
@@ -131,32 +124,29 @@ async function main(): Promise<void> {
131
124
  for (let i = 0; i < 5; i++) {
132
125
  recordHealthSnapshot(0, 0, 0);
133
126
  }
134
- assertEq(getHealthTrend(), "improving", "detects improving trend");
135
- }
127
+ assert.deepStrictEqual(getHealthTrend(), "improving", "detects improving trend");
128
+ });
136
129
 
137
- console.log("\n=== health tracking: stable trend ===");
138
- {
130
+ test('health tracking: stable trend', () => {
139
131
  resetProactiveHealing();
140
132
  for (let i = 0; i < 10; i++) {
141
133
  recordHealthSnapshot(1, 1, 0);
142
134
  }
143
- assertEq(getHealthTrend(), "stable", "detects stable trend");
144
- }
135
+ assert.deepStrictEqual(getHealthTrend(), "stable", "detects stable trend");
136
+ });
145
137
 
146
138
  // ─── Auto-Heal Escalation ─────────────────────────────────────────
147
- console.log("\n=== escalation: below threshold ===");
148
- {
139
+ test('escalation: below threshold', () => {
149
140
  resetProactiveHealing();
150
141
  recordHealthSnapshot(1, 0, 0);
151
142
  recordHealthSnapshot(1, 0, 0);
152
143
  recordHealthSnapshot(1, 0, 0);
153
144
  const result = checkHealEscalation(1, [{ code: "test", message: "test error", unitId: "M001/S01" }]);
154
- assertEq(result.shouldEscalate, false, "no escalation below threshold");
155
- assertTrue(result.reason.includes("3/5"), "reason shows progress toward threshold");
156
- }
145
+ assert.deepStrictEqual(result.shouldEscalate, false, "no escalation below threshold");
146
+ assert.ok(result.reason.includes("3/5"), "reason shows progress toward threshold");
147
+ });
157
148
 
158
- console.log("\n=== escalation: at threshold ===");
159
- {
149
+ test('escalation: at threshold', () => {
160
150
  resetProactiveHealing();
161
151
  // Need 5+ consecutive error units AND degrading/stable trend
162
152
  for (let i = 0; i < 5; i++) {
@@ -166,21 +156,19 @@ async function main(): Promise<void> {
166
156
  recordHealthSnapshot(2, 1, 0); // recent error snapshots
167
157
  }
168
158
  const result = checkHealEscalation(2, [{ code: "test", message: "test error", unitId: "M001/S01" }]);
169
- assertEq(result.shouldEscalate, true, "escalates at threshold with degrading trend");
170
- assertTrue(result.reason.includes("5 consecutive"), "reason mentions consecutive count");
171
- }
159
+ assert.deepStrictEqual(result.shouldEscalate, true, "escalates at threshold with degrading trend");
160
+ assert.ok(result.reason.includes("5 consecutive"), "reason mentions consecutive count");
161
+ });
172
162
 
173
- console.log("\n=== escalation: no double escalation ===");
174
- {
163
+ test('escalation: no double escalation', () => {
175
164
  // Don't reset — should already be escalated from previous test
176
165
  recordHealthSnapshot(2, 0, 0);
177
166
  const result = checkHealEscalation(2, [{ code: "test", message: "test error", unitId: "M001/S01" }]);
178
- assertEq(result.shouldEscalate, false, "no double escalation in same session");
179
- assertTrue(result.reason.includes("already escalated"), "reason explains why no escalation");
180
- }
167
+ assert.deepStrictEqual(result.shouldEscalate, false, "no double escalation in same session");
168
+ assert.ok(result.reason.includes("already escalated"), "reason explains why no escalation");
169
+ });
181
170
 
182
- console.log("\n=== escalation: deferred when improving ===");
183
- {
171
+ test('escalation: deferred when improving', () => {
184
172
  resetProactiveHealing();
185
173
  // 5 older snapshots with high errors
186
174
  for (let i = 0; i < 5; i++) {
@@ -191,37 +179,34 @@ async function main(): Promise<void> {
191
179
  recordHealthSnapshot(1, 0, 0);
192
180
  }
193
181
  const result = checkHealEscalation(1, [{ code: "test", message: "test error", unitId: "M001/S01" }]);
194
- assertEq(result.shouldEscalate, false, "no escalation when trend is improving");
195
- assertTrue(result.reason.includes("improving"), "reason mentions improving trend");
196
- }
182
+ assert.deepStrictEqual(result.shouldEscalate, false, "no escalation when trend is improving");
183
+ assert.ok(result.reason.includes("improving"), "reason mentions improving trend");
184
+ });
197
185
 
198
186
  // ─── Health Summary Formatting ────────────────────────────────────
199
- console.log("\n=== formatHealthSummary ===");
200
- {
187
+ test('formatHealthSummary', () => {
201
188
  resetProactiveHealing();
202
- assertEq(formatHealthSummary(), "No health data yet.", "empty summary when no data");
189
+ assert.deepStrictEqual(formatHealthSummary(), "No health data yet.", "empty summary when no data");
203
190
 
204
191
  recordHealthSnapshot(2, 3, 1);
205
192
  const summary = formatHealthSummary();
206
- assertTrue(summary.includes("2 errors") && summary.includes("3 warnings"), "summary includes error/warning counts");
207
- assertTrue(summary.includes("1 fix applied"), "summary includes fix count");
208
- assertTrue(summary.includes("1 of 5 consecutive errors"), "summary includes error streak");
209
- }
193
+ assert.ok(summary.includes("2 errors") && summary.includes("3 warnings"), "summary includes error/warning counts");
194
+ assert.ok(summary.includes("1 fix applied"), "summary includes fix count");
195
+ assert.ok(summary.includes("1 of 5 consecutive errors"), "summary includes error streak");
196
+ });
210
197
 
211
198
  // ─── Pre-Dispatch Health Gate ─────────────────────────────────────
212
- console.log("\n=== health gate: clean state ===");
213
- {
199
+ test('health gate: clean state', async () => {
214
200
  const dir = realpathSync(mkdtempSync(join(tmpdir(), "doc-proactive-")));
215
201
  cleanups.push(dir);
216
202
  mkdirSync(join(dir, ".gsd"), { recursive: true });
217
203
 
218
204
  const result = await preDispatchHealthGate(dir);
219
- assertTrue(result.proceed, "gate passes on clean state");
220
- assertEq(result.issues.length, 0, "no issues on clean state");
221
- }
205
+ assert.ok(result.proceed, "gate passes on clean state");
206
+ assert.deepStrictEqual(result.issues.length, 0, "no issues on clean state");
207
+ });
222
208
 
223
- console.log("\n=== health gate: missing STATE.md does NOT block dispatch (#889) ===");
224
- {
209
+ test('health gate: missing STATE.md does NOT block dispatch (#889)', async () => {
225
210
  const dir = realpathSync(mkdtempSync(join(tmpdir(), "doc-proactive-")));
226
211
  cleanups.push(dir);
227
212
  // Create milestones dir but no STATE.md — mimics fresh worktree
@@ -229,13 +214,12 @@ async function main(): Promise<void> {
229
214
  writeFileSync(join(dir, ".gsd", "milestones", "M001", "M001-ROADMAP.md"), "# Roadmap\n");
230
215
 
231
216
  const result = await preDispatchHealthGate(dir);
232
- assertTrue(result.proceed, "gate must NOT block when STATE.md is missing (deadlock #889)");
233
- assertEq(result.issues.length, 0, "missing STATE.md is not a blocking issue");
234
- assertTrue(result.fixesApplied.some((f: string) => f.includes("STATE.md")), "reports STATE.md status as info");
235
- }
217
+ assert.ok(result.proceed, "gate must NOT block when STATE.md is missing (deadlock #889)");
218
+ assert.deepStrictEqual(result.issues.length, 0, "missing STATE.md is not a blocking issue");
219
+ assert.ok(result.fixesApplied.some((f: string) => f.includes("STATE.md")), "reports STATE.md status as info");
220
+ });
236
221
 
237
- console.log("\n=== health gate: stale crash lock auto-cleared ===");
238
- {
222
+ test('health gate: stale crash lock auto-cleared', async () => {
239
223
  const dir = realpathSync(mkdtempSync(join(tmpdir(), "doc-proactive-")));
240
224
  cleanups.push(dir);
241
225
  mkdirSync(join(dir, ".gsd"), { recursive: true });
@@ -248,12 +232,12 @@ async function main(): Promise<void> {
248
232
  }));
249
233
 
250
234
  const result = await preDispatchHealthGate(dir);
251
- assertTrue(result.proceed, "gate passes after auto-clearing stale lock");
252
- assertTrue(result.fixesApplied.some(f => f.includes("cleared stale auto.lock")), "reports lock cleared");
253
- assertTrue(!existsSync(join(dir, ".gsd", "auto.lock")), "lock file removed");
254
- }
235
+ assert.ok(result.proceed, "gate passes after auto-clearing stale lock");
236
+ assert.ok(result.fixesApplied.some(f => f.includes("cleared stale auto.lock")), "reports lock cleared");
237
+ assert.ok(!existsSync(join(dir, ".gsd", "auto.lock")), "lock file removed");
238
+ });
255
239
 
256
- console.log("\n=== health gate: corrupt merge state auto-healed ===");
240
+ test('health gate: corrupt merge state auto-healed', async () => {
257
241
  if (process.platform !== "win32") {
258
242
  {
259
243
  const dir = createGitRepo();
@@ -264,36 +248,35 @@ async function main(): Promise<void> {
264
248
  writeFileSync(join(dir, ".git", "MERGE_HEAD"), headHash + "\n");
265
249
 
266
250
  const result = await preDispatchHealthGate(dir);
267
- assertTrue(result.proceed, "gate passes after auto-healing merge state");
268
- assertTrue(result.fixesApplied.some(f => f.includes("cleaned merge state")), "reports merge state cleaned");
269
- assertTrue(!existsSync(join(dir, ".git", "MERGE_HEAD")), "MERGE_HEAD removed");
251
+ assert.ok(result.proceed, "gate passes after auto-healing merge state");
252
+ assert.ok(result.fixesApplied.some(f => f.includes("cleaned merge state")), "reports merge state cleaned");
253
+ assert.ok(!existsSync(join(dir, ".git", "MERGE_HEAD")), "MERGE_HEAD removed");
270
254
  }
271
255
  } else {
272
256
  console.log(" (skipped on Windows)");
273
257
  }
258
+ });
274
259
 
275
- console.log("\n=== health gate: STATE.md missing — auto-healed ===");
276
- {
260
+ test('health gate: STATE.md missing — auto-healed', async () => {
277
261
  const dir = realpathSync(mkdtempSync(join(tmpdir(), "doc-proactive-")));
278
262
  cleanups.push(dir);
279
263
  // Minimal .gsd structure: milestones dir exists but no STATE.md
280
264
  mkdirSync(join(dir, ".gsd", "milestones"), { recursive: true });
281
265
 
282
266
  const stateFile = join(dir, ".gsd", "STATE.md");
283
- assertTrue(!existsSync(stateFile), "STATE.md does not exist before gate");
267
+ assert.ok(!existsSync(stateFile), "STATE.md does not exist before gate");
284
268
 
285
269
  const result = await preDispatchHealthGate(dir);
286
- assertTrue(result.proceed, "gate passes after rebuilding STATE.md");
287
- assertTrue(
270
+ assert.ok(result.proceed, "gate passes after rebuilding STATE.md");
271
+ assert.ok(
288
272
  result.fixesApplied.some(f => f.includes("rebuilt missing STATE.md")),
289
273
  "reports STATE.md rebuilt",
290
274
  );
291
- assertTrue(existsSync(stateFile), "STATE.md created by auto-heal");
292
- assertTrue(result.issues.length === 0, "no blocking issues after heal");
293
- }
275
+ assert.ok(existsSync(stateFile), "STATE.md created by auto-heal");
276
+ assert.ok(result.issues.length === 0, "no blocking issues after heal");
277
+ });
294
278
 
295
- console.log("\n=== health gate: stale integration branch uses detected fallback ===");
296
- {
279
+ test('health gate: stale integration branch uses detected fallback', async () => {
297
280
  const dir = createRepoWithActiveMilestone();
298
281
  cleanups.push(dir);
299
282
 
@@ -301,16 +284,15 @@ async function main(): Promise<void> {
301
284
  writeFileSync(metaPath, JSON.stringify({ integrationBranch: "feature/missing" }, null, 2));
302
285
 
303
286
  const result = await preDispatchHealthGate(dir);
304
- assertTrue(result.proceed, "gate does not block when stale integration branch has detected fallback");
305
- assertEq(result.issues.length, 0, "stale integration branch with fallback is not a blocking issue");
306
- assertTrue(
287
+ assert.ok(result.proceed, "gate does not block when stale integration branch has detected fallback");
288
+ assert.deepStrictEqual(result.issues.length, 0, "stale integration branch with fallback is not a blocking issue");
289
+ assert.ok(
307
290
  result.fixesApplied.some(f => f.includes('feature/missing') && f.includes('main')),
308
291
  "fixesApplied reports stale recorded branch and detected fallback branch",
309
292
  );
310
- }
293
+ });
311
294
 
312
- console.log("\n=== health gate: stale integration branch uses configured fallback ===");
313
- {
295
+ test('health gate: stale integration branch uses configured fallback', async () => {
314
296
  const dir = createRepoWithActiveMilestone();
315
297
  cleanups.push(dir);
316
298
 
@@ -323,16 +305,16 @@ async function main(): Promise<void> {
323
305
  process.chdir(dir);
324
306
  try {
325
307
  const result = await preDispatchHealthGate(dir);
326
- assertTrue(result.proceed, "gate does not block when configured main_branch can be used as fallback");
327
- assertEq(result.issues.length, 0, "configured fallback is not treated as a blocking issue");
328
- assertTrue(
308
+ assert.ok(result.proceed, "gate does not block when configured main_branch can be used as fallback");
309
+ assert.deepStrictEqual(result.issues.length, 0, "configured fallback is not treated as a blocking issue");
310
+ assert.ok(
329
311
  result.fixesApplied.some(f => f.includes('feature/missing') && f.includes('trunk')),
330
312
  "fixesApplied reports stale recorded branch and configured fallback branch",
331
313
  );
332
314
  } finally {
333
315
  process.chdir(previousCwd);
334
316
  }
335
- }
317
+ });
336
318
 
337
319
  } finally {
338
320
  resetProactiveHealing();
@@ -340,8 +322,4 @@ async function main(): Promise<void> {
340
322
  try { rmSync(dir, { recursive: true, force: true }); } catch { /* ignore */ }
341
323
  }
342
324
  }
343
-
344
- report();
345
- }
346
-
347
- main();
325
+ });
@@ -58,72 +58,66 @@ Done.
58
58
  `);
59
59
  }
60
60
 
61
- test("fixLevel:task — roadmap checkbox is never toggled by doctor (reconciliation removed)", async () => {
61
+ test("fixLevel:task — roadmap checkbox is never toggled by doctor (reconciliation removed)", async (t) => {
62
62
  const tmp = makeTmp("no-roadmap-toggle");
63
- try {
64
- buildScaffold(tmp);
65
-
66
- const report = await runGSDDoctor(tmp, { fix: true, fixLevel: "task" });
67
-
68
- // Roadmap must remain unchecked — doctor no longer touches checkboxes
69
- const roadmapContent = readFileSync(join(tmp, ".gsd", "milestones", "M001", "M001-ROADMAP.md"), "utf8");
70
- assert.ok(
71
- roadmapContent.includes("- [ ] **S01"),
72
- "roadmap should remain unchecked — doctor no longer toggles checkboxes"
73
- );
74
-
75
- // No summary or UAT stubs created
76
- const sliceSummaryPath = join(tmp, ".gsd", "milestones", "M001", "slices", "S01", "S01-SUMMARY.md");
77
- assert.ok(!existsSync(sliceSummaryPath), "summary should NOT be created");
78
- } finally {
79
- rmSync(tmp, { recursive: true, force: true });
80
- }
63
+ t.after(() => rmSync(tmp, { recursive: true, force: true }));
64
+
65
+ buildScaffold(tmp);
66
+
67
+ const report = await runGSDDoctor(tmp, { fix: true, fixLevel: "task" });
68
+
69
+ // Roadmap must remain unchecked doctor no longer touches checkboxes
70
+ const roadmapContent = readFileSync(join(tmp, ".gsd", "milestones", "M001", "M001-ROADMAP.md"), "utf8");
71
+ assert.ok(
72
+ roadmapContent.includes("- [ ] **S01"),
73
+ "roadmap should remain unchecked — doctor no longer toggles checkboxes"
74
+ );
75
+
76
+ // No summary or UAT stubs created
77
+ const sliceSummaryPath = join(tmp, ".gsd", "milestones", "M001", "slices", "S01", "S01-SUMMARY.md");
78
+ assert.ok(!existsSync(sliceSummaryPath), "summary should NOT be created");
81
79
  });
82
80
 
83
- test("fixLevel:all — roadmap checkbox is never toggled by doctor (reconciliation removed)", async () => {
81
+ test("fixLevel:all — roadmap checkbox is never toggled by doctor (reconciliation removed)", async (t) => {
84
82
  const tmp = makeTmp("all-no-toggle");
85
- try {
86
- buildScaffold(tmp);
87
-
88
- const report = await runGSDDoctor(tmp, { fix: true });
89
-
90
- // Even at fixLevel:all, doctor no longer creates stubs or toggles checkboxes
91
- const roadmapContent = readFileSync(join(tmp, ".gsd", "milestones", "M001", "M001-ROADMAP.md"), "utf8");
92
- assert.ok(
93
- roadmapContent.includes("- [ ] **S01"),
94
- "roadmap should remain unchecked — reconciliation removed"
95
- );
96
-
97
- const sliceSummaryPath = join(tmp, ".gsd", "milestones", "M001", "slices", "S01", "S01-SUMMARY.md");
98
- assert.ok(!existsSync(sliceSummaryPath), "summary should NOT be created");
99
- } finally {
100
- rmSync(tmp, { recursive: true, force: true });
101
- }
83
+ t.after(() => rmSync(tmp, { recursive: true, force: true }));
84
+
85
+ buildScaffold(tmp);
86
+
87
+ const report = await runGSDDoctor(tmp, { fix: true });
88
+
89
+ // Even at fixLevel:all, doctor no longer creates stubs or toggles checkboxes
90
+ const roadmapContent = readFileSync(join(tmp, ".gsd", "milestones", "M001", "M001-ROADMAP.md"), "utf8");
91
+ assert.ok(
92
+ roadmapContent.includes("- [ ] **S01"),
93
+ "roadmap should remain unchecked — reconciliation removed"
94
+ );
95
+
96
+ const sliceSummaryPath = join(tmp, ".gsd", "milestones", "M001", "slices", "S01", "S01-SUMMARY.md");
97
+ assert.ok(!existsSync(sliceSummaryPath), "summary should NOT be created");
102
98
  });
103
99
 
104
- test("consecutive doctor runs produce no reconciliation codes", async () => {
100
+ test("consecutive doctor runs produce no reconciliation codes", async (t) => {
105
101
  const tmp = makeTmp("consecutive-clean");
106
- try {
107
- buildScaffold(tmp);
108
-
109
- await runGSDDoctor(tmp, { fix: true, fixLevel: "task" });
110
- const report2 = await runGSDDoctor(tmp, { fix: true, fixLevel: "task" });
111
-
112
- const REMOVED_CODES = [
113
- "task_done_missing_summary",
114
- "task_summary_without_done_checkbox",
115
- "all_tasks_done_missing_slice_summary",
116
- "all_tasks_done_missing_slice_uat",
117
- "all_tasks_done_roadmap_not_checked",
118
- "slice_checked_missing_summary",
119
- "slice_checked_missing_uat",
120
- ];
121
-
122
- const codes = report2.issues.map(i => i.code);
123
- for (const removed of REMOVED_CODES) {
124
- assert.ok(!codes.includes(removed as any), `should NOT report removed code: ${removed}`);
125
- }
126
- } finally {
127
- rmSync(tmp, { recursive: true, force: true });
102
+ t.after(() => rmSync(tmp, { recursive: true, force: true }));
103
+
104
+ buildScaffold(tmp);
105
+
106
+ await runGSDDoctor(tmp, { fix: true, fixLevel: "task" });
107
+ const report2 = await runGSDDoctor(tmp, { fix: true, fixLevel: "task" });
108
+
109
+ const REMOVED_CODES = [
110
+ "task_done_missing_summary",
111
+ "task_summary_without_done_checkbox",
112
+ "all_tasks_done_missing_slice_summary",
113
+ "all_tasks_done_missing_slice_uat",
114
+ "all_tasks_done_roadmap_not_checked",
115
+ "slice_checked_missing_summary",
116
+ "slice_checked_missing_uat",
117
+ ];
118
+
119
+ const codes = report2.issues.map(i => i.code);
120
+ for (const removed of REMOVED_CODES) {
121
+ assert.ok(!codes.includes(removed as any), `should NOT report removed code: ${removed}`);
128
122
  }
129
123
  });