gsd-pi 2.74.0-dev.b741afb → 2.74.0-dev.b7c5f96

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 (430) hide show
  1. package/dist/resources/extensions/gsd/activity-log.js +16 -0
  2. package/dist/resources/extensions/gsd/auto/loop.js +147 -10
  3. package/dist/resources/extensions/gsd/auto/phases.js +164 -9
  4. package/dist/resources/extensions/gsd/auto/session.js +10 -0
  5. package/dist/resources/extensions/gsd/auto-dispatch.js +11 -1
  6. package/dist/resources/extensions/gsd/auto-model-selection.js +54 -8
  7. package/dist/resources/extensions/gsd/auto-post-unit.js +215 -8
  8. package/dist/resources/extensions/gsd/auto-recovery.js +24 -10
  9. package/dist/resources/extensions/gsd/auto-unit-closeout.js +18 -0
  10. package/dist/resources/extensions/gsd/auto-verification.js +100 -2
  11. package/dist/resources/extensions/gsd/auto-worktree.js +2 -0
  12. package/dist/resources/extensions/gsd/auto.js +28 -2
  13. package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +5 -3
  14. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +10 -1
  15. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +61 -9
  16. package/dist/resources/extensions/gsd/cache.js +16 -5
  17. package/dist/resources/extensions/gsd/commands/catalog.js +6 -1
  18. package/dist/resources/extensions/gsd/commands/handlers/core.js +5 -1
  19. package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
  20. package/dist/resources/extensions/gsd/commands-extract-learnings.js +225 -0
  21. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +51 -4
  22. package/dist/resources/extensions/gsd/docs/preferences-reference.md +16 -1
  23. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +144 -0
  24. package/dist/resources/extensions/gsd/ecosystem/loader.js +145 -0
  25. package/dist/resources/extensions/gsd/git-service.js +49 -1
  26. package/dist/resources/extensions/gsd/graph-context.js +98 -7
  27. package/dist/resources/extensions/gsd/gsd-db.js +260 -2
  28. package/dist/resources/extensions/gsd/guided-flow.js +31 -6
  29. package/dist/resources/extensions/gsd/init-wizard.js +1 -0
  30. package/dist/resources/extensions/gsd/journal.js +27 -0
  31. package/dist/resources/extensions/gsd/metrics.js +19 -0
  32. package/dist/resources/extensions/gsd/parallel-orchestrator.js +33 -1
  33. package/dist/resources/extensions/gsd/preferences-models.js +20 -3
  34. package/dist/resources/extensions/gsd/preferences-types.js +2 -0
  35. package/dist/resources/extensions/gsd/preferences-validation.js +118 -2
  36. package/dist/resources/extensions/gsd/preferences.js +31 -0
  37. package/dist/resources/extensions/gsd/safety/evidence-collector.js +15 -30
  38. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +12 -2
  39. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +19 -0
  40. package/dist/resources/extensions/gsd/tools/complete-slice.js +5 -0
  41. package/dist/resources/extensions/gsd/tools/validate-milestone.js +39 -4
  42. package/dist/resources/extensions/gsd/unit-ownership.js +1 -1
  43. package/dist/resources/extensions/gsd/uok/audit-toggle.js +7 -0
  44. package/dist/resources/extensions/gsd/uok/audit.js +40 -0
  45. package/dist/resources/extensions/gsd/uok/contracts.js +1 -0
  46. package/dist/resources/extensions/gsd/uok/execution-graph.js +179 -0
  47. package/dist/resources/extensions/gsd/uok/flags.js +29 -0
  48. package/dist/resources/extensions/gsd/uok/gate-runner.js +109 -0
  49. package/dist/resources/extensions/gsd/uok/gitops.js +53 -0
  50. package/dist/resources/extensions/gsd/uok/kernel.js +80 -0
  51. package/dist/resources/extensions/gsd/uok/loop-adapter.js +133 -0
  52. package/dist/resources/extensions/gsd/uok/model-policy.js +66 -0
  53. package/dist/resources/extensions/gsd/uok/plan-v2.js +132 -0
  54. package/dist/resources/extensions/gsd/workflow-logger.js +22 -0
  55. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  56. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  57. package/dist/web/standalone/.next/BUILD_ID +1 -1
  58. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  59. package/dist/web/standalone/.next/build-manifest.json +2 -2
  60. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  61. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  62. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  63. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  64. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  65. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  66. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  67. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  68. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  69. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  70. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  71. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  72. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  73. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  74. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  75. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  76. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  77. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  78. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  79. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +1 -1
  80. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  81. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
  82. package/dist/web/standalone/.next/server/app/index.html +1 -1
  83. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  90. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  91. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  92. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  93. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  94. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  95. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  96. package/package.json +1 -1
  97. package/packages/mcp-server/dist/readers/graph.d.ts +1 -1
  98. package/packages/mcp-server/dist/readers/graph.d.ts.map +1 -1
  99. package/packages/mcp-server/dist/readers/graph.js +107 -0
  100. package/packages/mcp-server/dist/readers/graph.js.map +1 -1
  101. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  102. package/packages/mcp-server/dist/workflow-tools.js +88 -6
  103. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  104. package/packages/mcp-server/src/readers/graph.test.ts +178 -0
  105. package/packages/mcp-server/src/readers/graph.ts +148 -1
  106. package/packages/mcp-server/src/workflow-tools.ts +95 -10
  107. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  108. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  109. package/packages/pi-ai/dist/index.d.ts +1 -9
  110. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  111. package/packages/pi-ai/dist/index.js +1 -9
  112. package/packages/pi-ai/dist/index.js.map +1 -1
  113. package/packages/pi-ai/dist/models/capability-patches.d.ts +19 -0
  114. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -0
  115. package/packages/pi-ai/dist/models/capability-patches.js +36 -0
  116. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -0
  117. package/packages/pi-ai/dist/{models.custom.d.ts → models/custom.d.ts} +1 -1
  118. package/packages/pi-ai/dist/models/custom.d.ts.map +1 -0
  119. package/packages/pi-ai/dist/{models.custom.js → models/custom.js} +4 -4
  120. package/packages/pi-ai/dist/models/custom.js.map +1 -0
  121. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +1482 -0
  122. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -0
  123. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +1484 -0
  124. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -0
  125. package/packages/pi-ai/dist/models/generated/anthropic.d.ts +377 -0
  126. package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -0
  127. package/packages/pi-ai/dist/models/generated/anthropic.js +379 -0
  128. package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -0
  129. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts +700 -0
  130. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts.map +1 -0
  131. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js +702 -0
  132. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js.map +1 -0
  133. package/packages/pi-ai/dist/models/generated/cerebras.d.ts +71 -0
  134. package/packages/pi-ai/dist/models/generated/cerebras.d.ts.map +1 -0
  135. package/packages/pi-ai/dist/models/generated/cerebras.js +73 -0
  136. package/packages/pi-ai/dist/models/generated/cerebras.js.map +1 -0
  137. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts +590 -0
  138. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts.map +1 -0
  139. package/packages/pi-ai/dist/models/generated/github-copilot.js +444 -0
  140. package/packages/pi-ai/dist/models/generated/github-copilot.js.map +1 -0
  141. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +156 -0
  142. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -0
  143. package/packages/pi-ai/dist/models/generated/google-antigravity.js +158 -0
  144. package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -0
  145. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts +105 -0
  146. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts.map +1 -0
  147. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js +107 -0
  148. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js.map +1 -0
  149. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts +207 -0
  150. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts.map +1 -0
  151. package/packages/pi-ai/dist/models/generated/google-vertex.js +209 -0
  152. package/packages/pi-ai/dist/models/generated/google-vertex.js.map +1 -0
  153. package/packages/pi-ai/dist/models/generated/google.d.ts +462 -0
  154. package/packages/pi-ai/dist/models/generated/google.d.ts.map +1 -0
  155. package/packages/pi-ai/dist/models/generated/google.js +464 -0
  156. package/packages/pi-ai/dist/models/generated/google.js.map +1 -0
  157. package/packages/pi-ai/dist/models/generated/groq.d.ts +309 -0
  158. package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -0
  159. package/packages/pi-ai/dist/models/generated/groq.js +311 -0
  160. package/packages/pi-ai/dist/models/generated/groq.js.map +1 -0
  161. package/packages/pi-ai/dist/models/generated/huggingface.d.ts +383 -0
  162. package/packages/pi-ai/dist/models/generated/huggingface.d.ts.map +1 -0
  163. package/packages/pi-ai/dist/models/generated/huggingface.js +347 -0
  164. package/packages/pi-ai/dist/models/generated/huggingface.js.map +1 -0
  165. package/packages/pi-ai/dist/{models.generated.d.ts → models/generated/index.d.ts} +1 -1
  166. package/packages/pi-ai/dist/{models.generated.d.ts.map → models/generated/index.d.ts.map} +1 -1
  167. package/packages/pi-ai/dist/models/generated/index.js +51 -0
  168. package/packages/pi-ai/dist/models/generated/index.js.map +1 -0
  169. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts +37 -0
  170. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts.map +1 -0
  171. package/packages/pi-ai/dist/models/generated/kimi-coding.js +39 -0
  172. package/packages/pi-ai/dist/models/generated/kimi-coding.js.map +1 -0
  173. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts +105 -0
  174. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts.map +1 -0
  175. package/packages/pi-ai/dist/models/generated/minimax-cn.js +107 -0
  176. package/packages/pi-ai/dist/models/generated/minimax-cn.js.map +1 -0
  177. package/packages/pi-ai/dist/models/generated/minimax.d.ts +105 -0
  178. package/packages/pi-ai/dist/models/generated/minimax.d.ts.map +1 -0
  179. package/packages/pi-ai/dist/models/generated/minimax.js +107 -0
  180. package/packages/pi-ai/dist/models/generated/minimax.js.map +1 -0
  181. package/packages/pi-ai/dist/models/generated/mistral.d.ts +445 -0
  182. package/packages/pi-ai/dist/models/generated/mistral.d.ts.map +1 -0
  183. package/packages/pi-ai/dist/models/generated/mistral.js +447 -0
  184. package/packages/pi-ai/dist/models/generated/mistral.js.map +1 -0
  185. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +139 -0
  186. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -0
  187. package/packages/pi-ai/dist/models/generated/openai-codex.js +141 -0
  188. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -0
  189. package/packages/pi-ai/dist/models/generated/openai.d.ts +700 -0
  190. package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -0
  191. package/packages/pi-ai/dist/models/generated/openai.js +702 -0
  192. package/packages/pi-ai/dist/models/generated/openai.js.map +1 -0
  193. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts +122 -0
  194. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts.map +1 -0
  195. package/packages/pi-ai/dist/models/generated/opencode-go.js +124 -0
  196. package/packages/pi-ai/dist/models/generated/opencode-go.js.map +1 -0
  197. package/packages/pi-ai/dist/models/generated/opencode.d.ts +530 -0
  198. package/packages/pi-ai/dist/models/generated/opencode.d.ts.map +1 -0
  199. package/packages/pi-ai/dist/models/generated/opencode.js +532 -0
  200. package/packages/pi-ai/dist/models/generated/opencode.js.map +1 -0
  201. package/packages/pi-ai/dist/models/generated/openrouter.d.ts +4270 -0
  202. package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -0
  203. package/packages/pi-ai/dist/models/generated/openrouter.js +4272 -0
  204. package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -0
  205. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts +2604 -0
  206. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts.map +1 -0
  207. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js +2606 -0
  208. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js.map +1 -0
  209. package/packages/pi-ai/dist/models/generated/xai.d.ts +411 -0
  210. package/packages/pi-ai/dist/models/generated/xai.d.ts.map +1 -0
  211. package/packages/pi-ai/dist/models/generated/xai.js +413 -0
  212. package/packages/pi-ai/dist/models/generated/xai.js.map +1 -0
  213. package/packages/pi-ai/dist/models/generated/zai.d.ts +276 -0
  214. package/packages/pi-ai/dist/models/generated/zai.d.ts.map +1 -0
  215. package/packages/pi-ai/dist/models/generated/zai.js +239 -0
  216. package/packages/pi-ai/dist/models/generated/zai.js.map +1 -0
  217. package/packages/pi-ai/dist/models/index.d.ts +27 -0
  218. package/packages/pi-ai/dist/models/index.d.ts.map +1 -0
  219. package/packages/pi-ai/dist/models/index.js +80 -0
  220. package/packages/pi-ai/dist/models/index.js.map +1 -0
  221. package/packages/pi-ai/dist/models.d.ts +1 -36
  222. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  223. package/packages/pi-ai/dist/models.generated.test.js +1 -2
  224. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  225. package/packages/pi-ai/dist/models.js +3 -112
  226. package/packages/pi-ai/dist/models.js.map +1 -1
  227. package/packages/pi-ai/dist/models.test.js +6 -5
  228. package/packages/pi-ai/dist/models.test.js.map +1 -1
  229. package/packages/pi-ai/scripts/generate-models.ts +74 -40
  230. package/packages/pi-ai/src/index.ts +1 -9
  231. package/packages/pi-ai/src/models/capability-patches.ts +40 -0
  232. package/packages/pi-ai/src/{models.custom.ts → models/custom.ts} +4 -4
  233. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +1486 -0
  234. package/packages/pi-ai/src/models/generated/anthropic.ts +381 -0
  235. package/packages/pi-ai/src/models/generated/azure-openai-responses.ts +704 -0
  236. package/packages/pi-ai/src/models/generated/cerebras.ts +75 -0
  237. package/packages/pi-ai/src/models/generated/github-copilot.ts +446 -0
  238. package/packages/pi-ai/src/models/generated/google-antigravity.ts +160 -0
  239. package/packages/pi-ai/src/models/generated/google-gemini-cli.ts +109 -0
  240. package/packages/pi-ai/src/models/generated/google-vertex.ts +211 -0
  241. package/packages/pi-ai/src/models/generated/google.ts +466 -0
  242. package/packages/pi-ai/src/models/generated/groq.ts +313 -0
  243. package/packages/pi-ai/src/models/generated/huggingface.ts +349 -0
  244. package/packages/pi-ai/src/models/generated/index.ts +52 -0
  245. package/packages/pi-ai/src/models/generated/kimi-coding.ts +41 -0
  246. package/packages/pi-ai/src/models/generated/minimax-cn.ts +109 -0
  247. package/packages/pi-ai/src/models/generated/minimax.ts +109 -0
  248. package/packages/pi-ai/src/models/generated/mistral.ts +449 -0
  249. package/packages/pi-ai/src/models/generated/openai-codex.ts +143 -0
  250. package/packages/pi-ai/src/models/generated/openai.ts +704 -0
  251. package/packages/pi-ai/src/models/generated/opencode-go.ts +126 -0
  252. package/packages/pi-ai/src/models/generated/opencode.ts +534 -0
  253. package/packages/pi-ai/src/models/generated/openrouter.ts +4274 -0
  254. package/packages/pi-ai/src/models/generated/vercel-ai-gateway.ts +2608 -0
  255. package/packages/pi-ai/src/models/generated/xai.ts +415 -0
  256. package/packages/pi-ai/src/models/generated/zai.ts +241 -0
  257. package/packages/pi-ai/src/models/index.ts +106 -0
  258. package/packages/pi-ai/src/models.generated.test.ts +1 -2
  259. package/packages/pi-ai/src/models.test.ts +6 -5
  260. package/packages/pi-ai/src/models.ts +3 -153
  261. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  262. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  263. package/packages/pi-coding-agent/dist/core/agent-session.js +8 -2
  264. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  265. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +472 -0
  266. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  267. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts +2 -0
  268. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts.map +1 -0
  269. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js +52 -0
  270. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js.map +1 -0
  271. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  272. package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
  273. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.d.ts +2 -0
  275. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.d.ts.map +1 -0
  276. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +61 -0
  277. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -0
  278. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +11 -0
  279. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  280. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +1 -0
  281. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  282. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +23 -9
  283. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  284. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts +11 -0
  285. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -0
  286. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +53 -0
  287. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -0
  288. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.d.ts +8 -5
  289. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  290. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js +27 -13
  291. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  292. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +8 -0
  293. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  294. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +68 -8
  295. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  296. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  297. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +22 -22
  298. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  299. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  300. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +232 -18
  301. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts +2 -0
  303. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts.map +1 -0
  304. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +38 -0
  305. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -0
  306. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +14 -0
  307. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  308. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +70 -6
  309. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  310. package/packages/pi-coding-agent/src/core/agent-session.ts +12 -6
  311. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +612 -0
  312. package/packages/pi-coding-agent/src/core/model-registry-env-fallback.test.ts +59 -0
  313. package/packages/pi-coding-agent/src/core/model-registry.ts +2 -1
  314. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +92 -0
  315. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +19 -0
  316. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +25 -10
  317. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +75 -0
  318. package/packages/pi-coding-agent/src/modes/interactive/components/compaction-summary-message.ts +36 -15
  319. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +83 -7
  320. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +23 -26
  321. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +298 -41
  322. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +44 -0
  323. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +92 -6
  324. package/packages/pi-coding-agent/src/types/ambient-modules.d.ts +69 -0
  325. package/packages/pi-coding-agent/tsconfig.json +2 -2
  326. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  327. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  328. package/packages/pi-tui/dist/tui.js +9 -2
  329. package/packages/pi-tui/dist/tui.js.map +1 -1
  330. package/packages/pi-tui/src/tui.ts +9 -1
  331. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  332. package/src/resources/extensions/gsd/activity-log.ts +21 -0
  333. package/src/resources/extensions/gsd/auto/loop-deps.ts +4 -0
  334. package/src/resources/extensions/gsd/auto/loop.ts +159 -10
  335. package/src/resources/extensions/gsd/auto/phases.ts +193 -9
  336. package/src/resources/extensions/gsd/auto/session.ts +10 -0
  337. package/src/resources/extensions/gsd/auto-dispatch.ts +16 -6
  338. package/src/resources/extensions/gsd/auto-model-selection.ts +69 -8
  339. package/src/resources/extensions/gsd/auto-post-unit.ts +226 -9
  340. package/src/resources/extensions/gsd/auto-recovery.ts +29 -9
  341. package/src/resources/extensions/gsd/auto-unit-closeout.ts +25 -1
  342. package/src/resources/extensions/gsd/auto-verification.ts +129 -2
  343. package/src/resources/extensions/gsd/auto-worktree.ts +1 -0
  344. package/src/resources/extensions/gsd/auto.ts +34 -2
  345. package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +5 -3
  346. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +15 -1
  347. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +72 -8
  348. package/src/resources/extensions/gsd/cache.ts +16 -5
  349. package/src/resources/extensions/gsd/commands/catalog.ts +6 -1
  350. package/src/resources/extensions/gsd/commands/handlers/core.ts +5 -1
  351. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
  352. package/src/resources/extensions/gsd/commands-extract-learnings.ts +304 -0
  353. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +58 -4
  354. package/src/resources/extensions/gsd/docs/preferences-reference.md +16 -1
  355. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +228 -0
  356. package/src/resources/extensions/gsd/ecosystem/loader.ts +201 -0
  357. package/src/resources/extensions/gsd/git-service.ts +68 -0
  358. package/src/resources/extensions/gsd/graph-context.ts +139 -12
  359. package/src/resources/extensions/gsd/gsd-db.ts +321 -3
  360. package/src/resources/extensions/gsd/guided-flow.ts +36 -2
  361. package/src/resources/extensions/gsd/init-wizard.ts +3 -2
  362. package/src/resources/extensions/gsd/journal.ts +30 -0
  363. package/src/resources/extensions/gsd/metrics.ts +26 -0
  364. package/src/resources/extensions/gsd/parallel-orchestrator.ts +40 -1
  365. package/src/resources/extensions/gsd/preferences-models.ts +20 -3
  366. package/src/resources/extensions/gsd/preferences-types.ts +38 -0
  367. package/src/resources/extensions/gsd/preferences-validation.ts +117 -2
  368. package/src/resources/extensions/gsd/preferences.ts +34 -0
  369. package/src/resources/extensions/gsd/safety/evidence-collector.ts +15 -31
  370. package/src/resources/extensions/gsd/session-lock.ts +14 -2
  371. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +20 -1
  372. package/src/resources/extensions/gsd/templates/PREFERENCES.md +19 -0
  373. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +177 -0
  374. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +7 -3
  375. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +20 -0
  376. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +7 -3
  377. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +272 -0
  378. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +117 -0
  379. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +6 -2
  380. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +340 -0
  381. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
  382. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  383. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +10 -7
  384. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
  385. package/src/resources/extensions/gsd/tests/health-widget.test.ts +1 -1
  386. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +3 -3
  387. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -2
  388. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -3
  389. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  390. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +2 -1
  391. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +40 -1
  392. package/src/resources/extensions/gsd/tests/preferences.test.ts +145 -0
  393. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +57 -2
  394. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +1 -1
  395. package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -5
  396. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +101 -0
  397. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +85 -0
  398. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +69 -0
  399. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +39 -0
  400. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +70 -0
  401. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +85 -0
  402. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +35 -0
  403. package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +89 -0
  404. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +167 -0
  405. package/src/resources/extensions/gsd/tests/uok-preferences.test.ts +42 -0
  406. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +39 -0
  407. package/src/resources/extensions/gsd/tools/complete-slice.ts +9 -2
  408. package/src/resources/extensions/gsd/tools/validate-milestone.ts +48 -3
  409. package/src/resources/extensions/gsd/types.ts +14 -1
  410. package/src/resources/extensions/gsd/unit-ownership.ts +2 -2
  411. package/src/resources/extensions/gsd/uok/audit-toggle.ts +9 -0
  412. package/src/resources/extensions/gsd/uok/audit.ts +51 -0
  413. package/src/resources/extensions/gsd/uok/contracts.ts +135 -0
  414. package/src/resources/extensions/gsd/uok/execution-graph.ts +241 -0
  415. package/src/resources/extensions/gsd/uok/flags.ts +45 -0
  416. package/src/resources/extensions/gsd/uok/gate-runner.ts +146 -0
  417. package/src/resources/extensions/gsd/uok/gitops.ts +75 -0
  418. package/src/resources/extensions/gsd/uok/kernel.ts +105 -0
  419. package/src/resources/extensions/gsd/uok/loop-adapter.ts +162 -0
  420. package/src/resources/extensions/gsd/uok/model-policy.ts +112 -0
  421. package/src/resources/extensions/gsd/uok/plan-v2.ts +156 -0
  422. package/src/resources/extensions/gsd/workflow-logger.ts +27 -1
  423. package/src/resources/extensions/ttsr/ttsr-manager.ts +10 -5
  424. package/packages/pi-ai/dist/models.custom.d.ts.map +0 -1
  425. package/packages/pi-ai/dist/models.custom.js.map +0 -1
  426. package/packages/pi-ai/dist/models.generated.js +0 -14343
  427. package/packages/pi-ai/dist/models.generated.js.map +0 -1
  428. package/packages/pi-ai/src/models.generated.ts +0 -14345
  429. /package/dist/web/standalone/.next/static/{XnHY5eXUsTCFmNodWHetD → k1VZ0h-SB6uWSZgPhgNwi}/_buildManifest.js +0 -0
  430. /package/dist/web/standalone/.next/static/{XnHY5eXUsTCFmNodWHetD → k1VZ0h-SB6uWSZgPhgNwi}/_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
 
