@tokenfactory/acc-runner 0.41.7 → 0.43.0
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/README.md +87 -4
- package/dist/acc.d.ts +3 -0
- package/dist/acc.d.ts.map +1 -0
- package/dist/acc.js +21 -0
- package/dist/acc.js.map +1 -0
- package/dist/cli-name.d.ts +29 -0
- package/dist/cli-name.d.ts.map +1 -0
- package/dist/cli-name.js +17 -0
- package/dist/cli-name.js.map +1 -0
- package/dist/cli.d.ts +20 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +45 -289
- package/dist/cli.js.map +1 -1
- package/dist/engines/account-probe.d.ts +24 -0
- package/dist/engines/account-probe.d.ts.map +1 -1
- package/dist/engines/account-probe.js +18 -1
- package/dist/engines/account-probe.js.map +1 -1
- package/dist/keychain.d.ts +17 -0
- package/dist/keychain.d.ts.map +1 -1
- package/dist/keychain.js +36 -0
- package/dist/keychain.js.map +1 -1
- package/dist/login.d.ts +45 -1
- package/dist/login.d.ts.map +1 -1
- package/dist/login.js +91 -4
- package/dist/login.js.map +1 -1
- package/dist/machine-capabilities/index.d.ts +21 -0
- package/dist/machine-capabilities/index.d.ts.map +1 -0
- package/dist/machine-capabilities/index.js +21 -0
- package/dist/machine-capabilities/index.js.map +1 -0
- package/dist/machine-capabilities/probe.d.ts +61 -0
- package/dist/machine-capabilities/probe.d.ts.map +1 -0
- package/dist/machine-capabilities/probe.js +243 -0
- package/dist/machine-capabilities/probe.js.map +1 -0
- package/dist/machine-capabilities/redact.d.ts +42 -0
- package/dist/machine-capabilities/redact.d.ts.map +1 -0
- package/dist/machine-capabilities/redact.js +160 -0
- package/dist/machine-capabilities/redact.js.map +1 -0
- package/dist/machine-capabilities/report.d.ts +107 -0
- package/dist/machine-capabilities/report.d.ts.map +1 -0
- package/dist/machine-capabilities/report.js +211 -0
- package/dist/machine-capabilities/report.js.map +1 -0
- package/dist/machine-capabilities/types.d.ts +115 -0
- package/dist/machine-capabilities/types.d.ts.map +1 -0
- package/dist/machine-capabilities/types.js +11 -0
- package/dist/machine-capabilities/types.js.map +1 -0
- package/dist/migration-seq-guard.d.ts +78 -0
- package/dist/migration-seq-guard.d.ts.map +1 -0
- package/dist/migration-seq-guard.js +304 -0
- package/dist/migration-seq-guard.js.map +1 -0
- package/dist/node-version.d.ts +132 -0
- package/dist/node-version.d.ts.map +1 -0
- package/dist/node-version.js +318 -0
- package/dist/node-version.js.map +1 -0
- package/dist/prepr-gate.d.ts +120 -0
- package/dist/prepr-gate.d.ts.map +1 -1
- package/dist/prepr-gate.js +202 -3
- package/dist/prepr-gate.js.map +1 -1
- package/dist/program.d.ts +16 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +355 -0
- package/dist/program.js.map +1 -0
- package/dist/runtime/review-chunking.d.ts +101 -0
- package/dist/runtime/review-chunking.d.ts.map +1 -0
- package/dist/runtime/review-chunking.js +192 -0
- package/dist/runtime/review-chunking.js.map +1 -0
- package/dist/runtime/review-diff.d.ts +30 -0
- package/dist/runtime/review-diff.d.ts.map +1 -0
- package/dist/runtime/review-diff.js +59 -0
- package/dist/runtime/review-diff.js.map +1 -0
- package/dist/runtime/reviewer.d.ts +40 -19
- package/dist/runtime/reviewer.d.ts.map +1 -1
- package/dist/runtime/reviewer.js +252 -51
- package/dist/runtime/reviewer.js.map +1 -1
- package/dist/serve-scope/command.d.ts +12 -0
- package/dist/serve-scope/command.d.ts.map +1 -0
- package/dist/serve-scope/command.js +89 -0
- package/dist/serve-scope/command.js.map +1 -0
- package/dist/serve-scope/index.d.ts +130 -0
- package/dist/serve-scope/index.d.ts.map +1 -0
- package/dist/serve-scope/index.js +148 -0
- package/dist/serve-scope/index.js.map +1 -0
- package/dist/task-runner.d.ts +11 -0
- package/dist/task-runner.d.ts.map +1 -1
- package/dist/task-runner.js +69 -0
- package/dist/task-runner.js.map +1 -1
- package/dist/user-auth/device-login.d.ts +47 -0
- package/dist/user-auth/device-login.d.ts.map +1 -0
- package/dist/user-auth/device-login.js +189 -0
- package/dist/user-auth/device-login.js.map +1 -0
- package/dist/user-auth/liveness.d.ts +27 -0
- package/dist/user-auth/liveness.d.ts.map +1 -0
- package/dist/user-auth/liveness.js +128 -0
- package/dist/user-auth/liveness.js.map +1 -0
- package/dist/user-auth/session.d.ts +82 -0
- package/dist/user-auth/session.d.ts.map +1 -0
- package/dist/user-auth/session.js +172 -0
- package/dist/user-auth/session.js.map +1 -0
- package/dist/user-cli/chat.d.ts +44 -0
- package/dist/user-cli/chat.d.ts.map +1 -0
- package/dist/user-cli/chat.js +199 -0
- package/dist/user-cli/chat.js.map +1 -0
- package/dist/user-cli/client.d.ts +20 -0
- package/dist/user-cli/client.d.ts.map +1 -0
- package/dist/user-cli/client.js +60 -0
- package/dist/user-cli/client.js.map +1 -0
- package/dist/user-cli/tasks.d.ts +37 -0
- package/dist/user-cli/tasks.d.ts.map +1 -0
- package/dist/user-cli/tasks.js +131 -0
- package/dist/user-cli/tasks.js.map +1 -0
- package/dist/watch.d.ts +8 -0
- package/dist/watch.d.ts.map +1 -1
- package/dist/watch.js +28 -0
- package/dist/watch.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TESTENV-NODE-PIN: resolve the node version the REPO pins, not the one the
|
|
3
|
+
* runner happens to be launched with.
|
|
4
|
+
*
|
|
5
|
+
* WHY THIS EXISTS
|
|
6
|
+
* ----------------------------------------------------------------------------
|
|
7
|
+
* The pre-PR gate (prepr-gate.ts) runs the repo's own `pnpm test` inside the task
|
|
8
|
+
* worktree. It inherited the runner process's node — on the fleet's macOS host a
|
|
9
|
+
* Homebrew node 26 — while CI, which is authoritative and green, runs node 22
|
|
10
|
+
* (`actions/setup-node` `node-version: 22` in every workflow). jsdom 25's DOM is
|
|
11
|
+
* incomplete under node 23+: `window.localStorage` is absent, so zustand's
|
|
12
|
+
* persist middleware gets an undefined storage and EVERY store-backed UI suite
|
|
13
|
+
* dies with `Cannot read properties of undefined (reading 'setItem')`. The gate
|
|
14
|
+
* read that as "this task broke the UI suites", refused to open the PR, and the
|
|
15
|
+
* task dead-lettered — a pure false-fail (it near-rejected #1836 as INFRA).
|
|
16
|
+
*
|
|
17
|
+
* So the gate must stop trusting whatever `node` is first on PATH. This module
|
|
18
|
+
* answers one question — "which node does THIS repo want, and where is it on
|
|
19
|
+
* this host?" — and hands back a bin dir to prepend to PATH. The runner's global
|
|
20
|
+
* node then no longer matters.
|
|
21
|
+
*
|
|
22
|
+
* Read order for the pin: `.nvmrc` (what `nvm use` reads, so humans and the
|
|
23
|
+
* runner agree), then `package.json` `engines.node`. A `.nvmrc` alias this module
|
|
24
|
+
* cannot resolve without nvm's alias table (`lts/*`, `node`, `stable`) is treated
|
|
25
|
+
* as NO pin rather than guessed at.
|
|
26
|
+
*
|
|
27
|
+
* Discovery covers the version managers actually found on runner hosts (nvm, fnm,
|
|
28
|
+
* volta, asdf, n) plus an explicit `ACC_RUNNER_NODE_BIN_DIR` escape hatch for a
|
|
29
|
+
* host that installs node anywhere else. Nothing is ever installed or downloaded:
|
|
30
|
+
* when no matching node exists the resolution says so (`satisfied: false`) and
|
|
31
|
+
* the caller degrades — it is diagnosis, never a silent second failure mode.
|
|
32
|
+
*
|
|
33
|
+
* Every I/O boundary is an injectable dep, so the unit suite drives the whole
|
|
34
|
+
* resolver over a fake host filesystem and never reads the real one.
|
|
35
|
+
*/
|
|
36
|
+
import path from "node:path";
|
|
37
|
+
import os from "node:os";
|
|
38
|
+
import fs from "node:fs/promises";
|
|
39
|
+
import { augmentedPathFrom } from "./bin-resolve.js";
|
|
40
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
41
|
+
// Types
|
|
42
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
43
|
+
/** Worktree-relative path of the file `nvm use` reads. */
|
|
44
|
+
export const NVMRC_REL = ".nvmrc";
|
|
45
|
+
/**
|
|
46
|
+
* Explicit escape hatch: a bin dir containing the node the gates must run under.
|
|
47
|
+
* Set it on a host whose node lives outside every layout below. Trusted as
|
|
48
|
+
* declared — the version behind it is not re-verified (that would cost a spawn).
|
|
49
|
+
*/
|
|
50
|
+
export const NODE_BIN_DIR_ENV = "ACC_RUNNER_NODE_BIN_DIR";
|
|
51
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
52
|
+
// Pure parsing / comparison helpers
|
|
53
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
54
|
+
/**
|
|
55
|
+
* The version a `.nvmrc` names, normalised without the leading `v`. Comments and
|
|
56
|
+
* blank lines are skipped (nvm allows both). Returns null for an ALIAS
|
|
57
|
+
* (`lts/*`, `node`, `stable`, `iron`) — resolving one needs nvm's alias table,
|
|
58
|
+
* and guessing is worse than reporting "unpinned" and falling back to `engines`.
|
|
59
|
+
*/
|
|
60
|
+
export function parseNvmrc(text) {
|
|
61
|
+
for (const raw of text.split("\n")) {
|
|
62
|
+
const line = raw.trim();
|
|
63
|
+
if (!line || line.startsWith("#"))
|
|
64
|
+
continue;
|
|
65
|
+
const m = /^v?(\d+(?:\.\d+){0,2})$/.exec(line);
|
|
66
|
+
return m ? m[1] : null;
|
|
67
|
+
}
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* The major version an `engines.node` RANGE requires, as a major-only pin
|
|
72
|
+
* (`">=22 <23"` → `22`, `"22.x"` → `22`, `"^22.20.0"` → `22`). A range is a
|
|
73
|
+
* range: even when it names a patch we only ever pin the major, so `>=22.20.0
|
|
74
|
+
* <23` is satisfied by 22.21.0. Returns null when no number can be read.
|
|
75
|
+
*/
|
|
76
|
+
export function parseEnginesRange(range) {
|
|
77
|
+
const m = /(\d+)/.exec(range);
|
|
78
|
+
return m ? m[1] : null;
|
|
79
|
+
}
|
|
80
|
+
/** Build a `NodePin` from a normalised spec, or null when it is unusable. */
|
|
81
|
+
export function nodePinFrom(spec, source) {
|
|
82
|
+
const parts = /^(\d+)(?:\.(\d+))?(?:\.(\d+))?$/.exec(spec.trim());
|
|
83
|
+
if (!parts)
|
|
84
|
+
return null;
|
|
85
|
+
const major = Number(parts[1]);
|
|
86
|
+
const exact = parts[2] !== undefined && parts[3] !== undefined
|
|
87
|
+
? `${parts[1]}.${parts[2]}.${parts[3]}`
|
|
88
|
+
: null;
|
|
89
|
+
return { spec: spec.trim(), major, exact, source };
|
|
90
|
+
}
|
|
91
|
+
/** `[major, minor, patch]` of a version string, or null when unparseable. */
|
|
92
|
+
export function parseNodeVersion(v) {
|
|
93
|
+
const m = /^v?(\d+)\.(\d+)\.(\d+)/.exec(v.trim());
|
|
94
|
+
return m ? [Number(m[1]), Number(m[2]), Number(m[3])] : null;
|
|
95
|
+
}
|
|
96
|
+
/** Ascending comparison; unparseable versions sort first. */
|
|
97
|
+
export function compareNodeVersions(a, b) {
|
|
98
|
+
const pa = parseNodeVersion(a);
|
|
99
|
+
const pb = parseNodeVersion(b);
|
|
100
|
+
if (!pa)
|
|
101
|
+
return pb ? -1 : 0;
|
|
102
|
+
if (!pb)
|
|
103
|
+
return 1;
|
|
104
|
+
for (let i = 0; i < 3; i++) {
|
|
105
|
+
if (pa[i] !== pb[i])
|
|
106
|
+
return pa[i] - pb[i];
|
|
107
|
+
}
|
|
108
|
+
return 0;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* True when `version` satisfies `pin`: the major must match, and when the pin
|
|
112
|
+
* names an exact `x.y.z` that must match too. An unparseable version satisfies
|
|
113
|
+
* nothing (fail closed — an unknown node is not assumed correct).
|
|
114
|
+
*/
|
|
115
|
+
export function satisfiesPin(version, pin) {
|
|
116
|
+
const parsed = parseNodeVersion(version);
|
|
117
|
+
if (!parsed)
|
|
118
|
+
return false;
|
|
119
|
+
if (parsed[0] !== pin.major)
|
|
120
|
+
return false;
|
|
121
|
+
if (pin.exact)
|
|
122
|
+
return `${parsed[0]}.${parsed[1]}.${parsed[2]}` === pin.exact;
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* The HIGHEST version in `versions` that satisfies `pin`, or null when none
|
|
127
|
+
* does. Highest, not first: on a host with 22.11.0 and 22.20.0 installed the
|
|
128
|
+
* newer patch is the one CI's `node-version: 22` would resolve to.
|
|
129
|
+
*/
|
|
130
|
+
export function pickPinnedInstall(versions, pin) {
|
|
131
|
+
const matching = versions.filter((v) => satisfiesPin(v, pin));
|
|
132
|
+
if (matching.length === 0)
|
|
133
|
+
return null;
|
|
134
|
+
return matching.sort(compareNodeVersions)[matching.length - 1];
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Version-manager roots to search, in preference order. Honours each manager's
|
|
138
|
+
* own env override so a non-default install location still resolves. Directories
|
|
139
|
+
* that do not exist are simply skipped by the caller — listing them is the probe.
|
|
140
|
+
*/
|
|
141
|
+
export function nodeInstallRoots(env, homedir) {
|
|
142
|
+
const nvm = env.NVM_DIR?.trim() || path.join(homedir, ".nvm");
|
|
143
|
+
const fnm = env.FNM_DIR?.trim() || path.join(homedir, ".fnm");
|
|
144
|
+
const asdf = env.ASDF_DATA_DIR?.trim() || path.join(homedir, ".asdf");
|
|
145
|
+
const nPrefix = env.N_PREFIX?.trim() || "/usr/local";
|
|
146
|
+
const volta = path.join(homedir, ".volta", "tools", "image", "node");
|
|
147
|
+
const nvmVersions = path.join(nvm, "versions", "node");
|
|
148
|
+
const fnmVersions = path.join(fnm, "node-versions");
|
|
149
|
+
const asdfVersions = path.join(asdf, "installs", "nodejs");
|
|
150
|
+
const nVersions = path.join(nPrefix, "n", "versions", "node");
|
|
151
|
+
return [
|
|
152
|
+
{ layout: "nvm", dir: nvmVersions, binDirFor: (e) => path.join(nvmVersions, e, "bin") },
|
|
153
|
+
{
|
|
154
|
+
layout: "fnm",
|
|
155
|
+
dir: fnmVersions,
|
|
156
|
+
// fnm nests the install under `installation/`.
|
|
157
|
+
binDirFor: (e) => path.join(fnmVersions, e, "installation", "bin"),
|
|
158
|
+
},
|
|
159
|
+
{ layout: "volta", dir: volta, binDirFor: (e) => path.join(volta, e, "bin") },
|
|
160
|
+
{ layout: "asdf", dir: asdfVersions, binDirFor: (e) => path.join(asdfVersions, e, "bin") },
|
|
161
|
+
{ layout: "n", dir: nVersions, binDirFor: (e) => path.join(nVersions, e, "bin") },
|
|
162
|
+
];
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Prepend `binDir` to a launchd-safe PATH (see bin-resolve.ts) so the pinned
|
|
166
|
+
* node wins every lookup — including `pnpm`'s own shebang, which is what makes
|
|
167
|
+
* the whole `pnpm run test` subtree inherit it. Idempotent: an already-leading
|
|
168
|
+
* `binDir` is not duplicated.
|
|
169
|
+
*/
|
|
170
|
+
export function withPinnedNodePath(env, binDir) {
|
|
171
|
+
const augmented = augmentedPathFrom(env.PATH);
|
|
172
|
+
if (!binDir)
|
|
173
|
+
return { ...env, PATH: augmented };
|
|
174
|
+
const parts = augmented.split(":").filter((p) => p !== binDir);
|
|
175
|
+
return { ...env, PATH: [binDir, ...parts].join(":") };
|
|
176
|
+
}
|
|
177
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
178
|
+
// Default I/O
|
|
179
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
180
|
+
async function defaultReadTextFile(abs) {
|
|
181
|
+
return fs.readFile(abs, "utf8");
|
|
182
|
+
}
|
|
183
|
+
async function defaultListDir(abs) {
|
|
184
|
+
return fs.readdir(abs);
|
|
185
|
+
}
|
|
186
|
+
async function defaultIsExecutable(abs) {
|
|
187
|
+
try {
|
|
188
|
+
await fs.access(abs, fs.constants.X_OK);
|
|
189
|
+
return true;
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
196
|
+
// The resolver
|
|
197
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
198
|
+
/**
|
|
199
|
+
* The repo's declared node pin: `.nvmrc` first (it is what a human's `nvm use`
|
|
200
|
+
* obeys, so runner and human never disagree), then `package.json`
|
|
201
|
+
* `engines.node`. Null when neither declares a readable version.
|
|
202
|
+
*/
|
|
203
|
+
export async function readRepoNodePin(workdir, deps = {}) {
|
|
204
|
+
const readTextFile = deps.readTextFile ?? defaultReadTextFile;
|
|
205
|
+
try {
|
|
206
|
+
const spec = parseNvmrc(await readTextFile(path.join(workdir, NVMRC_REL)));
|
|
207
|
+
if (spec) {
|
|
208
|
+
const pin = nodePinFrom(spec, ".nvmrc");
|
|
209
|
+
if (pin)
|
|
210
|
+
return pin;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
// No .nvmrc (or unreadable) — fall through to engines.
|
|
215
|
+
}
|
|
216
|
+
try {
|
|
217
|
+
const raw = JSON.parse(await readTextFile(path.join(workdir, "package.json")));
|
|
218
|
+
const range = raw?.engines?.node;
|
|
219
|
+
if (typeof range === "string") {
|
|
220
|
+
const spec = parseEnginesRange(range);
|
|
221
|
+
if (spec)
|
|
222
|
+
return nodePinFrom(spec, "package.json engines.node");
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
// Missing/unparseable package.json — no pin.
|
|
227
|
+
}
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Resolve which node the repo's gates must run under, and where it is.
|
|
232
|
+
*
|
|
233
|
+
* Order: no pin → nothing to enforce; current node satisfies → run as-is (the
|
|
234
|
+
* common case, and it costs one file read); `ACC_RUNNER_NODE_BIN_DIR` →
|
|
235
|
+
* trusted as declared; then each version-manager layout, highest matching patch
|
|
236
|
+
* wins; finally `unresolved`, which the caller surfaces rather than papering
|
|
237
|
+
* over.
|
|
238
|
+
*/
|
|
239
|
+
export async function resolvePinnedNode(workdir, deps = {}) {
|
|
240
|
+
const env = deps.env ?? process.env;
|
|
241
|
+
const homedir = deps.homedir ?? os.homedir();
|
|
242
|
+
const current = (deps.currentVersion ?? process.version).replace(/^v/, "");
|
|
243
|
+
const isExecutable = deps.isExecutable ?? defaultIsExecutable;
|
|
244
|
+
const listDir = deps.listDir ?? defaultListDir;
|
|
245
|
+
const pin = await readRepoNodePin(workdir, deps);
|
|
246
|
+
if (!pin) {
|
|
247
|
+
return {
|
|
248
|
+
pin: null,
|
|
249
|
+
effective: current,
|
|
250
|
+
satisfied: true,
|
|
251
|
+
binDir: null,
|
|
252
|
+
source: "unpinned",
|
|
253
|
+
note: `repo declares no node version (no ${NVMRC_REL}, no engines.node) — running gates under node ${current}`,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
if (satisfiesPin(current, pin)) {
|
|
257
|
+
return {
|
|
258
|
+
pin,
|
|
259
|
+
effective: current,
|
|
260
|
+
satisfied: true,
|
|
261
|
+
binDir: null,
|
|
262
|
+
source: "current",
|
|
263
|
+
note: `node ${current} satisfies the repo pin ${pin.spec} (${pin.source})`,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
const explicit = env[NODE_BIN_DIR_ENV]?.trim();
|
|
267
|
+
if (explicit) {
|
|
268
|
+
if (await isExecutable(path.join(explicit, "node"))) {
|
|
269
|
+
return {
|
|
270
|
+
pin,
|
|
271
|
+
effective: null,
|
|
272
|
+
satisfied: true,
|
|
273
|
+
binDir: explicit,
|
|
274
|
+
source: "explicit",
|
|
275
|
+
note: `node ${current} does not satisfy the repo pin ${pin.spec} (${pin.source}); ` +
|
|
276
|
+
`using ${NODE_BIN_DIR_ENV}=${explicit} as declared (version not re-verified)`,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
// A set-but-broken override is a configuration bug worth naming; keep
|
|
280
|
+
// searching the layouts rather than failing outright.
|
|
281
|
+
}
|
|
282
|
+
for (const root of nodeInstallRoots(env, homedir)) {
|
|
283
|
+
let entries;
|
|
284
|
+
try {
|
|
285
|
+
entries = await listDir(root.dir);
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
continue; // manager not installed here
|
|
289
|
+
}
|
|
290
|
+
const picked = pickPinnedInstall(entries, pin);
|
|
291
|
+
if (!picked)
|
|
292
|
+
continue;
|
|
293
|
+
const binDir = root.binDirFor(picked);
|
|
294
|
+
if (!(await isExecutable(path.join(binDir, "node"))))
|
|
295
|
+
continue;
|
|
296
|
+
return {
|
|
297
|
+
pin,
|
|
298
|
+
effective: picked.replace(/^v/, ""),
|
|
299
|
+
satisfied: true,
|
|
300
|
+
binDir,
|
|
301
|
+
source: root.layout,
|
|
302
|
+
note: `node ${current} does not satisfy the repo pin ${pin.spec} (${pin.source}) — ` +
|
|
303
|
+
`running gates under ${root.layout} node ${picked.replace(/^v/, "")} (${binDir})`,
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
return {
|
|
307
|
+
pin,
|
|
308
|
+
effective: current,
|
|
309
|
+
satisfied: false,
|
|
310
|
+
binDir: null,
|
|
311
|
+
source: "unresolved",
|
|
312
|
+
note: `node ${current} does not satisfy the repo pin ${pin.spec} (${pin.source}) and no ` +
|
|
313
|
+
`matching install was found (searched nvm/fnm/volta/asdf/n) — gates will run under ` +
|
|
314
|
+
`node ${current}; install it (e.g. \`nvm install ${pin.major}\`) or set ` +
|
|
315
|
+
`${NODE_BIN_DIR_ENV} to its bin dir`,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
//# sourceMappingURL=node-version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-version.js","sourceRoot":"","sources":["../src/node-version.ts"],"names":[],"mappings":"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"}
|
package/dist/prepr-gate.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type PinnedNodeResolution } from "./node-version.js";
|
|
1
2
|
export type PreprGateName = "nul-check" | "scope" | "typecheck" | "lint" | "build" | "test" | "migration-lint";
|
|
2
3
|
/**
|
|
3
4
|
* Run order. typecheck → lint → build → test mirrors the CLAUDE.md quality-gate
|
|
@@ -62,6 +63,21 @@ export interface PreprGateResult {
|
|
|
62
63
|
/** Tail of the failing suite's output — kept for the operator. */
|
|
63
64
|
outputTail: string;
|
|
64
65
|
};
|
|
66
|
+
/**
|
|
67
|
+
* TESTENV-NODE-PIN: set when the `test` gate FAILED for ENVIRONMENT reasons
|
|
68
|
+
* (`needs-env`) rather than because of anything this task changed. `ok` stays
|
|
69
|
+
* `true` and no `failure` is set — a broken test environment is an INFRA fault,
|
|
70
|
+
* never a code-defect gate failure. The caller logs `reviewerNotice` verbatim so
|
|
71
|
+
* the reviewer classifies it as INFRA instead of rejecting the PR.
|
|
72
|
+
*/
|
|
73
|
+
testEnvironmentFailure?: TestEnvironmentFailure;
|
|
74
|
+
/**
|
|
75
|
+
* TESTENV-NODE-PIN: which node the gates actually ran under, and how it was
|
|
76
|
+
* resolved against the repo's `.nvmrc` / `engines.node`. Present whenever the
|
|
77
|
+
* gate resolved a pin (i.e. for the default gate runner); `satisfied: false`
|
|
78
|
+
* means the host had no matching node and the gates ran off-pin. Log-safe.
|
|
79
|
+
*/
|
|
80
|
+
node?: PinnedNodeResolution;
|
|
65
81
|
/**
|
|
66
82
|
* MIGFIX-01: set when the pre-PR auto-renumber (opt-in) renamed a NEW migration
|
|
67
83
|
* to the next contiguous seq before the seq-lint ran. `output` is the
|
|
@@ -212,6 +228,21 @@ export interface PreprGateDeps {
|
|
|
212
228
|
* task-runner.ts, outside this track's scope.
|
|
213
229
|
*/
|
|
214
230
|
loadKnownTestFailures?: (workdir: string) => Promise<PreprKnownFailures | null>;
|
|
231
|
+
/**
|
|
232
|
+
* TESTENV-NODE-PIN: resolve the node the gates must run under (the repo's
|
|
233
|
+
* `.nvmrc` / `engines.node`) and where it lives on this host. Default:
|
|
234
|
+
* `resolvePinnedNode` — but only when `runGate` is NOT injected, because an
|
|
235
|
+
* injected gate runner owns its own environment and the unit suite must not
|
|
236
|
+
* touch the host's node installs. Inject explicitly to drive the pin logic
|
|
237
|
+
* (including the off-pin case) in tests.
|
|
238
|
+
*/
|
|
239
|
+
resolveNode?: (workdir: string) => Promise<PinnedNodeResolution>;
|
|
240
|
+
/**
|
|
241
|
+
* TESTENV-NODE-PIN: classify a failed `test` gate's output as an environment
|
|
242
|
+
* fault or not. Default: `classifyTestEnvironmentFailure`. Injectable so a repo
|
|
243
|
+
* with a different test stack can supply its own signatures.
|
|
244
|
+
*/
|
|
245
|
+
classifyTestEnvironment?: (output: string, ctx: TestEnvironmentContext) => TestEnvironmentVerdict;
|
|
215
246
|
/**
|
|
216
247
|
* RF-14: recover the failing test ids from the failed `test` gate's own output.
|
|
217
248
|
* Default: `extractVitestFailures` (parses vitest's `FAIL <file> > <name>`
|
|
@@ -247,6 +278,88 @@ export interface PreprTestFailureScan {
|
|
|
247
278
|
*/
|
|
248
279
|
complete: boolean;
|
|
249
280
|
}
|
|
281
|
+
/** The single classification this module assigns to an environment fault. */
|
|
282
|
+
export declare const NEEDS_ENV_CLASSIFICATION: "needs-env";
|
|
283
|
+
/**
|
|
284
|
+
* Prefix the reviewer already recognises for a harness fault it must not blame the
|
|
285
|
+
* PR for (`api/_lib/reviewer-agent.ts` emits the same shape for a truncated diff).
|
|
286
|
+
* Reusing the exact wording is deliberate: it is how "not a defect" travels.
|
|
287
|
+
*/
|
|
288
|
+
export declare const INFRA_NOTICE_PREFIX = "INFRA NOTICE \u2014";
|
|
289
|
+
export interface TestEnvironmentSignature {
|
|
290
|
+
/** Stable id, used in logs and asserted by the unit suite. */
|
|
291
|
+
id: string;
|
|
292
|
+
re: RegExp;
|
|
293
|
+
/**
|
|
294
|
+
* HARD signatures are environment faults on any host: the test environment
|
|
295
|
+
* itself could not be loaded, so no assertion in the suite ever ran and the
|
|
296
|
+
* result says nothing about the task's code.
|
|
297
|
+
*
|
|
298
|
+
* SOFT signatures are DOM-shaped symptoms that a code defect could also
|
|
299
|
+
* produce (`document is not defined` in a suite that forgot its environment).
|
|
300
|
+
* They only count as environment when the suite provably ran under a node the
|
|
301
|
+
* repo does not pin — otherwise they block exactly as before.
|
|
302
|
+
*/
|
|
303
|
+
hard: boolean;
|
|
304
|
+
/** Operator-facing explanation of what the signature means. */
|
|
305
|
+
hint: string;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Signatures of "the test ENVIRONMENT is broken", not "the code is broken".
|
|
309
|
+
* Ordered most-specific first; the first match wins.
|
|
310
|
+
*/
|
|
311
|
+
export declare const TEST_ENVIRONMENT_SIGNATURES: TestEnvironmentSignature[];
|
|
312
|
+
/** What the classifier knows about the node the suite ran under. */
|
|
313
|
+
export interface TestEnvironmentContext {
|
|
314
|
+
/**
|
|
315
|
+
* True when the suite provably ran under a node that does NOT satisfy the
|
|
316
|
+
* repo's pin. This is what promotes a SOFT signature to an environment fault.
|
|
317
|
+
*/
|
|
318
|
+
nodeMismatch?: boolean;
|
|
319
|
+
/** The repo's pin (`22`), for the notice. */
|
|
320
|
+
pin?: string | null;
|
|
321
|
+
/** The node the suite actually ran under, when known. */
|
|
322
|
+
effective?: string | null;
|
|
323
|
+
}
|
|
324
|
+
export interface TestEnvironmentVerdict {
|
|
325
|
+
/** True → `needs-env`: report as INFRA, never block the PR. */
|
|
326
|
+
environment: boolean;
|
|
327
|
+
/** Id of the matched signature, or null when nothing matched. */
|
|
328
|
+
signature: string | null;
|
|
329
|
+
/** Log-safe reason, whichever way it went. */
|
|
330
|
+
reason: string;
|
|
331
|
+
}
|
|
332
|
+
/** The reported shape of an environment-classified `test` gate failure. */
|
|
333
|
+
export interface TestEnvironmentFailure {
|
|
334
|
+
classification: typeof NEEDS_ENV_CLASSIFICATION;
|
|
335
|
+
/** Which signature matched (see `TEST_ENVIRONMENT_SIGNATURES`). */
|
|
336
|
+
signature: string;
|
|
337
|
+
reason: string;
|
|
338
|
+
/** The gate command's exit code (null on signal). */
|
|
339
|
+
exitCode: number | null;
|
|
340
|
+
/** The reviewer-facing INFRA notice — log/PR-safe, quote verbatim. */
|
|
341
|
+
reviewerNotice: string;
|
|
342
|
+
/** Tail of the failing suite's own output, kept for the operator. */
|
|
343
|
+
outputTail: string;
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Decide whether a red `test` gate is an ENVIRONMENT fault (`needs-env`) rather
|
|
347
|
+
* than a defect in the task's code.
|
|
348
|
+
*
|
|
349
|
+
* Fails CLOSED in both directions that matter: an output matching nothing is not
|
|
350
|
+
* an environment fault, and a DOM-shaped (SOFT) match on a host whose node DOES
|
|
351
|
+
* satisfy the repo pin is not one either — there the symptom really is the suite's
|
|
352
|
+
* own problem, and blocking is correct. Only a HARD signature (the environment
|
|
353
|
+
* never loaded, so nothing was actually tested) is trusted unconditionally.
|
|
354
|
+
*/
|
|
355
|
+
export declare function classifyTestEnvironmentFailure(output: string, ctx?: TestEnvironmentContext): TestEnvironmentVerdict;
|
|
356
|
+
/**
|
|
357
|
+
* The reviewer-facing body of an environment-classified `test` failure. Opens with
|
|
358
|
+
* the prefix the reviewer already treats as "harness fault, not a defect", names
|
|
359
|
+
* the signature and the node facts, and states the required handling explicitly so
|
|
360
|
+
* neither the reviewer nor the rework loop charges it to the PR.
|
|
361
|
+
*/
|
|
362
|
+
export declare function formatTestEnvironmentNotice(verdict: TestEnvironmentVerdict, ctx: TestEnvironmentContext, outputTail: string): string;
|
|
250
363
|
/**
|
|
251
364
|
* Text-source extensions the NUL/binary check scans. An allowlist (never a
|
|
252
365
|
* binary denylist) so genuine binary assets — images, fonts, the design export —
|
|
@@ -445,6 +558,13 @@ export declare function formatNewTestFailures(newFailures: string[], preExisting
|
|
|
445
558
|
* Returns `{ ok: true, skipped: true }` when the escape hatch is set, and
|
|
446
559
|
* `{ ok: true, ran: [] }` (a clean pass) when the worktree declares none of
|
|
447
560
|
* the four gate scripts.
|
|
561
|
+
*
|
|
562
|
+
* TESTENV-NODE-PIN: the gates run under the node the WORKTREE pins (`.nvmrc`, else
|
|
563
|
+
* `engines.node`) whenever this call owns the gate environment — `result.node`
|
|
564
|
+
* records which node that was and how it was found. A `test` gate that fails with a
|
|
565
|
+
* test-ENVIRONMENT signature does not set `failure` at all: it comes back
|
|
566
|
+
* `ok: true` with `testEnvironmentFailure` (`needs-env`), whose `reviewerNotice`
|
|
567
|
+
* the caller should log verbatim so the reviewer reads it as INFRA.
|
|
448
568
|
*/
|
|
449
569
|
export declare function runPreprGate(workdir: string, deps?: PreprGateDeps): Promise<PreprGateResult>;
|
|
450
570
|
//# sourceMappingURL=prepr-gate.d.ts.map
|
package/dist/prepr-gate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepr-gate.d.ts","sourceRoot":"","sources":["../src/prepr-gate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"prepr-gate.d.ts","sourceRoot":"","sources":["../src/prepr-gate.ts"],"names":[],"mappings":"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"}
|