gsd-pi 2.75.0-dev.063e5a3 → 2.75.0-dev.96d4bb599

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 (760) hide show
  1. package/README.md +186 -149
  2. package/dist/claude-cli-check.d.ts +10 -0
  3. package/dist/claude-cli-check.js +13 -3
  4. package/dist/headless-events.d.ts +1 -1
  5. package/dist/headless-events.js +5 -2
  6. package/dist/headless.js +5 -6
  7. package/dist/loader.js +0 -0
  8. package/dist/onboarding.d.ts +20 -1
  9. package/dist/onboarding.js +99 -39
  10. package/dist/resources/extensions/ask-user-questions.js +17 -5
  11. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  12. package/dist/resources/extensions/claude-code-cli/readiness.js +12 -2
  13. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +76 -4
  14. package/dist/resources/extensions/gsd/auto/detect-stuck.js +9 -0
  15. package/dist/resources/extensions/gsd/auto/loop.js +67 -4
  16. package/dist/resources/extensions/gsd/auto/phases.js +70 -47
  17. package/dist/resources/extensions/gsd/auto/resolve.js +1 -1
  18. package/dist/resources/extensions/gsd/auto/run-unit.js +10 -1
  19. package/dist/resources/extensions/gsd/auto/session.js +5 -0
  20. package/dist/resources/extensions/gsd/auto-artifact-paths.js +20 -0
  21. package/dist/resources/extensions/gsd/auto-dashboard.js +15 -7
  22. package/dist/resources/extensions/gsd/auto-dispatch.js +112 -6
  23. package/dist/resources/extensions/gsd/auto-loop.js +1 -1
  24. package/dist/resources/extensions/gsd/auto-model-selection.js +11 -3
  25. package/dist/resources/extensions/gsd/auto-post-unit.js +10 -8
  26. package/dist/resources/extensions/gsd/auto-prompts.js +173 -39
  27. package/dist/resources/extensions/gsd/auto-recovery.js +57 -0
  28. package/dist/resources/extensions/gsd/auto-start.js +5 -3
  29. package/dist/resources/extensions/gsd/auto-verification.js +3 -3
  30. package/dist/resources/extensions/gsd/auto-worktree.js +55 -1
  31. package/dist/resources/extensions/gsd/auto.js +57 -25
  32. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +8 -21
  33. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +45 -23
  34. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +128 -0
  35. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +29 -0
  36. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +2 -0
  37. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +22 -0
  38. package/dist/resources/extensions/gsd/bootstrap/system-context.js +17 -4
  39. package/dist/resources/extensions/gsd/commands/catalog.js +81 -9
  40. package/dist/resources/extensions/gsd/commands/handlers/core.js +64 -24
  41. package/dist/resources/extensions/gsd/commands/handlers/escalate.js +171 -0
  42. package/dist/resources/extensions/gsd/commands/handlers/onboarding.js +159 -0
  43. package/dist/resources/extensions/gsd/commands/handlers/ops.js +21 -0
  44. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +228 -29
  45. package/dist/resources/extensions/gsd/commands-cmux.js +5 -2
  46. package/dist/resources/extensions/gsd/commands-config.js +5 -0
  47. package/dist/resources/extensions/gsd/commands-debug.js +388 -0
  48. package/dist/resources/extensions/gsd/commands-do.js +1 -0
  49. package/dist/resources/extensions/gsd/commands-extract-learnings.js +233 -75
  50. package/dist/resources/extensions/gsd/commands-handlers.js +21 -2
  51. package/dist/resources/extensions/gsd/commands-memory.js +462 -0
  52. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +40 -12
  53. package/dist/resources/extensions/gsd/commands-scan.js +94 -0
  54. package/dist/resources/extensions/gsd/commands-workflow-templates.js +101 -2
  55. package/dist/resources/extensions/gsd/custom-workflow-engine.js +74 -54
  56. package/dist/resources/extensions/gsd/db-writer.js +1 -0
  57. package/dist/resources/extensions/gsd/debug-session-store.js +238 -0
  58. package/dist/resources/extensions/gsd/definition-loader.js +7 -0
  59. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -9
  60. package/dist/resources/extensions/gsd/doctor-environment.js +2 -1
  61. package/dist/resources/extensions/gsd/doctor-git-checks.js +5 -1
  62. package/dist/resources/extensions/gsd/doctor-proactive.js +4 -1
  63. package/dist/resources/extensions/gsd/doctor-providers.js +48 -20
  64. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +22 -4
  65. package/dist/resources/extensions/gsd/doctor.js +7 -1
  66. package/dist/resources/extensions/gsd/error-classifier.js +6 -3
  67. package/dist/resources/extensions/gsd/escalation.js +321 -0
  68. package/dist/resources/extensions/gsd/forensics.js +26 -29
  69. package/dist/resources/extensions/gsd/git-service.js +0 -1
  70. package/dist/resources/extensions/gsd/graph.js +26 -2
  71. package/dist/resources/extensions/gsd/gsd-db.js +490 -32
  72. package/dist/resources/extensions/gsd/health-widget-core.js +42 -14
  73. package/dist/resources/extensions/gsd/health-widget.js +7 -4
  74. package/dist/resources/extensions/gsd/init-wizard.js +86 -45
  75. package/dist/resources/extensions/gsd/markdown-renderer.js +5 -5
  76. package/dist/resources/extensions/gsd/memory-embeddings.js +219 -0
  77. package/dist/resources/extensions/gsd/memory-extractor.js +78 -27
  78. package/dist/resources/extensions/gsd/memory-ingest.js +218 -0
  79. package/dist/resources/extensions/gsd/memory-relations.js +189 -0
  80. package/dist/resources/extensions/gsd/memory-source-store.js +113 -0
  81. package/dist/resources/extensions/gsd/memory-store.js +299 -6
  82. package/dist/resources/extensions/gsd/metrics.js +1 -0
  83. package/dist/resources/extensions/gsd/model-cost-table.js +3 -1
  84. package/dist/resources/extensions/gsd/model-router.js +16 -6
  85. package/dist/resources/extensions/gsd/native-git-bridge.js +137 -5
  86. package/dist/resources/extensions/gsd/notification-overlay.js +7 -22
  87. package/dist/resources/extensions/gsd/notification-widget.js +24 -39
  88. package/dist/resources/extensions/gsd/notifications.js +4 -0
  89. package/dist/resources/extensions/gsd/onboarding-state.js +133 -0
  90. package/dist/resources/extensions/gsd/post-execution-checks.js +27 -11
  91. package/dist/resources/extensions/gsd/pre-execution-checks.js +97 -4
  92. package/dist/resources/extensions/gsd/preferences-models.js +1 -0
  93. package/dist/resources/extensions/gsd/preferences-types.js +2 -1
  94. package/dist/resources/extensions/gsd/preferences-validation.js +42 -8
  95. package/dist/resources/extensions/gsd/preferences.js +10 -10
  96. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
  97. package/dist/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
  98. package/dist/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
  99. package/dist/resources/extensions/gsd/prompts/execute-task.md +12 -0
  100. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
  101. package/dist/resources/extensions/gsd/prompts/refine-slice.md +69 -0
  102. package/dist/resources/extensions/gsd/prompts/scan.md +79 -0
  103. package/dist/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
  104. package/dist/resources/extensions/gsd/python-resolver.js +70 -0
  105. package/dist/resources/extensions/gsd/run-manager.js +37 -17
  106. package/dist/resources/extensions/gsd/setup-catalog.js +75 -0
  107. package/dist/resources/extensions/gsd/state.js +47 -3
  108. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
  109. package/dist/resources/extensions/gsd/tools/complete-task.js +80 -0
  110. package/dist/resources/extensions/gsd/tools/memory-tools.js +306 -0
  111. package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -12
  112. package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -2
  113. package/dist/resources/extensions/gsd/tools/skip-slice.js +78 -0
  114. package/dist/resources/extensions/gsd/uok/flags.js +7 -7
  115. package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
  116. package/dist/resources/extensions/gsd/verification-gate.js +2 -1
  117. package/dist/resources/extensions/gsd/workflow-dispatch.js +64 -0
  118. package/dist/resources/extensions/gsd/workflow-install.js +327 -0
  119. package/dist/resources/extensions/gsd/workflow-manifest.js +8 -0
  120. package/dist/resources/extensions/gsd/workflow-mcp.js +1 -6
  121. package/dist/resources/extensions/gsd/workflow-plugins.js +346 -0
  122. package/dist/resources/extensions/gsd/workflow-projections.js +17 -15
  123. package/dist/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
  124. package/dist/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
  125. package/dist/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
  126. package/dist/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
  127. package/dist/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
  128. package/dist/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
  129. package/dist/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
  130. package/dist/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
  131. package/dist/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
  132. package/dist/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
  133. package/dist/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
  134. package/dist/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
  135. package/dist/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
  136. package/dist/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
  137. package/dist/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
  138. package/dist/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
  139. package/dist/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
  140. package/dist/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
  141. package/dist/resources/extensions/gsd/workflow-templates/registry.json +184 -0
  142. package/dist/resources/extensions/gsd/workflow-templates/release.md +118 -0
  143. package/dist/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
  144. package/dist/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
  145. package/dist/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
  146. package/dist/resources/extensions/gsd/workflow-templates/spike.md +1 -0
  147. package/dist/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
  148. package/dist/resources/extensions/gsd/worktree-resolver.js +42 -1
  149. package/dist/resources/extensions/remote-questions/commands.js +380 -0
  150. package/dist/resources/extensions/remote-questions/manager.js +39 -5
  151. package/dist/resources/extensions/remote-questions/telegram-adapter.js +79 -4
  152. package/dist/resources/extensions/shared/interview-ui.js +189 -1
  153. package/dist/resources/extensions/shared/layout-utils.js +17 -0
  154. package/dist/resources/extensions/shared/rtk-shared.js +47 -0
  155. package/dist/resources/extensions/shared/rtk.js +3 -46
  156. package/dist/resources/skills/create-workflow/SKILL.md +33 -6
  157. package/dist/rtk-shared.d.ts +10 -0
  158. package/dist/rtk-shared.js +47 -0
  159. package/dist/rtk.d.ts +2 -6
  160. package/dist/rtk.js +3 -48
  161. package/dist/shared/workspace-types.d.ts +52 -0
  162. package/dist/shared/workspace-types.js +1 -0
  163. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  164. package/dist/update-check.d.ts +10 -0
  165. package/dist/update-check.js +24 -3
  166. package/dist/web/standalone/.next/BUILD_ID +1 -1
  167. package/dist/web/standalone/.next/app-path-routes-manifest.json +5 -5
  168. package/dist/web/standalone/.next/build-manifest.json +3 -3
  169. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  170. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  171. package/dist/web/standalone/.next/required-server-files.json +1 -1
  172. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  174. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  176. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  178. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  179. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  180. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  181. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  183. package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
  184. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  185. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  187. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  188. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  189. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  190. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  192. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  197. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  200. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  202. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  204. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  206. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  208. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  210. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  212. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  214. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  216. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  218. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  220. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  223. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  224. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  226. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  228. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  230. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  232. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  234. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  235. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  236. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  237. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  238. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  239. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  240. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  241. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  242. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  244. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  245. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  246. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  247. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  248. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  249. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  250. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  251. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  252. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  253. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  254. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  255. package/dist/web/standalone/.next/server/app/index.html +1 -1
  256. package/dist/web/standalone/.next/server/app/index.rsc +3 -3
  257. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  258. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
  259. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  260. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  261. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  262. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  263. package/dist/web/standalone/.next/server/app-paths-manifest.json +5 -5
  264. package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
  265. package/dist/web/standalone/.next/server/chunks/7461.js +1 -0
  266. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  267. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  268. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  269. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  270. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  271. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  272. package/dist/web/standalone/.next/static/chunks/2826.e59e8578e2e28639.js +9 -0
  273. package/dist/web/standalone/.next/static/chunks/{2008.71ee9230ad78df21.js → 3621.fc7480022c972438.js} +2 -2
  274. package/dist/web/standalone/.next/static/chunks/app/{page-f1e30ab6bb269149.js → page-5b113fd32bc2a1c3.js} +1 -1
  275. package/dist/web/standalone/.next/static/chunks/{webpack-b868033a5834586d.js → webpack-5fc74f13a25fa1bb.js} +1 -1
  276. package/dist/web/standalone/.next/static/css/632cd626b1731d88.css +1 -0
  277. package/dist/web/standalone/server.js +1 -1
  278. package/dist/welcome-screen.js +48 -24
  279. package/dist/wizard.js +2 -2
  280. package/dist/worktree-cli.d.ts +6 -5
  281. package/dist/worktree-cli.js +23 -7
  282. package/package.json +3 -3
  283. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  284. package/packages/mcp-server/dist/server.js +12 -10
  285. package/packages/mcp-server/dist/server.js.map +1 -1
  286. package/packages/mcp-server/dist/session-manager.d.ts.map +1 -1
  287. package/packages/mcp-server/dist/session-manager.js +8 -1
  288. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  289. package/packages/mcp-server/dist/workflow-tools.d.ts +1 -0
  290. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  291. package/packages/mcp-server/dist/workflow-tools.js +113 -14
  292. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  293. package/packages/mcp-server/src/mcp-server.test.ts +40 -4
  294. package/packages/mcp-server/src/server.ts +12 -10
  295. package/packages/mcp-server/src/session-manager.ts +10 -3
  296. package/packages/mcp-server/src/workflow-tools.test.ts +91 -1
  297. package/packages/mcp-server/src/workflow-tools.ts +128 -18
  298. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  299. package/packages/native/tsconfig.tsbuildinfo +1 -1
  300. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  301. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
  302. package/packages/pi-ai/dist/models/capability-patches.js +3 -2
  303. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
  304. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +68 -0
  305. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -1
  306. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +68 -0
  307. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -1
  308. package/packages/pi-ai/dist/models/generated/anthropic.d.ts +17 -0
  309. package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -1
  310. package/packages/pi-ai/dist/models/generated/anthropic.js +17 -0
  311. package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -1
  312. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +17 -0
  313. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -1
  314. package/packages/pi-ai/dist/models/generated/google-antigravity.js +17 -0
  315. package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -1
  316. package/packages/pi-ai/dist/models/generated/groq.d.ts +0 -153
  317. package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -1
  318. package/packages/pi-ai/dist/models/generated/groq.js +0 -153
  319. package/packages/pi-ai/dist/models/generated/groq.js.map +1 -1
  320. package/packages/pi-ai/dist/models/generated/index.d.ts +136 -153
  321. package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
  322. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
  323. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
  324. package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
  325. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
  326. package/packages/pi-ai/dist/models/generated/openrouter.d.ts +17 -0
  327. package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -1
  328. package/packages/pi-ai/dist/models/generated/openrouter.js +17 -0
  329. package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -1
  330. package/packages/pi-ai/dist/models.generated.test.js +17 -0
  331. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  332. package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts +22 -1
  333. package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  334. package/packages/pi-ai/dist/providers/amazon-bedrock.js +40 -6
  335. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  336. package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts +2 -0
  337. package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts.map +1 -0
  338. package/packages/pi-ai/dist/providers/amazon-bedrock.test.js +106 -0
  339. package/packages/pi-ai/dist/providers/amazon-bedrock.test.js.map +1 -0
  340. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +42 -1
  341. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  342. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts +20 -1
  343. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  344. package/packages/pi-ai/dist/providers/anthropic-shared.js +32 -2
  345. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  346. package/packages/pi-ai/dist/providers/anthropic-shared.test.js +12 -1
  347. package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -1
  348. package/packages/pi-ai/dist/providers/anthropic.d.ts +11 -0
  349. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  350. package/packages/pi-ai/dist/providers/anthropic.js +18 -1
  351. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  352. package/packages/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
  353. package/packages/pi-ai/dist/utils/oauth/openai-codex.js +12 -0
  354. package/packages/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
  355. package/packages/pi-ai/package.json +1 -1
  356. package/packages/pi-ai/scripts/generate-models.ts +50 -0
  357. package/packages/pi-ai/src/models/capability-patches.ts +5 -2
  358. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +68 -0
  359. package/packages/pi-ai/src/models/generated/anthropic.ts +17 -0
  360. package/packages/pi-ai/src/models/generated/google-antigravity.ts +17 -0
  361. package/packages/pi-ai/src/models/generated/groq.ts +0 -153
  362. package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
  363. package/packages/pi-ai/src/models/generated/openrouter.ts +17 -0
  364. package/packages/pi-ai/src/models.generated.test.ts +17 -0
  365. package/packages/pi-ai/src/providers/amazon-bedrock.test.ts +164 -0
  366. package/packages/pi-ai/src/providers/amazon-bedrock.ts +41 -7
  367. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +47 -1
  368. package/packages/pi-ai/src/providers/anthropic-shared.test.ts +15 -1
  369. package/packages/pi-ai/src/providers/anthropic-shared.ts +36 -3
  370. package/packages/pi-ai/src/providers/anthropic.ts +19 -1
  371. package/packages/pi-ai/src/utils/oauth/openai-codex.ts +15 -0
  372. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  373. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts +2 -0
  374. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts.map +1 -0
  375. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +38 -0
  376. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -0
  377. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +14 -0
  378. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/auth-storage.js +34 -0
  380. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  381. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +74 -0
  382. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  383. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +4 -1
  384. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  385. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +32 -0
  386. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  387. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  388. package/packages/pi-coding-agent/dist/core/sdk.js +32 -0
  389. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  390. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +2 -2
  391. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  392. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  393. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +17 -7
  394. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  395. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  396. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +48 -34
  397. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  398. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts +4 -0
  399. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  400. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +83 -33
  401. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  402. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
  403. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
  404. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +77 -0
  405. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -0
  406. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -66
  407. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  408. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +1 -75
  409. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  410. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts +1 -1
  411. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  412. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +192 -24
  413. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  414. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +56 -0
  415. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +83 -0
  416. package/packages/pi-coding-agent/src/core/auth-storage.ts +35 -0
  417. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +4 -1
  418. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +37 -1
  419. package/packages/pi-coding-agent/src/core/sdk.ts +41 -0
  420. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +2 -2
  421. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +19 -7
  422. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +53 -31
  423. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +88 -36
  424. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +83 -0
  425. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +2 -83
  426. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +208 -27
  427. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  428. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  429. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  430. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
  431. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
  432. package/pkg/dist/modes/interactive/theme/theme-schema.js +77 -0
  433. package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -0
  434. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -66
  435. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  436. package/pkg/dist/modes/interactive/theme/theme.js +1 -75
  437. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  438. package/pkg/dist/modes/interactive/theme/themes.d.ts +1 -1
  439. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  440. package/pkg/dist/modes/interactive/theme/themes.js +192 -24
  441. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  442. package/src/resources/extensions/ask-user-questions.ts +24 -6
  443. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  444. package/src/resources/extensions/claude-code-cli/readiness.ts +13 -2
  445. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +94 -4
  446. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +84 -0
  447. package/src/resources/extensions/gsd/auto/detect-stuck.ts +10 -0
  448. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  449. package/src/resources/extensions/gsd/auto/loop.ts +109 -3
  450. package/src/resources/extensions/gsd/auto/phases.ts +94 -60
  451. package/src/resources/extensions/gsd/auto/resolve.ts +1 -1
  452. package/src/resources/extensions/gsd/auto/run-unit.ts +11 -1
  453. package/src/resources/extensions/gsd/auto/session.ts +7 -0
  454. package/src/resources/extensions/gsd/auto-artifact-paths.ts +20 -0
  455. package/src/resources/extensions/gsd/auto-dashboard.ts +21 -4
  456. package/src/resources/extensions/gsd/auto-dispatch.ts +123 -5
  457. package/src/resources/extensions/gsd/auto-loop.ts +1 -1
  458. package/src/resources/extensions/gsd/auto-model-selection.ts +14 -3
  459. package/src/resources/extensions/gsd/auto-post-unit.ts +10 -8
  460. package/src/resources/extensions/gsd/auto-prompts.ts +201 -40
  461. package/src/resources/extensions/gsd/auto-recovery.ts +63 -1
  462. package/src/resources/extensions/gsd/auto-start.ts +8 -6
  463. package/src/resources/extensions/gsd/auto-verification.ts +3 -3
  464. package/src/resources/extensions/gsd/auto-worktree.ts +65 -0
  465. package/src/resources/extensions/gsd/auto.ts +61 -28
  466. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +8 -21
  467. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +46 -24
  468. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +158 -0
  469. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +31 -0
  470. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -0
  471. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
  472. package/src/resources/extensions/gsd/bootstrap/system-context.ts +20 -4
  473. package/src/resources/extensions/gsd/commands/catalog.ts +74 -9
  474. package/src/resources/extensions/gsd/commands/handlers/core.ts +69 -27
  475. package/src/resources/extensions/gsd/commands/handlers/escalate.ts +216 -0
  476. package/src/resources/extensions/gsd/commands/handlers/onboarding.ts +196 -0
  477. package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
  478. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +279 -29
  479. package/src/resources/extensions/gsd/commands-cmux.ts +6 -2
  480. package/src/resources/extensions/gsd/commands-config.ts +10 -0
  481. package/src/resources/extensions/gsd/commands-debug.ts +484 -0
  482. package/src/resources/extensions/gsd/commands-do.ts +1 -0
  483. package/src/resources/extensions/gsd/commands-extract-learnings.ts +295 -76
  484. package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
  485. package/src/resources/extensions/gsd/commands-memory.ts +551 -0
  486. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +49 -12
  487. package/src/resources/extensions/gsd/commands-scan.ts +125 -0
  488. package/src/resources/extensions/gsd/commands-workflow-templates.ts +129 -2
  489. package/src/resources/extensions/gsd/custom-workflow-engine.ts +85 -60
  490. package/src/resources/extensions/gsd/db-writer.ts +3 -0
  491. package/src/resources/extensions/gsd/debug-session-store.ts +377 -0
  492. package/src/resources/extensions/gsd/definition-loader.ts +7 -0
  493. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -9
  494. package/src/resources/extensions/gsd/doctor-environment.ts +2 -1
  495. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -1
  496. package/src/resources/extensions/gsd/doctor-proactive.ts +4 -1
  497. package/src/resources/extensions/gsd/doctor-providers.ts +52 -22
  498. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +23 -4
  499. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  500. package/src/resources/extensions/gsd/doctor.ts +7 -1
  501. package/src/resources/extensions/gsd/error-classifier.ts +6 -3
  502. package/src/resources/extensions/gsd/escalation.ts +367 -0
  503. package/src/resources/extensions/gsd/forensics.ts +25 -29
  504. package/src/resources/extensions/gsd/git-service.ts +0 -1
  505. package/src/resources/extensions/gsd/graph.ts +33 -3
  506. package/src/resources/extensions/gsd/gsd-db.ts +578 -32
  507. package/src/resources/extensions/gsd/health-widget-core.ts +43 -14
  508. package/src/resources/extensions/gsd/health-widget.ts +7 -3
  509. package/src/resources/extensions/gsd/init-wizard.ts +87 -54
  510. package/src/resources/extensions/gsd/markdown-renderer.ts +5 -5
  511. package/src/resources/extensions/gsd/memory-embeddings.ts +235 -0
  512. package/src/resources/extensions/gsd/memory-extractor.ts +100 -34
  513. package/src/resources/extensions/gsd/memory-ingest.ts +286 -0
  514. package/src/resources/extensions/gsd/memory-relations.ts +240 -0
  515. package/src/resources/extensions/gsd/memory-source-store.ts +138 -0
  516. package/src/resources/extensions/gsd/memory-store.ts +351 -7
  517. package/src/resources/extensions/gsd/metrics.ts +1 -0
  518. package/src/resources/extensions/gsd/model-cost-table.ts +3 -1
  519. package/src/resources/extensions/gsd/model-router.ts +25 -6
  520. package/src/resources/extensions/gsd/native-git-bridge.ts +134 -6
  521. package/src/resources/extensions/gsd/notification-overlay.ts +9 -19
  522. package/src/resources/extensions/gsd/notification-widget.ts +25 -43
  523. package/src/resources/extensions/gsd/notifications.ts +6 -0
  524. package/src/resources/extensions/gsd/onboarding-state.ts +146 -0
  525. package/src/resources/extensions/gsd/post-execution-checks.ts +37 -14
  526. package/src/resources/extensions/gsd/pre-execution-checks.ts +98 -8
  527. package/src/resources/extensions/gsd/preferences-models.ts +1 -0
  528. package/src/resources/extensions/gsd/preferences-types.ts +10 -2
  529. package/src/resources/extensions/gsd/preferences-validation.ts +33 -7
  530. package/src/resources/extensions/gsd/preferences.ts +10 -10
  531. package/src/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
  532. package/src/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
  533. package/src/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
  534. package/src/resources/extensions/gsd/prompts/execute-task.md +12 -0
  535. package/src/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
  536. package/src/resources/extensions/gsd/prompts/refine-slice.md +69 -0
  537. package/src/resources/extensions/gsd/prompts/scan.md +79 -0
  538. package/src/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
  539. package/src/resources/extensions/gsd/python-resolver.ts +76 -0
  540. package/src/resources/extensions/gsd/run-manager.ts +53 -19
  541. package/src/resources/extensions/gsd/setup-catalog.ts +105 -0
  542. package/src/resources/extensions/gsd/state.ts +50 -2
  543. package/src/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
  544. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +1 -34
  545. package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +7 -0
  546. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +45 -31
  547. package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +63 -0
  548. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +12 -0
  549. package/src/resources/extensions/gsd/tests/auto-prompts-fallback.test.ts +35 -0
  550. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +123 -1
  551. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +39 -0
  552. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +39 -0
  553. package/src/resources/extensions/gsd/tests/commands-do.test.ts +48 -0
  554. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +333 -21
  555. package/src/resources/extensions/gsd/tests/commands-scan.test.ts +351 -0
  556. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +8 -6
  557. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +6 -8
  558. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  559. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +63 -0
  560. package/src/resources/extensions/gsd/tests/debug-command-handler.test.ts +905 -0
  561. package/src/resources/extensions/gsd/tests/debug-command-lifecycle.integration.test.ts +1229 -0
  562. package/src/resources/extensions/gsd/tests/debug-session-store.test.ts +565 -0
  563. package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +64 -0
  564. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +67 -0
  565. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +62 -18
  566. package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +5 -0
  567. package/src/resources/extensions/gsd/tests/escalation.test.ts +818 -0
  568. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +29 -12
  569. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +106 -0
  570. package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +74 -0
  571. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +0 -4
  572. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -1
  573. package/src/resources/extensions/gsd/tests/health-widget.test.ts +8 -2
  574. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +190 -0
  575. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +39 -0
  576. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +44 -0
  577. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +68 -1
  578. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +109 -11
  579. package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +51 -0
  580. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +2 -2
  581. package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
  582. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +171 -1
  583. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  584. package/src/resources/extensions/gsd/tests/memory-embeddings.test.ts +213 -0
  585. package/src/resources/extensions/gsd/tests/memory-ingest.test.ts +153 -0
  586. package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +107 -0
  587. package/src/resources/extensions/gsd/tests/memory-relations.test.ts +175 -0
  588. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  589. package/src/resources/extensions/gsd/tests/memory-tools.test.ts +295 -0
  590. package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +3 -2
  591. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +2 -2
  592. package/src/resources/extensions/gsd/tests/model-router.test.ts +51 -1
  593. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +59 -0
  594. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +56 -37
  595. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +1 -1
  596. package/src/resources/extensions/gsd/tests/onboarding-state.test.ts +105 -0
  597. package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +114 -0
  598. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +4 -5
  599. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +17 -0
  600. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -1
  601. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +275 -6
  602. package/src/resources/extensions/gsd/tests/preferences.test.ts +69 -1
  603. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +539 -0
  604. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +11 -2
  605. package/src/resources/extensions/gsd/tests/projection-regression.test.ts +7 -0
  606. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +27 -0
  607. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +24 -0
  608. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +1 -1
  609. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +33 -0
  610. package/src/resources/extensions/gsd/tests/python-resolver.test.ts +131 -0
  611. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +67 -0
  612. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +107 -0
  613. package/src/resources/extensions/gsd/tests/requirements.test.ts +9 -0
  614. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +153 -0
  615. package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +125 -0
  616. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +16 -4
  617. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +3 -0
  618. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +15 -0
  619. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +5 -0
  620. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +2 -1
  621. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +31 -1
  622. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +166 -0
  623. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +35 -0
  624. package/src/resources/extensions/gsd/tests/workflow-install.test.ts +113 -0
  625. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +15 -6
  626. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  627. package/src/resources/extensions/gsd/tests/workflow-plugins.test.ts +310 -0
  628. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +7 -0
  629. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +8 -2
  630. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +2 -1
  631. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +77 -2
  632. package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
  633. package/src/resources/extensions/gsd/tools/memory-tools.ts +380 -0
  634. package/src/resources/extensions/gsd/tools/plan-milestone.ts +42 -8
  635. package/src/resources/extensions/gsd/tools/plan-slice.ts +6 -1
  636. package/src/resources/extensions/gsd/tools/skip-slice.ts +133 -0
  637. package/src/resources/extensions/gsd/types.ts +62 -0
  638. package/src/resources/extensions/gsd/unit-runtime.ts +1 -0
  639. package/src/resources/extensions/gsd/uok/contracts.ts +2 -1
  640. package/src/resources/extensions/gsd/uok/flags.ts +7 -7
  641. package/src/resources/extensions/gsd/uok/kernel.ts +16 -4
  642. package/src/resources/extensions/gsd/verification-gate.ts +2 -1
  643. package/src/resources/extensions/gsd/workflow-dispatch.ts +106 -0
  644. package/src/resources/extensions/gsd/workflow-install.ts +423 -0
  645. package/src/resources/extensions/gsd/workflow-logger.ts +3 -1
  646. package/src/resources/extensions/gsd/workflow-manifest.ts +8 -0
  647. package/src/resources/extensions/gsd/workflow-mcp.ts +1 -6
  648. package/src/resources/extensions/gsd/workflow-plugins.ts +403 -0
  649. package/src/resources/extensions/gsd/workflow-projections.ts +18 -16
  650. package/src/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
  651. package/src/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
  652. package/src/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
  653. package/src/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
  654. package/src/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
  655. package/src/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
  656. package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
  657. package/src/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
  658. package/src/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
  659. package/src/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
  660. package/src/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
  661. package/src/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
  662. package/src/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
  663. package/src/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
  664. package/src/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
  665. package/src/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
  666. package/src/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
  667. package/src/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
  668. package/src/resources/extensions/gsd/workflow-templates/registry.json +184 -0
  669. package/src/resources/extensions/gsd/workflow-templates/release.md +118 -0
  670. package/src/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
  671. package/src/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
  672. package/src/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
  673. package/src/resources/extensions/gsd/workflow-templates/spike.md +1 -0
  674. package/src/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
  675. package/src/resources/extensions/gsd/workflow-templates.ts +7 -0
  676. package/src/resources/extensions/gsd/workspace-index.ts +9 -4
  677. package/src/resources/extensions/gsd/worktree-resolver.ts +47 -1
  678. package/src/resources/extensions/remote-questions/commands.ts +480 -0
  679. package/src/resources/extensions/remote-questions/manager.ts +49 -4
  680. package/src/resources/extensions/remote-questions/telegram-adapter.ts +86 -4
  681. package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +246 -0
  682. package/src/resources/extensions/remote-questions/tests/remote-answer-normalization.test.ts +92 -0
  683. package/src/resources/extensions/remote-questions/tests/telegram-commands.test.ts +267 -0
  684. package/src/resources/extensions/shared/interview-ui.ts +195 -1
  685. package/src/resources/extensions/shared/layout-utils.ts +26 -0
  686. package/src/resources/extensions/shared/rtk-shared.ts +58 -0
  687. package/src/resources/extensions/shared/rtk.ts +12 -52
  688. package/src/resources/extensions/shared/tests/interview-preview.test.ts +177 -0
  689. package/src/resources/extensions/shared/tests/preview-layout.test.ts +120 -0
  690. package/src/resources/skills/create-workflow/SKILL.md +33 -6
  691. package/dist/web/standalone/.next/static/chunks/2826.dd3dc8bbd3025fa5.js +0 -9
  692. package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +0 -1
  693. package/packages/native/dist/ps/types.d.ts +0 -5
  694. package/packages/native/dist/ps/types.js +0 -2
  695. package/packages/native/src/ps/types.ts +0 -5
  696. package/packages/pi-ai/node_modules/@smithy/node-http-handler/LICENSE +0 -201
  697. package/packages/pi-ai/node_modules/@smithy/node-http-handler/README.md +0 -9
  698. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-cjs/index.js +0 -762
  699. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/build-abort-error.js +0 -19
  700. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/constants.js +0 -1
  701. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/get-transformed-headers.js +0 -9
  702. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/index.js +0 -3
  703. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http-handler.js +0 -230
  704. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-manager.js +0 -87
  705. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-pool.js +0 -32
  706. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-handler.js +0 -169
  707. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/readable.mock.js +0 -21
  708. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/server.mock.js +0 -88
  709. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-connection-timeout.js +0 -36
  710. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-request-timeout.js +0 -21
  711. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-keep-alive.js +0 -22
  712. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-timeout.js +0 -23
  713. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/collector.js +0 -8
  714. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/index.js +0 -41
  715. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/readable.mock.js +0 -21
  716. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/timing.js +0 -4
  717. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/write-request-body.js +0 -63
  718. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/build-abort-error.d.ts +0 -10
  719. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/constants.d.ts +0 -5
  720. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/get-transformed-headers.d.ts +0 -4
  721. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/index.d.ts +0 -3
  722. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http-handler.d.ts +0 -46
  723. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-manager.d.ts +0 -24
  724. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-pool.d.ts +0 -12
  725. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-handler.d.ts +0 -63
  726. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/readable.mock.d.ts +0 -13
  727. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/server.mock.d.ts +0 -12
  728. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-connection-timeout.d.ts +0 -2
  729. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-request-timeout.d.ts +0 -6
  730. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-keep-alive.d.ts +0 -6
  731. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-timeout.d.ts +0 -2
  732. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/collector.d.ts +0 -5
  733. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/index.d.ts +0 -6
  734. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/readable.mock.d.ts +0 -13
  735. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/timing.d.ts +0 -8
  736. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/build-abort-error.d.ts +0 -10
  737. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/constants.d.ts +0 -5
  738. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/get-transformed-headers.d.ts +0 -4
  739. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/index.d.ts +0 -3
  740. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http-handler.d.ts +0 -46
  741. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-manager.d.ts +0 -24
  742. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-pool.d.ts +0 -12
  743. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-handler.d.ts +0 -63
  744. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/readable.mock.d.ts +0 -13
  745. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/server.mock.d.ts +0 -12
  746. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-connection-timeout.d.ts +0 -2
  747. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-request-timeout.d.ts +0 -6
  748. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-keep-alive.d.ts +0 -6
  749. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-timeout.d.ts +0 -2
  750. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/collector.d.ts +0 -5
  751. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/index.d.ts +0 -6
  752. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/readable.mock.d.ts +0 -13
  753. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/timing.d.ts +0 -8
  754. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/write-request-body.d.ts +0 -12
  755. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/write-request-body.d.ts +0 -12
  756. package/packages/pi-ai/node_modules/@smithy/node-http-handler/package.json +0 -68
  757. package/packages/pi-ai/oauth.d.ts +0 -1
  758. package/packages/pi-ai/oauth.js +0 -1
  759. /package/dist/web/standalone/.next/static/{j7IBD35UgrL2b298GLK3V → o61X3klsB6C0UE0X1x3PA}/_buildManifest.js +0 -0
  760. /package/dist/web/standalone/.next/static/{j7IBD35UgrL2b298GLK3V → o61X3klsB6C0UE0X1x3PA}/_ssgManifest.js +0 -0
