gsd-pi 2.74.0-dev.2b524c3 → 2.74.0-dev.703eabc

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 (484) 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 +158 -4
  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 +51 -5
  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-unit-closeout.js +18 -0
  14. package/dist/resources/extensions/gsd/auto-verification.js +100 -2
  15. package/dist/resources/extensions/gsd/auto.js +36 -4
  16. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +30 -8
  17. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +45 -4
  18. package/dist/resources/extensions/gsd/commands/catalog.js +26 -1
  19. package/dist/resources/extensions/gsd/commands/handlers/ops.js +25 -0
  20. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +68 -9
  21. package/dist/resources/extensions/gsd/commands-add-tests.js +111 -0
  22. package/dist/resources/extensions/gsd/commands-backlog.js +140 -0
  23. package/dist/resources/extensions/gsd/commands-do.js +79 -0
  24. package/dist/resources/extensions/gsd/commands-extract-learnings.js +225 -0
  25. package/dist/resources/extensions/gsd/commands-maintenance.js +6 -6
  26. package/dist/resources/extensions/gsd/commands-pr-branch.js +180 -0
  27. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -1
  28. package/dist/resources/extensions/gsd/commands-session-report.js +82 -0
  29. package/dist/resources/extensions/gsd/commands-ship.js +187 -0
  30. package/dist/resources/extensions/gsd/db-writer.js +3 -5
  31. package/dist/resources/extensions/gsd/docs/preferences-reference.md +14 -1
  32. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +144 -0
  33. package/dist/resources/extensions/gsd/ecosystem/loader.js +145 -0
  34. package/dist/resources/extensions/gsd/git-service.js +49 -1
  35. package/dist/resources/extensions/gsd/graph-context.js +157 -0
  36. package/dist/resources/extensions/gsd/gsd-db.js +581 -2
  37. package/dist/resources/extensions/gsd/guided-flow.js +23 -0
  38. package/dist/resources/extensions/gsd/index.js +15 -2
  39. package/dist/resources/extensions/gsd/init-wizard.js +1 -0
  40. package/dist/resources/extensions/gsd/journal.js +27 -0
  41. package/dist/resources/extensions/gsd/md-importer.js +3 -4
  42. package/dist/resources/extensions/gsd/memory-store.js +19 -51
  43. package/dist/resources/extensions/gsd/metrics.js +19 -0
  44. package/dist/resources/extensions/gsd/milestone-validation-gates.js +13 -12
  45. package/dist/resources/extensions/gsd/native-git-bridge.js +7 -4
  46. package/dist/resources/extensions/gsd/parallel-orchestrator.js +33 -1
  47. package/dist/resources/extensions/gsd/preferences-models.js +20 -3
  48. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  49. package/dist/resources/extensions/gsd/preferences-validation.js +108 -2
  50. package/dist/resources/extensions/gsd/preferences.js +26 -0
  51. package/dist/resources/extensions/gsd/prompts/add-tests.md +35 -0
  52. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +12 -2
  53. package/dist/resources/extensions/gsd/state.js +5 -1
  54. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
  55. package/dist/resources/extensions/gsd/tools/complete-slice.js +20 -0
  56. package/dist/resources/extensions/gsd/tools/validate-milestone.js +39 -4
  57. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +3 -14
  58. package/dist/resources/extensions/gsd/triage-resolution.js +2 -5
  59. package/dist/resources/extensions/gsd/unit-ownership.js +1 -1
  60. package/dist/resources/extensions/gsd/uok/audit-toggle.js +7 -0
  61. package/dist/resources/extensions/gsd/uok/audit.js +40 -0
  62. package/dist/resources/extensions/gsd/uok/contracts.js +1 -0
  63. package/dist/resources/extensions/gsd/uok/execution-graph.js +179 -0
  64. package/dist/resources/extensions/gsd/uok/flags.js +29 -0
  65. package/dist/resources/extensions/gsd/uok/gate-runner.js +109 -0
  66. package/dist/resources/extensions/gsd/uok/gitops.js +53 -0
  67. package/dist/resources/extensions/gsd/uok/kernel.js +80 -0
  68. package/dist/resources/extensions/gsd/uok/loop-adapter.js +133 -0
  69. package/dist/resources/extensions/gsd/uok/model-policy.js +66 -0
  70. package/dist/resources/extensions/gsd/uok/plan-v2.js +132 -0
  71. package/dist/resources/extensions/gsd/workflow-logger.js +22 -0
  72. package/dist/resources/extensions/gsd/workflow-manifest.js +8 -69
  73. package/dist/resources/extensions/gsd/workflow-migration.js +21 -22
  74. package/dist/resources/extensions/gsd/workflow-projections.js +4 -1
  75. package/dist/resources/extensions/gsd/workflow-reconcile.js +14 -11
  76. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  77. package/dist/tsconfig.extensions.tsbuildinfo +1 -0
  78. package/dist/web/standalone/.next/BUILD_ID +1 -1
  79. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  80. package/dist/web/standalone/.next/build-manifest.json +2 -2
  81. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  82. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  83. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  91. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  100. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
  103. package/dist/web/standalone/.next/server/app/index.html +1 -1
  104. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  111. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  112. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  114. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  115. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  116. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  117. package/package.json +3 -2
  118. package/packages/daemon/package.json +2 -2
  119. package/packages/mcp-server/dist/index.d.ts +3 -0
  120. package/packages/mcp-server/dist/index.d.ts.map +1 -1
  121. package/packages/mcp-server/dist/index.js +3 -0
  122. package/packages/mcp-server/dist/index.js.map +1 -1
  123. package/packages/mcp-server/dist/readers/graph.d.ts +87 -0
  124. package/packages/mcp-server/dist/readers/graph.d.ts.map +1 -0
  125. package/packages/mcp-server/dist/readers/graph.js +655 -0
  126. package/packages/mcp-server/dist/readers/graph.js.map +1 -0
  127. package/packages/mcp-server/dist/readers/index.d.ts +2 -0
  128. package/packages/mcp-server/dist/readers/index.d.ts.map +1 -1
  129. package/packages/mcp-server/dist/readers/index.js +1 -0
  130. package/packages/mcp-server/dist/readers/index.js.map +1 -1
  131. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  132. package/packages/mcp-server/dist/server.js +65 -0
  133. package/packages/mcp-server/dist/server.js.map +1 -1
  134. package/packages/mcp-server/package.json +2 -2
  135. package/packages/mcp-server/src/index.ts +15 -0
  136. package/packages/mcp-server/src/readers/graph.test.ts +604 -0
  137. package/packages/mcp-server/src/readers/graph.ts +855 -0
  138. package/packages/mcp-server/src/readers/index.ts +12 -0
  139. package/packages/mcp-server/src/server.ts +83 -0
  140. package/packages/mcp-server/tsconfig.json +1 -0
  141. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -0
  142. package/packages/native/package.json +2 -2
  143. package/packages/native/tsconfig.tsbuildinfo +1 -0
  144. package/packages/pi-agent-core/package.json +1 -1
  145. package/packages/pi-agent-core/tsconfig.json +1 -0
  146. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -0
  147. package/packages/pi-ai/dist/index.d.ts +1 -9
  148. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  149. package/packages/pi-ai/dist/index.js +1 -9
  150. package/packages/pi-ai/dist/index.js.map +1 -1
  151. package/packages/pi-ai/dist/models/capability-patches.d.ts +19 -0
  152. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -0
  153. package/packages/pi-ai/dist/models/capability-patches.js +36 -0
  154. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -0
  155. package/packages/pi-ai/dist/{models.custom.d.ts → models/custom.d.ts} +1 -1
  156. package/packages/pi-ai/dist/models/custom.d.ts.map +1 -0
  157. package/packages/pi-ai/dist/{models.custom.js → models/custom.js} +4 -4
  158. package/packages/pi-ai/dist/models/custom.js.map +1 -0
  159. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +1482 -0
  160. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -0
  161. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +1484 -0
  162. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -0
  163. package/packages/pi-ai/dist/models/generated/anthropic.d.ts +377 -0
  164. package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -0
  165. package/packages/pi-ai/dist/models/generated/anthropic.js +379 -0
  166. package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -0
  167. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts +700 -0
  168. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts.map +1 -0
  169. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js +702 -0
  170. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js.map +1 -0
  171. package/packages/pi-ai/dist/models/generated/cerebras.d.ts +71 -0
  172. package/packages/pi-ai/dist/models/generated/cerebras.d.ts.map +1 -0
  173. package/packages/pi-ai/dist/models/generated/cerebras.js +73 -0
  174. package/packages/pi-ai/dist/models/generated/cerebras.js.map +1 -0
  175. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts +590 -0
  176. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts.map +1 -0
  177. package/packages/pi-ai/dist/models/generated/github-copilot.js +444 -0
  178. package/packages/pi-ai/dist/models/generated/github-copilot.js.map +1 -0
  179. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +156 -0
  180. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -0
  181. package/packages/pi-ai/dist/models/generated/google-antigravity.js +158 -0
  182. package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -0
  183. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts +105 -0
  184. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts.map +1 -0
  185. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js +107 -0
  186. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js.map +1 -0
  187. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts +207 -0
  188. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts.map +1 -0
  189. package/packages/pi-ai/dist/models/generated/google-vertex.js +209 -0
  190. package/packages/pi-ai/dist/models/generated/google-vertex.js.map +1 -0
  191. package/packages/pi-ai/dist/models/generated/google.d.ts +462 -0
  192. package/packages/pi-ai/dist/models/generated/google.d.ts.map +1 -0
  193. package/packages/pi-ai/dist/models/generated/google.js +464 -0
  194. package/packages/pi-ai/dist/models/generated/google.js.map +1 -0
  195. package/packages/pi-ai/dist/models/generated/groq.d.ts +309 -0
  196. package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -0
  197. package/packages/pi-ai/dist/models/generated/groq.js +311 -0
  198. package/packages/pi-ai/dist/models/generated/groq.js.map +1 -0
  199. package/packages/pi-ai/dist/models/generated/huggingface.d.ts +383 -0
  200. package/packages/pi-ai/dist/models/generated/huggingface.d.ts.map +1 -0
  201. package/packages/pi-ai/dist/models/generated/huggingface.js +347 -0
  202. package/packages/pi-ai/dist/models/generated/huggingface.js.map +1 -0
  203. package/packages/pi-ai/dist/{models.generated.d.ts → models/generated/index.d.ts} +1 -1
  204. package/packages/pi-ai/dist/{models.generated.d.ts.map → models/generated/index.d.ts.map} +1 -1
  205. package/packages/pi-ai/dist/models/generated/index.js +51 -0
  206. package/packages/pi-ai/dist/models/generated/index.js.map +1 -0
  207. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts +37 -0
  208. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts.map +1 -0
  209. package/packages/pi-ai/dist/models/generated/kimi-coding.js +39 -0
  210. package/packages/pi-ai/dist/models/generated/kimi-coding.js.map +1 -0
  211. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts +105 -0
  212. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts.map +1 -0
  213. package/packages/pi-ai/dist/models/generated/minimax-cn.js +107 -0
  214. package/packages/pi-ai/dist/models/generated/minimax-cn.js.map +1 -0
  215. package/packages/pi-ai/dist/models/generated/minimax.d.ts +105 -0
  216. package/packages/pi-ai/dist/models/generated/minimax.d.ts.map +1 -0
  217. package/packages/pi-ai/dist/models/generated/minimax.js +107 -0
  218. package/packages/pi-ai/dist/models/generated/minimax.js.map +1 -0
  219. package/packages/pi-ai/dist/models/generated/mistral.d.ts +445 -0
  220. package/packages/pi-ai/dist/models/generated/mistral.d.ts.map +1 -0
  221. package/packages/pi-ai/dist/models/generated/mistral.js +447 -0
  222. package/packages/pi-ai/dist/models/generated/mistral.js.map +1 -0
  223. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +139 -0
  224. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -0
  225. package/packages/pi-ai/dist/models/generated/openai-codex.js +141 -0
  226. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -0
  227. package/packages/pi-ai/dist/models/generated/openai.d.ts +700 -0
  228. package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -0
  229. package/packages/pi-ai/dist/models/generated/openai.js +702 -0
  230. package/packages/pi-ai/dist/models/generated/openai.js.map +1 -0
  231. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts +122 -0
  232. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts.map +1 -0
  233. package/packages/pi-ai/dist/models/generated/opencode-go.js +124 -0
  234. package/packages/pi-ai/dist/models/generated/opencode-go.js.map +1 -0
  235. package/packages/pi-ai/dist/models/generated/opencode.d.ts +530 -0
  236. package/packages/pi-ai/dist/models/generated/opencode.d.ts.map +1 -0
  237. package/packages/pi-ai/dist/models/generated/opencode.js +532 -0
  238. package/packages/pi-ai/dist/models/generated/opencode.js.map +1 -0
  239. package/packages/pi-ai/dist/models/generated/openrouter.d.ts +4270 -0
  240. package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -0
  241. package/packages/pi-ai/dist/models/generated/openrouter.js +4272 -0
  242. package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -0
  243. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts +2604 -0
  244. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts.map +1 -0
  245. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js +2606 -0
  246. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js.map +1 -0
  247. package/packages/pi-ai/dist/models/generated/xai.d.ts +411 -0
  248. package/packages/pi-ai/dist/models/generated/xai.d.ts.map +1 -0
  249. package/packages/pi-ai/dist/models/generated/xai.js +413 -0
  250. package/packages/pi-ai/dist/models/generated/xai.js.map +1 -0
  251. package/packages/pi-ai/dist/models/generated/zai.d.ts +276 -0
  252. package/packages/pi-ai/dist/models/generated/zai.d.ts.map +1 -0
  253. package/packages/pi-ai/dist/models/generated/zai.js +239 -0
  254. package/packages/pi-ai/dist/models/generated/zai.js.map +1 -0
  255. package/packages/pi-ai/dist/models/index.d.ts +27 -0
  256. package/packages/pi-ai/dist/models/index.d.ts.map +1 -0
  257. package/packages/pi-ai/dist/models/index.js +80 -0
  258. package/packages/pi-ai/dist/models/index.js.map +1 -0
  259. package/packages/pi-ai/dist/models.d.ts +1 -36
  260. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  261. package/packages/pi-ai/dist/models.generated.test.js +1 -2
  262. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  263. package/packages/pi-ai/dist/models.js +3 -112
  264. package/packages/pi-ai/dist/models.js.map +1 -1
  265. package/packages/pi-ai/dist/models.test.js +6 -5
  266. package/packages/pi-ai/dist/models.test.js.map +1 -1
  267. package/packages/pi-ai/package.json +1 -1
  268. package/packages/pi-ai/scripts/generate-models.ts +74 -40
  269. package/packages/pi-ai/src/index.ts +1 -9
  270. package/packages/pi-ai/src/models/capability-patches.ts +40 -0
  271. package/packages/pi-ai/src/{models.custom.ts → models/custom.ts} +4 -4
  272. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +1486 -0
  273. package/packages/pi-ai/src/models/generated/anthropic.ts +381 -0
  274. package/packages/pi-ai/src/models/generated/azure-openai-responses.ts +704 -0
  275. package/packages/pi-ai/src/models/generated/cerebras.ts +75 -0
  276. package/packages/pi-ai/src/models/generated/github-copilot.ts +446 -0
  277. package/packages/pi-ai/src/models/generated/google-antigravity.ts +160 -0
  278. package/packages/pi-ai/src/models/generated/google-gemini-cli.ts +109 -0
  279. package/packages/pi-ai/src/models/generated/google-vertex.ts +211 -0
  280. package/packages/pi-ai/src/models/generated/google.ts +466 -0
  281. package/packages/pi-ai/src/models/generated/groq.ts +313 -0
  282. package/packages/pi-ai/src/models/generated/huggingface.ts +349 -0
  283. package/packages/pi-ai/src/models/generated/index.ts +52 -0
  284. package/packages/pi-ai/src/models/generated/kimi-coding.ts +41 -0
  285. package/packages/pi-ai/src/models/generated/minimax-cn.ts +109 -0
  286. package/packages/pi-ai/src/models/generated/minimax.ts +109 -0
  287. package/packages/pi-ai/src/models/generated/mistral.ts +449 -0
  288. package/packages/pi-ai/src/models/generated/openai-codex.ts +143 -0
  289. package/packages/pi-ai/src/models/generated/openai.ts +704 -0
  290. package/packages/pi-ai/src/models/generated/opencode-go.ts +126 -0
  291. package/packages/pi-ai/src/models/generated/opencode.ts +534 -0
  292. package/packages/pi-ai/src/models/generated/openrouter.ts +4274 -0
  293. package/packages/pi-ai/src/models/generated/vercel-ai-gateway.ts +2608 -0
  294. package/packages/pi-ai/src/models/generated/xai.ts +415 -0
  295. package/packages/pi-ai/src/models/generated/zai.ts +241 -0
  296. package/packages/pi-ai/src/models/index.ts +106 -0
  297. package/packages/pi-ai/src/models.generated.test.ts +1 -2
  298. package/packages/pi-ai/src/models.test.ts +6 -5
  299. package/packages/pi-ai/src/models.ts +3 -153
  300. package/packages/pi-ai/tsconfig.json +1 -0
  301. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -0
  302. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  303. package/packages/pi-coding-agent/dist/core/agent-session.js +8 -2
  304. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  305. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +472 -0
  306. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  307. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts +2 -0
  308. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts.map +1 -0
  309. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js +52 -0
  310. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js.map +1 -0
  311. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  312. package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
  313. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  314. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +11 -0
  315. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  316. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +1 -0
  317. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  318. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +23 -9
  319. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  320. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts +11 -0
  321. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -0
  322. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +47 -0
  323. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -0
  324. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  325. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +51 -8
  326. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  327. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  328. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +22 -22
  329. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  330. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  331. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +232 -18
  332. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  333. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts +2 -0
  334. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts.map +1 -0
  335. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +38 -0
  336. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -0
  337. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +13 -0
  338. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  339. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +53 -6
  340. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  341. package/packages/pi-coding-agent/src/core/agent-session.ts +12 -6
  342. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +612 -0
  343. package/packages/pi-coding-agent/src/core/model-registry-env-fallback.test.ts +59 -0
  344. package/packages/pi-coding-agent/src/core/model-registry.ts +2 -1
  345. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +19 -0
  346. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +25 -10
  347. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +67 -0
  348. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +66 -7
  349. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +23 -26
  350. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +298 -41
  351. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +44 -0
  352. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +73 -6
  353. package/packages/pi-coding-agent/src/types/ambient-modules.d.ts +69 -0
  354. package/packages/pi-coding-agent/tsconfig.json +3 -2
  355. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -0
  356. package/packages/pi-tui/package.json +1 -1
  357. package/packages/pi-tui/tsconfig.json +1 -0
  358. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -0
  359. package/packages/rpc-client/package.json +1 -1
  360. package/packages/rpc-client/tsconfig.json +1 -0
  361. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -0
  362. package/src/resources/extensions/gsd/activity-log.ts +21 -0
  363. package/src/resources/extensions/gsd/auto/detect-stuck.ts +12 -4
  364. package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -0
  365. package/src/resources/extensions/gsd/auto/loop.ts +159 -10
  366. package/src/resources/extensions/gsd/auto/phases.ts +191 -4
  367. package/src/resources/extensions/gsd/auto/session.ts +10 -0
  368. package/src/resources/extensions/gsd/auto-dispatch.ts +16 -6
  369. package/src/resources/extensions/gsd/auto-model-selection.ts +66 -5
  370. package/src/resources/extensions/gsd/auto-post-unit.ts +238 -18
  371. package/src/resources/extensions/gsd/auto-prompts.ts +13 -0
  372. package/src/resources/extensions/gsd/auto-unit-closeout.ts +25 -1
  373. package/src/resources/extensions/gsd/auto-verification.ts +129 -2
  374. package/src/resources/extensions/gsd/auto.ts +41 -2
  375. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +38 -8
  376. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +56 -3
  377. package/src/resources/extensions/gsd/commands/catalog.ts +26 -1
  378. package/src/resources/extensions/gsd/commands/handlers/ops.ts +25 -0
  379. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +74 -9
  380. package/src/resources/extensions/gsd/commands-add-tests.ts +137 -0
  381. package/src/resources/extensions/gsd/commands-backlog.ts +182 -0
  382. package/src/resources/extensions/gsd/commands-do.ts +109 -0
  383. package/src/resources/extensions/gsd/commands-extract-learnings.ts +304 -0
  384. package/src/resources/extensions/gsd/commands-maintenance.ts +6 -6
  385. package/src/resources/extensions/gsd/commands-pr-branch.ts +234 -0
  386. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -1
  387. package/src/resources/extensions/gsd/commands-session-report.ts +101 -0
  388. package/src/resources/extensions/gsd/commands-ship.ts +219 -0
  389. package/src/resources/extensions/gsd/db-writer.ts +3 -5
  390. package/src/resources/extensions/gsd/docs/preferences-reference.md +14 -1
  391. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +228 -0
  392. package/src/resources/extensions/gsd/ecosystem/loader.ts +201 -0
  393. package/src/resources/extensions/gsd/git-service.ts +68 -0
  394. package/src/resources/extensions/gsd/graph-context.ts +212 -0
  395. package/src/resources/extensions/gsd/gsd-db.ts +788 -3
  396. package/src/resources/extensions/gsd/guided-flow.ts +32 -0
  397. package/src/resources/extensions/gsd/index.ts +18 -2
  398. package/src/resources/extensions/gsd/init-wizard.ts +3 -2
  399. package/src/resources/extensions/gsd/journal.ts +30 -0
  400. package/src/resources/extensions/gsd/md-importer.ts +3 -5
  401. package/src/resources/extensions/gsd/memory-store.ts +31 -62
  402. package/src/resources/extensions/gsd/metrics.ts +26 -0
  403. package/src/resources/extensions/gsd/milestone-validation-gates.ts +13 -14
  404. package/src/resources/extensions/gsd/native-git-bridge.ts +11 -12
  405. package/src/resources/extensions/gsd/parallel-orchestrator.ts +40 -1
  406. package/src/resources/extensions/gsd/preferences-models.ts +20 -3
  407. package/src/resources/extensions/gsd/preferences-types.ts +32 -0
  408. package/src/resources/extensions/gsd/preferences-validation.ts +107 -2
  409. package/src/resources/extensions/gsd/preferences.ts +28 -0
  410. package/src/resources/extensions/gsd/prompts/add-tests.md +35 -0
  411. package/src/resources/extensions/gsd/session-lock.ts +14 -2
  412. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +20 -1
  413. package/src/resources/extensions/gsd/state.ts +9 -2
  414. package/src/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
  415. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +7 -3
  416. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +20 -0
  417. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +7 -3
  418. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +6 -2
  419. package/src/resources/extensions/gsd/tests/commands-backlog.test.ts +158 -0
  420. package/src/resources/extensions/gsd/tests/commands-do.test.ts +127 -0
  421. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +340 -0
  422. package/src/resources/extensions/gsd/tests/commands-pr-branch.test.ts +68 -0
  423. package/src/resources/extensions/gsd/tests/commands-session-report.test.ts +82 -0
  424. package/src/resources/extensions/gsd/tests/commands-ship.test.ts +71 -0
  425. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +14 -0
  426. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
  427. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  428. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +154 -0
  429. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +10 -7
  430. package/src/resources/extensions/gsd/tests/graph-context.test.ts +337 -0
  431. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
  432. package/src/resources/extensions/gsd/tests/health-widget.test.ts +1 -1
  433. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +68 -1
  434. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -2
  435. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -3
  436. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +140 -0
  437. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  438. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +2 -1
  439. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +40 -1
  440. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +1 -1
  441. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +180 -0
  442. package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -5
  443. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +101 -0
  444. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +85 -0
  445. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +69 -0
  446. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +39 -0
  447. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +70 -0
  448. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +85 -0
  449. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +35 -0
  450. package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +89 -0
  451. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +167 -0
  452. package/src/resources/extensions/gsd/tests/uok-preferences.test.ts +42 -0
  453. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +39 -0
  454. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +223 -0
  455. package/src/resources/extensions/gsd/tools/complete-slice.ts +26 -0
  456. package/src/resources/extensions/gsd/tools/validate-milestone.ts +48 -3
  457. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +3 -11
  458. package/src/resources/extensions/gsd/triage-resolution.ts +2 -7
  459. package/src/resources/extensions/gsd/types.ts +14 -1
  460. package/src/resources/extensions/gsd/unit-ownership.ts +2 -2
  461. package/src/resources/extensions/gsd/uok/audit-toggle.ts +9 -0
  462. package/src/resources/extensions/gsd/uok/audit.ts +51 -0
  463. package/src/resources/extensions/gsd/uok/contracts.ts +135 -0
  464. package/src/resources/extensions/gsd/uok/execution-graph.ts +241 -0
  465. package/src/resources/extensions/gsd/uok/flags.ts +45 -0
  466. package/src/resources/extensions/gsd/uok/gate-runner.ts +146 -0
  467. package/src/resources/extensions/gsd/uok/gitops.ts +75 -0
  468. package/src/resources/extensions/gsd/uok/kernel.ts +105 -0
  469. package/src/resources/extensions/gsd/uok/loop-adapter.ts +162 -0
  470. package/src/resources/extensions/gsd/uok/model-policy.ts +112 -0
  471. package/src/resources/extensions/gsd/uok/plan-v2.ts +156 -0
  472. package/src/resources/extensions/gsd/workflow-logger.ts +27 -1
  473. package/src/resources/extensions/gsd/workflow-manifest.ts +9 -104
  474. package/src/resources/extensions/gsd/workflow-migration.ts +21 -29
  475. package/src/resources/extensions/gsd/workflow-projections.ts +8 -1
  476. package/src/resources/extensions/gsd/workflow-reconcile.ts +15 -15
  477. package/src/resources/extensions/ttsr/ttsr-manager.ts +10 -5
  478. package/packages/pi-ai/dist/models.custom.d.ts.map +0 -1
  479. package/packages/pi-ai/dist/models.custom.js.map +0 -1
  480. package/packages/pi-ai/dist/models.generated.js +0 -14343
  481. package/packages/pi-ai/dist/models.generated.js.map +0 -1
  482. package/packages/pi-ai/src/models.generated.ts +0 -14345
  483. /package/dist/web/standalone/.next/static/{YzIEI9sxJy4t5xgClF08g → 3U-oZ5FT59BM7sm2GInic}/_buildManifest.js +0 -0
  484. /package/dist/web/standalone/.next/static/{YzIEI9sxJy4t5xgClF08g → 3U-oZ5FT59BM7sm2GInic}/_ssgManifest.js +0 -0
