@cleocode/core 2026.6.13 → 2026.6.15

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 (485) hide show
  1. package/dist/admin/ops.d.ts +4 -0
  2. package/dist/admin/ops.d.ts.map +1 -1
  3. package/dist/check/index.d.ts +12 -0
  4. package/dist/check/index.d.ts.map +1 -0
  5. package/dist/check/index.js +12 -0
  6. package/dist/check/index.js.map +1 -0
  7. package/dist/check/pr-gate.d.ts +183 -0
  8. package/dist/check/pr-gate.d.ts.map +1 -0
  9. package/dist/check/pr-gate.js +348 -0
  10. package/dist/check/pr-gate.js.map +1 -0
  11. package/dist/conduit/delivery-router.d.ts +134 -0
  12. package/dist/conduit/delivery-router.d.ts.map +1 -0
  13. package/dist/conduit/delivery-router.js +0 -0
  14. package/dist/conduit/delivery-router.js.map +1 -0
  15. package/dist/conduit/index.d.ts +5 -2
  16. package/dist/conduit/index.d.ts.map +1 -1
  17. package/dist/conduit/index.js +5 -2
  18. package/dist/conduit/index.js.map +1 -1
  19. package/dist/conduit/local-tui-adapter.d.ts +89 -0
  20. package/dist/conduit/local-tui-adapter.d.ts.map +1 -0
  21. package/dist/conduit/local-tui-adapter.js +225 -0
  22. package/dist/conduit/local-tui-adapter.js.map +1 -0
  23. package/dist/config/config-repair.d.ts +70 -0
  24. package/dist/config/config-repair.d.ts.map +1 -0
  25. package/dist/config/config-repair.js +248 -0
  26. package/dist/config/config-repair.js.map +1 -0
  27. package/dist/config/registry.d.ts +54 -0
  28. package/dist/config/registry.d.ts.map +1 -1
  29. package/dist/config/registry.js +92 -0
  30. package/dist/config/registry.js.map +1 -1
  31. package/dist/config.d.ts.map +1 -1
  32. package/dist/config.js +11 -10
  33. package/dist/config.js.map +1 -1
  34. package/dist/deriver/queue-manager.d.ts +30 -2
  35. package/dist/deriver/queue-manager.d.ts.map +1 -1
  36. package/dist/deriver/queue-manager.js +54 -9
  37. package/dist/deriver/queue-manager.js.map +1 -1
  38. package/dist/dispatch/config-domain-handler.d.ts +125 -0
  39. package/dist/dispatch/config-domain-handler.d.ts.map +1 -0
  40. package/dist/dispatch/config-domain-handler.js +160 -0
  41. package/dist/dispatch/config-domain-handler.js.map +1 -0
  42. package/dist/dispatch/contracts/input-contracts.d.ts.map +1 -1
  43. package/dist/dispatch/contracts/input-contracts.js +19 -1
  44. package/dist/dispatch/contracts/input-contracts.js.map +1 -1
  45. package/dist/docs/export-document.js +3721 -696
  46. package/dist/docs/export-document.js.map +3 -3
  47. package/dist/gateway-client/client.d.ts +123 -0
  48. package/dist/gateway-client/client.d.ts.map +1 -0
  49. package/dist/gateway-client/client.js +93 -0
  50. package/dist/gateway-client/client.js.map +1 -0
  51. package/dist/gateway-client/generated/client/client.gen.d.ts +3 -0
  52. package/dist/gateway-client/generated/client/client.gen.d.ts.map +1 -0
  53. package/dist/gateway-client/generated/client/client.gen.js +217 -0
  54. package/dist/gateway-client/generated/client/client.gen.js.map +1 -0
  55. package/dist/gateway-client/generated/client/index.d.ts +11 -0
  56. package/dist/gateway-client/generated/client/index.d.ts.map +1 -0
  57. package/dist/gateway-client/generated/client/index.js +7 -0
  58. package/dist/gateway-client/generated/client/index.js.map +1 -0
  59. package/dist/gateway-client/generated/client/types.gen.d.ts +121 -0
  60. package/dist/gateway-client/generated/client/types.gen.d.ts.map +1 -0
  61. package/dist/gateway-client/generated/client/types.gen.js +3 -0
  62. package/dist/gateway-client/generated/client/types.gen.js.map +1 -0
  63. package/dist/gateway-client/generated/client/utils.gen.d.ts +38 -0
  64. package/dist/gateway-client/generated/client/utils.gen.d.ts.map +1 -0
  65. package/dist/gateway-client/generated/client/utils.gen.js +229 -0
  66. package/dist/gateway-client/generated/client/utils.gen.js.map +1 -0
  67. package/dist/gateway-client/generated/client.gen.d.ts +13 -0
  68. package/dist/gateway-client/generated/client.gen.d.ts.map +1 -0
  69. package/dist/gateway-client/generated/client.gen.js +4 -0
  70. package/dist/gateway-client/generated/client.gen.js.map +1 -0
  71. package/dist/gateway-client/generated/core/auth.gen.d.ts +26 -0
  72. package/dist/gateway-client/generated/core/auth.gen.d.ts.map +1 -0
  73. package/dist/gateway-client/generated/core/auth.gen.js +15 -0
  74. package/dist/gateway-client/generated/core/auth.gen.js.map +1 -0
  75. package/dist/gateway-client/generated/core/bodySerializer.gen.d.ts +26 -0
  76. package/dist/gateway-client/generated/core/bodySerializer.gen.d.ts.map +1 -0
  77. package/dist/gateway-client/generated/core/bodySerializer.gen.js +58 -0
  78. package/dist/gateway-client/generated/core/bodySerializer.gen.js.map +1 -0
  79. package/dist/gateway-client/generated/core/params.gen.d.ts +44 -0
  80. package/dist/gateway-client/generated/core/params.gen.d.ts.map +1 -0
  81. package/dist/gateway-client/generated/core/params.gen.js +101 -0
  82. package/dist/gateway-client/generated/core/params.gen.js.map +1 -0
  83. package/dist/gateway-client/generated/core/pathSerializer.gen.d.ts +34 -0
  84. package/dist/gateway-client/generated/core/pathSerializer.gen.d.ts.map +1 -0
  85. package/dist/gateway-client/generated/core/pathSerializer.gen.js +107 -0
  86. package/dist/gateway-client/generated/core/pathSerializer.gen.js.map +1 -0
  87. package/dist/gateway-client/generated/core/queryKeySerializer.gen.d.ts +19 -0
  88. package/dist/gateway-client/generated/core/queryKeySerializer.gen.d.ts.map +1 -0
  89. package/dist/gateway-client/generated/core/queryKeySerializer.gen.js +93 -0
  90. package/dist/gateway-client/generated/core/queryKeySerializer.gen.js.map +1 -0
  91. package/dist/gateway-client/generated/core/serverSentEvents.gen.d.ts +72 -0
  92. package/dist/gateway-client/generated/core/serverSentEvents.gen.d.ts.map +1 -0
  93. package/dist/gateway-client/generated/core/serverSentEvents.gen.js +133 -0
  94. package/dist/gateway-client/generated/core/serverSentEvents.gen.js.map +1 -0
  95. package/dist/gateway-client/generated/core/types.gen.d.ts +84 -0
  96. package/dist/gateway-client/generated/core/types.gen.d.ts.map +1 -0
  97. package/dist/gateway-client/generated/core/types.gen.js +3 -0
  98. package/dist/gateway-client/generated/core/types.gen.js.map +1 -0
  99. package/dist/gateway-client/generated/core/utils.gen.d.ts +20 -0
  100. package/dist/gateway-client/generated/core/utils.gen.d.ts.map +1 -0
  101. package/dist/gateway-client/generated/core/utils.gen.js +88 -0
  102. package/dist/gateway-client/generated/core/utils.gen.js.map +1 -0
  103. package/dist/gateway-client/generated/index.d.ts +3 -0
  104. package/dist/gateway-client/generated/index.d.ts.map +1 -0
  105. package/dist/gateway-client/generated/index.js +3 -0
  106. package/dist/gateway-client/generated/index.js.map +1 -0
  107. package/dist/gateway-client/generated/namespaces.gen.d.ts +512 -0
  108. package/dist/gateway-client/generated/namespaces.gen.d.ts.map +1 -0
  109. package/dist/gateway-client/generated/namespaces.gen.js +521 -0
  110. package/dist/gateway-client/generated/namespaces.gen.js.map +1 -0
  111. package/dist/gateway-client/generated/sdk.gen.d.ts +1780 -0
  112. package/dist/gateway-client/generated/sdk.gen.d.ts.map +1 -0
  113. package/dist/gateway-client/generated/sdk.gen.js +3811 -0
  114. package/dist/gateway-client/generated/sdk.gen.js.map +1 -0
  115. package/dist/gateway-client/generated/types.gen.d.ts +14681 -0
  116. package/dist/gateway-client/generated/types.gen.d.ts.map +1 -0
  117. package/dist/gateway-client/generated/types.gen.js +3 -0
  118. package/dist/gateway-client/generated/types.gen.js.map +1 -0
  119. package/dist/gateway-client/index.d.ts +27 -0
  120. package/dist/gateway-client/index.d.ts.map +1 -0
  121. package/dist/gateway-client/index.js +25 -0
  122. package/dist/gateway-client/index.js.map +1 -0
  123. package/dist/gc/cleanup.d.ts +23 -8
  124. package/dist/gc/cleanup.d.ts.map +1 -1
  125. package/dist/gc/cleanup.js +287 -22
  126. package/dist/gc/cleanup.js.map +1 -1
  127. package/dist/index.d.ts +10 -0
  128. package/dist/index.d.ts.map +1 -1
  129. package/dist/index.js +20 -0
  130. package/dist/index.js.map +1 -1
  131. package/dist/init.d.ts.map +1 -1
  132. package/dist/init.js +28 -0
  133. package/dist/init.js.map +1 -1
  134. package/dist/internal.d.ts +10 -1
  135. package/dist/internal.d.ts.map +1 -1
  136. package/dist/internal.js +18 -1
  137. package/dist/internal.js.map +1 -1
  138. package/dist/llm/catalog-model-resolver.d.ts +19 -0
  139. package/dist/llm/catalog-model-resolver.d.ts.map +1 -1
  140. package/dist/llm/catalog-model-resolver.js +36 -0
  141. package/dist/llm/catalog-model-resolver.js.map +1 -1
  142. package/dist/llm/catalog-resolver.d.ts +112 -0
  143. package/dist/llm/catalog-resolver.d.ts.map +1 -0
  144. package/dist/llm/catalog-resolver.js +207 -0
  145. package/dist/llm/catalog-resolver.js.map +1 -0
  146. package/dist/llm/catalog-seeder.d.ts +96 -0
  147. package/dist/llm/catalog-seeder.d.ts.map +1 -0
  148. package/dist/llm/catalog-seeder.js +189 -0
  149. package/dist/llm/catalog-seeder.js.map +1 -0
  150. package/dist/llm/cli-ops.d.ts +16 -0
  151. package/dist/llm/cli-ops.d.ts.map +1 -1
  152. package/dist/llm/cli-ops.js +37 -10
  153. package/dist/llm/cli-ops.js.map +1 -1
  154. package/dist/llm/complexity-classifier.d.ts +208 -0
  155. package/dist/llm/complexity-classifier.d.ts.map +1 -0
  156. package/dist/llm/complexity-classifier.js +359 -0
  157. package/dist/llm/complexity-classifier.js.map +1 -0
  158. package/dist/llm/credential-pool.d.ts +2 -0
  159. package/dist/llm/credential-pool.d.ts.map +1 -1
  160. package/dist/llm/credential-pool.js +5 -2
  161. package/dist/llm/credential-pool.js.map +1 -1
  162. package/dist/llm/credentials-store.d.ts +10 -14
  163. package/dist/llm/credentials-store.d.ts.map +1 -1
  164. package/dist/llm/credentials-store.js.map +1 -1
  165. package/dist/llm/cross-provider-selector.d.ts +249 -0
  166. package/dist/llm/cross-provider-selector.d.ts.map +1 -0
  167. package/dist/llm/cross-provider-selector.js +572 -0
  168. package/dist/llm/cross-provider-selector.js.map +1 -0
  169. package/dist/llm/entity-ops.d.ts +299 -0
  170. package/dist/llm/entity-ops.d.ts.map +1 -0
  171. package/dist/llm/entity-ops.js +441 -0
  172. package/dist/llm/entity-ops.js.map +1 -0
  173. package/dist/llm/index.d.ts +17 -0
  174. package/dist/llm/index.d.ts.map +1 -1
  175. package/dist/llm/index.js +9 -0
  176. package/dist/llm/index.js.map +1 -1
  177. package/dist/llm/llm-queue-admit.d.ts +118 -0
  178. package/dist/llm/llm-queue-admit.d.ts.map +1 -0
  179. package/dist/llm/llm-queue-admit.js +275 -0
  180. package/dist/llm/llm-queue-admit.js.map +1 -0
  181. package/dist/llm/local-model-fit.d.ts +260 -0
  182. package/dist/llm/local-model-fit.d.ts.map +1 -0
  183. package/dist/llm/local-model-fit.js +563 -0
  184. package/dist/llm/local-model-fit.js.map +1 -0
  185. package/dist/llm/oauth/device-code.d.ts.map +1 -1
  186. package/dist/llm/oauth/device-code.js +2 -8
  187. package/dist/llm/oauth/device-code.js.map +1 -1
  188. package/dist/llm/oauth/google-pkce.d.ts.map +1 -1
  189. package/dist/llm/oauth/google-pkce.js +2 -18
  190. package/dist/llm/oauth/google-pkce.js.map +1 -1
  191. package/dist/llm/oauth/pkce.d.ts +70 -0
  192. package/dist/llm/oauth/pkce.d.ts.map +1 -1
  193. package/dist/llm/oauth/pkce.js +106 -29
  194. package/dist/llm/oauth/pkce.js.map +1 -1
  195. package/dist/llm/onboarding/front-door.d.ts +146 -0
  196. package/dist/llm/onboarding/front-door.d.ts.map +1 -0
  197. package/dist/llm/onboarding/front-door.js +153 -0
  198. package/dist/llm/onboarding/front-door.js.map +1 -0
  199. package/dist/llm/onboarding/login-engine.d.ts +175 -0
  200. package/dist/llm/onboarding/login-engine.d.ts.map +1 -0
  201. package/dist/llm/onboarding/login-engine.js +286 -0
  202. package/dist/llm/onboarding/login-engine.js.map +1 -0
  203. package/dist/llm/pi/pi-gondolin-env.d.ts +23 -0
  204. package/dist/llm/pi/pi-gondolin-env.d.ts.map +1 -1
  205. package/dist/llm/pi/pi-gondolin-env.js +2 -2
  206. package/dist/llm/pi/pi-gondolin-env.js.map +1 -1
  207. package/dist/llm/plugin-facade.js +4612 -1042
  208. package/dist/llm/plugin-facade.js.map +3 -3
  209. package/dist/llm/provider-registry/builtin/anthropic.d.ts.map +1 -1
  210. package/dist/llm/provider-registry/builtin/anthropic.js +23 -10
  211. package/dist/llm/provider-registry/builtin/anthropic.js.map +1 -1
  212. package/dist/llm/provider-registry/builtin/ollama.d.ts +18 -0
  213. package/dist/llm/provider-registry/builtin/ollama.d.ts.map +1 -1
  214. package/dist/llm/provider-registry/builtin/ollama.js +20 -2
  215. package/dist/llm/provider-registry/builtin/ollama.js.map +1 -1
  216. package/dist/llm/provider-registry/provider-alias.d.ts +62 -0
  217. package/dist/llm/provider-registry/provider-alias.d.ts.map +1 -0
  218. package/dist/llm/provider-registry/provider-alias.js +85 -0
  219. package/dist/llm/provider-registry/provider-alias.js.map +1 -0
  220. package/dist/llm/provider-registry/provider-defs.d.ts +45 -0
  221. package/dist/llm/provider-registry/provider-defs.d.ts.map +1 -0
  222. package/dist/llm/provider-registry/provider-defs.js +145 -0
  223. package/dist/llm/provider-registry/provider-defs.js.map +1 -0
  224. package/dist/llm/provider-registry/provider-seed.d.ts +78 -0
  225. package/dist/llm/provider-registry/provider-seed.d.ts.map +1 -0
  226. package/dist/llm/provider-registry/provider-seed.js +113 -0
  227. package/dist/llm/provider-registry/provider-seed.js.map +1 -0
  228. package/dist/llm/role-executor.d.ts.map +1 -1
  229. package/dist/llm/role-executor.js +36 -0
  230. package/dist/llm/role-executor.js.map +1 -1
  231. package/dist/llm/role-resolver.d.ts.map +1 -1
  232. package/dist/llm/role-resolver.js +52 -10
  233. package/dist/llm/role-resolver.js.map +1 -1
  234. package/dist/llm/system-resolver.d.ts.map +1 -1
  235. package/dist/llm/system-resolver.js +73 -22
  236. package/dist/llm/system-resolver.js.map +1 -1
  237. package/dist/llm/transports/codex-responses.d.ts +111 -88
  238. package/dist/llm/transports/codex-responses.d.ts.map +1 -1
  239. package/dist/llm/transports/codex-responses.js +456 -258
  240. package/dist/llm/transports/codex-responses.js.map +1 -1
  241. package/dist/memory/learnings.d.ts +4 -0
  242. package/dist/memory/learnings.d.ts.map +1 -1
  243. package/dist/memory/patterns.d.ts +4 -0
  244. package/dist/memory/patterns.d.ts.map +1 -1
  245. package/dist/metrics/index.d.ts +2 -0
  246. package/dist/metrics/index.d.ts.map +1 -1
  247. package/dist/metrics/index.js +1 -0
  248. package/dist/metrics/index.js.map +1 -1
  249. package/dist/orchestration/spawn.d.ts +89 -0
  250. package/dist/orchestration/spawn.d.ts.map +1 -1
  251. package/dist/orchestration/spawn.js +68 -0
  252. package/dist/orchestration/spawn.js.map +1 -1
  253. package/dist/playbooks/cantbook-profile.d.ts +96 -0
  254. package/dist/playbooks/cantbook-profile.d.ts.map +1 -0
  255. package/dist/playbooks/cantbook-profile.js +97 -0
  256. package/dist/playbooks/cantbook-profile.js.map +1 -0
  257. package/dist/playbooks/guarded-deterministic-runner.d.ts +153 -0
  258. package/dist/playbooks/guarded-deterministic-runner.d.ts.map +1 -0
  259. package/dist/playbooks/guarded-deterministic-runner.js +155 -0
  260. package/dist/playbooks/guarded-deterministic-runner.js.map +1 -0
  261. package/dist/playbooks/index.d.ts +2 -0
  262. package/dist/playbooks/index.d.ts.map +1 -1
  263. package/dist/playbooks/index.js +10 -0
  264. package/dist/playbooks/index.js.map +1 -1
  265. package/dist/playbooks/pi-runner-wiring.d.ts +75 -0
  266. package/dist/playbooks/pi-runner-wiring.d.ts.map +1 -0
  267. package/dist/playbooks/pi-runner-wiring.js +82 -0
  268. package/dist/playbooks/pi-runner-wiring.js.map +1 -0
  269. package/dist/release/index.d.ts +2 -2
  270. package/dist/release/index.d.ts.map +1 -1
  271. package/dist/release/index.js +1 -1
  272. package/dist/release/index.js.map +1 -1
  273. package/dist/release/reconcile.d.ts +97 -0
  274. package/dist/release/reconcile.d.ts.map +1 -1
  275. package/dist/release/reconcile.js +412 -5
  276. package/dist/release/reconcile.js.map +1 -1
  277. package/dist/resources/backend.d.ts +155 -0
  278. package/dist/resources/backend.d.ts.map +1 -0
  279. package/dist/resources/backend.js +23 -0
  280. package/dist/resources/backend.js.map +1 -0
  281. package/dist/resources/linux-backend.d.ts +167 -0
  282. package/dist/resources/linux-backend.d.ts.map +1 -0
  283. package/dist/resources/linux-backend.js +259 -0
  284. package/dist/resources/linux-backend.js.map +1 -0
  285. package/dist/resources/monitor.d.ts +230 -0
  286. package/dist/resources/monitor.d.ts.map +1 -0
  287. package/dist/resources/monitor.js +255 -0
  288. package/dist/resources/monitor.js.map +1 -0
  289. package/dist/resources/spawn-wrapper.d.ts +265 -0
  290. package/dist/resources/spawn-wrapper.d.ts.map +1 -0
  291. package/dist/resources/spawn-wrapper.js +304 -0
  292. package/dist/resources/spawn-wrapper.js.map +1 -0
  293. package/dist/runtime/openapi/generate-openapi.d.ts +211 -0
  294. package/dist/runtime/openapi/generate-openapi.d.ts.map +1 -0
  295. package/dist/runtime/openapi/generate-openapi.js +300 -0
  296. package/dist/runtime/openapi/generate-openapi.js.map +1 -0
  297. package/dist/runtime/openapi/index.d.ts +16 -0
  298. package/dist/runtime/openapi/index.d.ts.map +1 -0
  299. package/dist/runtime/openapi/index.js +16 -0
  300. package/dist/runtime/openapi/index.js.map +1 -0
  301. package/dist/selfimprove/budget.d.ts +11 -2
  302. package/dist/selfimprove/budget.d.ts.map +1 -1
  303. package/dist/selfimprove/budget.js +11 -2
  304. package/dist/selfimprove/budget.js.map +1 -1
  305. package/dist/selfimprove/fix-gen.d.ts +229 -0
  306. package/dist/selfimprove/fix-gen.d.ts.map +1 -0
  307. package/dist/selfimprove/fix-gen.js +266 -0
  308. package/dist/selfimprove/fix-gen.js.map +1 -0
  309. package/dist/selfimprove/run-loop.d.ts +44 -4
  310. package/dist/selfimprove/run-loop.d.ts.map +1 -1
  311. package/dist/selfimprove/run-loop.js +73 -6
  312. package/dist/selfimprove/run-loop.js.map +1 -1
  313. package/dist/selfimprove/scenarios/dhq-replay-find/golden.json +32 -0
  314. package/dist/selfimprove/scenarios/dhq-replay-find/scenario.json +18 -0
  315. package/dist/sentient/cross-project-hygiene.d.ts +11 -2
  316. package/dist/sentient/cross-project-hygiene.d.ts.map +1 -1
  317. package/dist/sentient/cross-project-hygiene.js +73 -10
  318. package/dist/sentient/cross-project-hygiene.js.map +1 -1
  319. package/dist/sentient/daemon.d.ts.map +1 -1
  320. package/dist/sentient/daemon.js +7 -2
  321. package/dist/sentient/daemon.js.map +1 -1
  322. package/dist/sentient/worktree-dispatch.d.ts.map +1 -1
  323. package/dist/sentient/worktree-dispatch.js +8 -1
  324. package/dist/sentient/worktree-dispatch.js.map +1 -1
  325. package/dist/setup/config-json-merge.d.ts.map +1 -1
  326. package/dist/setup/config-json-merge.js +14 -0
  327. package/dist/setup/config-json-merge.js.map +1 -1
  328. package/dist/setup/index.d.ts +23 -11
  329. package/dist/setup/index.d.ts.map +1 -1
  330. package/dist/setup/index.js +25 -12
  331. package/dist/setup/index.js.map +1 -1
  332. package/dist/setup/sections/llm.d.ts +28 -1
  333. package/dist/setup/sections/llm.d.ts.map +1 -1
  334. package/dist/setup/sections/llm.js +27 -6
  335. package/dist/setup/sections/llm.js.map +1 -1
  336. package/dist/setup/sections/models-roles.d.ts +40 -0
  337. package/dist/setup/sections/models-roles.d.ts.map +1 -0
  338. package/dist/setup/sections/models-roles.js +219 -0
  339. package/dist/setup/sections/models-roles.js.map +1 -0
  340. package/dist/setup/wizard.d.ts +19 -1
  341. package/dist/setup/wizard.d.ts.map +1 -1
  342. package/dist/setup/wizard.js.map +1 -1
  343. package/dist/spawn/branch-lock.d.ts.map +1 -1
  344. package/dist/spawn/branch-lock.js +7 -1
  345. package/dist/spawn/branch-lock.js.map +1 -1
  346. package/dist/store/attachment-repair.d.ts +110 -0
  347. package/dist/store/attachment-repair.d.ts.map +1 -0
  348. package/dist/store/attachment-repair.js +326 -0
  349. package/dist/store/attachment-repair.js.map +1 -0
  350. package/dist/store/attachment-store.d.ts.map +1 -1
  351. package/dist/store/attachment-store.js +24 -7
  352. package/dist/store/attachment-store.js.map +1 -1
  353. package/dist/store/schedule-schema.d.ts +195 -0
  354. package/dist/store/schedule-schema.d.ts.map +1 -0
  355. package/dist/store/schedule-schema.js +84 -0
  356. package/dist/store/schedule-schema.js.map +1 -0
  357. package/dist/store/schedule-store.d.ts +144 -0
  358. package/dist/store/schedule-store.d.ts.map +1 -0
  359. package/dist/store/schedule-store.js +162 -0
  360. package/dist/store/schedule-store.js.map +1 -0
  361. package/dist/store/schema/attachments.d.ts +1 -1
  362. package/dist/store/schema/cleo-global/index.d.ts +3 -0
  363. package/dist/store/schema/cleo-global/index.d.ts.map +1 -1
  364. package/dist/store/schema/cleo-global/index.js +5 -0
  365. package/dist/store/schema/cleo-global/index.js.map +1 -1
  366. package/dist/store/schema/cleo-global/models-catalog.d.ts +359 -0
  367. package/dist/store/schema/cleo-global/models-catalog.d.ts.map +1 -0
  368. package/dist/store/schema/cleo-global/models-catalog.js +114 -0
  369. package/dist/store/schema/cleo-global/models-catalog.js.map +1 -0
  370. package/dist/store/schema/cleo-global/providers.d.ts +279 -0
  371. package/dist/store/schema/cleo-global/providers.d.ts.map +1 -0
  372. package/dist/store/schema/cleo-global/providers.js +94 -0
  373. package/dist/store/schema/cleo-global/providers.js.map +1 -0
  374. package/dist/store/schema/cleo-global/services.d.ts +493 -0
  375. package/dist/store/schema/cleo-global/services.d.ts.map +1 -0
  376. package/dist/store/schema/cleo-global/services.js +200 -0
  377. package/dist/store/schema/cleo-global/services.js.map +1 -0
  378. package/dist/store/schema/cleo-project/docs.d.ts +1 -1
  379. package/dist/store/schema/cleo-project/provenance-rest.d.ts +1 -1
  380. package/dist/store/schema/cleo-shared/brain.d.ts +2 -2
  381. package/dist/store/schema/memory-schema.d.ts +182 -2
  382. package/dist/store/schema/memory-schema.d.ts.map +1 -1
  383. package/dist/store/schema/memory-schema.js +111 -2
  384. package/dist/store/schema/memory-schema.js.map +1 -1
  385. package/dist/store/schema/provenance/releases.d.ts +1 -1
  386. package/dist/store/service-connections-accessor.d.ts +313 -0
  387. package/dist/store/service-connections-accessor.d.ts.map +1 -0
  388. package/dist/store/service-connections-accessor.js +464 -0
  389. package/dist/store/service-connections-accessor.js.map +1 -0
  390. package/dist/store/service-host-matcher.d.ts +70 -0
  391. package/dist/store/service-host-matcher.d.ts.map +1 -0
  392. package/dist/store/service-host-matcher.js +127 -0
  393. package/dist/store/service-host-matcher.js.map +1 -0
  394. package/dist/store/service-injection.d.ts +152 -0
  395. package/dist/store/service-injection.d.ts.map +1 -0
  396. package/dist/store/service-injection.js +225 -0
  397. package/dist/store/service-injection.js.map +1 -0
  398. package/dist/store/service-oauth.d.ts +287 -0
  399. package/dist/store/service-oauth.d.ts.map +1 -0
  400. package/dist/store/service-oauth.js +524 -0
  401. package/dist/store/service-oauth.js.map +1 -0
  402. package/dist/store/service-trust-gate.d.ts +164 -0
  403. package/dist/store/service-trust-gate.d.ts.map +1 -0
  404. package/dist/store/service-trust-gate.js +122 -0
  405. package/dist/store/service-trust-gate.js.map +1 -0
  406. package/dist/store/validation-schemas.d.ts +4 -4
  407. package/dist/tasks/agent-lifecycle-lane.d.ts +175 -0
  408. package/dist/tasks/agent-lifecycle-lane.d.ts.map +1 -0
  409. package/dist/tasks/agent-lifecycle-lane.js +176 -0
  410. package/dist/tasks/agent-lifecycle-lane.js.map +1 -0
  411. package/dist/tasks/complete.d.ts +17 -0
  412. package/dist/tasks/complete.d.ts.map +1 -1
  413. package/dist/tasks/complete.js +53 -10
  414. package/dist/tasks/complete.js.map +1 -1
  415. package/dist/tasks/depends-waiver-audit.d.ts +52 -0
  416. package/dist/tasks/depends-waiver-audit.d.ts.map +1 -0
  417. package/dist/tasks/depends-waiver-audit.js +36 -0
  418. package/dist/tasks/depends-waiver-audit.js.map +1 -0
  419. package/dist/tasks/engine-wrap.d.ts +36 -2
  420. package/dist/tasks/engine-wrap.d.ts.map +1 -1
  421. package/dist/tasks/engine-wrap.js +44 -2
  422. package/dist/tasks/engine-wrap.js.map +1 -1
  423. package/dist/tasks/evidence.d.ts +34 -2
  424. package/dist/tasks/evidence.d.ts.map +1 -1
  425. package/dist/tasks/evidence.js +293 -35
  426. package/dist/tasks/evidence.js.map +1 -1
  427. package/dist/tasks/index.d.ts +1 -0
  428. package/dist/tasks/index.d.ts.map +1 -1
  429. package/dist/tasks/index.js +1 -0
  430. package/dist/tasks/index.js.map +1 -1
  431. package/dist/tasks/ops.d.ts +3 -0
  432. package/dist/tasks/ops.d.ts.map +1 -1
  433. package/dist/tasks/task-ops.d.ts +1 -1
  434. package/dist/tasks/task-ops.d.ts.map +1 -1
  435. package/dist/tasks/task-ops.js +3 -1
  436. package/dist/tasks/task-ops.js.map +1 -1
  437. package/dist/tasks/task-reparent.d.ts +90 -0
  438. package/dist/tasks/task-reparent.d.ts.map +1 -1
  439. package/dist/tasks/task-reparent.js +171 -0
  440. package/dist/tasks/task-reparent.js.map +1 -1
  441. package/dist/tools/builtin-agent-tools.d.ts.map +1 -1
  442. package/dist/tools/builtin-agent-tools.js +41 -0
  443. package/dist/tools/builtin-agent-tools.js.map +1 -1
  444. package/dist/tools/exec-code-agent-tool.d.ts +179 -0
  445. package/dist/tools/exec-code-agent-tool.d.ts.map +1 -0
  446. package/dist/tools/exec-code-agent-tool.js +239 -0
  447. package/dist/tools/exec-code-agent-tool.js.map +1 -0
  448. package/dist/tools/index.d.ts +6 -0
  449. package/dist/tools/index.d.ts.map +1 -1
  450. package/dist/tools/index.js +15 -0
  451. package/dist/tools/index.js.map +1 -1
  452. package/dist/tools/mcp-agent-tool.d.ts +189 -0
  453. package/dist/tools/mcp-agent-tool.d.ts.map +1 -0
  454. package/dist/tools/mcp-agent-tool.js +243 -0
  455. package/dist/tools/mcp-agent-tool.js.map +1 -0
  456. package/dist/tools/media-agent-tools.d.ts +105 -0
  457. package/dist/tools/media-agent-tools.d.ts.map +1 -0
  458. package/dist/tools/media-agent-tools.js +255 -0
  459. package/dist/tools/media-agent-tools.js.map +1 -0
  460. package/dist/tools/memory-agent-tools.d.ts +99 -0
  461. package/dist/tools/memory-agent-tools.d.ts.map +1 -0
  462. package/dist/tools/memory-agent-tools.js +190 -0
  463. package/dist/tools/memory-agent-tools.js.map +1 -0
  464. package/dist/tools/schedule-agent-tools.d.ts +151 -0
  465. package/dist/tools/schedule-agent-tools.d.ts.map +1 -0
  466. package/dist/tools/schedule-agent-tools.js +238 -0
  467. package/dist/tools/schedule-agent-tools.js.map +1 -0
  468. package/dist/tools/skill-agent-tool.d.ts +108 -0
  469. package/dist/tools/skill-agent-tool.d.ts.map +1 -0
  470. package/dist/tools/skill-agent-tool.js +135 -0
  471. package/dist/tools/skill-agent-tool.js.map +1 -0
  472. package/dist/validation/engine-ops.d.ts.map +1 -1
  473. package/dist/validation/engine-ops.js +17 -1
  474. package/dist/validation/engine-ops.js.map +1 -1
  475. package/dist/verification/verify-tools.d.ts.map +1 -1
  476. package/dist/verification/verify-tools.js +5 -6
  477. package/dist/verification/verify-tools.js.map +1 -1
  478. package/migrations/drizzle-brain/20260610000001_t10405-bitemporal-network-columns/migration.sql +71 -0
  479. package/migrations/drizzle-cleo-global/20260609000000_t11937-service-vault/migration.sql +93 -0
  480. package/migrations/drizzle-cleo-global/20260609010000_t11733-models-catalog/migration.sql +65 -0
  481. package/migrations/drizzle-cleo-global/20260609020000_t11703-providers/migration.sql +52 -0
  482. package/migrations/drizzle-cleo-global/20260610000000_t11962-schedules/migration.sql +48 -0
  483. package/migrations/drizzle-cleo-project/20260610000000_t11962-schedules/migration.sql +48 -0
  484. package/package.json +33 -13
  485. package/templates/workflows/release-prepare.yml.tmpl +48 -2
