@codyswann/lisa 2.328.5 → 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 (112) 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 +60 -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/.codex-plugin/skills/lisa-setup-workstation/SKILL.md +121 -0
  20. package/plugins/lisa/.codex-plugin/skills/lisa-setup-workstation/agents/openai.yaml +4 -0
  21. package/plugins/lisa/.codex-plugin/skills/lisa-setup-workstation/scripts/catalogue.mjs +262 -0
  22. package/plugins/lisa/.codex-plugin/skills/lisa-setup-workstation/scripts/cli.mjs +315 -0
  23. package/plugins/lisa/.codex-plugin/skills/lisa-setup-workstation/scripts/workstation.mjs +403 -0
  24. package/plugins/lisa/commands/setup/workstation.md +7 -0
  25. package/plugins/lisa/hooks/block-instruction-file-edits.agy.sh +58 -0
  26. package/plugins/lisa/hooks/block-instruction-file-edits.sh +142 -0
  27. package/plugins/lisa/skills/lisa-setup-workstation/SKILL.md +121 -0
  28. package/plugins/lisa/skills/lisa-setup-workstation/agents/openai.yaml +4 -0
  29. package/plugins/lisa/skills/lisa-setup-workstation/scripts/catalogue.mjs +262 -0
  30. package/plugins/lisa/skills/lisa-setup-workstation/scripts/cli.mjs +315 -0
  31. package/plugins/lisa/skills/lisa-setup-workstation/scripts/workstation.mjs +403 -0
  32. package/plugins/lisa-agy/commands/lisa/setup/workstation.md +7 -0
  33. package/plugins/lisa-agy/hooks/block-instruction-file-edits.agy.sh +58 -0
  34. package/plugins/lisa-agy/hooks/block-instruction-file-edits.sh +142 -0
  35. package/plugins/lisa-agy/hooks.json +13 -0
  36. package/plugins/lisa-agy/plugin.json +1 -1
  37. package/plugins/lisa-agy/skills/lisa-setup-workstation/SKILL.md +121 -0
  38. package/plugins/lisa-agy/skills/lisa-setup-workstation/scripts/catalogue.mjs +262 -0
  39. package/plugins/lisa-agy/skills/lisa-setup-workstation/scripts/cli.mjs +315 -0
  40. package/plugins/lisa-agy/skills/lisa-setup-workstation/scripts/workstation.mjs +403 -0
  41. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  43. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  44. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-copilot/.claude-plugin/plugin.json +14 -1
  47. package/plugins/lisa-copilot/commands/lisa/setup/workstation.md +7 -0
  48. package/plugins/lisa-copilot/hooks/block-instruction-file-edits.sh +142 -0
  49. package/plugins/lisa-copilot/skills/lisa-setup-workstation/SKILL.md +121 -0
  50. package/plugins/lisa-copilot/skills/lisa-setup-workstation/scripts/catalogue.mjs +262 -0
  51. package/plugins/lisa-copilot/skills/lisa-setup-workstation/scripts/cli.mjs +315 -0
  52. package/plugins/lisa-copilot/skills/lisa-setup-workstation/scripts/workstation.mjs +403 -0
  53. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-cursor/commands/lisa/setup/workstation.md +7 -0
  55. package/plugins/lisa-cursor/hooks/block-instruction-file-edits.sh +142 -0
  56. package/plugins/lisa-cursor/hooks/hooks.json +8 -0
  57. package/plugins/lisa-cursor/skills/lisa-setup-workstation/SKILL.md +121 -0
  58. package/plugins/lisa-cursor/skills/lisa-setup-workstation/scripts/catalogue.mjs +262 -0
  59. package/plugins/lisa-cursor/skills/lisa-setup-workstation/scripts/cli.mjs +315 -0
  60. package/plugins/lisa-cursor/skills/lisa-setup-workstation/scripts/workstation.mjs +403 -0
  61. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  63. package/plugins/lisa-expo-agy/plugin.json +1 -1
  64. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  68. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  69. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  72. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  73. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  74. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  76. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  77. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  78. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  79. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  80. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  81. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  82. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  83. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  84. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  85. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  86. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  87. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  88. package/plugins/lisa-rails-agy/plugin.json +1 -1
  89. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  90. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  91. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  92. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  93. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  94. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  95. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  96. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  97. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  98. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  99. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  100. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  101. package/plugins/src/base/.claude-plugin/plugin.json +13 -0
  102. package/plugins/src/base/commands/setup/workstation.md +7 -0
  103. package/plugins/src/base/hooks/block-instruction-file-edits.agy.sh +58 -0
  104. package/plugins/src/base/hooks/block-instruction-file-edits.sh +142 -0
  105. package/plugins/src/base/skills/lisa-setup-workstation/SKILL.md +121 -0
  106. package/plugins/src/base/skills/lisa-setup-workstation/scripts/catalogue.mjs +262 -0
  107. package/plugins/src/base/skills/lisa-setup-workstation/scripts/cli.mjs +315 -0
  108. package/plugins/src/base/skills/lisa-setup-workstation/scripts/workstation.mjs +403 -0
  109. package/scripts/build-plugins.sh +2 -1
  110. package/scripts/generate-agy-plugin-artifacts.mjs +11 -0
  111. package/scripts/lib/per-agent-hook-filter.mjs +10 -0
  112. 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,CA0oEpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAynNjE,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",
