@codyswann/lisa 2.329.0 → 2.330.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.
Files changed (81) hide show
  1. package/all/copy-overwrite/scripts/lisa-enforcement-fallback.sh +4 -2
  2. package/all/copy-overwrite/scripts/lisa-hooks/block-instruction-file-edits.sh +142 -0
  3. package/all/merge/.claude/settings.json +9 -0
  4. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  5. package/dist/core/upstream-evidence-manifest.js +21 -6
  6. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  7. package/dist/opencode/hooks-installer.d.ts.map +1 -1
  8. package/dist/opencode/hooks-installer.js +1 -41
  9. package/dist/opencode/hooks-installer.js.map +1 -1
  10. package/dist/opencode/plugin-catalog.d.ts +25 -0
  11. package/dist/opencode/plugin-catalog.d.ts.map +1 -0
  12. package/dist/opencode/plugin-catalog.js +47 -0
  13. package/dist/opencode/plugin-catalog.js.map +1 -0
  14. package/dist/opencode/plugin-templates/lisa-block-instruction-file-edits.ts +72 -0
  15. package/package.json +1 -1
  16. package/plugins/lisa/.claude-plugin/plugin.json +14 -1
  17. package/plugins/lisa/.codex-plugin/hooks.json +13 -0
  18. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  19. package/plugins/lisa/hooks/block-instruction-file-edits.agy.sh +58 -0
  20. package/plugins/lisa/hooks/block-instruction-file-edits.sh +142 -0
  21. package/plugins/lisa-agy/hooks/block-instruction-file-edits.agy.sh +58 -0
  22. package/plugins/lisa-agy/hooks/block-instruction-file-edits.sh +142 -0
  23. package/plugins/lisa-agy/hooks.json +13 -0
  24. package/plugins/lisa-agy/plugin.json +1 -1
  25. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  26. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  27. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  28. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa-copilot/.claude-plugin/plugin.json +14 -1
  31. package/plugins/lisa-copilot/hooks/block-instruction-file-edits.sh +142 -0
  32. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-cursor/hooks/block-instruction-file-edits.sh +142 -0
  34. package/plugins/lisa-cursor/hooks/hooks.json +8 -0
  35. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  37. package/plugins/lisa-expo-agy/plugin.json +1 -1
  38. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  42. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  43. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  47. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  48. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  52. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  53. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  57. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  58. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  62. package/plugins/lisa-rails-agy/plugin.json +1 -1
  63. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  67. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  68. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  69. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  72. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  73. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  74. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  75. package/plugins/src/base/.claude-plugin/plugin.json +13 -0
  76. package/plugins/src/base/hooks/block-instruction-file-edits.agy.sh +58 -0
  77. package/plugins/src/base/hooks/block-instruction-file-edits.sh +142 -0
  78. package/scripts/build-plugins.sh +2 -1
  79. package/scripts/generate-agy-plugin-artifacts.mjs +11 -0
  80. package/scripts/lib/per-agent-hook-filter.mjs +10 -0
  81. package/scripts/lisa-enforcement-fallback.sh +4 -2
@@ -4,7 +4,8 @@
4
4
  # is not installed.
5
5
  #
6
6
  # Every PreToolUse guard — block-no-verify, parity-safety-net,
7
- # block-shell-json-parsing — is declared in the Lisa plugin. A cloud session
7
+ # block-shell-json-parsing, block-instruction-file-edits — is declared in the
8
+ # Lisa plugin. A cloud session
8
9
  # installs plugins at session start from the marketplace the repository
9
10
  # declares, and when that does not happen the container runs with
10
11
  # `installed_plugins.json` empty and no enforcement whatsoever.
@@ -41,7 +42,8 @@ fi
41
42
  # host project whose plugin install fails has exactly the same hole and no
42
43
  # `plugins/` directory to fall back on.
43
44
  status=0
44
- for guard in block-no-verify parity-safety-net block-shell-json-parsing; do
45
+ for guard in block-no-verify parity-safety-net block-shell-json-parsing \
46
+ block-instruction-file-edits; do
45
47
  script=""
