@codyswann/lisa 3.51.7 → 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 +17 -4
- 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/expo/package-lisa/package.lisa.json +3 -1
- package/nestjs/package-lisa/package.lisa.json +2 -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
- package/typescript/package-lisa/package.lisa.json +8 -1
|
@@ -15,5 +15,5 @@
|
|
|
15
15
|
* @module cli/gate-report-style
|
|
16
16
|
*/
|
|
17
17
|
/** The scoped stylesheet. */
|
|
18
|
-
export declare const GATE_REPORT_STYLE = "\n.lisa-gate-report{\n--lgr-ink:var(--ink,#e6e9f2);--lgr-dim:var(--muted,#98a0b5);--lgr-faint:var(--faint,#6b7280);\n--lgr-panel:var(--surface,#161923);--lgr-panel2:var(--surface2,#1b2030);--lgr-line:var(--line,#252a38);\n--lgr-accent:var(--accent,#58a6ff);--lgr-good:var(--good,#22773c);--lgr-good-soft:var(--good-soft,#123021);\n--lgr-warn:var(--warn,#93610a);--lgr-warn-soft:var(--warn-soft,#3a2c12);\n--lgr-crit:var(--crit,#b3372c);--lgr-crit-soft:var(--crit-soft,#3a1616);\n--lgr-mono:var(--mono,ui-monospace,monospace);\ncolor:var(--lgr-ink);font-size:14px;line-height:1.55}\n.lisa-gate-report h2{font-size:18px;margin:34px 0 6px;padding-top:20px;border-top:1px solid var(--lgr-line)}\n.lisa-gate-report h3{font-size:12.5px;margin:0 0 4px;text-transform:uppercase;letter-spacing:.06em;color:var(--lgr-dim)}\n.lisa-gate-report p{margin:0 0 14px}\n.lisa-gate-report .lgr-lede,.lisa-gate-report .lgr-sub{color:var(--lgr-dim);max-width:86ch}\n.lisa-gate-report .lgr-stats{display:flex;flex-wrap:wrap;gap:12px;margin:16px 0 12px}\n.lisa-gate-report .lgr-stat{background:var(--lgr-panel);border:1px solid var(--lgr-line);\nborder-radius:10px;padding:12px 16px;min-width:170px}\n.lisa-gate-report .lgr-stat b{display:block;font-size:26px;line-height:1.1}\n.lisa-gate-report .lgr-stat span{color:var(--lgr-dim);font-size:12.5px}\n.lisa-gate-report .lgr-denominator{background:var(--lgr-panel);border:1px solid var(--lgr-line);\nborder-left:3px solid var(--lgr-accent);border-radius:8px;padding:12px 16px;max-width:100ch}\n.lisa-gate-report .lgr-legend{display:flex;flex-wrap:wrap;gap:8px 18px;margin:14px 0;\ncolor:var(--lgr-dim);font-size:12.5px}\n.lisa-gate-report .lgr-legend>span{display:flex;align-items:center;gap:6px}\n.lisa-gate-report .lgr-scroll{overflow-x:auto;border:1px solid var(--lgr-line);border-radius:10px}\n.lisa-gate-report table{border-collapse:collapse;width:100%;font-size:12.5px;background:var(--lgr-panel)}\n.lisa-gate-report th,.lisa-gate-report td{text-align:left;padding:9px 11px;\nborder-bottom:1px solid var(--lgr-line);vertical-align:top}\n.lisa-gate-report th{background:var(--lgr-panel2);font-size:11px;text-transform:uppercase;\nletter-spacing:.05em;color:var(--lgr-dim)}\n.lisa-gate-report th.lgr-m,.lisa-gate-report td.lgr-m{text-align:center;white-space:nowrap}\n.lisa-gate-report td.lgr-illegal{background:repeating-linear-gradient(45deg,transparent,transparent 5px,\nvar(--lgr-panel2) 5px,var(--lgr-panel2) 10px)}\n.lisa-gate-report .lgr-gid{display:block;font-family:var(--lgr-mono);font-size:12px;color:var(--lgr-accent)}\n.lisa-gate-report .lgr-glabel{display:block;color:var(--lgr-dim);font-size:12px}\n.lisa-gate-report .lgr-offaxis{margin-top:4px;color:var(--lgr-faint);font-size:11px;font-style:italic}\n.lisa-gate-report .lgr-proves{color:var(--lgr-dim);max-width:34ch}\n.lisa-gate-report code{font-family:var(--lgr-mono);font-size:11.5px;background:var(--lgr-panel2);\nborder:1px solid var(--lgr-line);border-radius:4px;padding:1px 5px}\n.lisa-gate-report .lgr-prov{margin-top:5px;font-size:11px;color:var(--lgr-dim)}\n.lisa-gate-report .lgr-provword{font-weight:700;color:var(--lgr-ink)}\n.lisa-gate-report .lgr-under{margin-top:4px;font-size:11px;color:var(--lgr-dim)}\n.lisa-gate-report .lgr-tier3{margin-top:5px;font-size:11px;color:var(--lgr-faint)}\n.lisa-gate-report .lgr-state{display:inline-block;font-size:11px;border-radius:5px;padding:2px 7px;font-weight:600}\n.lisa-gate-report .lgr-required{background:var(--lgr-good-soft);color:var(--lgr-good)}\n.lisa-gate-report .lgr-optional{background:var(--lgr-warn-soft);color:var(--lgr-warn)}\n.lisa-gate-report .lgr-off{background:var(--lgr-crit-soft);color:var(--lgr-crit)}\n.lisa-gate-report .lgr-undeclared{background:var(--lgr-panel2);color:var(--lgr-faint);border:1px dashed var(--lgr-line)}\n.lisa-gate-report .lgr-chip{display:inline-block;margin-left:5px;font-size:10.5px;border-radius:4px;\npadding:1px 5px;font-weight:600;vertical-align:1px}\n.lisa-gate-report .lgr-b-A,.lisa-gate-report .lgr-ok,.lisa-gate-report .lgr-yes-merge{\nbackground:var(--lgr-good-soft);color:var(--lgr-good)}\n.lisa-gate-report .lgr-b-B,.lisa-gate-report .lgr-other-merge{background:var(--lgr-warn-soft);color:var(--lgr-warn)}\n.lisa-gate-report .lgr-b-C,.lisa-gate-report .lgr-bad{background:var(--lgr-crit-soft);color:var(--lgr-crit)}\n.lisa-gate-report .lgr-b-D,.lisa-gate-report .lgr-none,.lisa-gate-report .lgr-no-merge{\nbackground:var(--lgr-panel2);color:var(--lgr-faint)}\n.lisa-gate-report .lgr-foreign{background:var(--lgr-panel2);color:var(--lgr-accent);border:1px solid var(--lgr-accent)}\n.lisa-gate-report .lgr-unknown{background:repeating-linear-gradient(45deg,var(--lgr-panel2),\nvar(--lgr-panel2) 3px,var(--lgr-panel) 3px,var(--lgr-panel) 6px);\ncolor:var(--lgr-dim);border:1px dashed var(--lgr-line)}\n.lisa-gate-report .lgr-note{background:repeating-linear-gradient(45deg,var(--lgr-panel2),\nvar(--lgr-panel2) 4px,var(--lgr-panel) 4px,var(--lgr-panel) 8px);\nborder:1px dashed var(--lgr-line);border-radius:8px;padding:14px 16px;color:var(--lgr-ink)}\n.lisa-gate-report .lgr-cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:14px;margin-bottom:14px}\n.lisa-gate-report .lgr-cols>div{background:var(--lgr-panel);border:1px solid var(--lgr-line);\nborder-radius:10px;padding:14px 16px}\n.lisa-gate-report .lgr-sharp,.lisa-gate-report .lgr-origin-lisa-undeclared{border-color:var(--lgr-crit)}\n.lisa-gate-report .lgr-origin-third-party{border-color:var(--lgr-accent)}\n.lisa-gate-report .lgr-cols p{color:var(--lgr-dim);font-size:12px;margin:0 0 8px}\n.lisa-gate-report .lgr-cols ul{margin:0;padding-left:18px}\n.lisa-gate-report .lgr-cols li{margin:3px 0;font-size:12.5px}\n.lisa-gate-report .lgr-count{float:right;color:var(--lgr-ink);font-size:13px}\n.lisa-gate-report .lgr-upstream{background:var(--lgr-panel);border:1px solid var(--lgr-line);\nborder-left:3px solid var(--lgr-accent);border-radius:10px;padding:14px 16px;margin-bottom:12px}\n.lisa-gate-report .lgr-upstream h3{text-transform:none;letter-spacing:0;font-size:14px;color:var(--lgr-ink)}\n.lisa-gate-report .lgr-upstream p{color:var(--lgr-dim);font-size:12.5px}\n.lisa-gate-report .lgr-upstream-meta{margin:0}\n.lisa-gate-report .lgr-foot{margin-top:32px;padding-top:16px;border-top:1px solid var(--lgr-line);\ncolor:var(--lgr-faint);font-size:12px}\n";
|
|
18
|
+
export declare const GATE_REPORT_STYLE = "\n.lisa-gate-report{\n--lgr-ink:var(--ink,#e6e9f2);--lgr-dim:var(--muted,#98a0b5);--lgr-faint:var(--faint,#6b7280);\n--lgr-panel:var(--surface,#161923);--lgr-panel2:var(--surface2,#1b2030);--lgr-line:var(--line,#252a38);\n--lgr-accent:var(--accent,#58a6ff);--lgr-good:var(--good,#22773c);--lgr-good-soft:var(--good-soft,#123021);\n--lgr-warn:var(--warn,#93610a);--lgr-warn-soft:var(--warn-soft,#3a2c12);\n--lgr-crit:var(--crit,#b3372c);--lgr-crit-soft:var(--crit-soft,#3a1616);\n--lgr-mono:var(--mono,ui-monospace,monospace);\ncolor:var(--lgr-ink);font-size:14px;line-height:1.55}\n.lisa-gate-report h2{font-size:18px;margin:34px 0 6px;padding-top:20px;border-top:1px solid var(--lgr-line)}\n.lisa-gate-report h3{font-size:12.5px;margin:0 0 4px;text-transform:uppercase;letter-spacing:.06em;color:var(--lgr-dim)}\n.lisa-gate-report p{margin:0 0 14px}\n.lisa-gate-report .lgr-lede,.lisa-gate-report .lgr-sub{color:var(--lgr-dim);max-width:86ch}\n.lisa-gate-report .lgr-stats{display:flex;flex-wrap:wrap;gap:12px;margin:16px 0 12px}\n.lisa-gate-report .lgr-stat{background:var(--lgr-panel);border:1px solid var(--lgr-line);\nborder-radius:10px;padding:12px 16px;min-width:170px}\n.lisa-gate-report .lgr-stat b{display:block;font-size:26px;line-height:1.1}\n.lisa-gate-report .lgr-stat span{color:var(--lgr-dim);font-size:12.5px}\n.lisa-gate-report .lgr-denominator{background:var(--lgr-panel);border:1px solid var(--lgr-line);\nborder-left:3px solid var(--lgr-accent);border-radius:8px;padding:12px 16px;max-width:100ch}\n.lisa-gate-report .lgr-legend{display:flex;flex-wrap:wrap;gap:8px 18px;margin:14px 0;\ncolor:var(--lgr-dim);font-size:12.5px}\n.lisa-gate-report .lgr-legend>span{display:flex;align-items:center;gap:6px}\n.lisa-gate-report .lgr-scroll{overflow-x:auto;border:1px solid var(--lgr-line);border-radius:10px}\n.lisa-gate-report table{border-collapse:collapse;width:100%;font-size:12.5px;background:var(--lgr-panel)}\n.lisa-gate-report th,.lisa-gate-report td{text-align:left;padding:9px 11px;\nborder-bottom:1px solid var(--lgr-line);vertical-align:top}\n.lisa-gate-report th{background:var(--lgr-panel2);font-size:11px;text-transform:uppercase;\nletter-spacing:.05em;color:var(--lgr-dim)}\n.lisa-gate-report th.lgr-m,.lisa-gate-report td.lgr-m{text-align:center;white-space:nowrap}\n.lisa-gate-report td.lgr-illegal{background:repeating-linear-gradient(45deg,transparent,transparent 5px,\nvar(--lgr-panel2) 5px,var(--lgr-panel2) 10px)}\n.lisa-gate-report .lgr-gid{display:block;font-family:var(--lgr-mono);font-size:12px;color:var(--lgr-accent)}\n.lisa-gate-report .lgr-glabel{display:block;color:var(--lgr-dim);font-size:12px}\n.lisa-gate-report .lgr-offaxis{margin-top:4px;color:var(--lgr-faint);font-size:11px;font-style:italic}\n.lisa-gate-report .lgr-proves{color:var(--lgr-dim);max-width:34ch}\n.lisa-gate-report code{font-family:var(--lgr-mono);font-size:11.5px;background:var(--lgr-panel2);\nborder:1px solid var(--lgr-line);border-radius:4px;padding:1px 5px}\n.lisa-gate-report .lgr-prov{margin-top:5px;font-size:11px;color:var(--lgr-dim)}\n.lisa-gate-report .lgr-provword{font-weight:700;color:var(--lgr-ink)}\n.lisa-gate-report .lgr-under{margin-top:4px;font-size:11px;color:var(--lgr-dim)}\n.lisa-gate-report .lgr-tier3{margin-top:5px;font-size:11px;color:var(--lgr-faint)}\n.lisa-gate-report .lgr-state{display:inline-block;font-size:11px;border-radius:5px;padding:2px 7px;font-weight:600}\n.lisa-gate-report .lgr-required{background:var(--lgr-good-soft);color:var(--lgr-good)}\n.lisa-gate-report .lgr-optional{background:var(--lgr-warn-soft);color:var(--lgr-warn)}\n.lisa-gate-report .lgr-off{background:var(--lgr-crit-soft);color:var(--lgr-crit)}\n.lisa-gate-report .lgr-undeclared{background:var(--lgr-panel2);color:var(--lgr-faint);border:1px dashed var(--lgr-line)}\n.lisa-gate-report .lgr-chip{display:inline-block;margin-left:5px;font-size:10.5px;border-radius:4px;\npadding:1px 5px;font-weight:600;vertical-align:1px}\n.lisa-gate-report .lgr-b-A,.lisa-gate-report .lgr-ok,.lisa-gate-report .lgr-yes-merge{\nbackground:var(--lgr-good-soft);color:var(--lgr-good)}\n.lisa-gate-report .lgr-b-B,.lisa-gate-report .lgr-other-merge{background:var(--lgr-warn-soft);color:var(--lgr-warn)}\n.lisa-gate-report .lgr-b-C,.lisa-gate-report .lgr-bad{background:var(--lgr-crit-soft);color:var(--lgr-crit)}\n.lisa-gate-report .lgr-b-D,.lisa-gate-report .lgr-none,.lisa-gate-report .lgr-no-merge{\nbackground:var(--lgr-panel2);color:var(--lgr-faint)}\n.lisa-gate-report .lgr-foreign{background:var(--lgr-panel2);color:var(--lgr-accent);border:1px solid var(--lgr-accent)}\n.lisa-gate-report .lgr-unknown{background:repeating-linear-gradient(45deg,var(--lgr-panel2),\nvar(--lgr-panel2) 3px,var(--lgr-panel) 3px,var(--lgr-panel) 6px);\ncolor:var(--lgr-dim);border:1px dashed var(--lgr-line)}\n.lisa-gate-report .lgr-note{background:repeating-linear-gradient(45deg,var(--lgr-panel2),\nvar(--lgr-panel2) 4px,var(--lgr-panel) 4px,var(--lgr-panel) 8px);\nborder:1px dashed var(--lgr-line);border-radius:8px;padding:14px 16px;color:var(--lgr-ink)}\n.lisa-gate-report .lgr-cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:14px;margin-bottom:14px}\n.lisa-gate-report .lgr-cols>div{background:var(--lgr-panel);border:1px solid var(--lgr-line);\nborder-radius:10px;padding:14px 16px}\n.lisa-gate-report .lgr-sharp,.lisa-gate-report .lgr-origin-lisa-undeclared{border-color:var(--lgr-crit)}\n.lisa-gate-report .lgr-origin-third-party{border-color:var(--lgr-accent)}\n.lisa-gate-report .lgr-cols p{color:var(--lgr-dim);font-size:12px;margin:0 0 8px}\n.lisa-gate-report .lgr-cols ul{margin:0;padding-left:18px}\n.lisa-gate-report .lgr-cols li{margin:3px 0;font-size:12.5px}\n.lisa-gate-report .lgr-count{float:right;color:var(--lgr-ink);font-size:13px}\n.lisa-gate-report .lgr-upstream{background:var(--lgr-panel);border:1px solid var(--lgr-line);\nborder-left:3px solid var(--lgr-accent);border-radius:10px;padding:14px 16px;margin-bottom:12px}\n.lisa-gate-report .lgr-upstream h3{text-transform:none;letter-spacing:0;font-size:14px;color:var(--lgr-ink)}\n.lisa-gate-report .lgr-upstream p{color:var(--lgr-dim);font-size:12.5px}\n.lisa-gate-report .lgr-upstream-meta{margin:0}\n.lisa-gate-report .lgr-foot{margin-top:32px;padding-top:16px;border-top:1px solid var(--lgr-line);\ncolor:var(--lgr-faint);font-size:12px}\n.lisa-gate-report .lgr-surface{margin:18px 0 8px;color:var(--lgr-ink);\ntext-transform:none;letter-spacing:0;font-size:14px}\n.lisa-gate-report .lgr-why{color:var(--lgr-dim);font-size:11.5px;margin:3px 0 8px}\n";
|
|
19
19
|
//# sourceMappingURL=gate-report-style.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate-report-style.d.ts","sourceRoot":"","sources":["../../src/cli/gate-report-style.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,6BAA6B;AAC7B,eAAO,MAAM,iBAAiB,
|
|
1
|
+
{"version":3,"file":"gate-report-style.d.ts","sourceRoot":"","sources":["../../src/cli/gate-report-style.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,6BAA6B;AAC7B,eAAO,MAAM,iBAAiB,w6MAiF7B,CAAC"}
|
|
@@ -93,5 +93,8 @@ border-left:3px solid var(--lgr-accent);border-radius:10px;padding:14px 16px;mar
|
|
|
93
93
|
.lisa-gate-report .lgr-upstream-meta{margin:0}
|
|
94
94
|
.lisa-gate-report .lgr-foot{margin-top:32px;padding-top:16px;border-top:1px solid var(--lgr-line);
|
|
95
95
|
color:var(--lgr-faint);font-size:12px}
|
|
96
|
+
.lisa-gate-report .lgr-surface{margin:18px 0 8px;color:var(--lgr-ink);
|
|
97
|
+
text-transform:none;letter-spacing:0;font-size:14px}
|
|
98
|
+
.lisa-gate-report .lgr-why{color:var(--lgr-dim);font-size:11.5px;margin:3px 0 8px}
|
|
96
99
|
`;
|
|
97
100
|
//# sourceMappingURL=gate-report-style.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate-report-style.js","sourceRoot":"","sources":["../../src/cli/gate-report-style.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,6BAA6B;AAC7B,MAAM,CAAC,MAAM,iBAAiB,GAAG
|
|
1
|
+
{"version":3,"file":"gate-report-style.js","sourceRoot":"","sources":["../../src/cli/gate-report-style.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,6BAA6B;AAC7B,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiFhC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { EnforcedContext } from "../core/gate-declaration-drift.js";
|
|
2
|
+
import type { Finding } from "./gate-report-types.js";
|
|
3
|
+
/** Reads the contexts the shipped templates require. Injectable for tests. */
|
|
4
|
+
export type TemplateEnforcementReader = (projectRoot: string) => Promise<readonly EnforcedContext[]>;
|
|
5
|
+
/**
|
|
6
|
+
* The default reader: the shipped templates, normalized as apply normalizes.
|
|
7
|
+
* @param projectRoot - Project root
|
|
8
|
+
* @returns The contexts the templates require
|
|
9
|
+
*/
|
|
10
|
+
export declare const defaultTemplateEnforcementReader: TemplateEnforcementReader;
|
|
11
|
+
/**
|
|
12
|
+
* Read the templates, degrading to `unknown` and never to a pass.
|
|
13
|
+
* @param options - Inputs
|
|
14
|
+
* @param options.projectRoot - Project root
|
|
15
|
+
* @param options.read - Injectable reader, so tests never touch the package
|
|
16
|
+
* @returns The contexts, or an honest unknown
|
|
17
|
+
*/
|
|
18
|
+
export declare function readTemplateEnforcement(options: {
|
|
19
|
+
projectRoot: string;
|
|
20
|
+
read?: TemplateEnforcementReader;
|
|
21
|
+
}): Promise<Finding<readonly EnforcedContext[]>>;
|
|
22
|
+
//# sourceMappingURL=gate-report-templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-report-templates.d.ts","sourceRoot":"","sources":["../../src/cli/gate-report-templates.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAIzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEtD,8EAA8E;AAC9E,MAAM,MAAM,yBAAyB,GAAG,CACtC,WAAW,EAAE,MAAM,KAChB,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC,CAAC;AA+BzC;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,EAAE,yBAkB5C,CAAC;AAgBJ;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,yBAAyB,CAAC;CAClC,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC,CAAC,CAwB/C"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tier 1 — what the shipped ruleset templates require, read offline.
|
|
3
|
+
*
|
|
4
|
+
* The declaration-versus-live half of this comparison needs the network and
|
|
5
|
+
* degrades to `unknown`; this half needs nothing but the Lisa package and the
|
|
6
|
+
* project's settings file, so it answers in a repository with no credentials,
|
|
7
|
+
* no `gh`, and no network at all. That matters because the template is what a
|
|
8
|
+
* repository's protection is provisioned FROM: a declaration that disagrees
|
|
9
|
+
* with the template is drift the moment anyone runs the provisioner, whether or
|
|
10
|
+
* not the live ruleset has caught up yet.
|
|
11
|
+
*
|
|
12
|
+
* Every failure lands on `unknown` carrying a reason. In particular an empty
|
|
13
|
+
* template set is `unknown`, never an empty pass: a comparison against nothing
|
|
14
|
+
* would report every declaration as enforcing nothing, which is a false claim
|
|
15
|
+
* rather than a missing one.
|
|
16
|
+
* @module cli/gate-report-templates
|
|
17
|
+
*/
|
|
18
|
+
import { readFile, realpath } from "node:fs/promises";
|
|
19
|
+
import * as path from "node:path";
|
|
20
|
+
import { expectedRequiredContexts } from "../health/ruleset-inspection.js";
|
|
21
|
+
import { detectHealthProjectTypes } from "../health/template-inspection.js";
|
|
22
|
+
import { resolveLisaPackageRoot } from "./gate-report-registry.js";
|
|
23
|
+
/**
|
|
24
|
+
* Read `.lisa.config.json` as a plain record.
|
|
25
|
+
*
|
|
26
|
+
* The whole file rather than only its `gates` block, because the per-repo
|
|
27
|
+
* `github.rulesets.addRequiredChecks` and `dropRequiredChecks` opt-ins change
|
|
28
|
+
* which contexts a template actually ends up requiring.
|
|
29
|
+
* @param projectRoot - Project root
|
|
30
|
+
* @returns The parsed object, or null when it could not be read
|
|
31
|
+
*/
|
|
32
|
+
async function readRawConfig(projectRoot) {
|
|
33
|
+
const source = await readFile(path.join(projectRoot, ".lisa.config.json"), "utf8").catch(() => undefined);
|
|
34
|
+
if (source === undefined)
|
|
35
|
+
return null;
|
|
36
|
+
try {
|
|
37
|
+
const parsed = JSON.parse(source);
|
|
38
|
+
return parsed !== null &&
|
|
39
|
+
typeof parsed === "object" &&
|
|
40
|
+
!Array.isArray(parsed)
|
|
41
|
+
? parsed
|
|
42
|
+
: null;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* The default reader: the shipped templates, normalized as apply normalizes.
|
|
50
|
+
* @param projectRoot - Project root
|
|
51
|
+
* @returns The contexts the templates require
|
|
52
|
+
*/
|
|
53
|
+
export const defaultTemplateEnforcementReader = async (projectRoot) => {
|
|
54
|
+
const lisaRoot = resolveLisaPackageRoot();
|
|
55
|
+
if (lisaRoot === null)
|
|
56
|
+
throw new Error("LISA_PACKAGE_NOT_FOUND");
|
|
57
|
+
// The health readers confine every read to a CANONICAL root and reject a
|
|
58
|
+
// path that resolves outside it. A caller-supplied root that is merely
|
|
59
|
+
// absolute — a symlinked temporary directory, a checkout reached through
|
|
60
|
+
// one — resolves elsewhere and is refused, so it is canonicalized here
|
|
61
|
+
// rather than at each of the reads it is threaded through.
|
|
62
|
+
const canonical = await realpath(projectRoot).catch(() => projectRoot);
|
|
63
|
+
const config = await readRawConfig(canonical);
|
|
64
|
+
if (config === null)
|
|
65
|
+
throw new Error("CONFIG_UNREADABLE");
|
|
66
|
+
return await expectedRequiredContexts(lisaRoot, canonical, await detectHealthProjectTypes(canonical), config);
|
|
67
|
+
};
|
|
68
|
+
/** Why a template read failed, in words an operator can act on. */
|
|
69
|
+
const REASONS = {
|
|
70
|
+
LISA_PACKAGE_NOT_FOUND: {
|
|
71
|
+
reason: "lisa-package-not-found",
|
|
72
|
+
message: "The running Lisa package could not be located, so the ruleset templates were not read. Nothing here claims a declaration does or does not match the protection it will be provisioned into.",
|
|
73
|
+
},
|
|
74
|
+
CONFIG_UNREADABLE: {
|
|
75
|
+
reason: "config-unreadable",
|
|
76
|
+
message: ".lisa.config.json could not be read, so the per-repo required-check opt-ins that change what a template requires are unknown. The comparison was not made.",
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Read the templates, degrading to `unknown` and never to a pass.
|
|
81
|
+
* @param options - Inputs
|
|
82
|
+
* @param options.projectRoot - Project root
|
|
83
|
+
* @param options.read - Injectable reader, so tests never touch the package
|
|
84
|
+
* @returns The contexts, or an honest unknown
|
|
85
|
+
*/
|
|
86
|
+
export async function readTemplateEnforcement(options) {
|
|
87
|
+
const read = options.read ?? defaultTemplateEnforcementReader;
|
|
88
|
+
try {
|
|
89
|
+
const value = await read(options.projectRoot);
|
|
90
|
+
if (value.length === 0) {
|
|
91
|
+
return {
|
|
92
|
+
state: "unknown",
|
|
93
|
+
reason: "templates-not-found",
|
|
94
|
+
message: "No shipped ruleset template named a required status check for this project, so there is nothing to hold the declarations against. An empty template set is reported as unread rather than as a project whose merges are blocked on nothing.",
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
return { state: "verified", value };
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
const key = error instanceof Error ? error.message : String(error);
|
|
101
|
+
return {
|
|
102
|
+
state: "unknown",
|
|
103
|
+
...(REASONS[key] ?? {
|
|
104
|
+
reason: "templates-unreadable",
|
|
105
|
+
message: "Reading the shipped ruleset templates failed, so what the protection they provision would require is unknown for this run.",
|
|
106
|
+
}),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=gate-report-templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-report-templates.js","sourceRoot":"","sources":["../../src/cli/gate-report-templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* every count states its unknown band explicitly.
|
|
15
15
|
* @module cli/gate-report-types
|
|
16
16
|
*/
|
|
17
|
+
import type { DeclarationDriftReport, DeclarationState } from "../core/gate-declaration-drift.js";
|
|
17
18
|
/** Report format version, bumped when a consumer would have to change. */
|
|
18
19
|
export declare const GATE_REPORT_VERSION = 2;
|
|
19
20
|
/**
|
|
@@ -39,12 +40,12 @@ export type Finding<T> = {
|
|
|
39
40
|
/**
|
|
40
41
|
* What the settings file says about one gate at one moment.
|
|
41
42
|
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
* `
|
|
45
|
-
*
|
|
43
|
+
* Defined once in `core/gate-declaration-drift` and re-exported here. The
|
|
44
|
+
* declaration-versus-ruleset comparison turns on the difference between `off`
|
|
45
|
+
* and `not-declared`, so a second definition that drifted by one member would
|
|
46
|
+
* be a defect in exactly the place the comparison exists to protect.
|
|
46
47
|
*/
|
|
47
|
-
export type DeclarationState
|
|
48
|
+
export type { DeclarationState };
|
|
48
49
|
/** How a declared gate is proved. */
|
|
49
50
|
export type ProofMode = "run" | "await" | "intercept" | "off";
|
|
50
51
|
/**
|
|
@@ -233,6 +234,19 @@ export interface GateReport {
|
|
|
233
234
|
readonly skipJobs: Finding<readonly SkipJobRow[]>;
|
|
234
235
|
/** Declared contexts against the live ruleset — Tier 2. */
|
|
235
236
|
readonly ruleset: Finding<RulesetComparison>;
|
|
237
|
+
/**
|
|
238
|
+
* The declaration held against each surface that enforces it.
|
|
239
|
+
*
|
|
240
|
+
* Two surfaces, reported separately and never merged. `templates` needs no
|
|
241
|
+
* network and says what protection would require the moment anyone
|
|
242
|
+
* provisions it; `live` says what the repository requires right now, and is
|
|
243
|
+
* `unknown` whenever this run could not read it. Folding them into one
|
|
244
|
+
* verdict would let a reachable surface vouch for an unreachable one.
|
|
245
|
+
*/
|
|
246
|
+
readonly declarationDrift: {
|
|
247
|
+
readonly templates: Finding<DeclarationDriftReport>;
|
|
248
|
+
readonly live: Finding<DeclarationDriftReport>;
|
|
249
|
+
};
|
|
236
250
|
/**
|
|
237
251
|
* Every context a merge is blocked on, with who owns it.
|
|
238
252
|
*
|
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"gate-report-types.d.ts","sourceRoot":"","sources":["../../src/cli/gate-report-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EACV,sBAAsB,EACtB,gBAAgB,EACjB,MAAM,mCAAmC,CAAC;AAE3C,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,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAEjC,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;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,+CAA+C;IAC/C,QAAQ,CAAC,OAAO,EAAE,KAAK,GAAG,wBAAwB,GAAG,IAAI,CAAC;IAC1D,kEAAkE;IAClE,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,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;IAC5C;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;CACvC;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;;;;;;;OAOG;IACH,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,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;;;;;;;;OAQG;IACH,QAAQ,CAAC,gBAAgB,EAAE;QACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;QACpD,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;KAChD,CAAC;IACF;;;;;;;OAOG;IACH,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC,SAAS,kBAAkB,EAAE,CAAC,CAAC;IAClE,8EAA8E;IAC9E,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAAC;IAC3D,+EAA+E;IAC/E,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACjD;;;;;OAKG;IACH,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,cAAc;IACd,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;CACrC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,aAAa,CAAC;AAE7D;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,wDAAwD;IACxD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,4DAA4D;IAC5D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,sEAAsE;IACtE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,6CAA6C;IAC7C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,qCAAqC;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,iFAAiF;IACjF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,kDAAkD;AAClD,MAAM,MAAM,aAAa,GACrB,eAAe,GACf,iBAAiB,GACjB,kBAAkB,GAClB,aAAa,CAAC;AAElB,wEAAwE;AACxE,MAAM,WAAW,kBAAkB;IACjC,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,mBAAmB;IACnB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,0EAA0E;AAC1E,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,yEAAyE;IACzE,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate-report-types.js","sourceRoot":"","sources":["../../src/cli/gate-report-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"gate-report-types.js","sourceRoot":"","sources":["../../src/cli/gate-report-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAOH,0EAA0E;AAC1E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type GateRegistryModule } from "./gate-report-registry.js";
|
|
2
|
+
import { type TemplateEnforcementReader } from "./gate-report-templates.js";
|
|
2
3
|
import { type RequiredContextsReader } from "./gate-report-ruleset.js";
|
|
3
4
|
import { type SkipJobTokensReader } from "./gate-report-skip-jobs.js";
|
|
4
5
|
import { type GateReport } from "./gate-report-types.js";
|
|
@@ -12,6 +13,8 @@ export interface GateReportOptions {
|
|
|
12
13
|
readonly readRequiredContexts?: RequiredContextsReader;
|
|
13
14
|
/** Injectable `skip_jobs` reader, for the same reason. */
|
|
14
15
|
readonly readSkipJobTokens?: SkipJobTokensReader;
|
|
16
|
+
/** Injectable Tier 1 ruleset-template reader, for the same reason. */
|
|
17
|
+
readonly readTemplateContexts?: TemplateEnforcementReader;
|
|
15
18
|
/** Injectable home directory, so agent-hook discovery is testable. */
|
|
16
19
|
readonly homedir?: () => string;
|
|
17
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate-report.d.ts","sourceRoot":"","sources":["../../src/cli/gate-report.ts"],"names":[],"mappings":"AAyCA,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"gate-report.d.ts","sourceRoot":"","sources":["../../src/cli/gate-report.ts"],"names":[],"mappings":"AAyCA,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,2BAA2B,CAAC;AASnC,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,4BAA4B,CAAC;AAIpC,OAAO,EAIL,KAAK,UAAU,EAEhB,MAAM,wBAAwB,CAAC;AAWhC,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;IACjD,sEAAsE;IACtE,QAAQ,CAAC,oBAAoB,CAAC,EAAE,yBAAyB,CAAC;IAC1D,sEAAsE;IACtE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC;CACjC;AA0BD;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,MAAM,EAAE,CASV;AA6LD;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,UAAU,CAAC,CAsErB"}
|
package/dist/cli/gate-report.js
CHANGED
|
@@ -26,7 +26,8 @@ import { facadeFinding, facadeSourceOf, readFacadeFacts, } from "./gate-report-f
|
|
|
26
26
|
import { mergeVerdict } from "./gate-report-merge.js";
|
|
27
27
|
import { collectUpstream, PRE_TOOL } from "./gate-report-upstream.js";
|
|
28
28
|
import { loadGateRegistry, } from "./gate-report-registry.js";
|
|
29
|
-
import { buildRequiredContexts, buildRulesetFinding, mergeBlockResolver, } from "./gate-report-joins.js";
|
|
29
|
+
import { buildDeclarationDrift, buildRequiredContexts, buildRulesetFinding, liveEnforcement, mergeBlockResolver, } from "./gate-report-joins.js";
|
|
30
|
+
import { readTemplateEnforcement, } from "./gate-report-templates.js";
|
|
30
31
|
import { defaultRequiredContextsReader, readRequiredContexts, } from "./gate-report-ruleset.js";
|
|
31
32
|
import { buildSkipJobRows, defaultSkipJobTokensReader, } from "./gate-report-skip-jobs.js";
|
|
32
33
|
import { readConfig } from "./gate-report-config.js";
|
|
@@ -134,6 +135,7 @@ function registryMissingReport() {
|
|
|
134
135
|
gates: [],
|
|
135
136
|
skipJobs: missing,
|
|
136
137
|
ruleset: missing,
|
|
138
|
+
declarationDrift: { templates: missing, live: missing },
|
|
137
139
|
requiredContexts: missing,
|
|
138
140
|
agentHooks: missing,
|
|
139
141
|
facadeSource: { present: false, files: [] },
|
|
@@ -203,8 +205,29 @@ async function readInputs(registry, options) {
|
|
|
203
205
|
readFacadeFacts(projectRoot),
|
|
204
206
|
collectAgentHooks(projectRoot, options.homedir === undefined ? {} : { homedir: options.homedir }),
|
|
205
207
|
readProjectIsUpstream(projectRoot),
|
|
208
|
+
readTemplateEnforcement(options.readTemplateContexts === undefined
|
|
209
|
+
? { projectRoot }
|
|
210
|
+
: { projectRoot, read: options.readTemplateContexts }),
|
|
206
211
|
]);
|
|
207
212
|
}
|
|
213
|
+
/**
|
|
214
|
+
* The declaration held against both surfaces that enforce it.
|
|
215
|
+
*
|
|
216
|
+
* Two surfaces, never merged into one verdict: the template needs no network
|
|
217
|
+
* and says what protection would require the moment anyone provisions it; the
|
|
218
|
+
* live ruleset says what the repository requires right now, and is `unknown`
|
|
219
|
+
* whenever this run did not read it. Folding them would let a reachable
|
|
220
|
+
* surface vouch for an unreachable one.
|
|
221
|
+
* @param joins - The join inputs
|
|
222
|
+
* @param templates - What the shipped templates require, or why that is unknown
|
|
223
|
+
* @returns One comparison per surface
|
|
224
|
+
*/
|
|
225
|
+
function declarationDrift(joins, templates) {
|
|
226
|
+
return {
|
|
227
|
+
templates: buildDeclarationDrift(joins, "ruleset-templates", templates),
|
|
228
|
+
live: buildDeclarationDrift(joins, "live-ruleset", liveEnforcement(joins.contexts)),
|
|
229
|
+
};
|
|
230
|
+
}
|
|
208
231
|
/**
|
|
209
232
|
* Build the gate report for one project.
|
|
210
233
|
* @param options - Report inputs
|
|
@@ -218,7 +241,7 @@ export async function buildGateReport(options) {
|
|
|
218
241
|
const parsed = readConfig(registry, projectRoot);
|
|
219
242
|
const gates = parsed.gates;
|
|
220
243
|
const axis = momentAxis(registry, gates);
|
|
221
|
-
const [scripts, hooks, contexts, skipJobs, facade, agentHooks, isUpstream] = await readInputs(registry, options);
|
|
244
|
+
const [scripts, hooks, contexts, skipJobs, facade, agentHooks, isUpstream, templates,] = await readInputs(registry, options);
|
|
222
245
|
const joins = {
|
|
223
246
|
registry,
|
|
224
247
|
gates,
|
|
@@ -260,6 +283,7 @@ export async function buildGateReport(options) {
|
|
|
260
283
|
gates: rows,
|
|
261
284
|
skipJobs,
|
|
262
285
|
ruleset: buildRulesetFinding(joins),
|
|
286
|
+
declarationDrift: declarationDrift(joins, templates),
|
|
263
287
|
requiredContexts: buildRequiredContexts(joins),
|
|
264
288
|
agentHooks,
|
|
265
289
|
facadeSource: facadeSourceOf(facade),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate-report.js","sourceRoot":"","sources":["../../src/cli/gate-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EACL,QAAQ,EACR,cAAc,GAEf,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,mBAAmB,GAEpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,aAAa,EACb,cAAc,EACd,eAAe,GAEhB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EACL,gBAAgB,GAGjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,GAEnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,6BAA6B,EAC7B,oBAAoB,GAErB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,gBAAgB,EAChB,0BAA0B,GAE3B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"gate-report.js","sourceRoot":"","sources":["../../src/cli/gate-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,190 @@
|
|
|
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
|
+
/**
|
|
37
|
+
* What the settings file says about one gate at one moment.
|
|
38
|
+
*
|
|
39
|
+
* `off` and `not-declared` are deliberately separate. Collapsing them is what
|
|
40
|
+
* let a declaration govern nothing: the CI façade read both as
|
|
41
|
+
* `configured=false` and ran its built-in fallback, so `off` could not turn a
|
|
42
|
+
* job off.
|
|
43
|
+
*/
|
|
44
|
+
export type DeclarationState = "required" | "optional" | "off" | "not-declared";
|
|
45
|
+
/** Which enforcing surface a comparison was made against. */
|
|
46
|
+
export type DriftSurface = "ruleset-templates" | "live-ruleset";
|
|
47
|
+
/**
|
|
48
|
+
* One context's verdict, in the vocabulary an operator can act on.
|
|
49
|
+
*
|
|
50
|
+
* Six members rather than a matched/unmatched pair, because the four unmatched
|
|
51
|
+
* cases need four different actions and one of them is not a defect at all.
|
|
52
|
+
*/
|
|
53
|
+
export type DriftVerdict =
|
|
54
|
+
/** Declared `required`, and the enforcing surface requires it. */
|
|
55
|
+
"matched"
|
|
56
|
+
/** Declared `required`; nothing on the enforcing surface requires it. */
|
|
57
|
+
| "declared-not-enforced"
|
|
58
|
+
/** Enforced, while the declaration says `optional`. */
|
|
59
|
+
| "enforced-declared-optional"
|
|
60
|
+
/** Enforced, while the declaration says `off` — a live contradiction. */
|
|
61
|
+
| "enforced-declared-off"
|
|
62
|
+
/** Enforced, and a registry gate produces it, but nothing declares it. */
|
|
63
|
+
| "enforced-undeclared"
|
|
64
|
+
/** Enforced, and no registry gate produces it — a third-party check. */
|
|
65
|
+
| "enforced-not-lisa-owned";
|
|
66
|
+
/**
|
|
67
|
+
* What to do about one verdict.
|
|
68
|
+
*
|
|
69
|
+
* Deliberately closed, and deliberately without a removal. See the module note.
|
|
70
|
+
*/
|
|
71
|
+
export type DriftRemedy = "none" | "declare-the-gate" | "enforce-the-context" | "resolve-the-contradiction" | "decide-which-surface-wins";
|
|
72
|
+
/** One required status context, and where the requirement was read from. */
|
|
73
|
+
export interface EnforcedContext {
|
|
74
|
+
/** The context string, exactly as the ruleset spells it. */
|
|
75
|
+
readonly context: string;
|
|
76
|
+
/** The ruleset requiring it. */
|
|
77
|
+
readonly ruleset: string;
|
|
78
|
+
/**
|
|
79
|
+
* Where the requirement was read. A package-relative template path or a
|
|
80
|
+
* settings-file key — never an absolute path, which differs per machine and
|
|
81
|
+
* would break the byte-identical property the report is built on.
|
|
82
|
+
*/
|
|
83
|
+
readonly source: string;
|
|
84
|
+
}
|
|
85
|
+
/** The gate a context belongs to, and what the settings file says about it. */
|
|
86
|
+
export interface ContextOwner {
|
|
87
|
+
/** Registry gate id. */
|
|
88
|
+
readonly gateId: string;
|
|
89
|
+
/** The declaration at the merge moment. */
|
|
90
|
+
readonly declaration: DeclarationState;
|
|
91
|
+
/** Whether the registry permits declaring this gate at the merge moment. */
|
|
92
|
+
readonly legalAtMerge: boolean;
|
|
93
|
+
}
|
|
94
|
+
/** One context, its verdict, and the evidence behind it. */
|
|
95
|
+
export interface DeclarationDriftEntry {
|
|
96
|
+
/** The context string. */
|
|
97
|
+
readonly context: string;
|
|
98
|
+
/** The verdict. */
|
|
99
|
+
readonly verdict: DriftVerdict;
|
|
100
|
+
/** The action this verdict calls for. Never a removal. */
|
|
101
|
+
readonly remedy: DriftRemedy;
|
|
102
|
+
/** The registry gate producing this context, when one does. */
|
|
103
|
+
readonly gateId: string | null;
|
|
104
|
+
/** What the settings file says, or null when no gate owns the context. */
|
|
105
|
+
readonly declaration: DeclarationState | null;
|
|
106
|
+
/** The rulesets requiring it, sorted. Empty when nothing enforces it. */
|
|
107
|
+
readonly rulesets: readonly string[];
|
|
108
|
+
/** Where the requirement was read from, sorted. */
|
|
109
|
+
readonly sources: readonly string[];
|
|
110
|
+
/** One operator-readable sentence. */
|
|
111
|
+
readonly detail: string;
|
|
112
|
+
}
|
|
113
|
+
/** The whole comparison against one enforcing surface. */
|
|
114
|
+
export interface DeclarationDriftReport {
|
|
115
|
+
/** Which surface the declarations were held against. */
|
|
116
|
+
readonly surface: DriftSurface;
|
|
117
|
+
/** One entry per context, sorted by context. */
|
|
118
|
+
readonly entries: readonly DeclarationDriftEntry[];
|
|
119
|
+
/** How many entries carry each verdict. Every key is present. */
|
|
120
|
+
readonly counts: Readonly<Record<DriftVerdict, number>>;
|
|
121
|
+
/** Entries whose verdict is a contradiction rather than a gap. */
|
|
122
|
+
readonly contradictions: number;
|
|
123
|
+
/** Entries whose verdict is a gap the declaration surface could close. */
|
|
124
|
+
readonly gaps: number;
|
|
125
|
+
}
|
|
126
|
+
/** The slice of the shipped registry this comparison reads. */
|
|
127
|
+
export interface MergeContextRegistry {
|
|
128
|
+
readonly REGISTRY: Readonly<Record<string, {
|
|
129
|
+
readonly label: string;
|
|
130
|
+
readonly moments: readonly string[];
|
|
131
|
+
}>>;
|
|
132
|
+
readonly resolveMoment: (options: {
|
|
133
|
+
gates: Record<string, unknown>;
|
|
134
|
+
moment: string;
|
|
135
|
+
includeOff?: boolean;
|
|
136
|
+
}) => readonly {
|
|
137
|
+
readonly id: string;
|
|
138
|
+
readonly level: string;
|
|
139
|
+
readonly mode: string;
|
|
140
|
+
readonly awaits: string | null;
|
|
141
|
+
}[];
|
|
142
|
+
readonly momentFamily: (moment: string) => string;
|
|
143
|
+
}
|
|
144
|
+
/** The moment a branch ruleset guards. */
|
|
145
|
+
export declare const MERGE_MOMENT = "pull-request";
|
|
146
|
+
/**
|
|
147
|
+
* Map every context a registry gate can produce to that gate.
|
|
148
|
+
*
|
|
149
|
+
* Built from the whole registry rather than from the declared gates, which is
|
|
150
|
+
* the difference between "protection requires a context whose gate nobody
|
|
151
|
+
* declared" and "protection requires a context Lisa knows nothing about". Those
|
|
152
|
+
* are different findings with different remedies, and a map built only from
|
|
153
|
+
* declarations could not tell them apart.
|
|
154
|
+
* @param options - Inputs
|
|
155
|
+
* @param options.registry - The shipped registry
|
|
156
|
+
* @param options.gates - The project's gates block
|
|
157
|
+
* @param options.workflowName - The workflow whose name prefixes a context
|
|
158
|
+
* @returns Context string to owning gate
|
|
159
|
+
*/
|
|
160
|
+
export declare function contextOwners(options: {
|
|
161
|
+
registry: MergeContextRegistry;
|
|
162
|
+
gates: Record<string, unknown>;
|
|
163
|
+
workflowName: string;
|
|
164
|
+
}): ReadonlyMap<string, ContextOwner>;
|
|
165
|
+
/**
|
|
166
|
+
* The contexts a `required` declaration promises protection will require.
|
|
167
|
+
* @param owners - Context to owning gate
|
|
168
|
+
* @returns The contexts, sorted
|
|
169
|
+
*/
|
|
170
|
+
export declare function declaredRequiredContexts(owners: ReadonlyMap<string, ContextOwner>): readonly string[];
|
|
171
|
+
/**
|
|
172
|
+
* Compare a project's declarations with one enforcing surface.
|
|
173
|
+
*
|
|
174
|
+
* Total and pure — the same inputs always produce the same entries in the same
|
|
175
|
+
* order. Reaching the surface is the caller's job, and a caller that could not
|
|
176
|
+
* reach it must report an unknown rather than call this with an empty list: a
|
|
177
|
+
* comparison against nothing would report every declaration as unenforced,
|
|
178
|
+
* which is a different and false claim.
|
|
179
|
+
* @param options - Inputs
|
|
180
|
+
* @param options.surface - Which surface `enforced` was read from
|
|
181
|
+
* @param options.owners - Context to owning gate
|
|
182
|
+
* @param options.enforced - Contexts the surface requires
|
|
183
|
+
* @returns The comparison
|
|
184
|
+
*/
|
|
185
|
+
export declare function classifyDeclarationDrift(options: {
|
|
186
|
+
surface: DriftSurface;
|
|
187
|
+
owners: ReadonlyMap<string, ContextOwner>;
|
|
188
|
+
enforced: readonly EnforcedContext[];
|
|
189
|
+
}): DeclarationDriftReport;
|
|
190
|
+
//# sourceMappingURL=gate-declaration-drift.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-declaration-drift.d.ts","sourceRoot":"","sources":["../../src/core/gate-declaration-drift.ts"],"names":[],"mappings":"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"}
|