gsd-pi 2.63.0 → 2.64.0-dev.1a85e85

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 (583) hide show
  1. package/README.md +46 -134
  2. package/dist/cli.js +48 -6
  3. package/dist/headless-query.js +11 -1
  4. package/dist/help-text.js +4 -1
  5. package/dist/onboarding.js +15 -8
  6. package/dist/resource-loader.js +18 -3
  7. package/dist/resources/extensions/cmux/index.js +21 -12
  8. package/dist/resources/extensions/gsd/auto/detect-stuck.js +27 -0
  9. package/dist/resources/extensions/gsd/auto/finalize-timeout.js +40 -0
  10. package/dist/resources/extensions/gsd/auto/loop.js +4 -0
  11. package/dist/resources/extensions/gsd/auto/phases.js +157 -22
  12. package/dist/resources/extensions/gsd/auto/session.js +12 -0
  13. package/dist/resources/extensions/gsd/auto-dashboard.js +14 -8
  14. package/dist/resources/extensions/gsd/auto-model-selection.js +32 -0
  15. package/dist/resources/extensions/gsd/auto-post-unit.js +222 -11
  16. package/dist/resources/extensions/gsd/auto-prompts.js +25 -0
  17. package/dist/resources/extensions/gsd/auto-recovery.js +15 -7
  18. package/dist/resources/extensions/gsd/auto-start.js +10 -21
  19. package/dist/resources/extensions/gsd/auto-timers.js +2 -1
  20. package/dist/resources/extensions/gsd/auto-tool-tracking.js +17 -0
  21. package/dist/resources/extensions/gsd/auto-verification.js +138 -1
  22. package/dist/resources/extensions/gsd/auto-worktree.js +13 -7
  23. package/dist/resources/extensions/gsd/auto.js +24 -2
  24. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +147 -75
  25. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +13 -0
  26. package/dist/resources/extensions/gsd/bootstrap/notify-interceptor.js +28 -0
  27. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +85 -0
  28. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +3 -0
  29. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +40 -1
  30. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +15 -0
  31. package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +54 -0
  32. package/dist/resources/extensions/gsd/bootstrap/system-context.js +50 -2
  33. package/dist/resources/extensions/gsd/commands/catalog.js +7 -1
  34. package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -0
  35. package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +103 -0
  36. package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
  37. package/dist/resources/extensions/gsd/commands-handlers.js +9 -4
  38. package/dist/resources/extensions/gsd/constants.js +42 -0
  39. package/dist/resources/extensions/gsd/db-writer.js +72 -4
  40. package/dist/resources/extensions/gsd/forensics.js +20 -4
  41. package/dist/resources/extensions/gsd/gsd-db.js +64 -17
  42. package/dist/resources/extensions/gsd/guided-flow.js +19 -0
  43. package/dist/resources/extensions/gsd/metrics.js +27 -1
  44. package/dist/resources/extensions/gsd/native-git-bridge.js +5 -3
  45. package/dist/resources/extensions/gsd/notification-overlay.js +224 -0
  46. package/dist/resources/extensions/gsd/notification-store.js +268 -0
  47. package/dist/resources/extensions/gsd/notification-widget.js +56 -0
  48. package/dist/resources/extensions/gsd/post-execution-checks.js +407 -0
  49. package/dist/resources/extensions/gsd/pre-execution-checks.js +464 -0
  50. package/dist/resources/extensions/gsd/preferences-types.js +6 -0
  51. package/dist/resources/extensions/gsd/preferences-validation.js +33 -0
  52. package/dist/resources/extensions/gsd/preferences.js +11 -2
  53. package/dist/resources/extensions/gsd/prompt-loader.js +7 -0
  54. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +2 -0
  55. package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -0
  56. package/dist/resources/extensions/gsd/prompts/doctor-heal.md +1 -0
  57. package/dist/resources/extensions/gsd/prompts/forensics.md +2 -0
  58. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +2 -0
  59. package/dist/resources/extensions/gsd/prompts/system.md +4 -7
  60. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -0
  61. package/dist/resources/extensions/gsd/roadmap-mutations.js +1 -1
  62. package/dist/resources/extensions/gsd/roadmap-slices.js +9 -5
  63. package/dist/resources/extensions/gsd/safety/content-validator.js +73 -0
  64. package/dist/resources/extensions/gsd/safety/destructive-guard.js +34 -0
  65. package/dist/resources/extensions/gsd/safety/evidence-collector.js +109 -0
  66. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +83 -0
  67. package/dist/resources/extensions/gsd/safety/file-change-validator.js +71 -0
  68. package/dist/resources/extensions/gsd/safety/git-checkpoint.js +91 -0
  69. package/dist/resources/extensions/gsd/safety/safety-harness.js +64 -0
  70. package/dist/resources/extensions/gsd/slice-parallel-conflict.js +67 -0
  71. package/dist/resources/extensions/gsd/slice-parallel-eligibility.js +51 -0
  72. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +378 -0
  73. package/dist/resources/extensions/gsd/state.js +74 -14
  74. package/dist/resources/extensions/gsd/status-guards.js +11 -0
  75. package/dist/resources/extensions/gsd/tools/complete-milestone.js +17 -12
  76. package/dist/resources/extensions/gsd/tools/complete-slice.js +40 -26
  77. package/dist/resources/extensions/gsd/tools/complete-task.js +12 -12
  78. package/dist/resources/extensions/gsd/tools/plan-milestone.js +33 -25
  79. package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -8
  80. package/dist/resources/extensions/gsd/verification-evidence.js +18 -0
  81. package/dist/resources/extensions/gsd/workflow-logger.js +8 -0
  82. package/dist/resources/extensions/gsd/workflow-projections.js +21 -5
  83. package/dist/resources/extensions/gsd/worktree-manager.js +82 -29
  84. package/dist/resources/extensions/gsd/worktree-resolver.js +4 -3
  85. package/dist/resources/extensions/mcp-client/auth.js +101 -0
  86. package/dist/resources/extensions/mcp-client/index.js +10 -1
  87. package/dist/resources/extensions/ollama/index.js +28 -22
  88. package/dist/resources/extensions/ollama/model-capabilities.js +37 -34
  89. package/dist/resources/extensions/ollama/ndjson-stream.js +54 -0
  90. package/dist/resources/extensions/ollama/ollama-chat-provider.js +380 -0
  91. package/dist/resources/extensions/ollama/ollama-client.js +23 -32
  92. package/dist/resources/extensions/ollama/ollama-discovery.js +2 -7
  93. package/dist/resources/extensions/ollama/ollama-tool.js +62 -0
  94. package/dist/resources/extensions/ollama/thinking-parser.js +104 -0
  95. package/dist/update-cmd.js +4 -2
  96. package/dist/web/standalone/.next/BUILD_ID +1 -1
  97. package/dist/web/standalone/.next/app-path-routes-manifest.json +19 -18
  98. package/dist/web/standalone/.next/build-manifest.json +3 -3
  99. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  100. package/dist/web/standalone/.next/required-server-files.json +4 -4
  101. package/dist/web/standalone/.next/routes-manifest.json +6 -0
  102. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  103. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  104. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  105. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  113. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  114. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  115. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  116. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  117. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  119. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  124. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  127. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  130. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  132. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  133. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  138. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  141. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  146. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  148. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  175. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/notifications/route.js +3 -0
  177. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -0
  178. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -0
  179. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  186. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  189. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  191. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  197. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  199. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  200. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  203. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  206. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  211. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  214. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  217. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  219. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  221. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  222. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  223. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  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.js.nft.json +1 -1
  227. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  230. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  232. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  234. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  235. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  236. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  237. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  238. package/dist/web/standalone/.next/server/app/index.html +1 -1
  239. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  240. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  241. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  242. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  243. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  244. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  245. package/dist/web/standalone/.next/server/app/page.js +2 -2
  246. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  247. package/dist/web/standalone/.next/server/app-paths-manifest.json +19 -18
  248. package/dist/web/standalone/.next/server/chunks/6897.js +12 -0
  249. package/dist/web/standalone/.next/server/chunks/7471.js +3 -3
  250. package/dist/web/standalone/.next/server/functions-config-manifest.json +1 -0
  251. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  252. package/dist/web/standalone/.next/server/middleware.js +2 -2
  253. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  254. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  255. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  256. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  257. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  258. package/dist/web/standalone/.next/static/chunks/app/_global-error/page-8805a20e15762c3c.js +1 -0
  259. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  260. package/dist/web/standalone/.next/static/chunks/app/api/boot/route-8805a20e15762c3c.js +1 -0
  261. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-8805a20e15762c3c.js +1 -0
  262. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-8805a20e15762c3c.js +1 -0
  263. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-8805a20e15762c3c.js +1 -0
  264. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-8805a20e15762c3c.js +1 -0
  265. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-8805a20e15762c3c.js +1 -0
  266. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-8805a20e15762c3c.js +1 -0
  267. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-8805a20e15762c3c.js +1 -0
  268. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-8805a20e15762c3c.js +1 -0
  269. package/dist/web/standalone/.next/static/chunks/app/api/experimental/route-8805a20e15762c3c.js +1 -0
  270. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-8805a20e15762c3c.js +1 -0
  271. package/dist/web/standalone/.next/static/chunks/app/api/files/route-8805a20e15762c3c.js +1 -0
  272. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-8805a20e15762c3c.js +1 -0
  273. package/dist/web/standalone/.next/static/chunks/app/api/git/route-8805a20e15762c3c.js +1 -0
  274. package/dist/web/standalone/.next/static/chunks/app/api/history/route-8805a20e15762c3c.js +1 -0
  275. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-8805a20e15762c3c.js +1 -0
  276. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-8805a20e15762c3c.js +1 -0
  277. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-8805a20e15762c3c.js +1 -0
  278. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-8805a20e15762c3c.js +1 -0
  279. package/dist/web/standalone/.next/static/chunks/app/api/notifications/route-8805a20e15762c3c.js +1 -0
  280. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-8805a20e15762c3c.js +1 -0
  281. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-8805a20e15762c3c.js +1 -0
  282. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-8805a20e15762c3c.js +1 -0
  283. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-8805a20e15762c3c.js +1 -0
  284. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-8805a20e15762c3c.js +1 -0
  285. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-8805a20e15762c3c.js +1 -0
  286. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-8805a20e15762c3c.js +1 -0
  287. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-8805a20e15762c3c.js +1 -0
  288. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-8805a20e15762c3c.js +1 -0
  289. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-8805a20e15762c3c.js +1 -0
  290. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-8805a20e15762c3c.js +1 -0
  291. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-8805a20e15762c3c.js +1 -0
  292. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-8805a20e15762c3c.js +1 -0
  293. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-8805a20e15762c3c.js +1 -0
  294. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-8805a20e15762c3c.js +1 -0
  295. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-8805a20e15762c3c.js +1 -0
  296. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-8805a20e15762c3c.js +1 -0
  297. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-8805a20e15762c3c.js +1 -0
  298. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-8805a20e15762c3c.js +1 -0
  299. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-8805a20e15762c3c.js +1 -0
  300. package/dist/web/standalone/.next/static/chunks/app/api/update/route-8805a20e15762c3c.js +1 -0
  301. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-8805a20e15762c3c.js +1 -0
  302. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  303. package/dist/web/standalone/.next/static/chunks/app/page-0c485498795110d6.js +1 -0
  304. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  305. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-8805a20e15762c3c.js +1 -0
  306. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-8805a20e15762c3c.js +1 -0
  307. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  308. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-8805a20e15762c3c.js +1 -0
  309. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-8805a20e15762c3c.js +1 -0
  310. package/dist/web/standalone/.next/static/ffabZXz8JdN3EzX9EKt-R/_buildManifest.js +1 -0
  311. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  312. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  313. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  314. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  315. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  316. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  317. package/dist/web/standalone/server.js +1 -1
  318. package/dist/welcome-screen.js +1 -1
  319. package/package.json +1 -1
  320. package/packages/pi-agent-core/dist/agent-loop.d.ts +8 -0
  321. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  322. package/packages/pi-agent-core/dist/agent-loop.js +70 -3
  323. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  324. package/packages/pi-agent-core/src/agent-loop.test.ts +317 -5
  325. package/packages/pi-agent-core/src/agent-loop.ts +90 -6
  326. package/packages/pi-ai/dist/types.d.ts +16 -1
  327. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  328. package/packages/pi-ai/dist/types.js.map +1 -1
  329. package/packages/pi-ai/src/types.ts +18 -1
  330. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.d.ts +2 -0
  331. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.d.ts.map +1 -0
  332. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +38 -0
  333. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -0
  334. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  335. package/packages/pi-coding-agent/dist/core/agent-session.js +11 -0
  336. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  337. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +9 -0
  338. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  339. package/packages/pi-coding-agent/dist/core/auth-storage.js +50 -1
  340. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  341. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +41 -0
  342. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  343. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +7 -0
  344. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  345. package/packages/pi-coding-agent/dist/core/extensions/loader.js +31 -4
  346. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  347. package/packages/pi-coding-agent/dist/core/extensions/loader.test.js +28 -1
  348. package/packages/pi-coding-agent/dist/core/extensions/loader.test.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/core/extensions/provider-registration.test.d.ts +2 -0
  350. package/packages/pi-coding-agent/dist/core/extensions/provider-registration.test.d.ts.map +1 -0
  351. package/packages/pi-coding-agent/dist/core/extensions/provider-registration.test.js +46 -0
  352. package/packages/pi-coding-agent/dist/core/extensions/provider-registration.test.js.map +1 -0
  353. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +2 -0
  354. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  355. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  356. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +1 -0
  357. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  358. package/packages/pi-coding-agent/dist/core/model-registry.js +12 -0
  359. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  360. package/packages/pi-coding-agent/dist/core/model-resolver.js +3 -3
  361. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  362. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.d.ts +2 -0
  363. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.d.ts.map +1 -0
  364. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js +24 -0
  365. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js.map +1 -0
  366. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +23 -1
  367. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  368. package/packages/pi-coding-agent/dist/core/resource-loader.js +84 -57
  369. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  370. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  371. package/packages/pi-coding-agent/dist/core/sdk.js +9 -0
  372. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  373. package/packages/pi-coding-agent/package.json +1 -1
  374. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +64 -0
  375. package/packages/pi-coding-agent/src/core/agent-session.ts +10 -0
  376. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +53 -0
  377. package/packages/pi-coding-agent/src/core/auth-storage.ts +66 -1
  378. package/packages/pi-coding-agent/src/core/extensions/loader.test.ts +39 -1
  379. package/packages/pi-coding-agent/src/core/extensions/loader.ts +34 -4
  380. package/packages/pi-coding-agent/src/core/extensions/provider-registration.test.ts +81 -0
  381. package/packages/pi-coding-agent/src/core/extensions/types.ts +2 -0
  382. package/packages/pi-coding-agent/src/core/model-registry.ts +14 -0
  383. package/packages/pi-coding-agent/src/core/model-resolver.ts +3 -3
  384. package/packages/pi-coding-agent/src/core/resource-loader-cache-reset.test.ts +42 -0
  385. package/packages/pi-coding-agent/src/core/resource-loader.ts +94 -57
  386. package/packages/pi-coding-agent/src/core/sdk.ts +10 -0
  387. package/pkg/package.json +1 -1
  388. package/src/resources/extensions/cmux/index.ts +18 -12
  389. package/src/resources/extensions/gsd/auto/detect-stuck.ts +27 -0
  390. package/src/resources/extensions/gsd/auto/finalize-timeout.ts +46 -0
  391. package/src/resources/extensions/gsd/auto/loop.ts +5 -0
  392. package/src/resources/extensions/gsd/auto/phases.ts +194 -33
  393. package/src/resources/extensions/gsd/auto/session.ts +14 -0
  394. package/src/resources/extensions/gsd/auto-dashboard.ts +16 -7
  395. package/src/resources/extensions/gsd/auto-model-selection.ts +36 -0
  396. package/src/resources/extensions/gsd/auto-post-unit.ts +263 -12
  397. package/src/resources/extensions/gsd/auto-prompts.ts +21 -0
  398. package/src/resources/extensions/gsd/auto-recovery.ts +9 -8
  399. package/src/resources/extensions/gsd/auto-start.ts +11 -20
  400. package/src/resources/extensions/gsd/auto-timers.ts +2 -1
  401. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  402. package/src/resources/extensions/gsd/auto-verification.ts +190 -2
  403. package/src/resources/extensions/gsd/auto-worktree.ts +14 -6
  404. package/src/resources/extensions/gsd/auto.ts +26 -1
  405. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +160 -88
  406. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +15 -0
  407. package/src/resources/extensions/gsd/bootstrap/notify-interceptor.ts +34 -0
  408. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +98 -0
  409. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +4 -0
  410. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +44 -1
  411. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +19 -0
  412. package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +57 -0
  413. package/src/resources/extensions/gsd/bootstrap/system-context.ts +59 -2
  414. package/src/resources/extensions/gsd/commands/catalog.ts +7 -1
  415. package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -0
  416. package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +139 -0
  417. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
  418. package/src/resources/extensions/gsd/commands-handlers.ts +10 -4
  419. package/src/resources/extensions/gsd/constants.ts +44 -0
  420. package/src/resources/extensions/gsd/db-writer.ts +78 -4
  421. package/src/resources/extensions/gsd/forensics.ts +21 -5
  422. package/src/resources/extensions/gsd/gsd-db.ts +64 -17
  423. package/src/resources/extensions/gsd/guided-flow.ts +22 -0
  424. package/src/resources/extensions/gsd/metrics.ts +28 -1
  425. package/src/resources/extensions/gsd/native-git-bridge.ts +5 -3
  426. package/src/resources/extensions/gsd/notification-overlay.ts +267 -0
  427. package/src/resources/extensions/gsd/notification-store.ts +288 -0
  428. package/src/resources/extensions/gsd/notification-widget.ts +68 -0
  429. package/src/resources/extensions/gsd/post-execution-checks.ts +539 -0
  430. package/src/resources/extensions/gsd/pre-execution-checks.ts +573 -0
  431. package/src/resources/extensions/gsd/preferences-types.ts +44 -0
  432. package/src/resources/extensions/gsd/preferences-validation.ts +33 -0
  433. package/src/resources/extensions/gsd/preferences.ts +13 -2
  434. package/src/resources/extensions/gsd/prompt-loader.ts +8 -0
  435. package/src/resources/extensions/gsd/prompts/complete-milestone.md +2 -0
  436. package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -0
  437. package/src/resources/extensions/gsd/prompts/doctor-heal.md +1 -0
  438. package/src/resources/extensions/gsd/prompts/forensics.md +2 -0
  439. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +2 -0
  440. package/src/resources/extensions/gsd/prompts/system.md +4 -7
  441. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -0
  442. package/src/resources/extensions/gsd/roadmap-mutations.ts +1 -1
  443. package/src/resources/extensions/gsd/roadmap-slices.ts +10 -5
  444. package/src/resources/extensions/gsd/safety/content-validator.ts +98 -0
  445. package/src/resources/extensions/gsd/safety/destructive-guard.ts +49 -0
  446. package/src/resources/extensions/gsd/safety/evidence-collector.ts +151 -0
  447. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +120 -0
  448. package/src/resources/extensions/gsd/safety/file-change-validator.ts +108 -0
  449. package/src/resources/extensions/gsd/safety/git-checkpoint.ts +106 -0
  450. package/src/resources/extensions/gsd/safety/safety-harness.ts +105 -0
  451. package/src/resources/extensions/gsd/slice-parallel-conflict.ts +86 -0
  452. package/src/resources/extensions/gsd/slice-parallel-eligibility.ts +73 -0
  453. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +477 -0
  454. package/src/resources/extensions/gsd/state.ts +67 -12
  455. package/src/resources/extensions/gsd/status-guards.ts +13 -0
  456. package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +288 -0
  457. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +34 -13
  458. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +50 -0
  459. package/src/resources/extensions/gsd/tests/cmux.test.ts +58 -0
  460. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +51 -0
  461. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
  462. package/src/resources/extensions/gsd/tests/complete-slice-string-coercion.test.ts +211 -0
  463. package/src/resources/extensions/gsd/tests/complete-task.test.ts +39 -0
  464. package/src/resources/extensions/gsd/tests/dashboard-model-label-ordering.test.ts +107 -0
  465. package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +109 -0
  466. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +13 -9
  467. package/src/resources/extensions/gsd/tests/db-writer.test.ts +134 -0
  468. package/src/resources/extensions/gsd/tests/deferred-slice-dispatch.test.ts +203 -0
  469. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +76 -0
  470. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +130 -0
  471. package/src/resources/extensions/gsd/tests/doctor-fix-flag.test.ts +92 -0
  472. package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +526 -0
  473. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +116 -0
  474. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +50 -0
  475. package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +103 -0
  476. package/src/resources/extensions/gsd/tests/git-checkpoint.test.ts +94 -0
  477. package/src/resources/extensions/gsd/tests/insert-slice-no-wipe.test.ts +88 -0
  478. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +27 -7
  479. package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +34 -0
  480. package/src/resources/extensions/gsd/tests/metrics.test.ts +116 -1
  481. package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +201 -0
  482. package/src/resources/extensions/gsd/tests/notification-store.test.ts +249 -0
  483. package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +2 -1
  484. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +82 -18
  485. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +312 -0
  486. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +813 -0
  487. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +999 -0
  488. package/src/resources/extensions/gsd/tests/pre-execution-fail-closed.test.ts +266 -0
  489. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +457 -0
  490. package/src/resources/extensions/gsd/tests/preferences.test.ts +10 -0
  491. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +25 -0
  492. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +69 -0
  493. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +30 -0
  494. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +50 -0
  495. package/src/resources/extensions/gsd/tests/slice-parallel-conflict.test.ts +92 -0
  496. package/src/resources/extensions/gsd/tests/slice-parallel-eligibility.test.ts +95 -0
  497. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +83 -0
  498. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +42 -0
  499. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +103 -0
  500. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +349 -0
  501. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +163 -0
  502. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +35 -2
  503. package/src/resources/extensions/gsd/tests/worktree-health-monorepo.test.ts +73 -0
  504. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +34 -0
  505. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +1 -1
  506. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +148 -0
  507. package/src/resources/extensions/gsd/tools/complete-milestone.ts +34 -20
  508. package/src/resources/extensions/gsd/tools/complete-slice.ts +41 -26
  509. package/src/resources/extensions/gsd/tools/complete-task.ts +12 -12
  510. package/src/resources/extensions/gsd/tools/plan-milestone.ts +55 -30
  511. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -8
  512. package/src/resources/extensions/gsd/types.ts +44 -22
  513. package/src/resources/extensions/gsd/verification-evidence.ts +68 -0
  514. package/src/resources/extensions/gsd/workflow-logger.ts +15 -1
  515. package/src/resources/extensions/gsd/workflow-projections.ts +23 -5
  516. package/src/resources/extensions/gsd/worktree-manager.ts +76 -28
  517. package/src/resources/extensions/gsd/worktree-resolver.ts +4 -3
  518. package/src/resources/extensions/mcp-client/auth.ts +149 -0
  519. package/src/resources/extensions/mcp-client/index.ts +16 -1
  520. package/src/resources/extensions/ollama/index.ts +26 -25
  521. package/src/resources/extensions/ollama/model-capabilities.ts +41 -34
  522. package/src/resources/extensions/ollama/ndjson-stream.ts +63 -0
  523. package/src/resources/extensions/ollama/ollama-auth-mode.test.ts +20 -0
  524. package/src/resources/extensions/ollama/ollama-chat-provider.ts +459 -0
  525. package/src/resources/extensions/ollama/ollama-client.ts +30 -30
  526. package/src/resources/extensions/ollama/ollama-discovery.ts +5 -8
  527. package/src/resources/extensions/ollama/ollama-tool.ts +69 -0
  528. package/src/resources/extensions/ollama/tests/ollama-chat-provider-stream.test.ts +82 -0
  529. package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +0 -27
  530. package/src/resources/extensions/ollama/thinking-parser.ts +116 -0
  531. package/src/resources/extensions/ollama/types.ts +23 -0
  532. package/dist/web/standalone/.next/server/chunks/2229.js +0 -12
  533. package/dist/web/standalone/.next/static/5FLUBNdqolRyyehCyChPd/_buildManifest.js +0 -1
  534. package/dist/web/standalone/.next/static/chunks/app/_global-error/page-c4cc189e7b117ea2.js +0 -1
  535. package/dist/web/standalone/.next/static/chunks/app/api/boot/route-c4cc189e7b117ea2.js +0 -1
  536. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-c4cc189e7b117ea2.js +0 -1
  537. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-c4cc189e7b117ea2.js +0 -1
  538. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-c4cc189e7b117ea2.js +0 -1
  539. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-c4cc189e7b117ea2.js +0 -1
  540. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-c4cc189e7b117ea2.js +0 -1
  541. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-c4cc189e7b117ea2.js +0 -1
  542. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-c4cc189e7b117ea2.js +0 -1
  543. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-c4cc189e7b117ea2.js +0 -1
  544. package/dist/web/standalone/.next/static/chunks/app/api/experimental/route-c4cc189e7b117ea2.js +0 -1
  545. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-c4cc189e7b117ea2.js +0 -1
  546. package/dist/web/standalone/.next/static/chunks/app/api/files/route-c4cc189e7b117ea2.js +0 -1
  547. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-c4cc189e7b117ea2.js +0 -1
  548. package/dist/web/standalone/.next/static/chunks/app/api/git/route-c4cc189e7b117ea2.js +0 -1
  549. package/dist/web/standalone/.next/static/chunks/app/api/history/route-c4cc189e7b117ea2.js +0 -1
  550. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-c4cc189e7b117ea2.js +0 -1
  551. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-c4cc189e7b117ea2.js +0 -1
  552. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-c4cc189e7b117ea2.js +0 -1
  553. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-c4cc189e7b117ea2.js +0 -1
  554. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-c4cc189e7b117ea2.js +0 -1
  555. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-c4cc189e7b117ea2.js +0 -1
  556. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-c4cc189e7b117ea2.js +0 -1
  557. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-c4cc189e7b117ea2.js +0 -1
  558. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-c4cc189e7b117ea2.js +0 -1
  559. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-c4cc189e7b117ea2.js +0 -1
  560. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-c4cc189e7b117ea2.js +0 -1
  561. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-c4cc189e7b117ea2.js +0 -1
  562. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-c4cc189e7b117ea2.js +0 -1
  563. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-c4cc189e7b117ea2.js +0 -1
  564. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-c4cc189e7b117ea2.js +0 -1
  565. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-c4cc189e7b117ea2.js +0 -1
  566. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-c4cc189e7b117ea2.js +0 -1
  567. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-c4cc189e7b117ea2.js +0 -1
  568. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-c4cc189e7b117ea2.js +0 -1
  569. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-c4cc189e7b117ea2.js +0 -1
  570. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-c4cc189e7b117ea2.js +0 -1
  571. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-c4cc189e7b117ea2.js +0 -1
  572. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-c4cc189e7b117ea2.js +0 -1
  573. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-c4cc189e7b117ea2.js +0 -1
  574. package/dist/web/standalone/.next/static/chunks/app/api/update/route-c4cc189e7b117ea2.js +0 -1
  575. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-c4cc189e7b117ea2.js +0 -1
  576. package/dist/web/standalone/.next/static/chunks/app/page-62be3b5fa91e4c8f.js +0 -1
  577. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  578. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-c4cc189e7b117ea2.js +0 -1
  579. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-c4cc189e7b117ea2.js +0 -1
  580. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  581. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-c4cc189e7b117ea2.js +0 -1
  582. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-c4cc189e7b117ea2.js +0 -1
  583. /package/dist/web/standalone/.next/static/{5FLUBNdqolRyyehCyChPd → ffabZXz8JdN3EzX9EKt-R}/_ssgManifest.js +0 -0
