@codyswann/lisa 2.322.5 → 2.322.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/core/upstream-evidence-manifest.js +4 -4
  2. package/package.json +1 -1
  3. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  4. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  5. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/SKILL.md +4 -4
  6. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/assets/setup.sh +22 -0
  7. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +27 -11
  8. package/plugins/lisa/skills/lisa-setup-remote-env/SKILL.md +4 -4
  9. package/plugins/lisa/skills/lisa-setup-remote-env/assets/setup.sh +22 -0
  10. package/plugins/lisa/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +27 -11
  11. package/plugins/lisa-agy/plugin.json +1 -1
  12. package/plugins/lisa-agy/skills/lisa-setup-remote-env/SKILL.md +4 -4
  13. package/plugins/lisa-agy/skills/lisa-setup-remote-env/assets/setup.sh +22 -0
  14. package/plugins/lisa-agy/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +27 -11
  15. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  16. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  17. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  18. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  19. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  20. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  21. package/plugins/lisa-copilot/skills/lisa-setup-remote-env/SKILL.md +4 -4
  22. package/plugins/lisa-copilot/skills/lisa-setup-remote-env/assets/setup.sh +22 -0
  23. package/plugins/lisa-copilot/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +27 -11
  24. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  25. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/SKILL.md +4 -4
  26. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/assets/setup.sh +22 -0
  27. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +27 -11
  28. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  30. package/plugins/lisa-expo-agy/plugin.json +1 -1
  31. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  32. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  35. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  36. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  37. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  40. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  41. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  45. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  46. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  50. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  51. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  55. package/plugins/lisa-rails-agy/plugin.json +1 -1
  56. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  60. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  61. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  65. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  66. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  68. package/plugins/src/base/skills/lisa-setup-remote-env/SKILL.md +4 -4
  69. package/plugins/src/base/skills/lisa-setup-remote-env/assets/setup.sh +22 -0
  70. package/plugins/src/base/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +27 -11
  71. package/scripts/lisa-remote-env/setup.sh +22 -0
@@ -559,10 +559,10 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
559
559
  "plugins/src/base/skills/lisa-setup-linear/SKILL.md": "ec76f832a6df6f58b163f7f5ba6826ed2fcbddc91e44a8372e874858e4d0c518",
560
560
  "plugins/src/base/skills/lisa-setup-notion/SKILL.md": "f5a1e9290789fd1c33675168d30461fb24a11c98a433ef777c1f536bc2f905ef",
561
561
  "plugins/src/base/skills/lisa-setup-remote-aws/SKILL.md": "80fbf157f9c562c033886c25a99b37356602edd9e61cd2d492f339769ddcf97e",
562
- "plugins/src/base/skills/lisa-setup-remote-env/SKILL.md": "4fe124678cfc2b37188370af3b4e16895fcbad4d4b6f13b0fc7ac02bd99b0d26",
562
+ "plugins/src/base/skills/lisa-setup-remote-env/SKILL.md": "f706b5c94267d128bf41ef1a5fa6b68ea184e22c7929bda126128f08e1728b86",
563
563
  "plugins/src/base/skills/lisa-setup-remote-env/assets/session-start.sh": "6e3871ec2f8d56b8ebb85376ebdd3956f3ed8fa4f7b278c2ed90ca9b8845897c",
564
- "plugins/src/base/skills/lisa-setup-remote-env/assets/setup.sh": "7f7cf8a2248dbaa31f2f039fdaf147d083427a21633f7cf06ad612f38344d6c1",
565
- "plugins/src/base/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs": "e8f1e74dd29104dc880eb2540024549d18d2a9c958b2b6fce0610ab0afd55cbb",
564
+ "plugins/src/base/skills/lisa-setup-remote-env/assets/setup.sh": "c04afb1cf8e14a2713645228e679fa7772559488330a240ec0297cae6afd03e2",
565
+ "plugins/src/base/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs": "f468dcf72512ff0b7d0d0ff6a38e81e5b57d83361ffff45c5265147f67ca01df",
566
566
  "plugins/src/base/skills/lisa-setup-remote-env/scripts/toolchain.mjs": "ff66d33ba41a068d09be18f81ac68988238c2afa1d4e3733ae906b73eea74324",
567
567
  "plugins/src/base/skills/lisa-setup-remote-env/scripts/verify-remote-env.mjs": "82bc2a27a0a5afb2ff413a88365c619fd7f0eaada5de3ccabf2000938f0607a4",
568
568
  "plugins/src/base/skills/lisa-setup-sonar/SKILL.md": "53fbd8acce4b5e47e88195a7b90d5be424fa6ef7ad872f52c50467c690664c3b",
@@ -990,7 +990,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
990
990
  "scripts/lisa-github-repo-setup.sh": "dc2f1c9d718aa34ba57161120d9319b5f78fe6b0b496d8e3c77226a08795aa36",
991
991
  "scripts/lisa-github-rulesets.sh": "920a43ba268421b6fe55096062bd85850468bee9389f6006ad7c671010e7cccb",
992
992
  "scripts/lisa-remote-env/session-start.sh": "6e3871ec2f8d56b8ebb85376ebdd3956f3ed8fa4f7b278c2ed90ca9b8845897c",
