gsd-pi 2.75.0-dev.063e5a3 → 2.75.0-dev.b6ad8c5f7

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 (718) hide show
  1. package/README.md +186 -149
  2. package/dist/claude-cli-check.d.ts +10 -0
  3. package/dist/claude-cli-check.js +13 -3
  4. package/dist/headless-events.d.ts +1 -1
  5. package/dist/headless-events.js +5 -2
  6. package/dist/headless.js +5 -6
  7. package/dist/loader.js +0 -0
  8. package/dist/onboarding.d.ts +20 -1
  9. package/dist/onboarding.js +99 -39
  10. package/dist/resources/extensions/ask-user-questions.js +17 -5
  11. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  12. package/dist/resources/extensions/claude-code-cli/readiness.js +12 -2
  13. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +76 -4
  14. package/dist/resources/extensions/gsd/auto/detect-stuck.js +9 -0
  15. package/dist/resources/extensions/gsd/auto/loop.js +67 -4
  16. package/dist/resources/extensions/gsd/auto/phases.js +70 -47
  17. package/dist/resources/extensions/gsd/auto/resolve.js +1 -1
  18. package/dist/resources/extensions/gsd/auto/run-unit.js +10 -1
  19. package/dist/resources/extensions/gsd/auto/session.js +5 -0
  20. package/dist/resources/extensions/gsd/auto-artifact-paths.js +20 -0
  21. package/dist/resources/extensions/gsd/auto-dashboard.js +15 -7
  22. package/dist/resources/extensions/gsd/auto-dispatch.js +112 -6
  23. package/dist/resources/extensions/gsd/auto-loop.js +1 -1
  24. package/dist/resources/extensions/gsd/auto-model-selection.js +11 -3
  25. package/dist/resources/extensions/gsd/auto-post-unit.js +10 -8
  26. package/dist/resources/extensions/gsd/auto-prompts.js +173 -39
  27. package/dist/resources/extensions/gsd/auto-recovery.js +57 -0
  28. package/dist/resources/extensions/gsd/auto-start.js +5 -3
  29. package/dist/resources/extensions/gsd/auto-verification.js +3 -3
  30. package/dist/resources/extensions/gsd/auto-worktree.js +55 -1
  31. package/dist/resources/extensions/gsd/auto.js +57 -25
  32. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +8 -21
  33. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +45 -23
  34. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +29 -0
  35. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +22 -0
  36. package/dist/resources/extensions/gsd/commands/catalog.js +81 -9
  37. package/dist/resources/extensions/gsd/commands/handlers/core.js +64 -24
  38. package/dist/resources/extensions/gsd/commands/handlers/escalate.js +171 -0
  39. package/dist/resources/extensions/gsd/commands/handlers/onboarding.js +199 -0
  40. package/dist/resources/extensions/gsd/commands/handlers/ops.js +16 -0
  41. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +228 -29
  42. package/dist/resources/extensions/gsd/commands-cmux.js +5 -2
  43. package/dist/resources/extensions/gsd/commands-config.js +5 -0
  44. package/dist/resources/extensions/gsd/commands-debug.js +388 -0
  45. package/dist/resources/extensions/gsd/commands-do.js +1 -0
  46. package/dist/resources/extensions/gsd/commands-extract-learnings.js +233 -75
  47. package/dist/resources/extensions/gsd/commands-handlers.js +21 -2
  48. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +40 -12
  49. package/dist/resources/extensions/gsd/commands-scan.js +94 -0
  50. package/dist/resources/extensions/gsd/commands-workflow-templates.js +101 -2
  51. package/dist/resources/extensions/gsd/custom-workflow-engine.js +74 -54
  52. package/dist/resources/extensions/gsd/db-writer.js +1 -0
  53. package/dist/resources/extensions/gsd/debug-session-store.js +238 -0
  54. package/dist/resources/extensions/gsd/definition-loader.js +7 -0
  55. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -9
  56. package/dist/resources/extensions/gsd/doctor-environment.js +2 -1
  57. package/dist/resources/extensions/gsd/doctor-git-checks.js +5 -1
  58. package/dist/resources/extensions/gsd/doctor-proactive.js +4 -1
  59. package/dist/resources/extensions/gsd/doctor-providers.js +48 -20
  60. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +22 -4
  61. package/dist/resources/extensions/gsd/doctor.js +7 -1
  62. package/dist/resources/extensions/gsd/error-classifier.js +6 -3
  63. package/dist/resources/extensions/gsd/escalation.js +321 -0
  64. package/dist/resources/extensions/gsd/forensics.js +26 -29
  65. package/dist/resources/extensions/gsd/git-service.js +0 -1
  66. package/dist/resources/extensions/gsd/graph.js +26 -2
  67. package/dist/resources/extensions/gsd/gsd-db.js +254 -29
  68. package/dist/resources/extensions/gsd/health-widget-core.js +42 -14
  69. package/dist/resources/extensions/gsd/health-widget.js +7 -4
  70. package/dist/resources/extensions/gsd/init-wizard.js +86 -45
  71. package/dist/resources/extensions/gsd/markdown-renderer.js +5 -5
  72. package/dist/resources/extensions/gsd/metrics.js +1 -0
  73. package/dist/resources/extensions/gsd/model-cost-table.js +3 -1
  74. package/dist/resources/extensions/gsd/model-router.js +16 -6
  75. package/dist/resources/extensions/gsd/native-git-bridge.js +137 -5
  76. package/dist/resources/extensions/gsd/notification-overlay.js +7 -22
  77. package/dist/resources/extensions/gsd/notification-widget.js +24 -39
  78. package/dist/resources/extensions/gsd/notifications.js +4 -0
  79. package/dist/resources/extensions/gsd/onboarding-state.js +133 -0
  80. package/dist/resources/extensions/gsd/post-execution-checks.js +27 -11
  81. package/dist/resources/extensions/gsd/pre-execution-checks.js +97 -4
  82. package/dist/resources/extensions/gsd/preferences-models.js +1 -0
  83. package/dist/resources/extensions/gsd/preferences-types.js +2 -1
  84. package/dist/resources/extensions/gsd/preferences-validation.js +42 -8
  85. package/dist/resources/extensions/gsd/preferences.js +10 -10
  86. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
  87. package/dist/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
  88. package/dist/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
  89. package/dist/resources/extensions/gsd/prompts/execute-task.md +12 -0
  90. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
  91. package/dist/resources/extensions/gsd/prompts/refine-slice.md +69 -0
  92. package/dist/resources/extensions/gsd/prompts/scan.md +79 -0
  93. package/dist/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
  94. package/dist/resources/extensions/gsd/python-resolver.js +70 -0
  95. package/dist/resources/extensions/gsd/run-manager.js +37 -17
  96. package/dist/resources/extensions/gsd/setup-catalog.js +75 -0
  97. package/dist/resources/extensions/gsd/state.js +47 -3
  98. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
  99. package/dist/resources/extensions/gsd/tools/complete-task.js +80 -0
  100. package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -12
  101. package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -2
  102. package/dist/resources/extensions/gsd/tools/skip-slice.js +78 -0
  103. package/dist/resources/extensions/gsd/uok/flags.js +7 -7
  104. package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
  105. package/dist/resources/extensions/gsd/verification-gate.js +2 -1
  106. package/dist/resources/extensions/gsd/workflow-dispatch.js +64 -0
  107. package/dist/resources/extensions/gsd/workflow-install.js +327 -0
  108. package/dist/resources/extensions/gsd/workflow-manifest.js +8 -0
  109. package/dist/resources/extensions/gsd/workflow-mcp.js +1 -6
  110. package/dist/resources/extensions/gsd/workflow-plugins.js +346 -0
  111. package/dist/resources/extensions/gsd/workflow-projections.js +17 -15
  112. package/dist/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
  113. package/dist/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
  114. package/dist/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
  115. package/dist/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
  116. package/dist/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
  117. package/dist/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
  118. package/dist/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
  119. package/dist/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
  120. package/dist/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
  121. package/dist/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
  122. package/dist/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
  123. package/dist/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
  124. package/dist/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
  125. package/dist/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
  126. package/dist/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
  127. package/dist/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
  128. package/dist/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
  129. package/dist/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
  130. package/dist/resources/extensions/gsd/workflow-templates/registry.json +184 -0
  131. package/dist/resources/extensions/gsd/workflow-templates/release.md +118 -0
  132. package/dist/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
  133. package/dist/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
  134. package/dist/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
  135. package/dist/resources/extensions/gsd/workflow-templates/spike.md +1 -0
  136. package/dist/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
  137. package/dist/resources/extensions/gsd/worktree-resolver.js +42 -1
  138. package/dist/resources/extensions/remote-questions/commands.js +380 -0
  139. package/dist/resources/extensions/remote-questions/manager.js +39 -5
  140. package/dist/resources/extensions/remote-questions/telegram-adapter.js +79 -4
  141. package/dist/resources/extensions/shared/interview-ui.js +189 -1
  142. package/dist/resources/extensions/shared/layout-utils.js +17 -0
  143. package/dist/resources/extensions/shared/rtk-shared.js +47 -0
  144. package/dist/resources/extensions/shared/rtk.js +3 -46
  145. package/dist/resources/skills/create-workflow/SKILL.md +33 -6
  146. package/dist/rtk-shared.d.ts +10 -0
  147. package/dist/rtk-shared.js +47 -0
  148. package/dist/rtk.d.ts +2 -6
  149. package/dist/rtk.js +3 -48
  150. package/dist/shared/workspace-types.d.ts +52 -0
  151. package/dist/shared/workspace-types.js +1 -0
  152. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  153. package/dist/update-check.d.ts +10 -0
  154. package/dist/update-check.js +24 -3
  155. package/dist/web/standalone/.next/BUILD_ID +1 -1
  156. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  157. package/dist/web/standalone/.next/build-manifest.json +3 -3
  158. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  159. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  160. package/dist/web/standalone/.next/required-server-files.json +1 -1
  161. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  163. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  164. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  165. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  166. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  167. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  169. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  170. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  172. package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
  173. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  174. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  176. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  178. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  179. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  183. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  185. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  186. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  187. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  189. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  191. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  193. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  195. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  197. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  201. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  203. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  205. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  207. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  209. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  211. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  212. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  213. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  215. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  217. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  219. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  221. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  222. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  223. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  224. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  225. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  227. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  229. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  230. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  231. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  233. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  234. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  235. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  236. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  237. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  238. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  239. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  240. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  241. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  242. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  244. package/dist/web/standalone/.next/server/app/index.html +1 -1
  245. package/dist/web/standalone/.next/server/app/index.rsc +3 -3
  246. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  247. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
  248. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  249. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  250. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  251. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  252. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  253. package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
  254. package/dist/web/standalone/.next/server/chunks/7461.js +1 -0
  255. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  256. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  257. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  258. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  259. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  260. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  261. package/dist/web/standalone/.next/static/chunks/2826.e59e8578e2e28639.js +9 -0
  262. package/dist/web/standalone/.next/static/chunks/{2008.71ee9230ad78df21.js → 3621.fc7480022c972438.js} +2 -2
  263. package/dist/web/standalone/.next/static/chunks/app/{page-f1e30ab6bb269149.js → page-5b113fd32bc2a1c3.js} +1 -1
  264. package/dist/web/standalone/.next/static/chunks/{webpack-b868033a5834586d.js → webpack-5fc74f13a25fa1bb.js} +1 -1
  265. package/dist/web/standalone/.next/static/css/632cd626b1731d88.css +1 -0
  266. package/dist/web/standalone/server.js +1 -1
  267. package/dist/welcome-screen.js +48 -24
  268. package/dist/wizard.js +2 -2
  269. package/dist/worktree-cli.d.ts +6 -5
  270. package/dist/worktree-cli.js +23 -7
  271. package/package.json +3 -3
  272. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  273. package/packages/native/tsconfig.tsbuildinfo +1 -1
  274. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  275. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
  276. package/packages/pi-ai/dist/models/capability-patches.js +3 -2
  277. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
  278. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +68 -0
  279. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -1
  280. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +68 -0
  281. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -1
  282. package/packages/pi-ai/dist/models/generated/anthropic.d.ts +17 -0
  283. package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -1
  284. package/packages/pi-ai/dist/models/generated/anthropic.js +17 -0
  285. package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -1
  286. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +17 -0
  287. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -1
  288. package/packages/pi-ai/dist/models/generated/google-antigravity.js +17 -0
  289. package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -1
  290. package/packages/pi-ai/dist/models/generated/groq.d.ts +0 -153
  291. package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -1
  292. package/packages/pi-ai/dist/models/generated/groq.js +0 -153
  293. package/packages/pi-ai/dist/models/generated/groq.js.map +1 -1
  294. package/packages/pi-ai/dist/models/generated/index.d.ts +136 -153
  295. package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
  296. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
  297. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
  298. package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
  299. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
  300. package/packages/pi-ai/dist/models/generated/openrouter.d.ts +17 -0
  301. package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -1
  302. package/packages/pi-ai/dist/models/generated/openrouter.js +17 -0
  303. package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -1
  304. package/packages/pi-ai/dist/models.generated.test.js +17 -0
  305. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  306. package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts +22 -1
  307. package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  308. package/packages/pi-ai/dist/providers/amazon-bedrock.js +40 -6
  309. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  310. package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts +2 -0
  311. package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts.map +1 -0
  312. package/packages/pi-ai/dist/providers/amazon-bedrock.test.js +106 -0
  313. package/packages/pi-ai/dist/providers/amazon-bedrock.test.js.map +1 -0
  314. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +42 -1
  315. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  316. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts +20 -1
  317. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  318. package/packages/pi-ai/dist/providers/anthropic-shared.js +32 -2
  319. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  320. package/packages/pi-ai/dist/providers/anthropic-shared.test.js +12 -1
  321. package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -1
  322. package/packages/pi-ai/dist/providers/anthropic.d.ts +11 -0
  323. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  324. package/packages/pi-ai/dist/providers/anthropic.js +18 -1
  325. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  326. package/packages/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
  327. package/packages/pi-ai/dist/utils/oauth/openai-codex.js +12 -0
  328. package/packages/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
  329. package/packages/pi-ai/package.json +1 -1
  330. package/packages/pi-ai/scripts/generate-models.ts +50 -0
  331. package/packages/pi-ai/src/models/capability-patches.ts +5 -2
  332. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +68 -0
  333. package/packages/pi-ai/src/models/generated/anthropic.ts +17 -0
  334. package/packages/pi-ai/src/models/generated/google-antigravity.ts +17 -0
  335. package/packages/pi-ai/src/models/generated/groq.ts +0 -153
  336. package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
  337. package/packages/pi-ai/src/models/generated/openrouter.ts +17 -0
  338. package/packages/pi-ai/src/models.generated.test.ts +17 -0
  339. package/packages/pi-ai/src/providers/amazon-bedrock.test.ts +164 -0
  340. package/packages/pi-ai/src/providers/amazon-bedrock.ts +41 -7
  341. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +47 -1
  342. package/packages/pi-ai/src/providers/anthropic-shared.test.ts +15 -1
  343. package/packages/pi-ai/src/providers/anthropic-shared.ts +36 -3
  344. package/packages/pi-ai/src/providers/anthropic.ts +19 -1
  345. package/packages/pi-ai/src/utils/oauth/openai-codex.ts +15 -0
  346. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  347. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts +2 -0
  348. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts.map +1 -0
  349. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +38 -0
  350. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -0
  351. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +14 -0
  352. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  353. package/packages/pi-coding-agent/dist/core/auth-storage.js +34 -0
  354. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  355. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +74 -0
  356. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  357. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +4 -1
  358. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  359. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +32 -0
  360. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  361. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  362. package/packages/pi-coding-agent/dist/core/sdk.js +32 -0
  363. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  364. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +2 -2
  365. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  366. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  367. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +17 -7
  368. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  369. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  370. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +48 -34
  371. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  372. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts +4 -0
  373. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  374. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +83 -33
  375. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  376. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
  377. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
  378. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +77 -0
  379. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -0
  380. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -66
  381. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  382. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +1 -75
  383. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  384. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts +1 -1
  385. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  386. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +192 -24
  387. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  388. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +56 -0
  389. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +83 -0
  390. package/packages/pi-coding-agent/src/core/auth-storage.ts +35 -0
  391. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +4 -1
  392. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +37 -1
  393. package/packages/pi-coding-agent/src/core/sdk.ts +41 -0
  394. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +2 -2
  395. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +19 -7
  396. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +53 -31
  397. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +88 -36
  398. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +83 -0
  399. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +2 -83
  400. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +208 -27
  401. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  402. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  403. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  404. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
  405. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
  406. package/pkg/dist/modes/interactive/theme/theme-schema.js +77 -0
  407. package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -0
  408. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -66
  409. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  410. package/pkg/dist/modes/interactive/theme/theme.js +1 -75
  411. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  412. package/pkg/dist/modes/interactive/theme/themes.d.ts +1 -1
  413. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  414. package/pkg/dist/modes/interactive/theme/themes.js +192 -24
  415. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  416. package/src/resources/extensions/ask-user-questions.ts +24 -6
  417. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  418. package/src/resources/extensions/claude-code-cli/readiness.ts +13 -2
  419. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +94 -4
  420. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +84 -0
  421. package/src/resources/extensions/gsd/auto/detect-stuck.ts +10 -0
  422. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  423. package/src/resources/extensions/gsd/auto/loop.ts +109 -3
  424. package/src/resources/extensions/gsd/auto/phases.ts +94 -60
  425. package/src/resources/extensions/gsd/auto/resolve.ts +1 -1
  426. package/src/resources/extensions/gsd/auto/run-unit.ts +11 -1
  427. package/src/resources/extensions/gsd/auto/session.ts +7 -0
  428. package/src/resources/extensions/gsd/auto-artifact-paths.ts +20 -0
  429. package/src/resources/extensions/gsd/auto-dashboard.ts +21 -4
  430. package/src/resources/extensions/gsd/auto-dispatch.ts +123 -5
  431. package/src/resources/extensions/gsd/auto-loop.ts +1 -1
  432. package/src/resources/extensions/gsd/auto-model-selection.ts +14 -3
  433. package/src/resources/extensions/gsd/auto-post-unit.ts +10 -8
  434. package/src/resources/extensions/gsd/auto-prompts.ts +201 -40
  435. package/src/resources/extensions/gsd/auto-recovery.ts +63 -1
  436. package/src/resources/extensions/gsd/auto-start.ts +8 -6
  437. package/src/resources/extensions/gsd/auto-verification.ts +3 -3
  438. package/src/resources/extensions/gsd/auto-worktree.ts +65 -0
  439. package/src/resources/extensions/gsd/auto.ts +61 -28
  440. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +8 -21
  441. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +46 -24
  442. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +31 -0
  443. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
  444. package/src/resources/extensions/gsd/commands/catalog.ts +74 -9
  445. package/src/resources/extensions/gsd/commands/handlers/core.ts +69 -27
  446. package/src/resources/extensions/gsd/commands/handlers/escalate.ts +216 -0
  447. package/src/resources/extensions/gsd/commands/handlers/onboarding.ts +262 -0
  448. package/src/resources/extensions/gsd/commands/handlers/ops.ts +16 -0
  449. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +279 -29
  450. package/src/resources/extensions/gsd/commands-cmux.ts +6 -2
  451. package/src/resources/extensions/gsd/commands-config.ts +10 -0
  452. package/src/resources/extensions/gsd/commands-debug.ts +484 -0
  453. package/src/resources/extensions/gsd/commands-do.ts +1 -0
  454. package/src/resources/extensions/gsd/commands-extract-learnings.ts +295 -76
  455. package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
  456. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +49 -12
  457. package/src/resources/extensions/gsd/commands-scan.ts +125 -0
  458. package/src/resources/extensions/gsd/commands-workflow-templates.ts +129 -2
  459. package/src/resources/extensions/gsd/custom-workflow-engine.ts +85 -60
  460. package/src/resources/extensions/gsd/db-writer.ts +3 -0
  461. package/src/resources/extensions/gsd/debug-session-store.ts +377 -0
  462. package/src/resources/extensions/gsd/definition-loader.ts +7 -0
  463. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -9
  464. package/src/resources/extensions/gsd/doctor-environment.ts +2 -1
  465. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -1
  466. package/src/resources/extensions/gsd/doctor-proactive.ts +4 -1
  467. package/src/resources/extensions/gsd/doctor-providers.ts +52 -22
  468. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +23 -4
  469. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  470. package/src/resources/extensions/gsd/doctor.ts +7 -1
  471. package/src/resources/extensions/gsd/error-classifier.ts +6 -3
  472. package/src/resources/extensions/gsd/escalation.ts +367 -0
  473. package/src/resources/extensions/gsd/forensics.ts +25 -29
  474. package/src/resources/extensions/gsd/git-service.ts +0 -1
  475. package/src/resources/extensions/gsd/graph.ts +33 -3
  476. package/src/resources/extensions/gsd/gsd-db.ts +306 -29
  477. package/src/resources/extensions/gsd/health-widget-core.ts +43 -14
  478. package/src/resources/extensions/gsd/health-widget.ts +7 -3
  479. package/src/resources/extensions/gsd/init-wizard.ts +87 -54
  480. package/src/resources/extensions/gsd/markdown-renderer.ts +5 -5
  481. package/src/resources/extensions/gsd/metrics.ts +1 -0
  482. package/src/resources/extensions/gsd/model-cost-table.ts +3 -1
  483. package/src/resources/extensions/gsd/model-router.ts +25 -6
  484. package/src/resources/extensions/gsd/native-git-bridge.ts +134 -6
  485. package/src/resources/extensions/gsd/notification-overlay.ts +9 -19
  486. package/src/resources/extensions/gsd/notification-widget.ts +25 -43
  487. package/src/resources/extensions/gsd/notifications.ts +6 -0
  488. package/src/resources/extensions/gsd/onboarding-state.ts +146 -0
  489. package/src/resources/extensions/gsd/post-execution-checks.ts +37 -14
  490. package/src/resources/extensions/gsd/pre-execution-checks.ts +98 -8
  491. package/src/resources/extensions/gsd/preferences-models.ts +1 -0
  492. package/src/resources/extensions/gsd/preferences-types.ts +10 -2
  493. package/src/resources/extensions/gsd/preferences-validation.ts +33 -7
  494. package/src/resources/extensions/gsd/preferences.ts +10 -10
  495. package/src/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
  496. package/src/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
  497. package/src/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
  498. package/src/resources/extensions/gsd/prompts/execute-task.md +12 -0
  499. package/src/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
  500. package/src/resources/extensions/gsd/prompts/refine-slice.md +69 -0
  501. package/src/resources/extensions/gsd/prompts/scan.md +79 -0
  502. package/src/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
  503. package/src/resources/extensions/gsd/python-resolver.ts +76 -0
  504. package/src/resources/extensions/gsd/run-manager.ts +53 -19
  505. package/src/resources/extensions/gsd/setup-catalog.ts +105 -0
  506. package/src/resources/extensions/gsd/state.ts +50 -2
  507. package/src/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
  508. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +1 -34
  509. package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +7 -0
  510. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +45 -31
  511. package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +63 -0
  512. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +12 -0
  513. package/src/resources/extensions/gsd/tests/auto-prompts-fallback.test.ts +35 -0
  514. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +123 -1
  515. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +39 -0
  516. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +39 -0
  517. package/src/resources/extensions/gsd/tests/commands-do.test.ts +48 -0
  518. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +333 -21
  519. package/src/resources/extensions/gsd/tests/commands-scan.test.ts +351 -0
  520. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +8 -6
  521. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +6 -8
  522. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  523. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +63 -0
  524. package/src/resources/extensions/gsd/tests/debug-command-handler.test.ts +905 -0
  525. package/src/resources/extensions/gsd/tests/debug-command-lifecycle.integration.test.ts +1229 -0
  526. package/src/resources/extensions/gsd/tests/debug-session-store.test.ts +565 -0
  527. package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +64 -0
  528. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +67 -0
  529. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +62 -18
  530. package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +5 -0
  531. package/src/resources/extensions/gsd/tests/escalation.test.ts +818 -0
  532. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +29 -12
  533. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +106 -0
  534. package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +74 -0
  535. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +0 -4
  536. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -1
  537. package/src/resources/extensions/gsd/tests/health-widget.test.ts +8 -2
  538. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +190 -0
  539. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +39 -0
  540. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +44 -0
  541. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +68 -1
  542. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +109 -11
  543. package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +51 -0
  544. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +2 -2
  545. package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
  546. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +171 -1
  547. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  548. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  549. package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +3 -2
  550. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +2 -2
  551. package/src/resources/extensions/gsd/tests/model-router.test.ts +51 -1
  552. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +59 -0
  553. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +56 -37
  554. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +1 -1
  555. package/src/resources/extensions/gsd/tests/onboarding-handler-loader.test.ts +41 -0
  556. package/src/resources/extensions/gsd/tests/onboarding-state.test.ts +105 -0
  557. package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +114 -0
  558. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +4 -5
  559. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +17 -0
  560. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -1
  561. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +275 -6
  562. package/src/resources/extensions/gsd/tests/preferences.test.ts +69 -1
  563. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +539 -0
  564. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +11 -2
  565. package/src/resources/extensions/gsd/tests/projection-regression.test.ts +7 -0
  566. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +27 -0
  567. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +24 -0
  568. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +1 -1
  569. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +33 -0
  570. package/src/resources/extensions/gsd/tests/python-resolver.test.ts +131 -0
  571. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +67 -0
  572. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +107 -0
  573. package/src/resources/extensions/gsd/tests/requirements.test.ts +9 -0
  574. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +153 -0
  575. package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +125 -0
  576. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +16 -4
  577. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +3 -0
  578. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +15 -0
  579. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +5 -0
  580. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +2 -1
  581. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +31 -1
  582. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +166 -0
  583. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +35 -0
  584. package/src/resources/extensions/gsd/tests/workflow-install.test.ts +113 -0
  585. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +15 -6
  586. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  587. package/src/resources/extensions/gsd/tests/workflow-plugins.test.ts +310 -0
  588. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +7 -0
  589. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +8 -2
  590. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +2 -1
  591. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +77 -2
  592. package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
  593. package/src/resources/extensions/gsd/tools/plan-milestone.ts +42 -8
  594. package/src/resources/extensions/gsd/tools/plan-slice.ts +6 -1
  595. package/src/resources/extensions/gsd/tools/skip-slice.ts +133 -0
  596. package/src/resources/extensions/gsd/types.ts +62 -0
  597. package/src/resources/extensions/gsd/unit-runtime.ts +1 -0
  598. package/src/resources/extensions/gsd/uok/contracts.ts +2 -1
  599. package/src/resources/extensions/gsd/uok/flags.ts +7 -7
  600. package/src/resources/extensions/gsd/uok/kernel.ts +16 -4
  601. package/src/resources/extensions/gsd/verification-gate.ts +2 -1
  602. package/src/resources/extensions/gsd/workflow-dispatch.ts +106 -0
  603. package/src/resources/extensions/gsd/workflow-install.ts +423 -0
  604. package/src/resources/extensions/gsd/workflow-manifest.ts +8 -0
  605. package/src/resources/extensions/gsd/workflow-mcp.ts +1 -6
  606. package/src/resources/extensions/gsd/workflow-plugins.ts +403 -0
  607. package/src/resources/extensions/gsd/workflow-projections.ts +18 -16
  608. package/src/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
  609. package/src/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
  610. package/src/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
  611. package/src/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
  612. package/src/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
  613. package/src/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
  614. package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
  615. package/src/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
  616. package/src/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
  617. package/src/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
  618. package/src/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
  619. package/src/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
  620. package/src/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
  621. package/src/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
  622. package/src/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
  623. package/src/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
  624. package/src/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
  625. package/src/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
  626. package/src/resources/extensions/gsd/workflow-templates/registry.json +184 -0
  627. package/src/resources/extensions/gsd/workflow-templates/release.md +118 -0
  628. package/src/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
  629. package/src/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
  630. package/src/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
  631. package/src/resources/extensions/gsd/workflow-templates/spike.md +1 -0
  632. package/src/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
  633. package/src/resources/extensions/gsd/workflow-templates.ts +7 -0
  634. package/src/resources/extensions/gsd/workspace-index.ts +9 -4
  635. package/src/resources/extensions/gsd/worktree-resolver.ts +47 -1
  636. package/src/resources/extensions/remote-questions/commands.ts +480 -0
  637. package/src/resources/extensions/remote-questions/manager.ts +49 -4
  638. package/src/resources/extensions/remote-questions/telegram-adapter.ts +86 -4
  639. package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +246 -0
  640. package/src/resources/extensions/remote-questions/tests/remote-answer-normalization.test.ts +92 -0
  641. package/src/resources/extensions/remote-questions/tests/telegram-commands.test.ts +267 -0
  642. package/src/resources/extensions/shared/interview-ui.ts +195 -1
  643. package/src/resources/extensions/shared/layout-utils.ts +26 -0
  644. package/src/resources/extensions/shared/rtk-shared.ts +58 -0
  645. package/src/resources/extensions/shared/rtk.ts +12 -52
  646. package/src/resources/extensions/shared/tests/interview-preview.test.ts +177 -0
  647. package/src/resources/extensions/shared/tests/preview-layout.test.ts +120 -0
  648. package/src/resources/skills/create-workflow/SKILL.md +33 -6
  649. package/dist/web/standalone/.next/static/chunks/2826.dd3dc8bbd3025fa5.js +0 -9
  650. package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +0 -1
  651. package/packages/native/dist/ps/types.d.ts +0 -5
  652. package/packages/native/dist/ps/types.js +0 -2
  653. package/packages/native/src/ps/types.ts +0 -5
  654. package/packages/pi-ai/node_modules/@smithy/node-http-handler/LICENSE +0 -201
  655. package/packages/pi-ai/node_modules/@smithy/node-http-handler/README.md +0 -9
  656. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-cjs/index.js +0 -762
  657. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/build-abort-error.js +0 -19
  658. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/constants.js +0 -1
  659. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/get-transformed-headers.js +0 -9
  660. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/index.js +0 -3
  661. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http-handler.js +0 -230
  662. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-manager.js +0 -87
  663. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-pool.js +0 -32
  664. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-handler.js +0 -169
  665. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/readable.mock.js +0 -21
  666. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/server.mock.js +0 -88
  667. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-connection-timeout.js +0 -36
  668. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-request-timeout.js +0 -21
  669. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-keep-alive.js +0 -22
  670. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-timeout.js +0 -23
  671. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/collector.js +0 -8
  672. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/index.js +0 -41
  673. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/readable.mock.js +0 -21
  674. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/timing.js +0 -4
  675. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/write-request-body.js +0 -63
  676. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/build-abort-error.d.ts +0 -10
  677. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/constants.d.ts +0 -5
  678. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/get-transformed-headers.d.ts +0 -4
  679. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/index.d.ts +0 -3
  680. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http-handler.d.ts +0 -46
  681. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-manager.d.ts +0 -24
  682. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-pool.d.ts +0 -12
  683. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-handler.d.ts +0 -63
  684. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/readable.mock.d.ts +0 -13
  685. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/server.mock.d.ts +0 -12
  686. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-connection-timeout.d.ts +0 -2
  687. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-request-timeout.d.ts +0 -6
  688. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-keep-alive.d.ts +0 -6
  689. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-timeout.d.ts +0 -2
  690. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/collector.d.ts +0 -5
  691. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/index.d.ts +0 -6
  692. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/readable.mock.d.ts +0 -13
  693. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/timing.d.ts +0 -8
  694. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/build-abort-error.d.ts +0 -10
  695. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/constants.d.ts +0 -5
  696. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/get-transformed-headers.d.ts +0 -4
  697. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/index.d.ts +0 -3
  698. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http-handler.d.ts +0 -46
  699. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-manager.d.ts +0 -24
  700. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-pool.d.ts +0 -12
  701. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-handler.d.ts +0 -63
  702. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/readable.mock.d.ts +0 -13
  703. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/server.mock.d.ts +0 -12
  704. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-connection-timeout.d.ts +0 -2
  705. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-request-timeout.d.ts +0 -6
  706. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-keep-alive.d.ts +0 -6
  707. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-timeout.d.ts +0 -2
  708. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/collector.d.ts +0 -5
  709. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/index.d.ts +0 -6
  710. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/readable.mock.d.ts +0 -13
  711. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/timing.d.ts +0 -8
  712. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/write-request-body.d.ts +0 -12
  713. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/write-request-body.d.ts +0 -12
  714. package/packages/pi-ai/node_modules/@smithy/node-http-handler/package.json +0 -68
  715. package/packages/pi-ai/oauth.d.ts +0 -1
  716. package/packages/pi-ai/oauth.js +0 -1
  717. /package/dist/web/standalone/.next/static/{j7IBD35UgrL2b298GLK3V → J2z3GMC9QtSLr7gyoM38c}/_buildManifest.js +0 -0
  718. /package/dist/web/standalone/.next/static/{j7IBD35UgrL2b298GLK3V → J2z3GMC9QtSLr7gyoM38c}/_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,
