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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (430) hide show
  1. package/dist/resources/extensions/gsd/activity-log.js +16 -0
  2. package/dist/resources/extensions/gsd/auto/loop.js +147 -10
  3. package/dist/resources/extensions/gsd/auto/phases.js +164 -9
  4. package/dist/resources/extensions/gsd/auto/session.js +10 -0
  5. package/dist/resources/extensions/gsd/auto-dispatch.js +11 -1
  6. package/dist/resources/extensions/gsd/auto-model-selection.js +54 -8
  7. package/dist/resources/extensions/gsd/auto-post-unit.js +215 -8
  8. package/dist/resources/extensions/gsd/auto-recovery.js +24 -10
  9. package/dist/resources/extensions/gsd/auto-unit-closeout.js +18 -0
  10. package/dist/resources/extensions/gsd/auto-verification.js +100 -2
  11. package/dist/resources/extensions/gsd/auto-worktree.js +2 -0
  12. package/dist/resources/extensions/gsd/auto.js +28 -2
  13. package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +5 -3
  14. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +10 -1
  15. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +61 -9
  16. package/dist/resources/extensions/gsd/cache.js +16 -5
  17. package/dist/resources/extensions/gsd/commands/catalog.js +6 -1
  18. package/dist/resources/extensions/gsd/commands/handlers/core.js +5 -1
  19. package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
  20. package/dist/resources/extensions/gsd/commands-extract-learnings.js +225 -0
  21. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +51 -4
  22. package/dist/resources/extensions/gsd/docs/preferences-reference.md +16 -1
  23. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +144 -0
  24. package/dist/resources/extensions/gsd/ecosystem/loader.js +145 -0
  25. package/dist/resources/extensions/gsd/git-service.js +49 -1
  26. package/dist/resources/extensions/gsd/graph-context.js +98 -7
  27. package/dist/resources/extensions/gsd/gsd-db.js +260 -2
  28. package/dist/resources/extensions/gsd/guided-flow.js +31 -6
  29. package/dist/resources/extensions/gsd/init-wizard.js +1 -0
  30. package/dist/resources/extensions/gsd/journal.js +27 -0
  31. package/dist/resources/extensions/gsd/metrics.js +19 -0
  32. package/dist/resources/extensions/gsd/parallel-orchestrator.js +33 -1
  33. package/dist/resources/extensions/gsd/preferences-models.js +20 -3
  34. package/dist/resources/extensions/gsd/preferences-types.js +2 -0
  35. package/dist/resources/extensions/gsd/preferences-validation.js +118 -2
  36. package/dist/resources/extensions/gsd/preferences.js +31 -0
  37. package/dist/resources/extensions/gsd/safety/evidence-collector.js +15 -30
  38. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +12 -2
  39. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +19 -0
  40. package/dist/resources/extensions/gsd/tools/complete-slice.js +5 -0
  41. package/dist/resources/extensions/gsd/tools/validate-milestone.js +39 -4
  42. package/dist/resources/extensions/gsd/unit-ownership.js +1 -1
  43. package/dist/resources/extensions/gsd/uok/audit-toggle.js +7 -0
  44. package/dist/resources/extensions/gsd/uok/audit.js +40 -0
  45. package/dist/resources/extensions/gsd/uok/contracts.js +1 -0
  46. package/dist/resources/extensions/gsd/uok/execution-graph.js +179 -0
  47. package/dist/resources/extensions/gsd/uok/flags.js +29 -0
  48. package/dist/resources/extensions/gsd/uok/gate-runner.js +109 -0
  49. package/dist/resources/extensions/gsd/uok/gitops.js +53 -0
  50. package/dist/resources/extensions/gsd/uok/kernel.js +80 -0
  51. package/dist/resources/extensions/gsd/uok/loop-adapter.js +133 -0
  52. package/dist/resources/extensions/gsd/uok/model-policy.js +66 -0
  53. package/dist/resources/extensions/gsd/uok/plan-v2.js +132 -0
  54. package/dist/resources/extensions/gsd/workflow-logger.js +22 -0
  55. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  56. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  57. package/dist/web/standalone/.next/BUILD_ID +1 -1
  58. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  59. package/dist/web/standalone/.next/build-manifest.json +2 -2
  60. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  61. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  62. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  63. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  64. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  65. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  66. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  67. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  68. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  69. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  70. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  71. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  72. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  73. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  74. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  75. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  76. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  77. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  78. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  79. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +1 -1
  80. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  81. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
  82. package/dist/web/standalone/.next/server/app/index.html +1 -1
  83. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  90. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  91. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  92. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  93. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  94. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  95. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  96. package/package.json +1 -1
  97. package/packages/mcp-server/dist/readers/graph.d.ts +1 -1
  98. package/packages/mcp-server/dist/readers/graph.d.ts.map +1 -1
  99. package/packages/mcp-server/dist/readers/graph.js +107 -0
  100. package/packages/mcp-server/dist/readers/graph.js.map +1 -1
  101. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  102. package/packages/mcp-server/dist/workflow-tools.js +88 -6
  103. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  104. package/packages/mcp-server/src/readers/graph.test.ts +178 -0
  105. package/packages/mcp-server/src/readers/graph.ts +148 -1
  106. package/packages/mcp-server/src/workflow-tools.ts +95 -10
  107. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  108. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  109. package/packages/pi-ai/dist/index.d.ts +1 -9
  110. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  111. package/packages/pi-ai/dist/index.js +1 -9
  112. package/packages/pi-ai/dist/index.js.map +1 -1
  113. package/packages/pi-ai/dist/models/capability-patches.d.ts +19 -0
  114. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -0
  115. package/packages/pi-ai/dist/models/capability-patches.js +36 -0
  116. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -0
  117. package/packages/pi-ai/dist/{models.custom.d.ts → models/custom.d.ts} +1 -1
  118. package/packages/pi-ai/dist/models/custom.d.ts.map +1 -0
  119. package/packages/pi-ai/dist/{models.custom.js → models/custom.js} +4 -4
  120. package/packages/pi-ai/dist/models/custom.js.map +1 -0
  121. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +1482 -0
  122. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -0
  123. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +1484 -0
  124. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -0
  125. package/packages/pi-ai/dist/models/generated/anthropic.d.ts +377 -0
  126. package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -0
  127. package/packages/pi-ai/dist/models/generated/anthropic.js +379 -0
  128. package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -0
  129. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts +700 -0
  130. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts.map +1 -0
  131. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js +702 -0
  132. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js.map +1 -0
  133. package/packages/pi-ai/dist/models/generated/cerebras.d.ts +71 -0
  134. package/packages/pi-ai/dist/models/generated/cerebras.d.ts.map +1 -0
  135. package/packages/pi-ai/dist/models/generated/cerebras.js +73 -0
  136. package/packages/pi-ai/dist/models/generated/cerebras.js.map +1 -0
  137. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts +590 -0
  138. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts.map +1 -0
  139. package/packages/pi-ai/dist/models/generated/github-copilot.js +444 -0
  140. package/packages/pi-ai/dist/models/generated/github-copilot.js.map +1 -0
  141. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +156 -0
  142. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -0
  143. package/packages/pi-ai/dist/models/generated/google-antigravity.js +158 -0
  144. package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -0
  145. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts +105 -0
  146. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts.map +1 -0
  147. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js +107 -0
  148. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js.map +1 -0
  149. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts +207 -0
  150. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts.map +1 -0
  151. package/packages/pi-ai/dist/models/generated/google-vertex.js +209 -0
  152. package/packages/pi-ai/dist/models/generated/google-vertex.js.map +1 -0
  153. package/packages/pi-ai/dist/models/generated/google.d.ts +462 -0
  154. package/packages/pi-ai/dist/models/generated/google.d.ts.map +1 -0
  155. package/packages/pi-ai/dist/models/generated/google.js +464 -0
  156. package/packages/pi-ai/dist/models/generated/google.js.map +1 -0
  157. package/packages/pi-ai/dist/models/generated/groq.d.ts +309 -0
  158. package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -0
  159. package/packages/pi-ai/dist/models/generated/groq.js +311 -0
  160. package/packages/pi-ai/dist/models/generated/groq.js.map +1 -0
  161. package/packages/pi-ai/dist/models/generated/huggingface.d.ts +383 -0
  162. package/packages/pi-ai/dist/models/generated/huggingface.d.ts.map +1 -0
  163. package/packages/pi-ai/dist/models/generated/huggingface.js +347 -0
  164. package/packages/pi-ai/dist/models/generated/huggingface.js.map +1 -0
  165. package/packages/pi-ai/dist/{models.generated.d.ts → models/generated/index.d.ts} +1 -1
  166. package/packages/pi-ai/dist/{models.generated.d.ts.map → models/generated/index.d.ts.map} +1 -1
  167. package/packages/pi-ai/dist/models/generated/index.js +51 -0
  168. package/packages/pi-ai/dist/models/generated/index.js.map +1 -0
  169. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts +37 -0
  170. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts.map +1 -0
  171. package/packages/pi-ai/dist/models/generated/kimi-coding.js +39 -0
  172. package/packages/pi-ai/dist/models/generated/kimi-coding.js.map +1 -0
  173. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts +105 -0
  174. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts.map +1 -0
  175. package/packages/pi-ai/dist/models/generated/minimax-cn.js +107 -0
  176. package/packages/pi-ai/dist/models/generated/minimax-cn.js.map +1 -0
  177. package/packages/pi-ai/dist/models/generated/minimax.d.ts +105 -0
  178. package/packages/pi-ai/dist/models/generated/minimax.d.ts.map +1 -0
  179. package/packages/pi-ai/dist/models/generated/minimax.js +107 -0
  180. package/packages/pi-ai/dist/models/generated/minimax.js.map +1 -0
  181. package/packages/pi-ai/dist/models/generated/mistral.d.ts +445 -0
  182. package/packages/pi-ai/dist/models/generated/mistral.d.ts.map +1 -0
  183. package/packages/pi-ai/dist/models/generated/mistral.js +447 -0
  184. package/packages/pi-ai/dist/models/generated/mistral.js.map +1 -0
  185. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +139 -0
  186. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -0
  187. package/packages/pi-ai/dist/models/generated/openai-codex.js +141 -0
  188. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -0
  189. package/packages/pi-ai/dist/models/generated/openai.d.ts +700 -0
  190. package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -0
  191. package/packages/pi-ai/dist/models/generated/openai.js +702 -0
  192. package/packages/pi-ai/dist/models/generated/openai.js.map +1 -0
  193. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts +122 -0
  194. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts.map +1 -0
  195. package/packages/pi-ai/dist/models/generated/opencode-go.js +124 -0
  196. package/packages/pi-ai/dist/models/generated/opencode-go.js.map +1 -0
  197. package/packages/pi-ai/dist/models/generated/opencode.d.ts +530 -0
  198. package/packages/pi-ai/dist/models/generated/opencode.d.ts.map +1 -0
  199. package/packages/pi-ai/dist/models/generated/opencode.js +532 -0
  200. package/packages/pi-ai/dist/models/generated/opencode.js.map +1 -0
  201. package/packages/pi-ai/dist/models/generated/openrouter.d.ts +4270 -0
  202. package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -0
  203. package/packages/pi-ai/dist/models/generated/openrouter.js +4272 -0
  204. package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -0
  205. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts +2604 -0
  206. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts.map +1 -0
  207. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js +2606 -0
  208. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js.map +1 -0
  209. package/packages/pi-ai/dist/models/generated/xai.d.ts +411 -0
  210. package/packages/pi-ai/dist/models/generated/xai.d.ts.map +1 -0
  211. package/packages/pi-ai/dist/models/generated/xai.js +413 -0
  212. package/packages/pi-ai/dist/models/generated/xai.js.map +1 -0
  213. package/packages/pi-ai/dist/models/generated/zai.d.ts +276 -0
  214. package/packages/pi-ai/dist/models/generated/zai.d.ts.map +1 -0
  215. package/packages/pi-ai/dist/models/generated/zai.js +239 -0
  216. package/packages/pi-ai/dist/models/generated/zai.js.map +1 -0
  217. package/packages/pi-ai/dist/models/index.d.ts +27 -0
  218. package/packages/pi-ai/dist/models/index.d.ts.map +1 -0
  219. package/packages/pi-ai/dist/models/index.js +80 -0
  220. package/packages/pi-ai/dist/models/index.js.map +1 -0
  221. package/packages/pi-ai/dist/models.d.ts +1 -36
  222. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  223. package/packages/pi-ai/dist/models.generated.test.js +1 -2
  224. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  225. package/packages/pi-ai/dist/models.js +3 -112
  226. package/packages/pi-ai/dist/models.js.map +1 -1
  227. package/packages/pi-ai/dist/models.test.js +6 -5
  228. package/packages/pi-ai/dist/models.test.js.map +1 -1
  229. package/packages/pi-ai/scripts/generate-models.ts +74 -40
  230. package/packages/pi-ai/src/index.ts +1 -9
  231. package/packages/pi-ai/src/models/capability-patches.ts +40 -0
  232. package/packages/pi-ai/src/{models.custom.ts → models/custom.ts} +4 -4
  233. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +1486 -0
  234. package/packages/pi-ai/src/models/generated/anthropic.ts +381 -0
  235. package/packages/pi-ai/src/models/generated/azure-openai-responses.ts +704 -0
  236. package/packages/pi-ai/src/models/generated/cerebras.ts +75 -0
  237. package/packages/pi-ai/src/models/generated/github-copilot.ts +446 -0
  238. package/packages/pi-ai/src/models/generated/google-antigravity.ts +160 -0
  239. package/packages/pi-ai/src/models/generated/google-gemini-cli.ts +109 -0
  240. package/packages/pi-ai/src/models/generated/google-vertex.ts +211 -0
  241. package/packages/pi-ai/src/models/generated/google.ts +466 -0
  242. package/packages/pi-ai/src/models/generated/groq.ts +313 -0
  243. package/packages/pi-ai/src/models/generated/huggingface.ts +349 -0
  244. package/packages/pi-ai/src/models/generated/index.ts +52 -0
  245. package/packages/pi-ai/src/models/generated/kimi-coding.ts +41 -0
  246. package/packages/pi-ai/src/models/generated/minimax-cn.ts +109 -0
  247. package/packages/pi-ai/src/models/generated/minimax.ts +109 -0
  248. package/packages/pi-ai/src/models/generated/mistral.ts +449 -0
  249. package/packages/pi-ai/src/models/generated/openai-codex.ts +143 -0
  250. package/packages/pi-ai/src/models/generated/openai.ts +704 -0
  251. package/packages/pi-ai/src/models/generated/opencode-go.ts +126 -0
  252. package/packages/pi-ai/src/models/generated/opencode.ts +534 -0
  253. package/packages/pi-ai/src/models/generated/openrouter.ts +4274 -0
  254. package/packages/pi-ai/src/models/generated/vercel-ai-gateway.ts +2608 -0
  255. package/packages/pi-ai/src/models/generated/xai.ts +415 -0
  256. package/packages/pi-ai/src/models/generated/zai.ts +241 -0
  257. package/packages/pi-ai/src/models/index.ts +106 -0
  258. package/packages/pi-ai/src/models.generated.test.ts +1 -2
  259. package/packages/pi-ai/src/models.test.ts +6 -5
  260. package/packages/pi-ai/src/models.ts +3 -153
  261. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  262. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  263. package/packages/pi-coding-agent/dist/core/agent-session.js +8 -2
  264. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  265. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +472 -0
  266. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  267. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts +2 -0
  268. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts.map +1 -0
  269. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js +52 -0
  270. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js.map +1 -0
  271. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  272. package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
  273. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.d.ts +2 -0
  275. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.d.ts.map +1 -0
  276. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +61 -0
  277. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -0
  278. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +11 -0
  279. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  280. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +1 -0
  281. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  282. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +23 -9
  283. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  284. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts +11 -0
  285. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -0
  286. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +53 -0
  287. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -0
  288. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.d.ts +8 -5
  289. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  290. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js +27 -13
  291. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  292. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +8 -0
  293. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  294. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +68 -8
  295. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  296. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  297. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +22 -22
  298. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  299. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  300. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +232 -18
  301. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts +2 -0
  303. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts.map +1 -0
  304. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +38 -0
  305. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -0
  306. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +14 -0
  307. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  308. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +70 -6
  309. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  310. package/packages/pi-coding-agent/src/core/agent-session.ts +12 -6
  311. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +612 -0
  312. package/packages/pi-coding-agent/src/core/model-registry-env-fallback.test.ts +59 -0
  313. package/packages/pi-coding-agent/src/core/model-registry.ts +2 -1
  314. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +92 -0
  315. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +19 -0
  316. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +25 -10
  317. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +75 -0
  318. package/packages/pi-coding-agent/src/modes/interactive/components/compaction-summary-message.ts +36 -15
  319. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +83 -7
  320. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +23 -26
  321. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +298 -41
  322. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +44 -0
  323. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +92 -6
  324. package/packages/pi-coding-agent/src/types/ambient-modules.d.ts +69 -0
  325. package/packages/pi-coding-agent/tsconfig.json +2 -2
  326. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  327. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  328. package/packages/pi-tui/dist/tui.js +9 -2
  329. package/packages/pi-tui/dist/tui.js.map +1 -1
  330. package/packages/pi-tui/src/tui.ts +9 -1
  331. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  332. package/src/resources/extensions/gsd/activity-log.ts +21 -0
  333. package/src/resources/extensions/gsd/auto/loop-deps.ts +4 -0
  334. package/src/resources/extensions/gsd/auto/loop.ts +159 -10
  335. package/src/resources/extensions/gsd/auto/phases.ts +193 -9
  336. package/src/resources/extensions/gsd/auto/session.ts +10 -0
  337. package/src/resources/extensions/gsd/auto-dispatch.ts +16 -6
  338. package/src/resources/extensions/gsd/auto-model-selection.ts +69 -8
  339. package/src/resources/extensions/gsd/auto-post-unit.ts +226 -9
  340. package/src/resources/extensions/gsd/auto-recovery.ts +29 -9
  341. package/src/resources/extensions/gsd/auto-unit-closeout.ts +25 -1
  342. package/src/resources/extensions/gsd/auto-verification.ts +129 -2
  343. package/src/resources/extensions/gsd/auto-worktree.ts +1 -0
  344. package/src/resources/extensions/gsd/auto.ts +34 -2
  345. package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +5 -3
  346. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +15 -1
  347. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +72 -8
  348. package/src/resources/extensions/gsd/cache.ts +16 -5
  349. package/src/resources/extensions/gsd/commands/catalog.ts +6 -1
  350. package/src/resources/extensions/gsd/commands/handlers/core.ts +5 -1
  351. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
  352. package/src/resources/extensions/gsd/commands-extract-learnings.ts +304 -0
  353. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +58 -4
  354. package/src/resources/extensions/gsd/docs/preferences-reference.md +16 -1
  355. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +228 -0
  356. package/src/resources/extensions/gsd/ecosystem/loader.ts +201 -0
  357. package/src/resources/extensions/gsd/git-service.ts +68 -0
  358. package/src/resources/extensions/gsd/graph-context.ts +139 -12
  359. package/src/resources/extensions/gsd/gsd-db.ts +321 -3
  360. package/src/resources/extensions/gsd/guided-flow.ts +36 -2
  361. package/src/resources/extensions/gsd/init-wizard.ts +3 -2
  362. package/src/resources/extensions/gsd/journal.ts +30 -0
  363. package/src/resources/extensions/gsd/metrics.ts +26 -0
  364. package/src/resources/extensions/gsd/parallel-orchestrator.ts +40 -1
  365. package/src/resources/extensions/gsd/preferences-models.ts +20 -3
  366. package/src/resources/extensions/gsd/preferences-types.ts +38 -0
  367. package/src/resources/extensions/gsd/preferences-validation.ts +117 -2
  368. package/src/resources/extensions/gsd/preferences.ts +34 -0
  369. package/src/resources/extensions/gsd/safety/evidence-collector.ts +15 -31
  370. package/src/resources/extensions/gsd/session-lock.ts +14 -2
  371. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +20 -1
  372. package/src/resources/extensions/gsd/templates/PREFERENCES.md +19 -0
  373. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +177 -0
  374. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +7 -3
  375. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +20 -0
  376. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +7 -3
  377. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +272 -0
  378. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +117 -0
  379. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +6 -2
  380. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +340 -0
  381. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
  382. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  383. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +10 -7
  384. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
  385. package/src/resources/extensions/gsd/tests/health-widget.test.ts +1 -1
  386. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +3 -3
  387. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -2
  388. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -3
  389. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  390. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +2 -1
  391. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +40 -1
  392. package/src/resources/extensions/gsd/tests/preferences.test.ts +145 -0
  393. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +57 -2
  394. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +1 -1
  395. package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -5
  396. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +101 -0
  397. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +85 -0
  398. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +69 -0
  399. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +39 -0
  400. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +70 -0
  401. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +85 -0
  402. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +35 -0
  403. package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +89 -0
  404. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +167 -0
  405. package/src/resources/extensions/gsd/tests/uok-preferences.test.ts +42 -0
  406. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +39 -0
  407. package/src/resources/extensions/gsd/tools/complete-slice.ts +9 -2
  408. package/src/resources/extensions/gsd/tools/validate-milestone.ts +48 -3
  409. package/src/resources/extensions/gsd/types.ts +14 -1
  410. package/src/resources/extensions/gsd/unit-ownership.ts +2 -2
  411. package/src/resources/extensions/gsd/uok/audit-toggle.ts +9 -0
  412. package/src/resources/extensions/gsd/uok/audit.ts +51 -0
  413. package/src/resources/extensions/gsd/uok/contracts.ts +135 -0
  414. package/src/resources/extensions/gsd/uok/execution-graph.ts +241 -0
  415. package/src/resources/extensions/gsd/uok/flags.ts +45 -0
  416. package/src/resources/extensions/gsd/uok/gate-runner.ts +146 -0
  417. package/src/resources/extensions/gsd/uok/gitops.ts +75 -0
  418. package/src/resources/extensions/gsd/uok/kernel.ts +105 -0
  419. package/src/resources/extensions/gsd/uok/loop-adapter.ts +162 -0
  420. package/src/resources/extensions/gsd/uok/model-policy.ts +112 -0
  421. package/src/resources/extensions/gsd/uok/plan-v2.ts +156 -0
  422. package/src/resources/extensions/gsd/workflow-logger.ts +27 -1
  423. package/src/resources/extensions/ttsr/ttsr-manager.ts +10 -5
  424. package/packages/pi-ai/dist/models.custom.d.ts.map +0 -1
  425. package/packages/pi-ai/dist/models.custom.js.map +0 -1
  426. package/packages/pi-ai/dist/models.generated.js +0 -14343
  427. package/packages/pi-ai/dist/models.generated.js.map +0 -1
  428. package/packages/pi-ai/src/models.generated.ts +0 -14345
  429. /package/dist/web/standalone/.next/static/{XnHY5eXUsTCFmNodWHetD → k1VZ0h-SB6uWSZgPhgNwi}/_buildManifest.js +0 -0
  430. /package/dist/web/standalone/.next/static/{XnHY5eXUsTCFmNodWHetD → k1VZ0h-SB6uWSZgPhgNwi}/_ssgManifest.js +0 -0
