@codyswann/lisa 4.16.0 → 4.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/doctor-override-floor-conflicts.d.ts +15 -0
- package/dist/cli/doctor-override-floor-conflicts.d.ts.map +1 -0
- package/dist/cli/doctor-override-floor-conflicts.js +225 -0
- package/dist/cli/doctor-override-floor-conflicts.js.map +1 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +8 -0
- package/dist/cli/doctor.js.map +1 -1
- package/dist/core/override-floors.d.ts +146 -0
- package/dist/core/override-floors.d.ts.map +1 -0
- package/dist/core/override-floors.js +200 -0
- package/dist/core/override-floors.js.map +1 -0
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +5 -0
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/strategies/package-lisa.d.ts +59 -0
- package/dist/strategies/package-lisa.d.ts.map +1 -1
- package/dist/strategies/package-lisa.js +112 -130
- package/dist/strategies/package-lisa.js.map +1 -1
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-agy/plugin.json +1 -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-cursor/.claude-plugin/plugin.json +1 -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
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Shared vocabulary for npm `$name` override self-references and the
|
|
3
|
+
* security floors they can silently resolve downwards.
|
|
4
|
+
* @description
|
|
5
|
+
* An `overrides`/`resolutions` entry written `"$name"` means "whatever the
|
|
6
|
+
* direct dependency says". Lisa's templates force floors into those same two
|
|
7
|
+
* sections, so when a floored package is ALSO a direct dependency, the apply
|
|
8
|
+
* normalizes the forced literal to `$name` — and if the host's direct range
|
|
9
|
+
* starts below the floor, that rewrite would readmit exactly the versions the
|
|
10
|
+
* floor exists to exclude. `lisa apply` refuses rather than perform it.
|
|
11
|
+
*
|
|
12
|
+
* The refusal is correct. What it was missing is a way to be seen coming, and a
|
|
13
|
+
* remedy the operator can actually follow. Both halves are here, in ONE place,
|
|
14
|
+
* because they must agree by construction:
|
|
15
|
+
*
|
|
16
|
+
* - {@link classifySelfReferenceRewrite} is the single predicate. The apply's
|
|
17
|
+
* guard and `lisa doctor` both call it, so doctor can never report clean on a
|
|
18
|
+
* manifest the apply is about to refuse, nor cry wolf on one it accepts.
|
|
19
|
+
* - {@link suggestSatisfyingDirectRange} runs its own suggestion back through
|
|
20
|
+
* that same predicate before returning it. Advice that has not been tested
|
|
21
|
+
* against the guard is how CodySwannGT/lisa#3191 happened — an operator who
|
|
22
|
+
* did what the refusal told them was refused a second time, which reads as
|
|
23
|
+
* the guard being broken rather than the range being wrong. A suggestion that
|
|
24
|
+
* does not verify is withheld, not printed hopefully.
|
|
25
|
+
*
|
|
26
|
+
* Nothing here rewrites a host range or lowers a floor. Raising a dependency is
|
|
27
|
+
* a version decision with its own blast radius; this module names the raise and
|
|
28
|
+
* the operator makes it.
|
|
29
|
+
* @module core/override-floors
|
|
30
|
+
*/
|
|
31
|
+
import semver from "semver";
|
|
32
|
+
/** package.json sections whose keys are treated as direct dependencies. */
|
|
33
|
+
export const DIRECT_DEPENDENCY_SECTIONS = [
|
|
34
|
+
"dependencies",
|
|
35
|
+
"devDependencies",
|
|
36
|
+
"optionalDependencies",
|
|
37
|
+
"peerDependencies",
|
|
38
|
+
];
|
|
39
|
+
/** package.json sections that carry npm-style version overrides. */
|
|
40
|
+
export const OVERRIDE_SECTIONS = ["overrides", "resolutions"];
|
|
41
|
+
/**
|
|
42
|
+
* Narrow an unknown value to a plain object record, returning {} otherwise.
|
|
43
|
+
* @param value - Candidate value
|
|
44
|
+
* @returns The value as a record, or an empty record when it is not a plain object
|
|
45
|
+
*/
|
|
46
|
+
export function asRecord(value) {
|
|
47
|
+
if (value !== null && typeof value === "object" && !Array.isArray(value)) {
|
|
48
|
+
return value;
|
|
49
|
+
}
|
|
50
|
+
return {};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Collect the names of every direct dependency declared across a package.json's
|
|
54
|
+
* dependency sections.
|
|
55
|
+
* @param pkg - Merged package.json object
|
|
56
|
+
* @returns Set of direct dependency names
|
|
57
|
+
*/
|
|
58
|
+
export function collectDirectDependencyNames(pkg) {
|
|
59
|
+
return new Set(DIRECT_DEPENDENCY_SECTIONS.flatMap(section => Object.keys(asRecord(pkg[section]))));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Collect direct dependency ranges by package name.
|
|
63
|
+
* @param pkg - Merged package.json object
|
|
64
|
+
* @returns Package name to string range map
|
|
65
|
+
*/
|
|
66
|
+
export function collectDirectDependencyRanges(pkg) {
|
|
67
|
+
return new Map(DIRECT_DEPENDENCY_SECTIONS.flatMap(section => Object.entries(asRecord(pkg[section])).flatMap(([name, value]) => typeof value === "string" ? [[name, value]] : [])));
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Decide whether an override/resolution entry is a candidate for npm `$name`
|
|
71
|
+
* normalization at all.
|
|
72
|
+
* @param directDeps - Direct dependency names in the merged package
|
|
73
|
+
* @param name - Override/resolution key
|
|
74
|
+
* @param value - Override/resolution value
|
|
75
|
+
* @returns True when the entry is a literal direct-dependency collision
|
|
76
|
+
*/
|
|
77
|
+
export function needsSelfReferenceRewrite(directDeps, name, value) {
|
|
78
|
+
return (directDeps.has(name) &&
|
|
79
|
+
typeof value === "string" &&
|
|
80
|
+
value.length > 0 &&
|
|
81
|
+
!value.startsWith("$"));
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* The one predicate behind both the apply's refusal and doctor's report.
|
|
85
|
+
* @remarks
|
|
86
|
+
* Deliberately plain `semver.subset`, with no ceiling normalization. The
|
|
87
|
+
* normalizing variant used by the host-pin branch (`rangeContains` in the
|
|
88
|
+
* package-lisa strategy) can only turn a refusal into an acceptance, and this
|
|
89
|
+
* branch is the one that decides whether a security floor may be resolved
|
|
90
|
+
* DOWNWARDS — so it keeps the stricter reading. Any range that reaches a
|
|
91
|
+
* `widening` verdict here still has a followable way out, because
|
|
92
|
+
* {@link suggestSatisfyingDirectRange} is verified against this same function.
|
|
93
|
+
* @param floorRange - The literal override range being replaced
|
|
94
|
+
* @param directRange - The direct dependency range `$name` would resolve to
|
|
95
|
+
* @returns Whether the rewrite is safe, unprovable, or widening
|
|
96
|
+
*/
|
|
97
|
+
export function classifySelfReferenceRewrite(floorRange, directRange) {
|
|
98
|
+
if (!semver.validRange(floorRange) || !semver.validRange(directRange)) {
|
|
99
|
+
return "unprovable";
|
|
100
|
+
}
|
|
101
|
+
return semver.subset(directRange, floorRange) ? "safe" : "widening";
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Derive a direct dependency range that satisfies the floor, and PROVE it does
|
|
105
|
+
* before handing it to an operator.
|
|
106
|
+
* @remarks
|
|
107
|
+
* The natural suggestion is a caret at the floor's minimum version, because
|
|
108
|
+
* that is what a person writes and what the one already-fixed instance of this
|
|
109
|
+
* defect was fixed with. It is not always right: measured, `^1.18.0` is not a
|
|
110
|
+
* subset of a bounded floor `>=1.18.0 <1.19.0`, and `^0.0.0` is not a subset of
|
|
111
|
+
* `*`. So the caret is a CANDIDATE, tested against
|
|
112
|
+
* {@link classifySelfReferenceRewrite} and discarded when it fails, falling
|
|
113
|
+
* back to the floor range verbatim — which is a subset of itself for any range
|
|
114
|
+
* semver can parse.
|
|
115
|
+
*
|
|
116
|
+
* A floor semver cannot parse yields null. Printing an untested range would be
|
|
117
|
+
* the #3191 failure exactly: advice that sends the operator back into the same
|
|
118
|
+
* refusal.
|
|
119
|
+
* @param floorRange - The literal override range acting as the floor
|
|
120
|
+
* @returns A range verified to satisfy the guard, or null when none exists
|
|
121
|
+
*/
|
|
122
|
+
export function suggestSatisfyingDirectRange(floorRange) {
|
|
123
|
+
const minimum = rangeMinimum(floorRange);
|
|
124
|
+
const candidates = minimum === null ? [floorRange] : [`^${minimum}`, floorRange];
|
|
125
|
+
return (candidates.find(candidate => classifySelfReferenceRewrite(floorRange, candidate) === "safe") ?? null);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Lowest version a range admits, without throwing on an unparseable range.
|
|
129
|
+
* @param range - An npm version range
|
|
130
|
+
* @returns The minimum version, or null when the range is not comparable
|
|
131
|
+
*/
|
|
132
|
+
function rangeMinimum(range) {
|
|
133
|
+
try {
|
|
134
|
+
return semver.minVersion(range)?.version ?? null;
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Judge every `$name`-rewrite candidate in a merged manifest, collecting ALL
|
|
142
|
+
* conflicts rather than stopping at the first.
|
|
143
|
+
* @remarks
|
|
144
|
+
* The apply throws on the first conflict, which is right for an apply — it is
|
|
145
|
+
* about to write a file and must not. A report has the opposite obligation: an
|
|
146
|
+
* operator who fixes the one package named and re-runs, only to be handed the
|
|
147
|
+
* next one, is being drip-fed a list Lisa already had in full.
|
|
148
|
+
* @param pkg - Merged package.json, as the apply would persist it
|
|
149
|
+
* @returns What was inspected and every conflict found
|
|
150
|
+
*/
|
|
151
|
+
export function auditSelfReferenceRewrites(pkg) {
|
|
152
|
+
const directDeps = collectDirectDependencyNames(pkg);
|
|
153
|
+
const directRanges = collectDirectDependencyRanges(pkg);
|
|
154
|
+
const entries = OVERRIDE_SECTIONS.flatMap(section => Object.entries(asRecord(pkg[section])).map(([name, value]) => [section, name, value]));
|
|
155
|
+
const judged = entries.flatMap(([section, name, value]) => {
|
|
156
|
+
if (!needsSelfReferenceRewrite(directDeps, name, value)) {
|
|
157
|
+
return [];
|
|
158
|
+
}
|
|
159
|
+
const directRange = directRanges.get(name);
|
|
160
|
+
return directRange === undefined
|
|
161
|
+
? []
|
|
162
|
+
: [{ section, name, floorRange: value, directRange }];
|
|
163
|
+
});
|
|
164
|
+
const verdicts = judged.map(candidate => ({
|
|
165
|
+
candidate,
|
|
166
|
+
verdict: classifySelfReferenceRewrite(candidate.floorRange, candidate.directRange),
|
|
167
|
+
}));
|
|
168
|
+
return {
|
|
169
|
+
overridesInspected: entries.length,
|
|
170
|
+
rewritesJudged: judged.length,
|
|
171
|
+
conflicts: verdicts.flatMap(({ candidate, verdict }) => verdict === "safe"
|
|
172
|
+
? []
|
|
173
|
+
: [
|
|
174
|
+
{
|
|
175
|
+
...candidate,
|
|
176
|
+
verdict,
|
|
177
|
+
suggestedDirectRange: suggestSatisfyingDirectRange(candidate.floorRange),
|
|
178
|
+
},
|
|
179
|
+
]),
|
|
180
|
+
rewritable: verdicts.flatMap(({ candidate, verdict }) => verdict === "safe" ? [candidate] : []),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* The remedy sentence, shared by the apply's refusal and doctor's report so an
|
|
185
|
+
* operator is never told two different things about the same conflict.
|
|
186
|
+
* @param conflict - The conflict to describe
|
|
187
|
+
* @returns One operator-readable sentence naming the exact raise to make
|
|
188
|
+
*/
|
|
189
|
+
export function describeSelfReferenceRemedy(conflict) {
|
|
190
|
+
if (conflict.suggestedDirectRange === null) {
|
|
191
|
+
return (`Lisa could not derive a direct range that satisfies the floor ` +
|
|
192
|
+
`${JSON.stringify(conflict.floorRange)}, so it is not guessing one. ` +
|
|
193
|
+
`Reconcile ${conflict.name} by hand, or raise Lisa's template pin.`);
|
|
194
|
+
}
|
|
195
|
+
return (`Raise the direct dependency ${conflict.name} from ` +
|
|
196
|
+
`${JSON.stringify(conflict.directRange)} to ` +
|
|
197
|
+
`${JSON.stringify(conflict.suggestedDirectRange)}, which Lisa has ` +
|
|
198
|
+
`verified satisfies the floor ${JSON.stringify(conflict.floorRange)}.`);
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=override-floors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"override-floors.js","sourceRoot":"","sources":["../../src/core/override-floors.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,CAo6EpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"upstream-evidence-manifest.d.ts","sourceRoot":"","sources":["../../src/core/upstream-evidence-manifest.ts"],"names":[],"mappings":"AACA,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAo6EpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CA6sPjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,CAAC"}
|
|
@@ -7197,6 +7197,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7197
7197
|
"src/cli/doctor-lisa-owned-universal.ts": true,
|
|
7198
7198
|
"src/cli/doctor-merge-drivers.ts": true,
|
|
7199
7199
|
"src/cli/doctor-monitor-thresholds.ts": true,
|
|
7200
|
+
"src/cli/doctor-override-floor-conflicts.ts": true,
|
|
7200
7201
|
"src/cli/doctor-readiness-action-pins.ts": true,
|
|
7201
7202
|
"src/cli/doctor-readiness-audit-allowlist.ts": true,
|
|
7202
7203
|
"src/cli/doctor-readiness-blockers.ts": true,
|
|
@@ -7442,6 +7443,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7442
7443
|
"src/core/lisa-skill-sources.ts": true,
|
|
7443
7444
|
"src/core/lisa.ts": true,
|
|
7444
7445
|
"src/core/merge-driver-registration.ts": true,
|
|
7446
|
+
"src/core/override-floors.ts": true,
|
|
7445
7447
|
"src/core/project-config-kane.ts": true,
|
|
7446
7448
|
"src/core/project-config.ts": true,
|
|
7447
7449
|
"src/core/self-apply.ts": true,
|
|
@@ -7851,6 +7853,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7851
7853
|
"tests/unit/cli/doctor-lisa-owned-artifacts.test.ts": true,
|
|
7852
7854
|
"tests/unit/cli/doctor-merge-drivers.test.ts": true,
|
|
7853
7855
|
"tests/unit/cli/doctor-monitor-thresholds.test.ts": true,
|
|
7856
|
+
"tests/unit/cli/doctor-override-floor-conflicts.test.ts": true,
|
|
7854
7857
|
"tests/unit/cli/doctor-readiness-blockers.test.ts": true,
|
|
7855
7858
|
"tests/unit/cli/doctor-readiness-capabilities.test.ts": true,
|
|
7856
7859
|
"tests/unit/cli/doctor-readiness-concurrent-write.test.ts": true,
|
|
@@ -8124,6 +8127,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
8124
8127
|
"tests/unit/core/lisa-plugin-selection.test.ts": true,
|
|
8125
8128
|
"tests/unit/core/lisa-skill-sources.test.ts": true,
|
|
8126
8129
|
"tests/unit/core/no-downstream-project-names.test.ts": true,
|
|
8130
|
+
"tests/unit/core/override-floors.test.ts": true,
|
|
8127
8131
|
"tests/unit/core/plugin-sync-marker.test.ts": true,
|
|
8128
8132
|
"tests/unit/core/project-config-harness-migration.test.ts": true,
|
|
8129
8133
|
"tests/unit/core/project-config-kane.test.ts": true,
|
|
@@ -8671,6 +8675,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
8671
8675
|
"tests/unit/strategies/multi-repo-container-decomposition.test.ts": true,
|
|
8672
8676
|
"tests/unit/strategies/not-established-section-contract.test.ts": true,
|
|
8673
8677
|
"tests/unit/strategies/package-lisa-integration-script-layout.test.ts": true,
|
|
8678
|
+
"tests/unit/strategies/package-lisa-override-floor-remedy.test.ts": true,
|
|
8674
8679
|
"tests/unit/strategies/package-lisa-script-composition.test.ts": true,
|
|
8675
8680
|
"tests/unit/strategies/package-lisa-script-report.test.ts": true,
|
|
8676
8681
|
"tests/unit/strategies/package-lisa-version-pin.test.ts": true,
|