@codyswann/lisa 3.61.0 → 3.63.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.
Files changed (80) hide show
  1. package/all/copy-overwrite/scripts/lisa-gates.mjs +167 -5
  2. package/all/copy-overwrite/scripts/lisa-reconcile-policy.mjs +325 -32
  3. package/dist/cli/gate-report-templates.js +1 -1
  4. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  5. package/dist/core/lisa-owned-hash-ledger.js +6 -0
  6. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  7. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  8. package/dist/core/upstream-evidence-manifest.js +14 -9
  9. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  10. package/dist/health/ruleset-inspection.d.ts.map +1 -1
  11. package/dist/health/ruleset-inspection.js +73 -6
  12. package/dist/health/ruleset-inspection.js.map +1 -1
  13. package/package.json +2 -1
  14. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  15. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  16. package/plugins/lisa/.codex-plugin/skills/lisa-doctor/SKILL.md +46 -7
  17. package/plugins/lisa/.codex-plugin/skills/lisa-setup-github-repo/SKILL.md +7 -3
  18. package/plugins/lisa/skills/lisa-doctor/SKILL.md +46 -7
  19. package/plugins/lisa/skills/lisa-setup-github-repo/SKILL.md +7 -3
  20. package/plugins/lisa-agy/plugin.json +1 -1
  21. package/plugins/lisa-agy/skills/lisa-doctor/SKILL.md +46 -7
  22. package/plugins/lisa-agy/skills/lisa-setup-github-repo/SKILL.md +7 -3
  23. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  24. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  25. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  26. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-copilot/skills/lisa-doctor/SKILL.md +46 -7
  30. package/plugins/lisa-copilot/skills/lisa-setup-github-repo/SKILL.md +7 -3
  31. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  32. package/plugins/lisa-cursor/skills/lisa-doctor/SKILL.md +46 -7
  33. package/plugins/lisa-cursor/skills/lisa-setup-github-repo/SKILL.md +7 -3
  34. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  36. package/plugins/lisa-expo-agy/plugin.json +1 -1
  37. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  41. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  42. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  46. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  47. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  51. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  52. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  56. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  57. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  61. package/plugins/lisa-rails-agy/plugin.json +1 -1
  62. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  66. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  67. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  69. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  71. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  72. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  74. package/plugins/src/base/skills/lisa-doctor/SKILL.md +46 -7
  75. package/plugins/src/base/skills/lisa-setup-github-repo/SKILL.md +7 -3
  76. package/scripts/check-required-check-promotions.mjs +69 -4
  77. package/scripts/lisa-github-repo-setup.sh +64 -5
  78. package/scripts/lisa-github-rulesets.sh +201 -21
  79. package/scripts/lisa-ruleset-payload.mjs +376 -0
  80. package/all/github-rulesets/base.json +0 -64
@@ -326,8 +326,33 @@ export const POLICY_SOURCES = Object.freeze({
326
326
  surface: "repository",
327
327
  field: "default_branch",
328
328
  },
329
+ "review.required_approving_review_count": {
330
+ surface: "ruleset",
331
+ field: "required_approving_review_count",
332
+ },
333
+ "review.require_code_owner_review": {
334
+ surface: "ruleset",
335
+ field: "require_code_owner_review",
336
+ },
337
+ "ruleset.enforcement": { surface: "ruleset", field: "enforcement" },
338
+ "ruleset.include_refs": { surface: "ruleset", field: "include_refs" },
339
+ "ruleset.exclude_refs": { surface: "ruleset", field: "exclude_refs" },
340
+ "ruleset.bypass_actors": { surface: "ruleset", field: "bypass_actors" },
329
341
  });
330
342
 
