@codyswann/lisa 2.317.4 → 2.317.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 (68) hide show
  1. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  2. package/dist/core/upstream-evidence-manifest.js +4 -3
  3. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  4. package/package.json +1 -1
  5. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  6. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  7. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/SKILL.md +20 -7
  8. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/assets/setup.sh +29 -5
  9. package/plugins/lisa/hooks/enforce-team-first.sh +17 -3
  10. package/plugins/lisa/skills/lisa-setup-remote-env/SKILL.md +20 -7
  11. package/plugins/lisa/skills/lisa-setup-remote-env/assets/setup.sh +29 -5
  12. package/plugins/lisa-agy/plugin.json +1 -1
  13. package/plugins/lisa-agy/skills/lisa-setup-remote-env/SKILL.md +20 -7
  14. package/plugins/lisa-agy/skills/lisa-setup-remote-env/assets/setup.sh +29 -5
  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 +20 -7
  22. package/plugins/lisa-copilot/skills/lisa-setup-remote-env/assets/setup.sh +29 -5
  23. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  24. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/SKILL.md +20 -7
  25. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/assets/setup.sh +29 -5
  26. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  28. package/plugins/lisa-expo-agy/plugin.json +1 -1
  29. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  32. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  33. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  34. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  37. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  38. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  39. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  43. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  44. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  48. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  49. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  53. package/plugins/lisa-rails-agy/plugin.json +1 -1
  54. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  58. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  59. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  63. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  64. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  66. package/plugins/src/base/hooks/enforce-team-first.sh +17 -3
  67. package/plugins/src/base/skills/lisa-setup-remote-env/SKILL.md +20 -7
  68. package/plugins/src/base/skills/lisa-setup-remote-env/assets/setup.sh +29 -5
package/package.json CHANGED
@@ -115,7 +115,7 @@
115
115
  "brace-expansion": ">=5.0.8"
116
116
  },
117
117
  "name": "@codyswann/lisa",
118
- "version": "2.317.4",
118
+ "version": "2.317.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.317.4",
3
+ "version": "2.317.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.317.4",
3
+ "version": "2.317.6",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -10,17 +10,27 @@ Prepare a remote surface so a host project can execute there. Today that means *
10
10
 
11
11
  ## What lives where
12
12
 
13
- The remote environment's own configuration fields stay **two one-line calls into the repository**. Nothing is pasted into a vendor UI.
13
+ The remote environment's own configuration fields stay **one line into the repository, preceded by the project's dependency install**. Nothing else is pasted into a vendor UI.
14
14
 
15
15
  ```text
16
- setup: bash scripts/lisa-remote-env/setup.sh
17
- maintenance: bash scripts/lisa-remote-env/setup.sh
16
+ setup: <install> && bash scripts/lisa-remote-env/setup.sh
17
+ maintenance: <install> && bash scripts/lisa-remote-env/setup.sh
18
18
  ```
19
19
 
20
- They are the same script. A container may be built fresh or resumed from cache; every step is idempotent and version-aware, so running it twice is correct, and running it on resume is what picks up a rotated value, an edited note, or a changed version pin.
20
+ `<install>` is whatever the project already uses `bun install`, `npm ci`, `pnpm install`. Substitute it; do not invent one.
21
+
22
+ They are the same command. A container may be built fresh or resumed from cache; every step is idempotent and version-aware, so running it twice is correct, and running it on resume is what picks up a rotated value, an edited note, or a changed version pin.
21
23
 
22
24
  The complete logic is repository-owned so it is reviewed, versioned, tested, and reusable. A large inline installer in a settings field is none of those things.
23
25
 
26
+ ### Why the install has to come first
27
+
28
+ **A clone does not contain the skills on the harnesses that matter here.** OpenCode and Antigravity have them written into the checkout by `lisa apply`. Claude and Codex receive them as an *installed plugin*, which lives in the user's home directory — so a container that has just cloned the repository has never seen it.
29
+
30
+ `node_modules/@codyswann/lisa` is therefore the only copy present on a fresh container, and it is a good one: it is the version that project pins, which is the version its setup should run. The entrypoint searches the agent directories first and falls back to it.
31
+
32
+ Omitting the install does not degrade gracefully. The entrypoint exits before the toolchain, secrets, and hook phases have done anything, so the environment looks provisioned and fails on first dispatch.
33
+
24
34
  ## The three phases
25
35
 
