@codyswann/lisa 3.67.0 → 3.69.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 (95) hide show
  1. package/all/copy-overwrite/scripts/lisa-gates.mjs +276 -8
  2. package/dist/codex/scripts/format-on-edit.sh +28 -0
  3. package/dist/codex/scripts/lint-on-edit.sh +28 -0
  4. package/dist/codex/scripts/lisa-edit-gate.sh +152 -0
  5. package/dist/codex/scripts/rubocop-on-edit.sh +28 -0
  6. package/dist/codex/scripts/sg-scan-on-edit.sh +28 -0
  7. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  8. package/dist/core/lisa-owned-hash-ledger.js +2 -0
  9. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  10. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  11. package/dist/core/upstream-evidence-manifest.js +30 -6
  12. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  13. package/package.json +1 -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-agy/plugin.json +1 -1
  17. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  18. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  19. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  20. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  21. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  22. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  23. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  24. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  25. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  26. package/plugins/lisa-expo-agy/plugin.json +1 -1
  27. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  31. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  32. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  36. package/plugins/lisa-nestjs/hooks/lisa-edit-gate.sh +152 -0
  37. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  38. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-nestjs-copilot/hooks/lisa-edit-gate.sh +152 -0
  40. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-nestjs-cursor/hooks/lisa-edit-gate.sh +152 -0
  42. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  44. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  45. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  49. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  50. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  54. package/plugins/lisa-rails/hooks/lisa-edit-gate.sh +152 -0
  55. package/plugins/lisa-rails/hooks/rubocop-on-edit.sh +23 -0
  56. package/plugins/lisa-rails/hooks/sg-scan-on-edit.sh +23 -0
  57. package/plugins/lisa-rails-agy/plugin.json +1 -1
  58. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-rails-copilot/hooks/lisa-edit-gate.sh +152 -0
  60. package/plugins/lisa-rails-copilot/hooks/rubocop-on-edit.sh +23 -0
  61. package/plugins/lisa-rails-copilot/hooks/sg-scan-on-edit.sh +23 -0
  62. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-rails-cursor/hooks/lisa-edit-gate.sh +152 -0
  64. package/plugins/lisa-rails-cursor/hooks/rubocop-on-edit.sh +23 -0
  65. package/plugins/lisa-rails-cursor/hooks/sg-scan-on-edit.sh +23 -0
  66. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  68. package/plugins/lisa-typescript/hooks/format-on-edit.sh +23 -0
  69. package/plugins/lisa-typescript/hooks/lint-on-edit.sh +23 -0
  70. package/plugins/lisa-typescript/hooks/lisa-edit-gate.sh +152 -0
  71. package/plugins/lisa-typescript/hooks/sg-scan-on-edit.sh +23 -0
  72. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  73. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  74. package/plugins/lisa-typescript-copilot/hooks/format-on-edit.sh +23 -0
  75. package/plugins/lisa-typescript-copilot/hooks/lint-on-edit.sh +23 -0
  76. package/plugins/lisa-typescript-copilot/hooks/lisa-edit-gate.sh +152 -0
  77. package/plugins/lisa-typescript-copilot/hooks/sg-scan-on-edit.sh +23 -0
  78. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  79. package/plugins/lisa-typescript-cursor/hooks/format-on-edit.sh +23 -0
  80. package/plugins/lisa-typescript-cursor/hooks/lint-on-edit.sh +23 -0
  81. package/plugins/lisa-typescript-cursor/hooks/lisa-edit-gate.sh +152 -0
  82. package/plugins/lisa-typescript-cursor/hooks/sg-scan-on-edit.sh +23 -0
  83. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  84. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  85. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  86. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  87. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  88. package/plugins/src/nestjs/hooks/lisa-edit-gate.sh +152 -0
  89. package/plugins/src/rails/hooks/lisa-edit-gate.sh +152 -0
  90. package/plugins/src/rails/hooks/rubocop-on-edit.sh +23 -0
  91. package/plugins/src/rails/hooks/sg-scan-on-edit.sh +23 -0
  92. package/plugins/src/typescript/hooks/format-on-edit.sh +23 -0
  93. package/plugins/src/typescript/hooks/lint-on-edit.sh +23 -0
  94. package/plugins/src/typescript/hooks/lisa-edit-gate.sh +152 -0
  95. package/plugins/src/typescript/hooks/sg-scan-on-edit.sh +23 -0
