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
@@ -44,6 +44,8 @@ import { existsSync, readdirSync, readFileSync } from 'node:fs';
44
44
  import { debugCount, debugTime } from './debug-logger.js';
45
45
  import { logWarning, logError } from './workflow-logger.js';
46
46
  import { extractVerdict } from './verdict-parser.js';
47
+ import { loadEffectiveGSDPreferences } from './preferences.js';
48
+ import { detectPendingEscalation } from './escalation.js';
47
49
 
48
50
  import {
49
51
  isDbAvailable,
@@ -60,6 +62,7 @@ import {
60
62
  updateSliceStatus,
61
63
  updateTaskStatus,
62
64
  getPendingGateCountForTurn,
65
+ autoHealSketchFlags,
63
66
  type MilestoneRow,
64
67
  type SliceRow,
65
68
  type TaskRow,
@@ -849,7 +852,15 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
849
852
  return handleAllSlicesDone(basePath, activeMilestone, registry, requirements, milestoneProgress, sliceProgress);
850
853
  }
851
854
 
852
- const activeSliceContext = resolveSliceDependencies(activeMilestoneSlices);
855
+ // ADR-011 auto-heal: if a slice has a PLAN on disk but is still flagged is_sketch=1
856
+ // (e.g. a crash between plan-slice write and the sketch flip), reconcile before
857
+ // running phase derivation so the flag doesn't misroute state.
858
+ autoHealSketchFlags(activeMilestone.id, (sid) =>
859
+ !!resolveSliceFile(basePath, activeMilestone.id, sid, "PLAN"),
860
+ );
861
+ // Re-read slices after auto-heal so downstream reads see fresh is_sketch values.
862
+ const healedSlices = getMilestoneSlices(activeMilestone.id);
863
+ const activeSliceContext = resolveSliceDependencies(healedSlices);
853
864
  if (!activeSliceContext.activeSlice) {
854
865
  // If locked slice wasn't found, it returns null but logs warning, we need to return 'blocked'
855
866
  if (process.env.GSD_SLICE_LOCK) {
@@ -869,10 +880,24 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
869
880
  progress: { milestones: milestoneProgress, slices: sliceProgress },
870
881
  };
871
882
  }
872
- const { activeSlice } = activeSliceContext;
883
+ const { activeSlice, activeSliceRow } = activeSliceContext;
873
884
 
874
885
  const planFile = resolveSliceFile(basePath, activeMilestone.id, activeSlice.id, "PLAN");
875
886
  if (!planFile) {
887
+ // ADR-011: sketch slices with progressive_planning enabled enter the
888
+ // `refining` phase — a refine-slice unit expands the sketch into a full plan
889
+ // before execution. When the flag is off, sketches are indistinguishable
890
+ // from a missing plan and fall through to the normal `planning` phase.
891
+ const progressive = loadEffectiveGSDPreferences()?.preferences?.phases?.progressive_planning === true;
892
+ if (progressive && activeSliceRow?.is_sketch === 1) {
893
+ return {
894
+ activeMilestone, activeSlice, activeTask: null,
895
+ phase: 'refining', recentDecisions: [], blockers: [],
896
+ nextAction: `Refine sketch slice ${activeSlice.id} (${activeSlice.title}) using prior slice context.`,
897
+ registry, requirements,
898
+ progress: { milestones: milestoneProgress, slices: sliceProgress },
899
+ };
900
+ }
876
901
  return {
877
902
  activeMilestone, activeSlice, activeTask: null,
878
903
  phase: 'planning', recentDecisions: [], blockers: [],
@@ -965,6 +990,29 @@ export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
965
990
  }
966
991
  }
967
992
 
993
+ // ADR-011 Phase 2: pause-on-escalation takes precedence over dispatching the
994
+ // next task. `awaiting_review` tasks (continueWithDefault=true) are NOT
995
+ // surfaced here — they let the loop continue.
996
+ //
997
+ // We do NOT gate this on `phases.mid_execution_escalation` — creation of
998
+ // new escalations is gated at the write site (tools/complete-task.ts:315),
999
+ // but any escalation_pending row already persisted in the DB must be
1000
+ // honored even if the user later toggles the flag off. Otherwise those
1001
+ // rows would silently orphan, the loop would advance past the paused task,
1002
+ // and the user's prior resolution never lands.
1003
+ const escalatingTaskId = detectPendingEscalation(tasks, basePath);
1004
+ if (escalatingTaskId) {
1005
+ return {
1006
+ activeMilestone, activeSlice, activeTask,
1007
+ phase: 'escalating-task', recentDecisions: [],
1008
+ blockers: [`Task ${escalatingTaskId} requires a user decision before the loop can proceed`],
1009
+ nextAction: `Run /gsd escalate show ${escalatingTaskId} to review, then /gsd escalate resolve ${escalatingTaskId} <choice> to proceed.`,
1010
+ activeWorkspace: undefined,
1011
+ registry, requirements,
1012
+ progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
1013
+ };
1014
+ }
1015
+
968
1016
  if (!blockerTaskId) {
969
1017
  const isTriggered = checkReplanTrigger(basePath, activeMilestone.id, activeSlice.id);
970
1018
  if (isTriggered) {
@@ -44,19 +44,19 @@ uok:
44
44
  legacy_fallback:
45
45
  enabled: false
46
46
  gates:
47
- enabled: false
47
+ enabled: true
48
48
  model_policy:
49
- enabled: false
49
+ enabled: true
50
50
  execution_graph:
51
- enabled: false
51
+ enabled: true
52
52
  gitops:
53
- enabled: false
54
- turn_action: status-only
53
+ enabled: true
54
+ turn_action: commit
55
55
  turn_push: false
56
56
  audit_unified:
57
- enabled: false
57
+ enabled: true
58
58
  plan_v2:
59
- enabled: false
59
+ enabled: true
60
60
  auto_visualize:
61
61
  auto_report:
62
62
  parallel:
@@ -2,8 +2,7 @@
2
2
  * agent-end-retry.test.ts — Regression checks for the agent_end model.
3
3
  *
4
4
  * The per-unit one-shot resolve function lives at module level in auto-loop.ts
5
- * (_currentResolve). handleAgentEnd is a thin compatibility wrapper around
6
- * resolveAgentEnd().
5
+ * (_currentResolve). agent_end is handled via resolveAgentEnd().
7
6
  */
8
7
 
9
8
  import test from "node:test";
@@ -62,38 +61,6 @@ test("legacy pendingAgentEndRetry state is gone", () => {
62
61
  );
63
62
  });
64
63
 
65
- test("handleAgentEnd is a thin compatibility wrapper", () => {
66
- const source = getAutoTsSource();
67
- const fnIdx = source.indexOf("export async function handleAgentEnd");
68
- assert.ok(fnIdx > -1, "handleAgentEnd must exist in auto.ts");
69
- const fnBlock = source.slice(fnIdx, source.indexOf("\n// ─── ", fnIdx + 100));
70
-
71
- assert.ok(
72
- fnBlock.includes("resolveAgentEnd("),
73
- "handleAgentEnd must delegate to resolveAgentEnd",
74
- );
75
- assert.ok(
76
- !fnBlock.includes("pendingAgentEndRetry"),
77
- "handleAgentEnd must not use legacy retry state",
78
- );
79
- assert.ok(
80
- !fnBlock.includes("dispatchNextUnit"),
81
- "handleAgentEnd must not dispatch recursively",
82
- );
83
- });
84
-
85
- test("handleAgentEnd early return calls resolveAgentEndCancelled", () => {
86
- const source = getAutoTsSource();
87
- const fnIdx = source.indexOf("export async function handleAgentEnd");
88
- assert.ok(fnIdx > -1, "handleAgentEnd must exist in auto.ts");
89
- const fnBlock = source.slice(fnIdx, source.indexOf("\n// ─── ", fnIdx + 100));
90
-
91
- assert.ok(
92
- fnBlock.includes("resolveAgentEndCancelled()"),
93
- "handleAgentEnd must call resolveAgentEndCancelled on early return to prevent orphaned promises",
94
- );
95
- });
96
-
97
64
  test("pauseAuto calls resolveAgentEndCancelled to unblock the loop", () => {
98
65
  const source = getAutoTsSource();
99
66
  const fnIdx = source.indexOf("export async function pauseAuto");
@@ -46,6 +46,8 @@ function makeSliceRow(overrides?: Partial<SliceRow>): SliceRow {
46
46
  observability_impact: '',
47
47
  sequence: 4,
48
48
  replan_triggered_at: null,
49
+ is_sketch: 0,
50
+ sketch_scope: '',
49
51
  ...overrides,
50
52
  };
51
53
  }
@@ -77,6 +79,11 @@ function makeTaskRow(overrides?: Partial<TaskRow>): TaskRow {
77
79
  expected_output: [],
78
80
  observability_impact: '',
79
81
  sequence: 0,
82
+ blocker_source: '',
83
+ escalation_pending: 0,
84
+ escalation_awaiting_review: 0,
85
+ escalation_artifact_path: null,
86
+ escalation_override_applied_at: null,
80
87
  ...overrides,
81
88
  };
82
89
  }
@@ -313,6 +313,42 @@ test("runUnit re-applies the selected unit model after newSession before dispatc
313
313
  assert.equal(pi.calls.length, 1);
314
314
  });
315
315
 
316
+ test("runUnit cancels before dispatch when model restore fails after newSession", async () => {
317
+ _resetPendingResolve();
318
+
319
+ const notifications: Array<{ message: string; level: string }> = [];
320
+ const ctx = makeMockCtx();
321
+ ctx.ui.notify = (message: string, level: string) => {
322
+ notifications.push({ message, level });
323
+ };
324
+
325
+ const pi = makeMockPi();
326
+ pi.setModel = async (...args: unknown[]) => {
327
+ pi.setModelCalls.push(args);
328
+ return false;
329
+ };
330
+
331
+ const s = makeMockSession();
332
+ s.currentUnitModel = { provider: "openai-codex", id: "gpt-5.4" };
333
+
334
+ const result = await runUnit(ctx, pi, s, "task", "T01", "prompt");
335
+
336
+ assert.equal(result.status, "cancelled");
337
+ assert.equal(result.errorContext?.category, "session-failed");
338
+ assert.match(
339
+ result.errorContext?.message ?? "",
340
+ /Failed to restore configured model openai-codex\/gpt-5\.4 after session creation/,
341
+ );
342
+ assert.equal(pi.setModelCalls.length, 1);
343
+ assert.equal(pi.calls.length, 0, "unit must not dispatch on the session default model");
344
+ assert.deepEqual(notifications, [
345
+ {
346
+ message: "Failed to restore configured model openai-codex/gpt-5.4 after session creation. Cancelling unit before dispatch.",
347
+ level: "warning",
348
+ },
349
+ ]);
350
+ });
351
+
316
352
  // ─── Structural assertions ───────────────────────────────────────────────────
317
353
 
318
354
  test("auto-loop.ts exports autoLoop, runUnit, resolveAgentEnd", async () => {
@@ -1267,7 +1303,7 @@ test("auto-loop.ts barrel re-exports autoLoop, runUnit, and resolveAgentEnd", ()
1267
1303
  );
1268
1304
  });
1269
1305
 
1270
- test("auto.ts startAuto dispatches through the UOK kernel wrapper (legacy loop adapter)", () => {
1306
+ test("auto.ts startAuto dispatches through the UOK kernel wrapper with explicit kernel and legacy paths", () => {
1271
1307
  const src = readFileSync(
1272
1308
  resolve(import.meta.dirname, "..", "auto.ts"),
1273
1309
  "utf-8",
@@ -1283,8 +1319,12 @@ test("auto.ts startAuto dispatches through the UOK kernel wrapper (legacy loop a
1283
1319
  "startAuto must dispatch through runAutoLoopWithUok()",
1284
1320
  );
1285
1321
  assert.ok(
1286
- fnBlock.includes("runLegacyLoop: autoLoop"),
1287
- "startAuto must preserve the legacy autoLoop adapter in kernel dispatch",
1322
+ fnBlock.includes("runKernelLoop: runUokKernelLoop"),
1323
+ "startAuto must wire the explicit UOK kernel loop path",
1324
+ );
1325
+ assert.ok(
1326
+ fnBlock.includes("runLegacyLoop: runLegacyAutoLoop"),
1327
+ "startAuto must preserve explicit legacy fallback dispatch",
1288
1328
  );
1289
1329
  });
1290
1330
 
@@ -1332,7 +1372,7 @@ test("startAuto guards against concurrent invocation (#2923)", () => {
1332
1372
  );
1333
1373
  });
1334
1374
 
1335
- test("agent_end handler calls resolveAgentEnd (not handleAgentEnd)", () => {
1375
+ test("agent_end handler calls resolveAgentEnd (not the legacy auto.ts path)", () => {
1336
1376
  const hooksSrc = readFileSync(
1337
1377
  resolve(import.meta.dirname, "..", "bootstrap", "register-hooks.ts"),
1338
1378
  "utf-8",
@@ -1347,7 +1387,7 @@ test("agent_end handler calls resolveAgentEnd (not handleAgentEnd)", () => {
1347
1387
  );
1348
1388
  assert.ok(
1349
1389
  recoverySrc.includes("resolveAgentEnd(event)"),
1350
- "agent_end success path must call resolveAgentEnd(event) instead of handleAgentEnd(ctx, pi)",
1390
+ "agent_end success path must call resolveAgentEnd(event) instead of legacy wrappers",
1351
1391
  );
1352
1392
  assert.ok(
1353
1393
  recoverySrc.includes("isSessionSwitchInFlight()"),
@@ -1389,32 +1429,6 @@ test("auto-timeout-recovery.ts calls resolveAgentEnd instead of dispatchNextUnit
1389
1429
  );
1390
1430
  });
1391
1431
 
1392
- test("handleAgentEnd in auto.ts is a thin wrapper calling resolveAgentEnd", () => {
1393
- const src = readFileSync(
1394
- resolve(import.meta.dirname, "..", "auto.ts"),
1395
- "utf-8",
1396
- );
1397
- const fnIdx = src.indexOf("export async function handleAgentEnd");
1398
- assert.ok(fnIdx > -1, "handleAgentEnd must exist");
1399
- const fnEnd = src.indexOf("\n// ─── ", fnIdx + 100);
1400
- const fnBlock =
1401
- fnEnd > -1 ? src.slice(fnIdx, fnEnd) : src.slice(fnIdx, fnIdx + 1000);
1402
- assert.ok(
1403
- fnBlock.includes("resolveAgentEnd("),
1404
- "handleAgentEnd must call resolveAgentEnd",
1405
- );
1406
- // The function should be short — no reentrancy guard, no verification, no dispatch
1407
- assert.ok(
1408
- !fnBlock.includes("dispatchNextUnit"),
1409
- "handleAgentEnd must not call dispatchNextUnit (it's now a thin wrapper)",
1410
- );
1411
- assert.ok(
1412
- !fnBlock.includes("postUnitPreVerification") &&
1413
- !fnBlock.includes("postUnitPostVerification"),
1414
- "handleAgentEnd must not contain verification logic (moved to autoLoop)",
1415
- );
1416
- });
1417
-
1418
1432
  // ── Stuck counter tests ──────────────────────────────────────────────────────
1419
1433
 
1420
1434
  test("stuck detection: stops when sliding window detects same unit 3 consecutive times", async () => {
@@ -0,0 +1,63 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { mkdtempSync, mkdirSync, writeFileSync, existsSync, rmSync } from "node:fs";
4
+ import { join } from "node:path";
5
+ import { tmpdir } from "node:os";
6
+
7
+ import { recoverFailedMigration } from "../migrate-external.ts";
8
+
9
+ // Regression tests for #4416: `.gsd.migrating` must be healed before auto-mode
10
+ // proceeds, including on the resume path in auto.ts (fixed at auto.ts:1325).
11
+ // The `recoverFailedMigration` function is already called in `auto-start.ts:350`
12
+ // for fresh-start sessions. The fix adds an identical call to `auto.ts:startAuto`
13
+ // so that resume sessions (triggered by a persisted paused-session.json) also heal
14
+ // a leftover `.gsd.migrating` directory before acquiring the session lock.
15
+
16
+ test("recoverFailedMigration renames .gsd.migrating to .gsd when .gsd is absent", (t) => {
17
+ const base = mkdtempSync(join(tmpdir(), "gsd-migrating-recovery-"));
18
+ t.after(() => rmSync(base, { recursive: true, force: true }));
19
+
20
+ const migratingPath = join(base, ".gsd.migrating");
21
+ mkdirSync(join(migratingPath, "milestones"), { recursive: true });
22
+
23
+ const recovered = recoverFailedMigration(base);
24
+
25
+ assert.equal(recovered, true, "expected recovery to succeed");
26
+ assert.ok(existsSync(join(base, ".gsd")), ".gsd must exist after recovery");
27
+ assert.ok(!existsSync(migratingPath), ".gsd.migrating must not exist after recovery");
28
+ });
29
+
30
+ test("recoverFailedMigration returns false when .gsd.migrating is absent (nothing to do)", (t) => {
31
+ const base = mkdtempSync(join(tmpdir(), "gsd-migrating-noop-"));
32
+ t.after(() => rmSync(base, { recursive: true, force: true }));
33
+
34
+ const recovered = recoverFailedMigration(base);
35
+ assert.equal(recovered, false, "no migration to recover");
36
+ });
37
+
38
+ test("recoverFailedMigration returns false when both .gsd and .gsd.migrating exist (ambiguous)", (t) => {
39
+ const base = mkdtempSync(join(tmpdir(), "gsd-migrating-ambig-"));
40
+ t.after(() => rmSync(base, { recursive: true, force: true }));
41
+
42
+ mkdirSync(join(base, ".gsd"), { recursive: true });
43
+ mkdirSync(join(base, ".gsd.migrating"), { recursive: true });
44
+
45
+ const recovered = recoverFailedMigration(base);
46
+ assert.equal(recovered, false, "should not touch ambiguous state");
47
+ assert.ok(existsSync(join(base, ".gsd")), ".gsd must still exist");
48
+ assert.ok(existsSync(join(base, ".gsd.migrating")), ".gsd.migrating must still exist");
49
+ });
50
+
51
+ test("recoverFailedMigration preserves contents of .gsd.migrating", (t) => {
52
+ const base = mkdtempSync(join(tmpdir(), "gsd-migrating-contents-"));
53
+ t.after(() => rmSync(base, { recursive: true, force: true }));
54
+
55
+ const migratingPath = join(base, ".gsd.migrating");
56
+ mkdirSync(join(migratingPath, "milestones", "M001"), { recursive: true });
57
+ writeFileSync(join(migratingPath, "milestones", "M001", "M001-ROADMAP.md"), "# M001\n");
58
+
59
+ recoverFailedMigration(base);
60
+
61
+ const roadmap = join(base, ".gsd", "milestones", "M001", "M001-ROADMAP.md");
62
+ assert.ok(existsSync(roadmap), "Milestone file must be accessible via .gsd after recovery");
63
+ });
@@ -0,0 +1,35 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { mkdtempSync, rmSync } from "node:fs";
4
+ import { join } from "node:path";
5
+ import { tmpdir } from "node:os";
6
+
7
+ import { buildSourceFilePaths } from "../auto-prompts.ts";
8
+
9
+ // Regression test for #4416: the fallback string must not mention `rg` because
10
+ // auto-mode runs on systems where ripgrep is not installed (e.g. Windows).
11
+ test("buildSourceFilePaths fallback does not reference rg or ripgrep", (t) => {
12
+ const tmp = mkdtempSync(join(tmpdir(), "gsd-prompts-fallback-"));
13
+ t.after(() => rmSync(tmp, { recursive: true, force: true }));
14
+
15
+ // No GSD files exist in tmp — forces the fallback branch.
16
+ const result = buildSourceFilePaths(tmp, "M001");
17
+
18
+ assert.ok(
19
+ !result.includes("rg ") && !result.includes("`rg`") && !result.includes("ripgrep"),
20
+ `Fallback string must not reference rg/ripgrep. Got: ${result}`,
21
+ );
22
+ assert.ok(result.length > 0, "Fallback string must not be empty");
23
+ });
24
+
25
+ test("buildSourceFilePaths with sid also produces rg-free fallback", (t) => {
26
+ const tmp = mkdtempSync(join(tmpdir(), "gsd-prompts-fallback-sid-"));
27
+ t.after(() => rmSync(tmp, { recursive: true, force: true }));
28
+
29
+ const result = buildSourceFilePaths(tmp, "M001", "S01");
30
+
31
+ assert.ok(
32
+ !result.includes("rg ") && !result.includes("`rg`") && !result.includes("ripgrep"),
33
+ `Fallback string must not reference rg/ripgrep. Got: ${result}`,
34
+ );
35
+ });
@@ -5,7 +5,8 @@ import { join } from "node:path";
5
5
  import { tmpdir } from "node:os";
6
6
  import { randomUUID } from "node:crypto";
7
7
 
8
- import { verifyExpectedArtifact, hasImplementationArtifacts, resolveExpectedArtifactPath, diagnoseExpectedArtifact, buildLoopRemediationSteps } from "../auto-recovery.ts";
8
+ import { verifyExpectedArtifact, hasImplementationArtifacts, resolveExpectedArtifactPath, diagnoseExpectedArtifact, buildLoopRemediationSteps, writeBlockerPlaceholder } from "../auto-recovery.ts";
9
+ import { resolveMilestoneFile } from "../paths.ts";
9
10
  import { openDatabase, closeDatabase, insertMilestone, insertSlice, insertGateRow } from "../gsd-db.ts";
10
11
  import { clearParseCache } from "../files.ts";
11
12
  import { parseRoadmap } from "../parsers-legacy.ts";
@@ -712,3 +713,124 @@ test("verifyExpectedArtifact checks pending gate-evaluate artifacts without ESM
712
713
 
713
714
  assert.equal(verified, false, "pending gates should keep gate-evaluate unverified");
714
715
  });
716
+
717
+ // ─── #4414 regressions ────────────────────────────────────────────────────────
718
+
719
+ test("#4414: writeBlockerPlaceholder invalidates path cache so dispatch guard sees file", () => {
720
+ const base = makeTmpBase();
721
+ try {
722
+ // Prime the readdir cache by resolving a DIFFERENT file first — this
723
+ // mirrors the stuck-loop condition where the dispatch guard cached an
724
+ // empty directory listing before the placeholder was written.
725
+ invalidateAllCaches();
726
+ assert.equal(
727
+ resolveMilestoneFile(base, "M001", "RESEARCH"),
728
+ null,
729
+ "no RESEARCH file yet",
730
+ );
731
+
732
+ const result = writeBlockerPlaceholder(
733
+ "research-milestone",
734
+ "M001",
735
+ base,
736
+ "verification retries exhausted",
737
+ );
738
+ assert.ok(result, "placeholder path returned");
739
+
740
+ // After writeBlockerPlaceholder, the dispatch guard must see the new file
741
+ // immediately — otherwise the rule re-fires (#4414, 7× re-dispatch).
742
+ const postResolve = resolveMilestoneFile(base, "M001", "RESEARCH");
743
+ assert.ok(
744
+ postResolve,
745
+ "resolveMilestoneFile finds the placeholder post-write (cache invalidated)",
746
+ );
747
+ } finally {
748
+ cleanup(base);
749
+ }
750
+ });
751
+
752
+ test("#4414: parallel-research sentinel path does not collide with RESEARCH suffix", () => {
753
+ const base = makeTmpBase();
754
+ try {
755
+ // Write only the parallel-research blocker (sentinel).
756
+ const sentinel = resolveExpectedArtifactPath(
757
+ "research-slice",
758
+ "M001/parallel-research",
759
+ base,
760
+ );
761
+ assert.ok(sentinel, "sentinel path resolves for parallel-research");
762
+ writeFileSync(sentinel!, "# blocker\n", "utf-8");
763
+
764
+ // Critical: the sentinel filename must NOT be matched by the legacy regex
765
+ // used when callers look up milestone-level RESEARCH. Otherwise the
766
+ // dispatch guard for research-milestone would short-circuit falsely.
767
+ const milestoneResearch = resolveMilestoneFile(base, "M001", "RESEARCH");
768
+ assert.equal(
769
+ milestoneResearch,
770
+ null,
771
+ "sentinel must not be mistaken for M001-RESEARCH.md via legacy pattern match",
772
+ );
773
+ } finally {
774
+ cleanup(base);
775
+ }
776
+ });
777
+
778
+ test("#4414: verifyExpectedArtifact parallel-research succeeds when all research-ready slices have RESEARCH", () => {
779
+ const base = makeTmpBase();
780
+ try {
781
+ mkdirSync(join(base, ".gsd", "milestones", "M001", "slices", "S02", "tasks"), { recursive: true });
782
+ mkdirSync(join(base, ".gsd", "milestones", "M001", "slices", "S03", "tasks"), { recursive: true });
783
+
784
+ // Minimal roadmap with three slices
785
+ writeFileSync(
786
+ join(base, ".gsd", "milestones", "M001", "M001-ROADMAP.md"),
787
+ [
788
+ "# M001: Regression",
789
+ "",
790
+ "## Slices",
791
+ "",
792
+ "- [ ] **S01: Alpha** `risk:low` `depends:[]`",
793
+ "- [ ] **S02: Beta** `risk:low` `depends:[]`",
794
+ "- [ ] **S03: Gamma** `risk:low` `depends:[]`",
795
+ "",
796
+ ].join("\n"),
797
+ "utf-8",
798
+ );
799
+
800
+ // Only 2 of 3 have RESEARCH — should fail verification
801
+ writeFileSync(
802
+ join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-RESEARCH.md"),
803
+ "# research",
804
+ "utf-8",
805
+ );
806
+ writeFileSync(
807
+ join(base, ".gsd", "milestones", "M001", "slices", "S02", "S02-RESEARCH.md"),
808
+ "# research",
809
+ "utf-8",
810
+ );
811
+
812
+ clearParseCache();
813
+ invalidateAllCaches();
814
+ assert.equal(
815
+ verifyExpectedArtifact("research-slice", "M001/parallel-research", base),
816
+ false,
817
+ "missing S03 RESEARCH → verification fails",
818
+ );
819
+
820
+ // All three RESEARCH present → verification passes
821
+ writeFileSync(
822
+ join(base, ".gsd", "milestones", "M001", "slices", "S03", "S03-RESEARCH.md"),
823
+ "# research",
824
+ "utf-8",
825
+ );
826
+ clearParseCache();
827
+ invalidateAllCaches();
828
+ assert.equal(
829
+ verifyExpectedArtifact("research-slice", "M001/parallel-research", base),
830
+ true,
831
+ "all slices have RESEARCH → verification passes",
832
+ );
833
+ } finally {
834
+ cleanup(base);
835
+ }
836
+ });
@@ -15,6 +15,9 @@ const autoSrc = readFileSync(autoPath, "utf-8");
15
15
  const runUnitPath = join(import.meta.dirname, "..", "auto", "run-unit.ts");
16
16
  const runUnitSrc = readFileSync(runUnitPath, "utf-8");
17
17
 
18
+ const registerHooksPath = join(import.meta.dirname, "..", "bootstrap", "register-hooks.ts");
19
+ const registerHooksSrc = readFileSync(registerHooksPath, "utf-8");
20
+
18
21
  describe("#3512: gsd-auto-wrapup must not interrupt in-flight tool calls", () => {
19
22
  test("soft timeout wrapup gates triggerTurn on getInFlightToolCount() === 0", () => {
20
23
  // The soft timeout sendMessage must NOT use a hardcoded `triggerTurn: true`.
@@ -70,6 +73,42 @@ describe("#3512: gsd-auto-wrapup must not interrupt in-flight tool calls", () =>
70
73
  });
71
74
  });
72
75
 
76
+ describe("#4276: pending/skipped tools stay visible to auto-mode hooks", () => {
77
+ test("tool_call handler marks GSD tools in-flight before execution_start", () => {
78
+ const startMarker = 'pi.on("tool_call", async (event, ctx) => {';
79
+ const endMarker = 'pi.on("tool_result", async (event) => {';
80
+ const toolCallSection = registerHooksSrc.slice(
81
+ registerHooksSrc.indexOf(startMarker),
82
+ registerHooksSrc.indexOf(endMarker),
83
+ );
84
+
85
+ assert.ok(toolCallSection.length > 0, "Could not locate tool_call handler section");
86
+ assert.ok(
87
+ toolCallSection.includes("markToolStart(event.toolCallId, event.toolName)"),
88
+ "tool_call handler must mark tools pending before tool_execution_start fires",
89
+ );
90
+ });
91
+
92
+ test("tool_result handler clears pending tools and records queued-skip errors", () => {
93
+ const startMarker = 'pi.on("tool_result", async (event) => {';
94
+ const endMarker = 'pi.on("tool_execution_start", async (event) => {';
95
+ const toolResultSection = registerHooksSrc.slice(
96
+ registerHooksSrc.indexOf(startMarker),
97
+ registerHooksSrc.indexOf(endMarker),
98
+ );
99
+
100
+ assert.ok(toolResultSection.length > 0, "Could not locate tool_result handler section");
101
+ assert.ok(
102
+ toolResultSection.includes("markToolEnd(event.toolCallId)"),
103
+ "tool_result handler must clear pending tool tracking even when execution hooks never fire",
104
+ );
105
+ assert.ok(
106
+ toolResultSection.includes("recordToolInvocationError(event.toolName, errorText)"),
107
+ "tool_result handler must surface queued-skip errors for GSD tools",
108
+ );
109
+ });
110
+ });
111
+
73
112
  describe("#3512: pauseAuto and stopAuto must flush queued follow-up messages", () => {
74
113
  test("stopAuto calls clearQueue()", () => {
75
114
  // stopAuto must flush queued messages to prevent late async_job_result
@@ -44,6 +44,14 @@ test("/gsd description includes discuss", () => {
44
44
  );
45
45
  });
46
46
 
47
+ test("/gsd description includes debug", () => {
48
+ const pi = createMockPi();
49
+ registerGSDCommand(pi as any);
50
+
51
+ const gsd = pi.commands.get("gsd");
52
+ assert.ok(gsd.description.includes("debug"), "description should include debug");
53
+ });
54
+
47
55
  test("/gsd next completions include --debug", () => {
48
56
  const pi = createMockPi();
49
57
  registerGSDCommand(pi as any);
@@ -54,6 +62,18 @@ test("/gsd next completions include --debug", () => {
54
62
  assert.ok(debug, "next --debug should appear in completions");
55
63
  });
56
64
 
65
+ test("/gsd debug completions include list|status|continue|--diagnose", () => {
66
+ const pi = createMockPi();
67
+ registerGSDCommand(pi as any);
68
+
69
+ const gsd = pi.commands.get("gsd");
70
+ const completions = gsd.getArgumentCompletions("debug ");
71
+ const values = completions.map((c: any) => c.value);
72
+ for (const expected of ["debug list", "debug status", "debug continue", "debug --diagnose"]) {
73
+ assert.ok(values.includes(expected), `missing completion: ${expected}`);
74
+ }
75
+ });
76
+
57
77
  test("/gsd widget completions include full|small|min|off", () => {
58
78
  const pi = createMockPi();
59
79
  registerGSDCommand(pi as any);
@@ -66,6 +86,25 @@ test("/gsd widget completions include full|small|min|off", () => {
66
86
  }
67
87
  });
68
88
 
89
+ test("/gsd logs completions still include debug after adding /gsd debug", () => {
90
+ const pi = createMockPi();
91
+ registerGSDCommand(pi as any);
92
+
93
+ const gsd = pi.commands.get("gsd");
94
+ const completions = gsd.getArgumentCompletions("logs ");
95
+ const values = completions.map((c: any) => c.value);
96
+ assert.ok(values.includes("logs debug"), "logs debug completion should remain available");
97
+ });
98
+
99
+ test("/gsd help full includes /gsd debug command", async () => {
100
+ const ctx = createMockCtx();
101
+
102
+ await handleGSDCommand("help full", ctx as any, {} as any);
103
+
104
+ const helpText = ctx.notifications.map((n) => n.message).join("\n");
105
+ assert.match(helpText, /\/gsd debug\s+Create\/list\/continue persistent debug sessions/);
106
+ });
107
+
69
108
  test("bare /gsd skip shows usage and does not fall through to unknown-command warning", async () => {
70
109
  const ctx = createMockCtx();
71
110