@@ -849,7 +852,15 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
849
852
  return handleAllSlicesDone(basePath, activeMilestone, registry, requirements, milestoneProgress, sliceProgress);
850
853
  }
851
854
 
852
- const activeSliceContext = resolveSliceDependencies(activeMilestoneSlices);
855
+ // ADR-011 auto-heal: if a slice has a PLAN on disk but is still flagged is_sketch=1
856
+ // (e.g. a crash between plan-slice write and the sketch flip), reconcile before
857
+ // running phase derivation so the flag doesn't misroute state.
858
+ autoHealSketchFlags(activeMilestone.id, (sid) =>
859
+ !!resolveSliceFile(basePath, activeMilestone.id, sid, "PLAN"),
860
+ );
861
+ // Re-read slices after auto-heal so downstream reads see fresh is_sketch values.
862
+ const healedSlices = getMilestoneSlices(activeMilestone.id);
863
+ const activeSliceContext = resolveSliceDependencies(healedSlices);
853
864
  if (!activeSliceContext.activeSlice) {
854
865
  // If locked slice wasn't found, it returns null but logs warning, we need to return 'blocked'
855
866
  if (process.env.GSD_SLICE_LOCK) {
@@ -869,10 +880,24 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
869
880
  progress: { milestones: milestoneProgress, slices: sliceProgress },
870
881
  };
871
882
  }
