@codyswann/lisa 4.34.14 → 4.34.15
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/check-npm-publish-landed.mjs +250 -0
- package/all/copy-overwrite/scripts/lisa-hooks/block-no-verify.sh +31 -1
- package/dist/codex/scripts/block-no-verify.sh +31 -1
- 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 +12 -5
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/opencode/plugin-templates/block-no-verify.sh +31 -1
- package/package.json +5 -5
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/hooks/block-no-verify.agy.sh +31 -1
- package/plugins/lisa/hooks/block-no-verify.sh +31 -1
- package/plugins/lisa-agy/hooks/block-no-verify.agy.sh +31 -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-copilot/hooks/block-no-verify.sh +31 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/hooks/block-no-verify.sh +31 -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/hooks/block-no-verify.agy.sh +31 -1
- package/plugins/src/base/hooks/block-no-verify.sh +31 -1
- package/scripts/check-npm-publish-landed.mjs +30 -0
- package/scripts/two-channel-couplings.json +17 -4
- package/typescript/copy-overwrite/.prettierignore +1 -0
|
@@ -195,8 +195,38 @@ ENV_LONG_SEPARATE_VALUE = {"--argv0", "--chdir", "--split-string", "--unset"}
|
|
|
195
195
|
|
|
196
196
|
# env's single-letter options, by whether the rest of a cluster is more
|
|
197
197
|
# options or the option's value.
|
|
198
|
+
#
|
|
199
|
+
# BOTH PLATFORMS' SETS, not one. These began as GNU's, and an option that is
|
|
200
|
+
# in neither set falls through to `ambiguous`, which this guard treats as
|
|
201
|
+
# suspicious. That default is correct and stays — an unknown option genuinely
|
|
202
|
+
# could take a value and swallow the command name. What is wrong is a
|
|
203
|
+
# well-known option being unknown, and on a macOS fleet `env -P` is exactly
|
|
204
|
+
# that: BSD's "search altpath for the utility", refused on every ordinary
|
|
205
|
+
# command it prefixes.
|
|
206
|
+
#
|
|
207
|
+
# Measured, one option at a time, against the guard before this change. BSD's
|
|
208
|
+
# complete short set is `0 i v u C P S`, from the synopsis in env(1):
|
|
209
|
+
#
|
|
210
|
+
# allowed -0 -i -v -u NAME -C DIR already covered
|
|
211
|
+
# BLOCKED -P altpath the defect, and the ONLY one
|
|
212
|
+
# BLOCKED -S string correct: split-string reparses
|
|
213
|
+
# an opaque payload, so what it
|
|
214
|
+
# runs cannot be proven here
|
|
215
|
+
# BLOCKED -Z -Q correct: unknown stays suspicious
|
|
216
|
+
#
|
|
217
|
+
# So the population is one letter, not a class. The two platforms' short
|
|
218
|
+
# options coincide everywhere else, which is why "detect the platform and
|
|
219
|
+
# choose a table" would be machinery for a single character — and would fail
|
|
220
|
+
# on a machine running GNU coreutils under a BSD userland, or the reverse.
|
|
221
|
+
# Recognising the union is both smaller and more robust.
|
|
222
|
+
#
|
|
223
|
+
# Adding a letter here is a WEAKENING, so it needs the same evidence as any
|
|
224
|
+
# other: ten bypass shapes routed through `-P` — long flag, attached value,
|
|
225
|
+
# short cluster, abbreviation, an assignment, `HUSKY=0`, a hooksPath disable,
|
|
226
|
+
# a nested `-c` shell, an executed script, and `-P` swallowing the command
|
|
227
|
+
# word — were all refused before this change and are all still refused after.
|
|
198
228
|
ENV_SHORT_NO_VALUE = frozenset("i0v")
|
|
199
|
-
ENV_SHORT_TAKES_VALUE = frozenset("
|
|
229
|
+
ENV_SHORT_TAKES_VALUE = frozenset("uCaSP")
|
|
200
230
|
|
|
201
231
|
# Builtins and wrappers that run whatever FOLLOWS them without changing what
|
|
202
232
|
# it is: `command env -S ...` runs exactly the `env` that `env -S ...` runs,
|
|
@@ -265,8 +265,38 @@ ENV_LONG_SEPARATE_VALUE = {"--argv0", "--chdir", "--split-string", "--unset"}
|
|
|
265
265
|
|
|
266
266
|
# env's single-letter options, by whether the rest of a cluster is more
|
|
267
267
|
# options or the option's value.
|
|
268
|
+
#
|
|
269
|
+
# BOTH PLATFORMS' SETS, not one. These began as GNU's, and an option that is
|
|
270
|
+
# in neither set falls through to `ambiguous`, which this guard treats as
|
|
271
|
+
# suspicious. That default is correct and stays — an unknown option genuinely
|
|
272
|
+
# could take a value and swallow the command name. What is wrong is a
|
|
273
|
+
# well-known option being unknown, and on a macOS fleet `env -P` is exactly
|
|
274
|
+
# that: BSD's "search altpath for the utility", refused on every ordinary
|
|
275
|
+
# command it prefixes.
|
|
276
|
+
#
|
|
277
|
+
# Measured, one option at a time, against the guard before this change. BSD's
|
|
278
|
+
# complete short set is `0 i v u C P S`, from the synopsis in env(1):
|
|
279
|
+
#
|
|
280
|
+
# allowed -0 -i -v -u NAME -C DIR already covered
|
|
281
|
+
# BLOCKED -P altpath the defect, and the ONLY one
|
|
282
|
+
# BLOCKED -S string correct: split-string reparses
|
|
283
|
+
# an opaque payload, so what it
|
|
284
|
+
# runs cannot be proven here
|
|
285
|
+
# BLOCKED -Z -Q correct: unknown stays suspicious
|
|
286
|
+
#
|
|
287
|
+
# So the population is one letter, not a class. The two platforms' short
|
|
288
|
+
# options coincide everywhere else, which is why "detect the platform and
|
|
289
|
+
# choose a table" would be machinery for a single character — and would fail
|
|
290
|
+
# on a machine running GNU coreutils under a BSD userland, or the reverse.
|
|
291
|
+
# Recognising the union is both smaller and more robust.
|
|
292
|
+
#
|
|
293
|
+
# Adding a letter here is a WEAKENING, so it needs the same evidence as any
|
|
294
|
+
# other: ten bypass shapes routed through `-P` — long flag, attached value,
|
|
295
|
+
# short cluster, abbreviation, an assignment, `HUSKY=0`, a hooksPath disable,
|
|
296
|
+
# a nested `-c` shell, an executed script, and `-P` swallowing the command
|
|
297
|
+
# word — were all refused before this change and are all still refused after.
|
|
268
298
|
ENV_SHORT_NO_VALUE = frozenset("i0v")
|
|
269
|
-
ENV_SHORT_TAKES_VALUE = frozenset("
|
|
299
|
+
ENV_SHORT_TAKES_VALUE = frozenset("uCaSP")
|
|
270
300
|
|
|
271
301
|
# Builtins and wrappers that run whatever FOLLOWS them without changing what
|
|
272
302
|
# it is: `command env -S ...` runs exactly the `env` that `env -S ...` runs,
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Lisa's own entry point for the shipped npm-publish verification.
|
|
4
|
+
*
|
|
5
|
+
* `publish-to-npm.yml` runs `node scripts/check-npm-publish-landed.mjs`, and
|
|
6
|
+
* that path is the CALLER's tree: in a host project `lisa apply` writes it from
|
|
7
|
+
* `all/copy-overwrite/scripts/`, and in this repository it is this file. So the
|
|
8
|
+
* step needs the path to exist here too, or Lisa's own release is the one
|
|
9
|
+
* release the check never runs on.
|
|
10
|
+
*
|
|
11
|
+
* A re-export rather than a second copy. The sibling in the same workflow,
|
|
12
|
+
* `check-release-package-identity.mjs`, is duplicated byte-for-byte across both
|
|
13
|
+
* channels, and duplicated checks are exactly what drifts unnoticed — the whole
|
|
14
|
+
* `hook-copy-parity` subsystem exists because two copies of one check cannot be
|
|
15
|
+
* kept in step by intention. There is one implementation, and both paths reach
|
|
16
|
+
* it.
|
|
17
|
+
* @module scripts/check-npm-publish-landed
|
|
18
|
+
*/
|
|
19
|
+
import process from "node:process";
|
|
20
|
+
|
|
21
|
+
import { main } from "../all/copy-overwrite/scripts/check-npm-publish-landed.mjs";
|
|
22
|
+
|
|
23
|
+
main(process.argv.slice(2))
|
|
24
|
+
.then(code => {
|
|
25
|
+
process.exitCode = code;
|
|
26
|
+
})
|
|
27
|
+
.catch(error => {
|
|
28
|
+
process.stderr.write(`❌ ${error.message}\n`);
|
|
29
|
+
process.exitCode = 1;
|
|
30
|
+
});
|
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
},
|
|
6
6
|
"inspected": {
|
|
7
7
|
"workflows": 22,
|
|
8
|
-
"steps":
|
|
9
|
-
"couplings":
|
|
10
|
-
"inventory":
|
|
8
|
+
"steps": 716,
|
|
9
|
+
"couplings": 34,
|
|
10
|
+
"inventory": 71
|
|
11
11
|
},
|
|
12
12
|
"counts": {
|
|
13
13
|
"package-backed": 10,
|
|
14
|
-
"apply-lagged":
|
|
14
|
+
"apply-lagged": 22,
|
|
15
15
|
"never-delivered": 0,
|
|
16
16
|
"undelivered": 2
|
|
17
17
|
},
|
|
@@ -133,6 +133,19 @@
|
|
|
133
133
|
],
|
|
134
134
|
"detail": "`nightly-e2e-tracking.yml` is delivered at `@main`, so this step is live in every consumer on their next run. It reads `scripts/reconcile-nightly-e2e-tracking.mjs` from the CALLER's tree with no package-relative candidate, and Lisa delivers that path on the `lisa apply` channel (typescript/copy-overwrite). The two halves land in the wrong order: this step is live everywhere immediately, the file it needs is live only where somebody applied. The read is unguarded, so an absent path fails the job loudly. Visible, which makes it the better of the two failures."
|
|
135
135
|
},
|
|
136
|
+
{
|
|
137
|
+
"key": "publish-to-npm.yml::scripts/check-npm-publish-landed.mjs",
|
|
138
|
+
"workflow": "publish-to-npm.yml",
|
|
139
|
+
"path": "scripts/check-npm-publish-landed.mjs",
|
|
140
|
+
"channel": "apply",
|
|
141
|
+
"verdict": "apply-lagged",
|
|
142
|
+
"remedy": "run-lisa-apply",
|
|
143
|
+
"guarded": false,
|
|
144
|
+
"lanes": [
|
|
145
|
+
"all/copy-overwrite"
|
|
146
|
+
],
|
|
147
|
+
"detail": "`publish-to-npm.yml` is delivered at `@main`, so this step is live in every consumer on their next run. It reads `scripts/check-npm-publish-landed.mjs` from the CALLER's tree with no package-relative candidate, and Lisa delivers that path on the `lisa apply` channel (all/copy-overwrite). The two halves land in the wrong order: this step is live everywhere immediately, the file it needs is live only where somebody applied. The read is unguarded, so an absent path fails the job loudly. Visible, which makes it the better of the two failures."
|
|
148
|
+
},
|
|
136
149
|
{
|
|
137
150
|
"key": "publish-to-npm.yml::scripts/check-release-package-identity.mjs",
|
|
138
151
|
"workflow": "publish-to-npm.yml",
|
|
@@ -69,6 +69,7 @@ scripts/check-orphaned-branches.mjs
|
|
|
69
69
|
scripts/check-e2e-coverage.mjs
|
|
70
70
|
scripts/check-lighthouse-details.mjs
|
|
71
71
|
scripts/check-nightly-e2e-health.mjs
|
|
72
|
+
scripts/check-npm-publish-landed.mjs
|
|
72
73
|
scripts/check-release-package-identity.mjs
|
|
73
74
|
scripts/check-skipped-required-checks.mjs
|
|
74
75
|
scripts/check-state-classification.mjs
|