gsd-pi 2.75.0-next.9c0ec0ba1 → 2.76.0-dev.b072ebb73

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 (680) hide show
  1. package/README.md +145 -125
  2. package/dist/claude-cli-check.d.ts +10 -0
  3. package/dist/claude-cli-check.js +13 -3
  4. package/dist/onboarding.d.ts +20 -1
  5. package/dist/onboarding.js +60 -25
  6. package/dist/resources/agents/researcher.md +1 -1
  7. package/dist/resources/extensions/ask-user-questions.js +6 -3
  8. package/dist/resources/extensions/claude-code-cli/readiness.js +34 -2
  9. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +44 -2
  10. package/dist/resources/extensions/gsd/auto/phases.js +48 -6
  11. package/dist/resources/extensions/gsd/auto-artifact-paths.js +20 -0
  12. package/dist/resources/extensions/gsd/auto-dashboard.js +37 -8
  13. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +8 -2
  14. package/dist/resources/extensions/gsd/auto-dispatch.js +87 -9
  15. package/dist/resources/extensions/gsd/auto-model-selection.js +27 -6
  16. package/dist/resources/extensions/gsd/auto-post-unit.js +7 -5
  17. package/dist/resources/extensions/gsd/auto-prompts.js +188 -44
  18. package/dist/resources/extensions/gsd/auto-recovery.js +48 -0
  19. package/dist/resources/extensions/gsd/auto-start.js +5 -3
  20. package/dist/resources/extensions/gsd/auto-verification.js +33 -0
  21. package/dist/resources/extensions/gsd/auto-worktree.js +71 -2
  22. package/dist/resources/extensions/gsd/auto.js +25 -3
  23. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +8 -21
  24. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +45 -23
  25. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +131 -0
  26. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +29 -0
  27. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +12 -0
  28. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +22 -0
  29. package/dist/resources/extensions/gsd/bootstrap/system-context.js +84 -10
  30. package/dist/resources/extensions/gsd/commands/catalog.js +15 -7
  31. package/dist/resources/extensions/gsd/commands/handlers/core.js +58 -24
  32. package/dist/resources/extensions/gsd/commands/handlers/escalate.js +171 -0
  33. package/dist/resources/extensions/gsd/commands/handlers/onboarding.js +159 -0
  34. package/dist/resources/extensions/gsd/commands/handlers/ops.js +10 -0
  35. package/dist/resources/extensions/gsd/commands-config.js +5 -0
  36. package/dist/resources/extensions/gsd/commands-extract-learnings.js +200 -77
  37. package/dist/resources/extensions/gsd/commands-memory.js +462 -0
  38. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +39 -11
  39. package/dist/resources/extensions/gsd/custom-workflow-engine.js +74 -54
  40. package/dist/resources/extensions/gsd/db-writer.js +89 -16
  41. package/dist/resources/extensions/gsd/docs/preferences-reference.md +2 -2
  42. package/dist/resources/extensions/gsd/doctor-environment.js +2 -1
  43. package/dist/resources/extensions/gsd/doctor-git-checks.js +50 -32
  44. package/dist/resources/extensions/gsd/doctor-proactive.js +4 -1
  45. package/dist/resources/extensions/gsd/doctor-providers.js +51 -5
  46. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -1
  47. package/dist/resources/extensions/gsd/doctor.js +7 -1
  48. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +1 -0
  49. package/dist/resources/extensions/gsd/error-classifier.js +5 -2
  50. package/dist/resources/extensions/gsd/escalation.js +321 -0
  51. package/dist/resources/extensions/gsd/graph.js +26 -0
  52. package/dist/resources/extensions/gsd/gsd-db.js +517 -32
  53. package/dist/resources/extensions/gsd/health-widget-core.js +42 -14
  54. package/dist/resources/extensions/gsd/health-widget.js +7 -4
  55. package/dist/resources/extensions/gsd/hook-emitter.js +108 -0
  56. package/dist/resources/extensions/gsd/init-wizard.js +86 -45
  57. package/dist/resources/extensions/gsd/markdown-renderer.js +5 -5
  58. package/dist/resources/extensions/gsd/memory-backfill.js +126 -0
  59. package/dist/resources/extensions/gsd/memory-embeddings.js +219 -0
  60. package/dist/resources/extensions/gsd/memory-extractor.js +78 -27
  61. package/dist/resources/extensions/gsd/memory-ingest.js +218 -0
  62. package/dist/resources/extensions/gsd/memory-relations.js +189 -0
  63. package/dist/resources/extensions/gsd/memory-source-store.js +113 -0
  64. package/dist/resources/extensions/gsd/memory-store.js +318 -6
  65. package/dist/resources/extensions/gsd/metrics.js +1 -0
  66. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  67. package/dist/resources/extensions/gsd/model-router.js +12 -5
  68. package/dist/resources/extensions/gsd/native-git-bridge.js +121 -5
  69. package/dist/resources/extensions/gsd/notification-overlay.js +7 -22
  70. package/dist/resources/extensions/gsd/notification-widget.js +24 -39
  71. package/dist/resources/extensions/gsd/onboarding-state.js +133 -0
  72. package/dist/resources/extensions/gsd/post-execution-checks.js +27 -11
  73. package/dist/resources/extensions/gsd/pre-execution-checks.js +98 -8
  74. package/dist/resources/extensions/gsd/preferences-models.js +1 -0
  75. package/dist/resources/extensions/gsd/preferences-types.js +2 -1
  76. package/dist/resources/extensions/gsd/preferences-validation.js +42 -8
  77. package/dist/resources/extensions/gsd/prompts/add-tests.md +1 -0
  78. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
  79. package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  80. package/dist/resources/extensions/gsd/prompts/debug-diagnose.md +2 -0
  81. package/dist/resources/extensions/gsd/prompts/execute-task.md +16 -3
  82. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
  83. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  84. package/dist/resources/extensions/gsd/prompts/refine-slice.md +69 -0
  85. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -0
  86. package/dist/resources/extensions/gsd/python-resolver.js +70 -0
  87. package/dist/resources/extensions/gsd/setup-catalog.js +75 -0
  88. package/dist/resources/extensions/gsd/state.js +90 -7
  89. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -1
  90. package/dist/resources/extensions/gsd/tools/complete-task.js +80 -0
  91. package/dist/resources/extensions/gsd/tools/memory-tools.js +331 -0
  92. package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -12
  93. package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -2
  94. package/dist/resources/extensions/gsd/tools/skip-slice.js +78 -0
  95. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +14 -0
  96. package/dist/resources/extensions/gsd/uok/flags.js +1 -1
  97. package/dist/resources/extensions/gsd/verification-gate.js +2 -1
  98. package/dist/resources/extensions/gsd/workflow-manifest.js +8 -0
  99. package/dist/resources/extensions/gsd/workflow-mcp.js +1 -0
  100. package/dist/resources/extensions/gsd/workflow-projections.js +17 -15
  101. package/dist/resources/extensions/gsd/workflow-templates/spike.md +6 -0
  102. package/dist/resources/extensions/gsd/worktree-resolver.js +42 -1
  103. package/dist/resources/extensions/remote-questions/manager.js +11 -1
  104. package/dist/resources/extensions/search-the-web/command-search-provider.js +4 -1
  105. package/dist/resources/extensions/search-the-web/native-search.js +13 -2
  106. package/dist/resources/skills/api-design/SKILL.md +190 -0
  107. package/dist/resources/skills/create-mcp-server/SKILL.md +121 -0
  108. package/dist/resources/skills/decompose-into-slices/SKILL.md +139 -0
  109. package/dist/resources/skills/dependency-upgrade/SKILL.md +158 -0
  110. package/dist/resources/skills/design-an-interface/SKILL.md +102 -0
  111. package/dist/resources/skills/forensics/SKILL.md +153 -0
  112. package/dist/resources/skills/grill-me/SKILL.md +93 -0
  113. package/dist/resources/skills/handoff/SKILL.md +121 -0
  114. package/dist/resources/skills/observability/SKILL.md +174 -0
  115. package/dist/resources/skills/security-review/SKILL.md +181 -0
  116. package/dist/resources/skills/spike-wrap-up/SKILL.md +138 -0
  117. package/dist/resources/skills/tdd/SKILL.md +112 -0
  118. package/dist/resources/skills/verify-before-complete/SKILL.md +97 -0
  119. package/dist/resources/skills/write-docs/SKILL.md +81 -0
  120. package/dist/resources/skills/write-milestone-brief/SKILL.md +135 -0
  121. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  122. package/dist/web/standalone/.next/BUILD_ID +1 -1
  123. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  124. package/dist/web/standalone/.next/build-manifest.json +3 -3
  125. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  126. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  127. package/dist/web/standalone/.next/required-server-files.json +1 -1
  128. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  130. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
  140. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  141. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  143. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  146. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  150. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  153. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  156. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  158. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  164. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  176. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  179. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  180. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  184. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  186. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  191. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  192. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  200. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  202. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  203. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  204. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  205. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  206. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  208. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  210. package/dist/web/standalone/.next/server/app/index.html +1 -1
  211. package/dist/web/standalone/.next/server/app/index.rsc +3 -3
  212. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  213. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
  214. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  215. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  216. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  217. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  218. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  219. package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
  220. package/dist/web/standalone/.next/server/chunks/7461.js +1 -0
  221. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  222. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  223. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  224. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  225. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  226. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  227. package/dist/web/standalone/.next/static/chunks/{2826.02df9631042cc18e.js → 2826.e59e8578e2e28639.js} +2 -2
  228. package/dist/web/standalone/.next/static/chunks/{2008.71ee9230ad78df21.js → 3621.fc7480022c972438.js} +2 -2
  229. package/dist/web/standalone/.next/static/chunks/app/{page-f1e30ab6bb269149.js → page-5b113fd32bc2a1c3.js} +1 -1
  230. package/dist/web/standalone/.next/static/chunks/{webpack-6c7cda3e318eedb6.js → webpack-5fc74f13a25fa1bb.js} +1 -1
  231. package/dist/web/standalone/.next/static/css/632cd626b1731d88.css +1 -0
  232. package/dist/web/standalone/server.js +1 -1
  233. package/dist/welcome-screen.js +48 -24
  234. package/package.json +1 -1
  235. package/packages/daemon/package.json +2 -2
  236. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  237. package/packages/mcp-server/dist/server.js +12 -10
  238. package/packages/mcp-server/dist/server.js.map +1 -1
  239. package/packages/mcp-server/dist/session-manager.d.ts.map +1 -1
  240. package/packages/mcp-server/dist/session-manager.js +8 -1
  241. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  242. package/packages/mcp-server/dist/workflow-tools.d.ts +2 -1
  243. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  244. package/packages/mcp-server/dist/workflow-tools.js +306 -71
  245. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  246. package/packages/mcp-server/package.json +2 -2
  247. package/packages/mcp-server/src/mcp-server.test.ts +40 -4
  248. package/packages/mcp-server/src/server.ts +12 -10
  249. package/packages/mcp-server/src/session-manager.ts +10 -3
  250. package/packages/mcp-server/src/workflow-tools.test.ts +346 -1
  251. package/packages/mcp-server/src/workflow-tools.ts +359 -75
  252. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  253. package/packages/native/package.json +1 -1
  254. package/packages/pi-agent-core/dist/agent-loop.js +12 -0
  255. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  256. package/packages/pi-agent-core/dist/types.d.ts +30 -0
  257. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  258. package/packages/pi-agent-core/dist/types.js.map +1 -1
  259. package/packages/pi-agent-core/package.json +1 -1
  260. package/packages/pi-agent-core/src/agent-loop.ts +14 -0
  261. package/packages/pi-agent-core/src/types.ts +34 -0
  262. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  263. package/packages/pi-ai/dist/index.d.ts +1 -0
  264. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  265. package/packages/pi-ai/dist/index.js +1 -0
  266. package/packages/pi-ai/dist/index.js.map +1 -1
  267. package/packages/pi-ai/dist/models/generated/index.d.ts +17 -0
  268. package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
  269. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
  270. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
  271. package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
  272. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
  273. package/packages/pi-ai/dist/models.generated.test.js +1 -0
  274. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  275. package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts +22 -1
  276. package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  277. package/packages/pi-ai/dist/providers/amazon-bedrock.js +40 -7
  278. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  279. package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts +2 -0
  280. package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts.map +1 -0
  281. package/packages/pi-ai/dist/providers/amazon-bedrock.test.js +106 -0
  282. package/packages/pi-ai/dist/providers/amazon-bedrock.test.js.map +1 -0
  283. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +42 -1
  284. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  285. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.d.ts +2 -0
  286. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.d.ts.map +1 -0
  287. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +13 -0
  288. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -0
  289. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts +19 -0
  290. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  291. package/packages/pi-ai/dist/providers/anthropic-shared.js +25 -1
  292. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  293. package/packages/pi-ai/dist/providers/anthropic.d.ts +11 -0
  294. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  295. package/packages/pi-ai/dist/providers/anthropic.js +23 -2
  296. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  297. package/packages/pi-ai/dist/providers/api-family.d.ts +27 -0
  298. package/packages/pi-ai/dist/providers/api-family.d.ts.map +1 -0
  299. package/packages/pi-ai/dist/providers/api-family.js +47 -0
  300. package/packages/pi-ai/dist/providers/api-family.js.map +1 -0
  301. package/packages/pi-ai/dist/providers/api-family.test.d.ts +2 -0
  302. package/packages/pi-ai/dist/providers/api-family.test.d.ts.map +1 -0
  303. package/packages/pi-ai/dist/providers/api-family.test.js +101 -0
  304. package/packages/pi-ai/dist/providers/api-family.test.js.map +1 -0
  305. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  306. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +12 -2
  307. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  308. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +164 -14
  309. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  310. package/packages/pi-ai/dist/utils/oauth/google-antigravity.d.ts.map +1 -1
  311. package/packages/pi-ai/dist/utils/oauth/google-antigravity.js +15 -3
  312. package/packages/pi-ai/dist/utils/oauth/google-antigravity.js.map +1 -1
  313. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.d.ts +2 -0
  314. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.d.ts.map +1 -0
  315. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +67 -0
  316. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -0
  317. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.d.ts.map +1 -1
  318. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js +16 -3
  319. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js.map +1 -1
  320. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.d.ts +2 -0
  321. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.d.ts.map +1 -0
  322. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +67 -0
  323. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -0
  324. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts +2 -0
  325. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts.map +1 -0
  326. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js +289 -0
  327. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js.map +1 -0
  328. package/packages/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
  329. package/packages/pi-ai/dist/utils/oauth/openai-codex.js +12 -0
  330. package/packages/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
  331. package/packages/pi-ai/package.json +1 -1
  332. package/packages/pi-ai/scripts/generate-models.ts +12 -0
  333. package/packages/pi-ai/src/index.ts +1 -0
  334. package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
  335. package/packages/pi-ai/src/models.generated.test.ts +1 -0
  336. package/packages/pi-ai/src/providers/amazon-bedrock.test.ts +164 -0
  337. package/packages/pi-ai/src/providers/amazon-bedrock.ts +41 -8
  338. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +47 -1
  339. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -0
  340. package/packages/pi-ai/src/providers/anthropic-shared.ts +30 -1
  341. package/packages/pi-ai/src/providers/anthropic.ts +25 -2
  342. package/packages/pi-ai/src/providers/api-family.test.ts +129 -0
  343. package/packages/pi-ai/src/providers/api-family.ts +57 -0
  344. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +200 -23
  345. package/packages/pi-ai/src/utils/oauth/github-copilot.ts +12 -2
  346. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +84 -0
  347. package/packages/pi-ai/src/utils/oauth/google-antigravity.ts +15 -5
  348. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +84 -0
  349. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.ts +16 -5
  350. package/packages/pi-ai/src/utils/oauth/oauth-providers.test.ts +363 -0
  351. package/packages/pi-ai/src/utils/oauth/openai-codex.ts +15 -0
  352. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  353. package/packages/pi-coding-agent/dist/cli/args.d.ts +6 -0
  354. package/packages/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
  355. package/packages/pi-coding-agent/dist/cli/args.js +14 -4
  356. package/packages/pi-coding-agent/dist/cli/args.js.map +1 -1
  357. package/packages/pi-coding-agent/dist/cli/args.test.d.ts +2 -0
  358. package/packages/pi-coding-agent/dist/cli/args.test.d.ts.map +1 -0
  359. package/packages/pi-coding-agent/dist/cli/args.test.js +38 -0
  360. package/packages/pi-coding-agent/dist/cli/args.test.js.map +1 -0
  361. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  362. package/packages/pi-coding-agent/dist/core/agent-session.js +25 -2
  363. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  364. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +7 -0
  365. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  366. package/packages/pi-coding-agent/dist/core/auth-storage.js +25 -0
  367. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  368. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +38 -0
  369. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  370. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +4 -1
  371. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  372. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  373. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  374. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  375. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  376. package/packages/pi-coding-agent/dist/core/extensions/loader.js +4 -0
  377. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  378. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +34 -2
  379. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  380. package/packages/pi-coding-agent/dist/core/extensions/runner.js +233 -0
  381. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  382. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +200 -3
  383. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  384. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  385. package/packages/pi-coding-agent/dist/core/hooks-runner.d.ts +53 -0
  386. package/packages/pi-coding-agent/dist/core/hooks-runner.d.ts.map +1 -0
  387. package/packages/pi-coding-agent/dist/core/hooks-runner.js +337 -0
  388. package/packages/pi-coding-agent/dist/core/hooks-runner.js.map +1 -0
  389. package/packages/pi-coding-agent/dist/core/hooks-runner.test.d.ts +2 -0
  390. package/packages/pi-coding-agent/dist/core/hooks-runner.test.d.ts.map +1 -0
  391. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +234 -0
  392. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -0
  393. package/packages/pi-coding-agent/dist/core/index.d.ts +1 -0
  394. package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
  395. package/packages/pi-coding-agent/dist/core/index.js +1 -0
  396. package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
  397. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.d.ts +2 -0
  398. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.d.ts.map +1 -0
  399. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.js +40 -0
  400. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.js.map +1 -0
  401. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +32 -0
  402. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  403. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  404. package/packages/pi-coding-agent/dist/core/retry-handler.js +4 -1
  405. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  406. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -0
  407. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  408. package/packages/pi-coding-agent/dist/core/sdk.js +33 -5
  409. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  410. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +55 -0
  411. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  412. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  413. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  414. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  415. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  416. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  417. package/packages/pi-coding-agent/dist/main.js +3 -0
  418. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  419. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  420. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +17 -7
  421. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  422. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  423. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +48 -34
  424. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  425. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts +4 -0
  426. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  427. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +83 -33
  428. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  429. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +1 -0
  430. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  431. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +1 -0
  432. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  433. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
  434. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  435. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  436. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  437. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +13 -9
  438. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  439. package/packages/pi-coding-agent/package.json +1 -1
  440. package/packages/pi-coding-agent/src/cli/args.test.ts +44 -0
  441. package/packages/pi-coding-agent/src/cli/args.ts +21 -6
  442. package/packages/pi-coding-agent/src/core/agent-session.ts +27 -2
  443. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +42 -0
  444. package/packages/pi-coding-agent/src/core/auth-storage.ts +25 -0
  445. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +4 -1
  446. package/packages/pi-coding-agent/src/core/extensions/index.ts +16 -0
  447. package/packages/pi-coding-agent/src/core/extensions/loader.ts +5 -0
  448. package/packages/pi-coding-agent/src/core/extensions/runner.ts +353 -1
  449. package/packages/pi-coding-agent/src/core/extensions/types.ts +253 -2
  450. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +269 -0
  451. package/packages/pi-coding-agent/src/core/hooks-runner.ts +460 -0
  452. package/packages/pi-coding-agent/src/core/index.ts +10 -0
  453. package/packages/pi-coding-agent/src/core/model-registry-auth-header.test.ts +44 -0
  454. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +37 -1
  455. package/packages/pi-coding-agent/src/core/retry-handler.ts +4 -1
  456. package/packages/pi-coding-agent/src/core/sdk.ts +48 -5
  457. package/packages/pi-coding-agent/src/core/settings-manager.ts +57 -0
  458. package/packages/pi-coding-agent/src/index.ts +16 -0
  459. package/packages/pi-coding-agent/src/main.ts +4 -0
  460. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +19 -7
  461. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +53 -31
  462. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +88 -36
  463. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +1 -0
  464. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +1 -0
  465. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +13 -9
  466. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  467. package/packages/pi-tui/package.json +1 -1
  468. package/packages/rpc-client/package.json +1 -1
  469. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +1 -0
  470. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  471. package/pkg/dist/modes/interactive/theme/theme-schema.js +1 -0
  472. package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  473. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
  474. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  475. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  476. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  477. package/pkg/dist/modes/interactive/theme/themes.js +13 -9
  478. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  479. package/pkg/package.json +1 -1
  480. package/src/resources/agents/researcher.md +1 -1
  481. package/src/resources/extensions/ask-user-questions.ts +7 -4
  482. package/src/resources/extensions/claude-code-cli/readiness.ts +36 -2
  483. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +59 -1
  484. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +66 -0
  485. package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -10
  486. package/src/resources/extensions/gsd/auto/phases.ts +52 -6
  487. package/src/resources/extensions/gsd/auto-artifact-paths.ts +20 -0
  488. package/src/resources/extensions/gsd/auto-dashboard.ts +46 -5
  489. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +15 -2
  490. package/src/resources/extensions/gsd/auto-dispatch.ts +96 -4
  491. package/src/resources/extensions/gsd/auto-model-selection.ts +37 -6
  492. package/src/resources/extensions/gsd/auto-post-unit.ts +7 -5
  493. package/src/resources/extensions/gsd/auto-prompts.ts +225 -45
  494. package/src/resources/extensions/gsd/auto-recovery.ts +47 -0
  495. package/src/resources/extensions/gsd/auto-start.ts +8 -6
  496. package/src/resources/extensions/gsd/auto-verification.ts +33 -0
  497. package/src/resources/extensions/gsd/auto-worktree.ts +81 -1
  498. package/src/resources/extensions/gsd/auto.ts +27 -2
  499. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +8 -21
  500. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +46 -24
  501. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +163 -0
  502. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +31 -0
  503. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +15 -0
  504. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
  505. package/src/resources/extensions/gsd/bootstrap/system-context.ts +89 -10
  506. package/src/resources/extensions/gsd/commands/catalog.ts +15 -7
  507. package/src/resources/extensions/gsd/commands/handlers/core.ts +63 -27
  508. package/src/resources/extensions/gsd/commands/handlers/escalate.ts +216 -0
  509. package/src/resources/extensions/gsd/commands/handlers/onboarding.ts +196 -0
  510. package/src/resources/extensions/gsd/commands/handlers/ops.ts +10 -0
  511. package/src/resources/extensions/gsd/commands-config.ts +10 -0
  512. package/src/resources/extensions/gsd/commands-extract-learnings.ts +262 -78
  513. package/src/resources/extensions/gsd/commands-memory.ts +551 -0
  514. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +48 -11
  515. package/src/resources/extensions/gsd/custom-workflow-engine.ts +85 -60
  516. package/src/resources/extensions/gsd/db-writer.ts +91 -17
  517. package/src/resources/extensions/gsd/docs/preferences-reference.md +2 -2
  518. package/src/resources/extensions/gsd/doctor-environment.ts +2 -1
  519. package/src/resources/extensions/gsd/doctor-git-checks.ts +51 -30
  520. package/src/resources/extensions/gsd/doctor-proactive.ts +4 -1
  521. package/src/resources/extensions/gsd/doctor-providers.ts +59 -6
  522. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -1
  523. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  524. package/src/resources/extensions/gsd/doctor.ts +7 -1
  525. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +2 -0
  526. package/src/resources/extensions/gsd/error-classifier.ts +5 -2
  527. package/src/resources/extensions/gsd/escalation.ts +367 -0
  528. package/src/resources/extensions/gsd/graph.ts +33 -0
  529. package/src/resources/extensions/gsd/gsd-db.ts +617 -32
  530. package/src/resources/extensions/gsd/health-widget-core.ts +43 -14
  531. package/src/resources/extensions/gsd/health-widget.ts +7 -3
  532. package/src/resources/extensions/gsd/hook-emitter.ts +188 -0
  533. package/src/resources/extensions/gsd/init-wizard.ts +87 -54
  534. package/src/resources/extensions/gsd/markdown-renderer.ts +5 -5
  535. package/src/resources/extensions/gsd/memory-backfill.ts +140 -0
  536. package/src/resources/extensions/gsd/memory-embeddings.ts +235 -0
  537. package/src/resources/extensions/gsd/memory-extractor.ts +100 -34
  538. package/src/resources/extensions/gsd/memory-ingest.ts +286 -0
  539. package/src/resources/extensions/gsd/memory-relations.ts +240 -0
  540. package/src/resources/extensions/gsd/memory-source-store.ts +138 -0
  541. package/src/resources/extensions/gsd/memory-store.ts +377 -7
  542. package/src/resources/extensions/gsd/metrics.ts +1 -0
  543. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  544. package/src/resources/extensions/gsd/model-router.ts +21 -5
  545. package/src/resources/extensions/gsd/native-git-bridge.ts +118 -6
  546. package/src/resources/extensions/gsd/notification-overlay.ts +9 -19
  547. package/src/resources/extensions/gsd/notification-widget.ts +25 -43
  548. package/src/resources/extensions/gsd/onboarding-state.ts +146 -0
  549. package/src/resources/extensions/gsd/post-execution-checks.ts +37 -14
  550. package/src/resources/extensions/gsd/pre-execution-checks.ts +100 -12
  551. package/src/resources/extensions/gsd/preferences-models.ts +1 -0
  552. package/src/resources/extensions/gsd/preferences-types.ts +9 -1
  553. package/src/resources/extensions/gsd/preferences-validation.ts +33 -7
  554. package/src/resources/extensions/gsd/prompts/add-tests.md +1 -0
  555. package/src/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
  556. package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  557. package/src/resources/extensions/gsd/prompts/debug-diagnose.md +2 -0
  558. package/src/resources/extensions/gsd/prompts/execute-task.md +16 -3
  559. package/src/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
  560. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  561. package/src/resources/extensions/gsd/prompts/refine-slice.md +69 -0
  562. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -0
  563. package/src/resources/extensions/gsd/python-resolver.ts +76 -0
  564. package/src/resources/extensions/gsd/setup-catalog.ts +105 -0
  565. package/src/resources/extensions/gsd/state.ts +95 -6
  566. package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -1
  567. package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +7 -0
  568. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +49 -0
  569. package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +63 -0
  570. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +95 -1
  571. package/src/resources/extensions/gsd/tests/auto-prompts-fallback.test.ts +35 -0
  572. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +123 -1
  573. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +39 -0
  574. package/src/resources/extensions/gsd/tests/bundled-skill-triggers.test.ts +54 -0
  575. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +335 -21
  576. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +6 -8
  577. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  578. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +63 -0
  579. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +42 -0
  580. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +8 -4
  581. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +117 -3
  582. package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +5 -0
  583. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +306 -1
  584. package/src/resources/extensions/gsd/tests/escalation.test.ts +818 -0
  585. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +145 -8
  586. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +62 -0
  587. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -1
  588. package/src/resources/extensions/gsd/tests/health-widget.test.ts +8 -2
  589. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +190 -0
  590. package/src/resources/extensions/gsd/tests/integration/doctor-git-symlink-cwd.test.ts +90 -0
  591. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +117 -0
  592. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +44 -0
  593. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +32 -1
  594. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +72 -5
  595. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +2 -2
  596. package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
  597. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +1 -1
  598. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +35 -0
  599. package/src/resources/extensions/gsd/tests/load-memory-block.test.ts +36 -0
  600. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  601. package/src/resources/extensions/gsd/tests/memory-embeddings.test.ts +213 -0
  602. package/src/resources/extensions/gsd/tests/memory-ingest.test.ts +153 -0
  603. package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +107 -0
  604. package/src/resources/extensions/gsd/tests/memory-relations.test.ts +175 -0
  605. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  606. package/src/resources/extensions/gsd/tests/memory-tools.test.ts +295 -0
  607. package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +3 -2
  608. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +2 -2
  609. package/src/resources/extensions/gsd/tests/model-router.test.ts +51 -1
  610. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +59 -0
  611. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +56 -37
  612. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +1 -1
  613. package/src/resources/extensions/gsd/tests/onboarding-state.test.ts +105 -0
  614. package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +114 -0
  615. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +4 -5
  616. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +17 -0
  617. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -1
  618. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +317 -1
  619. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +539 -0
  620. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +11 -2
  621. package/src/resources/extensions/gsd/tests/projection-regression.test.ts +7 -0
  622. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +159 -8
  623. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +24 -0
  624. package/src/resources/extensions/gsd/tests/prompts-no-gitignored-test-refs.test.ts +56 -0
  625. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +41 -4
  626. package/src/resources/extensions/gsd/tests/python-resolver.test.ts +131 -0
  627. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +67 -0
  628. package/src/resources/extensions/gsd/tests/requirements.test.ts +9 -0
  629. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +153 -0
  630. package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +125 -0
  631. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +16 -4
  632. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +54 -0
  633. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +3 -0
  634. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +5 -0
  635. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +2 -1
  636. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +1 -1
  637. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +9 -3
  638. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +35 -0
  639. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +7 -0
  640. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +97 -0
  641. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +2 -1
  642. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +77 -2
  643. package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
  644. package/src/resources/extensions/gsd/tools/memory-tools.ts +410 -0
  645. package/src/resources/extensions/gsd/tools/plan-milestone.ts +42 -8
  646. package/src/resources/extensions/gsd/tools/plan-slice.ts +6 -1
  647. package/src/resources/extensions/gsd/tools/skip-slice.ts +133 -0
  648. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +14 -0
  649. package/src/resources/extensions/gsd/types.ts +62 -0
  650. package/src/resources/extensions/gsd/uok/contracts.ts +2 -1
  651. package/src/resources/extensions/gsd/uok/flags.ts +1 -1
  652. package/src/resources/extensions/gsd/verification-gate.ts +2 -1
  653. package/src/resources/extensions/gsd/workflow-logger.ts +4 -1
  654. package/src/resources/extensions/gsd/workflow-manifest.ts +8 -0
  655. package/src/resources/extensions/gsd/workflow-mcp.ts +1 -0
  656. package/src/resources/extensions/gsd/workflow-projections.ts +18 -16
  657. package/src/resources/extensions/gsd/workflow-templates/spike.md +6 -0
  658. package/src/resources/extensions/gsd/worktree-resolver.ts +47 -1
  659. package/src/resources/extensions/remote-questions/manager.ts +13 -1
  660. package/src/resources/extensions/remote-questions/tests/remote-answer-normalization.test.ts +92 -0
  661. package/src/resources/extensions/search-the-web/command-search-provider.ts +4 -1
  662. package/src/resources/extensions/search-the-web/native-search.ts +13 -3
  663. package/src/resources/skills/api-design/SKILL.md +190 -0
  664. package/src/resources/skills/create-mcp-server/SKILL.md +121 -0
  665. package/src/resources/skills/decompose-into-slices/SKILL.md +139 -0
  666. package/src/resources/skills/dependency-upgrade/SKILL.md +158 -0
  667. package/src/resources/skills/design-an-interface/SKILL.md +102 -0
  668. package/src/resources/skills/forensics/SKILL.md +153 -0
  669. package/src/resources/skills/grill-me/SKILL.md +93 -0
  670. package/src/resources/skills/handoff/SKILL.md +121 -0
  671. package/src/resources/skills/observability/SKILL.md +174 -0
  672. package/src/resources/skills/security-review/SKILL.md +181 -0
  673. package/src/resources/skills/spike-wrap-up/SKILL.md +138 -0
  674. package/src/resources/skills/tdd/SKILL.md +112 -0
  675. package/src/resources/skills/verify-before-complete/SKILL.md +97 -0
  676. package/src/resources/skills/write-docs/SKILL.md +81 -0
  677. package/src/resources/skills/write-milestone-brief/SKILL.md +135 -0
  678. package/dist/web/standalone/.next/static/css/3e9cdadb4d23b8a4.css +0 -1
  679. /package/dist/web/standalone/.next/static/{JncJywFxCugMuXGs56m-b → pBwmOoye64ZrRp-_rf0v1}/_buildManifest.js +0 -0
  680. /package/dist/web/standalone/.next/static/{JncJywFxCugMuXGs56m-b → pBwmOoye64ZrRp-_rf0v1}/_ssgManifest.js +0 -0
