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
@@ -17,6 +17,7 @@ import { createWorktree, removeWorktree, resolveGitDir, worktreePath, } from "./
17
17
  import { detectWorktreeName, nudgeGitBranchCache, } from "./worktree.js";
18
18
  import { MergeConflictError, readIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
19
19
  import { debugLog } from "./debug-logger.js";
20
+ import { logWarning } from "./workflow-logger.js";
20
21
  import { loadEffectiveGSDPreferences } from "./preferences.js";
21
22
  import { nativeGetCurrentBranch, nativeDetectMainBranch, nativeWorkingTreeStatus, nativeAddAllWithExclusions, nativeCommit, nativeCheckoutBranch, nativeMergeSquash, nativeConflictFiles, nativeCheckoutTheirs, nativeAddPaths, nativeRmForce, nativeBranchDelete, nativeBranchExists, nativeDiffNumstat, nativeUpdateRef, nativeIsAncestor, } from "./native-git-bridge.js";
22
23
  // ─── Module State ──────────────────────────────────────────────────────────
@@ -109,6 +110,7 @@ export function syncGsdStateToWorktree(mainBasePath, worktreePath_) {
109
110
  "OVERRIDES.md",
110
111
  "QUEUE.md",
111
112
  "completed-units.json",
113
+ "metrics.json",
112
114
  ];
113
115
  for (const f of rootFiles) {
114
116
  const src = join(mainGsd, f);
@@ -269,8 +271,9 @@ export function syncWorktreeStateBack(mainBasePath, worktreePath, milestoneId) {
269
271
  // ── 1. Sync root-level .gsd/ files back ──────────────────────────────
270
272
  // The worktree is authoritative — complete-milestone updates REQUIREMENTS,
271
273
  // PROJECT, etc. These must overwrite main's copies so they survive teardown.
272
- // Also includes QUEUE.md and completed-units.json which are written during
273
- // milestone closeout and lost on teardown without explicit sync (#1787).
274
+ // Also includes QUEUE.md, completed-units.json, and metrics.json which are
275
+ // written during milestone closeout and lost on teardown without explicit sync
276
+ // (#1787, #2313).
274
277
  const rootFiles = [
275
278
  "DECISIONS.md",
276
279
  "REQUIREMENTS.md",
@@ -279,6 +282,7 @@ export function syncWorktreeStateBack(mainBasePath, worktreePath, milestoneId) {
279
282
  "OVERRIDES.md",
280
283
  "QUEUE.md",
281
284
  "completed-units.json",
285
+ "metrics.json",
282
286
  ];
283
287
  for (const f of rootFiles) {
284
288
  const src = join(wtGsd, f);
@@ -612,7 +616,7 @@ export function createAutoWorktree(basePath, milestoneId) {
612
616
  const hookError = runWorktreePostCreateHook(basePath, info.path);
613
617
  if (hookError) {
614
618
  // Non-fatal — log but don't prevent worktree usage
615
- console.error(`[GSD] ${hookError}`);
619
+ logWarning("reconcile", hookError, { worktree: info.name });
616
620
  }
617
621
  const previousCwd = process.cwd();
618
622
  try {
@@ -687,9 +691,9 @@ export function teardownAutoWorktree(originalBasePath, milestoneId, opts = {}) {
687
691
  // backslashes (#1436), leaving ~1 GB+ orphaned directories.
688
692
  const wtDir = worktreePath(originalBasePath, milestoneId);
689
693
  if (existsSync(wtDir)) {
690
- console.error(`[GSD] WARNING: Worktree directory still exists after teardown: ${wtDir}\n` +
691
- ` This is likely an orphaned directory consuming disk space.\n` +
692
- ` Remove it manually with: rm -rf "${wtDir.replaceAll("\\", "/")}"`);
694
+ logWarning("reconcile", `Worktree directory still exists after teardown: ${wtDir}. ` +
695
+ `This is likely an orphaned directory consuming disk space. ` +
696
+ `Remove it manually with: rm -rf "${wtDir.replaceAll("\\", "/")}"`, { worktree: milestoneId });
693
697
  // Attempt a direct filesystem removal as a fallback
694
698
  try {
695
699
  rmSync(wtDir, { recursive: true, force: true });
@@ -1133,9 +1137,9 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
1133
1137
  // Push failure is non-fatal
1134
1138
  }
1135
1139
  }
1136
- // 9b. Auto-create PR if enabled (requires push_branches + push succeeded)
1140
+ // 9b. Auto-create PR if enabled (#2302: no longer gated on pushed/auto_push)
1137
1141
  let prCreated = false;
1138
- if (prefs.auto_pr === true && pushed) {
1142
+ if (prefs.auto_pr === true && !nothingToCommit) {
1139
1143
  const remote = prefs.remote ?? "origin";
1140
1144
  const prTarget = prefs.pr_target_branch ?? mainBranch;
1141
1145
  try {
@@ -1145,9 +1149,9 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
1145
1149
  stdio: ["ignore", "pipe", "pipe"],
1146
1150
  encoding: "utf-8",
1147
1151
  });
1148
- // Create PR via gh CLI
1152
+ // Create PR via gh CLI with explicit --head and --base (#2302)
1149
1153
  execFileSync("gh", [
1150
- "pr", "create",
1154
+ "pr", "create", "--draft",
1151
1155
  "--base", prTarget,
1152
1156
  "--head", milestoneBranch,
1153
1157
  "--title", `Milestone ${milestoneId} complete`,
@@ -82,11 +82,10 @@ const s = new AutoSession();
82
82
  const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
83
83
  export function shouldUseWorktreeIsolation() {
84
84
  const prefs = loadEffectiveGSDPreferences()?.preferences?.git;
85
- if (prefs?.isolation === "none")
86
- return false;
87
- if (prefs?.isolation === "branch")
88
- return false;
89
- return true; // default: worktree
85
+ if (prefs?.isolation === "worktree")
86
+ return true;
87
+ // Default is false — worktree isolation requires explicit opt-in
88
+ return false;
90
89
  }
91
90
  /** Crash recovery prompt — set by startAuto, consumed by the main loop */
92
91
  /** Pending verification retry — set when gate fails with retries remaining, consumed by autoLoop */
@@ -369,14 +368,41 @@ export async function stopAuto(ctx, pi, reason) {
369
368
  debugLog("stop-cleanup-sigterm", { error: e instanceof Error ? e.message : String(e) });
370
369
  }
371
370
  // ── Step 4: Auto-worktree exit ──
371
+ // When the milestone is complete (has a SUMMARY), merge the worktree branch
372
+ // back to main so code isn't stranded on the worktree branch (#2317).
373
+ // For incomplete milestones, preserve the branch for later resumption.
372
374
  try {
373
375
  if (s.currentMilestoneId) {
374
376
  const notifyCtx = ctx
375
377
  ? { notify: ctx.ui.notify.bind(ctx.ui) }
376
378
  : { notify: () => { } };
377
- buildResolver().exitMilestone(s.currentMilestoneId, notifyCtx, {
378
- preserveBranch: true,
379
- });
379
+ const resolver = buildResolver();
380
+ // Check if the milestone is complete — SUMMARY file is the authoritative signal.
381
+ let milestoneComplete = false;
382
+ try {
383
+ const summaryPath = resolveMilestoneFile(s.originalBasePath || s.basePath, s.currentMilestoneId, "SUMMARY");
384
+ if (!summaryPath) {
385
+ // Also check in the worktree path (SUMMARY may not be synced yet)
386
+ const wtSummaryPath = resolveMilestoneFile(s.basePath, s.currentMilestoneId, "SUMMARY");
387
+ milestoneComplete = wtSummaryPath !== null;
388
+ }
389
+ else {
390
+ milestoneComplete = true;
391
+ }
392
+ }
393
+ catch {
394
+ // Non-fatal — fall through to preserveBranch path
395
+ }
396
+ if (milestoneComplete) {
397
+ // Milestone is complete — merge worktree branch back to main
398
+ resolver.mergeAndExit(s.currentMilestoneId, notifyCtx);
399
+ }
400
+ else {
401
+ // Milestone still in progress — preserve branch for later resumption
402
+ resolver.exitMilestone(s.currentMilestoneId, notifyCtx, {
403
+ preserveBranch: true,
404
+ });
405
+ }
380
406
  }
381
407
  }
382
408
  catch (e) {
@@ -1,7 +1,10 @@
1
1
  import { Type } from "@sinclair/typebox";
2
+ import { Text } from "@gsd/pi-tui";
2
3
  import { findMilestoneIds, nextMilestoneId, claimReservedId, getReservedMilestoneIds } from "../guided-flow.js";
3
4
  import { loadEffectiveGSDPreferences } from "../preferences.js";
4
5
  import { ensureDbOpen } from "./dynamic-tools.js";
6
+ import { StringEnum } from "@gsd/pi-ai";
7
+ import { logError } from "../workflow-logger.js";
5
8
  /**
6
9
  * Register an alias tool that shares the same execute function as its canonical counterpart.
7
10
  * The alias description and promptGuidelines direct the LLM to prefer the canonical name.
@@ -43,7 +46,7 @@ export function registerDbTools(pi) {
43
46
  }
44
47
  catch (err) {
45
48
  const msg = err instanceof Error ? err.message : String(err);
46
- process.stderr.write(`gsd-db: gsd_decision_save tool failed: ${msg}\n`);
49
+ logError("tool", `gsd_decision_save tool failed: ${msg}`, { tool: "gsd_decision_save", error: String(err) });
47
50
  return {
48
51
  content: [{ type: "text", text: `Error saving decision: ${msg}` }],
49
52
  details: { operation: "save_decision", error: msg },
@@ -77,6 +80,26 @@ export function registerDbTools(pi) {
77
80
  ], { description: "Who made this decision: 'human' (user directed), 'agent' (LLM decided autonomously), or 'collaborative' (discussed and agreed). Default: 'agent'" })),
78
81
  }),
79
82
  execute: decisionSaveExecute,
83
+ renderCall(args, theme) {
84
+ let text = theme.fg("toolTitle", theme.bold("decision_save "));
85
+ if (args.scope)
86
+ text += theme.fg("accent", `[${args.scope}] `);
87
+ if (args.decision)
88
+ text += theme.fg("muted", args.decision);
89
+ if (args.choice)
90
+ text += theme.fg("dim", ` — ${args.choice}`);
91
+ return new Text(text, 0, 0);
92
+ },
93
+ renderResult(result, _options, theme) {
94
+ const d = result.details;
95
+ if (result.isError || d?.error) {
96
+ return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
97
+ }
98
+ let text = theme.fg("success", `Decision ${d?.id ?? ""} saved`);
99
+ if (d?.id)
100
+ text += theme.fg("dim", ` → DECISIONS.md`);
101
+ return new Text(text, 0, 0);
102
+ },
80
103
  };
81
104
  pi.registerTool(decisionSaveTool);
82
105
  registerAlias(pi, decisionSaveTool, "gsd_save_decision", "gsd_decision_save");
@@ -120,7 +143,7 @@ export function registerDbTools(pi) {
120
143
  }
121
144
  catch (err) {
122
145
  const msg = err instanceof Error ? err.message : String(err);
123
- process.stderr.write(`gsd-db: gsd_requirement_update tool failed: ${msg}\n`);
146
+ logError("tool", `gsd_requirement_update tool failed: ${msg}`, { tool: "gsd_requirement_update", error: String(err) });
124
147
  return {
125
148
  content: [{ type: "text", text: `Error updating requirement: ${msg}` }],
126
149
  details: { operation: "update_requirement", id: params.id, error: msg },
@@ -149,6 +172,24 @@ export function registerDbTools(pi) {
149
172
  supporting_slices: Type.Optional(Type.String({ description: "Supporting slices" })),
150
173
  }),
151
174
  execute: requirementUpdateExecute,
175
+ renderCall(args, theme) {
176
+ let text = theme.fg("toolTitle", theme.bold("requirement_update "));
177
+ if (args.id)
178
+ text += theme.fg("accent", args.id);
179
+ const fields = ["status", "validation", "notes", "description"].filter((f) => args[f]);
180
+ if (fields.length > 0)
181
+ text += theme.fg("dim", ` (${fields.join(", ")})`);
182
+ return new Text(text, 0, 0);
183
+ },
184
+ renderResult(result, _options, theme) {
185
+ const d = result.details;
186
+ if (result.isError || d?.error) {
187
+ return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
188
+ }
189
+ let text = theme.fg("success", `Requirement ${d?.id ?? ""} updated`);
190
+ text += theme.fg("dim", ` → REQUIREMENTS.md`);
191
+ return new Text(text, 0, 0);
192
+ },
152
193
  };
153
194
  pi.registerTool(requirementUpdateTool);
154
195
  registerAlias(pi, requirementUpdateTool, "gsd_update_requirement", "gsd_requirement_update");
@@ -195,7 +236,7 @@ export function registerDbTools(pi) {
195
236
  }
196
237
  catch (err) {
197
238
  const msg = err instanceof Error ? err.message : String(err);
198
- process.stderr.write(`gsd-db: gsd_summary_save tool failed: ${msg}\n`);
239
+ logError("tool", `gsd_summary_save tool failed: ${msg}`, { tool: "gsd_summary_save", error: String(err) });
199
240
  return {
200
241
  content: [{ type: "text", text: `Error saving artifact: ${msg}` }],
201
242
  details: { operation: "save_summary", error: msg },
@@ -222,6 +263,25 @@ export function registerDbTools(pi) {
222
263
  content: Type.String({ description: "The full markdown content of the artifact" }),
223
264
  }),
224
265
  execute: summarySaveExecute,
266
+ renderCall(args, theme) {
267
+ let text = theme.fg("toolTitle", theme.bold("summary_save "));
268
+ if (args.artifact_type)
269
+ text += theme.fg("accent", args.artifact_type);
270
+ const path = [args.milestone_id, args.slice_id, args.task_id].filter(Boolean).join("/");
271
+ if (path)
272
+ text += theme.fg("dim", ` ${path}`);
273
+ return new Text(text, 0, 0);
274
+ },
275
+ renderResult(result, _options, theme) {
276
+ const d = result.details;
277
+ if (result.isError || d?.error) {
278
+ return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
279
+ }
280
+ let text = theme.fg("success", `${d?.artifact_type ?? "Artifact"} saved`);
281
+ if (d?.path)
282
+ text += theme.fg("dim", ` → ${d.path}`);
283
+ return new Text(text, 0, 0);
284
+ },
225
285
  };
226
286
  pi.registerTool(summarySaveTool);
227
287
  registerAlias(pi, summarySaveTool, "gsd_save_summary", "gsd_summary_save");
@@ -232,6 +292,7 @@ export function registerDbTools(pi) {
232
292
  // This guarantees the ID shown in the UI matches the one materialised on disk.
233
293
  const reserved = claimReservedId();
234
294
  if (reserved) {
295
+ await ensureMilestoneDbRow(reserved);
235
296
  return {
236
297
  content: [{ type: "text", text: reserved }],
237
298
  details: { operation: "generate_milestone_id", id: reserved, source: "reserved" },
@@ -242,6 +303,7 @@ export function registerDbTools(pi) {
242
303
  const uniqueEnabled = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
243
304
  const allIds = [...new Set([...existingIds, ...getReservedMilestoneIds()])];
244
305
  const newId = nextMilestoneId(allIds, uniqueEnabled);
306
+ await ensureMilestoneDbRow(newId);
245
307
  return {
246
308
  content: [{ type: "text", text: newId }],
247
309
  details: { operation: "generate_milestone_id", id: newId, existingCount: existingIds.length, uniqueEnabled },
@@ -255,6 +317,24 @@ export function registerDbTools(pi) {
255
317
  };
256
318
  }
257
319
  };
320
+ /**
321
+ * Insert a minimal DB row for a milestone ID so it's visible to the state
322
+ * machine. Uses INSERT OR IGNORE — safe to call even if gsd_plan_milestone
323
+ * later writes the full row. Silently skips if the DB isn't available yet
324
+ * (pre-migration).
325
+ */
326
+ async function ensureMilestoneDbRow(milestoneId) {
327
+ const dbAvailable = await ensureDbOpen();
328
+ if (!dbAvailable)
329
+ return;
330
+ try {
331
+ const { insertMilestone } = await import("../gsd-db.js");
332
+ insertMilestone({ id: milestoneId, status: "queued" });
333
+ }
334
+ catch {
335
+ // Non-fatal — the safety-net in deriveStateFromDb will catch this
336
+ }
337
+ }
258
338
  const milestoneGenerateIdTool = {
259
339
  name: "gsd_milestone_generate_id",
260
340
  label: "Generate Milestone ID",
@@ -270,6 +350,19 @@ export function registerDbTools(pi) {
270
350
  ],
271
351
  parameters: Type.Object({}),
272
352
  execute: milestoneGenerateIdExecute,
353
+ renderCall(_args, theme) {
354
+ return new Text(theme.fg("toolTitle", theme.bold("milestone_generate_id")), 0, 0);
355
+ },
356
+ renderResult(result, _options, theme) {
357
+ const d = result.details;
358
+ if (result.isError || d?.error) {
359
+ return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
360
+ }
361
+ let text = theme.fg("success", `Generated ${d?.id ?? "ID"}`);
362
+ if (d?.source === "reserved")
363
+ text += theme.fg("dim", " (reserved)");
364
+ return new Text(text, 0, 0);
365
+ },
273
366
  };
274
367
  pi.registerTool(milestoneGenerateIdTool);
275
368
  registerAlias(pi, milestoneGenerateIdTool, "gsd_generate_milestone_id", "gsd_milestone_generate_id");
@@ -302,7 +395,7 @@ export function registerDbTools(pi) {
302
395
  }
303
396
  catch (err) {
304
397
  const msg = err instanceof Error ? err.message : String(err);
305
- process.stderr.write(`gsd-db: plan_milestone tool failed: ${msg}\n`);
398
+ logError("tool", `plan_milestone tool failed: ${msg}`, { tool: "gsd_plan_milestone", error: String(err) });
306
399
  return {
307
400
  content: [{ type: "text", text: `Error planning milestone: ${msg}` }],
308
401
  details: { operation: "plan_milestone", error: msg },
@@ -391,7 +484,7 @@ export function registerDbTools(pi) {
391
484
  }
392
485
  catch (err) {
393
486
  const msg = err instanceof Error ? err.message : String(err);
394
- process.stderr.write(`gsd-db: plan_slice tool failed: ${msg}\n`);
487
+ logError("tool", `plan_slice tool failed: ${msg}`, { tool: "gsd_plan_slice", error: String(err) });
395
488
  return {
396
489
  content: [{ type: "text", text: `Error planning slice: ${msg}` }],
397
490
  details: { operation: "plan_slice", error: msg },
@@ -464,7 +557,7 @@ export function registerDbTools(pi) {
464
557
  }
465
558
  catch (err) {
466
559
  const msg = err instanceof Error ? err.message : String(err);
467
- process.stderr.write(`gsd-db: plan_task tool failed: ${msg}\n`);
560
+ logError("tool", `plan_task tool failed: ${msg}`, { tool: "gsd_plan_task", error: String(err) });
468
561
  return {
469
562
  content: [{ type: "text", text: `Error planning task: ${msg}` }],
470
563
  details: { operation: "plan_task", error: msg },
@@ -530,7 +623,7 @@ export function registerDbTools(pi) {
530
623
  }
531
624
  catch (err) {
532
625
  const msg = err instanceof Error ? err.message : String(err);
533
- process.stderr.write(`gsd-db: complete_task tool failed: ${msg}\n`);
626
+ logError("tool", `complete_task tool failed: ${msg}`, { tool: "gsd_task_complete", error: String(err) });
534
627
  return {
535
628
  content: [{ type: "text", text: `Error completing task: ${msg}` }],
536
629
  details: { operation: "complete_task", error: msg },
@@ -604,7 +697,7 @@ export function registerDbTools(pi) {
604
697
  }
605
698
  catch (err) {
606
699
  const msg = err instanceof Error ? err.message : String(err);
607
- process.stderr.write(`gsd-db: complete_slice tool failed: ${msg}\n`);
700
+ logError("tool", `complete_slice tool failed: ${msg}`, { tool: "gsd_slice_complete", error: String(err) });
608
701
  return {
609
702
  content: [{ type: "text", text: `Error completing slice: ${msg}` }],
610
703
  details: { operation: "complete_slice", error: msg },
@@ -696,7 +789,7 @@ export function registerDbTools(pi) {
696
789
  }
697
790
  catch (err) {
698
791
  const msg = err instanceof Error ? err.message : String(err);
699
- process.stderr.write(`gsd-db: complete_milestone tool failed: ${msg}\n`);
792
+ logError("tool", `complete_milestone tool failed: ${msg}`, { tool: "gsd_complete_milestone", error: String(err) });
700
793
  return {
701
794
  content: [{ type: "text", text: `Error completing milestone: ${msg}` }],
702
795
  details: { operation: "complete_milestone", error: msg },
@@ -732,6 +825,70 @@ export function registerDbTools(pi) {
732
825
  };
733
826
  pi.registerTool(milestoneCompleteTool);
734
827
  registerAlias(pi, milestoneCompleteTool, "gsd_milestone_complete", "gsd_complete_milestone");
828
+ // ─── gsd_validate_milestone (gsd_milestone_validate alias) ─────────────
829
+ const milestoneValidateExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
830
+ const dbAvailable = await ensureDbOpen();
831
+ if (!dbAvailable) {
832
+ return {
833
+ content: [{ type: "text", text: "Error: GSD database is not available. Cannot validate milestone." }],
834
+ details: { operation: "validate_milestone", error: "db_unavailable" },
835
+ };
836
+ }
837
+ try {
838
+ const { handleValidateMilestone } = await import("../tools/validate-milestone.js");
839
+ const result = await handleValidateMilestone(params, process.cwd());
840
+ if ("error" in result) {
841
+ return {
842
+ content: [{ type: "text", text: `Error validating milestone: ${result.error}` }],
843
+ details: { operation: "validate_milestone", error: result.error },
844
+ };
845
+ }
846
+ return {
847
+ content: [{ type: "text", text: `Validated milestone ${result.milestoneId} — verdict: ${result.verdict}. Written to ${result.validationPath}` }],
848
+ details: {
849
+ operation: "validate_milestone",
850
+ milestoneId: result.milestoneId,
851
+ verdict: result.verdict,
852
+ validationPath: result.validationPath,
853
+ },
854
+ };
855
+ }
856
+ catch (err) {
857
+ const msg = err instanceof Error ? err.message : String(err);
858
+ logError("tool", `validate_milestone tool failed: ${msg}`, { tool: "gsd_validate_milestone", error: String(err) });
859
+ return {
860
+ content: [{ type: "text", text: `Error validating milestone: ${msg}` }],
861
+ details: { operation: "validate_milestone", error: msg },
862
+ };
863
+ }
864
+ };
865
+ const milestoneValidateTool = {
866
+ name: "gsd_validate_milestone",
867
+ label: "Validate Milestone",
868
+ description: "Validate a milestone before completion — persist validation results to the DB, render VALIDATION.md to disk. " +
869
+ "Records verdict (pass/needs-attention/needs-remediation) and rationale.",
870
+ promptSnippet: "Validate a GSD milestone (DB write + VALIDATION.md render)",
871
+ promptGuidelines: [
872
+ "Use gsd_validate_milestone when all slices are done and the milestone needs validation before completion.",
873
+ "Parameters: milestoneId, verdict, remediationRound, successCriteriaChecklist, sliceDeliveryAudit, crossSliceIntegration, requirementCoverage, verdictRationale, remediationPlan (optional).",
874
+ "If verdict is 'needs-remediation', also provide remediationPlan and use gsd_reassess_roadmap to add remediation slices to the roadmap.",
875
+ "On success, returns validationPath where VALIDATION.md was written.",
876
+ ],
877
+ parameters: Type.Object({
878
+ milestoneId: Type.String({ description: "Milestone ID (e.g. M001)" }),
879
+ verdict: StringEnum(["pass", "needs-attention", "needs-remediation"], { description: "Validation verdict" }),
880
+ remediationRound: Type.Number({ description: "Remediation round (0 for first validation)" }),
881
+ successCriteriaChecklist: Type.String({ description: "Markdown checklist of success criteria with pass/fail and evidence" }),
882
+ sliceDeliveryAudit: Type.String({ description: "Markdown table auditing each slice's claimed vs delivered output" }),
883
+ crossSliceIntegration: Type.String({ description: "Markdown describing any cross-slice boundary mismatches" }),
884
+ requirementCoverage: Type.String({ description: "Markdown describing any unaddressed requirements" }),
885
+ verdictRationale: Type.String({ description: "Why this verdict was chosen" }),
886
+ remediationPlan: Type.Optional(Type.String({ description: "Remediation plan (required if verdict is needs-remediation)" })),
887
+ }),
888
+ execute: milestoneValidateExecute,
889
+ };
890
+ pi.registerTool(milestoneValidateTool);
891
+ registerAlias(pi, milestoneValidateTool, "gsd_milestone_validate", "gsd_validate_milestone");
735
892
  // ─── gsd_replan_slice (gsd_slice_replan alias) ─────────────────────────
736
893
  const replanSliceExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
737
894
  const dbAvailable = await ensureDbOpen();
@@ -763,7 +920,7 @@ export function registerDbTools(pi) {
763
920
  }
764
921
  catch (err) {
765
922
  const msg = err instanceof Error ? err.message : String(err);
766
- process.stderr.write(`gsd-db: replan_slice tool failed: ${msg}\n`);
923
+ logError("tool", `replan_slice tool failed: ${msg}`, { tool: "gsd_replan_slice", error: String(err) });
767
924
  return {
768
925
  content: [{ type: "text", text: `Error replanning slice: ${msg}` }],
769
926
  details: { operation: "replan_slice", error: msg },
@@ -836,7 +993,7 @@ export function registerDbTools(pi) {
836
993
  }
837
994
  catch (err) {
838
995
  const msg = err instanceof Error ? err.message : String(err);
839
- process.stderr.write(`gsd-db: reassess_roadmap tool failed: ${msg}\n`);
996
+ logError("tool", `reassess_roadmap tool failed: ${msg}`, { tool: "gsd_reassess_roadmap", error: String(err) });
840
997
  return {
841
998
  content: [{ type: "text", text: `Error reassessing roadmap: ${msg}` }],
842
999
  details: { operation: "reassess_roadmap", error: msg },
@@ -45,18 +45,9 @@ export async function buildBeforeAgentStartResult(event, ctx) {
45
45
  ctx.ui.notify(`GSD skill preferences: ${report.warnings.length} unresolved skill${report.warnings.length === 1 ? "" : "s"}: ${report.warnings.join(", ")}`, "warning");
46
46
  }
47
47
  }
48
- let knowledgeBlock = "";
49
- const knowledgePath = resolveGsdRootFile(process.cwd(), "KNOWLEDGE");
50
- if (existsSync(knowledgePath)) {
51
- try {
52
- const content = readFileSync(knowledgePath, "utf-8").trim();
53
- if (content) {
54
- knowledgeBlock = `\n\n[PROJECT KNOWLEDGE — Rules, patterns, and lessons learned]\n\n${content}`;
55
- }
56
- }
57
- catch {
58
- // skip
59
- }
48
+ const { block: knowledgeBlock, globalSizeKb } = loadKnowledgeBlock(gsdHome, process.cwd());
49
+ if (globalSizeKb > 4) {
50
+ ctx.ui.notify(`GSD: ~/.gsd/agent/KNOWLEDGE.md is ${globalSizeKb.toFixed(1)}KB — consider trimming to keep system prompt lean.`, "warning");
60
51
  }
61
52
  let memoryBlock = "";
62
53
  try {
@@ -102,6 +93,49 @@ export async function buildBeforeAgentStartResult(event, ctx) {
102
93
  : {}),
103
94
  };
104
95
  }
96
+ export function loadKnowledgeBlock(gsdHomeDir, cwd) {
97
+ // 1. Global knowledge (~/.gsd/agent/KNOWLEDGE.md) — cross-project, user-maintained
98
+ let globalKnowledge = "";
99
+ let globalSizeKb = 0;
100
+ const globalKnowledgePath = join(gsdHomeDir, "agent", "KNOWLEDGE.md");
101
+ if (existsSync(globalKnowledgePath)) {
102
+ try {
103
+ const content = readFileSync(globalKnowledgePath, "utf-8").trim();
104
+ if (content) {
105
+ globalSizeKb = Buffer.byteLength(content, "utf-8") / 1024;
106
+ globalKnowledge = content;
107
+ }
108
+ }
109
+ catch {
110
+ // skip
111
+ }
112
+ }
113
+ // 2. Project knowledge (.gsd/KNOWLEDGE.md) — project-specific
114
+ let projectKnowledge = "";
115
+ const knowledgePath = resolveGsdRootFile(cwd, "KNOWLEDGE");
116
+ if (existsSync(knowledgePath)) {
117
+ try {
118
+ const content = readFileSync(knowledgePath, "utf-8").trim();
119
+ if (content)
120
+ projectKnowledge = content;
121
+ }
122
+ catch {
123
+ // skip
124
+ }
125
+ }
126
+ if (!globalKnowledge && !projectKnowledge) {
127
+ return { block: "", globalSizeKb: 0 };
128
+ }
129
+ const parts = [];
130
+ if (globalKnowledge)
131
+ parts.push(`## Global Knowledge\n\n${globalKnowledge}`);
132
+ if (projectKnowledge)
133
+ parts.push(`## Project Knowledge\n\n${projectKnowledge}`);
134
+ return {
135
+ block: `\n\n[KNOWLEDGE — Rules, patterns, and lessons learned]\n\n${parts.join("\n\n")}`,
136
+ globalSizeKb,
137
+ };
138
+ }
105
139
  function buildWorktreeContextBlock() {
106
140
  const worktreeName = getActiveWorktreeName();
107
141
  const worktreeMainCwd = getWorktreeOriginalCwd();
@@ -4,7 +4,7 @@ import { join } from "node:path";
4
4
  import { loadRegistry } from "../workflow-templates.js";
5
5
  import { resolveProjectRoot } from "../worktree.js";
6
6
  const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
7
- export const GSD_COMMAND_DESCRIPTION = "GSD — Get Shit Done: /gsd help|start|templates|next|auto|stop|pause|status|widget|visualize|queue|quick|discuss|capture|triage|dispatch|history|undo|undo-task|reset-slice|rate|skip|export|cleanup|mode|prefs|config|keys|hooks|run-hook|skill-health|doctor|logs|forensics|changelog|migrate|remote|steer|knowledge|new-milestone|parallel|cmux|park|unpark|init|setup|inspect|extensions|update|fast";
7
+ export const GSD_COMMAND_DESCRIPTION = "GSD — Get Shit Done: /gsd help|start|templates|next|auto|stop|pause|status|widget|visualize|queue|quick|discuss|capture|triage|dispatch|history|undo|undo-task|reset-slice|rate|skip|export|cleanup|mode|prefs|config|keys|hooks|run-hook|skill-health|doctor|logs|forensics|changelog|migrate|remote|steer|knowledge|new-milestone|parallel|cmux|park|unpark|init|setup|inspect|extensions|update|fast|mcp|rethink";
8
8
  export const TOP_LEVEL_SUBCOMMANDS = [
9
9
  { cmd: "help", desc: "Categorized command reference with descriptions" },
10
10
  { cmd: "next", desc: "Explicit step mode (same as /gsd)" },
@@ -56,6 +56,8 @@ export const TOP_LEVEL_SUBCOMMANDS = [
56
56
  { cmd: "templates", desc: "List available workflow templates" },
57
57
  { cmd: "extensions", desc: "Manage extensions (list, enable, disable, info)" },
58
58
  { cmd: "fast", desc: "Toggle OpenAI service tier (on/off/flex/status)" },
59
+ { cmd: "mcp", desc: "MCP server status and connectivity check (status, check <server>)" },
60
+ { cmd: "rethink", desc: "Conversational project reorganization — reorder, park, discard, add milestones" },
59
61
  { cmd: "workflow", desc: "Custom workflow lifecycle (new, run, list, validate, pause, resume)" },
60
62
  ];
61
63
  const NESTED_COMPLETIONS = {
@@ -174,6 +176,10 @@ const NESTED_COMPLETIONS = {
174
176
  { cmd: "flex", desc: "Flex tier (0.5x cost, slower)" },
175
177
  { cmd: "status", desc: "Show current service tier setting" },
176
178
  ],
179
+ mcp: [
180
+ { cmd: "status", desc: "Show all MCP server statuses (default)" },
181
+ { cmd: "check", desc: "Detailed status for a specific server" },
182
+ ],
177
183
  doctor: [
178
184
  { cmd: "fix", desc: "Auto-fix detected issues" },
179
185
  { cmd: "heal", desc: "AI-driven deep healing" },
@@ -32,6 +32,7 @@ export function showHelp(ctx) {
32
32
  " /gsd triage Classify and route pending captures",
33
33
  " /gsd skip <unit> Prevent a unit from auto-mode dispatch",
34
34
  " /gsd undo Revert last completed unit [--force]",
35
+ " /gsd rethink Conversational project reorganization — reorder, park, discard, add milestones",
35
36
  " /gsd park [id] Park a milestone — skip without deleting [reason]",
36
37
  " /gsd unpark [id] Reactivate a parked milestone",
37
38
  "",
@@ -49,6 +50,7 @@ export function showHelp(ctx) {
49
50
  " /gsd hooks Show post-unit hook configuration",
50
51
  " /gsd extensions Manage extensions [list|enable|disable|info]",
51
52
  " /gsd fast Toggle OpenAI service tier [on|off|flex|status]",
53
+ " /gsd mcp MCP server status and connectivity [status|check <server>]",
52
54
  "",
53
55
  "MAINTENANCE",
54
56
  " /gsd doctor Diagnose and repair .gsd/ state [audit|fix|heal] [scope]",
@@ -188,10 +188,20 @@ Examples:
188
188
  await handleFast(trimmed.replace(/^fast\s*/, "").trim(), ctx);
189
189
  return true;
190
190
  }
191
+ if (trimmed === "mcp" || trimmed.startsWith("mcp ")) {
192
+ const { handleMcpStatus } = await import("../../commands-mcp-status.js");
193
+ await handleMcpStatus(trimmed.replace(/^mcp\s*/, "").trim(), ctx);
194
+ return true;
195
+ }
191
196
  if (trimmed === "extensions" || trimmed.startsWith("extensions ")) {
192
197
  const { handleExtensions } = await import("../../commands-extensions.js");
193
198
  await handleExtensions(trimmed.replace(/^extensions\s*/, "").trim(), ctx);
194
199
  return true;
195
200
  }
201
+ if (trimmed === "rethink") {
202
+ const { handleRethink } = await import("../../rethink.js");
203
+ await handleRethink(trimmed, ctx, pi);
204
+ return true;
205
+ }
196
206
  return false;
197
207
  }
@@ -166,6 +166,11 @@ export async function handleWorkflowCommand(trimmed, ctx, pi) {
166
166
  return true;
167
167
  }
168
168
  if (trimmed === "quick" || trimmed.startsWith("quick ")) {
169
+ if (isAutoActive()) {
170
+ ctx.ui.notify("/gsd quick cannot run while auto-mode is active.\n" +
171
+ "Stop auto-mode first with /gsd stop, then run /gsd quick.", "error");
172
+ return true;
173
+ }
169
174
  await handleQuick(trimmed.replace(/^quick\s*/, "").trim(), ctx, pi);
170
175
  return true;
171
176
  }