@cleocode/core 2026.9.20 → 2026.9.22

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 (961) hide show
  1. package/dist/adapters/discovery.d.ts.map +1 -1
  2. package/dist/adapters/discovery.js +3 -10
  3. package/dist/adapters/discovery.js.map +1 -1
  4. package/dist/adrs/link-pipeline.js +2 -2
  5. package/dist/adrs/link-pipeline.js.map +1 -1
  6. package/dist/adrs/parse.js +3 -3
  7. package/dist/adrs/parse.js.map +1 -1
  8. package/dist/agents/invoke-meta-agent.d.ts.map +1 -1
  9. package/dist/agents/invoke-meta-agent.js +8 -4
  10. package/dist/agents/invoke-meta-agent.js.map +1 -1
  11. package/dist/agents/scaffold.d.ts.map +1 -1
  12. package/dist/agents/scaffold.js +0 -1
  13. package/dist/agents/scaffold.js.map +1 -1
  14. package/dist/bootstrap.d.ts +5 -1
  15. package/dist/bootstrap.d.ts.map +1 -1
  16. package/dist/bootstrap.js +45 -21
  17. package/dist/bootstrap.js.map +1 -1
  18. package/dist/cloud/crypto.d.ts +47 -0
  19. package/dist/cloud/crypto.d.ts.map +1 -0
  20. package/dist/cloud/crypto.js +223 -0
  21. package/dist/cloud/crypto.js.map +1 -0
  22. package/dist/cloud/http.d.ts +52 -0
  23. package/dist/cloud/http.d.ts.map +1 -0
  24. package/dist/cloud/http.js +98 -0
  25. package/dist/cloud/http.js.map +1 -0
  26. package/dist/cloud/index.d.ts +19 -0
  27. package/dist/cloud/index.d.ts.map +1 -0
  28. package/dist/cloud/index.js +19 -0
  29. package/dist/cloud/index.js.map +1 -0
  30. package/dist/cloud/journal.d.ts +169 -0
  31. package/dist/cloud/journal.d.ts.map +1 -0
  32. package/dist/cloud/journal.js +428 -0
  33. package/dist/cloud/journal.js.map +1 -0
  34. package/dist/cloud/keys.d.ts +213 -0
  35. package/dist/cloud/keys.d.ts.map +1 -0
  36. package/dist/cloud/keys.js +362 -0
  37. package/dist/cloud/keys.js.map +1 -0
  38. package/dist/cloud/manifest-check.d.ts +36 -0
  39. package/dist/cloud/manifest-check.d.ts.map +1 -0
  40. package/dist/cloud/manifest-check.js +70 -0
  41. package/dist/cloud/manifest-check.js.map +1 -0
  42. package/dist/cloud/projects.d.ts +13 -0
  43. package/dist/cloud/projects.d.ts.map +1 -0
  44. package/dist/cloud/projects.js +11 -0
  45. package/dist/cloud/projects.js.map +1 -0
  46. package/dist/cloud/signing.d.ts +105 -0
  47. package/dist/cloud/signing.d.ts.map +1 -0
  48. package/dist/cloud/signing.js +117 -0
  49. package/dist/cloud/signing.js.map +1 -0
  50. package/dist/cloud/streams.d.ts +6 -0
  51. package/dist/cloud/streams.d.ts.map +1 -0
  52. package/dist/cloud/streams.js +5 -0
  53. package/dist/cloud/streams.js.map +1 -0
  54. package/dist/decide/audit.d.ts +131 -0
  55. package/dist/decide/audit.d.ts.map +1 -0
  56. package/dist/decide/audit.js +98 -0
  57. package/dist/decide/audit.js.map +1 -0
  58. package/dist/decide/budget.d.ts +91 -0
  59. package/dist/decide/budget.d.ts.map +1 -0
  60. package/dist/decide/budget.js +194 -0
  61. package/dist/decide/budget.js.map +1 -0
  62. package/dist/decide/cache.d.ts +49 -0
  63. package/dist/decide/cache.d.ts.map +1 -0
  64. package/dist/decide/cache.js +87 -0
  65. package/dist/decide/cache.js.map +1 -0
  66. package/dist/decide/client.d.ts +103 -0
  67. package/dist/decide/client.d.ts.map +1 -0
  68. package/dist/decide/client.js +262 -0
  69. package/dist/decide/client.js.map +1 -0
  70. package/dist/decide/credentials.d.ts +159 -0
  71. package/dist/decide/credentials.d.ts.map +1 -0
  72. package/dist/decide/credentials.js +383 -0
  73. package/dist/decide/credentials.js.map +1 -0
  74. package/dist/decide/index.d.ts +18 -0
  75. package/dist/decide/index.d.ts.map +1 -0
  76. package/dist/decide/index.js +18 -0
  77. package/dist/decide/index.js.map +1 -0
  78. package/dist/decide/jev-wire.d.ts +155 -0
  79. package/dist/decide/jev-wire.d.ts.map +1 -0
  80. package/dist/decide/jev-wire.js +420 -0
  81. package/dist/decide/jev-wire.js.map +1 -0
  82. package/dist/decide/operations.d.ts +152 -0
  83. package/dist/decide/operations.d.ts.map +1 -0
  84. package/dist/decide/operations.js +199 -0
  85. package/dist/decide/operations.js.map +1 -0
  86. package/dist/decide/provider.d.ts +90 -0
  87. package/dist/decide/provider.d.ts.map +1 -0
  88. package/dist/decide/provider.js +43 -0
  89. package/dist/decide/provider.js.map +1 -0
  90. package/dist/decide/site.d.ts +148 -0
  91. package/dist/decide/site.d.ts.map +1 -0
  92. package/dist/decide/site.js +181 -0
  93. package/dist/decide/site.js.map +1 -0
  94. package/dist/decide/transport.d.ts +67 -0
  95. package/dist/decide/transport.d.ts.map +1 -0
  96. package/dist/decide/transport.js +350 -0
  97. package/dist/decide/transport.js.map +1 -0
  98. package/dist/dispatch/mutate-projection.d.ts.map +1 -1
  99. package/dist/dispatch/mutate-projection.js +5 -0
  100. package/dist/dispatch/mutate-projection.js.map +1 -1
  101. package/dist/docs/docs-update.d.ts.map +1 -1
  102. package/dist/docs/docs-update.js +25 -9
  103. package/dist/docs/docs-update.js.map +1 -1
  104. package/dist/docs/export-document.js +5963 -2406
  105. package/dist/docs/export-document.js.map +3 -3
  106. package/dist/docs/index.d.ts +2 -2
  107. package/dist/docs/index.d.ts.map +1 -1
  108. package/dist/docs/index.js +1 -1
  109. package/dist/docs/index.js.map +1 -1
  110. package/dist/docs/projection.d.ts.map +1 -1
  111. package/dist/docs/projection.js +2 -3
  112. package/dist/docs/projection.js.map +1 -1
  113. package/dist/docs/publish-pr.d.ts +69 -1
  114. package/dist/docs/publish-pr.d.ts.map +1 -1
  115. package/dist/docs/publish-pr.js +112 -10
  116. package/dist/docs/publish-pr.js.map +1 -1
  117. package/dist/doctor/db-substrate.d.ts +13 -8
  118. package/dist/doctor/db-substrate.d.ts.map +1 -1
  119. package/dist/doctor/db-substrate.js +39 -26
  120. package/dist/doctor/db-substrate.js.map +1 -1
  121. package/dist/doctor/index.d.ts +2 -0
  122. package/dist/doctor/index.d.ts.map +1 -1
  123. package/dist/doctor/index.js +1 -0
  124. package/dist/doctor/index.js.map +1 -1
  125. package/dist/doctor/knowledge.d.ts +16 -1
  126. package/dist/doctor/knowledge.d.ts.map +1 -1
  127. package/dist/doctor/knowledge.js +58 -32
  128. package/dist/doctor/knowledge.js.map +1 -1
  129. package/dist/doctor/nexus-schema-residency.d.ts +1 -1
  130. package/dist/doctor/nexus-schema-residency.d.ts.map +1 -1
  131. package/dist/doctor/nexus-schema-residency.js +3 -0
  132. package/dist/doctor/nexus-schema-residency.js.map +1 -1
  133. package/dist/doctor/project-identity.d.ts +44 -1
  134. package/dist/doctor/project-identity.d.ts.map +1 -1
  135. package/dist/doctor/project-identity.js +237 -10
  136. package/dist/doctor/project-identity.js.map +1 -1
  137. package/dist/doctor/projects.d.ts +170 -0
  138. package/dist/doctor/projects.d.ts.map +1 -0
  139. package/dist/doctor/projects.js +1075 -0
  140. package/dist/doctor/projects.js.map +1 -0
  141. package/dist/doctor/twin-collapse.d.ts +97 -0
  142. package/dist/doctor/twin-collapse.d.ts.map +1 -0
  143. package/dist/doctor/twin-collapse.js +168 -0
  144. package/dist/doctor/twin-collapse.js.map +1 -0
  145. package/dist/doctor/worktree-orphans.d.ts.map +1 -1
  146. package/dist/doctor/worktree-orphans.js +13 -29
  147. package/dist/doctor/worktree-orphans.js.map +1 -1
  148. package/dist/doctor/worktree-stores.d.ts +128 -0
  149. package/dist/doctor/worktree-stores.d.ts.map +1 -0
  150. package/dist/doctor/worktree-stores.js +374 -0
  151. package/dist/doctor/worktree-stores.js.map +1 -0
  152. package/dist/engine/engine-ops.d.ts +36 -6
  153. package/dist/engine/engine-ops.d.ts.map +1 -1
  154. package/dist/engine/engine-ops.js +115 -14
  155. package/dist/engine/engine-ops.js.map +1 -1
  156. package/dist/error-catalog.d.ts.map +1 -1
  157. package/dist/error-catalog.js +21 -0
  158. package/dist/error-catalog.js.map +1 -1
  159. package/dist/error-registry.d.ts.map +1 -1
  160. package/dist/error-registry.js +40 -0
  161. package/dist/error-registry.js.map +1 -1
  162. package/dist/gateway-client/generated/types.gen.d.ts +1 -1
  163. package/dist/gc/cleanup.d.ts.map +1 -1
  164. package/dist/gc/cleanup.js +32 -19
  165. package/dist/gc/cleanup.js.map +1 -1
  166. package/dist/git/bounded-git.d.ts +170 -0
  167. package/dist/git/bounded-git.d.ts.map +1 -0
  168. package/dist/git/bounded-git.js +371 -0
  169. package/dist/git/bounded-git.js.map +1 -0
  170. package/dist/git/work-tree.d.ts +20 -0
  171. package/dist/git/work-tree.d.ts.map +1 -1
  172. package/dist/git/work-tree.js +20 -2
  173. package/dist/git/work-tree.js.map +1 -1
  174. package/dist/hooks/handlers/session-hooks.d.ts +11 -26
  175. package/dist/hooks/handlers/session-hooks.d.ts.map +1 -1
  176. package/dist/hooks/handlers/session-hooks.js +18 -47
  177. package/dist/hooks/handlers/session-hooks.js.map +1 -1
  178. package/dist/hooks/payload-schemas.d.ts +2 -2
  179. package/dist/index.d.ts +8 -5
  180. package/dist/index.d.ts.map +1 -1
  181. package/dist/index.js +6 -3
  182. package/dist/index.js.map +1 -1
  183. package/dist/init/engine-ops.d.ts.map +1 -1
  184. package/dist/init/engine-ops.js +23 -1
  185. package/dist/init/engine-ops.js.map +1 -1
  186. package/dist/init.d.ts +158 -1
  187. package/dist/init.d.ts.map +1 -1
  188. package/dist/init.js +578 -53
  189. package/dist/init.js.map +1 -1
  190. package/dist/inject/index.d.ts.map +1 -1
  191. package/dist/inject/index.js +8 -3
  192. package/dist/inject/index.js.map +1 -1
  193. package/dist/injection.d.ts +55 -0
  194. package/dist/injection.d.ts.map +1 -1
  195. package/dist/injection.js +102 -6
  196. package/dist/injection.js.map +1 -1
  197. package/dist/internal.d.ts +11 -7
  198. package/dist/internal.d.ts.map +1 -1
  199. package/dist/internal.js +9 -5
  200. package/dist/internal.js.map +1 -1
  201. package/dist/issue/diagnostics.d.ts.map +1 -1
  202. package/dist/issue/diagnostics.js +2 -1
  203. package/dist/issue/diagnostics.js.map +1 -1
  204. package/dist/lib/concurrency.d.ts +25 -0
  205. package/dist/lib/concurrency.d.ts.map +1 -0
  206. package/dist/lib/concurrency.js +43 -0
  207. package/dist/lib/concurrency.js.map +1 -0
  208. package/dist/lib/index.d.ts +1 -0
  209. package/dist/lib/index.d.ts.map +1 -1
  210. package/dist/lib/index.js +1 -0
  211. package/dist/lib/index.js.map +1 -1
  212. package/dist/lifecycle/engine-ops.d.ts.map +1 -1
  213. package/dist/lifecycle/engine-ops.js +4 -2
  214. package/dist/lifecycle/engine-ops.js.map +1 -1
  215. package/dist/lifecycle/stage-guidance.d.ts +5 -0
  216. package/dist/lifecycle/stage-guidance.d.ts.map +1 -1
  217. package/dist/lifecycle/stage-guidance.js +14 -4
  218. package/dist/lifecycle/stage-guidance.js.map +1 -1
  219. package/dist/llm/catalog-cache.d.ts +3 -2
  220. package/dist/llm/catalog-cache.d.ts.map +1 -1
  221. package/dist/llm/catalog-cache.js +5 -5
  222. package/dist/llm/catalog-cache.js.map +1 -1
  223. package/dist/llm/credentials.d.ts +4 -4
  224. package/dist/llm/credentials.js +6 -6
  225. package/dist/llm/credentials.js.map +1 -1
  226. package/dist/llm/plugin-facade.js +4400 -1801
  227. package/dist/llm/plugin-facade.js.map +3 -3
  228. package/dist/llm/stable-device-id.d.ts.map +1 -1
  229. package/dist/llm/stable-device-id.js +3 -5
  230. package/dist/llm/stable-device-id.js.map +1 -1
  231. package/dist/memory/attention.js +31 -31
  232. package/dist/memory/attention.js.map +1 -1
  233. package/dist/memory/decision-contradiction.d.ts +152 -0
  234. package/dist/memory/decision-contradiction.d.ts.map +1 -0
  235. package/dist/memory/decision-contradiction.js +273 -0
  236. package/dist/memory/decision-contradiction.js.map +1 -0
  237. package/dist/memory/decisions.d.ts +42 -11
  238. package/dist/memory/decisions.d.ts.map +1 -1
  239. package/dist/memory/decisions.js +153 -56
  240. package/dist/memory/decisions.js.map +1 -1
  241. package/dist/memory/dialectic-evaluator.d.ts +7 -0
  242. package/dist/memory/dialectic-evaluator.d.ts.map +1 -1
  243. package/dist/memory/dialectic-evaluator.js +23 -8
  244. package/dist/memory/dialectic-evaluator.js.map +1 -1
  245. package/dist/memory/dispatch-trace-format.d.ts +39 -0
  246. package/dist/memory/dispatch-trace-format.d.ts.map +1 -0
  247. package/dist/memory/dispatch-trace-format.js +54 -0
  248. package/dist/memory/dispatch-trace-format.js.map +1 -0
  249. package/dist/memory/dispatch-trace.d.ts.map +1 -1
  250. package/dist/memory/dispatch-trace.js +1 -27
  251. package/dist/memory/dispatch-trace.js.map +1 -1
  252. package/dist/memory/engine-compat.d.ts +2 -0
  253. package/dist/memory/engine-compat.d.ts.map +1 -1
  254. package/dist/memory/engine-compat.js +1 -0
  255. package/dist/memory/engine-compat.js.map +1 -1
  256. package/dist/memory/import-from-provider.js +3 -3
  257. package/dist/memory/import-from-provider.js.map +1 -1
  258. package/dist/memory/learnings.d.ts +2 -2
  259. package/dist/memory/observation-type-decision.d.ts +96 -0
  260. package/dist/memory/observation-type-decision.d.ts.map +1 -0
  261. package/dist/memory/observation-type-decision.js +218 -0
  262. package/dist/memory/observation-type-decision.js.map +1 -0
  263. package/dist/memory/redaction.js +2 -0
  264. package/dist/memory/redaction.js.map +1 -1
  265. package/dist/memory/retrieval/build-retrieval-bundle.d.ts +9 -2
  266. package/dist/memory/retrieval/build-retrieval-bundle.d.ts.map +1 -1
  267. package/dist/memory/retrieval/build-retrieval-bundle.js +42 -11
  268. package/dist/memory/retrieval/build-retrieval-bundle.js.map +1 -1
  269. package/dist/memory/retrieval/get-current-session-id.d.ts +5 -0
  270. package/dist/memory/retrieval/get-current-session-id.d.ts.map +1 -1
  271. package/dist/memory/retrieval/get-current-session-id.js +7 -2
  272. package/dist/memory/retrieval/get-current-session-id.js.map +1 -1
  273. package/dist/memory/retrieval/observe.d.ts.map +1 -1
  274. package/dist/memory/retrieval/observe.js +30 -29
  275. package/dist/memory/retrieval/observe.js.map +1 -1
  276. package/dist/nexus/analyze-orchestrator.d.ts +38 -0
  277. package/dist/nexus/analyze-orchestrator.d.ts.map +1 -1
  278. package/dist/nexus/analyze-orchestrator.js +136 -48
  279. package/dist/nexus/analyze-orchestrator.js.map +1 -1
  280. package/dist/nexus/assessment-projection.d.ts +76 -0
  281. package/dist/nexus/assessment-projection.d.ts.map +1 -0
  282. package/dist/nexus/assessment-projection.js +143 -0
  283. package/dist/nexus/assessment-projection.js.map +1 -0
  284. package/dist/nexus/assessment-store.d.ts +14 -2
  285. package/dist/nexus/assessment-store.d.ts.map +1 -1
  286. package/dist/nexus/assessment-store.js +21 -3
  287. package/dist/nexus/assessment-store.js.map +1 -1
  288. package/dist/nexus/checkout-nonce.d.ts +48 -0
  289. package/dist/nexus/checkout-nonce.d.ts.map +1 -0
  290. package/dist/nexus/checkout-nonce.js +84 -0
  291. package/dist/nexus/checkout-nonce.js.map +1 -0
  292. package/dist/nexus/devices.d.ts +93 -0
  293. package/dist/nexus/devices.d.ts.map +1 -0
  294. package/dist/nexus/devices.js +141 -0
  295. package/dist/nexus/devices.js.map +1 -0
  296. package/dist/nexus/freshness.d.ts.map +1 -1
  297. package/dist/nexus/freshness.js +25 -6
  298. package/dist/nexus/freshness.js.map +1 -1
  299. package/dist/nexus/git-state.d.ts +225 -0
  300. package/dist/nexus/git-state.d.ts.map +1 -0
  301. package/dist/nexus/git-state.js +677 -0
  302. package/dist/nexus/git-state.js.map +1 -0
  303. package/dist/nexus/graph-manifest.d.ts +20 -4
  304. package/dist/nexus/graph-manifest.d.ts.map +1 -1
  305. package/dist/nexus/graph-manifest.js +40 -5
  306. package/dist/nexus/graph-manifest.js.map +1 -1
  307. package/dist/nexus/identity.d.ts +68 -23
  308. package/dist/nexus/identity.d.ts.map +1 -1
  309. package/dist/nexus/identity.js +99 -22
  310. package/dist/nexus/identity.js.map +1 -1
  311. package/dist/nexus/index.d.ts +5 -2
  312. package/dist/nexus/index.d.ts.map +1 -1
  313. package/dist/nexus/index.js +10 -4
  314. package/dist/nexus/index.js.map +1 -1
  315. package/dist/nexus/knowledge.d.ts +5 -0
  316. package/dist/nexus/knowledge.d.ts.map +1 -1
  317. package/dist/nexus/knowledge.js +40 -5
  318. package/dist/nexus/knowledge.js.map +1 -1
  319. package/dist/nexus/legacy-alias.d.ts +60 -0
  320. package/dist/nexus/legacy-alias.d.ts.map +1 -0
  321. package/dist/nexus/legacy-alias.js +68 -0
  322. package/dist/nexus/legacy-alias.js.map +1 -0
  323. package/dist/nexus/migrate-json-to-sqlite.js +2 -2
  324. package/dist/nexus/migrate-json-to-sqlite.js.map +1 -1
  325. package/dist/nexus/ops.d.ts +1 -0
  326. package/dist/nexus/ops.d.ts.map +1 -1
  327. package/dist/nexus/path-map.d.ts +264 -20
  328. package/dist/nexus/path-map.d.ts.map +1 -1
  329. package/dist/nexus/path-map.js +580 -44
  330. package/dist/nexus/path-map.js.map +1 -1
  331. package/dist/nexus/projects-clean.d.ts +9 -1
  332. package/dist/nexus/projects-clean.d.ts.map +1 -1
  333. package/dist/nexus/projects-clean.js +126 -14
  334. package/dist/nexus/projects-clean.js.map +1 -1
  335. package/dist/nexus/projects-scan.d.ts +56 -1
  336. package/dist/nexus/projects-scan.d.ts.map +1 -1
  337. package/dist/nexus/projects-scan.js +144 -3
  338. package/dist/nexus/projects-scan.js.map +1 -1
  339. package/dist/nexus/registry-hygiene.d.ts +18 -2
  340. package/dist/nexus/registry-hygiene.d.ts.map +1 -1
  341. package/dist/nexus/registry-hygiene.js +37 -11
  342. package/dist/nexus/registry-hygiene.js.map +1 -1
  343. package/dist/nexus/registry-roots.d.ts +47 -0
  344. package/dist/nexus/registry-roots.d.ts.map +1 -0
  345. package/dist/nexus/registry-roots.js +79 -0
  346. package/dist/nexus/registry-roots.js.map +1 -0
  347. package/dist/nexus/registry.d.ts +50 -9
  348. package/dist/nexus/registry.d.ts.map +1 -1
  349. package/dist/nexus/registry.js +311 -156
  350. package/dist/nexus/registry.js.map +1 -1
  351. package/dist/nexus/stored-roots.d.ts +171 -0
  352. package/dist/nexus/stored-roots.d.ts.map +1 -0
  353. package/dist/nexus/stored-roots.js +253 -0
  354. package/dist/nexus/stored-roots.js.map +1 -0
  355. package/dist/nexus/transfer.d.ts.map +1 -1
  356. package/dist/nexus/transfer.js +3 -0
  357. package/dist/nexus/transfer.js.map +1 -1
  358. package/dist/nexus/user-profile-hygiene.d.ts +168 -0
  359. package/dist/nexus/user-profile-hygiene.d.ts.map +1 -0
  360. package/dist/nexus/user-profile-hygiene.js +305 -0
  361. package/dist/nexus/user-profile-hygiene.js.map +1 -0
  362. package/dist/nexus/user-profile.d.ts +53 -2
  363. package/dist/nexus/user-profile.d.ts.map +1 -1
  364. package/dist/nexus/user-profile.js +106 -4
  365. package/dist/nexus/user-profile.js.map +1 -1
  366. package/dist/orchestrate/lifecycle-ops.d.ts.map +1 -1
  367. package/dist/orchestrate/lifecycle-ops.js +4 -1
  368. package/dist/orchestrate/lifecycle-ops.js.map +1 -1
  369. package/dist/orchestrate/pivot.d.ts.map +1 -1
  370. package/dist/orchestrate/pivot.js +5 -1
  371. package/dist/orchestrate/pivot.js.map +1 -1
  372. package/dist/orchestrate/plan.d.ts.map +1 -1
  373. package/dist/orchestrate/plan.js +5 -2
  374. package/dist/orchestrate/plan.js.map +1 -1
  375. package/dist/orchestrate/query-ops.d.ts +7 -2
  376. package/dist/orchestrate/query-ops.d.ts.map +1 -1
  377. package/dist/orchestrate/query-ops.js +17 -6
  378. package/dist/orchestrate/query-ops.js.map +1 -1
  379. package/dist/orchestrate/spawn-ops.d.ts +12 -0
  380. package/dist/orchestrate/spawn-ops.d.ts.map +1 -1
  381. package/dist/orchestrate/spawn-ops.js +157 -71
  382. package/dist/orchestrate/spawn-ops.js.map +1 -1
  383. package/dist/orchestration/bootstrap.d.ts.map +1 -1
  384. package/dist/orchestration/bootstrap.js +4 -2
  385. package/dist/orchestration/bootstrap.js.map +1 -1
  386. package/dist/orchestration/classify-readiness.d.ts +37 -1
  387. package/dist/orchestration/classify-readiness.d.ts.map +1 -1
  388. package/dist/orchestration/classify-readiness.js +48 -19
  389. package/dist/orchestration/classify-readiness.js.map +1 -1
  390. package/dist/orchestration/index.d.ts +4 -2
  391. package/dist/orchestration/index.d.ts.map +1 -1
  392. package/dist/orchestration/index.js +6 -4
  393. package/dist/orchestration/index.js.map +1 -1
  394. package/dist/orchestration/lead-rollup.d.ts +8 -5
  395. package/dist/orchestration/lead-rollup.d.ts.map +1 -1
  396. package/dist/orchestration/lead-rollup.js +32 -15
  397. package/dist/orchestration/lead-rollup.js.map +1 -1
  398. package/dist/orchestration/owner-decision-readiness.d.ts +88 -0
  399. package/dist/orchestration/owner-decision-readiness.d.ts.map +1 -0
  400. package/dist/orchestration/owner-decision-readiness.js +152 -0
  401. package/dist/orchestration/owner-decision-readiness.js.map +1 -0
  402. package/dist/orchestration/parallel.d.ts.map +1 -1
  403. package/dist/orchestration/parallel.js +10 -17
  404. package/dist/orchestration/parallel.js.map +1 -1
  405. package/dist/orchestration/psyche-memory-budget.d.ts +105 -0
  406. package/dist/orchestration/psyche-memory-budget.d.ts.map +1 -0
  407. package/dist/orchestration/psyche-memory-budget.js +383 -0
  408. package/dist/orchestration/psyche-memory-budget.js.map +1 -0
  409. package/dist/orchestration/spawn-prompt.d.ts +16 -2
  410. package/dist/orchestration/spawn-prompt.d.ts.map +1 -1
  411. package/dist/orchestration/spawn-prompt.js +144 -181
  412. package/dist/orchestration/spawn-prompt.js.map +1 -1
  413. package/dist/orchestration/spawn.d.ts +7 -0
  414. package/dist/orchestration/spawn.d.ts.map +1 -1
  415. package/dist/orchestration/spawn.js +1 -0
  416. package/dist/orchestration/spawn.js.map +1 -1
  417. package/dist/orchestration/status.d.ts +8 -3
  418. package/dist/orchestration/status.d.ts.map +1 -1
  419. package/dist/orchestration/status.js +9 -6
  420. package/dist/orchestration/status.js.map +1 -1
  421. package/dist/orchestration/wave-topic.d.ts +54 -0
  422. package/dist/orchestration/wave-topic.d.ts.map +1 -0
  423. package/dist/orchestration/wave-topic.js +68 -0
  424. package/dist/orchestration/wave-topic.js.map +1 -0
  425. package/dist/orchestration/waves.d.ts +47 -8
  426. package/dist/orchestration/waves.d.ts.map +1 -1
  427. package/dist/orchestration/waves.js +152 -43
  428. package/dist/orchestration/waves.js.map +1 -1
  429. package/dist/paths.d.ts +24 -8
  430. package/dist/paths.d.ts.map +1 -1
  431. package/dist/paths.js +135 -71
  432. package/dist/paths.js.map +1 -1
  433. package/dist/phases/index.d.ts.map +1 -1
  434. package/dist/phases/index.js +6 -2
  435. package/dist/phases/index.js.map +1 -1
  436. package/dist/platform.d.ts +6 -1
  437. package/dist/platform.d.ts.map +1 -1
  438. package/dist/platform.js +8 -19
  439. package/dist/platform.js.map +1 -1
  440. package/dist/project-info.d.ts +18 -0
  441. package/dist/project-info.d.ts.map +1 -1
  442. package/dist/project-info.js +29 -1
  443. package/dist/project-info.js.map +1 -1
  444. package/dist/project-lifecycle.d.ts +91 -32
  445. package/dist/project-lifecycle.d.ts.map +1 -1
  446. package/dist/project-lifecycle.js +639 -75
  447. package/dist/project-lifecycle.js.map +1 -1
  448. package/dist/project-scope.d.ts +104 -4
  449. package/dist/project-scope.d.ts.map +1 -1
  450. package/dist/project-scope.js +263 -13
  451. package/dist/project-scope.js.map +1 -1
  452. package/dist/project-tombstone.d.ts +111 -0
  453. package/dist/project-tombstone.d.ts.map +1 -0
  454. package/dist/project-tombstone.js +220 -0
  455. package/dist/project-tombstone.js.map +1 -0
  456. package/dist/release/artifacts.d.ts.map +1 -1
  457. package/dist/release/artifacts.js +14 -9
  458. package/dist/release/artifacts.js.map +1 -1
  459. package/dist/release/ci-evidence.d.ts +233 -0
  460. package/dist/release/ci-evidence.d.ts.map +1 -0
  461. package/dist/release/ci-evidence.js +668 -0
  462. package/dist/release/ci-evidence.js.map +1 -0
  463. package/dist/release/engine-ops.d.ts.map +1 -1
  464. package/dist/release/engine-ops.js +3 -3
  465. package/dist/release/engine-ops.js.map +1 -1
  466. package/dist/release/github-pr.d.ts +30 -0
  467. package/dist/release/github-pr.d.ts.map +1 -1
  468. package/dist/release/github-pr.js +40 -0
  469. package/dist/release/github-pr.js.map +1 -1
  470. package/dist/release/plan.d.ts.map +1 -1
  471. package/dist/release/plan.js +11 -7
  472. package/dist/release/plan.js.map +1 -1
  473. package/dist/release/pr-evidence.d.ts +38 -0
  474. package/dist/release/pr-evidence.d.ts.map +1 -1
  475. package/dist/release/pr-evidence.js +79 -15
  476. package/dist/release/pr-evidence.js.map +1 -1
  477. package/dist/release/reconcile.d.ts.map +1 -1
  478. package/dist/release/reconcile.js +3 -2
  479. package/dist/release/reconcile.js.map +1 -1
  480. package/dist/release/release-manifest.d.ts +2 -1
  481. package/dist/release/release-manifest.d.ts.map +1 -1
  482. package/dist/release/release-manifest.js +6 -5
  483. package/dist/release/release-manifest.js.map +1 -1
  484. package/dist/render/nexus/graph/index.d.ts +4 -0
  485. package/dist/render/nexus/graph/index.d.ts.map +1 -1
  486. package/dist/render/nexus/graph/index.js +57 -0
  487. package/dist/render/nexus/graph/index.js.map +1 -1
  488. package/dist/resources/spawn-wrapper.d.ts +8 -1
  489. package/dist/resources/spawn-wrapper.d.ts.map +1 -1
  490. package/dist/resources/spawn-wrapper.js +42 -5
  491. package/dist/resources/spawn-wrapper.js.map +1 -1
  492. package/dist/routing/build-command-groups.d.ts.map +1 -1
  493. package/dist/routing/build-command-groups.js +1 -0
  494. package/dist/routing/build-command-groups.js.map +1 -1
  495. package/dist/sagas/index.d.ts +1 -1
  496. package/dist/sagas/index.d.ts.map +1 -1
  497. package/dist/sagas/index.js +1 -1
  498. package/dist/sagas/index.js.map +1 -1
  499. package/dist/sagas/reconcile.d.ts +24 -4
  500. package/dist/sagas/reconcile.d.ts.map +1 -1
  501. package/dist/sagas/reconcile.js +226 -100
  502. package/dist/sagas/reconcile.js.map +1 -1
  503. package/dist/scaffold/ensure-config.d.ts.map +1 -1
  504. package/dist/scaffold/ensure-config.js +31 -1
  505. package/dist/scaffold/ensure-config.js.map +1 -1
  506. package/dist/scaffold/project-identity.d.ts +2 -8
  507. package/dist/scaffold/project-identity.d.ts.map +1 -1
  508. package/dist/scaffold/project-identity.js +5 -21
  509. package/dist/scaffold/project-identity.js.map +1 -1
  510. package/dist/security/input-sanitization.d.ts +9 -1
  511. package/dist/security/input-sanitization.d.ts.map +1 -1
  512. package/dist/security/input-sanitization.js +20 -3
  513. package/dist/security/input-sanitization.js.map +1 -1
  514. package/dist/selfimprove/fix-gen.js +4409 -1810
  515. package/dist/selfimprove/fix-gen.js.map +3 -3
  516. package/dist/sentient/propose-tick.d.ts.map +1 -1
  517. package/dist/sentient/propose-tick.js +4 -2
  518. package/dist/sentient/propose-tick.js.map +1 -1
  519. package/dist/sequence/index.d.ts.map +1 -1
  520. package/dist/sequence/index.js +6 -23
  521. package/dist/sequence/index.js.map +1 -1
  522. package/dist/session/engine-ops.d.ts +15 -0
  523. package/dist/session/engine-ops.d.ts.map +1 -1
  524. package/dist/session/engine-ops.js +146 -22
  525. package/dist/session/engine-ops.js.map +1 -1
  526. package/dist/sessions/assumptions.d.ts.map +1 -1
  527. package/dist/sessions/assumptions.js +7 -4
  528. package/dist/sessions/assumptions.js.map +1 -1
  529. package/dist/sessions/briefing.d.ts +23 -0
  530. package/dist/sessions/briefing.d.ts.map +1 -1
  531. package/dist/sessions/briefing.js +59 -9
  532. package/dist/sessions/briefing.js.map +1 -1
  533. package/dist/sessions/decisions.d.ts +38 -3
  534. package/dist/sessions/decisions.d.ts.map +1 -1
  535. package/dist/sessions/decisions.js +235 -21
  536. package/dist/sessions/decisions.js.map +1 -1
  537. package/dist/sessions/drift-watchdog.d.ts.map +1 -1
  538. package/dist/sessions/drift-watchdog.js +8 -5
  539. package/dist/sessions/drift-watchdog.js.map +1 -1
  540. package/dist/sessions/focus-state-store.d.ts +89 -1
  541. package/dist/sessions/focus-state-store.d.ts.map +1 -1
  542. package/dist/sessions/focus-state-store.js +97 -1
  543. package/dist/sessions/focus-state-store.js.map +1 -1
  544. package/dist/sessions/index.d.ts +2 -2
  545. package/dist/sessions/index.d.ts.map +1 -1
  546. package/dist/sessions/index.js +34 -5
  547. package/dist/sessions/index.js.map +1 -1
  548. package/dist/sessions/session-drift.d.ts.map +1 -1
  549. package/dist/sessions/session-drift.js +4 -3
  550. package/dist/sessions/session-drift.js.map +1 -1
  551. package/dist/sessions/session-end-snapshot-entry.d.ts +26 -0
  552. package/dist/sessions/session-end-snapshot-entry.d.ts.map +1 -0
  553. package/dist/sessions/session-end-snapshot-entry.js +59 -0
  554. package/dist/sessions/session-end-snapshot-entry.js.map +1 -0
  555. package/dist/sessions/session-end-snapshot.d.ts +114 -0
  556. package/dist/sessions/session-end-snapshot.d.ts.map +1 -0
  557. package/dist/sessions/session-end-snapshot.js +446 -0
  558. package/dist/sessions/session-end-snapshot.js.map +1 -0
  559. package/dist/sessions/session-manifest-mirror.d.ts.map +1 -1
  560. package/dist/sessions/session-manifest-mirror.js +10 -17
  561. package/dist/sessions/session-manifest-mirror.js.map +1 -1
  562. package/dist/sessions/session-switch.d.ts.map +1 -1
  563. package/dist/sessions/session-switch.js +5 -3
  564. package/dist/sessions/session-switch.js.map +1 -1
  565. package/dist/sessions/snapshot.d.ts.map +1 -1
  566. package/dist/sessions/snapshot.js +5 -4
  567. package/dist/sessions/snapshot.js.map +1 -1
  568. package/dist/sessions/terminal-identity.d.ts +169 -0
  569. package/dist/sessions/terminal-identity.d.ts.map +1 -0
  570. package/dist/sessions/terminal-identity.js +273 -0
  571. package/dist/sessions/terminal-identity.js.map +1 -0
  572. package/dist/setup/sections/verification.d.ts +1 -1
  573. package/dist/setup/sections/verification.d.ts.map +1 -1
  574. package/dist/setup/sections/verification.js +11 -15
  575. package/dist/setup/sections/verification.js.map +1 -1
  576. package/dist/skills/discovery.d.ts +20 -3
  577. package/dist/skills/discovery.d.ts.map +1 -1
  578. package/dist/skills/discovery.js +41 -4
  579. package/dist/skills/discovery.js.map +1 -1
  580. package/dist/skills/dispatch.d.ts +5 -2
  581. package/dist/skills/dispatch.d.ts.map +1 -1
  582. package/dist/skills/dispatch.js +5 -2
  583. package/dist/skills/dispatch.js.map +1 -1
  584. package/dist/skills/doctor.d.ts.map +1 -1
  585. package/dist/skills/doctor.js +5 -1
  586. package/dist/skills/doctor.js.map +1 -1
  587. package/dist/skills/federated-search.js +2 -2
  588. package/dist/skills/federated-search.js.map +1 -1
  589. package/dist/skills/index.d.ts +3 -3
  590. package/dist/skills/index.d.ts.map +1 -1
  591. package/dist/skills/index.js +1 -1
  592. package/dist/skills/index.js.map +1 -1
  593. package/dist/skills/migration.d.ts +5 -5
  594. package/dist/skills/migration.d.ts.map +1 -1
  595. package/dist/skills/migration.js +7 -9
  596. package/dist/skills/migration.js.map +1 -1
  597. package/dist/skills/orchestrator/startup.d.ts.map +1 -1
  598. package/dist/skills/orchestrator/startup.js +14 -7
  599. package/dist/skills/orchestrator/startup.js.map +1 -1
  600. package/dist/skills/prune-bundled.d.ts +267 -0
  601. package/dist/skills/prune-bundled.d.ts.map +1 -0
  602. package/dist/skills/prune-bundled.js +536 -0
  603. package/dist/skills/prune-bundled.js.map +1 -0
  604. package/dist/skills/skill-paths.d.ts +30 -3
  605. package/dist/skills/skill-paths.d.ts.map +1 -1
  606. package/dist/skills/skill-paths.js +28 -9
  607. package/dist/skills/skill-paths.js.map +1 -1
  608. package/dist/skills/skill-root.d.ts +60 -11
  609. package/dist/skills/skill-root.d.ts.map +1 -1
  610. package/dist/skills/skill-root.js +100 -14
  611. package/dist/skills/skill-root.js.map +1 -1
  612. package/dist/skills/skills-guard.js +5 -5
  613. package/dist/skills/skills-guard.js.map +1 -1
  614. package/dist/skills/types.d.ts +32 -1
  615. package/dist/skills/types.d.ts.map +1 -1
  616. package/dist/skills/types.js +17 -34
  617. package/dist/skills/types.js.map +1 -1
  618. package/dist/spawn/agent-identity.d.ts +51 -2
  619. package/dist/spawn/agent-identity.d.ts.map +1 -1
  620. package/dist/spawn/agent-identity.js +89 -26
  621. package/dist/spawn/agent-identity.js.map +1 -1
  622. package/dist/spawn/branch-lock.d.ts.map +1 -1
  623. package/dist/spawn/branch-lock.js +80 -79
  624. package/dist/spawn/branch-lock.js.map +1 -1
  625. package/dist/spawn/index.d.ts +2 -2
  626. package/dist/spawn/index.d.ts.map +1 -1
  627. package/dist/spawn/index.js +1 -1
  628. package/dist/spawn/index.js.map +1 -1
  629. package/dist/spawn/worktree-lock-holder.d.ts +37 -0
  630. package/dist/spawn/worktree-lock-holder.d.ts.map +1 -0
  631. package/dist/spawn/worktree-lock-holder.js +41 -0
  632. package/dist/spawn/worktree-lock-holder.js.map +1 -0
  633. package/dist/stats/index.d.ts.map +1 -1
  634. package/dist/stats/index.js +4 -2
  635. package/dist/stats/index.js.map +1 -1
  636. package/dist/sticky/convert.d.ts.map +1 -1
  637. package/dist/sticky/convert.js +16 -4
  638. package/dist/sticky/convert.js.map +1 -1
  639. package/dist/store/attachment-store.d.ts +14 -0
  640. package/dist/store/attachment-store.d.ts.map +1 -1
  641. package/dist/store/attachment-store.js +11 -1
  642. package/dist/store/attachment-store.js.map +1 -1
  643. package/dist/store/backup-inspect.d.ts +7 -3
  644. package/dist/store/backup-inspect.d.ts.map +1 -1
  645. package/dist/store/backup-inspect.js +18 -7
  646. package/dist/store/backup-inspect.js.map +1 -1
  647. package/dist/store/backup-sidecar.d.ts +60 -0
  648. package/dist/store/backup-sidecar.d.ts.map +1 -0
  649. package/dist/store/backup-sidecar.js +96 -0
  650. package/dist/store/backup-sidecar.js.map +1 -0
  651. package/dist/store/data-accessor.d.ts +1 -1
  652. package/dist/store/data-accessor.d.ts.map +1 -1
  653. package/dist/store/data-accessor.js +6 -6
  654. package/dist/store/data-accessor.js.map +1 -1
  655. package/dist/store/data-safety-central.d.ts +13 -4
  656. package/dist/store/data-safety-central.d.ts.map +1 -1
  657. package/dist/store/data-safety-central.js +31 -4
  658. package/dist/store/data-safety-central.js.map +1 -1
  659. package/dist/store/dual-scope-db.d.ts.map +1 -1
  660. package/dist/store/dual-scope-db.js +10 -0
  661. package/dist/store/dual-scope-db.js.map +1 -1
  662. package/dist/store/exodus/__fixtures__/representative-fixture.d.ts.map +1 -1
  663. package/dist/store/exodus/__fixtures__/representative-fixture.js +4 -0
  664. package/dist/store/exodus/__fixtures__/representative-fixture.js.map +1 -1
  665. package/dist/store/exodus/migrate.js +1 -1
  666. package/dist/store/exodus/migrate.js.map +1 -1
  667. package/dist/store/exodus/reconcile.js +1 -1
  668. package/dist/store/exodus/reconcile.js.map +1 -1
  669. package/dist/store/exodus/runtime-targets.d.ts +4 -3
  670. package/dist/store/exodus/runtime-targets.d.ts.map +1 -1
  671. package/dist/store/exodus/runtime-targets.js +4 -3
  672. package/dist/store/exodus/runtime-targets.js.map +1 -1
  673. package/dist/store/import-logging.d.ts.map +1 -1
  674. package/dist/store/import-logging.js +5 -4
  675. package/dist/store/import-logging.js.map +1 -1
  676. package/dist/store/legacy-tasks-lineage.d.ts.map +1 -1
  677. package/dist/store/legacy-tasks-lineage.js +2 -7
  678. package/dist/store/legacy-tasks-lineage.js.map +1 -1
  679. package/dist/store/lock.d.ts +1 -0
  680. package/dist/store/lock.d.ts.map +1 -1
  681. package/dist/store/lock.js +1 -0
  682. package/dist/store/lock.js.map +1 -1
  683. package/dist/store/memory-accessor.d.ts +8 -3
  684. package/dist/store/memory-accessor.d.ts.map +1 -1
  685. package/dist/store/memory-accessor.js +29 -13
  686. package/dist/store/memory-accessor.js.map +1 -1
  687. package/dist/store/memory-sqlite.d.ts.map +1 -1
  688. package/dist/store/memory-sqlite.js +5 -0
  689. package/dist/store/memory-sqlite.js.map +1 -1
  690. package/dist/store/open-cleo-db.d.ts.map +1 -1
  691. package/dist/store/open-cleo-db.js +11 -6
  692. package/dist/store/open-cleo-db.js.map +1 -1
  693. package/dist/store/portable-bundle-relocate.d.ts +13 -8
  694. package/dist/store/portable-bundle-relocate.d.ts.map +1 -1
  695. package/dist/store/portable-bundle-relocate.js +75 -31
  696. package/dist/store/portable-bundle-relocate.js.map +1 -1
  697. package/dist/store/portable-bundle-scan.d.ts.map +1 -1
  698. package/dist/store/portable-bundle-scan.js +2 -1
  699. package/dist/store/portable-bundle-scan.js.map +1 -1
  700. package/dist/store/portable-bundle.d.ts.map +1 -1
  701. package/dist/store/portable-bundle.js +7 -3
  702. package/dist/store/portable-bundle.js.map +1 -1
  703. package/dist/store/pre-repair-snapshot.d.ts +77 -0
  704. package/dist/store/pre-repair-snapshot.d.ts.map +1 -0
  705. package/dist/store/pre-repair-snapshot.js +122 -0
  706. package/dist/store/pre-repair-snapshot.js.map +1 -0
  707. package/dist/store/regenerators.d.ts +2 -1
  708. package/dist/store/regenerators.d.ts.map +1 -1
  709. package/dist/store/regenerators.js +17 -3
  710. package/dist/store/regenerators.js.map +1 -1
  711. package/dist/store/relocated-store-guard.d.ts +71 -0
  712. package/dist/store/relocated-store-guard.d.ts.map +1 -0
  713. package/dist/store/relocated-store-guard.js +138 -0
  714. package/dist/store/relocated-store-guard.js.map +1 -0
  715. package/dist/store/safety-data-accessor.d.ts +2 -2
  716. package/dist/store/safety-data-accessor.d.ts.map +1 -1
  717. package/dist/store/safety-data-accessor.js +2 -2
  718. package/dist/store/safety-data-accessor.js.map +1 -1
  719. package/dist/store/schema/attachments.d.ts +2 -2
  720. package/dist/store/schema/audit.d.ts +5 -5
  721. package/dist/store/schema/background-jobs.d.ts +1 -1
  722. package/dist/store/schema/cleo-global/models-catalog.d.ts +1 -1
  723. package/dist/store/schema/cleo-global/nexus.d.ts +686 -0
  724. package/dist/store/schema/cleo-global/nexus.d.ts.map +1 -1
  725. package/dist/store/schema/cleo-global/nexus.js +175 -7
  726. package/dist/store/schema/cleo-global/nexus.js.map +1 -1
  727. package/dist/store/schema/cleo-global/skills.d.ts +2 -2
  728. package/dist/store/schema/cleo-project/audit.d.ts +5 -5
  729. package/dist/store/schema/cleo-project/docs.d.ts +3 -3
  730. package/dist/store/schema/cleo-project/lifecycle.d.ts +3 -3
  731. package/dist/store/schema/cleo-project/provenance-commits.d.ts +2 -2
  732. package/dist/store/schema/cleo-project/provenance-rest.d.ts +3 -3
  733. package/dist/store/schema/cleo-project/tasks-core-batch2.d.ts +1 -1
  734. package/dist/store/schema/cleo-project/tasks-core.d.ts +6 -6
  735. package/dist/store/schema/cleo-shared/brain.d.ts +26 -26
  736. package/dist/store/schema/lifecycle.d.ts +3 -3
  737. package/dist/store/schema/manifest.d.ts +1 -1
  738. package/dist/store/schema/memory-schema.d.ts +26 -26
  739. package/dist/store/schema/nexus-schema.d.ts +696 -2
  740. package/dist/store/schema/nexus-schema.d.ts.map +1 -1
  741. package/dist/store/schema/nexus-schema.js +175 -19
  742. package/dist/store/schema/nexus-schema.js.map +1 -1
  743. package/dist/store/schema/provenance/releases.d.ts +1 -1
  744. package/dist/store/schema/skills-schema.d.ts +2 -2
  745. package/dist/store/schema/tasks.d.ts +5 -5
  746. package/dist/store/session-binding-schema.d.ts +132 -0
  747. package/dist/store/session-binding-schema.d.ts.map +1 -0
  748. package/dist/store/session-binding-schema.js +53 -0
  749. package/dist/store/session-binding-schema.js.map +1 -0
  750. package/dist/store/session-store.d.ts +262 -4
  751. package/dist/store/session-store.d.ts.map +1 -1
  752. package/dist/store/session-store.js +486 -26
  753. package/dist/store/session-store.js.map +1 -1
  754. package/dist/store/skills-db.d.ts +17 -0
  755. package/dist/store/skills-db.d.ts.map +1 -1
  756. package/dist/store/skills-db.js +30 -0
  757. package/dist/store/skills-db.js.map +1 -1
  758. package/dist/store/snapshot-gate.d.ts +239 -0
  759. package/dist/store/snapshot-gate.d.ts.map +1 -0
  760. package/dist/store/snapshot-gate.js +401 -0
  761. package/dist/store/snapshot-gate.js.map +1 -0
  762. package/dist/store/split-brain-import.js +2 -2
  763. package/dist/store/split-brain-import.js.map +1 -1
  764. package/dist/store/sqlite-backup.d.ts +55 -13
  765. package/dist/store/sqlite-backup.d.ts.map +1 -1
  766. package/dist/store/sqlite-backup.js +414 -106
  767. package/dist/store/sqlite-backup.js.map +1 -1
  768. package/dist/store/sqlite-data-accessor.d.ts +15 -0
  769. package/dist/store/sqlite-data-accessor.d.ts.map +1 -1
  770. package/dist/store/sqlite-data-accessor.js +73 -4
  771. package/dist/store/sqlite-data-accessor.js.map +1 -1
  772. package/dist/store/sqlite.d.ts +15 -1
  773. package/dist/store/sqlite.d.ts.map +1 -1
  774. package/dist/store/sqlite.js +75 -5
  775. package/dist/store/sqlite.js.map +1 -1
  776. package/dist/store/store-write-guard.d.ts +28 -0
  777. package/dist/store/store-write-guard.d.ts.map +1 -0
  778. package/dist/store/store-write-guard.js +50 -0
  779. package/dist/store/store-write-guard.js.map +1 -0
  780. package/dist/store/table-classification.d.ts +143 -0
  781. package/dist/store/table-classification.d.ts.map +1 -0
  782. package/dist/store/table-classification.js +1866 -0
  783. package/dist/store/table-classification.js.map +1 -0
  784. package/dist/store/task-version.d.ts +72 -0
  785. package/dist/store/task-version.d.ts.map +1 -0
  786. package/dist/store/task-version.js +93 -0
  787. package/dist/store/task-version.js.map +1 -0
  788. package/dist/store/tasks-schema.d.ts +1 -0
  789. package/dist/store/tasks-schema.d.ts.map +1 -1
  790. package/dist/store/tasks-schema.js +13 -0
  791. package/dist/store/tasks-schema.js.map +1 -1
  792. package/dist/store/tasks-sqlite.d.ts +10 -3
  793. package/dist/store/tasks-sqlite.d.ts.map +1 -1
  794. package/dist/store/tasks-sqlite.js +12 -3
  795. package/dist/store/tasks-sqlite.js.map +1 -1
  796. package/dist/store/twin-collapse.d.ts +320 -0
  797. package/dist/store/twin-collapse.d.ts.map +1 -0
  798. package/dist/store/twin-collapse.js +931 -0
  799. package/dist/store/twin-collapse.js.map +1 -0
  800. package/dist/store/umbrella-data-accessor.d.ts +2 -2
  801. package/dist/store/umbrella-data-accessor.d.ts.map +1 -1
  802. package/dist/store/umbrella-data-accessor.js +2 -2
  803. package/dist/store/umbrella-data-accessor.js.map +1 -1
  804. package/dist/store/validation-schemas.d.ts +63 -63
  805. package/dist/store/worktree-isolation-guard.d.ts +46 -24
  806. package/dist/store/worktree-isolation-guard.d.ts.map +1 -1
  807. package/dist/store/worktree-isolation-guard.js +71 -50
  808. package/dist/store/worktree-isolation-guard.js.map +1 -1
  809. package/dist/system/backup.d.ts.map +1 -1
  810. package/dist/system/backup.js +3 -67
  811. package/dist/system/backup.js.map +1 -1
  812. package/dist/system/cleo-link.d.ts +163 -0
  813. package/dist/system/cleo-link.d.ts.map +1 -0
  814. package/dist/system/cleo-link.js +246 -0
  815. package/dist/system/cleo-link.js.map +1 -0
  816. package/dist/system/dependencies.d.ts.map +1 -1
  817. package/dist/system/dependencies.js +3 -6
  818. package/dist/system/dependencies.js.map +1 -1
  819. package/dist/system/global-delivery.d.ts +205 -0
  820. package/dist/system/global-delivery.d.ts.map +1 -0
  821. package/dist/system/global-delivery.js +320 -0
  822. package/dist/system/global-delivery.js.map +1 -0
  823. package/dist/system/health.d.ts.map +1 -1
  824. package/dist/system/health.js +29 -6
  825. package/dist/system/health.js.map +1 -1
  826. package/dist/system/inject-generate.d.ts.map +1 -1
  827. package/dist/system/inject-generate.js +4 -4
  828. package/dist/system/inject-generate.js.map +1 -1
  829. package/dist/system/project-health.d.ts.map +1 -1
  830. package/dist/system/project-health.js +1 -20
  831. package/dist/system/project-health.js.map +1 -1
  832. package/dist/system/runtime.d.ts.map +1 -1
  833. package/dist/system/runtime.js +2 -12
  834. package/dist/system/runtime.js.map +1 -1
  835. package/dist/system/safestop.d.ts.map +1 -1
  836. package/dist/system/safestop.js +5 -2
  837. package/dist/system/safestop.js.map +1 -1
  838. package/dist/system/skill-fixtures.d.ts +200 -0
  839. package/dist/system/skill-fixtures.d.ts.map +1 -0
  840. package/dist/system/skill-fixtures.js +331 -0
  841. package/dist/system/skill-fixtures.js.map +1 -0
  842. package/dist/task-work/index.d.ts +6 -0
  843. package/dist/task-work/index.d.ts.map +1 -1
  844. package/dist/task-work/index.js +6 -3
  845. package/dist/task-work/index.js.map +1 -1
  846. package/dist/tasks/add.d.ts.map +1 -1
  847. package/dist/tasks/add.js +4 -2
  848. package/dist/tasks/add.js.map +1 -1
  849. package/dist/tasks/affected-packages.d.ts +218 -0
  850. package/dist/tasks/affected-packages.d.ts.map +1 -0
  851. package/dist/tasks/affected-packages.js +496 -0
  852. package/dist/tasks/affected-packages.js.map +1 -0
  853. package/dist/tasks/affected-scope.d.ts +59 -0
  854. package/dist/tasks/affected-scope.d.ts.map +1 -0
  855. package/dist/tasks/affected-scope.js +81 -0
  856. package/dist/tasks/affected-scope.js.map +1 -0
  857. package/dist/tasks/analyze.d.ts.map +1 -1
  858. package/dist/tasks/analyze.js +7 -2
  859. package/dist/tasks/analyze.js.map +1 -1
  860. package/dist/tasks/change-set.d.ts +175 -0
  861. package/dist/tasks/change-set.d.ts.map +1 -0
  862. package/dist/tasks/change-set.js +753 -0
  863. package/dist/tasks/change-set.js.map +1 -0
  864. package/dist/tasks/complete.d.ts +10 -0
  865. package/dist/tasks/complete.d.ts.map +1 -1
  866. package/dist/tasks/complete.js +59 -5
  867. package/dist/tasks/complete.js.map +1 -1
  868. package/dist/tasks/component-pr.d.ts +106 -0
  869. package/dist/tasks/component-pr.d.ts.map +1 -0
  870. package/dist/tasks/component-pr.js +190 -0
  871. package/dist/tasks/component-pr.js.map +1 -0
  872. package/dist/tasks/done-plan.d.ts +123 -0
  873. package/dist/tasks/done-plan.d.ts.map +1 -0
  874. package/dist/tasks/done-plan.js +696 -0
  875. package/dist/tasks/done-plan.js.map +1 -0
  876. package/dist/tasks/done-record.d.ts +127 -0
  877. package/dist/tasks/done-record.d.ts.map +1 -0
  878. package/dist/tasks/done-record.js +302 -0
  879. package/dist/tasks/done-record.js.map +1 -0
  880. package/dist/tasks/duplicate-detector.d.ts +68 -11
  881. package/dist/tasks/duplicate-detector.d.ts.map +1 -1
  882. package/dist/tasks/duplicate-detector.js +314 -58
  883. package/dist/tasks/duplicate-detector.js.map +1 -1
  884. package/dist/tasks/evidence-paths.d.ts +78 -0
  885. package/dist/tasks/evidence-paths.d.ts.map +1 -0
  886. package/dist/tasks/evidence-paths.js +150 -0
  887. package/dist/tasks/evidence-paths.js.map +1 -0
  888. package/dist/tasks/evidence.d.ts +101 -1
  889. package/dist/tasks/evidence.d.ts.map +1 -1
  890. package/dist/tasks/evidence.js +278 -31
  891. package/dist/tasks/evidence.js.map +1 -1
  892. package/dist/tasks/gate-preview.d.ts +5 -0
  893. package/dist/tasks/gate-preview.d.ts.map +1 -1
  894. package/dist/tasks/gate-preview.js +25 -21
  895. package/dist/tasks/gate-preview.js.map +1 -1
  896. package/dist/tasks/gate-result-cache.d.ts +205 -0
  897. package/dist/tasks/gate-result-cache.d.ts.map +1 -0
  898. package/dist/tasks/gate-result-cache.js +285 -0
  899. package/dist/tasks/gate-result-cache.js.map +1 -0
  900. package/dist/tasks/gate-runner.d.ts +126 -3
  901. package/dist/tasks/gate-runner.d.ts.map +1 -1
  902. package/dist/tasks/gate-runner.js +483 -28
  903. package/dist/tasks/gate-runner.js.map +1 -1
  904. package/dist/tasks/session-scope.d.ts +3 -1
  905. package/dist/tasks/session-scope.d.ts.map +1 -1
  906. package/dist/tasks/session-scope.js +18 -3
  907. package/dist/tasks/session-scope.js.map +1 -1
  908. package/dist/tasks/task-next.d.ts +4 -0
  909. package/dist/tasks/task-next.d.ts.map +1 -1
  910. package/dist/tasks/task-next.js +32 -28
  911. package/dist/tasks/task-next.js.map +1 -1
  912. package/dist/tasks/tool-resolver.d.ts +23 -6
  913. package/dist/tasks/tool-resolver.d.ts.map +1 -1
  914. package/dist/tasks/tool-resolver.js +146 -8
  915. package/dist/tasks/tool-resolver.js.map +1 -1
  916. package/dist/tasks/tool-vacuity.d.ts +71 -0
  917. package/dist/tasks/tool-vacuity.d.ts.map +1 -0
  918. package/dist/tasks/tool-vacuity.js +334 -0
  919. package/dist/tasks/tool-vacuity.js.map +1 -0
  920. package/dist/tasks/update.d.ts +8 -0
  921. package/dist/tasks/update.d.ts.map +1 -1
  922. package/dist/tasks/update.js +159 -78
  923. package/dist/tasks/update.js.map +1 -1
  924. package/dist/upgrade.d.ts.map +1 -1
  925. package/dist/upgrade.js +18 -2
  926. package/dist/upgrade.js.map +1 -1
  927. package/dist/validation/doctor/checks.d.ts +20 -2
  928. package/dist/validation/doctor/checks.d.ts.map +1 -1
  929. package/dist/validation/doctor/checks.js +64 -4
  930. package/dist/validation/doctor/checks.js.map +1 -1
  931. package/dist/validation/doctor/index.d.ts +1 -1
  932. package/dist/validation/doctor/index.d.ts.map +1 -1
  933. package/dist/validation/doctor/index.js +1 -1
  934. package/dist/validation/doctor/index.js.map +1 -1
  935. package/dist/validation/doctor/utils.d.ts.map +1 -1
  936. package/dist/validation/doctor/utils.js +7 -2
  937. package/dist/validation/doctor/utils.js.map +1 -1
  938. package/dist/validation/engine-ops.d.ts +24 -1
  939. package/dist/validation/engine-ops.d.ts.map +1 -1
  940. package/dist/validation/engine-ops.js +272 -98
  941. package/dist/validation/engine-ops.js.map +1 -1
  942. package/dist/validation/validate-ops.d.ts.map +1 -1
  943. package/dist/validation/validate-ops.js +9 -3
  944. package/dist/validation/validate-ops.js.map +1 -1
  945. package/dist/worktree/worktree-adopt.d.ts.map +1 -1
  946. package/dist/worktree/worktree-adopt.js +5 -2
  947. package/dist/worktree/worktree-adopt.js.map +1 -1
  948. package/migrations/drizzle-cleo-global/20260927000000_t12469-project-locations/migration.sql +121 -0
  949. package/migrations/drizzle-cleo-global/20260927010000_t12543-user-profile-project-scope/migration.sql +23 -0
  950. package/migrations/drizzle-cleo-global/20260928010000_t12470-location-candidates/migration.sql +72 -0
  951. package/migrations/drizzle-cleo-global/20260928020000_t12510-nexus-devices/migration.sql +34 -0
  952. package/migrations/drizzle-cleo-global/20260928030000_t12511-project-git-state/migration.sql +62 -0
  953. package/migrations/drizzle-cleo-project/20260927000000_t12499-session-terminal-bindings/migration.sql +34 -0
  954. package/migrations/drizzle-cleo-project/20260928000000_t12500-binding-provider-flag/migration.sql +15 -0
  955. package/package.json +23 -13
  956. package/schemas/config.schema.json +54 -0
  957. package/schemas/project-context.schema.json +51 -3
  958. package/schemas/project-info.schema.json +28 -1
  959. package/templates/CLEO-INJECTION.md +40 -332
  960. package/templates/CLEO-REFERENCE.md +303 -0
  961. package/templates/workflows/README.md +36 -14
