@codyswann/lisa 4.31.1 → 4.32.0

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 (75) hide show
  1. package/cdk/create-only/stryker.conf.json +44 -0
  2. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  3. package/dist/core/lisa-owned-hash-ledger.js +22 -0
  4. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  5. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  6. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  7. package/dist/core/upstream-evidence-manifest.js +18 -2
  8. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  9. package/package.json +4 -4
  10. package/plugins/lisa/.claude-plugin/plugin.json +19 -1
  11. package/plugins/lisa/.codex-plugin/hooks.json +18 -0
  12. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  13. package/plugins/lisa/hooks/inject-resolved-config.mjs +669 -0
  14. package/plugins/lisa/hooks/inject-resolved-config.sh +48 -0
  15. package/plugins/lisa/rules/eager/config-resolution.md +8 -1
  16. package/plugins/lisa-agy/plugin.json +1 -1
  17. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  18. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  19. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  20. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  21. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  22. package/plugins/lisa-copilot/.claude-plugin/plugin.json +10 -1
  23. package/plugins/lisa-copilot/hooks/inject-resolved-config.mjs +669 -0
  24. package/plugins/lisa-copilot/hooks/inject-resolved-config.sh +48 -0
  25. package/plugins/lisa-copilot/rules/eager/config-resolution.md +8 -1
  26. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa-cursor/hooks/hooks.json +6 -0
  28. package/plugins/lisa-cursor/hooks/inject-resolved-config.mjs +669 -0
  29. package/plugins/lisa-cursor/hooks/inject-resolved-config.sh +48 -0
  30. package/plugins/lisa-cursor/rules/config-resolution.mdc +8 -1
  31. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  32. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  33. package/plugins/lisa-expo-agy/plugin.json +1 -1
  34. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  37. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  38. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  39. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  43. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  44. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  48. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  49. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  53. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  54. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  58. package/plugins/lisa-rails-agy/plugin.json +1 -1
  59. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  63. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  64. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  68. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  69. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  71. package/plugins/src/base/.claude-plugin/plugin.json +18 -0
  72. package/plugins/src/base/hooks/inject-resolved-config.mjs +669 -0
  73. package/plugins/src/base/hooks/inject-resolved-config.sh +48 -0
  74. package/plugins/src/base/rules/eager/config-resolution.md +8 -1
  75. package/scripts/lib/per-agent-hook-filter.mjs +20 -0
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env bash
2
+ # SessionStart / SubagentStart: put the RESOLVED Lisa configuration in front of
3
+ # the agent, so reading it is not a decision anyone can decline to make.
4
+ #
5
+ # `inject-rules.sh` beside this file injects RULE TEXT. Nothing injected the
6
+ # resolved VALUES, so an agent received a paragraph saying that configuration
7
+ # lives in a file and then had to decide, unprompted, to go read it. That
8
+ # decision is the step that gets skipped, and it is why projects keep "missing"
9
+ # a `.lisa.config.json` that is present and correct. An agent cannot skip
10
+ # reading what is already in its context.
11
+ #
12
+ # All the work — resolving `.lisa.config.local.json` over `.lisa.config.json`,
13
+ # marking built-in defaults, redacting identity, bounding the output — lives in
14
+ # the sibling `.mjs`, which is unit-tested. This wrapper only resolves the
15
+ # project root and hands stdin through.
16
+ #
17
+ # FAIL SOFT, ALWAYS. Every exit is 0 and every failure is silent. The right
18
+ # response to "node is missing" or "the renderer crashed" is a session that
19
+ # starts without this block, never a session that does not start. The hard
20
+ # reading of the same config lives where it can afford to be hard: the gate
21
+ # runner refuses a config it cannot read, and `lisa doctor` exits non-zero.
22
+ #
23
+ # Note the ONE case that is emphatically not silent: a config that exists and
24
+ # is malformed emits a block saying so. Staying quiet there would report a
25
+ # broken project as an unconfigured one, which is the invisible-gap failure
26
+ # this hook exists to remove.
27
+ set -uo pipefail
28
+
29
+ INPUT=$(cat 2>/dev/null || true)
30
+
31
+ ROOT="${CLAUDE_PLUGIN_ROOT:-${PLUGIN_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}}"
32
+ RENDERER="$ROOT/hooks/inject-resolved-config.mjs"
33
+
34
+ [ -f "$RENDERER" ] || exit 0
35
+ command -v node >/dev/null 2>&1 || exit 0
36
+
37
+ # CLAUDE_PROJECT_DIR is the harness's own declaration of the root and is the
38
+ # only source that stays correct when the session's cwd has moved. Falling back
39
+ # to the git toplevel before $PWD matters for the same reason: config lives at
40
+ # the repo root, and a hook that reads the cwd reports "unconfigured" from any
41
+ # subdirectory (the defect fixed for setup-jira-cli in CodySwannGT/lisa#2768).
42
+ PROJECT_DIR="${CLAUDE_PROJECT_DIR:-}"
43
+ if [ -z "${PROJECT_DIR}" ] || [ ! -d "${PROJECT_DIR}" ]; then
44
+ PROJECT_DIR="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
45
+ fi
46
+
47
+ printf '%s' "$INPUT" | node "$RENDERER" --project-dir "$PROJECT_DIR" || true
48
+ exit 0
@@ -1,6 +1,13 @@
1
1
  # Config Resolution (load-bearing)