@@ -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,340 @@
1
+ import { describe, it, beforeEach, afterEach } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { mkdirSync, writeFileSync, rmSync } from "node:fs";
4
+ import { join } from "node:path";
5
+ import { tmpdir } from "node:os";
6
+ import { randomUUID } from "node:crypto";
7
+
8
+ import {
9
+ parseExtractLearningsArgs,
10
+ buildLearningsOutputPath,
11
+ resolvePhaseArtifacts,
12
+ buildExtractLearningsPrompt,
13
+ buildFrontmatter,
14
+ extractProjectName,
15
+ } from "../commands-extract-learnings.js";
16
+
17
+ // ─── parseExtractLearningsArgs ────────────────────────────────────────────────
18
+
19
+ describe("parseExtractLearningsArgs", () => {
20
+ it("parses a milestone ID", () => {
21
+ const result = parseExtractLearningsArgs("M001");
22
+ assert.deepEqual(result, { milestoneId: "M001" });
23
+ });
24
+
25
+ it("returns null milestoneId for empty string", () => {
26
+ const result = parseExtractLearningsArgs("");
27
+ assert.deepEqual(result, { milestoneId: null });
28
+ });
29
+
30
+ it("returns null milestoneId for whitespace-only string", () => {
31
+ const result = parseExtractLearningsArgs(" ");
32
+ assert.deepEqual(result, { milestoneId: null });
33
+ });
34
+
35
+ it("trims whitespace from milestone ID", () => {
36
+ const result = parseExtractLearningsArgs(" M002 ");
37
+ assert.deepEqual(result, { milestoneId: "M002" });
38
+ });
39
+ });
40
+
41
+ // ─── buildLearningsOutputPath ─────────────────────────────────────────────────
42
+
43
+ describe("buildLearningsOutputPath", () => {
44
+ it("builds the correct output path", () => {
45
+ const result = buildLearningsOutputPath("/base/.gsd/milestones/M001", "M001");
46
+ assert.equal(result, "/base/.gsd/milestones/M001/M001-LEARNINGS.md");
47
+ });
48
+
49
+ it("builds path for different milestone ID", () => {
50
+ const result = buildLearningsOutputPath("/project/.gsd/milestones/M005", "M005");
51
+ assert.equal(result, "/project/.gsd/milestones/M005/M005-LEARNINGS.md");
52
+ });
53
+ });
54
+
55
+ // ─── resolvePhaseArtifacts ────────────────────────────────────────────────────
56
+
57
+ describe("resolvePhaseArtifacts", () => {
58
+ let tmpBase: string;
59
+
60
+ beforeEach(() => {
61
+ tmpBase = join(tmpdir(), `gsd-learnings-test-${randomUUID()}`);
62
+ mkdirSync(tmpBase, { recursive: true });
63
+ });
64
+
65
+ afterEach(() => {
66
+ rmSync(tmpBase, { recursive: true, force: true });
67
+ });
68
+
69
+ it("finds required PLAN and SUMMARY when both present", () => {
70
+ writeFileSync(join(tmpBase, "M001-PLAN.md"), "# M001 Plan content", "utf-8");
71
+ writeFileSync(join(tmpBase, "M001-SUMMARY.md"), "# M001 Summary content", "utf-8");
72
+
73
+ const result = resolvePhaseArtifacts(tmpBase, "M001");
74
+ assert.equal(result.plan, join(tmpBase, "M001-PLAN.md"));
75
+ assert.equal(result.summary, join(tmpBase, "M001-SUMMARY.md"));
76
+ assert.deepEqual(result.missingRequired, []);
77
+ });
78
+
79
+ it("reports missing PLAN as missingRequired", () => {
80
+ writeFileSync(join(tmpBase, "M001-SUMMARY.md"), "# Summary", "utf-8");
81
+
82
+ const result = resolvePhaseArtifacts(tmpBase, "M001");
83
+ assert.ok(result.missingRequired.includes("M001-PLAN.md"));
84
+ assert.equal(result.plan, null);
85
+ });
86
+
87
+ it("reports missing SUMMARY as missingRequired", () => {
88
+ writeFileSync(join(tmpBase, "M001-PLAN.md"), "# Plan", "utf-8");
89
+
90
+ const result = resolvePhaseArtifacts(tmpBase, "M001");
91
+ assert.ok(result.missingRequired.includes("M001-SUMMARY.md"));
92
+ assert.equal(result.summary, null);
93
+ });
94
+
95
+ it("reports both required files missing when neither present", () => {
96
+ const result = resolvePhaseArtifacts(tmpBase, "M001");
97
+ assert.equal(result.missingRequired.length, 2);
98
+ assert.ok(result.missingRequired.includes("M001-PLAN.md"));
99
+ assert.ok(result.missingRequired.includes("M001-SUMMARY.md"));
100
+ });
101
+
102
+ it("finds optional VERIFICATION when present", () => {
103
+ writeFileSync(join(tmpBase, "M001-PLAN.md"), "# Plan", "utf-8");
104
+ writeFileSync(join(tmpBase, "M001-SUMMARY.md"), "# Summary", "utf-8");
105
+ writeFileSync(join(tmpBase, "M001-VERIFICATION.md"), "# Verification", "utf-8");
106
+
107
+ const result = resolvePhaseArtifacts(tmpBase, "M001");
108
+ assert.equal(result.verification, join(tmpBase, "M001-VERIFICATION.md"));
109
+ });
110
+
111
+ it("returns null for optional VERIFICATION when absent", () => {
112
+ writeFileSync(join(tmpBase, "M001-PLAN.md"), "# Plan", "utf-8");
113
+ writeFileSync(join(tmpBase, "M001-SUMMARY.md"), "# Summary", "utf-8");
114
+
115
+ const result = resolvePhaseArtifacts(tmpBase, "M001");
116
+ assert.equal(result.verification, null);
117
+ });
118
+
119
+ it("finds optional UAT when present", () => {
120
+ writeFileSync(join(tmpBase, "M001-PLAN.md"), "# Plan", "utf-8");
121
+ writeFileSync(join(tmpBase, "M001-SUMMARY.md"), "# Summary", "utf-8");
122
+ writeFileSync(join(tmpBase, "M001-UAT.md"), "# UAT", "utf-8");
123
+
124
+ const result = resolvePhaseArtifacts(tmpBase, "M001");
125
+ assert.equal(result.uat, join(tmpBase, "M001-UAT.md"));
126
+ });
127
+
128
+ it("returns null for optional UAT when absent, no error", () => {
129
+ writeFileSync(join(tmpBase, "M001-PLAN.md"), "# Plan", "utf-8");
130
+ writeFileSync(join(tmpBase, "M001-SUMMARY.md"), "# Summary", "utf-8");
131
+
132
+ const result = resolvePhaseArtifacts(tmpBase, "M001");
133
+ assert.equal(result.uat, null);
134
+ assert.deepEqual(result.missingRequired, []);
135
+ });
136
+ });
137
+
138
+ // ─── buildExtractLearningsPrompt ──────────────────────────────────────────────
139
+
140
+ describe("buildExtractLearningsPrompt", () => {
141
+ it("includes milestoneId and outputPath", () => {
142
+ const result = buildExtractLearningsPrompt({
143
+ milestoneId: "M001",
144
+ milestoneName: "Test Milestone",
145
+ outputPath: "/project/.gsd/milestones/M001/M001-LEARNINGS.md",
146
+ relativeOutputPath: ".gsd/milestones/M001/M001-LEARNINGS.md",
147
+ planContent: "# Plan content",
148
+ summaryContent: "# Summary content",
149
+ verificationContent: null,
150
+ uatContent: null,
151
+ missingArtifacts: [],
152
+ projectName: "MyProject",
153
+ });
154
+
155
+ assert.ok(result.includes("M001"));
156
+ assert.ok(result.includes("/project/.gsd/milestones/M001/M001-LEARNINGS.md"));
157
+ });
158
+
159
+ it("includes all 4 learning categories", () => {
160
+ const result = buildExtractLearningsPrompt({
161
+ milestoneId: "M001",
162
+ milestoneName: "Test Milestone",
163
+ outputPath: "/out/M001-LEARNINGS.md",
164
+ relativeOutputPath: ".gsd/milestones/M001/M001-LEARNINGS.md",
165
+ planContent: "# Plan",
166
+ summaryContent: "# Summary",
167
+ verificationContent: null,
168
+ uatContent: null,
169
+ missingArtifacts: [],
170
+ projectName: "MyProject",
171
+ });
172
+
173
+ assert.ok(result.includes("Decisions"));
174
+ assert.ok(result.includes("Lessons"));
175
+ assert.ok(result.includes("Patterns"));
176
+ assert.ok(result.includes("Surprises"));
177
+ });
178
+
179
+ it("includes plan and summary content", () => {
180
+ const result = buildExtractLearningsPrompt({
181
+ milestoneId: "M001",
182
+ milestoneName: "Test Milestone",
183
+ outputPath: "/out/M001-LEARNINGS.md",
184
+ relativeOutputPath: ".gsd/milestones/M001/M001-LEARNINGS.md",
185
+ planContent: "PLAN_CONTENT_UNIQUE_123",
186
+ summaryContent: "SUMMARY_CONTENT_UNIQUE_456",
187
+ verificationContent: null,
188
+ uatContent: null,
189
+ missingArtifacts: [],
190
+ projectName: "MyProject",
191
+ });
192
+
193
+ assert.ok(result.includes("PLAN_CONTENT_UNIQUE_123"));
194
+ assert.ok(result.includes("SUMMARY_CONTENT_UNIQUE_456"));
195
+ });
196
+
197
+ it("includes optional artifacts when present", () => {
198
+ const result = buildExtractLearningsPrompt({
199
+ milestoneId: "M001",
200
+ milestoneName: "Test Milestone",
201
+ outputPath: "/out/M001-LEARNINGS.md",
202
+ relativeOutputPath: ".gsd/milestones/M001/M001-LEARNINGS.md",
203
+ planContent: "# Plan",
204
+ summaryContent: "# Summary",
205
+ verificationContent: "VERIFICATION_UNIQUE_789",
206
+ uatContent: "UAT_UNIQUE_012",
207
+ missingArtifacts: [],
208
+ projectName: "MyProject",
209
+ });
210
+
211
+ assert.ok(result.includes("VERIFICATION_UNIQUE_789"));
212
+ assert.ok(result.includes("UAT_UNIQUE_012"));
213
+ });
214
+
215
+ it("lists missing artifacts when present", () => {
216
+ const result = buildExtractLearningsPrompt({
217
+ milestoneId: "M001",
218
+ milestoneName: "Test Milestone",
219
+ outputPath: "/out/M001-LEARNINGS.md",
220
+ relativeOutputPath: ".gsd/milestones/M001/M001-LEARNINGS.md",
221
+ planContent: "# Plan",
222
+ summaryContent: "# Summary",
223
+ verificationContent: null,
224
+ uatContent: null,
225
+ missingArtifacts: ["M001-VERIFICATION.md"],
226
+ projectName: "MyProject",
227
+ });
228
+
229
+ assert.ok(result.includes("M001-VERIFICATION.md"));
230
+ });
231
+ });
232
+
233
+ // ─── buildFrontmatter ─────────────────────────────────────────────────────────
234
+
235
+ describe("buildFrontmatter", () => {
236
+ it("starts with --- and ends with ---", () => {
237
+ const result = buildFrontmatter({
238
+ milestoneId: "M001",
239
+ milestoneName: "Test Milestone",
240
+ projectName: "MyProject",
241
+ generatedAt: "2026-04-15T10:00:00Z",
242
+ counts: { decisions: 0, lessons: 0, patterns: 0, surprises: 0 },
243
+ missingArtifacts: [],
244
+ });
245
+
246
+ assert.ok(result.startsWith("---\n"));
247
+ assert.ok(result.endsWith("---"));
248
+ });
249
+
250
+ it("includes required fields", () => {
251
+ const result = buildFrontmatter({
252
+ milestoneId: "M001",
253
+ milestoneName: "Test Milestone",
254
+ projectName: "MyProject",
255
+ generatedAt: "2026-04-15T10:00:00Z",
256
+ counts: { decisions: 3, lessons: 2, patterns: 1, surprises: 0 },
257
+ missingArtifacts: [],
258
+ });
259
+
260
+ assert.ok(result.includes("phase:"));
261
+ assert.ok(result.includes("phase_name:"));
262
+ assert.ok(result.includes("project:"));
263
+ assert.ok(result.includes("generated:"));
264
+ assert.ok(result.includes("counts:"));
265
+ assert.ok(result.includes("missing_artifacts:"));
266
+ });
267
+
268
+ it("includes milestoneId as phase value", () => {
269
+ const result = buildFrontmatter({
270
+ milestoneId: "M001",
271
+ milestoneName: "Auth System",
272
+ projectName: "MyApp",
273
+ generatedAt: "2026-04-15T10:00:00Z",
274
+ counts: { decisions: 0, lessons: 0, patterns: 0, surprises: 0 },
275
+ missingArtifacts: [],
276
+ });
277
+
278
+ assert.ok(result.includes("M001"));
279
+ assert.ok(result.includes("Auth System"));
280
+ assert.ok(result.includes("MyApp"));
281
+ assert.ok(result.includes("2026-04-15T10:00:00Z"));
282
+ });
283
+
284
+ it("includes missing artifacts list", () => {
285
+ const result = buildFrontmatter({
286
+ milestoneId: "M001",
287
+ milestoneName: "Test",
288
+ projectName: "Proj",
289
+ generatedAt: "2026-04-15T10:00:00Z",
290
+ counts: { decisions: 0, lessons: 0, patterns: 0, surprises: 0 },
291
+ missingArtifacts: ["M001-VERIFICATION.md", "M001-UAT.md"],
292
+ });
293
+
294
+ assert.ok(result.includes("M001-VERIFICATION.md"));
295
+ assert.ok(result.includes("M001-UAT.md"));
296
+ });
297
+ });
298
+
299
+ // ─── extractProjectName ───────────────────────────────────────────────────────
300
+
301
+ describe("extractProjectName", () => {
302
+ let tmpBase: string;
303
+
304
+ beforeEach(() => {
305
+ tmpBase = join(tmpdir(), `gsd-projname-test-${randomUUID()}`);
306
+ mkdirSync(join(tmpBase, ".gsd"), { recursive: true });
307
+ });
308
+
309
+ afterEach(() => {
310
+ rmSync(tmpBase, { recursive: true, force: true });
311
+ });
312
+
313
+ it("reads name from PROJECT.md frontmatter", () => {
314
+ writeFileSync(
315
+ join(tmpBase, ".gsd", "PROJECT.md"),
316
+ "---\nname: My Cool Project\nversion: 1\n---\n# Project\n",
317
+ "utf-8",
318
+ );
319
+
320
+ const result = extractProjectName(tmpBase);
321
+ assert.equal(result, "My Cool Project");
322
+ });
323
+
324
+ it("falls back to directory name when PROJECT.md absent", () => {
325
+ const result = extractProjectName(tmpBase);
326
+ // Should return the last path segment of tmpBase
327
+ assert.equal(result, tmpBase.split("/").at(-1));
328
+ });
329
+
330
+ it("falls back to directory name when PROJECT.md has no name field", () => {
331
+ writeFileSync(
332
+ join(tmpBase, ".gsd", "PROJECT.md"),
333
+ "---\nversion: 1\n---\n# Project\n",
334
+ "utf-8",
335
+ );
336
+
337
+ const result = extractProjectName(tmpBase);
338
+ assert.equal(result, tmpBase.split("/").at(-1));
339
+ });
340
+ });
@@ -125,9 +125,9 @@ console.log('\n=== complete-slice: schema v6 migration ===');
125
125
 