@@ -22,7 +22,12 @@ import {
22
22
  type GSDSkillRule,
23
23
  } from "./preferences-types.js";
24
24
 
25
- const VALID_TOKEN_PROFILES = new Set<TokenProfile>(["budget", "balanced", "quality"]);
25
+ const VALID_TOKEN_PROFILES = new Set<TokenProfile>(["budget", "balanced", "quality", "burn-max"]);
26
+ const VALID_UOK_TURN_ACTIONS = new Set<"commit" | "snapshot" | "status-only">([
27
+ "commit",
28
+ "snapshot",
29
+ "status-only",
30
+ ]);
26
31
 
27
32
  export function validatePreferences(preferences: GSDPreferences): {
28
33
  preferences: GSDPreferences;
@@ -161,12 +166,112 @@ export function validatePreferences(preferences: GSDPreferences): {
161
166
  }
162
167
  }
163
168
 
169
+ // ─── UOK Flags ──────────────────────────────────────────────────────
170
+ if (preferences.uok !== undefined) {
171
+ if (typeof preferences.uok === "object" && preferences.uok !== null) {
172
+ const raw = preferences.uok as Record<string, unknown>;
173
+ const valid: NonNullable<GSDPreferences["uok"]> = {};
174
+
175
+ if (raw.enabled !== undefined) {
176
+ if (typeof raw.enabled === "boolean") valid.enabled = raw.enabled;
177
+ else errors.push("uok.enabled must be a boolean");
178
+ }
179
+
180
+ const parseEnabledBlock = (
181
+ key: "legacy_fallback" | "gates" | "model_policy" | "execution_graph" | "audit_unified" | "plan_v2",
182
+ ): void => {
183
+ const value = raw[key];
184
+ if (value === undefined) return;
185
+ if (typeof value !== "object" || value === null) {
186
+ errors.push(`uok.${key} must be an object`);
187
+ return;
188
+ }
189
+ const block = value as Record<string, unknown>;
190
+ const parsed: { enabled?: boolean } = {};
191
+ if (block.enabled !== undefined) {
192
+ if (typeof block.enabled === "boolean") parsed.enabled = block.enabled;
193
+ else errors.push(`uok.${key}.enabled must be a boolean`);
194
+ }
195
+ const unknown = Object.keys(block).filter((k) => k !== "enabled");
196
+ for (const unk of unknown) {
197
+ warnings.push(`unknown uok.${key} key "${unk}" — ignored`);
198
+ }
199
+ if (Object.keys(parsed).length > 0) {
200
+ valid[key] = parsed;
201
+ }
202
+ };
203
+
204
+ parseEnabledBlock("legacy_fallback");
205
+ parseEnabledBlock("gates");
206
+ parseEnabledBlock("model_policy");
207
+ parseEnabledBlock("execution_graph");
208
+ parseEnabledBlock("audit_unified");
209
+ parseEnabledBlock("plan_v2");
210
+
211
+ if (raw.gitops !== undefined) {
212
+ if (typeof raw.gitops !== "object" || raw.gitops === null) {
213
+ errors.push("uok.gitops must be an object");
214
+ } else {
215
+ const gitops = raw.gitops as Record<string, unknown>;
216
+ const parsed: NonNullable<NonNullable<GSDPreferences["uok"]>["gitops"]> = {};
217
+ if (gitops.enabled !== undefined) {
218
+ if (typeof gitops.enabled === "boolean") parsed.enabled = gitops.enabled;
219
+ else errors.push("uok.gitops.enabled must be a boolean");
220
+ }
221
+ if (gitops.turn_action !== undefined) {
222
+ if (
223
+ typeof gitops.turn_action === "string" &&
224
+ VALID_UOK_TURN_ACTIONS.has(gitops.turn_action as "commit" | "snapshot" | "status-only")
225
+ ) {
226
+ parsed.turn_action = gitops.turn_action as "commit" | "snapshot" | "status-only";
227
+ } else {
228
+ errors.push("uok.gitops.turn_action must be one of: commit, snapshot, status-only");
229
+ }
230
+ }
231
+ if (gitops.turn_push !== undefined) {
232
+ if (typeof gitops.turn_push === "boolean") parsed.turn_push = gitops.turn_push;
233
+ else errors.push("uok.gitops.turn_push must be a boolean");
234
+ }
235
+ const unknown = Object.keys(gitops).filter((k) => !["enabled", "turn_action", "turn_push"].includes(k));
236
+ for (const unk of unknown) {
237
+ warnings.push(`unknown uok.gitops key "${unk}" — ignored`);
238
+ }
239
+ if (Object.keys(parsed).length > 0) {
240
+ valid.gitops = parsed;
241
+ }
242
+ }
243
+ }
244
+
245
+ const knownUokKeys = new Set([
246
+ "enabled",
247
+ "legacy_fallback",
248
+ "gates",
249
+ "model_policy",
250
+ "execution_graph",
251
+ "gitops",
252
+ "audit_unified",
253
+ "plan_v2",
254
+ ]);
255
+ for (const key of Object.keys(raw)) {
256
+ if (!knownUokKeys.has(key)) {
257
+ warnings.push(`unknown uok key "${key}" — ignored`);
258
+ }
259
+ }
260
+
261
+ if (Object.keys(valid).length > 0) {
262
+ validated.uok = valid;
263
+ }
264
+ } else {
265
+ errors.push("uok must be an object");
266
+ }
267
+ }
268
+
164
269
  // ─── Token Profile ─────────────────────────────────────────────────