@@ -32,7 +32,68 @@
32
32
  * @adr ADR-T9345
33
33
  * @spec .cleo/rcasd/T9345/research/SPEC-T9345-release-pipeline-v2.md §4.4, §8
34
34
  */
35
+ import { type ReleasePlan } from '@cleocode/contracts';
35
36
  import { type EngineResult } from '../engine-result.js';
37
+ /**
38
+ * Result produced by {@link synthesizePlanForReconcile} when plan synthesis
39
+ * fires on the tag-driven path (no `.cleo/release/<version>.plan.json` exists
40
+ * but the git tag is present).
41
+ *
42
+ * The plan is always in-memory — it is written to disk only after
43
+ * {@link releaseReconcileV2} successfully commits the provenance transaction
44
+ * (or skipped entirely when `opts.dryRun = true`).
45
+ */
46
+ export interface SynthesizedPlanReport {
47
+ /** The synthesised `ReleasePlan` object, ready for reconcile. */
48
+ plan: ReleasePlan;
49
+ /** Previous tag inferred from `git tag --sort=creatordate`. `null` on first-ever release. */
50
+ prevTag: string | null;
51
+ /**
52
+ * T#### tokens derived from the CHANGELOG.md section for this version.
53
+ * Empty when no CHANGELOG section was found.
54
+ */
55
+ changelogTaskIds: string[];
56
+ /**
57
+ * T#### tokens derived from merged-PR titles/branches between prevTag..tag.
58
+ * Empty when gh is unavailable.
59
+ */
60
+ prTaskIds: string[];
61
+ /**
62
+ * T#### tokens derived from git log subjects between prevTag..tag.
63
+ * Populated even without gh access.
64
+ */
65
+ commitTaskIds: string[];
66
+ /**
67
+ * PR numbers discovered via merge-commit subjects (`Merge pull request #NNN`)
68
+ * in the prevTag..tag range.
69
+ */
70
+ discoveredPrNumbers: number[];
71
+ /** True when a CHANGELOG.md section for this version was found. */
72
+ changelogSectionFound: boolean;
73
+ }
74
+ /**
75
+ * Synthesise a minimal {@link ReleasePlan} for a tag-driven release that has
76
+ * no `.cleo/release/<version>.plan.json` on disk (DHQ-080 · T11977).
77
+ *
78
+ * Derivation order (highest-fidelity source wins):
79
+ * (a) CHANGELOG.md section for `version` — task-ID tokens + summaries.
80
+ * (b) Merged PRs between prevTag..tag (`git log --merges`) — T#### from titles.
81
+ * (c) All commits between prevTag..tag — T#### from subjects/bodies.
82
+ *
83
+ * The synthesised plan carries `meta.origin = 'tag-reconcile-synthesized'`
84
+ * so honest plans (from `cleo release plan`) remain distinguishable. Fields
85
+ * that cannot be derived without a prior `cleo release plan` run (evidenceAtoms,
86
+ * gates, prUrl, mergeCommitSha, workflowRunUrl) are left empty/null.
87
+ *
88
+ * Does NOT write to disk — the caller decides whether to persist or dry-run.
89
+ *
90
+ * @param version — Version tag to synthesise a plan for (e.g. `v2026.6.14`).
91
+ * @param projectRoot — Absolute project root.
92
+ * @returns `SynthesizedPlanReport` with the in-memory plan + derivation metadata.
93
+ *
94
+ * @task T11977
95
+ */
96
+ export declare function synthesizePlanForReconcile(version: string, projectRoot: string): Promise<SynthesizedPlanReport>;
36
97
  /**
37
98
  * Options for {@link releaseReconcileV2}.
38
99
  *
@@ -66,6 +127,16 @@ export interface ReleaseReconcileV2Options {
66
127
  * informational; the backfill verb audit-logs overwrites separately.
67
128
  */
