gsd-pi 2.74.0-dev.2b524c3 → 2.74.0-dev.658744a

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 (506) hide show
  1. package/dist/cli.js +85 -0
  2. package/dist/headless-query.js +4 -1
  3. package/dist/help-text.js +23 -0
  4. package/dist/resources/extensions/gsd/activity-log.js +16 -0
  5. package/dist/resources/extensions/gsd/auto/detect-stuck.js +11 -4
  6. package/dist/resources/extensions/gsd/auto/loop.js +147 -10
  7. package/dist/resources/extensions/gsd/auto/phases.js +209 -10
  8. package/dist/resources/extensions/gsd/auto/session.js +10 -0
  9. package/dist/resources/extensions/gsd/auto-dispatch.js +11 -1
  10. package/dist/resources/extensions/gsd/auto-model-selection.js +54 -8
  11. package/dist/resources/extensions/gsd/auto-post-unit.js +220 -17
  12. package/dist/resources/extensions/gsd/auto-prompts.js +12 -0
  13. package/dist/resources/extensions/gsd/auto-recovery.js +24 -10
  14. package/dist/resources/extensions/gsd/auto-unit-closeout.js +18 -0
  15. package/dist/resources/extensions/gsd/auto-verification.js +100 -2
  16. package/dist/resources/extensions/gsd/auto-worktree.js +2 -0
  17. package/dist/resources/extensions/gsd/auto.js +36 -4
  18. package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +5 -3
  19. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +30 -8
  20. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +61 -9
  21. package/dist/resources/extensions/gsd/cache.js +16 -5
  22. package/dist/resources/extensions/gsd/commands/catalog.js +31 -1
  23. package/dist/resources/extensions/gsd/commands/handlers/core.js +5 -1
  24. package/dist/resources/extensions/gsd/commands/handlers/ops.js +25 -0
  25. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +68 -9
  26. package/dist/resources/extensions/gsd/commands-add-tests.js +111 -0
  27. package/dist/resources/extensions/gsd/commands-backlog.js +140 -0
  28. package/dist/resources/extensions/gsd/commands-do.js +79 -0
  29. package/dist/resources/extensions/gsd/commands-extract-learnings.js +225 -0
  30. package/dist/resources/extensions/gsd/commands-maintenance.js +6 -6
  31. package/dist/resources/extensions/gsd/commands-pr-branch.js +180 -0
  32. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +51 -4
  33. package/dist/resources/extensions/gsd/commands-session-report.js +82 -0
  34. package/dist/resources/extensions/gsd/commands-ship.js +187 -0
  35. package/dist/resources/extensions/gsd/db-writer.js +3 -5
  36. package/dist/resources/extensions/gsd/docs/preferences-reference.md +16 -1
  37. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +144 -0
  38. package/dist/resources/extensions/gsd/ecosystem/loader.js +145 -0
  39. package/dist/resources/extensions/gsd/git-service.js +49 -1
  40. package/dist/resources/extensions/gsd/graph-context.js +157 -0
  41. package/dist/resources/extensions/gsd/gsd-db.js +581 -2
  42. package/dist/resources/extensions/gsd/guided-flow.js +31 -6
  43. package/dist/resources/extensions/gsd/index.js +15 -2
  44. package/dist/resources/extensions/gsd/init-wizard.js +1 -0
  45. package/dist/resources/extensions/gsd/journal.js +27 -0
  46. package/dist/resources/extensions/gsd/md-importer.js +3 -4
  47. package/dist/resources/extensions/gsd/memory-store.js +19 -51
  48. package/dist/resources/extensions/gsd/metrics.js +19 -0
  49. package/dist/resources/extensions/gsd/milestone-validation-gates.js +13 -12
  50. package/dist/resources/extensions/gsd/native-git-bridge.js +7 -4
  51. package/dist/resources/extensions/gsd/parallel-orchestrator.js +33 -1
  52. package/dist/resources/extensions/gsd/preferences-models.js +20 -3
  53. package/dist/resources/extensions/gsd/preferences-types.js +2 -0
  54. package/dist/resources/extensions/gsd/preferences-validation.js +118 -2
  55. package/dist/resources/extensions/gsd/preferences.js +31 -0
  56. package/dist/resources/extensions/gsd/prompts/add-tests.md +35 -0
  57. package/dist/resources/extensions/gsd/safety/evidence-collector.js +15 -30
  58. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +12 -2
  59. package/dist/resources/extensions/gsd/state.js +5 -1
  60. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +19 -0
  61. package/dist/resources/extensions/gsd/tools/complete-slice.js +20 -0
  62. package/dist/resources/extensions/gsd/tools/validate-milestone.js +39 -4
  63. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +3 -14
  64. package/dist/resources/extensions/gsd/triage-resolution.js +2 -5
  65. package/dist/resources/extensions/gsd/unit-ownership.js +1 -1
  66. package/dist/resources/extensions/gsd/uok/audit-toggle.js +7 -0
  67. package/dist/resources/extensions/gsd/uok/audit.js +40 -0
  68. package/dist/resources/extensions/gsd/uok/contracts.js +1 -0
  69. package/dist/resources/extensions/gsd/uok/execution-graph.js +179 -0
  70. package/dist/resources/extensions/gsd/uok/flags.js +29 -0
  71. package/dist/resources/extensions/gsd/uok/gate-runner.js +109 -0
  72. package/dist/resources/extensions/gsd/uok/gitops.js +53 -0
  73. package/dist/resources/extensions/gsd/uok/kernel.js +80 -0
  74. package/dist/resources/extensions/gsd/uok/loop-adapter.js +133 -0
  75. package/dist/resources/extensions/gsd/uok/model-policy.js +66 -0
  76. package/dist/resources/extensions/gsd/uok/plan-v2.js +132 -0
  77. package/dist/resources/extensions/gsd/workflow-logger.js +22 -0
  78. package/dist/resources/extensions/gsd/workflow-manifest.js +8 -69
  79. package/dist/resources/extensions/gsd/workflow-migration.js +21 -22
  80. package/dist/resources/extensions/gsd/workflow-projections.js +4 -1
  81. package/dist/resources/extensions/gsd/workflow-reconcile.js +14 -11
  82. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  83. package/dist/tsconfig.extensions.tsbuildinfo +1 -0
  84. package/dist/web/standalone/.next/BUILD_ID +1 -1
  85. package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
  86. package/dist/web/standalone/.next/build-manifest.json +2 -2
  87. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  88. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  89. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  91. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  97. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  100. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  104. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
  109. package/dist/web/standalone/.next/server/app/index.html +1 -1
  110. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  117. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  118. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  120. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  121. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  122. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  123. package/package.json +3 -2
  124. package/packages/daemon/package.json +2 -2
  125. package/packages/mcp-server/dist/index.d.ts +3 -0
  126. package/packages/mcp-server/dist/index.d.ts.map +1 -1
  127. package/packages/mcp-server/dist/index.js +3 -0
  128. package/packages/mcp-server/dist/index.js.map +1 -1
  129. package/packages/mcp-server/dist/readers/graph.d.ts +87 -0
  130. package/packages/mcp-server/dist/readers/graph.d.ts.map +1 -0
  131. package/packages/mcp-server/dist/readers/graph.js +655 -0
  132. package/packages/mcp-server/dist/readers/graph.js.map +1 -0
  133. package/packages/mcp-server/dist/readers/index.d.ts +2 -0
  134. package/packages/mcp-server/dist/readers/index.d.ts.map +1 -1
  135. package/packages/mcp-server/dist/readers/index.js +1 -0
  136. package/packages/mcp-server/dist/readers/index.js.map +1 -1
  137. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  138. package/packages/mcp-server/dist/server.js +65 -0
  139. package/packages/mcp-server/dist/server.js.map +1 -1
  140. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  141. package/packages/mcp-server/dist/workflow-tools.js +88 -6
  142. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  143. package/packages/mcp-server/package.json +2 -2
  144. package/packages/mcp-server/src/index.ts +15 -0
  145. package/packages/mcp-server/src/readers/graph.test.ts +604 -0
  146. package/packages/mcp-server/src/readers/graph.ts +855 -0
  147. package/packages/mcp-server/src/readers/index.ts +12 -0
  148. package/packages/mcp-server/src/server.ts +83 -0
  149. package/packages/mcp-server/src/workflow-tools.ts +95 -10
  150. package/packages/mcp-server/tsconfig.json +1 -0
  151. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -0
  152. package/packages/native/package.json +2 -2
  153. package/packages/native/tsconfig.tsbuildinfo +1 -0
  154. package/packages/pi-agent-core/package.json +1 -1
  155. package/packages/pi-agent-core/tsconfig.json +1 -0
  156. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -0
  157. package/packages/pi-ai/dist/index.d.ts +1 -9
  158. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  159. package/packages/pi-ai/dist/index.js +1 -9
  160. package/packages/pi-ai/dist/index.js.map +1 -1
  161. package/packages/pi-ai/dist/models/capability-patches.d.ts +19 -0
  162. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -0
  163. package/packages/pi-ai/dist/models/capability-patches.js +36 -0
  164. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -0
  165. package/packages/pi-ai/dist/{models.custom.d.ts → models/custom.d.ts} +1 -1
  166. package/packages/pi-ai/dist/models/custom.d.ts.map +1 -0
  167. package/packages/pi-ai/dist/{models.custom.js → models/custom.js} +4 -4
  168. package/packages/pi-ai/dist/models/custom.js.map +1 -0
  169. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +1482 -0
  170. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -0
  171. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +1484 -0
  172. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -0
  173. package/packages/pi-ai/dist/models/generated/anthropic.d.ts +377 -0
  174. package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -0
  175. package/packages/pi-ai/dist/models/generated/anthropic.js +379 -0
  176. package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -0
  177. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts +700 -0
  178. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts.map +1 -0
  179. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js +702 -0
  180. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js.map +1 -0
  181. package/packages/pi-ai/dist/models/generated/cerebras.d.ts +71 -0
  182. package/packages/pi-ai/dist/models/generated/cerebras.d.ts.map +1 -0
  183. package/packages/pi-ai/dist/models/generated/cerebras.js +73 -0
  184. package/packages/pi-ai/dist/models/generated/cerebras.js.map +1 -0
  185. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts +590 -0
  186. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts.map +1 -0
  187. package/packages/pi-ai/dist/models/generated/github-copilot.js +444 -0
  188. package/packages/pi-ai/dist/models/generated/github-copilot.js.map +1 -0
  189. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +156 -0
  190. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -0
  191. package/packages/pi-ai/dist/models/generated/google-antigravity.js +158 -0
  192. package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -0
  193. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts +105 -0
  194. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts.map +1 -0
  195. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js +107 -0
  196. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js.map +1 -0
  197. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts +207 -0
  198. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts.map +1 -0
  199. package/packages/pi-ai/dist/models/generated/google-vertex.js +209 -0
  200. package/packages/pi-ai/dist/models/generated/google-vertex.js.map +1 -0
  201. package/packages/pi-ai/dist/models/generated/google.d.ts +462 -0
  202. package/packages/pi-ai/dist/models/generated/google.d.ts.map +1 -0
  203. package/packages/pi-ai/dist/models/generated/google.js +464 -0
  204. package/packages/pi-ai/dist/models/generated/google.js.map +1 -0
  205. package/packages/pi-ai/dist/models/generated/groq.d.ts +309 -0
  206. package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -0
  207. package/packages/pi-ai/dist/models/generated/groq.js +311 -0
  208. package/packages/pi-ai/dist/models/generated/groq.js.map +1 -0
  209. package/packages/pi-ai/dist/models/generated/huggingface.d.ts +383 -0
  210. package/packages/pi-ai/dist/models/generated/huggingface.d.ts.map +1 -0
  211. package/packages/pi-ai/dist/models/generated/huggingface.js +347 -0
  212. package/packages/pi-ai/dist/models/generated/huggingface.js.map +1 -0
  213. package/packages/pi-ai/dist/{models.generated.d.ts → models/generated/index.d.ts} +1 -1
  214. package/packages/pi-ai/dist/{models.generated.d.ts.map → models/generated/index.d.ts.map} +1 -1
  215. package/packages/pi-ai/dist/models/generated/index.js +51 -0
  216. package/packages/pi-ai/dist/models/generated/index.js.map +1 -0
  217. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts +37 -0
  218. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts.map +1 -0
  219. package/packages/pi-ai/dist/models/generated/kimi-coding.js +39 -0
  220. package/packages/pi-ai/dist/models/generated/kimi-coding.js.map +1 -0
  221. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts +105 -0
  222. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts.map +1 -0
  223. package/packages/pi-ai/dist/models/generated/minimax-cn.js +107 -0
  224. package/packages/pi-ai/dist/models/generated/minimax-cn.js.map +1 -0
  225. package/packages/pi-ai/dist/models/generated/minimax.d.ts +105 -0
  226. package/packages/pi-ai/dist/models/generated/minimax.d.ts.map +1 -0
  227. package/packages/pi-ai/dist/models/generated/minimax.js +107 -0
  228. package/packages/pi-ai/dist/models/generated/minimax.js.map +1 -0
  229. package/packages/pi-ai/dist/models/generated/mistral.d.ts +445 -0
  230. package/packages/pi-ai/dist/models/generated/mistral.d.ts.map +1 -0
  231. package/packages/pi-ai/dist/models/generated/mistral.js +447 -0
  232. package/packages/pi-ai/dist/models/generated/mistral.js.map +1 -0
  233. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +139 -0
  234. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -0
  235. package/packages/pi-ai/dist/models/generated/openai-codex.js +141 -0
  236. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -0
  237. package/packages/pi-ai/dist/models/generated/openai.d.ts +700 -0
  238. package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -0
  239. package/packages/pi-ai/dist/models/generated/openai.js +702 -0
  240. package/packages/pi-ai/dist/models/generated/openai.js.map +1 -0
  241. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts +122 -0
  242. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts.map +1 -0
  243. package/packages/pi-ai/dist/models/generated/opencode-go.js +124 -0
  244. package/packages/pi-ai/dist/models/generated/opencode-go.js.map +1 -0
  245. package/packages/pi-ai/dist/models/generated/opencode.d.ts +530 -0
  246. package/packages/pi-ai/dist/models/generated/opencode.d.ts.map +1 -0
  247. package/packages/pi-ai/dist/models/generated/opencode.js +532 -0
  248. package/packages/pi-ai/dist/models/generated/opencode.js.map +1 -0
  249. package/packages/pi-ai/dist/models/generated/openrouter.d.ts +4270 -0
  250. package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -0
  251. package/packages/pi-ai/dist/models/generated/openrouter.js +4272 -0
  252. package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -0
  253. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts +2604 -0
  254. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts.map +1 -0
  255. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js +2606 -0
  256. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js.map +1 -0
  257. package/packages/pi-ai/dist/models/generated/xai.d.ts +411 -0
  258. package/packages/pi-ai/dist/models/generated/xai.d.ts.map +1 -0
  259. package/packages/pi-ai/dist/models/generated/xai.js +413 -0
  260. package/packages/pi-ai/dist/models/generated/xai.js.map +1 -0
  261. package/packages/pi-ai/dist/models/generated/zai.d.ts +276 -0
  262. package/packages/pi-ai/dist/models/generated/zai.d.ts.map +1 -0
  263. package/packages/pi-ai/dist/models/generated/zai.js +239 -0
  264. package/packages/pi-ai/dist/models/generated/zai.js.map +1 -0
  265. package/packages/pi-ai/dist/models/index.d.ts +27 -0
  266. package/packages/pi-ai/dist/models/index.d.ts.map +1 -0
  267. package/packages/pi-ai/dist/models/index.js +80 -0
  268. package/packages/pi-ai/dist/models/index.js.map +1 -0
  269. package/packages/pi-ai/dist/models.d.ts +1 -36
  270. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  271. package/packages/pi-ai/dist/models.generated.test.js +1 -2
  272. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  273. package/packages/pi-ai/dist/models.js +3 -112
  274. package/packages/pi-ai/dist/models.js.map +1 -1
  275. package/packages/pi-ai/dist/models.test.js +6 -5
  276. package/packages/pi-ai/dist/models.test.js.map +1 -1
  277. package/packages/pi-ai/package.json +1 -1
  278. package/packages/pi-ai/scripts/generate-models.ts +74 -40
  279. package/packages/pi-ai/src/index.ts +1 -9
  280. package/packages/pi-ai/src/models/capability-patches.ts +40 -0
  281. package/packages/pi-ai/src/{models.custom.ts → models/custom.ts} +4 -4
  282. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +1486 -0
  283. package/packages/pi-ai/src/models/generated/anthropic.ts +381 -0
  284. package/packages/pi-ai/src/models/generated/azure-openai-responses.ts +704 -0
  285. package/packages/pi-ai/src/models/generated/cerebras.ts +75 -0
  286. package/packages/pi-ai/src/models/generated/github-copilot.ts +446 -0
  287. package/packages/pi-ai/src/models/generated/google-antigravity.ts +160 -0
  288. package/packages/pi-ai/src/models/generated/google-gemini-cli.ts +109 -0
  289. package/packages/pi-ai/src/models/generated/google-vertex.ts +211 -0
  290. package/packages/pi-ai/src/models/generated/google.ts +466 -0
  291. package/packages/pi-ai/src/models/generated/groq.ts +313 -0
  292. package/packages/pi-ai/src/models/generated/huggingface.ts +349 -0
  293. package/packages/pi-ai/src/models/generated/index.ts +52 -0
  294. package/packages/pi-ai/src/models/generated/kimi-coding.ts +41 -0
  295. package/packages/pi-ai/src/models/generated/minimax-cn.ts +109 -0
  296. package/packages/pi-ai/src/models/generated/minimax.ts +109 -0
  297. package/packages/pi-ai/src/models/generated/mistral.ts +449 -0
  298. package/packages/pi-ai/src/models/generated/openai-codex.ts +143 -0
  299. package/packages/pi-ai/src/models/generated/openai.ts +704 -0
  300. package/packages/pi-ai/src/models/generated/opencode-go.ts +126 -0
  301. package/packages/pi-ai/src/models/generated/opencode.ts +534 -0
  302. package/packages/pi-ai/src/models/generated/openrouter.ts +4274 -0
  303. package/packages/pi-ai/src/models/generated/vercel-ai-gateway.ts +2608 -0
  304. package/packages/pi-ai/src/models/generated/xai.ts +415 -0
  305. package/packages/pi-ai/src/models/generated/zai.ts +241 -0
  306. package/packages/pi-ai/src/models/index.ts +106 -0
  307. package/packages/pi-ai/src/models.generated.test.ts +1 -2
  308. package/packages/pi-ai/src/models.test.ts +6 -5
  309. package/packages/pi-ai/src/models.ts +3 -153
  310. package/packages/pi-ai/tsconfig.json +1 -0
  311. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -0
  312. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  313. package/packages/pi-coding-agent/dist/core/agent-session.js +8 -2
  314. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  315. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +472 -0
  316. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  317. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts +2 -0
  318. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts.map +1 -0
  319. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js +52 -0
  320. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js.map +1 -0
  321. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  322. package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
  323. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +11 -0
  325. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  326. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +1 -0
  327. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  328. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +23 -9
  329. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  330. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts +11 -0
  331. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -0
  332. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +47 -0
  333. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -0
  334. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +8 -0
  335. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +68 -8
  337. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  339. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +22 -22
  340. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  341. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  342. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +232 -18
  343. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  344. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts +2 -0
  345. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts.map +1 -0
  346. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +38 -0
  347. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -0
  348. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +14 -0
  349. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  350. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +70 -6
  351. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  352. package/packages/pi-coding-agent/src/core/agent-session.ts +12 -6
  353. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +612 -0
  354. package/packages/pi-coding-agent/src/core/model-registry-env-fallback.test.ts +59 -0
  355. package/packages/pi-coding-agent/src/core/model-registry.ts +2 -1
  356. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +19 -0
  357. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +25 -10
  358. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +67 -0
  359. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +83 -7
  360. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +23 -26
  361. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +298 -41
  362. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +44 -0
  363. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +92 -6
  364. package/packages/pi-coding-agent/src/types/ambient-modules.d.ts +69 -0
  365. package/packages/pi-coding-agent/tsconfig.json +3 -2
  366. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -0
  367. package/packages/pi-tui/package.json +1 -1
  368. package/packages/pi-tui/tsconfig.json +1 -0
  369. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -0
  370. package/packages/rpc-client/package.json +1 -1
  371. package/packages/rpc-client/tsconfig.json +1 -0
  372. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -0
  373. package/src/resources/extensions/gsd/activity-log.ts +21 -0
  374. package/src/resources/extensions/gsd/auto/detect-stuck.ts +12 -4
  375. package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -0
  376. package/src/resources/extensions/gsd/auto/loop.ts +159 -10
  377. package/src/resources/extensions/gsd/auto/phases.ts +261 -10
  378. package/src/resources/extensions/gsd/auto/session.ts +10 -0
  379. package/src/resources/extensions/gsd/auto-dispatch.ts +16 -6
  380. package/src/resources/extensions/gsd/auto-model-selection.ts +69 -8
  381. package/src/resources/extensions/gsd/auto-post-unit.ts +238 -18
  382. package/src/resources/extensions/gsd/auto-prompts.ts +13 -0
  383. package/src/resources/extensions/gsd/auto-recovery.ts +29 -9
  384. package/src/resources/extensions/gsd/auto-unit-closeout.ts +25 -1
  385. package/src/resources/extensions/gsd/auto-verification.ts +129 -2
  386. package/src/resources/extensions/gsd/auto-worktree.ts +1 -0
  387. package/src/resources/extensions/gsd/auto.ts +41 -2
  388. package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +5 -3
  389. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +38 -8
  390. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +72 -8
  391. package/src/resources/extensions/gsd/cache.ts +16 -5
  392. package/src/resources/extensions/gsd/commands/catalog.ts +31 -1
  393. package/src/resources/extensions/gsd/commands/handlers/core.ts +5 -1
  394. package/src/resources/extensions/gsd/commands/handlers/ops.ts +25 -0
  395. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +74 -9
  396. package/src/resources/extensions/gsd/commands-add-tests.ts +137 -0
  397. package/src/resources/extensions/gsd/commands-backlog.ts +182 -0
  398. package/src/resources/extensions/gsd/commands-do.ts +109 -0
  399. package/src/resources/extensions/gsd/commands-extract-learnings.ts +304 -0
  400. package/src/resources/extensions/gsd/commands-maintenance.ts +6 -6
  401. package/src/resources/extensions/gsd/commands-pr-branch.ts +234 -0
  402. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +58 -4
  403. package/src/resources/extensions/gsd/commands-session-report.ts +101 -0
  404. package/src/resources/extensions/gsd/commands-ship.ts +219 -0
  405. package/src/resources/extensions/gsd/db-writer.ts +3 -5
  406. package/src/resources/extensions/gsd/docs/preferences-reference.md +16 -1
  407. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +228 -0
  408. package/src/resources/extensions/gsd/ecosystem/loader.ts +201 -0
  409. package/src/resources/extensions/gsd/git-service.ts +68 -0
  410. package/src/resources/extensions/gsd/graph-context.ts +212 -0
  411. package/src/resources/extensions/gsd/gsd-db.ts +788 -3
  412. package/src/resources/extensions/gsd/guided-flow.ts +36 -2
  413. package/src/resources/extensions/gsd/index.ts +18 -2
  414. package/src/resources/extensions/gsd/init-wizard.ts +3 -2
  415. package/src/resources/extensions/gsd/journal.ts +30 -0
  416. package/src/resources/extensions/gsd/md-importer.ts +3 -5
  417. package/src/resources/extensions/gsd/memory-store.ts +31 -62
  418. package/src/resources/extensions/gsd/metrics.ts +26 -0
  419. package/src/resources/extensions/gsd/milestone-validation-gates.ts +13 -14
  420. package/src/resources/extensions/gsd/native-git-bridge.ts +11 -12
  421. package/src/resources/extensions/gsd/parallel-orchestrator.ts +40 -1
  422. package/src/resources/extensions/gsd/preferences-models.ts +20 -3
  423. package/src/resources/extensions/gsd/preferences-types.ts +38 -0
  424. package/src/resources/extensions/gsd/preferences-validation.ts +117 -2
  425. package/src/resources/extensions/gsd/preferences.ts +34 -0
  426. package/src/resources/extensions/gsd/prompts/add-tests.md +35 -0
  427. package/src/resources/extensions/gsd/safety/evidence-collector.ts +15 -31
  428. package/src/resources/extensions/gsd/session-lock.ts +14 -2
  429. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +20 -1
  430. package/src/resources/extensions/gsd/state.ts +9 -2
  431. package/src/resources/extensions/gsd/templates/PREFERENCES.md +19 -0
  432. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +177 -0
  433. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +7 -3
  434. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +20 -0
  435. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +7 -3
  436. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +272 -0
  437. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +117 -0
  438. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +6 -2
  439. package/src/resources/extensions/gsd/tests/commands-backlog.test.ts +158 -0
  440. package/src/resources/extensions/gsd/tests/commands-do.test.ts +127 -0
  441. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +340 -0
  442. package/src/resources/extensions/gsd/tests/commands-pr-branch.test.ts +68 -0
  443. package/src/resources/extensions/gsd/tests/commands-session-report.test.ts +82 -0
  444. package/src/resources/extensions/gsd/tests/commands-ship.test.ts +71 -0
  445. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +14 -0
  446. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
  447. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  448. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +154 -0
  449. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +10 -7
  450. package/src/resources/extensions/gsd/tests/graph-context.test.ts +337 -0
  451. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
  452. package/src/resources/extensions/gsd/tests/health-widget.test.ts +1 -1
  453. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +71 -4
  454. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -2
  455. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -3
  456. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +140 -0
  457. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  458. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +2 -1
  459. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +40 -1
  460. package/src/resources/extensions/gsd/tests/preferences.test.ts +145 -0
  461. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +57 -2
  462. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +1 -1
  463. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +180 -0
  464. package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -5
  465. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +101 -0
  466. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +85 -0
  467. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +69 -0
  468. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +39 -0
  469. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +70 -0
  470. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +85 -0
  471. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +35 -0
  472. package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +89 -0
  473. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +167 -0
  474. package/src/resources/extensions/gsd/tests/uok-preferences.test.ts +42 -0
  475. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +39 -0
  476. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +223 -0
  477. package/src/resources/extensions/gsd/tools/complete-slice.ts +26 -0
  478. package/src/resources/extensions/gsd/tools/validate-milestone.ts +48 -3
  479. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +3 -11
  480. package/src/resources/extensions/gsd/triage-resolution.ts +2 -7
  481. package/src/resources/extensions/gsd/types.ts +14 -1
  482. package/src/resources/extensions/gsd/unit-ownership.ts +2 -2
  483. package/src/resources/extensions/gsd/uok/audit-toggle.ts +9 -0
  484. package/src/resources/extensions/gsd/uok/audit.ts +51 -0
  485. package/src/resources/extensions/gsd/uok/contracts.ts +135 -0
  486. package/src/resources/extensions/gsd/uok/execution-graph.ts +241 -0
  487. package/src/resources/extensions/gsd/uok/flags.ts +45 -0
  488. package/src/resources/extensions/gsd/uok/gate-runner.ts +146 -0
  489. package/src/resources/extensions/gsd/uok/gitops.ts +75 -0
  490. package/src/resources/extensions/gsd/uok/kernel.ts +105 -0
  491. package/src/resources/extensions/gsd/uok/loop-adapter.ts +162 -0
  492. package/src/resources/extensions/gsd/uok/model-policy.ts +112 -0
  493. package/src/resources/extensions/gsd/uok/plan-v2.ts +156 -0
  494. package/src/resources/extensions/gsd/workflow-logger.ts +27 -1
  495. package/src/resources/extensions/gsd/workflow-manifest.ts +9 -104
  496. package/src/resources/extensions/gsd/workflow-migration.ts +21 -29
  497. package/src/resources/extensions/gsd/workflow-projections.ts +8 -1
  498. package/src/resources/extensions/gsd/workflow-reconcile.ts +15 -15
  499. package/src/resources/extensions/ttsr/ttsr-manager.ts +10 -5
  500. package/packages/pi-ai/dist/models.custom.d.ts.map +0 -1
  501. package/packages/pi-ai/dist/models.custom.js.map +0 -1
  502. package/packages/pi-ai/dist/models.generated.js +0 -14343
  503. package/packages/pi-ai/dist/models.generated.js.map +0 -1
  504. package/packages/pi-ai/src/models.generated.ts +0 -14345
  505. /package/dist/web/standalone/.next/static/{YzIEI9sxJy4t5xgClF08g → Es_JWCfFZjIvYZShmjyye}/_buildManifest.js +0 -0
  506. /package/dist/web/standalone/.next/static/{YzIEI9sxJy4t5xgClF08g → Es_JWCfFZjIvYZShmjyye}/_ssgManifest.js +0 -0
