@codyswann/lisa 4.42.7 → 4.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/doctor-readiness-delivery.d.ts.map +1 -1
- package/dist/cli/doctor-readiness-delivery.js +13 -6
- package/dist/cli/doctor-readiness-delivery.js.map +1 -1
- package/dist/cli/doctor-readiness-deploy-outcome.d.ts +9 -0
- package/dist/cli/doctor-readiness-deploy-outcome.d.ts.map +1 -0
- package/dist/cli/doctor-readiness-deploy-outcome.js +87 -0
- package/dist/cli/doctor-readiness-deploy-outcome.js.map +1 -0
- package/dist/cli/doctor-readiness-workflows.d.ts +8 -0
- package/dist/cli/doctor-readiness-workflows.d.ts.map +1 -1
- package/dist/cli/doctor-readiness-workflows.js +1 -0
- package/dist/cli/doctor-readiness-workflows.js.map +1 -1
- package/dist/core/deploy-release-dependence.d.ts +72 -0
- package/dist/core/deploy-release-dependence.d.ts.map +1 -0
- package/dist/core/deploy-release-dependence.js +236 -0
- package/dist/core/deploy-release-dependence.js.map +1 -0
- package/dist/core/github-actions-condition.d.ts +78 -0
- package/dist/core/github-actions-condition.d.ts.map +1 -0
- package/dist/core/github-actions-condition.js +307 -0
- package/dist/core/github-actions-condition.js.map +1 -0
- package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +15 -1
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/migrations/deploy-outcome-guard-edit.d.ts +11 -0
- package/dist/migrations/deploy-outcome-guard-edit.d.ts.map +1 -0
- package/dist/migrations/deploy-outcome-guard-edit.js +184 -0
- package/dist/migrations/deploy-outcome-guard-edit.js.map +1 -0
- package/dist/migrations/deploy-outcome-guard-yaml.d.ts +91 -0
- package/dist/migrations/deploy-outcome-guard-yaml.d.ts.map +1 -0
- package/dist/migrations/deploy-outcome-guard-yaml.js +180 -0
- package/dist/migrations/deploy-outcome-guard-yaml.js.map +1 -0
- package/dist/migrations/ensure-deploy-outcome-guard.d.ts +41 -0
- package/dist/migrations/ensure-deploy-outcome-guard.d.ts.map +1 -0
- package/dist/migrations/ensure-deploy-outcome-guard.js +238 -0
- package/dist/migrations/ensure-deploy-outcome-guard.js.map +1 -0
- package/dist/migrations/index.d.ts +1 -0
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +3 -0
- package/dist/migrations/index.js.map +1 -1
- package/package.json +4 -4
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/scripts/check-test-case-executed.mjs +184 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A deliberately small evaluator for the subset of GitHub Actions expression
|
|
3
|
+
* syntax that Lisa's deploy workflows use in a job-level `if:`, plus the rule
|
|
4
|
+
* that turns the result into "this job RAN" or "this job was SKIPPED".
|
|
5
|
+
*
|
|
6
|
+
* It exists because the defect in #3467 is invisible to anything that only
|
|
7
|
+
* reads the YAML for the presence or absence of a substring. What went wrong
|
|
8
|
+
* was a job OUTCOME — a deploy that was skipped rather than failed — and an
|
|
9
|
+
* outcome is what has to be established. Lisa never runs a host's deploy
|
|
10
|
+
* workflow itself, so no observation of CI can stand in for that; the
|
|
11
|
+
* expression has to be evaluated against a scenario.
|
|
12
|
+
*
|
|
13
|
+
* ## Why this is production code and not a test helper
|
|
14
|
+
*
|
|
15
|
+
* It began as one, under `tests/integration/`. It moved here when #3740 needed
|
|
16
|
+
* the same question answered in a host repository — *would this job skip
|
|
17
|
+
* because the release failed?* — by `lisa doctor` and by the migration that
|
|
18
|
+
* repairs an already-seeded `deploy.yml`. Reimplementing GitHub's implicit
|
|
19
|
+
* `success()` rule a second time in `src/` would have put two subtly different
|
|
20
|
+
* copies of one semantics in the tree, which is the drift this repository
|
|
21
|
+
* repeatedly pays for. There is one implementation, and the test that made it
|
|
22
|
+
* imports it from here.
|
|
23
|
+
*
|
|
24
|
+
* The evaluator THROWS on anything outside the supported subset rather than
|
|
25
|
+
* guessing. An expression it cannot parse must never quietly evaluate to a
|
|
26
|
+
* plausible-looking boolean: a caller that cannot read a condition must say so,
|
|
27
|
+
* because reporting a confident verdict about an expression nobody understood
|
|
28
|
+
* is the failure mode this whole family of checks exists to catch.
|
|
29
|
+
*
|
|
30
|
+
* Supported: `&&`, `||`, `!`, `==`, `!=`, parentheses, single-quoted strings,
|
|
31
|
+
* `true`/`false`, the status functions `always()` / `cancelled()` / `success()`
|
|
32
|
+
* / `failure()`, the string functions `startsWith()` / `contains()`, and
|
|
33
|
+
* context paths under `needs.`, `github.` and `inputs.`.
|
|
34
|
+
* @module core/github-actions-condition
|
|
35
|
+
*/
|
|
36
|
+
/** The four conclusions a `needs` job can report to a dependent job. */
|
|
37
|
+
export type JobResult = "success" | "failure" | "cancelled" | "skipped";
|
|
38
|
+
/** One upstream job as a dependent job sees it. */
|
|
39
|
+
export interface NeedsEntry {
|
|
40
|
+
readonly result: JobResult;
|
|
41
|
+
readonly outputs?: Readonly<Record<string, string>>;
|
|
42
|
+
}
|
|
43
|
+
/** The run state a job-level `if:` is evaluated against. */
|
|
44
|
+
export interface RunScenario {
|
|
45
|
+
readonly needs: Readonly<Record<string, NeedsEntry>>;
|
|
46
|
+
/** Flattened `github.*` paths, e.g. `github.event.head_commit.message`. */
|
|
47
|
+
readonly github: Readonly<Record<string, string>>;
|
|
48
|
+
/** Flattened `inputs.*` values. */
|
|
49
|
+
readonly inputs?: Readonly<Record<string, string>>;
|
|
50
|
+
/** Whether an operator cancelled the run. */
|
|
51
|
+
readonly cancelled: boolean;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Split an expression into tokens.
|
|
55
|
+
* @param source - Raw `if:` text, with any `${{ }}` wrapper already stripped
|
|
56
|
+
* @returns The token list
|
|
57
|
+
*/
|
|
58
|
+
export declare function tokenize(source: string): readonly string[];
|
|
59
|
+
/**
|
|
60
|
+
* Evaluate a job-level `if:` under one scenario.
|
|
61
|
+
* @param condition - The raw `if:` text
|
|
62
|
+
* @param scenario - The run state
|
|
63
|
+
* @returns Whether the condition holds
|
|
64
|
+
*/
|
|
65
|
+
export declare function evaluateCondition(condition: string, scenario: RunScenario): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Whether a job with this `if:` runs, applying GitHub's rule that an implicit
|
|
68
|
+
* `success()` is ANDed on unless the condition names a status function.
|
|
69
|
+
*
|
|
70
|
+
* That implicit AND is the whole mechanism behind the rails half of #3467: the
|
|
71
|
+
* condition there said nothing about the release at all, and still skipped when
|
|
72
|
+
* the release failed.
|
|
73
|
+
* @param condition - The raw `if:` text, or `""` when the job has none
|
|
74
|
+
* @param scenario - The run state
|
|
75
|
+
* @returns True when the job runs, false when GitHub skips it
|
|
76
|
+
*/
|
|
77
|
+
export declare function jobRuns(condition: string, scenario: RunScenario): boolean;
|
|
78
|
+
//# sourceMappingURL=github-actions-condition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-actions-condition.d.ts","sourceRoot":"","sources":["../../src/core/github-actions-condition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,wEAAwE;AACxE,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AAExE,mDAAmD;AACnD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACrD;AAED,4DAA4D;AAC5D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IACrD,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,mCAAmC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,6CAA6C;IAC7C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AA6CD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAO1D;AAyOD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW,GACpB,OAAO,CAYT;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAYzE"}
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A deliberately small evaluator for the subset of GitHub Actions expression
|
|
3
|
+
* syntax that Lisa's deploy workflows use in a job-level `if:`, plus the rule
|
|
4
|
+
* that turns the result into "this job RAN" or "this job was SKIPPED".
|
|
5
|
+
*
|
|
6
|
+
* It exists because the defect in #3467 is invisible to anything that only
|
|
7
|
+
* reads the YAML for the presence or absence of a substring. What went wrong
|
|
8
|
+
* was a job OUTCOME — a deploy that was skipped rather than failed — and an
|
|
9
|
+
* outcome is what has to be established. Lisa never runs a host's deploy
|
|
10
|
+
* workflow itself, so no observation of CI can stand in for that; the
|
|
11
|
+
* expression has to be evaluated against a scenario.
|
|
12
|
+
*
|
|
13
|
+
* ## Why this is production code and not a test helper
|
|
14
|
+
*
|
|
15
|
+
* It began as one, under `tests/integration/`. It moved here when #3740 needed
|
|
16
|
+
* the same question answered in a host repository — *would this job skip
|
|
17
|
+
* because the release failed?* — by `lisa doctor` and by the migration that
|
|
18
|
+
* repairs an already-seeded `deploy.yml`. Reimplementing GitHub's implicit
|
|
19
|
+
* `success()` rule a second time in `src/` would have put two subtly different
|
|
20
|
+
* copies of one semantics in the tree, which is the drift this repository
|
|
21
|
+
* repeatedly pays for. There is one implementation, and the test that made it
|
|
22
|
+
* imports it from here.
|
|
23
|
+
*
|
|
24
|
+
* The evaluator THROWS on anything outside the supported subset rather than
|
|
25
|
+
* guessing. An expression it cannot parse must never quietly evaluate to a
|
|
26
|
+
* plausible-looking boolean: a caller that cannot read a condition must say so,
|
|
27
|
+
* because reporting a confident verdict about an expression nobody understood
|
|
28
|
+
* is the failure mode this whole family of checks exists to catch.
|
|
29
|
+
*
|
|
30
|
+
* Supported: `&&`, `||`, `!`, `==`, `!=`, parentheses, single-quoted strings,
|
|
31
|
+
* `true`/`false`, the status functions `always()` / `cancelled()` / `success()`
|
|
32
|
+
* / `failure()`, the string functions `startsWith()` / `contains()`, and
|
|
33
|
+
* context paths under `needs.`, `github.` and `inputs.`.
|
|
34
|
+
* @module core/github-actions-condition
|
|
35
|
+
*/
|
|
36
|
+
/** The status functions whose presence removes GitHub's implicit `success()`. */
|
|
37
|
+
const STATUS_FUNCTIONS = ["always", "cancelled", "success", "failure"];
|
|
38
|
+
/** The two-character operators, matched before the single-character ones. */
|
|
39
|
+
const PAIR_OPERATORS = ["&&", "||", "==", "!="];
|
|
40
|
+
/**
|
|
41
|
+
* Read the single token at the head of the text.
|
|
42
|
+
* @param text - Expression text with leading whitespace already removed
|
|
43
|
+
* @returns The token, quotes included for a string literal
|
|
44
|
+
*/
|
|
45
|
+
function headToken(text) {
|
|
46
|
+
if (text.startsWith("'")) {
|
|
47
|
+
const close = text.indexOf("'", 1);
|
|
48
|
+
if (close < 0) {
|
|
49
|
+
throw new Error(`unterminated string in expression: ${text}`);
|
|
50
|
+
}
|
|
51
|
+
return text.slice(0, close + 1);
|
|
52
|
+
}
|
|
53
|
+
if (PAIR_OPERATORS.includes(text.slice(0, 2))) {
|
|
54
|
+
return text.slice(0, 2);
|
|
55
|
+
}
|
|
56
|
+
if ("()!,".includes(text.slice(0, 1))) {
|
|
57
|
+
return text.slice(0, 1);
|
|
58
|
+
}
|
|
59
|
+
const word = /^[A-Za-z0-9_.-]+/.exec(text)?.[0];
|
|
60
|
+
if (!word) {
|
|
61
|
+
throw new Error(`unsupported character '${text.slice(0, 1)}' in expression`);
|
|
62
|
+
}
|
|
63
|
+
return word;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Split an expression into tokens.
|
|
67
|
+
* @param source - Raw `if:` text, with any `${{ }}` wrapper already stripped
|
|
68
|
+
* @returns The token list
|
|
69
|
+
*/
|
|
70
|
+
export function tokenize(source) {
|
|
71
|
+
const text = source.trimStart();
|
|
72
|
+
if (text === "") {
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
const token = headToken(text);
|
|
76
|
+
return [token, ...tokenize(text.slice(token.length))];
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* GitHub's string-to-boolean cast: only the empty string is falsy.
|
|
80
|
+
* @param value - An evaluated operand
|
|
81
|
+
* @returns Its truthiness
|
|
82
|
+
*/
|
|
83
|
+
function truthy(value) {
|
|
84
|
+
return typeof value === "boolean" ? value : value !== "";
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* GitHub compares strings case-insensitively; every operand here is a string or
|
|
88
|
+
* a boolean, so a normalized string comparison is the whole rule.
|
|
89
|
+
* @param left - Left operand
|
|
90
|
+
* @param right - Right operand
|
|
91
|
+
* @returns Whether the two are equal
|
|
92
|
+
*/
|
|
93
|
+
function equal(left, right) {
|
|
94
|
+
return String(left).toLowerCase() === String(right).toLowerCase();
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Resolve one `needs.*` path.
|
|
98
|
+
* @param segments - The dot-split path
|
|
99
|
+
* @param scenario - The run state
|
|
100
|
+
* @returns The value
|
|
101
|
+
*/
|
|
102
|
+
function resolveNeeds(segments, scenario) {
|
|
103
|
+
const entry = scenario.needs[segments[1] ?? ""];
|
|
104
|
+
if (!entry) {
|
|
105
|
+
throw new Error(`expression reads ${segments.join(".")}, absent from needs`);
|
|
106
|
+
}
|
|
107
|
+
if (segments[2] === "result") {
|
|
108
|
+
return entry.result;
|
|
109
|
+
}
|
|
110
|
+
if (segments[2] !== "outputs") {
|
|
111
|
+
throw new Error(`unsupported needs path: ${segments.join(".")}`);
|
|
112
|
+
}
|
|
113
|
+
// A job that did not succeed publishes no outputs at all. Modelling that is
|
|
114
|
+
// load-bearing: `needs.x.outputs.y == 'true'` is the shape that silently
|
|
115
|
+
// turns an upstream failure into a skipped dependent.
|
|
116
|
+
return entry.result === "success"
|
|
117
|
+
? (entry.outputs?.[segments[3] ?? ""] ?? "")
|
|
118
|
+
: "";
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Resolve one dotted context path against the scenario.
|
|
122
|
+
* @param path - A path such as `needs.release.result`
|
|
123
|
+
* @param scenario - The run state
|
|
124
|
+
* @returns The value, or `""` for a path that resolves to nothing
|
|
125
|
+
*/
|
|
126
|
+
function resolvePath(path, scenario) {
|
|
127
|
+
if (path === "true" || path === "false") {
|
|
128
|
+
return path === "true";
|
|
129
|
+
}
|
|
130
|
+
const segments = path.split(".");
|
|
131
|
+
if (segments[0] === "needs") {
|
|
132
|
+
return resolveNeeds(segments, scenario);
|
|
133
|
+
}
|
|
134
|
+
if (segments[0] === "github") {
|
|
135
|
+
return scenario.github[path] ?? "";
|
|
136
|
+
}
|
|
137
|
+
if (segments[0] === "inputs") {
|
|
138
|
+
return scenario.inputs?.[segments[1] ?? ""] ?? "";
|
|
139
|
+
}
|
|
140
|
+
throw new Error(`unsupported context path: ${path}`);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Evaluate a call to one of the supported functions.
|
|
144
|
+
* @param name - Function name
|
|
145
|
+
* @param args - Already-evaluated arguments
|
|
146
|
+
* @param scenario - The run state
|
|
147
|
+
* @returns The call's value
|
|
148
|
+
*/
|
|
149
|
+
function callFunction(name, args, scenario) {
|
|
150
|
+
const results = Object.values(scenario.needs).map(entry => entry.result);
|
|
151
|
+
const first = String(args[0] ?? "").toLowerCase();
|
|
152
|
+
const second = String(args[1] ?? "").toLowerCase();
|
|
153
|
+
switch (name) {
|
|
154
|
+
case "always":
|
|
155
|
+
return true;
|
|
156
|
+
case "cancelled":
|
|
157
|
+
return scenario.cancelled;
|
|
158
|
+
case "success":
|
|
159
|
+
return !scenario.cancelled && results.every(r => r === "success");
|
|
160
|
+
case "failure":
|
|
161
|
+
return results.includes("failure");
|
|
162
|
+
case "startsWith":
|
|
163
|
+
return first.startsWith(second);
|
|
164
|
+
case "contains":
|
|
165
|
+
return first.includes(second);
|
|
166
|
+
default:
|
|
167
|
+
throw new Error(`unsupported function: ${name}()`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Collect and evaluate a function call's arguments.
|
|
172
|
+
* @param tokens - The token list
|
|
173
|
+
* @param index - Position just after the opening parenthesis
|
|
174
|
+
* @param scenario - The run state
|
|
175
|
+
* @param collected - Arguments parsed so far
|
|
176
|
+
* @returns The arguments and the position just after the closing parenthesis
|
|
177
|
+
*/
|
|
178
|
+
function callArguments(tokens, index, scenario, collected) {
|
|
179
|
+
if (tokens[index] === ")") {
|
|
180
|
+
return { args: collected, index: index + 1 };
|
|
181
|
+
}
|
|
182
|
+
const argument = expression(tokens, index, scenario);
|
|
183
|
+
const next = tokens[argument.index] === "," ? argument.index + 1 : argument.index;
|
|
184
|
+
return callArguments(tokens, next, scenario, [...collected, argument.value]);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Parse and evaluate a primary term: a negation, a parenthesized expression, a
|
|
188
|
+
* string literal, a function call, or a context path.
|
|
189
|
+
* @param tokens - The token list
|
|
190
|
+
* @param index - Position of the term's first token
|
|
191
|
+
* @param scenario - The run state
|
|
192
|
+
* @returns The term's value and the position after it
|
|
193
|
+
*/
|
|
194
|
+
function primary(tokens, index, scenario) {
|
|
195
|
+
const token = tokens[index];
|
|
196
|
+
if (token === undefined) {
|
|
197
|
+
throw new Error("expression ended early");
|
|
198
|
+
}
|
|
199
|
+
if (token === "!") {
|
|
200
|
+
const inner = primary(tokens, index + 1, scenario);
|
|
201
|
+
return { value: !truthy(inner.value), index: inner.index };
|
|
202
|
+
}
|
|
203
|
+
if (token === "(") {
|
|
204
|
+
const inner = expression(tokens, index + 1, scenario);
|
|
205
|
+
if (tokens[inner.index] !== ")") {
|
|
206
|
+
throw new Error("unbalanced parentheses in expression");
|
|
207
|
+
}
|
|
208
|
+
return { value: inner.value, index: inner.index + 1 };
|
|
209
|
+
}
|
|
210
|
+
if (token.startsWith("'")) {
|
|
211
|
+
return { value: token.slice(1, -1), index: index + 1 };
|
|
212
|
+
}
|
|
213
|
+
if (tokens[index + 1] === "(") {
|
|
214
|
+
const call = callArguments(tokens, index + 2, scenario, []);
|
|
215
|
+
return {
|
|
216
|
+
value: callFunction(token, call.args, scenario),
|
|
217
|
+
index: call.index,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
return { value: resolvePath(token, scenario), index: index + 1 };
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Parse and evaluate an equality comparison.
|
|
224
|
+
* @param tokens - The token list
|
|
225
|
+
* @param index - Position of the comparison's first token
|
|
226
|
+
* @param scenario - The run state
|
|
227
|
+
* @returns The comparison's value and the position after it
|
|
228
|
+
*/
|
|
229
|
+
function comparison(tokens, index, scenario) {
|
|
230
|
+
const left = primary(tokens, index, scenario);
|
|
231
|
+
const operator = tokens[left.index];
|
|
232
|
+
if (operator !== "==" && operator !== "!=") {
|
|
233
|
+
return left;
|
|
234
|
+
}
|
|
235
|
+
const right = primary(tokens, left.index + 1, scenario);
|
|
236
|
+
const same = equal(left.value, right.value);
|
|
237
|
+
return { value: operator === "==" ? same : !same, index: right.index };
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Fold the `&&` / `||` operators that follow an already-parsed operand.
|
|
241
|
+
* @param left - The operand parsed so far
|
|
242
|
+
* @param tokens - The token list
|
|
243
|
+
* @param scenario - The run state
|
|
244
|
+
* @returns The folded value and the position after it
|
|
245
|
+
*/
|
|
246
|
+
function logicalTail(left, tokens, scenario) {
|
|
247
|
+
const operator = tokens[left.index];
|
|
248
|
+
if (operator !== "&&" && operator !== "||") {
|
|
249
|
+
return left;
|
|
250
|
+
}
|
|
251
|
+
const right = comparison(tokens, left.index + 1, scenario);
|
|
252
|
+
const value = operator === "&&"
|
|
253
|
+
? truthy(left.value) && truthy(right.value)
|
|
254
|
+
: truthy(left.value) || truthy(right.value);
|
|
255
|
+
return logicalTail({ value, index: right.index }, tokens, scenario);
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Parse and evaluate a full expression.
|
|
259
|
+
* @param tokens - The token list
|
|
260
|
+
* @param index - Position of the expression's first token
|
|
261
|
+
* @param scenario - The run state
|
|
262
|
+
* @returns The expression's value and the position after it
|
|
263
|
+
*/
|
|
264
|
+
function expression(tokens, index, scenario) {
|
|
265
|
+
return logicalTail(comparison(tokens, index, scenario), tokens, scenario);
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Evaluate a job-level `if:` under one scenario.
|
|
269
|
+
* @param condition - The raw `if:` text
|
|
270
|
+
* @param scenario - The run state
|
|
271
|
+
* @returns Whether the condition holds
|
|
272
|
+
*/
|
|
273
|
+
export function evaluateCondition(condition, scenario) {
|
|
274
|
+
const stripped = condition
|
|
275
|
+
.trim()
|
|
276
|
+
.replace(/^\$\{\{/, "")
|
|
277
|
+
.replace(/\}\}$/, "")
|
|
278
|
+
.trim();
|
|
279
|
+
const tokens = tokenize(stripped);
|
|
280
|
+
const parsed = expression(tokens, 0, scenario);
|
|
281
|
+
if (parsed.index !== tokens.length) {
|
|
282
|
+
throw new Error(`unparsed tail in expression: ${condition}`);
|
|
283
|
+
}
|
|
284
|
+
return truthy(parsed.value);
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Whether a job with this `if:` runs, applying GitHub's rule that an implicit
|
|
288
|
+
* `success()` is ANDed on unless the condition names a status function.
|
|
289
|
+
*
|
|
290
|
+
* That implicit AND is the whole mechanism behind the rails half of #3467: the
|
|
291
|
+
* condition there said nothing about the release at all, and still skipped when
|
|
292
|
+
* the release failed.
|
|
293
|
+
* @param condition - The raw `if:` text, or `""` when the job has none
|
|
294
|
+
* @param scenario - The run state
|
|
295
|
+
* @returns True when the job runs, false when GitHub skips it
|
|
296
|
+
*/
|
|
297
|
+
export function jobRuns(condition, scenario) {
|
|
298
|
+
const results = Object.values(scenario.needs).map(entry => entry.result);
|
|
299
|
+
const dependenciesSucceeded = !scenario.cancelled && results.every(result => result === "success");
|
|
300
|
+
if (condition.trim() === "") {
|
|
301
|
+
return dependenciesSucceeded;
|
|
302
|
+
}
|
|
303
|
+
const namesStatusFunction = STATUS_FUNCTIONS.some(name => new RegExp(`\\b${name}\\s*\\(`).test(condition));
|
|
304
|
+
const holds = evaluateCondition(condition, scenario);
|
|
305
|
+
return namesStatusFunction ? holds : holds && dependenciesSucceeded;
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=github-actions-condition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-actions-condition.js","sourceRoot":"","sources":["../../src/core/github-actions-condition.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,9 +34,9 @@ export const NIGHTLY_E2E_GUARD_BEHAVIOR_CERTIFICATES = Object.freeze({
|
|
|
34
34
|
}),
|
|
35
35
|
dfd2fef680de5ef03e63075e8a61c62ca4d95cdfdff6201939b79c748d3397f6: Object.freeze({
|
|
36
36
|
contractVersion: "1.9.0",
|
|
37
|
-
packageVersions: Object.freeze(["4.
|
|
37
|
+
packageVersions: Object.freeze(["4.43.0"]),
|
|
38
38
|
provenances: Object.freeze([
|
|
39
|
-
"workspace package @codyswann/lisa@4.
|
|
39
|
+
"workspace package @codyswann/lisa@4.43.0 (typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs)",
|
|
40
40
|
]),
|
|
41
41
|
}),
|
|
42
42
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upstream-evidence-manifest.d.ts","sourceRoot":"","sources":["../../src/core/upstream-evidence-manifest.ts"],"names":[],"mappings":"AACA,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"upstream-evidence-manifest.d.ts","sourceRoot":"","sources":["../../src/core/upstream-evidence-manifest.ts"],"names":[],"mappings":"AACA,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAskFpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAo0QjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,CAAC"}
|
|
@@ -1148,6 +1148,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
1148
1148
|
"scripts/check-shell-guard-refusal-coverage.mjs": "d6b056c4311ea612e85d16ae565a57c5e10c822e87e21d689e12a6cc89dfda3f",
|
|
1149
1149
|
"scripts/check-state-classification.mjs": "26baaa85c0758fa41f1f66257f7d3a31ea4dd5cf17a9c0acaa3e89caaaf6265a",
|
|
1150
1150
|
"scripts/check-template-workflow-refs.mjs": "89176394a933d0a42c39ab1805a45e782a2f3e1893d707ac1afb439062397088",
|
|
1151
|
+
"scripts/check-test-case-executed.mjs": "99c4e0f4544f67c920d787fe6a7fb801ac37c591b6392791b4e3d1802bec5359",
|
|
1151
1152
|
"scripts/check-third-party-action-pins.mjs": "c085949d734edfef2807a95bc7c4814485e30f7bfad4d5054586aa264a5d42b4",
|
|
1152
1153
|
"scripts/check-typecheck-tests.mjs": "f09e5da1e70b20228c39f6133fc355bcbc8c3af0fb65e1afd100203d862b1b9e",
|
|
1153
1154
|
"scripts/check-ui-demo-data.mjs": "82a5ed89ae830482dbaab99e2f8eeededcde60a7dd6ac145f191b4ac8394c85b",
|
|
@@ -1421,6 +1422,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
1421
1422
|
".github/workflows/nightly-e2e-health.yml": true,
|
|
1422
1423
|
".github/workflows/nightly-e2e-report.yml": true,
|
|
1423
1424
|
".github/workflows/nightly-e2e-tracking.yml": true,
|
|
1425
|
+
".github/workflows/nightly-tmpdir-growth-benchmark.yml": true,
|
|
1424
1426
|
".github/workflows/playwright-e2e.yml": true,
|
|
1425
1427
|
".github/workflows/plugins-sync.yml": true,
|
|
1426
1428
|
".github/workflows/publish-to-npm.yml": true,
|
|
@@ -7350,6 +7352,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7350
7352
|
"scripts/check-shell-guard-refusal-coverage.mjs": true,
|
|
7351
7353
|
"scripts/check-state-classification.mjs": true,
|
|
7352
7354
|
"scripts/check-template-workflow-refs.mjs": true,
|
|
7355
|
+
"scripts/check-test-case-executed.mjs": true,
|
|
7353
7356
|
"scripts/check-third-party-action-pins.mjs": true,
|
|
7354
7357
|
"scripts/check-typecheck-tests.mjs": true,
|
|
7355
7358
|
"scripts/check-ui-demo-data.mjs": true,
|
|
@@ -7487,6 +7490,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7487
7490
|
"src/cli/doctor-readiness-context.ts": true,
|
|
7488
7491
|
"src/cli/doctor-readiness-credentials.ts": true,
|
|
7489
7492
|
"src/cli/doctor-readiness-delivery.ts": true,
|
|
7493
|
+
"src/cli/doctor-readiness-deploy-outcome.ts": true,
|
|
7490
7494
|
"src/cli/doctor-readiness-domain.ts": true,
|
|
7491
7495
|
"src/cli/doctor-readiness-guardrails.ts": true,
|
|
7492
7496
|
"src/cli/doctor-readiness-journey-freshness.ts": true,
|
|
@@ -7715,6 +7719,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7715
7719
|
"src/core/config.ts": true,
|
|
7716
7720
|
"src/core/configured-learnings-path.ts": true,
|
|
7717
7721
|
"src/core/deletion-basis.ts": true,
|
|
7722
|
+
"src/core/deploy-release-dependence.ts": true,
|
|
7718
7723
|
"src/core/downstream-names.ts": true,
|
|
7719
7724
|
"src/core/downstream-references.ts": true,
|
|
7720
7725
|
"src/core/enforcement-census-report.ts": true,
|
|
@@ -7724,6 +7729,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7724
7729
|
"src/core/gate-declaration-drift.ts": true,
|
|
7725
7730
|
"src/core/git-service.ts": true,
|
|
7726
7731
|
"src/core/gitattributes-merge-drivers.ts": true,
|
|
7732
|
+
"src/core/github-actions-condition.ts": true,
|
|
7727
7733
|
"src/core/guard-capabilities.ts": true,
|
|
7728
7734
|
"src/core/hook-copy-parity.ts": true,
|
|
7729
7735
|
"src/core/host-rules-pointer.ts": true,
|
|
@@ -7823,7 +7829,10 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7823
7829
|
"src/logging/index.ts": true,
|
|
7824
7830
|
"src/logging/logger.interface.ts": true,
|
|
7825
7831
|
"src/logging/silent-logger.ts": true,
|
|
7832
|
+
"src/migrations/deploy-outcome-guard-edit.ts": true,
|
|
7833
|
+
"src/migrations/deploy-outcome-guard-yaml.ts": true,
|
|
7826
7834
|
"src/migrations/ensure-audit-ignore-local-exclusions.ts": true,
|
|
7835
|
+
"src/migrations/ensure-deploy-outcome-guard.ts": true,
|
|
7827
7836
|
"src/migrations/ensure-jest-rn-mock-accessibility-manager.ts": true,
|
|
7828
7837
|
"src/migrations/ensure-learnings-gitattributes.ts": true,
|
|
7829
7838
|
"src/migrations/ensure-learnings-merge-driver.ts": true,
|
|
@@ -8139,7 +8148,6 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
8139
8148
|
"tests/integration/deploy-gate-blocks-release.test.ts": true,
|
|
8140
8149
|
"tests/integration/deploy-moment-evidence.test.ts": true,
|
|
8141
8150
|
"tests/integration/deploy-moment-runner.test.ts": true,
|
|
8142
|
-
"tests/integration/deploy-outcome-guard-helper.ts": true,
|
|
8143
8151
|
"tests/integration/deploy-outcome-guard.test.ts": true,
|
|
8144
8152
|
"tests/integration/doctor-nightly-e2e-guard-cli-helper.ts": true,
|
|
8145
8153
|
"tests/integration/doctor-nightly-e2e-guard-cli.test.ts": true,
|
|
@@ -8331,6 +8339,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
8331
8339
|
"tests/unit/cli/doctor-readiness-delivery-reusable-callers.test.ts": true,
|
|
8332
8340
|
"tests/unit/cli/doctor-readiness-delivery-triggers.test.ts": true,
|
|
8333
8341
|
"tests/unit/cli/doctor-readiness-delivery.test.ts": true,
|
|
8342
|
+
"tests/unit/cli/doctor-readiness-deploy-outcome.test.ts": true,
|
|
8334
8343
|
"tests/unit/cli/doctor-readiness-domain-ephemeral.test.ts": true,
|
|
8335
8344
|
"tests/unit/cli/doctor-readiness-domain-negatives.test.ts": true,
|
|
8336
8345
|
"tests/unit/cli/doctor-readiness-domain.test.ts": true,
|
|
@@ -8553,6 +8562,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
8553
8562
|
"tests/unit/config/test-run-child-process-analyzer.test.ts": true,
|
|
8554
8563
|
"tests/unit/config/test-run-supervision-wiring.test.ts": true,
|
|
8555
8564
|
"tests/unit/config/test-scratch-guard.test.ts": true,
|
|
8565
|
+
"tests/unit/config/tmpdir-growth-benchmark-scheduled.test.ts": true,
|
|
8556
8566
|
"tests/unit/config/tsconfig-no-unused-flags.test.ts": true,
|
|
8557
8567
|
"tests/unit/config/tsconfig-template-references.test.ts": true,
|
|
8558
8568
|
"tests/unit/config/vitest-base.test.ts": true,
|
|
@@ -8578,6 +8588,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
8578
8588
|
"tests/unit/core/apply-mode.test.ts": true,
|
|
8579
8589
|
"tests/unit/core/bootstrap-environment.test.ts": true,
|
|
8580
8590
|
"tests/unit/core/deletion-basis.test.ts": true,
|
|
8591
|
+
"tests/unit/core/deploy-release-dependence.test.ts": true,
|
|
8581
8592
|
"tests/unit/core/enforcement-census-roster.test.ts": true,
|
|
8582
8593
|
"tests/unit/core/enforcement-census.test.ts": true,
|
|
8583
8594
|
"tests/unit/core/fs-extra-namespace-callsites.test.ts": true,
|
|
@@ -8794,6 +8805,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
8794
8805
|
"tests/unit/hooks/worktree-create.test.ts": true,
|
|
8795
8806
|
"tests/unit/migrations/ensure-audit-ignore-local-exclusions-esbuild.test.ts": true,
|
|
8796
8807
|
"tests/unit/migrations/ensure-audit-ignore-local-exclusions.test.ts": true,
|
|
8808
|
+
"tests/unit/migrations/ensure-deploy-outcome-guard.test.ts": true,
|
|
8797
8809
|
"tests/unit/migrations/ensure-jest-rn-mock-accessibility-manager.test.ts": true,
|
|
8798
8810
|
"tests/unit/migrations/ensure-learnings-gitattributes.test.ts": true,
|
|
8799
8811
|
"tests/unit/migrations/ensure-learnings-merge-driver.test.ts": true,
|
|
@@ -8885,6 +8897,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
8885
8897
|
"tests/unit/scripts/check-self-dependency-pin.test.ts": true,
|
|
8886
8898
|
"tests/unit/scripts/check-shell-guard-refusal-coverage.test.ts": true,
|
|
8887
8899
|
"tests/unit/scripts/check-template-workflow-refs.test.ts": true,
|
|
8900
|
+
"tests/unit/scripts/check-test-case-executed.test.ts": true,
|
|
8888
8901
|
"tests/unit/scripts/check-third-party-action-pins.test.ts": true,
|
|
8889
8902
|
"tests/unit/scripts/check-ui-demo-data.test.ts": true,
|
|
8890
8903
|
"tests/unit/scripts/check-whole-output-guards.test.ts": true,
|
|
@@ -9587,6 +9600,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
9587
9600
|
"wiki/decisions/2026-08-12-in-session-ticket-ready-role.md": true,
|
|
9588
9601
|
"wiki/decisions/2026-08-12-ratchet-policy.md": true,
|
|
9589
9602
|
"wiki/decisions/2026-08-19-guard-mutation-gate.md": true,
|
|
9603
|
+
"wiki/decisions/2026-09-04-state-change-without-inverse.md": true,
|
|
9590
9604
|
"wiki/documentation/assets/lisa-architecture.svg": true,
|
|
9591
9605
|
"wiki/documentation/claude/overinstructions.md": true,
|
|
9592
9606
|
"wiki/documentation/claude/review.md": true,
|