gsd-pi 2.75.0-dev.063e5a3 → 2.75.0-dev.2203010a0

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 (710) 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 +15 -0
  9. package/dist/onboarding.js +94 -36
  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 +10 -2
  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 +22 -4
  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 +175 -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 +7 -1
  75. package/dist/resources/extensions/gsd/native-git-bridge.js +137 -5
  76. package/dist/resources/extensions/gsd/notification-widget.js +24 -39
  77. package/dist/resources/extensions/gsd/notifications.js +4 -0
  78. package/dist/resources/extensions/gsd/onboarding-state.js +133 -0
  79. package/dist/resources/extensions/gsd/post-execution-checks.js +27 -11
  80. package/dist/resources/extensions/gsd/pre-execution-checks.js +97 -4
  81. package/dist/resources/extensions/gsd/preferences-models.js +1 -0
  82. package/dist/resources/extensions/gsd/preferences-types.js +2 -1
  83. package/dist/resources/extensions/gsd/preferences-validation.js +42 -8
  84. package/dist/resources/extensions/gsd/preferences.js +10 -10
  85. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
  86. package/dist/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
  87. package/dist/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
  88. package/dist/resources/extensions/gsd/prompts/execute-task.md +12 -0
  89. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
  90. package/dist/resources/extensions/gsd/prompts/refine-slice.md +69 -0
  91. package/dist/resources/extensions/gsd/prompts/scan.md +79 -0
  92. package/dist/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
  93. package/dist/resources/extensions/gsd/python-resolver.js +70 -0
  94. package/dist/resources/extensions/gsd/run-manager.js +37 -17
  95. package/dist/resources/extensions/gsd/setup-catalog.js +75 -0
  96. package/dist/resources/extensions/gsd/state.js +47 -3
  97. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
  98. package/dist/resources/extensions/gsd/tools/complete-task.js +80 -0
  99. package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -12
  100. package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -2
  101. package/dist/resources/extensions/gsd/uok/flags.js +7 -7
  102. package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
  103. package/dist/resources/extensions/gsd/verification-gate.js +2 -1
  104. package/dist/resources/extensions/gsd/workflow-dispatch.js +64 -0
  105. package/dist/resources/extensions/gsd/workflow-install.js +327 -0
  106. package/dist/resources/extensions/gsd/workflow-manifest.js +8 -0
  107. package/dist/resources/extensions/gsd/workflow-mcp.js +1 -6
  108. package/dist/resources/extensions/gsd/workflow-plugins.js +346 -0
  109. package/dist/resources/extensions/gsd/workflow-projections.js +17 -15
  110. package/dist/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
  111. package/dist/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
  112. package/dist/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
  113. package/dist/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
  114. package/dist/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
  115. package/dist/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
  116. package/dist/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
  117. package/dist/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
  118. package/dist/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
  119. package/dist/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
  120. package/dist/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
  121. package/dist/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
  122. package/dist/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
  123. package/dist/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
  124. package/dist/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
  125. package/dist/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
  126. package/dist/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
  127. package/dist/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
  128. package/dist/resources/extensions/gsd/workflow-templates/registry.json +184 -0
  129. package/dist/resources/extensions/gsd/workflow-templates/release.md +118 -0
  130. package/dist/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
  131. package/dist/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
  132. package/dist/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
  133. package/dist/resources/extensions/gsd/workflow-templates/spike.md +1 -0
  134. package/dist/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
  135. package/dist/resources/extensions/gsd/worktree-resolver.js +42 -1
  136. package/dist/resources/extensions/remote-questions/commands.js +380 -0
  137. package/dist/resources/extensions/remote-questions/manager.js +39 -5
  138. package/dist/resources/extensions/remote-questions/telegram-adapter.js +79 -4
  139. package/dist/resources/extensions/shared/interview-ui.js +189 -1
  140. package/dist/resources/extensions/shared/layout-utils.js +17 -0
  141. package/dist/resources/extensions/shared/rtk-shared.js +47 -0
  142. package/dist/resources/extensions/shared/rtk.js +3 -46
  143. package/dist/resources/skills/create-workflow/SKILL.md +33 -6
  144. package/dist/rtk-shared.d.ts +10 -0
  145. package/dist/rtk-shared.js +47 -0
  146. package/dist/rtk.d.ts +2 -6
  147. package/dist/rtk.js +3 -48
  148. package/dist/shared/workspace-types.d.ts +52 -0
  149. package/dist/shared/workspace-types.js +1 -0
  150. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  151. package/dist/update-check.d.ts +10 -0
  152. package/dist/update-check.js +24 -3
  153. package/dist/web/standalone/.next/BUILD_ID +1 -1
  154. package/dist/web/standalone/.next/app-path-routes-manifest.json +16 -16
  155. package/dist/web/standalone/.next/build-manifest.json +3 -3
  156. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  157. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  158. package/dist/web/standalone/.next/required-server-files.json +1 -1
  159. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  161. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  162. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  163. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  164. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  165. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  166. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  167. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  170. package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
  171. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  172. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  173. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  174. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  176. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  177. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  179. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  183. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  184. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  185. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  187. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  189. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  191. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  193. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  195. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  197. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  201. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  203. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  205. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  207. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  209. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  210. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  211. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  213. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  215. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  217. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  219. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  221. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  222. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  223. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  224. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  225. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  227. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  229. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  230. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  231. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  233. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  234. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  235. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  236. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  237. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  238. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  239. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  240. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  241. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  242. package/dist/web/standalone/.next/server/app/index.html +1 -1
  243. package/dist/web/standalone/.next/server/app/index.rsc +3 -3
  244. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  245. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
  246. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  247. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  248. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  249. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  250. package/dist/web/standalone/.next/server/app-paths-manifest.json +16 -16
  251. package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
  252. package/dist/web/standalone/.next/server/chunks/7461.js +1 -0
  253. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  254. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  255. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  256. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  257. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  258. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  259. package/dist/web/standalone/.next/static/chunks/2826.e59e8578e2e28639.js +9 -0
  260. package/dist/web/standalone/.next/static/chunks/{2008.71ee9230ad78df21.js → 3621.fc7480022c972438.js} +2 -2
  261. package/dist/web/standalone/.next/static/chunks/app/{page-f1e30ab6bb269149.js → page-5b113fd32bc2a1c3.js} +1 -1
  262. package/dist/web/standalone/.next/static/chunks/{webpack-b868033a5834586d.js → webpack-5fc74f13a25fa1bb.js} +1 -1
  263. package/dist/web/standalone/.next/static/css/632cd626b1731d88.css +1 -0
  264. package/dist/web/standalone/server.js +1 -1
  265. package/dist/welcome-screen.js +48 -24
  266. package/dist/wizard.js +2 -2
  267. package/dist/worktree-cli.d.ts +6 -5
  268. package/dist/worktree-cli.js +23 -7
  269. package/package.json +3 -3
  270. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  271. package/packages/native/tsconfig.tsbuildinfo +1 -1
  272. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  273. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
  274. package/packages/pi-ai/dist/models/capability-patches.js +3 -2
  275. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
  276. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +68 -0
  277. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -1
  278. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +68 -0
  279. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -1
  280. package/packages/pi-ai/dist/models/generated/anthropic.d.ts +17 -0
  281. package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -1
  282. package/packages/pi-ai/dist/models/generated/anthropic.js +17 -0
  283. package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -1
  284. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +17 -0
  285. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -1
  286. package/packages/pi-ai/dist/models/generated/google-antigravity.js +17 -0
  287. package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -1
  288. package/packages/pi-ai/dist/models/generated/groq.d.ts +0 -153
  289. package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -1
  290. package/packages/pi-ai/dist/models/generated/groq.js +0 -153
  291. package/packages/pi-ai/dist/models/generated/groq.js.map +1 -1
  292. package/packages/pi-ai/dist/models/generated/index.d.ts +136 -153
  293. package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
  294. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
  295. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
  296. package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
  297. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
  298. package/packages/pi-ai/dist/models/generated/openrouter.d.ts +17 -0
  299. package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -1
  300. package/packages/pi-ai/dist/models/generated/openrouter.js +17 -0
  301. package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -1
  302. package/packages/pi-ai/dist/models.generated.test.js +17 -0
  303. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  304. package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts +22 -1
  305. package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  306. package/packages/pi-ai/dist/providers/amazon-bedrock.js +40 -6
  307. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  308. package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts +2 -0
  309. package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts.map +1 -0
  310. package/packages/pi-ai/dist/providers/amazon-bedrock.test.js +106 -0
  311. package/packages/pi-ai/dist/providers/amazon-bedrock.test.js.map +1 -0
  312. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +42 -1
  313. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  314. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts +20 -1
  315. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  316. package/packages/pi-ai/dist/providers/anthropic-shared.js +32 -2
  317. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  318. package/packages/pi-ai/dist/providers/anthropic-shared.test.js +12 -1
  319. package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -1
  320. package/packages/pi-ai/dist/providers/anthropic.d.ts +11 -0
  321. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  322. package/packages/pi-ai/dist/providers/anthropic.js +18 -1
  323. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  324. package/packages/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
  325. package/packages/pi-ai/dist/utils/oauth/openai-codex.js +12 -0
  326. package/packages/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
  327. package/packages/pi-ai/package.json +1 -1
  328. package/packages/pi-ai/scripts/generate-models.ts +50 -0
  329. package/packages/pi-ai/src/models/capability-patches.ts +5 -2
  330. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +68 -0
  331. package/packages/pi-ai/src/models/generated/anthropic.ts +17 -0
  332. package/packages/pi-ai/src/models/generated/google-antigravity.ts +17 -0
  333. package/packages/pi-ai/src/models/generated/groq.ts +0 -153
  334. package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
  335. package/packages/pi-ai/src/models/generated/openrouter.ts +17 -0
  336. package/packages/pi-ai/src/models.generated.test.ts +17 -0
  337. package/packages/pi-ai/src/providers/amazon-bedrock.test.ts +164 -0
  338. package/packages/pi-ai/src/providers/amazon-bedrock.ts +41 -7
  339. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +47 -1
  340. package/packages/pi-ai/src/providers/anthropic-shared.test.ts +15 -1
  341. package/packages/pi-ai/src/providers/anthropic-shared.ts +36 -3
  342. package/packages/pi-ai/src/providers/anthropic.ts +19 -1
  343. package/packages/pi-ai/src/utils/oauth/openai-codex.ts +15 -0
  344. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  345. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts +2 -0
  346. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts.map +1 -0
  347. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +38 -0
  348. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -0
  349. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +14 -0
  350. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/core/auth-storage.js +34 -0
  352. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  353. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +74 -0
  354. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  355. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +4 -1
  356. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  357. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +32 -0
  358. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  359. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  360. package/packages/pi-coding-agent/dist/core/sdk.js +32 -0
  361. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  362. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +2 -2
  363. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  364. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  365. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +17 -7
  366. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  367. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  368. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +48 -34
  369. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  370. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts +4 -0
  371. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  372. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +83 -33
  373. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  374. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
  375. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
  376. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +77 -0
  377. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -0
  378. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -66
  379. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  380. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +1 -75
  381. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  382. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts +1 -1
  383. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  384. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +192 -24
  385. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  386. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +56 -0
  387. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +83 -0
  388. package/packages/pi-coding-agent/src/core/auth-storage.ts +35 -0
  389. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +4 -1
  390. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +37 -1
  391. package/packages/pi-coding-agent/src/core/sdk.ts +41 -0
  392. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +2 -2
  393. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +19 -7
  394. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +53 -31
  395. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +88 -36
  396. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +83 -0
  397. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +2 -83
  398. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +208 -27
  399. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  400. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  401. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  402. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
  403. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
  404. package/pkg/dist/modes/interactive/theme/theme-schema.js +77 -0
  405. package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -0
  406. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -66
  407. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  408. package/pkg/dist/modes/interactive/theme/theme.js +1 -75
  409. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  410. package/pkg/dist/modes/interactive/theme/themes.d.ts +1 -1
  411. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  412. package/pkg/dist/modes/interactive/theme/themes.js +192 -24
  413. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  414. package/src/resources/extensions/ask-user-questions.ts +24 -6
  415. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  416. package/src/resources/extensions/claude-code-cli/readiness.ts +13 -2
  417. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +94 -4
  418. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +84 -0
  419. package/src/resources/extensions/gsd/auto/detect-stuck.ts +10 -0
  420. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  421. package/src/resources/extensions/gsd/auto/loop.ts +109 -3
  422. package/src/resources/extensions/gsd/auto/phases.ts +94 -60
  423. package/src/resources/extensions/gsd/auto/resolve.ts +1 -1
  424. package/src/resources/extensions/gsd/auto/run-unit.ts +11 -1
  425. package/src/resources/extensions/gsd/auto/session.ts +7 -0
  426. package/src/resources/extensions/gsd/auto-artifact-paths.ts +20 -0
  427. package/src/resources/extensions/gsd/auto-dashboard.ts +21 -4
  428. package/src/resources/extensions/gsd/auto-dispatch.ts +123 -5
  429. package/src/resources/extensions/gsd/auto-loop.ts +1 -1
  430. package/src/resources/extensions/gsd/auto-model-selection.ts +13 -2
  431. package/src/resources/extensions/gsd/auto-post-unit.ts +10 -8
  432. package/src/resources/extensions/gsd/auto-prompts.ts +201 -40
  433. package/src/resources/extensions/gsd/auto-recovery.ts +63 -1
  434. package/src/resources/extensions/gsd/auto-start.ts +8 -6
  435. package/src/resources/extensions/gsd/auto-verification.ts +3 -3
  436. package/src/resources/extensions/gsd/auto-worktree.ts +65 -0
  437. package/src/resources/extensions/gsd/auto.ts +61 -28
  438. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +8 -21
  439. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +22 -4
  440. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +31 -0
  441. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
  442. package/src/resources/extensions/gsd/commands/catalog.ts +74 -9
  443. package/src/resources/extensions/gsd/commands/handlers/core.ts +69 -27
  444. package/src/resources/extensions/gsd/commands/handlers/escalate.ts +216 -0
  445. package/src/resources/extensions/gsd/commands/handlers/onboarding.ts +229 -0
  446. package/src/resources/extensions/gsd/commands/handlers/ops.ts +16 -0
  447. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +279 -29
  448. package/src/resources/extensions/gsd/commands-cmux.ts +6 -2
  449. package/src/resources/extensions/gsd/commands-config.ts +10 -0
  450. package/src/resources/extensions/gsd/commands-debug.ts +484 -0
  451. package/src/resources/extensions/gsd/commands-do.ts +1 -0
  452. package/src/resources/extensions/gsd/commands-extract-learnings.ts +295 -76
  453. package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
  454. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +49 -12
  455. package/src/resources/extensions/gsd/commands-scan.ts +125 -0
  456. package/src/resources/extensions/gsd/commands-workflow-templates.ts +129 -2
  457. package/src/resources/extensions/gsd/custom-workflow-engine.ts +85 -60
  458. package/src/resources/extensions/gsd/db-writer.ts +3 -0
  459. package/src/resources/extensions/gsd/debug-session-store.ts +377 -0
  460. package/src/resources/extensions/gsd/definition-loader.ts +7 -0
  461. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -9
  462. package/src/resources/extensions/gsd/doctor-environment.ts +2 -1
  463. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -1
  464. package/src/resources/extensions/gsd/doctor-proactive.ts +4 -1
  465. package/src/resources/extensions/gsd/doctor-providers.ts +52 -22
  466. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +23 -4
  467. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  468. package/src/resources/extensions/gsd/doctor.ts +7 -1
  469. package/src/resources/extensions/gsd/error-classifier.ts +6 -3
  470. package/src/resources/extensions/gsd/escalation.ts +367 -0
  471. package/src/resources/extensions/gsd/forensics.ts +25 -29
  472. package/src/resources/extensions/gsd/git-service.ts +0 -1
  473. package/src/resources/extensions/gsd/graph.ts +33 -3
  474. package/src/resources/extensions/gsd/gsd-db.ts +306 -29
  475. package/src/resources/extensions/gsd/health-widget-core.ts +43 -14
  476. package/src/resources/extensions/gsd/health-widget.ts +7 -3
  477. package/src/resources/extensions/gsd/init-wizard.ts +87 -54
  478. package/src/resources/extensions/gsd/markdown-renderer.ts +5 -5
  479. package/src/resources/extensions/gsd/metrics.ts +1 -0
  480. package/src/resources/extensions/gsd/model-cost-table.ts +3 -1
  481. package/src/resources/extensions/gsd/model-router.ts +15 -1
  482. package/src/resources/extensions/gsd/native-git-bridge.ts +134 -6
  483. package/src/resources/extensions/gsd/notification-widget.ts +25 -43
  484. package/src/resources/extensions/gsd/notifications.ts +6 -0
  485. package/src/resources/extensions/gsd/onboarding-state.ts +146 -0
  486. package/src/resources/extensions/gsd/post-execution-checks.ts +37 -14
  487. package/src/resources/extensions/gsd/pre-execution-checks.ts +98 -8
  488. package/src/resources/extensions/gsd/preferences-models.ts +1 -0
  489. package/src/resources/extensions/gsd/preferences-types.ts +10 -2
  490. package/src/resources/extensions/gsd/preferences-validation.ts +33 -7
  491. package/src/resources/extensions/gsd/preferences.ts +10 -10
  492. package/src/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
  493. package/src/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
  494. package/src/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
  495. package/src/resources/extensions/gsd/prompts/execute-task.md +12 -0
  496. package/src/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
  497. package/src/resources/extensions/gsd/prompts/refine-slice.md +69 -0
  498. package/src/resources/extensions/gsd/prompts/scan.md +79 -0
  499. package/src/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
  500. package/src/resources/extensions/gsd/python-resolver.ts +76 -0
  501. package/src/resources/extensions/gsd/run-manager.ts +53 -19
  502. package/src/resources/extensions/gsd/setup-catalog.ts +105 -0
  503. package/src/resources/extensions/gsd/state.ts +50 -2
  504. package/src/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
  505. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +1 -34
  506. package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +7 -0
  507. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +45 -31
  508. package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +63 -0
  509. package/src/resources/extensions/gsd/tests/auto-prompts-fallback.test.ts +35 -0
  510. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +123 -1
  511. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +39 -0
  512. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +39 -0
  513. package/src/resources/extensions/gsd/tests/commands-do.test.ts +48 -0
  514. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +333 -21
  515. package/src/resources/extensions/gsd/tests/commands-scan.test.ts +351 -0
  516. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +8 -6
  517. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +6 -8
  518. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  519. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +63 -0
  520. package/src/resources/extensions/gsd/tests/debug-command-handler.test.ts +905 -0
  521. package/src/resources/extensions/gsd/tests/debug-command-lifecycle.integration.test.ts +1229 -0
  522. package/src/resources/extensions/gsd/tests/debug-session-store.test.ts +565 -0
  523. package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +64 -0
  524. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +67 -0
  525. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +62 -18
  526. package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +5 -0
  527. package/src/resources/extensions/gsd/tests/escalation.test.ts +818 -0
  528. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +29 -12
  529. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +106 -0
  530. package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +74 -0
  531. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +0 -4
  532. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -1
  533. package/src/resources/extensions/gsd/tests/health-widget.test.ts +8 -2
  534. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +190 -0
  535. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +39 -0
  536. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +44 -0
  537. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +68 -1
  538. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +109 -11
  539. package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +51 -0
  540. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +2 -2
  541. package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
  542. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +171 -1
  543. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  544. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  545. package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +3 -2
  546. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +2 -2
  547. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  548. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +59 -0
  549. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +1 -1
  550. package/src/resources/extensions/gsd/tests/onboarding-state.test.ts +105 -0
  551. package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +114 -0
  552. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +4 -5
  553. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +17 -0
  554. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -1
  555. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +275 -6
  556. package/src/resources/extensions/gsd/tests/preferences.test.ts +69 -1
  557. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +539 -0
  558. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +11 -2
  559. package/src/resources/extensions/gsd/tests/projection-regression.test.ts +7 -0
  560. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +27 -0
  561. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +24 -0
  562. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +1 -1
  563. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +33 -0
  564. package/src/resources/extensions/gsd/tests/python-resolver.test.ts +131 -0
  565. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +67 -0
  566. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +107 -0
  567. package/src/resources/extensions/gsd/tests/requirements.test.ts +9 -0
  568. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +153 -0
  569. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +16 -4
  570. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +3 -0
  571. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +15 -0
  572. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +5 -0
  573. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +2 -1
  574. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +31 -1
  575. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +166 -0
  576. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +35 -0
  577. package/src/resources/extensions/gsd/tests/workflow-install.test.ts +113 -0
  578. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +15 -6
  579. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  580. package/src/resources/extensions/gsd/tests/workflow-plugins.test.ts +310 -0
  581. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +7 -0
  582. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +8 -2
  583. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +2 -1
  584. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +77 -2
  585. package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
  586. package/src/resources/extensions/gsd/tools/plan-milestone.ts +42 -8
  587. package/src/resources/extensions/gsd/tools/plan-slice.ts +6 -1
  588. package/src/resources/extensions/gsd/types.ts +62 -0
  589. package/src/resources/extensions/gsd/unit-runtime.ts +1 -0
  590. package/src/resources/extensions/gsd/uok/contracts.ts +2 -1
  591. package/src/resources/extensions/gsd/uok/flags.ts +7 -7
  592. package/src/resources/extensions/gsd/uok/kernel.ts +16 -4
  593. package/src/resources/extensions/gsd/verification-gate.ts +2 -1
  594. package/src/resources/extensions/gsd/workflow-dispatch.ts +106 -0
  595. package/src/resources/extensions/gsd/workflow-install.ts +423 -0
  596. package/src/resources/extensions/gsd/workflow-manifest.ts +8 -0
  597. package/src/resources/extensions/gsd/workflow-mcp.ts +1 -6
  598. package/src/resources/extensions/gsd/workflow-plugins.ts +403 -0
  599. package/src/resources/extensions/gsd/workflow-projections.ts +18 -16
  600. package/src/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
  601. package/src/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
  602. package/src/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
  603. package/src/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
  604. package/src/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
  605. package/src/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
  606. package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
  607. package/src/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
  608. package/src/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
  609. package/src/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
  610. package/src/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
  611. package/src/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
  612. package/src/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
  613. package/src/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
  614. package/src/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
  615. package/src/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
  616. package/src/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
  617. package/src/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
  618. package/src/resources/extensions/gsd/workflow-templates/registry.json +184 -0
  619. package/src/resources/extensions/gsd/workflow-templates/release.md +118 -0
  620. package/src/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
  621. package/src/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
  622. package/src/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
  623. package/src/resources/extensions/gsd/workflow-templates/spike.md +1 -0
  624. package/src/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
  625. package/src/resources/extensions/gsd/workflow-templates.ts +7 -0
  626. package/src/resources/extensions/gsd/workspace-index.ts +9 -4
  627. package/src/resources/extensions/gsd/worktree-resolver.ts +47 -1
  628. package/src/resources/extensions/remote-questions/commands.ts +480 -0
  629. package/src/resources/extensions/remote-questions/manager.ts +49 -4
  630. package/src/resources/extensions/remote-questions/telegram-adapter.ts +86 -4
  631. package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +246 -0
  632. package/src/resources/extensions/remote-questions/tests/remote-answer-normalization.test.ts +92 -0
  633. package/src/resources/extensions/remote-questions/tests/telegram-commands.test.ts +267 -0
  634. package/src/resources/extensions/shared/interview-ui.ts +195 -1
  635. package/src/resources/extensions/shared/layout-utils.ts +26 -0
  636. package/src/resources/extensions/shared/rtk-shared.ts +58 -0
  637. package/src/resources/extensions/shared/rtk.ts +12 -52
  638. package/src/resources/extensions/shared/tests/interview-preview.test.ts +177 -0
  639. package/src/resources/extensions/shared/tests/preview-layout.test.ts +120 -0
  640. package/src/resources/skills/create-workflow/SKILL.md +33 -6
  641. package/dist/web/standalone/.next/static/chunks/2826.dd3dc8bbd3025fa5.js +0 -9
  642. package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +0 -1
  643. package/packages/native/dist/ps/types.d.ts +0 -5
  644. package/packages/native/dist/ps/types.js +0 -2
  645. package/packages/native/src/ps/types.ts +0 -5
  646. package/packages/pi-ai/node_modules/@smithy/node-http-handler/LICENSE +0 -201
  647. package/packages/pi-ai/node_modules/@smithy/node-http-handler/README.md +0 -9
  648. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-cjs/index.js +0 -762
  649. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/build-abort-error.js +0 -19
  650. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/constants.js +0 -1
  651. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/get-transformed-headers.js +0 -9
  652. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/index.js +0 -3
  653. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http-handler.js +0 -230
  654. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-manager.js +0 -87
  655. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-pool.js +0 -32
  656. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-handler.js +0 -169
  657. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/readable.mock.js +0 -21
  658. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/server.mock.js +0 -88
  659. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-connection-timeout.js +0 -36
  660. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-request-timeout.js +0 -21
  661. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-keep-alive.js +0 -22
  662. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-timeout.js +0 -23
  663. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/collector.js +0 -8
  664. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/index.js +0 -41
  665. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/readable.mock.js +0 -21
  666. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/timing.js +0 -4
  667. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/write-request-body.js +0 -63
  668. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/build-abort-error.d.ts +0 -10
  669. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/constants.d.ts +0 -5
  670. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/get-transformed-headers.d.ts +0 -4
  671. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/index.d.ts +0 -3
  672. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http-handler.d.ts +0 -46
  673. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-manager.d.ts +0 -24
  674. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-pool.d.ts +0 -12
  675. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-handler.d.ts +0 -63
  676. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/readable.mock.d.ts +0 -13
  677. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/server.mock.d.ts +0 -12
  678. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-connection-timeout.d.ts +0 -2
  679. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-request-timeout.d.ts +0 -6
  680. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-keep-alive.d.ts +0 -6
  681. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-timeout.d.ts +0 -2
  682. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/collector.d.ts +0 -5
  683. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/index.d.ts +0 -6
  684. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/readable.mock.d.ts +0 -13
  685. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/timing.d.ts +0 -8
  686. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/build-abort-error.d.ts +0 -10
  687. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/constants.d.ts +0 -5
  688. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/get-transformed-headers.d.ts +0 -4
  689. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/index.d.ts +0 -3
  690. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http-handler.d.ts +0 -46
  691. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-manager.d.ts +0 -24
  692. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-pool.d.ts +0 -12
  693. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-handler.d.ts +0 -63
  694. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/readable.mock.d.ts +0 -13
  695. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/server.mock.d.ts +0 -12
  696. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-connection-timeout.d.ts +0 -2
  697. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-request-timeout.d.ts +0 -6
  698. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-keep-alive.d.ts +0 -6
  699. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-timeout.d.ts +0 -2
  700. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/collector.d.ts +0 -5
  701. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/index.d.ts +0 -6
  702. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/readable.mock.d.ts +0 -13
  703. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/timing.d.ts +0 -8
  704. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/write-request-body.d.ts +0 -12
  705. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/write-request-body.d.ts +0 -12
  706. package/packages/pi-ai/node_modules/@smithy/node-http-handler/package.json +0 -68
  707. package/packages/pi-ai/oauth.d.ts +0 -1
  708. package/packages/pi-ai/oauth.js +0 -1
  709. /package/dist/web/standalone/.next/static/{j7IBD35UgrL2b298GLK3V → 8FZqxNe9FxQDmsbRzR8tA}/_buildManifest.js +0 -0
  710. /package/dist/web/standalone/.next/static/{j7IBD35UgrL2b298GLK3V → 8FZqxNe9FxQDmsbRzR8tA}/_ssgManifest.js +0 -0