993
- "scripts/lisa-remote-env/setup.sh": "7f7cf8a2248dbaa31f2f039fdaf147d083427a21633f7cf06ad612f38344d6c1",
993
+ "scripts/lisa-remote-env/setup.sh": "c04afb1cf8e14a2713645228e679fa7772559488330a240ec0297cae6afd03e2",
994
994
  "scripts/lisa-update-local.sh": "c811f9e10dbcb38499a9791c1ae9051460b347051d04a1d2046925bab9a53c96",
995
995
  "scripts/lisa-work-item.mjs": "acb359ed7a39150fd5e1e68f4c95144045e75d9d53b735da4a7a9271f063044e",
996
996
  "scripts/migrate-deploy-order.sh": "77d909b4cbbfc05169a79168d7868600ea7f56f846feefb7d5121618c54800c3",
package/package.json CHANGED
@@ -115,7 +115,7 @@
115
115
  "brace-expansion": ">=5.0.9"
116
116
  },
117
117
  "name": "@codyswann/lisa",
118
- "version": "2.322.5",
118
+ "version": "2.322.6",
119
119
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
120
120
  "main": "dist/index.js",
121
121
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.322.5",
3
+ "version": "2.322.6",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.322.5",
3
+ "version": "2.322.6",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -13,8 +13,8 @@ Prepare a remote surface so a host project can execute there. Today that means *
13
13
  The remote environment's own configuration fields stay **one line into the repository**. Nothing else is pasted into a vendor UI.
14
14
 
15
15
  ```text
16
- setup: n=0; rc=0; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found under $PWD" >&2; exit 1; }; exit "$rc"
17
- maintenance: n=0; rc=0; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found under $PWD" >&2; exit 1; }; exit "$rc"
16
+ setup: n=0; rc=0; seen=""; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh "$HOME"/scripts/lisa-remote-env/setup.sh "$HOME"/*/scripts/lisa-remote-env/setup.sh /workspace/scripts/lisa-remote-env/setup.sh /workspace/*/scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; d=$(cd "$(dirname "$f")" && pwd -P); case " $seen " in *" $d "*) continue;; esac; seen="$seen $d"; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found. PWD=$PWD HOME=$HOME" >&2; ls -1 . "$HOME" /workspace 2>&1 | head -40 >&2; exit 1; }; exit "$rc"
17
+ maintenance: n=0; rc=0; seen=""; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh "$HOME"/scripts/lisa-remote-env/setup.sh "$HOME"/*/scripts/lisa-remote-env/setup.sh /workspace/scripts/lisa-remote-env/setup.sh /workspace/*/scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; d=$(cd "$(dirname "$f")" && pwd -P); case " $seen " in *" $d "*) continue;; esac; seen="$seen $d"; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found. PWD=$PWD HOME=$HOME" >&2; ls -1 . "$HOME" /workspace 2>&1 | head -40 >&2; exit 1; }; exit "$rc"
18
18
  ```
19
19
 
20
20
  **That line is identical for every project AND every surface.** Nothing in it names the
