gsd-pi 2.73.1 → 2.74.0-dev.0306a2e

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 (640) hide show
  1. package/dist/cli-web-branch.d.ts +4 -3
  2. package/dist/cli-web-branch.js +10 -7
  3. package/dist/cli.js +184 -206
  4. package/dist/headless-query.js +4 -1
  5. package/dist/help-text.js +23 -0
  6. package/dist/logo.d.ts +1 -1
  7. package/dist/logo.js +1 -1
  8. package/dist/onboarding.js +59 -53
  9. package/dist/resource-loader.js +2 -2
  10. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +68 -4
  11. package/dist/resources/extensions/gsd/activity-log.js +16 -0
  12. package/dist/resources/extensions/gsd/auto/detect-stuck.js +11 -4
  13. package/dist/resources/extensions/gsd/auto/loop.js +147 -10
  14. package/dist/resources/extensions/gsd/auto/phases.js +173 -13
  15. package/dist/resources/extensions/gsd/auto/session.js +10 -0
  16. package/dist/resources/extensions/gsd/auto-dispatch.js +22 -4
  17. package/dist/resources/extensions/gsd/auto-model-selection.js +105 -16
  18. package/dist/resources/extensions/gsd/auto-post-unit.js +254 -15
  19. package/dist/resources/extensions/gsd/auto-prompts.js +12 -0
  20. package/dist/resources/extensions/gsd/auto-start.js +23 -6
  21. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +13 -0
  22. package/dist/resources/extensions/gsd/auto-unit-closeout.js +18 -0
  23. package/dist/resources/extensions/gsd/auto-verification.js +186 -3
  24. package/dist/resources/extensions/gsd/auto.js +65 -12
  25. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +30 -8
  26. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +41 -2
  27. package/dist/resources/extensions/gsd/commands/catalog.js +26 -1
  28. package/dist/resources/extensions/gsd/commands/handlers/ops.js +25 -0
  29. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +68 -9
  30. package/dist/resources/extensions/gsd/commands-add-tests.js +111 -0
  31. package/dist/resources/extensions/gsd/commands-backlog.js +140 -0
  32. package/dist/resources/extensions/gsd/commands-do.js +79 -0
  33. package/dist/resources/extensions/gsd/commands-extract-learnings.js +225 -0
  34. package/dist/resources/extensions/gsd/commands-handlers.js +8 -2
  35. package/dist/resources/extensions/gsd/commands-maintenance.js +6 -6
  36. package/dist/resources/extensions/gsd/commands-pr-branch.js +180 -0
  37. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -1
  38. package/dist/resources/extensions/gsd/commands-session-report.js +82 -0
  39. package/dist/resources/extensions/gsd/commands-ship.js +187 -0
  40. package/dist/resources/extensions/gsd/db-writer.js +3 -5
  41. package/dist/resources/extensions/gsd/docs/preferences-reference.md +15 -2
  42. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +144 -0
  43. package/dist/resources/extensions/gsd/ecosystem/loader.js +145 -0
  44. package/dist/resources/extensions/gsd/git-service.js +49 -1
  45. package/dist/resources/extensions/gsd/graph-context.js +157 -0
  46. package/dist/resources/extensions/gsd/gsd-db.js +581 -2
  47. package/dist/resources/extensions/gsd/guided-flow.js +23 -0
  48. package/dist/resources/extensions/gsd/index.js +15 -2
  49. package/dist/resources/extensions/gsd/init-wizard.js +1 -0
  50. package/dist/resources/extensions/gsd/journal.js +27 -0
  51. package/dist/resources/extensions/gsd/md-importer.js +3 -4
  52. package/dist/resources/extensions/gsd/memory-store.js +19 -51
  53. package/dist/resources/extensions/gsd/metrics.js +19 -0
  54. package/dist/resources/extensions/gsd/milestone-validation-gates.js +13 -12
  55. package/dist/resources/extensions/gsd/native-git-bridge.js +7 -4
  56. package/dist/resources/extensions/gsd/notification-widget.js +2 -2
  57. package/dist/resources/extensions/gsd/parallel-orchestrator.js +33 -1
  58. package/dist/resources/extensions/gsd/preferences-models.js +63 -3
  59. package/dist/resources/extensions/gsd/preferences-types.js +2 -0
  60. package/dist/resources/extensions/gsd/preferences-validation.js +130 -2
  61. package/dist/resources/extensions/gsd/preferences.js +26 -0
  62. package/dist/resources/extensions/gsd/prompts/add-tests.md +35 -0
  63. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +12 -2
  64. package/dist/resources/extensions/gsd/state.js +66 -15
  65. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
  66. package/dist/resources/extensions/gsd/tools/complete-slice.js +20 -0
  67. package/dist/resources/extensions/gsd/tools/validate-milestone.js +39 -4
  68. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +3 -14
  69. package/dist/resources/extensions/gsd/triage-resolution.js +2 -5
  70. package/dist/resources/extensions/gsd/unit-ownership.js +1 -1
  71. package/dist/resources/extensions/gsd/uok/audit-toggle.js +7 -0
  72. package/dist/resources/extensions/gsd/uok/audit.js +40 -0
  73. package/dist/resources/extensions/gsd/uok/contracts.js +1 -0
  74. package/dist/resources/extensions/gsd/uok/execution-graph.js +179 -0
  75. package/dist/resources/extensions/gsd/uok/flags.js +29 -0
  76. package/dist/resources/extensions/gsd/uok/gate-runner.js +109 -0
  77. package/dist/resources/extensions/gsd/uok/gitops.js +53 -0
  78. package/dist/resources/extensions/gsd/uok/kernel.js +80 -0
  79. package/dist/resources/extensions/gsd/uok/loop-adapter.js +133 -0
  80. package/dist/resources/extensions/gsd/uok/model-policy.js +66 -0
  81. package/dist/resources/extensions/gsd/uok/plan-v2.js +132 -0
  82. package/dist/resources/extensions/gsd/workflow-logger.js +22 -0
  83. package/dist/resources/extensions/gsd/workflow-manifest.js +8 -69
  84. package/dist/resources/extensions/gsd/workflow-migration.js +21 -22
  85. package/dist/resources/extensions/gsd/workflow-projections.js +4 -1
  86. package/dist/resources/extensions/gsd/workflow-reconcile.js +14 -11
  87. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  88. package/dist/tsconfig.extensions.tsbuildinfo +1 -0
  89. package/dist/update-check.d.ts +1 -0
  90. package/dist/update-check.js +13 -5
  91. package/dist/update-cmd.js +4 -3
  92. package/dist/web/standalone/.next/BUILD_ID +1 -1
  93. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  94. package/dist/web/standalone/.next/build-manifest.json +3 -3
  95. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  96. package/dist/web/standalone/.next/required-server-files.json +3 -3
  97. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  98. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  99. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  100. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  104. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  108. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  110. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  111. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  112. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  114. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  124. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  136. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  156. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  166. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  172. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  186. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  188. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  190. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  192. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/index.html +1 -1
  202. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  203. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  204. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  205. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  206. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  207. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  208. package/dist/web/standalone/.next/server/app/page.js +2 -2
  209. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  211. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  212. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  213. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  214. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  215. package/dist/web/standalone/.next/server/middleware.js +2 -2
  216. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  218. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  219. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  220. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  221. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  222. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  223. package/dist/web/standalone/.next/static/chunks/app/page-f1e30ab6bb269149.js +1 -0
  224. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  225. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  226. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  227. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  228. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  229. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  230. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  231. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  232. package/dist/web/standalone/server.js +1 -1
  233. package/package.json +3 -3
  234. package/packages/daemon/package.json +2 -2
  235. package/packages/mcp-server/dist/index.d.ts +3 -0
  236. package/packages/mcp-server/dist/index.d.ts.map +1 -1
  237. package/packages/mcp-server/dist/index.js +3 -0
  238. package/packages/mcp-server/dist/index.js.map +1 -1
  239. package/packages/mcp-server/dist/readers/graph.d.ts +87 -0
  240. package/packages/mcp-server/dist/readers/graph.d.ts.map +1 -0
  241. package/packages/mcp-server/dist/readers/graph.js +655 -0
  242. package/packages/mcp-server/dist/readers/graph.js.map +1 -0
  243. package/packages/mcp-server/dist/readers/index.d.ts +2 -0
  244. package/packages/mcp-server/dist/readers/index.d.ts.map +1 -1
  245. package/packages/mcp-server/dist/readers/index.js +1 -0
  246. package/packages/mcp-server/dist/readers/index.js.map +1 -1
  247. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  248. package/packages/mcp-server/dist/server.js +65 -0
  249. package/packages/mcp-server/dist/server.js.map +1 -1
  250. package/packages/mcp-server/package.json +2 -2
  251. package/packages/mcp-server/src/index.ts +15 -0
  252. package/packages/mcp-server/src/readers/graph.test.ts +604 -0
  253. package/packages/mcp-server/src/readers/graph.ts +855 -0
  254. package/packages/mcp-server/src/readers/index.ts +12 -0
  255. package/packages/mcp-server/src/server.ts +83 -0
  256. package/packages/mcp-server/tsconfig.json +1 -0
  257. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -0
  258. package/packages/native/package.json +2 -2
  259. package/packages/native/tsconfig.tsbuildinfo +1 -0
  260. package/packages/pi-agent-core/package.json +1 -1
  261. package/packages/pi-agent-core/tsconfig.json +1 -0
  262. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -0
  263. package/packages/pi-ai/dist/index.d.ts +2 -9
  264. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  265. package/packages/pi-ai/dist/index.js +2 -9
  266. package/packages/pi-ai/dist/index.js.map +1 -1
  267. package/packages/pi-ai/dist/models/capability-patches.d.ts +19 -0
  268. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -0
  269. package/packages/pi-ai/dist/models/capability-patches.js +36 -0
  270. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -0
  271. package/packages/pi-ai/dist/{models.custom.d.ts → models/custom.d.ts} +1 -1
  272. package/packages/pi-ai/dist/models/custom.d.ts.map +1 -0
  273. package/packages/pi-ai/dist/{models.custom.js → models/custom.js} +4 -4
  274. package/packages/pi-ai/dist/models/custom.js.map +1 -0
  275. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +1482 -0
  276. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -0
  277. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +1484 -0
  278. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -0
  279. package/packages/pi-ai/dist/models/generated/anthropic.d.ts +377 -0
  280. package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -0
  281. package/packages/pi-ai/dist/models/generated/anthropic.js +379 -0
  282. package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -0
  283. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts +700 -0
  284. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts.map +1 -0
  285. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js +702 -0
  286. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js.map +1 -0
  287. package/packages/pi-ai/dist/models/generated/cerebras.d.ts +71 -0
  288. package/packages/pi-ai/dist/models/generated/cerebras.d.ts.map +1 -0
  289. package/packages/pi-ai/dist/models/generated/cerebras.js +73 -0
  290. package/packages/pi-ai/dist/models/generated/cerebras.js.map +1 -0
  291. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts +590 -0
  292. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts.map +1 -0
  293. package/packages/pi-ai/dist/models/generated/github-copilot.js +444 -0
  294. package/packages/pi-ai/dist/models/generated/github-copilot.js.map +1 -0
  295. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +156 -0
  296. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -0
  297. package/packages/pi-ai/dist/models/generated/google-antigravity.js +158 -0
  298. package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -0
  299. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts +105 -0
  300. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts.map +1 -0
  301. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js +107 -0
  302. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js.map +1 -0
  303. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts +207 -0
  304. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts.map +1 -0
  305. package/packages/pi-ai/dist/models/generated/google-vertex.js +209 -0
  306. package/packages/pi-ai/dist/models/generated/google-vertex.js.map +1 -0
  307. package/packages/pi-ai/dist/models/generated/google.d.ts +462 -0
  308. package/packages/pi-ai/dist/models/generated/google.d.ts.map +1 -0
  309. package/packages/pi-ai/dist/models/generated/google.js +464 -0
  310. package/packages/pi-ai/dist/models/generated/google.js.map +1 -0
  311. package/packages/pi-ai/dist/models/generated/groq.d.ts +309 -0
  312. package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -0
  313. package/packages/pi-ai/dist/models/generated/groq.js +311 -0
  314. package/packages/pi-ai/dist/models/generated/groq.js.map +1 -0
  315. package/packages/pi-ai/dist/models/generated/huggingface.d.ts +383 -0
  316. package/packages/pi-ai/dist/models/generated/huggingface.d.ts.map +1 -0
  317. package/packages/pi-ai/dist/models/generated/huggingface.js +347 -0
  318. package/packages/pi-ai/dist/models/generated/huggingface.js.map +1 -0
  319. package/packages/pi-ai/dist/{models.generated.d.ts → models/generated/index.d.ts} +1 -1
  320. package/packages/pi-ai/dist/{models.generated.d.ts.map → models/generated/index.d.ts.map} +1 -1
  321. package/packages/pi-ai/dist/models/generated/index.js +51 -0
  322. package/packages/pi-ai/dist/models/generated/index.js.map +1 -0
  323. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts +37 -0
  324. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts.map +1 -0
  325. package/packages/pi-ai/dist/models/generated/kimi-coding.js +39 -0
  326. package/packages/pi-ai/dist/models/generated/kimi-coding.js.map +1 -0
  327. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts +105 -0
  328. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts.map +1 -0
  329. package/packages/pi-ai/dist/models/generated/minimax-cn.js +107 -0
  330. package/packages/pi-ai/dist/models/generated/minimax-cn.js.map +1 -0
  331. package/packages/pi-ai/dist/models/generated/minimax.d.ts +105 -0
  332. package/packages/pi-ai/dist/models/generated/minimax.d.ts.map +1 -0
  333. package/packages/pi-ai/dist/models/generated/minimax.js +107 -0
  334. package/packages/pi-ai/dist/models/generated/minimax.js.map +1 -0
  335. package/packages/pi-ai/dist/models/generated/mistral.d.ts +445 -0
  336. package/packages/pi-ai/dist/models/generated/mistral.d.ts.map +1 -0
  337. package/packages/pi-ai/dist/models/generated/mistral.js +447 -0
  338. package/packages/pi-ai/dist/models/generated/mistral.js.map +1 -0
  339. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +139 -0
  340. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -0
  341. package/packages/pi-ai/dist/models/generated/openai-codex.js +141 -0
  342. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -0
  343. package/packages/pi-ai/dist/models/generated/openai.d.ts +700 -0
  344. package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -0
  345. package/packages/pi-ai/dist/models/generated/openai.js +702 -0
  346. package/packages/pi-ai/dist/models/generated/openai.js.map +1 -0
  347. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts +122 -0
  348. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts.map +1 -0
  349. package/packages/pi-ai/dist/models/generated/opencode-go.js +124 -0
  350. package/packages/pi-ai/dist/models/generated/opencode-go.js.map +1 -0
  351. package/packages/pi-ai/dist/models/generated/opencode.d.ts +530 -0
  352. package/packages/pi-ai/dist/models/generated/opencode.d.ts.map +1 -0
  353. package/packages/pi-ai/dist/models/generated/opencode.js +532 -0
  354. package/packages/pi-ai/dist/models/generated/opencode.js.map +1 -0
  355. package/packages/pi-ai/dist/models/generated/openrouter.d.ts +4270 -0
  356. package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -0
  357. package/packages/pi-ai/dist/models/generated/openrouter.js +4272 -0
  358. package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -0
  359. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts +2604 -0
  360. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts.map +1 -0
  361. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js +2606 -0
  362. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js.map +1 -0
  363. package/packages/pi-ai/dist/models/generated/xai.d.ts +411 -0
  364. package/packages/pi-ai/dist/models/generated/xai.d.ts.map +1 -0
  365. package/packages/pi-ai/dist/models/generated/xai.js +413 -0
  366. package/packages/pi-ai/dist/models/generated/xai.js.map +1 -0
  367. package/packages/pi-ai/dist/models/generated/zai.d.ts +276 -0
  368. package/packages/pi-ai/dist/models/generated/zai.d.ts.map +1 -0
  369. package/packages/pi-ai/dist/models/generated/zai.js +239 -0
  370. package/packages/pi-ai/dist/models/generated/zai.js.map +1 -0
  371. package/packages/pi-ai/dist/models/index.d.ts +27 -0
  372. package/packages/pi-ai/dist/models/index.d.ts.map +1 -0
  373. package/packages/pi-ai/dist/models/index.js +80 -0
  374. package/packages/pi-ai/dist/models/index.js.map +1 -0
  375. package/packages/pi-ai/dist/models.d.ts +1 -36
  376. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  377. package/packages/pi-ai/dist/models.generated.test.js +1 -2
  378. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  379. package/packages/pi-ai/dist/models.js +3 -112
  380. package/packages/pi-ai/dist/models.js.map +1 -1
  381. package/packages/pi-ai/dist/models.test.js +6 -5
  382. package/packages/pi-ai/dist/models.test.js.map +1 -1
  383. package/packages/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  384. package/packages/pi-ai/dist/utils/overflow.js +12 -0
  385. package/packages/pi-ai/dist/utils/overflow.js.map +1 -1
  386. package/packages/pi-ai/dist/utils/tests/overflow.test.d.ts +2 -0
  387. package/packages/pi-ai/dist/utils/tests/overflow.test.d.ts.map +1 -0
  388. package/packages/pi-ai/dist/utils/tests/overflow.test.js +50 -0
  389. package/packages/pi-ai/dist/utils/tests/overflow.test.js.map +1 -0
  390. package/packages/pi-ai/package.json +1 -1
  391. package/packages/pi-ai/scripts/generate-models.ts +74 -40
  392. package/packages/pi-ai/src/index.ts +5 -9
  393. package/packages/pi-ai/src/models/capability-patches.ts +40 -0
  394. package/packages/pi-ai/src/{models.custom.ts → models/custom.ts} +4 -4
  395. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +1486 -0
  396. package/packages/pi-ai/src/models/generated/anthropic.ts +381 -0
  397. package/packages/pi-ai/src/models/generated/azure-openai-responses.ts +704 -0
  398. package/packages/pi-ai/src/models/generated/cerebras.ts +75 -0
  399. package/packages/pi-ai/src/models/generated/github-copilot.ts +446 -0
  400. package/packages/pi-ai/src/models/generated/google-antigravity.ts +160 -0
  401. package/packages/pi-ai/src/models/generated/google-gemini-cli.ts +109 -0
  402. package/packages/pi-ai/src/models/generated/google-vertex.ts +211 -0
  403. package/packages/pi-ai/src/models/generated/google.ts +466 -0
  404. package/packages/pi-ai/src/models/generated/groq.ts +313 -0
  405. package/packages/pi-ai/src/models/generated/huggingface.ts +349 -0
  406. package/packages/pi-ai/src/models/generated/index.ts +52 -0
  407. package/packages/pi-ai/src/models/generated/kimi-coding.ts +41 -0
  408. package/packages/pi-ai/src/models/generated/minimax-cn.ts +109 -0
  409. package/packages/pi-ai/src/models/generated/minimax.ts +109 -0
  410. package/packages/pi-ai/src/models/generated/mistral.ts +449 -0
  411. package/packages/pi-ai/src/models/generated/openai-codex.ts +143 -0
  412. package/packages/pi-ai/src/models/generated/openai.ts +704 -0
  413. package/packages/pi-ai/src/models/generated/opencode-go.ts +126 -0
  414. package/packages/pi-ai/src/models/generated/opencode.ts +534 -0
  415. package/packages/pi-ai/src/models/generated/openrouter.ts +4274 -0
  416. package/packages/pi-ai/src/models/generated/vercel-ai-gateway.ts +2608 -0
  417. package/packages/pi-ai/src/models/generated/xai.ts +415 -0
  418. package/packages/pi-ai/src/models/generated/zai.ts +241 -0
  419. package/packages/pi-ai/src/models/index.ts +106 -0
  420. package/packages/pi-ai/src/models.generated.test.ts +1 -2
  421. package/packages/pi-ai/src/models.test.ts +6 -5
  422. package/packages/pi-ai/src/models.ts +3 -153
  423. package/packages/pi-ai/src/utils/overflow.ts +14 -1
  424. package/packages/pi-ai/src/utils/tests/overflow.test.ts +58 -0
  425. package/packages/pi-ai/tsconfig.json +1 -0
  426. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -0
  427. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +721 -8
  428. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  429. package/packages/pi-coding-agent/dist/core/compaction/utils.js +5 -5
  430. package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
  431. package/packages/pi-coding-agent/dist/core/compaction-utils.test.d.ts +2 -0
  432. package/packages/pi-coding-agent/dist/core/compaction-utils.test.d.ts.map +1 -0
  433. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js +45 -0
  434. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js.map +1 -0
  435. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts +2 -0
  436. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts.map +1 -0
  437. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js +52 -0
  438. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js.map +1 -0
  439. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  440. package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
  441. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  442. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +12 -2
  443. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  444. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +65 -28
  445. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  446. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts +2 -1
  447. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  448. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +9 -3
  449. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  450. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.d.ts +2 -0
  451. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.d.ts.map +1 -0
  452. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +52 -0
  453. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -0
  454. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  455. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +305 -20
  456. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  457. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts +2 -0
  458. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts.map +1 -0
  459. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +38 -0
  460. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -0
  461. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +13 -0
  462. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  463. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +59 -6
  464. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  465. package/packages/pi-coding-agent/package.json +1 -1
  466. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +884 -8
  467. package/packages/pi-coding-agent/src/core/compaction/utils.ts +5 -5
  468. package/packages/pi-coding-agent/src/core/compaction-utils.test.ts +50 -0
  469. package/packages/pi-coding-agent/src/core/model-registry-env-fallback.test.ts +59 -0
  470. package/packages/pi-coding-agent/src/core/model-registry.ts +2 -1
  471. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +78 -32
  472. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +73 -0
  473. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +9 -3
  474. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +381 -39
  475. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +44 -0
  476. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +79 -6
  477. package/packages/pi-coding-agent/src/types/ambient-modules.d.ts +69 -0
  478. package/packages/pi-coding-agent/tsconfig.json +3 -2
  479. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -0
  480. package/packages/pi-tui/dist/__tests__/tui.test.js +60 -1
  481. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  482. package/packages/pi-tui/dist/tui.d.ts +8 -0
  483. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  484. package/packages/pi-tui/dist/tui.js +32 -3
  485. package/packages/pi-tui/dist/tui.js.map +1 -1
  486. package/packages/pi-tui/package.json +1 -1
  487. package/packages/pi-tui/src/__tests__/tui.test.ts +76 -1
  488. package/packages/pi-tui/src/tui.ts +31 -3
  489. package/packages/pi-tui/tsconfig.json +1 -0
  490. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -0
  491. package/packages/rpc-client/package.json +1 -1
  492. package/packages/rpc-client/tsconfig.json +1 -0
  493. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -0
  494. package/pkg/package.json +1 -1
  495. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +107 -5
  496. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +111 -2
  497. package/src/resources/extensions/gsd/activity-log.ts +21 -0
  498. package/src/resources/extensions/gsd/auto/detect-stuck.ts +12 -4
  499. package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -0
  500. package/src/resources/extensions/gsd/auto/loop.ts +159 -10
  501. package/src/resources/extensions/gsd/auto/phases.ts +213 -13
  502. package/src/resources/extensions/gsd/auto/session.ts +10 -0
  503. package/src/resources/extensions/gsd/auto-dispatch.ts +26 -10
  504. package/src/resources/extensions/gsd/auto-model-selection.ts +151 -16
  505. package/src/resources/extensions/gsd/auto-post-unit.ts +278 -16
  506. package/src/resources/extensions/gsd/auto-prompts.ts +13 -0
  507. package/src/resources/extensions/gsd/auto-start.ts +30 -6
  508. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +17 -0
  509. package/src/resources/extensions/gsd/auto-unit-closeout.ts +25 -1
  510. package/src/resources/extensions/gsd/auto-verification.ts +225 -3
  511. package/src/resources/extensions/gsd/auto.ts +72 -16
  512. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +38 -8
  513. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +52 -2
  514. package/src/resources/extensions/gsd/commands/catalog.ts +26 -1
  515. package/src/resources/extensions/gsd/commands/handlers/ops.ts +25 -0
  516. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +74 -9
  517. package/src/resources/extensions/gsd/commands-add-tests.ts +137 -0
  518. package/src/resources/extensions/gsd/commands-backlog.ts +182 -0
  519. package/src/resources/extensions/gsd/commands-do.ts +109 -0
  520. package/src/resources/extensions/gsd/commands-extract-learnings.ts +304 -0
  521. package/src/resources/extensions/gsd/commands-handlers.ts +8 -2
  522. package/src/resources/extensions/gsd/commands-maintenance.ts +6 -6
  523. package/src/resources/extensions/gsd/commands-pr-branch.ts +234 -0
  524. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -1
  525. package/src/resources/extensions/gsd/commands-session-report.ts +101 -0
  526. package/src/resources/extensions/gsd/commands-ship.ts +219 -0
  527. package/src/resources/extensions/gsd/db-writer.ts +3 -5
  528. package/src/resources/extensions/gsd/docs/preferences-reference.md +15 -2
  529. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +228 -0
  530. package/src/resources/extensions/gsd/ecosystem/loader.ts +201 -0
  531. package/src/resources/extensions/gsd/git-service.ts +68 -0
  532. package/src/resources/extensions/gsd/graph-context.ts +212 -0
  533. package/src/resources/extensions/gsd/gsd-db.ts +788 -3
  534. package/src/resources/extensions/gsd/guided-flow.ts +32 -0
  535. package/src/resources/extensions/gsd/index.ts +18 -2
  536. package/src/resources/extensions/gsd/init-wizard.ts +3 -2
  537. package/src/resources/extensions/gsd/journal.ts +30 -0
  538. package/src/resources/extensions/gsd/md-importer.ts +3 -5
  539. package/src/resources/extensions/gsd/memory-store.ts +31 -62
  540. package/src/resources/extensions/gsd/metrics.ts +26 -0
  541. package/src/resources/extensions/gsd/milestone-validation-gates.ts +13 -14
  542. package/src/resources/extensions/gsd/native-git-bridge.ts +11 -12
  543. package/src/resources/extensions/gsd/notification-widget.ts +2 -2
  544. package/src/resources/extensions/gsd/parallel-orchestrator.ts +40 -1
  545. package/src/resources/extensions/gsd/preferences-models.ts +61 -3
  546. package/src/resources/extensions/gsd/preferences-types.ts +44 -0
  547. package/src/resources/extensions/gsd/preferences-validation.ts +130 -2
  548. package/src/resources/extensions/gsd/preferences.ts +28 -0
  549. package/src/resources/extensions/gsd/prompts/add-tests.md +35 -0
  550. package/src/resources/extensions/gsd/session-lock.ts +14 -2
  551. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +20 -1
  552. package/src/resources/extensions/gsd/state.ts +80 -17
  553. package/src/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
  554. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +9 -5
  555. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +20 -0
  556. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +53 -0
  557. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +7 -3
  558. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +51 -2
  559. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +6 -2
  560. package/src/resources/extensions/gsd/tests/commands-backlog.test.ts +158 -0
  561. package/src/resources/extensions/gsd/tests/commands-do.test.ts +127 -0
  562. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +340 -0
  563. package/src/resources/extensions/gsd/tests/commands-pr-branch.test.ts +68 -0
  564. package/src/resources/extensions/gsd/tests/commands-session-report.test.ts +82 -0
  565. package/src/resources/extensions/gsd/tests/commands-ship.test.ts +71 -0
  566. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +14 -0
  567. package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +142 -0
  568. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
  569. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  570. package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +42 -0
  571. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +3 -2
  572. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +3 -2
  573. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +68 -8
  574. package/src/resources/extensions/gsd/tests/derive-state.test.ts +3 -3
  575. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +154 -0
  576. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +10 -7
  577. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +137 -1
  578. package/src/resources/extensions/gsd/tests/graph-context.test.ts +337 -0
  579. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
  580. package/src/resources/extensions/gsd/tests/health-widget.test.ts +1 -1
  581. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +4 -2
  582. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +68 -1
  583. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -2
  584. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -3
  585. package/src/resources/extensions/gsd/tests/model-isolation.test.ts +91 -2
  586. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +140 -0
  587. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  588. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +2 -1
  589. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +40 -1
  590. package/src/resources/extensions/gsd/tests/preferences.test.ts +47 -0
  591. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +1 -1
  592. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +180 -0
  593. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +5 -7
  594. package/src/resources/extensions/gsd/tests/token-profile.test.ts +9 -6
  595. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +101 -0
  596. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +85 -0
  597. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +69 -0
  598. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +39 -0
  599. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +70 -0
  600. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +85 -0
  601. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +35 -0
  602. package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +89 -0
  603. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +167 -0
  604. package/src/resources/extensions/gsd/tests/uok-preferences.test.ts +42 -0
  605. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +179 -0
  606. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +39 -0
  607. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +223 -0
  608. package/src/resources/extensions/gsd/tools/complete-slice.ts +26 -0
  609. package/src/resources/extensions/gsd/tools/validate-milestone.ts +48 -3
  610. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +3 -11
  611. package/src/resources/extensions/gsd/triage-resolution.ts +2 -7
  612. package/src/resources/extensions/gsd/types.ts +14 -1
  613. package/src/resources/extensions/gsd/unit-ownership.ts +2 -2
  614. package/src/resources/extensions/gsd/uok/audit-toggle.ts +9 -0
  615. package/src/resources/extensions/gsd/uok/audit.ts +51 -0
  616. package/src/resources/extensions/gsd/uok/contracts.ts +135 -0
  617. package/src/resources/extensions/gsd/uok/execution-graph.ts +241 -0
  618. package/src/resources/extensions/gsd/uok/flags.ts +45 -0
  619. package/src/resources/extensions/gsd/uok/gate-runner.ts +146 -0
  620. package/src/resources/extensions/gsd/uok/gitops.ts +75 -0
  621. package/src/resources/extensions/gsd/uok/kernel.ts +105 -0
  622. package/src/resources/extensions/gsd/uok/loop-adapter.ts +162 -0
  623. package/src/resources/extensions/gsd/uok/model-policy.ts +112 -0
  624. package/src/resources/extensions/gsd/uok/plan-v2.ts +156 -0
  625. package/src/resources/extensions/gsd/workflow-logger.ts +27 -1
  626. package/src/resources/extensions/gsd/workflow-manifest.ts +9 -104
  627. package/src/resources/extensions/gsd/workflow-migration.ts +21 -29
  628. package/src/resources/extensions/gsd/workflow-projections.ts +8 -1
  629. package/src/resources/extensions/gsd/workflow-reconcile.ts +15 -15
  630. package/src/resources/extensions/ttsr/ttsr-manager.ts +10 -5
  631. package/dist/web/standalone/.next/static/chunks/app/page-7115e62689b5fd84.js +0 -1
  632. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  633. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  634. package/packages/pi-ai/dist/models.custom.d.ts.map +0 -1
  635. package/packages/pi-ai/dist/models.custom.js.map +0 -1
  636. package/packages/pi-ai/dist/models.generated.js +0 -14343
  637. package/packages/pi-ai/dist/models.generated.js.map +0 -1
  638. package/packages/pi-ai/src/models.generated.ts +0 -14345
  639. /package/dist/web/standalone/.next/static/{Qr27MOHx0lxRGnJvlhxxu → tqdo0yKKYz6fJXQnIgbdx}/_buildManifest.js +0 -0
  640. /package/dist/web/standalone/.next/static/{Qr27MOHx0lxRGnJvlhxxu → tqdo0yKKYz6fJXQnIgbdx}/_ssgManifest.js +0 -0