165
270
  if (preferences.token_profile !== undefined) {
166
271
  if (typeof preferences.token_profile === "string" && VALID_TOKEN_PROFILES.has(preferences.token_profile as TokenProfile)) {
167
272
  validated.token_profile = preferences.token_profile as TokenProfile;
168
273
  } else {
169
- errors.push(`token_profile must be one of: budget, balanced, quality`);
274
+ errors.push(`token_profile must be one of: budget, balanced, quality, burn-max`);
170
275
  }
171
276
  }
172
277
 
@@ -50,6 +50,8 @@ export type {
50
50
  AutoSupervisorConfig,
51
51
  RemoteQuestionsConfig,
52
52
  CmuxPreferences,
53
+ UokTurnActionMode,
54
+ UokPreferences,
53
55
  CodebaseMapPreferences,
54
56
  GSDPreferences,
55
57
  LoadedGSDPreferences,
@@ -378,6 +380,32 @@ function mergePreferences(base: GSDPreferences, override: GSDPreferences): GSDPr
378
380
  dynamic_routing: (base.dynamic_routing || override.dynamic_routing)
379
381
  ? { ...(base.dynamic_routing ?? {}), ...(override.dynamic_routing ?? {}) } as DynamicRoutingConfig
380
382
  : undefined,
383
+ uok: (base.uok || override.uok)
384
+ ? {
385
+ enabled: override.uok?.enabled ?? base.uok?.enabled,
386
+ legacy_fallback: (base.uok?.legacy_fallback || override.uok?.legacy_fallback)
387
+ ? { ...(base.uok?.legacy_fallback ?? {}), ...(override.uok?.legacy_fallback ?? {}) }
388
+ : undefined,
389
+ gates: (base.uok?.gates || override.uok?.gates)
390
+ ? { ...(base.uok?.gates ?? {}), ...(override.uok?.gates ?? {}) }
391
+ : undefined,
392
+ model_policy: (base.uok?.model_policy || override.uok?.model_policy)
393
+ ? { ...(base.uok?.model_policy ?? {}), ...(override.uok?.model_policy ?? {}) }
394
+ : undefined,
395
+ execution_graph: (base.uok?.execution_graph || override.uok?.execution_graph)
396
+ ? { ...(base.uok?.execution_graph ?? {}), ...(override.uok?.execution_graph ?? {}) }
397
+ : undefined,
398
+ gitops: (base.uok?.gitops || override.uok?.gitops)
399
+ ? { ...(base.uok?.gitops ?? {}), ...(override.uok?.gitops ?? {}) }
400
+ : undefined,
401
+ audit_unified: (base.uok?.audit_unified || override.uok?.audit_unified)
402
+ ? { ...(base.uok?.audit_unified ?? {}), ...(override.uok?.audit_unified ?? {}) }
403
+ : undefined,
404
+ plan_v2: (base.uok?.plan_v2 || override.uok?.plan_v2)
405
+ ? { ...(base.uok?.plan_v2 ?? {}), ...(override.uok?.plan_v2 ?? {}) }
406
+ : undefined,
407
+ }
408
+ : undefined,
381
409
  token_profile: override.token_profile ?? base.token_profile,
382
410
  phases: (base.phases || override.phases)
383
411
  ? { ...(base.phases ?? {}), ...(override.phases ?? {}) }
@@ -0,0 +1,35 @@
1
+ You are generating tests for recently completed GSD work.
2
+
3
+ ## Slice: {{sliceId}} — {{sliceTitle}}
4
+
5
+ ### Summary
6
+
7
+ {{sliceSummary}}
8
+
9
+ ### Existing Test Patterns
10
+
11
+ {{existingTestPatterns}}
12
+
13
+ ## Working Directory
14
+
15
+ `{{workingDirectory}}`
16
+
17
+ ## Instructions
18
+
19
+ 1. Read the slice summary above to understand what was built
20
+ 2. Identify the source files that were created or modified for this slice
21
+ 3. Read the implementation code to understand behavior, edge cases, and error paths
22
+ 4. Write comprehensive tests following the project's existing test patterns and framework
23
+ 5. Run the tests to verify they pass
24
+ 6. Fix any failures
25
+
26
+ ### Rules
27
+
28
+ - Follow the project's existing test patterns (framework, assertions, file structure)
29
+ - Test behavior, not implementation details
30
+ - Cover: happy path, edge cases, error conditions, boundary values
31
+ - Do NOT modify implementation files — only create or update test files
32
+ - Name test files consistently with the project's conventions
33
+ - Keep tests focused and readable
34
+
35
+ {{skillActivation}}
@@ -52,6 +52,18 @@ export interface SessionLockStatus {
52
52
  recovered?: boolean;
53
53
  }
54
54
 
55
+ interface ProperLockfileApi {
56
+ lockSync(
57
+ path: string,
58
+ options?: {
59
+ realpath?: boolean;
60
+ stale?: number;
61
+ update?: number;
62
+ onCompromised?: () => void;
63
+ },
64
+ ): () => void;
65
+ }
66
+
55
67
  // ─── Module State ───────────────────────────────────────────────────────────
56
68
 
57
69
  /** Release function from proper-lockfile — calling it releases the OS lock. */
@@ -277,9 +289,9 @@ export function acquireSessionLock(basePath: string): SessionLockResult {
277
289
  unitStartedAt: new Date().toISOString(),
278
290
  };
279
291
 
280
- let lockfile: typeof import("proper-lockfile");
292
+ let lockfile: ProperLockfileApi;
281
293
  try {
282
- lockfile = _require("proper-lockfile") as typeof import("proper-lockfile");
294
+ lockfile = _require("proper-lockfile") as ProperLockfileApi;
283
295
  } catch {
284
296
  // proper-lockfile not available — fall back to PID-based check
285
297
  return acquireFallbackLock(basePath, lp, lockData);
@@ -32,6 +32,7 @@ import {
32
32
  } from "./session-status-io.js";
33
33
  import { hasFileConflict } from "./slice-parallel-conflict.js";
34
34
  import { getErrorMessage } from "./error-utils.js";
35
+ import { selectConflictFreeBatch } from "./uok/execution-graph.js";
35
36
 
36
37
  // ─── Types ─────────────────────────────────────────────────────────────────
37
38
 
@@ -61,6 +62,7 @@ export interface SliceOrchestratorState {
61
62
  export interface StartSliceParallelOpts {
62
63
  maxWorkers?: number;
63
64
  budgetCeiling?: number;
65
+ useExecutionGraph?: boolean;
64
66
  }
65
67
 
66
68
  // ─── Module State ──────────────────────────────────────────────────────────
@@ -118,7 +120,12 @@ export async function startSliceParallel(
118
120
  const errors: Array<{ sid: string; error: string }> = [];
119
121
 
120
122
  // Filter out conflicting slices (conservative: check all pairs)
121
- const safeSlices = filterConflictingSlices(basePath, milestoneId, eligibleSlices);
123
+ const safeSlices = filterConflictingSlices(
124
+ basePath,
125
+ milestoneId,
126
+ eligibleSlices,
127
+ opts.useExecutionGraph === true,
128
+ );
122
129
 
123
130
  // Limit to maxWorkers
124
131
  const toSpawn = safeSlices.slice(0, maxWorkers);
@@ -245,7 +252,19 @@ function filterConflictingSlices(
245
252
  basePath: string,
246
253
  milestoneId: string,
247
254
  slices: Array<{ id: string }>,
255
+ useExecutionGraph: boolean,
248
256
  ): Array<{ id: string }> {
257
+ if (useExecutionGraph) {
258
+ const selectedIds = selectConflictFreeBatch({
259
+ orderedIds: slices.map((slice) => slice.id),
260
+ maxParallel: slices.length,
261
+ hasConflict: (candidate, existing) =>
262
+ hasFileConflict(basePath, milestoneId, candidate, existing),
263
+ });
264
+ const selected = new Set(selectedIds);
265
+ return slices.filter((slice) => selected.has(slice.id));
266
+ }
267
+
249
268
  const safe: Array<{ id: string }> = [];
250
269
 
251
270
  for (const candidate of slices) {
@@ -345,8 +345,15 @@ function reconcileDiskToDb(basePath: string): MilestoneRow[] {
345
345
  const dbSliceIds = new Set(dbSlices.map(s => s.id));
346
346
 
347
347
  let roadmapContent: string;
348
- try { roadmapContent = readFileSync(roadmapPath, "utf-8"); }
349
- catch { continue; }
348
+ try {
349
+ roadmapContent = readFileSync(roadmapPath, "utf-8");
350
+ } catch (err) {
351
+ logWarning("state", "reconcileDiskToDb: roadmap read failed, skipping milestone", {
352
+ mid,
353
+ error: (err as Error).message,
354
+ });
355
+ continue;
356
+ }
350
357
 
351
358
  const parsed = parseRoadmap(roadmapContent);
352
359
  for (const s of parsed.slices) {
@@ -39,6 +39,24 @@ dynamic_routing:
39
39
  budget_pressure:
40
40
  cross_provider:
41
41
  hooks:
42
+ uok:
43
+ enabled: true
44
+ legacy_fallback:
45
+ enabled: false
46
+ gates:
47
+ enabled: false
48
+ model_policy:
49
+ enabled: false
50
+ execution_graph:
51
+ enabled: false
52
+ gitops:
53
+ enabled: false
54
+ turn_action: status-only
55
+ turn_push: false
56
+ audit_unified:
57
+ enabled: false
58
+ plan_v2:
59
+ enabled: false
42
60
  auto_visualize:
43
61
  auto_report:
44
62
  parallel:
@@ -1267,7 +1267,7 @@ test("auto-loop.ts barrel re-exports autoLoop, runUnit, and resolveAgentEnd", ()
1267
1267
  );
1268
1268
  });
1269
1269
 
1270
- test("auto.ts startAuto calls autoLoop (not dispatchNextUnit as first dispatch)", () => {
1270
+ test("auto.ts startAuto dispatches through the UOK kernel wrapper (legacy loop adapter)", () => {
1271
1271
  const src = readFileSync(
1272
1272
  resolve(import.meta.dirname, "..", "auto.ts"),
1273
1273
  "utf-8",
@@ -1279,8 +1279,12 @@ test("auto.ts startAuto calls autoLoop (not dispatchNextUnit as first dispatch)"
1279
1279
  const fnBlock =
1280
1280
  fnEnd > -1 ? src.slice(fnIdx, fnEnd) : src.slice(fnIdx, fnIdx + 5000);
1281
1281
  assert.ok(
1282
- fnBlock.includes("autoLoop("),
1283
- "startAuto must call autoLoop() instead of dispatchNextUnit()",
1282
+ fnBlock.includes("runAutoLoopWithUok("),
1283
+ "startAuto must dispatch through runAutoLoopWithUok()",
1284
+ );
1285
+ assert.ok(
1286
+ fnBlock.includes("runLegacyLoop: autoLoop"),
1287
+ "startAuto must preserve the legacy autoLoop adapter in kernel dispatch",
1284
1288
  );
1285
1289
  });
1286
1290
 
@@ -227,6 +227,26 @@ test("model change notify in selectAndApplyModel is gated behind verbose flag",
227
227
  );
228
228
  });
229
229
 
230
+ test("model policy resolves candidates from the policy-eligible pool", () => {
231
+ const src = readFileSync(join(__dirname, "..", "auto-model-selection.ts"), "utf-8");
232
+ assert.ok(
233
+ src.includes("const resolutionPool = uokFlags.modelPolicy ? routingEligibleModels : availableModels"),
234
+ "selectAndApplyModel should resolve model IDs against policy-eligible models when model policy is enabled",
235
+ );
236
+ });
237
+
238
+ test("model policy receives task metadata for requirement-vector decisions", () => {
239
+ const src = readFileSync(join(__dirname, "..", "auto-model-selection.ts"), "utf-8");
240
+ assert.ok(
241
+ src.includes("taskMetadata: taskMetadataForPolicy"),
242
+ "applyModelPolicyFilter should receive task metadata so requirement vectors are unit-aware",
243
+ );
244
+ assert.ok(
245
+ src.includes("extractTaskMetadata(unitId, basePath)"),
246
+ "execute-task dispatch should derive metadata before policy filtering",
247
+ );
248
+ });
249
+
230
250
  test("resolveModelId: anthropic wins over claude-code when session provider is not claude-code", () => {
231
251
  const availableModels = [
232
252
  { id: "claude-sonnet-4-6", provider: "claude-code" },
@@ -13,11 +13,15 @@ test("auto-mode captures GSD_PROJECT_ROOT before entering the dispatch loop", ()
13
13
  const resumeCallIdx = source.indexOf("captureProjectRootEnv(s.originalBasePath || s.basePath);");
14
14
  assert.ok(resumeCallIdx > -1, "auto.ts should capture GSD_PROJECT_ROOT before resume autoLoop");
15
15
 
16
- const firstAutoLoopIdx = source.indexOf("await autoLoop(ctx, pi, s, buildLoopDeps());");
17
- assert.ok(firstAutoLoopIdx > -1, "auto.ts should invoke autoLoop()");
16
+ const firstLoopIdxCandidates = [
17
+ source.indexOf("await runAutoLoopWithUok({"),
18
+ source.indexOf("await autoLoop(ctx, pi, s, buildLoopDeps());"),
19
+ ].filter((idx) => idx > -1);
20
+ const firstAutoLoopIdx = firstLoopIdxCandidates.length > 0 ? Math.min(...firstLoopIdxCandidates) : -1;
21
+ assert.ok(firstAutoLoopIdx > -1, "auto.ts should invoke the auto dispatch loop");
18
22
  assert.ok(
19
23
  resumeCallIdx < firstAutoLoopIdx,
20
- "auto.ts must set GSD_PROJECT_ROOT before the first autoLoop() call",
24
+ "auto.ts must set GSD_PROJECT_ROOT before the first loop call",
21
25
  );
22
26
  });
23
27
 
@@ -25,8 +25,12 @@ console.log("\n=== resume path refreshes resources and opens DB before rebuildSt
25
25
  const resumeSectionStart = autoSrc.indexOf("if (s.paused) {", autoSrc.indexOf("// If resuming from paused state"));
26
26
  assertTrue(resumeSectionStart > 0, "auto.ts has the paused-session resume block");
27
27
 
28
- const resumeSectionEnd = autoSrc.indexOf("await autoLoop(", resumeSectionStart);
29
- assertTrue(resumeSectionEnd > resumeSectionStart, "resume block reaches autoLoop");
28
+ const resumeSectionEndCandidates = [
29
+ autoSrc.indexOf("await runAutoLoopWithUok(", resumeSectionStart),
30
+ autoSrc.indexOf("await autoLoop(", resumeSectionStart),
31
+ ].filter((idx) => idx > resumeSectionStart);
32
+ const resumeSectionEnd = resumeSectionEndCandidates.length > 0 ? Math.min(...resumeSectionEndCandidates) : -1;
33
+ assertTrue(resumeSectionEnd > resumeSectionStart, "resume block reaches the dispatch loop");
30
34
 
31
35
  const resumeSection = autoSrc.slice(resumeSectionStart, resumeSectionEnd);
32
36
 
@@ -0,0 +1,158 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { mkdirSync, writeFileSync, readFileSync, existsSync, rmSync } from "node:fs";
4
+ import { join } from "node:path";
5
+ import { tmpdir } from "node:os";
6
+ import { randomUUID } from "node:crypto";
7
+
8
+ // ─── Helpers ──────────────────────────────────────────────────────────────
9
+
10
+ function makeTmpBase(): string {
11
+ const base = join(tmpdir(), `gsd-backlog-test-${randomUUID()}`);
12
+ mkdirSync(join(base, ".gsd"), { recursive: true });
13
+ return base;
14
+ }
15
+
16
+ function cleanup(base: string): void {
17
+ try { rmSync(base, { recursive: true, force: true }); } catch { /* */ }
18
+ }
19
+
20
+ function backlogPath(base: string): string {
21
+ return join(base, ".gsd", "BACKLOG.md");
22
+ }
23
+
24
+ function writeBacklog(base: string, content: string): void {
25
+ writeFileSync(backlogPath(base), content, "utf-8");
26
+ }
27
+
28
+ function readBacklog(base: string): string {
29
+ return readFileSync(backlogPath(base), "utf-8");
30
+ }
31
+
32
+ // Test the parsing/writing logic inline since the handler requires runtime context
33
+
34
+ interface BacklogItem {
35
+ id: string;
36
+ title: string;
37
+ done: boolean;
38
+ note: string;
39
+ }
40
+
41
+ function parseBacklog(content: string): BacklogItem[] {
42
+ const items: BacklogItem[] = [];
43
+ for (const line of content.split("\n")) {
44
+ const match = line.match(/^- \[([ x])\] (999\.\d+) — (.+?)(?:\s*\((.+)\))?$/);
45
+ if (match) {
46
+ items.push({
47
+ id: match[2],
48
+ title: match[3].trim(),
49
+ done: match[1] === "x",
50
+ note: match[4] ?? "",
51
+ });
52
+ }
53
+ }
54
+ return items;
55
+ }
56
+
57
+ function formatBacklog(items: BacklogItem[]): string {
58
+ const lines = ["# Backlog\n"];
59
+ for (const item of items) {
60
+ const check = item.done ? "x" : " ";
61
+ const note = item.note ? ` (${item.note})` : "";
62
+ lines.push(`- [${check}] ${item.id} — ${item.title}${note}`);
63
+ }
64
+ lines.push("");
65
+ return lines.join("\n");
66
+ }
67
+
68
+ // ─── Tests ──────────────────────────────────────────────────────────────
69
+
70
+ test("backlog: parse empty file returns empty array", () => {
71
+ const items = parseBacklog("");
72
+ assert.equal(items.length, 0);
73
+ });
74
+
75
+ test("backlog: parse valid entries", () => {
76
+ const content = `# Backlog
77
+
78
+ - [ ] 999.1 — OAuth support (added 2026-03-23)
79
+ - [x] 999.2 — Rate limiting (promoted 2026-03-24)
80
+ - [ ] 999.3 — Dark mode`;
81
+
82
+ const items = parseBacklog(content);
83
+ assert.equal(items.length, 3);
84
+ assert.equal(items[0].id, "999.1");
85
+ assert.equal(items[0].title, "OAuth support");
86
+ assert.equal(items[0].done, false);
87
+ assert.equal(items[0].note, "added 2026-03-23");
88
+
89
+ assert.equal(items[1].id, "999.2");
90
+ assert.equal(items[1].done, true);
91
+ assert.equal(items[1].note, "promoted 2026-03-24");
92
+
93
+ assert.equal(items[2].id, "999.3");
94
+ assert.equal(items[2].title, "Dark mode");
95
+ assert.equal(items[2].note, "");
96
+ });
97
+
98
+ test("backlog: format roundtrips correctly", () => {
99
+ const items: BacklogItem[] = [
100
+ { id: "999.1", title: "OAuth support", done: false, note: "added 2026-03-23" },
101
+ { id: "999.2", title: "Rate limiting", done: true, note: "promoted 2026-03-24" },
102
+ ];
103
+
104
+ const formatted = formatBacklog(items);
105
+ const parsed = parseBacklog(formatted);
106
+
107
+ assert.equal(parsed.length, 2);
108
+ assert.equal(parsed[0].id, "999.1");
109
+ assert.equal(parsed[0].title, "OAuth support");
110
+ assert.equal(parsed[1].done, true);
111
+ });
112
+
113
+ test("backlog: write and read from disk", () => {
114
+ const base = makeTmpBase();
115
+ try {
116
+ const items: BacklogItem[] = [
117
+ { id: "999.1", title: "Test item", done: false, note: "added 2026-03-23" },
118
+ ];
119
+ writeBacklog(base, formatBacklog(items));
120
+
121
+ assert.ok(existsSync(backlogPath(base)));
122
+ const content = readBacklog(base);
123
+ assert.ok(content.includes("999.1"));
124
+ assert.ok(content.includes("Test item"));
125
+ } finally {
126
+ cleanup(base);
127
+ }
128
+ });
129
+
130
+ test("backlog: next ID increments correctly", () => {
131
+ const items: BacklogItem[] = [
132
+ { id: "999.1", title: "First", done: false, note: "" },
133
+ { id: "999.2", title: "Second", done: false, note: "" },
134
+ { id: "999.5", title: "Fifth", done: false, note: "" },
135
+ ];
136
+
137
+ let maxNum = 0;
138
+ for (const item of items) {
139
+ const match = item.id.match(/^999\.(\d+)$/);
140
+ if (match) {
141
+ const num = parseInt(match[1], 10);
142
+ if (num > maxNum) maxNum = num;
143
+ }
144
+ }
145
+ const nextId = `999.${maxNum + 1}`;
146
+ assert.equal(nextId, "999.6");
147
+ });
148
+
149
+ test("backlog: empty backlog returns no items", () => {
150
+ const base = makeTmpBase();
151
+ try {
152
+ // No BACKLOG.md exists
153
+ assert.ok(!existsSync(backlogPath(base)));
154
+ // Would return empty array
155
+ } finally {
156
+ cleanup(base);
157
+ }
158
+ });