@@ -164,8 +164,8 @@ When emitting, produce exactly:
164
164
  ```text
165
165
  Environment name: <project> remote executor
166
166
  Repository: <org>/<repo> (must be the default checkout)
167
- Setup script: n=0; rc=0; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found under $PWD" >&2; exit 1; }; exit "$rc"
168
- Maintenance: n=0; rc=0; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found under $PWD" >&2; exit 1; }; exit "$rc"
167
+ Setup script: n=0; rc=0; seen=""; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh "$HOME"/scripts/lisa-remote-env/setup.sh "$HOME"/*/scripts/lisa-remote-env/setup.sh /workspace/scripts/lisa-remote-env/setup.sh /workspace/*/scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; d=$(cd "$(dirname "$f")" && pwd -P); case " $seen " in *" $d "*) continue;; esac; seen="$seen $d"; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found. PWD=$PWD HOME=$HOME" >&2; ls -1 . "$HOME" /workspace 2>&1 | head -40 >&2; exit 1; }; exit "$rc"
168
+ Maintenance: n=0; rc=0; seen=""; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh "$HOME"/scripts/lisa-remote-env/setup.sh "$HOME"/*/scripts/lisa-remote-env/setup.sh /workspace/scripts/lisa-remote-env/setup.sh /workspace/*/scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; d=$(cd "$(dirname "$f")" && pwd -P); case " $seen " in *" $d "*) continue;; esac; seen="$seen $d"; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found. PWD=$PWD HOME=$HOME" >&2; ls -1 . "$HOME" /workspace 2>&1 | head -40 >&2; exit 1; }; exit "$rc"
169
169
  (identical for every project — the script finds the
170
170
  checkout and installs from the committed lockfile)
171
171
  Environment vars: LISA_SECRETS_SURFACE=codex-cloud
@@ -105,11 +105,21 @@ fi
105
105
  # plugin-delivered harnesses work at all. Lisa is a dependency of every project
106
106
  # it is applied to, so `node_modules` carries the same skill at the version that
107
107
  # project pins, which is the version its setup should run.
108
+ #
109
+ # `plugins/lisa/skills/` sits between them, and exists for exactly one project:
110
+ # Lisa itself. There the checkout IS Lisa, at HEAD, while `node_modules` holds
111
+ # whatever version its own lockfile pins — which was four months and a hundred
112
+ # skills behind, so this file did not exist there at all and setup aborted
113
+ # claiming the skill could not be found. The one place it was is the only place
114
+ # that was not searched. It is ahead of node_modules because a checkout that
115
+ # builds this skill is newer than any published copy of it, and harmless
116
+ # everywhere else because no other project has that directory.
108
117
  runner=""
109
118
  for candidate in \
110
119
  ".claude/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
111
120
  ".agents/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
112
121
  ".codex/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
122
+ "plugins/lisa/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
113
123
  "node_modules/@codyswann/lisa/plugins/lisa/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs"; do
114
124
  if [ -f "$candidate" ]; then
115
125
  runner="$candidate"
@@ -132,6 +142,18 @@ if [ -z "$runner" ]; then
132
142
  echo >&2
133
143
  echo "If dependencies are installed, run 'lisa apply' so the skills are" >&2
134
144
  echo "present, then re-run setup." >&2
145
+ echo >&2
146
+ # The version actually resolved, because "not found" and "found, but too old
147
+ # to contain this skill" read identically above and are fixed differently.
148
+ # The second is what happened on Lisa itself: node_modules held a release
149
+ # from before this skill existed, so every path checked was legitimately
150
+ # absent and the message blamed the install.
151
+ if [ -f node_modules/@codyswann/lisa/package.json ]; then
152
+ echo "For reference, node_modules has @codyswann/lisa version:" >&2
153
+ node -p "require('./node_modules/@codyswann/lisa/package.json').version" >&2 2>/dev/null ||
154
+ echo " (unreadable)" >&2
155
+ echo "If that predates this skill, the pin is the problem, not the install." >&2
156
+ fi
135
157
  exit 1
136
158
  fi
137
159
 
@@ -308,28 +308,44 @@ export function installAssets(cwd = process.cwd()) {
308
308
  * at all — so a `$HOME` glob matched nothing there and bash was handed a path
309
309
  * still containing a literal asterisk.
310
310
  *
311
- * Both candidates are therefore tried relative to cwd, and EVERY match is
312
- * prepared rather than the first. A Claude Code web environment can hold more
313
- * than one checkout, so stopping at the first hit would prepare whichever
314
- * repository sorts first and silently ignore the rest arbitrary rather than
315
- * merely limited. Each script anchors itself on its own repository root and
316
- * each project materializes under its own `secrets.namespace`, so preparing
317
- * several is well defined rather than a collision.
311
+ * Candidates are therefore tried relative to cwd first, then under `$HOME` and
312
+ * `/workspace` the container roots the two surfaces actually use because
313
+ * cwd is not reliably either of them. A Claude environment reported `$HOME` as
314
+ * `/root` with no checkout beneath it, which a cwd-only search cannot reach.
315
+ *
316
+ * EVERY match is prepared rather than the first. A Claude Code web environment
317
+ * can hold more than one checkout, so stopping at the first hit would prepare
318
+ * whichever repository sorts first and silently ignore the rest — arbitrary
319
+ * rather than merely limited. Each script anchors itself on its own repository
320
+ * root and each project materializes under its own `secrets.namespace`, so
321
+ * preparing several is well defined rather than a collision. Matches are
322
+ * deduplicated by resolved directory, since the candidate globs overlap
323
+ * whenever cwd happens to be one of the roots.
318
324
  *
319
325
  * The status is the first failure and every checkout is still attempted: one
320
326
  * broken repository must neither hide the others nor report success. The
321
327
  * explicit `exit 1` on no matches matters because a `for` loop over a glob that
322
328
  * matches nothing otherwise exits 0 — the quiet success this guards against.
323
329
  *
330
+ * Failure prints the layout it found rather than only the path it wanted. This
331
+ * field lives in a vendor settings box with a slow edit-and-retry loop, and a
332
+ * miss that reports nothing costs a whole round trip to learn one fact; the
333
+ * listing means the next message names the layout instead of repeating it.
334
+ *
324
335
  * A field that named the repository and package manager was a string a human
325
336
  * had to get right, in a settings box with no review, no version history and no
326
337
  * test — and the logic it encoded belongs in a file that has all three.
327
338
  */
328
339
  export const SETUP_FIELD =
329
- "n=0; rc=0; " +
330
- "for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh; " +
331
- 'do [ -f "$f" ] || continue; n=$((n+1)); bash "$f" || rc=$?; done; ' +
332
- '[ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found under $PWD" >&2; exit 1; }; ' +
340
+ 'n=0; rc=0; seen=""; ' +
341
+ "for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh " +
342
+ '"$HOME"/scripts/lisa-remote-env/setup.sh "$HOME"/*/scripts/lisa-remote-env/setup.sh ' +
343
+ "/workspace/scripts/lisa-remote-env/setup.sh /workspace/*/scripts/lisa-remote-env/setup.sh; " +
344
+ 'do [ -f "$f" ] || continue; d=$(cd "$(dirname "$f")" && pwd -P); ' +
345
+ 'case " $seen " in *" $d "*) continue;; esac; seen="$seen $d"; ' +
346
+ 'n=$((n+1)); bash "$f" || rc=$?; done; ' +
347
+ '[ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found. ' +
348
+ 'PWD=$PWD HOME=$HOME" >&2; ls -1 . "$HOME" /workspace 2>&1 | head -40 >&2; exit 1; }; ' +
333
349
  'exit "$rc"';
334
350
 
335
351
  /**
@@ -13,8 +13,8 @@ Prepare a remote surface so a host project can execute there. Today that means *
13
13
  The remote environment's own configuration fields stay **one line into the repository**. Nothing else is pasted into a vendor UI.
14
14
 
15
15
  ```text
