@codyswann/lisa 4.26.1 → 4.26.2

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 (71) hide show
  1. package/all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh +64 -1
  2. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  3. package/dist/core/lisa-owned-hash-ledger.js +6 -0
  4. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  5. package/dist/core/nightly-e2e-guard-behavior-certificate.d.ts +5 -0
  6. package/dist/core/nightly-e2e-guard-behavior-certificate.d.ts.map +1 -1
  7. package/dist/core/nightly-e2e-guard-behavior-certificate.js +8 -1
  8. package/dist/core/nightly-e2e-guard-behavior-certificate.js.map +1 -1
  9. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  10. package/dist/core/upstream-evidence-manifest.js +6 -5
  11. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  12. package/dist/opencode/plugin-templates/parity-safety-net.sh +64 -1
  13. package/expo/create-only/.github/workflows/nightly-e2e-report.yml +21 -6
  14. package/package.json +3 -3
  15. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  16. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  17. package/plugins/lisa/hooks/parity-safety-net.sh +64 -1
  18. package/plugins/lisa-agy/hooks/parity-safety-net.sh +64 -1
  19. package/plugins/lisa-agy/plugin.json +1 -1
  20. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  21. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  22. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  23. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  24. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  25. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  26. package/plugins/lisa-copilot/hooks/parity-safety-net.sh +64 -1
  27. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-cursor/hooks/parity-safety-net.sh +64 -1
  29. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  31. package/plugins/lisa-expo-agy/plugin.json +1 -1
  32. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  36. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  37. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  41. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  42. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  46. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  47. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  51. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  52. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  56. package/plugins/lisa-rails-agy/plugin.json +1 -1
  57. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  61. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  62. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  66. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  67. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  69. package/plugins/src/base/hooks/parity-safety-net.sh +64 -1
  70. package/scripts/generate-nightly-e2e-guard-certificate.mjs +17 -1
  71. package/typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs +238 -44
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "4.26.1",
3
+ "version": "4.26.2",
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.26.1",
3
+ "version": "4.26.2",
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.26.1",
3
+ "version": "4.26.2",
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.26.1",
3
+ "version": "4.26.2",
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.26.1",
3
+ "version": "4.26.2",
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.26.1",
3
+ "version": "4.26.2",
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.26.1",
3
+ "version": "4.26.2",
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.26.1",
3
+ "version": "4.26.2",
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.26.1",
3
+ "version": "4.26.2",
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.26.1",
3
+ "version": "4.26.2",
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.26.1",
3
+ "version": "4.26.2",
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.26.1",
3
+ "version": "4.26.2",
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.26.1",
3
+ "version": "4.26.2",
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.26.1",
3
+ "version": "4.26.2",
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.26.1",
3
+ "version": "4.26.2",
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.26.1",
3
+ "version": "4.26.2",
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.26.1",
3
+ "version": "4.26.2",
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.26.1",
3
+ "version": "4.26.2",
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.26.1",
3
+ "version": "4.26.2",
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.26.1",
3
+ "version": "4.26.2",
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-typescript",
3
- "version": "4.26.1",
3
+ "version": "4.26.2",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "4.26.1",
3
+ "version": "4.26.2",
4
4
  "description": "TypeScript-specific hooks for formatting, linting, and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "4.26.1",
3
+ "version": "4.26.2",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "4.26.1",
3
+ "version": "4.26.2",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "4.26.1",
3
+ "version": "4.26.2",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "4.26.1",
3
+ "version": "4.26.2",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "4.26.1",
3
+ "version": "4.26.2",
4
4
  "description": "Distributable LLM Wiki kernel — ingest, query, lint, and maintain a git-native markdown knowledge base across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "4.26.1",
3
+ "version": "4.26.2",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "4.26.1",
3
+ "version": "4.26.2",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "4.26.1",
3
+ "version": "4.26.2",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1035,6 +1035,69 @@ fi
1035
1035
  # purpose, and blocking those would be the collision that gets a guard switched
