@cleocode/core 2026.10.1 → 2026.10.2

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 (385) hide show
  1. package/dist/build-provenance.json +2 -2
  2. package/dist/cloud/journal.d.ts +9 -5
  3. package/dist/cloud/journal.d.ts.map +1 -1
  4. package/dist/cloud/journal.js +29 -8
  5. package/dist/cloud/journal.js.map +1 -1
  6. package/dist/cloud/manifest-check.d.ts +140 -4
  7. package/dist/cloud/manifest-check.d.ts.map +1 -1
  8. package/dist/cloud/manifest-check.js +309 -10
  9. package/dist/cloud/manifest-check.js.map +1 -1
  10. package/dist/cloud/nexus-attach.d.ts +25 -0
  11. package/dist/cloud/nexus-attach.d.ts.map +1 -1
  12. package/dist/cloud/nexus-attach.js +81 -6
  13. package/dist/cloud/nexus-attach.js.map +1 -1
  14. package/dist/cloud/nexus-cloud-activity.d.ts +37 -0
  15. package/dist/cloud/nexus-cloud-activity.d.ts.map +1 -0
  16. package/dist/cloud/nexus-cloud-activity.js +79 -0
  17. package/dist/cloud/nexus-cloud-activity.js.map +1 -0
  18. package/dist/cloud/nexus-cloud-status.d.ts.map +1 -1
  19. package/dist/cloud/nexus-cloud-status.js +36 -0
  20. package/dist/cloud/nexus-cloud-status.js.map +1 -1
  21. package/dist/cloud/nexus-device.d.ts +1 -1
  22. package/dist/cloud/nexus-enrol.d.ts.map +1 -1
  23. package/dist/cloud/nexus-enrol.js +5 -0
  24. package/dist/cloud/nexus-enrol.js.map +1 -1
  25. package/dist/cloud/nexus-home.d.ts +74 -0
  26. package/dist/cloud/nexus-home.d.ts.map +1 -0
  27. package/dist/cloud/nexus-home.js +97 -0
  28. package/dist/cloud/nexus-home.js.map +1 -0
  29. package/dist/cloud/nexus-vault-keys.d.ts +129 -0
  30. package/dist/cloud/nexus-vault-keys.d.ts.map +1 -0
  31. package/dist/cloud/nexus-vault-keys.js +277 -0
  32. package/dist/cloud/nexus-vault-keys.js.map +1 -0
  33. package/dist/cloud/nexus-vault-state.d.ts +121 -0
  34. package/dist/cloud/nexus-vault-state.d.ts.map +1 -0
  35. package/dist/cloud/nexus-vault-state.js +274 -0
  36. package/dist/cloud/nexus-vault-state.js.map +1 -0
  37. package/dist/cloud/nexus-vault.d.ts +160 -0
  38. package/dist/cloud/nexus-vault.d.ts.map +1 -0
  39. package/dist/cloud/nexus-vault.js +1733 -0
  40. package/dist/cloud/nexus-vault.js.map +1 -0
  41. package/dist/cloud/signing.d.ts +24 -8
  42. package/dist/cloud/signing.d.ts.map +1 -1
  43. package/dist/cloud/signing.js +61 -15
  44. package/dist/cloud/signing.js.map +1 -1
  45. package/dist/docs/export-document.js +8137 -3318
  46. package/dist/docs/export-document.js.map +3 -3
  47. package/dist/doctor/migrations.d.ts +75 -0
  48. package/dist/doctor/migrations.d.ts.map +1 -0
  49. package/dist/doctor/migrations.js +136 -0
  50. package/dist/doctor/migrations.js.map +1 -0
  51. package/dist/doctor/sync-sealer.d.ts +48 -0
  52. package/dist/doctor/sync-sealer.d.ts.map +1 -0
  53. package/dist/doctor/sync-sealer.js +109 -0
  54. package/dist/doctor/sync-sealer.js.map +1 -0
  55. package/dist/doctor/sync-triggers.d.ts +53 -0
  56. package/dist/doctor/sync-triggers.d.ts.map +1 -0
  57. package/dist/doctor/sync-triggers.js +157 -0
  58. package/dist/doctor/sync-triggers.js.map +1 -0
  59. package/dist/init.d.ts.map +1 -1
  60. package/dist/init.js +5 -1
  61. package/dist/init.js.map +1 -1
  62. package/dist/internal.d.ts +1 -1
  63. package/dist/internal.d.ts.map +1 -1
  64. package/dist/internal.js +1 -1
  65. package/dist/internal.js.map +1 -1
  66. package/dist/llm/plugin-facade.js +8442 -3623
  67. package/dist/llm/plugin-facade.js.map +3 -3
  68. package/dist/nexus/projects-clean.d.ts +3 -0
  69. package/dist/nexus/projects-clean.d.ts.map +1 -1
  70. package/dist/nexus/projects-clean.js +9 -3
  71. package/dist/nexus/projects-clean.js.map +1 -1
  72. package/dist/nexus/registry-roots.d.ts +3 -1
  73. package/dist/nexus/registry-roots.d.ts.map +1 -1
  74. package/dist/nexus/registry-roots.js +5 -2
  75. package/dist/nexus/registry-roots.js.map +1 -1
  76. package/dist/nexus/registry.d.ts +8 -1
  77. package/dist/nexus/registry.d.ts.map +1 -1
  78. package/dist/nexus/registry.js +24 -10
  79. package/dist/nexus/registry.js.map +1 -1
  80. package/dist/nexus/workspace.d.ts +4 -1
  81. package/dist/nexus/workspace.d.ts.map +1 -1
  82. package/dist/nexus/workspace.js +10 -4
  83. package/dist/nexus/workspace.js.map +1 -1
  84. package/dist/orchestrate/spawn-ops.d.ts.map +1 -1
  85. package/dist/orchestrate/spawn-ops.js +7 -2
  86. package/dist/orchestrate/spawn-ops.js.map +1 -1
  87. package/dist/orchestrate/worker-verify.d.ts +121 -12
  88. package/dist/orchestrate/worker-verify.d.ts.map +1 -1
  89. package/dist/orchestrate/worker-verify.js +172 -21
  90. package/dist/orchestrate/worker-verify.js.map +1 -1
  91. package/dist/orchestration/spawn-prompt.d.ts.map +1 -1
  92. package/dist/orchestration/spawn-prompt.js +15 -9
  93. package/dist/orchestration/spawn-prompt.js.map +1 -1
  94. package/dist/release/ci-evidence.d.ts +9 -0
  95. package/dist/release/ci-evidence.d.ts.map +1 -1
  96. package/dist/release/ci-evidence.js +9 -2
  97. package/dist/release/ci-evidence.js.map +1 -1
  98. package/dist/resources/backend.d.ts +15 -3
  99. package/dist/resources/backend.d.ts.map +1 -1
  100. package/dist/resources/backend.js +7 -3
  101. package/dist/resources/backend.js.map +1 -1
  102. package/dist/resources/darwin-backend.d.ts +142 -0
  103. package/dist/resources/darwin-backend.d.ts.map +1 -0
  104. package/dist/resources/darwin-backend.js +288 -0
  105. package/dist/resources/darwin-backend.js.map +1 -0
  106. package/dist/resources/governor.d.ts +44 -1
  107. package/dist/resources/governor.d.ts.map +1 -1
  108. package/dist/resources/governor.js +100 -36
  109. package/dist/resources/governor.js.map +1 -1
  110. package/dist/resources/heavy-command.d.ts +132 -0
  111. package/dist/resources/heavy-command.d.ts.map +1 -0
  112. package/dist/resources/heavy-command.js +768 -0
  113. package/dist/resources/heavy-command.js.map +1 -0
  114. package/dist/resources/monitor.d.ts +50 -1
  115. package/dist/resources/monitor.d.ts.map +1 -1
  116. package/dist/resources/monitor.js +83 -1
  117. package/dist/resources/monitor.js.map +1 -1
  118. package/dist/resources/run-admission.d.ts +303 -0
  119. package/dist/resources/run-admission.d.ts.map +1 -0
  120. package/dist/resources/run-admission.js +648 -0
  121. package/dist/resources/run-admission.js.map +1 -0
  122. package/dist/resources/run-class.d.ts +111 -0
  123. package/dist/resources/run-class.d.ts.map +1 -0
  124. package/dist/resources/run-class.js +658 -0
  125. package/dist/resources/run-class.js.map +1 -0
  126. package/dist/resources/run-governed.d.ts +158 -0
  127. package/dist/resources/run-governed.d.ts.map +1 -0
  128. package/dist/resources/run-governed.js +406 -0
  129. package/dist/resources/run-governed.js.map +1 -0
  130. package/dist/resources/slot-holder.d.ts +267 -0
  131. package/dist/resources/slot-holder.d.ts.map +1 -0
  132. package/dist/resources/slot-holder.js +505 -0
  133. package/dist/resources/slot-holder.js.map +1 -0
  134. package/dist/resources/tool-groups.d.ts +74 -0
  135. package/dist/resources/tool-groups.d.ts.map +1 -0
  136. package/dist/resources/tool-groups.js +118 -0
  137. package/dist/resources/tool-groups.js.map +1 -0
  138. package/dist/routing/build-command-groups.d.ts.map +1 -1
  139. package/dist/routing/build-command-groups.js +1 -0
  140. package/dist/routing/build-command-groups.js.map +1 -1
  141. package/dist/selfimprove/fix-gen.js +8446 -3627
  142. package/dist/selfimprove/fix-gen.js.map +3 -3
  143. package/dist/sentient/cross-project-hygiene.d.ts +3 -2
  144. package/dist/sentient/cross-project-hygiene.d.ts.map +1 -1
  145. package/dist/sentient/cross-project-hygiene.js +5 -2
  146. package/dist/sentient/cross-project-hygiene.js.map +1 -1
  147. package/dist/sentient/state.d.ts +7 -0
  148. package/dist/sentient/state.d.ts.map +1 -1
  149. package/dist/sentient/state.js.map +1 -1
  150. package/dist/sentient/tick.d.ts +14 -2
  151. package/dist/sentient/tick.d.ts.map +1 -1
  152. package/dist/sentient/tick.js +63 -4
  153. package/dist/sentient/tick.js.map +1 -1
  154. package/dist/store/backup-recover.d.ts.map +1 -1
  155. package/dist/store/backup-recover.js +5 -0
  156. package/dist/store/backup-recover.js.map +1 -1
  157. package/dist/store/data-accessor.d.ts +1 -0
  158. package/dist/store/data-accessor.d.ts.map +1 -1
  159. package/dist/store/data-accessor.js +7 -0
  160. package/dist/store/data-accessor.js.map +1 -1
  161. package/dist/store/dual-scope-db.d.ts +23 -1
  162. package/dist/store/dual-scope-db.d.ts.map +1 -1
  163. package/dist/store/dual-scope-db.js +126 -36
  164. package/dist/store/dual-scope-db.js.map +1 -1
  165. package/dist/store/exodus/recovery.d.ts.map +1 -1
  166. package/dist/store/exodus/recovery.js +15 -0
  167. package/dist/store/exodus/recovery.js.map +1 -1
  168. package/dist/store/legacy-tasks-lineage.d.ts.map +1 -1
  169. package/dist/store/legacy-tasks-lineage.js +5 -0
  170. package/dist/store/legacy-tasks-lineage.js.map +1 -1
  171. package/dist/store/lock.d.ts +8 -1
  172. package/dist/store/lock.d.ts.map +1 -1
  173. package/dist/store/lock.js +10 -2
  174. package/dist/store/lock.js.map +1 -1
  175. package/dist/store/migration-manager.d.ts +5 -0
  176. package/dist/store/migration-manager.d.ts.map +1 -1
  177. package/dist/store/migration-manager.js +11 -0
  178. package/dist/store/migration-manager.js.map +1 -1
  179. package/dist/store/migration-runner.d.ts +158 -0
  180. package/dist/store/migration-runner.d.ts.map +1 -0
  181. package/dist/store/migration-runner.js +493 -0
  182. package/dist/store/migration-runner.js.map +1 -0
  183. package/dist/store/portable-bundle-import.d.ts +15 -1
  184. package/dist/store/portable-bundle-import.d.ts.map +1 -1
  185. package/dist/store/portable-bundle-import.js +24 -4
  186. package/dist/store/portable-bundle-import.js.map +1 -1
  187. package/dist/store/portable-bundle-relocate.d.ts +43 -0
  188. package/dist/store/portable-bundle-relocate.d.ts.map +1 -1
  189. package/dist/store/portable-bundle-relocate.js +79 -5
  190. package/dist/store/portable-bundle-relocate.js.map +1 -1
  191. package/dist/store/portable-bundle-scan.d.ts +20 -0
  192. package/dist/store/portable-bundle-scan.d.ts.map +1 -1
  193. package/dist/store/portable-bundle-scan.js +38 -3
  194. package/dist/store/portable-bundle-scan.js.map +1 -1
  195. package/dist/store/portable-bundle.d.ts +33 -0
  196. package/dist/store/portable-bundle.d.ts.map +1 -1
  197. package/dist/store/portable-bundle.js +34 -7
  198. package/dist/store/portable-bundle.js.map +1 -1
  199. package/dist/store/row-identity-registry.d.ts +137 -7
  200. package/dist/store/row-identity-registry.d.ts.map +1 -1
  201. package/dist/store/row-identity-registry.js +364 -9
  202. package/dist/store/row-identity-registry.js.map +1 -1
  203. package/dist/store/row-identity.d.ts.map +1 -1
  204. package/dist/store/row-identity.js +9 -10
  205. package/dist/store/row-identity.js.map +1 -1
  206. package/dist/store/sqlite-data-accessor.d.ts.map +1 -1
  207. package/dist/store/sqlite-data-accessor.js +10 -0
  208. package/dist/store/sqlite-data-accessor.js.map +1 -1
  209. package/dist/store/sqlite.d.ts +31 -0
  210. package/dist/store/sqlite.d.ts.map +1 -1
  211. package/dist/store/sqlite.js +5 -1
  212. package/dist/store/sqlite.js.map +1 -1
  213. package/dist/store/sync/capture.d.ts +203 -0
  214. package/dist/store/sync/capture.d.ts.map +1 -0
  215. package/dist/store/sync/capture.js +562 -0
  216. package/dist/store/sync/capture.js.map +1 -0
  217. package/dist/store/sync/clock-store.d.ts.map +1 -1
  218. package/dist/store/sync/clock-store.js +2 -0
  219. package/dist/store/sync/clock-store.js.map +1 -1
  220. package/dist/store/sync/fk-orphans.d.ts +133 -0
  221. package/dist/store/sync/fk-orphans.d.ts.map +1 -0
  222. package/dist/store/sync/fk-orphans.js +265 -0
  223. package/dist/store/sync/fk-orphans.js.map +1 -0
  224. package/dist/store/sync/flags.d.ts +7 -0
  225. package/dist/store/sync/flags.d.ts.map +1 -1
  226. package/dist/store/sync/flags.js +16 -0
  227. package/dist/store/sync/flags.js.map +1 -1
  228. package/dist/store/sync/hlc.d.ts.map +1 -1
  229. package/dist/store/sync/hlc.js +4 -0
  230. package/dist/store/sync/hlc.js.map +1 -1
  231. package/dist/store/sync/identity-fill.d.ts +45 -0
  232. package/dist/store/sync/identity-fill.d.ts.map +1 -0
  233. package/dist/store/sync/identity-fill.js +85 -0
  234. package/dist/store/sync/identity-fill.js.map +1 -0
  235. package/dist/store/sync/machinery.d.ts +27 -0
  236. package/dist/store/sync/machinery.d.ts.map +1 -0
  237. package/dist/store/sync/machinery.js +44 -0
  238. package/dist/store/sync/machinery.js.map +1 -0
  239. package/dist/store/sync/netting.d.ts +120 -0
  240. package/dist/store/sync/netting.d.ts.map +1 -0
  241. package/dist/store/sync/netting.js +336 -0
  242. package/dist/store/sync/netting.js.map +1 -0
  243. package/dist/store/sync/replica.d.ts +27 -2
  244. package/dist/store/sync/replica.d.ts.map +1 -1
  245. package/dist/store/sync/replica.js +47 -3
  246. package/dist/store/sync/replica.js.map +1 -1
  247. package/dist/store/sync/schema.d.ts +12 -0
  248. package/dist/store/sync/schema.d.ts.map +1 -1
  249. package/dist/store/sync/schema.js +21 -0
  250. package/dist/store/sync/schema.js.map +1 -1
  251. package/dist/store/sync/seal-backlog.d.ts +21 -0
  252. package/dist/store/sync/seal-backlog.d.ts.map +1 -0
  253. package/dist/store/sync/seal-backlog.js +24 -0
  254. package/dist/store/sync/seal-backlog.js.map +1 -0
  255. package/dist/store/sync/sealer-values.d.ts +34 -0
  256. package/dist/store/sync/sealer-values.d.ts.map +1 -0
  257. package/dist/store/sync/sealer-values.js +53 -0
  258. package/dist/store/sync/sealer-values.js.map +1 -0
  259. package/dist/store/sync/sealer.d.ts +145 -0
  260. package/dist/store/sync/sealer.d.ts.map +1 -0
  261. package/dist/store/sync/sealer.js +906 -0
  262. package/dist/store/sync/sealer.js.map +1 -0
  263. package/dist/store/sync/structural.d.ts +63 -0
  264. package/dist/store/sync/structural.d.ts.map +1 -0
  265. package/dist/store/sync/structural.js +180 -0
  266. package/dist/store/sync/structural.js.map +1 -0
  267. package/dist/store/sync/timestamps.d.ts +92 -0
  268. package/dist/store/sync/timestamps.d.ts.map +1 -0
  269. package/dist/store/sync/timestamps.js +228 -0
  270. package/dist/store/sync/timestamps.js.map +1 -0
  271. package/dist/store/sync/tombstones.d.ts +75 -0
  272. package/dist/store/sync/tombstones.d.ts.map +1 -0
  273. package/dist/store/sync/tombstones.js +103 -0
  274. package/dist/store/sync/tombstones.js.map +1 -0
  275. package/dist/store/sync/trigger-classes.d.ts +221 -0
  276. package/dist/store/sync/trigger-classes.d.ts.map +1 -0
  277. package/dist/store/sync/trigger-classes.js +441 -0
  278. package/dist/store/sync/trigger-classes.js.map +1 -0
  279. package/dist/store/sync/trigger-suspend-at-path.d.ts +23 -0
  280. package/dist/store/sync/trigger-suspend-at-path.d.ts.map +1 -0
  281. package/dist/store/sync/trigger-suspend-at-path.js +44 -0
  282. package/dist/store/sync/trigger-suspend-at-path.js.map +1 -0
  283. package/dist/store/sync/writer-version.d.ts +43 -0
  284. package/dist/store/sync/writer-version.d.ts.map +1 -0
  285. package/dist/store/sync/writer-version.js +90 -0
  286. package/dist/store/sync/writer-version.js.map +1 -0
  287. package/dist/store/table-classification.d.ts.map +1 -1
  288. package/dist/store/table-classification.js +102 -0
  289. package/dist/store/table-classification.js.map +1 -1
  290. package/dist/store/trigger-suspend-schema.d.ts +44 -0
  291. package/dist/store/trigger-suspend-schema.d.ts.map +1 -0
  292. package/dist/store/trigger-suspend-schema.js +25 -0
  293. package/dist/store/trigger-suspend-schema.js.map +1 -0
  294. package/dist/store/vault-manifest.d.ts +365 -0
  295. package/dist/store/vault-manifest.d.ts.map +1 -0
  296. package/dist/store/vault-manifest.js +812 -0
  297. package/dist/store/vault-manifest.js.map +1 -0
  298. package/dist/store/writer-lease.d.ts +31 -0
  299. package/dist/store/writer-lease.d.ts.map +1 -1
  300. package/dist/store/writer-lease.js +65 -2
  301. package/dist/store/writer-lease.js.map +1 -1
  302. package/dist/system/health.d.ts.map +1 -1
  303. package/dist/system/health.js +21 -0
  304. package/dist/system/health.js.map +1 -1
  305. package/dist/system/project-health.d.ts.map +1 -1
  306. package/dist/system/project-health.js +3 -1
  307. package/dist/system/project-health.js.map +1 -1
  308. package/dist/tasks/affected-packages.d.ts +58 -0
  309. package/dist/tasks/affected-packages.d.ts.map +1 -1
  310. package/dist/tasks/affected-packages.js +75 -6
  311. package/dist/tasks/affected-packages.js.map +1 -1
  312. package/dist/tasks/affected-scope.d.ts +150 -23
  313. package/dist/tasks/affected-scope.d.ts.map +1 -1
  314. package/dist/tasks/affected-scope.js +320 -32
  315. package/dist/tasks/affected-scope.js.map +1 -1
  316. package/dist/tasks/change-set.d.ts +96 -0
  317. package/dist/tasks/change-set.d.ts.map +1 -1
  318. package/dist/tasks/change-set.js +169 -4
  319. package/dist/tasks/change-set.js.map +1 -1
  320. package/dist/tasks/complete-ci.d.ts +115 -0
  321. package/dist/tasks/complete-ci.d.ts.map +1 -0
  322. package/dist/tasks/complete-ci.js +171 -0
  323. package/dist/tasks/complete-ci.js.map +1 -0
  324. package/dist/tasks/complete.d.ts.map +1 -1
  325. package/dist/tasks/complete.js +50 -17
  326. package/dist/tasks/complete.js.map +1 -1
  327. package/dist/tasks/compute-task-view.d.ts.map +1 -1
  328. package/dist/tasks/compute-task-view.js +7 -0
  329. package/dist/tasks/compute-task-view.js.map +1 -1
  330. package/dist/tasks/done-plan.d.ts.map +1 -1
  331. package/dist/tasks/done-plan.js +51 -30
  332. package/dist/tasks/done-plan.js.map +1 -1
  333. package/dist/tasks/done-record.d.ts +6 -0
  334. package/dist/tasks/done-record.d.ts.map +1 -1
  335. package/dist/tasks/done-record.js +9 -3
  336. package/dist/tasks/done-record.js.map +1 -1
  337. package/dist/tasks/evidence.d.ts +3 -2
  338. package/dist/tasks/evidence.d.ts.map +1 -1
  339. package/dist/tasks/evidence.js +143 -12
  340. package/dist/tasks/evidence.js.map +1 -1
  341. package/dist/tasks/gate-notes.d.ts +22 -0
  342. package/dist/tasks/gate-notes.d.ts.map +1 -0
  343. package/dist/tasks/gate-notes.js +33 -0
  344. package/dist/tasks/gate-notes.js.map +1 -0
  345. package/dist/tasks/index.d.ts +2 -1
  346. package/dist/tasks/index.d.ts.map +1 -1
  347. package/dist/tasks/index.js +2 -1
  348. package/dist/tasks/index.js.map +1 -1
  349. package/dist/tasks/test-run-binding.d.ts +117 -0
  350. package/dist/tasks/test-run-binding.d.ts.map +1 -0
  351. package/dist/tasks/test-run-binding.js +365 -0
  352. package/dist/tasks/test-run-binding.js.map +1 -0
  353. package/dist/tasks/tool-cache-env.d.ts +123 -0
  354. package/dist/tasks/tool-cache-env.d.ts.map +1 -0
  355. package/dist/tasks/tool-cache-env.js +287 -0
  356. package/dist/tasks/tool-cache-env.js.map +1 -0
  357. package/dist/tasks/tool-cache-failed-first.d.ts +155 -0
  358. package/dist/tasks/tool-cache-failed-first.d.ts.map +1 -0
  359. package/dist/tasks/tool-cache-failed-first.js +285 -0
  360. package/dist/tasks/tool-cache-failed-first.js.map +1 -0
  361. package/dist/tasks/tool-cache.d.ts +375 -55
  362. package/dist/tasks/tool-cache.d.ts.map +1 -1
  363. package/dist/tasks/tool-cache.js +912 -303
  364. package/dist/tasks/tool-cache.js.map +1 -1
  365. package/dist/tasks/tool-resolver.d.ts +4 -3
  366. package/dist/tasks/tool-resolver.d.ts.map +1 -1
  367. package/dist/tasks/tool-resolver.js +15 -4
  368. package/dist/tasks/tool-resolver.js.map +1 -1
  369. package/dist/tasks/tool-semaphore.d.ts +67 -7
  370. package/dist/tasks/tool-semaphore.d.ts.map +1 -1
  371. package/dist/tasks/tool-semaphore.js +134 -56
  372. package/dist/tasks/tool-semaphore.js.map +1 -1
  373. package/dist/upgrade.d.ts.map +1 -1
  374. package/dist/upgrade.js +4 -0
  375. package/dist/upgrade.js.map +1 -1
  376. package/dist/validation/engine-ops.d.ts +6 -0
  377. package/dist/validation/engine-ops.d.ts.map +1 -1
  378. package/dist/validation/engine-ops.js +8 -0
  379. package/dist/validation/engine-ops.js.map +1 -1
  380. package/migrations/drizzle-cleo-project/20260930170000_t12819-trigger-suspend-clause/migration.sql +367 -0
  381. package/migrations/sync-journal/20260930120000_t12343-capture/migration.sql +47 -0
  382. package/migrations/sync-journal/20261001170000_t12984-sealer/migration.sql +101 -0
  383. package/package.json +13 -13
  384. package/templates/CLEO-INJECTION.md +5 -5
  385. package/templates/CLEO-REFERENCE.md +8 -4
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Environment fingerprint for the evidence tool cache (T12958, review of #1774).
3
+ *
4
+ * The tree hash identifies the SOURCE a run measured. Tools that read build
5
+ * output or installed dependencies also depend on per-checkout state git does
6
+ * not see: `node_modules`, gitignored `dist/` directories that workspace
7
+ * packages resolve through, and `.env*` files. Two worktrees with identical
8
+ * source but a stale `dist/` in one of them must not share a `test` result.
9
+ *
10
+ * The fingerprint is cheap and content-shaped, so two checkouts that were
11
+ * installed and built from the same source compare EQUAL (sharing works) while
12
+ * a missing install, a different install or a stale build compares different:
13
+ *
14
+ * - the installed-lockfile snapshot the package manager keeps inside
15
+ * `node_modules` (`.pnpm/lock.yaml`, `.package-lock.json`,
16
+ * `.yarn-state.yml`, `.yarn-integrity`) — hashed by content, because
17
+ * pnpm's `.modules.yaml` carries a per-install timestamp;
18
+ * - for every workspace package (each tracked `package.json`), the
19
+ * relative path and SIZE of every file under its `dist/` — sizes rather
20
+ * than mtimes, which differ between two equally fresh builds;
21
+ * - the content of untracked `.env*` files at the execution root.
22
+ *
23
+ * Sizes are a heuristic: a rebuild from different source that produces
24
+ * byte-for-byte equal sizes everywhere would collide. When the `dist/` walk
25
+ * exceeds {@link MAX_DIST_FILES} the fingerprint falls back to the execution
26
+ * root itself, which disables cross-worktree sharing rather than guessing.
27
+ *
28
+ * Only {@link ENV_SENSITIVE_TOOLS} pay for this; other tools get a constant.
29
+ *
30
+ * ## Resource environment (T12989)
31
+ *
32
+ * {@link captureResourceEnv} is a second, separate key input: the resource
33
+ * limits the run is spawned with. A run that fits in a 6 GB heap and one that
34
+ * does not fit in 3 GB are different runs of the same code, and keying only on
35
+ * source and installed state let a retry with a larger heap replay the cached
36
+ * 3 GB result (axiom field report, T963). It covers only what decides whether a
37
+ * run fits, never the whole environment, so an unrelated variable or
38
+ * `NODE_OPTIONS` flag never moves the key:
39
+ *
40
+ * - the V8 heap flags in `NODE_OPTIONS` ({@link effectiveHeapFlags}), for
41
+ * every tool, because every Node process a tool starts inherits them;
42
+ * - for heavy tools, every variable `heavyToolEnv` manages (the per-runner
43
+ * worker counts, `npm_config_workspace_concurrency`, `MAKEFLAGS`) and the
44
+ * cgroup ceiling overrides (`CLEO_TOOL_MEMORY_MAX_MB`, `CLEO_NO_TOOL_CGROUP`).
45
+ *
46
+ * The heavy variable list is derived from `heavyToolEnv` itself, so a lever
47
+ * added there is keyed with no second list to keep in step.
48
+ *
49
+ * @task T12958
50
+ * @task T12989
51
+ */
52
+ import { type HeavyToolEnv } from './heavy-tool-env.js';
53
+ import type { CanonicalTool } from './tool-resolver.js';
54
+ /** Canonical tools whose result depends on installed deps or build output. */
55
+ export declare const ENV_SENSITIVE_TOOLS: ReadonlySet<string>;
56
+ /** Fingerprint for tools that read only source. */
57
+ export declare const ENV_FINGERPRINT_NONE = "none";
58
+ /** Most `dist/` files walked before falling back to the execution root. */
59
+ export declare const MAX_DIST_FILES = 100000;
60
+ /**
61
+ * Fingerprint the per-checkout environment a tool run depends on.
62
+ *
63
+ * @param root - The execution root.
64
+ * @param canonical - Canonical tool name.
65
+ * @returns 32 hex chars, or {@link ENV_FINGERPRINT_NONE} for tools outside
66
+ * {@link ENV_SENSITIVE_TOOLS}.
67
+ *
68
+ * @task T12958
69
+ */
70
+ export declare function captureEnvFingerprint(root: string, canonical: string): string;
71
+ /**
72
+ * The V8 heap flags in effect for a `NODE_OPTIONS` value, as `--name=value`
73
+ * sorted by name and joined with a space; `''` when none is set.
74
+ *
75
+ * V8 reads flags left to right and a later value replaces an earlier one, so
76
+ * the LAST occurrence of each flag is the effective one. Underscores in a flag
77
+ * name read as dashes, as they do to V8. The space-separated spelling
78
+ * (`--max-old-space-size 4096`) is read too, because `mergeNodeOptions` treats
79
+ * it as an explicit setting.
80
+ *
81
+ * @param nodeOptions - A `NODE_OPTIONS` value, if any.
82
+ * @returns The effective heap flags, e.g. `--max-old-space-size=6144`.
83
+ *
84
+ * @example
85
+ * ```ts
86
+ * effectiveHeapFlags('--enable-source-maps --max-old-space-size=3072 --max_old_space_size=6144');
87
+ * // → '--max-old-space-size=6144'
88
+ * effectiveHeapFlags('--enable-source-maps'); // → ''
89
+ * ```
90
+ *
91
+ * @task T12989
92
+ */
93
+ export declare function effectiveHeapFlags(nodeOptions: string | undefined): string;
94
+ /**
95
+ * The resource limits a tool run is spawned with, as readable `NAME=value`
96
+ * pairs sorted by name and joined with `;` (T12989). Part of the tool-cache key
97
+ * and recorded on the entry, so a cached result says which heap and worker
98
+ * count produced it, and a retry with different limits is a different run.
99
+ *
100
+ * Reads the EFFECTIVE environment — `env` with the heavy-tool `overlay`
101
+ * applied, exactly as `spawnCmd` merges it — so a limit the caller exported
102
+ * and one `heavyToolEnv` supplied key the same way. Covers:
103
+ *
104
+ * - `NODE_OPTIONS`, reduced to its heap flags ({@link effectiveHeapFlags}),
105
+ * for every tool;
106
+ * - for heavy tools only, every variable `heavyToolEnv` can set (derived by
107
+ * asking it what it sets for an empty environment) plus the cgroup
108
+ * ceiling overrides `CLEO_TOOL_MEMORY_MAX_MB` and `CLEO_NO_TOOL_CGROUP`.
109
+ *
110
+ * A variable outside this set does not move the key; force a fresh run with
111
+ * `CLEO_EVIDENCE_FRESH=1` when one matters.
112
+ *
113
+ * @param canonical - Canonical tool name.
114
+ * @param env - The environment the child inherits.
115
+ * @param overlay - The heavy-tool overlay the child is spawned with; defaults
116
+ * to `heavyToolEnv(canonical, env)`. `runToolCached` passes the overlay it
117
+ * spawns with, so the key and the spawn read one value.
118
+ * @returns e.g. `NODE_OPTIONS=--max-old-space-size=4096;VITEST_MAX_WORKERS=6;…`
119
+ *
120
+ * @task T12989
121
+ */
122
+ export declare function captureResourceEnv(canonical: CanonicalTool, env?: NodeJS.ProcessEnv, overlay?: HeavyToolEnv): string;
123
+ //# sourceMappingURL=tool-cache-env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-cache-env.d.ts","sourceRoot":"","sources":["../../src/tasks/tool-cache-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAMH,OAAO,EAAE,KAAK,YAAY,EAA6B,MAAM,qBAAqB,CAAC;AAEnF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,8EAA8E;AAC9E,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAA2C,CAAC;AAEhG,mDAAmD;AACnD,eAAO,MAAM,oBAAoB,SAAS,CAAC;AAE3C,2EAA2E;AAC3E,eAAO,MAAM,cAAc,SAAU,CAAC;AAqDtC;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAsC7E;AAiBD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAqB1E;AAkBD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,aAAa,EACxB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,OAAO,GAAE,YAA2C,GACnD,MAAM,CAYR"}
@@ -0,0 +1,287 @@
1
+ /**
2
+ * Environment fingerprint for the evidence tool cache (T12958, review of #1774).
3
+ *
4
+ * The tree hash identifies the SOURCE a run measured. Tools that read build
5
+ * output or installed dependencies also depend on per-checkout state git does
6
+ * not see: `node_modules`, gitignored `dist/` directories that workspace
7
+ * packages resolve through, and `.env*` files. Two worktrees with identical
8
+ * source but a stale `dist/` in one of them must not share a `test` result.
9
+ *
10
+ * The fingerprint is cheap and content-shaped, so two checkouts that were
11
+ * installed and built from the same source compare EQUAL (sharing works) while
12
+ * a missing install, a different install or a stale build compares different:
13
+ *
14
+ * - the installed-lockfile snapshot the package manager keeps inside
15
+ * `node_modules` (`.pnpm/lock.yaml`, `.package-lock.json`,
16
+ * `.yarn-state.yml`, `.yarn-integrity`) — hashed by content, because
17
+ * pnpm's `.modules.yaml` carries a per-install timestamp;
18
+ * - for every workspace package (each tracked `package.json`), the
19
+ * relative path and SIZE of every file under its `dist/` — sizes rather
20
+ * than mtimes, which differ between two equally fresh builds;
21
+ * - the content of untracked `.env*` files at the execution root.
22
+ *
23
+ * Sizes are a heuristic: a rebuild from different source that produces
24
+ * byte-for-byte equal sizes everywhere would collide. When the `dist/` walk
25
+ * exceeds {@link MAX_DIST_FILES} the fingerprint falls back to the execution
26
+ * root itself, which disables cross-worktree sharing rather than guessing.
27
+ *
28
+ * Only {@link ENV_SENSITIVE_TOOLS} pay for this; other tools get a constant.
29
+ *
30
+ * ## Resource environment (T12989)
31
+ *
32
+ * {@link captureResourceEnv} is a second, separate key input: the resource
33
+ * limits the run is spawned with. A run that fits in a 6 GB heap and one that
34
+ * does not fit in 3 GB are different runs of the same code, and keying only on
35
+ * source and installed state let a retry with a larger heap replay the cached
36
+ * 3 GB result (axiom field report, T963). It covers only what decides whether a
37
+ * run fits, never the whole environment, so an unrelated variable or
38
+ * `NODE_OPTIONS` flag never moves the key:
39
+ *
40
+ * - the V8 heap flags in `NODE_OPTIONS` ({@link effectiveHeapFlags}), for
41
+ * every tool, because every Node process a tool starts inherits them;
42
+ * - for heavy tools, every variable `heavyToolEnv` manages (the per-runner
43
+ * worker counts, `npm_config_workspace_concurrency`, `MAKEFLAGS`) and the
44
+ * cgroup ceiling overrides (`CLEO_TOOL_MEMORY_MAX_MB`, `CLEO_NO_TOOL_CGROUP`).
45
+ *
46
+ * The heavy variable list is derived from `heavyToolEnv` itself, so a lever
47
+ * added there is keyed with no second list to keep in step.
48
+ *
49
+ * @task T12958
50
+ * @task T12989
51
+ */
52
+ import { execFileSync } from 'node:child_process';
53
+ import { createHash } from 'node:crypto';
54
+ import { existsSync, lstatSync, readdirSync, readFileSync, realpathSync } from 'node:fs';
55
+ import { dirname, join } from 'node:path';
56
+ import { heavyToolEnv, isHeavyTool } from './heavy-tool-env.js';
57
+ import { DISABLE_ENV, MEMORY_MAX_ENV } from './heavy-tool-limit.js';
58
+ /** Canonical tools whose result depends on installed deps or build output. */
59
+ export const ENV_SENSITIVE_TOOLS = new Set(['test', 'build', 'typecheck']);
60
+ /** Fingerprint for tools that read only source. */
61
+ export const ENV_FINGERPRINT_NONE = 'none';
62
+ /** Most `dist/` files walked before falling back to the execution root. */
63
+ export const MAX_DIST_FILES = 100_000;
64
+ const INSTALL_SNAPSHOTS = [
65
+ 'node_modules/.pnpm/lock.yaml',
66
+ 'node_modules/.package-lock.json',
67
+ 'node_modules/.yarn-state.yml',
68
+ 'node_modules/.yarn-integrity',
69
+ ];
70
+ /** Directories of every tracked `package.json`, relative to `root`. */
71
+ function workspacePackageDirs(root) {
72
+ try {
73
+ const out = execFileSync('git', ['ls-files', '-z', '--', 'package.json', '**/package.json'], {
74
+ cwd: root,
75
+ encoding: 'utf-8',
76
+ stdio: ['ignore', 'pipe', 'ignore'],
77
+ maxBuffer: 16 * 1024 * 1024,
78
+ });
79
+ return out
80
+ .split('\0')
81
+ .filter(Boolean)
82
+ .map((f) => dirname(f))
83
+ .sort();
84
+ }
85
+ catch {
86
+ return ['.'];
87
+ }
88
+ }
89
+ /**
90
+ * Append `relpath:size` for every file under `dir` to `out`, without following
91
+ * symlinks. Returns `false` once `out` exceeds {@link MAX_DIST_FILES}.
92
+ */
93
+ function walkSizes(dir, rel, out) {
94
+ let names;
95
+ try {
96
+ names = readdirSync(dir).sort();
97
+ }
98
+ catch {
99
+ return true;
100
+ }
101
+ for (const name of names) {
102
+ const abs = join(dir, name);
103
+ const st = lstatSync(abs, { throwIfNoEntry: false });
104
+ if (!st)
105
+ continue;
106
+ if (st.isDirectory()) {
107
+ if (!walkSizes(abs, `${rel}/${name}`, out))
108
+ return false;
109
+ }
110
+ else {
111
+ out.push(`${rel}/${name}:${st.isSymbolicLink() ? 'link' : st.size}`);
112
+ if (out.length > MAX_DIST_FILES)
113
+ return false;
114
+ }
115
+ }
116
+ return true;
117
+ }
118
+ /**
119
+ * Fingerprint the per-checkout environment a tool run depends on.
120
+ *
121
+ * @param root - The execution root.
122
+ * @param canonical - Canonical tool name.
123
+ * @returns 32 hex chars, or {@link ENV_FINGERPRINT_NONE} for tools outside
124
+ * {@link ENV_SENSITIVE_TOOLS}.
125
+ *
126
+ * @task T12958
127
+ */
128
+ export function captureEnvFingerprint(root, canonical) {
129
+ if (!ENV_SENSITIVE_TOOLS.has(canonical))
130
+ return ENV_FINGERPRINT_NONE;
131
+ const hash = createHash('sha256');
132
+ const snapshot = INSTALL_SNAPSHOTS.find((p) => existsSync(join(root, p)));
133
+ hash.update(`install:${snapshot ?? 'none'}\n`);
134
+ if (snapshot)
135
+ hash.update(readFileSync(join(root, snapshot)));
136
+ const files = [];
137
+ for (const pkg of workspacePackageDirs(root)) {
138
+ if (!walkSizes(join(root, pkg, 'dist'), `${pkg}/dist`, files)) {
139
+ // Too large to fingerprint cheaply: do not share across checkouts.
140
+ let real = root;
141
+ try {
142
+ real = realpathSync(root);
143
+ }
144
+ catch {
145
+ // keep the lexical root
146
+ }
147
+ return createHash('sha256').update(`root:${real}`).digest('hex').slice(0, 32);
148
+ }
149
+ }
150
+ hash.update(files.join('\n'));
151
+ let entries = [];
152
+ try {
153
+ entries = readdirSync(root)
154
+ .filter((n) => n.startsWith('.env'))
155
+ .sort();
156
+ }
157
+ catch {
158
+ // unreadable root: no env files
159
+ }
160
+ for (const name of entries) {
161
+ const st = lstatSync(join(root, name), { throwIfNoEntry: false });
162
+ if (!st?.isFile())
163
+ continue;
164
+ hash.update(`\nenv:${name}\n`);
165
+ hash.update(readFileSync(join(root, name)));
166
+ }
167
+ return hash.digest('hex').slice(0, 32);
168
+ }
169
+ /**
170
+ * `NODE_OPTIONS` flags that set a V8 heap limit — the only part of
171
+ * `NODE_OPTIONS` that decides whether a run fits in memory. Every other flag
172
+ * (`--enable-source-maps`, `--experimental-*`, `--require`, …) is left out of
173
+ * the key: it does not change whether the run fits, and keying it would make
174
+ * every harness that sets one miss every other's results.
175
+ *
176
+ * @task T12989
177
+ */
178
+ const HEAP_FLAG_NAMES = new Set([
179
+ 'max-old-space-size',
180
+ 'max-old-space-size-percentage',
181
+ 'max-semi-space-size',
182
+ ]);
183
+ /**
184
+ * The V8 heap flags in effect for a `NODE_OPTIONS` value, as `--name=value`
185
+ * sorted by name and joined with a space; `''` when none is set.
186
+ *
187
+ * V8 reads flags left to right and a later value replaces an earlier one, so
188
+ * the LAST occurrence of each flag is the effective one. Underscores in a flag
189
+ * name read as dashes, as they do to V8. The space-separated spelling
190
+ * (`--max-old-space-size 4096`) is read too, because `mergeNodeOptions` treats
191
+ * it as an explicit setting.
192
+ *
193
+ * @param nodeOptions - A `NODE_OPTIONS` value, if any.
194
+ * @returns The effective heap flags, e.g. `--max-old-space-size=6144`.
195
+ *
196
+ * @example
197
+ * ```ts
198
+ * effectiveHeapFlags('--enable-source-maps --max-old-space-size=3072 --max_old_space_size=6144');
199
+ * // → '--max-old-space-size=6144'
200
+ * effectiveHeapFlags('--enable-source-maps'); // → ''
201
+ * ```
202
+ *
203
+ * @task T12989
204
+ */
205
+ export function effectiveHeapFlags(nodeOptions) {
206
+ const tokens = (nodeOptions ?? '').trim().split(/\s+/).filter(Boolean);
207
+ const values = new Map();
208
+ for (let i = 0; i < tokens.length; i++) {
209
+ const token = tokens[i] ?? '';
210
+ if (!token.startsWith('--'))
211
+ continue;
212
+ const eq = token.indexOf('=');
213
+ const name = (eq === -1 ? token.slice(2) : token.slice(2, eq)).replace(/_/g, '-');
214
+ if (!HEAP_FLAG_NAMES.has(name))
215
+ continue;
216
+ let value = eq === -1 ? '' : token.slice(eq + 1);
217
+ const next = tokens[i + 1];
218
+ if (eq === -1 && next !== undefined && /^\d+(\.\d+)?$/.test(next)) {
219
+ value = next;
220
+ i++;
221
+ }
222
+ values.set(name, value);
223
+ }
224
+ return [...values.keys()]
225
+ .sort()
226
+ .map((name) => `--${name}=${values.get(name)}`)
227
+ .join(' ');
228
+ }
229
+ /** The keyed form of one resource variable's value. */
230
+ function resourceValue(name, raw) {
231
+ const value = (raw ?? '').trim();
232
+ if (name === 'NODE_OPTIONS')
233
+ return effectiveHeapFlags(value);
234
+ // Inside a `make` recipe, MAKEFLAGS carries the parent's jobserver handle
235
+ // (`--jobserver-auth=fifo:/tmp/GMfifo<pid>`), which names the invocation,
236
+ // not a limit.
237
+ if (name === 'MAKEFLAGS') {
238
+ return value
239
+ .split(/\s+/)
240
+ .filter((t) => t !== '' && !t.startsWith('--jobserver-'))
241
+ .join(' ');
242
+ }
243
+ return value;
244
+ }
245
+ /**
246
+ * The resource limits a tool run is spawned with, as readable `NAME=value`
247
+ * pairs sorted by name and joined with `;` (T12989). Part of the tool-cache key
248
+ * and recorded on the entry, so a cached result says which heap and worker
249
+ * count produced it, and a retry with different limits is a different run.
250
+ *
251
+ * Reads the EFFECTIVE environment — `env` with the heavy-tool `overlay`
252
+ * applied, exactly as `spawnCmd` merges it — so a limit the caller exported
253
+ * and one `heavyToolEnv` supplied key the same way. Covers:
254
+ *
255
+ * - `NODE_OPTIONS`, reduced to its heap flags ({@link effectiveHeapFlags}),
256
+ * for every tool;
257
+ * - for heavy tools only, every variable `heavyToolEnv` can set (derived by
258
+ * asking it what it sets for an empty environment) plus the cgroup
259
+ * ceiling overrides `CLEO_TOOL_MEMORY_MAX_MB` and `CLEO_NO_TOOL_CGROUP`.
260
+ *
261
+ * A variable outside this set does not move the key; force a fresh run with
262
+ * `CLEO_EVIDENCE_FRESH=1` when one matters.
263
+ *
264
+ * @param canonical - Canonical tool name.
265
+ * @param env - The environment the child inherits.
266
+ * @param overlay - The heavy-tool overlay the child is spawned with; defaults
267
+ * to `heavyToolEnv(canonical, env)`. `runToolCached` passes the overlay it
268
+ * spawns with, so the key and the spawn read one value.
269
+ * @returns e.g. `NODE_OPTIONS=--max-old-space-size=4096;VITEST_MAX_WORKERS=6;…`
270
+ *
271
+ * @task T12989
272
+ */
273
+ export function captureResourceEnv(canonical, env = process.env, overlay = heavyToolEnv(canonical, env)) {
274
+ const effective = { ...env, ...overlay };
275
+ const names = new Set(['NODE_OPTIONS']);
276
+ if (isHeavyTool(canonical)) {
277
+ for (const name of Object.keys(heavyToolEnv(canonical, {})))
278
+ names.add(name);
279
+ names.add(MEMORY_MAX_ENV);
280
+ names.add(DISABLE_ENV);
281
+ }
282
+ return [...names]
283
+ .sort()
284
+ .map((name) => `${name}=${resourceValue(name, effective[name])}`)
285
+ .join(';');
286
+ }
287
+ //# sourceMappingURL=tool-cache-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-cache-env.js","sourceRoot":"","sources":["../../src/tasks/tool-cache-env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Failed-first reruns for `tool:test` (T12961).
3
+ *
4
+ * When a test run fails, the failing test FILES are parsed out of the runner's
5
+ * output and remembered per execution root. The next test run in that root —
6
+ * normally after an attempted fix, so on a different tree and a cache miss —
7
+ * runs only those files first:
8
+ *
9
+ * - still failing (with a parseable FAIL line) → the caller gets that red
10
+ * result at once and the full run is skipped. It is NOT cached under the
11
+ * full command's key — the suite did not run — and the pointer moves to
12
+ * the current tree, so the next run on this same tree runs the normal
13
+ * command, which decides;
14
+ * - passing, or no FAIL line (a startup crash) → the normal run (full or
15
+ * affected) proceeds as before.
16
+ *
17
+ * Everything here is best-effort and fails OPEN to today's behaviour: when the
18
+ * failing files cannot be parsed, resolved to tracked files, or mapped to a
19
+ * runnable vitest binary and config, no focused run is planned and the normal
20
+ * command runs unchanged. `CLEO_EVIDENCE_FRESH=1` skips failed-first. A
21
+ * focused run can only ever *shorten* a red result; it can never produce or
22
+ * cache a pass, because a pass always falls through to the normal command.
23
+ *
24
+ * The flake retry lives in `runToolCached`: a failing normal run is re-run in
25
+ * FULL once, never through a focused run.
26
+ *
27
+ * ## Why the default reporter's text, not a JSON reporter
28
+ *
29
+ * The resolved test command is the project's own (`pnpm run test`, a pinned
30
+ * `testing.command`, an affected-packages command). Injecting
31
+ * `--reporter=json --outputFile=…` into it would change the command — and
32
+ * therefore the cache key and the evidence identity — and does not compose
33
+ * with scripts that fan out (`pnpm -r test`). The `FAIL <file>` lines of the
34
+ * vitest and jest default reporters sit in the closing summary, which is
35
+ * exactly the part the 64 KiB stream tail retains.
36
+ *
37
+ * ## Why the pointer is keyed on (tool, execution root), not on the command
38
+ *
39
+ * A failing test file is a failing test file whichever command found it: a
40
+ * full run's failures are just as worth re-running first before an affected
41
+ * run, whose command (and therefore cache key) differs. Scoping by execution
42
+ * root keeps one agent's red files out of another worktree's runs. Even if
43
+ * they did cross, a focused failure is a genuine failure of THIS tree's tests.
44
+ *
45
+ * @task T12961
46
+ */
47
+ /** Canonical tools that record failing files and get failed-first reruns. */
48
+ export declare const FAILED_FIRST_TOOLS: ReadonlySet<string>;
49
+ /**
50
+ * Most failing files remembered. A larger red set means the tree is broadly
51
+ * broken; the full run is the right next step and the pointer is dropped.
52
+ */
53
+ export declare const MAX_FAILED_TEST_FILES = 100;
54
+ /** How a failed-first stage ended. */
55
+ export type FailedFirstOutcome = 'failed' | 'passed' | 'inconclusive';
56
+ /**
57
+ * Report of the failed-first stage of one run, attached to the result (and,
58
+ * when the focused run decided the result, to the cache entry).
59
+ *
60
+ * @task T12961
61
+ */
62
+ export interface FailedFirstReport {
63
+ /** Repo-relative test files that were run first. */
64
+ files: string[];
65
+ /** `failed` stops the run; `passed`/`inconclusive` continue to the normal command. */
66
+ outcome: FailedFirstOutcome;
67
+ }
68
+ /** The remembered failing files for one (tool, execution root). */
69
+ export interface FailedFirstPointer {
70
+ schemaVersion: 1;
71
+ canonical: string;
72
+ executionRoot: string;
73
+ /** Test files relative to `executionRoot`, forward slashes. */
74
+ files: string[];
75
+ /** Tree hash of the run that failed. */
76
+ treeHash: string | null;
77
+ capturedAt: string;
78
+ }
79
+ /** One focused vitest invocation. */
80
+ export interface FocusedRun {
81
+ /** Directory holding the vitest config the files belong to. */
82
+ cwd: string;
83
+ /** Absolute path of the vitest binary. */
84
+ cmd: string;
85
+ args: string[];
86
+ }
87
+ /**
88
+ * Raw `{base, file}` references to failing test files in runner output.
89
+ *
90
+ * @internal exported for tests
91
+ */
92
+ export declare function extractFailingTestRefs(output: string): Array<{
93
+ base: string | null;
94
+ file: string;
95
+ }>;
96
+ /**
97
+ * Parse the failing test files out of a run's output and resolve each to a
98
+ * path relative to `executionRoot`.
99
+ *
100
+ * A reported path is tried against the `pnpm -r` package prefix, the
101
+ * execution root itself, and `searchBase` (the cwd of a focused run). A path
102
+ * none of those resolve is looked up among tracked files by suffix and kept
103
+ * only when exactly one matches. Unresolvable references are dropped; an empty
104
+ * result means "unknown" and disables failed-first for the next run.
105
+ *
106
+ * @param output - stdout and stderr of the run (ANSI allowed).
107
+ * @param executionRoot - Tree the run executed in.
108
+ * @param trackedFiles - Lazily supplied tracked-file list for suffix lookup.
109
+ * @param searchBase - Extra directory paths may be relative to.
110
+ * @returns Sorted, de-duplicated repo-relative paths; `[]` when unknown or
111
+ * when more than {@link MAX_FAILED_TEST_FILES} failed.
112
+ *
113
+ * @task T12961
114
+ */
115
+ export declare function parseFailingTestFiles(output: string, executionRoot: string, trackedFiles?: () => readonly string[], searchBase?: string): string[];
116
+ /** `true` when vitest reported that the filters matched no test file. */
117
+ export declare function reportsNoTestFiles(output: string): boolean;
118
+ /**
119
+ * Plan the focused invocations that re-run `files` in `executionRoot`.
120
+ *
121
+ * Each file runs under the vitest config nearest to it — the same config a
122
+ * `cd <package> && vitest run <file>` would use — with the nearest
123
+ * `node_modules/.bin/vitest`. Files are grouped per config directory.
124
+ *
125
+ * @returns The runs, or `null` when any file is gone or has no vitest config
126
+ * or binary (failed-first is then skipped; the normal command runs).
127
+ *
128
+ * @task T12961
129
+ */
130
+ export declare function planFocusedRuns(files: readonly string[], executionRoot: string): FocusedRun[] | null;
131
+ /**
132
+ * Path of the failed-first pointer for one (tool, execution root). Lives in
133
+ * the evidence cache directory, so `clearToolCache` removes it too.
134
+ *
135
+ * @param storeRoot - CLEO store root holding `.cleo/cache/evidence/`.
136
+ * @param canonical - Canonical tool name.
137
+ * @param executionRoot - Normalised execution root.
138
+ *
139
+ * @task T12961
140
+ */
141
+ export declare function failedFirstPointerPath(storeRoot: string, canonical: string, executionRoot: string): string;
142
+ /**
143
+ * Read the failed-first pointer, or `null` when absent or malformed.
144
+ *
145
+ * @task T12961
146
+ */
147
+ export declare function readFailedFirstPointer(storeRoot: string, canonical: string, executionRoot: string): FailedFirstPointer | null;
148
+ /**
149
+ * Remember `files` as the failing set, or forget it when `files` is empty.
150
+ * The cache directory must already exist.
151
+ *
152
+ * @task T12961
153
+ */
154
+ export declare function writeFailedFirstPointer(storeRoot: string, canonical: string, executionRoot: string, files: readonly string[], treeHash: string | null): void;
155
+ //# sourceMappingURL=tool-cache-failed-first.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-cache-failed-first.d.ts","sourceRoot":"","sources":["../../src/tasks/tool-cache-failed-first.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAMH,6EAA6E;AAC7E,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAAqB,CAAC;AAEzE;;;GAGG;AACH,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC,sCAAsC;AACtC,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,QAAQ,GAAG,cAAc,CAAC;AAEtE;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,oDAAoD;IACpD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,sFAAsF;IACtF,OAAO,EAAE,kBAAkB,CAAC;CAC7B;AAED,mEAAmE;AACnE,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,CAAC,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,wCAAwC;IACxC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qCAAqC;AACrC,MAAM,WAAW,UAAU;IACzB,+DAA+D;IAC/D,GAAG,EAAE,MAAM,CAAC;IACZ,0CAA0C;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAqBD;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,GACb,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAc9C;AAaD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,YAAY,GAAE,MAAM,SAAS,MAAM,EAAa,EAChD,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,EAAE,CAwBV;AAED,yEAAyE;AACzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE1D;AAsBD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,aAAa,EAAE,MAAM,GACpB,UAAU,EAAE,GAAG,IAAI,CAuBrB;AAMD;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,MAAM,CAMR;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,kBAAkB,GAAG,IAAI,CAmB3B;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,IAAI,CAqBN"}