@codyswann/lisa 4.66.2 → 4.66.4

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 (68) hide show
  1. package/all/copy-overwrite/scripts/lisa-hooks/worktree-binding-guard.mjs +135 -50
  2. package/cdk/create-only/.github/workflows/deploy.yml +10 -0
  3. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  4. package/dist/core/lisa-owned-hash-ledger.js +10 -0
  5. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  6. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  7. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  8. package/dist/core/upstream-evidence-manifest.js +7 -6
  9. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  10. package/dist/opencode/plugin-templates/lisa-block-direct-issue-create.ts +19 -4
  11. package/expo/create-only/.github/workflows/deploy.yml +10 -0
  12. package/nestjs/create-only/.github/workflows/deploy.yml +10 -0
  13. package/package.json +4 -4
  14. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  15. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  16. package/plugins/lisa/hooks/worktree-binding-guard.mjs +135 -50
  17. package/plugins/lisa-agy/plugin.json +1 -1
  18. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  19. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  20. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  21. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  22. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  23. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  24. package/plugins/lisa-copilot/hooks/worktree-binding-guard.mjs +135 -50
  25. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  26. package/plugins/lisa-cursor/hooks/worktree-binding-guard.mjs +135 -50
  27. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  29. package/plugins/lisa-expo-agy/plugin.json +1 -1
  30. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  32. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  34. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  35. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  37. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  39. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  40. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  44. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  45. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  49. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  50. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  54. package/plugins/lisa-rails-agy/plugin.json +1 -1
  55. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  59. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  60. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  64. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  65. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  67. package/plugins/src/base/hooks/worktree-binding-guard.mjs +135 -50
  68. package/typescript/copy-contents/.husky/commit-msg +48 -11
@@ -144,16 +144,26 @@ fi
144
144
  echo "🤖 Checking for AI co-authorship..."
145
145
 
146
146
  # Fleet agents — the runtimes Lisa ships plugin distributions for — pass on
147
- # the trailer alone. Any other named agent (e.g. Devin) must also carry
148
- # AI-Agent/AI-Model/AI-Effort trailers: the gate enforces attribution, not
149
- # agent gatekeeping, so an agent Lisa does not distribute to can still commit
150
- # truthfully instead of forcing --no-verify. CodySwannGT/lisa#4282.
147
+ # the trailer alone. Any other co-author — an agent Lisa does not distribute
148
+ # to (e.g. Devin) OR A HUMAN — also requires the AI-Agent/AI-Model/AI-Effort
149
+ # block: the gate enforces attribution, not agent gatekeeping, and a trailer
150
+ # name cannot tell a human from a non-fleet agent, so both are held to the
151
+ # same rule. The AI-* trailers describe the commit's DRIVER, not every
152
+ # co-author — a human pairing alongside an agent is covered by the agent's
153
+ # block, while a commit with ONLY a human co-author is refused by the check
154
+ # below: its AI-Agent trailer must name a listed co-author, and a human-only
155
+ # trailer block has no agent to name. (A human could still write
156
+ # "AI-Agent: <their own name>" to self-attest as the agent — the trailer is
157
+ # the attestation surface, not a proof, so the gate documents rather than
158
+ # polices that.) CodySwannGT/lisa#4282, CodySwannGT/lisa#4294.
151
159
  LISA_FLEET_AGENT_RE="Claude|Codex|Cursor|OpenCode|Antigravity|Copilot"
152
160
  # Co-authors come from the message's trailer block via git-interpret-trailers —
153
161
  # a "Co-authored-by:" string inside prose is not attribution — and every entry
154
162
  # is judged on its own, so a fleet trailer can never cover a sibling trailer
155
- # whose agent owes metadata.
156
- COAUTHOR_TRAILERS=$(git interpret-trailers --parse "$COMMIT_MSG_FILE" 2>/dev/null | grep -iE "^Co-authored-by:" || true)
163
+ # whose agent owes metadata. The AI-* checks below read the SAME parsed
164
+ # trailer block, so an "AI-Agent:" line in body prose cannot satisfy them.
165
+ ALL_TRAILERS=$(git interpret-trailers --parse "$COMMIT_MSG_FILE" 2>/dev/null || true)
166
+ COAUTHOR_TRAILERS=$(printf '%s\n' "$ALL_TRAILERS" | grep -iE "^Co-authored-by:" || true)
157
167
 
158
168
  if ! printf '%s\n' "$COAUTHOR_TRAILERS" | grep -Eiq "Co-authored-by:"; then
159
169
  no_coauthor=1
@@ -177,21 +187,48 @@ fi
177
187
  if [ "$nonfleet_coauthor" -eq 1 ]; then