@@ -284,6 +285,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
284
285
  "plugins/src/base/commands/setup/notion.md": "2d705679db0dbb6c77728592a020430a529af9d0ef24ac7c434969d590d9f5a6",
285
286
  "plugins/src/base/commands/setup/remote-env.md": "b1e8ec93bc660cc5ccf9e4c74a3a7bb6c94d5ff06c75f150479991fa1d564f2d",
286
287
  "plugins/src/base/commands/setup/sonar.md": "1d2e94fd9f21988ce6d4be2ce4268b8c0bb020eb7cd7baf8ca65def7d8a4f5bc",
288
+ "plugins/src/base/commands/setup/workstation.md": "2da226aa1a7efea41735eeb58d61ad70896eccadc59765f86c971aa331d11358",
287
289
  "plugins/src/base/commands/sync-down.md": "4e974cb9745a4fd680f4a55f859d31fa8cf3cb28afa739b40a2e1a99de31e034",
288
290
  "plugins/src/base/commands/tear-down-automations.md": "969f28850326f0ceab5c09763266c60265951db30e88c738d2425ff82f088aac",
289
291
  "plugins/src/base/commands/track.md": "ae655031c3698f9bf449c4b9d8654cfab2586ca82164a710ae3f66be37c831fb",
@@ -292,6 +294,8 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
292
294
  "plugins/src/base/commands/verify-workflow-change.md": "2d3e519ddf5292c8e10bed5190e9bcd701a48fed6a277e8ef7fb3bf8326315af",
293
295
  "plugins/src/base/commands/verify.md": "ffbc553ec86e77845da72b5b0eb0dbb2b5a93b781ac8a7dbb2ef0f31f38f7b96",
294
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",
295
299
  "plugins/src/base/hooks/block-no-verify.agy.sh": "1a36c841b6339a2c664938d65c5a4542f97d05f584e467de448bb72ac6bdba55",
296
300
  "plugins/src/base/hooks/block-no-verify.sh": "aa95a84f9f9224914947a09b858535aa8bd052199ff64cb53768cf78fb69b687",
297
301
  "plugins/src/base/hooks/block-shell-json-parsing.agy.sh": "dc688efe382e7b8fe6f6c88bb0fde851527128cae778599559f23a93f1c9ec86",
