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
@@ -0,0 +1,105 @@
1
+ // GSD — Setup catalog (single source of truth for onboarding steps + provider sub-views)
2
+ //
3
+ // Re-exports filtered views over PROVIDER_REGISTRY (key-manager.ts) and owns the
4
+ // canonical ONBOARDING_STEPS list. Consumers (CLI wizard, /gsd setup hub,
5
+ // onboarding handler, web alignment) all read from here so adding a step or
6
+ // provider lands in one place. Keep this module thin: no behavior beyond
7
+ // filters + lookup helpers, so it stays cycle-safe even though it depends on
8
+ // key-manager for the provider catalog.
9
+
10
+ import { PROVIDER_REGISTRY, type ProviderInfo } from "./key-manager.js"
11
+
12
+ export type OnboardingStepId =
13
+ | "llm"
14
+ | "model"
15
+ | "search"
16
+ | "remote"
17
+ | "tool-keys"
18
+ | "prefs"
19
+ | "skills"
20
+ | "doctor"
21
+ | "project"
22
+
23
+ export interface OnboardingStepDef {
24
+ id: OnboardingStepId
25
+ label: string
26
+ /** Required steps gate the "complete" flag. Skipped required steps mark the wizard incomplete. */
27
+ required: boolean
28
+ /** Short description shown in /gsd setup status hub. */
29
+ hint: string
30
+ }
31
+
32
+ /**
33
+ * Canonical ordered list of onboarding steps.
34
+ *
35
+ * To add a new step:
36
+ * 1. Append here (or insert at the right position).
37
+ * 2. Bump FLOW_VERSION in onboarding-state.ts so existing users get re-prompted.
38
+ * 3. Wire its CLI runner in src/onboarding.ts (and handlers/onboarding.ts for --step).
39
+ */
40
+ export const ONBOARDING_STEPS: readonly OnboardingStepDef[] = [
41
+ { id: "llm", label: "LLM provider & auth", required: true, hint: "Sign in or paste an API key" },
42
+ { id: "model", label: "Default model", required: false, hint: "Pick a default model for the chosen provider" },
43
+ { id: "search", label: "Web search provider", required: false, hint: "Brave, Tavily, or Anthropic built-in" },
44
+ { id: "remote", label: "Remote questions", required: false, hint: "Discord / Slack / Telegram notifications" },
45
+ { id: "tool-keys", label: "Tool API keys", required: false, hint: "Context7, Jina, Groq voice, etc." },
46
+ { id: "prefs", label: "Global preferences", required: false, hint: "Mode, profile, notifications" },
47
+ { id: "skills", label: "Skills install", required: false, hint: "Browse and install skill plugins" },
48
+ { id: "doctor", label: "Validate setup", required: false, hint: "Run provider doctor checks" },
49
+ { id: "project", label: "Project init", required: false, hint: "Bootstrap .gsd/ in this repo" },
50
+ ]
51
+
52
+ const STEP_INDEX = new Map(ONBOARDING_STEPS.map((s, i) => [s.id, i]))
53
+
54
+ export function getStep(id: string): OnboardingStepDef | undefined {
55
+ const idx = STEP_INDEX.get(id as OnboardingStepId)
56
+ return idx === undefined ? undefined : ONBOARDING_STEPS[idx]
57
+ }
58
+
59
+ export function isValidStepId(id: string): id is OnboardingStepId {
60
+ return STEP_INDEX.has(id as OnboardingStepId)
61
+ }
62
+
63
+ /**
64
+ * Given a possibly-stale resume point, return the nearest next step that is
65
+ * still defined in the catalog. Falls back to the first step.
66
+ */
67
+ export function nearestResumeStep(lastResumePoint: string | null, completedSteps: string[]): OnboardingStepId {
68
+ const completed = new Set(completedSteps)
69
+ // First incomplete step at or after the lastResumePoint
70
+ let startIdx = 0
71
+ if (lastResumePoint && STEP_INDEX.has(lastResumePoint as OnboardingStepId)) {
72
+ startIdx = STEP_INDEX.get(lastResumePoint as OnboardingStepId) ?? 0
73
+ }
74
+ for (let i = startIdx; i < ONBOARDING_STEPS.length; i++) {
75
+ if (!completed.has(ONBOARDING_STEPS[i].id)) return ONBOARDING_STEPS[i].id
76
+ }
77
+ // Everything from the resume point is complete — try from the start
78
+ for (const step of ONBOARDING_STEPS) {
79
+ if (!completed.has(step.id)) return step.id
80
+ }
81
+ return ONBOARDING_STEPS[0].id
82
+ }
83
+
84
+ // ─── Provider catalog views ───────────────────────────────────────────────────
85
+
86
+ export function getLlmProviders(): ProviderInfo[] {
87
+ return PROVIDER_REGISTRY.filter(p => p.category === "llm")
88
+ }
89
+
90
+ export function getToolProviders(): ProviderInfo[] {
91
+ return PROVIDER_REGISTRY.filter(p => p.category === "tool")
92
+ }
93
+
94
+ export function getSearchProviders(): ProviderInfo[] {
95
+ return PROVIDER_REGISTRY.filter(p => p.category === "search")
96
+ }
97
+
98
+ export function getRemoteProviders(): ProviderInfo[] {
99
+ return PROVIDER_REGISTRY.filter(p => p.category === "remote")
100
+ }
101
+
102
+ /** Provider IDs that count as "the user has an LLM configured" for shouldRunOnboarding. */
103
+ export function getLlmProviderIds(): string[] {
104
+ return Array.from(new Set([...getLlmProviders().map(p => p.id), "claude-code"]))
105
+ }
@@ -44,6 +44,8 @@ import { existsSync, readdirSync, readFileSync } from 'node:fs';
44
44
  import { debugCount, debugTime } from './debug-logger.js';