@@ -23,7 +23,7 @@ import type { GSDPreferences } from "./preferences.js";
23
23
  import { getLoadedSkills, type Skill } from "@gsd/pi-coding-agent";
24
24
  import { join, basename } from "node:path";
25
25
  import { existsSync } from "node:fs";
26
- import { computeBudgets, resolveExecutorContextWindow, truncateAtSectionBoundary } from "./context-budget.js";
26
+ import { computeBudgets, resolveExecutorContextWindow, truncateAtSectionBoundary, type MinimalModelRegistry } from "./context-budget.js";
27
27
  import { getPendingGates, getPendingGatesForTurn } from "./gsd-db.js";
28
28
  import {
29
29
  GATE_REGISTRY,
@@ -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 ─────────────────────────────────────────────────────
@@ -52,14 +94,19 @@ function capPreamble(preamble: string): string {
52
94
  * Uses the budget engine to compute task count ranges and inline context budgets
53
95
  * based on the configured executor model's context window.
54
96
  */
55
- function formatExecutorConstraints(): string {
97
+ function formatExecutorConstraints(
98
+ sessionContextWindow?: number,
99
+ modelRegistry?: MinimalModelRegistry,
100
+ ): string {
56
101
  let windowTokens: number;
57
102
  try {
58
103
  const prefs = loadEffectiveGSDPreferences();
59
- windowTokens = resolveExecutorContextWindow(undefined, prefs?.preferences);
104
+ windowTokens = resolveExecutorContextWindow(modelRegistry, prefs?.preferences, sessionContextWindow);
60
105
  } catch (e) {
61
106
  logWarning("prompt", `resolveExecutorContextWindow failed: ${(e as Error).message}`);
62
- windowTokens = 200_000; // safe default
107
+ // Delegate to the budget engine without prefs (the path that just threw)
108
+ // so DEFAULT_CONTEXT_WINDOW stays the single source of truth.
109
+ windowTokens = resolveExecutorContextWindow(undefined, undefined, sessionContextWindow);
63
110
  }
64
111
  const budgets = computeBudgets(windowTokens);
65
112
  const { min, max } = budgets.taskCountRange;
@@ -75,7 +122,18 @@ function formatExecutorConstraints(): string {
75
122
  ].join("\n");
76
123
  }
77
124
 
78
- function buildSourceFilePaths(
125
+ /**
126
+ * Returns a markdown bullet list of known context file paths for the given
127
+ * milestone (and optionally slice). Falls back to a generic tool-agnostic
128
+ * instruction when no GSD artifacts are found.
129
+ *
130
+ * @param base - Absolute path to the project root.
131
+ * @param mid - Milestone ID (e.g. `"M001"`).
132
+ * @param sid - Optional slice ID (e.g. `"S01"`). When provided, the slice
133
+ * RESEARCH file is preferred over the milestone-level one.
134
+ * @returns Markdown string of file path bullets, or a fallback instruction.
135
+ */
136
+ export function buildSourceFilePaths(
79
137
  base: string,
80
138
  mid: string,
81
139
  sid?: string,
@@ -126,7 +184,7 @@ function buildSourceFilePaths(
126
184
 
127
185
  return paths.length > 0
128
186
  ? paths.join("\n")
129
- : "- Use `rg --files` and targeted reads to identify the relevant source files before planning.";
187
+ : "- Use the Grep/Glob/Read tools to identify the relevant source files before planning.";
130
188
  }
131
189
 
132
190
  // ─── Inline Helpers ───────────────────────────────────────────────────────
@@ -1187,7 +1245,7 @@ export async function buildResearchSlicePrompt(
1187
1245
 
1188
1246
  inlined.push(inlineTemplate("research", "Research"));
1189
1247
 
1190
- const depContent = await inlineDependencySummaries(mid, sid, base);
1248
+ const depContent = await inlineDependencySummaries(mid, sid, base, resolveSummaryBudgetChars());
1191
1249
  const activeOverrides = await loadActiveOverrides(base);
1192
1250
  const overridesInline = formatOverridesSection(activeOverrides);
1193
1251
  if (overridesInline) inlined.unshift(overridesInline);
@@ -1216,10 +1274,33 @@ export async function buildResearchSlicePrompt(
1216
1274
  });
1217
1275
  }
1218
1276
 
1219
- export async function buildPlanSlicePrompt(
1220
- mid: string, _midTitle: string, sid: string, sTitle: string, base: string, level?: InlineLevel,
1221
- ): Promise<string> {
1222
- const inlineLevel = level ?? resolveInlineLevel();
1277
+ /**
1278
+ * Shared assembly for plan-slice and refine-slice prompts. Both builders need
1279
+ * the same inlined context (roadmap excerpt, slice context, research, decisions,
1280
+ * requirements, knowledge, graph subgraph, templates, dependency summaries,
1281
+ * overrides). Extracted to prevent drift between the two sites.
1282
+ *
1283
+ * `prependBlocks` are pushed onto the start of the inlined array BEFORE any
1284
+ * shared content, so callers can add unit-specific headers (e.g., the refine
1285
+ * sketch-scope constraint).
1286
+ */
1287
+ async function renderSlicePrompt(options: {
1288
+ mid: string;
1289
+ sid: string;
1290
+ sTitle: string;
1291
+ base: string;
1292
+ level: InlineLevel;
1293
+ promptTemplate: "plan-slice" | "refine-slice";
1294
+ prependBlocks?: string[];
1295
+ extraVars?: Record<string, string>;
1296
+ sessionContextWindow?: number;
1297
+ modelRegistry?: MinimalModelRegistry;
1298
+ }): Promise<string> {
1299
+ const {
1300
+ mid, sid, sTitle, base, level, promptTemplate, prependBlocks = [], extraVars = {},
1301
+ sessionContextWindow, modelRegistry,
1302
+ } = options;
1303
+
1223
1304
  const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
1224
1305
  const roadmapRel = relMilestoneFile(base, mid, "ROADMAP");
1225
1306
  const researchPath = resolveSliceFile(base, mid, sid, "RESEARCH");
@@ -1227,18 +1308,17 @@ export async function buildPlanSlicePrompt(
1227
1308
  const sliceContextPath = resolveSliceFile(base, mid, sid, "CONTEXT");
1228
1309
  const sliceContextRel = relSliceFile(base, mid, sid, "CONTEXT");
1229
1310
 
1230
- const inlined: string[] = [];
1311
+ const inlined: string[] = [...prependBlocks];
1231
1312
 
1232
- // Inject phase handoff anchor from research phase (if available)
1313
+ // Phase handoff anchor from research phase (if available)
1233
1314
  const researchSliceAnchor = readPhaseAnchor(base, mid, "research-slice");
1234
1315
  if (researchSliceAnchor) inlined.push(formatAnchorForPrompt(researchSliceAnchor));
1235
1316
 
1236
- // Use roadmap excerpt instead of full roadmap for context reduction
1237
- const roadmapExcerptPS = await inlineRoadmapExcerpt(base, mid, sid);
1238
- if (roadmapExcerptPS) {
1239
- inlined.push(roadmapExcerptPS);
1317
+ // Roadmap excerpt with full-roadmap fallback
1318
+ const roadmapExcerpt = await inlineRoadmapExcerpt(base, mid, sid);
1319
+ if (roadmapExcerpt) {
1320
+ inlined.push(roadmapExcerpt);
1240
1321
  } else {
1241
- // Fall back to full roadmap if excerpt fails
1242
1322
  inlined.push(await inlineFile(roadmapPath, roadmapRel, "Milestone Roadmap"));
1243
1323
  }
1244
1324
 
@@ -1246,42 +1326,36 @@ export async function buildPlanSlicePrompt(
1246
1326
  if (sliceCtxInline) inlined.push(sliceCtxInline);
1247
1327
  const researchInline = await inlineFileOptional(researchPath, researchRel, "Slice Research");
1248
1328
  if (researchInline) inlined.push(researchInline);
1249
- if (inlineLevel !== "minimal") {
1250
- // Derive scope from slice title for decision filtering (R005)
1251
- const derivedScopePS = deriveSliceScope(sTitle);
1252
- const decisionsInline = await inlineDecisionsFromDb(base, mid, derivedScopePS, inlineLevel);
1329
+
1330
+ if (level !== "minimal") {
1331
+ const derivedScope = deriveSliceScope(sTitle);
1332
+ const decisionsInline = await inlineDecisionsFromDb(base, mid, derivedScope, level);
1253
1333
  if (decisionsInline) inlined.push(decisionsInline);
1254
- const requirementsInline = await inlineRequirementsFromDb(base, mid, sid, inlineLevel);
1334
+ const requirementsInline = await inlineRequirementsFromDb(base, mid, sid, level);
1255
1335
  if (requirementsInline) inlined.push(requirementsInline);
1256
1336
  }
1257
1337
 
1258
- // Use scoped knowledge based on slice title keywords
1259
- const keywordsPS = extractKeywords(sTitle);
1260
- const knowledgeInlinePS = await inlineKnowledgeScoped(base, keywordsPS);
1261
- if (knowledgeInlinePS) inlined.push(knowledgeInlinePS);
1338
+ const knowledgeInline = await inlineKnowledgeScoped(base, extractKeywords(sTitle));
1339
+ if (knowledgeInline) inlined.push(knowledgeInline);
1262
1340
 
1263
- // Knowledge graph: subgraph for this slice (graceful — skipped if no graph.json)
1264
- const graphBlockPS = await inlineGraphSubgraph(base, `${sid} ${sTitle}`, { budget: 3000 });
1265
- if (graphBlockPS) inlined.push(graphBlockPS);
1341
+ const graphBlock = await inlineGraphSubgraph(base, `${sid} ${sTitle}`, { budget: 3000 });
1342
+ if (graphBlock) inlined.push(graphBlock);
1266
1343
 
1267
1344
  inlined.push(inlineTemplate("plan", "Slice Plan"));
1268
- if (inlineLevel === "full") {
1345
+ if (level === "full") {
1269
1346
  inlined.push(inlineTemplate("task-plan", "Task Plan"));
1270
1347
  }
1271
1348
 
1272
- const depContent = await inlineDependencySummaries(mid, sid, base);
1273
- const planActiveOverrides = await loadActiveOverrides(base);
1274
- const planOverridesInline = formatOverridesSection(planActiveOverrides);
1275
- if (planOverridesInline) inlined.unshift(planOverridesInline);
1349
+ const depContent = await inlineDependencySummaries(mid, sid, base, resolveSummaryBudgetChars());
1350
+ const overridesInline = formatOverridesSection(await loadActiveOverrides(base));
1351
+ if (overridesInline) inlined.unshift(overridesInline);
1276
1352
 
1277
1353
  const inlinedContext = capPreamble(`## Inlined Context (preloaded — do not re-read these files)\n\n${inlined.join("\n\n---\n\n")}`);
1278
-
1279
- // Build executor context constraints from the budget engine
1280
- const executorContextConstraints = formatExecutorConstraints();
1281
-
1354
+ const executorContextConstraints = formatExecutorConstraints(sessionContextWindow, modelRegistry);
1282
1355
  const outputRelPath = relSliceFile(base, mid, sid, "PLAN");
1283
1356
  const commitInstruction = "Do not commit — .gsd/ planning docs are managed externally and not tracked in git.";
1284
- return loadPrompt("plan-slice", {
1357
+
1358
+ return loadPrompt(promptTemplate, {
1285
1359
  workingDirectory: base,
1286
1360
  milestoneId: mid, sliceId: sid, sliceTitle: sTitle,
1287
1361
  slicePath: relSlicePath(base, mid, sid),
@@ -1300,6 +1374,73 @@ export async function buildPlanSlicePrompt(
1300
1374
  sliceTitle: sTitle,
1301
1375
  extraContext: [inlinedContext, depContent],
1302
1376
  }),
1377
+ ...extraVars,
1378
+ });
1379
+ }
1380
+
1381
+ export async function buildPlanSlicePrompt(
1382
+ mid: string, _midTitle: string, sid: string, sTitle: string, base: string, level?: InlineLevel,
1383
+ options?: { softScopeHint?: string; sessionContextWindow?: number; modelRegistry?: MinimalModelRegistry },
1384
+ ): Promise<string> {
1385
+ const prependBlocks: string[] = [];
1386
+ // ADR-011: when the refining-phase dispatch rule gracefully downgrades to
1387
+ // plan-slice (progressive_planning was toggled off mid-milestone), it
1388
+ // forwards the stored sketch_scope as a SOFT hint — context, not a hard
1389
+ // constraint. The planner is free to expand beyond it.
1390
+ if (options?.softScopeHint && options.softScopeHint.trim().length > 0) {
1391
+ prependBlocks.push(
1392
+ `## Prior Sketch Scope (soft hint — non-binding)\n\n${options.softScopeHint.trim()}\n\n` +
1393
+ `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.`,
1394
+ );
1395
+ }
1396
+ return renderSlicePrompt({
1397
+ mid, sid, sTitle, base,
1398
+ level: level ?? resolveInlineLevel(),
1399
+ promptTemplate: "plan-slice",
1400
+ prependBlocks,
1401
+ sessionContextWindow: options?.sessionContextWindow,
1402
+ modelRegistry: options?.modelRegistry,
1403
+ });
1404
+ }
1405
+
1406
+ /**
1407
+ * ADR-011 refine-slice: expand a sketch into a full plan using the current
1408
+ * codebase state and prior slice summary. Mechanically similar to plan-slice
1409
+ * but framed as a *transformation* (sketch → full plan) rather than a
1410
+ * blank-sheet planning pass. Reuses inlineDependencySummaries for prior
1411
+ * slice SUMMARY and inlines the stored sketch_scope as a hard constraint.
1412
+ */
1413
+ export async function buildRefineSlicePrompt(
1414
+ mid: string, _midTitle: string, sid: string, sTitle: string, base: string, level?: InlineLevel,
1415
+ options?: { sessionContextWindow?: number; modelRegistry?: MinimalModelRegistry },
1416
+ ): Promise<string> {
1417
+ // Pull the stored sketch scope from the DB — the hard constraint we plan within.
1418
+ let sketchScope = "";
1419
+ try {
1420
+ const { isDbAvailable, getSlice } = await import("./gsd-db.js");
1421
+ if (isDbAvailable()) {
1422
+ sketchScope = getSlice(mid, sid)?.sketch_scope ?? "";
1423
+ }
1424
+ } catch {
1425
+ sketchScope = "";
1426
+ }
1427
+
1428
+ const prependBlocks: string[] = [];
1429
+ if (sketchScope.trim().length > 0) {
1430
+ prependBlocks.push(
1431
+ `## Sketch Scope (hard constraint)\n\n${sketchScope.trim()}\n\n` +
1432
+ `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.`,
1433
+ );
1434
+ }
1435
+
1436
+ return renderSlicePrompt({
1437
+ mid, sid, sTitle, base,
1438
+ level: level ?? resolveInlineLevel(),
1439
+ promptTemplate: "refine-slice",
1440
+ prependBlocks,
1441
+ extraVars: { sketchScope },
1442
+ sessionContextWindow: options?.sessionContextWindow,
1443
+ modelRegistry: options?.modelRegistry,
1303
1444
  });
1304
1445
  }
1305
1446
 
@@ -1308,6 +1449,10 @@ export interface ExecuteTaskPromptOptions {
1308
1449
  level?: InlineLevel;
1309
1450
  /** Override carry-forward paths (dependency-based instead of order-based). */
1310
1451
  carryForwardPaths?: string[];
1452
+ /** Session model context window in tokens, forwarded to the budget engine. */
1453
+ sessionContextWindow?: number;
1454
+ /** Model registry forwarded to the budget engine for executor-model lookup. */
1455
+ modelRegistry?: MinimalModelRegistry;
1311
1456
  }
1312
1457
 
1313
1458
  export async function buildExecuteTaskPrompt(
@@ -1399,7 +1544,7 @@ export async function buildExecuteTaskPrompt(
1399
1544
 
1400
1545
  // Compute verification budget for the executor's context window (issue #707)
1401
1546
  const prefs = loadEffectiveGSDPreferences();
1402
- const contextWindow = resolveExecutorContextWindow(undefined, prefs?.preferences);
1547
+ const contextWindow = resolveExecutorContextWindow(opts.modelRegistry, prefs?.preferences, opts.sessionContextWindow);
1403
1548
  const budgets = computeBudgets(contextWindow);
1404
1549
  const verificationBudget = `~${Math.round(budgets.verificationBudgetChars / 1000)}K chars`;
1405
1550
 
@@ -1417,7 +1562,28 @@ export async function buildExecuteTaskPrompt(
1417
1562
  ? `### Runtime Context\nSource: \`.gsd/RUNTIME.md\`\n\n${runtimeContent.trim()}`
1418
1563
  : "";
1419
1564
 
1420
- const phaseAnchorSection = planAnchor ? formatAnchorForPrompt(planAnchor) : "";
1565
+ let phaseAnchorSection = planAnchor ? formatAnchorForPrompt(planAnchor) : "";
1566
+
1567
+ // ADR-011 Phase 2: inject any resolved-but-unapplied escalation override
1568
+ // into this task's prompt. Claim is atomic via DB UPDATE WHERE IS NULL, so
1569
+ // if a parallel build already injected it, we skip. Feature-gated by
1570
+ // phases.mid_execution_escalation. Prepended to phaseAnchorSection so it
1571
+ // appears near the top of the prompt above planning anchors.
1572
+ if (prefs?.preferences?.phases?.mid_execution_escalation === true) {
1573
+ try {
1574
+ const { claimOverrideForInjection } = await import("./escalation.js");
1575
+ const claimed = claimOverrideForInjection(base, mid, sid);
1576
+ if (claimed) {
1577
+ const block = claimed.injectionBlock + "\n\n---\n\n";
1578
+ phaseAnchorSection = phaseAnchorSection
1579
+ ? `${block}${phaseAnchorSection}`
1580
+ : block;
1581
+ }
1582
+ } catch (escalationErr) {
1583
+ // Escalation module unavailable or threw — log and proceed.
1584
+ logWarning("prompt", `escalation override injection failed: ${(escalationErr as Error).message}`);
1585
+ }
1586
+ }
1421
1587
 
1422
1588
  // Task-scoped gates owned by execute-task (Q5/Q6/Q7). Pull only the
1423
1589
  // gates that plan-slice actually seeded for this task — tasks with no
@@ -1598,6 +1764,14 @@ export async function buildCompleteMilestonePrompt(
1598
1764
 
1599
1765
  const milestoneSummaryPath = join(base, `${relMilestonePath(base, mid)}/${mid}-SUMMARY.md`);
1600
1766
 
1767
+ const learningsRelPath = join(relMilestonePath(base, mid), `${mid}-LEARNINGS.md`);
1768
+ const learningsAbsPath = join(base, learningsRelPath);
1769
+ const extractLearningsSteps = buildExtractionStepsBlock({
1770
+ milestoneId: mid,
1771
+ outputPath: learningsAbsPath,
1772
+ relativeOutputPath: learningsRelPath,
1773
+ });
1774
+
1601
1775
  return loadPrompt("complete-milestone", {
1602
1776
  workingDirectory: base,
1603
1777
  milestoneId: mid,
@@ -1605,6 +1779,7 @@ export async function buildCompleteMilestonePrompt(
1605
1779
  roadmapPath: roadmapRel,
1606
1780
  inlinedContext,
1607
1781
  milestoneSummaryPath,
1782
+ extractLearningsSteps,
1608
1783
  skillActivation: buildSkillActivationBlock({
1609
1784
  base,
1610
1785
  milestoneId: mid,
@@ -1945,6 +2120,7 @@ export async function buildReactiveExecutePrompt(
1945
2120
  mid: string, midTitle: string, sid: string, sTitle: string,
1946
2121
  readyTaskIds: string[], base: string,
1947
2122
  subagentModel?: string,
2123
+ opts?: { sessionContextWindow?: number; modelRegistry?: MinimalModelRegistry },
1948
2124
  ): Promise<string> {
1949
2125
  const { loadSliceTaskIO, deriveTaskGraph, graphMetrics } = await import("./reactive-graph.js");
1950
2126
 
@@ -1986,7 +2162,11 @@ export async function buildReactiveExecutePrompt(
1986
2162
  // Build a full execute-task prompt with dependency-based carry-forward
1987
2163
  const taskPrompt = await buildExecuteTaskPrompt(
1988
2164
  mid, sid, sTitle, tid, tTitle, base,
1989
- { carryForwardPaths: depPaths },
2165
+ {
2166
+ carryForwardPaths: depPaths,
2167
+ sessionContextWindow: opts?.sessionContextWindow,
2168
+ modelRegistry: opts?.modelRegistry,
2169
+ },
1990
2170
  );
1991
2171
 
1992
2172
  const modelSuffix = subagentModel ? ` with model: "${subagentModel}"` : "";
@@ -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).
@@ -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)
@@ -526,6 +526,39 @@ export async function runPostUnitVerification(
526
526
  result.passed = false;
527
527
  }
528
528
 
529
+ // Emit Layer 2 verify_result event with the final, post-exec verdict so hooks
530
+ // see the authoritative pass/fail and the complete set of failures.
531
+ try {
532
+ const { emitVerifyResult } = await import("./hook-emitter.js");
533
+ const checkFailures = result.checks
534
+ .filter((c) => c.exitCode !== 0)
535
+ .map((c) => ({
536
+ kind: "gate" as const,
537
+ message: `${c.command} exited ${c.exitCode}${c.stderr ? `: ${c.stderr.slice(0, 200)}` : ""}`,
538
+ }));
539
+ const runtimeFailures = (result.runtimeErrors ?? [])
540
+ .filter((e) => e.blocking)
541
+ .map((e) => ({
542
+ kind: "other" as const,
543
+ message: `[${e.source}] ${e.message.slice(0, 200)}`,
544
+ }));
545
+ const postExecFailures = (postExecChecks ?? [])
546
+ .filter((c) => !c.passed)
547
+ .map((c) => ({
548
+ kind: "other" as const,
549
+ message: `[${c.category}] ${c.target}: ${c.message}`,
550
+ }));
551
+ await emitVerifyResult({
552
+ passed: result.passed,
553
+ failures: [...checkFailures, ...runtimeFailures, ...postExecFailures],
554
+ unitType: s.currentUnit.type,
555
+ unitId: s.currentUnit.id,
556
+ cwd: s.basePath,
557
+ });
558
+ } catch (hookErr) {
559
+ logWarning("engine", `verify_result hook emission failed: ${(hookErr as Error).message}`);
560
+ }
561
+
529
562
  // ── Auto-fix retry logic ──
530
563
  if (result.passed) {
531
564
  s.verificationRetryCount.delete(s.currentUnit.id);
@@ -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,
@@ -237,6 +238,14 @@ function clearProjectRootStateFiles(basePath: string, milestoneId: string): void
237
238
  }
238
239
  }
239
240
 
241
+ function isProjectGsdSymlink(basePath: string): boolean {
242
+ try {
243
+ return lstatSyncFn(join(basePath, ".gsd")).isSymbolicLink();
244
+ } catch {
245
+ return false;
246
+ }
247
+ }
248
+
240
249
  // ─── Build Artifact Auto-Resolve ─────────────────────────────────────────────
241
250
 
242
251
  /** Patterns for machine-generated build artifacts that can be safely
@@ -921,10 +930,74 @@ export function runWorktreePostCreateHook(
921
930
 
922
931
  // ─── Auto-Worktree Branch Naming ───────────────────────────────────────────
923
932
 
933
+ /** Returns the git branch name for a milestone worktree (`milestone/<MID>`). */
924
934
  export function autoWorktreeBranch(milestoneId: string): string {
925
935
  return `milestone/${milestoneId}`;
926
936
  }
927
937
 
938
+ // ─── Branch-mode Entry ─────────────────────────────────────────────────────
939
+
940
+ /**
941
+ * Enter branch isolation mode for a milestone.
942
+ *
943
+ * Creates `milestone/<MID>` from the integration branch (if it doesn't
944
+ * exist yet) and checks out to it. No worktree directory is created — the
945
+ * project root is the working copy; only HEAD changes.
946
+ *
947
+ * Uses the same 3-tier integration-branch fallback as createAutoWorktree:
948
+ * 1. META.json recorded integration branch
949
+ * 2. git.main_branch preference
950
+ * 3. nativeDetectMainBranch (origin/HEAD auto-detection)
951
+ */
952
+ export function enterBranchModeForMilestone(
953
+ basePath: string,
954
+ milestoneId: string,
955
+ ): void {
956
+ const branch = autoWorktreeBranch(milestoneId);
957
+ const branchExists = nativeBranchExists(basePath, branch);
958
+
959
+ if (!branchExists) {
960
+ // Create the milestone branch from the integration branch start-point.
961
+ const integrationBranch =
962
+ readIntegrationBranch(basePath, milestoneId) ?? undefined;
963
+ const gitPrefs = loadEffectiveGSDPreferences()?.preferences?.git;
964
+ // Validate main_branch preference exists in the repo before using it —
965
+ // a stale preference (e.g. "master" when repo uses "main") would cause
966
+ // nativeBranchForceReset to fail with a bad start-point reference.
967
+ const validatedPrefBranch =
968
+ gitPrefs?.main_branch &&
969
+ typeof gitPrefs.main_branch === "string" &&
970
+ gitPrefs.main_branch.length > 0 &&
971
+ nativeBranchExists(basePath, gitPrefs.main_branch)
972
+ ? gitPrefs.main_branch
973
+ : undefined;
974
+ const startPoint =
975
+ integrationBranch ??
976
+ validatedPrefBranch ??
977
+ nativeDetectMainBranch(basePath);
978
+
979
+ // nativeBranchForceReset creates (or resets) branch at startPoint,
980
+ // then checkout switches HEAD to it.
981
+ nativeBranchForceReset(basePath, branch, startPoint);
982
+ debugLog("auto-worktree", {
983
+ action: "enterBranchMode",
984
+ milestoneId,
985
+ branch,
986
+ startPoint,
987
+ created: true,
988
+ });
989
+ } else {
990
+ debugLog("auto-worktree", {
991
+ action: "enterBranchMode",
992
+ milestoneId,
993
+ branch,
994
+ reused: true,
995
+ });
996
+ }
997
+
998
+ nativeCheckoutBranch(basePath, branch);
999
+ }
1000
+
928
1001
  // ─── Public API ────────────────────────────────────────────────────────────
929
1002
 
930
1003
  /**
@@ -1610,12 +1683,19 @@ export function mergeMilestoneToMain(
1610
1683
  // CONTEXT files into the stash. If stash pop later fails, those files
1611
1684
  // are permanently trapped in the stash entry and lost on the next
1612
1685
  // stash push or drop.
1686
+ //
1687
+ // When `.gsd` itself is a symlink, Git rejects pathspecs below it
1688
+ // ("beyond a symbolic link"). In that layout, exclude the whole symlink
1689
+ // and keep stashing real project files that could block the merge.
1690
+ const stashPathspecs = isProjectGsdSymlink(originalBasePath_)
1691
+ ? [".", ":(exclude).gsd"]
1692
+ : [":(exclude).gsd/milestones"];
1613
1693
  execFileSync(
1614
1694
  "git",
1615
1695
  [
1616
1696
  "stash", "push", "--include-untracked",
1617
1697
  "-m", `gsd: pre-merge stash for ${milestoneId}`,
1618
- "--", ":(exclude).gsd/milestones",
1698
+ "--", ...stashPathspecs,
1619
1699
  ],
1620
1700
  { cwd: originalBasePath_, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" },
1621
1701
  );