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
@@ -0,0 +1,310 @@
1
+ /**
2
+ * workflow-plugins.test.ts — Tests for the unified plugin discovery & resolution.
3
+ *
4
+ * Verifies precedence (project > global > bundled), both YAML and markdown
5
+ * formats, mode defaults, invalid-file handling, and legacy compat with
6
+ * `.gsd/workflow-defs/`.
7
+ */
8
+
9
+ import { describe, it, afterEach, beforeEach } from "node:test";
10
+ import assert from "node:assert/strict";
11
+ import {
12
+ mkdtempSync,
13
+ rmSync,
14
+ mkdirSync,
15
+ writeFileSync,
16
+ } from "node:fs";
17
+ import { join } from "node:path";
18
+ import { tmpdir } from "node:os";
19
+
20
+ import {
21
+ discoverPlugins,
22
+ resolvePlugin,
23
+ listPluginsFormatted,
24
+ formatPluginInfo,
25
+ } from "../workflow-plugins.ts";
26
+
27
+ // ─── Test setup ──────────────────────────────────────────────────────────
28
+
29
+ const tmpDirs: string[] = [];
30
+ let savedGsdHome: string | undefined;
31
+
32
+ function makeTmpBase(): string {
33
+ const dir = mkdtempSync(join(tmpdir(), "wf-plugins-test-"));
34
+ tmpDirs.push(dir);
35
+ return dir;
36
+ }
37
+
38
+ beforeEach(() => {
39
+ savedGsdHome = process.env.GSD_HOME;
40
+ const fakeHome = makeTmpBase();
41
+ process.env.GSD_HOME = fakeHome;
42
+ });
43
+
44
+ afterEach(() => {
45
+ if (savedGsdHome === undefined) {
46
+ delete process.env.GSD_HOME;
47
+ } else {
48
+ process.env.GSD_HOME = savedGsdHome;
49
+ }
50
+ for (const d of tmpDirs) {
51
+ try { rmSync(d, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* non-fatal */ }
52
+ }
53
+ tmpDirs.length = 0;
54
+ });
55
+
56
+ function writeFile(path: string, content: string): void {
57
+ mkdirSync(join(path, "..").replace(/[^/]+$/, ""), { recursive: true });
58
+ writeFileSync(path, content, "utf-8");
59
+ }
60
+
61
+ function writeProjectPlugin(basePath: string, filename: string, content: string): void {
62
+ const dir = join(basePath, ".gsd", "workflows");
63
+ mkdirSync(dir, { recursive: true });
64
+ writeFileSync(join(dir, filename), content, "utf-8");
65
+ }
66
+
67
+ function writeGlobalPlugin(filename: string, content: string): void {
68
+ const dir = join(process.env.GSD_HOME!, "workflows");
69
+ mkdirSync(dir, { recursive: true });
70
+ writeFileSync(join(dir, filename), content, "utf-8");
71
+ }
72
+
73
+ function writeLegacyDef(basePath: string, filename: string, content: string): void {
74
+ const dir = join(basePath, ".gsd", "workflow-defs");
75
+ mkdirSync(dir, { recursive: true });
76
+ writeFileSync(join(dir, filename), content, "utf-8");
77
+ }
78
+
79
+ const SIMPLE_YAML = `
80
+ version: 1
81
+ name: sample
82
+ description: A sample YAML plugin
83
+ steps:
84
+ - id: s1
85
+ name: Step 1
86
+ prompt: Do the thing
87
+ `;
88
+
89
+ const SIMPLE_ONESHOT_YAML = `
90
+ version: 1
91
+ name: oneshot-sample
92
+ mode: oneshot
93
+ description: A oneshot yaml plugin
94
+ steps:
95
+ - id: only
96
+ name: Only
97
+ prompt: Just do it
98
+ `;
99
+
100
+ const SIMPLE_MD = `# Sample MD Plugin
101
+
102
+ <template_meta>
103
+ name: sample-md
104
+ version: 1
105
+ mode: markdown-phase
106
+ artifact_dir: .gsd/workflows/samples/
107
+ </template_meta>
108
+
109
+ <phases>
110
+ 1. one
111
+ 2. two
112
+ </phases>
113
+ `;
114
+
115
+ const ONESHOT_MD = `# Oneshot MD Plugin
116
+
117
+ <template_meta>
118
+ name: oneshot-md
119
+ version: 1
120
+ mode: oneshot
121
+ </template_meta>
122
+ `;
123
+
124
+ // ─── Bundled discovery ───────────────────────────────────────────────────
125
+
126
+ describe("discoverPlugins: bundled tier", () => {
127
+ it("discovers the 8+ bundled templates", () => {
128
+ const base = makeTmpBase();
129
+ const plugins = discoverPlugins(base);
130
+ for (const id of ["bugfix", "hotfix", "spike", "full-project"]) {
131
+ assert.ok(plugins.has(id), `bundled plugin "${id}" should be discovered`);
132
+ }
133
+ assert.equal(plugins.get("bugfix")!.source, "bundled");
134
+ assert.equal(plugins.get("bugfix")!.format, "md");
135
+ });
136
+
137
+ it("bundled templates have valid mode values", () => {
138
+ const base = makeTmpBase();
139
+ const plugins = discoverPlugins(base);
140
+ const bugfix = plugins.get("bugfix")!;
141
+ assert.equal(bugfix.meta.mode, "markdown-phase");
142
+ const fullProject = plugins.get("full-project")!;
143
+ assert.equal(fullProject.meta.mode, "auto-milestone");
144
+ });
145
+ });
146
+
147
+ // ─── Project / Global / Bundled precedence ───────────────────────────────
148
+
149
+ describe("discoverPlugins: precedence", () => {
150
+ it("project overrides bundled", () => {
151
+ const base = makeTmpBase();
152
+ writeProjectPlugin(base, "bugfix.md", `# Overridden\n\n<template_meta>\nname: bugfix-override\nmode: markdown-phase\n</template_meta>`);
153
+ const plugins = discoverPlugins(base);
154
+ const bugfix = plugins.get("bugfix")!;
155
+ assert.equal(bugfix.source, "project");
156
+ assert.ok(bugfix.path.includes(".gsd/workflows/bugfix.md"));
157
+ });
158
+
159
+ it("global overrides bundled when project is absent", () => {
160
+ const base = makeTmpBase();
161
+ writeGlobalPlugin("bugfix.md", `# Global\n\n<template_meta>\nname: bugfix-global\nmode: markdown-phase\n</template_meta>`);
162
+ const plugins = discoverPlugins(base);
163
+ const bugfix = plugins.get("bugfix")!;
164
+ assert.equal(bugfix.source, "global");
165
+ });
166
+
167
+ it("project overrides global", () => {
168
+ const base = makeTmpBase();
169
+ writeGlobalPlugin("foo.yaml", SIMPLE_YAML);
170
+ writeProjectPlugin(base, "foo.yaml", SIMPLE_YAML.replace("sample", "foo"));
171
+ const plugins = discoverPlugins(base);
172
+ assert.equal(plugins.get("foo")!.source, "project");
173
+ });
174
+ });
175
+
176
+ // ─── YAML + MD format handling ───────────────────────────────────────────
177
+
178
+ describe("discoverPlugins: formats", () => {
179
+ it("loads a project YAML plugin with default mode yaml-step", () => {
180
+ const base = makeTmpBase();
181
+ writeProjectPlugin(base, "sample.yaml", SIMPLE_YAML);
182
+ const plugins = discoverPlugins(base);
183
+ const p = plugins.get("sample")!;
184
+ assert.equal(p.format, "yaml");
185
+ assert.equal(p.meta.mode, "yaml-step");
186
+ assert.equal(p.meta.displayName, "sample");
187
+ });
188
+
189
+ it("respects mode: oneshot in YAML", () => {
190
+ const base = makeTmpBase();
191
+ writeProjectPlugin(base, "oneshot-sample.yaml", SIMPLE_ONESHOT_YAML);
192
+ const plugins = discoverPlugins(base);
193
+ assert.equal(plugins.get("oneshot-sample")!.meta.mode, "oneshot");
194
+ });
195
+
196
+ it("loads a project MD plugin with default mode markdown-phase", () => {
197
+ const base = makeTmpBase();
198
+ writeProjectPlugin(base, "simple-md.md", `# Plain\n\n<template_meta>\nname: plain\n</template_meta>`);
199
+ const plugins = discoverPlugins(base);
200
+ assert.equal(plugins.get("simple-md")!.meta.mode, "markdown-phase");
201
+ });
202
+
203
+ it("respects mode: oneshot in MD", () => {
204
+ const base = makeTmpBase();
205
+ writeProjectPlugin(base, "oneshot-md.md", ONESHOT_MD);
206
+ const plugins = discoverPlugins(base);
207
+ assert.equal(plugins.get("oneshot-md")!.meta.mode, "oneshot");
208
+ });
209
+
210
+ it("parses phases from MD <phases> block", () => {
211
+ const base = makeTmpBase();
212
+ writeProjectPlugin(base, "sample-md.md", SIMPLE_MD);
213
+ const plugins = discoverPlugins(base);
214
+ const p = plugins.get("sample-md")!;
215
+ assert.deepEqual(p.meta.phases, ["one", "two"]);
216
+ });
217
+ });
218
+
219
+ // ─── Error handling ──────────────────────────────────────────────────────
220
+
221
+ describe("discoverPlugins: error handling", () => {
222
+ it("invalid YAML surfaces as an entry with an error, doesn't crash", () => {
223
+ const base = makeTmpBase();
224
+ writeProjectPlugin(base, "broken.yaml", "this: is: not: valid: yaml:\n - x\n - y");
225
+ const plugins = discoverPlugins(base);
226
+ const p = plugins.get("broken");
227
+ assert.ok(p, "broken plugin should still appear");
228
+ if (p!.error) {
229
+ assert.match(p!.error, /parse|object/i);
230
+ }
231
+ });
232
+
233
+ it("ignores subdirectories under .gsd/workflows/ (artifact dirs)", () => {
234
+ const base = makeTmpBase();
235
+ // Create a subdir — simulates `/gsd start bugfix` artifact dir
236
+ mkdirSync(join(base, ".gsd", "workflows", "bugfixes", "250101-1-slug"), { recursive: true });
237
+ writeFileSync(join(base, ".gsd", "workflows", "bugfixes", "250101-1-slug", "STATE.json"), "{}", "utf-8");
238
+ const plugins = discoverPlugins(base);
239
+ assert.ok(!plugins.has("bugfixes"), "should not pick up subdir as a plugin");
240
+ });
241
+ });
242
+
243
+ // ─── resolvePlugin ───────────────────────────────────────────────────────
244
+
245
+ describe("resolvePlugin", () => {
246
+ it("returns the plugin by name", () => {
247
+ const base = makeTmpBase();
248
+ writeProjectPlugin(base, "foo.yaml", SIMPLE_YAML);
249
+ const p = resolvePlugin(base, "foo");
250
+ assert.ok(p);
251
+ assert.equal(p!.name, "foo");
252
+ });
253
+
254
+ it("returns null for unknown names", () => {
255
+ const base = makeTmpBase();
256
+ assert.equal(resolvePlugin(base, "nonexistent-plugin-xyz"), null);
257
+ });
258
+
259
+ it("resolves bundled templates", () => {
260
+ const base = makeTmpBase();
261
+ const p = resolvePlugin(base, "bugfix");
262
+ assert.ok(p);
263
+ assert.equal(p!.source, "bundled");
264
+ });
265
+ });
266
+
267
+ // ─── Legacy fallback ─────────────────────────────────────────────────────
268
+
269
+ describe("discoverPlugins: legacy .gsd/workflow-defs/", () => {
270
+ it("still discovers legacy YAML definitions", () => {
271
+ const base = makeTmpBase();
272
+ writeLegacyDef(base, "legacy.yaml", SIMPLE_YAML);
273
+ const plugins = discoverPlugins(base);
274
+ assert.ok(plugins.has("legacy"), "legacy definition should be discovered");
275
+ assert.equal(plugins.get("legacy")!.format, "yaml");
276
+ });
277
+
278
+ it("new .gsd/workflows/ overrides legacy .gsd/workflow-defs/", () => {
279
+ const base = makeTmpBase();
280
+ writeLegacyDef(base, "dup.yaml", SIMPLE_YAML);
281
+ writeProjectPlugin(base, "dup.yaml", SIMPLE_YAML);
282
+ const plugins = discoverPlugins(base);
283
+ const p = plugins.get("dup")!;
284
+ assert.ok(p.path.includes(".gsd/workflows/dup.yaml"));
285
+ });
286
+ });
287
+
288
+ // ─── Display ─────────────────────────────────────────────────────────────
289
+
290
+ describe("listPluginsFormatted", () => {
291
+ it("produces output grouped by mode with bundled templates", () => {
292
+ const base = makeTmpBase();
293
+ const out = listPluginsFormatted(base);
294
+ assert.match(out, /Workflow Plugins/);
295
+ assert.match(out, /\[markdown-phase\]/);
296
+ assert.match(out, /bugfix/);
297
+ });
298
+ });
299
+
300
+ describe("formatPluginInfo", () => {
301
+ it("formats YAML plugin info", () => {
302
+ const base = makeTmpBase();
303
+ writeProjectPlugin(base, "foo.yaml", SIMPLE_YAML);
304
+ const p = resolvePlugin(base, "foo")!;
305
+ const info = formatPluginInfo(p);
306
+ assert.match(info, /Plugin:/);
307
+ assert.match(info, /Mode:\s+yaml-step/);
308
+ assert.match(info, /Source:\s+project/);
309
+ });
310
+ });
@@ -28,6 +28,8 @@ function makeSlice(overrides: Partial<SliceRow> = {}): SliceRow {
28
28
  completed_at: null,
29
29
  sequence: 1,
30
30
  replan_triggered_at: null,
31
+ is_sketch: 0,
32
+ sketch_scope: '',
31
33
  ...overrides,
32
34
  };
33
35
  }