@@ -578,6 +582,10 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
578
582
  "plugins/src/base/skills/lisa-setup-remote-env/scripts/toolchain.mjs": "cb98159f9432ce0c4f93a8b5386c61fc1b7d3a299bbb041d6bd005b790291277",
579
583
  "plugins/src/base/skills/lisa-setup-remote-env/scripts/verify-remote-env.mjs": "82bc2a27a0a5afb2ff413a88365c619fd7f0eaada5de3ccabf2000938f0607a4",
580
584
  "plugins/src/base/skills/lisa-setup-sonar/SKILL.md": "53fbd8acce4b5e47e88195a7b90d5be424fa6ef7ad872f52c50467c690664c3b",
585
+ "plugins/src/base/skills/lisa-setup-workstation/SKILL.md": "433168d83749709f9808fa0b45ff74e0944707a26fb0039d1de28ffaadaa8db1",
586
+ "plugins/src/base/skills/lisa-setup-workstation/scripts/catalogue.mjs": "3fa13e7e2885aa5f3b4efdd12fc87958494a57d8bfeb81ab8489558592780b90",
587
+ "plugins/src/base/skills/lisa-setup-workstation/scripts/cli.mjs": "cb64e501a6e8bf0b12fd865aa0be3407f54c5a08537a36dc71d2ead4764f5da0",
588
+ "plugins/src/base/skills/lisa-setup-workstation/scripts/workstation.mjs": "8f9d066bb4c60095831c9549af89f9a8d49cc2bcadf37189982d276ad9270759",
581
589
  "plugins/src/base/skills/lisa-sonarcloud-access/SKILL.md": "031acb01195ae59010a65335da98d46a1d6080e749823d6f6d157938d9e96648",
582
590
  "plugins/src/base/skills/lisa-spec-conformance/SKILL.md": "ed43ca160a8b4b6e8d226d459419f0c28f8036ba1b6d3c204255c965a3223c3b",
583
591
  "plugins/src/base/skills/lisa-sync-down/SKILL.md": "c32e6a4e3115ca32b7d335e90d0a73b243c6c631a2d192568423be0cb5944e84",
@@ -961,7 +969,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
961
969
  "rails/deletions.json": "eeadf9a2b1677913199a235091a8d6190477f3e2a5fd598d62cf658cb59a8099",
962
970
  "rails/github-rulesets/quality-checks.json": "0ec1c366589edbaa6b8f45f940cef3ada5ed7b1a956d98d3fa6034b0f78fbc7c",
963
971
  "rails/merge/.claude/settings.json": "9c49f8c7c453f8749c90def3e22d412c3345c533d24b30dc7745ffa052ad6fa1",
964
- "scripts/build-plugins.sh": "b57413e6e003be102e82e0a8a6b44a137f5d0aeed8da4c1f4f99919a0d7e8b04",
972
+ "scripts/build-plugins.sh": "d4332a862d57798280e0d0c96826bbdc6b07855659dae529f8de32de994d2da9",
965
973
  "scripts/check-duplicate-versions.mjs": "84d97e94eb834522848ddce951bb54ae9da1e4be252e2c51fed0c01c4f4d6b72",
966
974
  "scripts/check-learnings-budget.ts": "007430c2d6938efcc79ccbfd5717ebe2c7cf66b4de9a21a3e67b8db7f3600349",
967
975
  "scripts/check-plugins-sync.sh": "3a99cbff0e8ec5e7c944690eae003a6d51b51c85436d77bd37faea4d553728af",
@@ -979,7 +987,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
979
987
  "scripts/fix-namespace-test-assertions.mjs": "bfed6f27753660b38457c3f0a032a6c866691666d2d5d61fc10c3fb2f4f4f412",
980
988
  "scripts/fix-test-assertions-pass2.mjs": "baca043a291120ff52ce61c06397206dc21ca3bef9c23a5975b9c1f896d963c7",