@@ -1349,14 +1349,20 @@ function onEditInvocation(gate, artifact, command) {
1349
1349
  job: null,
1350
1350
  command,
1351
1351
  steps: Object.freeze([]),
1352
- // Nothing to seed, and the REASON changed with the moment. A declaration
1353
- // at `post-tool` is now legal for all three properties; what keeps these
1354
- // ungoverned is that the scripts read no declaration at all, so writing one
1355
- // would not take the invocation over. `seedGates` declines them on exactly
1356
- // that ground, and they stay reported until the scripts resolve through the
1357
- // façade.
1352
+ // Nothing to seed, and the reason has changed TWICE now, which is why it
1353
+ // is written down rather than implied. It was "no gate lists this moment";
1354
+ // then it was "the scripts read no declaration at all"; it is now neither.
1355
+ // A declaration IS read and IS honoured what nothing reproduces is the
1356
+ // built-in itself, a per-file tool invocation (`oxlint <edited-file>`) that
1357
+ // no package task ships an equivalent of. Seeding the registry default
1358
+ // would declare a whole-project run in place of a per-file one, which is a
1359
+ // different command wearing the same name.
1358
1360
  seedRun: Object.freeze([]),
1359
- facade: NEVER_CONSULTS,
1361
+ // CONSULTS, since the façade landed. These scripts resolve the project's
1362
+ // declaration before touching their own tool, and fall back to it when
1363
+ // nothing is declared — the same shape as the pre-push and workflow
1364
+ // fallbacks, on the surface that had no configurability at all.
1365
+ facade: CONSULTS_THEN_FALLS_BACK,
1360
1366
  });
1361
1367
  }
1362
1368
 
@@ -2569,6 +2575,233 @@ function validateAwaitedContexts(gates) {
2569
2575
  return problems;
2570
2576
  }
2571
2577
 
