@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.
- package/all/copy-overwrite/scripts/lisa-hooks/worktree-binding-guard.mjs +135 -50
- package/cdk/create-only/.github/workflows/deploy.yml +10 -0
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +10 -0
- package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
- 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 +7 -6
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/opencode/plugin-templates/lisa-block-direct-issue-create.ts +19 -4
- package/expo/create-only/.github/workflows/deploy.yml +10 -0
- package/nestjs/create-only/.github/workflows/deploy.yml +10 -0
- package/package.json +4 -4
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/hooks/worktree-binding-guard.mjs +135 -50
- package/plugins/lisa-agy/plugin.json +1 -1
- 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/hooks/worktree-binding-guard.mjs +135 -50
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/hooks/worktree-binding-guard.mjs +135 -50
- 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/hooks/worktree-binding-guard.mjs +135 -50
- 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
|
|
148
|
-
# AI-Agent/AI-Model/AI-Effort
|
|
149
|
-
#
|
|
150
|
-
#
|
|
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
|
-
|
|
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' "$
|
|
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' "$
|
|
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' "$
|
|
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' "$
|
|
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
|
|