@@ -1,14 +1,14 @@
1
1
  /**
2
- * Post-unit processing for handleAgentEnd — auto-commit, doctor run,
2
+ * Post-unit processing for auto-loop — auto-commit, doctor run,
3
3
  * state rebuild, worktree sync, DB dual-write, hooks, triage, and
4
4
  * quick-task dispatch.
5
5
  *
6
- * Split into two functions called sequentially by handleAgentEnd with
6
+ * Split into two functions called sequentially by auto-loop with
7
7
  * the verification gate between them:
8
8
  * 1. postUnitPreVerification() — commit, doctor, state rebuild, worktree sync, artifact verification
9
9
  * 2. postUnitPostVerification() — DB dual-write, hooks, triage, quick-tasks
10
10
  *
11
- * Extracted from handleAgentEnd() in auto.ts.
11
+ * Extracted from the pre-loop agent_end handler in auto.ts.
12
12
  */
13
13
 
14
14
  import type { ExtensionContext, ExtensionAPI } from "@gsd/pi-coding-agent";
@@ -99,7 +99,7 @@ function enqueueSidecar(
99
99
  * next actual task commit via `smartStage()`. */
100
100
  const LIFECYCLE_ONLY_UNITS = new Set([
101
101
  "research-milestone", "discuss-milestone", "discuss-slice", "plan-milestone",
102
- "validate-milestone", "research-slice", "plan-slice",
102
+ "validate-milestone", "research-slice", "plan-slice", "refine-slice",
103
103
  "replan-slice", "complete-slice", "run-uat",
104
104
  "reassess-roadmap", "rewrite-docs",
105
105
  ]);
@@ -190,7 +190,7 @@ export function detectRogueFileWrites(
190
190
  if (!hasPlanningState) {
191
191
  rogues.push({ path: roadmapPath, unitType, unitId });
192
192
  }
193
- } else if (unitType === "plan-slice" || unitType === "replan-slice") {
193
+ } else if (unitType === "plan-slice" || unitType === "refine-slice" || unitType === "replan-slice") {
194
194
  if (!mid || !sid) return [];
195
195
 
196
196
  const planPath = resolveSliceFile(basePath, mid, sid, "PLAN");
@@ -735,7 +735,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
735
735
  try {
736
736
  const { milestone: mid, slice: sid } = parseUnitId(s.currentUnit.id);
737
737
  if (mid && sid) {
738
- const regenerated = regenerateIfMissing(s.basePath, mid, sid, "PLAN");
738
+ const regenerated = await regenerateIfMissing(s.basePath, mid, sid, "PLAN");
739
739
  if (regenerated) {
740
740
  // Re-check after regeneration
741
741
  triggerArtifactVerified = verifyExpectedArtifact(s.currentUnit.type, s.currentUnit.id, s.basePath);
@@ -1020,10 +1020,12 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
1020
1020
  }
1021
1021
  }
1022
1022
 
1023
- // ── Pre-execution checks (after plan-slice completes) ──
1023
+ // ── Pre-execution checks (after plan-slice or ADR-011 refine-slice completes) ──
1024
+ // Both emit the same PLAN.md + task artifacts via gsd_plan_slice, so the
1025
+ // same structural validation applies to both.
1024
1026
  if (
1025
1027
  s.currentUnit &&
1026
- s.currentUnit.type === "plan-slice"
1028
+ (s.currentUnit.type === "plan-slice" || s.currentUnit.type === "refine-slice")
1027
1029
  ) {
1028
1030
  const currentUnit = s.currentUnit;
1029
1031
  let preExecPauseNeeded = false;
@@ -35,14 +35,56 @@ import { formatDecisionsCompact, formatRequirementsCompact } from "./structured-
35
35
  import { readPhaseAnchor, formatAnchorForPrompt } from "./phase-anchor.js";
36
36
  import { logWarning } from "./workflow-logger.js";
37
37
  import { inlineGraphSubgraph } from "./graph-context.js";
38
+ import { buildExtractionStepsBlock } from "./commands-extract-learnings.js";
38
39
 
39
40
  // ─── Preamble Cap ─────────────────────────────────────────────────────────────
40
41
 
42
+ /**
43
+ * Historical static ceiling for the preamble cap. Kept as an upper bound even
44
+ * after context-window-aware sizing so large-window users don't suddenly see
45
+ * 10× looser caps than before. Small-window users get a tighter cap derived
46
+ * from their configured executor window.
47
+ */
41
48
  const MAX_PREAMBLE_CHARS = 30_000;
42
49
 
50
+ /**
51
+ * Resolve prompt budgets from the configured executor context window.
52
+ *
53
+ * The prompt builders here don't have access to the runtime model registry
54
+ * (they're called from many non-ctx sites), so `resolveExecutorContextWindow`
55
+ * is fed the user-configurable `context_window_override` preference as the
56
+ * `sessionContextWindow` fallback. That preference exists specifically to
57
+ * cover small-window local models (e.g. 32K lemonade/llama.cpp servers) whose
58
+ * n_ctx is not discoverable through the model registry. Issue #4435.
59
+ */
60
+ function resolvePromptBudgets(): ReturnType<typeof computeBudgets> {
61
+ try {
62
+ const prefs = loadEffectiveGSDPreferences();
63
+ const sessionWindow = prefs?.preferences.context_window_override;
64
+ const windowTokens = resolveExecutorContextWindow(undefined, prefs?.preferences, sessionWindow);
65
+ return computeBudgets(windowTokens);
66
+ } catch (e) {
67
+ logWarning("prompt", `resolvePromptBudgets failed: ${(e as Error).message}`);
68
+ return computeBudgets(200_000);
69
+ }
70
+ }
71
+
72
+ /**
73
+ * Character budget for dependency/prior slice summaries injected into dispatch
74
+ * prompts. Scales with the executor's configured context window (issue #4435).
75
+ */
76
+ function resolveSummaryBudgetChars(): number {
77
+ return resolvePromptBudgets().summaryBudgetChars;
78
+ }
79
+
43
80
  function capPreamble(preamble: string): string {
44
- if (preamble.length <= MAX_PREAMBLE_CHARS) return preamble;
45
- return truncateAtSectionBoundary(preamble, MAX_PREAMBLE_CHARS).content;
81
+ // Cap inlined context at min(historical 30K ceiling, scaled inline budget).
82
+ // The ceiling preserves pre-fix behavior for large-window users; the scaled
83
+ // budget tightens the cap for small-window users whose true safe limit is
84
+ // below 30K. `computeBudgets` allocates 40% of total chars to inline context.
85
+ const budget = Math.min(MAX_PREAMBLE_CHARS, resolvePromptBudgets().inlineContextBudgetChars);
86
+ if (preamble.length <= budget) return preamble;
87
+ return truncateAtSectionBoundary(preamble, budget).content;
46
88
  }
47
89
 
48
90
  // ─── Executor Constraints ─────────────────────────────────────────────────────
@@ -75,7 +117,18 @@ function formatExecutorConstraints(): string {
75
117
  ].join("\n");
76
118
  }
77
119
 
78
- function buildSourceFilePaths(
120
+ /**
121
+ * Returns a markdown bullet list of known context file paths for the given
122
+ * milestone (and optionally slice). Falls back to a generic tool-agnostic
123
+ * instruction when no GSD artifacts are found.
124
+ *
125
+ * @param base - Absolute path to the project root.
126
+ * @param mid - Milestone ID (e.g. `"M001"`).
127
+ * @param sid - Optional slice ID (e.g. `"S01"`). When provided, the slice
128
+ * RESEARCH file is preferred over the milestone-level one.
129
+ * @returns Markdown string of file path bullets, or a fallback instruction.
130
+ */
131
+ export function buildSourceFilePaths(
79
132
  base: string,
80
133
  mid: string,
81
134
  sid?: string,
@@ -126,7 +179,7 @@ function buildSourceFilePaths(
126
179
 
127
180
  return paths.length > 0
128
181
  ? paths.join("\n")
129
- : "- Use `rg --files` and targeted reads to identify the relevant source files before planning.";
182
+ : "- Use the Grep/Glob/Read tools to identify the relevant source files before planning.";
130
183
  }
131
184
 
132
185
  // ─── Inline Helpers ───────────────────────────────────────────────────────
@@ -997,14 +1050,19 @@ export async function checkNeedsRunUat(
997
1050
  * as a seed when present. The discussion agent interviews the user, writes
998
1051
  * a full CONTEXT.md, and the phase transitions to pre-planning automatically.
999
1052
  */
1000
- export async function buildDiscussMilestonePrompt(mid: string, midTitle: string, base: string): Promise<string> {
1053
+ export async function buildDiscussMilestonePrompt(
1054
+ mid: string,
1055
+ midTitle: string,
1056
+ base: string,
1057
+ structuredQuestionsAvailable = "false",
1058
+ ): Promise<string> {
1001
1059
  const discussTemplates = inlineTemplate("context", "Context");
1002
1060
 
1003
1061
  const basePrompt = loadPrompt("guided-discuss-milestone", {
1004
1062
  milestoneId: mid,
1005
1063
  milestoneTitle: midTitle,
1006
1064
  inlinedTemplates: discussTemplates,
1007
- structuredQuestionsAvailable: "false",
1065
+ structuredQuestionsAvailable,
1008
1066
  commitInstruction: "Do not commit planning artifacts — .gsd/ is managed externally.",
1009
1067
  fastPathInstruction: "",
1010
1068
  });
@@ -1182,7 +1240,7 @@ export async function buildResearchSlicePrompt(
1182
1240
 
1183
1241
  inlined.push(inlineTemplate("research", "Research"));
1184
1242
 
1185
- const depContent = await inlineDependencySummaries(mid, sid, base);
1243
+ const depContent = await inlineDependencySummaries(mid, sid, base, resolveSummaryBudgetChars());
1186
1244
  const activeOverrides = await loadActiveOverrides(base);
1187
1245
  const overridesInline = formatOverridesSection(activeOverrides);
1188
1246
  if (overridesInline) inlined.unshift(overridesInline);
@@ -1211,10 +1269,28 @@ export async function buildResearchSlicePrompt(
1211
1269
  });
1212
1270
  }
1213
1271
 
1214
- export async function buildPlanSlicePrompt(
1215
- mid: string, _midTitle: string, sid: string, sTitle: string, base: string, level?: InlineLevel,
1216
- ): Promise<string> {
1217
- const inlineLevel = level ?? resolveInlineLevel();
1272
+ /**
1273
+ * Shared assembly for plan-slice and refine-slice prompts. Both builders need
1274
+ * the same inlined context (roadmap excerpt, slice context, research, decisions,
1275
+ * requirements, knowledge, graph subgraph, templates, dependency summaries,
1276
+ * overrides). Extracted to prevent drift between the two sites.
1277
+ *
1278
+ * `prependBlocks` are pushed onto the start of the inlined array BEFORE any
1279
+ * shared content, so callers can add unit-specific headers (e.g., the refine
1280
+ * sketch-scope constraint).
1281
+ */
1282
+ async function renderSlicePrompt(options: {
1283
+ mid: string;
1284
+ sid: string;
1285
+ sTitle: string;
1286
+ base: string;
1287
+ level: InlineLevel;
1288
+ promptTemplate: "plan-slice" | "refine-slice";
1289
+ prependBlocks?: string[];
1290
+ extraVars?: Record<string, string>;
1291
+ }): Promise<string> {
1292
+ const { mid, sid, sTitle, base, level, promptTemplate, prependBlocks = [], extraVars = {} } = options;
1293
+
1218
1294
  const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
1219
1295
  const roadmapRel = relMilestoneFile(base, mid, "ROADMAP");
1220
1296
  const researchPath = resolveSliceFile(base, mid, sid, "RESEARCH");
@@ -1222,18 +1298,17 @@ export async function buildPlanSlicePrompt(
1222
1298
  const sliceContextPath = resolveSliceFile(base, mid, sid, "CONTEXT");
1223
1299
  const sliceContextRel = relSliceFile(base, mid, sid, "CONTEXT");
1224
1300
 
1225
- const inlined: string[] = [];
1301
+ const inlined: string[] = [...prependBlocks];
1226
1302
 
1227
- // Inject phase handoff anchor from research phase (if available)
1303
+ // Phase handoff anchor from research phase (if available)
1228
1304
  const researchSliceAnchor = readPhaseAnchor(base, mid, "research-slice");
1229
1305
  if (researchSliceAnchor) inlined.push(formatAnchorForPrompt(researchSliceAnchor));
1230
1306
 
1231
- // Use roadmap excerpt instead of full roadmap for context reduction
1232
- const roadmapExcerptPS = await inlineRoadmapExcerpt(base, mid, sid);
1233
- if (roadmapExcerptPS) {
1234
- inlined.push(roadmapExcerptPS);
1307
+ // Roadmap excerpt with full-roadmap fallback
1308
+ const roadmapExcerpt = await inlineRoadmapExcerpt(base, mid, sid);
1309
+ if (roadmapExcerpt) {
1310
+ inlined.push(roadmapExcerpt);
1235
1311
  } else {
1236
- // Fall back to full roadmap if excerpt fails
1237
1312
  inlined.push(await inlineFile(roadmapPath, roadmapRel, "Milestone Roadmap"));
1238
1313
  }
1239
1314
 
@@ -1241,42 +1316,36 @@ export async function buildPlanSlicePrompt(
1241
1316
  if (sliceCtxInline) inlined.push(sliceCtxInline);
1242
1317
  const researchInline = await inlineFileOptional(researchPath, researchRel, "Slice Research");
1243
1318
  if (researchInline) inlined.push(researchInline);
1244
- if (inlineLevel !== "minimal") {
1245
- // Derive scope from slice title for decision filtering (R005)
1246
- const derivedScopePS = deriveSliceScope(sTitle);
1247
- const decisionsInline = await inlineDecisionsFromDb(base, mid, derivedScopePS, inlineLevel);
1319
+
1320
+ if (level !== "minimal") {
1321
+ const derivedScope = deriveSliceScope(sTitle);
1322
+ const decisionsInline = await inlineDecisionsFromDb(base, mid, derivedScope, level);
1248
1323
  if (decisionsInline) inlined.push(decisionsInline);
1249
- const requirementsInline = await inlineRequirementsFromDb(base, mid, sid, inlineLevel);
1324
+ const requirementsInline = await inlineRequirementsFromDb(base, mid, sid, level);
1250
1325
  if (requirementsInline) inlined.push(requirementsInline);
1251
1326
  }
1252
1327
 
1253
- // Use scoped knowledge based on slice title keywords
1254
- const keywordsPS = extractKeywords(sTitle);
1255
- const knowledgeInlinePS = await inlineKnowledgeScoped(base, keywordsPS);
1256
- if (knowledgeInlinePS) inlined.push(knowledgeInlinePS);
1328
+ const knowledgeInline = await inlineKnowledgeScoped(base, extractKeywords(sTitle));
1329
+ if (knowledgeInline) inlined.push(knowledgeInline);
1257
1330
 
1258
- // Knowledge graph: subgraph for this slice (graceful skipped if no graph.json)
1259
- const graphBlockPS = await inlineGraphSubgraph(base, `${sid} ${sTitle}`, { budget: 3000 });
1260
- if (graphBlockPS) inlined.push(graphBlockPS);
1331
+ const graphBlock = await inlineGraphSubgraph(base, `${sid} ${sTitle}`, { budget: 3000 });
1332
+ if (graphBlock) inlined.push(graphBlock);
1261
1333
 
1262
1334
  inlined.push(inlineTemplate("plan", "Slice Plan"));
1263
- if (inlineLevel === "full") {
1335
+ if (level === "full") {
1264
1336
  inlined.push(inlineTemplate("task-plan", "Task Plan"));
1265
1337
  }
1266
1338
 
1267
- const depContent = await inlineDependencySummaries(mid, sid, base);
1268
- const planActiveOverrides = await loadActiveOverrides(base);
1269
- const planOverridesInline = formatOverridesSection(planActiveOverrides);
1270
- if (planOverridesInline) inlined.unshift(planOverridesInline);
1339
+ const depContent = await inlineDependencySummaries(mid, sid, base, resolveSummaryBudgetChars());
1340
+ const overridesInline = formatOverridesSection(await loadActiveOverrides(base));
1341
+ if (overridesInline) inlined.unshift(overridesInline);
1271
1342
 
1272
1343
  const inlinedContext = capPreamble(`## Inlined Context (preloaded — do not re-read these files)\n\n${inlined.join("\n\n---\n\n")}`);
1273
-
1274
- // Build executor context constraints from the budget engine
1275
1344
  const executorContextConstraints = formatExecutorConstraints();
1276
-
1277
1345
  const outputRelPath = relSliceFile(base, mid, sid, "PLAN");
1278
1346
  const commitInstruction = "Do not commit — .gsd/ planning docs are managed externally and not tracked in git.";
1279
- return loadPrompt("plan-slice", {
1347
+
1348
+ return loadPrompt(promptTemplate, {
1280
1349
  workingDirectory: base,
1281
1350
  milestoneId: mid, sliceId: sid, sliceTitle: sTitle,
1282
1351
  slicePath: relSlicePath(base, mid, sid),
@@ -1295,6 +1364,68 @@ export async function buildPlanSlicePrompt(
1295
1364
  sliceTitle: sTitle,
1296
1365
  extraContext: [inlinedContext, depContent],
1297
1366
  }),
1367
+ ...extraVars,
1368
+ });
1369
+ }
1370
+
1371
+ export async function buildPlanSlicePrompt(
1372
+ mid: string, _midTitle: string, sid: string, sTitle: string, base: string, level?: InlineLevel,
1373
+ options?: { softScopeHint?: string },
1374
+ ): Promise<string> {
1375
+ const prependBlocks: string[] = [];
1376
+ // ADR-011: when the refining-phase dispatch rule gracefully downgrades to
1377
+ // plan-slice (progressive_planning was toggled off mid-milestone), it
1378
+ // forwards the stored sketch_scope as a SOFT hint — context, not a hard
1379
+ // constraint. The planner is free to expand beyond it.
1380
+ if (options?.softScopeHint && options.softScopeHint.trim().length > 0) {
1381
+ prependBlocks.push(
1382
+ `## Prior Sketch Scope (soft hint — non-binding)\n\n${options.softScopeHint.trim()}\n\n` +
1383
+ `This scope was captured during an earlier progressive-planning pass that was later disabled. Treat it as context only — you may plan beyond it if the work genuinely requires more scope. Do NOT treat this as a hard boundary.`,
1384
+ );
1385
+ }
1386
+ return renderSlicePrompt({
1387
+ mid, sid, sTitle, base,
1388
+ level: level ?? resolveInlineLevel(),
1389
+ promptTemplate: "plan-slice",
1390
+ prependBlocks,
1391
+ });
1392
+ }
1393
+
1394
+ /**
1395
+ * ADR-011 refine-slice: expand a sketch into a full plan using the current
1396
+ * codebase state and prior slice summary. Mechanically similar to plan-slice
1397
+ * but framed as a *transformation* (sketch → full plan) rather than a
1398
+ * blank-sheet planning pass. Reuses inlineDependencySummaries for prior
1399
+ * slice SUMMARY and inlines the stored sketch_scope as a hard constraint.
1400
+ */
1401
+ export async function buildRefineSlicePrompt(
1402
+ mid: string, _midTitle: string, sid: string, sTitle: string, base: string, level?: InlineLevel,
1403
+ ): Promise<string> {
1404
+ // Pull the stored sketch scope from the DB — the hard constraint we plan within.
1405
+ let sketchScope = "";
1406
+ try {
1407
+ const { isDbAvailable, getSlice } = await import("./gsd-db.js");
1408
+ if (isDbAvailable()) {
1409
+ sketchScope = getSlice(mid, sid)?.sketch_scope ?? "";
1410
+ }
1411
+ } catch {
1412
+ sketchScope = "";
1413
+ }
1414
+
1415
+ const prependBlocks: string[] = [];
1416
+ if (sketchScope.trim().length > 0) {
1417
+ prependBlocks.push(
1418
+ `## Sketch Scope (hard constraint)\n\n${sketchScope.trim()}\n\n` +
1419
+ `Treat this as the authoritative boundary for the slice. Do not plan work outside this scope; if the scope is too narrow, surface it as a deviation rather than expanding silently.`,
1420
+ );
1421
+ }
1422
+
1423
+ return renderSlicePrompt({
1424
+ mid, sid, sTitle, base,
1425
+ level: level ?? resolveInlineLevel(),
1426
+ promptTemplate: "refine-slice",
1427
+ prependBlocks,
1428
+ extraVars: { sketchScope },
1298
1429
  });
1299
1430
  }
1300
1431
 
@@ -1412,7 +1543,28 @@ export async function buildExecuteTaskPrompt(
1412
1543
  ? `### Runtime Context\nSource: \`.gsd/RUNTIME.md\`\n\n${runtimeContent.trim()}`
1413
1544
  : "";
1414
1545
 
1415
- const phaseAnchorSection = planAnchor ? formatAnchorForPrompt(planAnchor) : "";
1546
+ let phaseAnchorSection = planAnchor ? formatAnchorForPrompt(planAnchor) : "";
1547
+
1548
+ // ADR-011 Phase 2: inject any resolved-but-unapplied escalation override
1549
+ // into this task's prompt. Claim is atomic via DB UPDATE WHERE IS NULL, so
1550
+ // if a parallel build already injected it, we skip. Feature-gated by
1551
+ // phases.mid_execution_escalation. Prepended to phaseAnchorSection so it
1552
+ // appears near the top of the prompt above planning anchors.
1553
+ if (prefs?.preferences?.phases?.mid_execution_escalation === true) {
1554
+ try {
1555
+ const { claimOverrideForInjection } = await import("./escalation.js");
1556
+ const claimed = claimOverrideForInjection(base, mid, sid);
1557
+ if (claimed) {
1558
+ const block = claimed.injectionBlock + "\n\n---\n\n";
1559
+ phaseAnchorSection = phaseAnchorSection
1560
+ ? `${block}${phaseAnchorSection}`
1561
+ : block;
1562
+ }
1563
+ } catch (escalationErr) {
1564
+ // Escalation module unavailable or threw — log and proceed.
1565
+ logWarning("prompt", `escalation override injection failed: ${(escalationErr as Error).message}`);
1566
+ }
1567
+ }
1416
1568
 
1417
1569
  // Task-scoped gates owned by execute-task (Q5/Q6/Q7). Pull only the
1418
1570
  // gates that plan-slice actually seeded for this task — tasks with no
@@ -1593,6 +1745,14 @@ export async function buildCompleteMilestonePrompt(
1593
1745
 
1594
1746
  const milestoneSummaryPath = join(base, `${relMilestonePath(base, mid)}/${mid}-SUMMARY.md`);
1595
1747
 
1748
+ const learningsRelPath = join(relMilestonePath(base, mid), `${mid}-LEARNINGS.md`);
1749
+ const learningsAbsPath = join(base, learningsRelPath);
1750
+ const extractLearningsSteps = buildExtractionStepsBlock({
1751
+ milestoneId: mid,
1752
+ outputPath: learningsAbsPath,
1753
+ relativeOutputPath: learningsRelPath,
1754
+ });
1755
+
1596
1756
  return loadPrompt("complete-milestone", {
1597
1757
  workingDirectory: base,
1598
1758
  milestoneId: mid,
@@ -1600,6 +1760,7 @@ export async function buildCompleteMilestonePrompt(
1600
1760
  roadmapPath: roadmapRel,
1601
1761
  inlinedContext,
1602
1762
  milestoneSummaryPath,
1763
+ extractLearningsSteps,
1603
1764
  skillActivation: buildSkillActivationBlock({
1604
1765
  base,
1605
1766
  milestoneId: mid,
@@ -261,6 +261,45 @@ export function verifyExpectedArtifact(
261
261
  return true;
262
262
  }
263
263
 
264
+ // #4414: research-slice parallel-research sentinel. The unitId
265
+ // `{mid}/parallel-research` is not a real slice — it triggers a single agent
266
+ // that fans out research across multiple slices. Verify success by checking
267
+ // that every slice which was "research-ready" in the roadmap now has a
268
+ // RESEARCH file. Without this, resolveExpectedArtifactPath returns null and
269
+ // the retry/escalation machinery silently re-dispatches forever.
270
+ //
271
+ // NOTE: this predicate mirrors the dispatch rule at
272
+ // auto-dispatch.ts parallel-research-slices — keep the two in sync.
273
+ if (unitType === "research-slice" && unitId.endsWith("/parallel-research")) {
274
+ const { milestone: mid } = parseUnitId(unitId);
275
+ if (!mid) return false;
276
+ const roadmapFile = resolveMilestoneFile(base, mid, "ROADMAP");
277
+ if (!roadmapFile || !existsSync(roadmapFile)) {
278
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: roadmap missing`);
279
+ return false;
280
+ }
281
+ try {
282
+ const roadmap = parseLegacyRoadmap(readFileSync(roadmapFile, "utf-8"));
283
+ const milestoneResearchFile = resolveMilestoneFile(base, mid, "RESEARCH");
284
+ for (const slice of roadmap.slices) {
285
+ if (slice.done) continue;
286
+ if (milestoneResearchFile && slice.id === "S01") continue;
287
+ const depsComplete = (slice.depends ?? []).every((depId) =>
288
+ !!resolveSliceFile(base, mid, depId, "SUMMARY"),
289
+ );
290
+ if (!depsComplete) continue;
291
+ if (!resolveSliceFile(base, mid, slice.id, "RESEARCH")) {
292
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: slice ${slice.id} missing RESEARCH`);
293
+ return false;
294
+ }
295
+ }
296
+ return true;
297
+ } catch (err) {
298
+ logWarning("recovery", `parallel-research verification failed: ${err instanceof Error ? err.message : String(err)}`);
299
+ return false;
300
+ }
301
+ }
302
+
264
303
  const absPath = resolveExpectedArtifactPath(unitType, unitId, base);
265
304
  // For unit types with no verifiable artifact (null path), the parent directory
266
305
  // is missing on disk — treat as stale completion state so the key gets evicted (#313).
@@ -455,6 +494,14 @@ export function writeBlockerPlaceholder(
455
494
  ].join("\n");
456
495
  writeFileSync(absPath, content, "utf-8");
457
496
 
497
+ // #4414: Clear caches so subsequent dispatch guards (e.g.
498
+ // resolveMilestoneFile) see the placeholder file. Without this, the
499
+ // cached directory listing is stale and the dispatch rule re-fires,
500
+ // producing an infinite loop despite the placeholder being on disk.
501
+ // Matches the pattern used in verifyExpectedArtifact above.
502
+ clearPathCache();
503
+ clearParseCache();
504
+
458
505
  // Mark the task/slice as complete in the DB so verifyExpectedArtifact passes.
459
506
  // Without this, the DB status stays "pending" and the dispatch loop
460
507
  // re-derives the same unit indefinitely (#2531, #2653).
@@ -462,7 +509,22 @@ export function writeBlockerPlaceholder(
462
509
  const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
463
510
  const ts = new Date().toISOString();
464
511
  if (unitType === "execute-task" && mid && sid && tid) {
465
- try { updateTaskStatus(mid, sid, tid, "complete", ts); } catch (e) { logWarning("recovery", `updateTaskStatus failed during context exhaustion: ${e instanceof Error ? e.message : String(e)}`); }
512
+ try {
513
+ updateTaskStatus(mid, sid, tid, "complete", ts);
514
+ const planPath = resolveSliceFile(base, mid, sid, "PLAN");
515
+ if (planPath && existsSync(planPath)) {
516
+ const planContent = readFileSync(planPath, "utf-8");
517
+ const updatedPlan = planContent.replace(
518
+ new RegExp(`^(\\s*-\\s+)\\[ \\]\\s+\\*\\*${tid}:`, "m"),
519
+ `$1[x] **${tid}:`,
520
+ );
521
+ if (updatedPlan !== planContent) {
522
+ atomicWriteSync(planPath, updatedPlan);
523
+ }
524
+ }
525
+ } catch (e) {
526
+ logWarning("recovery", `updateTaskStatus failed during context exhaustion: ${e instanceof Error ? e.message : String(e)}`);
527
+ }
466
528
  // Append event so worktree reconciliation can replay this recovery completion
467
529
  try { appendEvent(base, { cmd: "complete-task", params: { milestoneId: mid, sliceId: sid, taskId: tid }, ts, actor: "system", trigger_reason: "blocker-placeholder-recovery" }); } catch (e) { logWarning("recovery", `appendEvent failed for task recovery: ${e instanceof Error ? e.message : String(e)}`); }
468
530
  }
@@ -464,11 +464,12 @@ export async function bootstrapAutoSession(
464
464
  // Detect survivor milestone branches in both pre-planning and complete phases.
465
465
  // In phase=complete, the milestone artifacts exist but finalization (merge,
466
466
  // worktree cleanup) was never run — the survivor branch must be merged.
467
+ // Applies to both worktree and branch isolation modes.
467
468
  let hasSurvivorBranch = false;
468
469
  if (
469
470
  state.activeMilestone &&
470
471
  (state.phase === "pre-planning" || state.phase === "complete") &&
471
- shouldUseWorktreeIsolation() &&
472
+ getIsolationMode() !== "none" &&
472
473
  !detectWorktreeName(base) &&
473
474
  !base.includes(`${pathSep}.gsd${pathSep}worktrees${pathSep}`)
474
475
  ) {
@@ -711,7 +712,7 @@ export async function bootstrapAutoSession(
711
712
 
712
713
  if (
713
714
  s.currentMilestoneId &&
714
- shouldUseWorktreeIsolation() &&
715
+ getIsolationMode() !== "none" &&
715
716
  !detectWorktreeName(base) &&
716
717
  !isUnderGsdWorktrees(base)
717
718
  ) {
@@ -837,10 +838,11 @@ export async function bootstrapAutoSession(
837
838
  const bannerPrefs = loadEffectiveGSDPreferences()?.preferences;
838
839
  const effectiveProvider = s.autoModeStartModel?.provider ?? ctx.model?.provider;
839
840
  const effectivelyEnabled = routingConfig.enabled
840
- && !(effectiveProvider && isFlatRateProvider(
841
- effectiveProvider,
842
- buildFlatRateContext(effectiveProvider, ctx, bannerPrefs),
843
- ));
841
+ && (routingConfig.allow_flat_rate_providers
842
+ || !(effectiveProvider && isFlatRateProvider(
843
+ effectiveProvider,
844
+ buildFlatRateContext(effectiveProvider, ctx, bannerPrefs),
845
+ )));
844
846
 
845
847
  // The actual ceiling may come from tier_models.heavy, not the start model.
846
848
  const effectiveCeiling = (routingConfig.enabled && routingConfig.tier_models?.heavy)
@@ -5,9 +5,9 @@
5
5
  * dependency audits, handles auto-fix retry logic, and writes
6
6
  * verification evidence JSON.
7
7
  *
8
- * Extracted from handleAgentEnd() in auto.ts. Returns a sentinel
9
- * value instead of calling return/pauseAuto directly — the caller
10
- * checks the result and handles control flow.
8
+ * Extracted from the pre-loop agent_end handler in auto.ts. Returns a
9
+ * sentinel value instead of calling return/pauseAuto directly — the
10
+ * caller checks the result and handles control flow.
11
11
  */
12
12
 
13
13
  import type { ExtensionContext, ExtensionAPI } from "@gsd/pi-coding-agent";
@@ -60,6 +60,7 @@ import {
60
60
  nativeAddPaths,
61
61
  nativeRmForce,
62
62
  nativeBranchDelete,
63
+ nativeBranchForceReset,
63
64
  nativeBranchExists,
64
65
  nativeDiffNumstat,
65
66
  nativeUpdateRef,
@@ -921,10 +922,74 @@ export function runWorktreePostCreateHook(
921
922
 
922
923
  // ─── Auto-Worktree Branch Naming ───────────────────────────────────────────
923
924
 
925
+ /** Returns the git branch name for a milestone worktree (`milestone/<MID>`). */
924
926
  export function autoWorktreeBranch(milestoneId: string): string {
925
927
  return `milestone/${milestoneId}`;
926
928
  }
927
929
 
930
+ // ─── Branch-mode Entry ─────────────────────────────────────────────────────
931
+
932
+ /**
933
+ * Enter branch isolation mode for a milestone.
934
+ *
935
+ * Creates `milestone/<MID>` from the integration branch (if it doesn't
936
+ * exist yet) and checks out to it. No worktree directory is created — the
937
+ * project root is the working copy; only HEAD changes.
938
+ *
939
+ * Uses the same 3-tier integration-branch fallback as createAutoWorktree:
940
+ * 1. META.json recorded integration branch
941
+ * 2. git.main_branch preference
942
+ * 3. nativeDetectMainBranch (origin/HEAD auto-detection)
943
+ */
944
+ export function enterBranchModeForMilestone(
945
+ basePath: string,
946
+ milestoneId: string,
947
+ ): void {
948
+ const branch = autoWorktreeBranch(milestoneId);
949
+ const branchExists = nativeBranchExists(basePath, branch);
950
+
951
+ if (!branchExists) {
952
+ // Create the milestone branch from the integration branch start-point.
953
+ const integrationBranch =
954
+ readIntegrationBranch(basePath, milestoneId) ?? undefined;
955
+ const gitPrefs = loadEffectiveGSDPreferences()?.preferences?.git;
956
+ // Validate main_branch preference exists in the repo before using it —
957
+ // a stale preference (e.g. "master" when repo uses "main") would cause
958
+ // nativeBranchForceReset to fail with a bad start-point reference.
959
+ const validatedPrefBranch =
960
+ gitPrefs?.main_branch &&
961
+ typeof gitPrefs.main_branch === "string" &&
962
+ gitPrefs.main_branch.length > 0 &&
963
+ nativeBranchExists(basePath, gitPrefs.main_branch)
964
+ ? gitPrefs.main_branch
965
+ : undefined;
966
+ const startPoint =
967
+ integrationBranch ??
968
+ validatedPrefBranch ??
969
+ nativeDetectMainBranch(basePath);
970
+
971
+ // nativeBranchForceReset creates (or resets) branch at startPoint,
972
+ // then checkout switches HEAD to it.
973
+ nativeBranchForceReset(basePath, branch, startPoint);
974
+ debugLog("auto-worktree", {
975
+ action: "enterBranchMode",
976
+ milestoneId,
977
+ branch,
978
+ startPoint,
979
+ created: true,
980
+ });
981
+ } else {
982
+ debugLog("auto-worktree", {
983
+ action: "enterBranchMode",
984
+ milestoneId,
985
+ branch,
986
+ reused: true,
987
+ });
988
+ }
989
+
990
+ nativeCheckoutBranch(basePath, branch);
991
+ }
992
+
928
993
  // ─── Public API ────────────────────────────────────────────────────────────
929
994
 
930
995
  /**