26
36
  1. **Toolchain** — assert what must already be present, install what is not.
@@ -110,8 +120,11 @@ When emitting, produce exactly:
110
120
  ```text
111
121
  Environment name: <project> remote executor
112
122
  Repository: <org>/<repo> (must be the default checkout)
113
- Setup script: bash scripts/lisa-remote-env/setup.sh
114
- Maintenance: bash scripts/lisa-remote-env/setup.sh
123
+ Setup script: <install> && bash scripts/lisa-remote-env/setup.sh
124
+ Maintenance: <install> && bash scripts/lisa-remote-env/setup.sh
125
+ (<install> is the project's own: bun install, npm ci, ...
126
+ It must precede the script — on a fresh container
127
+ node_modules is the only copy of the skills present.)
115
128
  Environment vars: LISA_SECRETS_SURFACE=codex-cloud
116
129
  BWS_ACCESS_TOKEN=<from the provider; an environment
117
130
  variable, not a task secret — setup and cache-resume
@@ -136,7 +149,7 @@ Checked when setup runs, not at 3am:
136
149
 
137
150
  - the environment exists and is bound to **this** repository as its default checkout;
138
151
  - the bootstrap credential resolves;
139
- - Lisa has been applied to the repository, so its skills are present in that checkout.
152
+ - either a checkout-local Lisa skill is present, or the project dependency install has made the pinned `@codyswann/lisa` package available under `node_modules`.
140
153
 
141
154
  Fail with a message naming what is missing. Never provision-and-hope.
142
155
 
@@ -23,13 +23,26 @@ if ! command -v node >/dev/null 2>&1; then
23
23
  exit 1
24
24
  fi
25
25
 
26
- # The skill ships under whichever agent directory this project uses. Search
27
- # rather than hardcode, so one entrypoint serves every supported harness.
26
+ # Where the skill lives depends on how this project's harness receives it, and
27
+ # the two delivery models differ in a way that matters here.
28
+ #
29
+ # OpenCode and Antigravity get skills written INTO the checkout by `lisa apply`,
30
+ # so a clone already carries them. Claude and Codex receive them as an installed
31
+ # plugin, which lives in the user's home directory and is emphatically NOT part
32
+ # of a clone. A fresh remote container is the second case every time: it clones
33
+ # the repository and has never run a plugin install.
34
+ #
35
+ # So the agent directories are searched first — they are the cheapest hit and
36
+ # need nothing installed — and the npm package is the fallback that makes the
37
+ # plugin-delivered harnesses work at all. Lisa is a dependency of every project
38
+ # it is applied to, so `node_modules` carries the same skill at the version that
39
+ # project pins, which is the version its setup should run.
28
40
  runner=""
29
41
  for candidate in \
30
42
  ".claude/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
31
43
  ".agents/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
32
- ".codex/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs"; do
44
+ ".codex/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
45
+ "node_modules/@codyswann/lisa/plugins/lisa/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs"; do
33
46
  if [ -f "$candidate" ]; then
34
47
  runner="$candidate"
35
48
  break
@@ -37,8 +50,19 @@ for candidate in \
37
50
  done
38
51
 
39
52
  if [ -z "$runner" ]; then
40
- echo "Cannot find the lisa-setup-remote-env skill in this checkout." >&2
41
- echo "Run 'lisa apply' so the skills are present, then re-run setup." >&2
53
+ echo "Cannot find the lisa-setup-remote-env skill." >&2
54
+ echo >&2
55
+ echo "Searched the agent skill directories and node_modules. On a remote" >&2
56
+ echo "container the usual cause is that dependencies have not been installed" >&2
57
+ echo "yet: Claude and Codex receive Lisa skills as an installed plugin, which" >&2
58
+ echo "is not part of a clone, so node_modules is the only copy present." >&2
59
+ echo >&2
60
+ echo "Install dependencies before this script runs. The environment's setup" >&2
61
+ echo "command should be the install and this script together, for example:" >&2
62
+ echo " bun install && bash scripts/lisa-remote-env/setup.sh" >&2
63
+ echo >&2
64
+ echo "If dependencies are installed, run 'lisa apply' so the skills are" >&2
65
+ echo "present, then re-run setup." >&2
42
66
  exit 1
43
67
  fi
44
68
 
@@ -51,8 +51,14 @@ TEAM_FLAG="${STATE_DIR}/${SESSION_ID}.team"
51
51
  # Best-effort cleanup of stale state files. Errors are ignored.
52
52
  find "$STATE_DIR" -maxdepth 1 -type f -mmin +1440 -delete 2>/dev/null || true
53
53
 
54
+ # Lifecycle skills are named with either separator depending on the call path:
55
+ # the Skill tool invokes plugin skills as `lisa:implement` (plugin:skill), while
56
+ # the skill's own slug is `lisa-implement`. Normalize `:` to `-` before matching
57
+ # so BOTH forms resolve — matching only the hyphen form made the "skill load is
58
+ # always allowed" branch below dead code for every real plugin-skill call, which
59
+ # blocked the very Skill call that loads the orchestration preamble.
54
60
  is_lifecycle_skill() {
55
- case "$1" in
61
+ case "${1//:/-}" in
56
62
  lisa-research|lisa-plan|lisa-implement|lisa-intake|lisa-debrief) return 0 ;;
57
63
  *) return 1 ;;
58
64
  esac
@@ -200,7 +206,15 @@ If you are running Lisa in a non-Claude harness, this Claude enforcement hook
200
206
  should not be installed; follow the runtime-aware orchestration preamble in the
201
207
  skill instead.
202
208
 
203
- Re-read the orchestration preamble in /${ACTIVE_SKILL} and start by spawning the
204
- bounded input-resolver with the \`Agent\` tool.
209
+ Start by spawning the bounded input-resolver with the \`Agent\` tool.
210
+
211
+ THEN CALL \`Skill\` FOR /${ACTIVE_SKILL} AGAIN. This block is a precondition, not a
212
+ substitute for the skill — nothing in this message replaces its contents. If you
213
+ proceed straight from the input-resolver into the work, you will improvise a
214
+ lifecycle that only resembles the real one: the skill's own steps (auto-merge on
215
+ the PR, driving it to merged, usage accounting, two-way tracker linkage,
216
+ non-closing work-item refs, remote verification, config-bound status
217
+ transitions) are nowhere in this text and will be silently skipped. That failure
218
+ is invisible in the output — the work still looks finished.
205
219
  EOF
206
220
  exit 2
@@ -10,17 +10,27 @@ Prepare a remote surface so a host project can execute there. Today that means *
10
10
 
11
11
  ## What lives where
12
12
 
13
- The remote environment's own configuration fields stay **two one-line calls into the repository**. Nothing is pasted into a vendor UI.
13
+ The remote environment's own configuration fields stay **one line into the repository, preceded by the project's dependency install**. Nothing else is pasted into a vendor UI.
14
14
 
15
15
  ```text
