gsd-pi 2.73.1-dev.d987996 → 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 (535) 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 +13 -13
  94. package/dist/web/standalone/.next/build-manifest.json +2 -2
  95. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  96. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  97. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  100. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  104. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  105. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
  117. package/dist/web/standalone/.next/server/app/index.html +1 -1
  118. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
  125. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  126. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  128. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  129. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  130. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  131. package/package.json +3 -3
  132. package/packages/daemon/package.json +2 -2
  133. package/packages/mcp-server/dist/index.d.ts +3 -0
  134. package/packages/mcp-server/dist/index.d.ts.map +1 -1
  135. package/packages/mcp-server/dist/index.js +3 -0
  136. package/packages/mcp-server/dist/index.js.map +1 -1
  137. package/packages/mcp-server/dist/readers/graph.d.ts +87 -0
  138. package/packages/mcp-server/dist/readers/graph.d.ts.map +1 -0
  139. package/packages/mcp-server/dist/readers/graph.js +655 -0
  140. package/packages/mcp-server/dist/readers/graph.js.map +1 -0
  141. package/packages/mcp-server/dist/readers/index.d.ts +2 -0
  142. package/packages/mcp-server/dist/readers/index.d.ts.map +1 -1
  143. package/packages/mcp-server/dist/readers/index.js +1 -0
  144. package/packages/mcp-server/dist/readers/index.js.map +1 -1
  145. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  146. package/packages/mcp-server/dist/server.js +65 -0
  147. package/packages/mcp-server/dist/server.js.map +1 -1
  148. package/packages/mcp-server/package.json +2 -2
  149. package/packages/mcp-server/src/index.ts +15 -0
  150. package/packages/mcp-server/src/readers/graph.test.ts +604 -0
  151. package/packages/mcp-server/src/readers/graph.ts +855 -0
  152. package/packages/mcp-server/src/readers/index.ts +12 -0
  153. package/packages/mcp-server/src/server.ts +83 -0
  154. package/packages/mcp-server/tsconfig.json +1 -0
  155. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -0
  156. package/packages/native/package.json +2 -2
  157. package/packages/native/tsconfig.tsbuildinfo +1 -0
  158. package/packages/pi-agent-core/package.json +1 -1
  159. package/packages/pi-agent-core/tsconfig.json +1 -0
  160. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -0
  161. package/packages/pi-ai/dist/index.d.ts +2 -9
  162. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  163. package/packages/pi-ai/dist/index.js +2 -9
  164. package/packages/pi-ai/dist/index.js.map +1 -1
  165. package/packages/pi-ai/dist/models/capability-patches.d.ts +19 -0
  166. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -0
  167. package/packages/pi-ai/dist/models/capability-patches.js +36 -0
  168. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -0
  169. package/packages/pi-ai/dist/{models.custom.d.ts → models/custom.d.ts} +1 -1
  170. package/packages/pi-ai/dist/models/custom.d.ts.map +1 -0
  171. package/packages/pi-ai/dist/{models.custom.js → models/custom.js} +4 -4
  172. package/packages/pi-ai/dist/models/custom.js.map +1 -0
  173. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +1482 -0
  174. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -0
  175. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +1484 -0
  176. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -0
  177. package/packages/pi-ai/dist/models/generated/anthropic.d.ts +377 -0
  178. package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -0
  179. package/packages/pi-ai/dist/models/generated/anthropic.js +379 -0
  180. package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -0
  181. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts +700 -0
  182. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts.map +1 -0
  183. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js +702 -0
  184. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js.map +1 -0
  185. package/packages/pi-ai/dist/models/generated/cerebras.d.ts +71 -0
  186. package/packages/pi-ai/dist/models/generated/cerebras.d.ts.map +1 -0
  187. package/packages/pi-ai/dist/models/generated/cerebras.js +73 -0
  188. package/packages/pi-ai/dist/models/generated/cerebras.js.map +1 -0
  189. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts +590 -0
  190. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts.map +1 -0
  191. package/packages/pi-ai/dist/models/generated/github-copilot.js +444 -0
  192. package/packages/pi-ai/dist/models/generated/github-copilot.js.map +1 -0
  193. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +156 -0
  194. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -0
  195. package/packages/pi-ai/dist/models/generated/google-antigravity.js +158 -0
  196. package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -0
  197. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts +105 -0
  198. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts.map +1 -0
  199. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js +107 -0
  200. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js.map +1 -0
  201. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts +207 -0
  202. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts.map +1 -0
  203. package/packages/pi-ai/dist/models/generated/google-vertex.js +209 -0
  204. package/packages/pi-ai/dist/models/generated/google-vertex.js.map +1 -0
  205. package/packages/pi-ai/dist/models/generated/google.d.ts +462 -0
  206. package/packages/pi-ai/dist/models/generated/google.d.ts.map +1 -0
  207. package/packages/pi-ai/dist/models/generated/google.js +464 -0
  208. package/packages/pi-ai/dist/models/generated/google.js.map +1 -0
  209. package/packages/pi-ai/dist/models/generated/groq.d.ts +309 -0
  210. package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -0
  211. package/packages/pi-ai/dist/models/generated/groq.js +311 -0
  212. package/packages/pi-ai/dist/models/generated/groq.js.map +1 -0
  213. package/packages/pi-ai/dist/models/generated/huggingface.d.ts +383 -0
  214. package/packages/pi-ai/dist/models/generated/huggingface.d.ts.map +1 -0
  215. package/packages/pi-ai/dist/models/generated/huggingface.js +347 -0
  216. package/packages/pi-ai/dist/models/generated/huggingface.js.map +1 -0
  217. package/packages/pi-ai/dist/{models.generated.d.ts → models/generated/index.d.ts} +1 -1
  218. package/packages/pi-ai/dist/{models.generated.d.ts.map → models/generated/index.d.ts.map} +1 -1
  219. package/packages/pi-ai/dist/models/generated/index.js +51 -0
  220. package/packages/pi-ai/dist/models/generated/index.js.map +1 -0
  221. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts +37 -0
  222. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts.map +1 -0
  223. package/packages/pi-ai/dist/models/generated/kimi-coding.js +39 -0
  224. package/packages/pi-ai/dist/models/generated/kimi-coding.js.map +1 -0
  225. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts +105 -0
  226. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts.map +1 -0
  227. package/packages/pi-ai/dist/models/generated/minimax-cn.js +107 -0
  228. package/packages/pi-ai/dist/models/generated/minimax-cn.js.map +1 -0
  229. package/packages/pi-ai/dist/models/generated/minimax.d.ts +105 -0
  230. package/packages/pi-ai/dist/models/generated/minimax.d.ts.map +1 -0
  231. package/packages/pi-ai/dist/models/generated/minimax.js +107 -0
  232. package/packages/pi-ai/dist/models/generated/minimax.js.map +1 -0
  233. package/packages/pi-ai/dist/models/generated/mistral.d.ts +445 -0
  234. package/packages/pi-ai/dist/models/generated/mistral.d.ts.map +1 -0
  235. package/packages/pi-ai/dist/models/generated/mistral.js +447 -0
  236. package/packages/pi-ai/dist/models/generated/mistral.js.map +1 -0
  237. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +139 -0
  238. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -0
  239. package/packages/pi-ai/dist/models/generated/openai-codex.js +141 -0
  240. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -0
  241. package/packages/pi-ai/dist/models/generated/openai.d.ts +700 -0
  242. package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -0
  243. package/packages/pi-ai/dist/models/generated/openai.js +702 -0
  244. package/packages/pi-ai/dist/models/generated/openai.js.map +1 -0
  245. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts +122 -0
  246. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts.map +1 -0
  247. package/packages/pi-ai/dist/models/generated/opencode-go.js +124 -0
  248. package/packages/pi-ai/dist/models/generated/opencode-go.js.map +1 -0
  249. package/packages/pi-ai/dist/models/generated/opencode.d.ts +530 -0
  250. package/packages/pi-ai/dist/models/generated/opencode.d.ts.map +1 -0
  251. package/packages/pi-ai/dist/models/generated/opencode.js +532 -0
  252. package/packages/pi-ai/dist/models/generated/opencode.js.map +1 -0
  253. package/packages/pi-ai/dist/models/generated/openrouter.d.ts +4270 -0
  254. package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -0
  255. package/packages/pi-ai/dist/models/generated/openrouter.js +4272 -0
  256. package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -0
  257. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts +2604 -0
  258. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts.map +1 -0
  259. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js +2606 -0
  260. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js.map +1 -0
  261. package/packages/pi-ai/dist/models/generated/xai.d.ts +411 -0
  262. package/packages/pi-ai/dist/models/generated/xai.d.ts.map +1 -0
  263. package/packages/pi-ai/dist/models/generated/xai.js +413 -0
  264. package/packages/pi-ai/dist/models/generated/xai.js.map +1 -0
  265. package/packages/pi-ai/dist/models/generated/zai.d.ts +276 -0
  266. package/packages/pi-ai/dist/models/generated/zai.d.ts.map +1 -0
  267. package/packages/pi-ai/dist/models/generated/zai.js +239 -0
  268. package/packages/pi-ai/dist/models/generated/zai.js.map +1 -0
  269. package/packages/pi-ai/dist/models/index.d.ts +27 -0
  270. package/packages/pi-ai/dist/models/index.d.ts.map +1 -0
  271. package/packages/pi-ai/dist/models/index.js +80 -0
  272. package/packages/pi-ai/dist/models/index.js.map +1 -0
  273. package/packages/pi-ai/dist/models.d.ts +1 -36
  274. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  275. package/packages/pi-ai/dist/models.generated.test.js +1 -2
  276. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  277. package/packages/pi-ai/dist/models.js +3 -112
  278. package/packages/pi-ai/dist/models.js.map +1 -1
  279. package/packages/pi-ai/dist/models.test.js +6 -5
  280. package/packages/pi-ai/dist/models.test.js.map +1 -1
  281. package/packages/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  282. package/packages/pi-ai/dist/utils/overflow.js +12 -0
  283. package/packages/pi-ai/dist/utils/overflow.js.map +1 -1
  284. package/packages/pi-ai/dist/utils/tests/overflow.test.d.ts +2 -0
  285. package/packages/pi-ai/dist/utils/tests/overflow.test.d.ts.map +1 -0
  286. package/packages/pi-ai/dist/utils/tests/overflow.test.js +50 -0
  287. package/packages/pi-ai/dist/utils/tests/overflow.test.js.map +1 -0
  288. package/packages/pi-ai/package.json +1 -1
  289. package/packages/pi-ai/scripts/generate-models.ts +74 -40
  290. package/packages/pi-ai/src/index.ts +5 -9
  291. package/packages/pi-ai/src/models/capability-patches.ts +40 -0
  292. package/packages/pi-ai/src/{models.custom.ts → models/custom.ts} +4 -4
  293. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +1486 -0
  294. package/packages/pi-ai/src/models/generated/anthropic.ts +381 -0
  295. package/packages/pi-ai/src/models/generated/azure-openai-responses.ts +704 -0
  296. package/packages/pi-ai/src/models/generated/cerebras.ts +75 -0
  297. package/packages/pi-ai/src/models/generated/github-copilot.ts +446 -0
  298. package/packages/pi-ai/src/models/generated/google-antigravity.ts +160 -0
  299. package/packages/pi-ai/src/models/generated/google-gemini-cli.ts +109 -0
  300. package/packages/pi-ai/src/models/generated/google-vertex.ts +211 -0
  301. package/packages/pi-ai/src/models/generated/google.ts +466 -0
  302. package/packages/pi-ai/src/models/generated/groq.ts +313 -0
  303. package/packages/pi-ai/src/models/generated/huggingface.ts +349 -0
  304. package/packages/pi-ai/src/models/generated/index.ts +52 -0
  305. package/packages/pi-ai/src/models/generated/kimi-coding.ts +41 -0
  306. package/packages/pi-ai/src/models/generated/minimax-cn.ts +109 -0
  307. package/packages/pi-ai/src/models/generated/minimax.ts +109 -0
  308. package/packages/pi-ai/src/models/generated/mistral.ts +449 -0
  309. package/packages/pi-ai/src/models/generated/openai-codex.ts +143 -0
  310. package/packages/pi-ai/src/models/generated/openai.ts +704 -0
  311. package/packages/pi-ai/src/models/generated/opencode-go.ts +126 -0
  312. package/packages/pi-ai/src/models/generated/opencode.ts +534 -0
  313. package/packages/pi-ai/src/models/generated/openrouter.ts +4274 -0
  314. package/packages/pi-ai/src/models/generated/vercel-ai-gateway.ts +2608 -0
  315. package/packages/pi-ai/src/models/generated/xai.ts +415 -0
  316. package/packages/pi-ai/src/models/generated/zai.ts +241 -0
  317. package/packages/pi-ai/src/models/index.ts +106 -0
  318. package/packages/pi-ai/src/models.generated.test.ts +1 -2
  319. package/packages/pi-ai/src/models.test.ts +6 -5
  320. package/packages/pi-ai/src/models.ts +3 -153
  321. package/packages/pi-ai/src/utils/overflow.ts +14 -1
  322. package/packages/pi-ai/src/utils/tests/overflow.test.ts +58 -0
  323. package/packages/pi-ai/tsconfig.json +1 -0
  324. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -0
  325. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +721 -8
  326. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  327. package/packages/pi-coding-agent/dist/core/compaction/utils.js +5 -5
  328. package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
  329. package/packages/pi-coding-agent/dist/core/compaction-utils.test.d.ts +2 -0
  330. package/packages/pi-coding-agent/dist/core/compaction-utils.test.d.ts.map +1 -0
  331. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js +45 -0
  332. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js.map +1 -0
  333. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts +2 -0
  334. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts.map +1 -0
  335. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js +52 -0
  336. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js.map +1 -0
  337. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  338. package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
  339. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  340. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +12 -2
  341. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  342. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +65 -28
  343. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  344. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts +2 -1
  345. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  346. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +9 -3
  347. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  348. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.d.ts +2 -0
  349. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.d.ts.map +1 -0
  350. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +52 -0
  351. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -0
  352. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  353. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +305 -20
  354. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  355. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts +2 -0
  356. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts.map +1 -0
  357. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +38 -0
  358. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -0
  359. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +13 -0
  360. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  361. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +59 -6
  362. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  363. package/packages/pi-coding-agent/package.json +1 -1
  364. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +884 -8
  365. package/packages/pi-coding-agent/src/core/compaction/utils.ts +5 -5
  366. package/packages/pi-coding-agent/src/core/compaction-utils.test.ts +50 -0
  367. package/packages/pi-coding-agent/src/core/model-registry-env-fallback.test.ts +59 -0
  368. package/packages/pi-coding-agent/src/core/model-registry.ts +2 -1
  369. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +78 -32
  370. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +73 -0
  371. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +9 -3
  372. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +381 -39
  373. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +44 -0
  374. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +79 -6
  375. package/packages/pi-coding-agent/src/types/ambient-modules.d.ts +69 -0
  376. package/packages/pi-coding-agent/tsconfig.json +3 -2
  377. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -0
  378. package/packages/pi-tui/dist/__tests__/tui.test.js +60 -1
  379. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  380. package/packages/pi-tui/dist/tui.d.ts +8 -0
  381. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  382. package/packages/pi-tui/dist/tui.js +32 -3
  383. package/packages/pi-tui/dist/tui.js.map +1 -1
  384. package/packages/pi-tui/package.json +1 -1
  385. package/packages/pi-tui/src/__tests__/tui.test.ts +76 -1
  386. package/packages/pi-tui/src/tui.ts +31 -3
  387. package/packages/pi-tui/tsconfig.json +1 -0
  388. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -0
  389. package/packages/rpc-client/package.json +1 -1
  390. package/packages/rpc-client/tsconfig.json +1 -0
  391. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -0
  392. package/pkg/package.json +1 -1
  393. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +107 -5
  394. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +111 -2
  395. package/src/resources/extensions/gsd/activity-log.ts +21 -0
  396. package/src/resources/extensions/gsd/auto/detect-stuck.ts +12 -4
  397. package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -0
  398. package/src/resources/extensions/gsd/auto/loop.ts +159 -10
  399. package/src/resources/extensions/gsd/auto/phases.ts +213 -13
  400. package/src/resources/extensions/gsd/auto/session.ts +10 -0
  401. package/src/resources/extensions/gsd/auto-dispatch.ts +26 -10
  402. package/src/resources/extensions/gsd/auto-model-selection.ts +151 -16
  403. package/src/resources/extensions/gsd/auto-post-unit.ts +278 -16
  404. package/src/resources/extensions/gsd/auto-prompts.ts +13 -0
  405. package/src/resources/extensions/gsd/auto-start.ts +30 -6
  406. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +17 -0
  407. package/src/resources/extensions/gsd/auto-unit-closeout.ts +25 -1
  408. package/src/resources/extensions/gsd/auto-verification.ts +225 -3
  409. package/src/resources/extensions/gsd/auto.ts +72 -16
  410. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +38 -8
  411. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +52 -2
  412. package/src/resources/extensions/gsd/commands/catalog.ts +26 -1
  413. package/src/resources/extensions/gsd/commands/handlers/ops.ts +25 -0
  414. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +74 -9
  415. package/src/resources/extensions/gsd/commands-add-tests.ts +137 -0
  416. package/src/resources/extensions/gsd/commands-backlog.ts +182 -0
  417. package/src/resources/extensions/gsd/commands-do.ts +109 -0
  418. package/src/resources/extensions/gsd/commands-extract-learnings.ts +304 -0
  419. package/src/resources/extensions/gsd/commands-handlers.ts +8 -2
  420. package/src/resources/extensions/gsd/commands-maintenance.ts +6 -6
  421. package/src/resources/extensions/gsd/commands-pr-branch.ts +234 -0
  422. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -1
  423. package/src/resources/extensions/gsd/commands-session-report.ts +101 -0
  424. package/src/resources/extensions/gsd/commands-ship.ts +219 -0
  425. package/src/resources/extensions/gsd/db-writer.ts +3 -5
  426. package/src/resources/extensions/gsd/docs/preferences-reference.md +15 -2
  427. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +228 -0
  428. package/src/resources/extensions/gsd/ecosystem/loader.ts +201 -0
  429. package/src/resources/extensions/gsd/git-service.ts +68 -0
  430. package/src/resources/extensions/gsd/graph-context.ts +212 -0
  431. package/src/resources/extensions/gsd/gsd-db.ts +788 -3
  432. package/src/resources/extensions/gsd/guided-flow.ts +32 -0
  433. package/src/resources/extensions/gsd/index.ts +18 -2
  434. package/src/resources/extensions/gsd/init-wizard.ts +3 -2
  435. package/src/resources/extensions/gsd/journal.ts +30 -0
  436. package/src/resources/extensions/gsd/md-importer.ts +3 -5
  437. package/src/resources/extensions/gsd/memory-store.ts +31 -62
  438. package/src/resources/extensions/gsd/metrics.ts +26 -0
  439. package/src/resources/extensions/gsd/milestone-validation-gates.ts +13 -14
  440. package/src/resources/extensions/gsd/native-git-bridge.ts +11 -12
  441. package/src/resources/extensions/gsd/notification-widget.ts +2 -2
  442. package/src/resources/extensions/gsd/parallel-orchestrator.ts +40 -1
  443. package/src/resources/extensions/gsd/preferences-models.ts +61 -3
  444. package/src/resources/extensions/gsd/preferences-types.ts +44 -0
  445. package/src/resources/extensions/gsd/preferences-validation.ts +130 -2
  446. package/src/resources/extensions/gsd/preferences.ts +28 -0
  447. package/src/resources/extensions/gsd/prompts/add-tests.md +35 -0
  448. package/src/resources/extensions/gsd/session-lock.ts +14 -2
  449. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +20 -1
  450. package/src/resources/extensions/gsd/state.ts +80 -17
  451. package/src/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
  452. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +9 -5
  453. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +20 -0
  454. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +53 -0
  455. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +7 -3
  456. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +51 -2
  457. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +6 -2
  458. package/src/resources/extensions/gsd/tests/commands-backlog.test.ts +158 -0
  459. package/src/resources/extensions/gsd/tests/commands-do.test.ts +127 -0
  460. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +340 -0
  461. package/src/resources/extensions/gsd/tests/commands-pr-branch.test.ts +68 -0
  462. package/src/resources/extensions/gsd/tests/commands-session-report.test.ts +82 -0
  463. package/src/resources/extensions/gsd/tests/commands-ship.test.ts +71 -0
  464. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +14 -0
  465. package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +142 -0
  466. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
  467. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  468. package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +42 -0
  469. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +3 -2
  470. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +3 -2
  471. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +68 -8
  472. package/src/resources/extensions/gsd/tests/derive-state.test.ts +3 -3
  473. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +154 -0
  474. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +10 -7
  475. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +137 -1
  476. package/src/resources/extensions/gsd/tests/graph-context.test.ts +337 -0
  477. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
  478. package/src/resources/extensions/gsd/tests/health-widget.test.ts +1 -1
  479. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +4 -2
  480. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +68 -1
  481. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -2
  482. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -3
  483. package/src/resources/extensions/gsd/tests/model-isolation.test.ts +91 -2
  484. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +140 -0
  485. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  486. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +2 -1
  487. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +40 -1
  488. package/src/resources/extensions/gsd/tests/preferences.test.ts +47 -0
  489. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +1 -1
  490. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +180 -0
  491. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +5 -7
  492. package/src/resources/extensions/gsd/tests/token-profile.test.ts +9 -6
  493. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +101 -0
  494. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +85 -0
  495. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +69 -0
  496. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +39 -0
  497. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +70 -0
  498. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +85 -0
  499. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +35 -0
  500. package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +89 -0
  501. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +167 -0
  502. package/src/resources/extensions/gsd/tests/uok-preferences.test.ts +42 -0
  503. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +179 -0
  504. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +39 -0
  505. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +223 -0
  506. package/src/resources/extensions/gsd/tools/complete-slice.ts +26 -0
  507. package/src/resources/extensions/gsd/tools/validate-milestone.ts +48 -3
  508. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +3 -11
  509. package/src/resources/extensions/gsd/triage-resolution.ts +2 -7
  510. package/src/resources/extensions/gsd/types.ts +14 -1
  511. package/src/resources/extensions/gsd/unit-ownership.ts +2 -2
  512. package/src/resources/extensions/gsd/uok/audit-toggle.ts +9 -0
  513. package/src/resources/extensions/gsd/uok/audit.ts +51 -0
  514. package/src/resources/extensions/gsd/uok/contracts.ts +135 -0
  515. package/src/resources/extensions/gsd/uok/execution-graph.ts +241 -0
  516. package/src/resources/extensions/gsd/uok/flags.ts +45 -0
  517. package/src/resources/extensions/gsd/uok/gate-runner.ts +146 -0
  518. package/src/resources/extensions/gsd/uok/gitops.ts +75 -0
  519. package/src/resources/extensions/gsd/uok/kernel.ts +105 -0
  520. package/src/resources/extensions/gsd/uok/loop-adapter.ts +162 -0
  521. package/src/resources/extensions/gsd/uok/model-policy.ts +112 -0
  522. package/src/resources/extensions/gsd/uok/plan-v2.ts +156 -0
  523. package/src/resources/extensions/gsd/workflow-logger.ts +27 -1
  524. package/src/resources/extensions/gsd/workflow-manifest.ts +9 -104
  525. package/src/resources/extensions/gsd/workflow-migration.ts +21 -29
  526. package/src/resources/extensions/gsd/workflow-projections.ts +8 -1
  527. package/src/resources/extensions/gsd/workflow-reconcile.ts +15 -15
  528. package/src/resources/extensions/ttsr/ttsr-manager.ts +10 -5
  529. package/packages/pi-ai/dist/models.custom.d.ts.map +0 -1
  530. package/packages/pi-ai/dist/models.custom.js.map +0 -1
  531. package/packages/pi-ai/dist/models.generated.js +0 -14343
  532. package/packages/pi-ai/dist/models.generated.js.map +0 -1
  533. package/packages/pi-ai/src/models.generated.ts +0 -14345
  534. /package/dist/web/standalone/.next/static/{cGmbVq2su4f9tMpgIkG8u → tqdo0yKKYz6fJXQnIgbdx}/_buildManifest.js +0 -0
  535. /package/dist/web/standalone/.next/static/{cGmbVq2su4f9tMpgIkG8u → tqdo0yKKYz6fJXQnIgbdx}/_ssgManifest.js +0 -0