46
48
  for candidate in \
47
49
  "$repo_root/scripts/lisa-hooks/$guard.sh" \
@@ -0,0 +1,142 @@
1
+ #!/usr/bin/env bash
2
+ # PreToolUse hook: refuse agent writes to the session-instruction files.
3
+ #
4
+ # `AGENTS.md`, `CLAUDE.md`, and `.github/copilot-instructions.md` are the files
5
+ # every agent loads at session start. They are human-authored and curated on
6
+ # purpose — Lisa's own contract says so in two places:
7
+ # - plugins/src/base/rules/reference/project-learnings.md
8
+ # - plugins/src/base/skills/lisa-debrief-apply/SKILL.md ("CLAUDE.md is
9
+ # human-authored ... apply never writes to any of the three")
10
+ #
11
+ # Nothing enforced it, so agents appended their own findings anyway: one fleet
12
+ # repo reached 949 lines of ticket-keyed trap dumps in `AGENTS.md` while its
13
+ # learnings ledger held 22. Every one of those lines is charged to the context
14
+ # of every later session in that project, forever. Prose did not hold; this is
15
+ # the executable control that does.
16
+ #
17
+ # Blocked signatures:
18
+ # 1. Write / Edit / MultiEdit / NotebookEdit whose target basename is one of
19
+ # the instruction files;
20
+ # 2. Bash output redirection (`>`, `>>`), `tee`, or `sed -i` aimed at one.
21
+ # Reads (`cat AGENTS.md`, `rg pattern AGENTS.md`) never fire.
22
+ #
23
+ # Exemptions (allowed):
24
+ # - `LISA_ALLOW_INSTRUCTION_FILE_WRITE` set — the operator's explicit override,
25
+ # named in the refusal so a human who really wants the edit can take it;
26
+ # - payloads carrying a `<!-- LISA_` marker: Lisa's own marker-bounded regions
27
+ # (the agy project-learnings bridge, cross-pollinate's rule section) replace
28
+ # in place on re-run and cannot grow the file;
29
+ # - paths under `node_modules/` or `dist/` — vendored copies, not the host's.
30
+ set -euo pipefail
31
+
32
+ input="$(cat)"
33
+
34
+ command -v jq >/dev/null 2>&1 || exit 0
35
+
36
+ # The operator's override. Checked before anything else so it is always the
37
+ # cheapest way out of a refusal a human deliberately wants to overrule.
38
+ if [ -n "${LISA_ALLOW_INSTRUCTION_FILE_WRITE:-}" ]; then
39
+ exit 0
40
+ fi
41
+
42
+ tool_name="$(printf '%s' "$input" | jq -r '.tool_name // empty')"
43
+ [ -n "$tool_name" ] || exit 0
44
+
45
+ # Lisa's own bounded bridges write marked regions. A payload carrying a marker
46
+ # is replacing a delimited block, not appending prose, so it cannot be the
47
+ # unbounded growth this guard exists to stop.
48
+ if printf '%s' "$input" | grep -q '<!-- LISA_'; then
49
+ exit 0
50
+ fi
51
+
52
+ # Basename match, case-insensitively: `agents.md` and `AGENTS.md` are the same
53
+ # file on the macOS checkouts this fleet runs on.
54
+ is_instruction_file() {
55
+ local candidate="$1"
56
+ case "$candidate" in
57
+ */node_modules/* | node_modules/* | */dist/* | dist/*) return 1 ;;
58
+ esac
59
+ local base="${candidate##*/}"
60
+ case "$(printf '%s' "$base" | tr '[:upper:]' '[:lower:]')" in
61
+ agents.md | claude.md | copilot-instructions.md) return 0 ;;
62
+ esac
63
+ return 1
64
+ }
65
+
66
+ refuse() {
67
+ local target="$1"
68
+ cat >&2 <<EOF
69
+ BLOCKED: refusing to write \`$target\`.
70
+
71
+ WHY: this is a session-instruction file, not a place to record what you just
72
+ learned. Every line in it is loaded into the context of every agent, in every
73
+ future session, in this project, forever. It is human-curated on purpose. An
74
+ agent appending its own findings is how these files grow into hundreds of lines
75
+ of stale, ticket-specific trivia that every later session pays for and half of
76
+ which was only ever true once.
77
+
78
+ WHERE IT GOES INSTEAD — take the first one that fits:
79
+
80
+ 1. Every agent genuinely needs this in every session, and only in this project.
81
+ That is a project rule — but do not write it yourself. Capture it with
82
+ \`/lisa:persist-learning\` so it lands in the learnings ledger with provenance
83
+ and a confidence score. The gardener (\`/lisa:learnings:audit\`) then proposes
84
+ promotion into \`.claude/rules/PROJECT_RULES.md\` as a human-gated ticket.
85
+
86
+ 2. It changes how an existing skill should behave. Edit that skill's SKILL.md.
87
+ Knowledge belongs next to the procedure it modifies, not in a global preamble.
88
+
89
+ 3. It is true beyond this project. Propose it upstream to Lisa via
90
+ \`/lisa:cross-pollinate\`, or open an issue on CodySwannGT/lisa. A local copy of
91
+ a general rule silently drifts the moment upstream changes.
92
+
93
+ 4. None of the above — it is background someone may want to look up, not a
94
+ standing instruction. Write it into the project documentation (\`wiki/\` or
95
+ \`docs/\`).
96
+
97
+ If a human explicitly asked for this edit, they can re-run with
98
+ \`LISA_ALLOW_INSTRUCTION_FILE_WRITE=1\` set, which bypasses this guard.
99
+ EOF
100
+ exit 2
101
+ }
102
+
103
+ case "$tool_name" in
104
+ Write | Edit | MultiEdit | NotebookEdit | Update)
105
+ # `file_path` covers Write/Edit; `edits[].file_path` covers the MultiEdit
106
+ # shapes that carry a path per edit; `notebook_path` covers NotebookEdit.
107
+ paths="$(printf '%s' "$input" | jq -r '
108
+ [ .tool_input.file_path?,
109
+ .tool_input.path?,
110
+ .tool_input.notebook_path?,
111
+ (.tool_input.edits? // [] | .[].file_path?)
112
+ ] | map(select(. != null and . != "")) | .[]' 2>/dev/null || true)"
113
+ while IFS= read -r candidate; do
114
+ [ -n "$candidate" ] || continue
115
+ if is_instruction_file "$candidate"; then
116
+ refuse "$candidate"
117
+ fi
118
+ done <<EOF
119
+ $paths
120
+ EOF
121
+ ;;
122
+ Bash)
123
+ command_str="$(printf '%s' "$input" | jq -r '.tool_input.command // empty')"
124
+ [ -n "$command_str" ] || exit 0
125
+ # Fast path: no instruction filename mentioned means nothing to classify.
126
+ if ! printf '%s' "$command_str" |
127
+ grep -Eqi '(agents|claude|copilot-instructions)\.md'; then
128
+ exit 0
129
+ fi
130
+ # Write signatures only. A bare mention (`cat AGENTS.md`, `rg x AGENTS.md`)
131
+ # is a read and must stay allowed — the filename has to appear as the target
132
+ # of a redirection, a tee, or an in-place sed.
133
+ write_target='[^ |;&]*(agents|claude|copilot-instructions)\.md'
134
+ if printf '%s' "$command_str" |
135
+ grep -Eqi ">>?[[:space:]]*['\"]?$write_target|tee([[:space:]]+-[a-z]+)*[[:space:]]+['\"]?$write_target|sed[[:space:]]+[^|;&]*-i[^|;&]*$write_target"; then
136
+ refuse "$(printf '%s' "$command_str" |
137
+ grep -Eoi "$write_target" | head -1)"
138
+ fi
139
+ ;;
140
+ esac
141
+
142
+ exit 0
@@ -48,6 +48,15 @@
48
48
  "command": "bash \"$CLAUDE_PROJECT_DIR\"/scripts/lisa-enforcement-fallback.sh"
49
49
  }
50
50
  ]
51
+ },
52
+ {
53
+ "matcher": "Write|Edit|MultiEdit",
54
+ "hooks": [
55
+ {
56
+ "type": "command",
57
+ "command": "bash \"$CLAUDE_PROJECT_DIR\"/scripts/lisa-enforcement-fallback.sh"
58
+ }
59
+ ]
51
60
  }
52
61
  ]
53
62
  }
@@ -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,CAopEpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CA2pNjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,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,CA0pEpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAuqNjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,CAAC"}
@@ -3,8 +3,9 @@
3
3
  export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
4
4
  "all/copy-contents/.gitattributes": "9d3831007e681186a3673e1037ef3fc82980cab2fc04e27c0868e562912c9e9f",
5
5
  "all/copy-contents/gitignore": "2dbf7fd2f2020fc7824c432342002d9ca3ebb57b2872e761b14e942b23479a11",
6
- "all/copy-overwrite/scripts/lisa-enforcement-fallback.sh": "9cab71562d01421d57c6719318a4d03a6249a45c1aea434db3ff26e3065eeb66",
6
+ "all/copy-overwrite/scripts/lisa-enforcement-fallback.sh": "e17c45f7cadf0fb55dd07270776caf211af99b7d4771a4fde75aafe5919e8dbe",
7
7
  "all/copy-overwrite/scripts/lisa-floor-collisions.mjs": "a612f172282d13ba9318fe5e03689d7c6ff42a0122d0c9d5d39051e1967b93dc",
8
+ "all/copy-overwrite/scripts/lisa-hooks/block-instruction-file-edits.sh": "8996e0bcbf1db085a5d99734e797c91f5025997bd967bc374efff8348dac14c2",
8
9
  "all/copy-overwrite/scripts/lisa-hooks/block-no-verify.sh": "aa95a84f9f9224914947a09b858535aa8bd052199ff64cb53768cf78fb69b687",
9
10
  "all/copy-overwrite/scripts/lisa-hooks/block-shell-json-parsing.sh": "3b5f074f3ab5708030af507eea962389f3b067c5dbdc76580bd9e44d3ac6c603",
10
11
  "all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh": "062c69eea85157f1e941ec3626d8912aa9f182af6ccdbe19687588a6074db5ce",
@@ -17,7 +18,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
17
18
  "all/github-rulesets/base.json": "58b9606f185cdca8b17218829aac333b7d8c08f0f2b4f86d7e360f7be1de4787",
18
19
  "all/github-rulesets/prevent-delete.json": "e4fb26390a8bfee34b27be5b369f376a1a9a00b797fd8d3ce51cb71facb826a4",
19
20
  "all/github-rulesets/protect-tags.json": "387f824e3ea58a803223e42e08326504a39e6a7a0c650a0bbfdfb4653854b722",
20
- "all/merge/.claude/settings.json": "4d41a745030e5f33eb4d4fe1f1b12268680f104ea55a30c4d9f55a6e22ad6fca",
21
+ "all/merge/.claude/settings.json": "c3ea6760913c0104350f731646fc5abd22122ce0a303c95536e7769f12294654",
21
22
  "cdk/copy-overwrite/.github/workflows/.keep": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
22
23
  "cdk/copy-overwrite/eslint.cdk.ts": "074fe7a638ed95210339a9215abf75fa52bb10e678f2fd58523ff8a9d32ea4b6",
23
24
  "cdk/copy-overwrite/eslint.config.ts": "f1917ade3f1170ac8027110b44499732b9d9d3a2d42f256e37cd09930970298c",
@@ -293,6 +294,8 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
293
294
  "plugins/src/base/commands/verify-workflow-change.md": "2d3e519ddf5292c8e10bed5190e9bcd701a48fed6a277e8ef7fb3bf8326315af",
294
295
  "plugins/src/base/commands/verify.md": "ffbc553ec86e77845da72b5b0eb0dbb2b5a93b781ac8a7dbb2ef0f31f38f7b96",
295
296
  "plugins/src/base/commands/wiki/install.md": "51392cf053c17edd549bfbaba5d19ce669dc79021aafa7cfa100324ad38de11f",
297
+ "plugins/src/base/hooks/block-instruction-file-edits.agy.sh": "aa249cae53caeb3e0fb6d6af114e2756084f45a2896332fb063a9f20e4902125",
298
+ "plugins/src/base/hooks/block-instruction-file-edits.sh": "8996e0bcbf1db085a5d99734e797c91f5025997bd967bc374efff8348dac14c2",
296
299
  "plugins/src/base/hooks/block-no-verify.agy.sh": "1a36c841b6339a2c664938d65c5a4542f97d05f584e467de448bb72ac6bdba55",
297
300
  "plugins/src/base/hooks/block-no-verify.sh": "aa95a84f9f9224914947a09b858535aa8bd052199ff64cb53768cf78fb69b687",
298
301
  "plugins/src/base/hooks/block-shell-json-parsing.agy.sh": "dc688efe382e7b8fe6f6c88bb0fde851527128cae778599559f23a93f1c9ec86",
@@ -966,7 +969,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
966
969
  "rails/deletions.json": "eeadf9a2b1677913199a235091a8d6190477f3e2a5fd598d62cf658cb59a8099",
967
970
  "rails/github-rulesets/quality-checks.json": "0ec1c366589edbaa6b8f45f940cef3ada5ed7b1a956d98d3fa6034b0f78fbc7c",
968
971
  "rails/merge/.claude/settings.json": "9c49f8c7c453f8749c90def3e22d412c3345c533d24b30dc7745ffa052ad6fa1",
969
- "scripts/build-plugins.sh": "b57413e6e003be102e82e0a8a6b44a137f5d0aeed8da4c1f4f99919a0d7e8b04",
972
+ "scripts/build-plugins.sh": "d4332a862d57798280e0d0c96826bbdc6b07855659dae529f8de32de994d2da9",
970
973
  "scripts/check-duplicate-versions.mjs": "84d97e94eb834522848ddce951bb54ae9da1e4be252e2c51fed0c01c4f4d6b72",
971
974
  "scripts/check-learnings-budget.ts": "007430c2d6938efcc79ccbfd5717ebe2c7cf66b4de9a21a3e67b8db7f3600349",
972
975
  "scripts/check-plugins-sync.sh": "3a99cbff0e8ec5e7c944690eae003a6d51b51c85436d77bd37faea4d553728af",
@@ -984,7 +987,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
984
987
  "scripts/fix-namespace-test-assertions.mjs": "bfed6f27753660b38457c3f0a032a6c866691666d2d5d61fc10c3fb2f4f4f412",
985
988
  "scripts/fix-test-assertions-pass2.mjs": "baca043a291120ff52ce61c06397206dc21ca3bef9c23a5975b9c1f896d963c7",
986
989
  "scripts/fix-test-assertions.mjs": "59b5e8cc31e7c7323d20bd180f2ae97c08a9685758483b6fe00ba77317a845f2",
987
- "scripts/generate-agy-plugin-artifacts.mjs": "bcecec726f2590036c57247d41eadf361b8613d827d93366e18b419bbd801346",
990
+ "scripts/generate-agy-plugin-artifacts.mjs": "0d9380e0533b2cd24ab418da64817a06672f0d12c9a7f648a3d57286d35c7983",
988
991
  "scripts/generate-codex-plugin-artifacts.mjs": "1d1a362afb8dba408741a3eed9fe583296f6bcb048608979f73f359cd609c03d",
989
992
  "scripts/generate-copilot-plugin-artifacts.mjs": "70d283eed7cb7c1351d13cf0497f06dec175562c5918921c404393a76f11278f",
990
993
  "scripts/generate-cursor-plugin-artifacts.mjs": "d8806197a723f0c2b50a8155ffc5b6f0abc30c68dc2385cb80b0dd066d061231",
@@ -998,11 +1001,11 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
998
1001
  "scripts/internal-cursor-skill-policy.json": "c2ce87d2eeebfdc9f24d6486425c010cf9289376f8a459f4767ca22d2bf8670d",
999
1002
  "scripts/internal-opencode-skill-policy.json": "d7191650d8a12727549b67df61dbfa61e16cfb9cc31e461cd98d253ceab1612a",
1000
1003
  "scripts/lib/nest-plugin-commands.mjs": "c52b2f48edbc17edcc60ae33536549829cbc279c60c5d85d912ac6609cae9bea",
1001
- "scripts/lib/per-agent-hook-filter.mjs": "2565e2cb414f253fa7fd014021120ec9760f4e716bf0ae69e5f7de09a5b966c1",
1004
+ "scripts/lib/per-agent-hook-filter.mjs": "6038a4ebee750672042ba706269b8a4c1d9055cfd83c436364e2e40d6242dcd9",
1002
1005
  "scripts/lib/reusable-workflow-contract.d.mts": "791f01b55dd7a6b5d9a5f4cb9c44167caa146c2fc3c31a2ae4c2d8a350adc2f1",
1003
1006
  "scripts/lib/reusable-workflow-contract.mjs": "134ee2a327290f066f1eb318b5ed53c711557c3e10ed462c00ff5c97cfb20863",
1004
1007
  "scripts/lisa-commit-and-pr-local.sh": "605409c3ce6ec38ad3275604291a1ceae98f7807a605654263bc14f811c03903",
1005
- "scripts/lisa-enforcement-fallback.sh": "9cab71562d01421d57c6719318a4d03a6249a45c1aea434db3ff26e3065eeb66",
1008
+ "scripts/lisa-enforcement-fallback.sh": "e17c45f7cadf0fb55dd07270776caf211af99b7d4771a4fde75aafe5919e8dbe",
1006
1009
  "scripts/lisa-github-environments.sh": "0a76e92f108519abaf3e29991299ec3b0db20ea533e69e6d2a53d802dba9c370",
1007
1010
  "scripts/lisa-github-repo-settings.sh": "4afbccdfb08c62ba13afee42ec8561a28facf87c61f6f4b80000115328364d54",
1008
1011
  "scripts/lisa-github-repo-setup.sh": "dc2f1c9d718aa34ba57161120d9319b5f78fe6b0b496d8e3c77226a08795aa36",
@@ -1249,6 +1252,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
1249
1252
  "all/copy-contents/gitignore": true,
1250
1253
  "all/copy-overwrite/scripts/lisa-enforcement-fallback.sh": true,
1251
1254
  "all/copy-overwrite/scripts/lisa-floor-collisions.mjs": true,
1255
+ "all/copy-overwrite/scripts/lisa-hooks/block-instruction-file-edits.sh": true,
1252
1256
  "all/copy-overwrite/scripts/lisa-hooks/block-no-verify.sh": true,
1253
1257
  "all/copy-overwrite/scripts/lisa-hooks/block-shell-json-parsing.sh": true,
1254
1258
  "all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh": true,
@@ -2025,6 +2029,8 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
2025
2029
  "plugins/lisa-agy/commands/lisa/verify.md": true,
2026
2030
  "plugins/lisa-agy/commands/lisa/wiki/install.md": true,
2027
2031
  "plugins/lisa-agy/hooks.json": true,
2032
+ "plugins/lisa-agy/hooks/block-instruction-file-edits.agy.sh": true,
2033
+ "plugins/lisa-agy/hooks/block-instruction-file-edits.sh": true,
2028
2034
  "plugins/lisa-agy/hooks/block-no-verify.agy.sh": true,
2029
2035
  "plugins/lisa-agy/hooks/block-shell-json-parsing.agy.sh": true,
2030
2036
  "plugins/lisa-agy/hooks/block-shell-json-parsing.sh": true,
@@ -2369,6 +2375,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
2369
2375
  "plugins/lisa-copilot/commands/lisa/verify-workflow-change.md": true,
2370
2376
  "plugins/lisa-copilot/commands/lisa/verify.md": true,
2371
2377
  "plugins/lisa-copilot/commands/lisa/wiki/install.md": true,
2378
+ "plugins/lisa-copilot/hooks/block-instruction-file-edits.sh": true,
2372
2379
  "plugins/lisa-copilot/hooks/block-no-verify.sh": true,
2373
2380
  "plugins/lisa-copilot/hooks/block-shell-json-parsing.sh": true,
2374
2381
  "plugins/lisa-copilot/hooks/cleanup-stale-worktrees.sh": true,
@@ -2781,6 +2788,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
2781
2788
  "plugins/lisa-cursor/commands/lisa/verify-workflow-change.md": true,
2782
2789
  "plugins/lisa-cursor/commands/lisa/verify.md": true,
2783
2790
  "plugins/lisa-cursor/commands/lisa/wiki/install.md": true,
2791
+ "plugins/lisa-cursor/hooks/block-instruction-file-edits.sh": true,
2784
2792
  "plugins/lisa-cursor/hooks/block-no-verify.sh": true,
2785
2793
  "plugins/lisa-cursor/hooks/block-shell-json-parsing.sh": true,
2786
2794
  "plugins/lisa-cursor/hooks/cleanup-stale-worktrees.sh": true,
@@ -5270,6 +5278,8 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
5270
5278
  "plugins/lisa/commands/verify-workflow-change.md": true,
5271
5279
  "plugins/lisa/commands/verify.md": true,
5272
5280
  "plugins/lisa/commands/wiki/install.md": true,
5281
+ "plugins/lisa/hooks/block-instruction-file-edits.agy.sh": true,
5282
+ "plugins/lisa/hooks/block-instruction-file-edits.sh": true,
5273
5283
  "plugins/lisa/hooks/block-no-verify.agy.sh": true,
5274
5284
  "plugins/lisa/hooks/block-no-verify.sh": true,
5275
5285
  "plugins/lisa/hooks/block-shell-json-parsing.agy.sh": true,
@@ -5862,6 +5872,8 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
5862
5872
  "plugins/src/base/commands/verify-workflow-change.md": true,
5863
5873
  "plugins/src/base/commands/verify.md": true,
5864
5874
  "plugins/src/base/commands/wiki/install.md": true,
5875
+ "plugins/src/base/hooks/block-instruction-file-edits.agy.sh": true,
5876
+ "plugins/src/base/hooks/block-instruction-file-edits.sh": true,
5865
5877
  "plugins/src/base/hooks/block-no-verify.agy.sh": true,
5866
5878
  "plugins/src/base/hooks/block-no-verify.sh": true,
5867
5879
  "plugins/src/base/hooks/block-shell-json-parsing.agy.sh": true,
@@ -6910,6 +6922,8 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
6910
6922
  "src/opencode/hooks-installer.ts": true,
6911
6923
  "src/opencode/manifest.ts": true,
6912
6924
  "src/opencode/mcp-installer.ts": true,
6925
+ "src/opencode/plugin-catalog.ts": true,
6926
+ "src/opencode/plugin-templates/lisa-block-instruction-file-edits.ts": true,
6913
6927
  "src/opencode/plugin-templates/lisa-block-migration-edits.ts": true,
6914
6928
  "src/opencode/plugin-templates/lisa-block-suppress-directives.ts": true,
6915
6929
  "src/opencode/plugin-templates/lisa-lint-on-edit.ts": true,
@@ -7264,6 +7278,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7264
7278
  "tests/unit/health/package-surfaces.test.ts": true,
7265
7279
  "tests/unit/health/storage.test.ts": true,
7266
7280
  "tests/unit/hooks/block-generated-artifact-edits.test.ts": true,
7281
+ "tests/unit/hooks/block-instruction-file-edits.test.ts": true,
7267
7282
  "tests/unit/hooks/block-no-verify.test.ts": true,
7268
7283
  "tests/unit/hooks/block-shell-json-parsing.test.ts": true,
7269
7284
  "tests/unit/hooks/blocking-hook-exit.test.ts": true,