872
- const { activeSlice } = activeSliceContext;
883
+ const { activeSlice, activeSliceRow } = activeSliceContext;
873
884
 
874
885
  const planFile = resolveSliceFile(basePath, activeMilestone.id, activeSlice.id, "PLAN");
875
886
  if (!planFile) {
887
+ // ADR-011: sketch slices with progressive_planning enabled enter the
888
+ // `refining` phase — a refine-slice unit expands the sketch into a full plan
889
+ // before execution. When the flag is off, sketches are indistinguishable
890
+ // from a missing plan and fall through to the normal `planning` phase.
891
+ const progressive = loadEffectiveGSDPreferences()?.preferences?.phases?.progressive_planning === true;
892
+ if (progressive && activeSliceRow?.is_sketch === 1) {
893
+ return {
894
+ activeMilestone, activeSlice, activeTask: null,
895
+ phase: 'refining', recentDecisions: [], blockers: [],
896
+ nextAction: `Refine sketch slice ${activeSlice.id} (${activeSlice.title}) using prior slice context.`,
897
+ registry, requirements,
898
+ progress: { milestones: milestoneProgress, slices: sliceProgress },
899
+ };
900
+ }
876
901
  return {
877
902
  activeMilestone, activeSlice, activeTask: null,
878
903
  phase: 'planning', recentDecisions: [], blockers: [],
@@ -965,6 +990,29 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
965
990
  }
966
991
  }
