@codyswann/lisa 2.317.3 → 2.317.5

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 (83) hide show
  1. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  2. package/dist/core/upstream-evidence-manifest.js +6 -5
  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-secrets-access/SKILL.md +7 -0
  8. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-aws/SKILL.md +32 -7
  9. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/SKILL.md +20 -7
  10. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/assets/setup.sh +29 -5
  11. package/plugins/lisa/scripts/remote-agent-aws-setup.sh +8 -2
  12. package/plugins/lisa/skills/lisa-secrets-access/SKILL.md +7 -0
  13. package/plugins/lisa/skills/lisa-setup-remote-aws/SKILL.md +32 -7
  14. package/plugins/lisa/skills/lisa-setup-remote-env/SKILL.md +20 -7
  15. package/plugins/lisa/skills/lisa-setup-remote-env/assets/setup.sh +29 -5
  16. package/plugins/lisa-agy/plugin.json +1 -1
  17. package/plugins/lisa-agy/scripts/remote-agent-aws-setup.sh +8 -2
  18. package/plugins/lisa-agy/skills/lisa-secrets-access/SKILL.md +7 -0
  19. package/plugins/lisa-agy/skills/lisa-setup-remote-aws/SKILL.md +32 -7
  20. package/plugins/lisa-agy/skills/lisa-setup-remote-env/SKILL.md +20 -7
  21. package/plugins/lisa-agy/skills/lisa-setup-remote-env/assets/setup.sh +29 -5
  22. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  23. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  24. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  25. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  26. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-copilot/scripts/remote-agent-aws-setup.sh +8 -2
  29. package/plugins/lisa-copilot/skills/lisa-secrets-access/SKILL.md +7 -0
  30. package/plugins/lisa-copilot/skills/lisa-setup-remote-aws/SKILL.md +32 -7
  31. package/plugins/lisa-copilot/skills/lisa-setup-remote-env/SKILL.md +20 -7
  32. package/plugins/lisa-copilot/skills/lisa-setup-remote-env/assets/setup.sh +29 -5
  33. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-cursor/scripts/remote-agent-aws-setup.sh +8 -2
  35. package/plugins/lisa-cursor/skills/lisa-secrets-access/SKILL.md +7 -0
  36. package/plugins/lisa-cursor/skills/lisa-setup-remote-aws/SKILL.md +32 -7
  37. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/SKILL.md +20 -7
  38. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/assets/setup.sh +29 -5
  39. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  41. package/plugins/lisa-expo-agy/plugin.json +1 -1
  42. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  46. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  47. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  51. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  52. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  56. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  57. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  61. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  62. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  66. package/plugins/lisa-rails-agy/plugin.json +1 -1
  67. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  69. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  71. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  72. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  74. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  76. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  77. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  79. package/plugins/src/base/scripts/remote-agent-aws-setup.sh +8 -2
  80. package/plugins/src/base/skills/lisa-secrets-access/SKILL.md +7 -0
  81. package/plugins/src/base/skills/lisa-setup-remote-aws/SKILL.md +32 -7
  82. package/plugins/src/base/skills/lisa-setup-remote-env/SKILL.md +20 -7
  83. package/plugins/src/base/skills/lisa-setup-remote-env/assets/setup.sh +29 -5
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.317.3",
3
+ "version": "2.317.5",
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.3",
3
+ "version": "2.317.5",
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.3",
3
+ "version": "2.317.5",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -3,8 +3,14 @@
3
3
  # source copied into every generated Lisa agent plugin.
4
4
  #
5
5
  # Required secret:
6
- # LISA_AWS_BOOTSTRAP_JSON Complete SecretString emitted by cdkstarter's
7
- # remote-agent IAM kit.
6
+ # LISA_AWS_BOOTSTRAP_JSON The complete remote-agent bootstrap bundle, as one
7
+ # JSON value. cdkstarter's IAM kit emits it, but this
8
+ # script neither knows nor cares which store it came
9
+ # from — resolve it through lisa-secrets-access like
10
+ # any other secret. Note that a project whose
11
+ # provider is AWS Secrets Manager cannot keep it
12
+ # there: reading it would need the very credential it
13
+ # contains.
8
14
  # Optional plain variables:
9
15
  # LISA_REMOTE_AGENT claude | codex | cursor | copilot | agy | opencode
10
16
  # LISA_AWS_DEFAULT_PROFILE Defaults to dev, then the first available profile.
@@ -198,6 +198,13 @@ Values never enter that process, so its output cannot leak one even if logged.
198
198
  | `aws` | `aws secretsmanager get-secret-value --secret-id <name>` | not implemented |
199
199
  | `vault` | `vault kv get -field=<name> <path>` | not implemented |
200
200
 
