gsd-pi 2.57.0 → 2.58.0-dev.394cb18

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 (834) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +58 -35
  3. package/dist/headless-ui.d.ts +17 -0
  4. package/dist/headless-ui.js +97 -3
  5. package/dist/headless.js +67 -6
  6. package/dist/help-text.js +1 -0
  7. package/dist/onboarding.js +44 -0
  8. package/dist/resource-loader.js +16 -1
  9. package/dist/resources/agents/researcher.md +1 -1
  10. package/dist/resources/extensions/ask-user-questions.js +16 -3
  11. package/dist/resources/extensions/async-jobs/extension-manifest.json +1 -1
  12. package/dist/resources/extensions/bg-shell/extension-manifest.json +1 -1
  13. package/dist/resources/extensions/browser-tools/extension-manifest.json +1 -1
  14. package/dist/resources/extensions/claude-code-cli/partial-builder.js +14 -6
  15. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +59 -36
  16. package/dist/resources/extensions/context7/extension-manifest.json +1 -1
  17. package/dist/resources/extensions/get-secrets-from-user.js +8 -5
  18. package/dist/resources/extensions/google-search/extension-manifest.json +1 -1
  19. package/dist/resources/extensions/google-search/index.js +2 -1
  20. package/dist/resources/extensions/gsd/auto/infra-errors.js +4 -0
  21. package/dist/resources/extensions/gsd/auto/phases.js +25 -21
  22. package/dist/resources/extensions/gsd/auto-artifact-paths.js +2 -2
  23. package/dist/resources/extensions/gsd/auto-dashboard.js +37 -20
  24. package/dist/resources/extensions/gsd/auto-dispatch.js +20 -5
  25. package/dist/resources/extensions/gsd/auto-model-selection.js +26 -3
  26. package/dist/resources/extensions/gsd/auto-post-unit.js +16 -4
  27. package/dist/resources/extensions/gsd/auto-prompts.js +1 -1
  28. package/dist/resources/extensions/gsd/auto-recovery.js +13 -5
  29. package/dist/resources/extensions/gsd/auto-start.js +35 -22
  30. package/dist/resources/extensions/gsd/auto-worktree.js +206 -14
  31. package/dist/resources/extensions/gsd/auto.js +4 -0
  32. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +32 -0
  33. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +82 -9
  34. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -1
  35. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +42 -34
  36. package/dist/resources/extensions/gsd/bootstrap/system-context.js +66 -12
  37. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +67 -0
  38. package/dist/resources/extensions/gsd/captures.js +56 -4
  39. package/dist/resources/extensions/gsd/codebase-generator.js +279 -0
  40. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  41. package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
  42. package/dist/resources/extensions/gsd/commands-codebase.js +115 -0
  43. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +41 -4
  44. package/dist/resources/extensions/gsd/complexity-classifier.js +8 -6
  45. package/dist/resources/extensions/gsd/db-writer.js +116 -8
  46. package/dist/resources/extensions/gsd/dispatch-guard.js +11 -1
  47. package/dist/resources/extensions/gsd/doctor-git-checks.js +76 -1
  48. package/dist/resources/extensions/gsd/doctor-proactive.js +34 -1
  49. package/dist/resources/extensions/gsd/doctor-providers.js +2 -1
  50. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +5 -4
  51. package/dist/resources/extensions/gsd/doctor.js +3 -1
  52. package/dist/resources/extensions/gsd/error-classifier.js +12 -10
  53. package/dist/resources/extensions/gsd/extension-manifest.json +16 -1
  54. package/dist/resources/extensions/gsd/forensics.js +123 -20
  55. package/dist/resources/extensions/gsd/git-service.js +105 -2
  56. package/dist/resources/extensions/gsd/gitignore.js +33 -0
  57. package/dist/resources/extensions/gsd/gsd-db.js +44 -10
  58. package/dist/resources/extensions/gsd/guided-flow.js +106 -44
  59. package/dist/resources/extensions/gsd/health-widget-core.js +31 -0
  60. package/dist/resources/extensions/gsd/health-widget.js +17 -0
  61. package/dist/resources/extensions/gsd/index.js +1 -1
  62. package/dist/resources/extensions/gsd/memory-extractor.js +7 -0
  63. package/dist/resources/extensions/gsd/migrate-external.js +8 -1
  64. package/dist/resources/extensions/gsd/milestone-validation-gates.js +45 -0
  65. package/dist/resources/extensions/gsd/model-cost-table.js +18 -0
  66. package/dist/resources/extensions/gsd/model-router.js +35 -1
  67. package/dist/resources/extensions/gsd/native-git-bridge.js +39 -0
  68. package/dist/resources/extensions/gsd/notifications.js +16 -1
  69. package/dist/resources/extensions/gsd/parallel-eligibility.js +13 -2
  70. package/dist/resources/extensions/gsd/parallel-merge.js +78 -5
  71. package/dist/resources/extensions/gsd/parallel-orchestrator.js +23 -6
  72. package/dist/resources/extensions/gsd/parsers-legacy.js +20 -3
  73. package/dist/resources/extensions/gsd/paths.js +45 -0
  74. package/dist/resources/extensions/gsd/preferences-models.js +14 -1
  75. package/dist/resources/extensions/gsd/preferences-types.js +3 -1
  76. package/dist/resources/extensions/gsd/preferences.js +42 -31
  77. package/dist/resources/extensions/gsd/prompt-loader.js +4 -1
  78. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  79. package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -2
  80. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
  81. package/dist/resources/extensions/gsd/prompts/discuss.md +1 -1
  82. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -1
  83. package/dist/resources/extensions/gsd/prompts/forensics.md +2 -2
  84. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  85. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  86. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  87. package/dist/resources/extensions/gsd/prompts/rethink.md +1 -1
  88. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -0
  89. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  90. package/dist/resources/extensions/gsd/repo-identity.js +205 -11
  91. package/dist/resources/extensions/gsd/rethink.js +5 -0
  92. package/dist/resources/extensions/gsd/roadmap-slices.js +5 -4
  93. package/dist/resources/extensions/gsd/state.js +85 -27
  94. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +20 -1
  95. package/dist/resources/extensions/gsd/tools/complete-task.js +34 -71
  96. package/dist/resources/extensions/gsd/tools/plan-milestone.js +12 -2
  97. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +29 -1
  98. package/dist/resources/extensions/gsd/tools/validate-milestone.js +18 -3
  99. package/dist/resources/extensions/gsd/triage-resolution.js +22 -7
  100. package/dist/resources/extensions/gsd/undo.js +2 -2
  101. package/dist/resources/extensions/gsd/unit-ownership.js +164 -33
  102. package/dist/resources/extensions/gsd/verdict-parser.js +20 -8
  103. package/dist/resources/extensions/gsd/watch/header-renderer.js +241 -0
  104. package/dist/resources/extensions/gsd/workflow-manifest.js +24 -5
  105. package/dist/resources/extensions/gsd/workflow-projections.js +95 -63
  106. package/dist/resources/extensions/gsd/workflow-reconcile.js +35 -5
  107. package/dist/resources/extensions/gsd/workspace-index.js +24 -0
  108. package/dist/resources/extensions/gsd/worktree-manager.js +105 -1
  109. package/dist/resources/extensions/gsd/worktree-resolver.js +20 -3
  110. package/dist/resources/extensions/mcp-client/index.js +11 -7
  111. package/dist/resources/extensions/ollama/index.js +112 -0
  112. package/dist/resources/extensions/ollama/model-capabilities.js +115 -0
  113. package/dist/resources/extensions/ollama/ollama-client.js +168 -0
  114. package/dist/resources/extensions/ollama/ollama-commands.js +194 -0
  115. package/dist/resources/extensions/ollama/ollama-discovery.js +69 -0
  116. package/dist/resources/extensions/ollama/ollama-tool.js +184 -0
  117. package/dist/resources/extensions/ollama/types.js +2 -0
  118. package/dist/resources/extensions/search-the-web/extension-manifest.json +1 -1
  119. package/dist/resources/extensions/shared/interview-ui.js +11 -1
  120. package/dist/resources/skills/create-gsd-extension/SKILL.md +5 -3
  121. package/dist/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +5 -4
  122. package/dist/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
  123. package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
  124. package/dist/resources/skills/create-gsd-extension/workflows/debug-extension.md +5 -3
  125. package/dist/startup-model-validation.d.ts +39 -0
  126. package/dist/startup-model-validation.js +50 -0
  127. package/dist/web/standalone/.next/BUILD_ID +1 -1
  128. package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
  129. package/dist/web/standalone/.next/build-manifest.json +4 -4
  130. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  131. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  132. package/dist/web/standalone/.next/required-server-files.json +3 -3
  133. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  134. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  136. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  144. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  146. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  147. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  148. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  150. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  151. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  152. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  153. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  160. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  172. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  200. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  206. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  220. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  222. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  224. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  226. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  230. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  234. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  235. package/dist/web/standalone/.next/server/app/index.html +1 -1
  236. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  237. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  238. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  239. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  240. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  241. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  242. package/dist/web/standalone/.next/server/app/page.js +2 -2
  243. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  244. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  245. package/dist/web/standalone/.next/server/chunks/2229.js +2 -2
  246. package/dist/web/standalone/.next/server/chunks/7471.js +3 -3
  247. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  248. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  249. package/dist/web/standalone/.next/server/middleware.js +2 -2
  250. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  251. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  252. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  253. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  254. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  255. package/dist/web/standalone/.next/static/chunks/6502.7593d7797a4b3999.js +9 -0
  256. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  257. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  258. package/dist/web/standalone/.next/static/chunks/app/page-0c485498795110d6.js +1 -0
  259. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  260. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  261. package/dist/web/standalone/.next/static/chunks/{webpack-4332cbd5dd1be584.js → webpack-a1c1e452c6b32d04.js} +1 -1
  262. package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +1 -0
  263. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  264. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  265. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  266. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  267. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  268. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  269. package/dist/web/standalone/server.js +1 -1
  270. package/dist/web-mode.js +2 -1
  271. package/dist/welcome-screen.d.ts +1 -0
  272. package/dist/welcome-screen.js +32 -6
  273. package/package.json +2 -2
  274. package/packages/daemon/src/cli.ts +49 -0
  275. package/packages/daemon/src/daemon.test.ts +104 -1
  276. package/packages/daemon/src/daemon.ts +24 -1
  277. package/packages/daemon/src/discord-bot.ts +73 -3
  278. package/packages/daemon/src/event-bridge.ts +15 -9
  279. package/packages/daemon/src/event-formatter.ts +30 -2
  280. package/packages/daemon/src/index.ts +9 -0
  281. package/packages/daemon/src/launchd.test.ts +356 -0
  282. package/packages/daemon/src/launchd.ts +242 -0
  283. package/packages/daemon/src/message-batcher.test.ts +2 -2
  284. package/packages/daemon/src/message-batcher.ts +9 -3
  285. package/packages/daemon/src/orchestrator.test.ts +1 -0
  286. package/packages/daemon/src/orchestrator.ts +106 -2
  287. package/packages/native/dist/ast/index.js +9 -5
  288. package/packages/native/dist/ast/types.js +2 -1
  289. package/packages/native/dist/clipboard/index.js +12 -7
  290. package/packages/native/dist/clipboard/types.js +2 -1
  291. package/packages/native/dist/diff/index.js +12 -7
  292. package/packages/native/dist/diff/types.js +2 -1
  293. package/packages/native/dist/fd/index.js +6 -3
  294. package/packages/native/dist/fd/types.js +2 -1
  295. package/packages/native/dist/glob/index.js +9 -5
  296. package/packages/native/dist/glob/types.js +2 -1
  297. package/packages/native/dist/grep/index.js +9 -5
  298. package/packages/native/dist/grep/types.js +2 -1
  299. package/packages/native/dist/gsd-parser/index.js +18 -11
  300. package/packages/native/dist/gsd-parser/types.js +2 -1
  301. package/packages/native/dist/highlight/index.js +12 -7
  302. package/packages/native/dist/highlight/types.js +2 -1
  303. package/packages/native/dist/html/index.js +6 -3
  304. package/packages/native/dist/html/types.js +2 -1
  305. package/packages/native/dist/image/index.js +10 -5
  306. package/packages/native/dist/image/types.js +7 -4
  307. package/packages/native/dist/index.js +70 -17
  308. package/packages/native/dist/json-parse/index.js +13 -8
  309. package/packages/native/dist/native.js +47 -10
  310. package/packages/native/dist/ps/index.js +15 -9
  311. package/packages/native/dist/ps/types.js +2 -1
  312. package/packages/native/dist/stream-process/index.js +12 -7
  313. package/packages/native/dist/text/index.js +24 -14
  314. package/packages/native/dist/text/types.js +5 -2
  315. package/packages/native/dist/truncate/index.js +12 -7
  316. package/packages/native/dist/ttsr/index.js +12 -7
  317. package/packages/native/dist/ttsr/types.js +2 -1
  318. package/packages/native/dist/xxhash/index.js +9 -5
  319. package/packages/native/package.json +19 -19
  320. package/packages/native/src/__tests__/module-compat.test.mjs +91 -0
  321. package/packages/native/src/native.ts +9 -8
  322. package/packages/pi-agent-core/dist/agent-loop.js +3 -2
  323. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  324. package/packages/pi-agent-core/dist/proxy.d.ts +1 -1
  325. package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
  326. package/packages/pi-agent-core/dist/proxy.js.map +1 -1
  327. package/packages/pi-agent-core/src/agent-loop.test.ts +45 -0
  328. package/packages/pi-agent-core/src/agent-loop.ts +3 -2
  329. package/packages/pi-agent-core/src/proxy.ts +1 -1
  330. package/packages/pi-ai/dist/env-api-keys.js +1 -0
  331. package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
  332. package/packages/pi-ai/dist/index.d.ts +1 -0
  333. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  334. package/packages/pi-ai/dist/index.js +1 -0
  335. package/packages/pi-ai/dist/index.js.map +1 -1
  336. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  337. package/packages/pi-ai/dist/providers/anthropic-shared.js +19 -2
  338. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  339. package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts +2 -0
  340. package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts.map +1 -0
  341. package/packages/pi-ai/dist/providers/anthropic-shared.test.js +25 -0
  342. package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -0
  343. package/packages/pi-ai/dist/types.d.ts +3 -3
  344. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  345. package/packages/pi-ai/dist/types.js.map +1 -1
  346. package/packages/pi-ai/dist/utils/json-parse.d.ts +3 -0
  347. package/packages/pi-ai/dist/utils/json-parse.d.ts.map +1 -1
  348. package/packages/pi-ai/dist/utils/json-parse.js +24 -1
  349. package/packages/pi-ai/dist/utils/json-parse.js.map +1 -1
  350. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts +37 -0
  351. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -0
  352. package/packages/pi-ai/dist/utils/repair-tool-json.js +75 -0
  353. package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -0
  354. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts +2 -0
  355. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts.map +1 -0
  356. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +73 -0
  357. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -0
  358. package/packages/pi-ai/src/env-api-keys.ts +1 -0
  359. package/packages/pi-ai/src/index.ts +1 -0
  360. package/packages/pi-ai/src/providers/anthropic-shared.test.ts +29 -0
  361. package/packages/pi-ai/src/providers/anthropic-shared.ts +17 -2
  362. package/packages/pi-ai/src/types.ts +3 -2
  363. package/packages/pi-ai/src/utils/json-parse.ts +28 -1
  364. package/packages/pi-ai/src/utils/repair-tool-json.ts +88 -0
  365. package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +102 -0
  366. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +4 -0
  367. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  368. package/packages/pi-coding-agent/dist/core/agent-session.js +31 -0
  369. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  370. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +17 -1
  371. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  372. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +62 -2
  373. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  374. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts +6 -0
  375. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts.map +1 -0
  376. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +176 -0
  377. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -0
  378. package/packages/pi-coding-agent/dist/core/exec.d.ts.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/exec.js +3 -1
  380. package/packages/pi-coding-agent/dist/core/exec.js.map +1 -1
  381. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts +28 -0
  382. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts.map +1 -0
  383. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js +37 -0
  384. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js.map +1 -0
  385. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts +2 -0
  386. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts.map +1 -0
  387. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js +63 -0
  388. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js.map +1 -0
  389. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts +19 -0
  390. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts.map +1 -0
  391. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js +115 -0
  392. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js.map +1 -0
  393. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts +2 -0
  394. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts.map +1 -0
  395. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js +109 -0
  396. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js.map +1 -0
  397. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +4 -0
  398. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  399. package/packages/pi-coding-agent/dist/core/extensions/index.js +2 -0
  400. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  401. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +5 -0
  402. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  403. package/packages/pi-coding-agent/dist/core/extensions/loader.js +5 -0
  404. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  405. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts +44 -0
  406. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts.map +1 -0
  407. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js +97 -0
  408. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js.map +1 -0
  409. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts +2 -0
  410. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts.map +1 -0
  411. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js +181 -0
  412. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js.map +1 -0
  413. package/packages/pi-coding-agent/dist/core/index.d.ts +1 -1
  414. package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
  415. package/packages/pi-coding-agent/dist/core/index.js +1 -1
  416. package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
  417. package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
  418. package/packages/pi-coding-agent/dist/core/lsp/index.js +3 -0
  419. package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
  420. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
  421. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +3 -0
  422. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
  423. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  424. package/packages/pi-coding-agent/dist/core/messages.js +31 -2
  425. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  426. package/packages/pi-coding-agent/dist/core/messages.test.d.ts +9 -0
  427. package/packages/pi-coding-agent/dist/core/messages.test.d.ts.map +1 -0
  428. package/packages/pi-coding-agent/dist/core/messages.test.js +86 -0
  429. package/packages/pi-coding-agent/dist/core/messages.test.js.map +1 -0
  430. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  431. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
  432. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  433. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +10 -0
  434. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  435. package/packages/pi-coding-agent/dist/core/resource-loader.js +12 -1
  436. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  437. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +6 -0
  438. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  439. package/packages/pi-coding-agent/dist/core/retry-handler.js +48 -1
  440. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  441. package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts +9 -0
  442. package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts.map +1 -0
  443. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +193 -0
  444. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -0
  445. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  446. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +10 -3
  447. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  448. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  449. package/packages/pi-coding-agent/dist/core/tools/read.js +13 -4
  450. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  451. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts +16 -0
  452. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts.map +1 -0
  453. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +80 -0
  454. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -0
  455. package/packages/pi-coding-agent/dist/index.d.ts +2 -2
  456. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  457. package/packages/pi-coding-agent/dist/index.js +1 -1
  458. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  459. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.d.ts +1 -1
  460. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.d.ts.map +1 -1
  461. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js +9 -8
  462. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js.map +1 -1
  463. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  464. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +0 -3
  465. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  466. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +1 -0
  467. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  468. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +2 -1
  469. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  470. package/packages/pi-coding-agent/dist/modes/interactive/components/bordered-loader.js +1 -1
  471. package/packages/pi-coding-agent/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  472. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js +1 -1
  473. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  474. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js +1 -1
  475. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  476. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  477. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js +5 -2
  478. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js.map +1 -1
  479. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.d.ts +1 -0
  480. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  481. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js +4 -0
  482. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  483. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js +1 -1
  484. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js.map +1 -1
  485. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.d.ts +1 -1
  486. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  487. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js +4 -2
  488. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js.map +1 -1
  489. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js +2 -2
  490. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js.map +1 -1
  491. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  492. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +8 -1
  493. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  494. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  495. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js +2 -0
  496. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js.map +1 -1
  497. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  498. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js +4 -0
  499. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js.map +1 -1
  500. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  501. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +26 -12
  502. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  503. package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js +4 -4
  504. package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  505. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts +3 -0
  506. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts.map +1 -1
  507. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +46 -14
  508. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
  509. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  510. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.js +2 -8
  511. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  512. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js +4 -4
  513. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js.map +1 -1
  514. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js +2 -2
  515. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  516. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  517. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +8 -3
  518. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  519. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  520. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js +3 -2
  521. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  522. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  523. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +19 -1
  524. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  525. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  526. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +16 -1
  527. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  528. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +1 -0
  529. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  530. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +27 -4
  531. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  532. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
  533. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +6 -0
  534. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  535. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +1 -1
  536. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  537. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts +1 -0
  538. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts.map +1 -1
  539. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js +5 -0
  540. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js.map +1 -1
  541. package/packages/pi-coding-agent/package.json +1 -1
  542. package/packages/pi-coding-agent/src/core/agent-session.ts +38 -1
  543. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +236 -0
  544. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +94 -1
  545. package/packages/pi-coding-agent/src/core/exec.ts +3 -1
  546. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +77 -0
  547. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +62 -0
  548. package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +134 -0
  549. package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +137 -0
  550. package/packages/pi-coding-agent/src/core/extensions/index.ts +4 -0
  551. package/packages/pi-coding-agent/src/core/extensions/loader.ts +5 -0
  552. package/packages/pi-coding-agent/src/core/image-overflow-recovery.test.ts +228 -0
  553. package/packages/pi-coding-agent/src/core/image-overflow-recovery.ts +118 -0
  554. package/packages/pi-coding-agent/src/core/index.ts +6 -0
  555. package/packages/pi-coding-agent/src/core/lsp/index.ts +3 -0
  556. package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +3 -0
  557. package/packages/pi-coding-agent/src/core/messages.test.ts +114 -0
  558. package/packages/pi-coding-agent/src/core/messages.ts +29 -2
  559. package/packages/pi-coding-agent/src/core/model-resolver.ts +1 -0
  560. package/packages/pi-coding-agent/src/core/resource-loader.ts +20 -1
  561. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +255 -0
  562. package/packages/pi-coding-agent/src/core/retry-handler.ts +52 -1
  563. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +11 -3
  564. package/packages/pi-coding-agent/src/core/tools/read.ts +14 -4
  565. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +92 -0
  566. package/packages/pi-coding-agent/src/index.ts +6 -0
  567. package/packages/pi-coding-agent/src/modes/interactive/components/armin.ts +9 -9
  568. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +0 -2
  569. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +3 -1
  570. package/packages/pi-coding-agent/src/modes/interactive/components/bordered-loader.ts +1 -1
  571. package/packages/pi-coding-agent/src/modes/interactive/components/branch-summary-message.ts +1 -1
  572. package/packages/pi-coding-agent/src/modes/interactive/components/compaction-summary-message.ts +1 -1
  573. package/packages/pi-coding-agent/src/modes/interactive/components/config-selector.ts +7 -2
  574. package/packages/pi-coding-agent/src/modes/interactive/components/countdown-timer.ts +3 -0
  575. package/packages/pi-coding-agent/src/modes/interactive/components/custom-message.ts +1 -1
  576. package/packages/pi-coding-agent/src/modes/interactive/components/daxnuts.ts +4 -3
  577. package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +2 -2
  578. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +3 -1
  579. package/packages/pi-coding-agent/src/modes/interactive/components/extension-input.ts +1 -0
  580. package/packages/pi-coding-agent/src/modes/interactive/components/extension-selector.ts +4 -0
  581. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +27 -13
  582. package/packages/pi-coding-agent/src/modes/interactive/components/oauth-selector.ts +4 -4
  583. package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +45 -14
  584. package/packages/pi-coding-agent/src/modes/interactive/components/scoped-models-selector.ts +2 -7
  585. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector.ts +4 -4
  586. package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +2 -2
  587. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +8 -3
  588. package/packages/pi-coding-agent/src/modes/interactive/components/user-message-selector.ts +3 -2
  589. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +24 -1
  590. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +14 -1
  591. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +35 -3
  592. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +7 -0
  593. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +1 -1
  594. package/packages/pi-coding-agent/src/modes/rpc/remote-terminal.ts +6 -0
  595. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  596. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  597. package/packages/pi-tui/dist/terminal.js +9 -0
  598. package/packages/pi-tui/dist/terminal.js.map +1 -1
  599. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  600. package/packages/pi-tui/dist/tui.js +9 -0
  601. package/packages/pi-tui/dist/tui.js.map +1 -1
  602. package/packages/pi-tui/src/terminal.ts +14 -0
  603. package/packages/pi-tui/src/tui.ts +8 -0
  604. package/pkg/dist/modes/interactive/theme/themes.js +1 -1
  605. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  606. package/pkg/package.json +1 -1
  607. package/scripts/ensure-workspace-builds.cjs +45 -14
  608. package/src/resources/agents/researcher.md +1 -1
  609. package/src/resources/extensions/ask-user-questions.ts +21 -3
  610. package/src/resources/extensions/async-jobs/extension-manifest.json +1 -1
  611. package/src/resources/extensions/bg-shell/extension-manifest.json +1 -1
  612. package/src/resources/extensions/browser-tools/extension-manifest.json +1 -1
  613. package/src/resources/extensions/claude-code-cli/partial-builder.ts +13 -6
  614. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +63 -35
  615. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +28 -0
  616. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +108 -1
  617. package/src/resources/extensions/context7/extension-manifest.json +1 -1
  618. package/src/resources/extensions/get-secrets-from-user.ts +8 -5
  619. package/src/resources/extensions/google-search/extension-manifest.json +1 -1
  620. package/src/resources/extensions/google-search/index.ts +2 -1
  621. package/src/resources/extensions/gsd/auto/infra-errors.ts +3 -0
  622. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  623. package/src/resources/extensions/gsd/auto/phases.ts +43 -34
  624. package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
  625. package/src/resources/extensions/gsd/auto-dashboard.ts +37 -19
  626. package/src/resources/extensions/gsd/auto-dispatch.ts +21 -5
  627. package/src/resources/extensions/gsd/auto-model-selection.ts +26 -5
  628. package/src/resources/extensions/gsd/auto-post-unit.ts +18 -4
  629. package/src/resources/extensions/gsd/auto-prompts.ts +1 -1
  630. package/src/resources/extensions/gsd/auto-recovery.ts +12 -5
  631. package/src/resources/extensions/gsd/auto-start.ts +35 -26
  632. package/src/resources/extensions/gsd/auto-worktree.ts +200 -11
  633. package/src/resources/extensions/gsd/auto.ts +5 -0
  634. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +31 -0
  635. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +87 -9
  636. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +38 -1
  637. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +41 -35
  638. package/src/resources/extensions/gsd/bootstrap/system-context.ts +72 -12
  639. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +75 -0
  640. package/src/resources/extensions/gsd/captures.ts +63 -3
  641. package/src/resources/extensions/gsd/codebase-generator.ts +351 -0
  642. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  643. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
  644. package/src/resources/extensions/gsd/commands-codebase.ts +164 -0
  645. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +46 -4
  646. package/src/resources/extensions/gsd/complexity-classifier.ts +8 -6
  647. package/src/resources/extensions/gsd/db-writer.ts +140 -7
  648. package/src/resources/extensions/gsd/dispatch-guard.ts +12 -1
  649. package/src/resources/extensions/gsd/doctor-git-checks.ts +75 -1
  650. package/src/resources/extensions/gsd/doctor-proactive.ts +35 -1
  651. package/src/resources/extensions/gsd/doctor-providers.ts +2 -1
  652. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +5 -4
  653. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  654. package/src/resources/extensions/gsd/doctor.ts +3 -1
  655. package/src/resources/extensions/gsd/error-classifier.ts +13 -11
  656. package/src/resources/extensions/gsd/extension-manifest.json +16 -1
  657. package/src/resources/extensions/gsd/forensics.ts +144 -20
  658. package/src/resources/extensions/gsd/git-service.ts +119 -3
  659. package/src/resources/extensions/gsd/gitignore.ts +33 -0
  660. package/src/resources/extensions/gsd/gsd-db.ts +49 -8
  661. package/src/resources/extensions/gsd/guided-flow.ts +114 -45
  662. package/src/resources/extensions/gsd/health-widget-core.ts +34 -0
  663. package/src/resources/extensions/gsd/health-widget.ts +17 -0
  664. package/src/resources/extensions/gsd/index.ts +1 -0
  665. package/src/resources/extensions/gsd/memory-extractor.ts +8 -0
  666. package/src/resources/extensions/gsd/migrate-external.ts +9 -1
  667. package/src/resources/extensions/gsd/milestone-validation-gates.ts +56 -0
  668. package/src/resources/extensions/gsd/model-cost-table.ts +19 -0
  669. package/src/resources/extensions/gsd/model-router.ts +35 -1
  670. package/src/resources/extensions/gsd/native-git-bridge.ts +41 -0
  671. package/src/resources/extensions/gsd/notifications.ts +16 -0
  672. package/src/resources/extensions/gsd/parallel-eligibility.ts +15 -2
  673. package/src/resources/extensions/gsd/parallel-merge.ts +87 -4
  674. package/src/resources/extensions/gsd/parallel-orchestrator.ts +23 -6
  675. package/src/resources/extensions/gsd/parsers-legacy.ts +22 -3
  676. package/src/resources/extensions/gsd/paths.ts +44 -0
  677. package/src/resources/extensions/gsd/preferences-models.ts +14 -1
  678. package/src/resources/extensions/gsd/preferences-types.ts +10 -1
  679. package/src/resources/extensions/gsd/preferences.ts +45 -29
  680. package/src/resources/extensions/gsd/prompt-loader.ts +4 -1
  681. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  682. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -2
  683. package/src/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
  684. package/src/resources/extensions/gsd/prompts/discuss.md +1 -1
  685. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -1
  686. package/src/resources/extensions/gsd/prompts/forensics.md +2 -2
  687. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  688. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  689. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  690. package/src/resources/extensions/gsd/prompts/rethink.md +1 -1
  691. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -0
  692. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  693. package/src/resources/extensions/gsd/repo-identity.ts +186 -11
  694. package/src/resources/extensions/gsd/rethink.ts +6 -0
  695. package/src/resources/extensions/gsd/roadmap-slices.ts +5 -4
  696. package/src/resources/extensions/gsd/state.ts +84 -32
  697. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +47 -0
  698. package/src/resources/extensions/gsd/tests/auto-mode-interactive-guard.test.ts +71 -0
  699. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +71 -1
  700. package/src/resources/extensions/gsd/tests/captures.test.ts +103 -0
  701. package/src/resources/extensions/gsd/tests/cli-provider-rate-limit.test.ts +47 -0
  702. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +488 -0
  703. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +27 -0
  704. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +21 -0
  705. package/src/resources/extensions/gsd/tests/completion-hierarchy-guards.test.ts +192 -0
  706. package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +4 -4
  707. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +131 -0
  708. package/src/resources/extensions/gsd/tests/db-writer.test.ts +7 -12
  709. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +78 -5
  710. package/src/resources/extensions/gsd/tests/derive-state.test.ts +29 -0
  711. package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +47 -0
  712. package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +127 -0
  713. package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +40 -0
  714. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +47 -0
  715. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +20 -1
  716. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +117 -0
  717. package/src/resources/extensions/gsd/tests/dynamic-routing-default.test.ts +20 -0
  718. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +74 -0
  719. package/src/resources/extensions/gsd/tests/event-replay-idempotency.test.ts +140 -0
  720. package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +129 -0
  721. package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +96 -0
  722. package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +31 -0
  723. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +125 -12
  724. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +164 -0
  725. package/src/resources/extensions/gsd/tests/guided-flow-dynamic-routing.test.ts +135 -0
  726. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +97 -0
  727. package/src/resources/extensions/gsd/tests/health-widget.test.ts +67 -0
  728. package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +107 -0
  729. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +111 -1
  730. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +134 -0
  731. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +59 -0
  732. package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +243 -0
  733. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +72 -0
  734. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +68 -0
  735. package/src/resources/extensions/gsd/tests/integration/gitignore-staging-2570.test.ts +150 -0
  736. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +110 -0
  737. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +1 -1
  738. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +959 -0
  739. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +85 -2
  740. package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +105 -0
  741. package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +116 -0
  742. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +34 -0
  743. package/src/resources/extensions/gsd/tests/model-router.test.ts +68 -3
  744. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +28 -0
  745. package/src/resources/extensions/gsd/tests/notifications.test.ts +45 -0
  746. package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +159 -0
  747. package/src/resources/extensions/gsd/tests/parallel-eligibility-ghost.test.ts +150 -0
  748. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +9 -8
  749. package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +70 -0
  750. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +33 -1
  751. package/src/resources/extensions/gsd/tests/preferences.test.ts +34 -0
  752. package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +297 -0
  753. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +36 -0
  754. package/src/resources/extensions/gsd/tests/prompt-loader-replacement.test.ts +178 -0
  755. package/src/resources/extensions/gsd/tests/prompt-tool-names.test.ts +69 -0
  756. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +38 -0
  757. package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +157 -0
  758. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +90 -0
  759. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +117 -0
  760. package/src/resources/extensions/gsd/tests/reconciliation-edge-cases.test.ts +162 -0
  761. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +97 -0
  762. package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +134 -0
  763. package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +233 -0
  764. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +305 -0
  765. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +405 -0
  766. package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +257 -0
  767. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +1628 -0
  768. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +106 -0
  769. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +174 -0
  770. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +221 -0
  771. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +44 -0
  772. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +2 -1
  773. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +8 -0
  774. package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +289 -0
  775. package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +100 -17
  776. package/src/resources/extensions/gsd/tests/vacuum-recovery.test.ts +154 -0
  777. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +27 -2
  778. package/src/resources/extensions/gsd/tests/validation-gate-patterns.test.ts +44 -2
  779. package/src/resources/extensions/gsd/tests/verdict-parser.test.ts +156 -0
  780. package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +82 -0
  781. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +48 -0
  782. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +92 -0
  783. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +4 -2
  784. package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +140 -0
  785. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +175 -0
  786. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +101 -0
  787. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +48 -1
  788. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +29 -5
  789. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +95 -0
  790. package/src/resources/extensions/gsd/tools/complete-task.ts +36 -74
  791. package/src/resources/extensions/gsd/tools/plan-milestone.ts +13 -1
  792. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +36 -0
  793. package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -2
  794. package/src/resources/extensions/gsd/triage-resolution.ts +23 -6
  795. package/src/resources/extensions/gsd/types.ts +4 -2
  796. package/src/resources/extensions/gsd/undo.ts +2 -2
  797. package/src/resources/extensions/gsd/unit-ownership.ts +206 -35
  798. package/src/resources/extensions/gsd/verdict-parser.ts +21 -6
  799. package/src/resources/extensions/gsd/watch/header-renderer.ts +275 -0
  800. package/src/resources/extensions/gsd/workflow-logger.ts +3 -1
  801. package/src/resources/extensions/gsd/workflow-manifest.ts +22 -5
  802. package/src/resources/extensions/gsd/workflow-projections.ts +97 -64
  803. package/src/resources/extensions/gsd/workflow-reconcile.ts +39 -10
  804. package/src/resources/extensions/gsd/workspace-index.ts +30 -0
  805. package/src/resources/extensions/gsd/worktree-manager.ts +120 -1
  806. package/src/resources/extensions/gsd/worktree-resolver.ts +22 -3
  807. package/src/resources/extensions/mcp-client/index.ts +13 -7
  808. package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +55 -0
  809. package/src/resources/extensions/ollama/index.ts +130 -0
  810. package/src/resources/extensions/ollama/model-capabilities.ts +145 -0
  811. package/src/resources/extensions/ollama/ollama-client.ts +196 -0
  812. package/src/resources/extensions/ollama/ollama-commands.ts +248 -0
  813. package/src/resources/extensions/ollama/ollama-discovery.ts +106 -0
  814. package/src/resources/extensions/ollama/ollama-tool.ts +218 -0
  815. package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +162 -0
  816. package/src/resources/extensions/ollama/tests/ollama-client.test.ts +38 -0
  817. package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +28 -0
  818. package/src/resources/extensions/ollama/types.ts +130 -0
  819. package/src/resources/extensions/search-the-web/extension-manifest.json +1 -1
  820. package/src/resources/extensions/shared/interview-ui.ts +12 -1
  821. package/src/resources/extensions/shared/tests/ask-user-freetext.test.ts +156 -0
  822. package/src/resources/skills/create-gsd-extension/SKILL.md +5 -3
  823. package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +5 -4
  824. package/src/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
  825. package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
  826. package/src/resources/skills/create-gsd-extension/workflows/debug-extension.md +5 -3
  827. package/dist/web/standalone/.next/static/chunks/6502.2305d0afd2385711.js +0 -9
  828. package/dist/web/standalone/.next/static/chunks/app/page-62be3b5fa91e4c8f.js +0 -1
  829. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  830. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  831. package/dist/web/standalone/.next/static/css/a58ef8a151aa0493.css +0 -1
  832. package/src/resources/extensions/gsd/tests/empty-db-reconciliation.test.ts +0 -79
  833. /package/dist/web/standalone/.next/static/{yowc5qPtuKxjOr22KmOAy → uDm3eO1oo9lDfY2TyoO9t}/_buildManifest.js +0 -0
  834. /package/dist/web/standalone/.next/static/{yowc5qPtuKxjOr22KmOAy → uDm3eO1oo9lDfY2TyoO9t}/_ssgManifest.js +0 -0
