@codyswann/lisa 4.27.4 → 4.27.6
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/all/copy-overwrite/scripts/lisa-enforcement-fallback.sh +27 -4
- package/all/copy-overwrite/scripts/lisa-work-item.mjs +167 -2
- package/dist/cli/doctor-enforcement-coverage.d.ts +14 -0
- package/dist/cli/doctor-enforcement-coverage.d.ts.map +1 -0
- package/dist/cli/doctor-enforcement-coverage.js +103 -0
- package/dist/cli/doctor-enforcement-coverage.js.map +1 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +9 -0
- package/dist/cli/doctor.js.map +1 -1
- package/dist/core/enforcement-census-report.d.ts +19 -0
- package/dist/core/enforcement-census-report.d.ts.map +1 -0
- package/dist/core/enforcement-census-report.js +198 -0
- package/dist/core/enforcement-census-report.js.map +1 -0
- package/dist/core/enforcement-census.d.ts +177 -0
- package/dist/core/enforcement-census.d.ts.map +1 -0
- package/dist/core/enforcement-census.js +252 -0
- package/dist/core/enforcement-census.js.map +1 -0
- package/dist/core/enforcement-coverage.d.ts +168 -0
- package/dist/core/enforcement-coverage.d.ts.map +1 -0
- package/dist/core/enforcement-coverage.js +342 -0
- package/dist/core/enforcement-coverage.js.map +1 -0
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +10 -0
- package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
- package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +25 -7
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/migrations/ensure-push-default-safe.d.ts +50 -0
- package/dist/migrations/ensure-push-default-safe.d.ts.map +1 -0
- package/dist/migrations/ensure-push-default-safe.js +159 -0
- package/dist/migrations/ensure-push-default-safe.js.map +1 -0
- package/dist/migrations/index.d.ts +1 -0
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +3 -0
- package/dist/migrations/index.js.map +1 -1
- package/package.json +4 -3
- 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-setup-automations/SKILL.md +23 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-sync-down/SKILL.md +8 -1
- package/plugins/lisa/skills/lisa-setup-automations/SKILL.md +23 -0
- package/plugins/lisa/skills/lisa-sync-down/SKILL.md +8 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-setup-automations/SKILL.md +23 -0
- package/plugins/lisa-agy/skills/lisa-sync-down/SKILL.md +8 -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-setup-automations/SKILL.md +23 -0
- package/plugins/lisa-copilot/skills/lisa-sync-down/SKILL.md +8 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/skills/lisa-setup-automations/SKILL.md +23 -0
- package/plugins/lisa-cursor/skills/lisa-sync-down/SKILL.md +8 -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-setup-automations/SKILL.md +23 -0
- package/plugins/src/base/skills/lisa-sync-down/SKILL.md +8 -1
- package/scripts/lisa-commit-and-pr-local.sh +22 -6
- package/scripts/lisa-enforcement-census.mjs +168 -0
- package/scripts/lisa-enforcement-fallback.sh +27 -4
- package/typescript/copy-contents/.husky/pre-push +70 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The guards the dispatcher runs, in its own order.
|
|
3
|
+
*
|
|
4
|
+
* Kept as data rather than inferred from the directory listing: a census that
|
|
5
|
+
* asks "which guard files are here" cannot notice a guard that is missing
|
|
6
|
+
* everywhere, which is the case it most needs to report.
|
|
7
|
+
*/
|
|
8
|
+
export declare const ENFORCEMENT_GUARDS: readonly ["block-no-verify", "parity-safety-net", "block-shell-json-parsing", "block-instruction-file-edits", "block-direct-issue-create", "block-managed-file-edits"];
|
|
9
|
+
/** Which of the two trees a resolved guard came from. */
|
|
10
|
+
export type GuardTree = "host" | "plugin";
|
|
11
|
+
/**
|
|
12
|
+
* How much enforcement a checkout resolves.
|
|
13
|
+
*
|
|
14
|
+
* `unreadable` is a first-class answer and never a synonym for any of the
|
|
15
|
+
* others: a checkout the census could not look into has not been shown to
|
|
16
|
+
* resolve anything, and has not been shown to resolve nothing either.
|
|
17
|
+
*/
|
|
18
|
+
export type CoverageResolution = "unreadable" | "none" | "partial" | "full";
|
|
19
|
+
/**
|
|
20
|
+
* How old the copy in force is.
|
|
21
|
+
*
|
|
22
|
+
* `not-applicable` belongs to checkouts that resolve nothing — they have no
|
|
23
|
+
* copy to be old. That value is what makes it structurally impossible to count
|
|
24
|
+
* an unguarded checkout as a stale one.
|
|
25
|
+
*/
|
|
26
|
+
export type CoverageVintage = "current" | "behind" | "undateable" | "not-applicable";
|
|
27
|
+
/** One guard and the copy that would run for it, if any. */
|
|
28
|
+
export interface GuardResolution {
|
|
29
|
+
/** Guard name, as the dispatcher spells it. */
|
|
30
|
+
readonly guard: string;
|
|
31
|
+
/** Tree the running copy comes from, or null when nothing resolved. */
|
|
32
|
+
readonly tree: GuardTree | null;
|
|
33
|
+
/** Absolute path of the copy that would run, or null. */
|
|
34
|
+
readonly script: string | null;
|
|
35
|
+
/** Whether a second copy exists that this one shadows. */
|
|
36
|
+
readonly shadows: boolean;
|
|
37
|
+
}
|
|
38
|
+
/** One guard tree, and the evidence that dates it. */
|
|
39
|
+
export interface TreeVintage {
|
|
40
|
+
/** Which tree this is. */
|
|
41
|
+
readonly tree: GuardTree;
|
|
42
|
+
/** Absolute path of the tree. */
|
|
43
|
+
readonly root: string;
|
|
44
|
+
/** Lisa version that produced it, or null when it cannot be dated. */
|
|
45
|
+
readonly version: string | null;
|
|
46
|
+
/** The file that dated it, or the file whose absence left it undateable. */
|
|
47
|
+
readonly datedBy: string;
|
|
48
|
+
}
|
|
49
|
+
/** What `lisa apply` left behind, if anything. */
|
|
50
|
+
export interface ReceiptSummary {
|
|
51
|
+
/** Whether a readable receipt exists. */
|
|
52
|
+
readonly present: boolean;
|
|
53
|
+
/** Lisa version that completed the apply. */
|
|
54
|
+
readonly version: string | null;
|
|
55
|
+
/** When that apply completed. */
|
|
56
|
+
readonly appliedAt: string | null;
|
|
57
|
+
/** Whether it was a full apply or the postinstall-safe subset. */
|
|
58
|
+
readonly mode: string | null;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* What the checkout's own manifest asks for versus what is installed.
|
|
62
|
+
*
|
|
63
|
+
* Its own axis, because it fails in the affirmative: a checkout whose
|
|
64
|
+
* `node_modules` is majors behind its `package.json` resolves guards, runs
|
|
65
|
+
* them, and answers every question confidently about a version nobody is using.
|
|
66
|
+
*/
|
|
67
|
+
export interface InstallSummary {
|
|
68
|
+
/** Range the checkout's manifest declares, or null when it declares none. */
|
|
69
|
+
readonly declared: string | null;
|
|
70
|
+
/** Version actually present under `node_modules`, or null. */
|
|
71
|
+
readonly installed: string | null;
|
|
72
|
+
}
|
|
73
|
+
/** Everything one checkout resolves, right now. */
|
|
74
|
+
export interface CheckoutCoverage {
|
|
75
|
+
/** Operator-facing label — the roster key, or the path when scanned. */
|
|
76
|
+
readonly label: string;
|
|
77
|
+
/** Absolute path of the checkout. */
|
|
78
|
+
readonly checkoutPath: string;
|
|
79
|
+
/** How much enforcement it resolves. */
|
|
80
|
+
readonly resolution: CoverageResolution;
|
|
81
|
+
/** Why it could not be read, when `resolution` is `unreadable`. */
|
|
82
|
+
readonly unreadableReason: string | null;
|
|
83
|
+
/** Per-guard resolution. Empty when the checkout could not be read. */
|
|
84
|
+
readonly guards: readonly GuardResolution[];
|
|
85
|
+
/** Guards no copy of which was found. */
|
|
86
|
+
readonly unresolvedGuards: readonly string[];
|
|
87
|
+
/** Every tree that contributes at least one running guard. */
|
|
88
|
+
readonly trees: readonly TreeVintage[];
|
|
89
|
+
/** The oldest tree in use — the copy that governs. Null when none is. */
|
|
90
|
+
readonly governing: TreeVintage | null;
|
|
91
|
+
/** Age of the governing copy against the reference version. */
|
|
92
|
+
readonly vintage: CoverageVintage;
|
|
93
|
+
/** The apply receipt, or its absence. */
|
|
94
|
+
readonly receipt: ReceiptSummary;
|
|
95
|
+
/** Declared versus installed Lisa in this checkout. */
|
|
96
|
+
readonly install: InstallSummary;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Read a dotted version's release fields, or refuse to read it at all.
|
|
100
|
+
*
|
|
101
|
+
* Prerelease and build suffixes are ignored. A string whose release fields are
|
|
102
|
+
* not all plain numbers yields `null` rather than a best guess: reading an
|
|
103
|
+
* unparseable field as 0 makes it sort BELOW every real version, which turns
|
|
104
|
+
* "this does not parse" into the confident claim "this is behind" — a
|
|
105
|
+
* measurement invented out of an absence, which is the shape of defect this
|
|
106
|
+
* whole module exists to end.
|
|
107
|
+
* @param value - A version string from a manifest or receipt this repo does not own
|
|
108
|
+
* @returns The release fields, or null when the string is not a version
|
|
109
|
+
*/
|
|
110
|
+
export declare function versionFields(value: string): readonly number[] | null;
|
|
111
|
+
/**
|
|
112
|
+
* Compare two dotted versions on their release fields only.
|
|
113
|
+
*
|
|
114
|
+
* A version either side cannot parse yields `false`: absence of proof never
|
|
115
|
+
* becomes proof of drift, the same rule `isInstallBehindDeclared` follows. The
|
|
116
|
+
* caller that needs to distinguish "not older" from "could not tell" asks
|
|
117
|
+
* {@link versionFields} directly — `classifyVintage` does, and reports an
|
|
118
|
+
* unparseable copy as undateable rather than letting it fall through to
|
|
119
|
+
* "current".
|
|
120
|
+
* @param left - Candidate version
|
|
121
|
+
* @param right - Version to compare against
|
|
122
|
+
* @returns Whether `left` names an older Lisa than `right`
|
|
123
|
+
*/
|
|
124
|
+
export declare function isOlderVersion(left: string, right: string): boolean;
|
|
125
|
+
/** Everything the caller must supply to measure one checkout. */
|
|
126
|
+
export interface CoverageRequest {
|
|
127
|
+
/** Operator-facing label for the checkout. */
|
|
128
|
+
readonly label: string;
|
|
129
|
+
/** Path to the checkout, already expanded and resolved. */
|
|
130
|
+
readonly checkoutPath: string;
|
|
131
|
+
/** Newest Lisa the census can point at, or null when nothing dates it. */
|
|
132
|
+
readonly reference: string | null;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Measure what one checkout resolves right now.
|
|
136
|
+
*
|
|
137
|
+
* Every failure to look is reported as a failure to look. A checkout that is
|
|
138
|
+
* not there, or not readable, is never quietly dropped from the fleet and never
|
|
139
|
+
* counted as covered: a census that reports better coverage than exists is
|
|
140
|
+
* worse than no census, because it retires the question.
|
|
141
|
+
* @param request - The checkout to measure
|
|
142
|
+
* @returns What that checkout resolves
|
|
143
|
+
*/
|
|
144
|
+
export declare function collectCheckoutCoverage(request: CoverageRequest): Promise<CheckoutCoverage>;
|
|
145
|
+
/**
|
|
146
|
+
* Re-classify a record's vintage against a reference resolved later.
|
|
147
|
+
*
|
|
148
|
+
* The census cannot know the newest Lisa on the disk until it has read every
|
|
149
|
+
* checkout, and the reference is a maximum over exactly that evidence. So
|
|
150
|
+
* records are collected first with no reference and dated afterwards, rather
|
|
151
|
+
* than the census guessing a reference up front and being wrong about the one
|
|
152
|
+
* checkout that carries the newest copy.
|
|
153
|
+
* @param coverage - A record collected with no reference
|
|
154
|
+
* @param reference - Newest Lisa the census can point at
|
|
155
|
+
* @returns The same record, dated
|
|
156
|
+
*/
|
|
157
|
+
export declare function applyReference(coverage: CheckoutCoverage, reference: string | null): CheckoutCoverage;
|
|
158
|
+
/**
|
|
159
|
+
* Every Lisa version this checkout proves exists somewhere on the disk.
|
|
160
|
+
*
|
|
161
|
+
* Used to build the reference the way the dispatcher builds its own: a maximum
|
|
162
|
+
* over evidence on the same disk, never a nominated authority and never a
|
|
163
|
+
* network lookup. A copy is behind only when something newer can be pointed at.
|
|
164
|
+
* @param coverage - A collected record
|
|
165
|
+
* @returns The versions it can vouch for
|
|
166
|
+
*/
|
|
167
|
+
export declare function versionEvidence(coverage: CheckoutCoverage): readonly string[];
|
|
168
|
+
//# sourceMappingURL=enforcement-coverage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enforcement-coverage.d.ts","sourceRoot":"","sources":["../../src/core/enforcement-coverage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What enforcement one checkout actually resolves — measured, not remembered.
|
|
3
|
+
*
|
|
4
|
+
* `scripts/lisa-enforcement-fallback.sh` answers this question for the checkout
|
|
5
|
+
* an agent is sitting in, once per session, to that session. Nobody was looking
|
|
6
|
+
* at the fleet, so the only fleet-wide number that ever existed was taken by
|
|
7
|
+
* hand and written into a comment in that file, where it recorded that most
|
|
8
|
+
* checkouts resolved no guard and none that did was current. A number in a
|
|
9
|
+
* comment is a measurement, not a
|
|
10
|
+
* monitor — it was true on the day it was written and nothing re-takes it
|
|
11
|
+
* (CodySwannGT/lisa#3490).
|
|
12
|
+
*
|
|
13
|
+
* This module is the re-derivation. Given a checkout root it reads the same
|
|
14
|
+
* evidence the dispatcher reads, by the same rules, and returns what that
|
|
15
|
+
* checkout resolves right now:
|
|
16
|
+
*
|
|
17
|
+
* - Six guards, first-wins PER GUARD: `scripts/lisa-hooks/` (written into a
|
|
18
|
+
* host by `lisa apply`) shadows `plugins/lisa/hooks/` (the Lisa monorepo's
|
|
19
|
+
* own source) outright, and the shadowed copy never runs.
|
|
20
|
+
* - The aggregate takes the strongest refusal, so **the oldest resolved copy
|
|
21
|
+
* governs** (CodySwannGT/lisa#3205). "Which copy governs" is therefore the
|
|
22
|
+
* oldest tree in use, never the newest present.
|
|
23
|
+
* - A tree with no manifest beside it is *undateable*, which is reported as
|
|
24
|
+
* its own answer rather than folded into "current". Reading an undateable
|
|
25
|
+
* copy as current is exactly how a stale copy stays invisible.
|
|
26
|
+
*
|
|
27
|
+
* Two things are deliberately kept apart in the result, because folding them
|
|
28
|
+
* together is the defect this exists to end. `resolution` says whether anything
|
|
29
|
+
* is enforcing at all; `vintage` says how old the thing enforcing is. A
|
|
30
|
+
* checkout resolving nothing has no vintage — it is not "very stale", it is
|
|
31
|
+
* unprotected, and the two have different remedies.
|
|
32
|
+
* @module core/enforcement-coverage
|
|
33
|
+
*/
|
|
34
|
+
import * as path from "node:path";
|
|
35
|
+
import { readApplyReceipt } from "./apply-receipt.js";
|
|
36
|
+
import { readJsonOrNull } from "../utils/json-utils.js";
|
|
37
|
+
import { pathExists } from "../utils/file-operations.js";
|
|
38
|
+
/**
|
|
39
|
+
* The guards the dispatcher runs, in its own order.
|
|
40
|
+
*
|
|
41
|
+
* Kept as data rather than inferred from the directory listing: a census that
|
|
42
|
+
* asks "which guard files are here" cannot notice a guard that is missing
|
|
43
|
+
* everywhere, which is the case it most needs to report.
|
|
44
|
+
*/
|
|
45
|
+
export const ENFORCEMENT_GUARDS = [
|
|
46
|
+
"block-no-verify",
|
|
47
|
+
"parity-safety-net",
|
|
48
|
+
"block-shell-json-parsing",
|
|
49
|
+
"block-instruction-file-edits",
|
|
50
|
+
"block-direct-issue-create",
|
|
51
|
+
"block-managed-file-edits",
|
|
52
|
+
];
|
|
53
|
+
/** The npm package every host checkout installs Lisa as. */
|
|
54
|
+
const LISA_PACKAGE = "@codyswann/lisa";
|
|
55
|
+
/**
|
|
56
|
+
* Read a dotted version's release fields, or refuse to read it at all.
|
|
57
|
+
*
|
|
58
|
+
* Prerelease and build suffixes are ignored. A string whose release fields are
|
|
59
|
+
* not all plain numbers yields `null` rather than a best guess: reading an
|
|
60
|
+
* unparseable field as 0 makes it sort BELOW every real version, which turns
|
|
61
|
+
* "this does not parse" into the confident claim "this is behind" — a
|
|
62
|
+
* measurement invented out of an absence, which is the shape of defect this
|
|
63
|
+
* whole module exists to end.
|
|
64
|
+
* @param value - A version string from a manifest or receipt this repo does not own
|
|
65
|
+
* @returns The release fields, or null when the string is not a version
|
|
66
|
+
*/
|
|
67
|
+
export function versionFields(value) {
|
|
68
|
+
const parts = (value.split(/[-+]/u)[0] ?? "").split(".").slice(0, 3);
|
|
69
|
+
return parts.length > 0 && parts.every(field => /^\d{1,9}$/u.test(field))
|
|
70
|
+
? parts.map(Number)
|
|
71
|
+
: null;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Compare two dotted versions on their release fields only.
|
|
75
|
+
*
|
|
76
|
+
* A version either side cannot parse yields `false`: absence of proof never
|
|
77
|
+
* becomes proof of drift, the same rule `isInstallBehindDeclared` follows. The
|
|
78
|
+
* caller that needs to distinguish "not older" from "could not tell" asks
|
|
79
|
+
* {@link versionFields} directly — `classifyVintage` does, and reports an
|
|
80
|
+
* unparseable copy as undateable rather than letting it fall through to
|
|
81
|
+
* "current".
|
|
82
|
+
* @param left - Candidate version
|
|
83
|
+
* @param right - Version to compare against
|
|
84
|
+
* @returns Whether `left` names an older Lisa than `right`
|
|
85
|
+
*/
|
|
86
|
+
export function isOlderVersion(left, right) {
|
|
87
|
+
const a = versionFields(left);
|
|
88
|
+
const b = versionFields(right);
|
|
89
|
+
if (a === null || b === null)
|
|
90
|
+
return false;
|
|
91
|
+
const differing = [0, 1, 2].find(index => (a[index] ?? 0) !== (b[index] ?? 0));
|
|
92
|
+
return differing === undefined
|
|
93
|
+
? false
|
|
94
|
+
: (a[differing] ?? 0) < (b[differing] ?? 0);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Read the first top-level occurrence of a version-shaped key from a JSON file.
|
|
98
|
+
* @param filePath - File to read
|
|
99
|
+
* @param key - Key naming the version
|
|
100
|
+
* @returns The version string, or null when the file or key is absent
|
|
101
|
+
*/
|
|
102
|
+
async function readVersionKey(filePath, key) {
|
|
103
|
+
const parsed = await readJsonOrNull(filePath);
|
|
104
|
+
const value = parsed?.[key];
|
|
105
|
+
return typeof value === "string" && value.trim() !== "" ? value : null;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Resolve each guard to the copy that would actually run for it.
|
|
109
|
+
* @param root - Checkout root
|
|
110
|
+
* @returns One entry per guard, in dispatcher order
|
|
111
|
+
*/
|
|
112
|
+
async function resolveGuards(root) {
|
|
113
|
+
const hostTree = path.join(root, "scripts", "lisa-hooks");
|
|
114
|
+
const pluginTree = path.join(root, "plugins", "lisa", "hooks");
|
|
115
|
+
return Promise.all(ENFORCEMENT_GUARDS.map(async (guard) => {
|
|
116
|
+
const hostScript = path.join(hostTree, `${guard}.sh`);
|
|
117
|
+
const pluginScript = path.join(pluginTree, `${guard}.sh`);
|
|
118
|
+
const [host, plugin] = await Promise.all([
|
|
119
|
+
pathExists(hostScript),
|
|
120
|
+
pathExists(pluginScript),
|
|
121
|
+
]);
|
|
122
|
+
if (host) {
|
|
123
|
+
return {
|
|
124
|
+
guard,
|
|
125
|
+
tree: "host",
|
|
126
|
+
script: hostScript,
|
|
127
|
+
shadows: plugin,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
if (plugin) {
|
|
131
|
+
return {
|
|
132
|
+
guard,
|
|
133
|
+
tree: "plugin",
|
|
134
|
+
script: pluginScript,
|
|
135
|
+
shadows: false,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
return { guard, tree: null, script: null, shadows: false };
|
|
139
|
+
}));
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Date one tree from the evidence that produced it.
|
|
143
|
+
*
|
|
144
|
+
* The host tree is dated by the apply receipt because the same `lisa apply` run
|
|
145
|
+
* wrote both, so they cannot disagree. The plugin tree is dated by the plugin
|
|
146
|
+
* manifest beside it, which the release bumps in lockstep with the package.
|
|
147
|
+
* @param root - Checkout root
|
|
148
|
+
* @param tree - Which tree to date
|
|
149
|
+
* @returns The tree's vintage, dated or explicitly undateable
|
|
150
|
+
*/
|
|
151
|
+
async function dateTree(root, tree) {
|
|
152
|
+
if (tree === "host") {
|
|
153
|
+
const datedBy = path.join(root, ".lisa", "apply-receipt.json");
|
|
154
|
+
const receipt = await readApplyReceipt(root);
|
|
155
|
+
return {
|
|
156
|
+
tree,
|
|
157
|
+
root: path.join(root, "scripts", "lisa-hooks"),
|
|
158
|
+
version: receipt?.lisa_version ?? null,
|
|
159
|
+
datedBy,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
const datedBy = path.join(root, "plugins", "lisa", ".claude-plugin", "plugin.json");
|
|
163
|
+
return {
|
|
164
|
+
tree,
|
|
165
|
+
root: path.join(root, "plugins", "lisa", "hooks"),
|
|
166
|
+
version: await readVersionKey(datedBy, "version"),
|
|
167
|
+
datedBy,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Pick the copy that governs: the oldest tree in use, undateable first.
|
|
172
|
+
*
|
|
173
|
+
* Undateable outranks any dated tree because a copy that cannot be shown
|
|
174
|
+
* current must not be allowed to report the checkout as current — the whole
|
|
175
|
+
* point of dating in the first place.
|
|
176
|
+
* @param trees - Trees contributing at least one running guard
|
|
177
|
+
* @returns The governing tree, or null when nothing is in use
|
|
178
|
+
*/
|
|
179
|
+
function pickGoverning(trees) {
|
|
180
|
+
return trees.reduce((worst, candidate) => {
|
|
181
|
+
if (worst === null)
|
|
182
|
+
return candidate;
|
|
183
|
+
if (worst.version === null)
|
|
184
|
+
return worst;
|
|
185
|
+
if (candidate.version === null)
|
|
186
|
+
return candidate;
|
|
187
|
+
return isOlderVersion(candidate.version, worst.version) ? candidate : worst;
|
|
188
|
+
}, null);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Classify the governing copy's age against the reference version.
|
|
192
|
+
* @param governing - The copy in force, or null when there is none
|
|
193
|
+
* @param reference - Newest Lisa the census can point at
|
|
194
|
+
* @returns The vintage class
|
|
195
|
+
*/
|
|
196
|
+
function classifyVintage(governing, reference) {
|
|
197
|
+
if (governing === null)
|
|
198
|
+
return "not-applicable";
|
|
199
|
+
if (governing.version === null)
|
|
200
|
+
return "undateable";
|
|
201
|
+
// A version string that will not parse dates the copy no better than a
|
|
202
|
+
// missing one does. Falling through to "current" would report coverage the
|
|
203
|
+
// census cannot show, which is the same error as counting an unreadable
|
|
204
|
+
// checkout as covered.
|
|
205
|
+
if (versionFields(governing.version) === null)
|
|
206
|
+
return "undateable";
|
|
207
|
+
if (reference !== null && isOlderVersion(governing.version, reference)) {
|
|
208
|
+
return "behind";
|
|
209
|
+
}
|
|
210
|
+
return "current";
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Read what the checkout declares and what it has installed.
|
|
214
|
+
* @param root - Checkout root
|
|
215
|
+
* @returns Declared range and installed version, each null when absent
|
|
216
|
+
*/
|
|
217
|
+
async function readInstallSummary(root) {
|
|
218
|
+
const manifest = await readJsonOrNull(path.join(root, "package.json"));
|
|
219
|
+
const sections = ["dependencies", "devDependencies", "optionalDependencies"];
|
|
220
|
+
const declared = sections.reduce((found, section) => {
|
|
221
|
+
if (found !== null)
|
|
222
|
+
return found;
|
|
223
|
+
const block = manifest?.[section];
|
|
224
|
+
if (typeof block !== "object" || block === null)
|
|
225
|
+
return null;
|
|
226
|
+
const value = block[LISA_PACKAGE];
|
|
227
|
+
return typeof value === "string" ? value : null;
|
|
228
|
+
}, null);
|
|
229
|
+
return {
|
|
230
|
+
declared,
|
|
231
|
+
installed: await readVersionKey(path.join(root, "node_modules", LISA_PACKAGE, "package.json"), "version"),
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* The unreadable answer, built once so every caller reports it identically.
|
|
236
|
+
* @param request - The checkout that could not be read
|
|
237
|
+
* @param reason - Why it could not be read, in the operator's language
|
|
238
|
+
* @returns A coverage record that is not, and cannot become, "covered"
|
|
239
|
+
*/
|
|
240
|
+
function unreadable(request, reason) {
|
|
241
|
+
return {
|
|
242
|
+
label: request.label,
|
|
243
|
+
checkoutPath: request.checkoutPath,
|
|
244
|
+
resolution: "unreadable",
|
|
245
|
+
unreadableReason: reason,
|
|
246
|
+
guards: [],
|
|
247
|
+
unresolvedGuards: [],
|
|
248
|
+
trees: [],
|
|
249
|
+
governing: null,
|
|
250
|
+
vintage: "not-applicable",
|
|
251
|
+
receipt: { present: false, version: null, appliedAt: null, mode: null },
|
|
252
|
+
install: { declared: null, installed: null },
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Measure what one checkout resolves right now.
|
|
257
|
+
*
|
|
258
|
+
* Every failure to look is reported as a failure to look. A checkout that is
|
|
259
|
+
* not there, or not readable, is never quietly dropped from the fleet and never
|
|
260
|
+
* counted as covered: a census that reports better coverage than exists is
|
|
261
|
+
* worse than no census, because it retires the question.
|
|
262
|
+
* @param request - The checkout to measure
|
|
263
|
+
* @returns What that checkout resolves
|
|
264
|
+
*/
|
|
265
|
+
export async function collectCheckoutCoverage(request) {
|
|
266
|
+
const root = request.checkoutPath;
|
|
267
|
+
if (!(await pathExists(root))) {
|
|
268
|
+
return unreadable(request, "path does not exist");
|
|
269
|
+
}
|
|
270
|
+
const attempt = await resolveGuards(root).then(guards => ({ guards, failure: null }), (error) => ({
|
|
271
|
+
guards: null,
|
|
272
|
+
failure: `could not read the guard trees: ${error instanceof Error ? error.message : String(error)}`,
|
|
273
|
+
}));
|
|
274
|
+
if (attempt.guards === null) {
|
|
275
|
+
return unreadable(request, attempt.failure ?? "unknown read failure");
|
|
276
|
+
}
|
|
277
|
+
const guards = attempt.guards;
|
|
278
|
+
const running = guards.filter(entry => entry.tree !== null);
|
|
279
|
+
const usedTrees = ["host", "plugin"].filter(tree => running.some(entry => entry.tree === tree));
|
|
280
|
+
const trees = await Promise.all(usedTrees.map(tree => dateTree(root, tree)));
|
|
281
|
+
const governing = pickGoverning(trees);
|
|
282
|
+
const receipt = await readApplyReceipt(root);
|
|
283
|
+
return {
|
|
284
|
+
label: request.label,
|
|
285
|
+
checkoutPath: root,
|
|
286
|
+
resolution: running.length === 0
|
|
287
|
+
? "none"
|
|
288
|
+
: running.length === ENFORCEMENT_GUARDS.length
|
|
289
|
+
? "full"
|
|
290
|
+
: "partial",
|
|
291
|
+
unreadableReason: null,
|
|
292
|
+
guards,
|
|
293
|
+
unresolvedGuards: guards
|
|
294
|
+
.filter(entry => entry.tree === null)
|
|
295
|
+
.map(entry => entry.guard),
|
|
296
|
+
trees,
|
|
297
|
+
governing,
|
|
298
|
+
vintage: classifyVintage(governing, request.reference),
|
|
299
|
+
receipt: {
|
|
300
|
+
present: receipt !== null,
|
|
301
|
+
version: receipt?.lisa_version ?? null,
|
|
302
|
+
appliedAt: receipt?.applied_at ?? null,
|
|
303
|
+
mode: receipt?.apply_mode ?? null,
|
|
304
|
+
},
|
|
305
|
+
install: await readInstallSummary(root),
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Re-classify a record's vintage against a reference resolved later.
|
|
310
|
+
*
|
|
311
|
+
* The census cannot know the newest Lisa on the disk until it has read every
|
|
312
|
+
* checkout, and the reference is a maximum over exactly that evidence. So
|
|
313
|
+
* records are collected first with no reference and dated afterwards, rather
|
|
314
|
+
* than the census guessing a reference up front and being wrong about the one
|
|
315
|
+
* checkout that carries the newest copy.
|
|
316
|
+
* @param coverage - A record collected with no reference
|
|
317
|
+
* @param reference - Newest Lisa the census can point at
|
|
318
|
+
* @returns The same record, dated
|
|
319
|
+
*/
|
|
320
|
+
export function applyReference(coverage, reference) {
|
|
321
|
+
return {
|
|
322
|
+
...coverage,
|
|
323
|
+
vintage: classifyVintage(coverage.governing, reference),
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Every Lisa version this checkout proves exists somewhere on the disk.
|
|
328
|
+
*
|
|
329
|
+
* Used to build the reference the way the dispatcher builds its own: a maximum
|
|
330
|
+
* over evidence on the same disk, never a nominated authority and never a
|
|
331
|
+
* network lookup. A copy is behind only when something newer can be pointed at.
|
|
332
|
+
* @param coverage - A collected record
|
|
333
|
+
* @returns The versions it can vouch for
|
|
334
|
+
*/
|
|
335
|
+
export function versionEvidence(coverage) {
|
|
336
|
+
return [
|
|
337
|
+
coverage.install.installed,
|
|
338
|
+
coverage.receipt.version,
|
|
339
|
+
...coverage.trees.map(tree => tree.version),
|
|
340
|
+
].filter((value) => value !== null);
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=enforcement-coverage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enforcement-coverage.js","sourceRoot":"","sources":["../../src/core/enforcement-coverage.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,
|
|
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,CAg0BjC,CAAC;AAEH;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,+BAA+B,EAAE,QAAQ,CACpD,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAmuBjC,CAAC"}
|
|
@@ -360,6 +360,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
|
|
|
360
360
|
]),
|
|
361
361
|
"scripts/lisa-enforcement-fallback.sh": Object.freeze([
|
|
362
362
|
"1bec5f3c284b3febdc471487ee6a23ffb72bd4e7b293f9e26b0188f32318c722",
|
|
363
|
+
"27f4e4b54986f49ddb9a3bf6e02b926d41d85ecd46ab2263cb17a5746820f8bd",
|
|
363
364
|
"3049c2f1051c7c02dd60b62355964651e1565ebe6bdcb5e37634cd686cf1deb1",
|
|
364
365
|
"68e1b78d5d4471fadbe2eb575ae46221838217290123a9910d76dba0f1c34131",
|
|
365
366
|
"7d333dc10be8c810b9b5aca35ab7f6f60413134414d82bf0cdaedb4e6e3ca8da",
|
|
@@ -375,6 +376,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
|
|
|
375
376
|
"d922508529c0ffd6b8411d7fc618b3d14ceb70901746adfbcf49e46eb685d6b9",
|
|
376
377
|
"e0f4f2b11bea5497af12bae0d52902eb3d02b4ec3a7ae8e07236fb09b59cf560",
|
|
377
378
|
"e17c45f7cadf0fb55dd07270776caf211af99b7d4771a4fde75aafe5919e8dbe",
|
|
379
|
+
"e481f9940fa6e7ab9fa6a990ec42e08a6c76023abca80b6ab7bbf545ab185b9e",
|
|
378
380
|
]),
|
|
379
381
|
"scripts/lisa-environment-prepare.mjs": Object.freeze([
|
|
380
382
|
"0c2c2aeed3a8d843b3019e5263aab26790856c0c33f028925d2f0f795a26872d",
|
|
@@ -757,6 +759,8 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
|
|
|
757
759
|
"2289eb74705b6e24fc947182fb3cd64422b918d0dcb3abf546c2452ab247b5b8",
|
|
758
760
|
"238dc2da29938edd92518c2b08192d14c6f2751ed175c07d6e882814829b7b7e",
|
|
759
761
|
"2d9ca0841db9e75ddfd95e3a4d485fd01aa639a512ef648996f565b7991d8e2b",
|
|
762
|
+
"3a9ec1ff863693a0fa0fef0ade6fa5534485d0249fb78302d37cdac3781348f1",
|
|
763
|
+
"4372872a448d3b943dea5541167ed5be6155703b57b9f8224d19ddefd3b80898",
|
|
760
764
|
"475cb9ef86c2ac54c8fd8cb6d63e9a55ea8cd0017e26efbe3c44391a4aeeab41",
|
|
761
765
|
"4c263fef48c03b3b6c623ea8a6cd55505bfaf28197e5072226ea35f9f3d26885",
|
|
762
766
|
"5a0b82045d9795284a109c28e5e9dd97a5488ff540bb7034b84077d1447ffd7c",
|
|
@@ -766,6 +770,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
|
|
|
766
770
|
"637741a9e5d2904aed24d48efd6bec1326c5573f718a13152807aa0e4b42f0a1",
|
|
767
771
|
"6a8be8577242588f14ab52b25b2a22b6def53aefa9513b4d3d7c49f4d8027079",
|
|
768
772
|
"71ff42c2cb8ac7022e0066132476764dd745fb92bf19ccd395000b1fe319abc7",
|
|
773
|
+
"7573b5170fcba45ccd6123cd0712baba8faa52f063b639140be829d9ce87327d",
|
|
769
774
|
"83e7f1257bfee293bcdcdafef4272f40fcdca2d9e43ceb9df647c13c8277423d",
|
|
770
775
|
"8c3effe804dfbea75011271f9d96eeb125fcbb97dc6397cc2c2dffd935f3aef0",
|
|
771
776
|
"8cd8d102d4b3276f92bb4706274d280c302269fb2f564ca93b1d79cb3ff26841",
|
|
@@ -1180,6 +1185,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
|
|
|
1180
1185
|
]),
|
|
1181
1186
|
"scripts/lisa-enforcement-fallback.sh": Object.freeze([
|
|
1182
1187
|
"1bec5f3c284b3febdc471487ee6a23ffb72bd4e7b293f9e26b0188f32318c722",
|
|
1188
|
+
"27f4e4b54986f49ddb9a3bf6e02b926d41d85ecd46ab2263cb17a5746820f8bd",
|
|
1183
1189
|
"3049c2f1051c7c02dd60b62355964651e1565ebe6bdcb5e37634cd686cf1deb1",
|
|
1184
1190
|
"68e1b78d5d4471fadbe2eb575ae46221838217290123a9910d76dba0f1c34131",
|
|
1185
1191
|
"7d333dc10be8c810b9b5aca35ab7f6f60413134414d82bf0cdaedb4e6e3ca8da",
|
|
@@ -1195,6 +1201,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
|
|
|
1195
1201
|
"d922508529c0ffd6b8411d7fc618b3d14ceb70901746adfbcf49e46eb685d6b9",
|
|
1196
1202
|
"e0f4f2b11bea5497af12bae0d52902eb3d02b4ec3a7ae8e07236fb09b59cf560",
|
|
1197
1203
|
"e17c45f7cadf0fb55dd07270776caf211af99b7d4771a4fde75aafe5919e8dbe",
|
|
1204
|
+
"e481f9940fa6e7ab9fa6a990ec42e08a6c76023abca80b6ab7bbf545ab185b9e",
|
|
1198
1205
|
]),
|
|
1199
1206
|
"scripts/lisa-environment-prepare.mjs": Object.freeze([
|
|
1200
1207
|
"0c2c2aeed3a8d843b3019e5263aab26790856c0c33f028925d2f0f795a26872d",
|
|
@@ -1510,6 +1517,8 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
|
|
|
1510
1517
|
"2289eb74705b6e24fc947182fb3cd64422b918d0dcb3abf546c2452ab247b5b8",
|
|
1511
1518
|
"238dc2da29938edd92518c2b08192d14c6f2751ed175c07d6e882814829b7b7e",
|
|
1512
1519
|
"2d9ca0841db9e75ddfd95e3a4d485fd01aa639a512ef648996f565b7991d8e2b",
|
|
1520
|
+
"3a9ec1ff863693a0fa0fef0ade6fa5534485d0249fb78302d37cdac3781348f1",
|
|
1521
|
+
"4372872a448d3b943dea5541167ed5be6155703b57b9f8224d19ddefd3b80898",
|
|
1513
1522
|
"475cb9ef86c2ac54c8fd8cb6d63e9a55ea8cd0017e26efbe3c44391a4aeeab41",
|
|
1514
1523
|
"4c263fef48c03b3b6c623ea8a6cd55505bfaf28197e5072226ea35f9f3d26885",
|
|
1515
1524
|
"5a0b82045d9795284a109c28e5e9dd97a5488ff540bb7034b84077d1447ffd7c",
|
|
@@ -1518,6 +1527,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
|
|
|
1518
1527
|
"62f53156d425198609564e996f3844f52ab110e63f99f22e8338fcf7a83f316d",
|
|
1519
1528
|
"6a8be8577242588f14ab52b25b2a22b6def53aefa9513b4d3d7c49f4d8027079",
|
|
1520
1529
|
"71ff42c2cb8ac7022e0066132476764dd745fb92bf19ccd395000b1fe319abc7",
|
|
1530
|
+
"7573b5170fcba45ccd6123cd0712baba8faa52f063b639140be829d9ce87327d",
|
|
1521
1531
|
"83e7f1257bfee293bcdcdafef4272f40fcdca2d9e43ceb9df647c13c8277423d",
|
|
1522
1532
|
"8c3effe804dfbea75011271f9d96eeb125fcbb97dc6397cc2c2dffd935f3aef0",
|
|
1523
1533
|
"8cd8d102d4b3276f92bb4706274d280c302269fb2f564ca93b1d79cb3ff26841",
|