@codyswann/lisa 3.47.10 → 3.48.1

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.
Files changed (110) hide show
  1. package/all/copy-overwrite/scripts/lisa-work-item.mjs +19 -6
  2. package/dist/cli/doctor-render.d.ts +22 -0
  3. package/dist/cli/doctor-render.d.ts.map +1 -0
  4. package/dist/cli/doctor-render.js +27 -0
  5. package/dist/cli/doctor-render.js.map +1 -0
  6. package/dist/cli/doctor.d.ts +15 -0
  7. package/dist/cli/doctor.d.ts.map +1 -1
  8. package/dist/cli/doctor.js +2 -9
  9. package/dist/cli/doctor.js.map +1 -1
  10. package/dist/cli/gate-report-cells.d.ts +101 -0
  11. package/dist/cli/gate-report-cells.d.ts.map +1 -0
  12. package/dist/cli/gate-report-cells.js +269 -0
  13. package/dist/cli/gate-report-cells.js.map +1 -0
  14. package/dist/cli/gate-report-config.d.ts +28 -0
  15. package/dist/cli/gate-report-config.d.ts.map +1 -0
  16. package/dist/cli/gate-report-config.js +33 -0
  17. package/dist/cli/gate-report-config.js.map +1 -0
  18. package/dist/cli/gate-report-executors.d.ts +62 -0
  19. package/dist/cli/gate-report-executors.d.ts.map +1 -0
  20. package/dist/cli/gate-report-executors.js +218 -0
  21. package/dist/cli/gate-report-executors.js.map +1 -0
  22. package/dist/cli/gate-report-preview.d.ts +27 -0
  23. package/dist/cli/gate-report-preview.d.ts.map +1 -0
  24. package/dist/cli/gate-report-preview.js +286 -0
  25. package/dist/cli/gate-report-preview.js.map +1 -0
  26. package/dist/cli/gate-report-registry.d.ts +68 -0
  27. package/dist/cli/gate-report-registry.d.ts.map +1 -0
  28. package/dist/cli/gate-report-registry.js +52 -0
  29. package/dist/cli/gate-report-registry.js.map +1 -0
  30. package/dist/cli/gate-report-ruleset.d.ts +60 -0
  31. package/dist/cli/gate-report-ruleset.d.ts.map +1 -0
  32. package/dist/cli/gate-report-ruleset.js +132 -0
  33. package/dist/cli/gate-report-ruleset.js.map +1 -0
  34. package/dist/cli/gate-report-skip-jobs.d.ts +34 -0
  35. package/dist/cli/gate-report-skip-jobs.d.ts.map +1 -0
  36. package/dist/cli/gate-report-skip-jobs.js +42 -0
  37. package/dist/cli/gate-report-skip-jobs.js.map +1 -0
  38. package/dist/cli/gate-report-summary.d.ts +18 -0
  39. package/dist/cli/gate-report-summary.d.ts.map +1 -0
  40. package/dist/cli/gate-report-summary.js +80 -0
  41. package/dist/cli/gate-report-summary.js.map +1 -0
  42. package/dist/cli/gate-report-types.d.ts +206 -0
  43. package/dist/cli/gate-report-types.d.ts.map +1 -0
  44. package/dist/cli/gate-report-types.js +19 -0
  45. package/dist/cli/gate-report-types.js.map +1 -0
  46. package/dist/cli/gate-report.d.ts +35 -0
  47. package/dist/cli/gate-report.d.ts.map +1 -0
  48. package/dist/cli/gate-report.js +317 -0
  49. package/dist/cli/gate-report.js.map +1 -0
  50. package/dist/cli/ui-github-repo-gh.d.ts +14 -0
  51. package/dist/cli/ui-github-repo-gh.d.ts.map +1 -1
  52. package/dist/cli/ui-github-repo-gh.js +6 -1
  53. package/dist/cli/ui-github-repo-gh.js.map +1 -1
  54. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  55. package/dist/core/lisa-owned-hash-ledger.js +1 -0
  56. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  57. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  58. package/dist/core/upstream-evidence-manifest.js +19 -1
  59. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  60. package/package.json +1 -1
  61. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  63. package/plugins/lisa-agy/plugin.json +1 -1
  64. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  66. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  67. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  69. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  72. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  73. package/plugins/lisa-expo-agy/plugin.json +1 -1
  74. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  76. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  77. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  78. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  79. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  80. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  81. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  82. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  83. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  84. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  85. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  86. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  87. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  88. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  89. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  90. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  91. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  92. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  93. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  94. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  95. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  96. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  97. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  98. package/plugins/lisa-rails-agy/plugin.json +1 -1
  99. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  100. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  101. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  102. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  103. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  104. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  105. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  106. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  107. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  108. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  109. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  110. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
@@ -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":"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"}
@@ -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;AAoFD,sDAAsD;AACtD,eAAO,MAAM,wBAAwB,EAAE,iBA0EtC,CAAC"}
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"}