16
- setup: n=0; rc=0; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found under $PWD" >&2; exit 1; }; exit "$rc"
17
- maintenance: n=0; rc=0; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found under $PWD" >&2; exit 1; }; exit "$rc"
16
+ setup: n=0; rc=0; seen=""; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh "$HOME"/scripts/lisa-remote-env/setup.sh "$HOME"/*/scripts/lisa-remote-env/setup.sh /workspace/scripts/lisa-remote-env/setup.sh /workspace/*/scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; d=$(cd "$(dirname "$f")" && pwd -P); case " $seen " in *" $d "*) continue;; esac; seen="$seen $d"; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found. PWD=$PWD HOME=$HOME" >&2; ls -1 . "$HOME" /workspace 2>&1 | head -40 >&2; exit 1; }; exit "$rc"
17
+ maintenance: n=0; rc=0; seen=""; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh "$HOME"/scripts/lisa-remote-env/setup.sh "$HOME"/*/scripts/lisa-remote-env/setup.sh /workspace/scripts/lisa-remote-env/setup.sh /workspace/*/scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; d=$(cd "$(dirname "$f")" && pwd -P); case " $seen " in *" $d "*) continue;; esac; seen="$seen $d"; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found. PWD=$PWD HOME=$HOME" >&2; ls -1 . "$HOME" /workspace 2>&1 | head -40 >&2; exit 1; }; exit "$rc"
18
18
  ```
19
19
 
20
20
  **That line is identical for every project AND every surface.** Nothing in it names the
@@ -164,8 +164,8 @@ When emitting, produce exactly:
164
164
  ```text
165
165
  Environment name: <project> remote executor
166
166
  Repository: <org>/<repo> (must be the default checkout)
167
- Setup script: n=0; rc=0; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found under $PWD" >&2; exit 1; }; exit "$rc"
168
- Maintenance: n=0; rc=0; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found under $PWD" >&2; exit 1; }; exit "$rc"
167
+ Setup script: n=0; rc=0; seen=""; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh "$HOME"/scripts/lisa-remote-env/setup.sh "$HOME"/*/scripts/lisa-remote-env/setup.sh /workspace/scripts/lisa-remote-env/setup.sh /workspace/*/scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; d=$(cd "$(dirname "$f")" && pwd -P); case " $seen " in *" $d "*) continue;; esac; seen="$seen $d"; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found. PWD=$PWD HOME=$HOME" >&2; ls -1 . "$HOME" /workspace 2>&1 | head -40 >&2; exit 1; }; exit "$rc"
168
+ Maintenance: n=0; rc=0; seen=""; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh "$HOME"/scripts/lisa-remote-env/setup.sh "$HOME"/*/scripts/lisa-remote-env/setup.sh /workspace/scripts/lisa-remote-env/setup.sh /workspace/*/scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; d=$(cd "$(dirname "$f")" && pwd -P); case " $seen " in *" $d "*) continue;; esac; seen="$seen $d"; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found. PWD=$PWD HOME=$HOME" >&2; ls -1 . "$HOME" /workspace 2>&1 | head -40 >&2; exit 1; }; exit "$rc"
169
169
  (identical for every project — the script finds the
170
170
  checkout and installs from the committed lockfile)
171
171
  Environment vars: LISA_SECRETS_SURFACE=codex-cloud
@@ -105,11 +105,21 @@ fi
105
105
  # plugin-delivered harnesses work at all. Lisa is a dependency of every project
106
106
  # it is applied to, so `node_modules` carries the same skill at the version that
107
107
  # project pins, which is the version its setup should run.
108
+ #
109
+ # `plugins/lisa/skills/` sits between them, and exists for exactly one project:
110
+ # Lisa itself. There the checkout IS Lisa, at HEAD, while `node_modules` holds
111
+ # whatever version its own lockfile pins — which was four months and a hundred
112
+ # skills behind, so this file did not exist there at all and setup aborted
113
+ # claiming the skill could not be found. The one place it was is the only place
114
+ # that was not searched. It is ahead of node_modules because a checkout that
115
+ # builds this skill is newer than any published copy of it, and harmless
116
+ # everywhere else because no other project has that directory.
108
117
  runner=""
109
118
  for candidate in \
110
119
  ".claude/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
111
120
  ".agents/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
112
121
  ".codex/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
122
+ "plugins/lisa/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
113
123
  "node_modules/@codyswann/lisa/plugins/lisa/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs"; do
114
124
  if [ -f "$candidate" ]; then
115
125
  runner="$candidate"
