@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.
- package/all/copy-overwrite/scripts/lisa-enforcement-fallback.sh +4 -2
- package/all/copy-overwrite/scripts/lisa-hooks/block-instruction-file-edits.sh +142 -0
- package/all/merge/.claude/settings.json +9 -0
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +21 -6
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/opencode/hooks-installer.d.ts.map +1 -1
- package/dist/opencode/hooks-installer.js +1 -41
- package/dist/opencode/hooks-installer.js.map +1 -1
- package/dist/opencode/plugin-catalog.d.ts +25 -0
- package/dist/opencode/plugin-catalog.d.ts.map +1 -0
- package/dist/opencode/plugin-catalog.js +47 -0
- package/dist/opencode/plugin-catalog.js.map +1 -0
- package/dist/opencode/plugin-templates/lisa-block-instruction-file-edits.ts +72 -0
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +14 -1
- package/plugins/lisa/.codex-plugin/hooks.json +13 -0
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/hooks/block-instruction-file-edits.agy.sh +58 -0
- package/plugins/lisa/hooks/block-instruction-file-edits.sh +142 -0
- package/plugins/lisa-agy/hooks/block-instruction-file-edits.agy.sh +58 -0
- package/plugins/lisa-agy/hooks/block-instruction-file-edits.sh +142 -0
- package/plugins/lisa-agy/hooks.json +13 -0
- 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 +14 -1
- package/plugins/lisa-copilot/hooks/block-instruction-file-edits.sh +142 -0
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/hooks/block-instruction-file-edits.sh +142 -0
- package/plugins/lisa-cursor/hooks/hooks.json +8 -0
- 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/.claude-plugin/plugin.json +13 -0
- package/plugins/src/base/hooks/block-instruction-file-edits.agy.sh +58 -0
- package/plugins/src/base/hooks/block-instruction-file-edits.sh +142 -0
- package/scripts/build-plugins.sh +2 -1
- package/scripts/generate-agy-plugin-artifacts.mjs +11 -0
- package/scripts/lib/per-agent-hook-filter.mjs +10 -0
- 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
|
|
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
|
|
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,
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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,
|