981
989
  "scripts/fix-test-assertions.mjs": "59b5e8cc31e7c7323d20bd180f2ae97c08a9685758483b6fe00ba77317a845f2",
982
- "scripts/generate-agy-plugin-artifacts.mjs": "bcecec726f2590036c57247d41eadf361b8613d827d93366e18b419bbd801346",
990
+ "scripts/generate-agy-plugin-artifacts.mjs": "0d9380e0533b2cd24ab418da64817a06672f0d12c9a7f648a3d57286d35c7983",
983
991
  "scripts/generate-codex-plugin-artifacts.mjs": "1d1a362afb8dba408741a3eed9fe583296f6bcb048608979f73f359cd609c03d",
984
992
  "scripts/generate-copilot-plugin-artifacts.mjs": "70d283eed7cb7c1351d13cf0497f06dec175562c5918921c404393a76f11278f",
985
993
  "scripts/generate-cursor-plugin-artifacts.mjs": "d8806197a723f0c2b50a8155ffc5b6f0abc30c68dc2385cb80b0dd066d061231",
@@ -993,11 +1001,11 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
993
1001
  "scripts/internal-cursor-skill-policy.json": "c2ce87d2eeebfdc9f24d6486425c010cf9289376f8a459f4767ca22d2bf8670d",
994
1002
  "scripts/internal-opencode-skill-policy.json": "d7191650d8a12727549b67df61dbfa61e16cfb9cc31e461cd98d253ceab1612a",
995
1003
  "scripts/lib/nest-plugin-commands.mjs": "c52b2f48edbc17edcc60ae33536549829cbc279c60c5d85d912ac6609cae9bea",
996
- "scripts/lib/per-agent-hook-filter.mjs": "2565e2cb414f253fa7fd014021120ec9760f4e716bf0ae69e5f7de09a5b966c1",
1004
+ "scripts/lib/per-agent-hook-filter.mjs": "6038a4ebee750672042ba706269b8a4c1d9055cfd83c436364e2e40d6242dcd9",
997
1005
  "scripts/lib/reusable-workflow-contract.d.mts": "791f01b55dd7a6b5d9a5f4cb9c44167caa146c2fc3c31a2ae4c2d8a350adc2f1",
998
1006
  "scripts/lib/reusable-workflow-contract.mjs": "134ee2a327290f066f1eb318b5ed53c711557c3e10ed462c00ff5c97cfb20863",
999
1007
  "scripts/lisa-commit-and-pr-local.sh": "605409c3ce6ec38ad3275604291a1ceae98f7807a605654263bc14f811c03903",
1000
- "scripts/lisa-enforcement-fallback.sh": "9cab71562d01421d57c6719318a4d03a6249a45c1aea434db3ff26e3065eeb66",
1008
+ "scripts/lisa-enforcement-fallback.sh": "e17c45f7cadf0fb55dd07270776caf211af99b7d4771a4fde75aafe5919e8dbe",
1001
1009
  "scripts/lisa-github-environments.sh": "0a76e92f108519abaf3e29991299ec3b0db20ea533e69e6d2a53d802dba9c370",
1002
1010
  "scripts/lisa-github-repo-settings.sh": "4afbccdfb08c62ba13afee42ec8561a28facf87c61f6f4b80000115328364d54",
1003
1011
  "scripts/lisa-github-repo-setup.sh": "dc2f1c9d718aa34ba57161120d9319b5f78fe6b0b496d8e3c77226a08795aa36",
@@ -1244,6 +1252,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
1244
1252
  "all/copy-contents/gitignore": true,
1245
1253
  "all/copy-overwrite/scripts/lisa-enforcement-fallback.sh": true,
1246
1254
  "all/copy-overwrite/scripts/lisa-floor-collisions.mjs": true,
1255
+ "all/copy-overwrite/scripts/lisa-hooks/block-instruction-file-edits.sh": true,
1247
1256
  "all/copy-overwrite/scripts/lisa-hooks/block-no-verify.sh": true,
