@codyswann/lisa 4.26.5 → 4.27.1
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/nightly-e2e-guard-behavior-certificate.js +2 -2
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +10 -6
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/package.json +3 -3
- 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-analyze-claude-remote/SKILL.md +2 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-implement/SKILL.md +10 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-access/SKILL.md +39 -4
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-aws/SKILL.md +33 -2
- package/plugins/lisa/scripts/install-remote-agent-aws.mjs +52 -6
- package/plugins/lisa/scripts/remote-agent-aws-setup.sh +319 -15
- package/plugins/lisa/skills/lisa-analyze-claude-remote/SKILL.md +2 -2
- package/plugins/lisa/skills/lisa-implement/SKILL.md +10 -0
- package/plugins/lisa/skills/lisa-linear-access/SKILL.md +39 -4
- package/plugins/lisa/skills/lisa-setup-remote-aws/SKILL.md +33 -2
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/scripts/install-remote-agent-aws.mjs +52 -6
- package/plugins/lisa-agy/scripts/remote-agent-aws-setup.sh +319 -15
- package/plugins/lisa-agy/skills/lisa-analyze-claude-remote/SKILL.md +2 -2
- package/plugins/lisa-agy/skills/lisa-implement/SKILL.md +10 -0
- package/plugins/lisa-agy/skills/lisa-linear-access/SKILL.md +39 -4
- package/plugins/lisa-agy/skills/lisa-setup-remote-aws/SKILL.md +33 -2
- 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/scripts/install-remote-agent-aws.mjs +52 -6
- package/plugins/lisa-copilot/scripts/remote-agent-aws-setup.sh +319 -15
- package/plugins/lisa-copilot/skills/lisa-analyze-claude-remote/SKILL.md +2 -2
- package/plugins/lisa-copilot/skills/lisa-implement/SKILL.md +10 -0
- package/plugins/lisa-copilot/skills/lisa-linear-access/SKILL.md +39 -4
- package/plugins/lisa-copilot/skills/lisa-setup-remote-aws/SKILL.md +33 -2
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/scripts/install-remote-agent-aws.mjs +52 -6
- package/plugins/lisa-cursor/scripts/remote-agent-aws-setup.sh +319 -15
- package/plugins/lisa-cursor/skills/lisa-analyze-claude-remote/SKILL.md +2 -2
- package/plugins/lisa-cursor/skills/lisa-implement/SKILL.md +10 -0
- package/plugins/lisa-cursor/skills/lisa-linear-access/SKILL.md +39 -4
- package/plugins/lisa-cursor/skills/lisa-setup-remote-aws/SKILL.md +33 -2
- 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/scripts/install-remote-agent-aws.mjs +52 -6
- package/plugins/src/base/scripts/remote-agent-aws-setup.sh +319 -15
- package/plugins/src/base/skills/lisa-analyze-claude-remote/SKILL.md +2 -2
- package/plugins/src/base/skills/lisa-implement/SKILL.md +10 -0
- package/plugins/src/base/skills/lisa-linear-access/SKILL.md +39 -4
- package/plugins/src/base/skills/lisa-setup-remote-aws/SKILL.md +33 -2
|
@@ -346,6 +346,16 @@ Before shutting down the team, execute the Verify flow:
|
|
|
346
346
|
4. Record Implement usage on the originating work artifact via `lisa-usage-accounting` so the work item (or other implementation-owned artifact) gains a direct `lisa-implement` usage entry in the canonical `## Lisa Usage` section. If the parent / child graph is already known, prefer `record_and_rollup` so ancestor totals refresh in the same write; otherwise still write the direct entry, and if runtime usage is unavailable, use `source: unavailable` with nullable token/cost fields instead of skipping the row.
|
|
347
347
|
5. Commit ALL outstanding changes in logical batches on the branch (minus sensitive data/information) — not just changes made by the agent team. This includes pre-existing uncommitted changes that were on the branch before the plan started. Do NOT filter commits to only "task-related" files. If it shows up in git status, it gets committed (unless it contains secrets).
|
|
348
348
|
6. Push the changes - if any pre-push hook blocks you, create a task for the agent team to fix the error/problem whether it was pre-existing or not
|
|
349
|
+
6a. **Review the branch locally BEFORE opening the pull request, every time.** Invoke `lisa-review-local` over the branch diff, triage what it finds under the `convergent-review` rule (same contract as any other reviewer — fix what is valid, refute what is not, on the record), and commit the fixes. Only then proceed to step 7.
|
|
350
|
+
|
|
351
|
+
**Unconditional, not a fallback.** Do not gate this on whether a third-party reviewer is available, rate limited, or skipped. Measured on this repository, 47 of the last 60 merged pull requests carried a review context reporting `SUCCESS` while having read nothing — 29 rate limited, 16 skipped because the vendor does not auto-review public repositories, one skipped on size. A rule that fires only when the vendor is absent has to detect four distinct vacuity strings correctly, forever, and still leaves the vendor being *present but wrong* unguarded. Reviewing always needs no detection at all and makes the third-party review **additive**: its findings still arrive at step 8 and are handled there exactly as today.
|
|
352
|
+
|
|
353
|
+
**Before the pull request, not after it.** Auto-merge is armed at submit time, so the pull request can merge the moment CI goes green — a review that starts after step 7 is racing a latch that is already set. Running here has nothing to race.
|
|
354
|
+
|
|
355
|
+
**A local review is a weaker claim than an independent one, and the report must say so.** The agents reviewing the branch are the same team that wrote it. Record the outcome as *self-reviewed* — never as *reviewed* — and never describe it as satisfying the third-party review check, which is ruleset-required and can only be posted by that vendor's app. Collapsing the two would be the same vacuous-success failure this step exists to remove, one level up.
|
|
356
|
+
|
|
357
|
+
**If no subagent delegation is available in this runtime**, say so explicitly in the completion summary and proceed — but record that no local review was possible. "Could not review" must never be reported as "reviewed and found nothing"; an unavailable check is not a passing one.
|
|
358
|
+
|
|
349
359
|
7. Open a pull request with auto-merge on via `lisa-git-submit-pr`, targeting the **base branch resolved from the ticket's environment** (`target_branch=<base>`, per the branch step above), and including the mandatory work-item ref so the PR can be linked natively to the source issue.
|
|
350
360
|
7a. Confirm two-way linkage before treating PR submission as complete: the PR body/title/branch must reference the work item, and the work item must have either a verified native PR link or the single managed `[lisa-pr-link]` comment. Establish that comment with `node scripts/lisa-work-item.mjs backlink --ref <work_item_ref> --pr-url <url>` rather than posting it by hand — it is idempotent, and it is the same file that enforces the check, so producer and consumer cannot drift.
|
|
351
361
|
8. PR Watch Loop: Drive the PR to merge via the `drive-pr-to-merge` skill — the single source of truth for clearing every blocker (auto-merge with direct-merge fallback, `BEHIND` re-sync, conflict resolution, failing-check fixes, human + bot review-comment handling with thread resolution, stale `CHANGES_REQUESTED` dismissal, and post-merge ancestry verification). `git-submit-pr` already invokes it; if you reach this step with a PR already open, invoke `drive-pr-to-merge` directly with the PR number. For a large review backlog you may fan the code-fix work out to the agent team, but `drive-pr-to-merge` owns the loop and the terminal conditions — do not re-implement them.
|
|
@@ -82,9 +82,43 @@ All GraphQL calls use:
|
|
|
82
82
|
# or AWS has no path to the key at all — the ladder stopped at rung one, which
|
|
83
83
|
# is also what left `/lisa:setup:linear` reading an OS keychain directly with
|
|
84
84
|
# nowhere to migrate to. Mirrors `atlassian-access` and `notion-access`.
|
|
85
|
-
read_linear_key() {
|
|
85
|
+
read_linear_key() { # $1=workspace slug; defaults to $WORKSPACE read from config
|
|
86
86
|
[ -n "${LINEAR_API_KEY:-}" ] && { echo "$LINEAR_API_KEY"; return; }
|
|
87
87
|
|
|
88
|
+
# Per-workspace rung, matching `atlassian-access` and `notion-access` — and
|
|
89
|
+
# matching what `setup-linear` has always told the reader to export. This
|
|
90
|
+
# copy lacked it, so a key set the documented way validated during setup (the
|
|
91
|
+
# setup skill reads it) and was then ignored by every real Linear call, which
|
|
92
|
+
# silently fell through to whatever other credential it found. Nothing
|
|
93
|
+
# errored; the operation just ran as a different identity. The rung is also
|
|
94
|
+
# load-bearing headlessly: `analyze-claude-remote` reports Linear's env as
|
|
95
|
+
# `LINEAR_API_KEY` "or per-account `LINEAR_API_KEY_<ws-slug>`", and
|
|
96
|
+
# `generate-claude-remote-build-script` emits that suffixed name into cloud
|
|
97
|
+
# routine env templates — so a routine provisioned from those skills had no
|
|
98
|
+
# reachable key at all.
|
|
99
|
+
#
|
|
100
|
+
# An unset variable changes nothing: an empty workspace skips the rung
|
|
101
|
+
# entirely and the ladder below runs exactly as it did before.
|
|
102
|
+
local ws="${1:-${WORKSPACE:-}}"
|
|
103
|
+
if [ -n "$ws" ]; then
|
|
104
|
+
local slug; slug=$(echo "$ws" | tr '[:upper:]-' '[:lower:]_')
|
|
105
|
+
# Constrain the slug before it reaches `${!varname}`. Indirect expansion
|
|
106
|
+
# evaluates an array subscript, so a workspace carrying `[$(...)]` would
|
|
107
|
+
# RUN that command here — and `tr` above only folds case and dashes, it
|
|
108
|
+
# strips nothing. The slug's source is `.lisa.config.json`, which is
|
|
109
|
+
# repository-controlled input: exactly what this ladder already refuses to
|
|
110
|
+
# trust when it picks resolvers. A real workspace slug is lowercase
|
|
111
|
+
# alphanumerics and underscores, so anything else is not a slug we should
|
|
112
|
+
# be expanding — skip the rung and fall through rather than guessing.
|
|
113
|
+
case "$slug" in
|
|
114
|
+
""|*[!a-z0-9_]*) ;;
|
|
115
|
+
*)
|
|
116
|
+
local varname="LINEAR_API_KEY_${slug}"
|
|
117
|
+
[ -n "${!varname:-}" ] && { echo "${!varname}"; return; }
|
|
118
|
+
;;
|
|
119
|
+
esac
|
|
120
|
+
fi
|
|
121
|
+
|
|
88
122
|
# The ladder is ordered across trusted machine-managed substrates and ends at
|
|
89
123
|
# the installed package. Checkout-local paths are deliberately absent: a
|
|
90
124
|
# familiar generated destination is still repository-controlled executable
|
|
@@ -132,9 +166,10 @@ linear_graphql() {
|
|
|
132
166
|
local query="$1"
|
|
133
167
|
local variables="${2:-{}}"
|
|
134
168
|
local key
|
|
135
|
-
key=$(read_linear_key) || {
|
|
136
|
-
echo "Error: no Linear API key. Set LINEAR_API_KEY
|
|
137
|
-
echo "LINEAR_API_KEY in this
|
|
169
|
+
key=$(read_linear_key "${WORKSPACE:-}") || {
|
|
170
|
+
echo "Error: no Linear API key. Set LINEAR_API_KEY (or the per-workspace" >&2
|
|
171
|
+
echo "LINEAR_API_KEY_<slug>), or store it as LINEAR_API_KEY in this" >&2
|
|
172
|
+
echo "project's secrets provider." >&2
|
|
138
173
|
return 1
|
|
139
174
|
}
|
|
140
175
|
jq -n --arg query "$query" --argjson variables "$variables" \
|
|
@@ -30,14 +30,45 @@ 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.
|
|
33
|
+
5. Confirm the operator knows which project component the profiles will carry.
|
|
34
|
+
The script resolves it from `LISA_AWS_PROFILE_NAMESPACE`, then the bundle's
|
|
35
|
+
`namespace`, then `<owner>-<repository>` from the git origin remote, and
|
|
36
|
+
refuses to write anything when none resolves. Set the variable explicitly
|
|
37
|
+
whenever the setup hook runs outside a checkout.
|
|
38
|
+
6. Never write or request the actual bootstrap bundle in repository files. Tell
|
|
34
39
|
the operator where to obtain it and where to put it — see **Where the bundle
|
|
35
40
|
lives** below. Pass `--secret-name` when the source names it something other
|
|
36
41
|
than `remote-agent-credentials`, so the generated runbook contains the exact
|
|
37
42
|
retrieval command.
|
|
38
|
-
|
|
43
|
+
7. Report the external step that remains: configure that one secret in the
|
|
39
44
|
remote environment and launch a smoke session.
|
|
40
45
|
|
|
46
|
+
## Profile naming and readiness
|
|
47
|
+
|
|
48
|
+
Every profile the script writes is scoped `<project>-agent-<stage>`, and the
|
|
49
|
+
private source profile is `<project>-agent-bootstrap`. Bare stage names state a
|
|
50
|
+
stage but not an owner, so on a workstation carrying more than one organisation
|
|
51
|
+
two bundles declaring the same stages overwrite each other in the shared
|
|
52
|
+
`~/.aws/config` — silently, because nothing about the surviving profile is
|
|
53
|
+
malformed. The name is the only place the owner can be recorded.
|
|
54
|
+
|
|
55
|
+
`default` cannot be namespaced. The script claims it only when nothing else
|
|
56
|
+
owns it, and otherwise stops and names the current owner;
|
|
57
|
+
`LISA_AWS_CLAIM_DEFAULT_PROFILE=1` takes it over deliberately.
|
|
58
|
+
|
|
59
|
+
Readiness is an account check, not a liveness check. `sts:GetCallerIdentity`
|
|
60
|
+
succeeding proves the credentials work, not that they reached the intended
|
|
61
|
+
account — a check that ignores the returned value passes on any credential that
|
|
62
|
+
authenticates anywhere. The script compares the returned account id against the
|
|
63
|
+
account named in the role ARN it configured and refuses to report ready on a
|
|
64
|
+
mismatch, quoting both. Do not substitute a hand-run `get-caller-identity` for
|
|
65
|
+
the script's own exit status.
|
|
66
|
+
|
|
67
|
+
Workstations bootstrapped under the previous unnamespaced convention keep their
|
|
68
|
+
old profiles. They are reported by name on every run and removed only when
|
|
69
|
+
`LISA_AWS_PRUNE_LEGACY_PROFILES=1` is passed, so the migration is explicit in
|
|
70
|
+
both directions.
|
|
71
|
+
|
|
41
72
|
## Where the bundle lives
|
|
42
73
|
|
|
43
74
|
`LISA_AWS_BOOTSTRAP_JSON` is **just another secret**, and it belongs wherever
|
|
@@ -313,14 +313,32 @@ Generated for: \`${platform}\`.
|
|
|
313
313
|
|
|
314
314
|
## Implementation
|
|
315
315
|
|
|
316
|
-
|
|
317
|
-
|
|
316
|
+
Profiles are named \`<project>-agent-<stage>\`, not bare \`dev\` or
|
|
317
|
+
\`production\`. The bundle supplies the stage; the project component comes from
|
|
318
|
+
\`LISA_AWS_PROFILE_NAMESPACE\`, then the bundle's \`namespace\`, then
|
|
319
|
+
\`<owner>-<repository>\` from this checkout's git origin. Select an account
|
|
320
|
+
explicitly, for example:
|
|
318
321
|
|
|
319
322
|
\`\`\`bash
|
|
320
|
-
aws --profile staging sts get-caller-identity
|
|
321
|
-
aws --profile production cloudformation describe-stacks
|
|
323
|
+
aws --profile <project>-agent-staging sts get-caller-identity
|
|
324
|
+
aws --profile <project>-agent-production cloudformation describe-stacks
|
|
322
325
|
\`\`\`
|
|
323
326
|
|
|
327
|
+
The setup line prints the exact names it wrote; use those.
|
|
328
|
+
|
|
329
|
+
A bare stage name states a stage but not an owner. Two organisations' bundles
|
|
330
|
+
declaring the same stages write the same names into the same shared
|
|
331
|
+
\`~/.aws/config\`, the last bootstrap silently wins, and every later command
|
|
332
|
+
runs in the other tenant's account while reporting success. Nothing about the
|
|
333
|
+
resulting profile is malformed, so no check on the profile can catch it — only
|
|
334
|
+
a name carrying the owner prevents it.
|
|
335
|
+
|
|
336
|
+
\`default\` is the one name that cannot be namespaced. The setup script writes
|
|
337
|
+
it for this project only when nothing else already owns it; if another Lisa
|
|
338
|
+
project or the operator's own configuration holds it, the script stops and says
|
|
339
|
+
so rather than repointing every unqualified \`aws\` command. Pass
|
|
340
|
+
\`LISA_AWS_CLAIM_DEFAULT_PROFILE=1\` to take it over deliberately.
|
|
341
|
+
|
|
324
342
|
Production and shared profiles are observer-only. Production repair remains a
|
|
325
343
|
human-driven local-workstation operation.
|
|
326
344
|
|
|
@@ -340,8 +358,36 @@ this project requires a named source profile to read the emission; \`shared\` is
|
|
|
340
358
|
not an implicit requirement.
|
|
341
359
|
|
|
342
360
|
Store that exact output as the masked secret \`LISA_AWS_BOOTSTRAP_JSON\` on each
|
|
343
|
-
remote-agent platform
|
|
344
|
-
|
|
361
|
+
remote-agent platform, then run the setup command.
|
|
362
|
+
|
|
363
|
+
## Readiness
|
|
364
|
+
|
|
365
|
+
\`sts:GetCallerIdentity\` succeeding proves only that the credentials work. It
|
|
366
|
+
does not prove they reached the intended account, and a check that never looks
|
|
367
|
+
at what the call returned passes on any credential that authenticates —
|
|
368
|
+
including one that authenticates into somebody else's account.
|
|
369
|
+
|
|
370
|
+
The setup script therefore compares the returned account id against the account
|
|
371
|
+
named in the role ARN it just configured, and refuses to report ready on a
|
|
372
|
+
mismatch, quoting both ids. A bundle may also declare \`expectedAccountId\` per
|
|
373
|
+
stage; a declared id that disagrees with its own role ARN fails before anything
|
|
374
|
+
is written. \`LISA_AWS_EXPECTED_ACCOUNT_ID\` states the same expectation from
|
|
375
|
+
outside the bundle, and \`LISA_AWS_VERIFY_ALL_PROFILES=1\` proves every stage
|
|
376
|
+
rather than only the default.
|
|
377
|
+
|
|
378
|
+
Treat the setup command's own exit status as the readiness gate. Do not
|
|
379
|
+
substitute a hand-run \`aws sts get-caller-identity\`: it answers "do these
|
|
380
|
+
credentials work", which is not the question.
|
|
381
|
+
|
|
382
|
+
## Migration
|
|
383
|
+
|
|
384
|
+
Workstations bootstrapped before profiles were namespaced still carry the old
|
|
385
|
+
bare names. The setup script detects them — by the retired
|
|
386
|
+
\`lisa-remote-agent-bootstrap\` source profile, so an operator's own \`dev\` is
|
|
387
|
+
never mistaken for one of ours — and names them on stderr on every run. They are
|
|
388
|
+
left in place, because deleting a profile somebody may still be using is its own
|
|
389
|
+
silent surprise. Re-run with \`LISA_AWS_PRUNE_LEGACY_PROFILES=1\` to delete the
|
|
390
|
+
ones Lisa wrote; it reports exactly what it removed.
|
|
345
391
|
|
|
346
392
|
## Notes
|
|
347
393
|
|