@codyswann/lisa 3.47.9 → 3.48.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-render.d.ts +22 -0
- package/dist/cli/doctor-render.d.ts.map +1 -0
- package/dist/cli/doctor-render.js +27 -0
- package/dist/cli/doctor-render.js.map +1 -0
- package/dist/cli/doctor.d.ts +15 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +2 -9
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/gate-report-cells.d.ts +101 -0
- package/dist/cli/gate-report-cells.d.ts.map +1 -0
- package/dist/cli/gate-report-cells.js +269 -0
- package/dist/cli/gate-report-cells.js.map +1 -0
- package/dist/cli/gate-report-config.d.ts +28 -0
- package/dist/cli/gate-report-config.d.ts.map +1 -0
- package/dist/cli/gate-report-config.js +33 -0
- package/dist/cli/gate-report-config.js.map +1 -0
- package/dist/cli/gate-report-executors.d.ts +62 -0
- package/dist/cli/gate-report-executors.d.ts.map +1 -0
- package/dist/cli/gate-report-executors.js +218 -0
- package/dist/cli/gate-report-executors.js.map +1 -0
- package/dist/cli/gate-report-preview.d.ts +27 -0
- package/dist/cli/gate-report-preview.d.ts.map +1 -0
- package/dist/cli/gate-report-preview.js +286 -0
- package/dist/cli/gate-report-preview.js.map +1 -0
- package/dist/cli/gate-report-registry.d.ts +68 -0
- package/dist/cli/gate-report-registry.d.ts.map +1 -0
- package/dist/cli/gate-report-registry.js +52 -0
- package/dist/cli/gate-report-registry.js.map +1 -0
- package/dist/cli/gate-report-ruleset.d.ts +60 -0
- package/dist/cli/gate-report-ruleset.d.ts.map +1 -0
- package/dist/cli/gate-report-ruleset.js +132 -0
- package/dist/cli/gate-report-ruleset.js.map +1 -0
- package/dist/cli/gate-report-skip-jobs.d.ts +34 -0
- package/dist/cli/gate-report-skip-jobs.d.ts.map +1 -0
- package/dist/cli/gate-report-skip-jobs.js +42 -0
- package/dist/cli/gate-report-skip-jobs.js.map +1 -0
- package/dist/cli/gate-report-summary.d.ts +18 -0
- package/dist/cli/gate-report-summary.d.ts.map +1 -0
- package/dist/cli/gate-report-summary.js +80 -0
- package/dist/cli/gate-report-summary.js.map +1 -0
- package/dist/cli/gate-report-types.d.ts +206 -0
- package/dist/cli/gate-report-types.d.ts.map +1 -0
- package/dist/cli/gate-report-types.js +19 -0
- package/dist/cli/gate-report-types.js.map +1 -0
- package/dist/cli/gate-report.d.ts +35 -0
- package/dist/cli/gate-report.d.ts.map +1 -0
- package/dist/cli/gate-report.js +317 -0
- package/dist/cli/gate-report.js.map +1 -0
- package/dist/cli/ui-github-repo-gh.d.ts +14 -0
- package/dist/cli/ui-github-repo-gh.d.ts.map +1 -1
- package/dist/cli/ui-github-repo-gh.js +6 -1
- package/dist/cli/ui-github-repo-gh.js.map +1 -1
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +20 -1
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/package.json +1 -1
- 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/typescript/github-rulesets/quality-checks.json +8 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The shape of the deterministic gate report.
|
|
3
|
+
*
|
|
4
|
+
* Every fact in this payload carries one of three states, never two.
|
|
5
|
+
* `verified` means this run checked it and this is the answer — including when
|
|
6
|
+
* the answer is "no". `unknown` means the fact exists but this run could not
|
|
7
|
+
* reach it. `not-applicable` means there is no such fact here at all.
|
|
8
|
+
*
|
|
9
|
+
* The distinction is the whole point of the report rather than a nicety. This
|
|
10
|
+
* repository has catalogued controls that reported success while proving
|
|
11
|
+
* nothing; a report that folded "could not check" into "pass" would be that
|
|
12
|
+
* defect sited at the one screen an operator would trust. So `unknown` is
|
|
13
|
+
* structurally distinct — not a boolean, not an absent key, not a default — and
|
|
14
|
+
* every count states its unknown band explicitly.
|
|
15
|
+
* @module cli/gate-report-types
|
|
16
|
+
*/
|
|
17
|
+
/** Report format version, bumped when a consumer would have to change. */
|
|
18
|
+
export declare const GATE_REPORT_VERSION = 1;
|
|
19
|
+
/**
|
|
20
|
+
* One fact, in one of the three states.
|
|
21
|
+
*
|
|
22
|
+
* `unknown` and `not-applicable` both carry a machine `reason` and a human
|
|
23
|
+
* `message`, matching the live-status `ProbeResult` contract the console
|
|
24
|
+
* already renders — a report that says "not checkable here" without saying why
|
|
25
|
+
* is indistinguishable from a bug.
|
|
26
|
+
*/
|
|
27
|
+
export type Finding<T> = {
|
|
28
|
+
readonly state: "verified";
|
|
29
|
+
readonly value: T;
|
|
30
|
+
} | {
|
|
31
|
+
readonly state: "unknown";
|
|
32
|
+
readonly reason: string;
|
|
33
|
+
readonly message: string;
|
|
34
|
+
} | {
|
|
35
|
+
readonly state: "not-applicable";
|
|
36
|
+
readonly reason: string;
|
|
37
|
+
readonly message: string;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* What the settings file says about one gate at one moment.
|
|
41
|
+
*
|
|
42
|
+
* `off` and `not-declared` are deliberately separate. Collapsing them is what
|
|
43
|
+
* let a declaration govern nothing: the CI façade read both as
|
|
44
|
+
* `configured=false` and ran its built-in fallback, so `off` could not turn a
|
|
45
|
+
* job off.
|
|
46
|
+
*/
|
|
47
|
+
export type DeclarationState = "required" | "optional" | "off" | "not-declared";
|
|
48
|
+
/** How a declared gate is proved. */
|
|
49
|
+
export type ProofMode = "run" | "await" | "intercept" | "off";
|
|
50
|
+
/**
|
|
51
|
+
* Which of the four task sources won, narrowest first.
|
|
52
|
+
*
|
|
53
|
+
* Two projects render identically and behave differently if a per-moment `run`
|
|
54
|
+
* is not distinguished from a gate-level one, so the report names the winner
|
|
55
|
+
* rather than only the result.
|
|
56
|
+
*/
|
|
57
|
+
export type TaskProvenance = "moment-run" | "gate-run" | "registry-task-at" | "registry-task" | "none";
|
|
58
|
+
/**
|
|
59
|
+
* The four buckets, computed per (gate, moment) pair rather than per gate.
|
|
60
|
+
*
|
|
61
|
+
* A pair is genuinely mixed — the same gate can be A at push and B at
|
|
62
|
+
* pull-request in one repository — so a gate-level bucket would have to
|
|
63
|
+
* summarise a mixed verdict.
|
|
64
|
+
*/
|
|
65
|
+
export type Bucket = "A" | "B" | "C" | "D";
|
|
66
|
+
/** One executor this run proved would run the gate's task. */
|
|
67
|
+
export interface ExecutorEvidence {
|
|
68
|
+
/** How the executor was found. */
|
|
69
|
+
readonly kind: "gate-runner" | "hook-builtin" | "hook-literal";
|
|
70
|
+
/** Project-relative file holding it. Never an absolute path. */
|
|
71
|
+
readonly file: string;
|
|
72
|
+
/** Operator-readable sentence. */
|
|
73
|
+
readonly detail: string;
|
|
74
|
+
}
|
|
75
|
+
/** Whether a required status context stands between this gate and a merge. */
|
|
76
|
+
export interface MergeBlock {
|
|
77
|
+
/** True when the ruleset requires a context this gate produces. */
|
|
78
|
+
readonly required: boolean;
|
|
79
|
+
/** The matching required context, when there is one. */
|
|
80
|
+
readonly context: string | null;
|
|
81
|
+
}
|
|
82
|
+
/** One (gate, moment) pair — the report's real unit. */
|
|
83
|
+
export interface GateMomentCell {
|
|
84
|
+
/** The moment, including any `:environment` suffix. */
|
|
85
|
+
readonly moment: string;
|
|
86
|
+
/** Whether the registry permits declaring this gate here. */
|
|
87
|
+
readonly legal: boolean;
|
|
88
|
+
/** What the settings file says. */
|
|
89
|
+
readonly declaration: DeclarationState;
|
|
90
|
+
/** How it is proved, or null when nothing is declared. */
|
|
91
|
+
readonly mode: ProofMode | null;
|
|
92
|
+
/** The signal an `await` gate waits for. */
|
|
93
|
+
readonly awaits: string | null;
|
|
94
|
+
/** The task that would run. */
|
|
95
|
+
readonly task: string | null;
|
|
96
|
+
/** The task with the project's runner in front of it. */
|
|
97
|
+
readonly command: string | null;
|
|
98
|
+
/** Which of the four sources supplied the task. */
|
|
99
|
+
readonly provenance: TaskProvenance;
|
|
100
|
+
/** Whether `package.json` scripts actually define that task. */
|
|
101
|
+
readonly commandExists: Finding<boolean>;
|
|
102
|
+
/** Executors this run proved. Empty is a real answer, not an unknown. */
|
|
103
|
+
readonly executors: readonly ExecutorEvidence[];
|
|
104
|
+
/** The branch-protection context this declaration implies, if any. */
|
|
105
|
+
readonly expectedContext: string | null;
|
|
106
|
+
/** Tier 2 — the live ruleset, or an honest unknown. */
|
|
107
|
+
readonly blocksMerge: Finding<MergeBlock>;
|
|
108
|
+
/** Tier 3 — lives in a `quality.yml` no consumer holds. */
|
|
109
|
+
readonly facadeReadsDeclaration: Finding<boolean>;
|
|
110
|
+
/** A, B, C, D, or an explicit refusal to classify. */
|
|
111
|
+
readonly bucket: Finding<Bucket>;
|
|
112
|
+
}
|
|
113
|
+
/** One registry gate, with a cell for every moment on the report's axis. */
|
|
114
|
+
export interface GateReportRow {
|
|
115
|
+
/** Registry id. */
|
|
116
|
+
readonly id: string;
|
|
117
|
+
/** CI job name — load-bearing, a ruleset names contexts by exact string. */
|
|
118
|
+
readonly label: string;
|
|
119
|
+
/** What a pass proves. */
|
|
120
|
+
readonly summary: string;
|
|
121
|
+
/** The moments the registry permits, sorted. */
|
|
122
|
+
readonly legalMoments: readonly string[];
|
|
123
|
+
/** The registry's default prover. */
|
|
124
|
+
readonly defaultTask: string | null;
|
|
125
|
+
/** Registry task swaps that ship to everyone, keyed by moment family. */
|
|
126
|
+
readonly taskAt: Readonly<Record<string, string>>;
|
|
127
|
+
/** A project-wide `run` override, applying at every moment. */
|
|
128
|
+
readonly projectTask: string | null;
|
|
129
|
+
/** Registry flag: the task may rewrite the working tree. */
|
|
130
|
+
readonly mayRewrite: boolean;
|
|
131
|
+
/** Registry flag: the task costs minutes, not seconds. */
|
|
132
|
+
readonly costly: boolean;
|
|
133
|
+
/** The interception this gate is, when a task cannot implement it. */
|
|
134
|
+
readonly interceptor: string | null;
|
|
135
|
+
/** The `quality.yml` job this gate maps to, from the static table. */
|
|
136
|
+
readonly qualityJob: string | null;
|
|
137
|
+
/** One cell per moment on the report's axis, in axis order. */
|
|
138
|
+
readonly moments: readonly GateMomentCell[];
|
|
139
|
+
}
|
|
140
|
+
/** One `skip_jobs` token the project still forwards, and its migration. */
|
|
141
|
+
export interface SkipJobRow {
|
|
142
|
+
/** The token exactly as the caller spells it. */
|
|
143
|
+
readonly token: string;
|
|
144
|
+
/** One of the registry's `SKIP_JOB_STATUS` values. */
|
|
145
|
+
readonly status: string;
|
|
146
|
+
/** The gate that replaces it, or null. */
|
|
147
|
+
readonly gate: string | null;
|
|
148
|
+
/** The declaration to write, or null when none exists. */
|
|
149
|
+
readonly declaration: string | null;
|
|
150
|
+
}
|
|
151
|
+
/** How the declared contexts compare with the ones a ruleset requires. */
|
|
152
|
+
export interface RulesetComparison {
|
|
153
|
+
/** Declared required and required by the ruleset. */
|
|
154
|
+
readonly matched: readonly string[];
|
|
155
|
+
/** Declared required, absent from the ruleset — governs nothing. */
|
|
156
|
+
readonly declaredNotRequired: readonly string[];
|
|
157
|
+
/** Required by the ruleset, governed by no declaration. */
|
|
158
|
+
readonly requiredNotDeclared: readonly string[];
|
|
159
|
+
}
|
|
160
|
+
/** Counts, each stating its denominator and its unknown band. */
|
|
161
|
+
export interface GateReportSummary {
|
|
162
|
+
/** Registry gates in this report. */
|
|
163
|
+
readonly gateCount: number;
|
|
164
|
+
/** Moments on the report's axis. */
|
|
165
|
+
readonly momentCount: number;
|
|
166
|
+
/** Gates carrying at least one `required` or `optional` declaration. */
|
|
167
|
+
readonly governedBySettings: number;
|
|
168
|
+
/** Gates whose only declarations are `off`. */
|
|
169
|
+
readonly declaredOffOnly: number;
|
|
170
|
+
/** Gates the settings file never mentions. */
|
|
171
|
+
readonly notDeclared: number;
|
|
172
|
+
/** Legal (gate, moment) pairs — the denominator for the buckets. */
|
|
173
|
+
readonly legalCells: number;
|
|
174
|
+
/** Bucket membership counts. Unclassifiable pairs are counted separately. */
|
|
175
|
+
readonly buckets: Readonly<Record<Bucket, number>>;
|
|
176
|
+
/** Pairs this run declined to classify. Never folded into D. */
|
|
177
|
+
readonly bucketUnknown: number;
|
|
178
|
+
/** Declared pairs whose task is missing from `package.json` — bucket C. */
|
|
179
|
+
readonly declaredWithoutCommand: number;
|
|
180
|
+
/** Undeclared pairs proved anyway by a command written into a script. */
|
|
181
|
+
readonly provedAnyway: number;
|
|
182
|
+
}
|
|
183
|
+
/** The whole payload emitted under `lisa doctor --json`. */
|
|
184
|
+
export interface GateReport {
|
|
185
|
+
/** Format version. */
|
|
186
|
+
readonly version: number;
|
|
187
|
+
/** Where the registry was read from, or why it could not be. */
|
|
188
|
+
readonly registrySource: Finding<string>;
|
|
189
|
+
/** The runner gate commands are built with. */
|
|
190
|
+
readonly runner: Finding<string>;
|
|
191
|
+
/** Whether the runner came from the project or from Lisa's default. */
|
|
192
|
+
readonly runnerSource: "declared" | "default" | "unknown";
|
|
193
|
+
/** Every moment the report has a column for, in a stable order. */
|
|
194
|
+
readonly momentAxis: readonly string[];
|
|
195
|
+
/** Everything `validateGates` objected to, verbatim. */
|
|
196
|
+
readonly declarationProblems: readonly string[];
|
|
197
|
+
/** One row per registry gate, sorted by id. */
|
|
198
|
+
readonly gates: readonly GateReportRow[];
|
|
199
|
+
/** The project's forwarded `skip_jobs` tokens. */
|
|
200
|
+
readonly skipJobs: Finding<readonly SkipJobRow[]>;
|
|
201
|
+
/** Declared contexts against the live ruleset — Tier 2. */
|
|
202
|
+
readonly ruleset: Finding<RulesetComparison>;
|
|
203
|
+
/** Counts. */
|
|
204
|
+
readonly summary: GateReportSummary;
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=gate-report-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-report-types.d.ts","sourceRoot":"","sources":["../../src/cli/gate-report-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,0EAA0E;AAC1E,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC;;;;;;;GAOG;AACH,MAAM,MAAM,OAAO,CAAC,CAAC,IACjB;IAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GACjD;IACE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,GACD;IACE,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEN;;;;;;;GAOG;AACH,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,UAAU,GAAG,KAAK,GAAG,cAAc,CAAC;AAEhF,qCAAqC;AACrC,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,OAAO,GAAG,WAAW,GAAG,KAAK,CAAC;AAE9D;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GACtB,YAAY,GACZ,UAAU,GACV,kBAAkB,GAClB,eAAe,GACf,MAAM,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,MAAM,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAE3C,8DAA8D;AAC9D,MAAM,WAAW,gBAAgB;IAC/B,kCAAkC;IAClC,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,cAAc,GAAG,cAAc,CAAC;IAC/D,gEAAgE;IAChE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,wDAAwD;IACxD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,wDAAwD;AACxD,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,6DAA6D;IAC7D,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,mCAAmC;IACnC,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC;IACvC,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IAChC,4CAA4C;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,+BAA+B;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,yDAAyD;IACzD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,mDAAmD;IACnD,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,gEAAgE;IAChE,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,yEAAyE;IACzE,QAAQ,CAAC,SAAS,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAChD,sEAAsE;IACtE,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,uDAAuD;IACvD,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1C,2DAA2D;IAC3D,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,sDAAsD;IACtD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;CAClC;AAED,4EAA4E;AAC5E,MAAM,WAAW,aAAa;IAC5B,mBAAmB;IACnB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,0BAA0B;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,gDAAgD;IAChD,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,qCAAqC;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,yEAAyE;IACzE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,+DAA+D;IAC/D,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,4DAA4D;IAC5D,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,sEAAsE;IACtE,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,sEAAsE;IACtE,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;CAC7C;AAED,2EAA2E;AAC3E,MAAM,WAAW,UAAU;IACzB,iDAAiD;IACjD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,sDAAsD;IACtD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,0CAA0C;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,0DAA0D;IAC1D,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED,0EAA0E;AAC1E,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,oEAAoE;IACpE,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD,2DAA2D;IAC3D,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;CACjD;AAED,iEAAiE;AACjE,MAAM,WAAW,iBAAiB;IAChC,qCAAqC;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,oCAAoC;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,wEAAwE;IACxE,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,+CAA+C;IAC/C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,8CAA8C;IAC9C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,oEAAoE;IACpE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,gEAAgE;IAChE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,2EAA2E;IAC3E,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,yEAAyE;IACzE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,4DAA4D;AAC5D,MAAM,WAAW,UAAU;IACzB,sBAAsB;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,gEAAgE;IAChE,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,+CAA+C;IAC/C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,uEAAuE;IACvE,QAAQ,CAAC,YAAY,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;IAC1D,mEAAmE;IACnE,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,wDAAwD;IACxD,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD,+CAA+C;IAC/C,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,kDAAkD;IAClD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,UAAU,EAAE,CAAC,CAAC;IAClD,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC7C,cAAc;IACd,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;CACrC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The shape of the deterministic gate report.
|
|
3
|
+
*
|
|
4
|
+
* Every fact in this payload carries one of three states, never two.
|
|
5
|
+
* `verified` means this run checked it and this is the answer — including when
|
|
6
|
+
* the answer is "no". `unknown` means the fact exists but this run could not
|
|
7
|
+
* reach it. `not-applicable` means there is no such fact here at all.
|
|
8
|
+
*
|
|
9
|
+
* The distinction is the whole point of the report rather than a nicety. This
|
|
10
|
+
* repository has catalogued controls that reported success while proving
|
|
11
|
+
* nothing; a report that folded "could not check" into "pass" would be that
|
|
12
|
+
* defect sited at the one screen an operator would trust. So `unknown` is
|
|
13
|
+
* structurally distinct — not a boolean, not an absent key, not a default — and
|
|
14
|
+
* every count states its unknown band explicitly.
|
|
15
|
+
* @module cli/gate-report-types
|
|
16
|
+
*/
|
|
17
|
+
/** Report format version, bumped when a consumer would have to change. */
|
|
18
|
+
export const GATE_REPORT_VERSION = 1;
|
|
19
|
+
//# sourceMappingURL=gate-report-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-report-types.js","sourceRoot":"","sources":["../../src/cli/gate-report-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,0EAA0E;AAC1E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type GateRegistryModule } from "./gate-report-registry.js";
|
|
2
|
+
import { type RequiredContextsReader } from "./gate-report-ruleset.js";
|
|
3
|
+
import { type SkipJobTokensReader } from "./gate-report-skip-jobs.js";
|
|
4
|
+
import { type GateReport } from "./gate-report-types.js";
|
|
5
|
+
/** Options for one report. */
|
|
6
|
+
export interface GateReportOptions {
|
|
7
|
+
/** Project root to report on. */
|
|
8
|
+
readonly projectRoot: string;
|
|
9
|
+
/** Suppress the network call and report Tier 2 as `unknown`. */
|
|
10
|
+
readonly offline?: boolean;
|
|
11
|
+
/** Injectable Tier 2 reader, so tests never shell out. */
|
|
12
|
+
readonly readRequiredContexts?: RequiredContextsReader;
|
|
13
|
+
/** Injectable `skip_jobs` reader, for the same reason. */
|
|
14
|
+
readonly readSkipJobTokens?: SkipJobTokensReader;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Every moment the report has a column for.
|
|
18
|
+
*
|
|
19
|
+
* There is no fixed set. `MOMENTS` is five, and three families take an
|
|
20
|
+
* `:<environment>` suffix, so a project with staging and production has more
|
|
21
|
+
* deploy columns than one with production alone. The axis is therefore the
|
|
22
|
+
* fixed moments plus whatever family moments this project actually declares —
|
|
23
|
+
* and never a bare `deploy`, which is not a moment Lisa knows.
|
|
24
|
+
* @param registry - The shipped registry
|
|
25
|
+
* @param gates - The gates block
|
|
26
|
+
* @returns The axis, fixed moments first, then declared family moments sorted
|
|
27
|
+
*/
|
|
28
|
+
export declare function momentAxis(registry: GateRegistryModule, gates: Record<string, unknown>): string[];
|
|
29
|
+
/**
|
|
30
|
+
* Build the gate report for one project.
|
|
31
|
+
* @param options - Report inputs
|
|
32
|
+
* @returns The report
|
|
33
|
+
*/
|
|
34
|
+
export declare function buildGateReport(options: GateReportOptions): Promise<GateReport>;
|
|
35
|
+
//# sourceMappingURL=gate-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-report.d.ts","sourceRoot":"","sources":["../../src/cli/gate-report.ts"],"names":[],"mappings":"AAwBA,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAIL,KAAK,sBAAsB,EAC5B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAIL,KAAK,UAAU,EAIhB,MAAM,wBAAwB,CAAC;AAQhC,8BAA8B;AAC9B,MAAM,WAAW,iBAAiB;IAChC,iCAAiC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,gEAAgE;IAChE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,0DAA0D;IAC1D,QAAQ,CAAC,oBAAoB,CAAC,EAAE,sBAAsB,CAAC;IACvD,0DAA0D;IAC1D,QAAQ,CAAC,iBAAiB,CAAC,EAAE,mBAAmB,CAAC;CAClD;AA0BD;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,MAAM,EAAE,CASV;AA4ND;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,UAAU,CAAC,CAoDrB"}
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build the deterministic gate report.
|
|
3
|
+
*
|
|
4
|
+
* Same project and config in, identical bytes out. That is the load-bearing
|
|
5
|
+
* property, not a nicety: an agent-written version of this report would differ
|
|
6
|
+
* between runs when nothing changed, so a real regression would be
|
|
7
|
+
* indistinguishable from a rephrasing — and the error class it would reproduce
|
|
8
|
+
* is documented. Four times in one session, "absent from the settings file" was
|
|
9
|
+
* read as "does not run" for a check that was in fact running from a workflow
|
|
10
|
+
* or a hook nobody had looked in. Deriving the answer removes the reader.
|
|
11
|
+
*
|
|
12
|
+
* The report splits into three tiers by what a consumer can actually reach.
|
|
13
|
+
* Tier 1 is everything derivable from files the project holds. Tier 2 is the
|
|
14
|
+
* live ruleset, which needs a network call and degrades to `unknown`. Tier 3 is
|
|
15
|
+
* whether a CI job reads the declaration or runs a hardcoded command — that
|
|
16
|
+
* lives in a `quality.yml` a consumer does not have, so it is stated as
|
|
17
|
+
* unknowable rather than inferred from the presence of a mapping row.
|
|
18
|
+
* @module cli/gate-report
|
|
19
|
+
*/
|
|
20
|
+
import { readFile } from "node:fs/promises";
|
|
21
|
+
import * as path from "node:path";
|
|
22
|
+
import { buildCell } from "./gate-report-cells.js";
|
|
23
|
+
import { collectHookEvidence } from "./gate-report-executors.js";
|
|
24
|
+
import { loadGateRegistry, } from "./gate-report-registry.js";
|
|
25
|
+
import { compareContexts, defaultRequiredContextsReader, readRequiredContexts, } from "./gate-report-ruleset.js";
|
|
26
|
+
import { buildSkipJobRows, defaultSkipJobTokensReader, } from "./gate-report-skip-jobs.js";
|
|
27
|
+
import { readConfig } from "./gate-report-config.js";
|
|
28
|
+
import { summarise } from "./gate-report-summary.js";
|
|
29
|
+
import { GATE_REPORT_VERSION, } from "./gate-report-types.js";
|
|
30
|
+
/** The workflow whose name prefixes a run gate's status context. */
|
|
31
|
+
const QUALITY_WORKFLOW_NAME = "🔍 Quality Checks";
|
|
32
|
+
/** The moment a ruleset guards, and the one `quality.yml` defaults to. */
|
|
33
|
+
const MERGE_MOMENT = "pull-request";
|
|
34
|
+
/**
|
|
35
|
+
* Read `package.json` scripts, distinguishing absent from unreadable.
|
|
36
|
+
* @param projectRoot - Project root
|
|
37
|
+
* @returns The scripts block, or null when it could not be read
|
|
38
|
+
*/
|
|
39
|
+
async function readScripts(projectRoot) {
|
|
40
|
+
const source = await readFile(path.join(projectRoot, "package.json"), "utf8").catch(() => undefined);
|
|
41
|
+
if (source === undefined)
|
|
42
|
+
return null;
|
|
43
|
+
try {
|
|
44
|
+
const parsed = JSON.parse(source);
|
|
45
|
+
if (parsed === null || typeof parsed !== "object")
|
|
46
|
+
return null;
|
|
47
|
+
const scripts = Reflect.get(parsed, "scripts");
|
|
48
|
+
if (scripts === null || typeof scripts !== "object")
|
|
49
|
+
return {};
|
|
50
|
+
return scripts;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Every moment the report has a column for.
|
|
58
|
+
*
|
|
59
|
+
* There is no fixed set. `MOMENTS` is five, and three families take an
|
|
60
|
+
* `:<environment>` suffix, so a project with staging and production has more
|
|
61
|
+
* deploy columns than one with production alone. The axis is therefore the
|
|
62
|
+
* fixed moments plus whatever family moments this project actually declares —
|
|
63
|
+
* and never a bare `deploy`, which is not a moment Lisa knows.
|
|
64
|
+
* @param registry - The shipped registry
|
|
65
|
+
* @param gates - The gates block
|
|
66
|
+
* @returns The axis, fixed moments first, then declared family moments sorted
|
|
67
|
+
*/
|
|
68
|
+
export function momentAxis(registry, gates) {
|
|
69
|
+
const declared = Object.values(gates)
|
|
70
|
+
.filter((gate) => typeof gate === "object" && gate !== null)
|
|
71
|
+
.flatMap(gate => Object.keys(gate))
|
|
72
|
+
.filter(key => !registry.MOMENTS.includes(key) && registry.isMoment(key));
|
|
73
|
+
return [
|
|
74
|
+
...registry.MOMENTS,
|
|
75
|
+
...[...new Set(declared)].sort((left, right) => left.localeCompare(right)),
|
|
76
|
+
];
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Resolve one moment, capturing a refusal rather than throwing it upward.
|
|
80
|
+
*
|
|
81
|
+
* `resolveMoment` asserts the whole gates block's moment keys, so one typo
|
|
82
|
+
* anywhere makes every moment unresolvable. That must surface as a stated
|
|
83
|
+
* problem, not as a report that looks like a project declaring nothing.
|
|
84
|
+
* @param registry - The shipped registry
|
|
85
|
+
* @param gates - The gates block
|
|
86
|
+
* @param runner - The project's runner
|
|
87
|
+
* @param moment - The moment to resolve
|
|
88
|
+
* @returns Resolved gates keyed by id, or the failure that prevented it
|
|
89
|
+
*/
|
|
90
|
+
function resolveOneMoment(registry, gates, runner, moment) {
|
|
91
|
+
try {
|
|
92
|
+
const entries = registry.resolveMoment({
|
|
93
|
+
gates,
|
|
94
|
+
moment,
|
|
95
|
+
runner,
|
|
96
|
+
includeOff: true,
|
|
97
|
+
});
|
|
98
|
+
return {
|
|
99
|
+
resolved: new Map(entries.map(entry => [entry.id, entry])),
|
|
100
|
+
failure: null,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
return {
|
|
105
|
+
resolved: null,
|
|
106
|
+
failure: error instanceof Error ? error.message : String(error),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The Tier 2 answer for one cell, never defaulted to a verdict.
|
|
112
|
+
* @param contexts - The live required contexts, or an unknown
|
|
113
|
+
* @returns A resolver for one cell's expected context
|
|
114
|
+
*/
|
|
115
|
+
function mergeBlockResolver(contexts) {
|
|
116
|
+
return (moment, expectedContext) => {
|
|
117
|
+
if (moment !== MERGE_MOMENT) {
|
|
118
|
+
return {
|
|
119
|
+
state: "not-applicable",
|
|
120
|
+
reason: "moment-produces-no-merge-context",
|
|
121
|
+
message: `A ruleset guards a merge, and only the ${MERGE_MOMENT} gate set produces the status contexts it names. A declaration at ${moment} is enforced by a hook, not by branch protection.`,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
if (expectedContext === null) {
|
|
125
|
+
return {
|
|
126
|
+
state: "not-applicable",
|
|
127
|
+
reason: "no-required-declaration",
|
|
128
|
+
message: "Only a `required` declaration produces a status context, so there is nothing here for a ruleset to require.",
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
if (contexts.state !== "verified")
|
|
132
|
+
return contexts;
|
|
133
|
+
return {
|
|
134
|
+
state: "verified",
|
|
135
|
+
value: {
|
|
136
|
+
required: contexts.value.includes(expectedContext),
|
|
137
|
+
context: contexts.value.includes(expectedContext)
|
|
138
|
+
? expectedContext
|
|
139
|
+
: null,
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Build one gate's row.
|
|
146
|
+
* @param context - Report-wide cell inputs
|
|
147
|
+
* @param moments - Per-moment resolution results, in axis order
|
|
148
|
+
* @param id - Gate id
|
|
149
|
+
* @param jobForGate - Gate id -> `quality.yml` job
|
|
150
|
+
* @returns The row
|
|
151
|
+
*/
|
|
152
|
+
function buildRow(context, moments, id, jobForGate) {
|
|
153
|
+
const definition = context.registry.REGISTRY[id];
|
|
154
|
+
const cells = moments.map(moment => buildCell(context, moment, id));
|
|
155
|
+
return {
|
|
156
|
+
id,
|
|
157
|
+
label: definition?.label ?? id,
|
|
158
|
+
summary: definition?.summary ?? "",
|
|
159
|
+
legalMoments: [...(definition?.moments ?? [])].sort((left, right) => left.localeCompare(right)),
|
|
160
|
+
defaultTask: definition?.task ?? null,
|
|
161
|
+
taskAt: { ...definition?.taskAt },
|
|
162
|
+
projectTask: projectLevelTask(context.gates, id),
|
|
163
|
+
mayRewrite: definition?.mayRewrite === true,
|
|
164
|
+
costly: definition?.costly === true,
|
|
165
|
+
interceptor: context.registry.INTERCEPTORS[id] ?? null,
|
|
166
|
+
qualityJob: jobForGate.get(id) ?? null,
|
|
167
|
+
moments: cells,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* A gate-level `run` override from the settings file.
|
|
172
|
+
* @param gates - The gates block
|
|
173
|
+
* @param id - Gate id
|
|
174
|
+
* @returns The task, or null
|
|
175
|
+
*/
|
|
176
|
+
function projectLevelTask(gates, id) {
|
|
177
|
+
const gate = gates[id];
|
|
178
|
+
if (typeof gate !== "object" || gate === null)
|
|
179
|
+
return null;
|
|
180
|
+
const run = Reflect.get(gate, "run");
|
|
181
|
+
return typeof run === "string" ? run : null;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Invert the static job table so a gate can name its CI job.
|
|
185
|
+
* @param registry - The shipped registry
|
|
186
|
+
* @returns Gate id -> job id
|
|
187
|
+
*/
|
|
188
|
+
function invertJobTable(registry) {
|
|
189
|
+
// Reversed before the Map is built so that when two jobs name one gate the
|
|
190
|
+
// FIRST in declaration order wins, which is the order the table reads in.
|
|
191
|
+
return new Map(Object.entries(registry.QUALITY_JOB_GATES)
|
|
192
|
+
.map(([job, gate]) => [gate, job])
|
|
193
|
+
.reverse());
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* The contexts a gates block implies at the merge moment.
|
|
197
|
+
* @param registry - The shipped registry
|
|
198
|
+
* @param gates - The gates block
|
|
199
|
+
* @returns The contexts, or null when the block cannot be resolved
|
|
200
|
+
*/
|
|
201
|
+
function declaredContexts(registry, gates) {
|
|
202
|
+
try {
|
|
203
|
+
return registry.contextsFor(gates, {
|
|
204
|
+
moment: MERGE_MOMENT,
|
|
205
|
+
workflowName: QUALITY_WORKFLOW_NAME,
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* The ruleset comparison, or the same unknown the contexts came back with.
|
|
214
|
+
* @param registry - The shipped registry
|
|
215
|
+
* @param gates - The gates block
|
|
216
|
+
* @param contexts - Live required contexts, or an unknown
|
|
217
|
+
* @returns The comparison
|
|
218
|
+
*/
|
|
219
|
+
function buildRulesetFinding(registry, gates, contexts) {
|
|
220
|
+
if (contexts.state !== "verified")
|
|
221
|
+
return contexts;
|
|
222
|
+
const declared = declaredContexts(registry, gates);
|
|
223
|
+
if (declared === null) {
|
|
224
|
+
return {
|
|
225
|
+
state: "unknown",
|
|
226
|
+
reason: "declarations-unresolvable",
|
|
227
|
+
message: "The gates block could not be resolved, so the contexts it implies cannot be compared with the ruleset.",
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
return {
|
|
231
|
+
state: "verified",
|
|
232
|
+
value: compareContexts(declared, contexts.value),
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* The report emitted when the shipped registry cannot be found.
|
|
237
|
+
* @returns A report that claims nothing
|
|
238
|
+
*/
|
|
239
|
+
function registryMissingReport() {
|
|
240
|
+
const missing = {
|
|
241
|
+
state: "unknown",
|
|
242
|
+
reason: "registry-not-found",
|
|
243
|
+
message: "Lisa's shipped gate registry could not be located, so no gate could be reported. Nothing here is a pass.",
|
|
244
|
+
};
|
|
245
|
+
return {
|
|
246
|
+
version: GATE_REPORT_VERSION,
|
|
247
|
+
registrySource: missing,
|
|
248
|
+
runner: missing,
|
|
249
|
+
runnerSource: "unknown",
|
|
250
|
+
momentAxis: [],
|
|
251
|
+
declarationProblems: [],
|
|
252
|
+
gates: [],
|
|
253
|
+
skipJobs: missing,
|
|
254
|
+
ruleset: missing,
|
|
255
|
+
summary: summarise([], 0),
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Build the gate report for one project.
|
|
260
|
+
* @param options - Report inputs
|
|
261
|
+
* @returns The report
|
|
262
|
+
*/
|
|
263
|
+
export async function buildGateReport(options) {
|
|
264
|
+
const registry = await loadGateRegistry();
|
|
265
|
+
if (registry === null)
|
|
266
|
+
return registryMissingReport();
|
|
267
|
+
const { projectRoot } = options;
|
|
268
|
+
const parsed = readConfig(registry, projectRoot);
|
|
269
|
+
const gates = parsed.gates;
|
|
270
|
+
const axis = momentAxis(registry, gates);
|
|
271
|
+
const [scripts, hooks, contexts, skipJobs] = await Promise.all([
|
|
272
|
+
readScripts(projectRoot),
|
|
273
|
+
collectHookEvidence(projectRoot),
|
|
274
|
+
readRequiredContexts({
|
|
275
|
+
projectRoot,
|
|
276
|
+
offline: options.offline === true,
|
|
277
|
+
read: options.readRequiredContexts ?? defaultRequiredContextsReader,
|
|
278
|
+
}),
|
|
279
|
+
buildSkipJobRows({
|
|
280
|
+
registry,
|
|
281
|
+
projectRoot,
|
|
282
|
+
read: options.readSkipJobTokens ?? defaultSkipJobTokensReader,
|
|
283
|
+
}),
|
|
284
|
+
]);
|
|
285
|
+
const context = {
|
|
286
|
+
registry,
|
|
287
|
+
gates,
|
|
288
|
+
hooks,
|
|
289
|
+
scripts,
|
|
290
|
+
runner: parsed.runner,
|
|
291
|
+
workflowName: QUALITY_WORKFLOW_NAME,
|
|
292
|
+
blocksMerge: mergeBlockResolver(contexts),
|
|
293
|
+
};
|
|
294
|
+
const moments = axis.map(moment => ({
|
|
295
|
+
moment,
|
|
296
|
+
...resolveOneMoment(registry, gates, parsed.runner, moment),
|
|
297
|
+
}));
|
|
298
|
+
const jobForGate = invertJobTable(registry);
|
|
299
|
+
const rows = Object.keys(registry.REGISTRY)
|
|
300
|
+
.sort((left, right) => left.localeCompare(right))
|
|
301
|
+
.map(id => buildRow(context, moments, id, jobForGate));
|
|
302
|
+
return {
|
|
303
|
+
version: GATE_REPORT_VERSION,
|
|
304
|
+
// Deliberately a token, not the path. An absolute path differs per machine
|
|
305
|
+
// and would break the byte-identical property the report is built on.
|
|
306
|
+
registrySource: { state: "verified", value: "lisa-package" },
|
|
307
|
+
runner: parsed.runnerFinding,
|
|
308
|
+
runnerSource: parsed.runnerSource,
|
|
309
|
+
momentAxis: axis,
|
|
310
|
+
declarationProblems: parsed.problems,
|
|
311
|
+
gates: rows,
|
|
312
|
+
skipJobs,
|
|
313
|
+
ruleset: buildRulesetFinding(registry, gates, contexts),
|
|
314
|
+
summary: summarise(rows, axis.length),
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=gate-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-report.js","sourceRoot":"","sources":["../../src/cli/gate-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,6 +37,20 @@ export interface GithubRepoGhReads {
|
|
|
37
37
|
readonly listLabels: (owner: string, repo: string, cwd: string, timeoutMs: number, signal: AbortSignal) => Promise<readonly GithubRemoteLabel[]>;
|
|
38
38
|
readonly listSecretNames: (owner: string, repo: string, cwd: string, timeoutMs: number, signal: AbortSignal) => Promise<readonly string[]>;
|
|
39
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Run `gh` without a shell and return stdout.
|
|
42
|
+
*
|
|
43
|
+
* Exported so every `gh` read in the CLI goes through one shell-free call site.
|
|
44
|
+
* A second one would mean a second place to get argument handling and the
|
|
45
|
+
* command-from-PATH exemption right, and the gate report needs a branch-rules
|
|
46
|
+
* read that belongs to no existing member of `GithubRepoGhReads`.
|
|
47
|
+
* @param args - gh argv after the executable
|
|
48
|
+
* @param cwd - Working directory
|
|
49
|
+
* @param timeoutMs - Child-process timeout
|
|
50
|
+
* @param signal - Probe cancellation signal
|
|
51
|
+
* @returns Trimmed stdout
|
|
52
|
+
*/
|
|
53
|
+
export declare function runGh(args: readonly string[], cwd: string, timeoutMs: number, signal: AbortSignal): Promise<string>;
|
|
40
54
|
/** Default `gh` implementations used by `lisa ui`. */
|
|
41
55
|
export declare const defaultGithubRepoGhReads: GithubRepoGhReads;
|
|
42
56
|
//# sourceMappingURL=ui-github-repo-gh.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-github-repo-gh.d.ts","sourceRoot":"","sources":["../../src/cli/ui-github-repo-gh.ts"],"names":[],"mappings":"AAWA,8DAA8D;AAC9D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;IACzC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,qCAAqC;AACrC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,wEAAwE;IACxE,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IACxC,wEAAwE;IACxE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IACvC,gEAAgE;IAChE,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;CACzC;AAED,kDAAkD;AAClD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,8DAA8D;AAC9D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,YAAY,EAAE,CACrB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,KAChB,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,CACrB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,KAChB,OAAO,CAAC,SAAS,gBAAgB,EAAE,CAAC,CAAC;IAC1C,QAAQ,CAAC,UAAU,EAAE,CACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,KAChB,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAAC;IAC3C,QAAQ,CAAC,eAAe,EAAE,CACxB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,KAChB,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;CACjC;
|
|
1
|
+
{"version":3,"file":"ui-github-repo-gh.d.ts","sourceRoot":"","sources":["../../src/cli/ui-github-repo-gh.ts"],"names":[],"mappings":"AAWA,8DAA8D;AAC9D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;IACzC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,qCAAqC;AACrC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,wEAAwE;IACxE,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IACxC,wEAAwE;IACxE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IACvC,gEAAgE;IAChE,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;CACzC;AAED,kDAAkD;AAClD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,8DAA8D;AAC9D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,YAAY,EAAE,CACrB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,KAChB,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,CACrB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,KAChB,OAAO,CAAC,SAAS,gBAAgB,EAAE,CAAC,CAAC;IAC1C,QAAQ,CAAC,UAAU,EAAE,CACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,KAChB,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAAC;IAC3C,QAAQ,CAAC,eAAe,EAAE,CACxB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,KAChB,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;CACjC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,KAAK,CACnB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,MAAM,CAAC,CAiBjB;AAoDD,sDAAsD;AACtD,eAAO,MAAM,wBAAwB,EAAE,iBA0EtC,CAAC"}
|