343
+ /**
344
+ * The ruleset whose SHAPE the `policy.ruleset` and `policy.review` blocks
345
+ * describe.
346
+ *
347
+ * The boolean signals below are an OR across every active ruleset, because
348
+ * "are force pushes refused anywhere" is the question those fields ask. The
349
+ * shape fields are not like that: a repository has several rulesets and each
350
+ * has its own `enforcement`, its own ref conditions and its own bypass list, so
351
+ * ORing them would compare a declaration against a value from whichever ruleset
352
+ * happened to sort first. These are read off the one ruleset Lisa generates.
353
+ */
354
+ export const POLICY_RULESET_NAME = "base";
355
+
331
356
  /**
332
357
  * Run `gh` and report the outcome without throwing.
333
358
  *
@@ -423,10 +448,18 @@ function ghJson(gh, args) {
423
448
  * `force_push` reads `non_fast_forward` because that is the rule GitHub uses to
424
449
  * mean "force pushes are refused"; the policy field states the protection, not
425
450
  * the permission, so `true` means force pushing is blocked.
451
+ *
452
+ * The boolean signals are ORed across every ACTIVE ruleset. The shape fields —
453
+ * `enforcement`, the ref conditions, `bypass_actors`, the review counts — are
454
+ * read off `POLICY_RULESET_NAME` alone, and they are read whatever its
455
+ * enforcement is, because `enforcement` is itself one of the declared fields
456
+ * and skipping a non-active ruleset would report the one drift that matters
457
+ * most as no drift at all.
426
458
  * @param {Ruleset[]} rulesets Full ruleset objects.
427
- * @returns {Record<string, boolean>} Observed ruleset-surface policy.
459
+ * @param {string} [policyRuleset] Ruleset the shape fields are read from.
460
+ * @returns {Record<string, *>} Observed ruleset-surface policy.
428
461
  */
429
- export function rulesetSignals(rulesets) {
462
+ export function rulesetSignals(rulesets, policyRuleset = POLICY_RULESET_NAME) {
430
463
  const signals = {
431
464
  linear: false,
432
465
  signed_commits: false,
@@ -465,7 +498,35 @@ export function rulesetSignals(rulesets) {
465
498
  }
466
499
  }
467
500
  }
468
- return signals;
501
+ return { ...signals, ...rulesetShape(rulesets, policyRuleset) };
502
+ }
503
+
504
+ /**
505
+ * The per-ruleset shape fields, read off the policy ruleset.
506
+ *
507
+ * Every field is `undefined` when that ruleset does not exist, which is what
508
+ * makes "the ruleset Lisa generates is not on this repository" render as drift
509
+ * on each declared field rather than as a match against a fabricated default.
510
+ * @param {Ruleset[]} rulesets Full ruleset objects.
511
+ * @param {string} policyRuleset The ruleset to read.
512
+ * @returns {Record<string, *>} Observed shape.
513
+ */
514
+ function rulesetShape(rulesets, policyRuleset) {
515
+ const target = (rulesets ?? []).find(entry => entry?.name === policyRuleset);
516
+ if (!target) return {};
517
+ const pullRequest = (target.rules ?? []).find(
518
+ rule => rule?.type === "pull_request"
519
+ );
520
+ return {
521
+ enforcement: target.enforcement,
522
+ include_refs: target.conditions?.ref_name?.include,
523
+ exclude_refs: target.conditions?.ref_name?.exclude,
524
+ bypass_actors: target.bypass_actors,
525
+ required_approving_review_count:
526
+ pullRequest?.parameters?.required_approving_review_count,
527
+ require_code_owner_review:
528
+ pullRequest?.parameters?.require_code_owner_review,
529
+ };
469
530
  }
470
531
 