@@ -357,10 +362,161 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
357
362
  await new Promise(r => setTimeout(r, 100));
358
363
  }
359
364
 
360
- // Auto-commit
365
+ const prefs = loadEffectiveGSDPreferences()?.preferences;
366
+ const uokFlags = resolveUokFlags(prefs);
367
+
368
+ // Turn-level git action (commit | snapshot | status-only)
361
369
  if (s.currentUnit) {
362
370
  const unit = s.currentUnit;
363
- await autoCommitUnit(s.basePath, unit.type, unit.id, ctx);
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;
376
+ try {
377
+ let taskContext: TaskCommitContext | undefined;
378
+
379
+ if (turnAction === "commit" && s.currentUnit.type === "execute-task") {
380
+ const { milestone: mid, slice: sid, task: tid } = parseUnitId(s.currentUnit.id);
381
+ if (mid && sid && tid) {
382
+ const summaryPath = resolveTaskFile(s.basePath, mid, sid, tid, "SUMMARY");
383
+ if (summaryPath) {
384
+ try {
385
+ const summaryContent = await loadFile(summaryPath);
386
+ if (summaryContent) {
387
+ const summary = parseSummary(summaryContent);
388
+ // Look up GitHub issue number for commit linking
389
+ let ghIssueNumber: number | undefined;
390
+ try {
391
+ const { getTaskIssueNumberForCommit } = await import("../github-sync/sync.js");
392
+ ghIssueNumber = getTaskIssueNumberForCommit(s.basePath, mid, sid, tid) ?? undefined;
393
+ } catch (err) {
394
+ // GitHub sync not available — skip
395
+ logWarning("engine", `GitHub issue lookup failed: ${err instanceof Error ? err.message : String(err)}`);
396
+ }
397
+
398
+ taskContext = {
399
+ taskId: `${sid}/${tid}`,
400
+ taskTitle: summary.title?.replace(/^T\d+:\s*/, "") || tid,
401
+ oneLiner: summary.oneLiner || undefined,
402
+ keyFiles: summary.frontmatter.key_files?.filter(f => !f.includes("{{")) || undefined,
403
+ issueNumber: ghIssueNumber,
404
+ };
405
+ }
406
+ } catch (e) {
407
+ debugLog("postUnit", { phase: "task-summary-parse", error: String(e) });
408
+ }
409
+ }
410
+ }
411
+ }
412
+
413
+ // Invalidate the nativeHasChanges cache before auto-commit (#1853).
414
+ // The cache has a 10-second TTL and is keyed by basePath. A stale
415
+ // `false` result causes autoCommit to skip staging entirely, leaving
416
+ // code files only in the working tree where they are destroyed by
417
+ // `git worktree remove --force` during teardown.
418
+ _resetHasChangesCache();
419
+
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");
507
+ }
508
+ }
509
+ } catch (e) {
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
+ }
519
+ }
364
520
 
