@abloh/repository 1.0.1 → 1.0.2-staging.34831384081
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/index.d.ts +365 -155
- package/dist/index.js +1963 -1721
- package/package.json +3 -3
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RepoReader, PackageManifestReading, MatrixLeg, MatrixLegs, FailFastReading, SetupCandidateTrigger, SetupWorkflowCaller, SetupCandidateGate, NativeVocabulary, SetupFailFast, SetupCandidateExclusion, Refusal, YamlQuote, CoverageProviderChoice, MatrixValue, WorkflowNodePin, SetupScriptStep, ValueOrigin, CommandScriptHop, AngularTestTarget, PreparedTestCommand, InitFailureClass, InitQuestionKey, EnvironmentConfig, TargetSelectionKind, EvidenceOutputId, resolvePreparedTestCommand, MeasurementPlan, PackageExclusion } from '@abloh/core';
|
|
1
|
+
import { RepoReader, PackageManifestReading, ProposedFile, MatrixLeg, MatrixLegs, FailFastReading, SetupCandidateTrigger, SetupWorkflowCaller, SetupCandidateGate, NativeVocabulary, SetupFailFast, SetupCandidateExclusion, Refusal, YamlQuote, CoverageProviderChoice, MatrixValue, WorkflowNodePin, SetupScriptStep, ValueOrigin, CommandScriptHop, AngularTestTarget, PreparedTestCommand, InitFailureClass, InitQuestionKey, EnvironmentConfig, TargetSelectionKind, EvidenceOutputId, resolvePreparedTestCommand, MeasurementPlan, PackageExclusion } from '@abloh/core';
|
|
2
2
|
export { SETUP_STEP_ACTION, SETUP_STEP_IF, SETUP_STEP_JOB_STATUS, SETUP_STEP_NAME, setupStepIf } from '@abloh/core';
|
|
3
3
|
import { JasmineSuite, ProofRunner, StrykerMutationRunner } from '@abloh/measure';
|
|
4
4
|
|
|
@@ -56,6 +56,17 @@ interface RepoAccess {
|
|
|
56
56
|
}
|
|
57
57
|
/** The access `abloh init` and every existing caller get: a checkout on this machine. */
|
|
58
58
|
declare function diskRepoAccess(repoDir: string): RepoAccess;
|
|
59
|
+
/**
|
|
60
|
+
* THE SAME ACCESS, READING {@link ProposedFile} BYTES FOR THE PATHS SOMEBODY HAS AGREED TO.
|
|
61
|
+
*
|
|
62
|
+
* WHAT IT IS FOR (the audit's class 5, 2026-09-12). `abloh init` has to draft as if an answered edit
|
|
63
|
+
* to a file of the maintainer's were already there, and it used to do that by writing the file and
|
|
64
|
+
* reading it back - before the confirmation that says abloh has written nothing yet. The root, the
|
|
65
|
+
* spellings of it and the realpath rule are untouched: only what the reader answers moves.
|
|
66
|
+
*
|
|
67
|
+
* An empty list returns the access itself, so the ordinary road pays nothing.
|
|
68
|
+
*/
|
|
69
|
+
declare function overlayRepoAccess(base: RepoAccess, files: readonly ProposedFile[]): RepoAccess;
|
|
59
70
|
/**
|
|
60
71
|
* The repository-relative path an absolute one names, or null when it names nothing in here.
|
|
61
72
|
*
|
|
@@ -88,6 +99,257 @@ declare function accessKind(ctx: RepoAccess, absolute: string): "file" | "direct
|
|
|
88
99
|
/** Immediate child directory NAMES of a path, or none when it is absent or unreadable. */
|
|
89
100
|
declare function accessSubdirectories(ctx: RepoAccess, absolute: string): string[];
|
|
90
101
|
|
|
102
|
+
/**
|
|
103
|
+
* Workspace AGGREGATORS - turbo, lage and nx - and the one monorepo shape whose packages are not
|
|
104
|
+
* declared in a manifest at all.
|
|
105
|
+
*
|
|
106
|
+
* TWO FACTS, ONE FILE, because they are the two halves of the same question. A repository whose
|
|
107
|
+
* root `scripts.test` is `turbo run test` has not told us how to run a suite; it has told us that
|
|
108
|
+
* every package runs its own. So the aggregator's name is a routing fact (this root is not a
|
|
109
|
+
* runner - go and measure the packages), and for the Nx flavour that declares no `workspaces` the
|
|
110
|
+
* package list has to come from somewhere other than the root manifest.
|
|
111
|
+
*
|
|
112
|
+
* WHY THE AGGREGATOR IS NOT A RUNNER, and why leaving it to classify as the generic `command`
|
|
113
|
+
* adapter was wrong in two directions:
|
|
114
|
+
*
|
|
115
|
+
* 1. it MEASURES THE WHOLE REPOSITORY. `npm test` at the root of a Turborepo runs every
|
|
116
|
+
* package's suite through one process tree, so Stryker's command runner re-runs all of them
|
|
117
|
+
* per mutant and diff coverage has no single provider to read - the exact shape the multi-suite
|
|
118
|
+
* fanout work refused for `vitest a && vitest b`, one level up: packages compose the way
|
|
119
|
+
* suites do.
|
|
120
|
+
* 2. it can be READ AS A RUNNER BY ACCIDENT. `runnerNamesInScript` looks for a runner binary
|
|
121
|
+
* anywhere in the script, and `turbo run test --filter=./packages/jest` ends in the bare token
|
|
122
|
+
* `jest` behind a path separator, which is exactly the shape that function admits. That
|
|
123
|
+
* repository would have classified as a direct jest project and had jest's coverage flags
|
|
124
|
+
* appended to a turbo invocation.
|
|
125
|
+
*
|
|
126
|
+
* So an aggregator invocation is recognised BEFORE any runner name is looked for, and a package
|
|
127
|
+
* whose test script is one classifies as no runner at all - the same treatment `npm-run-all`
|
|
128
|
+
* already gets in {@link classifyPackageManifest}, for the same reason.
|
|
129
|
+
*
|
|
130
|
+
* PACKAGE-BASED MONOREPOS ARE UNAFFECTED BY DESIGN. A root that declares `workspaces` (or a
|
|
131
|
+
* `pnpm-workspace.yaml`) already rides per-package composition, whatever aggregator its scripts
|
|
132
|
+
* name - the aggregator is ignored, and that is the correct outcome, not an oversight. What is new
|
|
133
|
+
* here is the INTEGRATED Nx flavour, which declares no `workspaces` field at all: its projects are
|
|
134
|
+
* declared one `project.json` at a time and the root carries `nx.json`. Without a reader for that
|
|
135
|
+
* shape the selector found no workspace definition, skipped, and the run fell back to measuring the
|
|
136
|
+
* aggregator command at the root.
|
|
137
|
+
*
|
|
138
|
+
* THE THIRD WORKING DIRECTORY, added 2026-08-16. An integrated-Nx project declares its suite through
|
|
139
|
+
* an executor Nx runs FROM THE WORKSPACE ROOT against a root-relative config, and per-package
|
|
140
|
+
* composition had only two positions for a working directory - the repository root, measuring the
|
|
141
|
+
* repository, or a package's own directory, measuring that package. So those projects were honest
|
|
142
|
+
* excluded rows. {@link WorkspaceRootSuite} is the third position: the runner runs where the
|
|
143
|
+
* declaration says it runs, and the measurement is scoped to the project directory. It is keyed on
|
|
144
|
+
* that structural fact and never on the name of the tool that produced it.
|
|
145
|
+
*
|
|
146
|
+
* Everything here is fail-closed. A script that is not exactly one aggregator invocation is not an
|
|
147
|
+
* aggregator, an `nx.json` that does not parse yields no projects, and a project whose test target
|
|
148
|
+
* this file cannot drive is named as unmeasurable rather than guessed at.
|
|
149
|
+
*/
|
|
150
|
+
/**
|
|
151
|
+
* The workspace task runners. `nx` covers both flavours; the flavour is a separate fact.
|
|
152
|
+
*
|
|
153
|
+
* `lerna` IS ONE OF THEM AND ITS ONLY SHAPE IS `lerna run <task>`. It has no subcommand that runs a
|
|
154
|
+
* suite of its own - `lerna test` was removed in v3 - so a script that is exactly `lerna run test`
|
|
155
|
+
* is the same routing fact `turbo run test` is, spelled by the older tool: one suite per package,
|
|
156
|
+
* each with its own runner and its own coverage. Measuring it as one command re-runs every
|
|
157
|
+
* package's suite per mutant, which is precisely what this vocabulary exists to prevent.
|
|
158
|
+
*/
|
|
159
|
+
type AggregatorTool = "turbo" | "lage" | "nx" | "lerna";
|
|
160
|
+
interface AggregatorInvocation {
|
|
161
|
+
tool: AggregatorTool;
|
|
162
|
+
/**
|
|
163
|
+
* The task names the invocation selects, when they are stated positionally or through nx's
|
|
164
|
+
* `-t`/`--target`. Empty when the invocation selects its tasks some other way (an nx
|
|
165
|
+
* `run-many` with no target reads its own default) - the tool is still the routing fact.
|
|
166
|
+
*/
|
|
167
|
+
tasks: string[];
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* The aggregator a test script invokes, or null when it invokes none.
|
|
171
|
+
*
|
|
172
|
+
* ONE STAGE ONLY, deliberately. A script that composes an aggregator with anything else
|
|
173
|
+
* (`nx run-many -t lint && nx run-many -t test`, `turbo run test | tee log`) is left to the
|
|
174
|
+
* existing fanout and gate machinery, which already reads chains; claiming the aggregator for a
|
|
175
|
+
* composed script would take a routing decision on a script this file has not read whole.
|
|
176
|
+
*/
|
|
177
|
+
declare function aggregatorInvocation(testScript: string | null): AggregatorInvocation | null;
|
|
178
|
+
/**
|
|
179
|
+
* The tasks half of an aggregator invocation, as one printable phrase for a refusal message.
|
|
180
|
+
*
|
|
181
|
+
* An invocation that names no task reads its selection from configuration this file does not
|
|
182
|
+
* parse, and saying so is more honest than naming a task nobody read.
|
|
183
|
+
*
|
|
184
|
+
* COMMAS ONCE THERE ARE MORE THAN TWO, because this sentence became reachable for a long list on
|
|
185
|
+
* 2026-09-01: it was only ever produced for a directly-written `turbo run test` until the aliased
|
|
186
|
+
* root started reaching it, and TanStack/query's run-many names eight tasks. Eight joined by "and"
|
|
187
|
+
* is not a sentence anybody reads.
|
|
188
|
+
*/
|
|
189
|
+
declare function aggregatorTaskPhrase(invocation: AggregatorInvocation): string;
|
|
190
|
+
/** One integrated-Nx project: its directory and what its own `project.json` says about testing. */
|
|
191
|
+
interface NxProject {
|
|
192
|
+
/** Repository-relative project directory, never "" (the workspace root is not a project). */
|
|
193
|
+
directory: string;
|
|
194
|
+
/** The project's own name, when it declares one. */
|
|
195
|
+
name: string | null;
|
|
196
|
+
/** What the project's `test` target is, once read. */
|
|
197
|
+
test: NxTestTarget;
|
|
198
|
+
}
|
|
199
|
+
type NxTestTarget = {
|
|
200
|
+
state: "runner";
|
|
201
|
+
runner: string;
|
|
202
|
+
command: string;
|
|
203
|
+
} | ({
|
|
204
|
+
state: "workspace-root";
|
|
205
|
+
} & WorkspaceRootSuite) | {
|
|
206
|
+
state: "unmeasurable";
|
|
207
|
+
reason: string;
|
|
208
|
+
remedy: string;
|
|
209
|
+
};
|
|
210
|
+
/**
|
|
211
|
+
* A suite whose runner runs FROM THE WORKSPACE ROOT against a root-relative config, while the
|
|
212
|
+
* measurement it produces belongs to one project directory.
|
|
213
|
+
*
|
|
214
|
+
* THE STRUCTURAL FACT, and it is deliberately not "this repository uses Nx". Two positions used to
|
|
215
|
+
* be the whole vocabulary - a suite runs at the repository root and measures the repository, or a
|
|
216
|
+
* suite runs inside a package and measures that package. This is the third: the working directory
|
|
217
|
+
* and the measured directory are DIFFERENT, and the declaration says which is which. Nx's official
|
|
218
|
+
* executors are the first shape that produces it; nothing below reads the string "nx" to decide.
|
|
219
|
+
*
|
|
220
|
+
* Every field is what the run needs to act on it, and each is a fact somebody wrote down:
|
|
221
|
+
* - `runner` is a runner the existing adapters already drive; an executor that maps to none stays
|
|
222
|
+
* an excluded row, which is the boundary this mode does not widen.
|
|
223
|
+
* - `configFile` is the workspace-root-relative config the declaration names. Never guessed: a
|
|
224
|
+
* target that names none is excluded, because running a root-found config against one project
|
|
225
|
+
* would measure a suite nobody selected.
|
|
226
|
+
* - `directory` is the measured project, which is what scopes coverage, mutation and attribution.
|
|
227
|
+
* - `declaredBy` is the executor that said so, carried for the log and the artifact.
|
|
228
|
+
*/
|
|
229
|
+
interface WorkspaceRootSuite {
|
|
230
|
+
runner: "jest" | "vitest";
|
|
231
|
+
/** Workspace-root-relative config file the runner is pointed at. */
|
|
232
|
+
configFile: string;
|
|
233
|
+
/** Repository-relative directory whose measurement this suite produces. */
|
|
234
|
+
directory: string;
|
|
235
|
+
/** The declaration this was read from, e.g. `@nx/jest:jest`. */
|
|
236
|
+
declaredBy: string;
|
|
237
|
+
/** The runner invocation, run from the workspace root. */
|
|
238
|
+
command: string;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Read one project's `test` target into the answers per-package composition can act on.
|
|
242
|
+
*
|
|
243
|
+
* A `run-commands` target whose command is one literal runner invocation AND whose `cwd` is the
|
|
244
|
+
* project's own directory is drivable exactly as a package script is - it is the same invocation,
|
|
245
|
+
* written in a different file. Everything else is named.
|
|
246
|
+
*/
|
|
247
|
+
declare function classifyNxTestTarget(projectJson: unknown, directory: string): NxTestTarget;
|
|
248
|
+
/**
|
|
249
|
+
* Enumerate an integrated-Nx workspace's projects from the files a tree listing already has.
|
|
250
|
+
*
|
|
251
|
+
* READ THROUGH A SEAM, on purpose. Selection reads the TRUSTED merge-base tree and `abloh prepare`
|
|
252
|
+
* reads the working tree; both must enumerate identically or they desync on the same repository -
|
|
253
|
+
* the same rule `classifyPackageManifest` carries for manifests. So this function takes the path
|
|
254
|
+
* list and a reader and never touches the filesystem itself.
|
|
255
|
+
*
|
|
256
|
+
* @param paths every repository-relative path in the tree
|
|
257
|
+
* @param readFile the bytes of one path, or null when absent/unreadable
|
|
258
|
+
*/
|
|
259
|
+
declare function enumerateNxProjects(paths: readonly string[], readFile: (path: string) => string | null, limit: number): NxProject[];
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* THE SUITE BEHIND AN AGGREGATOR, FOLLOWED TO THE RUNNER THAT RUNS IT.
|
|
263
|
+
*
|
|
264
|
+
* WHAT WAS WRONG. `aggregatorInvocation` one file over answers the ROUTING question - this root is
|
|
265
|
+
* not a runner, go and measure the packages - and nothing ever walked the road it points down. So a
|
|
266
|
+
* repository whose whole test script is one aggregator invocation was read as a script naming no
|
|
267
|
+
* runner, and `abloh init` drafted the aggregator as the test command with a note saying the
|
|
268
|
+
* baseline would report nothing. `TanStack/query` (`pnpm run test:ci` -> `nx run-many
|
|
269
|
+
* --targets=...,test:lib,...`) and `discordjs/discord.js` (`turbo run test --concurrency=4`) both
|
|
270
|
+
* produced the same sentence: "nothing in it invokes a test runner abloh recognizes", on
|
|
271
|
+
* repositories where 25 and 13 packages respectively declare a vitest suite the same reading
|
|
272
|
+
* already resolves per package.
|
|
273
|
+
*
|
|
274
|
+
* SO THE CHAIN IS FOLLOWED ONCE, HERE, AND IT IS THE READING THAT WAS ALREADY THERE. Nothing in
|
|
275
|
+
* this file is a new grammar: the root's own invocation and its task list come from
|
|
276
|
+
* {@link classifyWithAliasHop}, the packages come from the workspace declaration's own enumeration,
|
|
277
|
+
* and each package's suite is read by {@link classifyPackageManifest} under exactly the task names
|
|
278
|
+
* the root wrote down. A package is admitted here on the terms a `test` script is admitted on
|
|
279
|
+
* everywhere else, because it is the same function that admits it.
|
|
280
|
+
*
|
|
281
|
+
* WHAT THE CALLER DOES WITH IT IS THE CALLER'S. This answers which packages the aggregator reaches
|
|
282
|
+
* and what runs each one's suite; whether that becomes a question, a draft or a refusal is decided
|
|
283
|
+
* where those are decided. `abloh init` spends it by drafting from one of these packages - the road
|
|
284
|
+
* a workspace root with no test script at all has taken since 2026-08-26 - reading `packages`, the
|
|
285
|
+
* enumeration's own `refusals` and `unreadSelection`; `gaps` and `excluded` are the rest of this
|
|
286
|
+
* reading's account of itself, for a caller that has somewhere to put them.
|
|
287
|
+
*
|
|
288
|
+
* IT NEVER SILENTLY NARROWS OR SILENTLY WIDENS. Only a plain path-glob `--exclude` is applied,
|
|
289
|
+
* because that is the one selection form whose meaning is a directory and nothing else; every other
|
|
290
|
+
* selection flag names a PROJECT, and applying one would be a second reading of somebody's workspace
|
|
291
|
+
* graph. A flag this reading cannot apply is carried on {@link AggregatorChain.unreadSelection}
|
|
292
|
+
* rather than dropped - which is `docs/lessons/a-discarded-input-is-never-silent.md` over a filter -
|
|
293
|
+
* and `abloh init` states it beside the package list a maintainer is choosing from.
|
|
294
|
+
*/
|
|
295
|
+
|
|
296
|
+
/** One package the aggregator reaches, and what runs its suite. */
|
|
297
|
+
interface AggregatorChainPackage {
|
|
298
|
+
/** Repository-relative package directory. */
|
|
299
|
+
directory: string;
|
|
300
|
+
/**
|
|
301
|
+
* The script key its suite was read from.
|
|
302
|
+
*
|
|
303
|
+
* `test` for a package that declares one - which is what `discordjs/discord.js`'s packages do -
|
|
304
|
+
* and one of the aggregator's own task names otherwise, which is the shape `TanStack/query` has:
|
|
305
|
+
* not one of its 27 packages declares `test`, and `test:lib` is the key the root wrote down.
|
|
306
|
+
*/
|
|
307
|
+
task: string;
|
|
308
|
+
/** That script's text, exactly as the package spells it. */
|
|
309
|
+
script: string;
|
|
310
|
+
/** The runner it runs. */
|
|
311
|
+
runner: string;
|
|
312
|
+
/**
|
|
313
|
+
* The runner config that suite is measured against, repository-relative, or null when abloh found
|
|
314
|
+
* none. A path the script names itself wins; otherwise it is the config file sitting in the
|
|
315
|
+
* package's own directory, which is where the runner looks from when the script names none.
|
|
316
|
+
*/
|
|
317
|
+
configFile: string | null;
|
|
318
|
+
}
|
|
319
|
+
/** A package the aggregator reaches whose suite this reading could not resolve, and why. */
|
|
320
|
+
interface AggregatorChainGap {
|
|
321
|
+
directory: string;
|
|
322
|
+
reason: string;
|
|
323
|
+
}
|
|
324
|
+
interface AggregatorChain {
|
|
325
|
+
/** The workspace task runner the root's test script delegates to. */
|
|
326
|
+
tool: AggregatorTool;
|
|
327
|
+
/** The task names that invocation selects, empty when it selects them some other way. */
|
|
328
|
+
tasks: readonly string[];
|
|
329
|
+
/** Every package it reaches that answers one of those tasks with a suite abloh can measure. */
|
|
330
|
+
packages: readonly AggregatorChainPackage[];
|
|
331
|
+
/** Every package it reaches that answers none, with the reason it was read as none. */
|
|
332
|
+
gaps: readonly AggregatorChainGap[];
|
|
333
|
+
/**
|
|
334
|
+
* Selection flags on the invocation this reading does not model, verbatim.
|
|
335
|
+
*
|
|
336
|
+
* Empty is the ordinary case and the package list is then exactly what the aggregator runs. A
|
|
337
|
+
* non-empty list means the list may be WIDER than what runs, never narrower, and a caller that
|
|
338
|
+
* states the set has to say so.
|
|
339
|
+
*/
|
|
340
|
+
unreadSelection: readonly string[];
|
|
341
|
+
/** Packages a readable `--exclude` glob took out of the list. */
|
|
342
|
+
excluded: readonly string[];
|
|
343
|
+
/** What the enumeration could not see, in its own words. */
|
|
344
|
+
refusals: readonly string[];
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* FOLLOW THE ROOT'S TEST SCRIPT THROUGH THE AGGREGATOR TO THE PACKAGES THAT RUN THE SUITES.
|
|
348
|
+
*
|
|
349
|
+
* Null when this root's test script does not delegate at all, which is nearly every repository.
|
|
350
|
+
*/
|
|
351
|
+
declare function aggregatorChain(repoDir: string, ctx?: RepoAccess): AggregatorChain | null;
|
|
352
|
+
|
|
91
353
|
/**
|
|
92
354
|
* WHICH REPOSITORIES ACTUALLY HAVE A BROWSER LANE, read from what they committed rather than from
|
|
93
355
|
* what they called a script.
|
|
@@ -975,6 +1237,20 @@ interface CiRecipe {
|
|
|
975
1237
|
* sets environment values Abloh has no key for, a build scoped to one workspace package.
|
|
976
1238
|
*/
|
|
977
1239
|
notices: readonly string[];
|
|
1240
|
+
/**
|
|
1241
|
+
* THE CHOSEN JOB'S OWN STEPS THAT ABLOH READ AND DID NOT COPY INTO `.abloh/setup.sh`.
|
|
1242
|
+
*
|
|
1243
|
+
* THE RULING (the captain, 2026-09-12, review finding F4): init copies only the steps the tests
|
|
1244
|
+
* need, a lint, format, docs or publish step is not one of them, and the maintainer is told which
|
|
1245
|
+
* ones were left out. `honojs/hono` is the repository that earned it - its job runs `format`,
|
|
1246
|
+
* `lint` and `editorconfig-checker` before its suite, and the checker downloads a release binary
|
|
1247
|
+
* and cannot, so a repository that was never measured stopped on a step about trailing newlines.
|
|
1248
|
+
*
|
|
1249
|
+
* NOT {@link refusal} AND NOT A REFUSAL'S LIST. Those say abloh could not READ a step; these say
|
|
1250
|
+
* abloh read it and the suite does not read what it produces. Only the first is a gap in abloh's
|
|
1251
|
+
* reading, and folding the two would tell a maintainer to go and copy in a linter.
|
|
1252
|
+
*/
|
|
1253
|
+
stepsNotCopied: readonly CiDroppedStep[];
|
|
978
1254
|
}
|
|
979
1255
|
type AptReading = {
|
|
980
1256
|
ok: true;
|
|
@@ -1029,6 +1305,21 @@ interface NodeEnvironment {
|
|
|
1029
1305
|
* cell does Abloh's step actually run on".
|
|
1030
1306
|
*/
|
|
1031
1307
|
declare function readCiNodeDeclaration(raw: string | null, matrix: unknown, reader: RepoReader, leg?: MatrixLeg | null | undefined, env?: NodeEnvironment): CiNodeVersion | null;
|
|
1308
|
+
/** One step of a candidate job abloh read and declined to translate, with its own sentence. */
|
|
1309
|
+
/**
|
|
1310
|
+
* ONE STEP ABLOH READ AND DID NOT COPY: where it sits, what it runs, and why it was left out.
|
|
1311
|
+
*
|
|
1312
|
+
* THE COMMAND IS THE MAINTAINER'S OWN TEXT, so it is local-only wherever it is shown - the same
|
|
1313
|
+
* rule `setup-ci-steps-unread` already carries its step bodies under.
|
|
1314
|
+
*/
|
|
1315
|
+
interface CiDroppedStep {
|
|
1316
|
+
/** 1-based, as a maintainer counts the `steps:` of their own job. Null for Travis and CircleCI. */
|
|
1317
|
+
step: number | null;
|
|
1318
|
+
/** The step's own command line. */
|
|
1319
|
+
command: string;
|
|
1320
|
+
/** Why the suite does not need it, in the reading's own words. */
|
|
1321
|
+
why: string;
|
|
1322
|
+
}
|
|
1032
1323
|
/**
|
|
1033
1324
|
* DO TWO JOB REFERENCES NAME THE SAME JOB, whichever spelling each of them uses?
|
|
1034
1325
|
*
|
|
@@ -2219,8 +2510,27 @@ interface DraftService {
|
|
|
2219
2510
|
*
|
|
2220
2511
|
* A constant because a re-run has to RECOGNIZE it: the block is replaced from its own `environment:`
|
|
2221
2512
|
* line down, and a header left stranded above the replacement appears twice in the customer's file.
|
|
2513
|
+
*
|
|
2514
|
+
* IT NAMES CI RATHER THAN A CONTAINER (the audit of 2026-09-12, 10.4). "the proof container" is a
|
|
2515
|
+
* thing one road builds: a run on the maintainer's own machine measures a copy of their own tree
|
|
2516
|
+
* with their own installed dependencies, and reads none of the keys under this header. The block is
|
|
2517
|
+
* still written on both roads, because it is what their CI needs the day they add abloh's check
|
|
2518
|
+
* there, and the header now says so instead of describing work that is not happening.
|
|
2222
2519
|
*/
|
|
2223
|
-
declare const ENVIRONMENT_BLOCK_HEADER = "#
|
|
2520
|
+
declare const ENVIRONMENT_BLOCK_HEADER = "# How CI rebuilds this project for abloh's check. Comments name the source file.";
|
|
2521
|
+
/**
|
|
2522
|
+
* HEADERS THIS COMMAND USED TO WRITE, so a re-run still recognizes a file it wrote before.
|
|
2523
|
+
*
|
|
2524
|
+
* WHY IT EXISTS. The recognition above is an exact string match. Change the constant with no list
|
|
2525
|
+
* beside it and every `abloh.yml` already carrying the old line gets the new header written above
|
|
2526
|
+
* the old one - the exact duplication that constant's own header warns about, arriving through the
|
|
2527
|
+
* one edit it did not anticipate.
|
|
2528
|
+
*
|
|
2529
|
+
* IT ONLY GROWS. A line here is a line some repository has committed, and nothing rewrites it.
|
|
2530
|
+
*/
|
|
2531
|
+
declare const RETIRED_ENVIRONMENT_BLOCK_HEADERS: readonly string[];
|
|
2532
|
+
/** Is this line an environment-block header this command has ever written? */
|
|
2533
|
+
declare function isEnvironmentBlockHeader(line: string): boolean;
|
|
2224
2534
|
/**
|
|
2225
2535
|
* WHAT ABLOH READ ABOUT THE JOB ITS STEP RIDES, as the contract will state it.
|
|
2226
2536
|
*
|
|
@@ -2319,7 +2629,25 @@ declare function initStepRole(what: string): "systemPackages" | "installCommand"
|
|
|
2319
2629
|
* pinned packages alone.
|
|
2320
2630
|
*/
|
|
2321
2631
|
declare function systemPackagesStep(pinned: readonly ConfigSystemPackage[]): SetupScriptStep | null;
|
|
2322
|
-
|
|
2632
|
+
/**
|
|
2633
|
+
* EVERYTHING {@link setupScriptSteps} READS, AND NOTHING ELSE.
|
|
2634
|
+
*
|
|
2635
|
+
* WHY IT IS NARROW (the captain's second ruling of 2026-09-15, round-2 maintainer review C1). The
|
|
2636
|
+
* proof-image check has to know what abloh's own script puts on PATH before the suite runs, and the
|
|
2637
|
+
* script is the source of truth for that - so `environment-check.ts` composes the steps and reads
|
|
2638
|
+
* them. It is asked BEFORE the check runs, which is before the whole contract exists, and a caller
|
|
2639
|
+
* that had to build a `ConfigInput` to ask would end up building a second one.
|
|
2640
|
+
*
|
|
2641
|
+
* A `ConfigInput` still satisfies it structurally, so the one composer serves both callers exactly
|
|
2642
|
+
* as {@link systemPackagesStep} already serves two. A second derivation of what this script runs is
|
|
2643
|
+
* the divergence `script-runs.ts` exists to end, one layer down.
|
|
2644
|
+
*/
|
|
2645
|
+
type SetupScriptInput = Pick<ConfigInput, "systemPackages" | "installCommand" | "installUnlocked" | "installEnvironment" | "setupCommands"> & {
|
|
2646
|
+
readonly evidence: {
|
|
2647
|
+
readonly installCommand: string;
|
|
2648
|
+
};
|
|
2649
|
+
};
|
|
2650
|
+
declare function setupScriptSteps(input: SetupScriptInput): SetupScriptStep[];
|
|
2323
2651
|
|
|
2324
2652
|
/**
|
|
2325
2653
|
* WHERE AN ANSWER IS APPLIED, because three of them are not values in the contract at all.
|
|
@@ -2500,157 +2828,6 @@ declare function denoLockfilePath(dir: string, readText?: ReadTextAt): string |
|
|
|
2500
2828
|
*/
|
|
2501
2829
|
declare function scriptRunsDenoTest(testScript: string | null): boolean;
|
|
2502
2830
|
|
|
2503
|
-
/**
|
|
2504
|
-
* Workspace AGGREGATORS - turbo, lage and nx - and the one monorepo shape whose packages are not
|
|
2505
|
-
* declared in a manifest at all.
|
|
2506
|
-
*
|
|
2507
|
-
* TWO FACTS, ONE FILE, because they are the two halves of the same question. A repository whose
|
|
2508
|
-
* root `scripts.test` is `turbo run test` has not told us how to run a suite; it has told us that
|
|
2509
|
-
* every package runs its own. So the aggregator's name is a routing fact (this root is not a
|
|
2510
|
-
* runner - go and measure the packages), and for the Nx flavour that declares no `workspaces` the
|
|
2511
|
-
* package list has to come from somewhere other than the root manifest.
|
|
2512
|
-
*
|
|
2513
|
-
* WHY THE AGGREGATOR IS NOT A RUNNER, and why leaving it to classify as the generic `command`
|
|
2514
|
-
* adapter was wrong in two directions:
|
|
2515
|
-
*
|
|
2516
|
-
* 1. it MEASURES THE WHOLE REPOSITORY. `npm test` at the root of a Turborepo runs every
|
|
2517
|
-
* package's suite through one process tree, so Stryker's command runner re-runs all of them
|
|
2518
|
-
* per mutant and diff coverage has no single provider to read - the exact shape the multi-suite
|
|
2519
|
-
* fanout work refused for `vitest a && vitest b`, one level up: packages compose the way
|
|
2520
|
-
* suites do.
|
|
2521
|
-
* 2. it can be READ AS A RUNNER BY ACCIDENT. `runnerNamesInScript` looks for a runner binary
|
|
2522
|
-
* anywhere in the script, and `turbo run test --filter=./packages/jest` ends in the bare token
|
|
2523
|
-
* `jest` behind a path separator, which is exactly the shape that function admits. That
|
|
2524
|
-
* repository would have classified as a direct jest project and had jest's coverage flags
|
|
2525
|
-
* appended to a turbo invocation.
|
|
2526
|
-
*
|
|
2527
|
-
* So an aggregator invocation is recognised BEFORE any runner name is looked for, and a package
|
|
2528
|
-
* whose test script is one classifies as no runner at all - the same treatment `npm-run-all`
|
|
2529
|
-
* already gets in {@link classifyPackageManifest}, for the same reason.
|
|
2530
|
-
*
|
|
2531
|
-
* PACKAGE-BASED MONOREPOS ARE UNAFFECTED BY DESIGN. A root that declares `workspaces` (or a
|
|
2532
|
-
* `pnpm-workspace.yaml`) already rides per-package composition, whatever aggregator its scripts
|
|
2533
|
-
* name - the aggregator is ignored, and that is the correct outcome, not an oversight. What is new
|
|
2534
|
-
* here is the INTEGRATED Nx flavour, which declares no `workspaces` field at all: its projects are
|
|
2535
|
-
* declared one `project.json` at a time and the root carries `nx.json`. Without a reader for that
|
|
2536
|
-
* shape the selector found no workspace definition, skipped, and the run fell back to measuring the
|
|
2537
|
-
* aggregator command at the root.
|
|
2538
|
-
*
|
|
2539
|
-
* THE THIRD WORKING DIRECTORY, added 2026-08-16. An integrated-Nx project declares its suite through
|
|
2540
|
-
* an executor Nx runs FROM THE WORKSPACE ROOT against a root-relative config, and per-package
|
|
2541
|
-
* composition had only two positions for a working directory - the repository root, measuring the
|
|
2542
|
-
* repository, or a package's own directory, measuring that package. So those projects were honest
|
|
2543
|
-
* excluded rows. {@link WorkspaceRootSuite} is the third position: the runner runs where the
|
|
2544
|
-
* declaration says it runs, and the measurement is scoped to the project directory. It is keyed on
|
|
2545
|
-
* that structural fact and never on the name of the tool that produced it.
|
|
2546
|
-
*
|
|
2547
|
-
* Everything here is fail-closed. A script that is not exactly one aggregator invocation is not an
|
|
2548
|
-
* aggregator, an `nx.json` that does not parse yields no projects, and a project whose test target
|
|
2549
|
-
* this file cannot drive is named as unmeasurable rather than guessed at.
|
|
2550
|
-
*/
|
|
2551
|
-
/** The three workspace task runners. `nx` covers both flavours; the flavour is a separate fact. */
|
|
2552
|
-
type AggregatorTool = "turbo" | "lage" | "nx";
|
|
2553
|
-
interface AggregatorInvocation {
|
|
2554
|
-
tool: AggregatorTool;
|
|
2555
|
-
/**
|
|
2556
|
-
* The task names the invocation selects, when they are stated positionally or through nx's
|
|
2557
|
-
* `-t`/`--target`. Empty when the invocation selects its tasks some other way (an nx
|
|
2558
|
-
* `run-many` with no target reads its own default) - the tool is still the routing fact.
|
|
2559
|
-
*/
|
|
2560
|
-
tasks: string[];
|
|
2561
|
-
}
|
|
2562
|
-
/**
|
|
2563
|
-
* The aggregator a test script invokes, or null when it invokes none.
|
|
2564
|
-
*
|
|
2565
|
-
* ONE STAGE ONLY, deliberately. A script that composes an aggregator with anything else
|
|
2566
|
-
* (`nx run-many -t lint && nx run-many -t test`, `turbo run test | tee log`) is left to the
|
|
2567
|
-
* existing fanout and gate machinery, which already reads chains; claiming the aggregator for a
|
|
2568
|
-
* composed script would take a routing decision on a script this file has not read whole.
|
|
2569
|
-
*/
|
|
2570
|
-
declare function aggregatorInvocation(testScript: string | null): AggregatorInvocation | null;
|
|
2571
|
-
/**
|
|
2572
|
-
* The tasks half of an aggregator invocation, as one printable phrase for a refusal message.
|
|
2573
|
-
*
|
|
2574
|
-
* An invocation that names no task reads its selection from configuration this file does not
|
|
2575
|
-
* parse, and saying so is more honest than naming a task nobody read.
|
|
2576
|
-
*
|
|
2577
|
-
* COMMAS ONCE THERE ARE MORE THAN TWO, because this sentence became reachable for a long list on
|
|
2578
|
-
* 2026-09-01: it was only ever produced for a directly-written `turbo run test` until the aliased
|
|
2579
|
-
* root started reaching it, and TanStack/query's run-many names eight tasks. Eight joined by "and"
|
|
2580
|
-
* is not a sentence anybody reads.
|
|
2581
|
-
*/
|
|
2582
|
-
declare function aggregatorTaskPhrase(invocation: AggregatorInvocation): string;
|
|
2583
|
-
/** One integrated-Nx project: its directory and what its own `project.json` says about testing. */
|
|
2584
|
-
interface NxProject {
|
|
2585
|
-
/** Repository-relative project directory, never "" (the workspace root is not a project). */
|
|
2586
|
-
directory: string;
|
|
2587
|
-
/** The project's own name, when it declares one. */
|
|
2588
|
-
name: string | null;
|
|
2589
|
-
/** What the project's `test` target is, once read. */
|
|
2590
|
-
test: NxTestTarget;
|
|
2591
|
-
}
|
|
2592
|
-
type NxTestTarget = {
|
|
2593
|
-
state: "runner";
|
|
2594
|
-
runner: string;
|
|
2595
|
-
command: string;
|
|
2596
|
-
} | ({
|
|
2597
|
-
state: "workspace-root";
|
|
2598
|
-
} & WorkspaceRootSuite) | {
|
|
2599
|
-
state: "unmeasurable";
|
|
2600
|
-
reason: string;
|
|
2601
|
-
remedy: string;
|
|
2602
|
-
};
|
|
2603
|
-
/**
|
|
2604
|
-
* A suite whose runner runs FROM THE WORKSPACE ROOT against a root-relative config, while the
|
|
2605
|
-
* measurement it produces belongs to one project directory.
|
|
2606
|
-
*
|
|
2607
|
-
* THE STRUCTURAL FACT, and it is deliberately not "this repository uses Nx". Two positions used to
|
|
2608
|
-
* be the whole vocabulary - a suite runs at the repository root and measures the repository, or a
|
|
2609
|
-
* suite runs inside a package and measures that package. This is the third: the working directory
|
|
2610
|
-
* and the measured directory are DIFFERENT, and the declaration says which is which. Nx's official
|
|
2611
|
-
* executors are the first shape that produces it; nothing below reads the string "nx" to decide.
|
|
2612
|
-
*
|
|
2613
|
-
* Every field is what the run needs to act on it, and each is a fact somebody wrote down:
|
|
2614
|
-
* - `runner` is a runner the existing adapters already drive; an executor that maps to none stays
|
|
2615
|
-
* an excluded row, which is the boundary this mode does not widen.
|
|
2616
|
-
* - `configFile` is the workspace-root-relative config the declaration names. Never guessed: a
|
|
2617
|
-
* target that names none is excluded, because running a root-found config against one project
|
|
2618
|
-
* would measure a suite nobody selected.
|
|
2619
|
-
* - `directory` is the measured project, which is what scopes coverage, mutation and attribution.
|
|
2620
|
-
* - `declaredBy` is the executor that said so, carried for the log and the artifact.
|
|
2621
|
-
*/
|
|
2622
|
-
interface WorkspaceRootSuite {
|
|
2623
|
-
runner: "jest" | "vitest";
|
|
2624
|
-
/** Workspace-root-relative config file the runner is pointed at. */
|
|
2625
|
-
configFile: string;
|
|
2626
|
-
/** Repository-relative directory whose measurement this suite produces. */
|
|
2627
|
-
directory: string;
|
|
2628
|
-
/** The declaration this was read from, e.g. `@nx/jest:jest`. */
|
|
2629
|
-
declaredBy: string;
|
|
2630
|
-
/** The runner invocation, run from the workspace root. */
|
|
2631
|
-
command: string;
|
|
2632
|
-
}
|
|
2633
|
-
/**
|
|
2634
|
-
* Read one project's `test` target into the answers per-package composition can act on.
|
|
2635
|
-
*
|
|
2636
|
-
* A `run-commands` target whose command is one literal runner invocation AND whose `cwd` is the
|
|
2637
|
-
* project's own directory is drivable exactly as a package script is - it is the same invocation,
|
|
2638
|
-
* written in a different file. Everything else is named.
|
|
2639
|
-
*/
|
|
2640
|
-
declare function classifyNxTestTarget(projectJson: unknown, directory: string): NxTestTarget;
|
|
2641
|
-
/**
|
|
2642
|
-
* Enumerate an integrated-Nx workspace's projects from the files a tree listing already has.
|
|
2643
|
-
*
|
|
2644
|
-
* READ THROUGH A SEAM, on purpose. Selection reads the TRUSTED merge-base tree and `abloh prepare`
|
|
2645
|
-
* reads the working tree; both must enumerate identically or they desync on the same repository -
|
|
2646
|
-
* the same rule `classifyPackageManifest` carries for manifests. So this function takes the path
|
|
2647
|
-
* list and a reader and never touches the filesystem itself.
|
|
2648
|
-
*
|
|
2649
|
-
* @param paths every repository-relative path in the tree
|
|
2650
|
-
* @param readFile the bytes of one path, or null when absent/unreadable
|
|
2651
|
-
*/
|
|
2652
|
-
declare function enumerateNxProjects(paths: readonly string[], readFile: (path: string) => string | null, limit: number): NxProject[];
|
|
2653
|
-
|
|
2654
2831
|
/**
|
|
2655
2832
|
* The tool that installs a repository's dependencies.
|
|
2656
2833
|
*
|
|
@@ -3515,6 +3692,16 @@ interface ManifestClassification {
|
|
|
3515
3692
|
* handed down; see {@link rootAggregatorTasks}.
|
|
3516
3693
|
*/
|
|
3517
3694
|
aggregatorTasks: readonly string[];
|
|
3695
|
+
/**
|
|
3696
|
+
* The SCRIPT TEXT that aggregator invocation was read from, when it delegates.
|
|
3697
|
+
*
|
|
3698
|
+
* Carried for the same reason the task list is, one fact further: the invocation's own FLAGS are
|
|
3699
|
+
* the only place a workspace filter is written, and on an ALIASED root - `TanStack/query`'s
|
|
3700
|
+
* `pnpm run test:ci` - reading them off {@link testScript} reads the flags of the alias, which has
|
|
3701
|
+
* none. A reader that resolved the hop again to find them would be a second copy of the one rule
|
|
3702
|
+
* {@link classifyWithAliasHop} exists to keep single.
|
|
3703
|
+
*/
|
|
3704
|
+
aggregatorInvocationScript: string | null;
|
|
3518
3705
|
/**
|
|
3519
3706
|
* The aggregator task {@link testScript} was read from, when this package declares no `test`
|
|
3520
3707
|
* script of its own and the root's aggregator named a task it does declare. Null everywhere
|
|
@@ -4427,6 +4614,29 @@ declare function placeSetupStep(input: {
|
|
|
4427
4614
|
before: string;
|
|
4428
4615
|
} | null;
|
|
4429
4616
|
}): SetupStepPlacement | Refusal;
|
|
4617
|
+
/**
|
|
4618
|
+
* Is abloh's step already the last thing this job does?
|
|
4619
|
+
*
|
|
4620
|
+
* MATCHED ON THE ACTION REPOSITORY AND NOT ON THE PIN. A customer who is already running abloh at
|
|
4621
|
+
* an older commit has an abloh step, and appending a second one would run the measurement twice and
|
|
4622
|
+
* put two check runs on every pull request. The pin is ours to bump and theirs to keep.
|
|
4623
|
+
*/
|
|
4624
|
+
/**
|
|
4625
|
+
* DOES THIS WORKFLOW ALREADY RUN ABLOH, in any job of it?
|
|
4626
|
+
*
|
|
4627
|
+
* WHO ASKS (the captain's ruling of 2026-09-12). Re-running `abloh init` adds a lane, so the command
|
|
4628
|
+
* has to be able to tell a repository that is already set up for pull requests from one that is not
|
|
4629
|
+
* - and the step in one of the maintainer's own jobs is the fact that says so.
|
|
4630
|
+
*
|
|
4631
|
+
* IT IS THE SAME MATCHER THE WRITER USES, over every job rather than over one. A second reading of
|
|
4632
|
+
* "is abloh's step here" is how one of them comes to answer differently, and the writer's answer is
|
|
4633
|
+
* what decides whether a second step is appended.
|
|
4634
|
+
*
|
|
4635
|
+
* AN UNREADABLE FILE ANSWERS FALSE. What that costs is an offer to set up a lane that is already
|
|
4636
|
+
* there, which a maintainer can decline. Answering true would hide the offer from somebody who
|
|
4637
|
+
* needs it.
|
|
4638
|
+
*/
|
|
4639
|
+
declare function workflowRunsAbloh(text: string): boolean;
|
|
4430
4640
|
|
|
4431
4641
|
/**
|
|
4432
4642
|
* WHICH OF THE MAINTAINER'S SUITE STEPS ABLOH'S STEP GOES BEHIND, ON THE LEG IT PINNED.
|
|
@@ -4628,4 +4838,4 @@ declare function selectAutoTarget(input: {
|
|
|
4628
4838
|
*/
|
|
4629
4839
|
declare function committedYarnVersion(directory: string, lockfileName: string, ctx?: RepoAccess): string | null;
|
|
4630
4840
|
|
|
4631
|
-
export { ANSWERABLE_SETUP_KEYS, ANSWERED_EVIDENCE, type AggregatorInvocation, type AggregatorTool, type AttestationJob, type AutoTargetSelection, type BrowserLane, type BrowserLaneEvidence, type BrowserLaneKind, CI_RECIPE_REFUSALS, type CiBorrowJob, type CiBrowserLane, type CiEnvironmentValue, type CiInstallStep, type CiJobStep, type CiJobTestStep, type CiManagerVersion, type CiNodeVersion, type CiRecipe, type CiRequiredVariable, type CiService, type CiSetupCommand, type CiSystemPackage, type CiTestCommand, type CiUnreadableJobCall, type CiUnsupportedService, type ConfigInput, type ConfigSystemPackage, type CoverageChildSuite, DENO_CONFIG_FILES, DENO_LOCKFILE, type DeclaredBinding, type DeclaredCommandContext, type DenoProject, type DraftService, ENVIRONMENT_BLOCK_HEADER, InitRefusal, type LockfileChoice, type ManifestClassification, type NodeChoice, type NodeDeclaration, type NodeDeclarationProblem, type NodeDeclarationRejection, type NodeEnvironment, type NodeRelease, type NodeRequirement, type NodeSpecReading, type NxProject, type NxTestTarget, type PackageManager, type PackageManagerContext, type PackageManagerResolution, type PlanDeclaration, type PolicyDeclaration, RUSH_CONFIG_DIRECTORY, RUSH_CONFIG_FILE, RUSH_INSTALL_COMMAND, RUSH_INSTALL_SCRIPT, RUSH_LOCKFILE_NAME, RUSH_REPO_STATE_NAME, RUSH_SUBSPACE_DIRECTORY, RUSH_TEST_SCRIPTS, type ReadTextAt, type RebuildDraftValue, type RepoAccess, type ResolveMeasurementPlanInput, type Runner, type RuntimeNeed, type RushProject, type RushTestTarget, SETUP_QUESTION_DESCRIPTORS, STEP_WHAT, type SetupAnswerChannel, type SetupAnswerShape, type SetupDraftValues, type SetupFailFastDecision, type SetupJobDecision, type SetupJobQuestion, type SetupMatrixLeg, type SetupPin, type SetupPublishPlacement, type SetupQuestionDescriptor, type SetupStepAnchor, type SetupStepPlacement, type SetupStepPrecondition, type SubmoduleRoot, type TargetDetection, TargetDetectionError, TargetNotFoundError, type TargetNotFoundReason, type TargetResolution, type TargetResolutionInput, type WorkflowEnvironmentEntry, type WorkflowEnvironmentLevel, type WorkflowEnvironmentScope, type WorkflowExpressionFacts, type WorkflowExpressionReading, type WorkspaceEnumeration, type WorkspaceRootSuite, __testing, accessExists, accessKind, accessManifest, accessSubdirectories, accessText, admitSubmodules, aggregatorInvocation, aggregatorTaskPhrase, aliasHopFamily, answeredTargetDirectory, applyAnswersToContract, applyDeclaredRunner, argvInvokesNodeTest, assertNoGitlinkChanges, bindDeclaredCommand, bindPreparedTestCommand, chooseNodeVersion, ciInstallSteps, ciInstallersFor, ciManagerVersions, ciRefusalIsActionable, classicPerTestRefusal, classicPerTestRunner, classifyNxTestTarget, classifyPackageDirectory, classifyPackageManifest, classifyRushTestScript, classifyWithAliasHop, commentLines, committedYarnVersion, contractDescriptors, decideSetupJob, declarableSetupJobs, declaredCommandContext, declaredRunner, declaredRunnerInvocation, declaredSetupJob, declaredSetupPin, denoLockfilePath, denoTestInvocation, deriveCiRecipe, detectJasmineSuite, detectPackageManager, detectPackageManagerContext, detectTarget, detectVitestDir, diskRepoAccess, diskRepoReader, doorSetupJobs, emptyCiRecipe, engineRunner, enumerateNxProjects, enumerateRushProjects, enumerateWorkspacePackages, enumerateWorkspacePackagesOnDisk, initFailureClassOf, initRefusal, initStepRole, invokesNodeTest, isBrowserInstallCommand, isInstallStep, jasmineSuiteFromScript, layerEnvironment, materializeSubmodule, nodeDeclarationProblemReason, nodeSpecVersions, placeSetupStep, policyDeclaration, preRunnerStageCommands, readAnswerValue, readBrowserLane, readDenoProject, readNodeSpec, readWorkflowExpressions, referencesExpression, referencesSecret, refusalRemedyOf, renderConfig, renderEnvironmentBlock, renderWorkflow, repoPath, resolveMeasurementPlan, resolveSetupPin, resolveTarget, resolveTargetDetection, rootAggregatorTasks, runnerInvocation, runnerStageCommand, runnerSuiteInvocations, rushIdentityFiles, rushLockfiles, rushNodeVersionRange, sameJobReference, scriptRunsDenoTest, selectAutoTarget, setupAnswerProblem, setupJobCandidates, setupJobReference, setupScriptSteps, setupStepAnchor, setupStepOrigin, splitAnswerList, suiteStages, systemPackagesStep, testCommandReceipt, testStepLabel, testableWorkspacePackages, unreadableConditionLine, vitestDirIn, withoutPackageRunnerPrefix, workDirPrefix };
|
|
4841
|
+
export { ANSWERABLE_SETUP_KEYS, ANSWERED_EVIDENCE, type AggregatorChain, type AggregatorChainGap, type AggregatorChainPackage, type AggregatorInvocation, type AggregatorTool, type AttestationJob, type AutoTargetSelection, type BrowserLane, type BrowserLaneEvidence, type BrowserLaneKind, CI_RECIPE_REFUSALS, type CiBorrowJob, type CiBrowserLane, type CiDroppedStep, type CiEnvironmentValue, type CiInstallStep, type CiJobStep, type CiJobTestStep, type CiManagerVersion, type CiNodeVersion, type CiRecipe, type CiRequiredVariable, type CiService, type CiSetupCommand, type CiSystemPackage, type CiTestCommand, type CiUnreadableJobCall, type CiUnsupportedService, type ConfigInput, type ConfigSystemPackage, type CoverageChildSuite, DENO_CONFIG_FILES, DENO_LOCKFILE, type DeclaredBinding, type DeclaredCommandContext, type DenoProject, type DraftService, ENVIRONMENT_BLOCK_HEADER, InitRefusal, type LockfileChoice, type ManifestClassification, type NodeChoice, type NodeDeclaration, type NodeDeclarationProblem, type NodeDeclarationRejection, type NodeEnvironment, type NodeRelease, type NodeRequirement, type NodeSpecReading, type NxProject, type NxTestTarget, type PackageManager, type PackageManagerContext, type PackageManagerResolution, type PlanDeclaration, type PolicyDeclaration, RETIRED_ENVIRONMENT_BLOCK_HEADERS, RUSH_CONFIG_DIRECTORY, RUSH_CONFIG_FILE, RUSH_INSTALL_COMMAND, RUSH_INSTALL_SCRIPT, RUSH_LOCKFILE_NAME, RUSH_REPO_STATE_NAME, RUSH_SUBSPACE_DIRECTORY, RUSH_TEST_SCRIPTS, type ReadTextAt, type RebuildDraftValue, type RepoAccess, type ResolveMeasurementPlanInput, type Runner, type RuntimeNeed, type RushProject, type RushTestTarget, SETUP_QUESTION_DESCRIPTORS, STEP_WHAT, type SetupAnswerChannel, type SetupAnswerShape, type SetupDraftValues, type SetupFailFastDecision, type SetupJobDecision, type SetupJobQuestion, type SetupMatrixLeg, type SetupPin, type SetupPublishPlacement, type SetupQuestionDescriptor, type SetupScriptInput, type SetupStepAnchor, type SetupStepPlacement, type SetupStepPrecondition, type SubmoduleRoot, type TargetDetection, TargetDetectionError, TargetNotFoundError, type TargetNotFoundReason, type TargetResolution, type TargetResolutionInput, type WorkflowEnvironmentEntry, type WorkflowEnvironmentLevel, type WorkflowEnvironmentScope, type WorkflowExpressionFacts, type WorkflowExpressionReading, type WorkspaceEnumeration, type WorkspaceRootSuite, __testing, accessExists, accessKind, accessManifest, accessSubdirectories, accessText, admitSubmodules, aggregatorChain, aggregatorInvocation, aggregatorTaskPhrase, aliasHopFamily, answeredTargetDirectory, applyAnswersToContract, applyDeclaredRunner, argvInvokesNodeTest, assertNoGitlinkChanges, bindDeclaredCommand, bindPreparedTestCommand, chooseNodeVersion, ciInstallSteps, ciInstallersFor, ciManagerVersions, ciRefusalIsActionable, classicPerTestRefusal, classicPerTestRunner, classifyNxTestTarget, classifyPackageDirectory, classifyPackageManifest, classifyRushTestScript, classifyWithAliasHop, commentLines, committedYarnVersion, contractDescriptors, decideSetupJob, declarableSetupJobs, declaredCommandContext, declaredRunner, declaredRunnerInvocation, declaredSetupJob, declaredSetupPin, denoLockfilePath, denoTestInvocation, deriveCiRecipe, detectJasmineSuite, detectPackageManager, detectPackageManagerContext, detectTarget, detectVitestDir, diskRepoAccess, diskRepoReader, doorSetupJobs, emptyCiRecipe, engineRunner, enumerateNxProjects, enumerateRushProjects, enumerateWorkspacePackages, enumerateWorkspacePackagesOnDisk, initFailureClassOf, initRefusal, initStepRole, invokesNodeTest, isBrowserInstallCommand, isEnvironmentBlockHeader, isInstallStep, jasmineSuiteFromScript, layerEnvironment, materializeSubmodule, nodeDeclarationProblemReason, nodeSpecVersions, overlayRepoAccess, placeSetupStep, policyDeclaration, preRunnerStageCommands, readAnswerValue, readBrowserLane, readDenoProject, readNodeSpec, readWorkflowExpressions, referencesExpression, referencesSecret, refusalRemedyOf, renderConfig, renderEnvironmentBlock, renderWorkflow, repoPath, resolveMeasurementPlan, resolveSetupPin, resolveTarget, resolveTargetDetection, rootAggregatorTasks, runnerInvocation, runnerStageCommand, runnerSuiteInvocations, rushIdentityFiles, rushLockfiles, rushNodeVersionRange, sameJobReference, scriptRunsDenoTest, selectAutoTarget, setupAnswerProblem, setupJobCandidates, setupJobReference, setupScriptSteps, setupStepAnchor, setupStepOrigin, splitAnswerList, suiteStages, systemPackagesStep, testCommandReceipt, testStepLabel, testableWorkspacePackages, unreadableConditionLine, vitestDirIn, withoutPackageRunnerPrefix, workDirPrefix, workflowRunsAbloh };
|