@@ -8,7 +8,12 @@
8
8
  import { VALID_BRANCH_NAME } from "./git-service.js";
9
9
  import { normalizeStringArray } from "../shared/format-utils.js";
10
10
  import { KNOWN_PREFERENCE_KEYS, KNOWN_UNIT_TYPES, SKILL_ACTIONS, } from "./preferences-types.js";
11
- const VALID_TOKEN_PROFILES = new Set(["budget", "balanced", "quality"]);
11
+ const VALID_TOKEN_PROFILES = new Set(["budget", "balanced", "quality", "burn-max"]);
12
+ const VALID_UOK_TURN_ACTIONS = new Set([
13
+ "commit",
14
+ "snapshot",
15
+ "status-only",
16
+ ]);
12
17
  export function validatePreferences(preferences) {
13
18
  const errors = [];
14
19
  const warnings = [];
@@ -136,13 +141,114 @@ export function validatePreferences(preferences) {
136
141
  errors.push(`budget_enforcement must be one of: warn, pause, halt`);
137
142
  }
138
143
  }
144
+ // ─── UOK Flags ──────────────────────────────────────────────────────
145
+ if (preferences.uok !== undefined) {
146
+ if (typeof preferences.uok === "object" && preferences.uok !== null) {
147
+ const raw = preferences.uok;
148
+ const valid = {};
149
+ if (raw.enabled !== undefined) {
150
+ if (typeof raw.enabled === "boolean")
151
+ valid.enabled = raw.enabled;
152
+ else
153
+ errors.push("uok.enabled must be a boolean");
154
+ }
155
+ const parseEnabledBlock = (key) => {
156
+ const value = raw[key];
157
+ if (value === undefined)
158
+ return;
159
+ if (typeof value !== "object" || value === null) {
160
+ errors.push(`uok.${key} must be an object`);
161
+ return;
162
+ }
163
+ const block = value;
164
+ const parsed = {};
165
+ if (block.enabled !== undefined) {
166
+ if (typeof block.enabled === "boolean")
167
+ parsed.enabled = block.enabled;
168
+ else
169
+ errors.push(`uok.${key}.enabled must be a boolean`);
170
+ }
171
+ const unknown = Object.keys(block).filter((k) => k !== "enabled");
172
+ for (const unk of unknown) {
173
+ warnings.push(`unknown uok.${key} key "${unk}" — ignored`);
174
+ }
175
+ if (Object.keys(parsed).length > 0) {
176
+ valid[key] = parsed;
177
+ }
178
+ };
179
+ parseEnabledBlock("legacy_fallback");
180
+ parseEnabledBlock("gates");
181
+ parseEnabledBlock("model_policy");
182
+ parseEnabledBlock("execution_graph");
183
+ parseEnabledBlock("audit_unified");
184
+ parseEnabledBlock("plan_v2");
185
+ if (raw.gitops !== undefined) {
186
+ if (typeof raw.gitops !== "object" || raw.gitops === null) {
187
+ errors.push("uok.gitops must be an object");
188
+ }
189
+ else {
190
+ const gitops = raw.gitops;
191
+ const parsed = {};
192
+ if (gitops.enabled !== undefined) {
193
+ if (typeof gitops.enabled === "boolean")
194
+ parsed.enabled = gitops.enabled;
195
+ else
196
+ errors.push("uok.gitops.enabled must be a boolean");
197
+ }
198
+ if (gitops.turn_action !== undefined) {
199
+ if (typeof gitops.turn_action === "string" &&
200
+ VALID_UOK_TURN_ACTIONS.has(gitops.turn_action)) {
201
+ parsed.turn_action = gitops.turn_action;
202
+ }
203
+ else {
204
+ errors.push("uok.gitops.turn_action must be one of: commit, snapshot, status-only");
205
+ }
206
+ }
207
+ if (gitops.turn_push !== undefined) {
208
+ if (typeof gitops.turn_push === "boolean")
209
+ parsed.turn_push = gitops.turn_push;
210
+ else
211
+ errors.push("uok.gitops.turn_push must be a boolean");
212
+ }
213
+ const unknown = Object.keys(gitops).filter((k) => !["enabled", "turn_action", "turn_push"].includes(k));
214
+ for (const unk of unknown) {
215
+ warnings.push(`unknown uok.gitops key "${unk}" — ignored`);
216
+ }
217
+ if (Object.keys(parsed).length > 0) {
218
+ valid.gitops = parsed;
219
+ }
220
+ }
221
+ }
222
+ const knownUokKeys = new Set([
223
+ "enabled",
224
+ "legacy_fallback",
225
+ "gates",
226
+ "model_policy",
227
+ "execution_graph",
228
+ "gitops",
229
+ "audit_unified",
230
+ "plan_v2",
231
+ ]);
232
+ for (const key of Object.keys(raw)) {
233
+ if (!knownUokKeys.has(key)) {
234
+ warnings.push(`unknown uok key "${key}" — ignored`);
235
+ }
236
+ }
237
+ if (Object.keys(valid).length > 0) {
238
+ validated.uok = valid;
239
+ }
240
+ }
241
+ else {
242
+ errors.push("uok must be an object");
243
+ }
244
+ }
139
245
  // ─── Token Profile ─────────────────────────────────────────────────