1036
1036
  # off. The trailing `([/[:space:]'"$qc"']|$)` is what draws that line.
1037
1037
  readonly GIT_CONTROL_PLANE='(^|[[:space:]='"$qc"'./])\.git([/[:space:]'"$qc"']|$)'
1038
+ # This guard is the one segment walk that pairs TWO facts found in different
1039
+ # places: the protected target (`.git`) and the destructive verb (a recursive
1040
+ # forced delete). That makes its segmentation load-bearing in a way the rm and
1041
+ # push walks' is not — those two read a verb and its own operands, which are
1042
+ # always in one pipeline stage, so splitting on `|` costs them nothing.
1043
+ #
1044
+ # Here it cost everything. The old feeder was `tr '&|;' '\n'`, which cut a
1045
+ # PIPELINE into pieces before the pairing question was asked, and a pipeline is
1046
+ # exactly how a delete reaches a target named upstream of it:
1047
+ # `find .git -type f -print0 | xargs -0 rm -rf` became `find .git -type f
1048
+ # -print0` (a target, no verb) and `xargs -0 rm -rf` (a verb, no target), and
1049
+ # neither half could answer. Measured before this fix, with the blanket
1050
+ # `xargs rm -rf` rule masking the reported shape: `find .git -type d | parallel
1051
+ # rm -rf`, `… | /usr/bin/xargs rm -rf`, `… | xargs -0 -- rm --recursive
1052
+ # --force`, `… 2>&1 | parallel rm -rf`, `… |& parallel rm -rf` and
1053
+ # `cat .git/config | grep url | rm -rf refs` were ALL allowed (CodySwannGT/lisa#3320).
1054
+ #
1055
+ # So segment on STATEMENT boundaries and nothing else. A pipe joins stages of
1056
+ # one statement; `;`, `&`, `&&` and `||` end one. Three spellings have to be
1057
+ # normalized first or a naive split gets them wrong in both directions:
1058
+ #
1059
+ # `|&` bash's pipe-with-stderr. Splitting its `&` would halve a pipeline —
1060
+ # the same fail-open, wearing a different operator. Becomes `|`.
1061
+ # `2>&1` a redirection, not a boundary (also `>&2`, `<&3`, `&>file`). These
1062
+ # are where `&` appears WITHOUT ending a statement, and they are
1063
+ # common enough that ignoring them would reopen the hole on any
1064
+ # pipeline that redirects stderr. The `&` is folded away.
1065
+ # `||` a real boundary that happens to be built from pipe characters, so it
1066
+ # must be recognized BEFORE a single `|` is spared. Becomes `;`.
1067
+ #
1068
+ # Every one of those rewrites only ever REMOVES a boundary or leaves it intact,
1069
+ # so each can merge two segments but never split one — the fail-closed
1070
+ # direction. `&` and `;` still separate, so unrelated commands are not joined.
1071
+ #
1072
+ # The leading awk is the same idea one level up. A line ending in `|` is bash's
1073
+ # OTHER implicit continuation — the pipeline resumes on the next line — and the
1074
+ # per-line read below would otherwise part the stages exactly as `tr` did, so
1075
+ # `find .git -type d |`↵` parallel rm -rf` fails open through the newline
1076
+ # instead of through the pipe. This mirrors the backslash-continuation join that
1077
+ # `normalized_command_str` already performs for the same reason. It is done here
1078
+ # rather than in that shared normalization deliberately: this guard is the one
1079
+ # that pairs facts across stages, so it is the one that needs the stages kept
1080
+ # together, and widening the shared normalization would change every other
1081
+ # guard's segmentation for no defect anyone has measured.
1082
+ #
1083
+ # The status check is the second half of the fix and closes a quieter hole. This
1084
+ # feeder had none, while the rm and push walks above both have one: a segmenter
1085
+ # that could not run produced no lines, the loop body never executed, and the
1086
+ # guard was skipped with the command ALLOWED. A segmentation that cannot answer
1087
+ # must refuse, exactly like a scan that cannot answer.
1088
+ git_segments_status=0
1089
+ git_segments="$(printf '%s' "$normalized_command_str" \
1090
+ | awk '{ if (/\|[ \t]*$/) printf "%s ", $0; else print }' \
1091
+ | sed -e 's/|&/|/g' \
1092
+ -e 's/&>/>/g' \
1093
+ -e 's/[0-9]*>&[0-9-]*/>/g' \
1094
+ -e 's/[0-9]*<&[0-9-]*/</g' \
1095
+ -e 's/||/;/g' \
1096
+ | tr '&;' '\n')" || git_segments_status=$?
1097
+ case "$git_segments_status" in
1098
+ 0) ;;
1099
+ *) scan_failed "$git_segments_status" ;;
1100
+ esac
1038
1101
  while IFS= read -r git_stmt; do