@@ -0,0 +1,109 @@
1
+ /**
2
+ * GSD Command — /gsd do
3
+ *
4
+ * Routes freeform natural language to the correct /gsd subcommand
5
+ * using keyword matching. Falls back to /gsd quick for task-like input.
6
+ */
7
+
8
+ import type { ExtensionAPI, ExtensionCommandContext } from "@gsd/pi-coding-agent";
9
+
10
+ interface Route {
11
+ keywords: string[];
12
+ command: string;
13
+ }
14
+
15
+ const ROUTES: Route[] = [
16
+ { keywords: ["progress", "status", "dashboard", "how far", "where are we"], command: "status" },
17
+ { keywords: ["auto", "autonomous", "run all", "keep going", "start auto"], command: "auto" },
18
+ { keywords: ["stop", "halt", "abort"], command: "stop" },
19
+ { keywords: ["pause", "break", "take a break"], command: "pause" },
20
+ { keywords: ["history", "past", "what happened", "previous"], command: "history" },
21
+ { keywords: ["doctor", "health", "diagnose", "check health"], command: "doctor" },
22
+ { keywords: ["clean up", "cleanup", "remove old", "prune", "tidy"], command: "cleanup" },
23
+ { keywords: ["export", "report", "share results"], command: "export" },
24
+ { keywords: ["ship", "pull request", "create pr", "open pr", "merge"], command: "ship" },
25
+ { keywords: ["discuss", "talk about", "architecture", "design"], command: "discuss" },
26
+ { keywords: ["undo", "revert", "rollback", "take back"], command: "undo" },
27
+ { keywords: ["skip", "skip task", "skip this"], command: "skip" },
28
+ { keywords: ["queue", "reorder", "milestone order", "order milestones"], command: "queue" },
29
+ { keywords: ["visualize", "viz", "graph", "chart", "show graph"], command: "visualize" },
30
+ { keywords: ["capture", "note", "idea", "thought", "remember"], command: "capture" },
31
+ { keywords: ["inspect", "database", "sqlite", "db state"], command: "inspect" },
32
+ { keywords: ["knowledge", "rule", "pattern", "lesson"], command: "knowledge" },
33
+ { keywords: ["session report", "session summary", "cost summary", "how much"], command: "session-report" },
34
+ { keywords: ["backlog", "parking lot", "later", "someday"], command: "backlog" },
35
+ { keywords: ["pr branch", "clean branch", "filter commits"], command: "pr-branch" },
36
+ { keywords: ["add tests", "write tests", "generate tests", "test coverage"], command: "add-tests" },
37
+ { keywords: ["next", "step", "next step", "what's next"], command: "next" },
38
+ { keywords: ["migrate", "migration", "convert", "upgrade"], command: "migrate" },
39
+ { keywords: ["steer", "change direction", "pivot", "redirect"], command: "steer" },
40
+ { keywords: ["park", "shelve", "set aside"], command: "park" },
41
+ { keywords: ["widget", "toggle widget"], command: "widget" },
42
+ { keywords: ["logs", "debug logs", "log files"], command: "logs" },
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; // Longer match = higher confidence
59
+ if (!bestMatch || score > bestMatch.score) {
60
+ // Strip the matched keyword from input to get remaining args
61
+ const idx = lower.indexOf(keyword);
62
+ const remaining = (input.slice(0, idx) + input.slice(idx + keyword.length)).trim();
63
+ bestMatch = { command: route.command, remainingArgs: remaining, score };
64
+ }
65
+ }
66
+ }
67
+ }
68
+
69
+ return bestMatch;
70
+ }
71
+
72
+ export async function handleDo(
73
+ args: string,
74
+ ctx: ExtensionCommandContext,
75
+ pi: ExtensionAPI,
76
+ ): Promise<void> {
77
+ if (!args.trim()) {
78
+ ctx.ui.notify(
79
+ "Usage: /gsd do <what you want to do>\n\n" +
80
+ "Examples:\n" +
81
+ " /gsd do show me progress\n" +
82
+ " /gsd do run autonomously\n" +
83
+ " /gsd do clean up old branches\n" +
84
+ " /gsd do fix the login bug",
85
+ "warning",
86
+ );
87
+ return;
88
+ }
89
+
90
+ const match = matchRoute(args);
91
+
92
+ if (match) {
93
+ const fullCommand = match.remainingArgs
94
+ ? `${match.command} ${match.remainingArgs}`
95
+ : match.command;
96
+
97
+ ctx.ui.notify(`→ /gsd ${fullCommand}`, "info");
98
+
99
+ // Re-dispatch through the main dispatcher
100
+ const { handleGSDCommand } = await import("./commands/dispatcher.js");
101
+ await handleGSDCommand(fullCommand, ctx, pi);
102
+ return;
103
+ }
104
+
105
+ // No keyword match → treat as quick task
106
+ ctx.ui.notify(`→ /gsd quick ${args}`, "info");
107
+ const { handleQuick } = await import("./quick.js");
108
+ await handleQuick(args, ctx, pi);
109
+ }
@@ -0,0 +1,304 @@
1
+ /**
2
+ * GSD Command — /gsd extract-learnings
3
+ *
4
+ * Analyses completed milestone artefacts and dispatches an LLM turn that
5
+ * extracts structured knowledge into 4 categories:
6
+ * Decisions · Lessons · Patterns · Surprises
7
+ */
8
+
9
+ import type { ExtensionAPI, ExtensionCommandContext } from "@gsd/pi-coding-agent";
10
+
11
+ import { existsSync, readFileSync } from "node:fs";
12
+ import { join, basename } from "node:path";
13
+
14
+ import { gsdRoot, resolveMilestonePath } from "./paths.js";
15
+ import { projectRoot } from "./commands/context.js";
16
+
17
+ // ─── Types ────────────────────────────────────────────────────────────────────
18
+
19
+ export interface PhaseArtifacts {
20
+ plan: string | null;
21
+ summary: string | null;
22
+ verification: string | null;
23
+ uat: string | null;
24
+ missingRequired: string[];
25
+ }
26
+
27
+ export interface ExtractLearningsPromptContext {
28
+ milestoneId: string;
29
+ milestoneName: string;
30
+ outputPath: string;
31
+ relativeOutputPath: string;
32
+ planContent: string;
33
+ summaryContent: string;
34
+ verificationContent: string | null;
35
+ uatContent: string | null;
36
+ missingArtifacts: string[];
37
+ projectName: string;
38
+ }
39
+
40
+ export interface FrontmatterContext {
41
+ milestoneId: string;
42
+ milestoneName: string;
43
+ projectName: string;
44
+ generatedAt: string;
45
+ counts: {
46
+ decisions: number;
47
+ lessons: number;
48
+ patterns: number;
49
+ surprises: number;
50
+ };
51
+ missingArtifacts: string[];
52
+ }
53
+
54
+ // ─── Pure functions ───────────────────────────────────────────────────────────
55
+
56
+ export function parseExtractLearningsArgs(args: string): { milestoneId: string | null } {
57
+ const trimmed = args.trim();
58
+ return { milestoneId: trimmed || null };
59
+ }
60
+
61
+ export function buildLearningsOutputPath(milestoneDir: string, milestoneId: string): string {
62
+ return join(milestoneDir, `${milestoneId}-LEARNINGS.md`);
63
+ }
64
+
65
+ export function resolvePhaseArtifacts(milestoneDir: string, milestoneId: string): PhaseArtifacts {
66
+ const missingRequired: string[] = [];
67
+
68
+ const planFile = `${milestoneId}-PLAN.md`;
69
+ const summaryFile = `${milestoneId}-SUMMARY.md`;
70
+ const verificationFile = `${milestoneId}-VERIFICATION.md`;
71
+ const uatFile = `${milestoneId}-UAT.md`;
72
+
73
+ const planPath = join(milestoneDir, planFile);
74
+ const summaryPath = join(milestoneDir, summaryFile);
75
+ const verificationPath = join(milestoneDir, verificationFile);
76
+ const uatPath = join(milestoneDir, uatFile);
77
+
78
+ const plan = existsSync(planPath) ? planPath : null;
79
+ const summary = existsSync(summaryPath) ? summaryPath : null;
80
+ const verification = existsSync(verificationPath) ? verificationPath : null;
81
+ const uat = existsSync(uatPath) ? uatPath : null;
82
+
83
+ if (!plan) missingRequired.push(planFile);
84
+ if (!summary) missingRequired.push(summaryFile);
85
+
86
+ return { plan, summary, verification, uat, missingRequired };
87
+ }
88
+
89
+ export function buildExtractLearningsPrompt(ctx: ExtractLearningsPromptContext): string {
90
+ const optionalSections: string[] = [];
91
+
92
+ if (ctx.verificationContent) {
93
+ optionalSections.push(`## Verification Report\n\n${ctx.verificationContent}`);
94
+ }
95
+ if (ctx.uatContent) {
96
+ optionalSections.push(`## UAT Report\n\n${ctx.uatContent}`);
97
+ }
98
+
99
+ const missingNote = ctx.missingArtifacts.length > 0
100
+ ? `\nNote: The following optional artefacts were not available: ${ctx.missingArtifacts.join(", ")}\n`
101
+ : "";
102
+
103
+ return `# Extract Learnings — ${ctx.milestoneId}: ${ctx.milestoneName}
104
+
105
+ **Project:** ${ctx.projectName}
106
+ **Output file:** ${ctx.outputPath}
107
+
108
+ ## Your Task
109
+
110
+ Analyse the artefacts below and extract structured knowledge from milestone **${ctx.milestoneId}**.
111
+
112
+ Write a LEARNINGS document to \`${ctx.outputPath}\` with the following 4 sections:
113
+
114
+ ### Decisions
115
+ Key architectural and design decisions made during this milestone, including the rationale and alternatives considered.
116
+
117
+ ### Lessons
118
+ What the team learned — technical discoveries, process insights, and knowledge gaps that were filled.
119
+
120
+ ### Patterns
121
+ Reusable patterns, approaches, or solutions that emerged and should be applied in future work.
122
+
123
+ ### Surprises
124
+ Unexpected challenges, discoveries, or outcomes — things that deviated from assumptions.
125
+
126
+ ### Source Attribution (REQUIRED)
127
+
128
+ Every extracted item MUST include a \`Source:\` line immediately after the item text.
129
+ Format: \`Source: {artifact-filename}/{section}\`
130
+ Example: \`Source: M001-PLAN.md/Architecture Decisions\`
131
+
132
+ Items without a Source attribution are invalid and must not be included in the output.
133
+
134
+ ---
135
+
136
+ ## Artefacts
137
+
138
+ ### Plan
139
+
140
+ ${ctx.planContent}
141
+
142
+ ---
143
+
144
+ ### Summary
145
+
146
+ ${ctx.summaryContent}
147
+
148
+ ${optionalSections.join("\n\n---\n\n")}
149
+ ${missingNote}
150
+ ---
151
+
152
+ ## Output Format
153
+
154
+ Write the LEARNINGS file to \`${ctx.relativeOutputPath}\` with YAML frontmatter followed by the 4 sections above.
155
+ Each section should contain concise, actionable bullet points.
156
+ Every bullet point MUST be followed by a source line, for example:
157
+
158
+ \`\`\`
159
+ ### Decisions
160
+ - Chose PostgreSQL over SQLite for concurrent write support.
161
+ Source: M001-PLAN.md/Architecture Decisions
162
+ \`\`\`
163
+
164
+ Items without a \`Source:\` line are invalid.
165
+
166
+ ---
167
+
168
+ ## Optional: Capture Individual Learnings
169
+
170
+ If the \`capture_thought\` tool is available, call it once for each extracted item with:
171
+ - category: "decision" | "lesson" | "pattern" | "surprise"
172
+ - phase: "${ctx.milestoneId}"
173
+ - content: {the learning text}
174
+ - source: {artifact filename}
175
+
176
+ If \`capture_thought\` is not available, skip this step silently — do not report an error.
177
+
178
+ ---
179
+
180
+ ## Rebuild Knowledge Graph
181
+
182
+ After writing LEARNINGS.md, call the \`gsd_graph\` tool with \`{ "mode": "build" }\` to rebuild the knowledge graph so the new learnings are immediately queryable by future milestone prompts.
183
+
184
+ If the \`gsd_graph\` tool is not available, skip this step silently.
185
+ `;
186
+ }
187
+
188
+ export function buildFrontmatter(ctx: FrontmatterContext): string {
189
+ const missingList = ctx.missingArtifacts.length > 0
190
+ ? ctx.missingArtifacts.map((a) => ` - ${a}`).join("\n")
191
+ : " []";
192
+
193
+ const missingValue = ctx.missingArtifacts.length > 0
194
+ ? `\n${missingList}`
195
+ : " []";
196
+
197
+ return `---
198
+ phase: ${ctx.milestoneId}
199
+ phase_name: ${ctx.milestoneName}
200
+ project: ${ctx.projectName}
201
+ generated: ${ctx.generatedAt}
202
+ counts:
203
+ decisions: ${ctx.counts.decisions}
204
+ lessons: ${ctx.counts.lessons}
205
+ patterns: ${ctx.counts.patterns}
206
+ surprises: ${ctx.counts.surprises}
207
+ missing_artifacts:${missingValue}
208
+ ---`;
209
+ }
210
+
211
+ export function extractProjectName(basePath: string): string {
212
+ const projectMdPath = join(gsdRoot(basePath), "PROJECT.md");
213
+
214
+ if (existsSync(projectMdPath)) {
215
+ try {
216
+ const content = readFileSync(projectMdPath, "utf-8");
217
+ const match = content.match(/^name:\s*(.+)$/m);
218
+ if (match) return match[1].trim();
219
+ } catch {
220
+ // non-fatal
221
+ }
222
+ }
223
+
224
+ return basename(basePath);
225
+ }
226
+
227
+ // ─── Handler ──────────────────────────────────────────────────────────────────
228
+
229
+ export async function handleExtractLearnings(
230
+ args: string,
231
+ ctx: ExtensionCommandContext,
232
+ pi: ExtensionAPI,
233
+ ): Promise<void> {
234
+ const { milestoneId } = parseExtractLearningsArgs(args);
235
+
236
+ if (!milestoneId) {
237
+ ctx.ui.notify("Usage: /gsd extract-learnings <milestoneId> (e.g. M001)", "warning");
238
+ return;
239
+ }
240
+
241
+ // projectRoot() throws GSDNoProjectError if no project found — intentional, handled by dispatcher
242
+ const basePath = projectRoot();
243
+ const milestoneDir = resolveMilestonePath(basePath, milestoneId);
244
+
245
+ if (!milestoneDir) {
246
+ ctx.ui.notify(`Milestone not found: ${milestoneId}`, "error");
247
+ return;
248
+ }
249
+
250
+ const artifacts = resolvePhaseArtifacts(milestoneDir, milestoneId);
251
+
252
+ if (artifacts.missingRequired.length > 0) {
253
+ ctx.ui.notify(
254
+ `Cannot extract learnings — required artefacts missing: ${artifacts.missingRequired.join(", ")}`,
255
+ "error",
256
+ );
257
+ return;
258
+ }
259
+
260
+ // Read required artefacts
261
+ const planContent = readFileSync(artifacts.plan!, "utf-8");
262
+ const summaryContent = readFileSync(artifacts.summary!, "utf-8");
263
+
264
+ // Read optional artefacts
265
+ const verificationContent = artifacts.verification
266
+ ? readFileSync(artifacts.verification, "utf-8")
267
+ : null;
268
+ const uatContent = artifacts.uat
269
+ ? readFileSync(artifacts.uat, "utf-8")
270
+ : null;
271
+
272
+ // Determine missing optional artefacts for context
273
+ const missingArtifacts: string[] = [];
274
+ if (!artifacts.verification) missingArtifacts.push(`${milestoneId}-VERIFICATION.md`);
275
+ if (!artifacts.uat) missingArtifacts.push(`${milestoneId}-UAT.md`);
276
+
277
+ // Extract milestone name from Plan H1 or fall back to milestoneId
278
+ const h1Match = planContent.match(/^#\s+(.+)$/m);
279
+ const milestoneName = h1Match?.[1]?.trim() ?? milestoneId;
280
+
281
+ const projectName = extractProjectName(basePath);
282
+ const outputPath = buildLearningsOutputPath(milestoneDir, milestoneId);
283
+ const relativeOutputPath = outputPath.replace(basePath + "/", "");
284
+
285
+ const prompt = buildExtractLearningsPrompt({
286
+ milestoneId,
287
+ milestoneName,
288
+ outputPath,
289
+ relativeOutputPath,
290
+ planContent,
291
+ summaryContent,
292
+ verificationContent,
293
+ uatContent,
294
+ missingArtifacts,
295
+ projectName,
296
+ });
297
+
298
+ ctx.ui.notify(`Extracting learnings for ${milestoneId}: "${milestoneName}"...`, "info");
299
+
300
+ pi.sendMessage(
301
+ { customType: "gsd-extract-learnings", content: prompt, display: false },
302
+ { triggerTurn: true },
303
+ );
304
+ }
@@ -28,6 +28,11 @@ import { loadPrompt } from "./prompt-loader.js";
28
28
  const UPDATE_REGISTRY_URL = "https://registry.npmjs.org/gsd-pi/latest";
29
29
  const UPDATE_FETCH_TIMEOUT_MS = 5000;
30
30
 
31
+ function resolveInstallCommand(pkg: string): string {
32
+ if ('bun' in process.versions) return `bun add -g ${pkg}`;
33
+ return `npm install -g ${pkg}`;
34
+ }
35
+
31
36
  async function fetchLatestVersionForCommand(): Promise<string | null> {
32
37
  const controller = new AbortController();
33
38
  const timeout = setTimeout(() => controller.abort(), UPDATE_FETCH_TIMEOUT_MS);
@@ -431,8 +436,9 @@ export async function handleUpdate(ctx: ExtensionCommandContext): Promise<void>
431
436
 
432
437
  ctx.ui.notify(`Updating: v${current} → v${latest}...`, "info");
433
438
 
439
+ const installCmd = resolveInstallCommand(`${NPM_PACKAGE}@latest`);
434
440
  try {
435
- execSync(`npm install -g ${NPM_PACKAGE}@latest`, {
441
+ execSync(installCmd, {
436
442
  stdio: ["ignore", "pipe", "ignore"],
437
443
  });
438
444
  ctx.ui.notify(
@@ -441,7 +447,7 @@ export async function handleUpdate(ctx: ExtensionCommandContext): Promise<void>
441
447
  );
442
448
  } catch {
443
449
  ctx.ui.notify(
444
- `Update failed. Try manually: npm install -g ${NPM_PACKAGE}@latest`,
450
+ `Update failed. Try manually: ${installCmd}`,
445
451
  "error",
446
452
  );
447
453
  }
@@ -488,7 +488,7 @@ export async function handleCleanupProjects(args: string, ctx: ExtensionCommandC
488
488
  * Prints counts of recovered items and the resulting project phase.
489
489
  */
490
490
  export async function handleRecover(ctx: ExtensionCommandContext, basePath: string): Promise<void> {
491
- const { isDbAvailable: dbAvailable, _getAdapter, transaction: dbTransaction } = await import("./gsd-db.js");
491
+ const { isDbAvailable: dbAvailable, clearEngineHierarchy, transaction: dbTransaction } = await import("./gsd-db.js");
492
492
  const { migrateHierarchyToDb } = await import("./md-importer.js");
493
493
  const { invalidateStateCache } = await import("./state.js");
494
494
 
@@ -498,12 +498,12 @@ export async function handleRecover(ctx: ExtensionCommandContext, basePath: stri
498
498
  }
499
499
 
500
500
  try {
501
- // 1. Delete + re-populate inside a single transaction for atomicity
502
- const db = _getAdapter()!;
501
+ // 1. Delete + re-populate inside a single transaction for atomicity.
502
+ // clearEngineHierarchy() uses transaction() internally but transaction()
503
+ // is re-entrant, so wrapping in dbTransaction() keeps the whole
504
+ // clear+repopulate atomic.
503
505
  const counts = dbTransaction(() => {
504
- db.exec("DELETE FROM tasks");
505
- db.exec("DELETE FROM slices");
506
- db.exec("DELETE FROM milestones");
506
+ clearEngineHierarchy();
507
507
  return migrateHierarchyToDb(basePath);
508
508
  });
509
509