1248
1257
  "all/copy-overwrite/scripts/lisa-hooks/block-shell-json-parsing.sh": true,
1249
1258
  "all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh": true,
@@ -2010,6 +2019,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
2010
2019
  "plugins/lisa-agy/commands/lisa/setup/notion.md": true,
2011
2020
  "plugins/lisa-agy/commands/lisa/setup/remote-env.md": true,
2012
2021
  "plugins/lisa-agy/commands/lisa/setup/sonar.md": true,
2022
+ "plugins/lisa-agy/commands/lisa/setup/workstation.md": true,
2013
2023
  "plugins/lisa-agy/commands/lisa/sync-down.md": true,
2014
2024
  "plugins/lisa-agy/commands/lisa/tear-down-automations.md": true,
2015
2025
  "plugins/lisa-agy/commands/lisa/track.md": true,
@@ -2019,6 +2029,8 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
2019
2029
  "plugins/lisa-agy/commands/lisa/verify.md": true,
2020
2030
  "plugins/lisa-agy/commands/lisa/wiki/install.md": true,
2021
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,
2022
2034
  "plugins/lisa-agy/hooks/block-no-verify.agy.sh": true,
2023
2035
  "plugins/lisa-agy/hooks/block-shell-json-parsing.agy.sh": true,
2024
2036
  "plugins/lisa-agy/hooks/block-shell-json-parsing.sh": true,
@@ -2213,6 +2225,10 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
2213
2225
  "plugins/lisa-agy/skills/lisa-setup-remote-env/scripts/toolchain.mjs": true,
2214
2226
  "plugins/lisa-agy/skills/lisa-setup-remote-env/scripts/verify-remote-env.mjs": true,
2215
2227
  "plugins/lisa-agy/skills/lisa-setup-sonar/SKILL.md": true,
2228
+ "plugins/lisa-agy/skills/lisa-setup-workstation/SKILL.md": true,
2229
+ "plugins/lisa-agy/skills/lisa-setup-workstation/scripts/catalogue.mjs": true,
2230
+ "plugins/lisa-agy/skills/lisa-setup-workstation/scripts/cli.mjs": true,
2231
+ "plugins/lisa-agy/skills/lisa-setup-workstation/scripts/workstation.mjs": true,
2216
2232
  "plugins/lisa-agy/skills/lisa-sonarcloud-access/SKILL.md": true,
2217
2233
  "plugins/lisa-agy/skills/lisa-spec-conformance/SKILL.md": true,
2218
2234
  "plugins/lisa-agy/skills/lisa-sync-down/SKILL.md": true,
@@ -2350,6 +2366,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
2350
2366
  "plugins/lisa-copilot/commands/lisa/setup/notion.md": true,
2351
2367
  "plugins/lisa-copilot/commands/lisa/setup/remote-env.md": true,
2352
2368
  "plugins/lisa-copilot/commands/lisa/setup/sonar.md": true,
2369
+ "plugins/lisa-copilot/commands/lisa/setup/workstation.md": true,
2353
2370
  "plugins/lisa-copilot/commands/lisa/sync-down.md": true,
2354
2371
  "plugins/lisa-copilot/commands/lisa/tear-down-automations.md": true,
2355
2372
  "plugins/lisa-copilot/commands/lisa/track.md": true,
@@ -2358,6 +2375,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
2358
2375
  "plugins/lisa-copilot/commands/lisa/verify-workflow-change.md": true,
2359
2376
  "plugins/lisa-copilot/commands/lisa/verify.md": true,
2360
2377
  "plugins/lisa-copilot/commands/lisa/wiki/install.md": true,
2378
+ "plugins/lisa-copilot/hooks/block-instruction-file-edits.sh": true,
2361
2379
  "plugins/lisa-copilot/hooks/block-no-verify.sh": true,
2362
2380
  "plugins/lisa-copilot/hooks/block-shell-json-parsing.sh": true,