@@ -132,6 +142,18 @@ if [ -z "$runner" ]; then
132
142
  echo >&2
133
143
  echo "If dependencies are installed, run 'lisa apply' so the skills are" >&2
134
144
  echo "present, then re-run setup." >&2
145
+ echo >&2
146
+ # The version actually resolved, because "not found" and "found, but too old
147
+ # to contain this skill" read identically above and are fixed differently.
148
+ # The second is what happened on Lisa itself: node_modules held a release
149
+ # from before this skill existed, so every path checked was legitimately
150
+ # absent and the message blamed the install.
151
+ if [ -f node_modules/@codyswann/lisa/package.json ]; then
152
+ echo "For reference, node_modules has @codyswann/lisa version:" >&2
153
+ node -p "require('./node_modules/@codyswann/lisa/package.json').version" >&2 2>/dev/null ||
154
+ echo " (unreadable)" >&2
155
+ echo "If that predates this skill, the pin is the problem, not the install." >&2
156
+ fi
135
157
  exit 1
136
158
  fi
137
159
 
@@ -308,28 +308,44 @@ export function installAssets(cwd = process.cwd()) {
308
308
  * at all — so a `$HOME` glob matched nothing there and bash was handed a path
309
309
  * still containing a literal asterisk.
310
310
  *
311
- * Both candidates are therefore tried relative to cwd, and EVERY match is
312
- * prepared rather than the first. A Claude Code web environment can hold more
313
- * than one checkout, so stopping at the first hit would prepare whichever
314
- * repository sorts first and silently ignore the rest arbitrary rather than
315
- * merely limited. Each script anchors itself on its own repository root and
316
- * each project materializes under its own `secrets.namespace`, so preparing
317
- * several is well defined rather than a collision.
311
+ * Candidates are therefore tried relative to cwd first, then under `$HOME` and
312
+ * `/workspace` the container roots the two surfaces actually use because
313
+ * cwd is not reliably either of them. A Claude environment reported `$HOME` as
314
+ * `/root` with no checkout beneath it, which a cwd-only search cannot reach.
315
+ *
316
+ * EVERY match is prepared rather than the first. A Claude Code web environment
317
+ * can hold more than one checkout, so stopping at the first hit would prepare
318
+ * whichever repository sorts first and silently ignore the rest — arbitrary
319
+ * rather than merely limited. Each script anchors itself on its own repository
320
+ * root and each project materializes under its own `secrets.namespace`, so
321
+ * preparing several is well defined rather than a collision. Matches are
322
+ * deduplicated by resolved directory, since the candidate globs overlap
323
+ * whenever cwd happens to be one of the roots.
318
324
  *
319
325
  * The status is the first failure and every checkout is still attempted: one
320
326
  * broken repository must neither hide the others nor report success. The
321
327
  * explicit `exit 1` on no matches matters because a `for` loop over a glob that
322
328
  * matches nothing otherwise exits 0 — the quiet success this guards against.
323
329
  *
330
+ * Failure prints the layout it found rather than only the path it wanted. This
331
+ * field lives in a vendor settings box with a slow edit-and-retry loop, and a
332
+ * miss that reports nothing costs a whole round trip to learn one fact; the
333
+ * listing means the next message names the layout instead of repeating it.
334
+ *
324
335
  * A field that named the repository and package manager was a string a human
325
336
  * had to get right, in a settings box with no review, no version history and no
326
337
  * test — and the logic it encoded belongs in a file that has all three.
327
338
  */
328
339
  export const SETUP_FIELD =
329
- "n=0; rc=0; " +
330
- "for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh; " +
331
- 'do [ -f "$f" ] || continue; n=$((n+1)); bash "$f" || rc=$?; done; ' +
332
- '[ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found under $PWD" >&2; exit 1; }; ' +
340
+ 'n=0; rc=0; seen=""; ' +
341
+ "for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh " +
342
+ '"$HOME"/scripts/lisa-remote-env/setup.sh "$HOME"/*/scripts/lisa-remote-env/setup.sh ' +
343
+ "/workspace/scripts/lisa-remote-env/setup.sh /workspace/*/scripts/lisa-remote-env/setup.sh; " +
344
+ 'do [ -f "$f" ] || continue; d=$(cd "$(dirname "$f")" && pwd -P); ' +
345
+ 'case " $seen " in *" $d "*) continue;; esac; seen="$seen $d"; ' +
346
+ 'n=$((n+1)); bash "$f" || rc=$?; done; ' +
347
+ '[ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found. ' +
348
+ 'PWD=$PWD HOME=$HOME" >&2; ls -1 . "$HOME" /workspace 2>&1 | head -40 >&2; exit 1; }; ' +
333
349
  'exit "$rc"';
334
350
 
335
351
  /**
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.322.5",
3
+ "version": "2.322.6",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -13,8 +13,8 @@ Prepare a remote surface so a host project can execute there. Today that means *
13
13
  The remote environment's own configuration fields stay **one line into the repository**. Nothing else is pasted into a vendor UI.
14
14
 
15
15
  ```text
16
- setup: n=0; rc=0; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found under $PWD" >&2; exit 1; }; exit "$rc"
17
- maintenance: n=0; rc=0; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found under $PWD" >&2; exit 1; }; exit "$rc"
16
+ setup: n=0; rc=0; seen=""; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh "$HOME"/scripts/lisa-remote-env/setup.sh "$HOME"/*/scripts/lisa-remote-env/setup.sh /workspace/scripts/lisa-remote-env/setup.sh /workspace/*/scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; d=$(cd "$(dirname "$f")" && pwd -P); case " $seen " in *" $d "*) continue;; esac; seen="$seen $d"; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found. PWD=$PWD HOME=$HOME" >&2; ls -1 . "$HOME" /workspace 2>&1 | head -40 >&2; exit 1; }; exit "$rc"
17
+ maintenance: n=0; rc=0; seen=""; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh "$HOME"/scripts/lisa-remote-env/setup.sh "$HOME"/*/scripts/lisa-remote-env/setup.sh /workspace/scripts/lisa-remote-env/setup.sh /workspace/*/scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; d=$(cd "$(dirname "$f")" && pwd -P); case " $seen " in *" $d "*) continue;; esac; seen="$seen $d"; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found. PWD=$PWD HOME=$HOME" >&2; ls -1 . "$HOME" /workspace 2>&1 | head -40 >&2; exit 1; }; exit "$rc"
18
18
  ```
19
19
 
20
20
  **That line is identical for every project AND every surface.** Nothing in it names the
@@ -164,8 +164,8 @@ When emitting, produce exactly:
164
164
  ```text
165
165
  Environment name: <project> remote executor
166
166
  Repository: <org>/<repo> (must be the default checkout)
167
- Setup script: n=0; rc=0; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found under $PWD" >&2; exit 1; }; exit "$rc"
168
- Maintenance: n=0; rc=0; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found under $PWD" >&2; exit 1; }; exit "$rc"
167
+ Setup script: n=0; rc=0; seen=""; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh "$HOME"/scripts/lisa-remote-env/setup.sh "$HOME"/*/scripts/lisa-remote-env/setup.sh /workspace/scripts/lisa-remote-env/setup.sh /workspace/*/scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; d=$(cd "$(dirname "$f")" && pwd -P); case " $seen " in *" $d "*) continue;; esac; seen="$seen $d"; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found. PWD=$PWD HOME=$HOME" >&2; ls -1 . "$HOME" /workspace 2>&1 | head -40 >&2; exit 1; }; exit "$rc"
168
+ Maintenance: n=0; rc=0; seen=""; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh "$HOME"/scripts/lisa-remote-env/setup.sh "$HOME"/*/scripts/lisa-remote-env/setup.sh /workspace/scripts/lisa-remote-env/setup.sh /workspace/*/scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; d=$(cd "$(dirname "$f")" && pwd -P); case " $seen " in *" $d "*) continue;; esac; seen="$seen $d"; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found. PWD=$PWD HOME=$HOME" >&2; ls -1 . "$HOME" /workspace 2>&1 | head -40 >&2; exit 1; }; exit "$rc"
169
169
  (identical for every project — the script finds the
170
170
  checkout and installs from the committed lockfile)
171
171
  Environment vars: LISA_SECRETS_SURFACE=codex-cloud
@@ -105,11 +105,21 @@ fi
105
105
  # plugin-delivered harnesses work at all. Lisa is a dependency of every project
106
106
  # it is applied to, so `node_modules` carries the same skill at the version that
107
107
  # project pins, which is the version its setup should run.
108
+ #
109
+ # `plugins/lisa/skills/` sits between them, and exists for exactly one project:
110
+ # Lisa itself. There the checkout IS Lisa, at HEAD, while `node_modules` holds
111
+ # whatever version its own lockfile pins — which was four months and a hundred
112
+ # skills behind, so this file did not exist there at all and setup aborted
113
+ # claiming the skill could not be found. The one place it was is the only place
114
+ # that was not searched. It is ahead of node_modules because a checkout that
115
+ # builds this skill is newer than any published copy of it, and harmless
116
+ # everywhere else because no other project has that directory.
108
117
  runner=""
109
118
  for candidate in \
110
119
  ".claude/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
111
120
  ".agents/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
112
121
  ".codex/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
122
+ "plugins/lisa/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
113
123
  "node_modules/@codyswann/lisa/plugins/lisa/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs"; do
114
124
  if [ -f "$candidate" ]; then
115
125
  runner="$candidate"
@@ -132,6 +142,18 @@ if [ -z "$runner" ]; then
132
142
  echo >&2
133
143
  echo "If dependencies are installed, run 'lisa apply' so the skills are" >&2
134
144
  echo "present, then re-run setup." >&2
145
+ echo >&2
146
+ # The version actually resolved, because "not found" and "found, but too old
147
+ # to contain this skill" read identically above and are fixed differently.
148
+ # The second is what happened on Lisa itself: node_modules held a release
149
+ # from before this skill existed, so every path checked was legitimately
150
+ # absent and the message blamed the install.
151
+ if [ -f node_modules/@codyswann/lisa/package.json ]; then
152
+ echo "For reference, node_modules has @codyswann/lisa version:" >&2
153
+ node -p "require('./node_modules/@codyswann/lisa/package.json').version" >&2 2>/dev/null ||
154
+ echo " (unreadable)" >&2
155
+ echo "If that predates this skill, the pin is the problem, not the install." >&2
156
+ fi
135
157
  exit 1
136
158
  fi
137
159
 
@@ -308,28 +308,44 @@ export function installAssets(cwd = process.cwd()) {
308
308
  * at all — so a `$HOME` glob matched nothing there and bash was handed a path
309
309
  * still containing a literal asterisk.
310
310
  *
311
- * Both candidates are therefore tried relative to cwd, and EVERY match is
312
- * prepared rather than the first. A Claude Code web environment can hold more
313
- * than one checkout, so stopping at the first hit would prepare whichever
314
- * repository sorts first and silently ignore the rest arbitrary rather than
315
- * merely limited. Each script anchors itself on its own repository root and
316
- * each project materializes under its own `secrets.namespace`, so preparing
317
- * several is well defined rather than a collision.
311
+ * Candidates are therefore tried relative to cwd first, then under `$HOME` and
312
+ * `/workspace` the container roots the two surfaces actually use because
313
+ * cwd is not reliably either of them. A Claude environment reported `$HOME` as
314
+ * `/root` with no checkout beneath it, which a cwd-only search cannot reach.
315
+ *
316
+ * EVERY match is prepared rather than the first. A Claude Code web environment
317
+ * can hold more than one checkout, so stopping at the first hit would prepare
318
+ * whichever repository sorts first and silently ignore the rest — arbitrary
319
+ * rather than merely limited. Each script anchors itself on its own repository
320
+ * root and each project materializes under its own `secrets.namespace`, so
321
+ * preparing several is well defined rather than a collision. Matches are
322
+ * deduplicated by resolved directory, since the candidate globs overlap
323
+ * whenever cwd happens to be one of the roots.
318
324
  *
319
325
  * The status is the first failure and every checkout is still attempted: one
320
326
  * broken repository must neither hide the others nor report success. The
321
327
  * explicit `exit 1` on no matches matters because a `for` loop over a glob that
322
328
  * matches nothing otherwise exits 0 — the quiet success this guards against.
323
329
  *
330
+ * Failure prints the layout it found rather than only the path it wanted. This
331
+ * field lives in a vendor settings box with a slow edit-and-retry loop, and a
332
+ * miss that reports nothing costs a whole round trip to learn one fact; the
333
+ * listing means the next message names the layout instead of repeating it.
334
+ *
324
335
  * A field that named the repository and package manager was a string a human
325
336
  * had to get right, in a settings box with no review, no version history and no
326
337
  * test — and the logic it encoded belongs in a file that has all three.
327
338
  */
328
339
  export const SETUP_FIELD =
329
- "n=0; rc=0; " +
330
- "for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh; " +
331
- 'do [ -f "$f" ] || continue; n=$((n+1)); bash "$f" || rc=$?; done; ' +
332
- '[ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found under $PWD" >&2; exit 1; }; ' +
340
+ 'n=0; rc=0; seen=""; ' +
341
+ "for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh " +
342
+ '"$HOME"/scripts/lisa-remote-env/setup.sh "$HOME"/*/scripts/lisa-remote-env/setup.sh ' +
343
+ "/workspace/scripts/lisa-remote-env/setup.sh /workspace/*/scripts/lisa-remote-env/setup.sh; " +
344
+ 'do [ -f "$f" ] || continue; d=$(cd "$(dirname "$f")" && pwd -P); ' +
345
+ 'case " $seen " in *" $d "*) continue;; esac; seen="$seen $d"; ' +
346
+ 'n=$((n+1)); bash "$f" || rc=$?; done; ' +
347
+ '[ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found. ' +
348
+ 'PWD=$PWD HOME=$HOME" >&2; ls -1 . "$HOME" /workspace 2>&1 | head -40 >&2; exit 1; }; ' +
333
349
  'exit "$rc"';
334
350
 
335
351
  /**
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.322.5",
3
+ "version": "2.322.6",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.322.5",
3
+ "version": "2.322.6",
4
4
  "description": "AWS CDK-specific Lisa plugin.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.322.5",
3
+ "version": "2.322.6",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.322.5",
3
+ "version": "2.322.6",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.322.5",
3
+ "version": "2.322.6",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.322.5",
3
+ "version": "2.322.6",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -13,8 +13,8 @@ Prepare a remote surface so a host project can execute there. Today that means *
13
13
  The remote environment's own configuration fields stay **one line into the repository**. Nothing else is pasted into a vendor UI.
14
14
 
15
15
  ```text
16
- setup: n=0; rc=0; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found under $PWD" >&2; exit 1; }; exit "$rc"
17
- maintenance: n=0; rc=0; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found under $PWD" >&2; exit 1; }; exit "$rc"
16
+ setup: n=0; rc=0; seen=""; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh "$HOME"/scripts/lisa-remote-env/setup.sh "$HOME"/*/scripts/lisa-remote-env/setup.sh /workspace/scripts/lisa-remote-env/setup.sh /workspace/*/scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; d=$(cd "$(dirname "$f")" && pwd -P); case " $seen " in *" $d "*) continue;; esac; seen="$seen $d"; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found. PWD=$PWD HOME=$HOME" >&2; ls -1 . "$HOME" /workspace 2>&1 | head -40 >&2; exit 1; }; exit "$rc"
17
+ maintenance: n=0; rc=0; seen=""; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh "$HOME"/scripts/lisa-remote-env/setup.sh "$HOME"/*/scripts/lisa-remote-env/setup.sh /workspace/scripts/lisa-remote-env/setup.sh /workspace/*/scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; d=$(cd "$(dirname "$f")" && pwd -P); case " $seen " in *" $d "*) continue;; esac; seen="$seen $d"; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found. PWD=$PWD HOME=$HOME" >&2; ls -1 . "$HOME" /workspace 2>&1 | head -40 >&2; exit 1; }; exit "$rc"
18
18
  ```
19
19
 
20
20
  **That line is identical for every project AND every surface.** Nothing in it names the
@@ -164,8 +164,8 @@ When emitting, produce exactly:
164
164
  ```text
165
165
  Environment name: <project> remote executor
166
166
  Repository: <org>/<repo> (must be the default checkout)
167
- Setup script: n=0; rc=0; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found under $PWD" >&2; exit 1; }; exit "$rc"
168
- Maintenance: n=0; rc=0; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found under $PWD" >&2; exit 1; }; exit "$rc"
167
+ Setup script: n=0; rc=0; seen=""; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh "$HOME"/scripts/lisa-remote-env/setup.sh "$HOME"/*/scripts/lisa-remote-env/setup.sh /workspace/scripts/lisa-remote-env/setup.sh /workspace/*/scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; d=$(cd "$(dirname "$f")" && pwd -P); case " $seen " in *" $d "*) continue;; esac; seen="$seen $d"; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found. PWD=$PWD HOME=$HOME" >&2; ls -1 . "$HOME" /workspace 2>&1 | head -40 >&2; exit 1; }; exit "$rc"
168
+ Maintenance: n=0; rc=0; seen=""; for f in scripts/lisa-remote-env/setup.sh */scripts/lisa-remote-env/setup.sh "$HOME"/scripts/lisa-remote-env/setup.sh "$HOME"/*/scripts/lisa-remote-env/setup.sh /workspace/scripts/lisa-remote-env/setup.sh /workspace/*/scripts/lisa-remote-env/setup.sh; do [ -f "$f" ] || continue; d=$(cd "$(dirname "$f")" && pwd -P); case " $seen " in *" $d "*) continue;; esac; seen="$seen $d"; n=$((n+1)); bash "$f" || rc=$?; done; [ "$n" -gt 0 ] || { echo "lisa-remote-env entrypoint not found. PWD=$PWD HOME=$HOME" >&2; ls -1 . "$HOME" /workspace 2>&1 | head -40 >&2; exit 1; }; exit "$rc"
169
169
  (identical for every project — the script finds the
170
170
  checkout and installs from the committed lockfile)
