@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.
- package/dist/build-provenance.json +2 -2
- package/dist/cloud/journal.d.ts +9 -5
- package/dist/cloud/journal.d.ts.map +1 -1
- package/dist/cloud/journal.js +29 -8
- package/dist/cloud/journal.js.map +1 -1
- package/dist/cloud/manifest-check.d.ts +140 -4
- package/dist/cloud/manifest-check.d.ts.map +1 -1
- package/dist/cloud/manifest-check.js +309 -10
- package/dist/cloud/manifest-check.js.map +1 -1
- package/dist/cloud/nexus-attach.d.ts +25 -0
- package/dist/cloud/nexus-attach.d.ts.map +1 -1
- package/dist/cloud/nexus-attach.js +81 -6
- package/dist/cloud/nexus-attach.js.map +1 -1
- package/dist/cloud/nexus-cloud-activity.d.ts +37 -0
- package/dist/cloud/nexus-cloud-activity.d.ts.map +1 -0
- package/dist/cloud/nexus-cloud-activity.js +79 -0
- package/dist/cloud/nexus-cloud-activity.js.map +1 -0
- package/dist/cloud/nexus-cloud-status.d.ts.map +1 -1
- package/dist/cloud/nexus-cloud-status.js +36 -0
- package/dist/cloud/nexus-cloud-status.js.map +1 -1
- package/dist/cloud/nexus-device.d.ts +1 -1
- package/dist/cloud/nexus-enrol.d.ts.map +1 -1
- package/dist/cloud/nexus-enrol.js +5 -0
- package/dist/cloud/nexus-enrol.js.map +1 -1
- package/dist/cloud/nexus-home.d.ts +74 -0
- package/dist/cloud/nexus-home.d.ts.map +1 -0
- package/dist/cloud/nexus-home.js +97 -0
- package/dist/cloud/nexus-home.js.map +1 -0
- package/dist/cloud/nexus-vault-keys.d.ts +129 -0
- package/dist/cloud/nexus-vault-keys.d.ts.map +1 -0
- package/dist/cloud/nexus-vault-keys.js +277 -0
- package/dist/cloud/nexus-vault-keys.js.map +1 -0
- package/dist/cloud/nexus-vault-state.d.ts +121 -0
- package/dist/cloud/nexus-vault-state.d.ts.map +1 -0
- package/dist/cloud/nexus-vault-state.js +274 -0
- package/dist/cloud/nexus-vault-state.js.map +1 -0
- package/dist/cloud/nexus-vault.d.ts +160 -0
- package/dist/cloud/nexus-vault.d.ts.map +1 -0
- package/dist/cloud/nexus-vault.js +1733 -0
- package/dist/cloud/nexus-vault.js.map +1 -0
- package/dist/cloud/signing.d.ts +24 -8
- package/dist/cloud/signing.d.ts.map +1 -1
- package/dist/cloud/signing.js +61 -15
- package/dist/cloud/signing.js.map +1 -1
- package/dist/docs/export-document.js +8137 -3318
- package/dist/docs/export-document.js.map +3 -3
- package/dist/doctor/migrations.d.ts +75 -0
- package/dist/doctor/migrations.d.ts.map +1 -0
- package/dist/doctor/migrations.js +136 -0
- package/dist/doctor/migrations.js.map +1 -0
- package/dist/doctor/sync-sealer.d.ts +48 -0
- package/dist/doctor/sync-sealer.d.ts.map +1 -0
- package/dist/doctor/sync-sealer.js +109 -0
- package/dist/doctor/sync-sealer.js.map +1 -0
- package/dist/doctor/sync-triggers.d.ts +53 -0
- package/dist/doctor/sync-triggers.d.ts.map +1 -0
- package/dist/doctor/sync-triggers.js +157 -0
- package/dist/doctor/sync-triggers.js.map +1 -0
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +5 -1
- package/dist/init.js.map +1 -1
- package/dist/internal.d.ts +1 -1
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +1 -1
- package/dist/internal.js.map +1 -1
- package/dist/llm/plugin-facade.js +8442 -3623
- package/dist/llm/plugin-facade.js.map +3 -3
- package/dist/nexus/projects-clean.d.ts +3 -0
- package/dist/nexus/projects-clean.d.ts.map +1 -1
- package/dist/nexus/projects-clean.js +9 -3
- package/dist/nexus/projects-clean.js.map +1 -1
- package/dist/nexus/registry-roots.d.ts +3 -1
- package/dist/nexus/registry-roots.d.ts.map +1 -1
- package/dist/nexus/registry-roots.js +5 -2
- package/dist/nexus/registry-roots.js.map +1 -1
- package/dist/nexus/registry.d.ts +8 -1
- package/dist/nexus/registry.d.ts.map +1 -1
- package/dist/nexus/registry.js +24 -10
- package/dist/nexus/registry.js.map +1 -1
- package/dist/nexus/workspace.d.ts +4 -1
- package/dist/nexus/workspace.d.ts.map +1 -1
- package/dist/nexus/workspace.js +10 -4
- package/dist/nexus/workspace.js.map +1 -1
- package/dist/orchestrate/spawn-ops.d.ts.map +1 -1
- package/dist/orchestrate/spawn-ops.js +7 -2
- package/dist/orchestrate/spawn-ops.js.map +1 -1
- package/dist/orchestrate/worker-verify.d.ts +121 -12
- package/dist/orchestrate/worker-verify.d.ts.map +1 -1
- package/dist/orchestrate/worker-verify.js +172 -21
- package/dist/orchestrate/worker-verify.js.map +1 -1
- package/dist/orchestration/spawn-prompt.d.ts.map +1 -1
- package/dist/orchestration/spawn-prompt.js +15 -9
- package/dist/orchestration/spawn-prompt.js.map +1 -1
- package/dist/release/ci-evidence.d.ts +9 -0
- package/dist/release/ci-evidence.d.ts.map +1 -1
- package/dist/release/ci-evidence.js +9 -2
- package/dist/release/ci-evidence.js.map +1 -1
- package/dist/resources/backend.d.ts +15 -3
- package/dist/resources/backend.d.ts.map +1 -1
- package/dist/resources/backend.js +7 -3
- package/dist/resources/backend.js.map +1 -1
- package/dist/resources/darwin-backend.d.ts +142 -0
- package/dist/resources/darwin-backend.d.ts.map +1 -0
- package/dist/resources/darwin-backend.js +288 -0
- package/dist/resources/darwin-backend.js.map +1 -0
- package/dist/resources/governor.d.ts +44 -1
- package/dist/resources/governor.d.ts.map +1 -1
- package/dist/resources/governor.js +100 -36
- package/dist/resources/governor.js.map +1 -1
- package/dist/resources/heavy-command.d.ts +132 -0
- package/dist/resources/heavy-command.d.ts.map +1 -0
- package/dist/resources/heavy-command.js +768 -0
- package/dist/resources/heavy-command.js.map +1 -0
- package/dist/resources/monitor.d.ts +50 -1
- package/dist/resources/monitor.d.ts.map +1 -1
- package/dist/resources/monitor.js +83 -1
- package/dist/resources/monitor.js.map +1 -1
- package/dist/resources/run-admission.d.ts +303 -0
- package/dist/resources/run-admission.d.ts.map +1 -0
- package/dist/resources/run-admission.js +648 -0
- package/dist/resources/run-admission.js.map +1 -0
- package/dist/resources/run-class.d.ts +111 -0
- package/dist/resources/run-class.d.ts.map +1 -0
- package/dist/resources/run-class.js +658 -0
- package/dist/resources/run-class.js.map +1 -0
- package/dist/resources/run-governed.d.ts +158 -0
- package/dist/resources/run-governed.d.ts.map +1 -0
- package/dist/resources/run-governed.js +406 -0
- package/dist/resources/run-governed.js.map +1 -0
- package/dist/resources/slot-holder.d.ts +267 -0
- package/dist/resources/slot-holder.d.ts.map +1 -0
- package/dist/resources/slot-holder.js +505 -0
- package/dist/resources/slot-holder.js.map +1 -0
- package/dist/resources/tool-groups.d.ts +74 -0
- package/dist/resources/tool-groups.d.ts.map +1 -0
- package/dist/resources/tool-groups.js +118 -0
- package/dist/resources/tool-groups.js.map +1 -0
- package/dist/routing/build-command-groups.d.ts.map +1 -1
- package/dist/routing/build-command-groups.js +1 -0
- package/dist/routing/build-command-groups.js.map +1 -1
- package/dist/selfimprove/fix-gen.js +8446 -3627
- package/dist/selfimprove/fix-gen.js.map +3 -3
- package/dist/sentient/cross-project-hygiene.d.ts +3 -2
- package/dist/sentient/cross-project-hygiene.d.ts.map +1 -1
- package/dist/sentient/cross-project-hygiene.js +5 -2
- package/dist/sentient/cross-project-hygiene.js.map +1 -1
- package/dist/sentient/state.d.ts +7 -0
- package/dist/sentient/state.d.ts.map +1 -1
- package/dist/sentient/state.js.map +1 -1
- package/dist/sentient/tick.d.ts +14 -2
- package/dist/sentient/tick.d.ts.map +1 -1
- package/dist/sentient/tick.js +63 -4
- package/dist/sentient/tick.js.map +1 -1
- package/dist/store/backup-recover.d.ts.map +1 -1
- package/dist/store/backup-recover.js +5 -0
- package/dist/store/backup-recover.js.map +1 -1
- package/dist/store/data-accessor.d.ts +1 -0
- package/dist/store/data-accessor.d.ts.map +1 -1
- package/dist/store/data-accessor.js +7 -0
- package/dist/store/data-accessor.js.map +1 -1
- package/dist/store/dual-scope-db.d.ts +23 -1
- package/dist/store/dual-scope-db.d.ts.map +1 -1
- package/dist/store/dual-scope-db.js +126 -36
- package/dist/store/dual-scope-db.js.map +1 -1
- package/dist/store/exodus/recovery.d.ts.map +1 -1
- package/dist/store/exodus/recovery.js +15 -0
- package/dist/store/exodus/recovery.js.map +1 -1
- package/dist/store/legacy-tasks-lineage.d.ts.map +1 -1
- package/dist/store/legacy-tasks-lineage.js +5 -0
- package/dist/store/legacy-tasks-lineage.js.map +1 -1
- package/dist/store/lock.d.ts +8 -1
- package/dist/store/lock.d.ts.map +1 -1
- package/dist/store/lock.js +10 -2
- package/dist/store/lock.js.map +1 -1
- package/dist/store/migration-manager.d.ts +5 -0
- package/dist/store/migration-manager.d.ts.map +1 -1
- package/dist/store/migration-manager.js +11 -0
- package/dist/store/migration-manager.js.map +1 -1
- package/dist/store/migration-runner.d.ts +158 -0
- package/dist/store/migration-runner.d.ts.map +1 -0
- package/dist/store/migration-runner.js +493 -0
- package/dist/store/migration-runner.js.map +1 -0
- package/dist/store/portable-bundle-import.d.ts +15 -1
- package/dist/store/portable-bundle-import.d.ts.map +1 -1
- package/dist/store/portable-bundle-import.js +24 -4
- package/dist/store/portable-bundle-import.js.map +1 -1
- package/dist/store/portable-bundle-relocate.d.ts +43 -0
- package/dist/store/portable-bundle-relocate.d.ts.map +1 -1
- package/dist/store/portable-bundle-relocate.js +79 -5
- package/dist/store/portable-bundle-relocate.js.map +1 -1
- package/dist/store/portable-bundle-scan.d.ts +20 -0
- package/dist/store/portable-bundle-scan.d.ts.map +1 -1
- package/dist/store/portable-bundle-scan.js +38 -3
- package/dist/store/portable-bundle-scan.js.map +1 -1
- package/dist/store/portable-bundle.d.ts +33 -0
- package/dist/store/portable-bundle.d.ts.map +1 -1
- package/dist/store/portable-bundle.js +34 -7
- package/dist/store/portable-bundle.js.map +1 -1
- package/dist/store/row-identity-registry.d.ts +137 -7
- package/dist/store/row-identity-registry.d.ts.map +1 -1
- package/dist/store/row-identity-registry.js +364 -9
- package/dist/store/row-identity-registry.js.map +1 -1
- package/dist/store/row-identity.d.ts.map +1 -1
- package/dist/store/row-identity.js +9 -10
- package/dist/store/row-identity.js.map +1 -1
- package/dist/store/sqlite-data-accessor.d.ts.map +1 -1
- package/dist/store/sqlite-data-accessor.js +10 -0
- package/dist/store/sqlite-data-accessor.js.map +1 -1
- package/dist/store/sqlite.d.ts +31 -0
- package/dist/store/sqlite.d.ts.map +1 -1
- package/dist/store/sqlite.js +5 -1
- package/dist/store/sqlite.js.map +1 -1
- package/dist/store/sync/capture.d.ts +203 -0
- package/dist/store/sync/capture.d.ts.map +1 -0
- package/dist/store/sync/capture.js +562 -0
- package/dist/store/sync/capture.js.map +1 -0
- package/dist/store/sync/clock-store.d.ts.map +1 -1
- package/dist/store/sync/clock-store.js +2 -0
- package/dist/store/sync/clock-store.js.map +1 -1
- package/dist/store/sync/fk-orphans.d.ts +133 -0
- package/dist/store/sync/fk-orphans.d.ts.map +1 -0
- package/dist/store/sync/fk-orphans.js +265 -0
- package/dist/store/sync/fk-orphans.js.map +1 -0
- package/dist/store/sync/flags.d.ts +7 -0
- package/dist/store/sync/flags.d.ts.map +1 -1
- package/dist/store/sync/flags.js +16 -0
- package/dist/store/sync/flags.js.map +1 -1
- package/dist/store/sync/hlc.d.ts.map +1 -1
- package/dist/store/sync/hlc.js +4 -0
- package/dist/store/sync/hlc.js.map +1 -1
- package/dist/store/sync/identity-fill.d.ts +45 -0
- package/dist/store/sync/identity-fill.d.ts.map +1 -0
- package/dist/store/sync/identity-fill.js +85 -0
- package/dist/store/sync/identity-fill.js.map +1 -0
- package/dist/store/sync/machinery.d.ts +27 -0
- package/dist/store/sync/machinery.d.ts.map +1 -0
- package/dist/store/sync/machinery.js +44 -0
- package/dist/store/sync/machinery.js.map +1 -0
- package/dist/store/sync/netting.d.ts +120 -0
- package/dist/store/sync/netting.d.ts.map +1 -0
- package/dist/store/sync/netting.js +336 -0
- package/dist/store/sync/netting.js.map +1 -0
- package/dist/store/sync/replica.d.ts +27 -2
- package/dist/store/sync/replica.d.ts.map +1 -1
- package/dist/store/sync/replica.js +47 -3
- package/dist/store/sync/replica.js.map +1 -1
- package/dist/store/sync/schema.d.ts +12 -0
- package/dist/store/sync/schema.d.ts.map +1 -1
- package/dist/store/sync/schema.js +21 -0
- package/dist/store/sync/schema.js.map +1 -1
- package/dist/store/sync/seal-backlog.d.ts +21 -0
- package/dist/store/sync/seal-backlog.d.ts.map +1 -0
- package/dist/store/sync/seal-backlog.js +24 -0
- package/dist/store/sync/seal-backlog.js.map +1 -0
- package/dist/store/sync/sealer-values.d.ts +34 -0
- package/dist/store/sync/sealer-values.d.ts.map +1 -0
- package/dist/store/sync/sealer-values.js +53 -0
- package/dist/store/sync/sealer-values.js.map +1 -0
- package/dist/store/sync/sealer.d.ts +145 -0
- package/dist/store/sync/sealer.d.ts.map +1 -0
- package/dist/store/sync/sealer.js +906 -0
- package/dist/store/sync/sealer.js.map +1 -0
- package/dist/store/sync/structural.d.ts +63 -0
- package/dist/store/sync/structural.d.ts.map +1 -0
- package/dist/store/sync/structural.js +180 -0
- package/dist/store/sync/structural.js.map +1 -0
- package/dist/store/sync/timestamps.d.ts +92 -0
- package/dist/store/sync/timestamps.d.ts.map +1 -0
- package/dist/store/sync/timestamps.js +228 -0
- package/dist/store/sync/timestamps.js.map +1 -0
- package/dist/store/sync/tombstones.d.ts +75 -0
- package/dist/store/sync/tombstones.d.ts.map +1 -0
- package/dist/store/sync/tombstones.js +103 -0
- package/dist/store/sync/tombstones.js.map +1 -0
- package/dist/store/sync/trigger-classes.d.ts +221 -0
- package/dist/store/sync/trigger-classes.d.ts.map +1 -0
- package/dist/store/sync/trigger-classes.js +441 -0
- package/dist/store/sync/trigger-classes.js.map +1 -0
- package/dist/store/sync/trigger-suspend-at-path.d.ts +23 -0
- package/dist/store/sync/trigger-suspend-at-path.d.ts.map +1 -0
- package/dist/store/sync/trigger-suspend-at-path.js +44 -0
- package/dist/store/sync/trigger-suspend-at-path.js.map +1 -0
- package/dist/store/sync/writer-version.d.ts +43 -0
- package/dist/store/sync/writer-version.d.ts.map +1 -0
- package/dist/store/sync/writer-version.js +90 -0
- package/dist/store/sync/writer-version.js.map +1 -0
- package/dist/store/table-classification.d.ts.map +1 -1
- package/dist/store/table-classification.js +102 -0
- package/dist/store/table-classification.js.map +1 -1
- package/dist/store/trigger-suspend-schema.d.ts +44 -0
- package/dist/store/trigger-suspend-schema.d.ts.map +1 -0
- package/dist/store/trigger-suspend-schema.js +25 -0
- package/dist/store/trigger-suspend-schema.js.map +1 -0
- package/dist/store/vault-manifest.d.ts +365 -0
- package/dist/store/vault-manifest.d.ts.map +1 -0
- package/dist/store/vault-manifest.js +812 -0
- package/dist/store/vault-manifest.js.map +1 -0
- package/dist/store/writer-lease.d.ts +31 -0
- package/dist/store/writer-lease.d.ts.map +1 -1
- package/dist/store/writer-lease.js +65 -2
- package/dist/store/writer-lease.js.map +1 -1
- package/dist/system/health.d.ts.map +1 -1
- package/dist/system/health.js +21 -0
- package/dist/system/health.js.map +1 -1
- package/dist/system/project-health.d.ts.map +1 -1
- package/dist/system/project-health.js +3 -1
- package/dist/system/project-health.js.map +1 -1
- package/dist/tasks/affected-packages.d.ts +58 -0
- package/dist/tasks/affected-packages.d.ts.map +1 -1
- package/dist/tasks/affected-packages.js +75 -6
- package/dist/tasks/affected-packages.js.map +1 -1
- package/dist/tasks/affected-scope.d.ts +150 -23
- package/dist/tasks/affected-scope.d.ts.map +1 -1
- package/dist/tasks/affected-scope.js +320 -32
- package/dist/tasks/affected-scope.js.map +1 -1
- package/dist/tasks/change-set.d.ts +96 -0
- package/dist/tasks/change-set.d.ts.map +1 -1
- package/dist/tasks/change-set.js +169 -4
- package/dist/tasks/change-set.js.map +1 -1
- package/dist/tasks/complete-ci.d.ts +115 -0
- package/dist/tasks/complete-ci.d.ts.map +1 -0
- package/dist/tasks/complete-ci.js +171 -0
- package/dist/tasks/complete-ci.js.map +1 -0
- package/dist/tasks/complete.d.ts.map +1 -1
- package/dist/tasks/complete.js +50 -17
- package/dist/tasks/complete.js.map +1 -1
- package/dist/tasks/compute-task-view.d.ts.map +1 -1
- package/dist/tasks/compute-task-view.js +7 -0
- package/dist/tasks/compute-task-view.js.map +1 -1
- package/dist/tasks/done-plan.d.ts.map +1 -1
- package/dist/tasks/done-plan.js +51 -30
- package/dist/tasks/done-plan.js.map +1 -1
- package/dist/tasks/done-record.d.ts +6 -0
- package/dist/tasks/done-record.d.ts.map +1 -1
- package/dist/tasks/done-record.js +9 -3
- package/dist/tasks/done-record.js.map +1 -1
- package/dist/tasks/evidence.d.ts +3 -2
- package/dist/tasks/evidence.d.ts.map +1 -1
- package/dist/tasks/evidence.js +143 -12
- package/dist/tasks/evidence.js.map +1 -1
- package/dist/tasks/gate-notes.d.ts +22 -0
- package/dist/tasks/gate-notes.d.ts.map +1 -0
- package/dist/tasks/gate-notes.js +33 -0
- package/dist/tasks/gate-notes.js.map +1 -0
- package/dist/tasks/index.d.ts +2 -1
- package/dist/tasks/index.d.ts.map +1 -1
- package/dist/tasks/index.js +2 -1
- package/dist/tasks/index.js.map +1 -1
- package/dist/tasks/test-run-binding.d.ts +117 -0
- package/dist/tasks/test-run-binding.d.ts.map +1 -0
- package/dist/tasks/test-run-binding.js +365 -0
- package/dist/tasks/test-run-binding.js.map +1 -0
- package/dist/tasks/tool-cache-env.d.ts +123 -0
- package/dist/tasks/tool-cache-env.d.ts.map +1 -0
- package/dist/tasks/tool-cache-env.js +287 -0
- package/dist/tasks/tool-cache-env.js.map +1 -0
- package/dist/tasks/tool-cache-failed-first.d.ts +155 -0
- package/dist/tasks/tool-cache-failed-first.d.ts.map +1 -0
- package/dist/tasks/tool-cache-failed-first.js +285 -0
- package/dist/tasks/tool-cache-failed-first.js.map +1 -0
- package/dist/tasks/tool-cache.d.ts +375 -55
- package/dist/tasks/tool-cache.d.ts.map +1 -1
- package/dist/tasks/tool-cache.js +912 -303
- package/dist/tasks/tool-cache.js.map +1 -1
- package/dist/tasks/tool-resolver.d.ts +4 -3
- package/dist/tasks/tool-resolver.d.ts.map +1 -1
- package/dist/tasks/tool-resolver.js +15 -4
- package/dist/tasks/tool-resolver.js.map +1 -1
- package/dist/tasks/tool-semaphore.d.ts +67 -7
- package/dist/tasks/tool-semaphore.d.ts.map +1 -1
- package/dist/tasks/tool-semaphore.js +134 -56
- package/dist/tasks/tool-semaphore.js.map +1 -1
- package/dist/upgrade.d.ts.map +1 -1
- package/dist/upgrade.js +4 -0
- package/dist/upgrade.js.map +1 -1
- package/dist/validation/engine-ops.d.ts +6 -0
- package/dist/validation/engine-ops.d.ts.map +1 -1
- package/dist/validation/engine-ops.js +8 -0
- package/dist/validation/engine-ops.js.map +1 -1
- package/migrations/drizzle-cleo-project/20260930170000_t12819-trigger-suspend-clause/migration.sql +367 -0
- package/migrations/sync-journal/20260930120000_t12343-capture/migration.sql +47 -0
- package/migrations/sync-journal/20261001170000_t12984-sealer/migration.sql +101 -0
- package/package.json +13 -13
- package/templates/CLEO-INJECTION.md +5 -5
- 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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAqB,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGpE,8EAA8E;AAC9E,MAAM,CAAC,MAAM,mBAAmB,GAAwB,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;AAEhG,mDAAmD;AACnD,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAE3C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AAEtC,MAAM,iBAAiB,GAAG;IACxB,8BAA8B;IAC9B,iCAAiC;IACjC,8BAA8B;IAC9B,8BAA8B;CAC/B,CAAC;AAEF,uEAAuE;AACvE,SAAS,oBAAoB,CAAC,IAAY;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,iBAAiB,CAAC,EAAE;YAC3F,GAAG,EAAE,IAAI;YACT,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;YACnC,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;SAC5B,CAAC,CAAC;QACH,OAAO,GAAG;aACP,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,OAAO,CAAC;aACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;aACtB,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,SAAS,CAAC,GAAW,EAAE,GAAW,EAAE,GAAa;IACxD,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC5B,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,EAAE;YAAE,SAAS;QAClB,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YACrB,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE,EAAE,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YACrE,IAAI,GAAG,CAAC,MAAM,GAAG,cAAc;gBAAE,OAAO,KAAK,CAAC;QAChD,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,SAAiB;IACnE,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC;QAAE,OAAO,oBAAoB,CAAC;IACrE,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAElC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,IAAI,CAAC,MAAM,CAAC,WAAW,QAAQ,IAAI,MAAM,IAAI,CAAC,CAAC;IAC/C,IAAI,QAAQ;QAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE9D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,GAAG,GAAG,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;YAC9D,mEAAmE;YACnE,IAAI,IAAI,GAAG,IAAI,CAAC;YAChB,IAAI,CAAC;gBACH,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;YACD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAE9B,IAAI,OAAO,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC;aACxB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;aACnC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,gCAAgC;IAClC,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;QAClE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE;YAAE,SAAS;QAC5B,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,eAAe,GAAwB,IAAI,GAAG,CAAC;IACnD,oBAAoB;IACpB,+BAA+B;IAC/B,qBAAqB;CACtB,CAAC,CAAC;AAEH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAA+B;IAChE,MAAM,MAAM,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QACtC,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAClF,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QACzC,IAAI,KAAK,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,IAAI,KAAK,SAAS,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClE,KAAK,GAAG,IAAI,CAAC;YACb,CAAC,EAAE,CAAC;QACN,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;SACtB,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;SAC9C,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,uDAAuD;AACvD,SAAS,aAAa,CAAC,IAAY,EAAE,GAAuB;IAC1D,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,IAAI,KAAK,cAAc;QAAE,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC9D,0EAA0E;IAC1E,0EAA0E;IAC1E,eAAe;IACf,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,OAAO,KAAK;aACT,KAAK,CAAC,KAAK,CAAC;aACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;aACxD,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,UAAU,kBAAkB,CAChC,SAAwB,EACxB,MAAyB,OAAO,CAAC,GAAG,EACpC,UAAwB,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC;IAEpD,MAAM,SAAS,GAAsB,EAAE,GAAG,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;IAC5D,MAAM,KAAK,GAAG,IAAI,GAAG,CAAS,CAAC,cAAc,CAAC,CAAC,CAAC;IAChD,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7E,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC1B,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC;SACd,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;SAChE,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -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"}
|