126
126
  const adapter = _getAdapter()!;
127
127
 
128
- // Verify schema version is current (v14 after indexes + slice_dependencies)
128
+ // Verify schema version is current (v15 with UOK projection tables)
129
129
  const versionRow = adapter.prepare('SELECT MAX(version) as v FROM schema_version').get();
130
- assertEq(versionRow?.['v'], 14, 'schema version should be 14');
130
+ assertEq(versionRow?.['v'], 15, 'schema version should be 15');
131
131
 
132
132
  // Verify slices table has full_summary_md and full_uat_md columns
133
133
  const cols = adapter.prepare("PRAGMA table_info(slices)").all();
@@ -109,9 +109,9 @@ console.log('\n=== complete-task: schema v5 migration ===');
109
109
 
110
110
  const adapter = _getAdapter()!;
111
111
 
112
- // Verify schema version is current (v14 after indexes + slice_dependencies)
112
+ // Verify schema version is current (v15 with UOK projection tables)
113
113
  const versionRow = adapter.prepare('SELECT MAX(version) as v FROM schema_version').get();
114
- assertEq(versionRow?.['v'], 14, 'schema version should be 14');
114
+ assertEq(versionRow?.['v'], 15, 'schema version should be 15');
115
115
 
116
116
  // Verify all 4 new tables exist