2363
2381
  "plugins/lisa-copilot/hooks/cleanup-stale-worktrees.sh": true,
@@ -2635,6 +2653,10 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
2635
2653
  "plugins/lisa-copilot/skills/lisa-setup-remote-env/scripts/toolchain.mjs": true,
2636
2654
  "plugins/lisa-copilot/skills/lisa-setup-remote-env/scripts/verify-remote-env.mjs": true,
2637
2655
  "plugins/lisa-copilot/skills/lisa-setup-sonar/SKILL.md": true,
2656
+ "plugins/lisa-copilot/skills/lisa-setup-workstation/SKILL.md": true,
2657
+ "plugins/lisa-copilot/skills/lisa-setup-workstation/scripts/catalogue.mjs": true,
2658
+ "plugins/lisa-copilot/skills/lisa-setup-workstation/scripts/cli.mjs": true,
2659
+ "plugins/lisa-copilot/skills/lisa-setup-workstation/scripts/workstation.mjs": true,
2638
2660
  "plugins/lisa-copilot/skills/lisa-sonarcloud-access/SKILL.md": true,
2639
2661
  "plugins/lisa-copilot/skills/lisa-spec-conformance/SKILL.md": true,
2640
2662
  "plugins/lisa-copilot/skills/lisa-sync-down/SKILL.md": true,
@@ -2757,6 +2779,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
2757
2779
  "plugins/lisa-cursor/commands/lisa/setup/notion.md": true,
2758
2780
  "plugins/lisa-cursor/commands/lisa/setup/remote-env.md": true,
2759
2781
  "plugins/lisa-cursor/commands/lisa/setup/sonar.md": true,
2782
+ "plugins/lisa-cursor/commands/lisa/setup/workstation.md": true,
2760
2783
  "plugins/lisa-cursor/commands/lisa/sync-down.md": true,
2761
2784
  "plugins/lisa-cursor/commands/lisa/tear-down-automations.md": true,
2762
2785
  "plugins/lisa-cursor/commands/lisa/track.md": true,
@@ -2765,6 +2788,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
2765
2788
  "plugins/lisa-cursor/commands/lisa/verify-workflow-change.md": true,
2766
2789
  "plugins/lisa-cursor/commands/lisa/verify.md": true,
2767
2790
  "plugins/lisa-cursor/commands/lisa/wiki/install.md": true,
2791
+ "plugins/lisa-cursor/hooks/block-instruction-file-edits.sh": true,
2768
2792
  "plugins/lisa-cursor/hooks/block-no-verify.sh": true,
2769
2793
  "plugins/lisa-cursor/hooks/block-shell-json-parsing.sh": true,
2770
2794
  "plugins/lisa-cursor/hooks/cleanup-stale-worktrees.sh": true,
@@ -3043,6 +3067,10 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
3043
3067
  "plugins/lisa-cursor/skills/lisa-setup-remote-env/scripts/toolchain.mjs": true,
3044
3068
  "plugins/lisa-cursor/skills/lisa-setup-remote-env/scripts/verify-remote-env.mjs": true,
3045
3069
  "plugins/lisa-cursor/skills/lisa-setup-sonar/SKILL.md": true,
3070
+ "plugins/lisa-cursor/skills/lisa-setup-workstation/SKILL.md": true,
3071
+ "plugins/lisa-cursor/skills/lisa-setup-workstation/scripts/catalogue.mjs": true,
3072
+ "plugins/lisa-cursor/skills/lisa-setup-workstation/scripts/cli.mjs": true,
3073
+ "plugins/lisa-cursor/skills/lisa-setup-workstation/scripts/workstation.mjs": true,
3046
3074
  "plugins/lisa-cursor/skills/lisa-sonarcloud-access/SKILL.md": true,
3047
3075
  "plugins/lisa-cursor/skills/lisa-spec-conformance/SKILL.md": true,
