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
@@ -61,6 +61,15 @@ function validateSlices(value) {
61
61
  const proofLevel = obj.proofLevel;
62
62
  const integrationClosure = obj.integrationClosure;
63
63
  const observabilityImpact = obj.observabilityImpact;
64
+ const isSketchRaw = obj.isSketch;
65
+ const sketchScopeRaw = obj.sketchScope;
66
+ // ADR-011: preserve the 3-valued semantics of isSketch (true / false / absent).
67
+ // Callers that omit isSketch must receive `undefined` here so `insertSlice`'s
68
+ // ON CONFLICT clause preserves any existing is_sketch on the row rather than
69
+ // silently overwriting a legitimate sketch to non-sketch.
70
+ const isSketch = isSketchRaw === true ? true
71
+ : isSketchRaw === false ? false
72
+ : undefined;
64
73
  if (!isNonEmptyString(sliceId))
65
74
  throw new Error(`slices[${index}].sliceId must be a non-empty string`);
66
75
  if (seen.has(sliceId))
@@ -77,14 +86,22 @@ function validateSlices(value) {
77
86
  throw new Error(`slices[${index}].demo must be a non-empty string`);
78
87
  if (!isNonEmptyString(goal))
79
88
  throw new Error(`slices[${index}].goal must be a non-empty string`);
80
- if (!isNonEmptyString(successCriteria))
81
- throw new Error(`slices[${index}].successCriteria must be a non-empty string`);
82
- if (!isNonEmptyString(proofLevel))
83
- throw new Error(`slices[${index}].proofLevel must be a non-empty string`);
84
- if (!isNonEmptyString(integrationClosure))
85
- throw new Error(`slices[${index}].integrationClosure must be a non-empty string`);
86
- if (!isNonEmptyString(observabilityImpact))
87
- throw new Error(`slices[${index}].observabilityImpact must be a non-empty string`);
89
+ // ADR-011: sketch slices may defer the heavyweight planning fields to refine-slice.
90
+ if (isSketch === true) {
91
+ if (!isNonEmptyString(sketchScopeRaw)) {
92
+ throw new Error(`slices[${index}].sketchScope must be a non-empty string when isSketch is true`);
93
+ }
94
+ }
95
+ else {
96
+ if (!isNonEmptyString(successCriteria))
97
+ throw new Error(`slices[${index}].successCriteria must be a non-empty string`);
98
+ if (!isNonEmptyString(proofLevel))
99
+ throw new Error(`slices[${index}].proofLevel must be a non-empty string`);
100
+ if (!isNonEmptyString(integrationClosure))
101
+ throw new Error(`slices[${index}].integrationClosure must be a non-empty string`);
102
+ if (!isNonEmptyString(observabilityImpact))
103
+ throw new Error(`slices[${index}].observabilityImpact must be a non-empty string`);
104
+ }
88
105
  return {
89
106
  sliceId,
90
107
  title,
@@ -92,10 +109,14 @@ function validateSlices(value) {
92
109
  depends,
93
110
  demo,
94
111
  goal,
95
- successCriteria,
96
- proofLevel,
97
- integrationClosure,
98
- observabilityImpact,
112
+ successCriteria: isNonEmptyString(successCriteria) ? successCriteria : "",
113
+ proofLevel: isNonEmptyString(proofLevel) ? proofLevel : "",
114
+ integrationClosure: isNonEmptyString(integrationClosure) ? integrationClosure : "",
115
+ observabilityImpact: isNonEmptyString(observabilityImpact) ? observabilityImpact : "",
116
+ isSketch,
117
+ // Only carry the sketch scope through if the caller explicitly provided it
118
+ // — preserves ON CONFLICT semantics for re-plans that omit the field.
119
+ sketchScope: sketchScopeRaw === undefined ? undefined : (isNonEmptyString(sketchScopeRaw) ? sketchScopeRaw : ""),
99
120
  };
100
121
  });
101
122
  }