@@ -59,6 +61,11 @@ function makeTask(overrides: Partial<TaskRow> = {}): TaskRow {
59
61
  expected_output: [],
60
62
  observability_impact: '',
61
63
  sequence: 1,
64
+ blocker_source: '',
65
+ escalation_pending: 0,
66
+ escalation_awaiting_review: 0,
67
+ escalation_artifact_path: null,
68
+ escalation_override_applied_at: null,
62
69
  ...overrides,
63
70
  };
64
71
  }
@@ -36,8 +36,14 @@ console.log('\n── Registry Loading ──');
36
36
  for (const [id, entry] of Object.entries(registry.templates)) {
37
37
  assert.ok(typeof entry.name === 'string' && entry.name.length > 0, `${id}: name should be non-empty string`);
38
38
  assert.ok(typeof entry.description === 'string' && entry.description.length > 0, `${id}: description should be non-empty`);
39
- assert.ok(typeof entry.file === 'string' && entry.file.endsWith('.md'), `${id}: file should be a .md path`);
40
- assert.ok(Array.isArray(entry.phases) && entry.phases.length > 0, `${id}: phases should be non-empty array`);
39
+ assert.ok(typeof entry.file === 'string' && (entry.file.endsWith('.md') || entry.file.endsWith('.yaml') || entry.file.endsWith('.yml')), `${id}: file should be a .md or .yaml path`);
40
+ // Phases are only required for phased modes (markdown-phase, auto-milestone).
41
+ const isPhased = !entry.mode || entry.mode === 'markdown-phase' || entry.mode === 'auto-milestone';
42
+ if (isPhased) {
43
+ assert.ok(Array.isArray(entry.phases) && entry.phases.length > 0, `${id}: phases should be non-empty array for phased mode`);
44
+ } else {
45
+ assert.ok(Array.isArray(entry.phases), `${id}: phases should be an array (may be empty for ${entry.mode})`);
46
+ }
41
47
  assert.ok(Array.isArray(entry.triggers) && entry.triggers.length > 0, `${id}: triggers should be non-empty array`);
42
48
  }