201
+ **A provider cannot hold its own bootstrap.** With `provider: "aws"`, reading any
202
+ secret needs AWS credentials — so the AWS bootstrap bundle
203
+ (`LISA_AWS_BOOTSTRAP_JSON`, see `lisa-setup-remote-aws`) cannot live there:
204
+ resolving it would require the very credential it contains. Keep that one in a
205
+ different provider. The same applies to any provider whose own access key is a
206
+ secret you would otherwise store inside it.
207
+
201
208
  Unimplemented providers fail with a message naming where to add them, rather than failing obscurely. Do not claim support that does not exist.
202
209
 
203
210
  Cache **in-process only**. Never write a resolved value to disk except through the materialization contract above.
@@ -30,16 +30,41 @@ Install the vendor-neutral AWS bootstrap into the current repository.
30
30
  `.github/workflows/copilot-setup-steps.yml`; and it always writes
31
31
  `docs/remote-agent-aws.md`.
32
32
  4. Run `bash -n scripts/remote-agent-aws-setup.sh`.
33
- 5. Never write or request the actual bootstrap SecretString in repository
34
- files. Tell the operator to retrieve the `remote-agent-credentials` secret
35
- from the shared AWS account and paste its complete SecretString into the
36
- platform secret named `LISA_AWS_BOOTSTRAP_JSON`. The default cdkstarter
37
- secret name is `remote-agent-credentials`; downstream infrastructure may
38
- configure a different name. Pass that name with `--secret-name` so the
39
- generated runbook contains the exact retrieval command.
33
+ 5. Never write or request the actual bootstrap bundle in repository files. Tell
34
+ the operator where to obtain it and where to put it — see **Where the bundle
35
+ lives** below. Pass `--secret-name` when the source names it something other
36
+ than `remote-agent-credentials`, so the generated runbook contains the exact
37
+ retrieval command.
40
38
  6. Report the external step that remains: configure that one secret in the
41
39
  remote environment and launch a smoke session.
42
40
 
41
+ ## Where the bundle lives
42
+
43
+ `LISA_AWS_BOOTSTRAP_JSON` is **just another secret**, and it belongs wherever
44
+ the project keeps its secrets — resolved through `lisa-secrets-access` like
45
+ everything else. It is not tied to any one store.
46
+
47
+ Whoever provisions the IAM user emits the bundle somewhere. `cdkstarter` writes
48
+ it to AWS Secrets Manager as `remote-agent-credentials`, but that is where it is
49
+ *emitted*, not where it must *live*. Copy it once into the project's configured
50
+ provider and read it from there.
51
+
52
+ **Do not keep it in two stores.** A bundle sitting in Secrets Manager *and* in
53
+ the platform's secret store is two live copies of one credential: rotate the
54
+ IAM key and whichever copy you forget keeps authenticating until it doesn't,
55
+ with nothing to say which is current. That is the drift the single-store rule in
56
+ `lisa-secrets-access` exists to prevent, and this credential is not exempt.
57
+
58
+ **One provider cannot serve this particular secret.** If `secrets.provider` is
59
+ `aws`, reading the bundle requires AWS credentials — and the bundle *is* the AWS
60
+ credential. Anything else works: Bitwarden, 1Password, Doppler, Vault, or a
61
+ platform secret store. Pick the one that is not the thing being bootstrapped.
62
+
63
+ On a surface that materializes (see `lisa-secrets-access`), the bundle arrives
64
+ in `secrets.env` with everything else, so the project hook can run this setup
65
+ script after materialization with no extra plumbing. On a surface that reads
66
+ through live, resolve it at the point of use.
67
+
43
68
  ## Contract
44
69
 
45
70
  A future coding agent is supported without an AWS change when its remote
@@ -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.3",
3
+ "version": "2.317.5",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -3,8 +3,14 @@
3
3
  # source copied into every generated Lisa agent plugin.
4
4
  #
5
5
  # Required secret:
6
- # LISA_AWS_BOOTSTRAP_JSON Complete SecretString emitted by cdkstarter's
7
- # remote-agent IAM kit.
6
+ # LISA_AWS_BOOTSTRAP_JSON The complete remote-agent bootstrap bundle, as one
7
+ # JSON value. cdkstarter's IAM kit emits it, but this
8
+ # script neither knows nor cares which store it came
9
+ # from — resolve it through lisa-secrets-access like
10
+ # any other secret. Note that a project whose
11
+ # provider is AWS Secrets Manager cannot keep it
12
+ # there: reading it would need the very credential it
13
+ # contains.
8
14
  # Optional plain variables:
9
15
  # LISA_REMOTE_AGENT claude | codex | cursor | copilot | agy | opencode
10
16
  # LISA_AWS_DEFAULT_PROFILE Defaults to dev, then the first available profile.
@@ -198,6 +198,13 @@ Values never enter that process, so its output cannot leak one even if logged.
198
198
  | `aws` | `aws secretsmanager get-secret-value --secret-id <name>` | not implemented |
199
199
  | `vault` | `vault kv get -field=<name> <path>` | not implemented |
200
200
 