471
532
  /**
@@ -600,13 +661,74 @@ export function reconcileSettings({ policy, live }) {
600
661
  ? live.settings?.[source.field]
601
662
  : live.signals?.[source.field];
602
663
  const finding = { path, declared, observed, ...source };
603
- if (observed === declared) matched.push(finding);
664
+ if (sameDeclaredValue(observed, declared)) matched.push(finding);
604
665
  else drift.push(finding);
605
666
  }
606
667
  }
607
668
  return { drift, matched, unknown };
608
669
  }
609
670
 
671
+ /**
672
+ * Whether an observed value satisfies a declared one.
673
+ *
674
+ * `===` was enough while every policy field was a boolean or a string. The
675
+ * ruleset shape moved into config carrying `include_refs` and `bypass_actors`,
676
+ * and two arrays with identical contents are never `===` — so a repository in
677
+ * perfect agreement with its declaration would have reported drift on every
678
+ * run, and a `repair` would have rewritten a setting that was already right.
679
+ *
680
+ * ARRAY order matters and is compared: `include_refs` is a list a reader
681
+ * compares line by line, and calling two genuinely different ref lists equal
682
+ * would hide a real difference.
683
+ *
684
+ * OBJECT KEY order does not, and must not. `JSON.stringify` preserves insertion
685
+ * order, `bypass_actors` entries are objects, GitHub emits its own key order and
686
+ * the declaration is hand-authored — so `{actor_type, actor_id}` against
687
+ * `{actor_id, actor_type}` would report drift forever on a repository that
688
+ * agrees with its declaration exactly. That is the same permanent false alarm
689
+ * this module removes elsewhere, reintroduced by a serializer detail, so keys
690
+ * are sorted before comparing.
691
+ * @param {*} observed What GitHub reports.
692
+ * @param {*} declared What the project declared.
693
+ * @returns {boolean} True when they agree.
694
+ */
695
+ export function sameDeclaredValue(observed, declared) {
696
+ if (observed === declared) return true;
697
+ if (
698
+ observed === null ||
699
+ declared === null ||
700
+ typeof observed !== "object" ||
701
+ typeof declared !== "object"
702
+ ) {
703
+ return false;
704
+ }
705
+ return canonicalJson(observed) === canonicalJson(declared);
706
+ }
707
+
708
+ /**
709
+ * Serialize a value with object keys in a stable order, arrays left alone.
710
+ * @param {*} value Any JSON-representable value.
711
+ * @returns {string} A key-order-independent serialization.
712
+ */
713
+ function canonicalJson(value) {
714
+ return JSON.stringify(canonicalize(value));
715
+ }
716
+
717
+ /**
718
+ * Rebuild a value with every object's keys sorted, recursively.
719
+ * @param {*} value Any JSON-representable value.
720
+ * @returns {*} The same value with deterministic key order.
721
+ */
722
+ function canonicalize(value) {
723
+ if (Array.isArray(value)) return value.map(entry => canonicalize(entry));
724
+ if (value === null || typeof value !== "object") return value;
725
+ return Object.fromEntries(
726
+ Object.keys(value)
727
+ .sort((left, right) => left.localeCompare(right))
728
+ .map(key => [key, canonicalize(value[key])])
729
+ );
730
+ }
731
+
610
732
  /**
611
733
  * Choose the ruleset a context repair should write to.
612
734
  *
@@ -668,6 +790,63 @@ export function awaitedContexts(gates, moment) {
668
790
  .filter(Boolean);
669
791
  }
670
792
 
793
+ /**
794
+ * The app each awaited context is pinned to, where the project named one.
795
+ *
796
+ * A pin is what stops any other writer satisfying a required check. It has to
797
+ * come from the declaration, because the alternative — a shipped list of vendor
798
+ * integration ids — is the fleet-wide lock this replaced. An awaited context
799
+ * with no declared pin is written unpinned, which is GitHub's "any source";
800
+ * that is strictly what the reconciler did for every awaited context before
801
+ * config could express the pin at all.
802
+ * @param {object} gates The gates block.
803
+ * @param {string} moment The moment contexts were derived for.
804
+ * @returns {Record<string, number>} Context to GitHub App id.
805
+ */
806
+ export function awaitedPins(gates, moment) {
807
+ const pins = {};
808
+ for (const gate of resolveMoment({ gates, moment })) {
809
+ if (gate.level !== "required" || gate.mode !== "await") continue;
810
+ if (!gate.awaits || gate.postedBy === null) continue;
811
+ pins[gate.awaits] = gate.postedBy;
812
+ }
813
+ return pins;
814
+ }
815
+
816
+ /**
817
+ * Read `github.rulesets.requiredChecks` into the three things a reconciliation
818
+ * needs from it.
819
+ *
820
+ * This is the declarative replacement for `addRequiredChecks`, and reading it
821
+ * here is what stops the reconciler reporting a context the project DID
822
+ * declare as EXTRA — a false alarm whose only offered fixes were `--prune`
823
+ * (deletes live protection) and editing the config to stop declaring it.
824
+ *
825
+ * The home matters as much as the name. A repository has several rulesets and
826
+ * the declaration says which one owns each context, so a repair can write it
827
+ * where it was declared instead of wherever the single fallback target points.
828
+ * @param {object} [requiredChecks] The `requiredChecks` map, by ruleset name.
829
+ * @returns {{contexts: string[], homes: Record<string, string>, pins: Record<string, number>}} Declared checks.
830
+ */
831
+ export function declaredChecks(requiredChecks = {}) {
832
+ const contexts = [];
833
+ const homes = {};
834
+ const pins = {};
835
+ for (const [ruleset, entries] of Object.entries(requiredChecks ?? {})) {
836
+ if (!Array.isArray(entries)) continue;
837
+ for (const entry of entries) {
838
+ if (!entry || typeof entry !== "object") continue;
839
+ if (typeof entry.context !== "string") continue;
840
+ contexts.push(entry.context);
841
+ homes[entry.context] = ruleset;
842
+ if (Number.isInteger(entry.integration_id)) {
843
+ pins[entry.context] = entry.integration_id;
844
+ }
845
+ }
846
+ }
847
+ return { contexts, homes, pins };
848
+ }
849
+
671
850
  /**
672
851
  * Rewrite a ruleset's required contexts, returning a writable payload.
673
852
  * @param {Ruleset} ruleset The live ruleset.
@@ -675,11 +854,13 @@ export function awaitedContexts(gates, moment) {
675
854
  * @param {string[]} [options.add] Contexts to require.
676
855
  * @param {string[]} [options.remove] Contexts to stop requiring.
677
856
  * @param {string[]} [options.awaited] Of `add`, the ones an external app posts.
857
+ * @param {Record<string, number>} [options.pins] Declared app id per awaited
858
+ * context, from `awaitedPins`.
678
859
  * @returns {Ruleset} A payload with read-only fields stripped.
679
860
  */