43
49
  }
@@ -49,6 +49,7 @@ function makeDeps(
49
49
  loadEffectiveGSDPreferences: () => ({ preferences: { git: {} } }),
50
50
  invalidateAllCaches: () => {},
51
51
  captureIntegrationBranch: () => {},
52
+ enterBranchModeForMilestone: () => {},
52
53
  ...overrides,
53
54
  };
54
55
  return deps;
@@ -127,7 +128,7 @@ describe("worktree journal events", () => {
127
128
 
128
129
  test("enterMilestone emits worktree-skip when isolation disabled", () => {
129
130
  const s = makeSession({ basePath: tmp, originalBasePath: tmp });
130
- const deps = makeDeps({ shouldUseWorktreeIsolation: () => false });
131
+ const deps = makeDeps({ shouldUseWorktreeIsolation: () => false, getIsolationMode: () => "none" });
131
132
  const resolver = new WorktreeResolver(s, deps);
132
133
 
133
134
  resolver.enterMilestone("M001", makeNotifyCtx());
@@ -145,6 +145,9 @@ function makeDeps(
145
145
  args: [basePath, mid],
146
146
  });
147
147
  },
148
+ enterBranchModeForMilestone: (basePath: string, milestoneId: string) => {
149
+ calls.push({ fn: "enterBranchModeForMilestone", args: [basePath, milestoneId] });
150
+ },
148
151
  ...overrides,
149
152
  };
150
153
 
@@ -252,10 +255,10 @@ test("enterMilestone enters existing worktree instead of creating", () => {
252
255
  assert.equal(findCalls(deps.calls, "createAutoWorktree").length, 0);
253
256
  });
254
257
 
255
- test("enterMilestone is no-op when shouldUseWorktreeIsolation is false", () => {
258
+ test("enterMilestone is no-op when isolation mode is none", () => {
256
259
  const s = makeSession();
257
260
  const deps = makeDeps({
258
- shouldUseWorktreeIsolation: () => false,
261
+ getIsolationMode: () => "none",
259
262
  });
260
263
  const ctx = makeNotifyCtx();
261
264
  const resolver = new WorktreeResolver(s, deps);
@@ -265,6 +268,7 @@ test("enterMilestone is no-op when shouldUseWorktreeIsolation is false", () => {
265
268
  assert.equal(s.basePath, "/project"); // unchanged
266
269
  assert.equal(findCalls(deps.calls, "createAutoWorktree").length, 0);
267
270
  assert.equal(findCalls(deps.calls, "enterAutoWorktree").length, 0);
271
+ assert.equal(findCalls(deps.calls, "enterBranchModeForMilestone").length, 0);
268
272
  });
269
273
 
270
274
  test("enterMilestone does NOT update basePath on creation failure", () => {
@@ -309,6 +313,77 @@ test("enterMilestone uses originalBasePath as base for worktree ops", () => {
309
313
  assert.equal(createdFrom, "/project"); // uses originalBasePath, not current basePath
310
314
  });
311
315
 
316
+ // ─── enterMilestone Tests (branch mode) ──────────────────────────────────────
317
+
318
+ test("enterMilestone in branch mode calls enterBranchModeForMilestone and rebuilds GitService", () => {
319
+ const s = makeSession();
320
+ const deps = makeDeps({
321
+ getIsolationMode: () => "branch",
322
+ });
323
+ const ctx = makeNotifyCtx();
324
+ const resolver = new WorktreeResolver(s, deps);
325
+
326
+ resolver.enterMilestone("M001", ctx);
327
+
328
+ // Branch mode: no worktree created, basePath unchanged
329
+ assert.equal(s.basePath, "/project");
330
+ assert.equal(findCalls(deps.calls, "enterBranchModeForMilestone").length, 1);
331
+ assert.equal(findCalls(deps.calls, "createAutoWorktree").length, 0);
332
+ assert.equal(findCalls(deps.calls, "enterAutoWorktree").length, 0);
333
+ assert.equal(findCalls(deps.calls, "GitServiceImpl").length, 1);
334
+ assert.ok(ctx.messages.some((m) => m.level === "info" && m.msg.includes("milestone/M001")));
335
+ });
336
+
337
+ test("enterMilestone in branch mode uses originalBasePath as base", () => {
338
+ const s = makeSession({ basePath: "/project", originalBasePath: "/project" });
339
+ let calledWith = "";
340
+ const deps = makeDeps({
341
+ getIsolationMode: () => "branch",
342
+ enterBranchModeForMilestone: (basePath: string, _mid: string) => {
343
+ calledWith = basePath;
344
+ },
345
+ });
346
+ const ctx = makeNotifyCtx();
347
+ const resolver = new WorktreeResolver(s, deps);
348
+
349
+ resolver.enterMilestone("M001", ctx);
350
+
351
+ assert.equal(calledWith, "/project");
352
+ });
353
+
354
+ test("enterMilestone in branch mode degrades isolation on failure", () => {
355
+ const s = makeSession();
356
+ const deps = makeDeps({
357
+ getIsolationMode: () => "branch",
358
+ enterBranchModeForMilestone: () => {
359
+ throw new Error("checkout failed");
360
+ },
361
+ });
362
+ const ctx = makeNotifyCtx();
363
+ const resolver = new WorktreeResolver(s, deps);
364
+
365
+ resolver.enterMilestone("M001", ctx);
366
+
367
+ assert.equal(s.basePath, "/project"); // unchanged
368
+ assert.ok(s.isolationDegraded);
369
+ assert.ok(ctx.messages.some((m) => m.level === "warning" && m.msg.includes("checkout failed")));
370
+ });
371
+
372
+ test("enterMilestone branch mode is skipped when isolationDegraded", () => {
373
+ const s = makeSession();
374
+ s.isolationDegraded = true;
375
+ const deps = makeDeps({
376
+ getIsolationMode: () => "branch",
377
+ });
378
+ const ctx = makeNotifyCtx();
379
+ const resolver = new WorktreeResolver(s, deps);
380
+
381
+ resolver.enterMilestone("M001", ctx);
382
+
383
+ assert.equal(findCalls(deps.calls, "enterBranchModeForMilestone").length, 0);
384
+ assert.equal(findCalls(deps.calls, "createAutoWorktree").length, 0);
385
+ });
386
+
312
387
  // ─── exitMilestone Tests ─────────────────────────────────────────────────────
313
388
 
314
389
  test("exitMilestone commits, tears down, and resets basePath", () => {
@@ -37,6 +37,8 @@ import { renderAllProjections, renderSummaryContent } from "../workflow-projecti
37
37
  import { writeManifest } from "../workflow-manifest.js";
38
38
  import { appendEvent } from "../workflow-events.js";
39
39
  import { logWarning, logError } from "../workflow-logger.js";
40
+ import { loadEffectiveGSDPreferences } from "../preferences.js";
41
+ import { buildEscalationArtifact, writeEscalationArtifact } from "../escalation.js";
40
42
 
41
43
  export interface CompleteTaskResult {
42
44
  taskId: string;
@@ -111,6 +113,11 @@ function paramsToTaskRow(params: CompleteTaskParams, completedAt: string): TaskR
111
113
  observability_impact: "",
112
114
  full_plan_md: "",
113
115
  sequence: 0,
116
+ blocker_source: "",
117
+ escalation_pending: 0,
118
+ escalation_awaiting_review: 0,
119
+ escalation_artifact_path: null,
120
+ escalation_override_applied_at: null,
114
121
  };
115
122
  }
116
123
 
@@ -153,6 +160,39 @@ export async function handleCompleteTask(
153
160
  const completedAt = new Date().toISOString();
154
161
  let guardError: string | null = null;
155
162
 
163
+ // ── ADR-011 Phase 2: validate escalation payload BEFORE any side effects ─
164
+ // Building the artifact runs the full shape validation (2-4 options, unique
165
+ // ids, recommendation references a real id). If the payload is malformed
166
+ // we must reject the call before marking the task complete, writing
167
+ // SUMMARY.md, flipping the plan checkbox, or closing execute-task gates —
168
+ // otherwise a rejected payload would leave the task marked complete with
169
+ // no escalation recorded, and the loop would silently advance past it.
170
+ // The filesystem write happens later (after side effects) because that's
171
+ // the cheapest ordering and validation is where 99% of failures live.
172
+ let validatedEscalationArtifact: ReturnType<typeof buildEscalationArtifact> | null = null;
173
+ let escalationWriteEnabled = false;
174
+ if (params.escalation) {
175
+ escalationWriteEnabled = loadEffectiveGSDPreferences()?.preferences?.phases?.mid_execution_escalation === true;
176
+ if (escalationWriteEnabled) {
177
+ try {
178
+ validatedEscalationArtifact = buildEscalationArtifact({
179
+ taskId: params.taskId,
180
+ sliceId: params.sliceId,
181
+ milestoneId: params.milestoneId,
182
+ question: params.escalation.question,
183
+ options: params.escalation.options,
184
+ recommendation: params.escalation.recommendation,
185
+ recommendationRationale: params.escalation.recommendationRationale,
186
+ continueWithDefault: params.escalation.continueWithDefault,
187
+ });
188
+ } catch (validationErr) {
189
+ return {
190
+ error: `complete-task escalation payload invalid for ${params.milestoneId}/${params.sliceId}/${params.taskId}: ${(validationErr as Error).message}`,
191
+ };
192
+ }
193
+ }
194
+ }
195
+
156
196
  transaction(() => {
157
197
  // State machine preconditions (inside txn for atomicity).
158
198
  // Milestone/slice not existing is OK — insertMilestone/insertSlice below will auto-create.
@@ -299,6 +339,53 @@ export async function handleCompleteTask(
299
339
  );
300
340
  }
301
341
 
342
+ // ── ADR-011 Phase 2: write escalation artifact (opt-in) ────────────────
343
+ // Validation already happened BEFORE side effects — this block only
344
+ // performs the disk write for a pre-validated artifact. For
345
+ // continueWithDefault=false, a write failure here would otherwise leave
346
+ // the task marked complete with SUMMARY.md + closed gates but no
347
+ // escalation, which silently advances the loop past a pause the user
348
+ // asked for. We compensate by reverting the DB-level completion: set
349
+ // status back to 'pending' and delete the verification_evidence rows
350
+ // (same shape as the disk-render-failure rollback above). SUMMARY.md
351
+ // on disk is left in place because the next complete-task retry will
352
+ // overwrite it; gate rows are UPSERT-keyed per task and will also be
353
+ // overwritten. This restores the invariant that deriveState() sees a
354
+ // consistent "task not done" view so the loop re-dispatches the task.
355
+ if (validatedEscalationArtifact) {
356
+ try {
357
+ writeEscalationArtifact(basePath, validatedEscalationArtifact);
358
+ } catch (escalationErr) {
359
+ const msg = `complete-task escalation write failed for ${params.milestoneId}/${params.sliceId}/${params.taskId}: ${(escalationErr as Error).message}`;
360
+ logWarning("tool", msg);
361
+ if (validatedEscalationArtifact.continueWithDefault === false) {
362
+ // Compensating rollback: revert DB completion so the loop pauses on
363
+ // re-dispatch instead of silently advancing. Mirror the existing
364
+ // renderErr rollback (line ~261).
365
+ try {
366
+ deleteVerificationEvidence(params.milestoneId, params.sliceId, params.taskId);
367
+ updateTaskStatus(params.milestoneId, params.sliceId, params.taskId, 'pending');
368
+ invalidateStateCache();
369
+ logWarning(
370
+ "tool",
371
+ `complete-task rolled back DB completion for ${params.milestoneId}/${params.sliceId}/${params.taskId} after escalation write failure; SUMMARY.md left on disk for retry.`,
372
+ );
373
+ } catch (rollbackErr) {
374
+ logWarning(
375
+ "tool",
376
+ `complete-task rollback failed after escalation write failure for ${params.milestoneId}/${params.sliceId}/${params.taskId}: ${(rollbackErr as Error).message}`,
377
+ );
378
+ }
379
+ return { error: msg };
380
+ }
381
+ }
382
+ } else if (params.escalation && !escalationWriteEnabled) {
383
+ logWarning(
384
+ "tool",
385
+ `complete-task received escalation payload but phases.mid_execution_escalation is not enabled; ignoring (${params.milestoneId}/${params.sliceId}/${params.taskId})`,
386
+ );
387
+ }
388
+
302
389
  // Invalidate all caches
303
390
  invalidateStateCache();
304
391
  clearPathCache();
@@ -25,10 +25,18 @@ export interface PlanMilestoneSliceInput {
25
25
  depends: string[];
26
26
  demo: string;
27
27
  goal: string;
28
+ /** Required when isSketch is false/absent; may be empty for sketch slices (ADR-011). */
28
29
  successCriteria: string;
30
+ /** Required when isSketch is false/absent; may be empty for sketch slices (ADR-011). */
29
31
  proofLevel: string;
32
+ /** Required when isSketch is false/absent; may be empty for sketch slices (ADR-011). */
30
33
  integrationClosure: string;
34
+ /** Required when isSketch is false/absent; may be empty for sketch slices (ADR-011). */
31
35
  observabilityImpact: string;
36
+ /** ADR-011: when true, this slice is a sketch awaiting refine-slice expansion. */
37
+ isSketch?: boolean;
38
+ /** ADR-011: 2–3 sentence scope boundary, required when isSketch is true. */
39
+ sketchScope?: string;
32
40
  }
33
41
 
34
42
  export interface PlanMilestoneParams {
@@ -125,6 +133,16 @@ function validateSlices(value: unknown): PlanMilestoneSliceInput[] {
125
133
  const proofLevel = obj.proofLevel;
126
134
  const integrationClosure = obj.integrationClosure;
127
135
  const observabilityImpact = obj.observabilityImpact;
136
+ const isSketchRaw = obj.isSketch;
137
+ const sketchScopeRaw = obj.sketchScope;
138
+ // ADR-011: preserve the 3-valued semantics of isSketch (true / false / absent).
139
+ // Callers that omit isSketch must receive `undefined` here so `insertSlice`'s
140
+ // ON CONFLICT clause preserves any existing is_sketch on the row rather than
141
+ // silently overwriting a legitimate sketch to non-sketch.
142
+ const isSketch: boolean | undefined =
143
+ isSketchRaw === true ? true
144
+ : isSketchRaw === false ? false
145
+ : undefined;
128
146
 
129
147
  if (!isNonEmptyString(sliceId)) throw new Error(`slices[${index}].sliceId must be a non-empty string`);
130
148
  if (seen.has(sliceId)) throw new Error(`slices[${index}].sliceId must be unique`);
@@ -136,10 +154,18 @@ function validateSlices(value: unknown): PlanMilestoneSliceInput[] {
136
154
  }
137
155
  if (!isNonEmptyString(demo)) throw new Error(`slices[${index}].demo must be a non-empty string`);
138
156
  if (!isNonEmptyString(goal)) throw new Error(`slices[${index}].goal must be a non-empty string`);
139
- if (!isNonEmptyString(successCriteria)) throw new Error(`slices[${index}].successCriteria must be a non-empty string`);
140
- if (!isNonEmptyString(proofLevel)) throw new Error(`slices[${index}].proofLevel must be a non-empty string`);
141
- if (!isNonEmptyString(integrationClosure)) throw new Error(`slices[${index}].integrationClosure must be a non-empty string`);
142
- if (!isNonEmptyString(observabilityImpact)) throw new Error(`slices[${index}].observabilityImpact must be a non-empty string`);
157
+
158
+ // ADR-011: sketch slices may defer the heavyweight planning fields to refine-slice.
159
+ if (isSketch === true) {
160
+ if (!isNonEmptyString(sketchScopeRaw)) {
161
+ throw new Error(`slices[${index}].sketchScope must be a non-empty string when isSketch is true`);
162
+ }
163
+ } else {
164
+ if (!isNonEmptyString(successCriteria)) throw new Error(`slices[${index}].successCriteria must be a non-empty string`);
165
+ if (!isNonEmptyString(proofLevel)) throw new Error(`slices[${index}].proofLevel must be a non-empty string`);
166
+ if (!isNonEmptyString(integrationClosure)) throw new Error(`slices[${index}].integrationClosure must be a non-empty string`);
167
+ if (!isNonEmptyString(observabilityImpact)) throw new Error(`slices[${index}].observabilityImpact must be a non-empty string`);
168
+ }
143
169
 
144
170
  return {
145
171
  sliceId,
@@ -148,10 +174,14 @@ function validateSlices(value: unknown): PlanMilestoneSliceInput[] {
148
174
  depends,
149
175
  demo,
150
176
  goal,
151
- successCriteria,
152
- proofLevel,
153
- integrationClosure,
154
- observabilityImpact,
177
+ successCriteria: isNonEmptyString(successCriteria) ? successCriteria : "",
178
+ proofLevel: isNonEmptyString(proofLevel) ? proofLevel : "",
179
+ integrationClosure: isNonEmptyString(integrationClosure) ? integrationClosure : "",
180
+ observabilityImpact: isNonEmptyString(observabilityImpact) ? observabilityImpact : "",
181
+ isSketch,
182
+ // Only carry the sketch scope through if the caller explicitly provided it
183
+ // — preserves ON CONFLICT semantics for re-plans that omit the field.
184
+ sketchScope: sketchScopeRaw === undefined ? undefined : (isNonEmptyString(sketchScopeRaw) ? sketchScopeRaw : ""),
155
185
  };
156
186
  });
157
187
  }
@@ -274,6 +304,10 @@ export async function handlePlanMilestone(
274
304
  depends: slice.depends,
275
305
  demo: slice.demo,
276
306
  sequence: i + 1, // Preserve agent-ordered sequence (#3356)
307
+ // ADR-011: pass undefined through so ON CONFLICT preserves existing values
308
+ // when the caller omitted the fields on a re-plan.
309
+ isSketch: slice.isSketch,
310
+ sketchScope: slice.sketchScope,
277
311
  });
278
312
  upsertSlicePlanning(params.milestoneId, slice.sliceId, {
279
313
  goal: slice.goal,