16
- setup: bash scripts/lisa-remote-env/setup.sh
17
- maintenance: bash scripts/lisa-remote-env/setup.sh
16
+ setup: <install> && bash scripts/lisa-remote-env/setup.sh
17
+ maintenance: <install> && bash scripts/lisa-remote-env/setup.sh
18
18
  ```
19
19
 
20
- They are the same script. A container may be built fresh or resumed from cache; every step is idempotent and version-aware, so running it twice is correct, and running it on resume is what picks up a rotated value, an edited note, or a changed version pin.
20
+ `<install>` is whatever the project already uses `bun install`, `npm ci`, `pnpm install`. Substitute it; do not invent one.
21
+
22
+ They are the same command. A container may be built fresh or resumed from cache; every step is idempotent and version-aware, so running it twice is correct, and running it on resume is what picks up a rotated value, an edited note, or a changed version pin.
21
23
 
22
24
  The complete logic is repository-owned so it is reviewed, versioned, tested, and reusable. A large inline installer in a settings field is none of those things.
23
25
 
26
+ ### Why the install has to come first
27
+
28
+ **A clone does not contain the skills on the harnesses that matter here.** OpenCode and Antigravity have them written into the checkout by `lisa apply`. Claude and Codex receive them as an *installed plugin*, which lives in the user's home directory — so a container that has just cloned the repository has never seen it.
29
+
30
+ `node_modules/@codyswann/lisa` is therefore the only copy present on a fresh container, and it is a good one: it is the version that project pins, which is the version its setup should run. The entrypoint searches the agent directories first and falls back to it.
31
+
32
+ Omitting the install does not degrade gracefully. The entrypoint exits before the toolchain, secrets, and hook phases have done anything, so the environment looks provisioned and fails on first dispatch.
33
+
24
34
  ## The three phases
25
35
 
26
36
  1. **Toolchain** — assert what must already be present, install what is not.
@@ -110,8 +120,11 @@ When emitting, produce exactly:
110
120
  ```text