171
171
  Environment vars: LISA_SECRETS_SURFACE=codex-cloud
@@ -105,11 +105,21 @@ fi
105
105
  # plugin-delivered harnesses work at all. Lisa is a dependency of every project
106
106
  # it is applied to, so `node_modules` carries the same skill at the version that
107
107
  # project pins, which is the version its setup should run.
108
+ #
109
+ # `plugins/lisa/skills/` sits between them, and exists for exactly one project:
110
+ # Lisa itself. There the checkout IS Lisa, at HEAD, while `node_modules` holds
111
+ # whatever version its own lockfile pins — which was four months and a hundred
112
+ # skills behind, so this file did not exist there at all and setup aborted
113
+ # claiming the skill could not be found. The one place it was is the only place
114
+ # that was not searched. It is ahead of node_modules because a checkout that
115
+ # builds this skill is newer than any published copy of it, and harmless
116
+ # everywhere else because no other project has that directory.
108
117
  runner=""
109
118
  for candidate in \
110
119
  ".claude/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
111
120
  ".agents/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
112
121
  ".codex/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
122
+ "plugins/lisa/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
113
123
  "node_modules/@codyswann/lisa/plugins/lisa/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs"; do
114
124
  if [ -f "$candidate" ]; then
115
125
  runner="$candidate"
@@ -132,6 +142,18 @@ if [ -z "$runner" ]; then
132
142
  echo >&2
133
143
  echo "If dependencies are installed, run 'lisa apply' so the skills are" >&2
134
144
  echo "present, then re-run setup." >&2
145
+ echo >&2
146
+ # The version actually resolved, because "not found" and "found, but too old
147
+ # to contain this skill" read identically above and are fixed differently.
148
+ # The second is what happened on Lisa itself: node_modules held a release
149
+ # from before this skill existed, so every path checked was legitimately
150
+ # absent and the message blamed the install.
151
+ if [ -f node_modules/@codyswann/lisa/package.json ]; then
152
+ echo "For reference, node_modules has @codyswann/lisa version:" >&2
153
+ node -p "require('./node_modules/@codyswann/lisa/package.json').version" >&2 2>/dev/null ||
154
+ echo " (unreadable)" >&2
155
+ echo "If that predates this skill, the pin is the problem, not the install." >&2
156
+ fi
135
157
  exit 1
136
158
  fi
137
159