@codyswann/lisa 3.52.0 → 3.53.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-declared-contexts.d.ts +32 -0
- package/dist/cli/doctor-declared-contexts.d.ts.map +1 -0
- package/dist/cli/doctor-declared-contexts.js +144 -0
- package/dist/cli/doctor-declared-contexts.js.map +1 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +6 -0
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/gate-report-drift-section.d.ts +8 -0
- package/dist/cli/gate-report-drift-section.d.ts.map +1 -0
- package/dist/cli/gate-report-drift-section.js +68 -0
- package/dist/cli/gate-report-drift-section.js.map +1 -0
- package/dist/cli/gate-report-fragment.d.ts.map +1 -1
- package/dist/cli/gate-report-fragment.js +4 -0
- package/dist/cli/gate-report-fragment.js.map +1 -1
- package/dist/cli/gate-report-joins.d.ts +45 -0
- package/dist/cli/gate-report-joins.d.ts.map +1 -1
- package/dist/cli/gate-report-joins.js +56 -0
- package/dist/cli/gate-report-joins.js.map +1 -1
- package/dist/cli/gate-report-registry.d.ts +9 -0
- package/dist/cli/gate-report-registry.d.ts.map +1 -1
- package/dist/cli/gate-report-registry.js +15 -0
- package/dist/cli/gate-report-registry.js.map +1 -1
- package/dist/cli/gate-report-style.d.ts +1 -1
- package/dist/cli/gate-report-style.d.ts.map +1 -1
- package/dist/cli/gate-report-style.js +3 -0
- package/dist/cli/gate-report-style.js.map +1 -1
- package/dist/cli/gate-report-templates.d.ts +22 -0
- package/dist/cli/gate-report-templates.d.ts.map +1 -0
- package/dist/cli/gate-report-templates.js +110 -0
- package/dist/cli/gate-report-templates.js.map +1 -0
- package/dist/cli/gate-report-types.d.ts +19 -5
- package/dist/cli/gate-report-types.d.ts.map +1 -1
- package/dist/cli/gate-report-types.js.map +1 -1
- package/dist/cli/gate-report.d.ts +3 -0
- package/dist/cli/gate-report.d.ts.map +1 -1
- package/dist/cli/gate-report.js +26 -2
- package/dist/cli/gate-report.js.map +1 -1
- package/dist/core/gate-declaration-drift.d.ts +190 -0
- package/dist/core/gate-declaration-drift.d.ts.map +1 -0
- package/dist/core/gate-declaration-drift.js +300 -0
- package/dist/core/gate-declaration-drift.js.map +1 -0
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +12 -1
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/health/declared-checks-inspection.d.ts +48 -0
- package/dist/health/declared-checks-inspection.d.ts.map +1 -0
- package/dist/health/declared-checks-inspection.js +154 -0
- package/dist/health/declared-checks-inspection.js.map +1 -0
- package/dist/health/deterministic-inputs.d.ts +40 -0
- package/dist/health/deterministic-inputs.d.ts.map +1 -0
- package/dist/health/deterministic-inputs.js +71 -0
- package/dist/health/deterministic-inputs.js.map +1 -0
- package/dist/health/deterministic.d.ts.map +1 -1
- package/dist/health/deterministic.js +10 -45
- package/dist/health/deterministic.js.map +1 -1
- package/dist/health/ruleset-inspection.d.ts +27 -0
- package/dist/health/ruleset-inspection.d.ts.map +1 -1
- package/dist/health/ruleset-inspection.js +70 -0
- package/dist/health/ruleset-inspection.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/.codex-plugin/skills/lisa-doctor/SKILL.md +33 -1
- package/plugins/lisa/skills/lisa-doctor/SKILL.md +33 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-doctor/SKILL.md +33 -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-copilot/skills/lisa-doctor/SKILL.md +33 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/skills/lisa-doctor/SKILL.md +33 -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/plugins/src/base/skills/lisa-doctor/SKILL.md +33 -1
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hold the gates declaration against the ruleset that enforces it.
|
|
3
|
+
*
|
|
4
|
+
* Three surfaces answer "what must pass before this merges" — the project's
|
|
5
|
+
* `gates` declarations, the shipped ruleset template, and the live GitHub
|
|
6
|
+
* ruleset — and until this module existed no comparator joined the first to
|
|
7
|
+
* either of the others. `contextsFor()` derived contexts from declarations,
|
|
8
|
+
* `lisa health` compared template against live, and the two halves never met,
|
|
9
|
+
* so a declaration and the protection enforcing it could disagree indefinitely
|
|
10
|
+
* with every check green.
|
|
11
|
+
*
|
|
12
|
+
* Two properties are load-bearing, and both are structural rather than
|
|
13
|
+
* conventional:
|
|
14
|
+
*
|
|
15
|
+
* 1. **`off` and undeclared are different findings.** `off` is a decision that
|
|
16
|
+
* a property is not proved here, so protection requiring it is a live
|
|
17
|
+
* contradiction. Undeclared is silence — the registry still has gates whose
|
|
18
|
+
* jobs run with no declaration at all, so silence must never be read as
|
|
19
|
+
* "not required", and must never justify removing live protection.
|
|
20
|
+
* 2. **Agreement is not proof.** A `matched` verdict means the declaration and
|
|
21
|
+
* the ruleset name the same required context. It says nothing about whether
|
|
22
|
+
* that context proves anything: one required context in this repository
|
|
23
|
+
* ships a skip step printing "This job going green does NOT mean any
|
|
24
|
+
* ast-grep rule has test coverage", and a required review context has gone
|
|
25
|
+
* green carrying "Review skipped". A drift report that could not tell
|
|
26
|
+
* "agreed and proved" from "agreed and unproved" would itself be a control
|
|
27
|
+
* reporting more than it measured, so the word this module uses is
|
|
28
|
+
* `matched` — the two surfaces agree — and never `enforced` or `proved`.
|
|
29
|
+
* 3. **No remedy in this module can say "remove the context".** Third-party
|
|
30
|
+
* contexts are enforced by construction and declared by nobody; a
|
|
31
|
+
* comparator whose vocabulary contained a removal would eventually propose
|
|
32
|
+
* deleting one. The `DriftRemedy` union simply has no such member, so the
|
|
33
|
+
* guarantee holds for every caller rather than for the careful ones.
|
|
34
|
+
* @module core/gate-declaration-drift
|
|
35
|
+
*/
|
|
36
|
+
/** The moment a branch ruleset guards. */
|
|
37
|
+
export const MERGE_MOMENT = "pull-request";
|
|
38
|
+
/** Every verdict, named once so no two mentions can drift apart. */
|
|
39
|
+
const MATCHED = "matched";
|
|
40
|
+
const DECLARED_NOT_ENFORCED = "declared-not-enforced";
|
|
41
|
+
const ENFORCED_DECLARED_OPTIONAL = "enforced-declared-optional";
|
|
42
|
+
const ENFORCED_DECLARED_OFF = "enforced-declared-off";
|
|
43
|
+
const ENFORCED_UNDECLARED = "enforced-undeclared";
|
|
44
|
+
const ENFORCED_NOT_LISA_OWNED = "enforced-not-lisa-owned";
|
|
45
|
+
/** Verdicts where the two surfaces state opposite things. */
|
|
46
|
+
const CONTRADICTIONS = new Set([
|
|
47
|
+
DECLARED_NOT_ENFORCED,
|
|
48
|
+
ENFORCED_DECLARED_OFF,
|
|
49
|
+
]);
|
|
50
|
+
/** Verdicts where one surface is silent rather than contrary. */
|
|
51
|
+
const GAPS = new Set([
|
|
52
|
+
ENFORCED_DECLARED_OPTIONAL,
|
|
53
|
+
ENFORCED_UNDECLARED,
|
|
54
|
+
]);
|
|
55
|
+
/** The remedy each verdict calls for. */
|
|
56
|
+
const REMEDIES = {
|
|
57
|
+
[MATCHED]: "none",
|
|
58
|
+
[DECLARED_NOT_ENFORCED]: "enforce-the-context",
|
|
59
|
+
[ENFORCED_DECLARED_OPTIONAL]: "decide-which-surface-wins",
|
|
60
|
+
[ENFORCED_DECLARED_OFF]: "resolve-the-contradiction",
|
|
61
|
+
[ENFORCED_UNDECLARED]: "declare-the-gate",
|
|
62
|
+
[ENFORCED_NOT_LISA_OWNED]: "none",
|
|
63
|
+
};
|
|
64
|
+
/** Every verdict, so a count of zero is still a stated zero. */
|
|
65
|
+
const VERDICTS = Object.keys(REMEDIES);
|
|
66
|
+
/** How the enforcing surface is named in a sentence. */
|
|
67
|
+
const SURFACE_NAMES = {
|
|
68
|
+
"ruleset-templates": "the shipped ruleset template",
|
|
69
|
+
"live-ruleset": "the live branch-protection ruleset",
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Sort strings the same way everywhere, so two runs emit the same bytes.
|
|
73
|
+
* @param values - Caller-owned strings
|
|
74
|
+
* @returns A sorted copy
|
|
75
|
+
*/
|
|
76
|
+
function sorted(values) {
|
|
77
|
+
return [...values].sort((left, right) => left.localeCompare(right));
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* The declaration state one resolved level names.
|
|
81
|
+
*
|
|
82
|
+
* Anything that is not one of the three levels is `not-declared`, because an
|
|
83
|
+
* unknown level is a typo rather than a claim.
|
|
84
|
+
* @param level - The resolved level
|
|
85
|
+
* @returns The declaration state
|
|
86
|
+
*/
|
|
87
|
+
function asDeclaration(level) {
|
|
88
|
+
return level === "required" || level === "optional" || level === "off"
|
|
89
|
+
? level
|
|
90
|
+
: "not-declared";
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Map every context a registry gate can produce to that gate.
|
|
94
|
+
*
|
|
95
|
+
* Built from the whole registry rather than from the declared gates, which is
|
|
96
|
+
* the difference between "protection requires a context whose gate nobody
|
|
97
|
+
* declared" and "protection requires a context Lisa knows nothing about". Those
|
|
98
|
+
* are different findings with different remedies, and a map built only from
|
|
99
|
+
* declarations could not tell them apart.
|
|
100
|
+
* @param options - Inputs
|
|
101
|
+
* @param options.registry - The shipped registry
|
|
102
|
+
* @param options.gates - The project's gates block
|
|
103
|
+
* @param options.workflowName - The workflow whose name prefixes a context
|
|
104
|
+
* @returns Context string to owning gate
|
|
105
|
+
*/
|
|
106
|
+
export function contextOwners(options) {
|
|
107
|
+
const { registry, gates, workflowName } = options;
|
|
108
|
+
const resolved = resolveMergeMoment(registry, gates);
|
|
109
|
+
const family = registry.momentFamily(MERGE_MOMENT);
|
|
110
|
+
const owners = Object.entries(registry.REGISTRY).map(([gateId, definition]) => {
|
|
111
|
+
const hit = resolved.get(gateId);
|
|
112
|
+
return [
|
|
113
|
+
`${workflowName} / ${definition.label}`,
|
|
114
|
+
{
|
|
115
|
+
gateId,
|
|
116
|
+
declaration: asDeclaration(hit?.level),
|
|
117
|
+
legalAtMerge: definition.moments.includes(family),
|
|
118
|
+
},
|
|
119
|
+
];
|
|
120
|
+
});
|
|
121
|
+
const awaited = [...resolved.values()].flatMap(hit => hit.mode === "await" && hit.awaits !== null
|
|
122
|
+
? [
|
|
123
|
+
[
|
|
124
|
+
hit.awaits,
|
|
125
|
+
{
|
|
126
|
+
gateId: hit.id,
|
|
127
|
+
declaration: asDeclaration(hit.level),
|
|
128
|
+
legalAtMerge: registry.REGISTRY[hit.id]?.moments.includes(family) === true,
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
]
|
|
132
|
+
: []);
|
|
133
|
+
return new Map([...owners, ...awaited]);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Resolve the merge moment, treating a refusal as "nothing resolved".
|
|
137
|
+
*
|
|
138
|
+
* A refusal is never swallowed by the caller: `readTemplateEnforcement` and the
|
|
139
|
+
* health check both report the declaration problems separately. What must not
|
|
140
|
+
* happen here is a throw that turns a comparison into no comparison at all.
|
|
141
|
+
* @param registry - The shipped registry
|
|
142
|
+
* @param gates - The project's gates block
|
|
143
|
+
* @returns Resolved gates keyed by id
|
|
144
|
+
*/
|
|
145
|
+
function resolveMergeMoment(registry, gates) {
|
|
146
|
+
try {
|
|
147
|
+
return new Map(registry
|
|
148
|
+
.resolveMoment({ gates, moment: MERGE_MOMENT, includeOff: true })
|
|
149
|
+
.map(entry => [entry.id, { ...entry }]));
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return new Map();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* The contexts a `required` declaration promises protection will require.
|
|
157
|
+
* @param owners - Context to owning gate
|
|
158
|
+
* @returns The contexts, sorted
|
|
159
|
+
*/
|
|
160
|
+
export function declaredRequiredContexts(owners) {
|
|
161
|
+
return sorted([...owners.entries()]
|
|
162
|
+
.filter(([, owner]) => owner.declaration === "required")
|
|
163
|
+
.map(([context]) => context));
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* The verdict for one enforced context.
|
|
167
|
+
* @param owner - The gate producing it, when one does
|
|
168
|
+
* @returns The verdict
|
|
169
|
+
*/
|
|
170
|
+
function verdictForEnforced(owner) {
|
|
171
|
+
if (owner === undefined)
|
|
172
|
+
return ENFORCED_NOT_LISA_OWNED;
|
|
173
|
+
if (owner.declaration === "required")
|
|
174
|
+
return MATCHED;
|
|
175
|
+
if (owner.declaration === "optional")
|
|
176
|
+
return ENFORCED_DECLARED_OPTIONAL;
|
|
177
|
+
if (owner.declaration === "off")
|
|
178
|
+
return ENFORCED_DECLARED_OFF;
|
|
179
|
+
return ENFORCED_UNDECLARED;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* The sentence one verdict is explained with.
|
|
183
|
+
* @param options - Inputs
|
|
184
|
+
* @param options.verdict - The verdict
|
|
185
|
+
* @param options.surface - The enforcing surface
|
|
186
|
+
* @param options.gateId - The owning gate, when there is one
|
|
187
|
+
* @param options.sources - Where the requirement was read from
|
|
188
|
+
* @returns One operator-readable sentence
|
|
189
|
+
*/
|
|
190
|
+
// eslint-disable-next-line sonarjs/cognitive-complexity -- one branch per verdict keeps the wording auditable
|
|
191
|
+
function detailFor(options) {
|
|
192
|
+
const { verdict, gateId, sources } = options;
|
|
193
|
+
const surface = SURFACE_NAMES[options.surface];
|
|
194
|
+
const where = sources.length === 0 ? "" : ` (${sources.join(", ")})`;
|
|
195
|
+
if (verdict === MATCHED) {
|
|
196
|
+
return `Declared required, and ${surface} requires it${where}. The two surfaces agree; that is not evidence the check proves its property.`;
|
|
197
|
+
}
|
|
198
|
+
if (verdict === DECLARED_NOT_ENFORCED) {
|
|
199
|
+
return `The settings file declares "${String(gateId)}" required at ${MERGE_MOMENT}, but ${surface} does not require this context, so the declaration blocks nothing.`;
|
|
200
|
+
}
|
|
201
|
+
if (verdict === ENFORCED_DECLARED_OPTIONAL) {
|
|
202
|
+
return `${surface} requires this context${where}, while the settings file declares "${String(gateId)}" optional at ${MERGE_MOMENT}. Two surfaces, two answers — name which one wins.`;
|
|
203
|
+
}
|
|
204
|
+
if (verdict === ENFORCED_DECLARED_OFF) {
|
|
205
|
+
return `The settings file declares "${String(gateId)}" off at ${MERGE_MOMENT} — an explicit decision not to prove it here — yet ${surface} requires this context${where}. That is a contradiction, not a gap.`;
|
|
206
|
+
}
|
|
207
|
+
if (verdict === ENFORCED_UNDECLARED) {
|
|
208
|
+
return `${surface} requires this context${where}, and it is produced by the gate "${String(gateId)}", which the settings file never declares at any moment. Undeclared is silence, not permission to stop requiring it.`;
|
|
209
|
+
}
|
|
210
|
+
return `${surface} requires this context${where}, and no gate in Lisa's registry produces it — it comes from a third-party app or from a job this project's own CI defines. Matching is on the exact context string, never on a job name that merely resembles it: a third-party app status and a Lisa job with a similar name are different things, and treating them as one produces a false drift report, or worse a false clean one. Reported so it can be told apart from a Lisa gate that fell out of the settings file, never so it can be removed.`;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Group enforced contexts, keeping every ruleset and source that named one.
|
|
214
|
+
* @param enforced - Enforced contexts, possibly repeating a context
|
|
215
|
+
* @returns Context to its rulesets and sources
|
|
216
|
+
*/
|
|
217
|
+
function groupEnforced(enforced) {
|
|
218
|
+
return enforced.reduce((grouped, entry) => {
|
|
219
|
+
const existing = grouped.get(entry.context) ?? {
|
|
220
|
+
rulesets: [],
|
|
221
|
+
sources: [],
|
|
222
|
+
};
|
|
223
|
+
return new Map(grouped).set(entry.context, {
|
|
224
|
+
rulesets: [...existing.rulesets, entry.ruleset],
|
|
225
|
+
sources: [...existing.sources, entry.source],
|
|
226
|
+
});
|
|
227
|
+
}, new Map());
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Compare a project's declarations with one enforcing surface.
|
|
231
|
+
*
|
|
232
|
+
* Total and pure — the same inputs always produce the same entries in the same
|
|
233
|
+
* order. Reaching the surface is the caller's job, and a caller that could not
|
|
234
|
+
* reach it must report an unknown rather than call this with an empty list: a
|
|
235
|
+
* comparison against nothing would report every declaration as unenforced,
|
|
236
|
+
* which is a different and false claim.
|
|
237
|
+
* @param options - Inputs
|
|
238
|
+
* @param options.surface - Which surface `enforced` was read from
|
|
239
|
+
* @param options.owners - Context to owning gate
|
|
240
|
+
* @param options.enforced - Contexts the surface requires
|
|
241
|
+
* @returns The comparison
|
|
242
|
+
*/
|
|
243
|
+
export function classifyDeclarationDrift(options) {
|
|
244
|
+
const { surface, owners, enforced } = options;
|
|
245
|
+
const grouped = groupEnforced(enforced);
|
|
246
|
+
const enforcedEntries = sorted(grouped.keys()).map((context) => {
|
|
247
|
+
const owner = owners.get(context);
|
|
248
|
+
const verdict = verdictForEnforced(owner);
|
|
249
|
+
const found = grouped.get(context);
|
|
250
|
+
const sources = sorted(new Set(found?.sources ?? []));
|
|
251
|
+
return {
|
|
252
|
+
context,
|
|
253
|
+
verdict,
|
|
254
|
+
remedy: REMEDIES[verdict],
|
|
255
|
+
gateId: owner?.gateId ?? null,
|
|
256
|
+
declaration: owner?.declaration ?? null,
|
|
257
|
+
rulesets: sorted(new Set(found?.rulesets ?? [])),
|
|
258
|
+
sources,
|
|
259
|
+
detail: detailFor({
|
|
260
|
+
verdict,
|
|
261
|
+
surface,
|
|
262
|
+
gateId: owner?.gateId ?? null,
|
|
263
|
+
sources,
|
|
264
|
+
}),
|
|
265
|
+
};
|
|
266
|
+
});
|
|
267
|
+
const unenforced = declaredRequiredContexts(owners)
|
|
268
|
+
.filter(context => !grouped.has(context))
|
|
269
|
+
.map((context) => {
|
|
270
|
+
const gateId = owners.get(context)?.gateId ?? null;
|
|
271
|
+
return {
|
|
272
|
+
context,
|
|
273
|
+
verdict: DECLARED_NOT_ENFORCED,
|
|
274
|
+
remedy: REMEDIES[DECLARED_NOT_ENFORCED],
|
|
275
|
+
gateId,
|
|
276
|
+
declaration: "required",
|
|
277
|
+
rulesets: [],
|
|
278
|
+
sources: [],
|
|
279
|
+
detail: detailFor({
|
|
280
|
+
verdict: DECLARED_NOT_ENFORCED,
|
|
281
|
+
surface,
|
|
282
|
+
gateId,
|
|
283
|
+
sources: [],
|
|
284
|
+
}),
|
|
285
|
+
};
|
|
286
|
+
});
|
|
287
|
+
const entries = [...enforcedEntries, ...unenforced].sort((left, right) => left.context.localeCompare(right.context));
|
|
288
|
+
return {
|
|
289
|
+
surface,
|
|
290
|
+
entries,
|
|
291
|
+
counts: Object.fromEntries(VERDICTS.map(verdict => [
|
|
292
|
+
verdict,
|
|
293
|
+
entries.filter(entry => entry.verdict === verdict).length,
|
|
294
|
+
])),
|
|
295
|
+
contradictions: entries.filter(entry => CONTRADICTIONS.has(entry.verdict))
|
|
296
|
+
.length,
|
|
297
|
+
gaps: entries.filter(entry => GAPS.has(entry.verdict)).length,
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
//# sourceMappingURL=gate-declaration-drift.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-declaration-drift.js","sourceRoot":"","sources":["../../src/core/gate-declaration-drift.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,CAg3EpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,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,CAg3EpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CA65OjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,CAAC"}
|
|
@@ -521,7 +521,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
521
521
|
"plugins/src/base/skills/lisa-detect-tooling/SKILL.md": "6ea2b1404d5c27f8a5bec8c90ad35ed0124789b70c091869455f538a2a9debbe",
|
|
522
522
|
"plugins/src/base/skills/lisa-detect-tooling/scripts/commands.mjs": "e28bd61fdde4a336b56ae3395423026943a5816015719d31d04f0d5a0ab50eec",
|
|
523
523
|
"plugins/src/base/skills/lisa-detect-tooling/scripts/detect-tooling.mjs": "d9419814fc04c935bd7e320e85b1977c9bfc9275d9ea5fb557002ad438ee7925",
|
|
524
|
-
"plugins/src/base/skills/lisa-doctor/SKILL.md": "
|
|
524
|
+
"plugins/src/base/skills/lisa-doctor/SKILL.md": "83fd779c341108729a926bc2680d54f0b69044137840b1d80d660243a7f74ba5",
|
|
525
525
|
"plugins/src/base/skills/lisa-drive-pr-to-merge/SKILL.md": "e27849a2567081bce5ea3aa31f7cc5868f884a59c343c685b900ac7aa707666a",
|
|
526
526
|
"plugins/src/base/skills/lisa-epic-triage/SKILL.md": "d02760411249bddbd396f283191fe3e82bb7b95bf9393a19a7025dc5a57c3ab7",
|
|
527
527
|
"plugins/src/base/skills/lisa-evaluation-suite/SKILL.md": "96b5c2091ccd22a565935a7b0b917f67998881b81055ce3e4d518319472eac8b",
|
|
@@ -7110,6 +7110,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7110
7110
|
"src/cli/cross-pollinate-nudge.ts": true,
|
|
7111
7111
|
"src/cli/doctor-apply-failure.ts": true,
|
|
7112
7112
|
"src/cli/doctor-apply-freshness.ts": true,
|
|
7113
|
+
"src/cli/doctor-declared-contexts.ts": true,
|
|
7113
7114
|
"src/cli/doctor-gate-recommendation.ts": true,
|
|
7114
7115
|
"src/cli/doctor-hook-copy-parity.ts": true,
|
|
7115
7116
|
"src/cli/doctor-kane.ts": true,
|
|
@@ -7174,6 +7175,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7174
7175
|
"src/cli/gate-report-cells.ts": true,
|
|
7175
7176
|
"src/cli/gate-report-config.ts": true,
|
|
7176
7177
|
"src/cli/gate-report-contexts.ts": true,
|
|
7178
|
+
"src/cli/gate-report-drift-section.ts": true,
|
|
7177
7179
|
"src/cli/gate-report-executors.ts": true,
|
|
7178
7180
|
"src/cli/gate-report-facade.ts": true,
|
|
7179
7181
|
"src/cli/gate-report-fragment.ts": true,
|
|
@@ -7188,6 +7190,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7188
7190
|
"src/cli/gate-report-skip-jobs.ts": true,
|
|
7189
7191
|
"src/cli/gate-report-style.ts": true,
|
|
7190
7192
|
"src/cli/gate-report-summary.ts": true,
|
|
7193
|
+
"src/cli/gate-report-templates.ts": true,
|
|
7191
7194
|
"src/cli/gate-report-types.ts": true,
|
|
7192
7195
|
"src/cli/gate-report-upstream.ts": true,
|
|
7193
7196
|
"src/cli/gate-report.ts": true,
|
|
@@ -7300,6 +7303,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7300
7303
|
"src/core/config.ts": true,
|
|
7301
7304
|
"src/core/downstream-names.ts": true,
|
|
7302
7305
|
"src/core/downstream-references.ts": true,
|
|
7306
|
+
"src/core/gate-declaration-drift.ts": true,
|
|
7303
7307
|
"src/core/git-service.ts": true,
|
|
7304
7308
|
"src/core/guard-capabilities.ts": true,
|
|
7305
7309
|
"src/core/hook-copy-parity.ts": true,
|
|
@@ -7361,6 +7365,8 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7361
7365
|
"src/health/consumer.ts": true,
|
|
7362
7366
|
"src/health/contract.ts": true,
|
|
7363
7367
|
"src/health/deadline.ts": true,
|
|
7368
|
+
"src/health/declared-checks-inspection.ts": true,
|
|
7369
|
+
"src/health/deterministic-inputs.ts": true,
|
|
7364
7370
|
"src/health/deterministic.ts": true,
|
|
7365
7371
|
"src/health/drift-tickets.ts": true,
|
|
7366
7372
|
"src/health/evaluation-protocol.ts": true,
|
|
@@ -7660,6 +7666,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7660
7666
|
"tests/unit/cli/check-learnings-budget-cmd.test.ts": true,
|
|
7661
7667
|
"tests/unit/cli/doctor-apply-failure.test.ts": true,
|
|
7662
7668
|
"tests/unit/cli/doctor-apply-freshness.test.ts": true,
|
|
7669
|
+
"tests/unit/cli/doctor-declared-contexts.test.ts": true,
|
|
7663
7670
|
"tests/unit/cli/doctor-gate-recommendation.test.ts": true,
|
|
7664
7671
|
"tests/unit/cli/doctor-hook-copy-parity.test.ts": true,
|
|
7665
7672
|
"tests/unit/cli/doctor-kane.test.ts": true,
|
|
@@ -7715,8 +7722,10 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7715
7722
|
"tests/unit/cli/file-upstream-contract.test.ts": true,
|
|
7716
7723
|
"tests/unit/cli/gate-commands.test.ts": true,
|
|
7717
7724
|
"tests/unit/cli/gate-report-attribution.test.ts": true,
|
|
7725
|
+
"tests/unit/cli/gate-report-declaration-drift.test.ts": true,
|
|
7718
7726
|
"tests/unit/cli/gate-report-executors.test.ts": true,
|
|
7719
7727
|
"tests/unit/cli/gate-report-fixtures.ts": true,
|
|
7728
|
+
"tests/unit/cli/gate-report-preview-escaping.test.ts": true,
|
|
7720
7729
|
"tests/unit/cli/gate-report-preview.test.ts": true,
|
|
7721
7730
|
"tests/unit/cli/gate-report-ruleset.test.ts": true,
|
|
7722
7731
|
"tests/unit/cli/gate-report-states.test.ts": true,
|
|
@@ -7856,6 +7865,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7856
7865
|
"tests/unit/core/bootstrap-environment.test.ts": true,
|
|
7857
7866
|
"tests/unit/core/fs-extra-namespace-callsites.test.ts": true,
|
|
7858
7867
|
"tests/unit/core/fs-extra-namespace-members.test.ts": true,
|
|
7868
|
+
"tests/unit/core/gate-declaration-drift.test.ts": true,
|
|
7859
7869
|
"tests/unit/core/hook-copy-parity.test.ts": true,
|
|
7860
7870
|
"tests/unit/core/host-rules-parity.test.ts": true,
|
|
7861
7871
|
"tests/unit/core/host-rules-pointer.test.ts": true,
|
|
@@ -7913,6 +7923,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7913
7923
|
"tests/unit/health/consumer.test.ts": true,
|
|
7914
7924
|
"tests/unit/health/contract.test.ts": true,
|
|
7915
7925
|
"tests/unit/health/deadline.test.ts": true,
|
|
7926
|
+
"tests/unit/health/declared-checks.test.ts": true,
|
|
7916
7927
|
"tests/unit/health/deterministic-regressions.test.ts": true,
|
|
7917
7928
|
"tests/unit/health/deterministic.test.ts": true,
|
|
7918
7929
|
"tests/unit/health/drift-tickets.test.ts": true,
|