178
188
  missing_agent_metadata=0
179
189
  for trailer in AI-Agent AI-Model AI-Effort; do
180
- if ! printf '%s\n' "$COMMIT_MSG" | grep -Eiq "^${trailer}:[[:space:]]*[^[:space:]]"; then
190
+ if ! printf '%s\n' "$ALL_TRAILERS" | grep -Eiq "^${trailer}:[[:space:]]*[^[:space:]]"; then
181
191
  missing_agent_metadata=1
182
192
  fi
183
193
  done
194
+ # The AI-Agent trailer must also NAME one of the listed co-authors —
195
+ # metadata attesting to nobody in the trailer block is not attribution.
196
+ # Compare against the extracted NAME (the same "strip email" transform the
197
+ # co-author loop above applies), not the raw trailer line: a substring
198
+ # match would let "AI-Agent: Co-authored-by" satisfy the check without
199
+ # naming anyone.
200
+ ai_agent=$(printf '%s\n' "$ALL_TRAILERS" | grep -iE "^AI-Agent:" | head -1 | sed -E 's/^[^:]+:[[:space:]]*//;s/[[:space:]]*$//')
201
+ if [ -n "$ai_agent" ]; then
202
+ ai_agent_lc=$(printf '%s' "$ai_agent" | tr '[:upper:]' '[:lower:]')
203
+ ai_agent_names_someone=0
204
+ while IFS= read -r trailer; do
205
+ [ -z "$trailer" ] && continue
206
+ coauthor_name=$(printf '%s' "${trailer#*:}" | sed -e 's/<[^>]*>//g' -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' | tr '[:upper:]' '[:lower:]')
207
+ if [ "$coauthor_name" = "$ai_agent_lc" ]; then
208
+ ai_agent_names_someone=1
209
+ fi
210
+ done <<LISA_COAUTHOR_NAME_CHECK
211
+ $COAUTHOR_TRAILERS
212
+ LISA_COAUTHOR_NAME_CHECK
213
+ if [ "$ai_agent_names_someone" -eq 0 ]; then
214
+ missing_agent_metadata=1
215
+ fi
216
+ fi
184
217
  if [ "$missing_agent_metadata" -eq 1 ]; then
185
218
  echo ""
186
219
  echo "❌ Non-fleet agents must include AI metadata trailers!"
187
220
  echo ""
188
221
  echo "Agents outside the supported fleet (Claude, Codex, Cursor, OpenCode,"
189
222
  echo "Antigravity, Copilot) must carry provenance metadata alongside the"
190
- echo "Co-authored-by trailer:"
223
+ echo "Co-authored-by trailer — this includes a human co-author, who is"
224
+ echo "covered by the driving agent's AI-Agent/AI-Model/AI-Effort block:"
191
225
  echo " AI-Agent: <agent name>"
192
226
  echo " AI-Model: <provider/model>"
193
227
  echo " AI-Effort: <effort or runtime value>"
194
228
  echo ""
229
+ echo "The AI-Agent value must name one of the commit's Co-authored-by"
230
+ echo "entries — it attests to which listed author is the driving agent."
231
+ echo ""
195
232
  lisa_commit_gate_families ai-coauthorship
196
233
  exit 1
197
234
  fi
@@ -227,13 +264,13 @@ fi
227
264
 
228
265
  if printf '%s\n' "$COAUTHOR_TRAILERS" | grep -Eiq "Co-authored-by:.*OpenCode"; then
229
266
  missing_opencode_metadata=0
230
- if ! printf '%s\n' "$COMMIT_MSG" | grep -Eiq "^AI-Agent:[[:space:]]*OpenCode[[:space:]]*$"; then
267
+ if ! printf '%s\n' "$ALL_TRAILERS" | grep -Eiq "^AI-Agent:[[:space:]]*OpenCode[[:space:]]*$"; then
231
268
  missing_opencode_metadata=1
232
269
  fi
233
- if ! printf '%s\n' "$COMMIT_MSG" | grep -Eiq "^AI-Model:[[:space:]]*[^[:space:]].*$"; then
270
+ if ! printf '%s\n' "$ALL_TRAILERS" | grep -Eiq "^AI-Model:[[:space:]]*[^[:space:]].*$"; then
234
271
  missing_opencode_metadata=1
235
272
  fi
236
- if ! printf '%s\n' "$COMMIT_MSG" | grep -Eiq "^AI-Effort:[[:space:]]*[^[:space:]].*$"; then
273
+ if ! printf '%s\n' "$ALL_TRAILERS" | grep -Eiq "^AI-Effort:[[:space:]]*[^[:space:]].*$"; then
237
274
  missing_opencode_metadata=1
238
275
  fi
239
276