117
117
  const tables = adapter.prepare(
@@ -26,6 +26,14 @@ import { MAX_FINALIZE_TIMEOUTS } from "../auto/types.ts";
26
26
 
27
27
  const { assertTrue, assertEq, report } = createTestContext();
28
28
 
29
+ function getRunFinalizeBody(phasesSource: string): string {
30
+ const fnIdx = phasesSource.indexOf("export async function runFinalize(");
31
+ assertTrue(fnIdx > 0, "runFinalize function should exist in phases.ts");
32
+
33
+ const nextExportIdx = phasesSource.indexOf("\nexport ", fnIdx + 1);
34
+ return phasesSource.slice(fnIdx, nextExportIdx > fnIdx ? nextExportIdx : undefined);
35
+ }
36
+
29
37
  // ═══ Test: withTimeout resolves when inner promise resolves promptly ══════════
30
38
 
31
39
  {
@@ -145,11 +153,7 @@ const { assertTrue, assertEq, report } = createTestContext();
145
153
  "utf-8",
146
154
  );
147
155
 
148
- // Find the runFinalize function body
149
- const fnIdx = phasesSource.indexOf("export async function runFinalize(");
150
- assertTrue(fnIdx > 0, "runFinalize function should exist in phases.ts");
151
-
152
- const fnBody = phasesSource.slice(fnIdx, fnIdx + 8000);
156
+ const fnBody = getRunFinalizeBody(phasesSource);
153
157
 
154
158
  // postUnitPreVerification must be wrapped in withTimeout
155
159
  const preTimeoutIdx = fnBody.indexOf("withTimeout(");
@@ -207,8 +211,7 @@ const { assertTrue, assertEq, report } = createTestContext();
207
211
  "utf-8",
208
212
  );
