@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.
Files changed (89) hide show
  1. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  2. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  3. package/dist/core/upstream-evidence-manifest.js +10 -6
  4. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  5. package/package.json +3 -3
  6. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  7. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  8. package/plugins/lisa/.codex-plugin/skills/lisa-analyze-claude-remote/SKILL.md +2 -2
  9. package/plugins/lisa/.codex-plugin/skills/lisa-implement/SKILL.md +10 -0
  10. package/plugins/lisa/.codex-plugin/skills/lisa-linear-access/SKILL.md +39 -4
  11. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-aws/SKILL.md +33 -2
  12. package/plugins/lisa/scripts/install-remote-agent-aws.mjs +52 -6
  13. package/plugins/lisa/scripts/remote-agent-aws-setup.sh +319 -15
  14. package/plugins/lisa/skills/lisa-analyze-claude-remote/SKILL.md +2 -2
  15. package/plugins/lisa/skills/lisa-implement/SKILL.md +10 -0
  16. package/plugins/lisa/skills/lisa-linear-access/SKILL.md +39 -4
  17. package/plugins/lisa/skills/lisa-setup-remote-aws/SKILL.md +33 -2
  18. package/plugins/lisa-agy/plugin.json +1 -1
  19. package/plugins/lisa-agy/scripts/install-remote-agent-aws.mjs +52 -6
  20. package/plugins/lisa-agy/scripts/remote-agent-aws-setup.sh +319 -15
  21. package/plugins/lisa-agy/skills/lisa-analyze-claude-remote/SKILL.md +2 -2
  22. package/plugins/lisa-agy/skills/lisa-implement/SKILL.md +10 -0
  23. package/plugins/lisa-agy/skills/lisa-linear-access/SKILL.md +39 -4
  24. package/plugins/lisa-agy/skills/lisa-setup-remote-aws/SKILL.md +33 -2
  25. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  26. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  27. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  28. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-copilot/scripts/install-remote-agent-aws.mjs +52 -6
  32. package/plugins/lisa-copilot/scripts/remote-agent-aws-setup.sh +319 -15
  33. package/plugins/lisa-copilot/skills/lisa-analyze-claude-remote/SKILL.md +2 -2
  34. package/plugins/lisa-copilot/skills/lisa-implement/SKILL.md +10 -0
  35. package/plugins/lisa-copilot/skills/lisa-linear-access/SKILL.md +39 -4
  36. package/plugins/lisa-copilot/skills/lisa-setup-remote-aws/SKILL.md +33 -2
  37. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-cursor/scripts/install-remote-agent-aws.mjs +52 -6
  39. package/plugins/lisa-cursor/scripts/remote-agent-aws-setup.sh +319 -15
  40. package/plugins/lisa-cursor/skills/lisa-analyze-claude-remote/SKILL.md +2 -2
  41. package/plugins/lisa-cursor/skills/lisa-implement/SKILL.md +10 -0
  42. package/plugins/lisa-cursor/skills/lisa-linear-access/SKILL.md +39 -4
  43. package/plugins/lisa-cursor/skills/lisa-setup-remote-aws/SKILL.md +33 -2
  44. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  46. package/plugins/lisa-expo-agy/plugin.json +1 -1
  47. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  51. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  52. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  56. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  57. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  61. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  62. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  66. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  67. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  69. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  71. package/plugins/lisa-rails-agy/plugin.json +1 -1
  72. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  74. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  76. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  77. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  79. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  80. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  81. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  82. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  83. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  84. package/plugins/src/base/scripts/install-remote-agent-aws.mjs +52 -6
  85. package/plugins/src/base/scripts/remote-agent-aws-setup.sh +319 -15
  86. package/plugins/src/base/skills/lisa-analyze-claude-remote/SKILL.md +2 -2
  87. package/plugins/src/base/skills/lisa-implement/SKILL.md +10 -0
  88. package/plugins/src/base/skills/lisa-linear-access/SKILL.md +39 -4
  89. 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, or store it as" >&2
137
- echo "LINEAR_API_KEY in this project's secrets provider." >&2
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. Never write or request the actual bootstrap bundle in repository files. Tell
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
- 6. Report the external step that remains: configure that one secret in the
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "4.26.5",
3
+ "version": "4.27.1",
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": "4.26.5",
3
+ "version": "4.27.1",
4
4
  "description": "AWS CDK-specific Lisa plugin.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "4.26.5",
3
+ "version": "4.27.1",
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": "4.26.5",
3
+ "version": "4.27.1",
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": "4.26.5",
3
+ "version": "4.27.1",
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": "4.26.5",
3
+ "version": "4.27.1",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -313,14 +313,32 @@ Generated for: \`${platform}\`.
313
313
 
314
314
  ## Implementation
315
315
 
316
- The bootstrap bundle defines the available profile names. \`dev\` is the
317
- default when present. Select another account explicitly, for example:
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. Run the setup command and require its live
344
- \`sts:GetCallerIdentity\` check to pass before considering the platform ready.
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