680
861
  export function rulesetPayload(
681
862
  ruleset,
682
- { add = [], remove = [], awaited = [] } = {}
863
+ { add = [], remove = [], awaited = [], pins = {} } = {}
683
864
  ) {
684
865
  const payload = structuredClone(ruleset);
685
866
  for (const field of READ_ONLY_RULESET_FIELDS) delete payload[field];
@@ -690,11 +871,14 @@ export function rulesetPayload(
690
871
  // Actions is supposed to post. Applied to an awaited context it does the
691
872
  // opposite: it names the one app that will never post it, and the required
692
873
  // check then blocks every pull request forever.
693
- const additions = add.map(context =>
694
- awaited.includes(context)
874
+ const additions = add.map(context => {
875
+ if (Object.hasOwn(pins, context)) {
876
+ return { context, integration_id: pins[context] };
877
+ }
878
+ return awaited.includes(context)
695
879
  ? { context }
696
- : { context, integration_id: ACTIONS_INTEGRATION_ID }
697
- );
880
+ : { context, integration_id: ACTIONS_INTEGRATION_ID };
881
+ });
698
882
 
699
883
  if (!rule) {
700
884
  payload.rules = [
@@ -738,6 +922,8 @@ export function rulesetPayload(
738
922
  * @param {boolean} options.prune Whether EXTRA contexts may be removed.
739
923
  * @param {string|null} options.rulesetName Explicit target ruleset.
740
924
  * @param {string[]} [options.awaited] Contexts an external app posts.
925
+ * @param {Record<string, number>} [options.pins] Declared app id per awaited
926
+ * context.
741
927
  * @returns {RepairAction[]} Planned actions.
742
928
  */
743
929
  export function planRepairs({
@@ -747,29 +933,20 @@ export function planRepairs({
747
933
  prune,
748
934
  rulesetName,
749
935
  awaited = [],
936
+ pins = {},
937
+ homes = {},
750
938
  }) {
751
- const plan = [];
752
- const removable = prune ? contexts.extra.map(entry => entry.context) : [];
753
-
754
- if (contexts.missing.length || removable.length) {
755
- const { ruleset, problem } = repairTarget(live.rulesets, rulesetName);
756
- if (!ruleset) {
757
- plan.push({ kind: "manual", message: problem });
758
- } else {
759
- plan.push({
760
- kind: "contexts",
761
- ruleset: ruleset.name,
762
- rulesetId: ruleset.id,
763
- add: contexts.missing,
764
- remove: removable,
765
- payload: rulesetPayload(ruleset, {
766
- add: contexts.missing,
767
- remove: removable,
768
- awaited,
769
- }),
770
- });
771
- }
772
- }
939
+ const plan = [
940
+ ...planContextRepairs({
941
+ contexts,
942
+ live,
943
+ prune,
944
+ rulesetName,
945
+ awaited,
946
+ pins,
947
+ homes,
948
+ }),
949
+ ];
773
950
 
774
951
  // Rule (b): an EXTRA context is reported by name and left alone. Most of them
775
952
  // are external apps Lisa never declares, and removing one silently strips a
@@ -816,6 +993,97 @@ export function planRepairs({
816
993
  return plan;
817
994
  }
818
995
 
996
+ /**
997
+ * Group the context repairs by the ruleset each one belongs to.
998
+ *
999
+ * Every add and every remove used to be written into ONE ruleset. For removals
1000
+ * that made `--prune` a no-op whenever the extra context lived somewhere other
1001
+ * than the fallback target: the payload dropped a context the target never
1002
+ * required, GitHub accepted it, and the check stayed required. For additions it
1003
+ * put a context under whichever ref-name condition the fallback target carries,
1004
+ * enforced somewhere other than where it was declared.
1005
+ *
1006
+ * A context's home is the ruleset that declares it in
1007
+ * `github.rulesets.requiredChecks`, or — for a gate-derived context, which
1008
+ * names no ruleset — the single carrier or the explicit `--ruleset`.
1009
+ * @param {object} options Planning inputs.
1010
+ * @param {ContextDrift} options.contexts Result of `reconcileContexts`.
1011
+ * @param {LivePolicy} options.live Result of `readLivePolicy`.
1012
+ * @param {boolean} options.prune Whether EXTRA contexts may be removed.
1013
+ * @param {string|null} options.rulesetName Explicit fallback target.
1014
+ * @param {string[]} options.awaited Contexts an external app posts.
1015
+ * @param {Record<string, number>} options.pins Declared app id per context.
1016
+ * @param {Record<string, string>} options.homes Declared ruleset per context.
1017
+ * @returns {RepairAction[]} Context actions, one per ruleset written.
1018
+ */
1019
+ function planContextRepairs({
1020
+ contexts,
1021
+ live,
1022
+ prune,
1023
+ rulesetName,
1024
+ awaited,
1025
+ pins,
1026
+ homes,
1027
+ }) {
1028
+ /** @type {Map<string, {add: string[], remove: string[]}>} */
1029
+ const groups = new Map();
1030
+ const group = name => {
1031
+ if (!groups.has(name)) groups.set(name, { add: [], remove: [] });
1032
+ return groups.get(name);
1033
+ };
1034
+ const problems = [];
1035
+
1036
+ // A removal goes to the ruleset that actually requires it. That ruleset is
1037
+ // reported alongside every EXTRA context precisely so this is knowable.
1038
+ if (prune) {
1039
+ for (const entry of contexts.extra)
1040
+ group(entry.ruleset).remove.push(entry.context);
1041
+ }
1042
+
1043
+ let fallback;
1044
+ for (const context of contexts.missing) {
1045
+ const home = homes[context];
1046
+ if (home) {
1047
+ group(home).add.push(context);
1048
+ continue;
1049
+ }
1050
+ fallback ??= repairTarget(live.rulesets, rulesetName);
1051
+ if (!fallback.ruleset) {
1052
+ problems.push(fallback.problem);
1053
+ continue;
1054
+ }
1055
+ group(fallback.ruleset.name).add.push(context);
1056
+ }
1057
+
1058
+ const actions = [];
1059
+ for (const [name, { add, remove }] of groups) {
1060
+ const ruleset = (live.rulesets ?? []).find(entry => entry?.name === name);
1061
+ if (!ruleset) {
1062
+ actions.push({
1063
+ kind: "manual",
1064
+ message:
1065
+ `.lisa.config.json declares ${add.map(entry => `"${entry}"`).join(", ")} ` +
1066
+ `on a ruleset named "${name}", which this repository does not have. ` +
1067
+ `Seed it with scripts/lisa-github-rulesets.sh first — this script ` +
1068
+ `adds contexts to a ruleset, it does not create one.`,
1069
+ });
1070
+ continue;
1071
+ }
1072
+ actions.push({
1073
+ kind: "contexts",
1074
+ ruleset: ruleset.name,
1075
+ rulesetId: ruleset.id,
1076
+ add,
1077
+ remove,
1078
+ payload: rulesetPayload(ruleset, { add, remove, awaited, pins }),
1079
+ });
1080
+ }
1081
+ for (const problem of [...new Set(problems)]) {
1082
+ actions.push({ kind: "manual", message: problem });
1083
+ }
1084
+ return actions;
1085
+ }
1086
+
819
1087
  /**
820
1088
  * Execute a plan. Never called under `--dry-run` or outside `repair`.
821
1089
  * @param {object} options Write inputs.
@@ -882,12 +1150,15 @@ export function applyRepairs({ repo, gh, plan }) {
882
1150
  * @param {string|null} [options.rulesetName] Explicit repair target.
883
1151
  * @param {boolean} [options.ghMissing] Whether resolving `repo` failed because
884
1152
  * `gh` is not installed, rather than because nothing named the repository.
1153
+ * @param {object} [options.requiredChecks] The `github.rulesets.requiredChecks`
1154
+ * map, whose contexts are declared alongside the gate-derived ones.
885
1155
  * @returns {Reconciliation} The reconciliation result.
886
1156
  */
887
1157
  export function reconcile({
888
1158
  repo,
889
1159
  gates = {},
890
1160
  policy = {},
1161
+ requiredChecks = {},
891
1162
  gh = ghRunner,
892
1163
  moment = "pull-request",
893
1164
  workflowName = "🔍 Quality Checks",
@@ -898,7 +1169,13 @@ export function reconcile({
898
1169
  rulesetName = null,
899
1170
  ghMissing = false,
900
1171
  }) {
901
- const declared = contextsFor(gates, { moment, workflowName, previousLabels });
1172
+ const configured = declaredChecks(requiredChecks);
1173
+ const declared = [
1174
+ ...new Set([
1175
+ ...contextsFor(gates, { moment, workflowName, previousLabels }),
1176
+ ...configured.contexts,
1177
+ ]),
1178
+ ].sort((left, right) => left.localeCompare(right));
902
1179
  const base = { repo, moment, declared, onDrift, dryRun, prune };
903
1180
 
904
1181
  if (!repo) {
@@ -957,6 +1234,21 @@ export function reconcile({
957
1234
  prune,
958
1235
  rulesetName,
959
1236
  awaited: awaitedContexts(gates, moment),
1237
+ pins: { ...configured.pins, ...awaitedPins(gates, moment) },
1238
+ // An awaited context has no ruleset in its declaration — it is declared
1239
+ // on a GATE. Its home is the ruleset Lisa generates from config, which
1240
+ // is where the applier writes it, so the two writers agree instead of
1241
+ // the reconciler needing --ruleset to place a context the generator
1242
+ // already placed.
1243
+ homes: {
1244
+ ...Object.fromEntries(
1245
+ awaitedContexts(gates, moment).map(context => [
1246
+ context,
1247
+ POLICY_RULESET_NAME,
1248
+ ])
1249
+ ),
1250
+ ...configured.homes,
1251
+ },
960
1252
  })
961
1253
  : [];
962
1254
  const outcomes =
@@ -1140,6 +1432,7 @@ function main() {
1140
1432
  ghMissing,
1141
1433
  gates,
1142
1434
  policy,
1435
+ requiredChecks: config?.github?.rulesets?.requiredChecks ?? {},
1143
1436
  gh: ghRunner,
1144
1437
  moment: flag("moment") ?? "pull-request",
1145
1438
  workflowName: flag("workflow") ?? "🔍 Quality Checks",
@@ -24,7 +24,7 @@ import { resolveLisaPackageRoot } from "./gate-report-registry.js";
24
24
  * Read `.lisa.config.json` as a plain record.
25
25
  *
26
26
  * The whole file rather than only its `gates` block, because the per-repo
27
- * `github.rulesets.addRequiredChecks` and `dropRequiredChecks` opt-ins change
27
+ * `github.rulesets.requiredChecks` and `dropRequiredChecks` opt-ins change
28
28
  * which contexts a template actually ends up requiring.
29
29
  * @param projectRoot - Project root
30
30
  * @returns The parsed object, or null when it could not be read
@@ -1 +1 @@
1
- {"version":3,"file":"lisa-owned-hash-ledger.d.ts","sourceRoot":"","sources":["../../src/core/lisa-owned-hash-ledger.ts"],"names":[],"mappings":"AACA,6EAA6E;AAE7E;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAC3C,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAqgBjC,CAAC"}
1
+ {"version":3,"file":"lisa-owned-hash-ledger.d.ts","sourceRoot":"","sources":["../../src/core/lisa-owned-hash-ledger.ts"],"names":[],"mappings":"AACA,6EAA6E;AAE7E;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAC3C,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CA2gBjC,CAAC"}
@@ -286,6 +286,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
286
286
  "305da36e781086e7d0a6d58e9cdd26f1033a19787b35f1a60e37aab344b82f48",
287
287
  "31b71ad3ff4874bddcca3a7596c22b70505be90360806eea6706f8f47598fb01",
288
288
  "31c9de79a8a8e15178c7c2df0d2df91272226d18eef7d99c5ed37950159f9085",
289
+ "37c2c3642c3c8ea92b9d53d9c10e2b7365e4c5e757af54396ef0af06720a89c6",
289
290
  "407799d7eef3c61902cce4a9d4e194176453a28d8b562b327a75ec843da51684",
290
291
  "444ed4b879ef7af5dc409ae48743ad06354e47b727ddb5be0877cab52ddd0b64",
291
292
  "4634a1012f1c9ef991ce99ee98eb85a57d207e99b1da1bc760a67a09b5017946",
@@ -316,8 +317,10 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
316
317
  "c950082c3a0e7e987a8d32455eb16103cd0516c9b907f551a93395eb2e61d253",
317
318
  "cc4270e365f53c60a5eefb58a8ac8e22be184c0821fcdcc8fe67bcfc1df5e3dd",
318
319
  "ccbbab687ee2dbc572726ae187324af34b971075b6c808e1781005b489500429",
320
+ "cd41b2f04be5ba97be8fd6e618e8bccca4c4d0823acbc8e82c239b6d45dfe020",
319
321
  "d1b7ef530ea29a4ab1c5b1aaa13bd94262d2a0d16cfd7066345efc526457f44c",
320
322
  "d404a7f78facf07abf5633e3aeb9ba779334bfebd2989cc4cb38d1b37d96a2ba",
323
+ "d545c49bbe6bf31c224d4205ee1fcb8e849c057d5241913c19f83d4ba7195793",
321
324
  "dab7ae5948e26b49eb4caf0ef6be5f3a29b6ed013edef73904a20ba5e06a1b22",
322
325
  "dbca450e5a17133841ab015e71808feb028996f8297fda362dbeca4f07af2352",
323
326
  "e13d9c5ee11648cebae22d71890c0b81415c72e5e5b977472bffa810dfe52dd4",
@@ -325,6 +328,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
325
328
  "e7d928c3b2d878c7a9ec9589894dfc3feaba54b8913c87be0550c34a1431ed9f",
326
329
  "f0343c4ef3fde6576362eeb52e1ae3855108eba9d5034ccec8478db0637935d8",
327
330
  "f1bcdbc71883ee315034fe8e1dedfc83ea0d8e8ca5d445c455cfa448581a75a9",
331
+ "f8ae8672df5cc6e8485bbb5d9292a19ee0cac4d9b02c3489869f3352c61d8d2e",
328
332
  "f8ebc11f8bbb27ce8cea883044687f7c023302a928de1d917209cae84274367a",
329
333
  "f9e94e7daa0fffedefb224882c2944f66a8f39d60e6a4c1f4410975a7f98ef24",
330
334
  "fbd68cf571985d7cfccf0f280cfe8112955849126e44d27d55ad619f9abb79ef",
@@ -425,9 +429,11 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
425
429
  ]),
426
430
  "scripts/lisa-reconcile-policy.mjs": Object.freeze([
427
431
  "3c062d0b79961a9a93a822507e893dcdaa71d65d735557727d20464c2489d812",
432
+ "3e67eb4b0710ec195ad7efa4a8c2fd64063897d67725ea2627cf869c7e066201",
428
433
  "4b383ff960d7da53e0dd46e37632ef55c5a38b004fb4aabfe91a25a9fe02d88f",
429
434
  "9b613888c4c1cc6cc2b1fb6e162a4c766012eab0ec4f8b7f2ac1bc3da6622c97",
430
435
  "d429b5c3ad47553a73cdb2e0ea3ee81268df85d5374b06a93233d1971f7d15da",
436
+ "f490aa56b466d961d7372f94c2fb3f0e5deb31e53212a67dd79ac4afee48d4b4",
431
437
  ]),
432
438
  "scripts/lisa-run-gates.mjs": Object.freeze([
433
439
  "080c69ab998309a0a8b4f3be74c445056da02f1403c5654bea13477fc3178604",
@@ -1 +1 @@
1
- {"version":3,"file":"lisa-owned-hash-ledger.js","sourceRoot":"","sources":["../../src/core/lisa-owned-hash-ledger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lisa-owned-hash-ledger.js","sourceRoot":"","sources":["../../src/core/lisa-owned-hash-ledger.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,CAm8OjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,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,CAw8OjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,CAAC"}