From 0d098585265595aef904229e164e4bbb002d7655 Mon Sep 17 00:00:00 2001 From: diegosouzapw Date: Fri, 15 May 2026 12:51:28 -0300 Subject: [PATCH] chore: remove junk files from PR #2283 squash merge - Remove .playwright-mcp/ debug artifacts (accidentally committed) - Remove duplicate docs/routing/CLI-TOOLS.md (canonical at docs/reference/) --- .../console-2026-05-15T03-01-06-996Z.log | Bin 33799 -> 0 bytes .../console-2026-05-15T03-08-36-662Z.log | Bin 36210 -> 0 bytes .../page-2026-05-15T03-01-08-902Z.yml | 20 - docs/routing/CLI-TOOLS.md | 492 ------------------ 4 files changed, 512 deletions(-) delete mode 100644 .playwright-mcp/console-2026-05-15T03-01-06-996Z.log delete mode 100644 .playwright-mcp/console-2026-05-15T03-08-36-662Z.log delete mode 100644 .playwright-mcp/page-2026-05-15T03-01-08-902Z.yml delete mode 100644 docs/routing/CLI-TOOLS.md diff --git a/.playwright-mcp/console-2026-05-15T03-01-06-996Z.log b/.playwright-mcp/console-2026-05-15T03-01-06-996Z.log deleted file mode 100644 index 620e6b35fdf01bac699658f42ff23be1e0e40d36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33799 zcmeHQSy$Ug7M|z%74_2NB!jJeqYtN>V7A084J2tgheMZ3C0ntqa%-_o`pkcyE0r*| zlbHai7)gdVjIiswx2o>;-RqAi`>}Or7+;}}yJu%7XIE$s`vG-P!cf4liy|7cG$M2p zC4Guw8jWd`y*Of_3y)3wq>nI)6P%;pAhvFAVWqVLDZWh5QaFoE~}EA`<6P~##>-XhAA+69&pjIZ4DMyH1)1&fSP-yD_RtOslgw0{!+%A7a)VA;;FBBV zg53bKFs7)%-=G;s1T{hy655ns`=tU#$W7RO5^v(XEd^phAC6!L!cG@S2J|V}J zIk}AO{=au8vN1aP>|UDFeS53%as#ml-XdQXya!)itJP|}L|_OD`dW54G+}PCh z86x~bySN#FpPj!X4M+OV@VZM$yoE_qE4^Q9+PW$LE3F1ri+iy%y&i^OK71Fwz{9TJ zOIaGf1ncF}Ot+vz2#_MMT$}tgX+pchnRdq`rvl2gxZ5@Zd>1D2jeH9>x6FJa=PyaD z*PB5Fqsk&&dbF0R7)x6jf;kkY-JuU*D1@B^gG-Tx$z4it3g?(RDDV(i@Q@|hi4MUR zfhXo7;oE4lRPm^#+6xicDUAx0F&c5dio0QedlOBgW<0`)kAr3sVKT^lHVzqrZ8ibG zehAW-i|ETAl7k2qJn}UZfh`wViP-`F*!n=b`<(lLvgX`n>8|VPiBQH16{^`3cT@(b! zP2t=ybVjjz>Q8A9m;S7Plz80oET#XG;j(3od%ZI$9W#W-kXOv38SLUwLZi6+_kyj; z+xBu<&ay$MWX<0Eccse+@wu70`piFQaO%ouA{KlXu4#SLh#`NU4IrE4gUC!`p{Y z0zEDk!SLi45lMA`sFlomAXSyl>Ojy98O^7Z+h%}-s z&s!CB6v>`CBI8H8C=uU7Wykoq0_R7qDJ^sB4Hq|u8l!>HRmTfD#Y&yEFNs49?2g}%&Wz&-_YEsA} zE4pSFn%wQ0ouJ!NqFBI>3|UhRPj5T`;y?E@o^ zPJk#0`^$}y7qMYp90KBs%O;JOvnuI0Co-M}6hrZ7hzCGpOeOlL`>{Bs%sd{*8}q2Va#q3xF5c$MNrxgx~0u2Kpm9JSkQwc;jhdE|M)z+?Y?{7s_Y(WCocn-T-i`F^UVMSGJL6WZKqRUss z7Nw55BP&f6Ta?0h)KgPfWvOC|RaQMws%D^gGN43NY(d&8IW<3XjzagIuj{A|a;{M8Kn`^%a3>INXn(RlAlNs$@lR;0RQEM5D*D3jWtzAu*z~jisFS>btIl0I|L>40nu| z5;e_>!n$-zJPPZNZkiW_b-Am$yiN0>051_;mX%wQrg<@Ft%AH)*!;>&b$dqt-8E** zG8Z~2zM*?Q(yAO&-9%~s8UNf2$$RO)G*jI~Z2|6n-S7J2N1$FJfB|C*ndntabxRF@ zI0=t>`(`p=>7M^~#DHJCHdEd7XPK{jlHM0Gzt?S7BWt(3=hh6rp#jf&aXi#liOjQ( zl!uOcdTu`W>hxs+W?Hdidztz7ac4Fg8eQBDe!fCGILzjFc|fv7AAGk*VWyYYB>kW{ z$$x9+%h|}=h+xiJRJ4c8Qar7Q4%wK(>=GDpM4-m9=g>F)1`XBLvKAK8mJ%ohv>dcv0x}j`wQit3Ry={_&MFLl7Y~( z2qY0AaAa9t=sH+MEU1nk6RP|iu3tdiYcH3ur zZmsbvPC;(ZSz;?`t`TxSL$BOiLqVn1&Ap4KZAcNNgSk05Pu3_T2#fV3V-^K??2h7C zya=D~sg*U?h>|=8YYeJHJt%?>R`E4nH3YU)$*s-#vg-*;z%`(d2MJSdAqje0j;?q5$*6>8w9!c_WvE94-c}ReU*M5gt^lCr*?I7FYpm zC<4tW+5%^Le)TO%LUgGa#kZy98N(V(niC`yljneoLwy<|Qze*uq_xnuIDk(TM6`muS?35p$3` zma#%rX?x)GhreIHJ|Eld?VWbPy~-xk@l!wB^5vW~Cu9Rydhxa1GqBIZ$W=^b{?63o Fe*uj`SDyd? diff --git a/.playwright-mcp/console-2026-05-15T03-08-36-662Z.log b/.playwright-mcp/console-2026-05-15T03-08-36-662Z.log deleted file mode 100644 index 96c25b4f52c80e63a6321a03adf862be6e823354..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36210 zcmeHQYj@i=65Y@J75LIs(v8ITOFcPl{D|Ymuj8mm(;Occ1VM>0MKA;@+3DH;zC(hh zEwx=cF{O}{{Uxz1lDHTEGq`gx{D8!dHRWe$H%VABL??Jm5lJwgP!HkALvzegLOD%Q z$`E#0mJZzzM;C+d@{4hb&PUiCglt^g;E-~j-{FZgVN)uxm_{VTb7>I8Q|Ua4FD1v; zG@{t9>e+@%3`dHXN6)9s%RNE7t+B;J~V7u(T1k_ z^!oYREK2ERI-n8H5(BBYM8me~n@Fa_l;NhcyTyXRxhcXPHIZ1>=DNY!H?vPT< zFU~(@G^2cI>O-TtxctJP{C9skrCxwj=)J`orNNXYe5f1h(D}>71c#xE$;Bwa)0l-p z^q0#qzlzBDgs}@gR5W?0Sk+C6KcQpyBPHoz0_F}^YC20djG-zoJ$@@;b54^j06`;f zkOLYq7OvEcj%5uMWvL-68?&bF7%*(i>me(;eV*VrrrxWf+ml-1W@!-en>k~vx(OYx zKmG1QG2?Yd$*25>-P64YM%%#0@ahcSyh_}V;3 zCkP{+;xyxk`AC;F^yDe}8BNkO=0iz>8J~G{fCFhL7f)0am^Q@|-@Q0J+CSPmLnFBL z^@FMlF^6@A_hCLk`bHlD!qjKURGLT- z2~Nk7ayR0KuI48p#hjukz5w?JF(nF8G=VS}gHwpXImJm4rTu~VA83Zdj23}1d@119 z4hGyv9tTEgz#tS1uNGXy*TPS;B;w%NspLy6cY`xoO2|YC)Vaka`BHx&es-dh{hia} zWST1P<{u%3hHzT)-CZf7a|pMSDGq;v5Ptj|XDPdO(T-!uh3yWG!97cZ9|k`>AN(NQ zc5O{Z&~BWr^l z+T3=n==bg8Uynv-=wCymw4uXW*=VEa>79Mp{0ZWx4LxnPy3xNK9-N`?$@d=efw1cH z;4>Y{KN1!K>y{=s;xPn4QQ97Jhz&iAp{^mb#gs0|k$afz2p_dz{&W?V*m3M1y*$3x z{A!7@x`|4x8AYVtoq5$sP=dY~z1TX~z1OrVvOjHD1)U;_=pHafc&&N zRW`MSpz4GsB}!n-AZbai&@5m;^#Sf7x=i{I4W|JP`w$tEi#&T%LIy64%?ol3dILW5 z7|Eu~DVU~qf!KAGapeYff$At?^{s~d5l9MVkbT51B%ZN{V@RFz#&e~rW?4(C?cb&| zD;E2a=l&v^f0aD9s@ck|fGxLM1Og7oMT0_vr?5FsigorR31+zz;|0kz9B9Nqn}8~V zLT=y+F3B4Td175wiVOgsusQrX$4OKyS#SZ1I0M~E;}>YnHWpT=2TKB!B}u^7uF2pB zB*%BDFFT4seA&gCCn=U?+lp>znrfR8aUIJwvE`ViOkFJdzN=DM*Br}mWa1FZa4DsZ zW5Z2s&9XJ3Dwb?HhHB{qvWb#yBuCoBHGKQUFYnazG9#kuva#%;E1?9CHQ$TtqXaPIfB{Tq@5aoR2G3*u&T@r$MXOYr}C+N}kk)NyQb7dQ)R;O-?Q zpoq;`gs2cm^J3nYlmqwz@N5wH=hQ;}rEL+&8nU<-qRAcAJWJw)>cgF)|UPNL-d9KcbieQ8weyUR|YqL)}SD8#w{ z#{-H}0017?mnv9>@Vj7E%VGD}=l!+!`5nH#gWk^BWN)vjN;&7MxIPbE|Dvj|Sc^v* zsxdT_24VVwkGk2Bt>_Gf=D^nA_6prD0@}Os9OHo+*SrfB!o$t$0$tXPC5iU>Irutk z351m)hI6&}H8X!!3s?oxg~i-mpUAnccHa`Du0>S7f_8s1L33SLM6#+FJFUkeR<8of z+Qiv)*`dvC7mMwh#MyOqcqyOZcTIaiBxo3#Y)jPfEQ9K%LN!D7G+8lp zkD4~|6xp;@*EbE{QhZOf9n;3HY#BPp0jX z#*&!qrdJvy60FDm^+=8rti<>BfizVdZ`7^EC@I^FH73)qb<_8-V0}UrsZ2UilX!xq$Xlf21eBFFKQSRh3SVy5n?Ez zlAl`Ig?B65>+tRkR;VxRO17?K0+A5d-MD6eMY!vsU`0&fhj8XiN{w9bdLQ*>Girn2PUEsOqMe7}RE}Ot$21qvz}teGdeYXR%%i_uKGN)go61q)=^ z=5>KB8@AAyS3`dN)fnoqCB)_>*;@o>YdPp&Q@d{mm2GYJH#^k70vog*%dHbhM-JS}?9_I_qCoPp`GALOqREO669Qj`7!otRyYEh-`t3|Mmwx z>oQn3VX1;VX-a{DnvA6ix6(CKx5`*`W?reC1SM#?1{El%YhnpHu7kjq4!d?|el77U z9RX&T`jTYuQSQkicstzH{q%msi~3|7NR=M8AH&<{@|WvL6VN CLI Fingerprint` use `src/shared/constants/cliCompatProviders.ts`. -This keeps provider IDs aligned with CLI cards and legacy IDs. - -| CLI ID | Fingerprint Provider ID | -| ---------------------------------------------------------------------------------------------------- | ----------------------- | -| `kilo` | `kilocode` | -| `copilot` | `github` | -| `claude` / `codex` / `antigravity` / `kiro` / `cursor` / `cline` / `opencode` / `droid` / `openclaw` | same ID | - -Legacy IDs still accepted for compatibility: `copilot`, `kimi-coding`, `qwen`. - ---- - -## Step 1 — Get an OmniRoute API Key - -1. Open the OmniRoute dashboard → **API Manager** (`/dashboard/api-manager`) -2. Click **Create API Key** -3. Give it a name (e.g. `cli-tools`) and select all permissions -4. Copy the key — you'll need it for every CLI below - -> Your key looks like: `sk-xxxxxxxxxxxxxxxx-xxxxxxxxx` - ---- - -## Step 2 — Install CLI Tools - -All npm-based tools require Node.js 18+: - -```bash -# Claude Code (Anthropic) -npm install -g @anthropic-ai/claude-code - -# OpenAI Codex -npm install -g @openai/codex - -# OpenCode -npm install -g opencode-ai - -# Cline -npm install -g cline - -# KiloCode -npm install -g kilocode - -# Kiro CLI (Amazon — requires curl + unzip) -apt-get install -y unzip # on Debian/Ubuntu -curl -fsSL https://cli.kiro.dev/install | bash -export PATH="$HOME/.local/bin:$PATH" # add to ~/.bashrc -``` - -**Verify:** - -```bash -claude --version # 2.x.x -codex --version # 0.x.x -opencode --version # x.x.x -cline --version # 2.x.x -kilocode --version # x.x.x (or: kilo --version) -kiro-cli --version # 1.x.x -``` - ---- - -## Step 3 — Set Global Environment Variables - -Add to `~/.bashrc` (or `~/.zshrc`), then run `source ~/.bashrc`: - -```bash -# OmniRoute Universal Endpoint -export OPENAI_BASE_URL="http://localhost:20128/v1" -export OPENAI_API_KEY="sk-your-omniroute-key" -export ANTHROPIC_BASE_URL="http://localhost:20128" -export ANTHROPIC_AUTH_TOKEN="sk-your-omniroute-key" -export GEMINI_BASE_URL="http://localhost:20128/v1" -export GEMINI_API_KEY="sk-your-omniroute-key" -``` - -> For a **remote server** replace `localhost:20128` with the server IP or domain, -> e.g. `http://192.168.0.15:20128`. - ---- - -## Step 4 — Configure Each Tool - -### Claude Code - -```bash -# Create ~/.claude/settings.json: -mkdir -p ~/.claude && cat > ~/.claude/settings.json << EOF -{ - "env": { - "ANTHROPIC_BASE_URL": "http://localhost:20128", - "ANTHROPIC_AUTH_TOKEN": "sk-your-omniroute-key" - } -} -EOF -``` - -Use the unified Anthropic gateway root for Claude Code. Do not append `/v1` here. - -**Test:** `claude "say hello"` - ---- - -### OpenAI Codex - -```bash -mkdir -p ~/.codex && cat > ~/.codex/config.yaml << EOF -model: auto -apiKey: sk-your-omniroute-key -apiBaseUrl: http://localhost:20128/v1 -EOF -``` - -**Test:** `codex "what is 2+2?"` - ---- - -### OpenCode - -```bash -mkdir -p ~/.config/opencode && cat > ~/.config/opencode/config.toml << EOF -[provider.openai] -base_url = "http://localhost:20128/v1" -api_key = "sk-your-omniroute-key" -EOF -``` - -**Test:** `opencode` - ---- - -### Cline (CLI or VS Code) - -**CLI mode:** - -```bash -mkdir -p ~/.cline/data && cat > ~/.cline/data/globalState.json << EOF -{ - "apiProvider": "openai", - "openAiBaseUrl": "http://localhost:20128/v1", - "openAiApiKey": "sk-your-omniroute-key" -} -EOF -``` - -**VS Code mode:** -Cline extension settings → API Provider: `OpenAI Compatible` → Base URL: `http://localhost:20128/v1` - -Or use the OmniRoute dashboard → **CLI Tools → Cline → Apply Config**. - ---- - -### KiloCode (CLI or VS Code) - -**CLI mode:** - -```bash -kilocode --api-base http://localhost:20128/v1 --api-key sk-your-omniroute-key -``` - -**VS Code settings:** - -```json -{ - "kilo-code.openAiBaseUrl": "http://localhost:20128/v1", - "kilo-code.apiKey": "sk-your-omniroute-key" -} -``` - -Or use the OmniRoute dashboard → **CLI Tools → KiloCode → Apply Config**. - ---- - -### Continue (VS Code Extension) - -Edit `~/.continue/config.yaml`: - -```yaml -models: - - name: OmniRoute - provider: openai - model: auto - apiBase: http://localhost:20128/v1 - apiKey: sk-your-omniroute-key - default: true -``` - -Restart VS Code after editing. - ---- - -### Kiro CLI (Amazon) - -```bash -# Login to your AWS/Kiro account: -kiro-cli login - -# The CLI uses its own auth — OmniRoute is not needed as backend for Kiro CLI itself. -# Use kiro-cli alongside OmniRoute for other tools. -kiro-cli status -``` - ---- - -### Qwen Code (Alibaba) - -Qwen Code supports OpenAI-compatible API endpoints via environment variables or `settings.json`. - -**Option 1: Environment variables (`~/.qwen/.env`)** - -```bash -mkdir -p ~/.qwen && cat > ~/.qwen/.env << EOF -OPENAI_API_KEY="sk-your-omniroute-key" -OPENAI_BASE_URL="http://localhost:20128/v1" -OPENAI_MODEL="auto" -EOF -``` - -**Option 2: `settings.json` with model providers** - -```json -// ~/.qwen/settings.json -{ - "env": { - "OPENAI_API_KEY": "sk-your-omniroute-key", - "OPENAI_BASE_URL": "http://localhost:20128/v1" - }, - "modelProviders": { - "openai": [ - { - "id": "omniroute-default", - "name": "OmniRoute (Auto)", - "envKey": "OPENAI_API_KEY", - "baseUrl": "http://localhost:20128/v1" - } - ] - } -} -``` - -**Option 3: Inline CLI flags** - -```bash -OPENAI_BASE_URL="http://localhost:20128/v1" \ -OPENAI_API_KEY="sk-your-omniroute-key" \ -OPENAI_MODEL="auto" \ -qwen -``` - -> For a **remote server** replace `localhost:20128` with the server IP or domain. - -**Test:** `qwen "say hello"` - -### Cursor (Desktop App) - -> **Note:** Cursor routes requests through its cloud. For OmniRoute integration, -> enable **Cloud Endpoint** in OmniRoute Settings and use your public domain URL. - -Via GUI: **Settings → Models → OpenAI API Key** - -- Base URL: `https://your-domain.com/v1` -- API Key: your OmniRoute key - ---- - -## Dashboard Auto-Configuration - -The OmniRoute dashboard automates configuration for most tools: - -1. Go to `http://localhost:20128/dashboard/cli-tools` -2. Expand any tool card -3. Select your API key from the dropdown -4. Click **Apply Config** (if tool is detected as installed) -5. Or copy the generated config snippet manually - ---- - -## Built-in Agents: Droid & OpenClaw - -**Droid** and **OpenClaw** are AI agents built directly into OmniRoute — no installation needed. -They run as internal routes and use OmniRoute's model routing automatically. - -- Access: `http://localhost:20128/dashboard/agents` -- Configure: same combos and providers as all other tools -- No API key or CLI install required - ---- - -## Available API Endpoints - -| Endpoint | Description | Use For | -| -------------------------- | ----------------------------- | --------------------------- | -| `/v1/chat/completions` | Standard chat (all providers) | All modern tools | -| `/v1/responses` | Responses API (OpenAI format) | Codex, agentic workflows | -| `/v1/completions` | Legacy text completions | Older tools using `prompt:` | -| `/v1/embeddings` | Text embeddings | RAG, search | -| `/v1/images/generations` | Image generation | GPT-Image, Flux, etc. | -| `/v1/audio/speech` | Text-to-speech | ElevenLabs, OpenAI TTS | -| `/v1/audio/transcriptions` | Speech-to-text | Deepgram, AssemblyAI | - -### CLI Tools API (New in v3.8) - -| Endpoint | Method | Description | -| ------------------------------- | ------ | ------------------------------------------------ | -| `/api/cli-tools/detect` | GET | Detect all installed CLI tools and config status | -| `/api/cli-tools/detect?tool=ID` | GET | Detect a specific tool by ID | -| `/api/cli-tools/config` | GET | List generated configs for all tools | -| `/api/cli-tools/config` | POST | Generate config for a specific tool | -| `/api/cli-tools/apply` | POST | Apply config to a tool (with backup) | - ---- - -## CLI Commands Reference (New in v3.8) - -### `omniroute config` - -Manage CLI tool configurations directly from the terminal. - -```bash -omniroute config list # List all tools and config status -omniroute config get # Show config for a specific tool -omniroute config set \ # Generate and write config - --api-key sk-your-key \ - [--base-url http://localhost:20128/v1] \ - [--model auto] -omniroute config validate # Validate config without writing -``` - -**Options:** `--base-url`, `--api-key`, `--model`, `--json`, `--non-interactive`, `--yes`, `--help` - -### `omniroute status` - -Show offline status dashboard with version, database, and tool info. - -```bash -omniroute status # Human-readable status -omniroute status --json # JSON output -omniroute status --verbose # Include tool detection details -``` - -### `omniroute logs` - -Stream usage logs from the API endpoint. - -```bash -omniroute logs # Fetch last 100 log lines -omniroute logs --follow # Stream in real-time -omniroute logs --filter error,warn # Filter by level -omniroute logs --lines 500 # Fetch more lines -omniroute logs --base-url http://localhost:20128 -``` - -**Options:** `--follow`, `--filter`, `--lines`, `--timeout`, `--base-url`, `--json`, `--help` - -### `omniroute update` - -Check for or apply OmniRoute updates. - -```bash -omniroute update --check # Check for updates only -omniroute update --dry-run # Preview update without applying -omniroute update --yes # Apply update without prompt -omniroute update --no-backup # Skip backup creation -``` - -**Options:** `--check`, `--dry-run`, `--backup`, `--no-backup`, `--yes`, `--help` - -### `omniroute provider` - -Manage provider connections from the CLI. - -```bash -omniroute provider add openai --api-key sk-xxx # Add a provider -omniroute provider list # List all providers -omniroute provider remove # Remove a provider -omniroute provider test # Test connectivity -omniroute provider default # Set default provider -``` - -**Options:** `--provider`, `--api-key`, `--provider-name`, `--default-model`, `--base-url`, `--json`, `--yes`, `--help` - ---- - -## Quick Setup Script (One Command) - -Set up all CLI tools and configure for OmniRoute: - -```bash -OMNIROUTE_URL="http://localhost:20128/v1" -OMNIROUTE_ANTHROPIC_URL="http://localhost:20128" -OMNIROUTE_KEY="sk-your-omniroute-key" - -npm install -g @anthropic-ai/claude-code @openai/codex opencode-ai cline kilocode @qwen-code/qwen-code - -# Kiro CLI -apt-get install -y unzip 2>/dev/null; curl -fsSL https://cli.kiro.dev/install | bash - -# Write configs -mkdir -p ~/.claude ~/.codex ~/.config/opencode ~/.continue - -cat > ~/.claude/settings.json <<< "{\"env\":{\"ANTHROPIC_BASE_URL\":\"$OMNIROUTE_ANTHROPIC_URL\",\"ANTHROPIC_AUTH_TOKEN\":\"$OMNIROUTE_KEY\"}}" -cat > ~/.codex/config.yaml <<< "model: auto\napiKey: $OMNIROUTE_KEY\napiBaseUrl: $OMNIROUTE_URL" -cat >> ~/.bashrc << EOF -export OPENAI_BASE_URL="$OMNIROUTE_URL" -export OPENAI_API_KEY="$OMNIROUTE_KEY" -export ANTHROPIC_BASE_URL="$OMNIROUTE_ANTHROPIC_URL" -export ANTHROPIC_AUTH_TOKEN="$OMNIROUTE_KEY" -EOF - -source ~/.bashrc -echo "✅ All CLIs installed and configured for OmniRoute" -``` - -```bash -# Install all CLIs and configure for OmniRoute (replace with your key and server URL) -OMNIROUTE_URL="http://localhost:20128/v1" -OMNIROUTE_ANTHROPIC_URL="http://localhost:20128" -OMNIROUTE_KEY="sk-your-omniroute-key" - -npm install -g @anthropic-ai/claude-code @openai/codex opencode-ai cline kilocode @qwen-code/qwen-code - -# Kiro CLI -apt-get install -y unzip 2>/dev/null; curl -fsSL https://cli.kiro.dev/install | bash - -# Write configs -mkdir -p ~/.claude ~/.codex ~/.config/opencode ~/.continue - -cat > ~/.claude/settings.json <<< "{\"env\":{\"ANTHROPIC_BASE_URL\":\"$OMNIROUTE_ANTHROPIC_URL\",\"ANTHROPIC_AUTH_TOKEN\":\"$OMNIROUTE_KEY\"}}" -cat > ~/.codex/config.yaml <<< "model: auto\napiKey: $OMNIROUTE_KEY\napiBaseUrl: $OMNIROUTE_URL" -cat >> ~/.bashrc << EOF -export OPENAI_BASE_URL="$OMNIROUTE_URL" -export OPENAI_API_KEY="$OMNIROUTE_KEY" -export ANTHROPIC_BASE_URL="$OMNIROUTE_ANTHROPIC_URL" -export ANTHROPIC_AUTH_TOKEN="$OMNIROUTE_KEY" -EOF - -source ~/.bashrc -echo "✅ All CLIs installed and configured for OmniRoute" -```