111
121
  Environment name: <project> remote executor
112
122
  Repository: <org>/<repo> (must be the default checkout)
113
- Setup script: bash scripts/lisa-remote-env/setup.sh
114
- Maintenance: bash scripts/lisa-remote-env/setup.sh
123
+ Setup script: <install> && bash scripts/lisa-remote-env/setup.sh
124
+ Maintenance: <install> && bash scripts/lisa-remote-env/setup.sh
125
+ (<install> is the project's own: bun install, npm ci, ...
126
+ It must precede the script — on a fresh container
127
+ node_modules is the only copy of the skills present.)
115
128
  Environment vars: LISA_SECRETS_SURFACE=codex-cloud
116
129
  BWS_ACCESS_TOKEN=<from the provider; an environment
117
130
  variable, not a task secret — setup and cache-resume
@@ -136,7 +149,7 @@ Checked when setup runs, not at 3am:
136
149
 
137
150
  - the environment exists and is bound to **this** repository as its default checkout;
138
151
  - the bootstrap credential resolves;
139
- - Lisa has been applied to the repository, so its skills are present in that checkout.
152
+ - either a checkout-local Lisa skill is present, or the project dependency install has made the pinned `@codyswann/lisa` package available under `node_modules`.
140
153
 
141
154
  Fail with a message naming what is missing. Never provision-and-hope.
142
155
 
@@ -23,13 +23,26 @@ if ! command -v node >/dev/null 2>&1; then
23
23
  exit 1
24
24
  fi
25
25
 
26
- # The skill ships under whichever agent directory this project uses. Search
27
- # rather than hardcode, so one entrypoint serves every supported harness.
26
+ # Where the skill lives depends on how this project's harness receives it, and
27
+ # the two delivery models differ in a way that matters here.
28
+ #
29
+ # OpenCode and Antigravity get skills written INTO the checkout by `lisa apply`,
30
+ # so a clone already carries them. Claude and Codex receive them as an installed
31
+ # plugin, which lives in the user's home directory and is emphatically NOT part
32
+ # of a clone. A fresh remote container is the second case every time: it clones
33
+ # the repository and has never run a plugin install.
34
+ #
35
+ # So the agent directories are searched first — they are the cheapest hit and
36
+ # need nothing installed — and the npm package is the fallback that makes the
37
+ # plugin-delivered harnesses work at all. Lisa is a dependency of every project
38
+ # it is applied to, so `node_modules` carries the same skill at the version that
39
+ # project pins, which is the version its setup should run.
28
40
  runner=""
29
41
  for candidate in \
30
42
  ".claude/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
31
43
  ".agents/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
32
- ".codex/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs"; do
44
+ ".codex/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
45
+ "node_modules/@codyswann/lisa/plugins/lisa/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs"; do
33
46
  if [ -f "$candidate" ]; then
34
47
  runner="$candidate"
35
48
  break
@@ -37,8 +50,19 @@ for candidate in \
37
50
  done
38
51
 
39
52
  if [ -z "$runner" ]; then
40
- echo "Cannot find the lisa-setup-remote-env skill in this checkout." >&2
41
- echo "Run 'lisa apply' so the skills are present, then re-run setup." >&2
53
+ echo "Cannot find the lisa-setup-remote-env skill." >&2
54
+ echo >&2
55
+ echo "Searched the agent skill directories and node_modules. On a remote" >&2
56
+ echo "container the usual cause is that dependencies have not been installed" >&2
57
+ echo "yet: Claude and Codex receive Lisa skills as an installed plugin, which" >&2
58
+ echo "is not part of a clone, so node_modules is the only copy present." >&2
59
+ echo >&2
60
+ echo "Install dependencies before this script runs. The environment's setup" >&2
61
+ echo "command should be the install and this script together, for example:" >&2
62
+ echo " bun install && bash scripts/lisa-remote-env/setup.sh" >&2
63
+ echo >&2
64
+ echo "If dependencies are installed, run 'lisa apply' so the skills are" >&2
65
+ echo "present, then re-run setup." >&2
42
66
  exit 1
43
67
  fi
44
68
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.317.4",
3
+ "version": "2.317.6",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -10,17 +10,27 @@ Prepare a remote surface so a host project can execute there. Today that means *
10
10
 
11
11
  ## What lives where
12
12
 