@@ -78,6 +78,18 @@ Apply these when decomposing and ordering slices:
78
78
  - **Ambition matches the milestone.** The number and depth of slices should match the milestone's ambition. A milestone promising "core platform with auth, data model, and primary user loop" should have enough slices to actually deliver all three as working features — not two proof-of-concept slices and a note that "the rest will come in the next milestone." If the milestone's context promises an outcome, the roadmap must deliver it.
79
79
  - **Right-size the decomposition.** Match slice count to actual complexity. If the work is small enough to build and verify in one pass, it's one slice — don't split it into three just because you can identify sub-steps. Multiple requirements can share a single slice. Conversely, don't cram genuinely independent capabilities into one slice just to keep the count low. Let the work dictate the structure.
80
80
 
81
+ ## Progressive Planning (ADR-011)
82
+
83
+ If the preference `phases.progressive_planning` is enabled and the roadmap has **2 or more slices**, you SHOULD plan S01 in full detail and S02+ as sketches. Plan S02+ full only when the slice is trivially determined (pure boilerplate that cannot meaningfully change based on what S01 ships).
84
+
85
+ A **sketch slice** has the same roadmap entry as today (title, risk, depends, demo line) plus a `sketchScope` of 2–3 sentences describing the scope boundary. Do NOT attempt to decompose it into tasks during this unit — provide a one-sentence `goal` (the tool schema requires it; keep it at the same level of detail as the roadmap demo line) and leave `successCriteria`, `proofLevel`, `integrationClosure`, `observabilityImpact` blank (or provide them if genuinely known). When the prior slice completes, a separate `refine-slice` unit will expand the sketch into a full plan using the real codebase state and the prior slice SUMMARY.
86
+
87
+ **To mark a slice as a sketch in the `gsd_plan_milestone` tool call:** set `isSketch: true` and `sketchScope: "<2-3 sentence scope>"` on that slice entry.
88
+
89
+ S01 is never a sketch — it must always be fully decomposed in this unit.
90
+
91
+ If the preference is off, ignore this section and plan every slice in full detail as you would normally.
92
+
81
93
  ## Single-Slice Fast Path