967
992
 
993
+ // ADR-011 Phase 2: pause-on-escalation takes precedence over dispatching the
994
+ // next task. `awaiting_review` tasks (continueWithDefault=true) are NOT
995
+ // surfaced here — they let the loop continue.
996
+ //
997
+ // We do NOT gate this on `phases.mid_execution_escalation` — creation of
998
+ // new escalations is gated at the write site (tools/complete-task.ts:315),
999
+ // but any escalation_pending row already persisted in the DB must be
1000
+ // honored even if the user later toggles the flag off. Otherwise those
1001
+ // rows would silently orphan, the loop would advance past the paused task,
1002
+ // and the user's prior resolution never lands.
1003
+ const escalatingTaskId = detectPendingEscalation(tasks, basePath);
1004
+ if (escalatingTaskId) {
1005
+ return {
1006
+ activeMilestone, activeSlice, activeTask,
1007
+ phase: 'escalating-task', recentDecisions: [],
1008
+ blockers: [`Task ${escalatingTaskId} requires a user decision before the loop can proceed`],
1009
+ nextAction: `Run /gsd escalate show ${escalatingTaskId} to review, then /gsd escalate resolve ${escalatingTaskId} <choice> to proceed.`,
1010
+ activeWorkspace: undefined,
1011
+ registry, requirements,
1012
+ progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
1013
+ };
1014
+ }
1015
+
968
1016
  if (!blockerTaskId) {
969
1017
  const isTriggered = checkReplanTrigger(basePath, activeMilestone.id, activeSlice.id);
970
1018
  if (isTriggered) {
@@ -44,19 +44,19 @@ uok:
44
44
  legacy_fallback:
45
45
  enabled: false
46
46
  gates:
47
- enabled: false
47
+ enabled: true
48
48
  model_policy:
49
- enabled: false
49
+ enabled: true
50
50
  execution_graph:
51
- enabled: false
51
+ enabled: true
52
52
  gitops:
53
- enabled: false
54
- turn_action: status-only
53
+ enabled: true
54
+ turn_action: commit
55
55
  turn_push: false
56
56
  audit_unified:
57
- enabled: false
57
+ enabled: true
58
58
  plan_v2:
59
- enabled: false
59
+ enabled: true
60
60
  auto_visualize:
61
61
  auto_report:
62
62
  parallel:
@@ -2,8 +2,7 @@
2
2
  * agent-end-retry.test.ts — Regression checks for the agent_end model.
3
3
  *
4
4
  * The per-unit one-shot resolve function lives at module level in auto-loop.ts
5
- * (_currentResolve). handleAgentEnd is a thin compatibility wrapper around
6
- * resolveAgentEnd().
5
+ * (_currentResolve). agent_end is handled via resolveAgentEnd().
7
6
  */
8
7
 
9
8
  import test from "node:test";
@@ -62,38 +61,6 @@ test("legacy pendingAgentEndRetry state is gone", () => {
62
61
  );
63
62
  });
64
63
 
65
- test("handleAgentEnd is a thin compatibility wrapper", () => {
66
- const source = getAutoTsSource();
67
- const fnIdx = source.indexOf("export async function handleAgentEnd");
68
- assert.ok(fnIdx > -1, "handleAgentEnd must exist in auto.ts");
69
- const fnBlock = source.slice(fnIdx, source.indexOf("\n// ─── ", fnIdx + 100));
70
-
71
- assert.ok(
72
- fnBlock.includes("resolveAgentEnd("),
73
- "handleAgentEnd must delegate to resolveAgentEnd",
74
- );
75
- assert.ok(
76
- !fnBlock.includes("pendingAgentEndRetry"),
77
- "handleAgentEnd must not use legacy retry state",
78
- );
79
- assert.ok(
80
- !fnBlock.includes("dispatchNextUnit"),
81
- "handleAgentEnd must not dispatch recursively",
82
- );
83
- });
84
-
85
- test("handleAgentEnd early return calls resolveAgentEndCancelled", () => {
86
- const source = getAutoTsSource();
87
- const fnIdx = source.indexOf("export async function handleAgentEnd");
88
- assert.ok(fnIdx > -1, "handleAgentEnd must exist in auto.ts");
89
- const fnBlock = source.slice(fnIdx, source.indexOf("\n// ─── ", fnIdx + 100));
90
-
91
- assert.ok(
92
- fnBlock.includes("resolveAgentEndCancelled()"),
93
- "handleAgentEnd must call resolveAgentEndCancelled on early return to prevent orphaned promises",
94
- );
95
- });
96
-
97
64
  test("pauseAuto calls resolveAgentEndCancelled to unblock the loop", () => {
98
65
  const source = getAutoTsSource();
99
66
  const fnIdx = source.indexOf("export async function pauseAuto");
@@ -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
  }
@@ -313,6 +313,42 @@ test("runUnit re-applies the selected unit model after newSession before dispatc
313
313
  assert.equal(pi.calls.length, 1);
314
314
  });
315
315
 
316
+ test("runUnit cancels before dispatch when model restore fails after newSession", async () => {
317
+ _resetPendingResolve();
318
+
319
+ const notifications: Array<{ message: string; level: string }> = [];
320
+ const ctx = makeMockCtx();
321
+ ctx.ui.notify = (message: string, level: string) => {
322
+ notifications.push({ message, level });
323
+ };
324
+
325
+ const pi = makeMockPi();
326
+ pi.setModel = async (...args: unknown[]) => {
327
+ pi.setModelCalls.push(args);
328
+ return false;
329
+ };
330
+
331
+ const s = makeMockSession();
332
+ s.currentUnitModel = { provider: "openai-codex", id: "gpt-5.4" };
333
+
334
+ const result = await runUnit(ctx, pi, s, "task", "T01", "prompt");
335
+
336
+ assert.equal(result.status, "cancelled");
337
+ assert.equal(result.errorContext?.category, "session-failed");
338
+ assert.match(
339
+ result.errorContext?.message ?? "",
340
+ /Failed to restore configured model openai-codex\/gpt-5\.4 after session creation/,
341
+ );
342
+ assert.equal(pi.setModelCalls.length, 1);
343
+ assert.equal(pi.calls.length, 0, "unit must not dispatch on the session default model");
344
+ assert.deepEqual(notifications, [
345
+ {
346
+ message: "Failed to restore configured model openai-codex/gpt-5.4 after session creation. Cancelling unit before dispatch.",
347
+ level: "warning",
348
+ },
349
+ ]);
350
+ });
351
+
316
352
  // ─── Structural assertions ───────────────────────────────────────────────────
317
353
 
318
354
  test("auto-loop.ts exports autoLoop, runUnit, resolveAgentEnd", async () => {
@@ -1267,7 +1303,7 @@ test("auto-loop.ts barrel re-exports autoLoop, runUnit, and resolveAgentEnd", ()
1267
1303
  );
1268
1304
  });
1269
1305
 
1270
- test("auto.ts startAuto dispatches through the UOK kernel wrapper (legacy loop adapter)", () => {
1306
+ test("auto.ts startAuto dispatches through the UOK kernel wrapper with explicit kernel and legacy paths", () => {
1271
1307
  const src = readFileSync(
1272
1308
  resolve(import.meta.dirname, "..", "auto.ts"),
1273
1309
  "utf-8",
@@ -1283,8 +1319,12 @@ test("auto.ts startAuto dispatches through the UOK kernel wrapper (legacy loop a
1283
1319
  "startAuto must dispatch through runAutoLoopWithUok()",
1284
1320
  );
1285
1321
  assert.ok(
1286
- fnBlock.includes("runLegacyLoop: autoLoop"),
1287
- "startAuto must preserve the legacy autoLoop adapter in kernel dispatch",
1322
+ fnBlock.includes("runKernelLoop: runUokKernelLoop"),
1323
+ "startAuto must wire the explicit UOK kernel loop path",
1324
+ );
1325
+ assert.ok(
1326
+ fnBlock.includes("runLegacyLoop: runLegacyAutoLoop"),
1327
+ "startAuto must preserve explicit legacy fallback dispatch",
1288
1328
  );
1289
1329
  });
1290
1330
 
@@ -1332,7 +1372,7 @@ test("startAuto guards against concurrent invocation (#2923)", () => {
1332
1372
  );
1333
1373
  });
1334
1374
 
1335
- test("agent_end handler calls resolveAgentEnd (not handleAgentEnd)", () => {
1375
+ test("agent_end handler calls resolveAgentEnd (not the legacy auto.ts path)", () => {
1336
1376
  const hooksSrc = readFileSync(
1337
1377
  resolve(import.meta.dirname, "..", "bootstrap", "register-hooks.ts"),
1338
1378
  "utf-8",
@@ -1347,7 +1387,7 @@ test("agent_end handler calls resolveAgentEnd (not handleAgentEnd)", () => {
1347
1387
  );
1348
1388
  assert.ok(
1349
1389
  recoverySrc.includes("resolveAgentEnd(event)"),
1350
- "agent_end success path must call resolveAgentEnd(event) instead of handleAgentEnd(ctx, pi)",
1390
+ "agent_end success path must call resolveAgentEnd(event) instead of legacy wrappers",
1351
1391
  );
1352
1392
  assert.ok(
1353
1393
  recoverySrc.includes("isSessionSwitchInFlight()"),
@@ -1389,32 +1429,6 @@ test("auto-timeout-recovery.ts calls resolveAgentEnd instead of dispatchNextUnit
1389
1429
  );
1390
1430
  });
1391
1431
 
1392
- test("handleAgentEnd in auto.ts is a thin wrapper calling resolveAgentEnd", () => {
1393
- const src = readFileSync(
1394
- resolve(import.meta.dirname, "..", "auto.ts"),
1395
- "utf-8",
1396
- );
1397
- const fnIdx = src.indexOf("export async function handleAgentEnd");
1398
- assert.ok(fnIdx > -1, "handleAgentEnd must exist");
1399
- const fnEnd = src.indexOf("\n// ─── ", fnIdx + 100);
1400
- const fnBlock =
1401
- fnEnd > -1 ? src.slice(fnIdx, fnEnd) : src.slice(fnIdx, fnIdx + 1000);
1402
- assert.ok(
1403
- fnBlock.includes("resolveAgentEnd("),
1404
- "handleAgentEnd must call resolveAgentEnd",
1405
- );
1406
- // The function should be short — no reentrancy guard, no verification, no dispatch
1407
- assert.ok(
1408
- !fnBlock.includes("dispatchNextUnit"),
1409
- "handleAgentEnd must not call dispatchNextUnit (it's now a thin wrapper)",
1410
- );
1411
- assert.ok(
1412
- !fnBlock.includes("postUnitPreVerification") &&
1413
- !fnBlock.includes("postUnitPostVerification"),
1414
- "handleAgentEnd must not contain verification logic (moved to autoLoop)",
1415
- );
1416
- });
1417
-
1418
1432
  // ── Stuck counter tests ──────────────────────────────────────────────────────
1419
1433
 
1420
1434
  test("stuck detection: stops when sliding window detects same unit 3 consecutive times", async () => {
@@ -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
+ });
@@ -247,6 +247,18 @@ test("model policy receives task metadata for requirement-vector decisions", ()
247
247
  );
248
248
  });
249
249
 
250
+ test("dynamic routing passes provider-qualified model keys to the router", () => {
251
+ const src = readFileSync(join(__dirname, "..", "auto-model-selection.ts"), "utf-8");
252
+ assert.ok(
253
+ src.includes("routingEligibleModels.map(m => `${m.provider}/${m.id}`)"),
254
+ "selectAndApplyModel should preserve provider prefixes for dynamic routing candidates",
255
+ );
256
+ assert.ok(
257
+ !src.includes("routingEligibleModels.map(m => m.id)"),
258
+ "selectAndApplyModel must not strip providers before resolving tier_models",
259
+ );
260
+ });
261
+
250
262
  test("resolveModelId: anthropic wins over claude-code when session provider is not claude-code", () => {
251
263
  const availableModels = [
252
264
  { 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
+ });
@@ -5,7 +5,8 @@ import { join } from "node:path";
5
5
  import { tmpdir } from "node:os";
6
6
  import { randomUUID } from "node:crypto";
7
7
 
8
- import { verifyExpectedArtifact, hasImplementationArtifacts, resolveExpectedArtifactPath, diagnoseExpectedArtifact, buildLoopRemediationSteps } from "../auto-recovery.ts";
8
+ import { verifyExpectedArtifact, hasImplementationArtifacts, resolveExpectedArtifactPath, diagnoseExpectedArtifact, buildLoopRemediationSteps, writeBlockerPlaceholder } from "../auto-recovery.ts";
9
+ import { resolveMilestoneFile } from "../paths.ts";
9
10
  import { openDatabase, closeDatabase, insertMilestone, insertSlice, insertGateRow } from "../gsd-db.ts";
10
11
  import { clearParseCache } from "../files.ts";
11
12
  import { parseRoadmap } from "../parsers-legacy.ts";
@@ -712,3 +713,124 @@ test("verifyExpectedArtifact checks pending gate-evaluate artifacts without ESM
712
713
 
713
714
  assert.equal(verified, false, "pending gates should keep gate-evaluate unverified");
714
715
  });
716
+
717
+ // ─── #4414 regressions ────────────────────────────────────────────────────────
718
+
719
+ test("#4414: writeBlockerPlaceholder invalidates path cache so dispatch guard sees file", () => {
720
+ const base = makeTmpBase();
721
+ try {
722
+ // Prime the readdir cache by resolving a DIFFERENT file first — this
723
+ // mirrors the stuck-loop condition where the dispatch guard cached an
724
+ // empty directory listing before the placeholder was written.
725
+ invalidateAllCaches();
726
+ assert.equal(
727
+ resolveMilestoneFile(base, "M001", "RESEARCH"),
728
+ null,
729
+ "no RESEARCH file yet",
730
+ );
731
+
732
+ const result = writeBlockerPlaceholder(
733
+ "research-milestone",
734
+ "M001",
735
+ base,
736
+ "verification retries exhausted",
737
+ );
738
+ assert.ok(result, "placeholder path returned");
739
+
740
+ // After writeBlockerPlaceholder, the dispatch guard must see the new file
741
+ // immediately — otherwise the rule re-fires (#4414, 7× re-dispatch).
742
+ const postResolve = resolveMilestoneFile(base, "M001", "RESEARCH");
743
+ assert.ok(
744
+ postResolve,
745
+ "resolveMilestoneFile finds the placeholder post-write (cache invalidated)",
746
+ );
747
+ } finally {
748
+ cleanup(base);
749
+ }
750
+ });
751
+
752
+ test("#4414: parallel-research sentinel path does not collide with RESEARCH suffix", () => {
753
+ const base = makeTmpBase();
754
+ try {
755
+ // Write only the parallel-research blocker (sentinel).
756
+ const sentinel = resolveExpectedArtifactPath(
757
+ "research-slice",
758
+ "M001/parallel-research",
759
+ base,
760
+ );
761
+ assert.ok(sentinel, "sentinel path resolves for parallel-research");
762
+ writeFileSync(sentinel!, "# blocker\n", "utf-8");
763
+
764
+ // Critical: the sentinel filename must NOT be matched by the legacy regex
765
+ // used when callers look up milestone-level RESEARCH. Otherwise the
766
+ // dispatch guard for research-milestone would short-circuit falsely.
767
+ const milestoneResearch = resolveMilestoneFile(base, "M001", "RESEARCH");
768
+ assert.equal(
769
+ milestoneResearch,
770
+ null,
771
+ "sentinel must not be mistaken for M001-RESEARCH.md via legacy pattern match",
772
+ );
773
+ } finally {
774
+ cleanup(base);
775
+ }
776
+ });
777
+
778
+ test("#4414: verifyExpectedArtifact parallel-research succeeds when all research-ready slices have RESEARCH", () => {
779
+ const base = makeTmpBase();
780
+ try {
781
+ mkdirSync(join(base, ".gsd", "milestones", "M001", "slices", "S02", "tasks"), { recursive: true });
782
+ mkdirSync(join(base, ".gsd", "milestones", "M001", "slices", "S03", "tasks"), { recursive: true });
783
+
784
+ // Minimal roadmap with three slices
785
+ writeFileSync(
786
+ join(base, ".gsd", "milestones", "M001", "M001-ROADMAP.md"),
787
+ [
788
+ "# M001: Regression",
789
+ "",
790
+ "## Slices",
791
+ "",
792
+ "- [ ] **S01: Alpha** `risk:low` `depends:[]`",
793
+ "- [ ] **S02: Beta** `risk:low` `depends:[]`",
794
+ "- [ ] **S03: Gamma** `risk:low` `depends:[]`",
795
+ "",
796
+ ].join("\n"),
797
+ "utf-8",
798
+ );
799
+
800
+ // Only 2 of 3 have RESEARCH — should fail verification
801
+ writeFileSync(
802
+ join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-RESEARCH.md"),
803
+ "# research",
804
+ "utf-8",
805
+ );
806
+ writeFileSync(
807
+ join(base, ".gsd", "milestones", "M001", "slices", "S02", "S02-RESEARCH.md"),
808
+ "# research",
809
+ "utf-8",
810
+ );
811
+
812
+ clearParseCache();
813
+ invalidateAllCaches();
814
+ assert.equal(
815
+ verifyExpectedArtifact("research-slice", "M001/parallel-research", base),
816
+ false,
817
+ "missing S03 RESEARCH → verification fails",
818
+ );
819
+
820
+ // All three RESEARCH present → verification passes
821
+ writeFileSync(
822
+ join(base, ".gsd", "milestones", "M001", "slices", "S03", "S03-RESEARCH.md"),
823
+ "# research",
824
+ "utf-8",
825
+ );
826
+ clearParseCache();
827
+ invalidateAllCaches();
828
+ assert.equal(
829
+ verifyExpectedArtifact("research-slice", "M001/parallel-research", base),
830
+ true,
831
+ "all slices have RESEARCH → verification passes",
832
+ );
833
+ } finally {
834
+ cleanup(base);
835
+ }
836
+ });