13
- The remote environment's own configuration fields stay **two one-line calls into the repository**. Nothing is pasted into a vendor UI.
13
+ The remote environment's own configuration fields stay **one line into the repository, preceded by the project's dependency install**. Nothing else is pasted into a vendor UI.
14
14
 
15
15
  ```text
16
- setup: bash scripts/lisa-remote-env/setup.sh
17
- maintenance: bash scripts/lisa-remote-env/setup.sh
16
+ setup: <install> && bash scripts/lisa-remote-env/setup.sh
17
+ maintenance: <install> && bash scripts/lisa-remote-env/setup.sh
18
18
  ```
19
19
 
20
- They are the same script. A container may be built fresh or resumed from cache; every step is idempotent and version-aware, so running it twice is correct, and running it on resume is what picks up a rotated value, an edited note, or a changed version pin.
20
+ `<install>` is whatever the project already uses `bun install`, `npm ci`, `pnpm install`. Substitute it; do not invent one.
21
+
22
+ They are the same command. A container may be built fresh or resumed from cache; every step is idempotent and version-aware, so running it twice is correct, and running it on resume is what picks up a rotated value, an edited note, or a changed version pin.
21
23
 
22
24
  The complete logic is repository-owned so it is reviewed, versioned, tested, and reusable. A large inline installer in a settings field is none of those things.
23
25
 
26
+ ### Why the install has to come first
27
+
28
+ **A clone does not contain the skills on the harnesses that matter here.** OpenCode and Antigravity have them written into the checkout by `lisa apply`. Claude and Codex receive them as an *installed plugin*, which lives in the user's home directory — so a container that has just cloned the repository has never seen it.
29
+
30
+ `node_modules/@codyswann/lisa` is therefore the only copy present on a fresh container, and it is a good one: it is the version that project pins, which is the version its setup should run. The entrypoint searches the agent directories first and falls back to it.
31
+
32
+ Omitting the install does not degrade gracefully. The entrypoint exits before the toolchain, secrets, and hook phases have done anything, so the environment looks provisioned and fails on first dispatch.
33
+
24
34
  ## The three phases
25
35
 
26
36
  1. **Toolchain** — assert what must already be present, install what is not.