@@ -209,6 +230,10 @@ export async function handlePlanMilestone(rawParams, basePath) {
209
230
  depends: slice.depends,
210
231
  demo: slice.demo,
211
232
  sequence: i + 1, // Preserve agent-ordered sequence (#3356)
233
+ // ADR-011: pass undefined through so ON CONFLICT preserves existing values
234
+ // when the caller omitted the fields on a re-plan.
235
+ isSketch: slice.isSketch,
236
+ sketchScope: slice.sketchScope,
212
237
  });
213
238
  upsertSlicePlanning(params.milestoneId, slice.sliceId, {
214
239
  goal: slice.goal,
@@ -1,7 +1,7 @@
1
1
  import { clearParseCache } from "../files.js";
2
- import { isClosedStatus } from "../status-guards.js";
2
+ import { isClosedStatus, isDeferredStatus } from "../status-guards.js";
3
3
  import { isNonEmptyString } from "../validation.js";
4
- import { transaction, getMilestone, getSlice, insertTask, upsertSlicePlanning, upsertTaskPlanning, insertGateRow, } from "../gsd-db.js";
4
+ import { transaction, getMilestone, getSlice, insertTask, upsertSlicePlanning, upsertTaskPlanning, insertGateRow, updateSliceStatus, } from "../gsd-db.js";
5
5
  import { invalidateStateCache } from "../state.js";
6
6
  import { renderPlanFromDb } from "../markdown-renderer.js";
7
7
  import { renderAllProjections } from "../workflow-projections.js";
@@ -114,6 +114,9 @@ export async function handlePlanSlice(rawParams, basePath) {
114
114
  guardError = `cannot re-plan slice ${params.sliceId}: it is already complete — use gsd_slice_reopen first`;
115
115
  return;
116
116
  }
117
+ if (isDeferredStatus(parentSlice.status)) {
118
+ updateSliceStatus(params.milestoneId, params.sliceId, "pending");
119
+ }
117
120
  upsertSlicePlanning(params.milestoneId, params.sliceId, {
118
121
  goal: params.goal,
119
122
  successCriteria: params.successCriteria,
@@ -13,14 +13,14 @@ export function resolveUokFlags(prefs) {
13
13
  return {
14
14
  enabled: enabledByPreference && !legacyFallback,
15
15
  legacyFallback,
16
- gates: uok?.gates?.enabled === true,
17
- modelPolicy: uok?.model_policy?.enabled === true,
18
- executionGraph: uok?.execution_graph?.enabled === true,
19
- gitops: uok?.gitops?.enabled === true,
20
- gitopsTurnAction: uok?.gitops?.turn_action ?? "status-only",
16
+ gates: uok?.gates?.enabled ?? true,
17
+ modelPolicy: uok?.model_policy?.enabled ?? true,
18
+ executionGraph: uok?.execution_graph?.enabled ?? true,
19
+ gitops: uok?.gitops?.enabled ?? true,
20
+ gitopsTurnAction: uok?.gitops?.turn_action ?? "commit",
21
21
  gitopsTurnPush: uok?.gitops?.turn_push === true,
22
- auditUnified: uok?.audit_unified?.enabled === true,
23
- planV2: uok?.plan_v2?.enabled === true,
22
+ auditUnified: uok?.audit_unified?.enabled ?? true,
23
+ planV2: uok?.plan_v2?.enabled ?? true,
24
24
  };
25
25
  }
26
26
  export function loadUokFlags() {
@@ -20,10 +20,10 @@ function writeParityEvent(basePath, event) {
20
20
  function resolveKernelPathLabel(flags) {
21
21
  if (flags.legacyFallback)
22
22
  return "legacy-fallback";
23
- return flags.enabled ? "uok-wrapper" : "legacy-wrapper";
23
+ return flags.enabled ? "uok-kernel" : "legacy-wrapper";
24
24
  }
25
25
  export async function runAutoLoopWithUok(args) {
26
- const { ctx, pi, s, deps, runLegacyLoop } = args;
26
+ const { ctx, pi, s, deps, runKernelLoop, runLegacyLoop } = args;
27
27
  const prefs = deps.loadEffectiveGSDPreferences()?.preferences;
28
28
  const flags = resolveUokFlags(prefs);
29
29
  setUnifiedAuditEnabled(flags.auditUnified);
@@ -57,7 +57,12 @@ export async function runAutoLoopWithUok(args) {
57
57
  }
58
58
  : deps;
59
59
  try {
60
- await runLegacyLoop(ctx, pi, s, decoratedDeps);
60
+ if (flags.enabled) {
61
+ await runKernelLoop(ctx, pi, s, decoratedDeps);
62
+ }
63
+ else {
64
+ await runLegacyLoop(ctx, pi, s, deps);
65
+ }
61
66
  writeParityEvent(s.basePath, {
62
67
  ts: new Date().toISOString(),
63
68
  path: resolveKernelPathLabel(flags),
@@ -7,6 +7,7 @@ import { existsSync, readFileSync } from "node:fs";
7
7
  import { join, basename } from "node:path";
8
8
  import { DEFAULT_COMMAND_TIMEOUT_MS } from "./constants.js";
9
9
  import { rewriteCommandWithRtk } from "../shared/rtk.js";
10
+ import { normalizePythonCommand } from "./python-resolver.js";
10
11
  /** Maximum bytes of stdout/stderr to retain per command (10 KB). */
11
12
  const MAX_OUTPUT_BYTES = 10 * 1024;
12
13
  /** Truncate a string to maxBytes, appending a marker if truncated. */
@@ -211,7 +212,7 @@ export function runVerificationGate(options) {
211
212
  const checks = [];
212
213
  for (const command of commands) {
213
214
  const start = Date.now();
214
- const rewrittenCommand = rewriteCommandWithRtk(command);
215
+ const rewrittenCommand = normalizePythonCommand(rewriteCommandWithRtk(command));
215
216
  // Pass the command string as an argument to the shell explicitly
216
217
  // to avoid Node.js DEP0190 (spawnSync with shell: true and no args).
217
218
  const shellBin = process.platform === "win32" ? "cmd" : "sh";
@@ -0,0 +1,64 @@
1
+ /**
2
+ * workflow-dispatch.ts — Shared dispatchers for workflow plugins.
3
+ *
4
+ * Called by both `/gsd start <template>` (existing markdown path) and
5
+ * `/gsd workflow <name>` (new direct dispatch). Keeps the prompt-build
6
+ * logic in one place so md template behavior stays consistent.
7
+ */
8
+ import { readFileSync } from "node:fs";
9
+ import { loadPrompt } from "./prompt-loader.js";
10
+ // ─── Oneshot dispatch ────────────────────────────────────────────────────
11
+ /**
12
+ * Strip the `<template_meta>` block from markdown content so it's not
13
+ * repeated in the prompt body.
14
+ */
15
+ function stripTemplateMeta(content) {
16
+ return content.replace(/<template_meta>[\s\S]*?<\/template_meta>\s*/, "");
17
+ }
18
+ /**
19
+ * For a oneshot YAML plugin, extract the single-step prompt.
20
+ * For multi-step YAML defined as oneshot, concatenate step prompts.
21
+ */
22
+ function extractYamlOneshotPrompt(yamlContent) {
23
+ // Simple: just include the raw YAML so the model can follow it.
24
+ // This keeps the oneshot format flexible without re-parsing.
25
+ return `\`\`\`yaml\n${yamlContent}\n\`\`\``;
26
+ }
27
+ /**
28
+ * Dispatch a oneshot workflow: load the prompt, inject the body, send.
29
+ * No STATE.json, no branch switch, no auto-loop.
30
+ */
31
+ export function dispatchOneshot(plugin, pi, userArgs) {
32
+ const raw = readFileSync(plugin.path, "utf-8");
33
+ const body = plugin.format === "yaml"
34
+ ? extractYamlOneshotPrompt(raw)
35
+ : stripTemplateMeta(raw);
36
+ const prompt = loadPrompt("workflow-oneshot", {
37
+ name: plugin.name,
38
+ displayName: plugin.meta.displayName,
39
+ body,
40
+ userArgs: userArgs || "(none)",
41
+ });
42
+ pi.sendMessage({ customType: "gsd-workflow-oneshot", content: prompt, display: false }, { triggerTurn: true });
43
+ }
44
+ /**
45
+ * Build and dispatch the `workflow-start.md` prompt for a markdown-phase plugin.
46
+ * Returns the prompt that was sent (useful for tests).
47
+ */
48
+ export function dispatchMarkdownPhase(opts, pi) {
49
+ const prompt = loadPrompt("workflow-start", {
50
+ templateId: opts.templateId,
51
+ templateName: opts.templateName,
52
+ templateDescription: opts.templateDescription,
53
+ phases: opts.phases.join(" → "),
54
+ complexity: opts.complexity,
55
+ artifactDir: opts.artifactDir || "(none)",
56
+ branch: opts.branch,
57
+ description: opts.description || "(none provided)",
58
+ issueRef: opts.issueRef || "(none)",
59
+ date: opts.date,
60
+ workflowContent: opts.workflowContent,
61
+ });
62
+ pi.sendMessage({ customType: "gsd-workflow-template", content: prompt, display: false }, { triggerTurn: true });
63
+ return prompt;
64
+ }
@@ -0,0 +1,327 @@
1
+ /**
2
+ * workflow-install.ts — Fetch, validate, and install remote workflow plugins.
3
+ *
4
+ * Accepts:
5
+ * - Full URL (https://raw.githubusercontent.com/... or gist raw URL)
6
+ * - gist:abc123 → https://gist.githubusercontent.com/anonymous/abc123/raw
7
+ * - gh:owner/repo/path[@ref] → raw.githubusercontent.com/owner/repo/<ref>/path
8
+ *
9
+ * Installed files land in `~/.gsd/workflows/<name>.<ext>` by default, or
10
+ * `.gsd/workflows/<name>.<ext>` with the `--project` flag.
11
+ *
12
+ * A provenance file `~/.gsd/workflows/.installed.json` (or project equivalent)
13
+ * records source URL, timestamp, and sha256 so `/gsd workflow uninstall` can
14
+ * clean up and future `/gsd workflow update` can refresh.
15
+ */
16
+ import { existsSync, mkdirSync, readFileSync, statSync, unlinkSync, writeFileSync, } from "node:fs";
17
+ import { homedir } from "node:os";
18
+ import { extname, join, resolve, sep as pathSep } from "node:path";
19
+ import { createHash } from "node:crypto";
20
+ import { parse as parseYaml } from "yaml";
21
+ import { validateDefinition } from "./definition-loader.js";
22
+ // ─── Constants ───────────────────────────────────────────────────────────
23
+ const MAX_RESPONSE_BYTES = 256 * 1024;
24
+ const FETCH_TIMEOUT_MS = 15_000;
25
+ const PROVENANCE_FILE = ".installed.json";
26
+ function provenancePath(dir) {
27
+ return join(dir, PROVENANCE_FILE);
28
+ }
29
+ function readProvenance(dir) {
30
+ const path = provenancePath(dir);
31
+ if (!existsSync(path))
32
+ return {};
33
+ try {
34
+ return JSON.parse(readFileSync(path, "utf-8"));
35
+ }
36
+ catch {
37
+ return {};
38
+ }
39
+ }
40
+ function writeProvenance(dir, data) {
41
+ mkdirSync(dir, { recursive: true });
42
+ writeFileSync(provenancePath(dir), JSON.stringify(data, null, 2) + "\n", "utf-8");
43
+ }
44
+ export function globalInstallDir() {
45
+ const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
46
+ return join(gsdHome, "workflows");
47
+ }
48
+ export function projectInstallDir(basePath) {
49
+ return join(basePath, ".gsd", "workflows");
50
+ }
51
+ /**
52
+ * Reject plugin names that could escape the workflows directory.
53
+ * Allows a-z, A-Z, 0-9, dot, underscore, hyphen — no separators, no dot-segments.
54
+ */
55
+ function assertSafePluginName(name) {
56
+ if (!name || name === "." || name === "..") {
57
+ throw new Error(`Invalid plugin name: "${name}"`);
58
+ }
59
+ if (!/^[a-zA-Z0-9._-]+$/.test(name)) {
60
+ throw new Error(`Invalid plugin name "${name}". Allowed characters: letters, digits, dot, underscore, hyphen.`);
61
+ }
62
+ }
63
+ /**
64
+ * Resolve `child` inside `dir` and refuse any result that escapes `dir`.
65
+ */
66
+ function safeResolveInDir(dir, child) {
67
+ const resolvedDir = resolve(dir);
68
+ const resolvedPath = resolve(resolvedDir, child);
69
+ if (resolvedPath !== resolvedDir &&
70
+ !resolvedPath.startsWith(resolvedDir + pathSep)) {
71
+ throw new Error(`Refusing to operate outside ${dir}: ${child}`);
72
+ }
73
+ return resolvedPath;
74
+ }
75
+ // ─── Source URL resolution ───────────────────────────────────────────────
76
+ /**
77
+ * Turn a user-supplied source specifier into a fetchable HTTPS URL.
78
+ * Throws on clearly unsafe inputs (file://, unsupported schemes).
79
+ */
80
+ export function resolveSourceUrl(source) {
81
+ const trimmed = source.trim();
82
+ // gist:<id>
83
+ if (trimmed.startsWith("gist:")) {
84
+ const id = trimmed.slice("gist:".length).trim();
85
+ if (!/^[a-f0-9]{6,}$/i.test(id)) {
86
+ throw new Error(`Invalid gist id: ${id}`);
87
+ }
88
+ return `https://gist.githubusercontent.com/anonymous/${id}/raw`;
89
+ }
90
+ // gh:owner/repo/path[@ref]
91
+ if (trimmed.startsWith("gh:")) {
92
+ const rest = trimmed.slice("gh:".length);
93
+ const atIdx = rest.lastIndexOf("@");
94
+ const pathPart = atIdx === -1 ? rest : rest.slice(0, atIdx);
95
+ const ref = atIdx === -1 ? "main" : rest.slice(atIdx + 1);
96
+ const parts = pathPart.split("/");
97
+ if (parts.length < 3) {
98
+ throw new Error(`Expected gh:<owner>/<repo>/<path>: ${trimmed}`);
99
+ }
100
+ const [owner, repo, ...filePath] = parts;
101
+ return `https://raw.githubusercontent.com/${owner}/${repo}/${ref}/${filePath.join("/")}`;
102
+ }
103
+ // file:// — reject
104
+ if (trimmed.startsWith("file:")) {
105
+ throw new Error("file:// sources are not supported for security reasons.");
106
+ }
107
+ // Must be https:// (or http://localhost for dev)
108
+ if (trimmed.startsWith("https://"))
109
+ return trimmed;
110
+ if (trimmed.startsWith("http://")) {
111
+ const url = new URL(trimmed);
112
+ if (url.hostname === "localhost" || url.hostname === "127.0.0.1") {
113
+ return trimmed;
114
+ }
115
+ throw new Error("http:// is only allowed for localhost. Use https://.");
116
+ }
117
+ throw new Error(`Unsupported source format: ${trimmed}\n` +
118
+ `Use one of: https://..., gist:<id>, gh:<owner>/<repo>/<path>[@ref]`);
119
+ }
120
+ /**
121
+ * Fetch the resolved URL with a timeout and a max response size.
122
+ * Injects a simple User-Agent so GitHub doesn't 403.
123
+ */
124
+ export async function fetchWorkflowSource(url) {
125
+ const controller = new AbortController();
126
+ const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
127
+ try {
128
+ const res = await fetch(url, {
129
+ signal: controller.signal,
130
+ headers: { "User-Agent": "gsd-workflow-install" },
131
+ });
132
+ if (!res.ok) {
133
+ throw new Error(`Fetch failed (${res.status} ${res.statusText}): ${url}`);
134
+ }
135
+ // Cap size: read as a stream and bail if it exceeds MAX_RESPONSE_BYTES.
136
+ const buf = await res.arrayBuffer();
137
+ if (buf.byteLength > MAX_RESPONSE_BYTES) {
138
+ throw new Error(`Response too large (${buf.byteLength} bytes, max ${MAX_RESPONSE_BYTES}): ${url}`);
139
+ }
140
+ const content = new TextDecoder().decode(buf);
141
+ // Prefer the final response URL after redirects (e.g., gist /raw → /raw/<sha>/file.ext).
142
+ const finalUrl = typeof res.url === "string" && res.url ? res.url : url;
143
+ let pathname;
144
+ try {
145
+ pathname = new URL(finalUrl).pathname;
146
+ }
147
+ catch {
148
+ pathname = new URL(url).pathname;
149
+ }
150
+ let basename = pathname.slice(pathname.lastIndexOf("/") + 1);
151
+ let rawExt = extname(basename).toLowerCase();
152
+ let ext;
153
+ if (rawExt === ".yaml" || rawExt === ".yml" || rawExt === ".md") {
154
+ ext = rawExt;
155
+ }
156
+ else {
157
+ // Fallback: sniff content. Gist /raw and similar URLs have no extension.
158
+ if (/<template_meta>[\s\S]*?<\/template_meta>/.test(content)) {
159
+ ext = ".md";
160
+ }
161
+ else {
162
+ let parsed;
163
+ try {
164
+ parsed = parseYaml(content);
165
+ }
166
+ catch {
167
+ parsed = undefined;
168
+ }
169
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
170
+ ext = ".yaml";
171
+ }
172
+ else {
173
+ throw new Error(`Cannot determine workflow type from ${url}. ` +
174
+ `Expected .yaml/.yml/.md URL, a markdown file with <template_meta>, ` +
175
+ `or a YAML document.`);
176
+ }
177
+ }
178
+ // Synthesize a filename so downstream sanitizers have something to chew on.
179
+ if (!basename)
180
+ basename = "workflow";
181
+ basename = `${basename}${ext}`;
182
+ }
183
+ const filename = basename;
184
+ const sha256 = createHash("sha256").update(content).digest("hex");
185
+ return { url, filename, ext, content, sha256 };
186
+ }
187
+ finally {
188
+ clearTimeout(timer);
189
+ }
190
+ }
191
+ // ─── Validation ──────────────────────────────────────────────────────────
192
+ /**
193
+ * Validate fetched content: YAML must pass validateDefinition, markdown must
194
+ * have a `<template_meta>` block with at least `name`.
195
+ */
196
+ export function validateFetchedContent(fetched) {
197
+ if (fetched.ext === ".yaml" || fetched.ext === ".yml") {
198
+ let parsed;
199
+ try {
200
+ parsed = parseYaml(fetched.content);
201
+ }
202
+ catch (err) {
203
+ throw new Error(`Installed YAML failed to parse: ${err instanceof Error ? err.message : String(err)}`);
204
+ }
205
+ const result = validateDefinition(parsed);
206
+ if (!result.valid) {
207
+ throw new Error(`Installed YAML failed validation:\n - ${result.errors.join("\n - ")}`);
208
+ }
209
+ // Optional: validate `mode:` if present.
210
+ if (parsed && typeof parsed === "object") {
211
+ const mode = parsed.mode;
212
+ if (mode !== undefined && mode !== "oneshot" && mode !== "yaml-step") {
213
+ throw new Error(`YAML plugins must declare mode: oneshot or yaml-step (got "${String(mode)}")`);
214
+ }
215
+ }
216
+ return;
217
+ }
218
+ // Markdown: require a <template_meta> block with at least a name.
219
+ const metaMatch = fetched.content.match(/<template_meta>([\s\S]*?)<\/template_meta>/);
220
+ if (!metaMatch) {
221
+ throw new Error("Installed markdown must contain a <template_meta>…</template_meta> block.");
222
+ }
223
+ if (!/\bname\s*:/i.test(metaMatch[1])) {
224
+ throw new Error("Installed markdown <template_meta> must declare at least `name:`.");
225
+ }
226
+ // Optional: validate `mode:` if declared.
227
+ const modeLine = metaMatch[1].match(/\bmode\s*:\s*(\S+)/i);
228
+ if (modeLine) {
229
+ const mode = modeLine[1];
230
+ if (mode !== "oneshot" && mode !== "markdown-phase") {
231
+ throw new Error(`Markdown plugins must declare mode: oneshot or markdown-phase (got "${mode}")`);
232
+ }
233
+ }
234
+ }
235
+ // ─── Name inference ──────────────────────────────────────────────────────
236
+ /**
237
+ * Infer a plugin name from fetched content. For YAML, prefer the top-level
238
+ * `name:` field. For markdown, prefer `<template_meta>.name`. Fall back to
239
+ * the filename stem.
240
+ */
241
+ export function inferPluginName(fetched) {
242
+ if (fetched.ext === ".yaml" || fetched.ext === ".yml") {
243
+ try {
244
+ const parsed = parseYaml(fetched.content);
245
+ if (parsed && typeof parsed === "object") {
246
+ const n = parsed.name;
247
+ if (typeof n === "string" && n.trim())
248
+ return sanitizeName(n);
249
+ }
250
+ }
251
+ catch {
252
+ // Fall through to filename.
253
+ }
254
+ }
255
+ else {
256
+ const metaMatch = fetched.content.match(/<template_meta>([\s\S]*?)<\/template_meta>/);
257
+ if (metaMatch) {
258
+ const nameMatch = metaMatch[1].match(/\bname\s*:\s*(\S+)/i);
259
+ if (nameMatch)
260
+ return sanitizeName(nameMatch[1]);
261
+ }
262
+ }
263
+ const stem = fetched.filename.replace(/\.[^.]+$/, "");
264
+ return sanitizeName(stem);
265
+ }
266
+ function sanitizeName(raw) {
267
+ return raw.trim().toLowerCase().replace(/[^a-z0-9._-]/g, "-").replace(/^-+|-+$/g, "");
268
+ }
269
+ /**
270
+ * Write the fetched plugin to disk and update the provenance file.
271
+ * Does NOT prompt — caller is responsible for confirming with the user first.
272
+ */
273
+ export function installPlugin(target, fetched, name) {
274
+ assertSafePluginName(name);
275
+ mkdirSync(target.dir, { recursive: true });
276
+ const filename = `${name}${fetched.ext}`;
277
+ const path = safeResolveInDir(target.dir, filename);
278
+ writeFileSync(path, fetched.content, "utf-8");
279
+ const prov = readProvenance(target.dir);
280
+ prov[name] = {
281
+ source: fetched.url,
282
+ installedAt: new Date().toISOString(),
283
+ sha256: fetched.sha256,
284
+ filename,
285
+ };
286
+ writeProvenance(target.dir, prov);
287
+ return { path, name, ext: fetched.ext, source: fetched.url };
288
+ }
289
+ /**
290
+ * Remove an installed plugin and its provenance record.
291
+ * Checks global dir first, then project (same order as install default).
292
+ */
293
+ export function uninstallPlugin(basePath, name) {
294
+ assertSafePluginName(name);
295
+ for (const dir of [globalInstallDir(), projectInstallDir(basePath)]) {
296
+ const prov = readProvenance(dir);
297
+ const entry = prov[name];
298
+ if (entry) {
299
+ // Re-validate the filename recorded in provenance: a malicious provenance
300
+ // file must not trick us into deleting outside `dir`.
301
+ assertSafePluginName(entry.filename.replace(/\.(yaml|yml|md)$/i, ""));
302
+ const path = safeResolveInDir(dir, entry.filename);
303
+ if (existsSync(path))
304
+ unlinkSync(path);
305
+ delete prov[name];
306
+ writeProvenance(dir, prov);
307
+ return { removed: true, path };
308
+ }
309
+ // No provenance, but file might still exist.
310
+ for (const ext of [".yaml", ".yml", ".md"]) {
311
+ const candidate = safeResolveInDir(dir, `${name}${ext}`);
312
+ if (existsSync(candidate) && statSync(candidate).isFile()) {
313
+ unlinkSync(candidate);
314
+ return { removed: true, path: candidate, warnedNotInProvenance: true };
315
+ }
316
+ }
317
+ }
318
+ return { removed: false };
319
+ }
320
+ // ─── Preview helpers ─────────────────────────────────────────────────────
321
+ /**
322
+ * First N lines of the fetched content, for the install confirmation UI.
323
+ */
324
+ export function previewContent(content, maxLines = 20) {
325
+ const lines = content.split(/\r?\n/).slice(0, maxLines);
326
+ return lines.join("\n");
327
+ }
@@ -82,6 +82,8 @@ export function snapshotState() {
82
82
  observability_impact: r["observability_impact"] ?? "",
83
83
  sequence: toNumeric(r["sequence"], 0),
84
84
  replan_triggered_at: r["replan_triggered_at"] ?? null,
85
+ is_sketch: toNumeric(r["is_sketch"], 0),
86
+ sketch_scope: r["sketch_scope"] ?? "",
85
87
  }));
86
88
  const rawTasks = db.prepare("SELECT * FROM tasks ORDER BY milestone_id, slice_id, sequence, id").all();
87
89
  const tasks = rawTasks.map((r) => ({
@@ -110,6 +112,11 @@ export function snapshotState() {
110
112
  observability_impact: r["observability_impact"] ?? "",
111
113
  full_plan_md: r["full_plan_md"] ?? "",
112
114
  sequence: toNumeric(r["sequence"], 0),
115
+ blocker_source: r["blocker_source"] ?? "",
116
+ escalation_pending: toNumeric(r["escalation_pending"], 0),
117
+ escalation_awaiting_review: toNumeric(r["escalation_awaiting_review"], 0),
118
+ escalation_artifact_path: r["escalation_artifact_path"] ?? null,
119
+ escalation_override_applied_at: r["escalation_override_applied_at"] ?? null,
113
120
  }));
114
121
  const rawDecisions = db.prepare("SELECT * FROM decisions ORDER BY seq").all();
115
122
  const decisions = rawDecisions.map((r) => ({
@@ -122,6 +129,7 @@ export function snapshotState() {
122
129
  rationale: r["rationale"] ?? "",
123
130
  revisable: r["revisable"] ?? "",
124
131
  made_by: r["made_by"] ?? "agent",
132
+ source: r["source"] ?? "discussion",
125
133
  superseded_by: r["superseded_by"] ?? null,
126
134
  }));
127
135
  const rawEvidence = db.prepare("SELECT * FROM verification_evidence ORDER BY id").all();
@@ -12,6 +12,7 @@ const MCP_WORKFLOW_TOOL_SURFACE = new Set([
12
12
  "gsd_journal_query",
13
13
  "gsd_milestone_complete",
14
14
  "gsd_milestone_generate_id",
15
+ "gsd_checkpoint_db",
15
16
  "gsd_milestone_status",
16
17
  "gsd_milestone_validate",
17
18
  "gsd_plan_task",
@@ -290,12 +291,6 @@ export function usesWorkflowMcpTransport(authMode, baseUrl) {
290
291
  export function supportsStructuredQuestions(activeTools, options = {}) {
291
292
  if (!activeTools.includes("ask_user_questions"))
292
293
  return false;
293
- // Workflow MCP currently exposes ask_user_questions via MCP form elicitation.
294
- // Local external CLI transports such as Claude Code can invoke the tool, but
295
- // do not reliably complete that elicitation round-trip yet, so guided discuss
296
- // prompts must fall back to plain-text questioning.
297
- if (usesWorkflowMcpTransport(options.authMode, options.baseUrl))
298
- return false;
299
294
  return true;
300
295
  }
301
296
  export function getWorkflowTransportSupportError(provider, requiredTools, options = {}) {