365
521
  // GitHub sync (non-blocking, opt-in)
366
522
  await runSafely("postUnit", "github-sync", async () => {
@@ -869,11 +1025,13 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
869
1025
  s.currentUnit &&
870
1026
  s.currentUnit.type === "plan-slice"
871
1027
  ) {
1028
+ const currentUnit = s.currentUnit;
872
1029
  let preExecPauseNeeded = false;
873
1030
  await runSafely("postUnitPostVerification", "pre-execution-checks", async () => {
1031
+ const prefs = loadEffectiveGSDPreferences()?.preferences;
1032
+ const uokFlags = resolveUokFlags(prefs);
874
1033
  try {
875
1034
  // Check preferences — respect enhanced_verification and enhanced_verification_pre
876
- const prefs = loadEffectiveGSDPreferences()?.preferences;
877
1035
  const enhancedEnabled = prefs?.enhanced_verification !== false; // default true
878
1036
  const preEnabled = prefs?.enhanced_verification_pre !== false; // default true
879
1037
 
@@ -887,7 +1045,7 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
887
1045
  }
888
1046
 
889
1047
  // Parse the unit ID to get milestone/slice IDs
890
- const { milestone: mid, slice: sid } = parseUnitId(s.currentUnit!.id);
1048
+ const { milestone: mid, slice: sid } = parseUnitId(currentUnit.id);
891
1049
  if (!mid || !sid) {
892
1050
  debugLog("postUnitPostVerification", {
893
1051
  phase: "pre-execution-checks",
@@ -908,6 +1066,8 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
908
1066
  return;
909
1067
  }
910
1068
 
1069
+ const strictMode = prefs?.enhanced_verification_strict === true;
1070
+
911
1071
  // Run pre-execution checks
912
1072
  const result: PreExecutionResult = await runPreExecutionChecks(tasks, s.basePath);
913
1073
 
@@ -931,11 +1091,45 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
931
1091
  writePreExecutionEvidence(result, slicePath, mid, sid);
932
1092
  }
933
1093
 
934
- // 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)
935
1125
  if (result.status === "fail") {
936
- 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.`;
937
1131
  ctx.ui.notify(
938
- `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}`,
939
1133
  "error",
940
1134
  );
941
1135
  preExecPauseNeeded = true;
@@ -969,6 +1163,29 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
969
1163
  `Pre-execution checks error: ${errorMessage} — pausing for human review`,
970
1164
  "error",
971
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
+ }
972
1189
  preExecPauseNeeded = true;
973
1190
  }
974
1191
  });
@@ -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
-
@@ -33,6 +33,8 @@ import { runPostExecutionChecks, type PostExecutionResult } from "./post-executi
33
33
  import type { AutoSession } from "./auto/session.js";
34
34
  import type { VerificationResult as VerificationGateResult } from "./types.js";
35
35
  import { join } from "node:path";
36
+ import { resolveUokFlags } from "./uok/flags.js";
37
+ import { UokGateRunner } from "./uok/gate-runner.js";
36
38
 
37
39
  export interface VerificationContext {
38
40
  s: AutoSession;
@@ -67,6 +69,37 @@ async function runValidateMilestonePostCheck(
67
69
  pauseAuto: (ctx?: ExtensionContext, pi?: ExtensionAPI) => Promise<void>,
68
70
  ): Promise<VerificationResult> {
69
71
  const { s, ctx, pi } = vctx;
72
+ const prefs = loadEffectiveGSDPreferences()?.preferences;
73
+ const uokFlags = resolveUokFlags(prefs);
74
+ const persistMilestoneValidationGate = async (
75
+ outcome: "pass" | "fail" | "retry" | "manual-attention",
76
+ failureClass: "none" | "verification" | "manual-attention",
77
+ rationale: string,
78
+ findings = "",
79
+ milestoneId?: string,
80
+ ): Promise<void> => {
81
+ if (!uokFlags.gates || !s.currentUnit) return;
82
+ const gateRunner = new UokGateRunner();
83
+ gateRunner.register({
84
+ id: "milestone-validation-post-check",
85
+ type: "verification",
86
+ execute: async () => ({
87
+ outcome,
88
+ failureClass,
89
+ rationale,
90
+ findings,
91
+ }),
92
+ });
93
+ await gateRunner.run("milestone-validation-post-check", {
94
+ basePath: s.basePath,
95
+ traceId: `validation-post-check:${s.currentUnit.id}`,
96
+ turnId: s.currentUnit.id,
97
+ milestoneId,
98
+ unitType: s.currentUnit.type,
99
+ unitId: s.currentUnit.id,
100
+ });
101
+ };
102
+
70
103
  if (!s.currentUnit) return "continue";
71
104
 
72
105
  const { milestone: mid } = parseUnitId(s.currentUnit.id);
@@ -79,14 +112,32 @@ async function runValidateMilestonePostCheck(
79
112
  if (!validationContent) return "continue";
80
113
 
81
114
  const verdict = extractVerdict(validationContent);
82
- if (verdict !== "needs-remediation") return "continue";
115
+ if (verdict !== "needs-remediation") {
116
+ await persistMilestoneValidationGate(
117
+ "pass",
118
+ "none",
119
+ `milestone validation verdict is ${verdict}; no remediation loop risk`,
120
+ "",
121
+ mid,
122
+ );
123
+ return "continue";
124
+ }
83
125
 
84
126
  const incompleteSliceCount = await countIncompleteSlices(s.basePath, mid);
85
127
 
86
128
  // If any non-closed slices exist, the agent successfully queued remediation
87
129
  // work — proceed normally. The state machine will execute those slices and
88
130
  // re-validate per the #3596/#3670 fix.
89
- if (incompleteSliceCount > 0) return "continue";
131
+ if (incompleteSliceCount > 0) {
132
+ await persistMilestoneValidationGate(
133
+ "pass",
134
+ "none",
135
+ `remediation slices present (${incompleteSliceCount}); validation can continue`,
136
+ "",
137
+ mid,
138
+ );
139
+ return "continue";
140
+ }
90
141
 
91
142
  ctx.ui.notify(
92
143
  `Milestone ${mid} validation returned verdict=needs-remediation but no remediation slices were added. Pausing for human review.`,
@@ -96,6 +147,13 @@ async function runValidateMilestonePostCheck(
96
147
  `validate-milestone: pausing — verdict=needs-remediation with no incomplete slices for ${mid}. ` +
97
148
  `The agent must call gsd_reassess_roadmap to add remediation slices before re-validation.\n`,
98
149
  );
150
+ await persistMilestoneValidationGate(
151
+ "manual-attention",
152
+ "manual-attention",
153
+ "needs-remediation verdict without queued remediation slices",
154
+ `No incomplete slices found for ${mid} while verdict=needs-remediation`,
155
+ mid,
156
+ );
99
157
  await pauseAuto(ctx, pi);
100
158
  return "pause";
101
159
  }
@@ -158,6 +216,7 @@ export async function runPostUnitVerification(
158
216
  try {
159
217
  const effectivePrefs = loadEffectiveGSDPreferences();
160
218
  const prefs = effectivePrefs?.preferences;
219
+ const uokFlags = resolveUokFlags(prefs);
161
220
 
162
221
  // Read task plan verify field
163
222
  const { milestone: mid, slice: sid, task: tid } = parseUnitId(s.currentUnit.id);
@@ -196,6 +255,37 @@ export async function runPostUnitVerification(
196
255
  }
197
256
  }
198
257
 
258
+ if (uokFlags.gates) {
259
+ const gateRunner = new UokGateRunner();
260
+ gateRunner.register({
261
+ id: "verification-gate",
262
+ type: "verification",
263
+ execute: async () => ({
264
+ outcome: result.passed ? "pass" : "fail",
265
+ failureClass: result.runtimeErrors?.some((e) => e.blocking)
266
+ ? "execution"
267
+ : "verification",
268
+ rationale: result.passed
269
+ ? "verification checks passed"
270
+ : "verification checks failed",
271
+ findings: result.passed
272
+ ? ""
273
+ : formatFailureContext(result),
274
+ }),
275
+ });
276
+
277
+ await gateRunner.run("verification-gate", {
278
+ basePath: s.basePath,
279
+ traceId: `verification:${s.currentUnit.id}`,
280
+ turnId: s.currentUnit.id,
281
+ milestoneId: mid ?? undefined,
282
+ sliceId: sid ?? undefined,
283
+ taskId: tid ?? undefined,
284
+ unitType: s.currentUnit.type,
285
+ unitId: s.currentUnit.id,
286
+ });
287
+ }
288
+
199
289
  // Auto-fix retry preferences
200
290
  const autoFixEnabled = prefs?.verification_auto_fix !== false;
201
291
  const maxRetries =
@@ -338,6 +428,43 @@ export async function runPostUnitVerification(
338
428
  );
339
429
  }
340
430
 
431
+ if (uokFlags.gates) {
432
+ const strictMode = prefs?.enhanced_verification_strict === true;
433
+ const warnEscalated = postExecResult.status === "warn" && strictMode;
434
+ const blockingFailure = postExecResult.status === "fail" || warnEscalated;
435
+ const findings = postExecResult.checks
436
+ .filter((check) => !check.passed)
437
+ .map((check) => `[${check.category}] ${check.target}: ${check.message}`)
438
+ .join("\n");
439
+ const gateRunner = new UokGateRunner();
440
+ gateRunner.register({
441
+ id: "post-execution-checks",
442
+ type: "artifact",
443
+ execute: async () => ({
444
+ outcome: blockingFailure ? "fail" : "pass",
445
+ failureClass: postExecResult.status === "fail"
446
+ ? "artifact"
447
+ : warnEscalated
448
+ ? "policy"
449
+ : "none",
450
+ rationale: blockingFailure
451
+ ? `post-execution checks ${postExecResult.status}${warnEscalated ? " (strict)" : ""}`
452
+ : "post-execution checks passed",
453
+ findings,
454
+ }),
455
+ });
456
+ await gateRunner.run("post-execution-checks", {
457
+ basePath: s.basePath,
458
+ traceId: `verification:${s.currentUnit.id}`,
459
+ turnId: s.currentUnit.id,
460
+ milestoneId: mid,
461
+ sliceId: sid,
462
+ taskId: tid,
463
+ unitType: s.currentUnit.type,
464
+ unitId: s.currentUnit.id,
465
+ });
466
+ }
467
+
341
468
  // Check for blocking failures
342
469
  if (postExecResult.status === "fail") {
343
470
  postExecBlockingFailure = true;
@@ -102,6 +102,7 @@ function isSamePath(a: string, b: string): boolean {
102
102
  try {
103
103
  return realpathSync(a) === realpathSync(b);
104
104
  } catch (e) {
105
+ if ((e as NodeJS.ErrnoException).code === "ENOENT") return false;
105
106
  logWarning("worktree", `isSamePath failed: ${(e as Error).message}`);
106
107
  return false;
107
108
  }
@@ -202,6 +202,8 @@ import {
202
202
  import { bootstrapAutoSession, openProjectDbIfPresent, type BootstrapDeps } from "./auto-start.js";
203
203
  import { initHealthWidget } from "./health-widget.js";
204
204
  import { autoLoop, resolveAgentEnd, resolveAgentEndCancelled, _resetPendingResolve, isSessionSwitchInFlight, type LoopDeps, type ErrorContext } from "./auto-loop.js";
205
+ import { runAutoLoopWithUok } from "./uok/kernel.js";
206
+ import { resolveUokFlags } from "./uok/flags.js";
205
207
  // Slice-level parallelism (#2340)
206
208
  import { getEligibleSlices } from "./slice-parallel-eligibility.js";
207
209
  import { startSliceParallel } from "./slice-parallel-orchestrator.js";
@@ -605,11 +607,29 @@ function buildSnapshotOpts(
605
607
  continueHereFired?: boolean;
606
608
  promptCharCount?: number;
607
609
  baselineCharCount?: number;
610
+ traceId?: string;
611
+ turnId?: string;
612
+ gitAction?: "commit" | "snapshot" | "status-only";
613
+ gitPush?: boolean;
614
+ gitStatus?: "ok" | "failed";
615
+ gitError?: string;
608
616
  } & Record<string, unknown> {
617
+ const prefs = loadEffectiveGSDPreferences()?.preferences;
618
+ const uokFlags = resolveUokFlags(prefs);
609
619
  return {
610
620
  ...(s.autoStartTime > 0 ? { autoSessionKey: String(s.autoStartTime) } : {}),
611
621
  promptCharCount: s.lastPromptCharCount,
612
622
  baselineCharCount: s.lastBaselineCharCount,
623
+ traceId: s.currentTraceId ?? undefined,
624
+ turnId: s.currentTurnId ?? undefined,
625
+ ...(uokFlags.gitops
626
+ ? {
627
+ gitAction: uokFlags.gitopsTurnAction,
628
+ gitPush: uokFlags.gitopsTurnPush,
629
+ gitStatus: s.lastGitActionStatus ?? undefined,
630
+ gitError: s.lastGitActionFailure ?? undefined,
631
+ }
632
+ : {}),
613
633
  ...(s.currentUnitRouting ?? {}),
614
634
  };
615
635
  }
@@ -1513,7 +1533,13 @@ export async function startAuto(
1513
1533
  logCmuxEvent(loadEffectiveGSDPreferences()?.preferences, s.stepMode ? "Step-mode resumed." : "Auto-mode resumed.", "progress");
1514
1534
 
1515
1535
  captureProjectRootEnv(s.originalBasePath || s.basePath);
1516
- await autoLoop(ctx, pi, s, buildLoopDeps());
1536
+ await runAutoLoopWithUok({
1537
+ ctx,
1538
+ pi,
1539
+ s,
1540
+ deps: buildLoopDeps(),
1541
+ runLegacyLoop: autoLoop,
1542
+ });
1517
1543
  cleanupAfterLoopExit(ctx);
1518
1544
  return;
1519
1545
  }
@@ -1548,7 +1574,13 @@ export async function startAuto(
1548
1574
  logCmuxEvent(loadEffectiveGSDPreferences()?.preferences, requestedStepMode ? "Step-mode started." : "Auto-mode started.", "progress");
1549
1575
 
1550
1576
  // Dispatch the first unit
1551
- await autoLoop(ctx, pi, s, buildLoopDeps());
1577
+ await runAutoLoopWithUok({
1578
+ ctx,
1579
+ pi,
1580
+ s,
1581
+ deps: buildLoopDeps(),
1582
+ runLegacyLoop: autoLoop,
1583
+ });
1552
1584
  cleanupAfterLoopExit(ctx);
1553
1585
  }
1554
1586