@@ -110,8 +120,11 @@ When emitting, produce exactly:
110
120
  ```text
111
121
  Environment name: <project> remote executor
112
122
  Repository: <org>/<repo> (must be the default checkout)
113
- Setup script: bash scripts/lisa-remote-env/setup.sh
114
- Maintenance: bash scripts/lisa-remote-env/setup.sh
123
+ Setup script: <install> && bash scripts/lisa-remote-env/setup.sh
124
+ Maintenance: <install> && bash scripts/lisa-remote-env/setup.sh
125
+ (<install> is the project's own: bun install, npm ci, ...
126
+ It must precede the script — on a fresh container
127
+ node_modules is the only copy of the skills present.)
115
128
  Environment vars: LISA_SECRETS_SURFACE=codex-cloud
116
129
  BWS_ACCESS_TOKEN=<from the provider; an environment
117
130
  variable, not a task secret — setup and cache-resume
@@ -136,7 +149,7 @@ Checked when setup runs, not at 3am:
136
149
 
137
150
  - the environment exists and is bound to **this** repository as its default checkout;
138
151
  - the bootstrap credential resolves;
139
- - Lisa has been applied to the repository, so its skills are present in that checkout.
152
+ - either a checkout-local Lisa skill is present, or the project dependency install has made the pinned `@codyswann/lisa` package available under `node_modules`.
140
153
 
141
154
  Fail with a message naming what is missing. Never provision-and-hope.
142
155
 
@@ -23,13 +23,26 @@ if ! command -v node >/dev/null 2>&1; then
23
23
  exit 1
24
24
  fi
25
25
 
26
- # The skill ships under whichever agent directory this project uses. Search
27
- # rather than hardcode, so one entrypoint serves every supported harness.
26
+ # Where the skill lives depends on how this project's harness receives it, and
27
+ # the two delivery models differ in a way that matters here.
28
+ #
29
+ # OpenCode and Antigravity get skills written INTO the checkout by `lisa apply`,
30
+ # so a clone already carries them. Claude and Codex receive them as an installed
31
+ # plugin, which lives in the user's home directory and is emphatically NOT part
32
+ # of a clone. A fresh remote container is the second case every time: it clones
33
+ # the repository and has never run a plugin install.
34
+ #
35
+ # So the agent directories are searched first — they are the cheapest hit and
36
+ # need nothing installed — and the npm package is the fallback that makes the
37
+ # plugin-delivered harnesses work at all. Lisa is a dependency of every project
38
+ # it is applied to, so `node_modules` carries the same skill at the version that
39
+ # project pins, which is the version its setup should run.
28
40
  runner=""
29
41
  for candidate in \
30
42
  ".claude/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
31
43
  ".agents/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
32
- ".codex/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs"; do
44
+ ".codex/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
45
+ "node_modules/@codyswann/lisa/plugins/lisa/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs"; do
33
46
  if [ -f "$candidate" ]; then
34
47
  runner="$candidate"
35
48
  break
@@ -37,8 +50,19 @@ for candidate in \
37
50
  done
38
51
 
39
52
  if [ -z "$runner" ]; then
40
- echo "Cannot find the lisa-setup-remote-env skill in this checkout." >&2
41
- echo "Run 'lisa apply' so the skills are present, then re-run setup." >&2
53
+ echo "Cannot find the lisa-setup-remote-env skill." >&2
54
+ echo >&2
55
+ echo "Searched the agent skill directories and node_modules. On a remote" >&2
56
+ echo "container the usual cause is that dependencies have not been installed" >&2
57
+ echo "yet: Claude and Codex receive Lisa skills as an installed plugin, which" >&2
58
+ echo "is not part of a clone, so node_modules is the only copy present." >&2
59
+ echo >&2
60
+ echo "Install dependencies before this script runs. The environment's setup" >&2
61
+ echo "command should be the install and this script together, for example:" >&2
62
+ echo " bun install && bash scripts/lisa-remote-env/setup.sh" >&2
63
+ echo >&2
64
+ echo "If dependencies are installed, run 'lisa apply' so the skills are" >&2
65
+ echo "present, then re-run setup." >&2
42
66
  exit 1
43
67
  fi
44
68
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.317.4",
3
+ "version": "2.317.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.317.4",
3
+ "version": "2.317.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.317.4",
3
+ "version": "2.317.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.317.4",
3
+ "version": "2.317.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.317.4",
3
+ "version": "2.317.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.317.4",
3
+ "version": "2.317.6",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -10,17 +10,27 @@ Prepare a remote surface so a host project can execute there. Today that means *
10
10
 
11
11
  ## What lives where
12
12
 
13
- The remote environment's own configuration fields stay **two one-line calls into the repository**. Nothing is pasted into a vendor UI.
13
+ The remote environment's own configuration fields stay **one line into the repository, preceded by the project's dependency install**. Nothing else is pasted into a vendor UI.
14
14
 
15
15
  ```text
16
- setup: bash scripts/lisa-remote-env/setup.sh
17
- maintenance: bash scripts/lisa-remote-env/setup.sh
16
+ setup: <install> && bash scripts/lisa-remote-env/setup.sh
17
+ maintenance: <install> && bash scripts/lisa-remote-env/setup.sh
18
18
  ```
19
19
 
20
- They are the same script. A container may be built fresh or resumed from cache; every step is idempotent and version-aware, so running it twice is correct, and running it on resume is what picks up a rotated value, an edited note, or a changed version pin.
20
+ `<install>` is whatever the project already uses `bun install`, `npm ci`, `pnpm install`. Substitute it; do not invent one.
21
+
22
+ They are the same command. A container may be built fresh or resumed from cache; every step is idempotent and version-aware, so running it twice is correct, and running it on resume is what picks up a rotated value, an edited note, or a changed version pin.
21
23
 
22
24
  The complete logic is repository-owned so it is reviewed, versioned, tested, and reusable. A large inline installer in a settings field is none of those things.
23
25
 
26
+ ### Why the install has to come first
27
+
28
+ **A clone does not contain the skills on the harnesses that matter here.** OpenCode and Antigravity have them written into the checkout by `lisa apply`. Claude and Codex receive them as an *installed plugin*, which lives in the user's home directory — so a container that has just cloned the repository has never seen it.
29
+
30
+ `node_modules/@codyswann/lisa` is therefore the only copy present on a fresh container, and it is a good one: it is the version that project pins, which is the version its setup should run. The entrypoint searches the agent directories first and falls back to it.
31
+
32
+ Omitting the install does not degrade gracefully. The entrypoint exits before the toolchain, secrets, and hook phases have done anything, so the environment looks provisioned and fails on first dispatch.
33
+
24
34
  ## The three phases
25
35
 
26
36
  1. **Toolchain** — assert what must already be present, install what is not.
@@ -110,8 +120,11 @@ When emitting, produce exactly:
110
120
  ```text