68
129
  forceOverwrite?: boolean;
130
+ /**
131
+ * When true (T11977 · DHQ-080), print the synthesised plan derivation
132
+ * without writing to the DB or disk. Only meaningful on the tag-driven
133
+ * path (no plan file exists); has no effect when a plan file is present.
134
+ *
135
+ * The result envelope carries `dryRun: true` and `synthesizedPlan` with
136
+ * the plan that WOULD be written, plus the derivation metadata. No DB
137
+ * rows are inserted.
138
+ */
139
+ dryRun?: boolean;
69
140
  }
70
141
  /** Successful reconcile result envelope (SPEC §4.4.5 `data` payload). */
71
142
  export interface ReleaseReconcileV2Result {
@@ -103,6 +174,32 @@ export interface ReleaseReconcileV2Result {
103
174
  durationMs?: number;
104
175
  /** Total inserts performed (filled into envelope `meta.txSize`). */
105
176
  txSize?: number;
177
+ /**
178
+ * Present when reconcile synthesised the plan at runtime (DHQ-080 · T11977):
179
+ * no `.cleo/release/<version>.plan.json` existed but the git tag was found.
180
+ * The provenance flag `meta.origin = 'tag-reconcile-synthesized'` is written
181
+ * into the plan rows so honest plans (from `cleo release plan`) are
182
+ * distinguishable in the `releases` table.
183
+ */
184
+ synthesized?: {
185
+ /** Number of task IDs derived from CHANGELOG.md section. */
186
+ changelogTaskCount: number;
187
+ /** Number of task IDs derived from git log commit subjects. */
188
+ commitTaskCount: number;
189
+ /** PR numbers discovered from merge-commit subjects. */
190
+ discoveredPrNumbers: number[];
191
+ /** Previous tag inferred from `git tag --sort=creatordate`. Null on first release. */
192
+ prevTag: string | null;
193
+ /** True when a CHANGELOG.md section for this version was found. */
194
+ changelogSectionFound: boolean;
195
+ };
196
+ /**
197
+ * Present when `opts.dryRun = true` and synthesis fires (T11977 · DHQ-080).
198
+ * The result reflects what WOULD be written without any DB mutation.
199
+ * `commitCount`, `taskCount`, `changeCount`, `artifactCount`, `brainLinkCount`
200
+ * reflect plan-level derivation only (no git log walk was performed).
201
+ */
202
+ dryRun?: boolean;
106
203
  }
107
204
  /**
108
205
  * Sanitised PR shape ready for insertion: any FK columns pointing at a
@@ -1 +1 @@
1
- {"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../../src/release/reconcile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAUH,OAAO,EAAE,KAAK,YAAY,EAA8B,MAAM,qBAAqB,CAAC;AAoBpF;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,yBAAyB;IACxC,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,yEAAyE;AACzE,MAAM,WAAW,wBAAwB;IACvC,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,aAAa,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,cAAc,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,sFAAsF;IACtF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iFAAiF;IACjF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAusBD;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,EACzF,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,GAChC,WAAW,CAOb;AAWD;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,yBAA8B,GACnC,OAAO,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAC,CA2pBjD"}
1
+ {"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../../src/release/reconcile.ts"],"names":[],"mappings":"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"}
@@ -39,13 +39,351 @@ import { mkdir } from 'node:fs/promises';
39
39
  import { join, resolve } from 'node:path';
40
40
  import { promisify } from 'node:util';
41
41
  import { safeParseReleasePlan } from '@cleocode/contracts';
42
- import { eq } from 'drizzle-orm';
42
+ import { eq, inArray } from 'drizzle-orm';
43
43
  import { engineError, engineSuccess } from '../engine-result.js';
44
44
  import { getLogger } from '../logger.js';
45
45
  import { generateProjectHash } from '../nexus/hash.js';
46
46
  import { getProjectRoot } from '../paths.js';
47
47
  import { getDb, getNativeDb } from '../store/sqlite.js';
48
48
  import * as schema from '../store/tasks-schema.js';
49
+ // ─── Tag-reconcile plan synthesis (T11977 · DHQ-080) ─────────────────────────
50
+ /** Provenance origin label written into plan.meta when synthesis fires. */
51
+ const TAG_RECONCILE_ORIGIN = 'tag-reconcile-synthesized';
52
+ /** T#### regex re-used across synthesis helpers. */
53
+ const SYNTH_TASK_TOKEN_RE = /\bT\d{1,5}\b/g;
54
+ /** Conventional-commit prefix detector (mirrors backfill.ts equivalent). */
55
+ const SYNTH_CC_RE = /^(feat|fix|chore|docs|refactor|test|perf|build|ci|revert|breaking|style)(?:\(([^)]+)\))?!?:\s/i;
56
+ /**
57
+ * Infer the previous git tag by listing all tags sorted by creator-date
58
+ * (annotated + lightweight, oldest-first) and returning the entry
59
+ * immediately before `version`. Returns `null` when `version` is the
60
+ * oldest tag or no tags exist.
61
+ */
62
+ function inferPrevTag(version, projectRoot) {
63
+ try {
64
+ const raw = execFileSync('git', ['tag', '--list', '--sort=creatordate'], {
65
+ cwd: projectRoot,
66
+ encoding: 'utf-8',
67
+ stdio: ['ignore', 'pipe', 'pipe'],
68
+ timeout: SUBPROCESS_TIMEOUT_MS,
69
+ }).trim();
70
+ const tags = raw
71
+ .split('\n')
72
+ .map((t) => t.trim())
73
+ .filter((t) => t.length > 0);
74
+ const idx = tags.indexOf(version);
75
+ if (idx <= 0)
76
+ return null;
77
+ return tags[idx - 1] ?? null;
78
+ }
79
+ catch {
80
+ return null;
81
+ }
82
+ }
83
+ /**
84
+ * Parse the CHANGELOG.md section for `version` and extract:
85
+ * - Every T#### token mentioned in the section body.
86
+ * - The section text (for task summary extraction).
87
+ *
88
+ * Canonical header format (ADR-028 §2.5): `## [VERSION]` (no `v` prefix).
89
+ * We strip the leading `v` before matching so both forms are accepted.
90
+ *
91
+ * Returns `{ found: false }` when CHANGELOG.md is missing or has no matching
92
+ * section — synthesis continues without CHANGELOG data (non-fatal).
93
+ */
94
+ function parseChangelogSection(version, projectRoot) {
95
+ const changelogPath = join(projectRoot, 'CHANGELOG.md');
96
+ if (!existsSync(changelogPath))
97
+ return { found: false };
98
+ let contents;
99
+ try {
100
+ contents = readFileSync(changelogPath, 'utf-8');
101
+ }
102
+ catch {
103
+ return { found: false };
104
+ }
105
+ // Normalise version to no-v form (ADR-028 §2.5).
106
+ const normalized = version.startsWith('v') ? version.slice(1) : version;
107
+ const headerPattern = `## [${normalized}]`;
108
+ const startIdx = contents.indexOf(headerPattern);
109
+ if (startIdx < 0)
110
+ return { found: false };
111
+ // Slice from the header line to the next `## [` section header (exclusive).
112
+ const bodyStart = startIdx + headerPattern.length;
113
+ const nextSectionIdx = contents.indexOf('\n## [', bodyStart);
114
+ const sectionText = nextSectionIdx >= 0 ? contents.slice(bodyStart, nextSectionIdx) : contents.slice(bodyStart);
115
+ // Extract all T#### tokens from the section body.
116
+ SYNTH_TASK_TOKEN_RE.lastIndex = 0;
117
+ const tokens = new Set();
118
+ let m = SYNTH_TASK_TOKEN_RE.exec(sectionText);
119
+ while (m !== null) {
120
+ tokens.add(m[0]);
121
+ m = SYNTH_TASK_TOKEN_RE.exec(sectionText);
122
+ }
123
+ return { found: true, taskIds: Array.from(tokens), sectionText };
124
+ }
125
+ /**
126
+ * Extract unique T#### tokens from the `prevTag..tag` git log (subjects +
127
+ * bodies), plus PR numbers from merge-commit subjects.
128
+ *
129
+ * Returns empty arrays on git failure (non-fatal — synthesis continues).
130
+ */
131
+ function extractTokensFromGitLog(prevTag, tag, projectRoot) {
132
+ try {
133
+ const range = prevTag ? `${prevTag}..${tag}` : tag;
134
+ const logOut = execFileSync('git', ['log', '--pretty=format:%s%n%b%n---COMMIT---', range], {
135
+ cwd: projectRoot,
136
+ encoding: 'utf-8',
137
+ stdio: ['ignore', 'pipe', 'pipe'],
138
+ timeout: SUBPROCESS_TIMEOUT_MS,
139
+ maxBuffer: 64 * 1024 * 1024,
140
+ }).trim();
141
+ SYNTH_TASK_TOKEN_RE.lastIndex = 0;
142
+ const taskIds = new Set();
143
+ let m = SYNTH_TASK_TOKEN_RE.exec(logOut);
144
+ while (m !== null) {
145
+ taskIds.add(m[0]);
146
+ m = SYNTH_TASK_TOKEN_RE.exec(logOut);
147
+ }
148
+ // Extract PR numbers from merge-commit subjects: "Merge pull request #NNN"
149
+ const prNumbers = new Set();
150
+ const PR_RE = /Merge pull request #(\d+)/g;
151
+ let pm = PR_RE.exec(logOut);
152
+ while (pm !== null) {
153
+ const n = Number.parseInt(pm[1], 10);
154
+ if (Number.isFinite(n) && n > 0)
155
+ prNumbers.add(n);
156
+ pm = PR_RE.exec(logOut);
157
+ }
158
+ return { taskIds: Array.from(taskIds), prNumbers: Array.from(prNumbers) };
159
+ }
160
+ catch {
161
+ return { taskIds: [], prNumbers: [] };
162
+ }
163
+ }
164
+ /**
165
+ * Parse the CC type from a commit subject and map to a task kind.
166
+ * Mirrors the equivalent in `backfill.ts`.
167
+ *
168
+ * @internal
169
+ */
170
+ function synthCcToTaskKind(subject) {
171
+ const m = subject.match(SYNTH_CC_RE);
172
+ const raw = m?.[1]?.toLowerCase() ?? '';
173
+ switch (raw) {
174
+ case 'feat':
175
+ return 'feat';
176
+ case 'fix':
177
+ return 'fix';
178
+ case 'docs':
179
+ return 'docs';
180
+ case 'refactor':
181
+ return 'refactor';
182
+ case 'test':
183
+ return 'test';
184
+ case 'perf':
185
+ return 'perf';
186
+ case 'revert':
187
+ return 'revert';
188
+ case 'breaking':
189
+ return 'breaking';
190
+ default:
191
+ return 'chore';
192
+ }
193
+ }
194
+ /**
195
+ * Synthesise a minimal {@link ReleasePlan} for a tag-driven release that has
196
+ * no `.cleo/release/<version>.plan.json` on disk (DHQ-080 · T11977).
197
+ *
198
+ * Derivation order (highest-fidelity source wins):
199
+ * (a) CHANGELOG.md section for `version` — task-ID tokens + summaries.
200
+ * (b) Merged PRs between prevTag..tag (`git log --merges`) — T#### from titles.
201
+ * (c) All commits between prevTag..tag — T#### from subjects/bodies.
202
+ *
203
+ * The synthesised plan carries `meta.origin = 'tag-reconcile-synthesized'`
204
+ * so honest plans (from `cleo release plan`) remain distinguishable. Fields
205
+ * that cannot be derived without a prior `cleo release plan` run (evidenceAtoms,
206
+ * gates, prUrl, mergeCommitSha, workflowRunUrl) are left empty/null.
207
+ *
208
+ * Does NOT write to disk — the caller decides whether to persist or dry-run.
209
+ *
210
+ * @param version — Version tag to synthesise a plan for (e.g. `v2026.6.14`).
211
+ * @param projectRoot — Absolute project root.
212
+ * @returns `SynthesizedPlanReport` with the in-memory plan + derivation metadata.
213
+ *
214
+ * @task T11977
215
+ */
216
+ export async function synthesizePlanForReconcile(version, projectRoot) {
217
+ const prevTag = inferPrevTag(version, projectRoot);
218
+ // (a) CHANGELOG.md section
219
+ const changelogResult = parseChangelogSection(version, projectRoot);
220
+ const changelogTaskIds = changelogResult.found ? changelogResult.taskIds : [];
221
+ // (b+c) Git log tokens + PR numbers
222
+ const { taskIds: commitTaskIds, prNumbers: discoveredPrNumbers } = extractTokensFromGitLog(prevTag, version, projectRoot);
223
+ // Union the sources; changelog wins position (highest fidelity).
224
+ const allTokens = new Set([...changelogTaskIds, ...commitTaskIds]);
225
+ // Intersect with valid task IDs in the runtime store (do not fabricate rows).
226
+ // Use inArray to avoid a full table scan (DHQ-065 anti-pattern guard).
227
+ const db = await getDb(projectRoot);
228
+ const validIds = new Set();
229
+ if (allTokens.size > 0) {
230
+ const tokenList = Array.from(allTokens);
231
+ const rows = await db
232
+ .select({ id: schema.tasks.id })
233
+ .from(schema.tasks)
234
+ .where(inArray(schema.tasks.id, tokenList))
235
+ .all();
236
+ for (const r of rows) {
237
+ if (typeof r.id === 'string') {
238
+ validIds.add(r.id);
239
+ }
240
+ }
241
+ }
242
+ // Derive task kind heuristic from the CHANGELOG section or first git log subject.
243
+ let seedKind = 'chore';
244
+ if (changelogResult.found) {
245
+ // Scan changelog section for a first `###` heading to derive kind.
246
+ const firstHeading = changelogResult.sectionText.split('\n').find((l) => l.startsWith('### '));
247
+ if (firstHeading?.toLowerCase().includes('added'))
248
+ seedKind = 'feat';
249
+ else if (firstHeading?.toLowerCase().includes('fix'))
250
+ seedKind = 'fix';
251
+ }
252
+ else {
253
+ // Fall back to first commit subject CC type.
254
+ try {
255
+ const range = prevTag ? `${prevTag}..${version}` : version;
256
+ const firstSubject = execFileSync('git', ['log', '--pretty=format:%s', '--reverse', range], {
257
+ cwd: projectRoot,
258
+ encoding: 'utf-8',
259
+ stdio: ['ignore', 'pipe', 'pipe'],
260
+ timeout: SUBPROCESS_TIMEOUT_MS,
261
+ })
262
+ .trim()
263
+ .split('\n')[0];
264
+ if (firstSubject)
265
+ seedKind = synthCcToTaskKind(firstSubject);
266
+ }
267
+ catch {
268
+ // non-fatal
269
+ }
270
+ }
271
+ const epicId = validIds.size > 0
272
+ ? Array.from(validIds)[0]
273
+ : `SYNTH-${version.replace(/[^A-Z0-9]/gi, '')}`;
274
+ // Build per-task entries. Each task gets a summary from the CHANGELOG section
275
+ // when available; otherwise a generic backfill note.
276
+ const taskEntries = validIds.size > 0
277
+ ? Array.from(validIds).map((id) => {
278
+ // Try to extract a summary line for this task from the CHANGELOG section.
279
+ let summary = `${id} — synthesized from ${version}`;
280
+ if (changelogResult.found) {
281
+ // Look for a bullet line containing the task ID.
282
+ const summaryLine = changelogResult.sectionText
283
+ .split('\n')
284
+ .find((l) => l.includes(`(${id}`) || l.includes(`${id}/`) || l.includes(` ${id} `));
285
+ if (summaryLine) {
286
+ // Strip leading `-` or `*` and trailing refs like `_(T#/PR#)_`.
287
+ summary = summaryLine
288
+ .replace(/^\s*[-*]\s*/, '')
289
+ .replace(/\s*_\(.*\)_\s*$/, '')
290
+ .trim();
291
+ }
292
+ }
293
+ return {
294
+ id,
295
+ kind: seedKind,
296
+ impact: 'patch',
297
+ userFacingSummary: summary,
298
+ evidenceAtoms: [`note:synthesized-from-tag-${version}`],
299
+ epicAncestor: epicId,
300
+ };
301
+ })
302
+ : [
303
+ {
304
+ id: `SYNTH-${version.replace(/[^A-Z0-9]/gi, '')}-PLACEHOLDER`,
305
+ kind: 'chore',
306
+ impact: 'patch',
307
+ userFacingSummary: `Tag-driven release ${version} (no task tokens resolved)`,
308
+ evidenceAtoms: [`note:synthesized-from-tag-${version}`],
309
+ epicAncestor: epicId,
310
+ },
311
+ ];
312
+ // Bucket task IDs into changelog sections.
313
+ const changelog = {
314
+ features: [],
315
+ fixes: [],
316
+ chores: [],
317
+ breaking: [],
318
+ };
319
+ for (const t of taskEntries) {
320
+ if (t.kind === 'feat')
321
+ changelog.features.push(t.id);
322
+ else if (t.kind === 'fix' || t.kind === 'hotfix')
323
+ changelog.fixes.push(t.id);
324
+ else if (t.kind === 'breaking' || t.kind === 'revert')
325
+ changelog.breaking.push(t.id);
326
+ else
327
+ changelog.chores.push(t.id);
328
+ }
329
+ const nowIso = new Date().toISOString();
330
+ const plan = {
331
+ $schema: 'https://cleocode.io/schemas/release-plan/v1.json',
332
+ version,
333
+ resolvedVersion: version,
334
+ suffixApplied: false,
335
+ scheme: 'calver',
336
+ channel: 'latest',
337
+ epicId,
338
+ releaseKind: 'regular',
339
+ createdAt: nowIso,
340
+ createdBy: TAG_RECONCILE_ORIGIN,
341
+ previousVersion: prevTag,
342
+ previousTag: prevTag,
343
+ previousShippedAt: null,
344
+ tasks: taskEntries,
345
+ changelog,
346
+ gates: [],
347
+ platformMatrix: [
348
+ {
349
+ platform: 'any',
350
+ publisher: 'npm',
351
+ package: '@cleocode/cleo',
352
+ smoke: false,
353
+ },
354
+ ],
355
+ preflightSummary: {
356
+ esbuildExternalsDrift: false,
357
+ lockfileDrift: false,
358
+ epicCompletenessClean: true,
359
+ doubleListingClean: true,
360
+ preflightWarnings: [TAG_RECONCILE_ORIGIN],
361
+ },
362
+ workflowRunUrl: null,
363
+ prUrl: null,
364
+ mergeCommitSha: null,
365
+ status: 'published',
366
+ meta: {
367
+ firstEverRelease: prevTag === null,
368
+ origin: TAG_RECONCILE_ORIGIN,
369
+ synthesizedAt: nowIso,
370
+ changelogSectionFound: changelogResult.found,
371
+ discoveredPrCount: discoveredPrNumbers.length,
372
+ },
373
+ };
374
+ const prTaskIds = [];
375
+ // PR task IDs are derived at reconcile time from the actual fetched PRs.
376
+ // We surface discoveredPrNumbers in the report so dry-run can show them.
377
+ return {
378
+ plan,
379
+ prevTag,
380
+ changelogTaskIds,
381
+ prTaskIds,
382
+ commitTaskIds: Array.from(allTokens),
383
+ discoveredPrNumbers,
384
+ changelogSectionFound: changelogResult.found,
385
+ };
386
+ }
49
387
  const log = getLogger('release:reconcile-v2');
