@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.
Files changed (72) hide show
  1. package/all/copy-overwrite/scripts/check-npm-publish-landed.mjs +250 -0
  2. package/all/copy-overwrite/scripts/lisa-hooks/block-no-verify.sh +31 -1
  3. package/dist/codex/scripts/block-no-verify.sh +31 -1
  4. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  5. package/dist/core/lisa-owned-hash-ledger.js +10 -0
  6. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  7. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  8. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  9. package/dist/core/upstream-evidence-manifest.js +12 -5
  10. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  11. package/dist/opencode/plugin-templates/block-no-verify.sh +31 -1
  12. package/package.json +5 -5
  13. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  14. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  15. package/plugins/lisa/hooks/block-no-verify.agy.sh +31 -1
  16. package/plugins/lisa/hooks/block-no-verify.sh +31 -1
  17. package/plugins/lisa-agy/hooks/block-no-verify.agy.sh +31 -1
  18. package/plugins/lisa-agy/plugin.json +1 -1
  19. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  20. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  21. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  22. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  23. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  24. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  25. package/plugins/lisa-copilot/hooks/block-no-verify.sh +31 -1
  26. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa-cursor/hooks/block-no-verify.sh +31 -1
  28. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  30. package/plugins/lisa-expo-agy/plugin.json +1 -1
  31. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  32. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  35. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  36. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  37. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  40. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  41. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  45. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  46. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  50. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  51. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  55. package/plugins/lisa-rails-agy/plugin.json +1 -1
  56. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  60. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  61. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  65. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  66. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  68. package/plugins/src/base/hooks/block-no-verify.agy.sh +31 -1
  69. package/plugins/src/base/hooks/block-no-verify.sh +31 -1
  70. package/scripts/check-npm-publish-landed.mjs +30 -0
  71. package/scripts/two-channel-couplings.json +17 -4
  72. package/typescript/copy-overwrite/.prettierignore +1 -0
@@ -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("uCaS")
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,
package/package.json CHANGED
@@ -166,7 +166,7 @@
166
166
  "zod-validation-error": "^4.0.0"
167
167
  },
168
168
  "name": "@codyswann/lisa",
169
- "version": "4.34.14",
169
+ "version": "4.34.15",
170
170
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
171
171
  "main": "dist/index.js",
172
172
  "exports": {
@@ -293,7 +293,7 @@
293
293
  "vitest": "^4.1.9"
294
294
  },
295
295
  "devDependencies": {
296
- "@codyswann/lisa": "^2.328.0",
296
+ "@codyswann/lisa": "^4.33.1",
297
297
  "@playwright/test": "^1.61.1",
298
298
  "@stryker-mutator/api": "^9.0.0",
299
299
  "@stryker-mutator/core": "^9.0.0",
@@ -314,7 +314,7 @@
314
314
  "test": "tests"
315
315
  },
316
316
  "types": "./dist/index.d.ts",
317
- "lisaReleaseCommit": "1277f22aa0cae81d1a6669d75b0d3c1cc0c09f9e",
318
- "gitHead": "1277f22aa0cae81d1a6669d75b0d3c1cc0c09f9e",
319
- "lisaReleaseTag": "v4.34.14"
317
+ "lisaReleaseCommit": "5f12a6b3a9f4d8a9f00db9f0000361a4838c6b78",
318
+ "gitHead": "5f12a6b3a9f4d8a9f00db9f0000361a4838c6b78",
319
+ "lisaReleaseTag": "v4.34.15"
320
320
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -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("uCaS")
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("uCaS")
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,
@@ -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("uCaS")
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,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "AWS CDK-specific Lisa plugin.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -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("uCaS")
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,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -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("uCaS")
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,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Expo and React Native-specific skills, agents, rules, and MCP servers.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Harper/Fabric-specific Lisa rules for TypeScript component apps.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "NestJS-specific skills and migration write-protection hooks.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Ruby on Rails-specific skills and hooks for RuboCop and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "4.34.14",
3
+ "version": "4.34.15",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"