@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.
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +4 -3
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/SKILL.md +20 -7
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/assets/setup.sh +29 -5
- package/plugins/lisa/hooks/enforce-team-first.sh +17 -3
- package/plugins/lisa/skills/lisa-setup-remote-env/SKILL.md +20 -7
- package/plugins/lisa/skills/lisa-setup-remote-env/assets/setup.sh +29 -5
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-setup-remote-env/SKILL.md +20 -7
- package/plugins/lisa-agy/skills/lisa-setup-remote-env/assets/setup.sh +29 -5
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/skills/lisa-setup-remote-env/SKILL.md +20 -7
- package/plugins/lisa-copilot/skills/lisa-setup-remote-env/assets/setup.sh +29 -5
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/skills/lisa-setup-remote-env/SKILL.md +20 -7
- package/plugins/lisa-cursor/skills/lisa-setup-remote-env/assets/setup.sh +29 -5
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/hooks/enforce-team-first.sh +17 -3
- package/plugins/src/base/skills/lisa-setup-remote-env/SKILL.md +20 -7
- 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.
|
|
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": {
|
|
@@ -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 **
|
|
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
|
-
|
|
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
|
|
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
|
-
#
|
|
27
|
-
#
|
|
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"
|
|
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
|
|
41
|
-
echo
|
|
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
|
-
|
|
204
|
-
|
|
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 **
|
|
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
|
-
|
|
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
|
|
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
|
-
#
|
|
27
|
-
#
|
|
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"
|
|
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
|
|
41
|
-
echo
|
|
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
|
|
|
@@ -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 **
|
|
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
|
-
|
|
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
|
|
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
|
-
#
|
|
27
|
-
#
|
|
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"
|
|
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
|
|
41
|
-
echo
|
|
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
|
|
|
@@ -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 **
|
|
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
|
-
|
|
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
|
|
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
|
-
#
|
|
27
|
-
#
|
|
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"
|
|
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
|
|
41
|
-
echo
|
|
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
|
|