209
213
 
210
- const fnIdx = phasesSource.indexOf("export async function runFinalize(");
211
- const fnBody = phasesSource.slice(fnIdx, fnIdx + 8000);
214
+ const fnBody = getRunFinalizeBody(phasesSource);
212
215
 
213
216
  // Both timeout handlers should increment consecutiveFinalizeTimeouts
214
217
  const incrementCount = (fnBody.match(/consecutiveFinalizeTimeouts\+\+/g) || []).length;
@@ -80,7 +80,7 @@ describe('gsd-db', () => {
80
80
  // Check schema_version table
81
81
  const adapter = _getAdapter()!;
82
82
  const version = adapter.prepare('SELECT MAX(version) as version FROM schema_version').get();
83
- assert.deepStrictEqual(version?.['version'], 14, 'schema version should be 14');
83
+ assert.deepStrictEqual(version?.['version'], 15, 'schema version should be 15');
84
84
 
85
85
  // Check tables exist by querying them
86
86
  const dRows = adapter.prepare('SELECT count(*) as cnt FROM decisions').get();
@@ -198,7 +198,7 @@ test("session_start bootstraps the health widget alongside notifications", async
198
198
  },
199
199
  } as any;
200
200
 
201
- registerHooks(pi);
201
+ registerHooks(pi, []);
202
202
  const sessionStart = handlers.get("session_start");
203
203
  assert.ok(sessionStart, "session_start handler is registered");
204
204
 
@@ -595,13 +595,13 @@ test("unit-end event contains errorContext when unit is cancelled with structure
595
595
  const unitPromise = runUnitPhase(ic, iterData, loopState);
596
596
  await new Promise(r => setTimeout(r, 50));
597
597
 
598
- // Resolve with errorContext (simulates a timeout cancel)
598
+ // Resolve with errorContext (simulates a unit hard timeout — not session creation)
599
599
  resolveAgentEndCancelled({ message: "Hard timeout error: exceeded limit", category: "timeout", isTransient: true });
600
600
 
601
601
  const result = await unitPromise;
602
- // Transient timeout cancellations pause (recoverable) instead of hard-stopping
602
+ // Unit hard timeouts pause (recoverable) without auto-resume
603
603
  assert.equal(result.action, "break");
604
- assert.equal((result as any).reason, "session-timeout");
604
+ assert.equal((result as any).reason, "unit-hard-timeout");
605
605
  assert.equal(pauseCalls, 1, "timeout cancellations should pause auto-mode exactly once");
606
606
  assert.equal(commitCalls, 1, "timeout cancellations should flush a unit auto-commit once");
607
607
 
@@ -363,7 +363,7 @@ test('md-importer: schema v1→v2 migration', () => {
363
363
  openDatabase(':memory:');
364
364
  const adapter = _getAdapter();
365
365
  const version = adapter?.prepare('SELECT MAX(version) as v FROM schema_version').get();
366
- assert.deepStrictEqual(version?.v, 14, 'new DB should be at schema version 14');
366
+ assert.deepStrictEqual(version?.v, 15, 'new DB should be at schema version 15');
367
367
 
368
368
  // Artifacts table should exist
369
369
  const tableCheck = adapter?.prepare("SELECT count(*) as c FROM sqlite_master WHERE type='table' AND name='artifacts'").get();
@@ -413,4 +413,3 @@ test('md-importer: round-trip fidelity', () => {
413
413
  });
414
414
 
415
415
  // ═══════════════════════════════════════════════════════════════════════════
416
-
@@ -323,10 +323,9 @@ test('memory-store: schema includes memories table', () => {
323
323
  const viewCount = adapter.prepare('SELECT count(*) as cnt FROM active_memories').get();
324
324
  assert.deepStrictEqual(viewCount?.['cnt'], 0, 'active_memories view should exist');
325
325
 
326
- // Verify schema version is 14 (after indexes + slice_dependencies)
326
+ // Verify schema version is 15 (UOK gate/git/audit projection tables included)
327
327
  const version = adapter.prepare('SELECT MAX(version) as v FROM schema_version').get();
328
- assert.deepStrictEqual(version?.['v'], 14, 'schema version should be 14');
328
+ assert.deepStrictEqual(version?.['v'], 15, 'schema version should be 15');
329
329
 
330
330
  closeDatabase();
331
331
  });
332
-
@@ -14,7 +14,7 @@ import { join } from "node:path";
14
14
 
15
15
  import { runPostUnitVerification, type VerificationContext } from "../auto-verification.ts";
16
16
  import { AutoSession } from "../auto/session.ts";
17
- import { openDatabase, closeDatabase, insertMilestone, insertSlice, insertTask } from "../gsd-db.ts";
17
+ import { openDatabase, closeDatabase, insertMilestone, insertSlice, insertTask, _getAdapter } from "../gsd-db.ts";
18
18
  import { invalidateAllCaches } from "../cache.ts";
19
19
  import { _clearGsdRootCache } from "../paths.ts";
20
20
 
@@ -140,6 +140,43 @@ function createBasicTask(): void {
140
140
  });
141
141
  }
142
142
 
143
+ function createPostExecFailureTask(): void {
144
+ insertMilestone({ id: "M001" });
145
+ insertSlice({
146
+ id: "S01",
147
+ milestoneId: "M001",
148
+ title: "Test Slice",
149
+ risk: "low",
150
+ });
151
+
152
+ const srcDir = join(tempDir, "src");
153
+ mkdirSync(srcDir, { recursive: true });
154
+ writeFileSync(
155
+ join(srcDir, "broken.ts"),
156
+ "import { missing } from './does-not-exist.js';\nexport const ok = 1;\n",
157
+ "utf-8",
158
+ );
159
+
160
+ insertTask({
161
+ id: "T01",
162
+ sliceId: "S01",
163
+ milestoneId: "M001",
164
+ title: "Task with broken import",
165
+ status: "pending",
166
+ keyFiles: ["src/broken.ts"],
167
+ planning: {
168
+ description: "Task that introduces an unresolved import in key files",
169
+ estimate: "1h",
170
+ files: ["src/broken.ts"],
171
+ verify: "echo pass",
172
+ inputs: [],
173
+ expectedOutput: [],
174
+ observabilityImpact: "",
175
+ },
176
+ sequence: 0,
177
+ });
178
+ }
179
+
143
180
  // ─── Tests ───────────────────────────────────────────────────────────────────
144
181
 
145
182
  describe("Post-execution blocking failure retry bypass", () => {
@@ -249,6 +286,47 @@ describe("Post-execution blocking failure retry bypass", () => {
249
286
  // This test mainly confirms the wiring is correct
250
287
  assert.equal(result, "continue");
251
288
  });
289
+
290
+ test("uok gate runner persists post-execution gate failures when enabled", async () => {
291
+ createPostExecFailureTask();
292
+ writePreferences({
293
+ enhanced_verification: true,
294
+ enhanced_verification_post: true,
295
+ verification_auto_fix: true,
296
+ verification_max_retries: 2,
297
+ uok: {
298
+ enabled: true,
299
+ gates: { enabled: true },
300
+ },
301
+ });
302
+
303
+ const ctx = makeMockCtx();
304
+ const pi = makeMockPi();
305
+ const pauseAutoMock = mock.fn(async () => {});
306
+ const s = makeMockSession(tempDir, { type: "execute-task", id: "M001/S01/T01" });
307
+ const vctx: VerificationContext = { s, ctx, pi };
308
+
309
+ const result = await runPostUnitVerification(vctx, pauseAutoMock);
310
+
311
+ assert.equal(result, "pause");
312
+ assert.equal(pauseAutoMock.mock.callCount(), 1);
313
+
314
+ const adapter = _getAdapter();
315
+ const row = adapter
316
+ ?.prepare(
317
+ `SELECT gate_id, outcome, failure_class
318
+ FROM gate_runs
319
+ WHERE gate_id = 'post-execution-checks'
320
+ ORDER BY id DESC
321
+ LIMIT 1`,
322
+ )
323
+ .get() as { gate_id: string; outcome: string; failure_class: string } | undefined;
324
+
325
+ assert.ok(row, "post-execution gate run should be persisted when uok.gates is enabled");
326
+ assert.equal(row?.gate_id, "post-execution-checks");
327
+ assert.equal(row?.outcome, "fail");
328
+ assert.equal(row?.failure_class, "artifact");
329
+ });
252
330
  });
253
331
 
254
332
  describe("Post-execution retry behavior", () => {
@@ -21,7 +21,8 @@ test("postUnitPreVerification rebuilds STATE.md before worktree sync", () => {
21
21
  const fnStart = source.indexOf("export async function postUnitPreVerification");
22
22
  assert.ok(fnStart > 0, "postUnitPreVerification should exist");
23
23
 
24
- const section = source.slice(fnStart, fnStart + 8000);
24
+ const fnEnd = source.indexOf("export async function postUnitPostVerification", fnStart);
25
+ const section = source.slice(fnStart, fnEnd > fnStart ? fnEnd : undefined);
25
26
  const rebuildIdx = section.indexOf('await runSafely("postUnit", "state-rebuild"');
26
27
  const syncIdx = section.indexOf('await runSafely("postUnit", "worktree-sync"');
27
28
 
@@ -17,7 +17,7 @@ import { join } from "node:path";
17
17
 
18
18
  import { postUnitPostVerification, type PostUnitContext } from "../auto-post-unit.ts";
19
19
  import { AutoSession } from "../auto/session.ts";
20
- import { openDatabase, closeDatabase, insertMilestone, insertSlice, insertTask } from "../gsd-db.ts";
20
+ import { openDatabase, closeDatabase, insertMilestone, insertSlice, insertTask, _getAdapter } from "../gsd-db.ts";
21
21
  import { invalidateAllCaches } from "../cache.ts";
22
22
  import { _clearGsdRootCache } from "../paths.ts";
23
23
 
@@ -454,4 +454,43 @@ describe("Pre-execution checks → pauseAuto wiring", () => {
454
454
  "postUnitPostVerification should return 'continue' when pre-execution checks are disabled"
455
455
  );
456
456
  });
457
+
458
+ test("uok gate runner persists pre-execution gate outcomes when enabled", async () => {
459
+ writePreferences({
460
+ enhanced_verification: true,
461
+ enhanced_verification_pre: true,
462
+ enhanced_verification_strict: true,
463
+ uok: {
464
+ enabled: true,
465
+ gates: { enabled: true },
466
+ },
467
+ });
468
+
469
+ createFailingTasks();
470
+
471
+ const ctx = makeMockCtx();
472
+ const pi = makeMockPi();
473
+ const pauseAutoMock = mock.fn(async () => {});
474
+ const s = makeMockSession(tempDir, { type: "plan-slice", id: "M001/S01" });
475
+ const pctx = makePostUnitContext(s, ctx, pi, pauseAutoMock);
476
+
477
+ const result = await postUnitPostVerification(pctx);
478
+ assert.equal(result, "stopped");
479
+
480
+ const adapter = _getAdapter();
481
+ const row = adapter
482
+ ?.prepare(
483
+ `SELECT gate_id, outcome, failure_class
484
+ FROM gate_runs
485
+ WHERE gate_id = 'pre-execution-checks'
486
+ ORDER BY id DESC
487
+ LIMIT 1`,
488
+ )
489
+ .get() as { gate_id: string; outcome: string; failure_class: string } | undefined;
490
+
491
+ assert.ok(row, "pre-execution gate run should be persisted when uok.gates is enabled");
492
+ assert.equal(row?.gate_id, "pre-execution-checks");
493
+ assert.equal(row?.outcome, "fail");
494
+ assert.equal(row?.failure_class, "input");
495
+ });
457
496
  });