201
+ **A provider cannot hold its own bootstrap.** With `provider: "aws"`, reading any
202
+ secret needs AWS credentials — so the AWS bootstrap bundle
203
+ (`LISA_AWS_BOOTSTRAP_JSON`, see `lisa-setup-remote-aws`) cannot live there:
204
+ resolving it would require the very credential it contains. Keep that one in a
205
+ different provider. The same applies to any provider whose own access key is a
206
+ secret you would otherwise store inside it.
207
+
201
208
  Unimplemented providers fail with a message naming where to add them, rather than failing obscurely. Do not claim support that does not exist.
202
209
 
203
210
  Cache **in-process only**. Never write a resolved value to disk except through the materialization contract above.
@@ -30,16 +30,41 @@ Install the vendor-neutral AWS bootstrap into the current repository.
30
30
  `.github/workflows/copilot-setup-steps.yml`; and it always writes
31
31
  `docs/remote-agent-aws.md`.
32
32
  4. Run `bash -n scripts/remote-agent-aws-setup.sh`.
33
- 5. Never write or request the actual bootstrap SecretString in repository
34
- files. Tell the operator to retrieve the `remote-agent-credentials` secret
35
- from the shared AWS account and paste its complete SecretString into the
36
- platform secret named `LISA_AWS_BOOTSTRAP_JSON`. The default cdkstarter
37
- secret name is `remote-agent-credentials`; downstream infrastructure may
38
- configure a different name. Pass that name with `--secret-name` so the
39
- generated runbook contains the exact retrieval command.
33
+ 5. Never write or request the actual bootstrap bundle in repository files. Tell
34
+ the operator where to obtain it and where to put it — see **Where the bundle
35
+ lives** below. Pass `--secret-name` when the source names it something other
36
+ than `remote-agent-credentials`, so the generated runbook contains the exact
37
+ retrieval command.
40
38
  6. Report the external step that remains: configure that one secret in the
41
39
  remote environment and launch a smoke session.
42
40
 
41
+ ## Where the bundle lives
42
+
43
+ `LISA_AWS_BOOTSTRAP_JSON` is **just another secret**, and it belongs wherever
44
+ the project keeps its secrets — resolved through `lisa-secrets-access` like
45
+ everything else. It is not tied to any one store.
46
+
47
+ Whoever provisions the IAM user emits the bundle somewhere. `cdkstarter` writes
48
+ it to AWS Secrets Manager as `remote-agent-credentials`, but that is where it is
49
+ *emitted*, not where it must *live*. Copy it once into the project's configured
50
+ provider and read it from there.
51
+
52
+ **Do not keep it in two stores.** A bundle sitting in Secrets Manager *and* in
53
+ the platform's secret store is two live copies of one credential: rotate the
54
+ IAM key and whichever copy you forget keeps authenticating until it doesn't,
55
+ with nothing to say which is current. That is the drift the single-store rule in
56
+ `lisa-secrets-access` exists to prevent, and this credential is not exempt.
57
+
58
+ **One provider cannot serve this particular secret.** If `secrets.provider` is
59
+ `aws`, reading the bundle requires AWS credentials — and the bundle *is* the AWS
60
+ credential. Anything else works: Bitwarden, 1Password, Doppler, Vault, or a
61
+ platform secret store. Pick the one that is not the thing being bootstrapped.
62
+
63
+ On a surface that materializes (see `lisa-secrets-access`), the bundle arrives
64
+ in `secrets.env` with everything else, so the project hook can run this setup
65
+ script after materialization with no extra plumbing. On a surface that reads
66
+ through live, resolve it at the point of use.
67
+
43
68
  ## Contract
44
69
 
45
70
  A future coding agent is supported without an AWS change when its remote
@@ -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-expo",
3
- "version": "2.317.3",
3
+ "version": "2.317.5",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.317.3",
3
+ "version": "2.317.5",
4
4
  "description": "Expo and React Native-specific skills, agents, rules, and MCP servers.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.317.3",
3
+ "version": "2.317.5",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.317.3",
3
+ "version": "2.317.5",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.317.3",
3
+ "version": "2.317.5",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.317.3",
3
+ "version": "2.317.5",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.317.3",
3
+ "version": "2.317.5",
4
4
  "description": "Harper/Fabric-specific Lisa rules for TypeScript component apps.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.317.3",
3
+ "version": "2.317.5",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.317.3",
3
+ "version": "2.317.5",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.317.3",
3
+ "version": "2.317.5",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.317.3",
3
+ "version": "2.317.5",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.317.3",
3
+ "version": "2.317.5",
4
4
  "description": "NestJS-specific skills and migration write-protection hooks.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.317.3",
3
+ "version": "2.317.5",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.317.3",
3
+ "version": "2.317.5",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.317.3",
3
+ "version": "2.317.5",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.317.3",
3
+ "version": "2.317.5",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.317.3",
3
+ "version": "2.317.5",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.317.3",
3
+ "version": "2.317.5",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.317.3",
3
+ "version": "2.317.5",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.317.3",
3
+ "version": "2.317.5",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.317.3",
3
+ "version": "2.317.5",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.317.3",
3
+ "version": "2.317.5",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"