@patronage/factory-ci 1.0.0-alpha.21 → 1.0.0-alpha.23
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 +46 -10
- package/dist/index.d.ts +253 -27
- package/dist/index.js +374 -124
- package/package.json +2 -2
- package/src/actions.ts +13 -0
- package/src/candidate-impact-workflow.ts +17 -14
- package/src/execute-alchemy-entry.ts +27 -22
- package/src/impact-demand-condition.ts +67 -0
- package/src/index.ts +18 -0
- package/src/merge-freeze-job.ts +237 -0
- package/src/pr-status-hud-workflow.ts +6 -8
- package/src/preview-proof-inventory.ts +22 -9
- package/src/preview-proof-lifecycle.ts +1 -8
- package/src/production-impact-workflow.ts +17 -14
- package/src/proof-reuse-gate.ts +152 -83
- package/src/push-identity-workflow.ts +27 -12
package/README.md
CHANGED
|
@@ -79,7 +79,7 @@ const core = job("core", {
|
|
|
79
79
|
|
|
80
80
|
Migration: upgrade `@patronage/factory-ci`, apply the shared trigger types and job condition in the TypeScript workflow source, then regenerate and commit the emitted YAML. Draft `opened` and `synchronize` events will stop running substantive Verify work. Promotion through `ready_for_review`, later non-draft Candidate events, and merge-target pushes continue to run their applicable battery. A skipped draft run is presentation, not proof.
|
|
81
81
|
|
|
82
|
-
Production impact support follows the same ownership line. A generated deploy workflow declares only its target names and consumes the returned decision step and fail-open `demandedIf(target)` expressions:
|
|
82
|
+
Production impact support follows the same ownership line. A generated deploy workflow declares only its target names and consumes the returned decision step and fail-open `demandedIf(target, decisionJob)` expressions:
|
|
83
83
|
|
|
84
84
|
```ts
|
|
85
85
|
const impact = factoryProductionImpactWorkflow({
|
|
@@ -111,6 +111,7 @@ import {
|
|
|
111
111
|
factoryPushIdentityProducer,
|
|
112
112
|
factoryWorkflow,
|
|
113
113
|
NODE_PNPM_ACTION_FAMILY_NODE24,
|
|
114
|
+
UPLOAD_ARTIFACT,
|
|
114
115
|
} from "@patronage/factory-ci";
|
|
115
116
|
|
|
116
117
|
const workflowArtifact = factoryWorkflow({
|
|
@@ -120,10 +121,7 @@ const workflowArtifact = factoryWorkflow({
|
|
|
120
121
|
tag: "v5.0.0",
|
|
121
122
|
uses: "actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0",
|
|
122
123
|
},
|
|
123
|
-
uploadArtifact:
|
|
124
|
-
tag: "v4.6.2",
|
|
125
|
-
uses: "actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02",
|
|
126
|
-
},
|
|
124
|
+
uploadArtifact: UPLOAD_ARTIFACT,
|
|
127
125
|
},
|
|
128
126
|
generated: {
|
|
129
127
|
source: ".github/workflows/verify.ts",
|
|
@@ -165,7 +163,7 @@ The helper selects no action family or action version. Callers pass the explicit
|
|
|
165
163
|
|
|
166
164
|
This is identity transport and validation only. The consumer still owns the `workflow_run` trigger and branch policy, job topology and runners, deploy credentials and environments, target declarations, commands, ordering, and convergence/no-op proof. None of those belong in the identity artifact or decision job.
|
|
167
165
|
|
|
168
|
-
Candidate pull-request routing follows the same ownership line through `factoryCandidateImpactWorkflow` (#741). A generated Verify workflow declares only its target names and consumes the returned decision step and fail-open `demandedIf(target)` expressions, so the profile's canonical impact declarations and dependency graph route the run instead of a repository-maintained path filter:
|
|
166
|
+
Candidate pull-request routing follows the same ownership line through `factoryCandidateImpactWorkflow` (#741). A generated Verify workflow declares only its target names and consumes the returned decision step and fail-open `demandedIf(target, decisionJob)` expressions, so the profile's canonical impact declarations and dependency graph route the run instead of a repository-maintained path filter:
|
|
169
167
|
|
|
170
168
|
```ts
|
|
171
169
|
const impact = factoryCandidateImpactWorkflow({
|
|
@@ -191,7 +189,7 @@ const core = job("core", {
|
|
|
191
189
|
});
|
|
192
190
|
```
|
|
193
191
|
|
|
194
|
-
`demandedIf(target, decisionJob)` emits `always()` so a failed decision job still demands work, and it checks only the decision job's result. Declare the decision job as the routed job's only `needs`. A routed job with more prerequisites must add its own `needs.<job>.result == 'success'` clauses, because `always()` suppresses GitHub's implicit success gating for every dependency. The production decision seam has the same contract.
|
|
192
|
+
`demandedIf(target, decisionJob)` builds the cross-job condition. The decision job id is required, so a routed job cannot receive a same-job condition by accident. It emits `always()` so a failed decision job still demands work, and it checks only the decision job's result. Declare the decision job as the routed job's only `needs`. A routed job with more prerequisites must add its own `needs.<job>.result == 'success'` clauses, because `always()` suppresses GitHub's implicit success gating for every dependency. `demandedIfAtStep(target)` builds the same fail-open condition for a step inside the decision job, where the decision is read from `steps.<stepId>`. The production decision seam has the same contract.
|
|
195
193
|
|
|
196
194
|
Trust boundary: candidate routing is a cost control inside the pull request's own CI, not a merge-security control. A `pull_request` run executes the PR's workflow file and install scripts, so a hostile PR can already shape any of its own job outputs — with or without this seam, exactly as with a repository path filter. Merge admission never trusts these outputs: merge-target push verification stays full and unrouted, and the factory proof chain binds to commits, not to job conditions.
|
|
197
195
|
|
|
@@ -256,6 +254,42 @@ const jobs = [
|
|
|
256
254
|
|
|
257
255
|
The audit job is `always()` so a failed destroy still runs the stage-wide check. It does not receive a stack name or path filter — per-stack audit filters are rejected because they trade away the whole-stage guarantee (paitronage#1143). `previewCleanupDestroyJobId(stack)` is the same id mapping callers can use when they assemble destroy jobs by hand.
|
|
258
256
|
|
|
257
|
+
### Merge-freeze writer job
|
|
258
|
+
|
|
259
|
+
```ts
|
|
260
|
+
import { factoryMergeFreezeJob } from "@patronage/factory-ci";
|
|
261
|
+
|
|
262
|
+
const freeze = factoryMergeFreezeJob({
|
|
263
|
+
createGithubAppToken: workflowArtifact.actions.createGithubAppToken,
|
|
264
|
+
needs: [changes, core, docs],
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
const jobs = [
|
|
268
|
+
changes,
|
|
269
|
+
core,
|
|
270
|
+
docs,
|
|
271
|
+
job(freeze.jobId, {
|
|
272
|
+
name: freeze.jobName,
|
|
273
|
+
needs: freeze.needs,
|
|
274
|
+
if: freeze.if,
|
|
275
|
+
runsOn: "ubuntu-latest",
|
|
276
|
+
permissions: freeze.permissions,
|
|
277
|
+
timeoutMinutes: 10,
|
|
278
|
+
steps: freeze.steps,
|
|
279
|
+
}),
|
|
280
|
+
];
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
A consumer's generated merge-target-push Verify workflow is the only producer of `patronage-factory/merge-freeze` generations (#356, ADR 0016 as amended; #429, #872). A red merge-target Verify completes a generation active, a green one completes it inactive, and `pr:ready` reads the generation on the candidate's own base tip. No command, scheduled job, or second workflow writes that check run; the operator override (`demand:waive --demand merge-freeze`) waives the demand for one candidate and never writes here.
|
|
284
|
+
|
|
285
|
+
`factoryMergeFreezeJob` owns everything a reader trusts: the check name (`FACTORY_MERGE_FREEZE_CHECK_NAME`), the pinned Patronage Factory App identity, the `actions/create-github-app-token` inputs, the `needs.*.result` fold (`FACTORY_MERGE_FREEZE_VERIFY_RESULT_EXPRESSION`), the merge-target condition (`FACTORY_MERGE_FREEZE_IF`, built from `FACTORY_MERGE_TARGET_REF_CONDITION`), and the job's least-privilege `permissions` (an empty block: the App installation token carries the check-run write, the job uses no `GITHUB_TOKEN` scope, and it never checks out the repository). The caller owns the runner, the timeout, and the `needs` list.
|
|
286
|
+
|
|
287
|
+
That `needs` list is the whole trust input: it must name **every authoritative verification leaf**, because the fold is what decides active or inactive. An empty list is refused — a fold over no needed job always reports success, which would report a merge target nothing verified as green.
|
|
288
|
+
|
|
289
|
+
`if` is `always() && github.event_name == 'push' && (main or epic/**)`. Each clause is load-bearing. `always()` keeps the red path running when a needed job failed. `push` keeps a `pull_request` run from writing a generation at its synthetic merge SHA. The namespace is literal by decision — `main` plus repository-owned `epic/**` integration branches — so a consumer's `push` trigger branch list names the same two things.
|
|
290
|
+
|
|
291
|
+
The job needs no checkout and no install: it mints an App installation token, then makes two Checks API calls. The write is deliberately fail-closed, the opposite of the proof-reuse gate's fail-open shell. The step runs under the runner's default `bash -e {0}`, so any API refusal aborts it, the generation stays absent or `in_progress`, and every arming-time read of that tip refuses until a later push writes a green generation. `factoryMergeFreezeScript()` is that script alone, for a consumer test that executes it against a stubbed `gh` and parses the emitted payload with the factory package's `validateMergeFreezeState` — the round trip that keeps writer and reader from drifting.
|
|
292
|
+
|
|
259
293
|
### Generated shell
|
|
260
294
|
|
|
261
295
|
```ts
|
|
@@ -315,6 +349,8 @@ The **proof-reuse gate** decides whether a hosted job may reuse the local verifi
|
|
|
315
349
|
|
|
316
350
|
The gate runs on pull requests and on pushes to the default branch (#611). A push run first reads proof at the pushed head. A squash merge mints a new commit, so when that direct read finds no generation at all, a **merge fallback** looks up the single merged pull request whose merge commit is the pushed head and reuses that PR head's proven check run — only when the merge commit's tree id equals the proven head's tree id, which makes the pushed content byte-identical to what was verified (a clean squash of an unchanged tip). Patch identity was considered and rejected as the comparator: `git patch-id` normalizes whitespace and ignores base motion, so an identical patch can still integrate into a tree nothing verified. No unique producing PR, an unreadable commit, a proof that is anything but proven, or tree drift from a dirty or stale merge all leave the direct refusal standing and run the full suite. The fallback needs `pull-requests: read` and `contents: read` on the job in addition to `checks: read`; a job that grants less loses only the fallback.
|
|
317
351
|
|
|
352
|
+
`reuse` chooses which events may reuse proof (#873). It takes two values and nothing else, because the emitted condition is a trust predicate: a free-text override lets a consumer reuse proof on a ref nothing proved. `"pull-request-and-default-branch"` is the default and the behaviour above. `"pull-request"` emits `github.event_name == 'pull_request'` alone and omits the merge fallback, so every default-branch push executes the full hosted suite and the job needs only `checks: read`. Choose it when the merged commit must be verified in its own right; the consumer then owns that unconditional default-branch cost.
|
|
353
|
+
|
|
318
354
|
A proof is reusable only when the complete Checks API result (`filter=all`, every page) establishes one unambiguous newest generation by greatest `started_at`, produced by the pinned App for the exact repository and head, completed successfully with `outcome: passed`, and covering every command identity the guarded surface requires. Coverage is the union of `executedCommands` and commands released by `notRequiredCommands` only after the gate validates each release against that same proof binding's command-to-target map and identity-bound impact stamp. Missing, malformed, duplicated, affected, unknown, or differently bound release data refuses reuse and runs the hosted surface. `mode` is reported as diagnostic metadata, never authorized on: a reduced-mode proof whose executed and stamp-authorized released commands cover a surface is reusable.
|
|
319
355
|
|
|
320
356
|
The only thing a consumer chooses is **what its surface requires**, expressed as the plain profile command objects that surface selects — a repository with distinct core and docs jobs selects distinct sets and gets distinct required coverage. `proofReuseRequiredCommands()` is the single derivation both the gate and the assertion go through. Identities are baked into the emitted script, so they are held to a plain `[A-Za-z0-9_][\w.:@/-]*` allow-list and shell-quoted at the interpolation site; a selection carrying anything else is unusable and degrades to a gate that always refuses.
|
|
@@ -341,7 +377,7 @@ import { bundleAlchemyEntry, executeAlchemyEntry } from "@patronage/factory-ci";
|
|
|
341
377
|
|
|
342
378
|
`alias` is a specifier-to-target map handed to esbuild. Substitution runs before the `packages` and `external` decisions, so an aliased bare specifier is inlined even under `packages: "external"` — that is how a repo points a workspace-only or duplicated package at one file. Give absolute paths or package names; which aliases a repo needs is consumer policy and this package ships no defaults. `executeAlchemyEntry` passes its whole `bundle` option through, so the map is available there too. Because substitution runs first, an alias on `alchemy`, `effect`, or any of their subpaths would silently defeat the externals and bundle a second copy, so those keys are rejected outright. Targets are not string-matched — no rule over how a path is spelled can survive `..` segments or symlinks — so instead the build's metafile is checked afterwards and the bundle is rejected if it carries any input from a reserved package, however that file was reached. A consumer shim that re-exports `effect` by bare specifier stays external naturally and is allowed.
|
|
343
379
|
|
|
344
|
-
`executeAlchemyEntry({ from, bundle, args, ... })` owns the repeated choreography: resolve the consumer's Alchemy CLI from `from`, bundle the entry, run that CLI under the current Node binary with the absolute bundled entry appended, and throw on spawn errors, signals, missing statuses, or non-zero exits. It returns only after status 0. Pass `bundledEntry` (absolute or cwd-relative) to
|
|
380
|
+
`executeAlchemyEntry({ from, bundle, args, ... })` owns the repeated choreography: resolve the consumer's Alchemy CLI from `from`, bundle the entry, run that CLI under the current Node binary with the absolute bundled entry appended, and throw on spawn errors, signals, missing statuses, or non-zero exits. It returns only after status 0. Options carry exactly one entry source. Pass `bundle` to bundle now, or `bundledEntry` (absolute or cwd-relative) to reuse a path from a prior `bundleAlchemyEntry` call. Passing both, or neither, does not type-check. Captured output (`stdio: "pipe"`) honors `maxBuffer` only when the caller supplies it (Node's `spawnSync` default is 1 MiB; pass `EXECUTE_ALCHEMY_ENTRY_MAX_BUFFER` for 64 MiB) and, when supplied, a `redact: (text: string) => string` hook applied to stdout and stderr before they are returned. Default `stdio: "inherit"` still streams the child unredacted. This package does not own a secret-name policy.
|
|
345
381
|
|
|
346
382
|
The caller still owns deploy/destroy/plan arguments, stage admission, credentials, environment shaping, destructive-plan guards, and convergence. Failure messages never repeat arguments or environment values.
|
|
347
383
|
|
|
@@ -368,7 +404,7 @@ import { previewProofLifecycle } from "@patronage/factory-ci";
|
|
|
368
404
|
Events:
|
|
369
405
|
|
|
370
406
|
- `begin` — the pre-deploy gate. Refuses a draft, a closed PR, a dirty or mismatched worktree, and any stage the disposable grammar does not own for this PR head. Does not create a registration.
|
|
371
|
-
- `register` — the same identity gate, plus passed smoke, passed convergence, and a passing three-way-bound evidence envelope at this head. Writes a registration with `
|
|
407
|
+
- `register` — the same identity gate, plus passed smoke, passed convergence, and a passing three-way-bound evidence envelope at this head. Writes a registration with `cleanup.outcome: "pending"`. Cleanup, smoke, and convergence status live only on their nested objects, so no top-level copy can diverge from them. Machine evidence is that envelope; this module never posts a PR comment.
|
|
372
408
|
- `cleanup` — records an explicit passed or failed outcome onto an existing registration. Cleanup is never inferred from whether the stage still exists. `recover` is the failed-to-resolved re-entry of this event.
|
|
373
409
|
|
|
374
410
|
Proof runs entirely on one side of GitHub's draft/ready boundary: both `begin` and `register` refuse `isDraft: true`. Undraft first, then prove. Callers still own deploy, destroy, credentials, smoke probes, envelope emission, and stack names.
|
|
@@ -391,7 +427,7 @@ Registration is a consumer-readable read model. Cleanup outcomes are recorded by
|
|
|
391
427
|
|
|
392
428
|
Persistence is an injectable GitHub transport in the same style as `mintInstallationToken`: the caller passes `fetch` and a token. This package does not read operator config or hold secrets. Records bind to the Patronage Factory GitHub App (`FACTORY_PROOF_GATE_APP_ID`) and the disposable-stage grammar. Check-runs named `patronage-factory/preview-proof` (`PREVIEW_PROOF_INVENTORY_CHECK_NAME`) carry the registration JSON. This API does not POST or PATCH issue comments.
|
|
393
429
|
|
|
394
|
-
`list({ owner, repo, pr }, { token })` works with a workflow `GITHUB_TOKEN` (read). `persist` and `recordCleanup` write App-owned check-runs, which GitHub only allows the producing App to update. Pass an installation token the caller minted (`mintInstallationToken`); a job `GITHUB_TOKEN` cannot write those records. There is no `psf` command for this surface.
|
|
430
|
+
`list({ owner, repo, pr }, { token })` works with a workflow `GITHUB_TOKEN` (read). Give that job `permissions: PREVIEW_PROOF_INVENTORY_LIST_PERMISSIONS` (also `previewProofInventory.listPermissions`): `checks: read`, `contents: read`, `pull-requests: read`. A job that omits `pull-requests: read` gets 403 on the PR commit listing for a same-repository PR and discovers nothing (#859). `persist` and `recordCleanup` write App-owned check-runs, which GitHub only allows the producing App to update. Pass an installation token the caller minted (`mintInstallationToken`); a job `GITHUB_TOKEN` cannot write those records. There is no `psf` command for this surface.
|
|
395
431
|
|
|
396
432
|
`recordCleanup` loads the PR's registrations, applies `previewProofLifecycle.transition(..., { type: "cleanup" })`, then persists. Failed then passed uses that same event; in-memory re-entry from a failed outcome is `previewProofLifecycle.recover`, which calls that transition. Unknown stack or stage, and an identity mismatch on the disposable stage or head SHA, fail closed. Check-runs from another App, including `github-actions`, are ignored.
|
|
397
433
|
|
package/dist/index.d.ts
CHANGED
|
@@ -53,6 +53,18 @@ declare const NODE_PNPM_ACTION_FAMILY_NODE24: {
|
|
|
53
53
|
readonly uses: "pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271";
|
|
54
54
|
};
|
|
55
55
|
};
|
|
56
|
+
/**
|
|
57
|
+
* The one `actions/upload-artifact` pin every workflow generator shares
|
|
58
|
+
* (#887). Two callers pinned two different commits of the same tag family;
|
|
59
|
+
* naming the pin here makes that drift impossible the same way the Node/pnpm
|
|
60
|
+
* family does. A caller passes this through `factoryWorkflow`'s
|
|
61
|
+
* `additionalActions.uploadArtifact` explicitly — the catalog names the pin,
|
|
62
|
+
* it does not inject the upload step.
|
|
63
|
+
*/
|
|
64
|
+
declare const UPLOAD_ARTIFACT: {
|
|
65
|
+
readonly tag: "v4.6.2";
|
|
66
|
+
readonly uses: "actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02";
|
|
67
|
+
};
|
|
56
68
|
//#endregion
|
|
57
69
|
//#region src/candidate-lifecycle.d.ts
|
|
58
70
|
/**
|
|
@@ -205,12 +217,10 @@ interface PreviewProofRegistration {
|
|
|
205
217
|
readonly outcome: PreviewProofCleanupStatus;
|
|
206
218
|
readonly runUrl?: string;
|
|
207
219
|
};
|
|
208
|
-
readonly cleanupStatus: PreviewProofCleanupStatus;
|
|
209
220
|
readonly convergence: {
|
|
210
221
|
readonly detail: string;
|
|
211
222
|
readonly status: "passed";
|
|
212
223
|
};
|
|
213
|
-
readonly convergenceStatus: "passed";
|
|
214
224
|
readonly headSha: string;
|
|
215
225
|
readonly pr: number;
|
|
216
226
|
readonly proof: {
|
|
@@ -223,7 +233,6 @@ interface PreviewProofRegistration {
|
|
|
223
233
|
readonly detail: string;
|
|
224
234
|
readonly outcome: "passed";
|
|
225
235
|
};
|
|
226
|
-
readonly smokeStatus: "passed";
|
|
227
236
|
readonly source: "local-self-certified";
|
|
228
237
|
readonly stack: string;
|
|
229
238
|
readonly stage: LocalPreviewStage;
|
|
@@ -298,6 +307,20 @@ declare const previewProofLifecycle: {
|
|
|
298
307
|
*/
|
|
299
308
|
/** Check-run name that carries one registration JSON payload. Not a gate. */
|
|
300
309
|
declare const PREVIEW_PROOF_INVENTORY_CHECK_NAME = "patronage-factory/preview-proof";
|
|
310
|
+
/**
|
|
311
|
+
* Least privilege for a job whose `GITHUB_TOKEN` calls `list`. A
|
|
312
|
+
* `permissions` block zeroes every unlisted scope, and `list` reads five
|
|
313
|
+
* endpoints: `pulls/{pr}`, `pulls/{pr}/commits`, and the GraphQL force-push
|
|
314
|
+
* timeline (`pull-requests`), `compare` (`contents`), and
|
|
315
|
+
* `commits/{sha}/check-runs` (`checks`). A job
|
|
316
|
+
* that omits `pull-requests: read` fails with 403 on a same-repository PR
|
|
317
|
+
* and skips every destroy matrix (#859). Give the discovery job this object.
|
|
318
|
+
*/
|
|
319
|
+
declare const PREVIEW_PROOF_INVENTORY_LIST_PERMISSIONS: Readonly<{
|
|
320
|
+
readonly checks: "read";
|
|
321
|
+
readonly contents: "read";
|
|
322
|
+
readonly "pull-requests": "read";
|
|
323
|
+
}>;
|
|
301
324
|
interface PreviewProofInventoryStore {
|
|
302
325
|
list: (input: {
|
|
303
326
|
owner: string;
|
|
@@ -371,6 +394,11 @@ declare class PreviewProofTransportError extends Error {
|
|
|
371
394
|
declare const previewProofInventory: {
|
|
372
395
|
readonly githubStore: (transport: PreviewProofInventoryTransport) => PreviewProofInventoryStore;
|
|
373
396
|
readonly list: (input: PreviewProofInventoryListInput, access: PreviewProofInventoryAccess) => Promise<readonly PreviewProofRegistration[]>;
|
|
397
|
+
readonly listPermissions: Readonly<{
|
|
398
|
+
readonly checks: "read";
|
|
399
|
+
readonly contents: "read";
|
|
400
|
+
readonly "pull-requests": "read";
|
|
401
|
+
}>;
|
|
374
402
|
readonly memoryStore: () => PreviewProofInventoryStore;
|
|
375
403
|
readonly persist: (input: PreviewProofInventoryPersistInput, access: PreviewProofInventoryAccess) => Promise<void>;
|
|
376
404
|
readonly recordCleanup: (input: PreviewProofInventoryCleanupInput, access: PreviewProofInventoryAccess) => Promise<PreviewProofRegistration>;
|
|
@@ -499,22 +527,12 @@ declare const mintInstallationToken: (input: {
|
|
|
499
527
|
//#region src/execute-alchemy-entry.d.ts
|
|
500
528
|
/** Node's spawnSync default is 1 MiB; Alchemy plans routinely exceed that. */
|
|
501
529
|
declare const EXECUTE_ALCHEMY_ENTRY_MAX_BUFFER: number;
|
|
502
|
-
interface
|
|
530
|
+
interface ExecuteAlchemyEntryCommon {
|
|
503
531
|
/**
|
|
504
532
|
* CLI arguments before the bundled entry. The absolute entry path is always
|
|
505
533
|
* appended as the final argument.
|
|
506
534
|
*/
|
|
507
535
|
readonly args: readonly string[];
|
|
508
|
-
/**
|
|
509
|
-
* Bundle the consumer entry before execution. Required unless `bundledEntry`
|
|
510
|
-
* is set. Ignored when `bundledEntry` is set.
|
|
511
|
-
*/
|
|
512
|
-
readonly bundle?: BundleAlchemyEntryOptions;
|
|
513
|
-
/**
|
|
514
|
-
* Already-bundled entry path. When set, skips the internal bundle step and
|
|
515
|
-
* appends this path as the CLI's final argument.
|
|
516
|
-
*/
|
|
517
|
-
readonly bundledEntry?: string;
|
|
518
536
|
/** Child working directory. Defaults to the bundle root, then process.cwd. */
|
|
519
537
|
readonly cwd?: string;
|
|
520
538
|
/** Child environment. Defaults to process.env. */
|
|
@@ -537,6 +555,21 @@ interface ExecuteAlchemyEntryOptions {
|
|
|
537
555
|
/** Child stdio. Default "inherit". */
|
|
538
556
|
readonly stdio?: "inherit" | "pipe";
|
|
539
557
|
}
|
|
558
|
+
/**
|
|
559
|
+
* Exactly one entry source. The union refuses `bundle` and `bundledEntry`
|
|
560
|
+
* together, and refuses neither, so no runtime check is needed.
|
|
561
|
+
*/
|
|
562
|
+
type ExecuteAlchemyEntryOptions = ExecuteAlchemyEntryCommon & ({
|
|
563
|
+
/** Bundle the consumer entry before execution. */readonly bundle: BundleAlchemyEntryOptions;
|
|
564
|
+
readonly bundledEntry?: never;
|
|
565
|
+
} | {
|
|
566
|
+
readonly bundle?: never;
|
|
567
|
+
/**
|
|
568
|
+
* Already-bundled entry path. Skips the internal bundle step and
|
|
569
|
+
* appends this path as the CLI's final argument.
|
|
570
|
+
*/
|
|
571
|
+
readonly bundledEntry: string;
|
|
572
|
+
});
|
|
540
573
|
interface ExecuteAlchemyEntryResult {
|
|
541
574
|
readonly bundledEntry: string;
|
|
542
575
|
readonly stderr: string | null;
|
|
@@ -546,8 +579,8 @@ interface ExecuteAlchemyEntryResult {
|
|
|
546
579
|
* Bundle a consumer-owned Alchemy entry, resolve that consumer's Alchemy CLI,
|
|
547
580
|
* run it under the current Node binary, and return only on a successful exit.
|
|
548
581
|
*
|
|
549
|
-
*
|
|
550
|
-
* path. Captured stdout and stderr (`stdio: "pipe"`) can be redacted through
|
|
582
|
+
* Options carry exactly one entry source: `bundle` to bundle now, or
|
|
583
|
+
* `bundledEntry` to reuse an already-bundled path. Captured stdout and stderr (`stdio: "pipe"`) can be redacted through
|
|
551
584
|
* `redact` before they are returned; `stdio: "inherit"` still streams the
|
|
552
585
|
* child unredacted.
|
|
553
586
|
*
|
|
@@ -663,6 +696,36 @@ declare const FACTORY_PROOF_GATE_GUARD = "steps.factory-proof.outputs.reuse-proo
|
|
|
663
696
|
* the default branch.
|
|
664
697
|
*/
|
|
665
698
|
declare const FACTORY_PROOF_GATE_IF = "github.event_name == 'pull_request' || (github.event_name == 'push' && github.ref == format('refs/heads/{0}', github.event.repository.default_branch))";
|
|
699
|
+
/**
|
|
700
|
+
* Pull requests only — the condition a consumer gets with
|
|
701
|
+
* `reuse: "pull-request"` (#873).
|
|
702
|
+
*
|
|
703
|
+
* A repository may want its default-branch pushes to always execute the full
|
|
704
|
+
* hosted suite, whatever proof exists: the merged commit is what the fleet
|
|
705
|
+
* deploys, so a periodic unconditional run of every command is a deliberate
|
|
706
|
+
* cost some consumers choose to pay. This condition is that choice, expressed
|
|
707
|
+
* once here rather than as a consumer-written override string. The mode also
|
|
708
|
+
* skips the push-event merge fallback, so no push path can reuse proof even if
|
|
709
|
+
* the workflow reaches the step through some other trigger.
|
|
710
|
+
*
|
|
711
|
+
* Which branches trigger the workflow at all stays repository-owned. This
|
|
712
|
+
* condition only keeps the gate from consulting proof outside a pull request.
|
|
713
|
+
*/
|
|
714
|
+
declare const FACTORY_PROOF_GATE_PULL_REQUEST_IF = "github.event_name == 'pull_request'";
|
|
715
|
+
/**
|
|
716
|
+
* Which events may reuse proof.
|
|
717
|
+
*
|
|
718
|
+
* A two-value enum, not a free-text condition: a string lets a consumer write
|
|
719
|
+
* a condition this package cannot reason about — one that reuses proof on an
|
|
720
|
+
* unproven ref — and the emitted condition is a trust predicate. The consumer
|
|
721
|
+
* chooses the mode; `factory-ci` owns what each mode emits.
|
|
722
|
+
*
|
|
723
|
+
* - `pull-request-and-default-branch` (default) pull requests plus pushes to
|
|
724
|
+
* the merge target, with the merge fallback. Today's behaviour.
|
|
725
|
+
* - `pull-request` pull requests only. Default-branch pushes execute the full
|
|
726
|
+
* hosted suite, and the merge fallback is not emitted.
|
|
727
|
+
*/
|
|
728
|
+
type FactoryProofGateReuse = "pull-request" | "pull-request-and-default-branch";
|
|
666
729
|
/**
|
|
667
730
|
* The complete refusal vocabulary. Deliberately few, because these are the
|
|
668
731
|
* only distinctions the gate can honestly make from its Checks API reads.
|
|
@@ -746,6 +809,13 @@ interface FactoryProofGateOptions {
|
|
|
746
809
|
* therefore requires a different coverage.
|
|
747
810
|
*/
|
|
748
811
|
readonly commands: readonly ProofReuseCommand[];
|
|
812
|
+
/**
|
|
813
|
+
* Which events may reuse proof. Defaults to
|
|
814
|
+
* `"pull-request-and-default-branch"`, the behaviour every consumer has
|
|
815
|
+
* today. `"pull-request"` makes default-branch pushes execute the full
|
|
816
|
+
* hosted suite (#873).
|
|
817
|
+
*/
|
|
818
|
+
readonly reuse?: FactoryProofGateReuse;
|
|
749
819
|
/** Names the suite in the job summary. Changes no trust decision. */
|
|
750
820
|
readonly surface: string;
|
|
751
821
|
}
|
|
@@ -763,6 +833,7 @@ interface FactoryProofGateOptions {
|
|
|
763
833
|
*/
|
|
764
834
|
declare const factoryProofGateScript: ({
|
|
765
835
|
commands,
|
|
836
|
+
reuse,
|
|
766
837
|
surface
|
|
767
838
|
}: FactoryProofGateOptions) => string;
|
|
768
839
|
interface FactoryProofGateStep {
|
|
@@ -772,7 +843,7 @@ interface FactoryProofGateStep {
|
|
|
772
843
|
HEAD_SHA: string;
|
|
773
844
|
}>;
|
|
774
845
|
readonly id: typeof FACTORY_PROOF_GATE_STEP_ID;
|
|
775
|
-
readonly if: typeof FACTORY_PROOF_GATE_IF;
|
|
846
|
+
readonly if: typeof FACTORY_PROOF_GATE_IF | typeof FACTORY_PROOF_GATE_PULL_REQUEST_IF;
|
|
776
847
|
readonly name: string;
|
|
777
848
|
readonly run: string;
|
|
778
849
|
readonly shell: typeof FACTORY_PROOF_GATE_SHELL;
|
|
@@ -785,7 +856,9 @@ interface FactoryProofGateStep {
|
|
|
785
856
|
* `checks: read`; the push-event merge fallback additionally reads the
|
|
786
857
|
* producing pull request (`pull-requests: read`) and the two commit objects
|
|
787
858
|
* whose tree ids it compares (`contents: read`). A job that grants less
|
|
788
|
-
* loses only the fallback — the failed read degrades to the full suite.
|
|
859
|
+
* loses only the fallback — the failed read degrades to the full suite. A
|
|
860
|
+
* consumer that passes `reuse: "pull-request"` emits neither the push clause
|
|
861
|
+
* nor the fallback, and needs only `checks: read` (#873).
|
|
789
862
|
*
|
|
790
863
|
* A **step, not a job**, and that is not a style preference. A separate gate
|
|
791
864
|
* job that errored would leave the guarded job `skipped`, and a summary job
|
|
@@ -880,8 +953,13 @@ interface FactoryCandidateImpactWorkflow {
|
|
|
880
953
|
/** Outputs for a caller-owned decision job that subsequent jobs may consume. */
|
|
881
954
|
readonly decisionJobOutputs: Readonly<Record<string, string>>;
|
|
882
955
|
readonly decisionStep: WorkflowStep;
|
|
883
|
-
/**
|
|
884
|
-
|
|
956
|
+
/**
|
|
957
|
+
* A fail-open cross-job condition: only an explicit usable withdrawal skips
|
|
958
|
+
* work. The decision job id is required.
|
|
959
|
+
*/
|
|
960
|
+
readonly demandedIf: (targetName: string, decisionJob: string) => string;
|
|
961
|
+
/** The same fail-open condition for a step in the decision job. */
|
|
962
|
+
readonly demandedIfAtStep: (targetName: string) => string;
|
|
885
963
|
readonly targetOutputs: Readonly<Record<string, string>>;
|
|
886
964
|
}
|
|
887
965
|
/**
|
|
@@ -930,6 +1008,144 @@ interface FactoryLifecycleContractLane {
|
|
|
930
1008
|
*/
|
|
931
1009
|
declare const factoryLifecycleContractLane: (declaration?: FactoryLifecycleContractLaneOptions) => FactoryLifecycleContractLane | undefined;
|
|
932
1010
|
//#endregion
|
|
1011
|
+
//#region src/merge-freeze-job.d.ts
|
|
1012
|
+
/**
|
|
1013
|
+
* The merge-freeze writer job (#356, ADR 0016 as amended; #429 for the
|
|
1014
|
+
* merge-target namespace; #872 for this package).
|
|
1015
|
+
*
|
|
1016
|
+
* A consumer's generated merge-target-push Verify workflow is the ONLY
|
|
1017
|
+
* producer of `patronage-factory/merge-freeze` generations: a red
|
|
1018
|
+
* push-triggered Verify completes a generation active, a green one completes
|
|
1019
|
+
* it inactive, and no command, scheduled job, or second workflow writes this
|
|
1020
|
+
* check run. The operator override (`demand:waive --demand merge-freeze`)
|
|
1021
|
+
* waives the demand for one candidate during a fix-forward; it never writes
|
|
1022
|
+
* here.
|
|
1023
|
+
*
|
|
1024
|
+
* The write mirrors what the factory package's merge-freeze reader parses:
|
|
1025
|
+
* create the run `in_progress` with no `started_at` (GitHub stamps the
|
|
1026
|
+
* generation clock — the ordering rule itself is owned by the reader), then
|
|
1027
|
+
* PATCH it completed with the reader-shaped state payload in `output.text`.
|
|
1028
|
+
* The consumer's workflow test executes this exact script against a stubbed
|
|
1029
|
+
* `gh` and parses the emitted payload with `validateMergeFreezeState`, so
|
|
1030
|
+
* writer and reader cannot drift silently.
|
|
1031
|
+
*
|
|
1032
|
+
* Those two API calls are what the reader's two settling phases observe
|
|
1033
|
+
* (#890). Before the POST the merge target carries no generation at all, which
|
|
1034
|
+
* a reader reports as `awaiting-generation` while the pushed hosted verify run
|
|
1035
|
+
* is still pending. Between the POST and the PATCH the generation exists with
|
|
1036
|
+
* no `output.text`, which a reader reports as `running-generation`. Only the
|
|
1037
|
+
* PATCH writes a verdict, so neither phase is one.
|
|
1038
|
+
*
|
|
1039
|
+
* Failure posture is deliberately fail-closed and the opposite of the
|
|
1040
|
+
* proof-reuse gate's fail-open shell: this step runs under the runner's
|
|
1041
|
+
* default `bash -e {0}`, so any API refusal aborts the step, the generation
|
|
1042
|
+
* stays absent or `in_progress`, and every `pr:ready` arming-time read of
|
|
1043
|
+
* that tip (#477) refuses until a later push writes a green generation.
|
|
1044
|
+
*
|
|
1045
|
+
* **Ownership line.** This package owns the check name, the App identity, the
|
|
1046
|
+
* `create-github-app-token` inputs, the result fold, the merge-target `if`,
|
|
1047
|
+
* and the job's `permissions`. The caller owns the runner, the `needs` list
|
|
1048
|
+
* of every authoritative verification leaf, the timeout, and any extra env.
|
|
1049
|
+
*/
|
|
1050
|
+
/** The one check-run name every merge-freeze reader pins. */
|
|
1051
|
+
declare const FACTORY_MERGE_FREEZE_CHECK_NAME = "patronage-factory/merge-freeze";
|
|
1052
|
+
declare const FACTORY_MERGE_FREEZE_JOB_ID = "freeze";
|
|
1053
|
+
declare const FACTORY_MERGE_FREEZE_JOB_NAME = "Report the merge freeze";
|
|
1054
|
+
/** Step id the token step exposes its installation token under. */
|
|
1055
|
+
declare const FACTORY_MERGE_FREEZE_APP_TOKEN_STEP_ID = "factory-app-token";
|
|
1056
|
+
/**
|
|
1057
|
+
* The GitHub Actions expression that folds the needed jobs' results into the
|
|
1058
|
+
* one word the script branches on. It mirrors the `verify` summary job's
|
|
1059
|
+
* failure condition exactly: any failed or cancelled needed job is a red
|
|
1060
|
+
* merge target.
|
|
1061
|
+
*/
|
|
1062
|
+
declare const FACTORY_MERGE_FREEZE_VERIFY_RESULT_EXPRESSION = "${{ (contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled')) && 'failure' || 'success' }}";
|
|
1063
|
+
/**
|
|
1064
|
+
* The literal factory merge-target namespace, as a `github.ref` predicate
|
|
1065
|
+
* (#429).
|
|
1066
|
+
*
|
|
1067
|
+
* `main` plus the repository-owned `epic/**` integration branches, and
|
|
1068
|
+
* nothing else. Deliberately literal rather than profile-declared: one
|
|
1069
|
+
* implementation per contract, no configuration machinery for a two-element
|
|
1070
|
+
* namespace whose second element is a namespace prefix the repository itself
|
|
1071
|
+
* owns. `epic/` needs the trailing slash — `startsWith` would otherwise admit
|
|
1072
|
+
* `epicness/…`, which is not a merge target.
|
|
1073
|
+
*
|
|
1074
|
+
* A caller's `push` trigger branch list names the same namespace. That list
|
|
1075
|
+
* decides which events produce a run at all; this predicate decides which of
|
|
1076
|
+
* those runs may write a generation.
|
|
1077
|
+
*/
|
|
1078
|
+
declare const FACTORY_MERGE_TARGET_REF_CONDITION: string;
|
|
1079
|
+
/**
|
|
1080
|
+
* `always()` is load-bearing: the red path is the whole point, so the job must
|
|
1081
|
+
* run when a needed verification job failed. `github.event_name == 'push'` is
|
|
1082
|
+
* load-bearing twice over: a `pull_request` run must never write a generation
|
|
1083
|
+
* (its `github.sha` is a synthetic merge commit that no base tip is ever read
|
|
1084
|
+
* at), and a `pull_request` trigger with an `epic/**` base list would
|
|
1085
|
+
* otherwise reach this job.
|
|
1086
|
+
*/
|
|
1087
|
+
declare const FACTORY_MERGE_FREEZE_IF: string;
|
|
1088
|
+
/**
|
|
1089
|
+
* Least privilege for the writer job: no `GITHUB_TOKEN` scope at all.
|
|
1090
|
+
*
|
|
1091
|
+
* Both Checks API calls run under the App installation token minted in the
|
|
1092
|
+
* first step (`GH_TOKEN: steps.factory-app-token.outputs.token`), and the job
|
|
1093
|
+
* never checks out the repository. So the job uses no `GITHUB_TOKEN` scope,
|
|
1094
|
+
* and an empty block is the honest declaration. A `checks: write` here would
|
|
1095
|
+
* hand every adopter an unused write scope (#884).
|
|
1096
|
+
*/
|
|
1097
|
+
declare const FACTORY_MERGE_FREEZE_PERMISSIONS: Readonly<{}>;
|
|
1098
|
+
/**
|
|
1099
|
+
* The script the freeze step runs. Environment contract:
|
|
1100
|
+
* - `GH_TOKEN`: an installation token for the pinned Patronage Factory App —
|
|
1101
|
+
* the check run must carry that App's identity or every reader rejects it.
|
|
1102
|
+
* - `VERIFY_RESULT`: `success` or `failure` (see the fold expression above).
|
|
1103
|
+
* - `GITHUB_SHA` / `GITHUB_REPOSITORY` / `GITHUB_SERVER_URL` /
|
|
1104
|
+
* `GITHUB_RUN_ID` / `GITHUB_REF_NAME`: runner-provided.
|
|
1105
|
+
*
|
|
1106
|
+
* `GITHUB_REF_NAME` is the merge target this run pushed to — `main` or an
|
|
1107
|
+
* `epic/**` integration branch (#429). The job is gated to `push` events on
|
|
1108
|
+
* exactly those refs, so the branch name is always the short name of a
|
|
1109
|
+
* repository-owned merge target and never a pull-request merge ref. It
|
|
1110
|
+
* appears in both recovery sentences because a reader of an epic-targeting
|
|
1111
|
+
* candidate must be told which branch to fix forward on: the generation lives
|
|
1112
|
+
* on that branch's tip, and only a later green push to THAT branch clears it.
|
|
1113
|
+
*/
|
|
1114
|
+
declare const factoryMergeFreezeScript: () => string;
|
|
1115
|
+
interface FactoryMergeFreezeJobOptions<TNeed> {
|
|
1116
|
+
/** The pinned `actions/create-github-app-token` the caller declared. */
|
|
1117
|
+
readonly createGithubAppToken: PinnedAction;
|
|
1118
|
+
/**
|
|
1119
|
+
* Every authoritative verification leaf this generation folds. The elements
|
|
1120
|
+
* are whatever the caller's workflow generator uses for `needs:`; they are
|
|
1121
|
+
* returned unchanged.
|
|
1122
|
+
*/
|
|
1123
|
+
readonly needs: readonly TNeed[];
|
|
1124
|
+
/**
|
|
1125
|
+
* Override the result fold. Defaults to
|
|
1126
|
+
* `FACTORY_MERGE_FREEZE_VERIFY_RESULT_EXPRESSION`, which is what a caller
|
|
1127
|
+
* whose summary job folds `needs.*.result` wants. Supply one only when the
|
|
1128
|
+
* caller's red condition is genuinely different.
|
|
1129
|
+
*/
|
|
1130
|
+
readonly verifyResultExpression?: string;
|
|
1131
|
+
}
|
|
1132
|
+
interface FactoryMergeFreezeJob<TNeed> {
|
|
1133
|
+
readonly if: typeof FACTORY_MERGE_FREEZE_IF;
|
|
1134
|
+
readonly jobId: typeof FACTORY_MERGE_FREEZE_JOB_ID;
|
|
1135
|
+
readonly jobName: typeof FACTORY_MERGE_FREEZE_JOB_NAME;
|
|
1136
|
+
readonly needs: readonly TNeed[];
|
|
1137
|
+
readonly permissions: typeof FACTORY_MERGE_FREEZE_PERMISSIONS;
|
|
1138
|
+
readonly steps: readonly WorkflowStep[];
|
|
1139
|
+
}
|
|
1140
|
+
/**
|
|
1141
|
+
* Build the merge-freeze writer job.
|
|
1142
|
+
*
|
|
1143
|
+
* An empty `needs` list is refused: a fold over no verification leaf is
|
|
1144
|
+
* always `success`, so such a job would write a green generation for a merge
|
|
1145
|
+
* target nothing verified — the exact failure the freeze exists to prevent.
|
|
1146
|
+
*/
|
|
1147
|
+
declare const factoryMergeFreezeJob: <TNeed>(options: FactoryMergeFreezeJobOptions<TNeed>) => FactoryMergeFreezeJob<TNeed>;
|
|
1148
|
+
//#endregion
|
|
933
1149
|
//#region src/pr-status-hud-workflow.d.ts
|
|
934
1150
|
declare const FACTORY_PR_STATUS_HUD_JOB_ID = "status-hud";
|
|
935
1151
|
declare const FACTORY_PR_STATUS_HUD_JOB_NAME = "Present PR status HUD";
|
|
@@ -946,9 +1162,9 @@ interface FactoryPrStatusHudWorkflowOptions {
|
|
|
946
1162
|
readonly createGithubAppToken: PinnedAction;
|
|
947
1163
|
}
|
|
948
1164
|
/**
|
|
949
|
-
* Least privilege for the job that runs the present step.
|
|
950
|
-
*
|
|
951
|
-
*
|
|
1165
|
+
* Least privilege for the job that runs the present step. The present step
|
|
1166
|
+
* is an inventory `list`, so the job needs exactly the inventory's read
|
|
1167
|
+
* permissions (#825, #859).
|
|
952
1168
|
*/
|
|
953
1169
|
declare const FACTORY_PR_STATUS_HUD_PERMISSIONS: Readonly<{
|
|
954
1170
|
readonly checks: "read";
|
|
@@ -1023,8 +1239,13 @@ interface FactoryProductionImpactWorkflow {
|
|
|
1023
1239
|
/** Outputs for a caller-owned decision job that subsequent jobs may consume. */
|
|
1024
1240
|
readonly decisionJobOutputs: Readonly<Record<string, string>>;
|
|
1025
1241
|
readonly decisionStep: WorkflowStep;
|
|
1026
|
-
/**
|
|
1027
|
-
|
|
1242
|
+
/**
|
|
1243
|
+
* A fail-open cross-job condition: only an explicit usable withdrawal skips
|
|
1244
|
+
* work. The decision job id is required.
|
|
1245
|
+
*/
|
|
1246
|
+
readonly demandedIf: (targetName: string, decisionJob: string) => string;
|
|
1247
|
+
/** The same fail-open condition for a step in the decision job. */
|
|
1248
|
+
readonly demandedIfAtStep: (targetName: string) => string;
|
|
1028
1249
|
readonly targetOutputs: Readonly<Record<string, string>>;
|
|
1029
1250
|
}
|
|
1030
1251
|
/**
|
|
@@ -1047,7 +1268,12 @@ interface FactoryPushIdentityEnvelope {
|
|
|
1047
1268
|
}
|
|
1048
1269
|
type FactoryPushIdentityDisposition = "refused" | "usable";
|
|
1049
1270
|
interface FactoryPushIdentityProducerOptions {
|
|
1050
|
-
/**
|
|
1271
|
+
/**
|
|
1272
|
+
* Explicit caller-owned upload-artifact pin from its workflow artifact.
|
|
1273
|
+
* Pass factory-ci's `UPLOAD_ARTIFACT` catalog export (or another
|
|
1274
|
+
* `actions/upload-artifact` pin); the caller wires the step, the catalog
|
|
1275
|
+
* only names the pin.
|
|
1276
|
+
*/
|
|
1051
1277
|
readonly uploadArtifact: PinnedAction;
|
|
1052
1278
|
/** Optional consumer trigger policy combined with the required push event. */
|
|
1053
1279
|
readonly if?: string;
|
|
@@ -1366,4 +1592,4 @@ declare const assertWorkflowShellParses: (yaml: string, options: {
|
|
|
1366
1592
|
readonly source: string;
|
|
1367
1593
|
}) => void;
|
|
1368
1594
|
//#endregion
|
|
1369
|
-
export { type BundleAlchemyEntryOptions, type CheckoutStepOptions, EXECUTE_ALCHEMY_ENTRY_MAX_BUFFER, type ExecuteAlchemyEntryOptions, type ExecuteAlchemyEntryResult, FACTORY_CANDIDATE_IMPACT_BASIS_OUTPUT, FACTORY_CANDIDATE_IMPACT_DECISION_OUTPUT, FACTORY_CANDIDATE_IMPACT_INERT_OUTPUT, FACTORY_CANDIDATE_IMPACT_STEP_ID, FACTORY_CANDIDATE_IMPACT_UNSUBSCRIBED_OUTPUT, FACTORY_CANDIDATE_PULL_REQUEST_TYPES, FACTORY_LIFECYCLE_CONTRACT_JOB_ID, FACTORY_LIFECYCLE_CONTRACT_JOB_NAME, FACTORY_PREVIEW_CLEANUP_AUDIT_JOB_ID, FACTORY_PREVIEW_CLEANUP_AUDIT_JOB_NAME, FACTORY_PRODUCTION_IMPACT_BASIS_OUTPUT, FACTORY_PRODUCTION_IMPACT_DECISION_OUTPUT, FACTORY_PRODUCTION_IMPACT_STEP_ID, FACTORY_PRODUCTION_IMPACT_UNSUBSCRIBED_OUTPUT, FACTORY_PROOF_GATE_APP_ID, FACTORY_PROOF_GATE_CHECK_NAME, FACTORY_PROOF_GATE_GUARD, FACTORY_PROOF_GATE_IF, FACTORY_PROOF_GATE_MODE_OUTPUT, FACTORY_PROOF_GATE_OUTPUT, FACTORY_PROOF_GATE_REASONS, FACTORY_PROOF_GATE_REASON_OUTPUT, FACTORY_PROOF_GATE_SHELL, FACTORY_PROOF_GATE_SOURCE_URL_OUTPUT, FACTORY_PROOF_GATE_STEP_ID, FACTORY_PROOF_GATE_STEP_NAME, FACTORY_PR_STATUS_HUD_APP_TOKEN_STEP_ID, FACTORY_PR_STATUS_HUD_CONCURRENCY, FACTORY_PR_STATUS_HUD_IF, FACTORY_PR_STATUS_HUD_JOB_ID, FACTORY_PR_STATUS_HUD_JOB_NAME, FACTORY_PR_STATUS_HUD_PERMISSIONS, FACTORY_PR_STATUS_HUD_PLAN_PATH, FACTORY_PUSH_IDENTITY_SCHEMA_VERSION, type FactoryCandidateImpactWorkflow, type FactoryCandidateImpactWorkflowOptions, type FactoryLifecycleContractLane, type FactoryLifecycleContractLaneOptions, type FactoryPrStatusHudWorkflow, type FactoryPrStatusHudWorkflowOptions, type FactoryPreviewCleanupAuditJob, type FactoryPreviewCleanupDestroyJob, type FactoryPreviewCleanupTopology, type FactoryPreviewCleanupTopologyOptions, type FactoryProductionImpactWorkflow, type FactoryProductionImpactWorkflowOptions, type FactoryProofGateOptions, type FactoryProofGateReason, type FactoryProofGateStep, type FactoryProofReusePresentationOptions, type FactoryProofReuseSummaryStep, type FactoryProofTimingStartStep, type FactoryPushIdentityConsumer, type FactoryPushIdentityConsumerOptions, type FactoryPushIdentityDisposition, type FactoryPushIdentityEnvelope, type FactoryPushIdentityProducer, type FactoryPushIdentityProducerOptions, type FactoryWorkflowArtifact, type FactoryWorkflowOptions, type FactoryWorkflowSetupOptions, GitHubApiError, type GithubAppCredentials, type GithubAppTokenOptions, type InstallStepOptions, type LocalPreviewStage, type LocalPreviewStageOptions, NODE_PNPM_ACTION_FAMILY_NODE24, type NodePnpmActionFamily, PREVIEW_PROOF_INVENTORY_CHECK_NAME, type ParseLocalPreviewStageExpected, type ParsedLocalPreviewStage, type PinnedAction, type PreviewProofCandidate, type PreviewProofCleanupOutcome, type PreviewProofCleanupStatus, type PreviewProofEnvelopeEvidence, type PreviewProofInventoryAccess, type PreviewProofInventoryCleanupInput, type PreviewProofInventoryListInput, type PreviewProofInventoryPersistInput, type PreviewProofInventoryStore, type PreviewProofInventoryTransport, type PreviewProofLifecycleEvent, type PreviewProofLifecycleState, type PreviewProofRegistration, type PreviewProofResolveQuery, PreviewProofTransportError, type ProofReuseCommand, type ProofReuseCoverageInput, type ProofReuseCoverageReport, type SetupNodeStepOptions, VITEST_PROFILE_SCHEMA_VERSION, VITEST_PROFILE_TOOL, type VitestJsonReport, type VitestProfile, type VitestProfileDependencies, type VitestProfileDurationSummary, type VitestProfileEnvironment, VitestProfileError, type VitestProfileOptions, type VitestProfileReadResult, type VitestProfileSample, type VitestProfileSampleExecution, type VitestTestStatus, type WorkflowShellParseFailure, type WorkflowStep, assertProofReuseCoverage, assertWorkflowShellParses, bundleAlchemyEntry, captureVitestProfileEnvironment, executeAlchemyEntry, factoryCandidateImpactWorkflow, factoryCandidateOrPushCondition, factoryLifecycleContractLane, factoryPrStatusHudWorkflow, factoryPreviewCleanupTopology, factoryProductionImpactWorkflow, factoryProofGateScript, factoryProofGateStep, factoryProofReuseSummaryStep, factoryProofTimingStartStep, factoryPushIdentityConsumer, factoryPushIdentityProducer, factoryWorkflow, githubAppJwt, isLocalPreviewStage, localPreviewStage, mintInstallationToken, normalizeVitestProfileSample, parseLocalPreviewStage, previewCleanupDestroyJobId, previewProofInventory, previewProofLifecycle, productionImpactTargetOutput, proofReuseCoverage, proofReuseRequiredCommands, readVitestProfileDocument, resolveProofReuseCommands, runVitestProfile, workflowRunBlocks, workflowShellParseFailures, writeVitestProfile };
|
|
1595
|
+
export { type BundleAlchemyEntryOptions, type CheckoutStepOptions, EXECUTE_ALCHEMY_ENTRY_MAX_BUFFER, type ExecuteAlchemyEntryOptions, type ExecuteAlchemyEntryResult, FACTORY_CANDIDATE_IMPACT_BASIS_OUTPUT, FACTORY_CANDIDATE_IMPACT_DECISION_OUTPUT, FACTORY_CANDIDATE_IMPACT_INERT_OUTPUT, FACTORY_CANDIDATE_IMPACT_STEP_ID, FACTORY_CANDIDATE_IMPACT_UNSUBSCRIBED_OUTPUT, FACTORY_CANDIDATE_PULL_REQUEST_TYPES, FACTORY_LIFECYCLE_CONTRACT_JOB_ID, FACTORY_LIFECYCLE_CONTRACT_JOB_NAME, FACTORY_MERGE_FREEZE_APP_TOKEN_STEP_ID, FACTORY_MERGE_FREEZE_CHECK_NAME, FACTORY_MERGE_FREEZE_IF, FACTORY_MERGE_FREEZE_JOB_ID, FACTORY_MERGE_FREEZE_JOB_NAME, FACTORY_MERGE_FREEZE_PERMISSIONS, FACTORY_MERGE_FREEZE_VERIFY_RESULT_EXPRESSION, FACTORY_MERGE_TARGET_REF_CONDITION, FACTORY_PREVIEW_CLEANUP_AUDIT_JOB_ID, FACTORY_PREVIEW_CLEANUP_AUDIT_JOB_NAME, FACTORY_PRODUCTION_IMPACT_BASIS_OUTPUT, FACTORY_PRODUCTION_IMPACT_DECISION_OUTPUT, FACTORY_PRODUCTION_IMPACT_STEP_ID, FACTORY_PRODUCTION_IMPACT_UNSUBSCRIBED_OUTPUT, FACTORY_PROOF_GATE_APP_ID, FACTORY_PROOF_GATE_CHECK_NAME, FACTORY_PROOF_GATE_GUARD, FACTORY_PROOF_GATE_IF, FACTORY_PROOF_GATE_MODE_OUTPUT, FACTORY_PROOF_GATE_OUTPUT, FACTORY_PROOF_GATE_PULL_REQUEST_IF, FACTORY_PROOF_GATE_REASONS, FACTORY_PROOF_GATE_REASON_OUTPUT, FACTORY_PROOF_GATE_SHELL, FACTORY_PROOF_GATE_SOURCE_URL_OUTPUT, FACTORY_PROOF_GATE_STEP_ID, FACTORY_PROOF_GATE_STEP_NAME, FACTORY_PR_STATUS_HUD_APP_TOKEN_STEP_ID, FACTORY_PR_STATUS_HUD_CONCURRENCY, FACTORY_PR_STATUS_HUD_IF, FACTORY_PR_STATUS_HUD_JOB_ID, FACTORY_PR_STATUS_HUD_JOB_NAME, FACTORY_PR_STATUS_HUD_PERMISSIONS, FACTORY_PR_STATUS_HUD_PLAN_PATH, FACTORY_PUSH_IDENTITY_SCHEMA_VERSION, type FactoryCandidateImpactWorkflow, type FactoryCandidateImpactWorkflowOptions, type FactoryLifecycleContractLane, type FactoryLifecycleContractLaneOptions, type FactoryMergeFreezeJob, type FactoryMergeFreezeJobOptions, type FactoryPrStatusHudWorkflow, type FactoryPrStatusHudWorkflowOptions, type FactoryPreviewCleanupAuditJob, type FactoryPreviewCleanupDestroyJob, type FactoryPreviewCleanupTopology, type FactoryPreviewCleanupTopologyOptions, type FactoryProductionImpactWorkflow, type FactoryProductionImpactWorkflowOptions, type FactoryProofGateOptions, type FactoryProofGateReason, type FactoryProofGateReuse, type FactoryProofGateStep, type FactoryProofReusePresentationOptions, type FactoryProofReuseSummaryStep, type FactoryProofTimingStartStep, type FactoryPushIdentityConsumer, type FactoryPushIdentityConsumerOptions, type FactoryPushIdentityDisposition, type FactoryPushIdentityEnvelope, type FactoryPushIdentityProducer, type FactoryPushIdentityProducerOptions, type FactoryWorkflowArtifact, type FactoryWorkflowOptions, type FactoryWorkflowSetupOptions, GitHubApiError, type GithubAppCredentials, type GithubAppTokenOptions, type InstallStepOptions, type LocalPreviewStage, type LocalPreviewStageOptions, NODE_PNPM_ACTION_FAMILY_NODE24, type NodePnpmActionFamily, PREVIEW_PROOF_INVENTORY_CHECK_NAME, PREVIEW_PROOF_INVENTORY_LIST_PERMISSIONS, type ParseLocalPreviewStageExpected, type ParsedLocalPreviewStage, type PinnedAction, type PreviewProofCandidate, type PreviewProofCleanupOutcome, type PreviewProofCleanupStatus, type PreviewProofEnvelopeEvidence, type PreviewProofInventoryAccess, type PreviewProofInventoryCleanupInput, type PreviewProofInventoryListInput, type PreviewProofInventoryPersistInput, type PreviewProofInventoryStore, type PreviewProofInventoryTransport, type PreviewProofLifecycleEvent, type PreviewProofLifecycleState, type PreviewProofRegistration, type PreviewProofResolveQuery, PreviewProofTransportError, type ProofReuseCommand, type ProofReuseCoverageInput, type ProofReuseCoverageReport, type SetupNodeStepOptions, UPLOAD_ARTIFACT, VITEST_PROFILE_SCHEMA_VERSION, VITEST_PROFILE_TOOL, type VitestJsonReport, type VitestProfile, type VitestProfileDependencies, type VitestProfileDurationSummary, type VitestProfileEnvironment, VitestProfileError, type VitestProfileOptions, type VitestProfileReadResult, type VitestProfileSample, type VitestProfileSampleExecution, type VitestTestStatus, type WorkflowShellParseFailure, type WorkflowStep, assertProofReuseCoverage, assertWorkflowShellParses, bundleAlchemyEntry, captureVitestProfileEnvironment, executeAlchemyEntry, factoryCandidateImpactWorkflow, factoryCandidateOrPushCondition, factoryLifecycleContractLane, factoryMergeFreezeJob, factoryMergeFreezeScript, factoryPrStatusHudWorkflow, factoryPreviewCleanupTopology, factoryProductionImpactWorkflow, factoryProofGateScript, factoryProofGateStep, factoryProofReuseSummaryStep, factoryProofTimingStartStep, factoryPushIdentityConsumer, factoryPushIdentityProducer, factoryWorkflow, githubAppJwt, isLocalPreviewStage, localPreviewStage, mintInstallationToken, normalizeVitestProfileSample, parseLocalPreviewStage, previewCleanupDestroyJobId, previewProofInventory, previewProofLifecycle, productionImpactTargetOutput, proofReuseCoverage, proofReuseRequiredCommands, readVitestProfileDocument, resolveProofReuseCommands, runVitestProfile, workflowRunBlocks, workflowShellParseFailures, writeVitestProfile };
|