@cleocode/core 2026.10.17 → 2026.10.18
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/audit-prune.d.ts +37 -8
- package/dist/audit-prune.d.ts.map +1 -1
- package/dist/audit-prune.js +46 -12
- package/dist/audit-prune.js.map +1 -1
- package/dist/build-provenance.json +2 -2
- package/dist/cloud/manifest-check.d.ts +21 -0
- package/dist/cloud/manifest-check.d.ts.map +1 -1
- package/dist/cloud/manifest-check.js +46 -1
- package/dist/cloud/manifest-check.js.map +1 -1
- package/dist/cloud/nexus-vault.d.ts +19 -0
- package/dist/cloud/nexus-vault.d.ts.map +1 -1
- package/dist/cloud/nexus-vault.js +134 -23
- package/dist/cloud/nexus-vault.js.map +1 -1
- package/dist/cloud/signing.d.ts.map +1 -1
- package/dist/cloud/signing.js +4 -0
- package/dist/cloud/signing.js.map +1 -1
- package/dist/doctor/row-identity.d.ts.map +1 -1
- package/dist/doctor/row-identity.js +2 -1
- package/dist/doctor/row-identity.js.map +1 -1
- package/dist/git/work-tree.d.ts +17 -0
- package/dist/git/work-tree.d.ts.map +1 -1
- package/dist/git/work-tree.js +30 -0
- package/dist/git/work-tree.js.map +1 -1
- package/dist/goal/close.d.ts +95 -0
- package/dist/goal/close.d.ts.map +1 -0
- package/dist/goal/close.js +497 -0
- package/dist/goal/close.js.map +1 -0
- package/dist/goal/draft.d.ts +81 -0
- package/dist/goal/draft.d.ts.map +1 -0
- package/dist/goal/draft.js +331 -0
- package/dist/goal/draft.js.map +1 -0
- package/dist/hooks/release-gate.d.ts +3 -0
- package/dist/hooks/release-gate.d.ts.map +1 -1
- package/dist/hooks/release-gate.js +4 -1
- package/dist/hooks/release-gate.js.map +1 -1
- package/dist/orchestration/lean-gain.d.ts +26 -0
- package/dist/orchestration/lean-gain.d.ts.map +1 -0
- package/dist/orchestration/lean-gain.js +61 -0
- package/dist/orchestration/lean-gain.js.map +1 -0
- package/dist/release/backfill.d.ts.map +1 -1
- package/dist/release/backfill.js +15 -5
- package/dist/release/backfill.js.map +1 -1
- package/dist/release/ci-evidence.d.ts +90 -5
- package/dist/release/ci-evidence.d.ts.map +1 -1
- package/dist/release/ci-evidence.js +277 -4
- package/dist/release/ci-evidence.js.map +1 -1
- package/dist/release/plan.d.ts +4 -1
- package/dist/release/plan.d.ts.map +1 -1
- package/dist/release/plan.js +10 -2
- package/dist/release/plan.js.map +1 -1
- package/dist/release/reconcile.d.ts +10 -0
- package/dist/release/reconcile.d.ts.map +1 -1
- package/dist/release/reconcile.js +42 -19
- package/dist/release/reconcile.js.map +1 -1
- package/dist/release/release-manifest.d.ts +2 -1
- package/dist/release/release-manifest.d.ts.map +1 -1
- package/dist/release/release-manifest.js +15 -1
- package/dist/release/release-manifest.js.map +1 -1
- package/dist/resources/admission-ledger.d.ts +21 -4
- package/dist/resources/admission-ledger.d.ts.map +1 -1
- package/dist/resources/admission-ledger.js +102 -19
- package/dist/resources/admission-ledger.js.map +1 -1
- package/dist/resources/run-class.d.ts +22 -0
- package/dist/resources/run-class.d.ts.map +1 -1
- package/dist/resources/run-class.js +81 -0
- package/dist/resources/run-class.js.map +1 -1
- package/dist/sessions/handoff.d.ts +2 -2
- package/dist/sessions/handoff.js +2 -2
- package/dist/store/audit-log-schema.d.ts +106 -39
- package/dist/store/audit-log-schema.d.ts.map +1 -1
- package/dist/store/audit-log-schema.js +6 -3
- package/dist/store/audit-log-schema.js.map +1 -1
- package/dist/store/row-identity-registry.d.ts +42 -6
- package/dist/store/row-identity-registry.d.ts.map +1 -1
- package/dist/store/row-identity-registry.js +256 -34
- 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 +16 -4
- package/dist/store/row-identity.js.map +1 -1
- package/dist/store/schema/cleo-global/nexus.d.ts +16 -0
- package/dist/store/schema/cleo-global/nexus.d.ts.map +1 -1
- package/dist/store/schema/cleo-global/nexus.js +4 -1
- package/dist/store/schema/cleo-global/nexus.js.map +1 -1
- package/dist/store/schema/cleo-project/audit.d.ts +48 -0
- package/dist/store/schema/cleo-project/audit.d.ts.map +1 -1
- package/dist/store/schema/cleo-project/audit.js +15 -1
- package/dist/store/schema/cleo-project/audit.js.map +1 -1
- package/dist/store/schema/cleo-project/lifecycle.d.ts +112 -0
- package/dist/store/schema/cleo-project/lifecycle.d.ts.map +1 -1
- package/dist/store/schema/cleo-project/lifecycle.js +36 -4
- package/dist/store/schema/cleo-project/lifecycle.js.map +1 -1
- package/dist/store/schema/cleo-project/provenance-commits.d.ts +48 -0
- package/dist/store/schema/cleo-project/provenance-commits.d.ts.map +1 -1
- package/dist/store/schema/cleo-project/provenance-commits.js +10 -1
- package/dist/store/schema/cleo-project/provenance-commits.js.map +1 -1
- package/dist/store/schema/cleo-project/provenance-rest.d.ts +128 -0
- package/dist/store/schema/cleo-project/provenance-rest.d.ts.map +1 -1
- package/dist/store/schema/cleo-project/provenance-rest.js +25 -1
- package/dist/store/schema/cleo-project/provenance-rest.js.map +1 -1
- package/dist/store/schema/cleo-project/tasks-core.d.ts +16 -0
- package/dist/store/schema/cleo-project/tasks-core.d.ts.map +1 -1
- package/dist/store/schema/cleo-project/tasks-core.js +6 -1
- package/dist/store/schema/cleo-project/tasks-core.js.map +1 -1
- package/dist/store/session-store.d.ts +5 -4
- package/dist/store/session-store.d.ts.map +1 -1
- package/dist/store/session-store.js +19 -5
- package/dist/store/session-store.js.map +1 -1
- package/dist/store/sync/apply/parent-delete.d.ts.map +1 -1
- package/dist/store/sync/apply/parent-delete.js +8 -0
- package/dist/store/sync/apply/parent-delete.js.map +1 -1
- package/dist/store/sync/apply/write-api.d.ts +3 -2
- package/dist/store/sync/apply/write-api.d.ts.map +1 -1
- package/dist/store/sync/apply/write-api.js +19 -0
- package/dist/store/sync/apply/write-api.js.map +1 -1
- package/dist/store/sync/capture.d.ts +11 -0
- package/dist/store/sync/capture.d.ts.map +1 -1
- package/dist/store/sync/capture.js +13 -3
- package/dist/store/sync/capture.js.map +1 -1
- package/dist/store/sync/flags.d.ts +10 -0
- package/dist/store/sync/flags.d.ts.map +1 -1
- package/dist/store/sync/flags.js +43 -5
- package/dist/store/sync/flags.js.map +1 -1
- package/dist/store/sync/timestamp-canon.d.ts.map +1 -1
- package/dist/store/sync/timestamp-canon.js +37 -0
- package/dist/store/sync/timestamp-canon.js.map +1 -1
- package/dist/store/tasks-schema.d.ts +1 -1
- package/dist/store/tasks-schema.d.ts.map +1 -1
- package/dist/store/tasks-schema.js +5 -1
- package/dist/store/tasks-schema.js.map +1 -1
- package/dist/store/twin-collapse.d.ts +2 -1
- package/dist/store/twin-collapse.d.ts.map +1 -1
- package/dist/store/twin-collapse.js +128 -104
- package/dist/store/twin-collapse.js.map +1 -1
- package/dist/store/validation-schemas.d.ts +390 -38
- package/dist/store/validation-schemas.d.ts.map +1 -1
- package/dist/store/vault-manifest.d.ts +9 -2
- package/dist/store/vault-manifest.d.ts.map +1 -1
- package/dist/store/vault-manifest.js +25 -4
- package/dist/store/vault-manifest.js.map +1 -1
- package/dist/system/health.d.ts.map +1 -1
- package/dist/system/health.js +3 -2
- package/dist/system/health.js.map +1 -1
- package/dist/tasks/affected-packages.d.ts +21 -2
- package/dist/tasks/affected-packages.d.ts.map +1 -1
- package/dist/tasks/affected-packages.js +96 -8
- package/dist/tasks/affected-packages.js.map +1 -1
- package/dist/tasks/affected-scope.d.ts +7 -2
- package/dist/tasks/affected-scope.d.ts.map +1 -1
- package/dist/tasks/affected-scope.js +158 -14
- package/dist/tasks/affected-scope.js.map +1 -1
- package/dist/tasks/change-set.d.ts +10 -0
- package/dist/tasks/change-set.d.ts.map +1 -1
- package/dist/tasks/change-set.js +70 -3
- package/dist/tasks/change-set.js.map +1 -1
- package/dist/tasks/done-plan.d.ts +11 -5
- package/dist/tasks/done-plan.d.ts.map +1 -1
- package/dist/tasks/done-plan.js +54 -10
- package/dist/tasks/done-plan.js.map +1 -1
- package/dist/tasks/done-record.d.ts.map +1 -1
- package/dist/tasks/done-record.js +25 -0
- package/dist/tasks/done-record.js.map +1 -1
- package/dist/tasks/evidence.d.ts.map +1 -1
- package/dist/tasks/evidence.js +22 -2
- package/dist/tasks/evidence.js.map +1 -1
- package/dist/tasks/gate-result-cache.d.ts.map +1 -1
- package/dist/tasks/gate-result-cache.js +24 -3
- package/dist/tasks/gate-result-cache.js.map +1 -1
- package/dist/tasks/gate-runner.d.ts +27 -3
- package/dist/tasks/gate-runner.d.ts.map +1 -1
- package/dist/tasks/gate-runner.js +77 -29
- package/dist/tasks/gate-runner.js.map +1 -1
- package/dist/tasks/qa-run-binding.d.ts +22 -3
- package/dist/tasks/qa-run-binding.d.ts.map +1 -1
- package/dist/tasks/qa-run-binding.js +46 -4
- package/dist/tasks/qa-run-binding.js.map +1 -1
- package/dist/tasks/test-run-binding.d.ts +21 -3
- package/dist/tasks/test-run-binding.d.ts.map +1 -1
- package/dist/tasks/test-run-binding.js +60 -14
- package/dist/tasks/test-run-binding.js.map +1 -1
- package/dist/tasks/tool-cache.d.ts.map +1 -1
- package/dist/tasks/tool-cache.js +24 -12
- package/dist/tasks/tool-cache.js.map +1 -1
- package/migrations/drizzle-cleo-global/20261016130000_t13777-nexus-audit-row-uids/migration.sql +18 -0
- package/migrations/drizzle-cleo-project/20261015100000_t12914-lifecycle-release-row-uids/migration.sql +88 -0
- package/migrations/drizzle-cleo-project/20261016130000_t13777-log-row-uids/migration.sql +42 -0
- package/migrations/drizzle-cleo-project/20261016140000_t13777-audit-collapse/migration.sql +31 -0
- package/package.json +18 -18
- package/templates/CLEO-REFERENCE.md +1 -1
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
* @task T12621
|
|
42
42
|
*/
|
|
43
43
|
import { createHash, createHmac, timingSafeEqual } from 'node:crypto';
|
|
44
|
-
import { existsSync, readdirSync, readFileSync, realpathSync } from 'node:fs';
|
|
44
|
+
import { existsSync, readdirSync, readFileSync, realpathSync, statSync } from 'node:fs';
|
|
45
45
|
import { join, resolve } from 'node:path';
|
|
46
46
|
import { acceptanceGateResultSchema } from '@cleocode/contracts/acceptance-gate-schema.js';
|
|
47
47
|
import { getCleoHome } from '../paths.js';
|
|
@@ -162,6 +162,10 @@ export function buildGateCacheEntryBody(gate, state, inputsHash, result, inputs)
|
|
|
162
162
|
...(inputs ? { inputs } : {}),
|
|
163
163
|
};
|
|
164
164
|
}
|
|
165
|
+
/** Cache entries a miss diagnostic reads at most, newest first (#2240 review). */
|
|
166
|
+
const MISS_SCAN_ENTRIES = 50;
|
|
167
|
+
/** Changed input files a miss diagnostic names before "and N more" (#2240 review). */
|
|
168
|
+
const MISS_LISTED_FILES = 10;
|
|
165
169
|
/**
|
|
166
170
|
* Why a gate has no cached pass: which key parts differ from the newest stored
|
|
167
171
|
* pass of the same gate definition (T13693). A refusal that only said "no
|
|
@@ -187,7 +191,21 @@ export function describeGateCacheMiss(projectRoot, gate, state, inputsHash, inpu
|
|
|
187
191
|
const dir = join(projectRoot, '.cleo', 'cache', 'evidence');
|
|
188
192
|
let names;
|
|
189
193
|
try {
|
|
190
|
-
|
|
194
|
+
// Only the newest entries are parsed, so the cost does not grow with an
|
|
195
|
+
// unpruned cache; the pass that explains a miss is a recent one.
|
|
196
|
+
names = readdirSync(dir)
|
|
197
|
+
.filter((n) => n.startsWith('gate-') && n.endsWith('.json'))
|
|
198
|
+
.map((n) => {
|
|
199
|
+
try {
|
|
200
|
+
return { n, at: statSync(join(dir, n)).mtimeMs };
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
return { n, at: 0 };
|
|
204
|
+
}
|
|
205
|
+
})
|
|
206
|
+
.sort((a, b) => b.at - a.at)
|
|
207
|
+
.slice(0, MISS_SCAN_ENTRIES)
|
|
208
|
+
.map(({ n }) => n);
|
|
191
209
|
}
|
|
192
210
|
catch {
|
|
193
211
|
return null;
|
|
@@ -227,8 +245,11 @@ export function describeGateCacheMiss(projectRoot, gate, state, inputsHash, inpu
|
|
|
227
245
|
for (const path of new Set([...before.keys(), ...after.keys()]))
|
|
228
246
|
if (before.get(path) !== after.get(path))
|
|
229
247
|
changed.push(path);
|
|
248
|
+
const listed = changed.length > MISS_LISTED_FILES
|
|
249
|
+
? `${changed.slice(0, MISS_LISTED_FILES).join(', ')} and ${changed.length - MISS_LISTED_FILES} more`
|
|
250
|
+
: changed.join(', ');
|
|
230
251
|
parts.push(changed.length > 0
|
|
231
|
-
? `inputs: ${
|
|
252
|
+
? `inputs: ${listed}`
|
|
232
253
|
: 'inputs (the invocation: command, arguments or working directory)');
|
|
233
254
|
}
|
|
234
255
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate-result-cache.js","sourceRoot":"","sources":["../../src/tasks/gate-result-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"gate-result-cache.js","sourceRoot":"","sources":["../../src/tasks/gate-result-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,8 +24,8 @@
|
|
|
24
24
|
* @epic T760
|
|
25
25
|
* @task T781
|
|
26
26
|
*/
|
|
27
|
-
import type { AcceptanceGate, AcceptanceGateResult, AcRow, DataAccessor, Task } from '@cleocode/contracts';
|
|
28
|
-
import type { AcceptanceGateCacheInputs, AcceptanceGateRunOptions, AcceptanceGateVerificationReceipt } from '@cleocode/contracts/acceptance-gate';
|
|
27
|
+
import type { AcceptanceGate, AcceptanceGateResult, AcRow, DataAccessor, LintGate, Task } from '@cleocode/contracts';
|
|
28
|
+
import type { AcceptanceGateCacheInputs, AcceptanceGateInvocation, AcceptanceGateRunOptions, AcceptanceGateVerificationReceipt } from '@cleocode/contracts/acceptance-gate';
|
|
29
29
|
import type { OperationExecutionContext } from '@cleocode/contracts/jobs';
|
|
30
30
|
/**
|
|
31
31
|
* Shared budget for the bookkeeping around typed gates: task and criterion
|
|
@@ -287,11 +287,24 @@ export declare function revalidateTaskGateResults(task: Task, criteria: readonly
|
|
|
287
287
|
export declare function validateTaskGateCompletion(task: Task, criteria: readonly AcRow[], options: RunGatesOptions, accessor: Pick<DataAccessor, 'queryAuditLog'>, policy?: {
|
|
288
288
|
allowCachedGates?: boolean;
|
|
289
289
|
}): Promise<void>;
|
|
290
|
+
/**
|
|
291
|
+
* Resolve the actual executable inputs once using the same rules as process
|
|
292
|
+
* launch. Exported so `cleo goal draft` spells a gate's command exactly as it
|
|
293
|
+
* runs (T13793).
|
|
294
|
+
*
|
|
295
|
+
* @param gate - The gate.
|
|
296
|
+
* @param root - Project root its `cwd` resolves against.
|
|
297
|
+
* @param env - Environment the gate's `env` overlays.
|
|
298
|
+
* @returns The invocation, or undefined for a gate that runs no process.
|
|
299
|
+
*/
|
|
300
|
+
export declare function executableInvocation(gate: AcceptanceGate, root: string, env: NodeJS.ProcessEnv): AcceptanceGateInvocation | undefined;
|
|
290
301
|
/**
|
|
291
302
|
* Whether a test command's output reports a failure, for `expect: 'pass'`:
|
|
292
303
|
* a `FAIL`, `failing` or `Error:` token, after removing summaries that report
|
|
293
304
|
* zero failures (T13511 — `node --test` prints `ℹ fail 0` on success, which
|
|
294
|
-
* the bare pattern read as a failure)
|
|
305
|
+
* the bare pattern read as a failure) and passing-test lines, whose test names
|
|
306
|
+
* routinely say "failure" (T13752). A non-zero count still matches.
|
|
307
|
+
* Only consulted when the run emitted no structured report.
|
|
295
308
|
*
|
|
296
309
|
* @param stdout - The command's captured stdout.
|
|
297
310
|
* @returns True when the output reports a failure.
|
|
@@ -301,8 +314,19 @@ export declare function validateTaskGateCompletion(task: Task, criteria: readonl
|
|
|
301
314
|
* outputReportsFailure('ℹ pass 2\nℹ fail 1'); // true
|
|
302
315
|
* ```
|
|
303
316
|
* @task T13511
|
|
317
|
+
* @task T13752
|
|
304
318
|
*/
|
|
305
319
|
export declare function outputReportsFailure(stdout: string): boolean;
|
|
320
|
+
/**
|
|
321
|
+
* Tool-specific executable, default arguments and failure pattern of a typed
|
|
322
|
+
* lint gate. A gate fails on a non-zero exit, and with `expect: 'clean'` also
|
|
323
|
+
* when the output matches `errorPattern`. Shared with `cleo goal draft` (T13793).
|
|
324
|
+
*/
|
|
325
|
+
export declare const LINT_TOOL_DEFAULTS: Record<LintGate['tool'], {
|
|
326
|
+
cmd: string;
|
|
327
|
+
defaultArgs: string[];
|
|
328
|
+
errorPattern?: RegExp;
|
|
329
|
+
}>;
|
|
306
330
|
/**
|
|
307
331
|
* Filter a mixed acceptance array to only typed `AcceptanceGate` objects.
|
|
308
332
|
* Free-text strings are silently dropped with their original index preserved
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate-runner.d.ts","sourceRoot":"","sources":["../../src/tasks/gate-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAgBH,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,KAAK,EAEL,YAAY,
|
|
1
|
+
{"version":3,"file":"gate-runner.d.ts","sourceRoot":"","sources":["../../src/tasks/gate-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,8 +30,8 @@ import { constants, mkdirSync, readFileSync, realpathSync, renameSync, writeFile
|
|
|
30
30
|
import { lstat, open, realpath, stat } from 'node:fs/promises';
|
|
31
31
|
import { basename, dirname, isAbsolute, join, relative, resolve } from 'node:path';
|
|
32
32
|
import { isDeepStrictEqual } from 'node:util';
|
|
33
|
-
import { acceptanceGateResultSchema, acceptanceGateSchema, testCountReportSchema, } from '@cleocode/contracts/acceptance-gate-schema.js';
|
|
34
|
-
import { gitToplevel, resolveDeclaredEvidenceGitRoot } from '../git/work-tree.js';
|
|
33
|
+
import { acceptanceGateResultSchema, acceptanceGateSchema, testCountReportSchema, testCountSummarySchema, } from '@cleocode/contracts/acceptance-gate-schema.js';
|
|
34
|
+
import { discoveryEnv, gitToplevel, resolveDeclaredEvidenceGitRoot } from '../git/work-tree.js';
|
|
35
35
|
import { getProjectRoot } from '../paths.js';
|
|
36
36
|
import { captureProjectScope, worktreeScope } from '../project-scope.js';
|
|
37
37
|
import { truncateString } from '../render/helpers.js';
|
|
@@ -441,12 +441,18 @@ export async function runGates(gates, options = {}) {
|
|
|
441
441
|
deregister();
|
|
442
442
|
}
|
|
443
443
|
}
|
|
444
|
-
/**
|
|
444
|
+
/**
|
|
445
|
+
* `git` read in `cwd`; `null` on a non-zero exit or when git is unavailable.
|
|
446
|
+
* Ambient `GIT_DIR`/`GIT_WORK_TREE` are dropped (T13695): the tree is resolved
|
|
447
|
+
* explicitly ({@link resolveTypedGateRoot}), so an inherited repo pointer may
|
|
448
|
+
* only ever make it read another repository.
|
|
449
|
+
*/
|
|
445
450
|
function gitOut(cwd, args) {
|
|
446
451
|
try {
|
|
447
452
|
return execFileSync('git', args, {
|
|
448
453
|
cwd,
|
|
449
454
|
encoding: 'utf-8',
|
|
455
|
+
env: discoveryEnv(),
|
|
450
456
|
stdio: ['ignore', 'pipe', 'ignore'],
|
|
451
457
|
}).trim();
|
|
452
458
|
}
|
|
@@ -953,8 +959,17 @@ function gateEnvironment(env, overlay) {
|
|
|
953
959
|
const merged = { ...env, ...overlay };
|
|
954
960
|
return { ...merged, ...heavyToolEnv('test', merged) };
|
|
955
961
|
}
|
|
956
|
-
/**
|
|
957
|
-
|
|
962
|
+
/**
|
|
963
|
+
* Resolve the actual executable inputs once using the same rules as process
|
|
964
|
+
* launch. Exported so `cleo goal draft` spells a gate's command exactly as it
|
|
965
|
+
* runs (T13793).
|
|
966
|
+
*
|
|
967
|
+
* @param gate - The gate.
|
|
968
|
+
* @param root - Project root its `cwd` resolves against.
|
|
969
|
+
* @param env - Environment the gate's `env` overlays.
|
|
970
|
+
* @returns The invocation, or undefined for a gate that runs no process.
|
|
971
|
+
*/
|
|
972
|
+
export function executableInvocation(gate, root, env) {
|
|
958
973
|
if (gate.kind !== 'test' && gate.kind !== 'command' && gate.kind !== 'lint')
|
|
959
974
|
return undefined;
|
|
960
975
|
// T12718: quoted words are honoured and shell syntax is refused. A plain
|
|
@@ -1299,7 +1314,12 @@ storeRoot = projectRoot) {
|
|
|
1299
1314
|
*/
|
|
1300
1315
|
async function captureGateCommand(command, args, cwd, timeoutMs, cls, context, overlay) {
|
|
1301
1316
|
const env = gateEnvironment(context.env ?? process.env, overlay);
|
|
1302
|
-
const
|
|
1317
|
+
const plan = planRunFootprint(cls, [command, ...args], env);
|
|
1318
|
+
// The gate spawns with the whole heavy-run env (gateEnvironment), not the
|
|
1319
|
+
// plan's overlay, so a worker-pool plan is charged the whole heavy run (T13759).
|
|
1320
|
+
const footprintBytes = plan.resources !== null && plan.resources.workers > 1
|
|
1321
|
+
? footprintForClass(cls)
|
|
1322
|
+
: (plan.footprintBytes ?? footprintForClass(cls));
|
|
1303
1323
|
const release = await acquireGlobalSlot(cls === 'test-run' ? 'test' : 'lint', {
|
|
1304
1324
|
label: `gate:${cls === 'test-run' ? 'test' : 'command'}`,
|
|
1305
1325
|
footprintBytes,
|
|
@@ -1385,11 +1405,26 @@ function matchingBrace(text, start) {
|
|
|
1385
1405
|
* a report file named by the task could have been produced by any run, of any
|
|
1386
1406
|
* code, at any time. Only the bytes this invocation emitted are bound to it.
|
|
1387
1407
|
*
|
|
1408
|
+
* A non-runner command (a wrapper script) may instead print a bare count
|
|
1409
|
+
* summary ({@link testCountSummarySchema}) as its last stdout line (T13753).
|
|
1410
|
+
*
|
|
1388
1411
|
* @param captured - Result of running the gate command.
|
|
1389
1412
|
* @returns Validated counts, or `null` when the run emitted no usable report.
|
|
1390
1413
|
* @task T12308
|
|
1414
|
+
* @task T13753
|
|
1391
1415
|
*/
|
|
1392
1416
|
function structuredTestCounts(captured) {
|
|
1417
|
+
const lastLine = captured.stdout.trimEnd().split('\n').at(-1)?.trim() ?? '';
|
|
1418
|
+
if (lastLine.startsWith('{')) {
|
|
1419
|
+
try {
|
|
1420
|
+
const summary = testCountSummarySchema.safeParse(JSON.parse(lastLine));
|
|
1421
|
+
if (summary.success)
|
|
1422
|
+
return summary.data;
|
|
1423
|
+
}
|
|
1424
|
+
catch {
|
|
1425
|
+
// Not JSON: fall through to the full-report search.
|
|
1426
|
+
}
|
|
1427
|
+
}
|
|
1393
1428
|
const text = `${captured.stdout}\n${captured.stderr}`.trim();
|
|
1394
1429
|
if (text.length === 0)
|
|
1395
1430
|
return null;
|
|
@@ -1455,11 +1490,19 @@ function describeMissingTestCount(gate) {
|
|
|
1455
1490
|
* are removed before the failure pattern looks at the output (T13511).
|
|
1456
1491
|
*/
|
|
1457
1492
|
const ZERO_FAILURE_COUNT = /\b0\s+(?:fail(?:ed|ing|ures?)?)\b|\bfail(?:ed|ing|ures?)?\s*[:=]?\s*0(?![\d.])/gi;
|
|
1493
|
+
/**
|
|
1494
|
+
* A runner's line for one PASSING test (vitest/jest `✓`, mocha `✔`/`√`, TAP
|
|
1495
|
+
* `ok 3 - name`, jest `PASS file`): its text is a test name, never a verdict
|
|
1496
|
+
* (T13752). TAP `not ok` does not match.
|
|
1497
|
+
*/
|
|
1498
|
+
const PASSING_TEST_LINE = /^\s*(?:[✓✔√]|ok\s+\d|PASS\s).*$/gmu;
|
|
1458
1499
|
/**
|
|
1459
1500
|
* Whether a test command's output reports a failure, for `expect: 'pass'`:
|
|
1460
1501
|
* a `FAIL`, `failing` or `Error:` token, after removing summaries that report
|
|
1461
1502
|
* zero failures (T13511 — `node --test` prints `ℹ fail 0` on success, which
|
|
1462
|
-
* the bare pattern read as a failure)
|
|
1503
|
+
* the bare pattern read as a failure) and passing-test lines, whose test names
|
|
1504
|
+
* routinely say "failure" (T13752). A non-zero count still matches.
|
|
1505
|
+
* Only consulted when the run emitted no structured report.
|
|
1463
1506
|
*
|
|
1464
1507
|
* @param stdout - The command's captured stdout.
|
|
1465
1508
|
* @returns True when the output reports a failure.
|
|
@@ -1469,36 +1512,37 @@ const ZERO_FAILURE_COUNT = /\b0\s+(?:fail(?:ed|ing|ures?)?)\b|\bfail(?:ed|ing|ur
|
|
|
1469
1512
|
* outputReportsFailure('ℹ pass 2\nℹ fail 1'); // true
|
|
1470
1513
|
* ```
|
|
1471
1514
|
* @task T13511
|
|
1515
|
+
* @task T13752
|
|
1472
1516
|
*/
|
|
1473
1517
|
export function outputReportsFailure(stdout) {
|
|
1474
1518
|
// T13516: a non-zero count (`3 failed`, `1 failure`) is a failure too; the
|
|
1475
1519
|
// FAIL token alone needs a word boundary, so `failed` never matched it.
|
|
1476
|
-
return /\bFAIL\b|failing|Error:|\b[1-9]\d*\s+fail(?:ed|ures?)\b/i.test(stdout.replace(ZERO_FAILURE_COUNT, ''));
|
|
1520
|
+
return /\bFAIL\b|failing|Error:|\b[1-9]\d*\s+fail(?:ed|ures?)\b/i.test(stdout.replace(PASSING_TEST_LINE, '').replace(ZERO_FAILURE_COUNT, ''));
|
|
1477
1521
|
}
|
|
1478
1522
|
async function runTestGate(gate, index, projectRoot, timeoutMs, context) {
|
|
1479
1523
|
const invocation = executableInvocation(gate, projectRoot, context.env ?? process.env);
|
|
1480
1524
|
const captured = await captureGateCommand(invocation.command, invocation.args, invocation.cwd, timeoutMs, 'test-run', context, gate.env);
|
|
1481
|
-
|
|
1482
|
-
//
|
|
1483
|
-
|
|
1484
|
-
//
|
|
1485
|
-
//
|
|
1486
|
-
//
|
|
1525
|
+
// T13752: a structured report decides the verdict; the text heuristic only
|
|
1526
|
+
// runs without one, since report JSON and test names are full of "failure".
|
|
1527
|
+
const counts = structuredTestCounts(captured);
|
|
1528
|
+
// T12308: the counts come from this run's own validated report; only their
|
|
1529
|
+
// ABSENCE is an error, because inferring a count from exit zero is the thing
|
|
1530
|
+
// that must not happen. T13753: the error keeps the run's execution record.
|
|
1487
1531
|
if (gate.minCount !== undefined && gate.minCount > 0) {
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1532
|
+
if (counts === null)
|
|
1533
|
+
return processGateResult(index, gate, captured, 'error', describeMissingTestCount(gate));
|
|
1534
|
+
if (counts.numPassedTests < gate.minCount)
|
|
1535
|
+
return processGateResult(index, gate, captured, 'fail', `Structured report counts ${counts.numPassedTests} passing tests, below the required minimum of ${gate.minCount}`);
|
|
1536
|
+
}
|
|
1537
|
+
if (captured.exitCode !== 0)
|
|
1538
|
+
return processGateResult(index, gate, captured, 'fail', `Exit code ${captured.exitCode}`);
|
|
1539
|
+
if (gate.expect === 'pass') {
|
|
1540
|
+
if (counts !== null && ((counts.numFailedTests ?? 0) > 0 || counts.success === false))
|
|
1541
|
+
return processGateResult(index, gate, captured, 'fail', `Structured report counts ${counts.numFailedTests ?? 0} failing tests (success: ${counts.success ?? 'unreported'})`);
|
|
1542
|
+
if (counts === null && outputReportsFailure(captured.stdout))
|
|
1543
|
+
return processGateResult(index, gate, captured, 'fail', 'Failure pattern detected in output');
|
|
1498
1544
|
}
|
|
1499
|
-
return processGateResult(index, gate, captured,
|
|
1500
|
-
? 'Failure pattern detected in output'
|
|
1501
|
-
: `Exit code ${captured.exitCode}`);
|
|
1545
|
+
return processGateResult(index, gate, captured, 'pass');
|
|
1502
1546
|
}
|
|
1503
1547
|
// ─── File gate ────────────────────────────────────────────────────────────────
|
|
1504
1548
|
async function runFileGate(gate, index, projectRoot, context, storeRoot = projectRoot) {
|
|
@@ -1663,8 +1707,12 @@ async function runCommandGate(gate, index, projectRoot, timeoutMs, context) {
|
|
|
1663
1707
|
reason = 'stderr pattern did not match';
|
|
1664
1708
|
return processGateResult(index, gate, captured, reason ? 'fail' : 'pass', reason);
|
|
1665
1709
|
}
|
|
1666
|
-
/**
|
|
1667
|
-
|
|
1710
|
+
/**
|
|
1711
|
+
* Tool-specific executable, default arguments and failure pattern of a typed
|
|
1712
|
+
* lint gate. A gate fails on a non-zero exit, and with `expect: 'clean'` also
|
|
1713
|
+
* when the output matches `errorPattern`. Shared with `cleo goal draft` (T13793).
|
|
1714
|
+
*/
|
|
1715
|
+
export const LINT_TOOL_DEFAULTS = {
|
|
1668
1716
|
biome: { cmd: 'biome', defaultArgs: ['check', '.'] },
|
|
1669
1717
|
eslint: { cmd: 'eslint', defaultArgs: ['.'] },
|
|
1670
1718
|
tsc: { cmd: 'tsc', defaultArgs: ['--noEmit'] },
|