140
246
  if (preferences.token_profile !== undefined) {
141
247
  if (typeof preferences.token_profile === "string" && VALID_TOKEN_PROFILES.has(preferences.token_profile)) {
142
248
  validated.token_profile = preferences.token_profile;
143
249
  }
144
250
  else {
145
- errors.push(`token_profile must be one of: budget, balanced, quality`);
251
+ errors.push(`token_profile must be one of: budget, balanced, quality, burn-max`);
146
252
  }
147
253
  }
148
254
  // ─── Search Provider ─────────────────────────────────────────────
@@ -155,6 +261,28 @@ export function validatePreferences(preferences) {
155
261
  errors.push(`search_provider must be one of: brave, tavily, ollama, native, auto`);
156
262
  }
157
263
  }
264
+ // ─── Flat-rate Providers ────────────────────────────────────────────
265
+ // User-declared flat-rate providers for dynamic routing suppression.
266
+ // Built-in providers (github-copilot, copilot, claude-code) and any
267
+ // externalCli provider are already auto-detected; this list layers on
268
+ // top for private subscription proxies and custom CLI wrappers.
269
+ if (preferences.flat_rate_providers !== undefined) {
270
+ if (Array.isArray(preferences.flat_rate_providers)) {
271
+ const allStrings = preferences.flat_rate_providers.every((item) => typeof item === "string");
272
+ if (allStrings) {
273
+ // Strip empty/whitespace-only entries to avoid false matches.
274
+ validated.flat_rate_providers = preferences.flat_rate_providers
275
+ .map((s) => s.trim())
276
+ .filter((s) => s.length > 0);
277
+ }
278
+ else {
279
+ errors.push("flat_rate_providers must be an array of strings");
280
+ }
281
+ }
282
+ else {
283
+ errors.push("flat_rate_providers must be an array of strings");
284
+ }
285
+ }
158
286
  // ─── Phase Skip Preferences ─────────────────────────────────────────
