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
@@ -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:
@@ -688,8 +688,8 @@ test("autoLoop exits on terminal blocked state", async (t) => {
688
688
 
689
689
  assert.ok(deps.callLog.includes("deriveState"), "should have derived state");
690
690
  assert.ok(
691
- deps.callLog.includes("stopAuto"),
692
- "should have called stopAuto for blocked state",
691
+ deps.callLog.includes("pauseAuto"),
692
+ "should have called pauseAuto for blocked state",
693
693
  );
694
694
  assert.ok(
695
695
  !deps.callLog.includes("resolveDispatch"),
@@ -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" },
@@ -0,0 +1,53 @@
1
+ // GSD-2 — Tests for step-mode completion messages in auto-post-unit
2
+
3
+ import test from "node:test";
4
+ import assert from "node:assert/strict";
5
+
6
+ import { buildStepCompleteMessage, STEP_COMPLETE_FALLBACK_MESSAGE } from "../auto-post-unit.ts";
7
+ import type { GSDState } from "../types.ts";
8
+
9
+ function makeState(overrides: Partial<GSDState>): GSDState {
10
+ return {
11
+ activeMilestone: null,
12
+ activeSlice: null,
13
+ activeTask: null,
14
+ phase: "executing",
15
+ recentDecisions: [],
16
+ blockers: [],
17
+ nextAction: "",
18
+ registry: [],
19
+ ...overrides,
20
+ };
21
+ }
22
+
23
+ test("buildStepCompleteMessage: milestone complete surfaces review guidance", () => {
24
+ const msg = buildStepCompleteMessage(makeState({ phase: "complete" }));
25
+ assert.match(msg, /milestone finished/);
26
+ assert.match(msg, /\/gsd status/);
27
+ assert.doesNotMatch(msg, /Next:/);
28
+ });
29
+
30
+ test("buildStepCompleteMessage: mid-flight step includes next unit label and /clear hint", () => {
31
+ const state = makeState({
32
+ phase: "executing",
33
+ activeSlice: { id: "S01", title: "Core" },
34
+ activeTask: { id: "T03", title: "Wire notify" },
35
+ });
36
+ const msg = buildStepCompleteMessage(state);
37
+ assert.match(msg, /Next: Execute T03: Wire notify/);
38
+ assert.match(msg, /\/clear/);
39
+ assert.match(msg, /\/gsd to continue/);
40
+ });
41
+
42
+ test("buildStepCompleteMessage: unknown phase falls back to generic continue label", () => {
43
+ // Cast to bypass Phase union so we exercise the default branch of describeNextUnit.
44
+ const state = makeState({ phase: "totally-unknown" as unknown as GSDState["phase"] });
45
+ const msg = buildStepCompleteMessage(state);
46
+ assert.match(msg, /Next: Continue/);
47
+ assert.match(msg, /\/clear/);
48
+ });
49
+
50
+ test("STEP_COMPLETE_FALLBACK_MESSAGE: used when deriveState throws, still points users at /clear + /gsd", () => {
51
+ assert.match(STEP_COMPLETE_FALLBACK_MESSAGE, /\/clear/);
52
+ assert.match(STEP_COMPLETE_FALLBACK_MESSAGE, /\/gsd/);
53
+ });
@@ -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
 
@@ -33,8 +33,12 @@ test("bootstrapAutoSession checks manual session override before preferences", (
33
33
  assert.ok(manualIdx > -1, "auto-start.ts should read session model override first");
34
34
 
35
35
  // resolveDefaultSessionModel() should still be called for fallback behavior
36
- const preferredIdx = source.indexOf("const preferredModel = resolveDefaultSessionModel(");
37
- assert.ok(preferredIdx > -1, "auto-start.ts should call resolveDefaultSessionModel()");
36
+ const preferredIdx = source.indexOf("const preferredModel = ");
37
+ assert.ok(preferredIdx > -1, "auto-start.ts should build preferredModel");
38
+ assert.ok(
39
+ source.indexOf("resolveDefaultSessionModel(") > -1,
40
+ "auto-start.ts should call resolveDefaultSessionModel()",
41
+ );
38
42
 
39
43
  // Session provider should be passed for bare model ID resolution
40
44
  const withProviderIdx = source.indexOf("resolveDefaultSessionModel(ctx.model?.provider)");
@@ -47,6 +51,51 @@ test("bootstrapAutoSession checks manual session override before preferences", (
47
51
  manualIdx < snapshotIdx && preferredIdx < snapshotIdx,
48
52
  "manual override and preference fallback must be resolved before building startModelSnapshot",
49
53
  );
54
+
55
+ // The validated preferred model must still appear as one of the snapshot
56
+ // sources so PREFERENCES.md continues to win over a stale settings.json
57
+ // default for built-in providers.
58
+ const snapshotBlock = source.slice(snapshotIdx, snapshotIdx + 400);
59
+ assert.ok(
60
+ snapshotBlock.includes("validatedPreferredModel") || snapshotBlock.includes("preferredModel"),
61
+ "startModelSnapshot must still consider preferredModel for built-in providers",
62
+ );
63
+ });
64
+
65
+ test("bootstrapAutoSession prefers session model over PREFERENCES.md when provider is custom (#4122)", () => {
66
+ // Custom providers (Ollama, vLLM, OpenAI-compatible proxies) live in
67
+ // ~/.gsd/agent/models.json, not PREFERENCES.md. When the user picks one
68
+ // via /gsd model, that selection must win over any preferredModel from
69
+ // PREFERENCES.md, otherwise auto-mode tries to start a built-in provider
70
+ // the user is not logged into and pauses with "Not logged in".
71
+ const customCheckIdx = source.indexOf("isCustomProvider(ctx.model?.provider)");
72
+ assert.ok(
73
+ customCheckIdx > -1,
74
+ "auto-start.ts should call isCustomProvider() to detect custom-model sessions",
75
+ );
76
+
77
+ // sessionProviderIsCustom must gate preferredModel resolution so that when the
78
+ // session provider is custom, preferredModel is null and PREFERENCES.md is
79
+ // skipped entirely — the snapshot then falls through to ctx.model.
80
+ const gateIdx = source.indexOf("sessionProviderIsCustom");
81
+ assert.ok(gateIdx > -1, "auto-start.ts should bind sessionProviderIsCustom");
82
+
83
+ const preferredIdx = source.indexOf("const preferredModel = ");
84
+ assert.ok(preferredIdx > -1, "auto-start.ts should build preferredModel");
85
+
86
+ const preferredBlock = source.slice(preferredIdx, preferredIdx + 200);
87
+ assert.ok(
88
+ preferredBlock.includes("sessionProviderIsCustom"),
89
+ "preferredModel must be gated on sessionProviderIsCustom so PREFERENCES.md is skipped for custom providers",
90
+ );
91
+
92
+ const snapshotIdx = source.indexOf("const startModelSnapshot = ");
93
+ assert.ok(snapshotIdx > -1, "auto-start.ts should build startModelSnapshot");
94
+
95
+ assert.ok(
96
+ customCheckIdx < preferredIdx && preferredIdx < snapshotIdx,
97
+ "isCustomProvider() must be evaluated before preferredModel, which must be resolved before startModelSnapshot",
98
+ );
50
99
  });
51
100
 
52
101
  test("bootstrapAutoSession validates preferred model against live registry auth (#unconfigured-models)", () => {
@@ -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
+ });
@@ -0,0 +1,127 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+
4
+ // ─── Mock dispatcher to capture routed commands ─────────────────────────
5
+
6
+ let lastRouted: string | null = null;
7
+ let lastQuick: string | null = null;
8
+
9
+ const mockCtx = {
10
+ ui: {
11
+ notify: (_msg: string, _level: string) => {},
12
+ },
13
+ } as any;
14
+
15
+ // We test the keyword matching logic directly since the handler imports
16
+ // the dispatcher dynamically (which requires the full extension runtime).
17
+
18
+ // Inline the route-matching logic from commands-do.ts for unit testing.
19
+ interface Route {
20
+ keywords: string[];
21
+ command: string;
22
+ }
23
+
24
+ const ROUTES: Route[] = [
25
+ { keywords: ["progress", "status", "dashboard", "how far", "where are we"], command: "status" },
26
+ { keywords: ["auto", "autonomous", "run all", "keep going", "start auto"], command: "auto" },
27
+ { keywords: ["stop", "halt", "abort"], command: "stop" },
28
+ { keywords: ["pause", "break", "take a break"], command: "pause" },
29
+ { keywords: ["history", "past", "what happened", "previous"], command: "history" },
30
+ { keywords: ["doctor", "health", "diagnose", "check health"], command: "doctor" },
31
+ { keywords: ["clean up", "cleanup", "remove old", "prune", "tidy"], command: "cleanup" },
32
+ { keywords: ["ship", "pull request", "create pr", "open pr", "merge"], command: "ship" },
33
+ { keywords: ["discuss", "talk about", "architecture", "design"], command: "discuss" },
34
+ { keywords: ["undo", "revert", "rollback", "take back"], command: "undo" },
35
+ { keywords: ["skip", "skip task", "skip this"], command: "skip" },
36
+ { keywords: ["visualize", "viz", "graph", "chart", "show graph"], command: "visualize" },
37
+ { keywords: ["capture", "note", "idea", "thought", "remember"], command: "capture" },
38
+ { keywords: ["inspect", "database", "sqlite", "db state"], command: "inspect" },
39
+ { keywords: ["session report", "session summary", "cost summary", "how much"], command: "session-report" },
40
+ { keywords: ["backlog", "parking lot", "later", "someday"], command: "backlog" },
41
+ { keywords: ["add tests", "write tests", "generate tests", "test coverage"], command: "add-tests" },
42
+ { keywords: ["next", "step", "next step", "what's next"], command: "next" },
43
+ ];
44
+
45
+ interface MatchResult {
46
+ command: string;
47
+ remainingArgs: string;
48
+ score: number;
49
+ }
50
+
51
+ function matchRoute(input: string): MatchResult | null {
52
+ const lower = input.toLowerCase();
53
+ let bestMatch: MatchResult | null = null;
54
+
55
+ for (const route of ROUTES) {
56
+ for (const keyword of route.keywords) {
57
+ if (lower.includes(keyword)) {
58
+ const score = keyword.length;
59
+ if (!bestMatch || score > bestMatch.score) {
60
+ const idx = lower.indexOf(keyword);
61
+ const remaining = (input.slice(0, idx) + input.slice(idx + keyword.length)).trim();
62
+ bestMatch = { command: route.command, remainingArgs: remaining, score };
63
+ }
64
+ }
65
+ }
66
+ }
67
+
68
+ return bestMatch;
69
+ }
70
+
71
+ // ─── Tests ──────────────────────────────────────────────────────────────
72
+
73
+ test("/gsd do: routes 'show me progress' to status", () => {
74
+ const match = matchRoute("show me progress");
75
+ assert.ok(match);
76
+ assert.equal(match.command, "status");
77
+ });
78
+
79
+ test("/gsd do: routes 'run autonomously' to auto", () => {
80
+ const match = matchRoute("run autonomously");
81
+ assert.ok(match);
82
+ assert.equal(match.command, "auto");
83
+ });
84
+
85
+ test("/gsd do: routes 'clean up old branches' to cleanup", () => {
86
+ const match = matchRoute("clean up old branches");
87
+ assert.ok(match);
88
+ assert.equal(match.command, "cleanup");
89
+ assert.equal(match.remainingArgs, "old branches");
90
+ });
91
+
92
+ test("/gsd do: routes 'create pr for milestone' to ship", () => {
93
+ const match = matchRoute("create pr for milestone");
94
+ assert.ok(match);
95
+ assert.equal(match.command, "ship");
96
+ });
97
+
98
+ test("/gsd do: routes 'add tests for S03' to add-tests", () => {
99
+ const match = matchRoute("add tests for S03");
100
+ assert.ok(match);
101
+ assert.equal(match.command, "add-tests");
102
+ });
103
+
104
+ test("/gsd do: routes 'what is next' to next", () => {
105
+ const match = matchRoute("what's next");
106
+ assert.ok(match);
107
+ assert.equal(match.command, "next");
108
+ });
109
+
110
+ test("/gsd do: returns null for unrecognized input", () => {
111
+ const match = matchRoute("florbinate the gizmo");
112
+ assert.equal(match, null);
113
+ });
114
+
115
+ test("/gsd do: prefers longer keyword match", () => {
116
+ // "check health" (12 chars) should beat "health" (6 chars)
117
+ const match = matchRoute("check health of the system");
118
+ assert.ok(match);
119
+ assert.equal(match.command, "doctor");
120
+ assert.ok(match.score >= 12);
121
+ });
122
+
123
+ test("/gsd do: routes 'session report' to session-report", () => {
124
+ const match = matchRoute("show me the session report");
125
+ assert.ok(match);
126
+ assert.equal(match.command, "session-report");
127
+ });