3048
3076
  "plugins/lisa-cursor/skills/lisa-sync-down/SKILL.md": true,
@@ -5084,6 +5112,11 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
5084
5112
  "plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/scripts/verify-remote-env.mjs": true,
5085
5113
  "plugins/lisa/.codex-plugin/skills/lisa-setup-sonar/SKILL.md": true,
5086
5114
  "plugins/lisa/.codex-plugin/skills/lisa-setup-sonar/agents/openai.yaml": true,
5115
+ "plugins/lisa/.codex-plugin/skills/lisa-setup-workstation/SKILL.md": true,
5116
+ "plugins/lisa/.codex-plugin/skills/lisa-setup-workstation/agents/openai.yaml": true,
5117
+ "plugins/lisa/.codex-plugin/skills/lisa-setup-workstation/scripts/catalogue.mjs": true,
5118
+ "plugins/lisa/.codex-plugin/skills/lisa-setup-workstation/scripts/cli.mjs": true,
5119
+ "plugins/lisa/.codex-plugin/skills/lisa-setup-workstation/scripts/workstation.mjs": true,
5087
5120
  "plugins/lisa/.codex-plugin/skills/lisa-sonarcloud-access/SKILL.md": true,
5088
5121
  "plugins/lisa/.codex-plugin/skills/lisa-sonarcloud-access/agents/openai.yaml": true,
5089
5122
  "plugins/lisa/.codex-plugin/skills/lisa-spec-conformance/SKILL.md": true,
@@ -5236,6 +5269,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
5236
5269
  "plugins/lisa/commands/setup/notion.md": true,
5237
5270
  "plugins/lisa/commands/setup/remote-env.md": true,
5238
5271
  "plugins/lisa/commands/setup/sonar.md": true,
5272
+ "plugins/lisa/commands/setup/workstation.md": true,
5239
5273
  "plugins/lisa/commands/sync-down.md": true,
5240
5274
  "plugins/lisa/commands/tear-down-automations.md": true,
5241
5275
  "plugins/lisa/commands/track.md": true,
@@ -5244,6 +5278,8 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
5244
5278
  "plugins/lisa/commands/verify-workflow-change.md": true,
5245
5279
  "plugins/lisa/commands/verify.md": true,
5246
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,
5247
5283
  "plugins/lisa/hooks/block-no-verify.agy.sh": true,
5248
5284
  "plugins/lisa/hooks/block-no-verify.sh": true,
5249
5285
  "plugins/lisa/hooks/block-shell-json-parsing.agy.sh": true,
@@ -5670,6 +5706,11 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
5670
5706
  "plugins/lisa/skills/lisa-setup-remote-env/scripts/verify-remote-env.mjs": true,
5671
5707
  "plugins/lisa/skills/lisa-setup-sonar/SKILL.md": true,
5672
5708
  "plugins/lisa/skills/lisa-setup-sonar/agents/openai.yaml": true,
5709
+ "plugins/lisa/skills/lisa-setup-workstation/SKILL.md": true,
5710
+ "plugins/lisa/skills/lisa-setup-workstation/agents/openai.yaml": true,
5711
+ "plugins/lisa/skills/lisa-setup-workstation/scripts/catalogue.mjs": true,
5712
+ "plugins/lisa/skills/lisa-setup-workstation/scripts/cli.mjs": true,
5713
+ "plugins/lisa/skills/lisa-setup-workstation/scripts/workstation.mjs": true,
5673
5714
  "plugins/lisa/skills/lisa-sonarcloud-access/SKILL.md": true,
5674
5715
  "plugins/lisa/skills/lisa-sonarcloud-access/agents/openai.yaml": true,
5675
5716
  "plugins/lisa/skills/lisa-spec-conformance/SKILL.md": true,
@@ -5822,6 +5863,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
5822
5863
  "plugins/src/base/commands/setup/notion.md": true,