@@ -58,9 +58,8 @@ import { initRoutingHistory } from "./routing-history.js";
58
58
  import { restoreHookState, resetHookState } from "./post-unit-hooks.js";
59
59
  import { resetProactiveHealing, setLevelChangeCallback } from "./doctor-proactive.js";
60
60
  import { snapshotSkills } from "./skill-discovery.js";
61
- import { isDbAvailable, getMilestone, openDatabase } from "./gsd-db.js";
61
+ import { isDbAvailable, getMilestone } from "./gsd-db.js";
62
62
  import { hideFooter } from "./auto-dashboard.js";
63
- import { resolveProjectRootDbPath } from "./bootstrap/dynamic-tools.js";
64
63
  import {
65
64
  debugLog,
66
65
  enableDebug,
@@ -68,7 +67,6 @@ import {
68
67
  getDebugLogPath,
69
68
  } from "./debug-logger.js";
70
69
  import { parseUnitId } from "./unit-id.js";
71
- import { setLogBasePath } from "./workflow-logger.js";
72
70
  import type { AutoSession } from "./auto/session.js";
73
71
  import {
74
72
  existsSync,
@@ -80,6 +78,7 @@ import {
80
78
  import { join } from "node:path";
81
79
  import { sep as pathSep } from "node:path";
82
80
 
81
+ import { resolveProjectRootDbPath } from "./bootstrap/dynamic-tools.js";
83
82
  import type { WorktreeResolver } from "./worktree-resolver.js";
84
83
 
85
84
  export interface BootstrapDeps {
@@ -98,26 +97,32 @@ export interface BootstrapDeps {
98
97
  * concurrent session detected). Returns true when ready to dispatch.
99
98
  */
100
99
 
101
- /** Guard: tracks consecutive bootstrap attempts that found phase === "complete".
102
- * Prevents the recursive dialog loop described in #1348 where
103
- * bootstrapAutoSession showSmartEntry checkAutoStartAfterDiscuss startAuto
104
- * cycles indefinitely when the discuss workflow doesn't produce a milestone. */
105
- let _consecutiveCompleteBootstraps = 0;
106
- const MAX_CONSECUTIVE_COMPLETE_BOOTSTRAPS = 2;
107
-
100
+ /**
101
+ * Open the project-root DB before the first deriveState call (#2841).
102
+ * When auto-mode starts cold (no prior DB handle), state derivation that
103
+ * touches DB-backed helpers (queue-order, task status) silently falls back
104
+ * to markdown-only data, producing stale or incomplete state. Opening the
105
+ * DB first ensures deriveState sees the full picture on its very first run.
106
+ */
108
107
  async function openProjectDbIfPresent(basePath: string): Promise<void> {
109
108
  const gsdDbPath = resolveProjectRootDbPath(basePath);
110
- if (!existsSync(gsdDbPath) || isDbAvailable()) return;
109
+ if (!existsSync(gsdDbPath)) return;
110
+ if (isDbAvailable()) return;
111
111
 
112
112
  try {
113
+ const { openDatabase } = await import("./gsd-db.js");
113
114
  openDatabase(gsdDbPath);
114
- } catch (err) {
115
- process.stderr.write(
116
- `gsd-db: failed to open existing database: ${(err as Error).message}\n`,
117
- );
115
+ } catch {
116
+ /* non-fatal — DB lifecycle block below will retry */
118
117
  }
119
118
  }
120
119
 
120
+ /** Guard: tracks consecutive bootstrap attempts that found phase === "complete".
121
+ * Prevents the recursive dialog loop described in #1348 where
122
+ * bootstrapAutoSession → showSmartEntry → checkAutoStartAfterDiscuss → startAuto
123
+ * cycles indefinitely when the discuss workflow doesn't produce a milestone. */
124
+ let _consecutiveCompleteBootstraps = 0;
125
+ const MAX_CONSECUTIVE_COMPLETE_BOOTSTRAPS = 2;
121
126
  export async function bootstrapAutoSession(
122
127
  s: AutoSession,
123
128
  ctx: ExtensionCommandContext,
@@ -198,10 +203,13 @@ export async function bootstrapAutoSession(
198
203
  ensureGitignore(base, { manageGitignore });
199
204
  if (manageGitignore !== false) untrackRuntimeFiles(base);
200
205
 
201
- // Bootstrap .gsd/ if it doesn't exist
206
+ // Bootstrap milestones/ if it doesn't exist.
207
+ // Check milestones/ directly — ensureGsdSymlink above already created .gsd/,
208
+ // so checking .gsd/ existence would be dead code (#2942).
202
209
  const gsdDir = join(base, ".gsd");
203
- if (!existsSync(gsdDir)) {
204
- mkdirSync(join(gsdDir, "milestones"), { recursive: true });
210
+ const milestonesPath = join(gsdDir, "milestones");
211
+ if (!existsSync(milestonesPath)) {
212
+ mkdirSync(milestonesPath, { recursive: true });
205
213
  try {
206
214
  nativeAddAll(base);
207
215
  nativeCommit(base, "chore: init gsd");
@@ -280,10 +288,6 @@ export async function bootstrapAutoSession(
280
288
  ctx.ui.notify(`Debug logging enabled → ${getDebugLogPath()}`, "info");
281
289
  }
282
290
 
283
- // Open the project DB before the first derive so resume uses DB truth
284
- // immediately on cold starts instead of falling back to markdown (#2841).
285
- await openProjectDbIfPresent(base);
286
-
287
291
  // Invalidate caches before initial state derivation
288
292
  invalidateAllCaches();
289
293
 
@@ -293,6 +297,10 @@ export async function bootstrapAutoSession(
293
297
  (mid) => !!resolveMilestoneFile(base, mid, "SUMMARY"),
294
298
  );
295
299
 
300
+ // Open the project-root DB before deriveState so DB-backed state
301
+ // derivation (queue-order, task status) works on a cold start (#2841).
302
+ await openProjectDbIfPresent(base);
303
+
296
304
  let state = await deriveState(base);
297
305
 
298
306
  // Stale worktree state recovery (#654)
@@ -490,7 +498,6 @@ export async function bootstrapAutoSession(
490
498
  s.verbose = verboseMode;
491
499
  s.cmdCtx = ctx;
492
500
  s.basePath = base;
493
- setLogBasePath(base);
494
501
  s.unitDispatchCount.clear();
495
502
  s.unitRecoveryCount.clear();
496
503
  s.lastBudgetAlertLevel = 0;
@@ -554,14 +561,15 @@ export async function bootstrapAutoSession(
554
561
  }
555
562
 
556
563
  // ── DB lifecycle ──
557
- const gsdDbPath = resolveProjectRootDbPath(s.basePath);
564
+ const gsdDbPath = join(s.basePath, ".gsd", "gsd.db");
558
565
  const gsdDirPath = join(s.basePath, ".gsd");
559
566
  if (existsSync(gsdDirPath) && !existsSync(gsdDbPath)) {
560
567
  const hasDecisions = existsSync(join(gsdDirPath, "DECISIONS.md"));
561
568
  const hasRequirements = existsSync(join(gsdDirPath, "REQUIREMENTS.md"));
562
569
  const hasMilestones = existsSync(join(gsdDirPath, "milestones"));
563
570
  try {
564
- openDatabase(gsdDbPath);
571
+ const { openDatabase: openDb } = await import("./gsd-db.js");
572
+ openDb(gsdDbPath);
565
573
  if (hasDecisions || hasRequirements || hasMilestones) {
566
574
  const { migrateFromMarkdown } = await import("./md-importer.js");
567
575
  migrateFromMarkdown(s.basePath);
@@ -574,7 +582,8 @@ export async function bootstrapAutoSession(
574
582
  }
575
583
  if (existsSync(gsdDbPath) && !isDbAvailable()) {
576
584
  try {
577
- openDatabase(gsdDbPath);
585
+ const { openDatabase: openDb } = await import("./gsd-db.js");
586
+ openDb(gsdDbPath);
578
587
  } catch (err) {
579
588
  process.stderr.write(
580
589
  `gsd-db: failed to open existing database: ${(err as Error).message}\n`,
@@ -15,6 +15,7 @@ import {
15
15
  realpathSync,
16
16
  rmSync,
17
17
  unlinkSync,
18
+ statSync,
18
19
  lstatSync as lstatSyncFn,
19
20
  } from "node:fs";
20
21
  import { isAbsolute, join, sep as pathSep } from "node:path";
@@ -62,6 +63,7 @@ import {
62
63
  nativeDiffNumstat,
63
64
  nativeUpdateRef,
64
65
  nativeIsAncestor,
66
+ nativeMergeAbort,
65
67
  } from "./native-git-bridge.js";
66
68
 
67
69
  const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
@@ -84,6 +86,7 @@ const ROOT_STATE_FILES = [
84
86
  "QUEUE.md",
85
87
  "completed-units.json",
86
88
  "metrics.json",
89
+ "mcp.json",
87
90
  // NOTE: project preferences are intentionally NOT in ROOT_STATE_FILES.
88
91
  // Forward-sync (main → worktree) is handled explicitly in syncGsdStateToWorktree().
89
92
  // Back-sync (worktree → main) must NEVER overwrite the project root's copy
@@ -102,6 +105,67 @@ function isSamePath(a: string, b: string): boolean {
102
105
  }
103
106
  }
104
107
 
108
+ // ─── ASSESSMENT Force-Sync Helper (#2821) ─────────────────────────────────
109
+
110
+ /** Regex matching YAML frontmatter `verdict:` field. */
111
+ const VERDICT_RE = /verdict:\s*[\w-]+/i;
112
+
113
+ /**
114
+ * Walk a milestone directory and force-overwrite ASSESSMENT files in the
115
+ * destination when the source copy contains a `verdict:` field.
116
+ *
117
+ * This is the targeted fix for the UAT stuck-loop (#2821): the main
118
+ * safeCopyRecursive uses force:false to protect worktree-authoritative
119
+ * files (#1886), but ASSESSMENT files written by run-uat must be
120
+ * forward-synced when the project root has a verdict. Without this,
121
+ * the worktree retains a stale FAIL or missing ASSESSMENT and
122
+ * checkNeedsRunUat re-dispatches run-uat indefinitely.
123
+ *
124
+ * Only overwrites when the source has a verdict — never clobbers a
125
+ * worktree ASSESSMENT with a verdictless project-root copy.
126
+ */
127
+ function forceOverwriteAssessmentsWithVerdict(
128
+ srcMilestoneDir: string,
129
+ dstMilestoneDir: string,
130
+ ): void {
131
+ if (!existsSync(srcMilestoneDir)) return;
132
+
133
+ // Walk slices/<SID>/ looking for *-ASSESSMENT.md files
134
+ const slicesDir = join(srcMilestoneDir, "slices");
135
+ if (!existsSync(slicesDir)) return;
136
+
137
+ try {
138
+ for (const sliceEntry of readdirSync(slicesDir, { withFileTypes: true })) {
139
+ if (!sliceEntry.isDirectory()) continue;
140
+ const srcSliceDir = join(slicesDir, sliceEntry.name);
141
+ const dstSliceDir = join(dstMilestoneDir, "slices", sliceEntry.name);
142
+
143
+ try {
144
+ for (const fileEntry of readdirSync(srcSliceDir, { withFileTypes: true })) {
145
+ if (!fileEntry.isFile()) continue;
146
+ if (!fileEntry.name.endsWith("-ASSESSMENT.md")) continue;
147
+
148
+ const srcFile = join(srcSliceDir, fileEntry.name);
149
+ try {
150
+ const srcContent = readFileSync(srcFile, "utf-8");
151
+ if (!VERDICT_RE.test(srcContent)) continue; // no verdict in source — skip
152
+
153
+ // Source has a verdict — force-copy into worktree
154
+ mkdirSync(dstSliceDir, { recursive: true });
155
+ safeCopy(srcFile, join(dstSliceDir, fileEntry.name), { force: true });
156
+ } catch {
157
+ /* non-fatal per file */
158
+ }
159
+ }
160
+ } catch {
161
+ /* non-fatal per slice */
162
+ }
163
+ }
164
+ } catch {
165
+ /* non-fatal */
166
+ }
167
+ }
168
+
105
169
  // ─── Module State ──────────────────────────────────────────────────────────
106
170
 
107
171
  /** Original project root before chdir into auto-worktree. */
@@ -214,6 +278,19 @@ export function syncProjectRootToWorktree(
214
278
  { force: false },
215
279
  );
216
280
 
281
+ // Force-sync ASSESSMENT files that have a verdict from project root (#2821).
282
+ // The additive-only copy above preserves worktree-authoritative files, but
283
+ // ASSESSMENT files are special: after run-uat writes a verdict and post-unit
284
+ // syncs it to the project root, the worktree may retain a stale copy (e.g.
285
+ // verdict:fail while the project root has verdict:pass from a retry). On
286
+ // session resume the DB is rebuilt from disk, and if the stale ASSESSMENT
287
+ // persists, checkNeedsRunUat finds no passing verdict → re-dispatches
288
+ // run-uat indefinitely (stuck-loop ×9).
289
+ forceOverwriteAssessmentsWithVerdict(
290
+ join(prGsd, "milestones", milestoneId),
291
+ join(wtGsd, "milestones", milestoneId),
292
+ );
293
+
217
294
  // Forward-sync completed-units.json from project root to worktree.
218
295
  // Project root is authoritative for completion state after crash recovery;
219
296
  // without this, the worktree re-dispatches already-completed units (#1886).
@@ -223,12 +300,18 @@ export function syncProjectRootToWorktree(
223
300
  { force: true },
224
301
  );
225
302
 
226
- // Delete worktree gsd.db so it rebuilds from the freshly synced files.
227
- // Stale DB rows are the root cause of the infinite skip loop (#853).
303
+ // Delete worktree gsd.db ONLY if it is empty (0 bytes).
304
+ // An empty DB is stale/corrupt and should be rebuilt (#853).
305
+ // A non-empty DB was populated by gsd-migrate on respawn and must be
306
+ // preserved — deleting it truncates the file to 0 bytes when
307
+ // openDatabase re-creates it, causing "no such table" failures (#2815).
228
308
  try {
229
309
  const wtDb = join(wtGsd, "gsd.db");
230
310
  if (existsSync(wtDb)) {
231
- unlinkSync(wtDb);
311
+ const size = statSync(wtDb).size;
312
+ if (size === 0) {
313
+ unlinkSync(wtDb);
314
+ }
232
315
  }
233
316
  } catch {
234
317
  /* non-fatal */
@@ -1004,6 +1087,7 @@ function copyPlanningArtifacts(srcBase: string, wtPath: string): void {
1004
1087
  "STATE.md",
1005
1088
  "KNOWLEDGE.md",
1006
1089
  "OVERRIDES.md",
1090
+ "mcp.json",
1007
1091
  ]) {
1008
1092
  safeCopy(join(srcGsd, file), join(dstGsd, file), { force: true });
1009
1093
  }
@@ -1264,12 +1348,17 @@ export function mergeMilestoneToMain(
1264
1348
  // 1. Auto-commit dirty state in worktree before leaving
1265
1349
  autoCommitDirtyState(worktreeCwd);
1266
1350
 
1267
- // Reconcile worktree DB into main DB before leaving worktree context
1351
+ // Reconcile worktree DB into main DB before leaving worktree context.
1352
+ // Skip when both paths resolve to the same physical file (shared WAL /
1353
+ // symlink layout) — ATTACHing a WAL-mode file to itself corrupts the
1354
+ // database (#2823).
1268
1355
  if (isDbAvailable()) {
1269
1356
  try {
1270
1357
  const worktreeDbPath = join(worktreeCwd, ".gsd", "gsd.db");
1271
1358
  const mainDbPath = join(originalBasePath_, ".gsd", "gsd.db");
1272
- reconcileWorktreeDb(mainDbPath, worktreeDbPath);
1359
+ if (!isSamePath(worktreeDbPath, mainDbPath)) {
1360
+ reconcileWorktreeDb(mainDbPath, worktreeDbPath);
1361
+ }
1273
1362
  } catch {
1274
1363
  /* non-fatal */
1275
1364
  }
@@ -1409,9 +1498,19 @@ export function mergeMilestoneToMain(
1409
1498
  encoding: "utf-8",
1410
1499
  }).trim();
1411
1500
  if (status) {
1501
+ // Use --include-untracked to stash untracked files that would block
1502
+ // the squash merge, but EXCLUDE .gsd/milestones/ (#2505).
1503
+ // --include-untracked without exclusion sweeps queued milestone
1504
+ // CONTEXT files into the stash. If stash pop later fails, those files
1505
+ // are permanently trapped in the stash entry and lost on the next
1506
+ // stash push or drop.
1412
1507
  execFileSync(
1413
1508
  "git",
1414
- ["stash", "push", "--include-untracked", "-m", `gsd: pre-merge stash for ${milestoneId}`],
1509
+ [
1510
+ "stash", "push", "--include-untracked",
1511
+ "-m", `gsd: pre-merge stash for ${milestoneId}`,
1512
+ "--", ":(exclude).gsd/milestones",
1513
+ ],
1415
1514
  { cwd: originalBasePath_, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" },
1416
1515
  );
1417
1516
  stashed = true;
@@ -1421,6 +1520,65 @@ export function mergeMilestoneToMain(
1421
1520
  // report the dirty tree if it fails.
1422
1521
  }
1423
1522
 
1523
+ // 7a. Shelter queued milestone directories before the squash merge (#2505).
1524
+ // The milestone branch may contain copies of queued milestone dirs (via
1525
+ // copyPlanningArtifacts), so `git merge --squash` rejects when those same
1526
+ // files exist as untracked in the working tree. Temporarily move them to
1527
+ // a backup location, then restore after the merge+commit.
1528
+ const milestonesDir = join(gsdRoot(originalBasePath_), "milestones");
1529
+ const shelterDir = join(gsdRoot(originalBasePath_), ".milestone-shelter");
1530
+ const shelteredDirs: string[] = [];
1531
+
1532
+ // Helper: restore sheltered milestone directories (#2505).
1533
+ // Called on both success and error paths to ensure queued CONTEXT files
1534
+ // are never permanently lost.
1535
+ const restoreShelter = (): void => {
1536
+ if (shelteredDirs.length === 0) return;
1537
+ for (const dirName of shelteredDirs) {
1538
+ try {
1539
+ mkdirSync(milestonesDir, { recursive: true });
1540
+ cpSync(join(shelterDir, dirName), join(milestonesDir, dirName), { recursive: true, force: true });
1541
+ } catch { /* best-effort */ }
1542
+ }
1543
+ try { rmSync(shelterDir, { recursive: true, force: true }); } catch { /* best-effort */ }
1544
+ };
1545
+
1546
+ try {
1547
+ if (existsSync(milestonesDir)) {
1548
+ const entries = readdirSync(milestonesDir, { withFileTypes: true });
1549
+ for (const entry of entries) {
1550
+ if (!entry.isDirectory()) continue;
1551
+ // Only shelter directories that do NOT belong to the milestone being merged
1552
+ if (entry.name === milestoneId) continue;
1553
+ const srcDir = join(milestonesDir, entry.name);
1554
+ const dstDir = join(shelterDir, entry.name);
1555
+ try {
1556
+ mkdirSync(shelterDir, { recursive: true });
1557
+ cpSync(srcDir, dstDir, { recursive: true, force: true });
1558
+ rmSync(srcDir, { recursive: true, force: true });
1559
+ shelteredDirs.push(entry.name);
1560
+ } catch {
1561
+ // Non-fatal — if shelter fails, the merge may still succeed
1562
+ }
1563
+ }
1564
+ }
1565
+ } catch {
1566
+ // Non-fatal — proceed with merge; untracked files may block it
1567
+ }
1568
+
1569
+ // 7b. Clean up stale merge state before attempting squash merge (#2912).
1570
+ // A leftover MERGE_HEAD (from a previous failed merge, libgit2 native path,
1571
+ // or interrupted operation) causes `git merge --squash` to refuse with
1572
+ // "fatal: You have not concluded your merge (MERGE_HEAD exists)".
1573
+ // Defensively remove merge artifacts before starting.
1574
+ try {
1575
+ const gitDir_ = resolveGitDir(originalBasePath_);
1576
+ for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_HEAD"]) {
1577
+ const p = join(gitDir_, f);
1578
+ if (existsSync(p)) unlinkSync(p);
1579
+ }
1580
+ } catch { /* best-effort */ }
1581
+
1424
1582
  // 8. Squash merge — auto-resolve .gsd/ state file conflicts (#530)
1425
1583
  const mergeResult = nativeMergeSquash(originalBasePath_, milestoneBranch);
1426
1584
 
@@ -1429,6 +1587,16 @@ export function mergeMilestoneToMain(
1429
1587
  // untracked .gsd/ files left by syncStateToProjectRoot). Preserve the
1430
1588
  // milestone branch so commits are not lost.
1431
1589
  if (mergeResult.conflicts.includes("__dirty_working_tree__")) {
1590
+ // Defensively clean merge state — the native path may leave MERGE_HEAD
1591
+ // even when the merge is rejected (#2912).
1592
+ try {
1593
+ const gitDir_ = resolveGitDir(originalBasePath_);
1594
+ for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_HEAD"]) {
1595
+ const p = join(gitDir_, f);
1596
+ if (existsSync(p)) unlinkSync(p);
1597
+ }
1598
+ } catch { /* best-effort */ }
1599
+
1432
1600
  // Pop stash before throwing so local work is not lost.
1433
1601
  if (stashed) {
1434
1602
  try {
@@ -1439,6 +1607,7 @@ export function mergeMilestoneToMain(
1439
1607
  });
1440
1608
  } catch { /* stash pop conflict is non-fatal */ }
1441
1609
  }
1610
+ restoreShelter();
1442
1611
  // Restore cwd so the caller is not stranded on the integration branch
1443
1612
  process.chdir(previousCwd);
1444
1613
  // Surface the actual dirty filenames from git stderr instead of
@@ -1485,6 +1654,18 @@ export function mergeMilestoneToMain(
1485
1654
 
1486
1655
  // If there are still real code conflicts, escalate
1487
1656
  if (codeConflicts.length > 0) {
1657
+ // Abort merge state so MERGE_HEAD is not left on disk (#2912).
1658
+ // libgit2's merge creates MERGE_HEAD even for squash merges; if left
1659
+ // dangling, subsequent merges fail and doctor reports corrupt state.
1660
+ try { nativeMergeAbort(originalBasePath_); } catch { /* best-effort */ }
1661
+ try {
1662
+ const gitDir_ = resolveGitDir(originalBasePath_);
1663
+ for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_HEAD"]) {
1664
+ const p = join(gitDir_, f);
1665
+ if (existsSync(p)) unlinkSync(p);
1666
+ }
1667
+ } catch { /* best-effort */ }
1668
+
1488
1669
  // Pop stash before throwing so local work is not lost (#2151).
1489
1670
  if (stashed) {
1490
1671
  try {
@@ -1495,6 +1676,7 @@ export function mergeMilestoneToMain(
1495
1676
  });
1496
1677
  } catch { /* stash pop conflict is non-fatal */ }
1497
1678
  }
1679
+ restoreShelter();
1498
1680
  throw new MergeConflictError(
1499
1681
  codeConflicts,
1500
1682
  "squash",
@@ -1510,14 +1692,18 @@ export function mergeMilestoneToMain(
1510
1692
  const commitResult = nativeCommit(originalBasePath_, commitMessage);
1511
1693
  const nothingToCommit = commitResult === null;
1512
1694
 
1513
- // 9a. Clean up SQUASH_MSG left by git merge --squash (#1853).
1695
+ // 9a. Clean up merge state files left by git merge --squash (#1853, #2912).
1514
1696
  // git only removes SQUASH_MSG when the commit reads it directly (plain
1515
1697
  // `git commit`). nativeCommit uses `-F -` (stdin) or libgit2, neither
1516
- // of which trigger git's SQUASH_MSG cleanup. If left on disk, doctor
1517
- // reports `corrupt_merge_state` on every subsequent run.
1698
+ // of which trigger git's SQUASH_MSG cleanup. MERGE_HEAD is created by
1699
+ // libgit2's merge even in squash mode and is not removed by nativeCommit.
1700
+ // If left on disk, doctor reports `corrupt_merge_state` on every subsequent run.
1518
1701
  try {
1519
- const squashMsgPath = join(resolveGitDir(originalBasePath_), "SQUASH_MSG");
1520
- if (existsSync(squashMsgPath)) unlinkSync(squashMsgPath);
1702
+ const gitDir_ = resolveGitDir(originalBasePath_);
1703
+ for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_HEAD"]) {
1704
+ const p = join(gitDir_, f);
1705
+ if (existsSync(p)) unlinkSync(p);
1706
+ }
1521
1707
  } catch { /* best-effort */ }
1522
1708
 
1523
1709
  // 9a-ii. Restore stashed files now that the merge+commit is complete (#2151).
@@ -1576,6 +1762,9 @@ export function mergeMilestoneToMain(
1576
1762
  }
1577
1763
  }
1578
1764
 
1765
+ // 9a-iii. Restore sheltered queued milestone directories (#2505).
1766
+ restoreShelter();
1767
+
1579
1768
  // 9b. Safety check (#1792): if nothing was committed, verify the milestone
1580
1769
  // work is already on the integration branch before allowing teardown.
1581
1770
  // Compare only non-.gsd/ paths — .gsd/ state files diverge normally and
@@ -1061,6 +1061,11 @@ export async function startAuto(
1061
1061
  verboseMode: boolean,
1062
1062
  options?: { step?: boolean },
1063
1063
  ): Promise<void> {
1064
+ if (s.active) {
1065
+ debugLog("startAuto", { phase: "already-active", skipping: true });
1066
+ return;
1067
+ }
1068
+
1064
1069
  const requestedStepMode = options?.step ?? false;
1065
1070
 
1066
1071
  // Escape stale worktree cwd from a previous milestone (#608).
@@ -68,6 +68,28 @@ export async function handleAgentEnd(
68
68
 
69
69
  const lastMsg = event.messages[event.messages.length - 1];
70
70
  if (lastMsg && "stopReason" in lastMsg && lastMsg.stopReason === "aborted") {
71
+ // Empty content with aborted stopReason is a non-fatal agent stop (the LLM
72
+ // chose to end without producing output). Only pause on genuine fatal aborts
73
+ // that carry error context — e.g. errorMessage field or non-empty content
74
+ // indicating a mid-stream failure. (#2695)
75
+ const content = "content" in lastMsg ? lastMsg.content : undefined;
76
+ const hasEmptyContent = Array.isArray(content) && content.length === 0;
77
+ const hasErrorMessage = "errorMessage" in lastMsg && !!lastMsg.errorMessage;
78
+
79
+ if (hasEmptyContent && !hasErrorMessage) {
80
+ // Non-fatal: treat as a normal agent end so the loop can continue
81
+ // instead of entering a stuck re-dispatch cycle.
82
+ try {
83
+ resetRetryState(retryState);
84
+ resolveAgentEnd(event);
85
+ } catch (err) {
86
+ const message = err instanceof Error ? err.message : String(err);
87
+ ctx.ui.notify(`Auto-mode error after empty-content abort: ${message}. Stopping auto-mode.`, "error");
88
+ try { await pauseAuto(ctx, pi); } catch { /* best-effort */ }
89
+ }
90
+ return;
91
+ }
92
+
71
93
  await pauseAuto(ctx, pi);
72
94
  return;
73
95
  }
@@ -79,6 +101,15 @@ export async function handleAgentEnd(
79
101
  // ── 1. Classify ──────────────────────────────────────────────────────
80
102
  const cls = classifyError(errorMsg, explicitRetryAfterMs);
81
103
 
104
+ // Cap rate-limit backoff for CLI-style providers (openai-codex, google-gemini-cli)
105
+ // which use per-user quotas with shorter windows (#2922).
106
+ if (cls.kind === "rate-limit") {
107
+ const currentProvider = ctx.model?.provider;
108
+ if (currentProvider === "openai-codex" || currentProvider === "google-gemini-cli") {
109
+ cls.retryAfterMs = Math.min(cls.retryAfterMs, 30_000);
110
+ }
111
+ }
112
+
82
113
  // ── 2. Decide & Act ──────────────────────────────────────────────────
83
114
 
84
115
  // --- Network errors: same-model retry with backoff ---
@@ -121,14 +121,6 @@ export function registerDbTools(pi: ExtensionAPI): void {
121
121
  };
122
122
  }
123
123
  try {
124
- const db = await import("../gsd-db.js");
125
- const existing = db.getRequirementById(params.id);
126
- if (!existing) {
127
- return {
128
- content: [{ type: "text" as const, text: `Error: Requirement ${params.id} not found.` }],
129
- details: { operation: "update_requirement", id: params.id, error: "not_found" } as any,
130
- };
131
- }
132
124
  const { updateRequirementInDb } = await import("../db-writer.js");
133
125
  const updates: Record<string, string | undefined> = {};
134
126
  if (params.status !== undefined) updates.status = params.status;
@@ -196,6 +188,91 @@ export function registerDbTools(pi: ExtensionAPI): void {
196
188
  pi.registerTool(requirementUpdateTool);
197
189
  registerAlias(pi, requirementUpdateTool, "gsd_update_requirement", "gsd_requirement_update");
198
190
 
191
+ // ─── gsd_requirement_save ─────────────────────────────────────────────
192
+
193
+ const requirementSaveExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
194
+ const dbAvailable = await ensureDbOpen();
195
+ if (!dbAvailable) {
196
+ return {
197
+ content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot save requirement." }],
198
+ details: { operation: "save_requirement", error: "db_unavailable" } as any,
199
+ };
200
+ }
201
+ try {
202
+ const { saveRequirementToDb } = await import("../db-writer.js");
203
+ const result = await saveRequirementToDb(
204
+ {
205
+ class: params.class,
206
+ status: params.status,
207
+ description: params.description,
208
+ why: params.why,
209
+ source: params.source,
210
+ primary_owner: params.primary_owner,
211
+ supporting_slices: params.supporting_slices,
212
+ validation: params.validation,
213
+ notes: params.notes,
214
+ },
215
+ process.cwd(),
216
+ );
217
+ return {
218
+ content: [{ type: "text" as const, text: `Saved requirement ${result.id}` }],
219
+ details: { operation: "save_requirement", id: result.id } as any,
220
+ };
221
+ } catch (err) {
222
+ const msg = err instanceof Error ? err.message : String(err);
223
+ logError("tool", `gsd_requirement_save tool failed: ${msg}`, { tool: "gsd_requirement_save", error: String(err) });
224
+ return {
225
+ content: [{ type: "text" as const, text: `Error saving requirement: ${msg}` }],
226
+ details: { operation: "save_requirement", error: msg } as any,
227
+ };
228
+ }
229
+ };
230
+
231
+ const requirementSaveTool = {
232
+ name: "gsd_requirement_save",
233
+ label: "Save Requirement",
234
+ description:
235
+ "Record a new requirement to the GSD database and regenerate REQUIREMENTS.md. " +
236
+ "Requirement IDs are auto-assigned — never provide an ID manually.",
237
+ promptSnippet: "Record a new GSD requirement to the database (auto-assigns ID, regenerates REQUIREMENTS.md)",
238
+ promptGuidelines: [
239
+ "Use gsd_requirement_save when recording a new functional, non-functional, or operational requirement.",
240
+ "Requirement IDs are auto-assigned (R001, R002, ...) — never guess or provide an ID.",
241
+ "class, description, why, and source are required. All other fields are optional.",
242
+ "The tool writes to the DB and regenerates .gsd/REQUIREMENTS.md automatically.",
243
+ ],
244
+ parameters: Type.Object({
245
+ class: Type.String({ description: "Requirement class (e.g. 'functional', 'non-functional', 'operational')" }),
246
+ description: Type.String({ description: "Short description of the requirement" }),
247
+ why: Type.String({ description: "Why this requirement matters" }),
248
+ source: Type.String({ description: "Origin of the requirement (e.g. 'user-research', 'design', 'M001')" }),
249
+ status: Type.Optional(Type.String({ description: "Status (default: 'active')" })),
250
+ primary_owner: Type.Optional(Type.String({ description: "Primary owning slice" })),
251
+ supporting_slices: Type.Optional(Type.String({ description: "Supporting slices" })),
252
+ validation: Type.Optional(Type.String({ description: "Validation criteria" })),
253
+ notes: Type.Optional(Type.String({ description: "Additional notes" })),
254
+ }),
255
+ execute: requirementSaveExecute,
256
+ renderCall(args: any, theme: any) {
257
+ let text = theme.fg("toolTitle", theme.bold("requirement_save "));
258
+ if (args.class) text += theme.fg("accent", `[${args.class}] `);
259
+ if (args.description) text += theme.fg("muted", args.description);
260
+ return new Text(text, 0, 0);
261
+ },
262
+ renderResult(result: any, _options: any, theme: any) {
263
+ const d = result.details;
264
+ if (result.isError || d?.error) {
265
+ return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
266
+ }
267
+ let text = theme.fg("success", `Requirement ${d?.id ?? ""} saved`);
268
+ text += theme.fg("dim", ` → REQUIREMENTS.md`);
269
+ return new Text(text, 0, 0);
270
+ },
271
+ };
272
+
273
+ pi.registerTool(requirementSaveTool);
274
+ registerAlias(pi, requirementSaveTool, "gsd_save_requirement", "gsd_requirement_save");
275
+
199
276
  // ─── gsd_summary_save (formerly gsd_save_summary) ──────────────────────
200
277
 
201
278
  const summarySaveExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
@@ -924,7 +1001,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
924
1001
  promptSnippet: "Validate a GSD milestone (DB write + VALIDATION.md render)",
925
1002
  promptGuidelines: [
926
1003
  "Use gsd_validate_milestone when all slices are done and the milestone needs validation before completion.",
927
- "Parameters: milestoneId, verdict, remediationRound, successCriteriaChecklist, sliceDeliveryAudit, crossSliceIntegration, requirementCoverage, verdictRationale, remediationPlan (optional).",
1004
+ "Parameters: milestoneId, verdict, remediationRound, successCriteriaChecklist, sliceDeliveryAudit, crossSliceIntegration, requirementCoverage, verificationClasses (optional), verdictRationale, remediationPlan (optional).",
928
1005
  "If verdict is 'needs-remediation', also provide remediationPlan and use gsd_reassess_roadmap to add remediation slices to the roadmap.",
929
1006
  "On success, returns validationPath where VALIDATION.md was written.",
930
1007
  ],
@@ -936,6 +1013,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
936
1013
  sliceDeliveryAudit: Type.String({ description: "Markdown table auditing each slice's claimed vs delivered output" }),
937
1014
  crossSliceIntegration: Type.String({ description: "Markdown describing any cross-slice boundary mismatches" }),
938
1015
  requirementCoverage: Type.String({ description: "Markdown describing any unaddressed requirements" }),
1016
+ verificationClasses: Type.Optional(Type.String({ description: "Markdown describing verification class compliance and gaps" })),
939
1017
  verdictRationale: Type.String({ description: "Why this verdict was chosen" }),
940
1018
  remediationPlan: Type.Optional(Type.String({ description: "Remediation plan (required if verdict is needs-remediation)" })),
941
1019
  }),