82
94
 
83
95
  If the roadmap has only one slice, also plan the slice and its tasks inline during this unit — don't leave them for a separate planning session.
@@ -0,0 +1,69 @@
1
+ You are executing GSD auto-mode.
2
+
3
+ ## UNIT: Refine Slice {{sliceId}} ("{{sliceTitle}}") — Milestone {{milestoneId}}
4
+
5
+ ## Working Directory
6
+
7
+ Your working directory is `{{workingDirectory}}`. All file reads, writes, and shell commands MUST operate relative to this directory. Do NOT `cd` to any other directory.
8
+
9
+ This unit **expands an approved sketch into a full plan**. It is not a blank-sheet planning pass — the sketch's scope is the authoritative boundary, and the prior slice's real outcomes are the authoritative context. Your job is to produce a detailed plan that fits inside the sketch while reflecting what actually shipped in earlier slices.
10
+
11
+ All relevant context has been preloaded below — start working immediately without re-reading these files.
12
+
13
+ {{inlinedContext}}
14
+
15
+ ### Dependency Slice Summaries
16
+
17
+ Pay particular attention to **Forward Intelligence** sections — they contain hard-won knowledge about what's fragile, what assumptions changed, and what this slice should watch out for. These summaries are the single most important input to refinement: the sketch was written before these slices shipped, so your plan MUST reconcile against what they actually built.
18
+
19
+ {{dependencySummaries}}
20
+
21
+ ## Your Role in the Pipeline
22
+
23
+ ### Respect the Sketch Scope
24
+
25
+ The sketch scope inlined above is a **hard constraint**. Plan within it. If, after exploring the codebase, the scope is too narrow to deliver the goal, surface this as a deviation in the plan's narrative and still produce the plan — do not silently expand the scope.
26
+
27
+ ### Reconcile Against Reality
28
+
29
+ Before decomposing:
30
+
31
+ 1. Read the prior slice SUMMARY files that were inlined above. Note any interface shifts, file-layout changes, or discovered constraints.
32
+ 2. Use `rg`, `find`, and targeted reads to confirm the current codebase state for files the sketch references. If an assumed module/type/API has moved or changed shape, your plan must reflect that.
33
+ 3. If prior slices flagged fragility or known issues relevant to this slice, fold them into task verification.
34
+
35
+ ### Source Files
36
+
37
+ {{sourceFilePaths}}
38
+
39
+ If slice research exists (inlined above), trust those findings and skip redundant exploration.
40
+
41
+ After you finish, **executor agents** implement each task in isolated fresh context windows. They see only their task plan, the slice plan excerpt, and compressed summaries of prior tasks. Everything an executor needs must be in the task plan itself — file paths, specific steps, expected inputs and outputs.
42
+
43
+ Narrate your decomposition reasoning in complete sentences. Explain what the sketch promised, what prior slices changed, and how those two inputs shape the decomposition. Keep narration proportional to the work.
44
+
45
+ **Right-size the plan.** If the slice is simple enough to be 1 task, plan 1 task. Don't fill in sections with "None" — omit them entirely.
46
+
47
+ {{executorContextConstraints}}
48
+
49
+ Then:
50
+ 0. If `REQUIREMENTS.md` was preloaded above, identify which Active requirements the sketch says this slice owns or supports. Every owned requirement needs at least one task that directly advances it.
51
+ 1. Read the templates:
52
+ - `~/.gsd/agent/extensions/gsd/templates/plan.md`
53
+ - `~/.gsd/agent/extensions/gsd/templates/task-plan.md`
54
+ 2. {{skillActivation}} Record the installed skills you expect executors to use in each task plan's `skills_used` frontmatter.
55
+ 3. Define slice-level verification — the objective stopping condition. Plan real test files with real assertions; for simple slices, executable commands are fine.
56
+ 4. For non-trivial slices, plan observability / proof level / integration closure, threat surface, and requirement impact. Omit entirely for simple slices.
57
+ 5. Decompose the slice into tasks that fit one context window each. Every task must have Why / Files / Do / Verify / Done-when, plus a task plan with description, steps, must-haves, verification, inputs (backtick-wrapped paths), and expected output (backtick-wrapped paths).
58
+ 6. **Persist planning state through `gsd_plan_slice`.** Call it with the full payload. The tool writes to the DB and renders `{{outputPath}}` and `{{slicePath}}/tasks/T##-PLAN.md` automatically. Do NOT rely on direct `PLAN.md` writes.
59
+ 7. **Self-audit the plan.** If every task were completed exactly as written, the slice goal/demo should actually be true. Every must-have maps to at least one task. Inputs and Expected Output are backtick-wrapped file paths.
60
+ 8. If refinement produced structural decisions that diverge from the sketch, append them to `.gsd/DECISIONS.md`.
61
+ 9. {{commitInstruction}}
62
+
63
+ The slice directory and tasks/ subdirectory already exist. Do NOT mkdir.
64
+
65
+ **Autonomous execution:** Do not call `ask_user_questions` or `secure_env_collect`. Document assumptions in the plan.
66
+
67
+ **You MUST call `gsd_plan_slice` to persist the planning state before finishing.** After it returns successfully, the pipeline will automatically clear the sketch flag on the next state derivation (the on-disk PLAN file is the signal).
68
+
69
+ When done, say: "Slice {{sliceId}} refined."
@@ -0,0 +1,79 @@
1
+ You are performing a focused codebase scan.
2
+
3
+ ## Scan Parameters
4
+
5
+ - **Focus:** {{focus}}
6
+ - **Documents to produce:** {{documents}}
7
+ - **Output directory:** `{{outputDir}}`
8
+
9
+ ## Working Directory
10
+
11
+ `{{workingDirectory}}`
12
+
13
+ ## Instructions
14
+
15
+ 1. Explore the codebase to understand its structure, technology choices, and patterns
16
+ 2. For each document listed above, produce a well-structured Markdown file in `{{outputDir}}/`
17
+ 3. Use the document schemas below as a guide for each output file
18
+
19
+ For this scan, only these documents are relevant: **{{documents}}**. Refer only to those schemas below and ignore the rest.
20
+
21
+ ### Document Schemas
22
+
23
+ **STACK.md** — Technology stack overview
24
+ - Languages, runtimes, and versions
25
+ - Key frameworks and libraries (with versions where visible)
26
+ - Build tools and bundlers
27
+ - Package manager
28
+
29
+ **INTEGRATIONS.md** — External dependencies and integrations
30
+ - Third-party APIs and services
31
+ - Database systems
32
+ - Authentication providers
33
+ - Infrastructure and deployment platforms
34
+ - Communication services (email, messaging, etc.)
35
+
36
+ **ARCHITECTURE.md** — Architectural patterns and design decisions
37
+ - Overall architecture style (monolith, microservices, monorepo, etc.)
38
+ - Core data flow
39
+ - Key design patterns in use
40
+ - Module/package boundaries
41
+
42
+ **STRUCTURE.md** — Directory and code organization
43
+ - Top-level directory layout with purpose
44
+ - Source code organization
45
+ - Test organization
46
+ - Configuration file locations
47
+
48
+ **CONVENTIONS.md** — Coding conventions and standards
49
+ - Naming conventions (files, functions, variables)
50
+ - Code style and formatting rules
51
+ - Import/export patterns
52
+ - Error handling patterns
53
+ - TypeScript/language-specific conventions
54
+
55
+ **TESTING.md** — Testing patterns and practices
56
+ - Test framework(s) in use
57
+ - Test file naming and location conventions
58
+ - Test helper and fixture patterns
59
+ - Coverage requirements (if any)
60
+ - How to run tests
61
+
62
+ **CONCERNS.md** — Technical debt and risks
63
+ - Known areas of technical debt
64
+ - Fragile or high-risk code areas
65
+ - Missing test coverage
66
+ - Outdated dependencies
67
+ - Performance bottlenecks
68
+ - Security considerations
69
+
70
+ ## Rules
71
+
72
+ - Write only the documents listed in **Documents to produce** — do not generate extra files
73
+ - Each document must be a clean, standalone Markdown file starting with a `# Heading`
74
+ - Be factual: report what you observe in the code, not what might be ideal
75
+ - Keep each document focused and scannable — use headers, bullet points, and code snippets
76
+ - Do NOT modify any source files
77
+ - After writing all documents, summarize what was produced (file names and line counts)
78
+
79
+ {{skillActivation}}
@@ -0,0 +1,26 @@
1
+ # Oneshot Workflow: {{displayName}}
2
+
3
+ You are running a **oneshot** workflow called `{{name}}`. Oneshot workflows are
4
+ prompt-only — there is no STATE.json, no phase tracking, no artifact directory,
5
+ and no resume mechanism. Just execute the instructions below and return.
6
+
7
+ ## User Arguments
8
+
9
+ `{{userArgs}}`
10
+
11
+ (If empty, use sensible defaults from the workflow body.)
12
+
13
+ ## Workflow Instructions
14
+
15
+ {{body}}
16
+
17
+ ## Execution Rules
18
+
19
+ 1. **No scaffolding.** Do not create `.gsd/workflows/` directories, STATE.json
20
+ files, or run directories unless the instructions explicitly tell you to
21
+ write a specific artifact.
22
+ 2. **No branch switching.** Work on the current branch.
23
+ 3. **Be concise.** Oneshot workflows produce a single focused output (a report,
24
+ a summary, a code change, a PR comment) — finish in this turn.
25
+ 4. **Ask only when blocked.** If the instructions need information you can't
26
+ discover, ask one clear question. Otherwise proceed.
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Cross-platform Python interpreter resolver.
3
+ *
4
+ * Provides utilities to detect the available Python interpreter on the current
5
+ * system and to normalize shell commands that reference `python`/`python3` so
6
+ * that they use whichever interpreter is actually installed.
7
+ *
8
+ * On Windows the canonical names differ (`py -3`, `python`, `python3`), so
9
+ * hard-coded `python3` invocations fail with exit 127. This module detects the
10
+ * working interpreter once (cached for the process lifetime) and rewrites
11
+ * commands accordingly.
12
+ *
13
+ * @module python-resolver
14
+ */
15
+ import { spawnSync } from "node:child_process";
16
+ /** Cached result of `detectPythonExecutable`. `undefined` means not yet probed. */
17
+ let cached;
18
+ /**
19
+ * Returns the first working Python invocation on this system, or `null` if no
20
+ * Python interpreter is found.
21
+ *
22
+ * Probe order:
23
+ * - Windows: `py -3` → `python` → `python3`
24
+ * - All other platforms: `python3` → `python`
25
+ *
26
+ * The result is cached for the lifetime of the process to avoid repeated
27
+ * `spawnSync` calls.
28
+ */
29
+ export function detectPythonExecutable() {
30
+ if (cached !== undefined)
31
+ return cached;
32
+ const candidates = process.platform === "win32"
33
+ ? ["py -3", "python", "python3"]
34
+ : ["python3", "python"];
35
+ for (const candidate of candidates) {
36
+ const [bin, ...args] = candidate.split(" ");
37
+ const r = spawnSync(bin, [...args, "--version"], { stdio: "ignore" });
38
+ if (!r.error && r.status === 0) {
39
+ cached = candidate;
40
+ return candidate;
41
+ }
42
+ }
43
+ cached = null;
44
+ return null;
45
+ }
46
+ /**
47
+ * Rewrites a shell command string so that leading `python`/`python3`/`py`
48
+ * tokens at command boundaries are replaced with the interpreter returned by
49
+ * `detectPythonExecutable`.
50
+ *
51
+ * Only tokens at command boundaries (start of string, or after `&&`, `||`,
52
+ * `;`) are rewritten — mid-string occurrences (e.g. file paths containing
53
+ * "python") are left intact.
54
+ *
55
+ * When no Python interpreter is detected, the command is returned unchanged so
56
+ * that the caller receives a meaningful "command not found" error rather than a
57
+ * silent no-op.
58
+ *
59
+ * @param command - The shell command string to normalize.
60
+ * @returns The command with Python interpreter tokens rewritten, or the
61
+ * original command if no rewrite is needed.
62
+ */
63
+ export function normalizePythonCommand(command) {
64
+ const executable = detectPythonExecutable();
65
+ if (!executable)
66
+ return command;
67
+ // Split on common shell separators to handle compound commands.
68
+ // We reconstruct the string preserving the original separators.
69
+ return command.replace(/(^\s*|(?:&&|\|\||;)\s*)(?:python3?|py(?:\s+-\d+)?)(?=\s|$)/g, (_match, pre) => `${pre}${executable}`);
70
+ }
@@ -15,8 +15,9 @@
15
15
  import { mkdirSync, writeFileSync, existsSync, readdirSync, statSync } from "node:fs";