2578
+ /**
2579
+ * How a declaration resolves to something able to run it.
2580
+ *
2581
+ * Five answers, and the separations are the whole value. A check that collapsed
2582
+ * them would rediscover "no runner exists for the deploy families" and file it
2583
+ * as an orphan — a different defect with its own issue — or call a property
2584
+ * proved by a step inside another job unenforced, which is worse than silence
2585
+ * because it is confidently wrong.
2586
+ */
2587
+ const EXECUTABLE = "executable";
2588
+ const ORPHANED = "orphaned";
2589
+ const NO_RUNNER_FOR_MOMENT = "no-runner-for-moment";
2590
+ const OUTSIDE_FACADE = "outside-facade";
2591
+ const VACUOUS_PROVER = "vacuous-prover";
2592
+
2593
+ export const EXECUTOR_VERDICTS = Object.freeze([
2594
+ EXECUTABLE,
2595
+ ORPHANED,
2596
+ NO_RUNNER_FOR_MOMENT,
2597
+ OUTSIDE_FACADE,
2598
+ VACUOUS_PROVER,
2599
+ ]);
2600
+
2601
+ /**
2602
+ * Verdicts that make a declaration a configuration ERROR.
2603
+ *
2604
+ * The other two are facts about Lisa, not about the project: a moment family
2605
+ * with no runner yet is a roadmap item with its own issue, and a property
2606
+ * proved outside the façade IS enforced. Refusing either would turn a report
2607
+ * about the project's governance into a report about Lisa's backlog.
2608
+ */
2609
+ const BLOCKING_VERDICTS = Object.freeze([ORPHANED, VACUOUS_PROVER]);
2610
+
2611
+ /** Moment families whose executor is the generic hook runner. */
2612
+ const HOOK_RUNNER_MOMENTS = Object.freeze([
2613
+ SESSION_START,
2614
+ PRE_TOOL,
2615
+ POST_TOOL,
2616
+ COMMIT,
2617
+ PUSH,
2618
+ ]);
2619
+
2620
+ /**
2621
+ * Gates whose only prover reports findings and cannot fail.
2622
+ *
2623
+ * A declaration in front of a prover with a guaranteed-zero exit reads as
2624
+ * governed everywhere that reads the registry while proving nothing — the
2625
+ * vacuous green this whole subsystem exists to refuse. `required` in front of
2626
+ * one is refused outright; `optional` is reported, because "advisory, and we
2627
+ * know" is a coherent position and "required, proved by something that cannot
2628
+ * fail" is not.
2629
+ *
2630
+ * The value is the operator-readable reason, and it names the prover, because a
2631
+ * refusal that does not say WHICH executor is advisory sends the reader to the
2632
+ * gate — which is not the thing that is wrong.
2633
+ */
2634
+ export const ADVISORY_PROVERS = Object.freeze({
2635
+ "version-duplication":
2636
+ "duplicate-versions.yml runs in advisory mode: it reports duplicates and " +
2637
+ "exits 0 whatever it finds. Nothing it can discover will fail a check, so " +
2638
+ "a required declaration in front of it is a guarantee of nothing. The " +
2639
+ "pairing becomes valid when that workflow runs with --strict.",
2640
+ });
2641
+
2642
+ /**
2643
+ * Gates proved by a step inside a job the façade does not represent.
2644
+ *
2645
+ * A THIRD thing, distinct from both "executable" and "orphaned", and the
2646
+ * distinction is not academic: `conflict-residue` was exactly this case until a
2647
+ * dedicated job was built for it — proved by a step inside a multi-purpose
2648
+ * workflow — and a classifier without this verdict would have called it an
2649
+ * orphan and implied the property was unenforced. It was not.
2650
+ *
2651
+ * The value says where the prover lives, so the report can say "proved
2652
+ * elsewhere" rather than "proved by nothing".
2653
+ *
2654
+ * EMPTY TODAY, deliberately and visibly. The one member it had was retired by
2655
+ * being given a real job. The verdict stays because the shape recurs, and
2656
+ * `tests/unit/scripts/lisa-gates-declared-executors` exercises it against a
2657
+ * synthetic entry rather than leaving a branch nothing reaches.
2658
+ */
2659
+ export const PROVED_OUTSIDE_FACADE = Object.freeze({});
2660
+
2661
+ /**
2662
+ * The level one moment entry declares.
2663
+ * @param {unknown} entry The value under a moment key.
2664
+ * @returns {string} The level, or the empty string when it declares none.
2665
+ */
2666
+ function declaredLevel(entry) {
2667
+ if (typeof entry === "string") return entry;
2668
+ if (entry !== null && typeof entry === "object") {
2669
+ const { level } = entry;
2670
+ if (typeof level === "string") return level;
2671
+ }
2672
+ return "";
2673
+ }
2674
+
2675
+ /**
2676
+ * The task one gate resolves to, honouring a `run:` override.
2677
+ * @param {string} gate Gate id.
2678
+ * @param {object} block The gate's own block from the config.
2679
+ * @returns {string|undefined} The task name.
2680
+ */
2681
+ function declaredTask(gate, block) {
2682
+ const override =
2683
+ block !== null && typeof block === "object" ? block.run : undefined;
2684
+ return typeof override === "string" ? override : REGISTRY[gate]?.task;
2685
+ }
2686
+
2687
+ /**
2688
+ * Classify every declaration by whether anything can execute it.
2689
+ *
2690
+ * MOMENT-AWARE, or it is wrong on its first run. The hook moments have a
2691
+ * generic executor — `lisa-run-gates.mjs` resolves whatever a moment declares
2692
+ * and runs `<runner> <task>` — so a declaration there needs a TASK. The
2693
+ * pull-request moment has no such runner: it has one hand-written block per
2694
+ * gate and `QUALITY_JOB_GATES` is the record of which ones exist, so a
2695
+ * declaration there needs a JOB. A check asking the pull-request question at
2696
+ * every moment flags declarations that work.
2697
+ *
2698
+ * `off` is skipped, and for a sharper reason than tidiness: it is a declaration
2699
+ * NOT to run and the only route that removes the required context along with
2700
+ * the job, which is what makes it the safe alternative to `skip_jobs`.
2701
+ * Demanding an executor for it would argue against the mechanism this check
2702
+ * exists to protect.
2703
+ *
2704
+ * `await` is skipped because it asks for nothing to be run — its prover is an
2705
+ * external app, which is the entire meaning of awaiting. `validateGates`
2706
+ * already refuses a malformed await.
2707
+ *
2708
+ * `scripts` of `null` means UNKNOWN, not empty, and nothing is reported from
2709
+ * it. A manifest this process could not read must never make every hook-moment
2710
+ * declaration look like an orphan.
2711
+ * @param {object} options Inputs.
2712
+ * @param {object} options.gates The gates block.
2713
+ * @param {Record<string, string>|null} [options.scripts] The project's package scripts, or null when unknown.
2714
+ * @param {Record<string, string>} [options.outsideFacade] Gates proved by a step the façade does not represent. A SEAM, not configuration: the shipped table is empty today, and a branch nothing can reach is a branch nothing tests.
2715
+ * @returns {Array<{gate: string, moment: string, level: string, verdict: string, detail: string}>} One finding per declaration that is not plainly executable.
2716
+ */
2717
+ export function classifyDeclaredExecutors({
2718
+ gates,
2719
+ scripts,
2720
+ outsideFacade = PROVED_OUTSIDE_FACADE,
2721
+ }) {
2722
+ const findings = [];
2723
+ for (const [gate, block] of Object.entries(gates ?? {})) {
2724
+ if (!Object.hasOwn(REGISTRY, gate)) continue;
2725
+ if (block === null || typeof block !== "object") continue;
2726
+ for (const [moment, entry] of Object.entries(block)) {
2727
+ // The deploy families are NOT in `MOMENTS` — `isMoment` alone skips
2728
+ // them, which would silently exempt exactly the declarations the
2729
+ // `no-runner-for-moment` verdict exists to report. The configuration
2730
+ // keys that are not moments at all (`run`, `needs`, `evidence`) fall out
2731
+ // of both checks.
2732
+ if (!isMoment(moment) && !MOMENT_FAMILIES.includes(momentFamily(moment)))
2733
+ continue;
2734
+ const level = declaredLevel(entry);
2735
+ if (level === "off") continue;
2736
+ if (entry !== null && typeof entry === "object" && entry.await) continue;
2737
+ const finding = verdictFor({
2738
+ gate,
2739
+ block,
2740
+ moment,
2741
+ level,
2742
+ scripts,
2743
+ outsideFacade,
2744
+ });
2745
+ if (finding !== null) findings.push(finding);
2746
+ }
2747
+ }
2748
+ return findings;
2749
+ }
2750
+
2751
+ /**
2752
+ * One declaration's verdict, or null when it is plainly executable.
2753
+ * @param {object} options The declaration.
2754
+ * @param {string} options.gate Gate id.
2755
+ * @param {object} options.block The gate's block.
2756
+ * @param {string} options.moment Declared moment.
2757
+ * @param {string} options.level Declared level.
2758
+ * @param {Record<string, string>|null|undefined} options.scripts Project scripts.
2759
+ * @param {Record<string, string>} options.outsideFacade Gates proved outside the façade.
2760
+ * @returns {{gate: string, moment: string, level: string, verdict: string, detail: string}|null} The finding.
2761
+ */
2762
+ function verdictFor({ gate, block, moment, level, scripts, outsideFacade }) {
2763
+ const make = (verdict, detail) => ({ gate, moment, level, verdict, detail });
2764
+ if (level === "required" && Object.hasOwn(ADVISORY_PROVERS, gate)) {
2765
+ return make(VACUOUS_PROVER, ADVISORY_PROVERS[gate]);
2766
+ }
2767
+ if (Object.hasOwn(outsideFacade, gate)) {
2768
+ return make(
2769
+ OUTSIDE_FACADE,
2770
+ `${gate} is proved by ${outsideFacade[gate]}, which the gate ` +
2771
+ `façade does not represent. The property IS enforced; nothing here ` +
2772
+ `runs it.`
2773
+ );
2774
+ }
2775
+ const family = momentFamily(moment);
2776
+ if (HOOK_RUNNER_MOMENTS.includes(family)) {
2777
+ if (scripts === null || scripts === undefined) return null;
2778
+ const task = declaredTask(gate, block);
2779
+ if (task !== undefined && Object.hasOwn(scripts, task)) return null;
2780
+ return make(
2781
+ ORPHANED,
2782
+ `gates."${gate}"."${moment}" resolves to the task "${task}", and this ` +
2783
+ `project has no such script. The hook runner would find nothing to ` +
2784
+ `run, so the level in front of it describes nothing.`
2785
+ );
2786
+ }
2787
+ if (family === PULL_REQUEST) {
2788
+ if (Object.values(QUALITY_JOB_GATES).includes(gate)) return null;
2789
+ return make(
2790
+ ORPHANED,
2791
+ `gates."${gate}"."${moment}" is declared at a moment whose executor is a ` +
2792
+ `CI job, and no job resolves this gate id. A "required" level here ` +
2793
+ `derives a branch-protection context nothing will ever post, which ` +
2794
+ `holds every pull request at "Expected — Waiting for status to be ` +
2795
+ `reported" indefinitely.`
2796
+ );
2797
+ }
2798
+ return make(
2799
+ NO_RUNNER_FOR_MOMENT,
2800
+ `nothing runs gates at "${moment}" at all yet, so this declaration is ` +
2801
+ `inert rather than wrong. A different defect, tracked separately.`
2802
+ );
2803
+ }
2804
+
2572
2805
  /**
2573
2806
  * Fail fast when a consumer tries to use an invalid gates block.
2574
2807
  *
@@ -3424,7 +3657,42 @@ function main() {
3424
3657
  // suppress "configuration is valid" for every project that ever runs this,
3425
3658
  // which turns the verdict into noise and trains an operator to ignore both.
3426
3659
  reportUngoverned(gates);
3427
- const blocking = [...validateGates(gates), ...validatePolicy(policy)];
3660
+ const executors = classifyDeclaredExecutors({ gates, scripts });
3661
+ // BLOCKING, and this is the change #2843 called "the substantive work".
3662
+ // The classifier existed as a vitest suite reading THIS repository's own
3663
+ // config — so the check existed for Lisa and did not exist for anyone Lisa
3664
+ // ships to. A consumer could declare a gate no job resolves, run
3665
+ // `validate`, get exit 0, and be told nothing.
3666
+ //
3667
+ // Only two verdicts block. `no-runner-for-moment` is a different defect
3668
+ // with its own issue, and `outside-facade` says the property IS enforced
3669
+ // — refusing either would turn a report about governance into a report
3670
+ // about Lisa's own roadmap.
3671
+ const unrunnable = executors.filter(finding =>
3672
+ BLOCKING_VERDICTS.includes(finding.verdict)
3673
+ );
3674
+ // The two non-blocking verdicts print HERE rather than as advisory
3675
+ // findings. An advisory finding suppresses "configuration is valid", and
3676
+ // both of these are statements about Lisa — a moment family with no runner
3677
+ // yet, and a property proved outside the façade — so letting them withhold
3678
+ // the verdict would make it unreachable for projects that have done
3679
+ // nothing wrong.
3680
+ for (const finding of executors.filter(
3681
+ candidate => !unrunnable.includes(candidate)
3682
+ )) {
3683
+ console.log(
3684
+ ` NOTE gates."${finding.gate}"."${finding.moment}": ${finding.detail}`
3685
+ );
3686
+ }
3687
+ const blocking = [
3688
+ ...validateGates(gates),
3689
+ ...validatePolicy(policy),
3690
+ ...unrunnable.map(
3691
+ finding =>
3692
+ `gates."${finding.gate}"."${finding.moment}" is declared ` +
3693
+ `"${finding.level}" and is UNRUNNABLE at that moment: ${finding.detail}`
3694
+ ),
3695
+ ];
3428
3696
  const advisory = [
3429
3697
  ...auditConfigKeys(config).map(finding => finding.message),
3430
3698
  ...auditProvers({ gates, runner, scripts }),
@@ -16,6 +16,34 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
16
16
  # shellcheck source=/dev/null
17
17
  . "${SCRIPT_DIR}/_extract-edit-paths.sh"
18
18
 
19
+ # ---------------------------------------------------------------------------
20
+ # Gate façade. The project's declaration decides BEFORE any tool is resolved.
21
+ # Full contract, and why an undeclared project sees no change at all, in
22
+ # lisa-edit-gate.sh beside this file.
23
+ #
24
+ # This surface differs from the Claude one in shape only: one invocation can
25
+ # carry several edited paths, so the declared task runs once per path with
26
+ # LISA_EDITED_FILE set, and a failure on any path is the script's status.
27
+ #
28
+ # All-or-nothing across the properties this script proves: a single invocation
29
+ # that proves more than one stands down only when EVERY one is declared, or it
30
+ # would silently stop proving the others.
31
+ # ---------------------------------------------------------------------------
32
+ # shellcheck source=/dev/null
33
+ . "${SCRIPT_DIR}/lisa-edit-gate.sh"
34
+ if LISA_GATE_COMMANDS="$(lisa_edit_gate_tasks post-tool format-conformance)"; then
35
+ LISA_GATE_STATUS=0
36
+ while IFS= read -r LISA_GATE_FILE; do
37
+ [ -n "${LISA_GATE_FILE}" ] || continue
38
+ lisa_edit_gate_run "${LISA_GATE_FILE}" "$LISA_GATE_COMMANDS" ||
39
+ LISA_GATE_STATUS=1
40
+ done <<LISA_GATE_PATHS
41
+ $(lisa_extract_edit_paths "$JSON_INPUT")
42
+ LISA_GATE_PATHS
43
+ exit "$LISA_GATE_STATUS"
44
+ fi
45
+
46
+
19
47
  # Resolve the formatter once, up front.
20
48
  if [ -x "./node_modules/.bin/prettier" ]; then
21
49
  PRETTIER="./node_modules/.bin/prettier"
@@ -15,6 +15,34 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
15
15
  # shellcheck source=/dev/null
16
16
  . "${SCRIPT_DIR}/_extract-edit-paths.sh"
17
17
 
18
+ # ---------------------------------------------------------------------------
19
+ # Gate façade. The project's declaration decides BEFORE any tool is resolved.
20
+ # Full contract, and why an undeclared project sees no change at all, in
21
+ # lisa-edit-gate.sh beside this file.
22
+ #
23
+ # This surface differs from the Claude one in shape only: one invocation can
24
+ # carry several edited paths, so the declared task runs once per path with
25
+ # LISA_EDITED_FILE set, and a failure on any path is the script's status.
26
+ #
27
+ # All-or-nothing across the properties this script proves: a single invocation
28
+ # that proves more than one stands down only when EVERY one is declared, or it
29
+ # would silently stop proving the others.
30
+ # ---------------------------------------------------------------------------
31
+ # shellcheck source=/dev/null
32
+ . "${SCRIPT_DIR}/lisa-edit-gate.sh"
33
+ if LISA_GATE_COMMANDS="$(lisa_edit_gate_tasks post-tool code-style)"; then
34
+ LISA_GATE_STATUS=0
35
+ while IFS= read -r LISA_GATE_FILE; do
36
+ [ -n "${LISA_GATE_FILE}" ] || continue
37
+ lisa_edit_gate_run "${LISA_GATE_FILE}" "$LISA_GATE_COMMANDS" ||
38
+ LISA_GATE_STATUS=1
39
+ done <<LISA_GATE_PATHS
40
+ $(lisa_extract_edit_paths "$JSON_INPUT")
41
+ LISA_GATE_PATHS
42
+ exit "$LISA_GATE_STATUS"
43
+ fi
44
+
45
+
18
46
  if [ -x "./node_modules/.bin/oxlint" ]; then
19
47
  OXLINT="./node_modules/.bin/oxlint"
20
48
  elif command -v oxlint >/dev/null 2>&1; then
@@ -0,0 +1,152 @@
1
+ #!/bin/bash
2
+ # This file is managed by Lisa.
3
+ # Do not edit directly — changes will be overwritten on the next `lisa` run.
4
+ # =============================================================================
5
+ # Edit-time gate façade
6
+ # =============================================================================
7
+ # Sourced by every on-edit hook. Answers one question before the hook runs
8
+ # anything: has the project declared what proves this property at this moment,
9
+ # and if so what should run instead of Lisa's written-in tool?
10
+ #
11
+ # WHY THIS EXISTS. Edit time is the highest-frequency enforcement surface Lisa
12
+ # owns and was the one surface with no configurability at all. The scripts
13
+ # resolved a RUNNER (`./node_modules/.bin/oxlint`, else `bunx`/`npx`) and
14
+ # hardcoded the TOOL, which is the inversion the gate registry exists to fix.
15
+ # Worse, they exit 2 — refusing the edit — when the written-in binary or config
16
+ # filename is absent, so a project that lints correctly with something else had
17
+ # every agent write refused until it installed Lisa's choice.
18
+ #
19
+ # THE CONTRACT, and the two halves that matter equally:
20
+ #
21
+ # declared -> the project's task runs and the hook's written-in tool is
22
+ # never consulted, so a missing binary cannot refuse the edit.
23
+ # undeclared -> NOTHING changes. The resolver is not even invoked when no
24
+ # registry is installed, and the hook falls through to exactly
25
+ # the command it ran before. That is the overwhelming majority
26
+ # of projects, and it is the case a façade silently breaks.
27
+ #
28
+ # ALL OR NOTHING FOR A MULTI-PROPERTY SCRIPT. `lisa_edit_gate_tasks` takes every
29
+ # property its caller proves and resolves only when EVERY one is declared. The
30
+ # Rails hook runs `rubocop -a` and then a second pass for unfixable errors — its
31
+ # own header calls it both formatter and linter — so standing down on `code-style`
32
+ # alone would silently stop proving `format-conformance`. Same shape as
33
+ # `lisa_gate_covers test-correctness coverage-adequacy` in the pre-push hook.
34
+ #
35
+ # HOW THE DECLARED TASK LEARNS WHICH FILE WAS EDITED. It does not take an
36
+ # argument: `<runner> <task>` with no arguments is the invocation every other
37
+ # Lisa façade uses, and adding a positional here would make the declaration
38
+ # mean something different at this moment than at every other one. The path is
39
+ # exported as LISA_EDITED_FILE instead, so a project that wants a per-file run
40
+ # can scope its own task and one that does not gets a whole-project run.
41
+ # =============================================================================
42
+
43
+ # Where the gate registry may be installed, in resolution order.
44
+ lisa_edit_gate_registry() {
45
+ for _lisa_candidate in \
46
+ "node_modules/@codyswann/lisa/all/copy-overwrite/scripts/lisa-gates.mjs" \
47
+ "scripts/lisa-gates.mjs" \
48
+ "all/copy-overwrite/scripts/lisa-gates.mjs"
49
+ do
50
+ if [ -f "$_lisa_candidate" ]; then
51
+ printf '%s' "$_lisa_candidate"
52
+ unset _lisa_candidate
53
+ return 0
54
+ fi
55
+ done
56
+ unset _lisa_candidate
57
+ return 1
58
+ }
59
+
60
+ # lisa_edit_gate_tasks <moment> <gate-id>...
61
+ #
62
+ # Prints one `<runner> <task>` line per DISTINCT declared task and returns 0,
63
+ # but only when every named gate resolves to a runnable task at <moment>.
64
+ # Returns 1 and prints nothing otherwise — including when no registry is
65
+ # installed, when node is unavailable, and when the resolver itself fails.
66
+ #
67
+ # Fail-safe in the direction that keeps proving things: any doubt returns 1 and
68
+ # the caller runs its built-in. A resolver that could not answer must never read
69
+ # as "the project has this covered".
70
+ lisa_edit_gate_tasks() {
71
+ _lisa_moment="$1"
72
+ shift
73
+ [ -n "$_lisa_moment" ] || { unset _lisa_moment; return 1; }
74
+ [ "$#" -gt 0 ] || { unset _lisa_moment; return 1; }
75
+ # NO SETTINGS FILE, NO SPAWN. Checked before anything else because this is
76
+ # the path essentially every project is on, and it runs on EVERY agent
77
+ # edit: asking the resolver would cost a node process per keystroke-sized
78
+ # write to answer "nothing is declared", which the absent file already
79
+ # answers. The equivalence control compares which COMMAND runs and would
80
+ # not have caught the cost.
81
+ [ -f .lisa.config.json ] || { unset _lisa_moment; return 1; }
82
+ command -v node >/dev/null 2>&1 || { unset _lisa_moment; return 1; }
83
+
84
+ _lisa_registry="$(lisa_edit_gate_registry)" || {
85
+ unset _lisa_moment _lisa_registry
86
+ return 1
87
+ }
88
+
89
+ # EXPORTED, not prefixed. An assignment prefix reaches only the FIRST
90
+ # command of a pipeline, and the filter that reads it is the second — so
91
+ # the prefixed form resolved an empty want-list and every script fell
92
+ # silently back to its built-in, which is a façade that looks wired and is
93
+ # not.
94
+ LISA_GATE_IDS="$*"
95
+ export LISA_GATE_IDS
96
+ _lisa_out="$(
97
+ node "$_lisa_registry" list \
98
+ --moment="$_lisa_moment" --json 2>/dev/null | node -e '
99
+ let raw = "";
100
+ process.stdin.on("data", chunk => { raw += chunk }).on("end", () => {
101
+ let resolved;
102
+ try { resolved = JSON.parse(raw || "[]"); } catch { process.exit(1); }
103
+ const wanted = (process.env.LISA_GATE_IDS || "").split(" ").filter(Boolean);
104
+ const commands = [];
105
+ for (const id of wanted) {
106
+ const hit = resolved.find(gate => gate.id === id);
107
+ // `run` mode with a task is the only shape that PROVES anything here. An
108
+ // awaited gate proves nothing at edit time and an intercepted one is
109
+ // Lisa running it elsewhere; both must leave the built-in in charge.
110
+ if (!hit || hit.mode !== "run" || !hit.command) process.exit(1);
111
+ if (!commands.includes(hit.command)) commands.push(hit.command);
112
+ }
113
+ if (commands.length === 0) process.exit(1);
114
+ process.stdout.write(commands.join("\n"));
115
+ });
116
+ '
117
+ )" || {
118
+ unset _lisa_moment _lisa_registry _lisa_out
119
+ return 1
120
+ }
121
+
122
+ [ -n "$_lisa_out" ] || {
123
+ unset _lisa_moment _lisa_registry _lisa_out
124
+ return 1
125
+ }
126
+ printf '%s' "$_lisa_out"
127
+ unset _lisa_moment _lisa_registry _lisa_out
128
+ return 0
129
+ }
130
+
131
+ # lisa_edit_gate_run <edited-file> <commands>
132
+ #
133
+ # Runs each resolved command with LISA_EDITED_FILE exported. Exits 2 on the
134
+ # first failure, which is the same refusal the built-in path uses, so a
135
+ # declared task that finds a real problem still stops the agent.
136
+ lisa_edit_gate_run() {
137
+ _lisa_file="$1"
138
+ shift
139
+ LISA_EDITED_FILE="$_lisa_file"
140
+ export LISA_EDITED_FILE
141
+ printf '%s\n' "$*" | while IFS= read -r _lisa_command; do
142
+ [ -n "$_lisa_command" ] || continue
143
+ echo "Running declared gate task: $_lisa_command"
144
+ # Deliberate word split: the resolver validated both halves as plain
145
+ # words, so no shell metacharacter reaches argv.
146
+ # shellcheck disable=SC2086
147
+ $_lisa_command || exit 2
148
+ done
149
+ _lisa_status=$?
150
+ unset _lisa_file _lisa_command
151
+ return $_lisa_status
152
+ }
@@ -16,6 +16,34 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
16
16
  # shellcheck source=/dev/null
17
17
  . "${SCRIPT_DIR}/_extract-edit-paths.sh"
18
18
 
19
+ # ---------------------------------------------------------------------------
20
+ # Gate façade. The project's declaration decides BEFORE any tool is resolved.
21
+ # Full contract, and why an undeclared project sees no change at all, in
22
+ # lisa-edit-gate.sh beside this file.
23
+ #
24
+ # This surface differs from the Claude one in shape only: one invocation can
25
+ # carry several edited paths, so the declared task runs once per path with
26
+ # LISA_EDITED_FILE set, and a failure on any path is the script's status.
27
+ #
28
+ # All-or-nothing across the properties this script proves: a single invocation
29
+ # that proves more than one stands down only when EVERY one is declared, or it
30
+ # would silently stop proving the others.
31
+ # ---------------------------------------------------------------------------
32
+ # shellcheck source=/dev/null
33
+ . "${SCRIPT_DIR}/lisa-edit-gate.sh"
34
+ if LISA_GATE_COMMANDS="$(lisa_edit_gate_tasks post-tool code-style format-conformance)"; then
35
+ LISA_GATE_STATUS=0
36
+ while IFS= read -r LISA_GATE_FILE; do
37
+ [ -n "${LISA_GATE_FILE}" ] || continue
38
+ lisa_edit_gate_run "${LISA_GATE_FILE}" "$LISA_GATE_COMMANDS" ||
39
+ LISA_GATE_STATUS=1
40
+ done <<LISA_GATE_PATHS
41
+ $(lisa_extract_edit_paths "$JSON_INPUT")
42
+ LISA_GATE_PATHS
43
+ exit "$LISA_GATE_STATUS"
44
+ fi
45
+
46
+
19
47
  if command -v bundle >/dev/null 2>&1 && [ -f "./Gemfile" ]; then
20
48
  RUBOCOP=(bundle exec rubocop)
21
49
  elif command -v rubocop >/dev/null 2>&1; then
@@ -16,6 +16,34 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
16
16
  # shellcheck source=/dev/null
17
17
  . "${SCRIPT_DIR}/_extract-edit-paths.sh"
18
18
 
19
+ # ---------------------------------------------------------------------------
20
+ # Gate façade. The project's declaration decides BEFORE any tool is resolved.
21
+ # Full contract, and why an undeclared project sees no change at all, in
22
+ # lisa-edit-gate.sh beside this file.
23
+ #
24
+ # This surface differs from the Claude one in shape only: one invocation can
25
+ # carry several edited paths, so the declared task runs once per path with
26
+ # LISA_EDITED_FILE set, and a failure on any path is the script's status.
27
+ #
28
+ # All-or-nothing across the properties this script proves: a single invocation
29
+ # that proves more than one stands down only when EVERY one is declared, or it
30
+ # would silently stop proving the others.
31
+ # ---------------------------------------------------------------------------
32
+ # shellcheck source=/dev/null
33
+ . "${SCRIPT_DIR}/lisa-edit-gate.sh"
34
+ if LISA_GATE_COMMANDS="$(lisa_edit_gate_tasks post-tool structural-rules)"; then
35
+ LISA_GATE_STATUS=0
36
+ while IFS= read -r LISA_GATE_FILE; do
37
+ [ -n "${LISA_GATE_FILE}" ] || continue
38
+ lisa_edit_gate_run "${LISA_GATE_FILE}" "$LISA_GATE_COMMANDS" ||
39
+ LISA_GATE_STATUS=1
40
+ done <<LISA_GATE_PATHS
41
+ $(lisa_extract_edit_paths "$JSON_INPUT")
42
+ LISA_GATE_PATHS
43
+ exit "$LISA_GATE_STATUS"
44
+ fi
45
+
46
+
19
47
  if [ -x "./node_modules/.bin/ast-grep" ]; then
20
48
  AST_GREP="./node_modules/.bin/ast-grep"
21
49
  elif command -v ast-grep >/dev/null 2>&1; then
@@ -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,CAuhBjC,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,CAyhBjC,CAAC"}
@@ -305,6 +305,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
305
305
  "5d4099e9c6fe5978fba206a069ae6a68d899ef33a57e110ea65e1d4c39328ee1",
306
306
  "5f5eeda36a19fc6b99f621128b192d07ec79e4735b4514c9b20ae94a3e29c4b5",
307
307
  "60b961b1bd4a01f17fc0c19dd09b2505958bdeaa5c1030868835ac628e77d97f",
308
+ "6d9bc1c708a7cc585e7f8c4539ec28e4a29cbfd9a0c08b5a96760f8f0865453d",
308
309
  "7249cbe9f8fddfa6087331fa7fccd9df9813f5ba764623b747273a0ebbcbb576",
309
310
  "75b3bed6034e81ece759b4566291f26be9c6f51ebd3444ae9232964588a71a66",
310
311
  "78545c144834f42ffa97174fb5a36edb66c63634f738ac5a0890bae8ccd7f2f6",
@@ -319,6 +320,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
319
320
  "a5dad9842c65c0949f5f3890fb61a1c26fb2b5bac8616e9242ae3a144c095787",
320
321
  "a755c64ed82aec1e1af096c93e51541548d8ad9eafb361469dbe4fc9b1205a61",
321
322
  "a8af7e575c086970a50cb389a159946ce1755318035ca2baecd1486f2c5b7dbc",
323
+ "ac6c1a5852cadbc421e34d74879cca70a668dd4c779e205713a43be75360b79e",
322
324
  "b19f334763699490cffdc2819b4848a798fcecbce82d19791cd57ea8bc92ffeb",
323
325
  "bba52f26e70e0dc399a8ed8ea9cbd3885a18f08401b28bd18871a1af4fbca375",
324
326
  "bbb49c8d803179f7081816144011ed1f3752673eb249ff21dd738412f0302e77",
@@ -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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"}