5823
5864
  "plugins/src/base/commands/setup/remote-env.md": true,
5824
5865
  "plugins/src/base/commands/setup/sonar.md": true,
5866
+ "plugins/src/base/commands/setup/workstation.md": true,
5825
5867
  "plugins/src/base/commands/sync-down.md": true,
5826
5868
  "plugins/src/base/commands/tear-down-automations.md": true,
5827
5869
  "plugins/src/base/commands/track.md": true,
@@ -5830,6 +5872,8 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
5830
5872
  "plugins/src/base/commands/verify-workflow-change.md": true,
5831
5873
  "plugins/src/base/commands/verify.md": true,
5832
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,
5833
5877
  "plugins/src/base/hooks/block-no-verify.agy.sh": true,
5834
5878
  "plugins/src/base/hooks/block-no-verify.sh": true,
5835
5879
  "plugins/src/base/hooks/block-shell-json-parsing.agy.sh": true,
@@ -6116,6 +6160,10 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
6116
6160
  "plugins/src/base/skills/lisa-setup-remote-env/scripts/toolchain.mjs": true,
6117
6161
  "plugins/src/base/skills/lisa-setup-remote-env/scripts/verify-remote-env.mjs": true,
6118
6162
  "plugins/src/base/skills/lisa-setup-sonar/SKILL.md": true,
6163
+ "plugins/src/base/skills/lisa-setup-workstation/SKILL.md": true,
6164
+ "plugins/src/base/skills/lisa-setup-workstation/scripts/catalogue.mjs": true,
6165
+ "plugins/src/base/skills/lisa-setup-workstation/scripts/cli.mjs": true,
6166
+ "plugins/src/base/skills/lisa-setup-workstation/scripts/workstation.mjs": true,
6119
6167
  "plugins/src/base/skills/lisa-sonarcloud-access/SKILL.md": true,
6120
6168
  "plugins/src/base/skills/lisa-spec-conformance/SKILL.md": true,
6121
6169
  "plugins/src/base/skills/lisa-sync-down/SKILL.md": true,
@@ -6874,6 +6922,8 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
6874
6922
  "src/opencode/hooks-installer.ts": true,
6875
6923
  "src/opencode/manifest.ts": true,
6876
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,
6877
6927
  "src/opencode/plugin-templates/lisa-block-migration-edits.ts": true,
6878
6928
  "src/opencode/plugin-templates/lisa-block-suppress-directives.ts": true,
6879
6929
  "src/opencode/plugin-templates/lisa-lint-on-edit.ts": true,
@@ -7228,6 +7278,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7228
7278
  "tests/unit/health/package-surfaces.test.ts": true,
7229
7279
  "tests/unit/health/storage.test.ts": true,
7230
7280
  "tests/unit/hooks/block-generated-artifact-edits.test.ts": true,
7281
+ "tests/unit/hooks/block-instruction-file-edits.test.ts": true,
7231
7282
  "tests/unit/hooks/block-no-verify.test.ts": true,
7232
7283
  "tests/unit/hooks/block-shell-json-parsing.test.ts": true,
7233
7284
  "tests/unit/hooks/blocking-hook-exit.test.ts": true,
@@ -7544,6 +7595,9 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7544
7595
  "tests/unit/utils/usage-accounting-table-normalization.test.ts": true,
7545
7596
  "tests/unit/utils/usage-accounting-token-serialization.test.ts": true,
7546
7597
  "tests/unit/utils/usage-accounting.test.ts": true,
7598
+ "tests/unit/workstation/fixtures.ts": true,
7599
+ "tests/unit/workstation/workstation-install.test.ts": true,
7600
+ "tests/unit/workstation/workstation-plan.test.ts": true,
7547
7601
  "transcripts/.gitkeep": true,
7548
7602
  "tsconfig.eslint.json": true,
7549
7603
  "tsconfig.json": true,