16
16
  import { join } from "node:path";
17
17
  import { stringify } from "yaml";
18
- import { loadDefinition, substituteParams } from "./definition-loader.js";
18
+ import { loadDefinition, loadDefinitionFromFile, substituteParams } from "./definition-loader.js";
19
19
  import { initializeGraph, writeGraph, readGraph } from "./graph.js";
20
+ import { resolvePlugin } from "./workflow-plugins.js";
20
21
  // ─── Constants ───────────────────────────────────────────────────────────
21
22
  const RUNS_DIR = "workflow-runs";
22
23
  const DEFS_DIR = "workflow-defs";
@@ -42,38 +43,57 @@ function deriveStatus(graph) {
42
43
  return "pending";
43
44
  }
44
45
  // ─── Public API ──────────────────────────────────────────────────────────
46
+ /**
47
+ * Create a run directory from an explicit definition file path.
48
+ * Preferred over `createRun` when the caller has already resolved the file
49
+ * (e.g. via the plugin resolver).
50
+ */
51
+ export function createRunFromDefinition(basePath, defName, definitionFile, overrides) {
52
+ const rawDef = loadDefinitionFromFile(definitionFile);
53
+ const def = overrides
54
+ ? substituteParams(rawDef, overrides)
55
+ : substituteParams(rawDef);
56
+ const timestamp = makeTimestamp();
57
+ const runDir = join(basePath, ".gsd", RUNS_DIR, defName, timestamp);
58
+ mkdirSync(runDir, { recursive: true });
59
+ writeFileSync(join(runDir, "DEFINITION.yaml"), stringify(def), "utf-8");
60
+ const graph = initializeGraph(def);
61
+ writeGraph(runDir, graph);
62
+ if (overrides && Object.keys(overrides).length > 0) {
63
+ writeFileSync(join(runDir, "PARAMS.json"), JSON.stringify(overrides, null, 2), "utf-8");
64
+ }
65
+ return runDir;
66
+ }
45
67
  /**
46
68
  * Create a new isolated run directory for a workflow definition.
47
69
  *
48
- * 1. Loads the definition from `<basePath>/.gsd/workflow-defs/<defName>.yaml`
49
- * 2. Applies parameter substitution if overrides are provided
50
- * 3. Creates `<basePath>/.gsd/workflow-runs/<defName>/<timestamp>/`
51
- * 4. Writes frozen DEFINITION.yaml, initialized GRAPH.yaml, and optional PARAMS.json
70
+ * Resolution order:
71
+ * 1. Plugin resolver (project global bundled), YAML format only.
72
+ * 2. Legacy `.gsd/workflow-defs/<defName>.yaml`.
52
73
  *
53
- * @param basePath — project root directory
54
- * @param defName definition filename (without .yaml extension)
55
- * @param overrides — optional parameter overrides (merged with definition defaults)
56
- * @returns Full path to the created run directory
57
- * @throws Error if the definition file doesn't exist or is invalid
74
+ * Creates `<basePath>/.gsd/workflow-runs/<defName>/<timestamp>/` containing
75
+ * DEFINITION.yaml (frozen), GRAPH.yaml (initialized), and optional PARAMS.json.
76
+ *
77
+ * @throws Error if no matching definition is found anywhere.
58
78
  */