1039
1102
  [ -n "$git_stmt" ] || continue
1040
1103
  if ! scan -E "$git_stmt" "$RM_RF_CLUSTER" \
@@ -1044,7 +1107,7 @@ while IFS= read -r git_stmt; do
1044
1107
  if scan -E "$git_stmt" "$GIT_CONTROL_PLANE"; then
1045
1108
  block "recursive forced delete of the git control plane (.git holds every commit, branch and stash not already pushed; nothing in the working tree can rebuild it). Delete a specific ignored artifact instead, or re-clone if the checkout is genuinely to be discarded."
1046
1109
  fi
1047
- done <<< "$(printf '%s' "$normalized_command_str" | tr '&|;' '\n')"
1110
+ done <<<"$git_segments"
1048
1111
 
1049
1112
  # 15. Credential stores. Reading one into an agent transcript is disclosure even
1050
1113
  # when nothing is copied anywhere: the value lands in a log, a context window,
@@ -40,7 +40,18 @@ const SEMVER = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/u;
40
40
  * Every entry is reread from git and behavior-tested. Adding a digest or source
41
41
  * blob here is intentionally impossible; the only input is a release ref.
42
42
  */
43
- export const RETAINED_RELEASES = Object.freeze(["v2.353.0", "v4.17.16"]);
43
+ export const RETAINED_RELEASES = Object.freeze([
44
+ "v2.353.0",
45
+ "v4.17.16",
46
+ // The 1.8.0 guard, as `@codyswann/lisa@4.26.1` published it. Retained the
47
+ // moment the workspace guard moved to 1.9.0, because regeneration certifies
48
+ // the WORKSPACE bytes under the workspace package version — so without this
49
+ // entry, upgrading the guard silently revokes the certificate for a release
50
+ // already installed in the field, and `proveNightlyE2eGuardTarget` starts
51
+ // refusing to execute bytes it trusted yesterday. Rereading the tag is the
52
+ // only sanctioned way to keep it: the digest is derived, never copied.
53
+ "v4.26.1",
54
+ ]);
44
55
 
45
56
  const digest = bytes => createHash("sha256").update(bytes).digest("hex");
46
57
 
@@ -73,6 +84,11 @@ const VERSION_EXPECTATIONS = Object.freeze({
73
84
  // still required: an unlisted contract version is refused rather than assumed
74
85
  // to behave like its predecessor.
75
86
  "1.8.0": Object.freeze({ selfService: "valid" }),
87
+ // 1.9.0 changed the REPORTING half's exit code and publish ordering (§10.4).
88
+ // The waiver handler and every §2 row are untouched, so the bounded-waiver
89
+ // expectations are unchanged — and the entry is still required, for the same
90
+ // reason 1.8.0's was.
91
+ "1.9.0": Object.freeze({ selfService: "valid" }),
76
92
  });
77
93
 
78
94
  /**