@@ -22,7 +22,7 @@ console.log("\n=== #2337: Worktree teardown preserves submodule state ===");
22
22
  const removeWorktreeIdx = src.indexOf("export function removeWorktree");
23
23
  assertTrue(removeWorktreeIdx > 0, "worktree-manager.ts exports removeWorktree");
24
24
 
25
- const fnBody = src.slice(removeWorktreeIdx, removeWorktreeIdx + 3000);
25
+ const fnBody = src.slice(removeWorktreeIdx, removeWorktreeIdx + 6000);
26
26
 
27
27
  // ── Test 2: The function checks for submodules before force removal ─────
28
28
 
@@ -0,0 +1,148 @@
1
+ /**
2
+ * worktree-teardown-safety.test.ts — Regression test for #2365.
3
+ *
4
+ * Ensures that removeWorktree() and teardownAutoWorktree() never delete
5
+ * directories outside .gsd/worktrees/. The bug: removeWorktree overrides
6
+ * the computed worktree path with whatever `git worktree list` reports.
7
+ * When .gsd/ was (or is) a symlink, git resolves the symlink at creation
8
+ * time, so its registered path can point to an external directory. If that
9
+ * external path happens to be a project data directory, teardown destroys it.
10
+ *
11
+ * The fix adds path validation so rmSync / nativeWorktreeRemove only operate
12
+ * on paths that are actually under .gsd/worktrees/.
13
+ */
14
+
15
+ import {
16
+ mkdtempSync,
17
+ mkdirSync,
18
+ writeFileSync,
19
+ rmSync,
20
+ existsSync,
21
+ realpathSync,
22
+ readFileSync,
23
+ } from "node:fs";
24
+ import { join } from "node:path";
25
+ import { tmpdir } from "node:os";
26
+ import { execSync } from "node:child_process";
27
+ import { describe, it, after } from "node:test";
28
+
29
+ import { createWorktree, removeWorktree, worktreePath, isInsideWorktreesDir } from "../worktree-manager.ts";
30
+ import { createTestContext } from "./test-helpers.ts";
31
+
32
+ const { assertEq, assertTrue, report } = createTestContext();
33
+
34
+ // ─── Helpers ──────────────────────────────────────────────────────────────
35
+
36
+ function run(command: string, cwd: string): string {
37
+ return execSync(command, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
38
+ }
39
+
40
+ function createTempRepo(): string {
41
+ const dir = realpathSync(mkdtempSync(join(tmpdir(), "wt-safety-test-")));
42
+ run("git init", dir);
43
+ run("git config user.email test@test.com", dir);
44
+ run("git config user.name Test", dir);
45
+ writeFileSync(join(dir, "README.md"), "# test\n");
46
+ run("git add .", dir);
47
+ run("git commit -m init", dir);
48
+ run("git branch -M main", dir);
49
+ return dir;
50
+ }
51
+
52
+ // ─── Tests ────────────────────────────────────────────────────────────────
53
+
54
+ describe("worktree-teardown-safety", () => {
55
+ const dirs: string[] = [];
56
+
57
+ after(() => {
58
+ for (const d of dirs) rmSync(d, { recursive: true, force: true });
59
+ report();
60
+ });
61
+
62
+ it("removeWorktree does not delete sibling data directories", () => {
63
+ const tempDir = createTempRepo();
64
+ dirs.push(tempDir);
65
+
66
+ // Create a project data directory that lives alongside .gsd/
67
+ const dataDir = join(tempDir, "project-data");
68
+ mkdirSync(dataDir, { recursive: true });
69
+ writeFileSync(join(dataDir, "important.db"), "precious data");
70
+
71
+ // Create a worktree normally
72
+ const wt = createWorktree(tempDir, "test-wt");
73
+ assertTrue(existsSync(wt.path), "worktree created successfully");
74
+
75
+ // Remove the worktree
76
+ removeWorktree(tempDir, "test-wt");
77
+
78
+ // The worktree directory should be gone
79
+ assertTrue(!existsSync(wt.path), "worktree directory removed");
80
+
81
+ // The project data directory MUST still exist
82
+ assertTrue(existsSync(dataDir), "project data directory survives teardown");
83
+ assertTrue(
84
+ existsSync(join(dataDir, "important.db")),
85
+ "project data files survive teardown",
86
+ );
87
+ });
88
+
89
+ it("path validation rejects paths outside .gsd/worktrees/", () => {
90
+ const tempDir = createTempRepo();
91
+ dirs.push(tempDir);
92
+
93
+ const externalDir = join(tempDir, "external-state");
94
+ mkdirSync(externalDir, { recursive: true });
95
+ writeFileSync(join(externalDir, "state.json"), '{"critical": true}');
96
+
97
+ // Create and then remove a worktree that has a legitimate path
98
+ const wt2 = createWorktree(tempDir, "safe-wt");
99
+ assertTrue(existsSync(wt2.path), "second worktree created");
100
+
101
+ removeWorktree(tempDir, "safe-wt");
102
+ assertTrue(!existsSync(wt2.path), "second worktree removed cleanly");
103
+
104
+ // External directory must be untouched
105
+ assertTrue(existsSync(externalDir), "external directory survives second teardown");
106
+ assertEq(
107
+ readFileSync(join(externalDir, "state.json"), "utf-8"),
108
+ '{"critical": true}',
109
+ "external directory contents intact after teardown",
110
+ );
111
+ });
112
+
113
+ it("worktreePath always returns paths under .gsd/worktrees/", () => {
114
+ const tempDir = createTempRepo();
115
+ dirs.push(tempDir);
116
+
117
+ const wtPathResult = worktreePath(tempDir, "anything");
118
+ assertTrue(
119
+ wtPathResult.startsWith(join(tempDir, ".gsd", "worktrees")),
120
+ "worktreePath returns path under .gsd/worktrees/",
121
+ );
122
+ });
123
+
124
+ it("isInsideWorktreesDir rejects path traversal attempts", () => {
125
+ const tempDir = createTempRepo();
126
+ dirs.push(tempDir);
127
+
128
+ assertTrue(
129
+ isInsideWorktreesDir(tempDir, join(tempDir, ".gsd", "worktrees", "my-wt")),
130
+ "path inside .gsd/worktrees/ is accepted",
131
+ );
132
+
133
+ assertTrue(
134
+ !isInsideWorktreesDir(tempDir, join(tempDir, "project-data")),
135
+ "path outside .gsd/worktrees/ is rejected",
136
+ );
137
+
138
+ assertTrue(
139
+ !isInsideWorktreesDir(tempDir, join(tempDir, ".gsd", "worktrees", "..", "..", "project-data")),
140
+ "path traversal via .. is rejected",
141
+ );
142
+
143
+ assertTrue(
144
+ !isInsideWorktreesDir(tempDir, "/tmp/some-other-dir"),
145
+ "completely external path is rejected",
146
+ );
147
+ });
148
+ });
@@ -20,7 +20,7 @@ import { resolveMilestonePath, clearPathCache } from "../paths.js";
20
20
  import { isClosedStatus } from "../status-guards.js";
21
21
  import { saveFile, clearParseCache } from "../files.js";
22
22
  import { invalidateStateCache } from "../state.js";
23
- import { renderAllProjections } from "../workflow-projections.js";
23
+ import { renderAllProjections, stripIdPrefix } from "../workflow-projections.js";
24
24
  import { writeManifest } from "../workflow-manifest.js";
25
25
  import { appendEvent } from "../workflow-events.js";
26
26
  import { logWarning } from "../workflow-logger.js";
@@ -30,15 +30,23 @@ export interface CompleteMilestoneParams {
30
30
  title: string;
31
31
  oneLiner: string;
32
32
  narrative: string;
33
- successCriteriaResults: string;
34
- definitionOfDoneResults: string;
35
- requirementOutcomes: string;
36
- keyDecisions: string[];
37
- keyFiles: string[];
38
- lessonsLearned: string[];
39
- followUps: string;
40
- deviations: string;
41
33
  verificationPassed: boolean;
34
+ /** @optional — defaults to "Not provided." when omitted by models with limited tool-calling */
35
+ successCriteriaResults?: string;
36
+ /** @optional — defaults to "Not provided." when omitted */
37
+ definitionOfDoneResults?: string;
38
+ /** @optional — defaults to "Not provided." when omitted */
39
+ requirementOutcomes?: string;
40
+ /** @optional — defaults to [] when omitted */
41
+ keyDecisions?: string[];
42
+ /** @optional — defaults to [] when omitted */
43
+ keyFiles?: string[];
44
+ /** @optional — defaults to [] when omitted */
45
+ lessonsLearned?: string[];
46
+ /** @optional — defaults to "None." when omitted */
47
+ followUps?: string;
48
+ /** @optional — defaults to "None." when omitted */
49
+ deviations?: string;
42
50
  /** Optional caller-provided identity for audit trail */
43
51
  actorName?: string;
44
52
  /** Optional caller-provided reason this action was triggered */
@@ -52,22 +60,28 @@ export interface CompleteMilestoneResult {
52
60
 
53
61
  function renderMilestoneSummaryMarkdown(params: CompleteMilestoneParams): string {
54
62
  const now = new Date().toISOString();
63
+ const displayTitle = stripIdPrefix(params.title, params.milestoneId);
55
64
 
56
- const keyDecisionsYaml = params.keyDecisions.length > 0
57
- ? params.keyDecisions.map(d => ` - ${d}`).join("\n")
65
+ // Apply defaults for optional enrichment fields (#2771)
66
+ const keyDecisions = params.keyDecisions ?? [];
67
+ const keyFiles = params.keyFiles ?? [];
68
+ const lessonsLearned = params.lessonsLearned ?? [];
69
+
70
+ const keyDecisionsYaml = keyDecisions.length > 0
71
+ ? keyDecisions.map(d => ` - ${d}`).join("\n")
58
72
  : " - (none)";
59
73
 
60
- const keyFilesYaml = params.keyFiles.length > 0
61
- ? params.keyFiles.map(f => ` - ${f}`).join("\n")
74
+ const keyFilesYaml = keyFiles.length > 0
75
+ ? keyFiles.map(f => ` - ${f}`).join("\n")
62
76
  : " - (none)";
63
77
 
64
- const lessonsYaml = params.lessonsLearned.length > 0
65
- ? params.lessonsLearned.map(l => ` - ${l}`).join("\n")
78
+ const lessonsYaml = lessonsLearned.length > 0
79
+ ? lessonsLearned.map(l => ` - ${l}`).join("\n")
66
80
  : " - (none)";
67
81
 
68
82
  return `---
69
83
  id: ${params.milestoneId}
70
- title: "${params.title}"
84
+ title: "${displayTitle}"
71
85
  status: complete
72
86
  completed_at: ${now}
73
87
  key_decisions:
@@ -78,7 +92,7 @@ lessons_learned:
78
92
  ${lessonsYaml}
79
93
  ---
80
94
 
81
- # ${params.milestoneId}: ${params.title}
95
+ # ${params.milestoneId}: ${displayTitle}
82
96
 
83
97
  **${params.oneLiner}**
84
98
 
@@ -88,15 +102,15 @@ ${params.narrative}
88
102
 
89
103
  ## Success Criteria Results
90
104
 
91
- ${params.successCriteriaResults}
105
+ ${params.successCriteriaResults ?? "Not provided."}
92
106
 
93
107
  ## Definition of Done Results
94
108
 
95
- ${params.definitionOfDoneResults}
109
+ ${params.definitionOfDoneResults ?? "Not provided."}
96
110
 
97
111
  ## Requirement Outcomes
98
112
 
99
- ${params.requirementOutcomes}
113
+ ${params.requirementOutcomes ?? "Not provided."}
100
114
 
101
115
  ## Deviations
102
116
 
@@ -46,58 +46,73 @@ export interface CompleteSliceResult {
46
46
  function renderSliceSummaryMarkdown(params: CompleteSliceParams): string {
47
47
  const now = new Date().toISOString();
48
48
 
49
- const providesYaml = params.provides.length > 0
50
- ? params.provides.map(p => ` - ${p}`).join("\n")
49
+ // Apply defaults for optional enrichment arrays (#2771)
50
+ const provides = params.provides ?? [];
51
+ const requires = params.requires ?? [];
52
+ const affects = params.affects ?? [];
53
+ const keyFiles = params.keyFiles ?? [];
54
+ const keyDecisions = params.keyDecisions ?? [];
55
+ const patternsEstablished = params.patternsEstablished ?? [];
56
+ const observabilitySurfaces = params.observabilitySurfaces ?? [];
57
+ const drillDownPaths = params.drillDownPaths ?? [];
58
+ const requirementsAdvanced = params.requirementsAdvanced ?? [];
59
+ const requirementsValidated = params.requirementsValidated ?? [];
60
+ const requirementsSurfaced = params.requirementsSurfaced ?? [];
61
+ const requirementsInvalidated = params.requirementsInvalidated ?? [];
62
+ const filesModified = params.filesModified ?? [];
63
+
64
+ const providesYaml = provides.length > 0
65
+ ? provides.map(p => ` - ${p}`).join("\n")
51
66
  : " - (none)";
52
67
 
53
- const requiresYaml = params.requires.length > 0
54
- ? params.requires.map(r => ` - slice: ${r.slice}\n provides: ${r.provides}`).join("\n")
68
+ const requiresYaml = requires.length > 0
69
+ ? requires.map(r => ` - slice: ${r.slice}\n provides: ${r.provides}`).join("\n")
55
70
  : " []";
56
71
 
57
- const affectsYaml = params.affects.length > 0
58
- ? params.affects.map(a => ` - ${a}`).join("\n")
72
+ const affectsYaml = affects.length > 0
73
+ ? affects.map(a => ` - ${a}`).join("\n")
59
74
  : " []";
60
75
 
61
- const keyFilesYaml = params.keyFiles.length > 0
62
- ? params.keyFiles.map(f => ` - ${f}`).join("\n")
76
+ const keyFilesYaml = keyFiles.length > 0
77
+ ? keyFiles.map(f => ` - ${f}`).join("\n")
63
78
  : " - (none)";
64
79
 
65
- const keyDecisionsYaml = params.keyDecisions.length > 0
66
- ? params.keyDecisions.map(d => ` - ${d}`).join("\n")
80
+ const keyDecisionsYaml = keyDecisions.length > 0
81
+ ? keyDecisions.map(d => ` - ${d}`).join("\n")
67
82
  : " - (none)";
68
83
 
69
- const patternsYaml = params.patternsEstablished.length > 0
70
- ? params.patternsEstablished.map(p => ` - ${p}`).join("\n")
84
+ const patternsYaml = patternsEstablished.length > 0
85
+ ? patternsEstablished.map(p => ` - ${p}`).join("\n")
71
86
  : " - (none)";
72
87
 
73
- const observabilityYaml = params.observabilitySurfaces.length > 0
74
- ? params.observabilitySurfaces.map(o => ` - ${o}`).join("\n")
88
+ const observabilityYaml = observabilitySurfaces.length > 0
89
+ ? observabilitySurfaces.map(o => ` - ${o}`).join("\n")
75
90
  : " - none";
76
91
 
77
- const drillDownYaml = params.drillDownPaths.length > 0
78
- ? params.drillDownPaths.map(d => ` - ${d}`).join("\n")
92
+ const drillDownYaml = drillDownPaths.length > 0
93
+ ? drillDownPaths.map(d => ` - ${d}`).join("\n")
79
94
  : " []";
80
95
 
81
96
  // Requirements sections
82
- const reqAdvanced = params.requirementsAdvanced.length > 0
83
- ? params.requirementsAdvanced.map(r => `- ${r.id} — ${r.how}`).join("\n")
97
+ const reqAdvanced = requirementsAdvanced.length > 0
98
+ ? requirementsAdvanced.map(r => `- ${r.id} — ${r.how}`).join("\n")
84
99
  : "None.";
85
100
 
86
- const reqValidated = params.requirementsValidated.length > 0
87
- ? params.requirementsValidated.map(r => `- ${r.id} — ${r.proof}`).join("\n")
101
+ const reqValidated = requirementsValidated.length > 0
102
+ ? requirementsValidated.map(r => `- ${r.id} — ${r.proof}`).join("\n")
88
103
  : "None.";
89
104
 
90
- const reqSurfaced = params.requirementsSurfaced.length > 0
91
- ? params.requirementsSurfaced.map(r => `- ${r}`).join("\n")
105
+ const reqSurfaced = requirementsSurfaced.length > 0
106
+ ? requirementsSurfaced.map(r => `- ${r}`).join("\n")
92
107
  : "None.";
93
108
 
94
- const reqInvalidated = params.requirementsInvalidated.length > 0
95
- ? params.requirementsInvalidated.map(r => `- ${r.id} — ${r.what}`).join("\n")
109
+ const reqInvalidated = requirementsInvalidated.length > 0
110
+ ? requirementsInvalidated.map(r => `- ${r.id} — ${r.what}`).join("\n")
96
111
  : "None.";
97
112
 
98
113
  // Files modified
99
- const filesMod = params.filesModified.length > 0
100
- ? params.filesModified.map(f => `- \`${f.path}\` — ${f.description}`).join("\n")
114
+ const filesMod = filesModified.length > 0
115
+ ? filesModified.map(f => `- \`${f.path}\` — ${f.description}`).join("\n")
101
116
  : "None.";
102
117
 
103
118
  return `---
@@ -60,11 +60,11 @@ function paramsToTaskRow(params: CompleteTaskParams, completedAt: string): TaskR
60
60
  verification_result: params.verification,
61
61
  duration: "",
62
62
  completed_at: completedAt,
63
- blocker_discovered: params.blockerDiscovered,
64
- deviations: params.deviations,
65
- known_issues: params.knownIssues,
66
- key_files: params.keyFiles,
67
- key_decisions: params.keyDecisions,
63
+ blocker_discovered: params.blockerDiscovered ?? false,
64
+ deviations: params.deviations ?? "",
65
+ known_issues: params.knownIssues ?? "",
66
+ key_files: params.keyFiles ?? [],
67
+ key_decisions: params.keyDecisions ?? [],
68
68
  full_summary_md: "",
69
69
  description: "",
70
70
  estimate: "",
@@ -152,14 +152,14 @@ export async function handleCompleteTask(
152
152
  narrative: params.narrative,
153
153
  verificationResult: params.verification,
154
154
  duration: "",
155
- blockerDiscovered: params.blockerDiscovered,
156
- deviations: params.deviations,
157
- knownIssues: params.knownIssues,
158
- keyFiles: params.keyFiles,
159
- keyDecisions: params.keyDecisions,
155
+ blockerDiscovered: params.blockerDiscovered ?? false,
156
+ deviations: params.deviations ?? "None.",
157
+ knownIssues: params.knownIssues ?? "None.",
158
+ keyFiles: params.keyFiles ?? [],
159
+ keyDecisions: params.keyDecisions ?? [],
160
160
  });
161
161
 
162
- for (const evidence of params.verificationEvidence) {
162
+ for (const evidence of (params.verificationEvidence ?? [])) {
163
163
  insertVerificationEvidence({
164
164
  taskId: params.taskId,
165
165
  sliceId: params.sliceId,
@@ -182,7 +182,7 @@ export async function handleCompleteTask(
182
182
 
183
183
  // Render summary markdown via the single source of truth (#2720)
184
184
  const taskRow = paramsToTaskRow(params, completedAt);
185
- const summaryMd = renderSummaryContent(taskRow, params.sliceId, params.milestoneId, params.verificationEvidence);
185
+ const summaryMd = renderSummaryContent(taskRow, params.sliceId, params.milestoneId, params.verificationEvidence ?? []);
186
186
 
187
187
  // Resolve and write summary to disk
188
188
  let summaryPath: string;
@@ -5,6 +5,7 @@ import {
5
5
  transaction,
6
6
  getMilestone,
7
7
  getMilestoneSlices,
8
+ getSlice,
8
9
  insertMilestone,
9
10
  insertSlice,
10
11
  upsertMilestonePlanning,
@@ -33,24 +34,34 @@ export interface PlanMilestoneSliceInput {
33
34
  export interface PlanMilestoneParams {
34
35
  milestoneId: string;
35
36
  title: string;
37
+ vision: string;
38
+ slices: PlanMilestoneSliceInput[];
36
39
  status?: string;
37
40
  dependsOn?: string[];
38
41
  /** Optional caller-provided identity for audit trail */
39
42
  actorName?: string;
40
43
  /** Optional caller-provided reason this action was triggered */
41
44
  triggerReason?: string;
42
- vision: string;
43
- successCriteria: string[];
44
- keyRisks: Array<{ risk: string; whyItMatters: string }>;
45
- proofStrategy: Array<{ riskOrUnknown: string; retireIn: string; whatWillBeProven: string }>;
46
- verificationContract: string;
47
- verificationIntegration: string;
48
- verificationOperational: string;
49
- verificationUat: string;
50
- definitionOfDone: string[];
51
- requirementCoverage: string;
52
- boundaryMapMarkdown: string;
53
- slices: PlanMilestoneSliceInput[];
45
+ /** @optional — defaults to [] when omitted by models with limited tool-calling */
46
+ successCriteria?: string[];
47
+ /** @optional defaults to [] when omitted */
48
+ keyRisks?: Array<{ risk: string; whyItMatters: string }>;
49
+ /** @optional — defaults to [] when omitted */
50
+ proofStrategy?: Array<{ riskOrUnknown: string; retireIn: string; whatWillBeProven: string }>;
51
+ /** @optional — defaults to "Not provided." when omitted */
52
+ verificationContract?: string;
53
+ /** @optional — defaults to "Not provided." when omitted */
54
+ verificationIntegration?: string;
55
+ /** @optional — defaults to "Not provided." when omitted */
56
+ verificationOperational?: string;
57
+ /** @optional — defaults to "Not provided." when omitted */
58
+ verificationUat?: string;
59
+ /** @optional — defaults to [] when omitted */
60
+ definitionOfDone?: string[];
61
+ /** @optional — defaults to "Not provided." when omitted */
62
+ requirementCoverage?: string;
63
+ /** @optional — defaults to "Not provided." when omitted */
64
+ boundaryMapMarkdown?: string;
54
65
  }
55
66
 
56
67
  export interface PlanMilestoneResult {
@@ -149,20 +160,21 @@ function validateParams(params: PlanMilestoneParams): PlanMilestoneParams {
149
160
  if (!isNonEmptyString(params?.milestoneId)) throw new Error("milestoneId is required");
150
161
  if (!isNonEmptyString(params?.title)) throw new Error("title is required");
151
162
  if (!isNonEmptyString(params?.vision)) throw new Error("vision is required");
152
- if (!isNonEmptyString(params?.verificationContract)) throw new Error("verificationContract is required");
153
- if (!isNonEmptyString(params?.verificationIntegration)) throw new Error("verificationIntegration is required");
154
- if (!isNonEmptyString(params?.verificationOperational)) throw new Error("verificationOperational is required");
155
- if (!isNonEmptyString(params?.verificationUat)) throw new Error("verificationUat is required");
156
- if (!isNonEmptyString(params?.requirementCoverage)) throw new Error("requirementCoverage is required");
157
- if (!isNonEmptyString(params?.boundaryMapMarkdown)) throw new Error("boundaryMapMarkdown is required");
158
163
 
159
164
  return {
160
165
  ...params,
161
166
  dependsOn: params.dependsOn ? validateStringArray(params.dependsOn, "dependsOn") : [],
162
- successCriteria: validateStringArray(params.successCriteria, "successCriteria"),
163
- keyRisks: validateRiskEntries(params.keyRisks),
164
- proofStrategy: validateProofStrategy(params.proofStrategy),
165
- definitionOfDone: validateStringArray(params.definitionOfDone, "definitionOfDone"),
167
+ // Apply defaults for optional enrichment fields (#2771)
168
+ successCriteria: params.successCriteria ? validateStringArray(params.successCriteria, "successCriteria") : [],
169
+ keyRisks: params.keyRisks ? validateRiskEntries(params.keyRisks) : [],
170
+ proofStrategy: params.proofStrategy ? validateProofStrategy(params.proofStrategy) : [],
171
+ verificationContract: params.verificationContract ?? "Not provided.",
172
+ verificationIntegration: params.verificationIntegration ?? "Not provided.",
173
+ verificationOperational: params.verificationOperational ?? "Not provided.",
174
+ verificationUat: params.verificationUat ?? "Not provided.",
175
+ definitionOfDone: params.definitionOfDone ? validateStringArray(params.definitionOfDone, "definitionOfDone") : [],
176
+ requirementCoverage: params.requirementCoverage ?? "Not provided.",
177
+ boundaryMapMarkdown: params.boundaryMapMarkdown ?? "Not provided.",
166
178
  slices: validateSlices(params.slices),
167
179
  };
168
180
  }
@@ -191,15 +203,19 @@ export async function handlePlanMilestone(
191
203
  return;
192
204
  }
193
205
 
194
- // Guard: refuse to re-plan a milestone that has completed slices (#2960).
195
- // INSERT OR IGNORE on slices won't overwrite existing rows, but a full
196
- // re-plan after worktree recreation or DB resync can create new slice rows
197
- // that shadow completed work. Block early when any slice is already done.
206
+ // Guard: refuse to re-plan a milestone that would drop completed slices (#2960).
207
+ // Allow re-planning when all completed slices are still present in the
208
+ // incoming plan their status is preserved below (#2558). Block only when
209
+ // the new plan omits a completed slice, which could shadow completed work.
198
210
  const existingSlices = getMilestoneSlices(params.milestoneId);
199
211
  const completedSlices = existingSlices.filter(s => isClosedStatus(s.status));
200
212
  if (completedSlices.length > 0) {
201
- guardError = `cannot re-plan milestone ${params.milestoneId}: ${completedSlices.length} slice(s) already completed (${completedSlices.map(s => s.id).join(", ")}). Use gsd_reassess_roadmap to modify the roadmap.`;
202
- return;
213
+ const incomingSliceIds = new Set(params.slices.map(s => s.sliceId));
214
+ const droppedCompleted = completedSlices.filter(s => !incomingSliceIds.has(s.id));
215
+ if (droppedCompleted.length > 0) {
216
+ guardError = `cannot re-plan milestone ${params.milestoneId}: ${droppedCompleted.length} completed slice(s) would be dropped (${droppedCompleted.map(s => s.id).join(", ")}). Use gsd_reassess_roadmap to modify the roadmap.`;
217
+ return;
218
+ }
203
219
  }
204
220
 
205
221
  // Validate depends_on: all dependencies must exist and be complete
@@ -225,6 +241,8 @@ export async function handlePlanMilestone(
225
241
  });
226
242
 
227
243
  upsertMilestonePlanning(params.milestoneId, {
244
+ title: params.title,
245
+ status: params.status ?? "active",
228
246
  vision: params.vision,
229
247
  successCriteria: params.successCriteria,
230
248
  keyRisks: params.keyRisks,
@@ -236,14 +254,21 @@ export async function handlePlanMilestone(
236
254
  definitionOfDone: params.definitionOfDone,
237
255
  requirementCoverage: params.requirementCoverage,
238
256
  boundaryMapMarkdown: params.boundaryMapMarkdown,
239
- }, params.title);
257
+ });
240
258
 
241
259
  for (const slice of params.slices) {
260
+ // Preserve completed/done status on re-plan (#2558).
261
+ // Without this, a re-plan after milestone transition would reset
262
+ // already-completed slices back to "pending".
263
+ const existing = getSlice(params.milestoneId, slice.sliceId);
264
+ const status = existing && (existing.status === "complete" || existing.status === "done")
265
+ ? existing.status
266
+ : "pending";
242
267
  insertSlice({
243
268
  id: slice.sliceId,
244
269
  milestoneId: params.milestoneId,
245
270
  title: slice.title,
246
- status: "pending",
271
+ status,
247
272
  risk: slice.risk,
248
273
  depends: slice.depends,
249
274
  demo: slice.demo,
@@ -35,11 +35,15 @@ export interface PlanSliceParams {
35
35
  milestoneId: string;
36
36
  sliceId: string;
37
37
  goal: string;
38
- successCriteria: string;
39
- proofLevel: string;
40
- integrationClosure: string;
41
- observabilityImpact: string;
42
38
  tasks: PlanSliceTaskInput[];
39
+ /** @optional — defaults to "Not provided." when omitted by models with limited tool-calling */
40
+ successCriteria?: string;
41
+ /** @optional — defaults to "Not provided." when omitted */
42
+ proofLevel?: string;
43
+ /** @optional — defaults to "Not provided." when omitted */
44
+ integrationClosure?: string;
45
+ /** @optional — defaults to "Not provided." when omitted */
46
+ observabilityImpact?: string;
43
47
  /** Optional caller-provided identity for audit trail */
44
48
  actorName?: string;
45
49
  /** Optional caller-provided reason this action was triggered */
@@ -112,13 +116,14 @@ function validateParams(params: PlanSliceParams): PlanSliceParams {
112
116
  if (!isNonEmptyString(params?.milestoneId)) throw new Error("milestoneId is required");
113
117
  if (!isNonEmptyString(params?.sliceId)) throw new Error("sliceId is required");
114
118
  if (!isNonEmptyString(params?.goal)) throw new Error("goal is required");
115
- if (!isNonEmptyString(params?.successCriteria)) throw new Error("successCriteria is required");
116
- if (!isNonEmptyString(params?.proofLevel)) throw new Error("proofLevel is required");
117
- if (!isNonEmptyString(params?.integrationClosure)) throw new Error("integrationClosure is required");
118
- if (!isNonEmptyString(params?.observabilityImpact)) throw new Error("observabilityImpact is required");
119
119
 
120
120
  return {
121
121
  ...params,
122
+ // Apply defaults for optional enrichment fields (#2771)
123
+ successCriteria: params.successCriteria ?? "Not provided.",
124
+ proofLevel: params.proofLevel ?? "Not provided.",
125
+ integrationClosure: params.integrationClosure ?? "Not provided.",
126
+ observabilityImpact: params.observabilityImpact ?? "Not provided.",
122
127
  tasks: validateTasks(params.tasks),
123
128
  };
124
129
  }