2
2
 
3
- Lisa configuration lives in `.lisa.config.json` (committed) and `.lisa.config.local.json` (gitignored, per-developer). The local file wins where they overlap. Developer-specific identity (`atlassian.email`, etc.) MUST live in the local file, never committed.
3
+ **The resolved configuration is already in your context.** `inject-resolved-config.sh` runs at every session and subagent start and injects the EFFECTIVE values — `.lisa.config.local.json` already merged over `.lisa.config.json` — inside a `<lisa-resolved-config>` block, marking anything that is a Lisa built-in rather than something this project declared. Read the values there and act on them; do not re-derive them from the files, and do not act against them.
4
+
5
+ That block replaces the paragraph that used to sit here saying where configuration lives and which file wins. Restating it is what nine eager rules were already doing while agents acted against a config they never opened; if the block is ever missing, the two files are the source and the local one wins where they overlap.
6
+
7
+ Two things the block deliberately does not carry, so they stay here:
8
+
9
+ - **Writing identity.** Developer-specific identity (`atlassian.email`, etc.) MUST go in the local file, never the committed one. The injected block omits identity entirely, so it will never show you that this is broken.
10
+ - **Everything below**, which is behaviour keyed off config rather than the values themselves.
4
11
 
5
12
  ## Atlassian access — assistant-level rule
6
13
 
@@ -102,6 +102,26 @@ const SCRIPT_RULES = {
102
102
  agy: false, // no full rules tree on agy; AGENTS.md carries only bounded bridges
103
103
  copilot: true, // conservative default; conditionally stripped if rules-auto-load probe positive
104
104
  },
105
+ // Ships wherever the agent has a session-start event, on the same reasoning
106
+ // as `secrets-preflight.sh` and NOT on `inject-rules.sh`'s. Cursor strips
107
+ // rule injection because rules are also delivered as native `rules/*.mdc`, so
108
+ // injecting would double-deliver; a RESOLVED CONFIG has no second delivery
109
+ // path on any agent — it is computed per session from two files on disk and
110
+ // is never emitted as a static artifact — so that reason does not transfer
111
+ // and Cursor gets it.
112
+ //
113
+ // Documented gap: agy has no SessionStart event at all, so agy sessions get
114
+ // no injected config. The compensating rung is the same one AGENTS.md
115
+ // requires when a harness cannot represent a control — shared rather than
116
+ // agent-layer: the gate runner refuses a config it cannot read, and
117
+ // `lisa doctor` exits non-zero on a broken one, on every agent.
118
+ "inject-resolved-config.sh": {
119
+ claude: true,
120
+ codex: true,
121
+ cursor: true,
122
+ agy: false,
123
+ copilot: true,
124
+ },
105
125
  "inject-flow-context.sh": {
106
126
  claude: true,
107
127
  codex: true,