59
79
  export function createRun(basePath, defName, overrides) {
80
+ // Try the unified plugin resolver first — honors project/global overrides.
81
+ const plugin = resolvePlugin(basePath, defName);
82
+ if (plugin && plugin.format === "yaml") {
83
+ return createRunFromDefinition(basePath, defName, plugin.path, overrides);
84
+ }
85
+ // Fall back to legacy `.gsd/workflow-defs/<defName>.yaml`.
60
86
  const defsDir = join(basePath, ".gsd", DEFS_DIR);
61
- // Load and validate the definition
62
87
  const rawDef = loadDefinition(defsDir, defName);
63
- // Apply parameter substitution if overrides provided
64
88
  const def = overrides
65
89
  ? substituteParams(rawDef, overrides)
66
- : substituteParams(rawDef); // still resolve default params if any
67
- // Create the run directory
90
+ : substituteParams(rawDef);
68
91
  const timestamp = makeTimestamp();
69
92
  const runDir = join(basePath, ".gsd", RUNS_DIR, defName, timestamp);
70
93
  mkdirSync(runDir, { recursive: true });
71
- // Freeze the definition as DEFINITION.yaml
72
94
  writeFileSync(join(runDir, "DEFINITION.yaml"), stringify(def), "utf-8");
73
- // Initialize and write GRAPH.yaml
74
95
  const graph = initializeGraph(def);
75
96
  writeGraph(runDir, graph);
76
- // Write PARAMS.json if overrides were provided
77
97
  if (overrides && Object.keys(overrides).length > 0) {
78
98
  writeFileSync(join(runDir, "PARAMS.json"), JSON.stringify(overrides, null, 2), "utf-8");
79
99
  }
@@ -0,0 +1,75 @@
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
+ import { PROVIDER_REGISTRY } from "./key-manager.js";
10
+ /**
11
+ * Canonical ordered list of onboarding steps.
12
+ *
13
+ * To add a new step:
14
+ * 1. Append here (or insert at the right position).
15
+ * 2. Bump FLOW_VERSION in onboarding-state.ts so existing users get re-prompted.
16
+ * 3. Wire its CLI runner in src/onboarding.ts (and handlers/onboarding.ts for --step).
17
+ */
18
+ export const ONBOARDING_STEPS = [
19
+ { id: "llm", label: "LLM provider & auth", required: true, hint: "Sign in or paste an API key" },
20
+ { id: "model", label: "Default model", required: false, hint: "Pick a default model for the chosen provider" },
21
+ { id: "search", label: "Web search provider", required: false, hint: "Brave, Tavily, or Anthropic built-in" },
22
+ { id: "remote", label: "Remote questions", required: false, hint: "Discord / Slack / Telegram notifications" },
23
+ { id: "tool-keys", label: "Tool API keys", required: false, hint: "Context7, Jina, Groq voice, etc." },
24
+ { id: "prefs", label: "Global preferences", required: false, hint: "Mode, profile, notifications" },
25
+ { id: "skills", label: "Skills install", required: false, hint: "Browse and install skill plugins" },
26
+ { id: "doctor", label: "Validate setup", required: false, hint: "Run provider doctor checks" },
27
+ { id: "project", label: "Project init", required: false, hint: "Bootstrap .gsd/ in this repo" },
28
+ ];
29
+ const STEP_INDEX = new Map(ONBOARDING_STEPS.map((s, i) => [s.id, i]));
30
+ export function getStep(id) {
31
+ const idx = STEP_INDEX.get(id);
32
+ return idx === undefined ? undefined : ONBOARDING_STEPS[idx];
33
+ }
34
+ export function isValidStepId(id) {
35
+ return STEP_INDEX.has(id);
36
+ }
37
+ /**
38
+ * Given a possibly-stale resume point, return the nearest next step that is
39
+ * still defined in the catalog. Falls back to the first step.
40
+ */
41
+ export function nearestResumeStep(lastResumePoint, completedSteps) {
42
+ const completed = new Set(completedSteps);
43
+ // First incomplete step at or after the lastResumePoint
44
+ let startIdx = 0;
45
+ if (lastResumePoint && STEP_INDEX.has(lastResumePoint)) {
46
+ startIdx = STEP_INDEX.get(lastResumePoint) ?? 0;
47
+ }
48
+ for (let i = startIdx; i < ONBOARDING_STEPS.length; i++) {
49
+ if (!completed.has(ONBOARDING_STEPS[i].id))
50
+ return ONBOARDING_STEPS[i].id;
51
+ }
52
+ // Everything from the resume point is complete — try from the start
53
+ for (const step of ONBOARDING_STEPS) {
54
+ if (!completed.has(step.id))
55
+ return step.id;
56
+ }
57
+ return ONBOARDING_STEPS[0].id;
58
+ }
59
+ // ─── Provider catalog views ───────────────────────────────────────────────────
60
+ export function getLlmProviders() {
61
+ return PROVIDER_REGISTRY.filter(p => p.category === "llm");
62
+ }
63
+ export function getToolProviders() {
64
+ return PROVIDER_REGISTRY.filter(p => p.category === "tool");
65
+ }
66
+ export function getSearchProviders() {
67
+ return PROVIDER_REGISTRY.filter(p => p.category === "search");
68
+ }
69
+ export function getRemoteProviders() {
70
+ return PROVIDER_REGISTRY.filter(p => p.category === "remote");
71
+ }
72
+ /** Provider IDs that count as "the user has an LLM configured" for shouldRunOnboarding. */
73
+ export function getLlmProviderIds() {
74
+ return Array.from(new Set([...getLlmProviders().map(p => p.id), "claude-code"]));
75
+ }
@@ -13,7 +13,9 @@ import { existsSync, readdirSync, readFileSync } from 'node:fs';
13
13
  import { debugCount, debugTime } from './debug-logger.js';
14
14
  import { logWarning, logError } from './workflow-logger.js';
15
15
  import { extractVerdict } from './verdict-parser.js';
16
- import { isDbAvailable, wasDbOpenAttempted, getAllMilestones, getMilestone, getMilestoneSlices, getSliceTasks, getReplanHistory, getSlice, insertMilestone, insertSlice, insertTask, updateSliceStatus, updateTaskStatus, getPendingGateCountForTurn, } from './gsd-db.js';
16
+ import { loadEffectiveGSDPreferences } from './preferences.js';
17
+ import { detectPendingEscalation } from './escalation.js';
18
+ import { isDbAvailable, wasDbOpenAttempted, getAllMilestones, getMilestone, getMilestoneSlices, getSliceTasks, getReplanHistory, getSlice, insertMilestone, insertSlice, insertTask, updateSliceStatus, updateTaskStatus, getPendingGateCountForTurn, autoHealSketchFlags, } from './gsd-db.js';
17
19
  /**
18
20
  * A "ghost" milestone directory contains only META.json (and no substantive
19
21
  * files like CONTEXT, CONTEXT-DRAFT, ROADMAP, or SUMMARY). These appear when
@@ -710,7 +712,13 @@ export async function deriveStateFromDb(basePath) {
710
712
  if (allSlicesDone) {
711
713
  return handleAllSlicesDone(basePath, activeMilestone, registry, requirements, milestoneProgress, sliceProgress);
712
714
  }
713
- const activeSliceContext = resolveSliceDependencies(activeMilestoneSlices);
715
+ // ADR-011 auto-heal: if a slice has a PLAN on disk but is still flagged is_sketch=1
716
+ // (e.g. a crash between plan-slice write and the sketch flip), reconcile before
717
+ // running phase derivation so the flag doesn't misroute state.
718
+ autoHealSketchFlags(activeMilestone.id, (sid) => !!resolveSliceFile(basePath, activeMilestone.id, sid, "PLAN"));
719
+ // Re-read slices after auto-heal so downstream reads see fresh is_sketch values.
720
+ const healedSlices = getMilestoneSlices(activeMilestone.id);
721
+ const activeSliceContext = resolveSliceDependencies(healedSlices);
714
722
  if (!activeSliceContext.activeSlice) {
715
723
  // If locked slice wasn't found, it returns null but logs warning, we need to return 'blocked'
716
724
  if (process.env.GSD_SLICE_LOCK) {
@@ -730,9 +738,23 @@ export async function deriveStateFromDb(basePath) {
730
738
  progress: { milestones: milestoneProgress, slices: sliceProgress },
731
739
  };
732
740
  }
733
- const { activeSlice } = activeSliceContext;
741
+ const { activeSlice, activeSliceRow } = activeSliceContext;
734
742
  const planFile = resolveSliceFile(basePath, activeMilestone.id, activeSlice.id, "PLAN");
735
743
  if (!planFile) {
744
+ // ADR-011: sketch slices with progressive_planning enabled enter the
745
+ // `refining` phase — a refine-slice unit expands the sketch into a full plan
746
+ // before execution. When the flag is off, sketches are indistinguishable
747
+ // from a missing plan and fall through to the normal `planning` phase.
748
+ const progressive = loadEffectiveGSDPreferences()?.preferences?.phases?.progressive_planning === true;
749
+ if (progressive && activeSliceRow?.is_sketch === 1) {
750
+ return {
751
+ activeMilestone, activeSlice, activeTask: null,
752
+ phase: 'refining', recentDecisions: [], blockers: [],
753
+ nextAction: `Refine sketch slice ${activeSlice.id} (${activeSlice.title}) using prior slice context.`,
754
+ registry, requirements,
755
+ progress: { milestones: milestoneProgress, slices: sliceProgress },
756
+ };
757
+ }
736
758
  return {
737
759
  activeMilestone, activeSlice, activeTask: null,
738
760
  phase: 'planning', recentDecisions: [], blockers: [],
@@ -811,6 +833,28 @@ export async function deriveStateFromDb(basePath) {
811
833
  };
812
834
  }
813
835
  }
836
+ // ADR-011 Phase 2: pause-on-escalation takes precedence over dispatching the
837
+ // next task. `awaiting_review` tasks (continueWithDefault=true) are NOT
838
+ // surfaced here — they let the loop continue.
839
+ //
840
+ // We do NOT gate this on `phases.mid_execution_escalation` — creation of
841
+ // new escalations is gated at the write site (tools/complete-task.ts:315),
842
+ // but any escalation_pending row already persisted in the DB must be
843
+ // honored even if the user later toggles the flag off. Otherwise those
844
+ // rows would silently orphan, the loop would advance past the paused task,
845
+ // and the user's prior resolution never lands.
846
+ const escalatingTaskId = detectPendingEscalation(tasks, basePath);
847
+ if (escalatingTaskId) {
848
+ return {
849
+ activeMilestone, activeSlice, activeTask,
850
+ phase: 'escalating-task', recentDecisions: [],
851
+ blockers: [`Task ${escalatingTaskId} requires a user decision before the loop can proceed`],
852
+ nextAction: `Run /gsd escalate show ${escalatingTaskId} to review, then /gsd escalate resolve ${escalatingTaskId} <choice> to proceed.`,
853
+ activeWorkspace: undefined,
854
+ registry, requirements,
855
+ progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
856
+ };
857
+ }
814
858
  if (!blockerTaskId) {
815
859
  const isTriggered = checkReplanTrigger(basePath, activeMilestone.id, activeSlice.id);
816
860
  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:
@@ -20,6 +20,8 @@ import { renderAllProjections, renderSummaryContent } from "../workflow-projecti
20
20
  import { writeManifest } from "../workflow-manifest.js";
21
21
  import { appendEvent } from "../workflow-events.js";
22
22
  import { logWarning, logError } from "../workflow-logger.js";
23
+ import { loadEffectiveGSDPreferences } from "../preferences.js";
24
+ import { buildEscalationArtifact, writeEscalationArtifact } from "../escalation.js";
23
25
  /**
24
26
  * Map an execute-task-owned gate id to the CompleteTaskParams field whose
25
27
  * presence drives `pass` vs. `omitted`. Keep in lockstep with the gates
@@ -80,6 +82,11 @@ function paramsToTaskRow(params, completedAt) {
80
82
  observability_impact: "",
81
83
  full_plan_md: "",
82
84
  sequence: 0,
85
+ blocker_source: "",
86
+ escalation_pending: 0,
87
+ escalation_awaiting_review: 0,
88
+ escalation_artifact_path: null,
89
+ escalation_override_applied_at: null,
83
90
  };
84
91
  }
85
92
  /**
@@ -111,6 +118,39 @@ export async function handleCompleteTask(params, basePath) {
111
118
  // ── Guards + DB writes inside a single transaction (prevents TOCTOU) ───
112
119
  const completedAt = new Date().toISOString();
113
120
  let guardError = null;
121
+ // ── ADR-011 Phase 2: validate escalation payload BEFORE any side effects ─
122
+ // Building the artifact runs the full shape validation (2-4 options, unique
123
+ // ids, recommendation references a real id). If the payload is malformed
124
+ // we must reject the call before marking the task complete, writing
125
+ // SUMMARY.md, flipping the plan checkbox, or closing execute-task gates —
126
+ // otherwise a rejected payload would leave the task marked complete with
127
+ // no escalation recorded, and the loop would silently advance past it.
128
+ // The filesystem write happens later (after side effects) because that's
129
+ // the cheapest ordering and validation is where 99% of failures live.
130
+ let validatedEscalationArtifact = null;
131
+ let escalationWriteEnabled = false;
132
+ if (params.escalation) {
133
+ escalationWriteEnabled = loadEffectiveGSDPreferences()?.preferences?.phases?.mid_execution_escalation === true;
134
+ if (escalationWriteEnabled) {
135
+ try {
136
+ validatedEscalationArtifact = buildEscalationArtifact({
137
+ taskId: params.taskId,
138
+ sliceId: params.sliceId,
139
+ milestoneId: params.milestoneId,
140
+ question: params.escalation.question,
141
+ options: params.escalation.options,
142
+ recommendation: params.escalation.recommendation,
143
+ recommendationRationale: params.escalation.recommendationRationale,
144
+ continueWithDefault: params.escalation.continueWithDefault,
145
+ });
146
+ }
147
+ catch (validationErr) {
148
+ return {
149
+ error: `complete-task escalation payload invalid for ${params.milestoneId}/${params.sliceId}/${params.taskId}: ${validationErr.message}`,
150
+ };
151
+ }
152
+ }
153
+ }
114
154
  transaction(() => {
115
155
  // State machine preconditions (inside txn for atomicity).
116
156
  // Milestone/slice not existing is OK — insertMilestone/insertSlice below will auto-create.
@@ -239,6 +279,46 @@ export async function handleCompleteTask(params, basePath) {
239
279
  catch (gateErr) {
240
280
  logWarning("tool", `complete-task gate close warning for ${params.milestoneId}/${params.sliceId}/${params.taskId}: ${gateErr.message}`);
241
281
  }
282
+ // ── ADR-011 Phase 2: write escalation artifact (opt-in) ────────────────
283
+ // Validation already happened BEFORE side effects — this block only
284
+ // performs the disk write for a pre-validated artifact. For
285
+ // continueWithDefault=false, a write failure here would otherwise leave
286
+ // the task marked complete with SUMMARY.md + closed gates but no
287
+ // escalation, which silently advances the loop past a pause the user
288
+ // asked for. We compensate by reverting the DB-level completion: set
289
+ // status back to 'pending' and delete the verification_evidence rows
290
+ // (same shape as the disk-render-failure rollback above). SUMMARY.md
291
+ // on disk is left in place because the next complete-task retry will
292
+ // overwrite it; gate rows are UPSERT-keyed per task and will also be
293
+ // overwritten. This restores the invariant that deriveState() sees a
294
+ // consistent "task not done" view so the loop re-dispatches the task.
295
+ if (validatedEscalationArtifact) {
296
+ try {
297
+ writeEscalationArtifact(basePath, validatedEscalationArtifact);
298
+ }
299
+ catch (escalationErr) {
300
+ const msg = `complete-task escalation write failed for ${params.milestoneId}/${params.sliceId}/${params.taskId}: ${escalationErr.message}`;
301
+ logWarning("tool", msg);
302
+ if (validatedEscalationArtifact.continueWithDefault === false) {
303
+ // Compensating rollback: revert DB completion so the loop pauses on
304
+ // re-dispatch instead of silently advancing. Mirror the existing
305
+ // renderErr rollback (line ~261).
306
+ try {
307
+ deleteVerificationEvidence(params.milestoneId, params.sliceId, params.taskId);
308
+ updateTaskStatus(params.milestoneId, params.sliceId, params.taskId, 'pending');
309
+ invalidateStateCache();
310
+ logWarning("tool", `complete-task rolled back DB completion for ${params.milestoneId}/${params.sliceId}/${params.taskId} after escalation write failure; SUMMARY.md left on disk for retry.`);
311
+ }
312
+ catch (rollbackErr) {
313
+ logWarning("tool", `complete-task rollback failed after escalation write failure for ${params.milestoneId}/${params.sliceId}/${params.taskId}: ${rollbackErr.message}`);
314
+ }
315
+ return { error: msg };
316
+ }
317
+ }
318
+ }
319
+ else if (params.escalation && !escalationWriteEnabled) {
320
+ logWarning("tool", `complete-task received escalation payload but phases.mid_execution_escalation is not enabled; ignoring (${params.milestoneId}/${params.sliceId}/${params.taskId})`);
321
+ }
242
322
  // Invalidate all caches
243
323
  invalidateStateCache();
244
324
  clearPathCache();