@@ -0,0 +1,753 @@
1
+ /**
2
+ * Implemented change-set derivation for the streamlined verification flow.
3
+ *
4
+ * Given a task, find the work that implements it, first match wins:
5
+ *
6
+ * 1. a merged PR that cites the task — files read from its merge commit;
7
+ * 2. the unmerged task branch, diffed against its merge-base with origin's
8
+ * default branch;
9
+ * 3. for research, spike and documentation tasks, the attached docs and the
10
+ * decisions linked to the task.
11
+ *
12
+ * The result is an atom string for the EXISTING ADR-051 validators
13
+ * (`parseEvidence` → `validateAtom` → `checkGateEvidenceMinimum` →
14
+ * `checkTaskEvidenceContext`). Nothing here validates, records or writes:
15
+ * every git and gh call is a read, and the PR lookup runs with
16
+ * `readOnly: true` so not even the PR cache is written.
17
+ *
18
+ * Every git and gh call runs in one resolved execution root: a declared
19
+ * `evidence.gitRoot` first, then the caller's own worktree of this project,
20
+ * then — when invoked from the main checkout — the task's registered
21
+ * worktree, then the store root (or its single child checkout).
22
+ *
23
+ * Paths are repo-relative, which is the portable form the `files:` atom
24
+ * stores; deleted paths are reported separately and never enter `files:`,
25
+ * because a deleted file has no bytes to hash.
26
+ *
27
+ * Spec: `verify-streamlined-design` §3.2 step 2 and §6.
28
+ *
29
+ * @task T12624
30
+ */
31
+ import { execFileSync } from 'node:child_process';
32
+ import { existsSync, readdirSync, realpathSync } from 'node:fs';
33
+ import { join, resolve as resolvePath } from 'node:path';
34
+ import { gitToplevel, resolveDeclaredEvidenceGitRoot } from '../git/work-tree.js';
35
+ import { ghQueryTimeoutMs } from '../release/github-pr.js';
36
+ import { enumerateWorktrees } from '../worktree/list.js';
37
+ import { componentLandedChanges } from './component-pr.js';
38
+ import { classifyEvidenceTask, diffIntersectsAc, resolveEvidenceExecutionRoot, } from './evidence.js';
39
+ /** Run git read-only in `cwd`; `null` on any failure. */
40
+ function git(cwd, args) {
41
+ try {
42
+ return execFileSync('git', args, {
43
+ cwd,
44
+ encoding: 'utf-8',
45
+ stdio: ['ignore', 'pipe', 'ignore'],
46
+ maxBuffer: 64 * 1024 * 1024,
47
+ }).trimEnd();
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ }
53
+ function canonical(path) {
54
+ try {
55
+ return realpathSync(path);
56
+ }
57
+ catch {
58
+ return resolvePath(path);
59
+ }
60
+ }
61
+ /** `(^|non-alnum)T123(non-alnum|$)` — T123 never matches inside T1234. */
62
+ function citesTask(text, taskId) {
63
+ return new RegExp(`(^|[^A-Za-z0-9])${taskId}([^A-Za-z0-9]|$)`).test(text);
64
+ }
65
+ function blocker(code, message, command, why, cause) {
66
+ return { code, message, next: { command, why }, ...(cause ? { cause } : {}) };
67
+ }
68
+ /**
69
+ * Resolve the repository a task's change set is read from.
70
+ *
71
+ * Order: declared git root → the invocation's own worktree of this project →
72
+ * the task's registered worktree (only when invoked from the main checkout)
73
+ * → the store root or its single child checkout, as
74
+ * {@link resolveEvidenceExecutionRoot} already decides.
75
+ *
76
+ * @param storeRoot - CLEO store root.
77
+ * @param taskId - Task whose registered worktree to look for.
78
+ * @param cwd - Invocation directory.
79
+ * @param env - Environment for the declared-root tier.
80
+ * @returns The execution root and why it was chosen.
81
+ * @task T12624
82
+ */
83
+ export function resolveChangeSetRoot(storeRoot, taskId, cwd = process.cwd(), // CWD-OK: the invocation dir is the subject (gh#1220)
84
+ env = process.env) {
85
+ const declared = resolveDeclaredEvidenceGitRoot(storeRoot, env);
86
+ if (declared !== null) {
87
+ return { root: gitToplevel(declared.path) ?? declared.path, source: 'declared' };
88
+ }
89
+ const base = resolveEvidenceExecutionRoot(storeRoot, cwd);
90
+ const mainCheckout = git(base, ['rev-parse', '--path-format=absolute', '--git-common-dir']);
91
+ const isLinkedWorktree = mainCheckout !== null &&
92
+ canonical(join(base, '.git')) !== canonical(mainCheckout) &&
93
+ canonical(base) !== canonical(storeRoot);
94
+ if (isLinkedWorktree)
95
+ return { root: base, source: 'invocation-worktree' };
96
+ let worktrees = [];
97
+ try {
98
+ worktrees = enumerateWorktrees(base);
99
+ }
100
+ catch {
101
+ worktrees = [];
102
+ }
103
+ const own = worktrees.find((entry) => (entry.branch === `task/${taskId}` || entry.branch.startsWith(`task/${taskId}-`)) &&
104
+ existsSync(entry.path) &&
105
+ canonical(entry.path) !== canonical(base));
106
+ if (own)
107
+ return { root: own.path, source: 'task-worktree' };
108
+ return { root: base, source: 'store' };
109
+ }
110
+ /** Split `git diff --name-status --no-renames` output into kept and deleted paths. */
111
+ function parseNameStatus(output) {
112
+ const files = [];
113
+ const deleted = [];
114
+ for (const line of output.split('\n')) {
115
+ const [status, ...rest] = line.split('\t');
116
+ const path = rest.join('\t');
117
+ if (!status || !path)
118
+ continue;
119
+ if (status.startsWith('D'))
120
+ deleted.push(path);
121
+ else
122
+ files.push(path);
123
+ }
124
+ return { files, deleted };
125
+ }
126
+ /** `origin/<default>` from `origin/HEAD`, never from a possibly stale local branch. */
127
+ function resolveOriginDefault(root) {
128
+ const symbolic = git(root, ['symbolic-ref', '--quiet', 'refs/remotes/origin/HEAD']);
129
+ if (symbolic)
130
+ return symbolic.replace(/^refs\/remotes\//, '');
131
+ for (const candidate of ['origin/main', 'origin/master']) {
132
+ if (git(root, ['rev-parse', '--verify', '--quiet', `refs/remotes/${candidate}`]) !== null)
133
+ return candidate;
134
+ }
135
+ return null;
136
+ }
137
+ /**
138
+ * Deadline for one read-only `gh` query (T12656 review): discovery sits on the
139
+ * `cleo complete` path, so a hung `gh` must fail — as an unknown merge state —
140
+ * rather than hang the completion. One value for every evidence `gh` call.
141
+ */
142
+ export { GH_QUERY_TIMEOUT_MS } from '../release/github-pr.js';
143
+ /**
144
+ * Default merged-PR discovery: `gh pr list` by search text and by task branch.
145
+ *
146
+ * @param taskId - Task whose PRs to find.
147
+ * @param executionRoot - Repository `gh` runs in.
148
+ * @param opts - `timeoutMs` per query (default `ghQueryTimeoutMs()`).
149
+ * @returns The merged PRs, or why discovery failed (a timeout included).
150
+ * @task T12624
151
+ */
152
+ export async function defaultListMergedPrs(taskId, executionRoot, opts = {}) {
153
+ const { isGhCliAvailable } = await import('../release/github-pr.js');
154
+ if (!isGhCliAvailable())
155
+ return { ok: false, reason: 'gh CLI is not available on PATH' };
156
+ const fields = 'number,title,body,headRefName,mergedAt';
157
+ const queries = [
158
+ ['--search', taskId],
159
+ ['--head', `task/${taskId}`],
160
+ ];
161
+ const byNumber = new Map();
162
+ for (const query of queries) {
163
+ try {
164
+ const out = execFileSync('gh', ['pr', 'list', '--state', 'merged', ...query, '--json', fields, '--limit', '30'], {
165
+ cwd: executionRoot,
166
+ encoding: 'utf-8',
167
+ stdio: ['ignore', 'pipe', 'pipe'],
168
+ timeout: opts.timeoutMs ?? ghQueryTimeoutMs(),
169
+ });
170
+ const parsed = JSON.parse(out);
171
+ if (!Array.isArray(parsed))
172
+ continue;
173
+ for (const row of parsed) {
174
+ if (typeof row?.number === 'number')
175
+ byNumber.set(row.number, row);
176
+ }
177
+ }
178
+ catch (err) {
179
+ return {
180
+ ok: false,
181
+ reason: `gh pr list failed: ${err instanceof Error ? err.message.slice(0, 200) : String(err)}`,
182
+ };
183
+ }
184
+ }
185
+ return { ok: true, prs: [...byNumber.values()] };
186
+ }
187
+ const PR_DETAIL_FIELDS = 'number,title,headRefName,baseRefName,state,mergedAt,headRefOid,mergeCommit';
188
+ /** Normalise one `gh pr view/list --json PR_DETAIL_FIELDS` row. */
189
+ function toPrDetails(row) {
190
+ if (row === null || typeof row !== 'object')
191
+ return null;
192
+ const r = row;
193
+ if (typeof r.number !== 'number')
194
+ return null;
195
+ const merge = r.mergeCommit;
196
+ const str = (v) => (typeof v === 'string' ? v : '');
197
+ return {
198
+ number: r.number,
199
+ title: str(r.title),
200
+ headRefName: str(r.headRefName),
201
+ baseRefName: str(r.baseRefName),
202
+ state: str(r.state),
203
+ mergedAt: typeof r.mergedAt === 'string' && r.mergedAt !== '' ? r.mergedAt : null,
204
+ headRefOid: typeof r.headRefOid === 'string' ? r.headRefOid : null,
205
+ mergeCommitSha: typeof merge?.oid === 'string' ? merge.oid : null,
206
+ };
207
+ }
208
+ /** Run a read-only `gh` query; `null` on any failure. */
209
+ function ghJson(args, cwd) {
210
+ try {
211
+ return JSON.parse(execFileSync('gh', args, {
212
+ cwd,
213
+ encoding: 'utf-8',
214
+ stdio: ['ignore', 'pipe', 'pipe'],
215
+ timeout: ghQueryTimeoutMs(),
216
+ }));
217
+ }
218
+ catch {
219
+ return null;
220
+ }
221
+ }
222
+ /** Default {@link ChangeSetDeps.viewPr}: `gh pr view <n>`. */
223
+ async function defaultViewPr(prNumber, executionRoot) {
224
+ return toPrDetails(ghJson(['pr', 'view', String(prNumber), '--json', PR_DETAIL_FIELDS], executionRoot));
225
+ }
226
+ /** Default {@link ChangeSetDeps.findPrByHead}: `gh pr list --head <branch> --state all`. */
227
+ async function defaultFindPrByHead(branch, executionRoot) {
228
+ const rows = ghJson(['pr', 'list', '--head', branch, '--state', 'all', '--json', PR_DETAIL_FIELDS, '--limit', '10'], executionRoot);
229
+ if (!Array.isArray(rows))
230
+ return null;
231
+ const prs = rows.map(toPrDetails).filter((p) => p !== null);
232
+ return prs.find((p) => p.state === 'MERGED') ?? prs[0] ?? null;
233
+ }
234
+ /** Default PR verification: the existing `pr:` provenance code, persisting nothing. */
235
+ async function defaultResolvePr(prNumber, roots) {
236
+ const { resolvePrEvidenceAtom } = await import('../release/pr-evidence.js');
237
+ const { loadProjectContext } = await import('../agents/variable-substitution.js');
238
+ const ctx = loadProjectContext(roots.storeRoot);
239
+ return resolvePrEvidenceAtom(prNumber, roots, {
240
+ projectContext: ctx.loaded ? ctx.context : null,
241
+ readOnly: true,
242
+ });
243
+ }
244
+ /** Default attached-docs reader: the same read model `cleo docs list --task` uses. */
245
+ async function defaultListTaskDocs(storeRoot, taskId) {
246
+ const { createDocsReadModel } = await import('../docs/docs-read-model.js');
247
+ const model = createDocsReadModel(storeRoot);
248
+ try {
249
+ const docs = await model.resolveByOwner(taskId);
250
+ return docs.map((doc) => ({ id: doc.id, slug: doc.slug, sha256: doc.sha256 }));
251
+ }
252
+ finally {
253
+ model.close();
254
+ }
255
+ }
256
+ /** Default decision reader: decisions whose context task, or brain link, is this task. */
257
+ async function defaultListTaskDecisions(storeRoot, taskId) {
258
+ const { getBrainDb } = await import('../store/memory-sqlite.js');
259
+ const { eq } = await import('drizzle-orm');
260
+ const { brainDecisions } = await import('../store/schema/memory-schema.js');
261
+ const db = await getBrainDb(storeRoot);
262
+ const rows = await db
263
+ .select()
264
+ .from(brainDecisions)
265
+ .where(eq(brainDecisions.contextTaskId, taskId))
266
+ .all();
267
+ const { getLinkedDecisions } = await import('../memory/brain-links.js');
268
+ const linked = await getLinkedDecisions(storeRoot, taskId).catch(() => []);
269
+ const ids = new Set();
270
+ for (const row of [...rows, ...linked]) {
271
+ const state = row.confirmationState ?? '';
272
+ if (state === 'accepted' || state === 'proposed')
273
+ ids.add(row.id);
274
+ }
275
+ return [...ids].sort();
276
+ }
277
+ /**
278
+ * Locate the stored bytes of an attached doc, as a store-relative path the
279
+ * `files:` validator can hash: the content-addressed blob, else the
280
+ * attachment store copy.
281
+ */
282
+ function locateDocBytes(storeRoot, sha256) {
283
+ if (!/^[0-9a-f]{64}$/.test(sha256))
284
+ return null;
285
+ const blob = join('.cleo', 'blobs', 'blobs', sha256);
286
+ if (existsSync(join(storeRoot, blob)))
287
+ return blob;
288
+ const dir = join('.cleo', 'attachments', 'sha256', sha256.slice(0, 2));
289
+ try {
290
+ const hit = readdirSync(join(storeRoot, dir)).find((name) => name === sha256.slice(2) || name.startsWith(`${sha256.slice(2)}.`));
291
+ return hit ? join(dir, hit) : null;
292
+ }
293
+ catch {
294
+ return null;
295
+ }
296
+ }
297
+ function emptyChangeSet(root, rootSource) {
298
+ return {
299
+ source: 'none',
300
+ executionRoot: root,
301
+ rootSource,
302
+ files: [],
303
+ deletedFiles: [],
304
+ docs: [],
305
+ decisions: [],
306
+ candidates: [],
307
+ implementedEvidence: null,
308
+ blockers: [],
309
+ warnings: [],
310
+ };
311
+ }
312
+ /** `a;b` separators and `,` inside a files list cannot be carried by the atom grammar. */
313
+ function atomSafe(text) {
314
+ return text.replace(/[;\n]/g, ',').trim();
315
+ }
316
+ /** First-parent name-status of a merge (or squash) commit. */
317
+ function mergeCommitChanges(root, sha) {
318
+ return parseNameStatus(git(root, [
319
+ 'diff-tree',
320
+ '--root',
321
+ '--no-commit-id',
322
+ '-r',
323
+ '--name-status',
324
+ '--no-renames',
325
+ '-m',
326
+ '--first-parent',
327
+ sha,
328
+ ]) ?? '');
329
+ }
330
+ function hasCommit(root, sha) {
331
+ return sha !== null && git(root, ['cat-file', '-e', `${sha}^{commit}`]) !== null;
332
+ }
333
+ /** A GitHub revert PR: `Revert "…"` by default, `revert:` by convention. */
334
+ function isRevertTitle(title) {
335
+ return /^revert\b/i.test(title.trim());
336
+ }
337
+ /**
338
+ * The task's PR merged into another branch — a stacked PR. Its merge commit
339
+ * is on that branch, not on the default branch, so `pr:` provenance cannot
340
+ * attribute it. Once the base branch's own PR has merged to the default
341
+ * branch AND its head contains the stacked merge, the task is attributed to
342
+ * that base merge commit via `commit:` + the stacked PR's surviving files;
343
+ * otherwise a `pr-stacked` blocker names the base branch and its PR.
344
+ */
345
+ async function deriveStackedChangeSet(cs, taskId, root, pr, defaultBranch, findPrByHead) {
346
+ const baseRef = pr.baseRefName;
347
+ const basePr = await findPrByHead(baseRef, root);
348
+ const baseLanded = basePr !== null && basePr.state === 'MERGED' && basePr.baseRefName === defaultBranch;
349
+ if (baseLanded && hasCommit(root, pr.mergeCommitSha) && hasCommit(root, basePr.headRefOid)) {
350
+ const contained = git(root, [
351
+ 'merge-base',
352
+ '--is-ancestor',
353
+ pr.mergeCommitSha,
354
+ basePr.headRefOid,
355
+ ]) !== null;
356
+ const baseMerge = basePr.mergeCommitSha;
357
+ if (contained && baseMerge !== null && hasCommit(root, baseMerge)) {
358
+ // T12671/T12672: a component PR its integration PR landed is NOT
359
+ // stacked — the integration PR is the provenance and CI, the component
360
+ // PR the task link and the change (only its surviving files).
361
+ const { files, deleted } = componentLandedChanges(root, pr.mergeCommitSha, baseMerge);
362
+ if (files.length > 0) {
363
+ cs.mergeState = 'merged';
364
+ cs.source = 'pr';
365
+ cs.prNumber = basePr.number;
366
+ cs.componentPrNumber = pr.number;
367
+ cs.mergeCommitSha = baseMerge;
368
+ cs.files = files;
369
+ cs.deletedFiles = deleted;
370
+ cs.implementedEvidence = `pr:${pr.number}@${basePr.number};files:${files.join(',')}`;
371
+ return true;
372
+ }
373
+ }
374
+ }
375
+ cs.stackedOn = { baseRef, ...(basePr ? { basePrNumber: basePr.number } : {}) };
376
+ // Merged into another branch is not merged to the default branch until that
377
+ // branch's own PR lands it (the component path above).
378
+ cs.mergeState = 'unmerged';
379
+ const baseState = basePr === null
380
+ ? `no PR has ${baseRef} as its head`
381
+ : `its PR #${basePr.number} is ${basePr.state.toLowerCase()} into ${basePr.baseRefName || 'unknown'}`;
382
+ const settled = basePr !== null && basePr.state === 'MERGED';
383
+ cs.source = 'pr';
384
+ cs.blockers.push(blocker('pr-stacked', `PR #${pr.number} merged into ${baseRef}, not ${defaultBranch}; ${baseState}.`, settled ? `cleo done ${taskId} --plan --pr ${basePr.number}` : `cleo done ${taskId} --plan`, settled
385
+ ? `PR #${basePr.number} is where ${baseRef} merged, but its head does not contain PR #${pr.number}'s merge; name the PR that carried the work to ${defaultBranch}.`
386
+ : basePr !== null
387
+ ? `Re-plan after PR #${basePr.number} (${baseRef}) merges into ${defaultBranch}.`
388
+ : `Re-plan after ${baseRef} reaches ${defaultBranch} through its own PR.`));
389
+ return true;
390
+ }
391
+ /** Candidate numbers after the declared-files and own-branch narrowing rules. */
392
+ async function narrowCandidates(numbers, cs, task, roots, resolvePr, resolved) {
393
+ let out = numbers;
394
+ if (out.length > 1 && task.files?.length) {
395
+ for (const n of out)
396
+ resolved.set(n, await resolvePr(n, roots));
397
+ const intersecting = out.filter((n) => {
398
+ const r = resolved.get(n);
399
+ return r?.ok === true && diffIntersectsAc(r.changedPaths, task.files ?? []);
400
+ });
401
+ if (intersecting.length > 0)
402
+ out = intersecting;
403
+ }
404
+ if (out.length > 1) {
405
+ // A PR merged FROM the task's own branch (`task/<id>` or `task/<id>-…`)
406
+ // is the task's PR; an integration PR that merely lists the id in its body
407
+ // is not. Deterministic by branch convention, never by wording.
408
+ const own = cs.candidates.filter((c) => out.includes(c.prNumber) &&
409
+ (c.headRefName === `task/${task.id}` || c.headRefName.startsWith(`task/${task.id}-`)));
410
+ // D11151: several own-branch PRs are all the task's; the integration PRs
411
+ // that merely list the id drop out either way.
412
+ if (own.length >= 1)
413
+ out = own.map((c) => c.prNumber).sort((a, b) => a - b);
414
+ }
415
+ return out;
416
+ }
417
+ /**
418
+ * Step 1 — a merged PR that cites the task. Returns `true` when the PR path
419
+ * decided the outcome (a change set or a blocker), `false` to fall through.
420
+ * A PR the `pr:` validator refuses leaves a `pr-unverified` blocker and
421
+ * returns `false`, so the caller can still try the task branch.
422
+ */
423
+ async function derivePrChangeSet(cs, input, roots, deps) {
424
+ const { task } = input;
425
+ const root = roots.executionRoot;
426
+ const listed = await deps.listMergedPrs(task.id, root);
427
+ if (!listed.ok) {
428
+ cs.warnings.push(`Merged-PR discovery skipped: ${listed.reason}`);
429
+ cs.prDiscoveryFailed = true;
430
+ cs.mergeState = 'unknown';
431
+ }
432
+ const citing = (listed.ok ? listed.prs : []).filter((pr) => citesTask(`${pr.title}\n${pr.body}\n${pr.headRefName}`, task.id));
433
+ const reverts = citing.filter((pr) => isRevertTitle(pr.title));
434
+ const originals = citing.filter((pr) => !isRevertTitle(pr.title));
435
+ cs.candidates = originals.map((pr) => ({
436
+ prNumber: pr.number,
437
+ title: pr.title,
438
+ headRefName: pr.headRefName,
439
+ }));
440
+ let numbers = input.prNumber !== undefined
441
+ ? [input.prNumber]
442
+ : originals.map((pr) => pr.number).sort((a, b) => a - b);
443
+ if (numbers.length === 0)
444
+ return false;
445
+ const resolved = new Map();
446
+ numbers = await narrowCandidates(numbers, cs, task, roots, deps.resolvePr, resolved);
447
+ const ownBranch = (n) => {
448
+ const head = cs.candidates.find((c) => c.prNumber === n)?.headRefName ?? '';
449
+ return head === `task/${task.id}` || head.startsWith(`task/${task.id}-`);
450
+ };
451
+ // D11151: a task shipped across several of its OWN PRs (every candidate
452
+ // merged from task/<id> or task/<id>-…) records one implemented attempt per
453
+ // PR. Candidates that merely mention the id stay ambiguous.
454
+ if (numbers.length > 1 && input.prNumber === undefined && numbers.every(ownBranch)) {
455
+ return deriveMultiPrChangeSet(cs, numbers, { originals, reverts, resolved }, input, roots, deps);
456
+ }
457
+ if (numbers.length > 1) {
458
+ const list = numbers.map((n) => `#${n}`).join(', ');
459
+ cs.blockers.push(blocker('pr-ambiguous', `${numbers.length} merged PRs cite ${task.id} (${list}) and declared task files do not narrow them to one.`, `cleo done ${task.id} --plan --pr ${numbers[0]}`, `Name the PR that implements ${task.id}; candidates: ${list}.`));
460
+ return true;
461
+ }
462
+ return deriveOnePr(cs, numbers[0], { originals, reverts, resolved }, input, roots, deps);
463
+ }
464
+ /**
465
+ * D11151: derive every own-branch PR of the task in merge order. The latest is
466
+ * the primary change set; the others become {@link TaskChangeSet.additionalPrs},
467
+ * each recorded as its own `implemented` attempt. Any PR's blocker blocks.
468
+ */
469
+ async function deriveMultiPrChangeSet(cs, numbers, discovery, input, roots, deps) {
470
+ const ordered = [...numbers].sort((a, b) => a - b);
471
+ const parts = [];
472
+ for (const n of ordered) {
473
+ const part = emptyChangeSet(cs.executionRoot, cs.rootSource);
474
+ part.candidates = cs.candidates;
475
+ await deriveOnePr(part, n, discovery, input, roots, deps);
476
+ parts.push(part);
477
+ }
478
+ const primary = parts[parts.length - 1];
479
+ Object.assign(cs, { ...primary, candidates: cs.candidates });
480
+ cs.blockers = parts.flatMap((p) => p.blockers);
481
+ cs.warnings = [...cs.warnings, ...parts.flatMap((p) => p.warnings)];
482
+ cs.additionalPrs = parts.slice(0, -1).map((p) => ({
483
+ prNumber: p.prNumber,
484
+ ...(p.mergeCommitSha ? { mergeCommitSha: p.mergeCommitSha } : {}),
485
+ files: p.files,
486
+ deletedFiles: p.deletedFiles,
487
+ implementedEvidence: p.implementedEvidence,
488
+ }));
489
+ return true;
490
+ }
491
+ /** A PR merged from the task's own branch (`task/<id>` or `task/<id>-…`). */
492
+ function isOwnBranch(headRefName, taskId) {
493
+ return headRefName === `task/${taskId}` || headRefName.startsWith(`task/${taskId}-`);
494
+ }
495
+ /**
496
+ * The component PRs an integration PR landed for this task (T12672): merged
497
+ * PRs citing the task whose base is the integration PR's head branch and
498
+ * whose merge commit its final head contains. Own-branch components win over
499
+ * ones that merely mention the id; newest first.
500
+ */
501
+ async function landedComponents(integration, discovery, taskId, root, viewPr) {
502
+ const found = [];
503
+ for (const candidate of discovery.originals) {
504
+ if (candidate.number === integration.number)
505
+ continue;
506
+ const view = await viewPr(candidate.number, root);
507
+ if (view?.state === 'MERGED' &&
508
+ view.baseRefName === integration.headRefName &&
509
+ hasCommit(root, view.mergeCommitSha) &&
510
+ hasCommit(root, integration.headRefOid) &&
511
+ git(root, [
512
+ 'merge-base',
513
+ '--is-ancestor',
514
+ view.mergeCommitSha,
515
+ integration.headRefOid,
516
+ ]) !== null) {
517
+ found.push(view);
518
+ }
519
+ }
520
+ const own = found.filter((c) => isOwnBranch(c.headRefName, taskId));
521
+ return (own.length > 0 ? own : found).sort((a, b) => b.number - a.number);
522
+ }
523
+ /**
524
+ * Change set for an integration PR through its component PR(s): the newest
525
+ * is primary, each earlier one its own implemented attempt (D11151). Files
526
+ * are the component's surviving files, narrowed to declared task files.
527
+ */
528
+ function deriveComponentChangeSet(cs, components, integrationMerge, task) {
529
+ const root = cs.executionRoot;
530
+ const integration = cs.prNumber;
531
+ const declared = task.files ?? [];
532
+ const attempts = components.map((c) => {
533
+ const { files, deleted } = componentLandedChanges(root, c.mergeCommitSha, integrationMerge);
534
+ const own = declared.length > 0 ? files.filter((f) => diffIntersectsAc([f], declared)) : [];
535
+ const kept = own.length > 0 ? own : files;
536
+ return {
537
+ prNumber: c.number,
538
+ mergeCommitSha: integrationMerge,
539
+ files: kept,
540
+ deletedFiles: deleted,
541
+ implementedEvidence: kept.length > 0 ? `pr:${c.number}@${integration};files:${kept.join(',')}` : null,
542
+ };
543
+ });
544
+ const [primary, ...earlier] = attempts;
545
+ if (!primary)
546
+ return true;
547
+ cs.componentPrNumber = primary.prNumber;
548
+ cs.files = primary.files;
549
+ cs.deletedFiles = primary.deletedFiles;
550
+ cs.implementedEvidence = primary.implementedEvidence;
551
+ const extra = earlier.filter((a) => a.implementedEvidence !== null).reverse();
552
+ if (extra.length > 0)
553
+ cs.additionalPrs = extra;
554
+ if (primary.implementedEvidence === null) {
555
+ cs.blockers.push(blocker('no-change-set', `Component PR #${primary.prNumber}'s change leaves no surviving file in PR #${integration}'s merge commit.`, `cleo verify ${task.id} --gate implemented --evidence "pr:${primary.prNumber}@${integration};files:<a file it changed>"`, 'The implemented gate needs files evidence for an artifact the component PR changed.'));
556
+ }
557
+ return true;
558
+ }
559
+ /** Derive the change set of one chosen PR (revert, stacked, provenance, merge files). */
560
+ async function deriveOnePr(cs, prNumber, discovery, input, roots, deps) {
561
+ const { task } = input;
562
+ const root = roots.executionRoot;
563
+ const { originals, reverts, resolved } = discovery;
564
+ cs.prNumber = prNumber;
565
+ const original = originals.find((pr) => pr.number === prNumber);
566
+ // T12656 review: a PR discovery listed is merged (the query is --state
567
+ // merged) — whatever the pr: check later says about its CI.
568
+ if (original)
569
+ cs.mergeState = 'merged';
570
+ const revert = reverts.find((r) => r.number !== prNumber &&
571
+ (r.mergedAt && original?.mergedAt ? r.mergedAt > original.mergedAt : r.number > prNumber));
572
+ if (revert) {
573
+ cs.source = 'pr';
574
+ cs.blockers.push(blocker('pr-reverted', `PR #${prNumber} was reverted by PR #${revert.number} ("${revert.title}"); its change is not on the default branch.`, `cleo done ${task.id} --plan --pr <the PR that re-landed the work>`, 'A reverted PR cannot prove the task is implemented; name the PR that re-landed it.'));
575
+ return true;
576
+ }
577
+ const defaultRef = resolveOriginDefault(root);
578
+ const defaultBranch = defaultRef?.replace(/^origin\//, '') ?? null;
579
+ const detail = await deps.viewPr(prNumber, root);
580
+ if (!original) {
581
+ cs.mergeState = detail ? (detail.state === 'MERGED' ? 'merged' : 'unmerged') : 'unknown';
582
+ }
583
+ if (detail && defaultBranch && detail.baseRefName && detail.baseRefName !== defaultBranch) {
584
+ return deriveStackedChangeSet(cs, task.id, root, detail, defaultBranch, deps.findPrByHead);
585
+ }
586
+ const pr = resolved.get(prNumber) ?? (await deps.resolvePr(prNumber, roots));
587
+ if (!pr.ok) {
588
+ cs.source = 'pr';
589
+ const gitRoot = pr.codeName === 'E_EVIDENCE_GIT_ROOT';
590
+ cs.blockers.push(blocker(gitRoot ? 'git-root' : 'pr-unverified', `PR #${prNumber} cannot serve as evidence: ${pr.reason}`, gitRoot
591
+ ? `CLEO_EVIDENCE_GIT_ROOT=<path to the repository> cleo done ${task.id} --plan`
592
+ : pr.codeName === 'E_EVIDENCE_TESTS_FAILED'
593
+ ? `gh pr checks ${prNumber}`
594
+ : `gh pr view ${prNumber} --json state,baseRefName,mergeCommit`, gitRoot
595
+ ? 'Declare the repository the evidence is about.'
596
+ : 'The existing pr: provenance check refused this PR. The task branch diff is used instead when the branch still exists; otherwise resolve the reason it names.', pr.codeName));
597
+ return gitRoot;
598
+ }
599
+ cs.source = 'pr';
600
+ cs.mergeCommitSha = pr.mergeCommitSha;
601
+ if (hasCommit(root, pr.mergeCommitSha) && detail && !isOwnBranch(detail.headRefName, task.id)) {
602
+ // T12672: an integration PR records its component's files, not its own.
603
+ const components = await landedComponents(detail, discovery, task.id, root, deps.viewPr);
604
+ if (components.length > 0) {
605
+ return deriveComponentChangeSet(cs, components, pr.mergeCommitSha, task);
606
+ }
607
+ }
608
+ if (!hasCommit(root, pr.mergeCommitSha)) {
609
+ cs.blockers.push(blocker('merge-commit-missing', `Merge commit ${pr.mergeCommitSha.slice(0, 12)} of PR #${prNumber} is not in the local object store, so its files cannot be read.`, `git -C '${root}' fetch origin`, 'Evidence bytes are read from the merge commit, never from the working tree.'));
610
+ return true;
611
+ }
612
+ const { files, deleted } = mergeCommitChanges(root, pr.mergeCommitSha);
613
+ const prPaths = new Set(pr.changedPaths);
614
+ cs.files = prPaths.size > 0 ? files.filter((p) => prPaths.has(p)) : files;
615
+ // A PR shared by several tasks (batch `--pr`): each task's files: evidence
616
+ // names only the files it declared, when any of them is in the PR.
617
+ const declared = task.files ?? [];
618
+ if (declared.length > 0) {
619
+ const own = cs.files.filter((f) => diffIntersectsAc([f], declared));
620
+ if (own.length > 0)
621
+ cs.files = own;
622
+ }
623
+ cs.deletedFiles = deleted;
624
+ if (cs.files.length === 0) {
625
+ cs.blockers.push(blocker('no-change-set', `PR #${prNumber}'s merge commit leaves no surviving changed file to hash (deleted: ${deleted.length}).`, `cleo verify ${task.id} --gate implemented --evidence "pr:${prNumber};files:<a file the PR changed>"`, 'The implemented gate needs files evidence for an artifact the PR changed.'));
626
+ return true;
627
+ }
628
+ cs.implementedEvidence = `pr:${prNumber};files:${cs.files.join(',')}`;
629
+ return true;
630
+ }
631
+ /** Step 2 — the unmerged task branch or worktree. */
632
+ function deriveBranchChangeSet(cs, taskId) {
633
+ const root = cs.executionRoot;
634
+ const current = git(root, ['rev-parse', '--abbrev-ref', 'HEAD']);
635
+ let headRef = null;
636
+ if (current && current !== 'HEAD' && citesTask(current, taskId))
637
+ headRef = 'HEAD';
638
+ else if (git(root, ['rev-parse', '--verify', '--quiet', `refs/heads/task/${taskId}`]) !== null)
639
+ headRef = `task/${taskId}`;
640
+ if (headRef === null)
641
+ return false;
642
+ const baseRef = resolveOriginDefault(root);
643
+ if (baseRef === null) {
644
+ cs.warnings.push(`No origin default branch in ${root}; the branch diff has no base.`);
645
+ return false;
646
+ }
647
+ const commitSha = git(root, ['rev-parse', headRef]);
648
+ const mergeBase = git(root, ['merge-base', baseRef, headRef]);
649
+ if (!commitSha || !mergeBase || commitSha === mergeBase)
650
+ return false;
651
+ cs.source = 'branch';
652
+ cs.headRef = headRef;
653
+ cs.baseRef = baseRef;
654
+ cs.mergeBase = mergeBase;
655
+ cs.commitSha = commitSha;
656
+ const { files, deleted } = parseNameStatus(git(root, ['diff', '--name-status', '--no-renames', mergeBase, commitSha]) ?? '');
657
+ cs.files = files;
658
+ cs.deletedFiles = deleted;
659
+ if (headRef === 'HEAD') {
660
+ const dirty = git(root, ['status', '--porcelain', '--untracked-files=no']);
661
+ if (dirty) {
662
+ cs.blockers.push(blocker('dirty-tree', `${root} has uncommitted tracked changes; evidence must describe a commit.`, `git -C '${root}' commit -am "<message>"`, 'Commit (or stash) the changes so the recorded commit is the code under test.'));
663
+ }
664
+ }
665
+ cs.implementedEvidence =
666
+ files.length > 0
667
+ ? `commit:${commitSha};files:${files.join(',')}`
668
+ : `commit:${commitSha};note:${atomSafe(`removes ${deleted.length} file(s): ${deleted.join(' ')}`)}`;
669
+ return true;
670
+ }
671
+ /** Step 3 — the documentary path for research, spike and documentation tasks. */
672
+ async function deriveDocsChangeSet(cs, input, deps) {
673
+ const { task, storeRoot } = input;
674
+ if (classifyEvidenceTask({ task }) === 'code')
675
+ return false;
676
+ const refs = await deps.listTaskDocs(storeRoot, task.id);
677
+ const docs = [];
678
+ for (const ref of refs) {
679
+ const path = locateDocBytes(storeRoot, ref.sha256);
680
+ if (path && !docs.some((d) => d.path === path))
681
+ docs.push({ id: ref.id, slug: ref.slug, path });
682
+ }
683
+ const decisions = await deps.listTaskDecisions(storeRoot, task.id);
684
+ if (docs.length === 0 && decisions.length === 0)
685
+ return false;
686
+ cs.source = 'docs';
687
+ cs.docs = docs;
688
+ cs.decisions = decisions;
689
+ cs.files = docs.map((d) => d.path);
690
+ const names = docs.map((d) => d.slug ?? d.id.slice(0, 12));
691
+ const note = `note:${atomSafe(`Deliverable: ${names.length > 0 ? names.join(', ') : decisions.join(', ')}`)}`;
692
+ const files = cs.files.length > 0 ? `;files:${cs.files.join(',')}` : '';
693
+ if (decisions.length > 0) {
694
+ cs.implementedEvidence = `decision:${decisions[0]}${files};${note}`;
695
+ return true;
696
+ }
697
+ // GATE_EVIDENCE_REQUIREMENTS.implemented has no files+note alternative: a
698
+ // task with no commit proves `implemented` through a decision. Say so rather
699
+ // than plan an atom set the validator will refuse.
700
+ cs.implementedEvidence = `${files.slice(1)};${note}`;
701
+ cs.blockers.push(blocker('decision-missing', `${task.id} has attached docs but no accepted or proposed decision; without a commit, implemented needs decision+files.`, `cleo memory decision-store --decision "<what ${task.id} concluded>" --rationale "<why>" --linked-task ${task.id}`, 'A no-commit task proves implemented with its decision and the doc that records it.'));
702
+ return true;
703
+ }
704
+ /**
705
+ * Derive the implemented change set for a task. Read-only.
706
+ *
707
+ * @param input - Task, store root, invocation directory and optional `--pr`.
708
+ * @param deps - Injectable I/O; defaults to git, gh and the CLEO stores.
709
+ * @returns The change set, its provenance, the planned `implemented` atoms and
710
+ * any blockers. `source: 'none'` carries one `no-change-set` blocker.
711
+ * @example
712
+ * ```ts
713
+ * const cs = await deriveTaskChangeSet({ task, storeRoot: getProjectRoot() });
714
+ * if (cs.implementedEvidence) console.log(cs.implementedEvidence);
715
+ * ```
716
+ * @task T12624
717
+ */
718
+ export async function deriveTaskChangeSet(input, deps = {}) {
719
+ const cwd = input.cwd ?? process.cwd(); // CWD-OK: invocation dir locates the worktree (gh#1220)
720
+ const { root, source } = resolveChangeSetRoot(input.storeRoot, input.task.id, cwd, deps.env ?? process.env);
721
+ const cs = emptyChangeSet(root, source);
722
+ const roots = { storeRoot: input.storeRoot, executionRoot: root };
723
+ if (await derivePrChangeSet(cs, input, roots, {
724
+ listMergedPrs: deps.listMergedPrs ?? defaultListMergedPrs,
725
+ resolvePr: deps.resolvePr ?? defaultResolvePr,
726
+ viewPr: deps.viewPr ?? defaultViewPr,
727
+ findPrByHead: deps.findPrByHead ?? defaultFindPrByHead,
728
+ }))
729
+ return cs;
730
+ // A PR the pr: validator refused does not end the search: the task branch
731
+ // still describes the work. The refusal survives as a warning when the
732
+ // branch answers, and as the blocker when it does not.
733
+ const refused = cs.blockers.filter((b) => b.code === 'pr-unverified');
734
+ if (deriveBranchChangeSet(cs, input.task.id)) {
735
+ if (refused.length > 0) {
736
+ cs.blockers = cs.blockers.filter((b) => b.code !== 'pr-unverified');
737
+ cs.warnings.push(...refused.map((b) => `${b.message} — derived from the task branch instead.`));
738
+ delete cs.prNumber;
739
+ }
740
+ return cs;
741
+ }
742
+ if (refused.length > 0)
743
+ return cs;
744
+ if (await deriveDocsChangeSet(cs, input, {
745
+ listTaskDocs: deps.listTaskDocs ?? defaultListTaskDocs,
746
+ listTaskDecisions: deps.listTaskDecisions ?? defaultListTaskDecisions,
747
+ }))
748
+ return cs;
749
+ const id = input.task.id;
750
+ cs.blockers.push(blocker('no-change-set', `No merged PR, task branch or attached document references ${id}.`, `git switch -c task/${id}`, `Commit the work on task/${id}, or pass --pr <n> if a PR that does not cite ${id} implements it.`));
751
+ return cs;
752
+ }
753
+ //# sourceMappingURL=change-set.js.map