50
388
  const execFileAsync = promisify(execFile);
51
389
  /** Default subprocess timeout for git/gh calls (60s per task rules). */
@@ -676,10 +1014,65 @@ export async function releaseReconcileV2(version, opts = {}) {
676
1014
  const startedAt = Date.now();
677
1015
  const projectRoot = getProjectRoot(opts.projectRoot);
678
1016
  // ── 1. Pre-conditions (R-080 .. R-083) ──
1017
+ //
1018
+ // T11977 / DHQ-080: tag-driven path (git tag + push → GHA publishes to npm,
1019
+ // no `cleo release plan` ever run) leaves no plan file. When the plan is
1020
+ // absent BUT the git tag exists, synthesise a minimal plan at reconcile time
1021
+ // from the git log + CHANGELOG.md + merged PRs. The synthesised plan carries
1022
+ // `meta.origin = 'tag-reconcile-synthesized'` so honest plans are
1023
+ // distinguishable. Evidence-staleness validation (R-313) is skipped for
1024
+ // synthesised plans (there is no evidence to validate).
1025
+ //
1026
+ // When `opts.dryRun = true`, return the derivation report WITHOUT touching
1027
+ // the DB or disk.
1028
+ /** Populated when synthesis fires on the tag-driven path. */
1029
+ let synthReport = null;
679
1030
  const planRes = loadPlan(version, projectRoot);
680
- if (!planRes.success)
681
- return planRes;
682
- const plan = planRes.data;
1031
+ let plan;
1032
+ if (!planRes.success) {
1033
+ // Only attempt synthesis for E_PLAN_NOT_FOUND — other errors (e.g.
1034
+ // E_PLAN_INVALID) are returned immediately (the file exists but is corrupt).
1035
+ if (planRes.error.code !== 'E_PLAN_NOT_FOUND')
1036
+ return planRes;
1037
+ // Check whether the tag exists before committing to synthesis.
1038
+ const earlyTagRes = assertTagExists(version, projectRoot);
1039
+ if (!earlyTagRes.success) {
1040
+ // Neither a plan file nor a git tag — original E_PLAN_NOT_FOUND is
1041
+ // the most useful error to surface.
1042
+ return planRes;
1043
+ }
1044
+ log.info({ version }, 'E_PLAN_NOT_FOUND on tag-driven path — synthesising minimal plan (DHQ-080 · T11977)');
1045
+ synthReport = await synthesizePlanForReconcile(version, projectRoot);
1046
+ plan = synthReport.plan;
1047
+ // Dry-run: return derivation metadata without any DB writes.
1048
+ if (opts.dryRun) {
1049
+ const durationMs = Date.now() - startedAt;
1050
+ return engineSuccess({
1051
+ version,
1052
+ tag: version,
1053
+ tagSha: earlyTagRes.data,
1054
+ commitCount: 0,
1055
+ taskCount: plan.tasks.length,
1056
+ changeCount: 0,
1057
+ artifactCount: 0,
1058
+ brainLinkCount: 0,
1059
+ orphanCommits: [],
1060
+ dryRun: true,
1061
+ synthesized: {
1062
+ changelogTaskCount: synthReport.changelogTaskIds.length,
1063
+ commitTaskCount: synthReport.commitTaskIds.length,
1064
+ discoveredPrNumbers: synthReport.discoveredPrNumbers,
1065
+ prevTag: synthReport.prevTag,
1066
+ changelogSectionFound: synthReport.changelogSectionFound,
1067
+ },
1068
+ durationMs,
1069
+ txSize: 0,
1070
+ });
1071
+ }
1072
+ }
1073
+ else {
1074
+ plan = planRes.data;
1075
+ }
683
1076
  const tagRes = assertTagExists(version, projectRoot);
684
1077
  if (!tagRes.success)
685
1078
  return tagRes;
@@ -689,8 +1082,9 @@ export async function releaseReconcileV2(version, opts = {}) {
689
1082
  return releaseRes;
690
1083
  // T9528: backfill walks historical tags whose evidence atoms may reference
691
1084
  // long-deleted files or rebased commits — skip the R-313 staleness gate.
1085
+ // T11977: synthesised plans have no evidence atoms to validate — also skip.
692
1086
  // Production publish flows still pass through this check.
693
- if (!opts.backfill) {
1087
+ if (!opts.backfill && synthReport === null) {
694
1088
  const stalenessRes = revalidateEvidenceStaleness(plan, version, projectRoot);
695
1089
  if (!stalenessRes.success)
696
1090
  return stalenessRes;
@@ -1310,6 +1704,19 @@ export async function releaseReconcileV2(version, opts = {}) {
1310
1704
  ...(unknownTokens.size > 0 ? { unknownTokens: Array.from(unknownTokens) } : {}),
1311
1705
  ...(skippedTaskRefs.size > 0 ? { skippedTaskRefs: Array.from(skippedTaskRefs) } : {}),
1312
1706
  ...(reReconciled ? { reReconciled: true } : {}),
1707
+ // T11977 / DHQ-080: include synthesis metadata when the plan was derived at
1708
+ // reconcile time (tag-driven path with no prior `cleo release plan`).
1709
+ ...(synthReport !== null
1710
+ ? {
1711
+ synthesized: {
1712
+ changelogTaskCount: synthReport.changelogTaskIds.length,
1713
+ commitTaskCount: synthReport.commitTaskIds.length,
1714
+ discoveredPrNumbers: synthReport.discoveredPrNumbers,
1715
+ prevTag: synthReport.prevTag,
1716
+ changelogSectionFound: synthReport.changelogSectionFound,
1717
+ },
1718
+ }
1719
+ : {}),
1313
1720
  durationMs,
1314
1721
  txSize,
1315
1722
  };