111
121
  Environment name: <project> remote executor
112
122
  Repository: <org>/<repo> (must be the default checkout)
113
- Setup script: bash scripts/lisa-remote-env/setup.sh
114
- Maintenance: bash scripts/lisa-remote-env/setup.sh
123
+ Setup script: <install> && bash scripts/lisa-remote-env/setup.sh
124
+ Maintenance: <install> && bash scripts/lisa-remote-env/setup.sh
125
+ (<install> is the project's own: bun install, npm ci, ...
126
+ It must precede the script — on a fresh container
127
+ node_modules is the only copy of the skills present.)
115
128
  Environment vars: LISA_SECRETS_SURFACE=codex-cloud
116
129
  BWS_ACCESS_TOKEN=<from the provider; an environment
117
130
  variable, not a task secret — setup and cache-resume
@@ -136,7 +149,7 @@ Checked when setup runs, not at 3am:
136
149
 
137
150
  - the environment exists and is bound to **this** repository as its default checkout;
138
151
  - the bootstrap credential resolves;
139
- - Lisa has been applied to the repository, so its skills are present in that checkout.
152
+ - either a checkout-local Lisa skill is present, or the project dependency install has made the pinned `@codyswann/lisa` package available under `node_modules`.
140
153
 
141
154
  Fail with a message naming what is missing. Never provision-and-hope.
142
155
 
@@ -23,13 +23,26 @@ if ! command -v node >/dev/null 2>&1; then
23
23
  exit 1
24
24
  fi
25
25
 
26
- # The skill ships under whichever agent directory this project uses. Search
27
- # rather than hardcode, so one entrypoint serves every supported harness.
26
+ # Where the skill lives depends on how this project's harness receives it, and
27
+ # the two delivery models differ in a way that matters here.
28
+ #
29
+ # OpenCode and Antigravity get skills written INTO the checkout by `lisa apply`,
30
+ # so a clone already carries them. Claude and Codex receive them as an installed
31
+ # plugin, which lives in the user's home directory and is emphatically NOT part
32
+ # of a clone. A fresh remote container is the second case every time: it clones
33
+ # the repository and has never run a plugin install.
34
+ #
35
+ # So the agent directories are searched first — they are the cheapest hit and
36
+ # need nothing installed — and the npm package is the fallback that makes the
37
+ # plugin-delivered harnesses work at all. Lisa is a dependency of every project
38
+ # it is applied to, so `node_modules` carries the same skill at the version that
39
+ # project pins, which is the version its setup should run.
28
40
  runner=""
29
41
  for candidate in \
30
42
  ".claude/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
31
43
  ".agents/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
32
- ".codex/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs"; do
44
+ ".codex/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
45
+ "node_modules/@codyswann/lisa/plugins/lisa/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs"; do
33
46
  if [ -f "$candidate" ]; then
34
47
  runner="$candidate"
35
48
  break
@@ -37,8 +50,19 @@ for candidate in \
37
50
  done
38
51
 
39
52
  if [ -z "$runner" ]; then
40
- echo "Cannot find the lisa-setup-remote-env skill in this checkout." >&2
41
- echo "Run 'lisa apply' so the skills are present, then re-run setup." >&2
53
+ echo "Cannot find the lisa-setup-remote-env skill." >&2
54
+ echo >&2
55
+ echo "Searched the agent skill directories and node_modules. On a remote" >&2
56
+ echo "container the usual cause is that dependencies have not been installed" >&2
57
+ echo "yet: Claude and Codex receive Lisa skills as an installed plugin, which" >&2
58
+ echo "is not part of a clone, so node_modules is the only copy present." >&2
59
+ echo >&2
60
+ echo "Install dependencies before this script runs. The environment's setup" >&2
61
+ echo "command should be the install and this script together, for example:" >&2
62
+ echo " bun install && bash scripts/lisa-remote-env/setup.sh" >&2
63
+ echo >&2
64
+ echo "If dependencies are installed, run 'lisa apply' so the skills are" >&2
65
+ echo "present, then re-run setup." >&2
42
66
  exit 1
43
67
  fi
44
68
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.317.4",
3
+ "version": "2.317.6",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"