@@ -29,9 +29,10 @@ import { rebuildState } from "./doctor.js";
29
29
  import { parseUnitId } from "./unit-id.js";
30
30
  import { closeoutUnit, type CloseoutOptions } from "./auto-unit-closeout.js";
31
31
  import {
32
- autoCommitCurrentBranch,
32
+ runTurnGitAction,
33
33
  type TaskCommitContext,
34
- } from "./worktree.js";
34
+ type TurnGitActionMode,
35
+ } from "./git-service.js";
35
36
  import {
36
37
  verifyExpectedArtifact,
37
38
  resolveExpectedArtifactPath,
@@ -66,6 +67,9 @@ import { getSliceTasks } from "./gsd-db.js";
66
67
  import { runPreExecutionChecks, type PreExecutionResult } from "./pre-execution-checks.js";
67
68
  import { writePreExecutionEvidence } from "./verification-evidence.js";
68
69
  import { ensureCodebaseMapFresh } from "./codebase-generator.js";
70
+ import { resolveUokFlags } from "./uok/flags.js";
71
+ import { UokGateRunner } from "./uok/gate-runner.js";
72
+ import { writeTurnGitTransaction } from "./uok/gitops.js";
69
73
 
70
74
  /** Maximum verification retry attempts before escalating to blocker placeholder (#2653). */
71
75
  const MAX_VERIFICATION_RETRIES = 3;
@@ -109,6 +113,7 @@ import {
109
113
  import { existsSync, unlinkSync } from "node:fs";
110
114
  import { join } from "node:path";
111
115
  import { _resetHasChangesCache } from "./native-git-bridge.js";
116
+ import { autoCommitCurrentBranch } from "./worktree.js";
112
117
 
113
118
  // ─── Rogue File Detection ──────────────────────────────────────────────────
114
119
 
@@ -262,6 +267,65 @@ export interface PostUnitContext {
262
267
  updateProgressWidget: (ctx: ExtensionContext, unitType: string, unitId: string, state: import("./types.js").GSDState) => void;
263
268
  }
264
269
 
270
+ export async function autoCommitUnit(
271
+ basePath: string,
272
+ unitType: string,
273
+ unitId: string,
274
+ ctx?: ExtensionContext,
275
+ ): Promise<string | null> {
276
+ try {
277
+ let taskContext: TaskCommitContext | undefined;
278
+
279
+ if (unitType === "execute-task") {
280
+ const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
281
+ if (mid && sid && tid) {
282
+ const summaryPath = resolveTaskFile(basePath, mid, sid, tid, "SUMMARY");
283
+ if (summaryPath) {
284
+ try {
285
+ const summaryContent = await loadFile(summaryPath);
286
+ if (summaryContent) {
287
+ const summary = parseSummary(summaryContent);
288
+ let ghIssueNumber: number | undefined;
289
+ try {
290
+ const { getTaskIssueNumberForCommit } = await import("../github-sync/sync.js");
291
+ ghIssueNumber = getTaskIssueNumberForCommit(basePath, mid, sid, tid) ?? undefined;
292
+ } catch (err) {
293
+ logWarning("engine", `GitHub issue lookup failed: ${err instanceof Error ? err.message : String(err)}`);
294
+ }
295
+
296
+ taskContext = {
297
+ taskId: `${sid}/${tid}`,
298
+ taskTitle: summary.title?.replace(/^T\d+:\s*/, "") || tid,
299
+ oneLiner: summary.oneLiner || undefined,
300
+ keyFiles: summary.frontmatter.key_files?.filter(f => !f.includes("{{")) || undefined,
301
+ issueNumber: ghIssueNumber,
302
+ };
303
+ }
304
+ } catch (e) {
305
+ debugLog("postUnit", { phase: "task-summary-parse", error: String(e) });
306
+ }
307
+ }
308
+ }
309
+ }
310
+
311
+ _resetHasChangesCache();
312
+
313
+ if (LIFECYCLE_ONLY_UNITS.has(unitType)) {
314
+ return null;
315
+ }
316
+
317
+ const commitMsg = autoCommitCurrentBranch(basePath, unitType, unitId, taskContext);
318
+ if (commitMsg) {
319
+ ctx?.ui.notify(`Committed: ${commitMsg.split("\n")[0]}`, "info");
320
+ }
321
+ return commitMsg;
322
+ } catch (e) {
323
+ debugLog("postUnit", { phase: "auto-commit", error: String(e) });
324
+ ctx?.ui.notify(`Auto-commit failed: ${String(e).split("\n")[0]}`, "warning");
325
+ return null;
326
+ }
327
+ }
328
+
265
329
  /**
266
330
  * Pre-verification processing: parallel worker signal check, cache invalidation,
267
331
  * auto-commit, doctor run, state rebuild, worktree sync, artifact verification.
@@ -298,13 +362,21 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
298
362
  await new Promise(r => setTimeout(r, 100));
299
363
  }
300
364
 
301
- // Auto-commit
365
+ const prefs = loadEffectiveGSDPreferences()?.preferences;
366
+ const uokFlags = resolveUokFlags(prefs);
367
+
368
+ // Turn-level git action (commit | snapshot | status-only)
302
369
  if (s.currentUnit) {
303
370
  const unit = s.currentUnit;
371
+ const turnAction: TurnGitActionMode = uokFlags.gitops ? uokFlags.gitopsTurnAction : "commit";
372
+ const traceId = s.currentTraceId ?? `turn:${unit.startedAt}`;
373
+ const turnId = s.currentTurnId ?? `${unit.type}/${unit.id}/${unit.startedAt}`;
374
+ s.lastGitActionFailure = null;
375
+ s.lastGitActionStatus = null;
304
376
  try {
305
377
  let taskContext: TaskCommitContext | undefined;
306
378
 
307
- if (s.currentUnit.type === "execute-task") {
379
+ if (turnAction === "commit" && s.currentUnit.type === "execute-task") {
308
380
  const { milestone: mid, slice: sid, task: tid } = parseUnitId(s.currentUnit.id);
309
381
  if (mid && sid && tid) {
310
382
  const summaryPath = resolveTaskFile(s.basePath, mid, sid, tid, "SUMMARY");
@@ -345,18 +417,105 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
345
417
  // `git worktree remove --force` during teardown.
346
418
  _resetHasChangesCache();
347
419
 
348
- // Skip auto-commit for lifecycle-only units (#2553) — they only touch
349
- // `.gsd/` internal state files. Those files are picked up by the next
350
- // actual task commit via smartStage().
351
- if (!LIFECYCLE_ONLY_UNITS.has(s.currentUnit.type)) {
352
- const commitMsg = autoCommitCurrentBranch(s.basePath, s.currentUnit.type, s.currentUnit.id, taskContext);
353
- if (commitMsg) {
354
- ctx.ui.notify(`Committed: ${commitMsg.split("\n")[0]}`, "info");
420
+ const skipLifecycleCommit =
421
+ turnAction === "commit" && LIFECYCLE_ONLY_UNITS.has(s.currentUnit.type);
422
+
423
+ if (skipLifecycleCommit) {
424
+ debugLog("postUnit", {
425
+ phase: "git-action-skipped",
426
+ reason: "lifecycle-only-unit",
427
+ unitType: s.currentUnit.type,
428
+ unitId: s.currentUnit.id,
429
+ });
430
+ } else {
431
+ const gitResult = runTurnGitAction({
432
+ basePath: s.basePath,
433
+ action: turnAction,
434
+ unitType: s.currentUnit.type,
435
+ unitId: s.currentUnit.id,
436
+ taskContext,
437
+ });
438
+
439
+ if (uokFlags.gitops) {
440
+ writeTurnGitTransaction({
441
+ basePath: s.basePath,
442
+ traceId,
443
+ turnId,
444
+ unitType: unit.type,
445
+ unitId: unit.id,
446
+ stage: "publish",
447
+ action: turnAction,
448
+ push: uokFlags.gitopsTurnPush,
449
+ status: gitResult.status,
450
+ error: gitResult.error,
451
+ metadata: {
452
+ dirty: gitResult.dirty,
453
+ commitMessage: gitResult.commitMessage,
454
+ snapshotLabel: gitResult.snapshotLabel,
455
+ },
456
+ });
457
+ }
458
+
459
+ if (gitResult.status === "failed") {
460
+ s.lastGitActionFailure = gitResult.error ?? `git ${turnAction} failed`;
461
+ s.lastGitActionStatus = "failed";
462
+ if (uokFlags.gitops && uokFlags.gates) {
463
+ const parsed = parseUnitId(unit.id);
464
+ const gateRunner = new UokGateRunner();
465
+ gateRunner.register({
466
+ id: "closeout-git-action",
467
+ type: "closeout",
468
+ execute: async () => ({
469
+ outcome: "fail",
470
+ failureClass: "git",
471
+ rationale: `turn git action "${turnAction}" failed`,
472
+ findings: gitResult.error ?? "unknown git failure",
473
+ }),
474
+ });
475
+ await gateRunner.run("closeout-git-action", {
476
+ basePath: s.basePath,
477
+ traceId,
478
+ turnId,
479
+ milestoneId: parsed.milestone ?? undefined,
480
+ sliceId: parsed.slice ?? undefined,
481
+ taskId: parsed.task ?? undefined,
482
+ unitType: unit.type,
483
+ unitId: unit.id,
484
+ });
485
+ }
486
+
487
+ const failureMsg = `Git ${turnAction} failed: ${(gitResult.error ?? "unknown error").split("\n")[0]}`;
488
+ if (uokFlags.gitops) {
489
+ ctx.ui.notify(failureMsg, "error");
490
+ await pauseAuto(ctx, pi);
491
+ return "dispatched";
492
+ }
493
+ ctx.ui.notify(failureMsg, "warning");
494
+ debugLog("postUnit", {
495
+ phase: "git-action-failed-nonblocking",
496
+ action: turnAction,
497
+ error: gitResult.error ?? "unknown error",
498
+ });
499
+ }
500
+
501
+ s.lastGitActionStatus = "ok";
502
+
503
+ if (turnAction === "commit" && gitResult.commitMessage) {
504
+ ctx.ui.notify(`Committed: ${gitResult.commitMessage.split("\n")[0]}`, "info");
505
+ } else if (turnAction === "snapshot" && gitResult.snapshotLabel) {
506
+ ctx.ui.notify(`Snapshot recorded: ${gitResult.snapshotLabel}`, "info");
355
507
  }
356
508
  }
357
509
  } catch (e) {
358
- debugLog("postUnit", { phase: "auto-commit", error: String(e) });
359
- ctx.ui.notify(`Auto-commit failed: ${String(e).split("\n")[0]}`, "warning");
510
+ const message = e instanceof Error ? e.message : String(e);
511
+ s.lastGitActionFailure = message;
512
+ s.lastGitActionStatus = "failed";
513
+ debugLog("postUnit", { phase: "git-action", error: message, action: turnAction });
514
+ ctx.ui.notify(`Git ${turnAction} failed: ${message.split("\n")[0]}`, uokFlags.gitops ? "error" : "warning");
515
+ if (uokFlags.gitops) {
516
+ await pauseAuto(ctx, pi);
517
+ return "dispatched";
518
+ }
360
519
  }
361
520
 
362
521
  // GitHub sync (non-blocking, opt-in)
@@ -866,11 +1025,13 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
866
1025
  s.currentUnit &&
867
1026
  s.currentUnit.type === "plan-slice"
868
1027
  ) {
1028
+ const currentUnit = s.currentUnit;
869
1029
  let preExecPauseNeeded = false;
870
1030
  await runSafely("postUnitPostVerification", "pre-execution-checks", async () => {
1031
+ const prefs = loadEffectiveGSDPreferences()?.preferences;
1032
+ const uokFlags = resolveUokFlags(prefs);
871
1033
  try {
872
1034
  // Check preferences — respect enhanced_verification and enhanced_verification_pre
873
- const prefs = loadEffectiveGSDPreferences()?.preferences;
874
1035
  const enhancedEnabled = prefs?.enhanced_verification !== false; // default true
875
1036
  const preEnabled = prefs?.enhanced_verification_pre !== false; // default true
876
1037
 
@@ -884,7 +1045,7 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
884
1045
  }
885
1046
 
886
1047
  // Parse the unit ID to get milestone/slice IDs
887
- const { milestone: mid, slice: sid } = parseUnitId(s.currentUnit!.id);
1048
+ const { milestone: mid, slice: sid } = parseUnitId(currentUnit.id);
888
1049
  if (!mid || !sid) {
889
1050
  debugLog("postUnitPostVerification", {
890
1051
  phase: "pre-execution-checks",
@@ -905,6 +1066,8 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
905
1066
  return;
906
1067
  }
907
1068
 
1069
+ const strictMode = prefs?.enhanced_verification_strict === true;
1070
+
908
1071
  // Run pre-execution checks
909
1072
  const result: PreExecutionResult = await runPreExecutionChecks(tasks, s.basePath);
910
1073
 
@@ -928,11 +1091,45 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
928
1091
  writePreExecutionEvidence(result, slicePath, mid, sid);
929
1092
  }
930
1093
 
931
- // Notify UI
1094
+ if (uokFlags.gates) {
1095
+ const failedChecks = result.checks
1096
+ .filter((check) => !check.passed)
1097
+ .map((check) => `[${check.category}] ${check.target}: ${check.message}`);
1098
+ const warnEscalated = result.status === "warn" && strictMode;
1099
+ const blockingFailure = result.status === "fail" || warnEscalated;
1100
+ const gateRunner = new UokGateRunner();
1101
+ gateRunner.register({
1102
+ id: "pre-execution-checks",
1103
+ type: "input",
1104
+ execute: async () => ({
1105
+ outcome: blockingFailure ? "fail" : "pass",
1106
+ failureClass: result.status === "fail" ? "input" : warnEscalated ? "policy" : "none",
1107
+ rationale: blockingFailure
1108
+ ? `pre-execution checks ${result.status}${warnEscalated ? " (strict)" : ""}`
1109
+ : "pre-execution checks passed",
1110
+ findings: failedChecks.join("\n"),
1111
+ }),
1112
+ });
1113
+ await gateRunner.run("pre-execution-checks", {
1114
+ basePath: s.basePath,
1115
+ traceId: `pre-execution:${currentUnit.id}`,
1116
+ turnId: currentUnit.id,
1117
+ milestoneId: mid,
1118
+ sliceId: sid,
1119
+ unitType: currentUnit.type,
1120
+ unitId: currentUnit.id,
1121
+ });
1122
+ }
1123
+
1124
+ // Notify UI — surface actionable details (#4259)
932
1125
  if (result.status === "fail") {
933
- const blockingCount = result.checks.filter(c => !c.passed && c.blocking).length;
1126
+ const blockingChecks = result.checks.filter(c => !c.passed && c.blocking);
1127
+ const blockingCount = blockingChecks.length;
1128
+ const details = blockingChecks.slice(0, 3).map(c => ` \u2022 ${c.message}`).join("\n");
1129
+ const suffix = blockingChecks.length > 3 ? `\n \u2022 ...and ${blockingChecks.length - 3} more` : "";
1130
+ const evidenceNote = `\nSee ${sid}-PRE-EXEC-VERIFY.json for full details.`;
934
1131
  ctx.ui.notify(
935
- `Pre-execution checks failed: ${blockingCount} blocking issue${blockingCount === 1 ? "" : "s"} found`,
1132
+ `Pre-execution checks failed: ${blockingCount} blocking issue${blockingCount === 1 ? "" : "s"} found\n${details}${suffix}${evidenceNote}`,
936
1133
  "error",
937
1134
  );
938
1135
  preExecPauseNeeded = true;
@@ -966,6 +1163,29 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
966
1163
  `Pre-execution checks error: ${errorMessage} — pausing for human review`,
967
1164
  "error",
968
1165
  );
1166
+ if (uokFlags.gates && s.currentUnit) {
1167
+ const { milestone: mid, slice: sid } = parseUnitId(s.currentUnit.id);
1168
+ const gateRunner = new UokGateRunner();
1169
+ gateRunner.register({
1170
+ id: "pre-execution-checks",
1171
+ type: "input",
1172
+ execute: async () => ({
1173
+ outcome: "manual-attention",
1174
+ failureClass: "manual-attention",
1175
+ rationale: "pre-execution checks threw before completion",
1176
+ findings: errorMessage,
1177
+ }),
1178
+ });
1179
+ await gateRunner.run("pre-execution-checks", {
1180
+ basePath: s.basePath,
1181
+ traceId: `pre-execution:${s.currentUnit.id}`,
1182
+ turnId: s.currentUnit.id,
1183
+ milestoneId: mid ?? undefined,
1184
+ sliceId: sid ?? undefined,
1185
+ unitType: s.currentUnit.type,
1186
+ unitId: s.currentUnit.id,
1187
+ });
1188
+ }
969
1189
  preExecPauseNeeded = true;
970
1190
  }
971
1191
  });
@@ -34,6 +34,7 @@ import {
34
34
  import { formatDecisionsCompact, formatRequirementsCompact } from "./structured-data-formatter.js";
35
35
  import { readPhaseAnchor, formatAnchorForPrompt } from "./phase-anchor.js";
36
36
  import { logWarning } from "./workflow-logger.js";
37
+ import { inlineGraphSubgraph } from "./graph-context.js";
37
38
 
38
39
  // ─── Preamble Cap ─────────────────────────────────────────────────────────────
39
40
 
@@ -1175,6 +1176,10 @@ export async function buildResearchSlicePrompt(
1175
1176
  const knowledgeInlineRS = await inlineKnowledgeScoped(base, keywords);
1176
1177
  if (knowledgeInlineRS) inlined.push(knowledgeInlineRS);
1177
1178
 
1179
+ // Knowledge graph: subgraph for this slice (graceful — skipped if no graph.json)
1180
+ const graphBlockRS = await inlineGraphSubgraph(base, `${sid} ${sTitle}`, { budget: 3000 });
1181
+ if (graphBlockRS) inlined.push(graphBlockRS);
1182
+
1178
1183
  inlined.push(inlineTemplate("research", "Research"));
1179
1184
 
1180
1185
  const depContent = await inlineDependencySummaries(mid, sid, base);
@@ -1250,6 +1255,10 @@ export async function buildPlanSlicePrompt(
1250
1255
  const knowledgeInlinePS = await inlineKnowledgeScoped(base, keywordsPS);
1251
1256
  if (knowledgeInlinePS) inlined.push(knowledgeInlinePS);
1252
1257
 
1258
+ // Knowledge graph: subgraph for this slice (graceful — skipped if no graph.json)
1259
+ const graphBlockPS = await inlineGraphSubgraph(base, `${sid} ${sTitle}`, { budget: 3000 });
1260
+ if (graphBlockPS) inlined.push(graphBlockPS);
1261
+
1253
1262
  inlined.push(inlineTemplate("plan", "Slice Plan"));
1254
1263
  if (inlineLevel === "full") {
1255
1264
  inlined.push(inlineTemplate("task-plan", "Task Plan"));
@@ -1366,12 +1375,16 @@ export async function buildExecuteTaskPrompt(
1366
1375
  // Only include if it has content (not a "not found" result)
1367
1376
  const knowledgeContent = knowledgeInlineET && !knowledgeInlineET.includes("not found") ? knowledgeInlineET : null;
1368
1377
 
1378
+ // Knowledge graph: tight subgraph for this task (graceful — skipped if no graph.json)
1379
+ const graphBlockET = await inlineGraphSubgraph(base, `${tid} ${tTitle}`, { budget: 2000 });
1380
+
1369
1381
  const inlinedTemplates = inlineLevel === "minimal"
1370
1382
  ? inlineTemplate("task-summary", "Task Summary")
1371
1383
  : [
1372
1384
  inlineTemplate("task-summary", "Task Summary"),
1373
1385
  inlineTemplate("decisions", "Decisions"),
1374
1386
  ...(knowledgeContent ? [knowledgeContent] : []),
1387
+ ...(graphBlockET ? [graphBlockET] : []),
1375
1388
  ].join("\n\n---\n\n");
1376
1389
 
1377
1390
  const taskSummaryPath = join(base, `${relSlicePath(base, mid, sid)}/tasks/${tid}-SUMMARY.md`);
@@ -264,18 +264,30 @@ export function verifyExpectedArtifact(
264
264
  const absPath = resolveExpectedArtifactPath(unitType, unitId, base);
265
265
  // For unit types with no verifiable artifact (null path), the parent directory
266
266
  // is missing on disk — treat as stale completion state so the key gets evicted (#313).
267
- if (!absPath) return false;
268
- if (!existsSync(absPath)) return false;
267
+ if (!absPath) {
268
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: resolveExpectedArtifactPath returned null (parent dir missing)`);
269
+ return false;
270
+ }
271
+ if (!existsSync(absPath)) {
272
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: existsSync false for ${absPath}`);
273
+ return false;
274
+ }
269
275
 
270
276
  if (unitType === "validate-milestone") {
271
277
  const validationContent = readFileSync(absPath, "utf-8");
272
- if (!isValidationTerminal(validationContent)) return false;
278
+ if (!isValidationTerminal(validationContent)) {
279
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: validation not terminal (len=${validationContent.length}) at ${absPath}`);
280
+ return false;
281
+ }
273
282
  }
274
283
 
275
284
  if (unitType === "plan-milestone") {
276
285
  try {
277
286
  const roadmap = parseLegacyRoadmap(readFileSync(absPath, "utf-8"));
278
- if (roadmap.slices.length === 0) return false;
287
+ if (roadmap.slices.length === 0) {
288
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: roadmap has zero slices at ${absPath}`);
289
+ return false;
290
+ }
279
291
  } catch (err) {
280
292
  logWarning("recovery", `plan-milestone roadmap verification failed: ${err instanceof Error ? err.message : String(err)}`);
281
293
  return false;
@@ -292,7 +304,10 @@ export function verifyExpectedArtifact(
292
304
  // Accept checkbox-style (- [x] **T01: ...) or heading-style (### T01 -- / ### T01: / ### T01 —)
293
305
  const hasCheckboxTask = /^- \[[xX ]\] \*\*T\d+:/m.test(planContent);
294
306
  const hasHeadingTask = /^#{2,4}\s+T\d+\s*(?:--|—|:)/m.test(planContent);
295
- if (!hasCheckboxTask && !hasHeadingTask) return false;
307
+ if (!hasCheckboxTask && !hasHeadingTask) {
308
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: plan has no task checkbox/heading (len=${planContent.length}) at ${absPath}`);
309
+ return false;
310
+ }
296
311
  }
297
312
 
298
313
  // execute-task: DB status is authoritative. Fall back to checked-checkbox
@@ -349,10 +364,15 @@ export function verifyExpectedArtifact(
349
364
 
350
365
  if (taskIds && taskIds.length > 0) {
351
366
  const tasksDir = resolveTasksDir(base, mid, sid);
352
- if (tasksDir) {
353
- for (const tid of taskIds) {
354
- const taskPlanFile = join(tasksDir, `${tid}-PLAN.md`);
355
- if (!existsSync(taskPlanFile)) return false;
367
+ if (!tasksDir) {
368
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: resolveTasksDir returned null for ${mid}/${sid}`);
369
+ return false;
370
+ }
371
+ for (const tid of taskIds) {
372
+ const taskPlanFile = join(tasksDir, `${tid}-PLAN.md`);
373
+ if (!existsSync(taskPlanFile)) {
374
+ logWarning("recovery", `verify-fail ${unitType} ${unitId}: task plan missing ${taskPlanFile}`);
375
+ return false;
356
376
  }
357
377
  }
358
378
  }
@@ -8,6 +8,7 @@ import type { ExtensionContext } from "@gsd/pi-coding-agent";
8
8
  import { snapshotUnitMetrics } from "./metrics.js";
9
9
  import { saveActivityLog } from "./activity-log.js";
10
10
  import { logWarning } from "./workflow-logger.js";
11
+ import { writeTurnGitTransaction } from "./uok/gitops.js";
11
12
 
12
13
  export interface CloseoutOptions {
13
14
  promptCharCount?: number;
@@ -15,6 +16,12 @@ export interface CloseoutOptions {
15
16
  tier?: string;
16
17
  modelDowngraded?: boolean;
17
18
  continueHereFired?: boolean;
19
+ traceId?: string;
20
+ turnId?: string;
21
+ gitAction?: "commit" | "snapshot" | "status-only";
22
+ gitPush?: boolean;
23
+ gitStatus?: "ok" | "failed";
24
+ gitError?: string;
18
25
  }
19
26
 
20
27
  /**
@@ -47,6 +54,23 @@ export async function closeoutUnit(
47
54
  }
48
55
  }
49
56
 
57
+ if (opts?.traceId && opts.turnId && opts.gitAction && opts.gitStatus) {
58
+ writeTurnGitTransaction({
59
+ basePath,
60
+ traceId: opts.traceId,
61
+ turnId: opts.turnId,
62
+ unitType,
63
+ unitId,
64
+ stage: "record",
65
+ action: opts.gitAction,
66
+ push: opts.gitPush === true,
67
+ status: opts.gitStatus,
68
+ error: opts.gitError,
69
+ metadata: {
70
+ activityFile,
71
+ },
72
+ });
73
+ }
74
+
50
75
  return activityFile ?? undefined;
51
76
  }
52
-