Skip to content

feat(lifi-plugin): cross-chain bridge & swap aggregator (v0.1.0)#34

Open
GeoGu360 wants to merge 10 commits intomig-pre:testfrom
GeoGu360:feat/lifi-plugin
Open

feat(lifi-plugin): cross-chain bridge & swap aggregator (v0.1.0)#34
GeoGu360 wants to merge 10 commits intomig-pre:testfrom
GeoGu360:feat/lifi-plugin

Conversation

@GeoGu360
Copy link
Copy Markdown

Summary

New skill: lifi-plugin — Rust CLI client for LI.FI's cross-chain bridge & swap aggregator REST API. Routes through Across, Stargate, Mayan, Relay, Polymer, etc. across 6 mainstream EVM chains.

8 commands:

  • quickstart — first-time onboarding (parallel 6-chain balance scan + status enum + ready-to-run next_command)
  • chains — list supported chains
  • tokens — list/lookup tokens on a chain
  • quote — single executable quote with calldata + price + fees
  • routes — multi-hop alternatives (FASTEST/CHEAPEST sort)
  • bridge — execute (write, requires --confirm)
  • status — track in-flight cross-chain tx
  • balance — multi-chain native + ERC-20 balance reader

6 supported chains: Ethereum, Arbitrum, Base, Optimism, BSC, Polygon.

Why

Existing skills cover single-protocol use cases (Curve, Uniswap, PancakeSwap, GMX, Hyperliquid, etc.) but no aggregator covers cross-chain bridging in this repo. LI.FI is the de facto standard cross-chain aggregator (used by 1inch, Jumper, etc.) and exposes a clean REST API at https://li.quest/v1.

Knowledge-base compliance

Rule Implementation
GEN-001 All 8 commands emit structured JSON on stdout; exit 0 for business-logic failures
EVM-001 bridge runs pre-flight balance check before approve
EVM-002 Every amount field paired (amount + _raw)
EVM-005 ETH/native sentinel detected, no approve attempt
EVM-006 wait_for_tx polls eth_getTransactionReceipt, no blind sleep
EVM-014 (new) Retry-on-allowance-revert handles RPC state lag race
ONB-001 quickstart command + SUMMARY.md (3-section template) shipped from v0.1.0
ONC-001 wallet contract-call invoked with --force
GAS-001 Native gas balance check using quote.gasCosts[] sum
AGG-001 reliability field flags solver-quote tools (mayan/near/relayer)
AGG-002 liquidity_check field with verdict {OK, BELOW_LP_MINIMUM, LIKELY_REJECT_SUBDOLLAR, UNKNOWN}; --confirm refused on risky verdicts unless --accept-relayer-risk
AGG-003 (new) Sub-$1 USD floor catches cases where LP tools listed but relayer minimums still reject

Verification — 9 real bridges DONE on mainnet

6×5 cross-chain matrix verification spawned 6 parallel agents (one per source chain). Real bridges executed:

# Route Amount Tool Result
1 ETH→ARB 1 USDC across DONE in ~15s
2 ARB→BASE 1 USDC across DONE (early test)
3 ARB→OP 0.3 USDC relaydepository DONE in ~12s
4 ARB→ETH 0.3 USDC relaydepository DONE (high L1 spread, expected)
5 BASE→ARB 0.3 USDC relaydepository DONE in ~15s
6 BASE→OP 0.3 USDC relaydepository DONE in ~15s
7 OP→POL 0.0003 ETH relaydepository DONE in ~5s
8 POL→BASE 0.3 USDC relaydepository DONE (quickstart's own next_command — full closed loop)
9 POL→ARB 0.3 USDC polymer DONE in ~30s

All tx hashes available in commit message of 48c96d77 and the verification reports.

Two real bugs surfaced + fixed during verification

  1. EVM-014 — approve confirmed via our wait_for_tx (publicnode RPC), but onchainos's internal RPC trails by 2-3 blocks → first submit reverts with exceeds allowance. Wrapped submit in 1-retry-on-allowance-revert (5s sleep). Cost ~$1 of L1 gas to discover; saves that cost on every future occurrence.
  2. AGG-003liquidity_check reported verdict=OK for BSC→ARB native BNB at $0.6 (across LP-tier listed) but onchainos pre-flight reverted at simulation. LI.FI's /routes doesn't expose per-route LP minimum-fill thresholds. Added a $1 USD-equivalent hard floor; new verdict LIKELY_REJECT_SUBDOLLAR enforced by safety gate.

Both new entries written into common-bugs-knowledge-base.md for future skill developers.

Test plan

  • cargo build — clean compile, no warnings
  • chains / tokens / quote / routes / status / balance / quickstart smoke tests (FREE, no gas)
  • --help flag audit vs SKILL.md (perfect match)
  • 6×5 cross-chain matrix dry-run characterization
  • 9 real bridges executed across the matrix; all DONE
  • 2 bugs surfaced, fixed, retested, committed
  • --accept-relayer-risk override path verified
  • BELOW_LP_MINIMUM and LIKELY_REJECT_SUBDOLLAR safety gates verified
  • Back-compat: legacy chain aliases (BAS/OPT) still resolve to new keys (BASE/OP)
  • plugin.yaml api_calls whitelist matches all https:// domains in source

🤖 Generated with Claude Code

Amos and others added 8 commits April 28, 2026 00:52
LI.FI aggregator skill providing 7 commands for cross-chain bridging
and swapping across 6 mainstream EVM chains: Ethereum, Arbitrum,
Base, Optimism, BSC, Polygon.

Commands:
- chains   list supported chains (local whitelist or full LI.FI registry via --all)
- tokens   list tokens on a chain or look up one by symbol/address
- quote    fetch a single executable quote (calldata + price + fees)
- routes   plan multi-hop alternatives, ranked by FASTEST or CHEAPEST
- bridge   execute a bridge/swap (--confirm gate + --dry-run preview)
- status   track an in-flight cross-chain transfer
- balance  read native + ERC-20 balances per chain

Architecture:
- src/api.rs       LI.FI HTTP client (li.quest/v1)
- src/config.rs    chain whitelist (id/key/name/RPC/native_symbol)
- src/rpc.rs       eth_call + eth_getBalance + wait_for_tx (RPC polling)
- src/onchainos.rs wraps `onchainos wallet` for address + contract-call
- src/commands/    7 command modules + shared error_response

Knowledge-base compliance:
- GEN-001: every command outputs structured `{ok:false,error_code,suggestion}`
  on stdout for Agent consumption (no exit non-zero, no stderr)
- EVM-001: `bridge` runs pre-flight balance check before any approve
- EVM-002: every amount field has `_raw` (atomic) + display version
- EVM-005: ETH/native sentinel detection skips approve, uses msg.value
- EVM-006: `wait_for_tx` polls eth_getTransactionReceipt; no blind sleep
- EVM-012: RPC failures bubble up as errors, never silently zeroed

Verified manually:
- chains: 6 chains listed correctly
- tokens --chain ETH --symbol USDC: returns USDC at 0xA0b8...eB48
- quote ETH→ARB 100 USDC: across bridge, 99.73 USDC out, ~2s ETA
- routes ETH→BAS 50 USDC --limit 3: 13 routes returned, top 3 shown
- balance --chain ARB --token USDC: real RPC reads 1.625214 USDC
- bridge --dry-run ARB→BAS 1 USDC: pre-flight passes, calldata fetched
- error paths: UNSUPPORTED_CHAIN, INVALID_ARGUMENT, INSUFFICIENT_BALANCE,
  TOKEN_NOT_FOUND all return structured JSON

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Six parallel verification agents (one per chain: ETH/ARB/BAS/OPT/BSC/POL)
ran read-path + bridge dry-run + error-path tests against the real
LI.FI API and public RPCs. Three issues found, all fixed in this commit.

Fix 1 (ETH agent — GEN-001 violation):
  --amount -5 (without `=`) caused clap to consume `-5` as a flag,
  exiting with code 2 and dumping usage to stderr. External agents
  got a non-zero exit with no structured JSON.
  → Added `allow_hyphen_values = true` to the `amount` arg in quote,
    bridge, and routes so clap passes the value through to our own
    validator, which then emits the standard INVALID_ARGUMENT JSON.

Fix 2 (ARB + ETH agents — error_code mismatch):
  Unknown symbols returned `error_code: API_ERROR` instead of the
  more useful `TOKEN_NOT_FOUND`. LI.FI returns 400 + code 1011 ("Unknown
  token symbol") for these, not 404.
  → Updated the classifier in tokens.rs to map both 1003 and 1011, and
    the "Unknown token symbol" / "Could not find token" message bodies,
    to TOKEN_NOT_FOUND.

Fix 3 (POL agent — bridge preview missing ok:true wrapper):
  bridge --dry-run / preview emitted `{"preview":{...}}` without a
  top-level `ok` field. A strict JSON-only consumer might not match.
  → Wrapped the preview in `{ok:true, stage:"dry_run"|"preview"|"submit",
    submitted:false, preview:{...}}` so every code path on stdout is a
    single envelope-shaped object.

SKILL.md:
  Full v0.1.0 documentation: pre-flight install scripts, trigger phrases,
  per-command sections (chains/tokens/quote/routes/bridge/status/balance)
  with parameters / output fields / errors / display rules, GEN-001 error
  table, security notice, data trust boundary, changelog.

Verified post-fix:
  - quote/routes/bridge --amount -5 → all return INVALID_ARGUMENT exit 0
  - tokens --chain ETH --symbol NEVERHEARDOFIT → TOKEN_NOT_FOUND exit 0
  - bridge --dry-run → first stdout line is {"ok": true, "stage": ...}

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…iance)

Per the new knowledge-base requirement that every skill must ship with
a quickstart command and a SUMMARY.md (3-section fixed template), this
adds both to lifi-plugin v0.1.0.

quickstart command:
  - Resolves wallet via onchainos (or --address override)
  - Parallel scan of 6 chains × (native + USDC) = 12 RPC calls in one
    pass via futures::future::join_all
  - Decides one of 4 status enum values: ready / low_balance / no_funds /
    rpc_degraded
  - Returns ready-to-run next_command + human tip
  - Fixes BSC USDC decimal handling: Binance-Peg USDC uses 18 decimals,
    not 6; hard-coded per-chain (address, decimals) tuple ensures the
    USD-value comparison picks the correct chain

SUMMARY.md:
  - Three fixed sections: Overview, Prerequisites, Quick Start
  - Step 1 always invokes `lifi-plugin quickstart`
  - Steps 2-N each branch off one quickstart status enum value
  - Status set in source matches status set in SUMMARY exactly
    (verified by debug-time staleness scan)

SKILL.md additions:
  - New section 0 documenting quickstart parameters, output fields,
    status table, and the SUMMARY.md cross-reference rule
  - Changelog v0.1.0 entry updated to mention 8 commands and ONB-001
    compliance

Verified:
  - quickstart on real wallet → status: ready, richest: POL ($11),
    next_command: POL→BAS bridge 0.5 USDC
  - quickstart on dead wallet (0xdEadBeef…) → status: no_funds
  - All staleness scans pass: SUMMARY has no commands missing from binary,
    src/doc status enums match exactly

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…e gas + reliability checks (BRG-001/002/003)

Three improvements driven by real-world ETH→Base $5 bridge attempts that
silently failed with "execution reverted":

BRG-001 (real bug): wallet_contract_call wasn't passing --force.
onchainos's backend security policy rejects unlimited-approve and
unknown-contract calls without --force, returning a cryptic
"execution reverted" identical to an actual on-chain revert. The
plugin's own --confirm flag already gates whether the call is made,
so the second backend confirmation is redundant. Hyperliquid-plugin
doesn't hit this because it uses sign-message + REST POST instead of
contract-call; the comment "intentionally omitted" copied from HL was
wrong for any plugin doing direct EVM contract calls.

BRG-002 (gap): no native gas balance check. Old logic only verified
source-token balance ≥ amount (EVM-001). Now reads native_balance
separately and validates against estimate.gasCosts[].amount sum from
quote. For native input, also adds bridge amount to required total.
Returns INSUFFICIENT_GAS error code with shortfall shown in the tip.

BRG-003 (gap): no reliability warning. dry-run output now includes a
"reliability" field that flags solver-quote tools (mayan/near/relayer)
which are prone to revert at small amounts due to signed-quote latency.
Suggestions order: --deny-bridges mayan,near (the actual fix), then
different destination chain, then increase --amount.

Verified end-to-end:
  - ARB→BAS 1 USDC bridge: SUCCESS after fix (was failing with
    "Token approved for unlimited amount" → execution reverted before
    --force was added)
  - approve tx 0x95b88bb3... confirmed in 2s, bridge tx 0x61d30892...
    submitted via across in 2s
  - dry-run for mayan/near now shows reliability=WARN with concrete
    suggestions
  - dry-run for across/relaydepository shows reliability=null (clean)
  - Gas check correctly flags shortfall when native_balance < gas+amount

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…afety gate (BRG-004)

Answers user concern: "can we tell external Agent or user when the
minimum-amount requirement isn't met, BEFORE the tx burns gas?"

Implementation:
  - Parallel /quote + /routes calls (same params, ~same latency, no
    extra round-trip cost)
  - Parse routes[].steps[].tool to enumerate ALL tools available at
    this exact amount, not just the one /quote selected
  - Classify tools: LP_TIER_TOOLS (deterministic on-chain fill —
    across/stargate/relaydepository/hop/celercircle/polymer) vs
    SOLVER_QUOTE_TOOLS (signed-quote latency-sensitive — mayan/near/
    relayer)
  - Emit liquidity_check field in preview with verdict ∈ {OK,
    BELOW_LP_MINIMUM, UNKNOWN}, all_available_tools, lp_tier_tools_present
  - Cross-reference with reliability check: when selected tool is
    solver-quote AND lp_tier_tools_present is false, suggest "increase
    amount" first (the real fix); when LP alternative IS available,
    suggest "--deny-bridges mayan,near" (the cheap fix)

New safety gate:
  - When liquidity_check.verdict == BELOW_LP_MINIMUM AND --confirm is
    set, refuse to broadcast with error_code BELOW_LP_MINIMUM
  - Override: --accept-relayer-risk flag (added) acknowledges the
    gas-loss risk and submits anyway
  - Protects users / Agents from blindly typing --confirm and burning
    L1 gas on a tx that the relayer will reject

Verified end-to-end:
  - $5 ETH→Base --confirm: refused with BELOW_LP_MINIMUM (only mayan,
    near returned by /routes), structured error with 3 concrete
    suggestions
  - $5 ETH→Base --confirm --accept-relayer-risk: gate bypassed,
    proceeds to submit
  - $0.3 ARB→BAS --dry-run: verdict=OK, 9 tools available including 3
    LP-tier (celercircle, polymer, stargateV2), reliability=null

Knowledge-base updated:
  - new entry [BRG-004] in common-bugs-knowledge-base.md with
    LP-tier vs solver-quote tool classification table and Rust template
  - SKILL.md updated with --accept-relayer-risk flag, liquidity_check
    output shape, INSUFFICIENT_GAS + BELOW_LP_MINIMUM error codes,
    and full BRG-001..004 compliance summary

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
… AGG-002

User challenge: "the new knowledge-base entries you added are universal,
right? not lifi-specific?"

Honest review showed BRG-001 was mis-categorized — it's a generic
onchainos-integration bug affecting any skill using `wallet contract-call`,
not a bridge-specific concern. Survey of 21 skills in the repo found
4 still missing --force (compound-v3, etherfi, hyperliquid, kamino-liquidity,
pancakeswap-v2), proving universality.

Re-classification:
  BRG-001 → ONC-001 (onchainos integration; affects all 20+ EVM/Solana skills)
  BRG-002 → GAS-001 (write-op gas validation; principle universal,
                     implementation splits by API-quoted vs direct-RPC)
  BRG-003 → AGG-001 (aggregator-specific: solver-quote tool risk)
  BRG-004 → AGG-002 (aggregator-specific: LP minimum pre-execution check)

Each entry now carries an explicit "Scope:" header stating which kinds
of skills it applies to, plus a "previously coded as BRG-XXX" footnote
for git-history continuity.

This commit only updates the SKILL.md tag references; the Rust code
behavior is unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
User feedback: "Why isn't Base shown in the balance table?" — they
saw `BAS` in the chain column and didn't recognize it as Base.

LI.FI's internal API uses 3-letter keys (BAS / OPT), but community
convention everywhere else is BASE / OP. Since we always pass chain
IDs (not keys) to the LI.FI API, our internal keys are display-only
and should match what users actually expect to see and type.

Changes:
- config.rs SUPPORTED_CHAINS: BAS → BASE, OPT → OP
- config.rs parse_chain: alias mapping updated; old BAS/OPT still
  resolve correctly for back-compat (any external scripts using the
  old keys keep working)
- SKILL.md: chain table, command examples, error help text all
  updated to BASE / OP
- SUMMARY.md: 4 step references updated

Verified:
- chains command shows BASE / OP
- balance command shows BASE row (was BAS)
- --chain BAS still resolves to BASE chain (back-compat)
- --chain OPT still resolves to OP chain (back-compat)
- Real ETH→Base bridge calldata unchanged (we always pass chain ID 8453
  to LI.FI, never the key)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…GG-003)