159
287
  if (preferences.phases !== undefined) {
160
288
  if (typeof preferences.phases === "object" && preferences.phases !== null) {
@@ -293,6 +293,32 @@ function mergePreferences(base, override) {
293
293
  dynamic_routing: (base.dynamic_routing || override.dynamic_routing)
294
294
  ? { ...(base.dynamic_routing ?? {}), ...(override.dynamic_routing ?? {}) }
295
295
  : undefined,
296
+ uok: (base.uok || override.uok)
297
+ ? {
298
+ enabled: override.uok?.enabled ?? base.uok?.enabled,
299
+ legacy_fallback: (base.uok?.legacy_fallback || override.uok?.legacy_fallback)
300
+ ? { ...(base.uok?.legacy_fallback ?? {}), ...(override.uok?.legacy_fallback ?? {}) }
301
+ : undefined,
302
+ gates: (base.uok?.gates || override.uok?.gates)
303
+ ? { ...(base.uok?.gates ?? {}), ...(override.uok?.gates ?? {}) }
304
+ : undefined,
305
+ model_policy: (base.uok?.model_policy || override.uok?.model_policy)
306
+ ? { ...(base.uok?.model_policy ?? {}), ...(override.uok?.model_policy ?? {}) }
307
+ : undefined,
308
+ execution_graph: (base.uok?.execution_graph || override.uok?.execution_graph)
309
+ ? { ...(base.uok?.execution_graph ?? {}), ...(override.uok?.execution_graph ?? {}) }
310
+ : undefined,
311
+ gitops: (base.uok?.gitops || override.uok?.gitops)
312
+ ? { ...(base.uok?.gitops ?? {}), ...(override.uok?.gitops ?? {}) }
313
+ : undefined,
314
+ audit_unified: (base.uok?.audit_unified || override.uok?.audit_unified)
315
+ ? { ...(base.uok?.audit_unified ?? {}), ...(override.uok?.audit_unified ?? {}) }
316
+ : undefined,
317
+ plan_v2: (base.uok?.plan_v2 || override.uok?.plan_v2)
318
+ ? { ...(base.uok?.plan_v2 ?? {}), ...(override.uok?.plan_v2 ?? {}) }
319
+ : undefined,
320
+ }
321
+ : undefined,
296
322
  token_profile: override.token_profile ?? base.token_profile,
297
323
  phases: (base.phases || override.phases)
298
324
  ? { ...(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}}
@@ -21,6 +21,7 @@ import { createWorktree, worktreePath, removeWorktree } from "./worktree-manager
21
21
  import { writeSessionStatus, } from "./session-status-io.js";
22
22
  import { hasFileConflict } from "./slice-parallel-conflict.js";
23
23
  import { getErrorMessage } from "./error-utils.js";
24
+ import { selectConflictFreeBatch } from "./uok/execution-graph.js";
24
25
  // ─── Module State ──────────────────────────────────────────────────────────
25
26
  let sliceState = null;
26
27
  // ─── Public API ────────────────────────────────────────────────────────────
@@ -62,7 +63,7 @@ export async function startSliceParallel(basePath, milestoneId, eligibleSlices,
62
63
  const started = [];
63
64
  const errors = [];
64
65
  // Filter out conflicting slices (conservative: check all pairs)
65
- const safeSlices = filterConflictingSlices(basePath, milestoneId, eligibleSlices);
66
+ const safeSlices = filterConflictingSlices(basePath, milestoneId, eligibleSlices, opts.useExecutionGraph === true);
66
67
  // Limit to maxWorkers
67
68
  const toSpawn = safeSlices.slice(0, maxWorkers);
68
69
  for (const slice of toSpawn) {
@@ -176,7 +177,16 @@ export function resetSliceOrchestrator() {
176
177
  * Greedy: add slices to the safe set in order; skip any that conflict
177
178
  * with an already-included slice.
178
179
  */
179
- function filterConflictingSlices(basePath, milestoneId, slices) {
180
+ function filterConflictingSlices(basePath, milestoneId, slices, useExecutionGraph) {
181
+ if (useExecutionGraph) {
182
+ const selectedIds = selectConflictFreeBatch({
183
+ orderedIds: slices.map((slice) => slice.id),
184
+ maxParallel: slices.length,
185
+ hasConflict: (candidate, existing) => hasFileConflict(basePath, milestoneId, candidate, existing),
186
+ });
187
+ const selected = new Set(selectedIds);
188
+ return slices.filter((slice) => selected.has(slice.id));
189
+ }
180
190
  const safe = [];
181
191
  for (const candidate of slices) {
182
192
  let conflictsWithSafe = false;
@@ -271,7 +271,11 @@ function reconcileDiskToDb(basePath) {
271
271
  try {
272
272
  roadmapContent = readFileSync(roadmapPath, "utf-8");
273
273
  }
274
- catch {
274
+ catch (err) {
275
+ logWarning("state", "reconcileDiskToDb: roadmap read failed, skipping milestone", {
276
+ mid,
277
+ error: err.message,
278
+ });
275
279
  continue;
276
280
  }
277
281
  const parsed = parseRoadmap(roadmapContent);
@@ -312,6 +316,10 @@ function reconcileDiskToDb(basePath) {
312
316
  function buildCompletenessSet(basePath, milestones) {
313
317
  const completeMilestoneIds = new Set();
314
318
  const parkedMilestoneIds = new Set();
319
+ // DB-authoritative: a milestone is only "complete" when its DB row says so.
320
+ // SUMMARY-file presence is NOT a completion signal here — an orphan SUMMARY
321
+ // (crashed complete-milestone turn, partial merge, manual edit) must not
322
+ // flip derived state to complete and cascade into a false auto-merge (#4179).
315
323
  for (const m of milestones) {
316
324
  const parkedFile = resolveMilestoneFile(basePath, m.id, "PARKED");
317
325
  if (parkedFile || m.status === 'parked') {
@@ -322,11 +330,6 @@ function buildCompletenessSet(basePath, milestones) {
322
330
  completeMilestoneIds.add(m.id);
323
331
  continue;
324
332
  }
325
- const summaryFile = resolveMilestoneFile(basePath, m.id, "SUMMARY");
326
- if (summaryFile) {
327
- completeMilestoneIds.add(m.id);
328
- continue;
329
- }
330
333
  }
331
334
  return { completeMilestoneIds, parkedMilestoneIds };
332
335
  }
@@ -347,17 +350,22 @@ async function buildRegistryAndFindActive(basePath, milestones, completeMileston
347
350
  if (isGhostMilestone(basePath, m.id))
348
351
  continue;
349
352
  }
350
- const summaryFile = resolveMilestoneFile(basePath, m.id, "SUMMARY");
351
- if (completeMilestoneIds.has(m.id) || (summaryFile !== null)) {
353
+ // DB-authoritative completeness (#4179): only trust completeMilestoneIds,
354
+ // which is itself derived from DB status. SUMMARY-file presence alone must
355
+ // not imply completion. The summary file may still be consulted below as a
356
+ // title source for legitimately-complete milestones whose DB row has no title.
357
+ if (completeMilestoneIds.has(m.id)) {
352
358
  let title = stripMilestonePrefix(m.title) || m.id;
353
- if (summaryFile && !m.title) {
354
- const summaryContent = await loadFile(summaryFile);
355
- if (summaryContent) {
356
- title = parseSummary(summaryContent).title || m.id;
359
+ if (!m.title) {
360
+ const summaryFile = resolveMilestoneFile(basePath, m.id, "SUMMARY");
361
+ if (summaryFile) {
362
+ const summaryContent = await loadFile(summaryFile);
363
+ if (summaryContent) {
364
+ title = parseSummary(summaryContent).title || m.id;
365
+ }
357
366
  }
358
367
  }
359
368
  registry.push({ id: m.id, title, status: 'complete' });
360
- completeMilestoneIds.add(m.id);
361
369
  continue;
362
370
  }
363
371
  const allSlicesDone = slices.length > 0 && slices.every(s => isStatusDone(s.status));
@@ -391,7 +399,14 @@ async function buildRegistryAndFindActive(basePath, milestones, completeMileston
391
399
  const validationFile = resolveMilestoneFile(basePath, m.id, "VALIDATION");
392
400
  const validationContent = validationFile ? await loadFile(validationFile) : null;
393
401
  const validationTerminal = validationContent ? isValidationTerminal(validationContent) : false;
394
- if (!validationTerminal || (validationTerminal && !summaryFile)) {
402
+ // DB-authoritative (#4179): completeness is already decided by
403
+ // completeMilestoneIds above. If we reached this branch, the DB says
404
+ // the milestone is NOT complete — so any SUMMARY file on disk is an
405
+ // orphan (crashed complete-milestone, partial merge, manual edit) and
406
+ // must not short-circuit this path. When validation is terminal, fall
407
+ // through to the default active-push below so `complete-milestone` can
408
+ // re-run idempotently.
409
+ if (!validationTerminal) {
395
410
  activeMilestone = { id: m.id, title };
396
411
  activeMilestoneSlices = slices;
397
412
  activeMilestoneFound = true;
@@ -516,6 +531,9 @@ function resolveSliceDependencies(activeMilestoneSlices) {
516
531
  return { activeSlice: null, activeSliceRow: null };
517
532
  }
518
533
  }
534
+ // First pass: find a slice with ALL dependencies satisfied (strict)
535
+ let bestFallback = null;
536
+ let bestFallbackSatisfied = -1;
519
537
  for (const s of activeMilestoneSlices) {
520
538
  if (isStatusDone(s.status))
521
539
  continue;
@@ -524,6 +542,23 @@ function resolveSliceDependencies(activeMilestoneSlices) {
524
542
  if (s.depends.every(dep => doneSliceIds.has(dep))) {
525
543
  return { activeSlice: { id: s.id, title: s.title }, activeSliceRow: s };
526
544
  }
545
+ // Track the slice with the most satisfied dependencies as fallback
546
+ const satisfied = s.depends.filter(dep => doneSliceIds.has(dep)).length;
547
+ if (satisfied > bestFallbackSatisfied || (satisfied === bestFallbackSatisfied && !bestFallback)) {
548
+ bestFallback = s;
549
+ bestFallbackSatisfied = satisfied;
550
+ }
551
+ }
552
+ // Fallback: if no slice has all deps met but there ARE incomplete non-deferred
553
+ // slices, pick the one with the most deps satisfied. This prevents hard-blocking
554
+ // when dependency metadata is stale (e.g. after reassessment added/removed slices)
555
+ // or when deps reference slices from previous milestones.
556
+ if (bestFallback) {
557
+ const unmet = bestFallback.depends.filter(dep => !doneSliceIds.has(dep));
558
+ logWarning("state", `No slice has all deps satisfied — falling back to ${bestFallback.id} ` +
559
+ `(${bestFallbackSatisfied}/${bestFallback.depends.length} deps met, ` +
560
+ `unmet: ${unmet.join(", ")})`, { mid: activeMilestoneSlices[0]?.milestone_id, sid: bestFallback.id });
561
+ return { activeSlice: { id: bestFallback.id, title: bestFallback.title }, activeSliceRow: bestFallback };
527
562
  }
528
563
  return { activeSlice: null, activeSliceRow: null };
529
564
  }
@@ -567,7 +602,7 @@ async function reconcileSliceTasks(basePath, milestoneId, sliceId, planFile) {
567
602
  const summaryPath = resolveTaskFile(basePath, milestoneId, sliceId, t.id, "SUMMARY");
568
603
  if (summaryPath && existsSync(summaryPath)) {
569
604
  try {
570
- updateTaskStatus(milestoneId, sliceId, t.id, "complete");
605
+ updateTaskStatus(milestoneId, sliceId, t.id, "complete", new Date().toISOString());
571
606
  logWarning("reconcile", `task ${milestoneId}/${sliceId}/${t.id} status reconciled from "${t.status}" to "complete" (#2514)`, { mid: milestoneId, sid: sliceId, tid: t.id });
572
607
  reconciled = true;
573
608
  }
@@ -1269,6 +1304,8 @@ export async function _deriveStateImpl(basePath) {
1269
1304
  }
1270
1305
  }
1271
1306
  else {
1307
+ let bestFallbackLegacy = null;
1308
+ let bestFallbackLegacySatisfied = -1;
1272
1309
  for (const s of activeRoadmap.slices) {
1273
1310
  if (s.done)
1274
1311
  continue;
@@ -1276,6 +1313,20 @@ export async function _deriveStateImpl(basePath) {
1276
1313
  activeSlice = { id: s.id, title: s.title };
1277
1314
  break;
1278
1315
  }
1316
+ // Track best fallback
1317
+ const satisfied = s.depends.filter(dep => doneSliceIds.has(dep)).length;
1318
+ if (satisfied > bestFallbackLegacySatisfied) {
1319
+ bestFallbackLegacy = s;
1320
+ bestFallbackLegacySatisfied = satisfied;
1321
+ }
1322
+ }
1323
+ // Fallback: if no slice has all deps met, pick the one with the most deps satisfied
1324
+ if (!activeSlice && bestFallbackLegacy) {
1325
+ const unmet = bestFallbackLegacy.depends.filter(dep => !doneSliceIds.has(dep));
1326
+ logWarning("state", `No slice has all deps satisfied — falling back to ${bestFallbackLegacy.id} ` +
1327
+ `(${bestFallbackLegacySatisfied}/${bestFallbackLegacy.depends.length} deps met, ` +
1328
+ `unmet: ${unmet.join(", ")})`);
1329
+ activeSlice = { id: bestFallbackLegacy.id, title: bestFallbackLegacy.title };
1279
1330
  }
1280
1331
  }
1281
1332
  if (!activeSlice) {
@@ -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:
@@ -354,6 +354,26 @@ export async function handleCompleteSlice(params, basePath) {
354
354
  catch (eventErr) {
355
355
  logError("tool", `complete-slice event log FAILED — completion invisible to reconciliation`, { error: eventErr.message });
356
356
  }
357
+ // Fire-and-forget graph rebuild — must NOT await, must NOT crash slice completion.
358
+ // Dynamic import of the package name (not a relative path) so it resolves
359
+ // correctly via package.json#exports in both development and production.
360
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
361
+ (async () => {
362
+ try {
363
+ const graphMod = await import("@gsd-build/mcp-server");
364
+ if (typeof graphMod.buildGraph !== "function"
365
+ || typeof graphMod.writeGraph !== "function"
366
+ || typeof graphMod.resolveGsdRoot !== "function") {
367
+ throw new Error("graph helpers unavailable from @gsd-build/mcp-server");
368
+ }
369
+ const g = await graphMod.buildGraph(basePath);
370
+ await graphMod.writeGraph(graphMod.resolveGsdRoot(basePath), g);
371
+ }
372
+ catch (graphErr) {
373
+ // Graph rebuild is best-effort — log at warning level but never propagate
374
+ logWarning("tool", `complete-slice graph rebuild failed (non-fatal): ${graphErr.message ?? String(graphErr)}`);
375
+ }
376
+ })();
357
377
  return {
358
378
  sliceId: params.sliceId,
359
379
  milestoneId: params.milestoneId,
@@ -16,6 +16,9 @@ import { invalidateStateCache } from "../state.js";
16
16
  import { VALIDATION_VERDICTS, isValidMilestoneVerdict } from "../verdict-parser.js";
17
17
  import { insertMilestoneValidationGates } from "../milestone-validation-gates.js";
18
18
  import { logWarning } from "../workflow-logger.js";
19
+ import { UokGateRunner } from "../uok/gate-runner.js";
20
+ import { loadEffectiveGSDPreferences } from "../preferences.js";
21
+ import { resolveUokFlags } from "../uok/flags.js";
19
22
  function renderValidationMarkdown(params) {
20
23
  let md = `---
21
24
  verdict: ${params.verdict}
@@ -48,7 +51,7 @@ ${params.verdictRationale}
48
51
  }
49
52
  return md;
50
53
  }
51
- export async function handleValidateMilestone(params, basePath) {
54
+ export async function handleValidateMilestone(params, basePath, opts) {
52
55
  if (!params.milestoneId || typeof params.milestoneId !== "string" || params.milestoneId.trim() === "") {
53
56
  return { error: "milestoneId is required and must be a non-empty string" };
54
57
  }
@@ -73,6 +76,8 @@ export async function handleValidateMilestone(params, basePath) {
73
76
  // rendering can regenerate. The inverse (file exists, no DB row) is
74
77
  // harder to detect and recover from (#2725).
75
78
  const validatedAt = new Date().toISOString();
79
+ const slices = getMilestoneSlices(params.milestoneId);
80
+ const gateSliceId = slices.length > 0 ? slices[0].id : "_milestone";
76
81
  transaction(() => {
77
82
  insertAssessment({
78
83
  path: validationPath,
@@ -86,9 +91,7 @@ export async function handleValidateMilestone(params, basePath) {
86
91
  // #2945 Bug 4: persist quality_gates records alongside the assessment.
87
92
  // Previously only the assessment was written, leaving M002+ milestones
88
93
  // with zero quality_gate records despite passing validation.
89
- const slices = getMilestoneSlices(params.milestoneId);
90
- const sliceId = slices.length > 0 ? slices[0].id : "_milestone";
91
- insertMilestoneValidationGates(params.milestoneId, sliceId, params.verdict, validatedAt);
94
+ insertMilestoneValidationGates(params.milestoneId, gateSliceId, params.verdict, validatedAt);
92
95
  });
93
96
  // ── Filesystem render (outside transaction) ────────────────────────────
94
97
  // If disk render fails, roll back the DB row so state stays consistent.
@@ -103,6 +106,38 @@ export async function handleValidateMilestone(params, basePath) {
103
106
  invalidateStateCache();
104
107
  clearPathCache();
105
108
  clearParseCache();
109
+ const prefs = loadEffectiveGSDPreferences()?.preferences;
110
+ const gatesEnabled = opts?.uokGatesEnabled ?? resolveUokFlags(prefs).gates;
111
+ if (gatesEnabled) {
112
+ try {
113
+ const gateRunner = new UokGateRunner();
114
+ const nonPassVerdict = params.verdict !== "pass";
115
+ gateRunner.register({
116
+ id: "milestone-validation-gates",
117
+ type: "verification",
118
+ execute: async () => ({
119
+ outcome: nonPassVerdict ? "manual-attention" : "pass",
120
+ failureClass: nonPassVerdict ? "manual-attention" : "none",
121
+ rationale: `milestone validation verdict: ${params.verdict}`,
122
+ findings: nonPassVerdict
123
+ ? [params.verdictRationale, params.remediationPlan ?? ""].filter(Boolean).join("\n")
124
+ : "",
125
+ }),
126
+ });
127
+ await gateRunner.run("milestone-validation-gates", {
128
+ basePath,
129
+ traceId: opts?.traceId ?? `validate-milestone:${params.milestoneId}`,
130
+ turnId: opts?.turnId ?? `${params.milestoneId}:validate`,
131
+ milestoneId: params.milestoneId,
132
+ sliceId: gateSliceId,
133
+ unitType: "validate-milestone",
134
+ unitId: params.milestoneId,
135
+ });
136
+ }
137
+ catch (err) {
138
+ logWarning("tool", `validate_milestone — failed to persist UOK gate result: ${err.message}`);
139
+ }
140
+ }
106
141
  return {
107
142
  milestoneId: params.milestoneId,
108
143
  verdict: params.verdict,
@@ -1,7 +1,7 @@
1
1
  import { ensureDbOpen } from "../bootstrap/dynamic-tools.js";
2
2
  import { sanitizeCompleteMilestoneParams } from "../bootstrap/sanitize-complete-milestone.js";
3
3
  import { loadWriteGateSnapshot, shouldBlockContextArtifactSaveInSnapshot } from "../bootstrap/write-gate.js";
4
- import { getMilestone, getSliceStatusSummary, getSliceTaskCounts, _getAdapter, saveGateResult, } from "../gsd-db.js";
4
+ import { getMilestone, getSliceStatusSummary, getSliceTaskCounts, readTransaction, saveGateResult, } from "../gsd-db.js";
5
5
  import { GATE_REGISTRY } from "../gate-registry.js";
6
6
  import { saveArtifactToDb } from "../db-writer.js";
7
7
  import { handleCompleteMilestone } from "./complete-milestone.js";
@@ -493,12 +493,9 @@ export async function executeMilestoneStatus(params, basePath = process.cwd()) {
493
493
  isError: true,
494
494
  };
495
495
  }
496
- const adapter = _getAdapter();
497
- adapter.exec("BEGIN");
498
- try {
496
+ return readTransaction(() => {
499
497
  const milestone = getMilestone(params.milestoneId);
500
498
  if (!milestone) {
501
- adapter.exec("COMMIT");
502
499
  return {
503
500
  content: [{ type: "text", text: `Milestone ${params.milestoneId} not found in database.` }],
504
501
  details: { operation: "milestone_status", milestoneId: params.milestoneId, found: false },
@@ -510,7 +507,6 @@ export async function executeMilestoneStatus(params, basePath = process.cwd()) {
510
507
  status: s.status,
511
508
  taskCounts: getSliceTaskCounts(params.milestoneId, s.id),
512
509
  }));
513
- adapter.exec("COMMIT");
514
510
  const result = {
515
511
  milestoneId: milestone.id,
516
512
  title: milestone.title,
@@ -524,14 +520,7 @@ export async function executeMilestoneStatus(params, basePath = process.cwd()) {
524
520
  content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
525
521
  details: { operation: "milestone_status", milestoneId: milestone.id, sliceCount: slices.length },
526
522
  };
527
- }
528
- catch (txErr) {
529
- try {
530
- adapter.exec("ROLLBACK");
531
- }
532
- catch { /* swallow */ }
533
- throw txErr;
534
- }
523
+ });
535
524
  }
536
525
  catch (err) {
537
526
  const msg = err instanceof Error ? err.message : String(err);
@@ -83,12 +83,9 @@ export function executeReplan(basePath, mid, sid, capture) {
83
83
  // Also write replan_triggered_at column for DB-backed detection
84
84
  try {
85
85
  const req = createRequire(import.meta.url);
86
- const { isDbAvailable, _getAdapter } = req("./gsd-db.js");
86
+ const { isDbAvailable, setSliceReplanTriggeredAt } = req("./gsd-db.js");
87
87
  if (isDbAvailable()) {
88
- const adapter = _getAdapter();
89
- if (adapter) {
90
- adapter.prepare("UPDATE slices SET replan_triggered_at = :ts WHERE milestone_id = :mid AND id = :sid").run({ ":ts": ts, ":mid": mid, ":sid": sid });
91
- }
88
+ setSliceReplanTriggeredAt(mid, sid, ts);
92
89
  }
93
90
  }
94
91
  catch {
@@ -20,7 +20,7 @@ let providerModule = null;
20
20
  let loadAttempted = false;
21
21
  function suppressSqliteWarning() {
22
22
  const origEmit = process.emit;
23
- // @ts-expect-error overriding process.emit for warning filter
23
+ // Override via loose cast: Node's overloaded emit signature is not directly assignable.
24
24
  process.emit = function (event, ...args) {
25
25
  if (event === "warning" &&
26
26
  args[0] &&
@@ -0,0 +1,7 @@
1
+ const AUDIT_ENV_KEY = "GSD_UOK_AUDIT_UNIFIED";
2
+ export function setUnifiedAuditEnabled(enabled) {
3
+ process.env[AUDIT_ENV_KEY] = enabled ? "1" : "0";
4
+ }
5
+ export function isUnifiedAuditEnabled() {
6
+ return process.env[AUDIT_ENV_KEY] === "1";
7
+ }