45
45
  import { logWarning, logError } from './workflow-logger.js';
46
46
  import { extractVerdict } from './verdict-parser.js';
47
+ import { loadEffectiveGSDPreferences } from './preferences.js';
48
+ import { detectPendingEscalation } from './escalation.js';
47
49
 
48
50
  import {
49
51
  isDbAvailable,
@@ -60,6 +62,7 @@ import {
60
62
  updateSliceStatus,
61
63
  updateTaskStatus,
62
64
  getPendingGateCountForTurn,
65
+ autoHealSketchFlags,
63
66
  type MilestoneRow,
64
67
  type SliceRow,
65
68
  type TaskRow,
@@ -610,7 +613,7 @@ async function handleAllSlicesDone(
610
613
  const validationTerminal = validationContent ? isValidationTerminal(validationContent) : false;
611
614
  const verdict = validationContent ? extractVerdict(validationContent) : undefined;
612
615
 
613
- if (!validationTerminal || verdict === 'needs-remediation') {
616
+ if (!validationTerminal) {
614
617
  return {
615
618
  activeMilestone, activeSlice: null, activeTask: null,
616
619
  phase: 'validating-milestone',
@@ -621,6 +624,24 @@ async function handleAllSlicesDone(
621
624
  };
622
625
  }
623
626
 
627
+ // All roadmap slices are done (enforced by caller) and verdict is
628
+ // needs-remediation — remediation cannot progress without new slices.
629
+ // Return blocked instead of re-dispatching validate-milestone (#4506).
630
+ if (verdict === 'needs-remediation') {
631
+ return {
632
+ activeMilestone, activeSlice: null, activeTask: null,
633
+ phase: 'blocked',
634
+ recentDecisions: [],
635
+ blockers: [
636
+ `Milestone ${activeMilestone.id} validation verdict is needs-remediation but all slices are complete. ` +
637
+ `Add remediation slices via gsd_reassess_roadmap or override the verdict manually.`,
638
+ ],
639
+ nextAction: `Resolve ${activeMilestone.id} remediation before proceeding.`,
640
+ registry, requirements,
641
+ progress: { milestones: milestoneProgress, slices: sliceProgress },
642
+ };
643
+ }
644
+
624
645
  return {
625
646
  activeMilestone, activeSlice: null, activeTask: null,
626
647
  phase: 'completing-milestone',
@@ -849,7 +870,15 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
849
870
  return handleAllSlicesDone(basePath, activeMilestone, registry, requirements, milestoneProgress, sliceProgress);
850
871
  }
851
872
 
852
- const activeSliceContext = resolveSliceDependencies(activeMilestoneSlices);
873
+ // ADR-011 auto-heal: if a slice has a PLAN on disk but is still flagged is_sketch=1
874
+ // (e.g. a crash between plan-slice write and the sketch flip), reconcile before
875
+ // running phase derivation so the flag doesn't misroute state.
876
+ autoHealSketchFlags(activeMilestone.id, (sid) =>
877
+ !!resolveSliceFile(basePath, activeMilestone.id, sid, "PLAN"),
878
+ );
879
+ // Re-read slices after auto-heal so downstream reads see fresh is_sketch values.
880
+ const healedSlices = getMilestoneSlices(activeMilestone.id);
881
+ const activeSliceContext = resolveSliceDependencies(healedSlices);
853
882
  if (!activeSliceContext.activeSlice) {
854
883
  // If locked slice wasn't found, it returns null but logs warning, we need to return 'blocked'
855
884
  if (process.env.GSD_SLICE_LOCK) {
@@ -869,10 +898,24 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
869
898
  progress: { milestones: milestoneProgress, slices: sliceProgress },
870
899
  };
871
900
  }
872
- const { activeSlice } = activeSliceContext;
901
+ const { activeSlice, activeSliceRow } = activeSliceContext;
873
902
 
874
903
  const planFile = resolveSliceFile(basePath, activeMilestone.id, activeSlice.id, "PLAN");
875
904
  if (!planFile) {
905
+ // ADR-011: sketch slices with progressive_planning enabled enter the
906
+ // `refining` phase — a refine-slice unit expands the sketch into a full plan
907
+ // before execution. When the flag is off, sketches are indistinguishable
908
+ // from a missing plan and fall through to the normal `planning` phase.
909
+ const progressive = loadEffectiveGSDPreferences()?.preferences?.phases?.progressive_planning === true;
910
+ if (progressive && activeSliceRow?.is_sketch === 1) {
911
+ return {
912
+ activeMilestone, activeSlice, activeTask: null,
913
+ phase: 'refining', recentDecisions: [], blockers: [],
914
+ nextAction: `Refine sketch slice ${activeSlice.id} (${activeSlice.title}) using prior slice context.`,
915
+ registry, requirements,
916
+ progress: { milestones: milestoneProgress, slices: sliceProgress },
917
+ };
918
+ }
876
919
  return {
877
920
  activeMilestone, activeSlice, activeTask: null,
878
921
  phase: 'planning', recentDecisions: [], blockers: [],
@@ -965,6 +1008,29 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
965
1008
  }
966
1009
  }
967
1010
 
1011
+ // ADR-011 Phase 2: pause-on-escalation takes precedence over dispatching the
1012
+ // next task. `awaiting_review` tasks (continueWithDefault=true) are NOT
1013
+ // surfaced here — they let the loop continue.
1014
+ //
1015
+ // We do NOT gate this on `phases.mid_execution_escalation` — creation of
1016
+ // new escalations is gated at the write site (tools/complete-task.ts:315),
1017
+ // but any escalation_pending row already persisted in the DB must be
1018
+ // honored even if the user later toggles the flag off. Otherwise those
1019
+ // rows would silently orphan, the loop would advance past the paused task,
1020
+ // and the user's prior resolution never lands.
1021
+ const escalatingTaskId = detectPendingEscalation(tasks, basePath);
1022
+ if (escalatingTaskId) {
1023
+ return {
1024
+ activeMilestone, activeSlice, activeTask,
1025
+ phase: 'escalating-task', recentDecisions: [],
1026
+ blockers: [`Task ${escalatingTaskId} requires a user decision before the loop can proceed`],
1027
+ nextAction: `Run /gsd escalate show ${escalatingTaskId} to review, then /gsd escalate resolve ${escalatingTaskId} <choice> to proceed.`,
1028
+ activeWorkspace: undefined,
1029
+ registry, requirements,
1030
+ progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
1031
+ };
1032
+ }
1033
+
968
1034
  if (!blockerTaskId) {
969
1035
  const isTriggered = checkReplanTrigger(basePath, activeMilestone.id, activeSlice.id);
970
1036
  if (isTriggered) {
@@ -1402,9 +1468,11 @@ export async function _deriveStateImpl(basePath: string): Promise<GSDState> {
1402
1468
  total: activeRoadmap.slices.length,
1403
1469
  };
1404
1470
 
1405
- // Force re-validation when verdict is needs-remediation — remediation slices
1406
- // may have completed since the stale validation was written (#3596).
1407
- if (!validationTerminal || verdict === 'needs-remediation') {
1471
+ // Force re-validation when VALIDATION.md is absent or non-terminal —
1472
+ // remediation slices may have completed since the stale validation was
1473
+ // written (#3596). But needs-remediation with all slices done is a dead
1474
+ // end — return blocked to avoid an infinite dispatch loop (#4506).
1475
+ if (!validationTerminal) {
1408
1476
  return {
1409
1477
  activeMilestone,
1410
1478
  activeSlice: null,
@@ -1422,6 +1490,27 @@ export async function _deriveStateImpl(basePath: string): Promise<GSDState> {
1422
1490
  };
1423
1491
  }
1424
1492
 
1493
+ if (verdict === 'needs-remediation') {
1494
+ return {
1495
+ activeMilestone,
1496
+ activeSlice: null,
1497
+ activeTask: null,
1498
+ phase: 'blocked',
1499
+ recentDecisions: [],
1500
+ blockers: [
1501
+ `Milestone ${activeMilestone.id} validation verdict is needs-remediation but all slices are complete. ` +
1502
+ `Add remediation slices via gsd_reassess_roadmap or override the verdict manually.`,
1503
+ ],
1504
+ nextAction: `Resolve ${activeMilestone.id} remediation before proceeding.`,
1505
+ registry,
1506
+ requirements,
1507
+ progress: {
1508
+ milestones: milestoneProgress,
1509
+ slices: sliceProgress,
1510
+ },
1511
+ };
1512
+ }
1513
+
1425
1514
  return {
1426
1515
  activeMilestone,
1427
1516
  activeSlice: null,
@@ -51,7 +51,7 @@ uok:
51
51
  enabled: true
52
52
  gitops:
53
53
  enabled: true
54
- turn_action: status-only
54
+ turn_action: commit
55
55
  turn_push: false
56
56
  audit_unified:
57
57
  enabled: true
@@ -46,6 +46,8 @@ function makeSliceRow(overrides?: Partial<SliceRow>): SliceRow {
46
46
  observability_impact: '',
47
47
  sequence: 4,
48
48
  replan_triggered_at: null,
49
+ is_sketch: 0,
50
+ sketch_scope: '',
49
51
  ...overrides,
50
52
  };
51
53
  }
@@ -77,6 +79,11 @@ function makeTaskRow(overrides?: Partial<TaskRow>): TaskRow {
77
79
  expected_output: [],
78
80
  observability_impact: '',
79
81
  sequence: 0,
82
+ blocker_source: '',
83
+ escalation_pending: 0,
84
+ escalation_awaiting_review: 0,
85
+ escalation_artifact_path: null,
86
+ escalation_override_applied_at: null,
80
87
  ...overrides,
81
88
  };
82
89
  }
@@ -3,6 +3,7 @@ import assert from "node:assert/strict";
3
3
  import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
4
4
  import { join } from "node:path";
5
5
  import { tmpdir } from "node:os";
6
+ import { execFileSync } from "node:child_process";
6
7
 
7
8
  import {
8
9
  unitVerb,
@@ -15,6 +16,10 @@ import {
15
16
  getWidgetMode,
16
17
  cycleWidgetMode,
17
18
  _resetWidgetModeForTests,
19
+ _resetLastCommitCacheForTests,
20
+ _refreshLastCommitForTests,
21
+ _getLastCommitForTests,
22
+ _getLastCommitFetchedAtForTests,
18
23
  } from "../auto-dashboard.ts";
19
24
 
20
25
  const autoSource = readFileSync(join(process.cwd(), "src", "resources", "extensions", "gsd", "auto.ts"), "utf-8");
@@ -215,6 +220,50 @@ test("auto progress widget renders RTK savings under the footer stats line", ()
215
220
  assert.match(dashboardSource, /lines\.push\(rightAlign\("", theme\.fg\("dim", cachedRtkLabel\), width\)\);/);
216
221
  });
217
222
 
223
+ test("last commit refresh backs off cleanly when base path is not a git repo", (t) => {
224
+ const dir = makeTempDir("non-git");
225
+ mkdirSync(dir, { recursive: true });
226
+
227
+ t.after(() => {
228
+ cleanup(dir);
229
+ _resetLastCommitCacheForTests();
230
+ });
231
+
232
+ _resetLastCommitCacheForTests();
233
+ _refreshLastCommitForTests(dir);
234
+
235
+ assert.equal(_getLastCommitForTests(dir), null);
236
+ assert.ok(
237
+ _getLastCommitFetchedAtForTests() > 0,
238
+ "non-git refresh should still advance fetchedAt to avoid render-loop retries",
239
+ );
240
+ });
241
+
242
+ test("last commit refresh still returns commit info for a valid git repo", (t) => {
243
+ const dir = makeTempDir("git");
244
+ mkdirSync(dir, { recursive: true });
245
+
246
+ execFileSync("git", ["init", "-b", "main"], { cwd: dir, stdio: "pipe" });
247
+ execFileSync("git", ["config", "user.name", "GSD Test"], { cwd: dir, stdio: "pipe" });
248
+ execFileSync("git", ["config", "user.email", "gsd@example.com"], { cwd: dir, stdio: "pipe" });
249
+ writeFileSync(join(dir, "README.md"), "hello\n", "utf-8");
250
+ execFileSync("git", ["add", "README.md"], { cwd: dir, stdio: "pipe" });
251
+ execFileSync("git", ["commit", "-m", "test: seed dashboard repo"], { cwd: dir, stdio: "pipe" });
252
+
253
+ t.after(() => {
254
+ cleanup(dir);
255
+ _resetLastCommitCacheForTests();
256
+ });
257
+
258
+ _resetLastCommitCacheForTests();
259
+ _refreshLastCommitForTests(dir);
260
+
261
+ const lastCommit = _getLastCommitForTests(dir);
262
+ assert.ok(lastCommit, "git repo should produce last commit metadata");
263
+ assert.match(lastCommit!.message, /test: seed dashboard repo/);
264
+ assert.ok(lastCommit!.timeAgo.length > 0, "relative time should be populated");
265
+ });
266
+
218
267
  // ─── extractUatSliceId ───────────────────────────────────────────────────
219
268
 
220
269
  test("extractUatSliceId extracts slice ID from M001/S01 format", () => {
@@ -0,0 +1,63 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { mkdtempSync, mkdirSync, writeFileSync, existsSync, rmSync } from "node:fs";
4
+ import { join } from "node:path";
5
+ import { tmpdir } from "node:os";
6
+
7
+ import { recoverFailedMigration } from "../migrate-external.ts";
8
+
9
+ // Regression tests for #4416: `.gsd.migrating` must be healed before auto-mode
10
+ // proceeds, including on the resume path in auto.ts (fixed at auto.ts:1325).
11
+ // The `recoverFailedMigration` function is already called in `auto-start.ts:350`
12
+ // for fresh-start sessions. The fix adds an identical call to `auto.ts:startAuto`
13
+ // so that resume sessions (triggered by a persisted paused-session.json) also heal
14
+ // a leftover `.gsd.migrating` directory before acquiring the session lock.
15
+
16
+ test("recoverFailedMigration renames .gsd.migrating to .gsd when .gsd is absent", (t) => {
17
+ const base = mkdtempSync(join(tmpdir(), "gsd-migrating-recovery-"));
18
+ t.after(() => rmSync(base, { recursive: true, force: true }));
19
+
20
+ const migratingPath = join(base, ".gsd.migrating");
21
+ mkdirSync(join(migratingPath, "milestones"), { recursive: true });
22
+
23
+ const recovered = recoverFailedMigration(base);
24
+
25
+ assert.equal(recovered, true, "expected recovery to succeed");
26
+ assert.ok(existsSync(join(base, ".gsd")), ".gsd must exist after recovery");
27
+ assert.ok(!existsSync(migratingPath), ".gsd.migrating must not exist after recovery");
28
+ });
29
+
30
+ test("recoverFailedMigration returns false when .gsd.migrating is absent (nothing to do)", (t) => {
31
+ const base = mkdtempSync(join(tmpdir(), "gsd-migrating-noop-"));
32
+ t.after(() => rmSync(base, { recursive: true, force: true }));
33
+
34
+ const recovered = recoverFailedMigration(base);
35
+ assert.equal(recovered, false, "no migration to recover");
36
+ });
37
+
38
+ test("recoverFailedMigration returns false when both .gsd and .gsd.migrating exist (ambiguous)", (t) => {
39
+ const base = mkdtempSync(join(tmpdir(), "gsd-migrating-ambig-"));
40
+ t.after(() => rmSync(base, { recursive: true, force: true }));
41
+
42
+ mkdirSync(join(base, ".gsd"), { recursive: true });
43
+ mkdirSync(join(base, ".gsd.migrating"), { recursive: true });
44
+
45
+ const recovered = recoverFailedMigration(base);
46
+ assert.equal(recovered, false, "should not touch ambiguous state");
47
+ assert.ok(existsSync(join(base, ".gsd")), ".gsd must still exist");
48
+ assert.ok(existsSync(join(base, ".gsd.migrating")), ".gsd.migrating must still exist");
49
+ });
50
+
51
+ test("recoverFailedMigration preserves contents of .gsd.migrating", (t) => {
52
+ const base = mkdtempSync(join(tmpdir(), "gsd-migrating-contents-"));
53
+ t.after(() => rmSync(base, { recursive: true, force: true }));
54
+
55
+ const migratingPath = join(base, ".gsd.migrating");
56
+ mkdirSync(join(migratingPath, "milestones", "M001"), { recursive: true });
57
+ writeFileSync(join(migratingPath, "milestones", "M001", "M001-ROADMAP.md"), "# M001\n");
58
+
59
+ recoverFailedMigration(base);
60
+
61
+ const roadmap = join(base, ".gsd", "milestones", "M001", "M001-ROADMAP.md");
62
+ assert.ok(existsSync(roadmap), "Milestone file must be accessible via .gsd after recovery");
63
+ });
@@ -7,7 +7,7 @@ import { fileURLToPath } from "node:url";
7
7
 
8
8
  const __dirname = dirname(fileURLToPath(import.meta.url));
9
9
 
10
- import { resolvePreferredModelConfig, resolveModelId } from "../auto-model-selection.js";
10
+ import { resolvePreferredModelConfig, resolveModelId, selectAndApplyModel } from "../auto-model-selection.js";
11
11
 
12
12
  function makeTempDir(prefix: string): string {
13
13
  return mkdtempSync(join(tmpdir(), prefix));
@@ -46,6 +46,7 @@ test("resolvePreferredModelConfig synthesizes heavy routing ceiling when models
46
46
  assert.deepEqual(config, {
47
47
  primary: "claude-opus-4-6",
48
48
  fallbacks: [],
49
+ source: "synthesized",
49
50
  });
50
51
  } finally {
51
52
  process.chdir(originalCwd);
@@ -88,6 +89,7 @@ test("resolvePreferredModelConfig falls back to auto start model when heavy tier
88
89
  assert.deepEqual(config, {
89
90
  primary: "openai/gpt-5.4",
90
91
  fallbacks: [],
92
+ source: "synthesized",
91
93
  });
92
94
  } finally {
93
95
  process.chdir(originalCwd);
@@ -131,6 +133,7 @@ test("resolvePreferredModelConfig keeps explicit phase models as the ceiling", (
131
133
  assert.deepEqual(config, {
132
134
  primary: "claude-sonnet-4-6",
133
135
  fallbacks: [],
136
+ source: "explicit",
134
137
  });
135
138
  } finally {
136
139
  process.chdir(originalCwd);
@@ -141,6 +144,85 @@ test("resolvePreferredModelConfig keeps explicit phase models as the ceiling", (
141
144
  }
142
145
  });
143
146
 
147
+ test("selectAndApplyModel honors explicit phase models without downgrading (#3617)", async () => {
148
+ const originalCwd = process.cwd();
149
+ const originalGsdHome = process.env.GSD_HOME;
150
+ const tempProject = makeTempDir("gsd-routing-project-");
151
+ const tempGsdHome = makeTempDir("gsd-routing-home-");
152
+ const setModelCalls: string[] = [];
153
+ let beforeModelSelectCalled = false;
154
+
155
+ try {
156
+ mkdirSync(join(tempProject, ".gsd"), { recursive: true });
157
+ writeFileSync(
158
+ join(tempProject, ".gsd", "PREFERENCES.md"),
159
+ [
160
+ "---",
161
+ "models:",
162
+ " planning: claude-opus-4-6",
163
+ "dynamic_routing:",
164
+ " enabled: true",
165
+ " tier_models:",
166
+ " light: gpt-4o-mini",
167
+ " standard: claude-sonnet-4-6",
168
+ " heavy: claude-opus-4-6",
169
+ "---",
170
+ ].join("\n"),
171
+ "utf-8",
172
+ );
173
+ process.env.GSD_HOME = tempGsdHome;
174
+ process.chdir(tempProject);
175
+
176
+ const availableModels = [
177
+ { id: "claude-opus-4-6", provider: "anthropic", api: "anthropic-messages" },
178
+ { id: "claude-sonnet-4-6", provider: "anthropic", api: "anthropic-messages" },
179
+ { id: "gpt-4o-mini", provider: "openai", api: "responses" },
180
+ ];
181
+
182
+ const result = await selectAndApplyModel(
183
+ {
184
+ modelRegistry: { getAvailable: () => availableModels },
185
+ sessionManager: { getSessionId: () => "test-session" },
186
+ ui: { notify: () => {} },
187
+ model: { provider: "anthropic", id: "claude-opus-4-6", api: "anthropic-messages" },
188
+ } as any,
189
+ {
190
+ setModel: async (model: { provider: string; id: string }) => {
191
+ setModelCalls.push(`${model.provider}/${model.id}`);
192
+ return true;
193
+ },
194
+ emitBeforeModelSelect: async () => {
195
+ beforeModelSelectCalled = true;
196
+ return undefined;
197
+ },
198
+ getActiveTools: () => [],
199
+ emitAdjustToolSet: async () => undefined,
200
+ setActiveTools: () => {},
201
+ } as any,
202
+ "plan-slice",
203
+ "slice-1",
204
+ tempProject,
205
+ undefined,
206
+ false,
207
+ { provider: "anthropic", id: "claude-opus-4-6" },
208
+ undefined,
209
+ true,
210
+ );
211
+
212
+ assert.equal(beforeModelSelectCalled, false, "explicit phase models should skip dynamic routing hooks");
213
+ assert.deepEqual(setModelCalls, ["anthropic/claude-opus-4-6"]);
214
+ assert.equal(result.routing, null, "explicit phase models should not record a routing downgrade");
215
+ assert.equal(result.appliedModel?.provider, "anthropic");
216
+ assert.equal(result.appliedModel?.id, "claude-opus-4-6");
217
+ } finally {
218
+ process.chdir(originalCwd);
219
+ if (originalGsdHome === undefined) delete process.env.GSD_HOME;
220
+ else process.env.GSD_HOME = originalGsdHome;
221
+ rmSync(tempProject, { recursive: true, force: true });
222
+ rmSync(tempGsdHome, { recursive: true, force: true });
223
+ }
224
+ });
225
+
144
226
  // ─── resolveModelId tests ─────────────────────────────────────────────────
145
227
 
146
228
  test("resolveModelId: bare ID resolves to claude-code when session is claude-code (#3772)", () => {
@@ -247,6 +329,18 @@ test("model policy receives task metadata for requirement-vector decisions", ()
247
329
  );
248
330
  });
249
331
 
332
+ test("dynamic routing passes provider-qualified model keys to the router", () => {
333
+ const src = readFileSync(join(__dirname, "..", "auto-model-selection.ts"), "utf-8");
334
+ assert.ok(
335
+ src.includes("routingEligibleModels.map(m => `${m.provider}/${m.id}`)"),
336
+ "selectAndApplyModel should preserve provider prefixes for dynamic routing candidates",
337
+ );
338
+ assert.ok(
339
+ !src.includes("routingEligibleModels.map(m => m.id)"),
340
+ "selectAndApplyModel must not strip providers before resolving tier_models",
341
+ );
342
+ });
343
+
250
344
  test("resolveModelId: anthropic wins over claude-code when session provider is not claude-code", () => {
251
345
  const availableModels = [
252
346
  { id: "claude-sonnet-4-6", provider: "claude-code" },
@@ -0,0 +1,35 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { mkdtempSync, rmSync } from "node:fs";
4
+ import { join } from "node:path";
5
+ import { tmpdir } from "node:os";
6
+
7
+ import { buildSourceFilePaths } from "../auto-prompts.ts";
8
+
9
+ // Regression test for #4416: the fallback string must not mention `rg` because
10
+ // auto-mode runs on systems where ripgrep is not installed (e.g. Windows).
11
+ test("buildSourceFilePaths fallback does not reference rg or ripgrep", (t) => {
12
+ const tmp = mkdtempSync(join(tmpdir(), "gsd-prompts-fallback-"));
13
+ t.after(() => rmSync(tmp, { recursive: true, force: true }));
14
+
15
+ // No GSD files exist in tmp — forces the fallback branch.
16
+ const result = buildSourceFilePaths(tmp, "M001");
17
+
18
+ assert.ok(
19
+ !result.includes("rg ") && !result.includes("`rg`") && !result.includes("ripgrep"),
20
+ `Fallback string must not reference rg/ripgrep. Got: ${result}`,
21
+ );
22
+ assert.ok(result.length > 0, "Fallback string must not be empty");
23
+ });
24
+
25
+ test("buildSourceFilePaths with sid also produces rg-free fallback", (t) => {
26
+ const tmp = mkdtempSync(join(tmpdir(), "gsd-prompts-fallback-sid-"));
27
+ t.after(() => rmSync(tmp, { recursive: true, force: true }));
28
+
29
+ const result = buildSourceFilePaths(tmp, "M001", "S01");
30
+
31
+ assert.ok(
32
+ !result.includes("rg ") && !result.includes("`rg`") && !result.includes("ripgrep"),
33
+ `Fallback string must not reference rg/ripgrep. Got: ${result}`,
34
+ );
35
+ });