Two real bugs surfaced by the 6×5 cross-chain matrix verification (9
real bridges DONE across ETH/ARB/BASE/OP/BSC/POL).

EVM-014 — approve/submit RPC state lag race:
  Observed: ETH→ARB 1 USDC. approve tx confirmed via wait_for_tx (our
  publicnode RPC). Immediate submit reverted with "ERC20: transfer
  amount exceeds allowance". Retry succeeded immediately.

  Root cause: onchainos uses a different RPC backend than our
  wait_for_tx polling. publicnode shows the approve confirmed; onchainos's
  RPC is 2–3 blocks behind, simulating against stale allowance state.
  This is a multi-RPC view-inconsistency, not a wait_for_tx bug — EVM-006
  is implemented correctly, but isn't sufficient against this race.

  Fix: wrap wallet_contract_call in a 1-retry guard that detects
  "exceeds allowance" patterns, sleeps 5s, and retries. No re-approve
  needed (allowance is already u128::MAX). Cost: 5s extra wall-clock on
  the rare race; saves ~\$1 of L1 gas per occurrence.

AGG-003 — liquidity_check sub-\$1 false-positive:
  Observed: BSC→ARB native BNB 0.001 BNB (~\$0.6). dry-run reported
  verdict=OK with across LP-tier listed. \`--confirm\` triggered
  onchainos pre-flight which reverted at simulation (no gas burned, but
  no bridge either).

  Root cause: LI.FI's /v1/advanced/routes returns "tools that can route
  this pair" — not "tools willing to fill this size". Underlying LP
  contracts (Across et al.) have per-route minimum-fill thresholds (~\$1
  empirically) below which they revert at simulation. LI.FI quote API
  doesn't expose this threshold.

  Fix: add a hard \$1 USD-equivalent floor to assess_liquidity, using
  estimate.fromAmountUSD from the quote. New verdict
  LIKELY_REJECT_SUBDOLLAR; safety gate refuses --confirm on this
  verdict (in addition to BELOW_LP_MINIMUM); --accept-relayer-risk
  override still works. New error_code LIKELY_REJECT_SUBDOLLAR.

Verified:
  - BSC→ARB 0.001 BNB (\$0.62) --confirm: rejected with
    LIKELY_REJECT_SUBDOLLAR + structured suggestions
  - BSC→ARB 0.003 BNB (\$1.87) --dry-run: verdict=OK, lp_tier_tools
    [across, relaydepository] visible
  - dry-run output now includes liquidity_check.amount_usd field

Knowledge base:
  - new entry [EVM-014] documenting the multi-RPC allowance race +
    Rust retry pattern + 5s sleep rationale (applies to all EVM
    skills with two-step write ops, not just bridges)
  - new entry [AGG-003] documenting the sub-\$1 floor + verdict logic
    + LP-tier-tools-listed-but-still-rejecting failure mode

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 28, 2026

🔨 Phase 2: Build Verification — ✅ PASSED

Plugin: lifi-plugin | Language: rust
Source: @

Compiled from developer source code by our CI. Users install our build artifacts.

Build succeeded. Compiled artifact uploaded as workflow artifact.


Source integrity: commit SHA `` is the content fingerprint.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 28, 2026

📋 Phase 3: AI Code Review Report — Score: N/A/100

Plugin: lifi-plugin | Recommendation: 👤 Manual review required

🔗 Reviewed against latest onchainos source code (live from main branch) | Model: unavailable via Anthropic API | Cost: N/A

This is an advisory report. It does NOT block merging. Final decision is made by human reviewers.


AI review FAILED (HTTP 400): Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.. Request size: 1105715 bytes, plugin content: 191310 bytes.


Generated by Claude AI via Anthropic API — review the full report before approving.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 28, 2026

🔨 Phase 2: Build Verification — ✅ PASSED

Plugin: lifi-plugin | Language: rust
Source: @

Compiled from developer source code by our CI. Users install our build artifacts.

Build succeeded. Compiled artifact uploaded as workflow artifact.


Source integrity: commit SHA `` is the content fingerprint.

…hain confirm

Cross-pollination from spark-savings-plugin v0.1.0 development. Same
4 bug patterns surfaced there apply to lifi-plugin's bridge command;
3 of them needed patching here (EVM-012 was already correctly handled
in lifi-plugin).

EVM-014 (extended):
  Existing retry pattern matched only "exceeds allowance" / "transfer
  amount exceeds allowance" — the standard ERC-20 message. Extended to
  also catch:
    - "insufficient-allowance"        (DAI / older Maker-style)
    - "ERC20InsufficientAllowance"    (OZ v5 / typed errors)
  Bridges from chains where the source token is DAI / a custom-revert
  ERC-20 would have bypassed the retry without this.

EVM-015 (new):
  wallet_contract_call now exposes `gas_limit: Option<u64>` that
  passes `--gas-limit` to onchainos. onchainos's auto eth_estimateGas
  has been observed to under-estimate complex cross-chain calls (LI.FI
  routes can use 200k+ gas for LayerZero / cross-chain message
  routing), causing OOG with status=0x0.

  Callsites updated:
    - approve:        Some(60_000)
    - bridge submit:  Some(500_000)  ← generous for any LI.FI tool

  500k is intentionally roomy: across is fine at 130k but cross-chain
  message tools like stargateV2 / squid / mayan can blow past 200k.
  Wasted gas headroom is auto-refunded; under-estimating cancels the tx.

TX-001 (new):
  Plugin previously returned ok:true with tx_hash as soon as onchainos
  broadcast — but on-chain execution can still revert (OOG, slippage,
  relayer reject, signed-quote expired). Added wait_for_tx after main
  submit to confirm source-chain status=0x1 before reporting success.

  For bridges this only confirms the SOURCE leg — destination settlement
  is async and tracked via `lifi-plugin status`. New error code
  TX_REVERTED with structured suggestion. New output field
  `source_chain_status: "0x1"`.

ONC-001 wording softened:
  Comment in onchainos.rs::wallet_contract_call no longer claims
  --force is "REQUIRED" — corrected to "defensively included".
  Aligned with the corrected ONC-001 entry in common-bugs-knowledge-base
  (which now reflects that low-risk daily calls work without --force,
  and --force only matters when backend risk-control prompts fire).
  SKILL.md compliance section also updated.

Reuses existing PR mig-pre#34 — no new PR opened.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Phase 1 structure validation reported [E041] LICENSE file not found.
Added MIT license matching the convention used by hyperliquid-plugin
and other GeoGu360 skills in this repo.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
GeoGu360 pushed a commit to GeoGu360/plugin-store that referenced this pull request Apr 28, 2026
Same E041 fix applied proactively for PR mig-pre#37 (spark-savings) — saw it
fail on PR mig-pre#34 (lifi-plugin) so apply the same MIT license here before
the CI catches it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant