diff --git a/_references/_sistemas_cli/01-relatorio-pesquisa-clis-omniroute.md b/_references/_sistemas_cli/01-relatorio-pesquisa-clis-omniroute.md new file mode 100644 index 0000000000..450ff31530 --- /dev/null +++ b/_references/_sistemas_cli/01-relatorio-pesquisa-clis-omniroute.md @@ -0,0 +1,296 @@ +# Relatorio de pesquisa: repositorios de CLI integraveis com OmniRoute + +> **Status final (2026-08-03):** este documento preserva o inventário inicial. A pesquisa foi concluída para `104/104` casos. Para resultados por projeto, use `04-tracker-integracoes-clis.md`; para o fechamento executivo e a estratégia de publicação, use `06-relatorio-final-104-clis-e-estrategia-prs.md`. + +**Data da pesquisa:** 2026-08-01 +**Escopo:** agentes de codigo de terminal, CLIs de LLM, runtimes de agentes e harnesses que possam consumir um endpoint HTTP compativel com OpenAI, Anthropic ou Gemini, ou que possam ser adaptados por provider/plugin/ACP/MITM. +**Fonte local principal:** `_tasks/hands-off/2026-08-01_release-v3.8.50_v3.8.50_sess-e1846bc2/handoff.md` +**Fontes externas principais:** GitHub Search/API, READMEs dos repositorios e a lista publica `bradAGI/awesome-cli-coding-agents` (atualizada em 2026-07-29). + +## 1. Resumo executivo + +O OmniRoute ja possui uma integracao funcional com o jcode e um catalogo local de ferramentas CLI. O proximo ganho de maior valor e transformar o OmniRoute em um endpoint reconhecido pelos principais agentes de terminal, priorizando configuracao nativa e PR upstream quando o projeto aceitar contribuicoes. + +A pesquisa encontrou: + +- **33 entradas de ferramentas no registro local `CLI_TOOLS`**, contando o registro extraido de Grok Build em `src/shared/constants/cliToolsGrokBuild.ts`, incluindo Claude Code, Codex CLI, Cline, Kilo, Continue, OpenCode, Aider, jcode, Smelt, Pi, Crush, Goose, Open Interpreter, OpenClaw, Hermes Agent, Letta CLI e outros. +- **Mais de 90 projetos publicos** no inventario externo consultado, entre agentes de codigo, CLIs generalistas, forks, runtimes e orquestradores. +- **Candidatos com evidencia forte de endpoint customizavel:** Gemini CLI, Claw Code, Plandex, MiMo Code, Trae Agent, Kimi CLI, Every Code, Open Codex, VT Code, OpenHands CLI, gptme, Nanocoder, RA.Aid, CoreCoder, Grok CLI, Gitlawb Zero, DeepSeek Reasonix, KlaatCode, CodeMini, DvalinCode, Coro Code, Mini-Kode, Late CLI, Agentty, Aizen, Minacode, YottaCode, aichat, ShellGPT, Mistral Vibe, OpenSquilla, Kode CLI e outros. +- **Candidatos que exigem pesquisa confirmatoria:** projetos com README generico, configuracao recente, repositorio ambiguo, binario fechado ou sem evidencia textual suficiente de `base_url`/provider. +- **Candidatos que podem ser integrados por outros caminhos:** ACP, MCP, wrapper/launcher, provider adapter, proxy MITM ou apenas documentacao; eles nao devem ser classificados automaticamente como OpenAI-compatible. + +Conclusao: devemos pesquisar e tentar todos os candidatos tecnicamente viaveis, mas separar claramente `suporte no catalogo OmniRoute`, `configuracao generica`, `adaptacao upstream publicada` e `PR/issue aceita`. O tracker acompanha essas dimensoes separadamente. + +## 2. Metodo e limites + +### 2.1 Como a busca foi feita + +1. Leitura integral do handoff do caso jcode para capturar o padrao de integracao, validacao, publicacao e as restricoes de worktree. +2. Inspecao do catalogo local em `src/shared/constants/cliTools.ts`, da documentacao de CLI e do fluxo de setup em `docs/guides/CLI-INTEGRATIONS.md`. +3. Consulta do GitHub Search/API para resolver o repositorio canonico de cada nome, evitando homonimos. +4. Leitura de README/raw quando disponivel, procurando sinais como `base_url`, `baseURL`, `OPENAI_BASE_URL`, `OPENAI_API_BASE`, `LLM_BASE_URL`, `provider`, `gateway`, `model provider`, `Anthropic` e `Gemini`. +5. Consulta da lista `https://github.com/bradAGI/awesome-cli-coding-agents`, que serve como descoberta ampla, nao como prova de compatibilidade. +6. Classificacao por adocao, manutencao, licenca, evidencia de endpoint, maturidade, potencial de PR e utilidade para o ecossistema OmniRoute. + +### 2.2 O que ainda nao foi afirmado + +- Nao foi feita implementacao ou abertura de PR/issue para os candidatos abaixo; o unico caso publicado nesta sessao anterior e o jcode. +- A presenca da palavra `provider` no README nao prova que uma URL arbitraria funciona em runtime. +- Estrelas e datas sao snapshots aproximados obtidos em 2026-08-01 e podem mudar. +- Repositorios fechados ou com EULA entram no inventario para avaliacao de configuracao, mas nao implicam possibilidade de fork ou PR. +- Cada task de integracao precisa repetir a pesquisa no upstream antes de editar codigo. + +## 3. Baseline do OmniRoute + +### 3.1 Superficie que o OmniRoute oferece + +- Endpoint OpenAI em `/v1`. +- Superficie Anthropic na raiz, usada por clientes que esperam `/v1/messages` a partir do `ANTHROPIC_BASE_URL`. +- Superficie Gemini em `/v1beta`. +- Catalogo de modelos consultavel pelos comandos de setup quando o cliente suporta descoberta. +- Chave via `OMNIROUTE_API_KEY` ou chave selecionada no dashboard. +- Traducao entre formatos, streaming SSE, tool calling, fallback, combos, custos e politicas de autenticacao. +- Modos de consumo: configuracao de ambiente, arquivo nativo do cliente, provider customizado, ACP/MCP e MITM. + +### 3.2 Catalogo local ja registrado + +Fonte: `src/shared/constants/cliTools.ts` e `src/shared/constants/cliToolsGrokBuild.ts`. + +**Codigo/CLI:** Claude Code, OpenAI Codex CLI, Factory Droid, OpenClaw, Cursor, Cline, Kilo Code, Continue, Antigravity, GitHub Copilot CLI, OpenCode, Kiro, Qwen Code, Aider, ForgeCode, Cursor Agent CLI, Roo Code, jcode, DeepSeek TUI, CodeWhale, Smelt, Pi, Crush. + +**Agentes:** Hermes, Hermes Agent, Goose, Open Interpreter, Oh My Pi, Letta CLI, Warp AI, Agent Deck. + +Os documentos do catalogo tambem mantem um backlog MITM para ferramentas sem base URL, como Windsurf, Amp, Amazon Q/Kiro CLI e Cowork. Esses casos devem permanecer separados de uma integracao direta. + +### 3.3 Caso jcode (referencia validada) + +- Upstream: `https://github.com/1jehuang/jcode` +- Mecanismo: perfil OpenAI-compatible dirigido por metadados; nao foi criado um plugin de runtime. +- Branch: `feat/omniroute-provider` +- Commit: `ee4f904e6` +- PR no fork: `https://github.com/diegosouzapw/jcode/pull/1` +- Issue no upstream: `https://github.com/1jehuang/jcode/issues/704` +- Diff: 6 arquivos, `+56/-3`. +- Validacao: `cargo check --workspace` limpo; 205 testes passaram e uma falha foi preexistente/ambiental. +- Estado: aguardando mantenedor; o upstream nao aceita PR de forks externos, por isso a issue e o artefato oficial. +- Pendencia prometida: adicionar no README do OmniRoute a secao "Tools & repositories that work with OmniRoute". + +Licao: o trabalho deve comecar descobrindo o mecanismo real de providers do upstream. Nem todos os clientes precisam de mudanca no OmniRoute; alguns precisam somente de um perfil local, e outros exigirao um adaptador especifico. + +## 4. Candidatos prioritarios com evidencia concreta + +As evidencias abaixo sao sinais de README/configuracao observados na pesquisa inicial. A task individual deve abrir o arquivo exato, confirmar a versao atual e executar um smoke test. + +| Projeto | Repositorio | Evidencia inicial | Rota provavel | +|---|---|---|---| +| Gemini CLI | `google-gemini/gemini-cli` | `GOOGLE_GEMINI_BASE_URL` | configuracao direta; possivel PR/documentacao | +| Claw Code | `ultraworkers/claw-code` | `OPENAI_BASE_URL`, provider compativel | configuracao direta ou provider | +| Plandex | `plandex-ai/plandex` | providers customizados com `baseUrl` | provider/preset | +| MiMo Code | `XiaomiMiMo/MiMo-Code` | `@ai-sdk/openai-compatible` e `baseURL` | provider customizado | +| Trae Agent | `bytedance/trae-agent` | `model_providers` e `base_url` | provider/config | +| Kimi CLI | `MoonshotAI/kimi-cli` | modos `openai_legacy`, `openai_responses`, `anthropic` e `base_url` | provider nativo/config | +| Every Code | `just-every/code` | fork Codex com providers OpenAI/Claude/Gemini | perfil/provider | +| Open Codex | `ymichael/open-codex` | multi-provider e OpenAI-compatible | fork/provider | +| VT Code | `vinhnx/vtcode` | `custom_providers[].base_url`, failover | provider customizado | +| OpenHands CLI | `OpenHands/OpenHands-CLI` | `LLM_BASE_URL` | configuracao direta | +| gptme | `gptme/gptme` | `OPENAI_BASE_URL` e providers | configuracao direta | +| Nanocoder | `Nano-Collective/nanocoder` | qualquer API OpenAI-compatible | configuracao direta | +| RA.Aid | `ai-christianson/RA.Aid` | `OPENAI_API_BASE` | configuracao direta | +| CoreCoder | `he-yufeng/CoreCoder` | `OPENAI_BASE_URL` | configuracao direta | +| Grok CLI | `superagent-ai/grok-cli` | `GROK_BASE_URL`/`baseURL` | configuracao direta | +| Gitlawb Zero | `Gitlawb/zero` | provider `custom-openai-compatible`, `--base-url` | provider/flag | +| DeepSeek Reasonix | `esengine/DeepSeek-Reasonix` | provider compativel e endpoint | confirmar configuracao | +| KlaatCode | `KlaatAI/klaatcode` | `customModels` OpenAI-compatible | configuracao JSON | +| CodeMini CLI | `havingautism/Codemini-CLI` | `gateway.base_url` | gateway/config | +| Zot | `patriceckhart/zot` | `--base-url` e provider custom em `models.json` | flag/config | +| Pool | `poolsideai/pool` | `POOLSIDE_STANDALONE_BASE_URL`; licenca proprietaria | configuracao, sem PR assumido | +| Octomind | `Muvon/octomind` | `_API_URL`/`LOCAL_API_URL` | provider/env | +| Coro Code | `Blushyes/coro-code` | `OPENAI_BASE_URL` | configuracao direta | +| Mini-Kode | `minmaxflow/mini-kode` | `MINIKODE_BASE_URL` | configuracao direta | +| Late CLI | `mlhher/late-cli` | `OPENAI_BASE_URL`/`api-url` | env/flag | +| Agentty | `1ay1/agentty` | modelo agnostico e endpoints compativeis | confirmar arquivo de config | +| Aizen | `aizen-stack/aizen` | CLI Rust OpenAI-compatible; `AIZEN_BASE_URL` | configuracao direta | +| Clif-Code | `DLhugly/Clif-Code` | OpenRouter/OpenAI/Anthropic/Ollama | provider/config | +| Minacode | `hit9/minacode` | provider e compatibilidade no README | confirmar URL | +| YottaCode | `yottadynamics/yottacode` | modelo escolhido, gateway/provider | confirmar config | +| aichat | `sigoden/aichat` | providers OpenAI/Claude/Gemini e compatibilidade | `models.yaml`/provider | +| ShellGPT | `TheR1D/shell_gpt` | `API_BASE_URL` | env/config | +| Mistral Vibe | `mistralai/mistral-vibe` | `base_url`, API base e provider | config/env | +| OpenSquilla | `opensquilla/opensquilla` | 20+ providers e gateway | provider/config | +| Kode CLI | `shareAI-lab/Kode-cli` | provider, endpoint e Anthropic/OpenAI/Gemini | config | +| Crush | `charmbracelet/crush` | `base_url`, provider compativel | ja catalogado no OmniRoute; validar upstream | +| Hermes Agent | `NousResearch/hermes-agent` | endpoint/gateway e 300+ modelos | ja catalogado; validar modo de endpoint | +| OpenClaw | `openclaw/openclaw` | providers, gateway e endpoints | ja catalogado; validar configuracao atual | + +## 5. Inventario amplo localizado + +### 5.1 Agentes de terminal e coding CLIs + +Os projetos desta tabela foram encontrados na lista curada ou no GitHub Search. `Pesquisa` indica o proximo gate; nao significa que a integracao ja esta pronta. + +| Projeto | Repositorio | Licenca/sinal publico | Situacao inicial | +|---|---|---|---| +| OpenCode | `anomalyco/opencode` | multi-provider, 75+ providers | ja suportado; acompanhar provider/plugin | +| Codex CLI | `openai/codex` | Apache-2.0, provider configuravel | ja suportado | +| OpenHands principal | `All-Hands-AI/OpenHands` | OSS, CLI e web | pesquisar CLI e `LLM_BASE_URL` | +| Pi | `badlogic/pi-mono` | harness multi-provider | ja suportado; confirmar repo atual | +| Open Interpreter | `OpenInterpreter/open-interpreter` | Apache-2.0, `--api_base` | ja suportado | +| Cline | `cline/cline` | Apache-2.0, base URL/gateway | ja suportado | +| Goose | `aaif-goose/goose` | Apache-2.0, providers | ja suportado | +| Aider | `Aider-AI/aider` | Apache-2.0, Anthropic/OpenAI | ja suportado | +| Continue | `continuedev/continue` | Apache-2.0, multi-model | ja suportado | +| Deep Agents Code | `langchain-ai/deepagents` | MIT, tool-calling LLM | pesquisar pacote `deepagents-code` | +| Crush | `charmbracelet/crush` | provider/base URL | ja suportado | +| Kilo Code | `Kilo-Org/kilocode` | MIT, providers | ja suportado | +| Qwen Code | `QwenLM/qwen-code` | Apache-2.0, providers | ja suportado | +| Roo Code | `RooCodeInc/Roo-Code` | Apache-2.0 | ja catalogado; validar CLI | +| Grok Build | `xai-org/grok-build` | Apache-2.0, provider | ja suportado | +| Oh My Pi | `can1357/oh-my-pi` | provider custom em YAML | ja suportado | +| SWE-agent | `SWE-agent/SWE-agent` | MIT | pesquisar backend e base URL | +| Smol Developer | `smol-ai/developer` | embeddable agent | adapter/SDK, nao necessariamente CLI | +| Claude Engineer | `Doriandarko/claude-engineer` | CLI Claude | pesquisar provider | +| Claurst | `Kuberwastaken/claurst` | GPL-3.0, provider | confirmar endpoint e politica de fork | +| Free Code | `paoloanzn/free-code` | fork de Claude Code | pesquisar licenca e endpoint | +| Codebuff | `CodebuffAI/codebuff` | multi-agent CLI | pesquisar provider | +| ForgeCode | `antinomyhq/forge` | 300+ modelos | ja suportado | +| OpenSquilla | `opensquilla/opensquilla` | Apache-2.0, gateway | candidato forte | +| Kode CLI | `shareAI-lab/Kode-cli` | Apache-2.0, endpoint | candidato forte | +| Devon | `entropy-research/Devon` | pair programmer TUI | pesquisar backend | +| AutoCodeRover | `AutoCodeRoverSG/auto-code-rover` | agente de issues | pesquisar configuracao de modelos | +| Letta Code | `letta-ai/letta-code` | Apache-2.0, model-agnostic | pesquisar API base | +| CodeMachine CLI | `moazbuilds/CodeMachine-CLI` | multi-agent local | pesquisar provider | +| Codel | `semanser/codel` | AGPL-3.0, Docker/web UI | confirmar servidor OpenAI e restricoes AGPL | +| Agentless | `OpenAutoCoder/Agentless` | workflow sem loop persistente | pesquisar entrada de modelo | +| Amazon Q Developer CLI | `aws/amazon-q-developer-cli` | Apache-2.0 | provavelmente auth/ecossistema AWS; pesquisar | +| Neovate Code | `neovateai/neovate-code` | MIT, plugin/multi-provider | candidato forte | +| Groq Code CLI | `build-with-groq/groq-code-cli` | multi-model | pesquisar endpoint | +| Dexto | `truffle-ai/dexto` | CLI/web/API, subagentes | pesquisar provider | +| claw-code-agent | `HarnessLab/claw-code-agent` | Python, sem dependencias | confirmar endpoint | +| g3 | `dhanji/g3` | Rust, provider abstraction | confirmar licenca e URL | +| Coro Code | `Blushyes/coro-code` | base URL/OpenAI | candidato | +| Mini-Kode | `minmaxflow/mini-kode` | MIT, referencia educacional | candidato | +| zot | `patriceckhart/zot` | MIT, TUI/JSON/RPC | candidato | +| agentty | `1ay1/agentty` | MIT, ACP e multi-provider | candidato | +| nori-cli | `tilework-tech/nori-cli` | multi-provider sobre Codex | pesquisar base URL | +| cursor-agent clone | `civai-technologies/cursor-agent` | OpenAI/Claude/Ollama | pesquisar maturidade e licenca | +| DvalinCode | `arthurpanhku/dvalincode` | MIT, OpenAI-compatible | candidato | +| OpenHarness | `zhijiewong/openharness` | Apache-2.0, any LLM | candidato | +| Octomind | `Muvon/octomind` | Apache-2.0, 13+ providers | candidato | +| Codex Infinity | `lee101/codex-infinity` | fork Codex | pesquisar endpoint | +| San | `genai-io/san` | Apache-2.0, provider-neutral | pesquisar endpoint | +| Waveloom | `Menfre01/waveloom` | Apache-2.0, DeepSeek-focused | pesquisar provider | +| picocode | `jondot/picocode` | Rust, multi-LLM | pesquisar provider | +| QQCode | `qnguyen3/qqcode` | Rust, skills | pesquisar provider | +| Keen Code | `mochow13/keen-code` | MIT, 9+ providers | pesquisar provider | +| Smelt | `leonardcser/smelt` | MIT, OpenAI-compatible | ja suportado | +| Grinta | `josephsenior/Grinta-Coding-Agent` | MIT, Python | pesquisar provider | +| Zap | `zap-coding-agent/zap-coding-agent` | MIT, MCP, local/OpenAI | pesquisar endpoint | +| Binharic | `CogitatorTech/binharic-cli` | multi-provider | pesquisar endpoint | +| Darce | `AmerSarhan/darce-cli` | MIT, multi-model | pesquisar endpoint | +| CLAII | `agencyswarm/CLAII` | multi-agent/MCP | pesquisar endpoint | + +### 5.2 Agentes generalistas e ecossistema OpenClaw + +Estes podem consumir OmniRoute como backend, mas a task deve confirmar se a interface de configuracao e realmente uma CLI de codigo ou apenas um gateway de agente. + +| Projeto | Repositorio | Possivel caminho | +|---|---|---| +| OpenClaw | `openclaw/openclaw` | provider/gateway; ja catalogado | +| nanobot | `HKUDS/nanobot` | provider OpenAI-compatible | +| ZeroClaw | `zeroclaw-labs/zeroclaw` | trait de provider | +| NanoClaw | `gavrielc/nanoclaw` | Anthropic SDK; pesquisar base | +| PicoClaw | `sipeed/picoclaw` | provider/config | +| IronClaw | `nearai/ironclaw` | provider Rust | +| NullClaw | `nullclaw/nullclaw` | 23+ providers | +| Clawith | `dataelement/Clawith` | gateway/teams | +| claw0 | `shareAI-lab/claw0` | tutorial/runtime; pesquisa de viabilidade | +| Moltis | `moltis-org/moltis` | provider Rust | +| GitClaw | `open-gitagent/gitclaw` | agente Git-native; pesquisar | +| LionClaw | `moshthepitt/lionclaw` | CLI local; pesquisar | +| Aizen | `aizen-stack/aizen` | OpenAI-compatible | +| aichat | `sigoden/aichat` | provider/model YAML | +| ShellGPT | `TheR1D/shell_gpt` | `API_BASE_URL` | +| gptme | `gptme/gptme` | `OPENAI_BASE_URL` | + +### 5.3 Orquestradores, wrappers e ferramentas adjacentes + +Nao sao todos alvos de um provider OmniRoute. Devem ser avaliados para launcher, ACP, MCP, observabilidade ou configuracao de seus agentes filhos. + +| Projeto | Repositorio | Tipo de integracao a investigar | +|---|---|---| +| Agent Deck | `asheshgoplani/agent-deck` | config dos CLIs filhos; ja catalogado | +| VibePod | `VibePod/vibepod-cli` | wrapper Docker e metricas | +| zeroshot | `the-open-engine/zeroshot` | launcher/worktrees | +| Fractal | `plasma-ai/fractal` | orquestrador de CLIs | +| Bernstein | `chernistry/bernstein` | orquestrador/verificador | +| Traycer | `traycerai/traycer` | CLI custom e agentes filhos | +| h5i | `h5i-dev/h5i` | execucao paralela | +| OMK | `dmae97/open-multi-agent-kit` | control plane/provider-neutral | +| kodo | `ikamensh/kodo` | orquestrador | +| ORCH | `oxgeneral/ORCH` | fila de tarefas | +| LoopTroop | `LoopTroop-ai/LoopTroop` | orchestration sobre OpenCode | +| Galley | `shinpr/galley` | worktree/PR handoff | +| Relay | `jcast90/relay` | MCP/orquestracao | +| sage | `youwangd/SageCLI` | runtime-agnostic | +| 5dive | `5dive-ai/5dive` | agentes em servidor | +| agx | `ramarlina/agx` | checkpoints e agentes | +| claude-code-router | `musistudio/claude-code-router` | proxy/roteamento; possivel upstream consumidor | +| cc-router | `finch-xu/cc-router` | proxy Anthropic multi-provider | +| OneCLI | `onecli/onecli` | broker de credenciais, nao agente | +| agent-browser | `vercel-labs/agent-browser` | ferramenta MCP/plugin | +| OpenWork | `different-ai/openwork` | desktop sobre OpenCode | +| Mistral Vibe | `mistralai/mistral-vibe` | provider/base URL | +| Junie CLI | `junie.jetbrains.com` | fechado; configuracao BYOK a confirmar | +| Pool | `poolsideai/pool` | binario/EULA; sem PR presumido | + +## 6. Evidencias tecnicas e mapeamento para OmniRoute + +### 6.1 Padroes de endpoint encontrados + +| Padrao observado | Exemplos | Acao OmniRoute | +|---|---|---| +| `OPENAI_BASE_URL`/`OPENAI_API_BASE` | Claw Code, RA.Aid, CoreCoder, Coro Code | fornecer root ou `/v1` conforme o cliente; testar append de path | +| `base_url`/`baseURL` em provider | Plandex, MiMo Code, Trae Agent, VT Code, KlaatCode | gerar bloco de provider e modelo | +| `LLM_BASE_URL` | OpenHands CLI | configurar surface OpenAI e validar streaming/tool calling | +| `GOOGLE_GEMINI_BASE_URL` | Gemini CLI | usar superficie `/v1beta`/Gemini; confirmar formato esperado | +| `GROK_BASE_URL` | Grok CLI | decidir se o cliente fala xAI ou OpenAI; testar traducoes | +| `--base-url` | Gitlawb Zero, Zot, jcode | launcher ou perfil persistido | +| `API_BASE_URL` | ShellGPT | config/env direta | +| `_API_URL`/gateway | Octomind, Pool, OpenSquilla | provider selecionavel; testar cada preset | +| ACP/MCP sem URL direta | Agentty, Kimi CLI, Goose, OpenCode | avaliar se OmniRoute deve ser provider ou backend ACP | +| endpoint nao customizavel | Cursor desktop, Antigravity, Kiro, Windsurf, Amp | somente MITM/guide; nao prometer integracao direta | + +### 6.2 Superficies e riscos de protocolo + +- **`/v1` duplicado:** alguns clientes recebem a raiz e acrescentam `/v1/chat/completions`; outros exigem a URL final com `/v1`. Cada task deve registrar o resultado real. +- **Chat Completions vs Responses:** forks do Codex e clientes modernos podem usar Responses; testar ambas quando o cliente permitir. +- **Anthropic:** clientes que mandam `/v1/messages` esperam `ANTHROPIC_BASE_URL` sem `/v1` no valor. A traducao Anthropic do OmniRoute deve ser validada com streaming e tool use. +- **Gemini:** Gemini CLI pode esperar uma base Gemini nativa, nao somente OpenAI-compatible; validar `generateContent`, streaming e headers. +- **Tool calling:** o agente pode exigir nomes/ids de ferramenta estaveis, JSON estrito, `tool_choice` ou blocos de pensamento especificos. +- **Descoberta de modelos:** `/v1/models` pode ser obrigatorio, opcional ou inexistente. O setup precisa aceitar `--model` fixo quando a descoberta nao for suportada. +- **Autenticacao:** alguns projetos leem somente env, outros gravam tokens em arquivo/keyring e alguns usam OAuth proprietario. Nunca reutilizar credenciais de um upstream sem verificar escopo. +- **Streaming e retry:** SSE, timeouts, abort signals e re-tentativas podem divergir do cliente. Validar uma chamada longa e uma falha de provider. +- **Licenca:** GPL/AGPL, EULA e repositorios sem SPDX exigem decisao de distribuicao antes de enviar patch. + +## 7. Riscos de pesquisa e integracao + +1. **Homonomimos e clones:** usar sempre URL canonica, organizacao, release e README do repositorio correto. +2. **Repositorios que mudam rapidamente:** congelar commit/versao no relatorio da task e repetir a consulta no dia da implementacao. +3. **README divergente do codigo:** procurar schema, parser de config, testes e comando de execucao; README sozinho e evidencia Tier 1. +4. **Clientes fechados:** registrar como `needs-mitm` ou `config-only`, nunca como PR upstream. +5. **Forks com historia de origem controversa:** avaliar politica, licenca e aceite de contribuicoes antes de reproduzir componentes. +6. **Segredos no ambiente:** limpar `OMNIROUTE_API_KEY` e chaves de teste quando a suite assume ambiente sem credencial, como ocorreu no jcode. +7. **Mudancas no checkout:** usar worktree em `.claude/worktrees/` por projeto; nao editar o checkout compartilhado do OmniRoute nem usar `git stash`. + +## 8. Recomendacao + +Executar primeiro os lotes P0/P1 do documento de prioridade. Cada lote pode ter ate tres subagentes, um repositorio por worktree. O agente principal deve revisar a pesquisa, o smoke test e a licenca antes de permitir implementacao. O resultado de cada caso deve atualizar o tracker com commit, PR/issue, validacao e status upstream, sem preencher campos externos por suposicao. + +## 9. Referencias + +- OmniRoute CLI catalogo: `src/shared/constants/cliTools.ts` +- OmniRoute CLI reference: `docs/reference/CLI-TOOLS.md` +- OmniRoute setup guide: `docs/guides/CLI-INTEGRATIONS.md` +- Handoff jcode: `_tasks/hands-off/2026-08-01_release-v3.8.50_v3.8.50_sess-e1846bc2/handoff.md` +- Inventario curado: `https://github.com/bradAGI/awesome-cli-coding-agents` +- GitHub Search API: `https://api.github.com/search/repositories` diff --git a/_references/_sistemas_cli/02-prioridade-integracoes-clis.md b/_references/_sistemas_cli/02-prioridade-integracoes-clis.md new file mode 100644 index 0000000000..9db4ca246c --- /dev/null +++ b/_references/_sistemas_cli/02-prioridade-integracoes-clis.md @@ -0,0 +1,167 @@ +# Prioridade de integracoes de CLIs com OmniRoute + +> **Status final (2026-08-03):** esta é a priorização inicial que orientou a execução. Todos os `104/104` casos já foram pesquisados. A classificação final está no tracker `04`; a estratégia revisada de contribuição está no relatório `06`. + +**Snapshot:** 2026-08-01 +**Objetivo:** ordenar do melhor para o pior todos os projetos tecnicamente candidatos a consumir OmniRoute, sem remover projetos pequenos. A ordem e uma fila de pesquisa/execucao; ela nao e promessa de que todo upstream aceitara um PR. + +## Como ler a prioridade + +- **P0:** ja esta no catalogo OmniRoute ou tem evidencia muito forte de endpoint customizavel; executar/consolidar primeiro. +- **P1:** forte candidato novo, com provider/base URL evidente e bom retorno para o ecossistema. +- **P2:** tecnicamente promissor, mas requer confirmacao de protocolo, config, maturidade ou licenca. +- **P3:** possivel via ACP/MCP/wrapper/launcher, ou com menor adocao; pesquisar depois dos P0-P2. +- **P4:** cliente fechado, EULA, MITM ou pesquisa exploratoria; manter no inventario, mas nao bloquear os demais. + +Os fatores usados foram: evidencia de endpoint arbitrario, adocao/atividade, facilidade de teste, compatibilidade OpenAI/Anthropic/Gemini, maturidade, licenca, chance de PR upstream, valor para usuarios OmniRoute e risco de protocolo. + +## A. Catalogo OmniRoute ja existente + +Estas entradas ja aparecem no registro local. A prioridade aqui significa consolidar documentacao, smoke tests, detector/configurador e eventual upstream nominal; nao significa recriar uma integracao que ja existe. + +| Ordem | Projeto | Repositorio/documentacao | Estado local | Proximo foco | +|---:|---|---|---|---| +| A1 | Claude Code | `anthropics/claude-code` | catalogado; Anthropic base URL | manter compatibilidade Anthropic, streaming e tools | +| A2 | Codex CLI | `openai/codex` | catalogado; OpenAI-compatible | Responses, profiles e `/v1` | +| A3 | OpenCode | `anomalyco/opencode` | catalogado; provider | provider nativo/plugin e model discovery | +| A4 | Cline | `cline/cline` | catalogado; base URL | validar CLI/extension e append de `/v1` | +| A5 | Goose | `aaif-goose/goose` | catalogado; `OPENAI_HOST` | validar schema atual e ACP | +| A6 | Aider | `Aider-AI/aider` | catalogado; `OPENAI_API_BASE` | LiteLLM path, tools e custo | +| A7 | Continue | `continuedev/continue` | catalogado; provider OpenAI | CLI e config YAML atual | +| A8 | Kilo Code | `Kilo-Org/kilocode` | catalogado; custom URL | CLI, extension e auth | +| A9 | Roo Code | `RooCodeInc/Roo-Code` | catalogado; custom URL | CLI/headless e provider | +| A10 | Qwen Code | `QwenLM/qwen-code` | catalogado; `modelProviders` | V4 schema, Responses e env | +| A11 | Open Interpreter | `OpenInterpreter/open-interpreter` | catalogado; `--api_base` | streaming e tool execution | +| A12 | OpenClaw | `openclaw/openclaw` | catalogado; gateway/provider | config atual e segurança | +| A13 | Hermes Agent | `NousResearch/hermes-agent` | catalogado; provider/gateway | endpoint custom e modelos | +| A14 | Hermes | `NousResearch/hermes-agent` | catalogado/dual entry | distinguir CLI e agente | +| A15 | Oh My Pi | `can1357/oh-my-pi` | catalogado; YAML provider | auto-discovery e tool calling | +| A16 | Pi | `badlogic/pi-mono` | catalogado; provider | confirmar repositorio/CLI atual | +| A17 | Crush | `charmbracelet/crush` | catalogado; `base_url` | config TOML/JSON atual | +| A18 | Smelt | `leonardcser/smelt` | catalogado; OpenAI-compatible | headless e subagents | +| A19 | ForgeCode | `antinomyhq/forge` | catalogado; multi-provider | base URL e custom agents | +| A20 | jcode | `1jehuang/jcode` | integrado e proposto upstream | aguardar issue #704; manter README OmniRoute | +| A21 | DeepSeek TUI | `hunterbown/deepseek-tui` | catalogado legado | confirmar sucessor CodeWhale | +| A22 | CodeWhale | `Hmbown/CodeWhale` | catalogado | config primaria e legado | +| A23 | Grok Build | `xai-org/grok-build` | catalogado; `~/.grok/config.toml` | provider OmniRoute e modelos | +| A24 | Cursor Agent CLI | `cursor.com/cli` | catalogado parcial | confirmar limites de endpoint | +| A25 | Factory Droid | `Factory-AI/factory` | catalogado parcial | BYOK e endpoint suportado | +| A26 | GitHub Copilot CLI | `github/copilot-cli` | catalogado | provider base URL atual | +| A27 | Letta CLI | `letta-ai/letta-code` | catalogado | config pi-ai/local mode | +| A28 | Warp AI | `warpdotdev/Warp` | catalogado parcial | somente BYOK/desktop | +| A29 | Agent Deck | `asheshgoplani/agent-deck` | catalogado | agentes filhos e ACP | +| A30 | Antigravity | produto Google | MITM backlog | nao tratar como endpoint direto | +| A31 | Kiro AI | produto AWS | MITM backlog | auth/SSO e MITM | +| A32 | Cursor desktop | produto Anysphere | cloud/MITM | manter separado do Cursor CLI | + +## B. Novos candidatos em ordem de execucao + +| Ordem | Prioridade | Projeto | Repositorio | Evidencia inicial | Rota esperada | +|---:|:---:|---|---|---|---| +| 1 | P0 | Gemini CLI | `google-gemini/gemini-cli` | `GOOGLE_GEMINI_BASE_URL` | config direta/Gemini | +| 2 | P0 | Claw Code | `ultraworkers/claw-code` | `OPENAI_BASE_URL`, provider | OpenAI-compatible | +| 3 | P0 | Plandex | `plandex-ai/plandex` | provider com `baseUrl` | preset/provider | +| 4 | P0 | MiMo Code | `XiaomiMiMo/MiMo-Code` | `@ai-sdk/openai-compatible`, `baseURL` | provider | +| 5 | P0 | Trae Agent | `bytedance/trae-agent` | `model_providers`, `base_url` | provider/config | +| 6 | P0 | Kimi CLI | `MoonshotAI/kimi-cli` | OpenAI legacy/Responses/Anthropic, `base_url` | provider nativo | +| 7 | P0 | Every Code | `just-every/code` | fork Codex, OpenAI/Claude/Gemini | profile/provider | +| 8 | P0 | Open Codex | `ymichael/open-codex` | OpenAI/Gemini/OpenRouter/Ollama | profile/provider | +| 9 | P0 | VT Code | `vinhnx/vtcode` | `custom_providers[].base_url` | provider/failover | +| 10 | P0 | OpenHands CLI | `OpenHands/OpenHands-CLI` | `LLM_BASE_URL` | config direta | +| 11 | P0 | gptme | `gptme/gptme` | `OPENAI_BASE_URL` | config direta | +| 12 | P0 | Nanocoder | `Nano-Collective/nanocoder` | qualquer OpenAI-compatible | config direta | +| 13 | P0 | RA.Aid | `ai-christianson/RA.Aid` | `OPENAI_API_BASE` | config direta | +| 14 | P0 | CoreCoder | `he-yufeng/CoreCoder` | `OPENAI_BASE_URL` | config direta | +| 15 | P1 | Grok CLI | `superagent-ai/grok-cli` | `GROK_BASE_URL`/`baseURL` | config direta | +| 16 | P1 | Gitlawb Zero | `Gitlawb/zero` | `custom-openai-compatible`, `--base-url` | provider/flag | +| 17 | P1 | DeepSeek Reasonix | `esengine/DeepSeek-Reasonix` | endpoint/provider compativel | provider | +| 18 | P1 | KlaatCode | `KlaatAI/klaatcode` | `customModels` OpenAI-compatible | config | +| 19 | P1 | CodeMini CLI | `havingautism/Codemini-CLI` | `gateway.base_url` | gateway | +| 20 | P1 | Zot | `patriceckhart/zot` | `--base-url`, `models.json` | flag/config | +| 21 | P1 | Octomind | `Muvon/octomind` | provider URL envs | provider/env | +| 22 | P1 | DvalinCode | `arthurpanhku/dvalincode` | qualquer OpenAI-compatible | config direta | +| 23 | P1 | Coro Code | `Blushyes/coro-code` | `OPENAI_BASE_URL` | env | +| 24 | P1 | Mini-Kode | `minmaxflow/mini-kode` | `MINIKODE_BASE_URL` | env | +| 25 | P1 | Late CLI | `mlhher/late-cli` | `OPENAI_BASE_URL`, `api-url` | env/flag | +| 26 | P1 | Agentty | `1ay1/agentty` | provider-agnostic, ACP | config/ACP | +| 27 | P1 | Aizen | `aizen-stack/aizen` | Rust OpenAI-compatible, `AIZEN_BASE_URL` | config | +| 28 | P1 | Clif-Code | `DLhugly/Clif-Code` | OpenAI/Anthropic/Ollama | provider | +| 29 | P1 | Minacode | `hit9/minacode` | provider/compatibilidade | confirmar URL | +| 30 | P1 | YottaCode | `yottadynamics/yottacode` | modelo escolhido/gateway | provider | +| 31 | P1 | aichat | `sigoden/aichat` | OpenAI/Claude/Gemini | models YAML | +| 32 | P1 | ShellGPT | `TheR1D/shell_gpt` | `API_BASE_URL` | env | +| 33 | P1 | Mistral Vibe | `mistralai/mistral-vibe` | `base_url`, API base | config | +| 34 | P1 | OpenSquilla | `opensquilla/opensquilla` | gateway, 20+ providers | provider | +| 35 | P1 | Kode CLI | `shareAI-lab/Kode-cli` | endpoint/Anthropic/OpenAI/Gemini | config | +| 36 | P1 | Neovate Code | `neovateai/neovate-code` | plugin/multi-provider | plugin/provider | +| 37 | P1 | Deep Agents Code | `langchain-ai/deepagents` | qualquer tool-calling LLM | provider SDK | +| 38 | P1 | Kode fork/variants | `shareAI-lab/Kode-cli` | multi-provider | confirmar upstream | +| 39 | P1 | OpenHands principal | `All-Hands-AI/OpenHands` | CLI/web; pesquisar LLM base | config/CLI | +| 40 | P1 | SWE-agent | `SWE-agent/SWE-agent` | agente de issues | backend/provider | +| 41 | P1 | AutoCodeRover | `AutoCodeRoverSG/auto-code-rover` | agente de patches | backend/provider | +| 42 | P2 | Claurst | `Kuberwastaken/claurst` | provider/Anthropic | config; licenca GPL | +| 43 | P2 | Codebuff | `CodebuffAI/codebuff` | multi-agent CLI | provider | +| 44 | P2 | Devon | `entropy-research/Devon` | TUI pair programmer | backend | +| 45 | P2 | Letta Code | `letta-ai/letta-code` | model-agnostic | provider | +| 46 | P2 | CodeMachine CLI | `moazbuilds/CodeMachine-CLI` | multi-agent local | provider | +| 47 | P2 | Groq Code CLI | `build-with-groq/groq-code-cli` | multi-model | endpoint | +| 48 | P2 | Dexto | `truffle-ai/dexto` | CLI/web/API | provider | +| 49 | P2 | claw-code-agent | `HarnessLab/claw-code-agent` | endpoint/gateway | provider | +| 50 | P2 | g3 | `dhanji/g3` | Rust provider abstraction | provider | +| 51 | P2 | San | `genai-io/san` | provider-neutral | provider | +| 52 | P2 | Waveloom | `Menfre01/waveloom` | DeepSeek/provider | endpoint | +| 53 | P2 | picocode | `jondot/picocode` | multi-LLM | config | +| 54 | P2 | QQCode | `qnguyen3/qqcode` | skills, Rust | config | +| 55 | P2 | Keen Code | `mochow13/keen-code` | 9+ providers | config | +| 56 | P2 | Grinta | `josephsenior/Grinta-Coding-Agent` | provider-agnostic | config | +| 57 | P2 | Zap | `zap-coding-agent/zap-coding-agent` | Claude/Gemini/OpenAI/LM Studio | provider | +| 58 | P2 | Binharic | `CogitatorTech/binharic-cli` | multi-provider | config | +| 59 | P2 | Darce | `AmerSarhan/darce-cli` | multi-model/streaming | config | +| 60 | P2 | CLAII | `agencyswarm/CLAII` | multi-agent/MCP | provider | +| 61 | P2 | nori-cli | `tilework-tech/nori-cli` | multi-provider sobre Codex | config | +| 62 | P2 | cursor-agent clone | `civai-technologies/cursor-agent` | Claude/OpenAI/Ollama | provider | +| 63 | P2 | Free Code | `paoloanzn/free-code` | fork Claude Code | licenca/config | +| 64 | P2 | Claude Engineer | `Doriandarko/claude-engineer` | CLI Claude | provider | +| 65 | P2 | Smol Developer | `smol-ai/developer` | agent embutivel | SDK/adaptador | +| 66 | P2 | Agentless | `OpenAutoCoder/Agentless` | workflow sem loop | entrada de modelo | +| 67 | P2 | Amazon Q Developer CLI | `aws/amazon-q-developer-cli` | CLI AWS | auth/provider | +| 68 | P2 | nanobot | `HKUDS/nanobot` | OpenClaw rewrite | provider | +| 69 | P2 | ZeroClaw | `zeroclaw-labs/zeroclaw` | providers pluggable | provider | +| 70 | P2 | NanoClaw | `gavrielc/nanoclaw` | Anthropic SDK | base URL | +| 71 | P2 | PicoClaw | `sipeed/picoclaw` | provider/config | provider | +| 72 | P2 | IronClaw | `nearai/ironclaw` | provider Rust | provider | +| 73 | P2 | NullClaw | `nullclaw/nullclaw` | 23+ providers | provider | +| 74 | P2 | Moltis | `moltis-org/moltis` | Rust agent | provider | +| 75 | P2 | GitClaw | `open-gitagent/gitclaw` | Git-native agent | provider | +| 76 | P2 | LionClaw | `moshthepitt/lionclaw` | CLI local | provider | +| 77 | P3 | VibePod | `VibePod/vibepod-cli` | wrapper Docker | launcher | +| 78 | P3 | zeroshot | `the-open-engine/zeroshot` | worktrees/orchestration | launcher | +| 79 | P3 | Fractal | `plasma-ai/fractal` | orquestra CLIs | launcher | +| 80 | P3 | Bernstein | `chernistry/bernstein` | executa/verifica agentes | launcher | +| 81 | P3 | Traycer | `traycerai/traycer` | agentes paralelos | launcher | +| 82 | P3 | h5i | `h5i-dev/h5i` | sandbox e peer review | launcher | +| 83 | P3 | OMK | `dmae97/open-multi-agent-kit` | control plane | ACP/MCP | +| 84 | P3 | kodo | `ikamensh/kodo` | orquestrador | launcher | +| 85 | P3 | ORCH | `oxgeneral/ORCH` | fila de tarefas | launcher | +| 86 | P3 | LoopTroop | `LoopTroop-ai/LoopTroop` | orquestrador OpenCode | launcher | +| 87 | P3 | Galley | `shinpr/galley` | worktree/PR | launcher | +| 88 | P3 | Relay | `jcast90/relay` | MCP/orquestracao | MCP | +| 89 | P3 | SageCLI | `youwangd/SageCLI` | runtime-agnostic | launcher/ACP | +| 90 | P3 | 5dive | `5dive-ai/5dive` | agentes em servidor | launcher | +| 91 | P3 | agx | `ramarlina/agx` | checkpoints | launcher | +| 92 | P3 | claude-code-router | `musistudio/claude-code-router` | proxy multi-provider | integrar como consumidor/proxy | +| 93 | P3 | cc-router | `finch-xu/cc-router` | proxy Anthropic | interoperabilidade | +| 94 | P3 | OneCLI | `onecli/onecli` | broker de credenciais | seguranca/integ. adjacente | +| 95 | P3 | agent-browser | `vercel-labs/agent-browser` | ferramenta para agentes | MCP/plugin | +| 96 | P3 | OpenWork | `different-ai/openwork` | desktop sobre OpenCode | config do agente filho | +| 97 | P4 | Pool | `poolsideai/pool` | `POOLSIDE_STANDALONE_BASE_URL`; EULA | config sem PR presumido | +| 98 | P4 | Junie CLI | `junie.jetbrains.com` | fechado/EAP | BYOK/endpoint a confirmar | +| 99 | P4 | Cursor desktop | `Anysphere` | cloud endpoint | MITM/guide | +| 100 | P4 | Windsurf | produto Codeium | sem base URL geral | MITM | +| 101 | P4 | Amp | `sourcegraph.com/amp` | fechado | MITM/sem PR | +| 102 | P4 | Amazon Q/Kiro CLI | AWS | SSO/ecossistema AWS | MITM/adapter | +| 103 | P4 | Cowork | produto Anthropic | endpoint opaco | MITM | + +## C. Regra de promocao/rebaixamento + +Um projeto sobe de prioridade quando a pesquisa individual confirma: configuracao documentada, teste local com OmniRoute, licenca permissiva e contribuicao aceita. Desce quando: a URL e fixa, o endpoint e somente SaaS, o README nao corresponde ao codigo, a autenticacao e inseparavel do provedor, ou a licenca/EULA impede redistribuicao. Nenhum projeto e marcado como impossivel sem registrar a evidencia no tracker. diff --git a/_references/_sistemas_cli/03-plano-integracao-em-lotes.md b/_references/_sistemas_cli/03-plano-integracao-em-lotes.md new file mode 100644 index 0000000000..80d4a02c97 --- /dev/null +++ b/_references/_sistemas_cli/03-plano-integracao-em-lotes.md @@ -0,0 +1,314 @@ +# Plano executavel de integracao de CLIs + +> **Status final (2026-08-03):** a fase de pesquisa foi concluída em lotes de até três worktrees/agentes, cobrindo `104/104` casos. Este documento continua válido como processo operacional para implementação/publicação. Consulte `06-relatorio-final-104-clis-e-estrategia-prs.md` para o resultado final. + +**Data:** 2026-08-01 +**Objetivo:** pesquisar, integrar, validar e publicar suporte ao OmniRoute em todos os projetos tecnicamente possiveis, mantendo uma fila que permite ate tres subagentes simultaneos. + +O ciclo especifico de preparacao, revisao, envio e acompanhamento das contribuicoes upstream esta +em `05-plano-publicacao-prs-upstream.md`. + +## 1. Principios operacionais + +- Um repositorio por subagente e por worktree. +- No maximo tres tasks de repositorios em execucao ao mesmo tempo. +- Cada task pesquisa o upstream novamente antes de editar; o relatorio inicial e somente contexto. +- O agente principal revisa licenca, arquitetura, smoke test e diff antes do proximo lote. +- Nao usar checkout compartilhado para desenvolvimento e nao usar `git stash`/`git pop`. +- Usar worktrees em `.claude/worktrees/` e branches especificas. +- Nao inventar PR, issue, commit ou aceite de mantenedor. +- Nao adicionar trailers ou rodapes de IA em commits/PRs. + +## 2. Fases obrigatorias por projeto + +### Fase 0 - Preparacao da task + +Criar uma task com nome do projeto, URL canonica, prioridade, evidencia inicial, estado no catalogo OmniRoute e objetivo de integrar. Definir a worktree e o agente responsavel. + +### Fase 1 - Pesquisa individual fresca + +O agente deve verificar no upstream atual: + +- arquitetura de providers e ponto de entrada do CLI; +- arquivo/schema de configuracao e suporte a `base_url`, `baseURL`, `OPENAI_BASE_URL`, `OPENAI_API_BASE`, `LLM_BASE_URL` ou equivalente; +- protocolo real (Chat Completions, Responses, Anthropic Messages, Gemini, ACP, MCP ou outro); +- descoberta de modelos e necessidade de `/v1/models`; +- autenticacao, keyring, OAuth e variaveis de ambiente; +- streaming, tool calling, reasoning e limites conhecidos; +- politica de contribuicao, licenca e se PR de fork externo e aceito; +- atividade, releases, issues/PRs sobre providers customizados ou endpoints locais; +- comandos de build, lint, teste e smoke test; +- possibilidade de fork/PR, issue de proposta, documentacao ou apenas wrapper/MITM. + +Registrar commit/release pesquisado e links de evidencia. + +### Fase 2 - Gate de viabilidade + +Classificar exatamente um caminho inicial: + +`viable-direct` (somente configuracao), `viable-upstream` (mudanca no upstream), `viable-acp`, `viable-mcp`, `needs-wrapper`, `needs-mitm`, `config-only`, `blocked` ou `research-more`. + +Nao implementar antes de haver uma conclusao de viabilidade e uma razao verificavel. + +### Fase 3 - Baseline e TDD + +- Executar a suite recomendada pelo upstream antes das mudancas. +- Registrar falhas preexistentes, dependencias ausentes e comandos exatos. +- Limpar `OMNIROUTE_API_KEY` e demais credenciais quando os testes pressupuserem ambiente sem chaves. +- Adicionar primeiro um teste de configuracao, endpoint e selecao de modelo que falhe sem a integracao. + +### Fase 4 - Implementacao minima + +Implementar apenas o necessario para o caso pesquisado: + +- perfil/preset `omniroute` ou provider custom; +- base URL correta (raiz, `/v1` ou `/v1beta` conforme o cliente); +- chave via ambiente ou mecanismo seguro do cliente; +- modelo fixo ou descoberta de modelos; +- selecao/login/report se o CLI tiver esses fluxos; +- documentacao de uso e limites; +- testes de config e chamada. + +Se o upstream nao aceitar mudanca, preparar wrapper/launcher ou documentacao local e registrar a limitacao. + +### Fase 5 - Validacao funcional + +Executar, conforme o protocolo: + +- build, lint, typecheck e testes do upstream; +- smoke request com OmniRoute; +- streaming SSE e encerramento por abort; +- tool calling e JSON de argumentos; +- `/v1/models` ou equivalente; +- Chat Completions, Responses, Anthropic Messages e Gemini `generateContent` quando aplicavel; +- fallback/erro, timeout, retry e modelo inexistente; +- teste com chave limpa e teste com `OMNIROUTE_API_KEY` real fora dos logs. + +### Fase 6 - Publicacao upstream + +- Criar fork somente quando permitido e branch especifica. +- Abrir PR upstream se contribuicoes externas forem aceitas. +- Se PR externo for bloqueado, abrir issue com proposta, patch/referencia e smoke test. +- Se o projeto for fechado/EULA, registrar config manual ou issue de produto; nao criar PR ficticio. +- Atualizar o tracker com URL, commit, estado e resposta do mantenedor. + +### Fase 7 - Catalogo e integracao OmniRoute + +Quando houver valor para usuarios OmniRoute: + +- criar worktree propria do OmniRoute; +- atualizar `src/shared/constants/cliTools.ts` ou `src/shared/constants/cliToolsGrokBuild.ts`; +- atualizar detector em `src/lib/cli-helper/tool-detector.ts` se necessario; +- adicionar gerador/configurador e rota de settings somente se o caso exigir; +- adicionar testes do catalogo, detector, settings, `baseUrlSupport` e `/v1`; +- atualizar `docs/reference/CLI-TOOLS.md`, `docs/guides/CLI-INTEGRATIONS.md` e README quando apropriado; +- atualizar o tracker com a integracao local e evidencias. + +### Fase 8 - Fechamento + +Registrar commit, branch, PR/issue, testes, limitacoes, status do upstream, status do catalogo OmniRoute e proximo passo. O agente principal faz uma revisao final de seguranca, licenca e factualidade. + +## 3. Lotes de ate tres subagentes + +O lote e uma unidade operacional. A fila abaixo e ordenada pelo documento `02-prioridade-integracoes-clis.md`; cada linha representa uma task individual. + +### Lote 0 - consolidacao do caso de referencia + +- `CLI-000` - jcode - manter a issue #704, validar resposta do mantenedor e concluir a secao do README OmniRoute. + +### Lote P0.1 + +- `CLI-001` - Gemini CLI - integrar provider/base URL Gemini. +- `CLI-002` - Claw Code - integrar `OPENAI_BASE_URL`/provider OmniRoute. +- `CLI-003` - Plandex - integrar provider custom com `baseUrl`. + +### Lote P0.2 + +- `CLI-004` - MiMo Code - integrar provider OpenAI-compatible. +- `CLI-005` - Trae Agent - integrar `model_providers` e `base_url`. +- `CLI-006` - Kimi CLI - integrar modos OpenAI/Responses/Anthropic. + +### Lote P0.3 + +- `CLI-007` - Every Code - integrar perfil derivado do Codex. +- `CLI-008` - Open Codex - integrar provider multi-modelo. +- `CLI-009` - VT Code - integrar `custom_providers` e failover. + +### Lote P0.4 + +- `CLI-010` - OpenHands CLI - integrar `LLM_BASE_URL`. +- `CLI-011` - gptme - integrar `OPENAI_BASE_URL`. +- `CLI-012` - Nanocoder - integrar API OpenAI-compatible. + +### Lote P0.5 + +- `CLI-013` - RA.Aid - integrar `OPENAI_API_BASE`. +- `CLI-014` - CoreCoder - integrar `OPENAI_BASE_URL`. +- `CLI-015` - Grok CLI - integrar `GROK_BASE_URL`. + +### Lote P1.1 + +- `CLI-016` - Gitlawb Zero - integrar provider custom e `--base-url`. +- `CLI-017` - DeepSeek Reasonix - confirmar e integrar endpoint. +- `CLI-018` - KlaatCode - integrar `customModels`. + +### Lote P1.2 + +- `CLI-019` - CodeMini CLI - integrar `gateway.base_url`. +- `CLI-020` - Zot - integrar flag/config `--base-url`. +- `CLI-021` - Octomind - integrar provider URL envs. + +### Lote P1.3 + +- `CLI-022` - DvalinCode - integrar OpenAI-compatible. +- `CLI-023` - Coro Code - integrar `OPENAI_BASE_URL`. +- `CLI-024` - Mini-Kode - integrar `MINIKODE_BASE_URL`. + +### Lote P1.4 + +- `CLI-025` - Late CLI - integrar `OPENAI_BASE_URL`/`api-url`. +- `CLI-026` - Agentty - integrar provider e/ou ACP. +- `CLI-027` - Aizen - integrar `AIZEN_BASE_URL`. + +### Lote P1.5 + +- `CLI-028` - Clif-Code - integrar providers OpenAI/Anthropic/Ollama. +- `CLI-029` - Minacode - confirmar provider e integrar URL. +- `CLI-030` - YottaCode - integrar gateway/provider. + +### Lote P1.6 + +- `CLI-031` - aichat - integrar models YAML/provider. +- `CLI-032` - ShellGPT - integrar `API_BASE_URL`. +- `CLI-033` - Mistral Vibe - integrar base URL/provider. + +### Lote P1.7 + +- `CLI-034` - OpenSquilla - integrar gateway/provider. +- `CLI-035` - Kode CLI - integrar endpoint multi-provider. +- `CLI-036` - Neovate Code - integrar plugin/provider. + +### Lote P1.8 + +- `CLI-037` - Deep Agents Code - integrar provider do pacote CLI. +- `CLI-038` - OpenHands principal - integrar CLI/config. +- `CLI-039` - SWE-agent - integrar backend/provider. + +### Lote P1.9 + +- `CLI-040` - AutoCodeRover - integrar backend/provider. +- `CLI-041` - Claurst - integrar provider, respeitando GPL. +- `CLI-042` - Codebuff - integrar provider. + +### Lote P2.1 + +- `CLI-043` - Devon - integrar backend. +- `CLI-044` - Letta Code - integrar provider. +- `CLI-045` - CodeMachine CLI - integrar provider. + +### Lote P2.2 + +- `CLI-046` - Groq Code CLI - integrar endpoint. +- `CLI-047` - Dexto - integrar provider. +- `CLI-048` - claw-code-agent - integrar endpoint. + +### Lote P2.3 + +- `CLI-049` - g3 - integrar provider Rust. +- `CLI-050` - San - integrar provider-neutral. +- `CLI-051` - Waveloom - integrar provider/endpoint. + +### Lote P2.4 + +- `CLI-052` - picocode - integrar multi-LLM. +- `CLI-053` - QQCode - integrar config. +- `CLI-054` - Keen Code - integrar provider. + +### Lote P2.5 + +- `CLI-055` - Grinta - integrar provider. +- `CLI-056` - Zap - integrar Claude/Gemini/OpenAI. +- `CLI-057` - Binharic - integrar multi-provider. + +### Lote P2.6 + +- `CLI-058` - Darce - integrar multi-modelo. +- `CLI-059` - CLAII - integrar provider/MCP. +- `CLI-060` - nori-cli - integrar provider baseado em Codex. + +### Lote P2.7 + +- `CLI-061` - cursor-agent clone - integrar provider. +- `CLI-062` - Free Code - pesquisar licenca e integrar se viavel. +- `CLI-063` - Claude Engineer - integrar provider. + +### Lote P2.8 + +- `CLI-064` - Smol Developer - integrar SDK/adaptador. +- `CLI-065` - Agentless - integrar entrada de modelo. +- `CLI-066` - Amazon Q Developer CLI - pesquisar auth/provider. + +### Lote P2.9 + +- `CLI-067` - nanobot - integrar provider OpenClaw-compatible. +- `CLI-068` - ZeroClaw - integrar trait de provider. +- `CLI-069` - NanoClaw - confirmar base Anthropic. + +### Lote P2.10 + +- `CLI-070` - PicoClaw - integrar provider/config. +- `CLI-071` - IronClaw - integrar provider Rust. +- `CLI-072` - NullClaw - integrar provider. + +### Lote P2.11 + +- `CLI-073` - Moltis - integrar provider Rust. +- `CLI-074` - GitClaw - integrar provider Git-native. +- `CLI-075` - LionClaw - integrar provider CLI. + +### Lote P3.1 - wrappers e orquestradores + +- `CLI-076` - VibePod; `CLI-077` - zeroshot; `CLI-078` - Fractal. + +### Lote P3.2 + +- `CLI-079` - Bernstein; `CLI-080` - Traycer; `CLI-081` - h5i. + +### Lote P3.3 + +- `CLI-082` - OMK; `CLI-083` - kodo; `CLI-084` - ORCH. + +### Lote P3.4 + +- `CLI-085` - LoopTroop; `CLI-086` - Galley; `CLI-087` - Relay. + +### Lote P3.5 + +- `CLI-088` - SageCLI; `CLI-089` - 5dive; `CLI-090` - agx. + +### Lote P3.6 + +- `CLI-091` - claude-code-router; `CLI-092` - cc-router; `CLI-093` - OneCLI. + +### Lote P3.7 + +- `CLI-094` - agent-browser; `CLI-095` - OpenWork; `CLI-096` - Agent Deck (revisao de agente filho). + +### Lote P4 - fechados/MITM + +- `CLI-097` - Pool; `CLI-098` - Junie CLI; `CLI-099` - Cursor desktop. +- `CLI-100` - Windsurf; `CLI-101` - Amp; `CLI-102` - Amazon Q/Kiro CLI; `CLI-103` - Cowork. + +## 4. Criterio para iniciar o lote seguinte + +O lote seguinte pode iniciar quando os tres agentes do lote atual tiverem: pesquisa upstream anexada, gate de viabilidade preenchido, baseline registrado, resultado de smoke test ou bloqueio reproduzivel, e tracker atualizado. Uma falha de um agente nao deve paralisar os outros dois; o agente principal deve marcar `blocked` ou `research-more` com evidencia e seguir a fila. + +## 5. Entregaveis de cada task + +1. Nota de pesquisa fresca com commit/release e links. +2. Classificacao de viabilidade. +3. Diff minimo ou conclusao documentada de que nao ha diff necessario. +4. Testes e comandos executados, incluindo falhas preexistentes. +5. PR/issue upstream ou justificativa de config-only/MITM. +6. Entrada no catalogo OmniRoute quando aplicavel. +7. Atualizacao do tracker `04-tracker-integracoes-clis.md`. diff --git a/_references/_sistemas_cli/04-tracker-integracoes-clis.md b/_references/_sistemas_cli/04-tracker-integracoes-clis.md new file mode 100644 index 0000000000..1b253d1ca8 --- /dev/null +++ b/_references/_sistemas_cli/04-tracker-integracoes-clis.md @@ -0,0 +1,144 @@ +# Tracker de integracoes de CLIs com OmniRoute + +**Status final da pesquisa:** `104/104` concluídos (`100%`), `0` casos `not-started`. Este é o registro individual autoritativo. O relatório executivo está em `06-relatorio-final-104-clis-e-estrategia-prs.md`. + +**Snapshot inicial:** 2026-08-01 +**Legenda de status:** `not-started`, `researching`, `research-more`, `viable-direct`, `viable-upstream`, `viable-acp`, `viable-mcp`, `needs-wrapper`, `needs-mitm`, `blocked`, `implementing`, `validating`, `published-pr`, `published-issue`, `awaiting-maintainer`, `accepted`, `rejected`, `integrated`. + +Os campos externos (`branch`, `commit`, `PR`, `issue`) ficam como `—` ate haver evidencia real. “Catalogo OmniRoute” significa entrada local, nao necessariamente suporte upstream publicado. + +| ID | Prio | Projeto | Repositorio | Pesquisa | Tipo | Upstream | Branch | Commit | PR | Issue | Catalogo OmniRoute | Observacoes/proximo passo | +|---|:---:|---|---|---|---|---|---|---|---|---|---|---| +| CLI-000 | P0 | jcode | `1jehuang/jcode` | concluida | `viable-upstream` | `awaiting-maintainer` | `feat/omniroute-provider` | `ee4f904e6` | [fork PR](https://github.com/diegosouzapw/jcode/pull/1) | [upstream #704](https://github.com/1jehuang/jcode/issues/704) | integrated | acompanhar mantenedor e concluir secao do README | + +## Caso publicado: jcode + +| Campo | Valor | +|---|---| +| Projeto | jcode | +| Repositorio | `https://github.com/1jehuang/jcode` | +| Status geral | `awaiting-maintainer` | +| Tipo | `viable-upstream`; perfil OpenAI-compatible dirigido por metadados | +| Branch | `feat/omniroute-provider` | +| Commit | `ee4f904e6` | +| PR | `https://github.com/diegosouzapw/jcode/pull/1` (fork de referencia) | +| Issue | `https://github.com/1jehuang/jcode/issues/704` | +| Catalogo OmniRoute | `integrated` / entrada existente | +| Validacao | `cargo check --workspace` limpo; 205 testes passaram; 1 falha preexistente/ambiental | +| Diff | 6 arquivos, `+56/-3` | +| Proximo passo | acompanhar issue #704 e criar secao de README do OmniRoute | + +## Tabela principal + +| ID | Prio | Projeto | Repositorio | Pesquisa | Tipo | Upstream | Branch | Commit | PR | Issue | Catalogo OmniRoute | Observacoes/proximo passo | +|---|:---:|---|---|---|---|---|---|---|---|---|---|---| +| CLI-001 | P0 | Gemini CLI | `google-gemini/gemini-cli` | concluida | `pr-generic` | `published-issue` | `fix/omniroute-gateway-auth` | `8138105c38cc1637fe9e8a9bd520eb835f1620e6` | — | [upstream #27550](https://github.com/google-gemini/gemini-cli/issues/27550#issuecomment-5152312278) | not-in-catalog | regression `AuthType.GATEWAY`; patch +26; auth 10/10, non-interactive 17/17, content generator 55/55, Gemini `/v1beta` stream/tools smoke verde; aguardar `help wanted` antes de terceira PR | +| CLI-002 | P0 | Claw Code | `ultraworkers/claw-code` | concluida | `pr-docs` | `published-issue` | `docs/omniroute-setup` | `de857038b2f9ff9b319132e2241549e86215c351` | — | [upstream #3283](https://github.com/ultraworkers/claw-code/issues/3283) | not-in-catalog | generic OpenAI Chat Completions; docs +37; 1.415 testes, fmt, docs/release checks e clippy oficial verdes; fork bloqueado pelo GitHub, issue-first; smoke OmniRoute parcial/timeout; chave do smoke deve ser rotacionada | +| CLI-003 | P0 | Plandex | `plandex-ai/plandex` | concluida | `pr-docs` | `published-pr` | `feat/omniroute-provider-docs` | `f8f0694bdf7d1cb6e65a1f1c5bc39f84921a4507` | [upstream #359](https://github.com/plandex-ai/plandex/pull/359) | — | not-in-catalog | custom provider OpenAI-compatible ja existia; docs com `/v1`, `OMNIROUTE_API_KEY`, Docker reachability e model mapping; Go indisponivel; Docusaurus build verde; acompanhar mantenedor | +| CLI-004 | P0 | MiMo Code | `XiaomiMiMo/MiMo-Code` | concluida | `config-only` | not-applicable | `research/omniroute-mimo-code` | — | — | — | not-in-catalog | SHA `ce124cb`; provider customizado `@ai-sdk/openai-compatible` já suporta `baseURL`, `apiKey` e modelo; 116 testes focados + typecheck verdes; smoke CLI inconclusivo por travamento ambiental; sem PR artificial | +| CLI-005 | P0 | Trae Agent | `bytedance/trae-agent` | concluida | `pr-docs` | `published-pr` | `research/omniroute-trae-agent` | `4801e48b69d7583300eb86ec5c69235506d7f205` | [upstream #449](https://github.com/bytedance/trae-agent/pull/449) | — | not-in-catalog | README +39; `provider: openai` + mapping `base_url=/v1`; `/v1/responses`, `/v1/models`, Bearer, tools e limitação sem streaming; 62 testes/17 skips, pre-commit e mocks verdes; CLA pendente | +| CLI-006 | P0 | Kimi CLI | `MoonshotAI/kimi-cli` | concluida | `pr-docs` | `published-issue` | `research/omniroute-kimi-cli` | `a2f62bf6108a6954e798db992411aa06670e224f` | — | [upstream #2576](https://github.com/MoonshotAI/kimi-cli/issues/2576) | not-in-catalog | docs EN/ZH +63; `openai_legacy` `/v1`, chave via `OPENAI_API_KEY`, modelo manual; Responses/Anthropic alternativos; 47 testes e VitePress verdes; aguardar direção do mantenedor antes da PR | +| CLI-007 | P0 | Every Code | `just-every/code` | concluida | `pr-docs` / `config-only` | `published-pr` | `feat/omniroute-integration` | `8fbc8dab5fb76bf05535055801af0c3ccfea6f3b` | [upstream #614](https://github.com/just-every/code/pull/614) | — | not-in-catalog | PR documental aberta e mergeable; release `v0.6.162`; `./build-fast.sh` baseline/pós-patch verdes; smoke mock Responses/SSE/tools verde; acompanhar CI/mantenedor | +| CLI-008 | P0 | Open Codex | `ymichael/open-codex` | concluida | `pr-generic` / `issue-first` | `published-issue` | `feat/omniroute-integration` | `f25de99f991c0e4d9d6ae2811d307cdbff92f869` | — | [upstream #4](https://github.com/ymichael/open-codex/issues/4#issuecomment-5152804104) | not-in-catalog | patch genérico pronto localmente; issue-first por firewall de container e PR #19 fechada; 132 testes, typecheck/build/format verdes; lint bloqueado por ambiente; aguardar mantenedor antes de PR | +| CLI-009 | P0 | VT Code | `vinhnx/vtcode` | concluida | `pr-docs` / `config-only` | `published-pr` | `feat/omniroute-integration` | `256682d10c72f3e6e145d852b6d9d53f5c471988` | [upstream #717](https://github.com/vinhnx/VTCode/pull/717) | — | not-in-catalog | PR documental aberta e mergeable; release `0.141.10`; custom provider `/v1`, Bearer, `auto`, discovery manual, streaming/tools; 10 testes config verdes; nextest/docs checks bloqueados por ambiente; acompanhar CI/mantenedor | +| CLI-010 | P0 | OpenHands CLI | `OpenHands/OpenHands-CLI` | concluida | `config-only` | not-applicable | `feat/omniroute-openhands-cli-integration` | — | — | — | not-in-catalog | SHA `2df8a283`; `LLM_BASE_URL=/v1`, `LLM_API_KEY`, modelo obrigatório `openai/auto`, Chat Completions/SSE/tools; 63 testes focados e mock verdes; sem PR artificial | +| CLI-011 | P0 | gptme | `gptme/gptme` | concluida | `config-only` | not-applicable | `feat/omniroute-gptme-integration` | — | — | — | not-in-catalog | SHA `7fe250529`; provider TOML nomeado, `/v1/chat/completions`, `/v1/models`, Bearer, streaming/tools; compileall verde, pytest bloqueado por deps; docs genericas ja cobrem | +| CLI-012 | P0 | Nanocoder | `Nano-Collective/nanocoder` | concluida | `config-only` | not-applicable | `feat/omniroute-nanocoder-integration` | — | — | — | not-in-catalog | SHA `becae998`; `createOpenAICompatible`, `/v1/models`, streaming/native tools + XML/JSON fallback; types/format/lint/build verdes; suite ampla com falhas preexistentes; sem PR artificial | +| CLI-013 | P0 | RA.Aid | `ai-christianson/RA.Aid` | concluida | `config-only` | not-applicable | `feat/omniroute-ra-aid-integration` | — | — | — | not-in-catalog | SHA `e71bb83`; provider `openai-compatible`, `/v1/chat/completions`, Bearer, modelo explicito/`auto`, function tools; 762 testes + 62 focados e smoke verdes; sem Responses/stream HTTP garantido; Aider exige config separada; sem PR artificial | +| CLI-014 | P0 | CoreCoder | `he-yufeng/CoreCoder` | concluida | `pr-docs` / `config-only` | `published-pr` | `feat/omniroute-integration` | `f4d2851649e5dda20738c313a8a94337b24eeb9d` | [upstream #20](https://github.com/he-yufeng/CoreCoder/pull/20) | — | not-in-catalog | PR documental aberta, nao draft e mergeable; `/v1/chat/completions`, Bearer, `auto`, streaming/native tools; 86 testes, compileall, build, twine e smoke verdes; Ruff mantem 41 falhas preexistentes; acompanhar CI/mantenedor | +| CLI-015 | P1 | Grok CLI | `superagent-ai/grok-cli` | concluida | `config-only` | not-applicable | `feat/omniroute-grok-cli-integration` | — | — | — | not-in-catalog | SHA `fb97af8`; `GROK_BASE_URL`/`--base-url`, Chat Completions/SSE, Bearer, `auto` e tools confirmados; 47/48 suites e 246 testes no gate isolado, 6 arquivos/39 testes focados verdes; Node não carrega `bun:sqlite`; Responses/search/STT/Batch/midia não garantidos; monitorar PRs #290/#349 | +| CLI-016 | P1 | Gitlawb Zero | `Gitlawb/zero` | concluida | `config-only` | not-applicable | `feat/omniroute-gitlawb-zero-integration` | — | — | — | not-in-catalog | SHA `8e266797`; release `v0.6.0`; provider custom `/v1`, Bearer, `auto`, Chat/SSE/tools, usage e `/v1/models` confirmados; Go test/vet/fmt e smoke verdes; release build bloqueado por falta de espaco; politica exige issue aprovada; sem contribuicao nominal artificial | +| CLI-017 | P1 | DeepSeek Reasonix | `esengine/DeepSeek-Reasonix` | concluida | `config-only` | not-applicable | `feat/omniroute-deepseek-reasonix-integration` | — | — | — | not-in-catalog | SHA `1c62489d`; release `v1.19.1`; `kind=openai`, `/v1/chat/completions`, Bearer, `auto`, SSE/tools, `/v1/models` e reasoning confirmados; suite completa, vet, fmt, build e smoke verdes apos remover env SSH do runner; sem PR/issue redundante | +| CLI-018 | P1 | KlaatCode | `KlaatAI/klaatcode` | concluida | `config-only` | not-applicable | `feat/omniroute-klaatcode-integration` | — | — | — | not-in-catalog | SHA `0d20f24a`; release `V2.4.0`; `customModels` com `/v1`, Bearer, `auto`, Chat/SSE/tools confirmados; 316 testes, 33 fixtures e build verdes; typecheck local divergiu do CI verde; custom endpoint e apenas TUI; divergencia de metadata de licenca registrada; sem contribuicao nominal artificial | +| CLI-019 | P1 | CodeMini CLI | `havingautism/Codemini-CLI` | concluida | `config-only` | not-applicable | `feat/omniroute-codemini-cli-integration` | — | — | — | not-in-catalog | SHA `a3764b21`; package `0.8.3`; gateway `/v1`, Bearer persistido, `auto`, Chat/SSE/usage/tools e tool round trip confirmados; `/models` e probe, nao picker; 122/123 testes, 10 focados e pack-imports verdes; sem PR nominal redundante | +| CLI-020 | P1 | Zot | `patriceckhart/zot` | concluida | `config-only` | not-applicable | `feat/omniroute-zot-integration` | — | — | — | not-in-catalog | SHA `f3d8eb66`; release `v0.3.29`; custom provider `omniroute` em `models.json`, `/v1`, Bearer, `auto`, Chat/SSE/tools/reasoning opt-in e cache usage confirmados; `--base-url` e so override; PR #36 ja cita OmniRoute; race suite/build/vet/fmt verdes | +| CLI-021 | P1 | Octomind | `Muvon/octomind` | concluida | `config-only` | not-applicable | `feat/omniroute-octomind-integration` | — | — | — | not-in-catalog | SHA `65ab1db1`; release `0.39.0`; provider `local:auto` usa endpoint completo `/v1/chat/completions`, Bearer opcional, Chat JSON buffered, tools/reasoning/usage; sem SSE/Responses/discovery; fmt/fetch e smokes com/sem auth verdes; suite ampla nao executada por disco/contencao | +| CLI-022 | P1 | DvalinCode | `arthurpanhku/dvalincode` | concluida | `config-only` | not-applicable | `feat/omniroute-dvalincode-integration` | — | — | — | not-in-catalog | SHA `7d42664a`; release `v0.14.1`; provider OpenAI-compatible custom com `/v1`, Bearer via env, `auto`, Chat/SSE/usage/tools e tool round trip confirmados; `provider test` bloqueado por trusted presets; issues #109/#118/#135 ja cobrem melhorias genericas; sem PR nominal | +| CLI-023 | P1 | Coro Code | `Blushyes/coro-code` | concluida | `config-only` | not-applicable | `feat/omniroute-coro-code-integration` | — | — | — | not-in-catalog | SHA `679c57af`; release `v0.0.8`; `OPENAI_BASE_URL=/v1`, Bearer, `auto`, Chat JSON e function tools/tool loop confirmados; streaming existe mas nao e usado pelo agente; sem Responses/discovery; `cargo check`/fmt bloqueados por drift preexistente; risco de LICENSE ausente; sem PR nominal | +| CLI-024 | P1 | Mini-Kode | `minmaxflow/mini-kode` | concluida | `config-only` | not-applicable | `feat/omniroute-mini-kode-integration` | — | — | — | not-in-catalog | SHA `4e7f9767`; release/tag npm `0.2.3`; provider custom por `MINIKODE_BASE_URL=/v1`, Bearer, `auto`, Chat/SSE e tools/tool loop confirmados; sem Responses/discovery/reasoning dedicado; sem PR nominal redundante | +| CLI-025 | P1 | Late CLI | `mlhher/late-cli` | concluida | `config-only` | not-applicable | `feat/omniroute-late-cli-integration` | — | — | — | not-in-catalog | SHA `26814e62`; release `v1.4.2`; `OPENAI_BASE_URL=/v1`, Bearer, `auto`, Chat/SSE/usage/reasoning_content/tools e tool round trip confirmados; probes `/props`/`/v1/models` nao sao picker; BSL 1.1/CLA; sem PR nominal | +| CLI-026 | P1 | Agentty | `1ay1/agentty` | concluida | `config-only` | not-applicable | `feat/omniroute-agentty-integration` | — | — | — | not-in-catalog | SHA `e947b26c`; release `v0.2.10`; custom host `127.0.0.1:20128`, Bearer, Chat/SSE/tools e `/v1/models` confirmados; Responses/reasoning/tool round trip dinamico nao confirmados; MIT; sem PR nominal | +| CLI-027 | P1 | Aizen | `aizen-stack/aizen` | concluida | `config-only` | not-applicable | `feat/omniroute-aizen-integration` | — | — | — | not-in-catalog | SHA `3d8ae0f6`; release `v0.5.4`; `AIZEN_BASE_URL=/v1`, Bearer, `auto`/modelo literal, Chat/SSE/reasoning_content e `/v1/models`; tools confirmadas estaticamente, sem smoke dinamico; PolyForm Noncommercial/CLA; sem PR nominal | +| CLI-028 | P1 | Clif-Code | `DLhugly/Clif-Code` | concluida | `config-only` | not-applicable | `feat/omniroute-clif-code-integration` | — | — | — | not-in-catalog | SHA `282a787a`; release `v1.72.0`; `CLIFCODE_API_URL=/v1`, Bearer, `auto`, Chat/SSE/usage/tools e tool loop confirmados por fonte; smoke bloqueado por binario ausente; sem Responses/reasoning; licença proprietária conflitante com FSL declarada exige revisão jurídica; sem PR nominal | +| CLI-029 | P1 | Minacode | `hit9/minacode` | concluida | `config-only` | not-applicable | `feat/omniroute-minacode-integration` | — | — | — | not-in-catalog | SHA `d4ea4a97`; release `v0.18.1`; TOML custom `/v1`, key obrigatória, `auto`, Chat/Responses/Anthropic, SSE/tools/reasoning/discovery confirmados; smoke de protocolo Chat+Responses+models e compileall verdes; CI remoto verde; sem PR nominal | +| CLI-030 | P1 | YottaCode | `yottadynamics/yottacode` | concluida | `config-only` | not-applicable | `feat/omniroute-yottacode-integration` | — | — | — | not-in-catalog | SHA `039f61ce`; release `v0.3.1`; provider `openai-compatible`, `/v1`, Bearer, `/v1/models`, Chat/SSE/tools/reasoning parsing confirmados; smoke oficial com mock passou; Go 1.26 nao instalado e gates completos nao executados por espaco; sem PR nominal | +| CLI-031 | P1 | aichat | `sigoden/aichat` | concluida | `config-only` | not-applicable | `feat/omniroute-aichat-integration` | — | — | — | not-in-catalog | SHA `82976d3`; package/release `v0.30.0`; provider `openai-compatible` com base `/v1`, Bearer opcional e modelo `auto`; Chat stream/JSON, reasoning e tool round-trip confirmados; Responses ausente (#1431); limites de tool SSE ja cobertos por #1454/#1495 e PR #1496; sem publicacao nominal | +| CLI-032 | P1 | ShellGPT | `TheR1D/shell_gpt` | concluida | `config-only` | not-applicable | `feat/omniroute-shellgpt-integration` | — | — | — | not-in-catalog | SHA `a082bd53`; release `1.5.1`; `API_BASE_URL=/v1`, `OPENAI_API_KEY`, `DEFAULT_MODEL=auto` e `USE_LITELLM=false`; smoke real confirmou env e `.sgptrc`, Chat/SSE e Bearer; issue #718 nao reproduz no HEAD; CI baseline vermelho por temperatura default independente; sem publicacao nominal | +| CLI-033 | P1 | Mistral Vibe | `mistralai/mistral-vibe` | concluida | `config-only` | not-applicable | `feat/omniroute-mistral-vibe-integration` | — | — | — | not-in-catalog | SHA/release `99a6efa9` / `v2.23.2`; `GenericBackend` custom com base `/v1`, Bearer, Chat/SSE, usage, tools e reasoning; smoke do binario oficial verde; #790 cobre somente discovery `/v1/models`; upstream nao aceita contribuicoes de codigo no momento; sem publicacao | +| CLI-034 | P1 | OpenSquilla | `opensquilla/opensquilla` | concluida | `config-only` | not-applicable | `feat/omniroute-opensquilla-integration` | — | — | — | not-in-catalog | `custom` com `/v1`, Bearer opcional, Chat/SSE, tools, reasoning recebido, usage e `/v1/models`; smoke provider-level verde; monitorar issue #912 do probe custom; sem publicacao nominal | +| CLI-035 | P1 | Kode CLI | `shareAI-lab/Kode-cli` | concluida | `config-only` | not-applicable | `feat/omniroute-kode-cli-integration` | — | — | — | not-in-catalog | `custom-openai` com `/v1`, discovery `/v1/models`, fallback manual, Bearer, Chat/SSE, tools/tool round-trip e persistencia; smoke runtime bloqueado por Bun/artefato ausente; CI baseline vermelho por formatacao; sem publicacao nominal | +| CLI-036 | P1 | Neovate Code | `neovateai/neovate-code` | concluida | `config-only` | not-applicable | `feat/omniroute-neovate-code-integration` | — | — | — | not-in-catalog | provider JSON custom normalizado para OpenAI-compatible, `/v1`, Bearer, Chat/SSE, tools/tool round-trip; model catalog declarado (sem discovery); smoke do pacote publicado verde; sem publicacao nominal | +| CLI-037 | P1 | Deep Agents Code | `langchain-ai/deepagents` | concluida | `config-only` | not-applicable | `feat/omniroute-deepagents-code-integration` | — | — | — | not-in-catalog | SHA `46ee772b4`; `deepagents-code==0.1.51`; provider `openai`, base OmniRoute `/v1`, model `openai:auto`; Responses e default, Chat usa `use_responses_api=false`; smoke de config verde, sem HTTP/runtime por deps e disco; #3973/#3287 ja cobrem os pontos genericos; sem publicacao nominal | +| CLI-038 | P1 | OpenHands principal | `OpenHands/OpenHands` | concluida | `config-only` | not-applicable | `feat/omniroute-openhands-main-integration` | — | — | — | not-in-catalog | SHA `1708efc44`; Agent Canvas `1.8.0`; `openai/auto` + base `/v1` + API key + `api_mode=chat`; LiteLLM envia `model=auto`, Chat/SSE/tools estruturais; sem discovery generico `/v1/models`; PRs OmniRoute [#15189](https://github.com/OpenHands/OpenHands/pull/15189)/[#15211](https://github.com/OpenHands/OpenHands/pull/15211) fechadas sem merge; sem nova publicacao | +| CLI-039 | P1 | SWE-agent | `SWE-agent/SWE-agent` | concluida | `config-only` | not-applicable | `feat/omniroute-swe-agent-integration` | — | — | — | not-in-catalog | SHA `3ea751c08`; release `v1.1.0`; LiteLLM com `openai/`, `api_base=/v1` e chave por env; Chat/tools/tool round-trip e batch confirmados por fonte; reasoning parcial; smoke HTTP bloqueado por deps ausentes; sem publicacao nominal | +| CLI-040 | P1 | AutoCodeRover | `AutoCodeRoverSG/auto-code-rover` | concluida | `pr-generic` | `validating` | `feat/omniroute-auto-code-rover-integration` | — | — | — | not-in-catalog | SHA `585d3e639`; patch local sem commit em 4 arquivos corrige `litellm-generic-openai/auto`, base `/v1`, precedencia da chave e pricing desconhecido; 9 testes focados com stubs, tracer source-only, compileall e diff-check verdes; sem HTTP real; licenca SONAR Source-Available exige gate juridico antes de publicar | +| CLI-041 | P2 | Claurst | `Kuberwastaken/claurst` | concluida | `config-only` | not-applicable | `feat/omniroute-claurst-integration` | — | — | — | not-in-catalog | SHA `595b0ebe3`; `custom-openai` com settings persistidos, base `/v1`, `CUSTOM_OPENAI_API_KEY`, modelo `auto`, Chat/SSE/tools e `/v1/models`; CI upstream verde; sem build/smoke local e sem publicacao nominal; monitorar PR #365 sem duplicar | +| CLI-042 | P2 | Codebuff | `CodebuffAI/codebuff` | concluida | `blocked` / `issue-first` | `blocked` | `feat/omniroute-codebuff-integration` | — | — | — | not-in-catalog | SHA `195b9bef6`; main nao expoe base/chave/provider custom na CLI/SDK; PR upstream existente [#693](https://github.com/CodebuffAI/codebuff/pull/693) cobre a lacuna, observada OPEN/CONFLICTING/DIRTY; nao criar patch concorrente; acompanhar #693 e validar apos merge/port | +| CLI-043 | P2 | Devon | `entropy-research/Devon` | concluida | `pr-generic` | validating | `feat/omniroute-devon-integration` | — | — | [upstream #100](https://github.com/entropy-research/Devon/issues/100) | not-in-catalog | SHA `8f68f1d74`; diff local genérico em 5 arquivos, sem commit; reprodução literal DeepSeek/OpenRouter e resume corrigidos; 9 testes focados, compileall e diff-check verdes; Standards/Spec aprovados; aguardar autorização antes de fork/push/PR | +| CLI-044 | P2 | Letta Code | `letta-ai/letta-code` | concluida | `config-only` | not-applicable | `feat/omniroute-letta-code-integration` | — | — | — | integrated | SHA `09aff1bb4`; já coberta pelo provider local `lmstudio` (`lmstudio_openai`), discovery `/api/v0/models`→`/v1/models`, Chat/SSE/tools; 8 testes OmniRoute verdes; sem PR nominal | +| CLI-045 | P2 | CodeMachine CLI | `moazbuilds/CodeMachine-CLI` | concluida | `config-only` | not-applicable | `feat/omniroute-codemachine-cli-integration` | — | — | — | not-in-catalog | SHA `572def63e`; integração indireta por OpenCode custom `@ai-sdk/openai-compatible`, base `/v1`, chave por env e `omniroute/auto`; provider/model reconhecidos no smoke de config; alternativa Claude Code; sem PR nominal | +| CLI-046 | P2 | Groq Code CLI | `build-with-groq/groq-code-cli` | concluida | `pr-generic` | `awaiting-maintainer` | `feat/omniroute-groq-code-cli-integration` | — | — | — | not-in-catalog | SHA `a303eb4be`; `groq-sdk@0.27.0` fixa `/openai/v1/chat/completions`, logo não há config-only para OmniRoute; mock confirmou path/Bearer; PR existente [#7](https://github.com/build-with-groq/groq-code-cli/pull/7) é a duplicata natural, mas precisa distinguir Groq-compatible de OpenAI-compatible; 17 testes oficiais + 5 testes de contexto, build e mock verdes; clone limpo, sem patch/publicação | +| CLI-047 | P2 | Dexto | `truffle-ai/dexto` | concluida | `config-only` | `not-applicable` | `feat/omniroute-dexto-integration` | — | — | — | not-in-catalog | SHA `4108a9c73`; provider `openai-compatible` nativo exige `baseURL`, aceita modelo arbitrário, Bearer opcional, Chat/SSE/tools e reasoning effort; receita `/v1` + `auto`; 175 testes focados e builds llm/core verdes; TS2741 em chatgpt-oauth é baseline; ELv2; sem PR/issue nominal | +| CLI-048 | P2 | claw-code-agent | `HarnessLab/claw-code-agent` | concluida | `config-only` | `not-applicable` | `feat/omniroute-claw-code-agent-integration` | — | — | — | not-in-catalog | SHA `167571da8`; `OPENAI_BASE_URL=http://127.0.0.1:20128/v1`, Bearer, model manual/`auto`, Chat/SSE/tools/usage confirmados; smoke `MOCK_SMOKE_OK`, 80 testes focados; sem discovery/Responses API; licença não identificada (`license: null`); sem PR/issue | +| CLI-049 | P2 | g3 | `dhanji/g3` | concluida | `pr-generic` | `validating` | `feat/omniroute-g3-integration` | — | — | [upstream #70](https://github.com/dhanji/g3/issues/70) | not-in-catalog | SHA `0ddb052d2`; diff local provider-neutral em `provider_registration.rs`, 1 arquivo `+25/-1`, corrige registro `custom`→`custom.default`; `cargo check -p g3-config`, 6 testes config e diff-check verdes; teste focal escrito mas build bloqueado em `x11.pc`; manifesto declara MIT sem arquivo LICENSE; Standards/Spec centrais aprovados; sem publicação | +| CLI-050 | P2 | San | `genai-io/san` | concluida | `config-only` | `not-applicable` | `feat/omniroute-san-integration` | — | — | — | not-in-catalog | SHA `e45ec0ef7`; Apache-2.0/release v1.22.1; provider Custom com base `/v1`, Bearer, `/models`, Chat/SSE/tools/tool result e reasoning best-effort; smoke HTTP de dois turnos e gates Go focados verdes; sem provider nominal ou publicação | +| CLI-051 | P2 | Waveloom | `Menfre01/waveloom` | concluida | `config-only` | `not-applicable` | `feat/omniroute-waveloom-integration` | — | — | — | not-in-catalog | SHA `293d5cd11`; Apache-2.0/release v0.5.1; adapter OpenAI com `/v1`, Bearer, `/models`, SSE, 14 tools, tool-result round-trip e sessões; smoke do binário oficial verde e CI remoto do HEAD verde; reasoning/cache avançados não são projetados; sem publicação | +| CLI-052 | P2 | picocode | `jondot/picocode` | concluida | `config-only` | `not-applicable` | `feat/omniroute-picocode-integration` | — | — | — | not-in-catalog | SHA `064a2a6ea`; MIT/release v0.6.0; Rig 0.28 lê `OPENAI_BASE_URL` e usa Responses `/v1/responses`; smoke confirmou Bearer, `auto`, 11 tools e function_call_output; 7 testes/doc-tests verdes; fmt/clippy só baseline; sem PR/issue | +| CLI-053 | P2 | QQCode | `qnguyen3/qqcode` | concluida | `config-only` | `not-applicable` | `feat/omniroute-qqcode-integration` | — | — | — | not-in-catalog | SHA `be6a96ce7`; Apache-2.0/release v1.2.0; provider arbitrário + `GENERIC`/OpenAI com base `/v1`; smoke confirmou JSON/SSE, Bearer, extra_body, reasoning e tool-result; backend 20/20, ACP 13+1 skip, observer 11/11, compileall/helps verdes; sem PR/issue | +| CLI-054 | P2 | Keen Code | `mochow13/keen-code` | concluida | `config-only` | `not-applicable` | `feat/omniroute-keen-code-integration` | — | — | — | not-in-catalog | SHA `ee2eaf0f4`; MIT/release v0.40.0; receita manual `openai-compatible` + `/v1` + Bearer + model arbitrário; smoke oficial confirmou Chat/SSE, tools/tool-result, usage e reasoning replay; provider oculto apenas no picker; CI remoto verde; sem PR/issue | +| CLI-055 | P2 | Grinta | `josephsenior/Grinta-Coding-Agent` | concluida | `config-only` | `not-applicable` | `feat/omniroute-grinta-integration` | — | — | — | not-in-catalog | SHA `df7437524`; provider OpenAI-compatible com `LLM_API_KEY`, model `auto`, base `/v1`; smoke Chat/SSE/tools/tool-result/reasoning/usage/cache verde; 183 testes focados, compileall e Ruff verdes; sem PR/issue nominal | +| CLI-056 | P2 | Zap | `zap-coding-agent/zap-coding-agent` | concluida | `config-only` | `not-applicable` | `feat/omniroute-zap-integration` | — | — | — | not-in-catalog | SHA `f0203f872`; provider arbitrário `kind=openai`, base `/v1`, Bearer, discovery `/models`, Chat JSON/SSE, tools/tool-result, reasoning e usage confirmados; cargo check + 16 testes/gates focados verdes; issue #2 confirma arquitetura; sem PR nominal | +| CLI-057 | P2 | Binharic | `CogitatorTech/binharic-cli` | concluida | `pr-generic` | `validating` | `feat/omniroute-binharic-integration` | — | — | — | not-in-catalog | SHA `52ccca70b`; patch sem commit em `provider.ts` + teste: aplica `baseURL` ao OpenAI/Anthropic e usa Chat Completions para base customizada; RED→GREEN, 14 focal, 88 arquivos/774 testes, typecheck/build e smoke wire verdes; lint upstream bloqueado; sem publicação | +| CLI-058 | P2 | Darce | `AmerSarhan/darce-cli` | concluida | `config-only` | `not-applicable` | `feat/omniroute-darce-integration` | — | — | — | not-in-catalog | SHA `1b90c379a`; MIT declarada no package/npm sem arquivo LICENSE; `DARCE_API_BASE` raiz sem `/v1`, `DARCE_API_KEY`, `DARCE_MODEL=auto`; smoke PTY do binário confirmou 2 Chat/SSE, 7 tools, tool-result e Bearer; 106 testes/build verdes; sem MCP/ACP/A2A; sem PR/issue | +| CLI-059 | P2 | CLAII | `agencyswarm/CLAII` | concluida | `pr-generic` | `blocked` | `feat/omniroute-claii-integration` | — | — | — | not-in-catalog | SHA `89d42311b`; patch sem commit em README/config/providers/test: `CLAII_API_KEY`, `CLAII_BASE_URL` origem sem `/v1beta`, model runtime e reject explícito; 4 wire/loop + 10 calculator + pip install + smoke CLI verdes; unittest discover falha só baseline `calculator`/`pkg`; sem MCP/ACP/A2A; **All Rights Reserved**, não publicar sem autorização jurídica | +| CLI-060 | P2 | nori-cli | `tilework-tech/nori-cli` | concluida | `config-only` | `not-applicable` | `feat/omniroute-nori-cli-integration` | — | — | — | not-in-catalog | SHA `829ecf3fd`; Apache-2.0/v0.24.0; Nori custom ACP → OpenCode `opencode-ai@1.18.11` → OmniRoute `/v1`; MCP separado por `/api/mcp/stream` ou stdio; 5 testes focados, cargo build nori e smoke ACP Nori→OpenCode verdes; sem patch/publicação | +| CLI-061 | P2 | cursor-agent clone | `civai-technologies/cursor-agent` | concluida | `config-only` | `not-applicable` | `feat/omniroute-cursor-agent-clone-integration` | — | — | — | not-in-catalog | SHA `d21a8f3d4`; MIT/v0.1.39; SDK OpenAI usa base `/v1`, Anthropic usa raiz; smokes de 2 turnos/tools verdes; factory rejeita `auto` puro; 23 testes, mypy/build verdes; sem patch/publicação | +| CLI-062 | P2 | Free Code | `freecodexyz/free-code` | concluida | `config-only` | `blocked` | `feat/omniroute-free-code-integration` | — | — | [upstream #20](https://github.com/freecodexyz/free-code/issues/20) | not-in-catalog | SHA `6b25ab68b`; URL antiga `paoloanzn/free-code` redireciona; base Anthropic raiz, `model=auto`, stream/tools/MCP; build verde; sem LICENSE/campo license e código atribuído à Anthropic, não publicar | +| CLI-063 | P2 | Claude Engineer | `Doriandarko/claude-engineer` | concluida | `config-only` / `pr-generic` | `blocked` | `feat/omniroute-claude-engineer-integration` | — | [upstream #250](https://github.com/Doriandarko/claude-engineer/pull/250) | [upstream #116](https://github.com/Doriandarko/claude-engineer/issues/116) | not-in-catalog | SHA `0a9e4b309`; v3 funciona por base Anthropic raiz com modelo fixo; #250 já adiciona `ANTHROPIC_MODEL`; arquivo LICENSE ausente apesar de declaração MIT; sem patch concorrente/publicação | +| CLI-064 | P2 | Smol Developer | `smol-ai/developer` | concluida | `config-only` | `not-applicable` | `feat/omniroute-smol-developer-integration` | — | — | — | not-in-catalog | SHA `a6747d1a6`; `OPENAI_API_BASE=/v1`, `auto`, 3 Chat calls, SSE/function calling e Agent Protocol validados; gates de runtime verdes, build metadata preexistente; sem patch/publicação | +| CLI-065 | P2 | Agentless | `OpenAutoCoder/Agentless` | concluida | `config-only` | `not-applicable` | `feat/omniroute-agentless-integration` | — | — | — | not-in-catalog | SHA `5ce5888b9`; OpenAI chat + embeddings funcionam com bases distintas; Anthropic normal/cache histórico validados; DeepSeek fixa host; pre-commit/compileall verdes; sem patch/publicação | +| CLI-066 | P2 | Amazon Q Developer CLI | `aws/amazon-q-developer-cli` | concluida | `viable-mcp` / `needs-wrapper` | `not-applicable` | `feat/omniroute-amazon-q-developer-cli-integration` | — | — | — | not-in-catalog | SHA `15cc8f3cd`; modelo usa AWS JSON/EventStream Bearer/SigV4 e não `/v1`; MCP stdio imediato, HTTP legado com ressalva; upstream issue-first/manutenção crítica; sem patch/publicação | +| CLI-067 | P2 | nanobot | `HKUDS/nanobot` | concluida | `config-only` | `not-applicable` | `feat/omniroute-nanobot-integration` | — | — | — | not-in-catalog | HEAD `44b7e1bf4`; provider dinâmico OpenAI-compatible com base `/api/v1` e modelo `omniroute/auto`; Chat/SSE/tools/reasoning/usage/images/discovery e retry validados; 424 testes + Ruff; sem PR nominal | +| CLI-068 | P2 | ZeroClaw | `zeroclaw-labs/zeroclaw` | concluida | `config-only` | `not-applicable` | `feat/omniroute-zeroclaw-integration` | — | — | — | not-in-catalog | HEAD `4770420ab`; `custom.omniroute`, base `/v1`, Bearer, `auto`, Chat/Responses e tools nativas opt-in; 1.173 unit + 1 integração, fmt/config/smoke verdes; sem PR nominal | +| CLI-069 | P2 | NanoClaw | `gavrielc/nanoclaw` | concluida | `config-only` | `not-applicable` | `feat/omniroute-nanoclaw-integration` | — | — | — | not-in-catalog | HEAD `dfac7e0af`; provider Claude existente aponta para raiz Anthropic OmniRoute e OneCLI guarda a chave; baseline e 49 testes OmniRoute verdes; Codex #3155/#1984 e OpenCode #2985 ficam como follow-ups; sem PR | +| CLI-070 | P2 | PicoClaw | `sipeed/picoclaw` | concluida | `config-only` | `not-applicable` | `feat/omniroute-picoclaw-integration` | — | — | — | not-in-catalog | HEAD `49183d7`, `/api/v1`, `openai/auto` → `auto`; Chat/SSE/tools/usage/images/discovery; Go ausente, testes locais não executados; issue router #3298; sem publicação | +| CLI-071 | P2 | IronClaw | `nearai/ironclaw` | concluida | `config-only` | `not-applicable` | `feat/omniroute-ironclaw-integration` | — | — | — | not-in-catalog | HEAD `4b71aaae`; `openai_compatible` `/api/v1`, Chat/SSE/tools/images/discovery; 889+5 testes e fmt verdes; reasoning #3673; sem publicação | +| CLI-072 | P2 | NullClaw | `nullclaw/nullclaw` | concluida | `config-only` | `not-applicable` | `feat/omniroute-nullclaw-integration` | — | — | — | not-in-catalog | HEAD `d8a802fd`; custom `/api/v1`, Chat/Responses/Anthropic, tools/streaming/usage/images; Zig ausente, CI run 30788444193 verde; sem publicação | +| CLI-073 | P2 | Moltis | `moltis-org/moltis` | concluida | `config-only` | `not-applicable` | `feat/omniroute-moltis-integration` | — | — | — | not-in-catalog | HEAD `678d407`; `custom-omniroute`, `/api/v1`, `auto`, Chat/SSE/tools/reasoning/usage/images; 401 testes + fmt verdes; MCP/ACP separados; sem publicação | +| CLI-074 | P2 | GitClaw | `open-gitagent/gitclaw` | concluida | `config-only` | `not-applicable` | `feat/omniroute-gitclaw-integration` | — | — | — | not-in-catalog | GitAgent HEAD `d3e25d7`; base `/api/v1`, `omniroute:auto`, Chat/SSE/tools/images; build + 65 testes + smoke verdes; reasoning=false no descriptor; sem publicação | +| CLI-075 | P2 | LionClaw | `moshthepitt/lionclaw` | concluida | `patch-required` / `issue-first` | `awaiting-maintainer` | `feat/omniroute-lionclaw-integration` | — | — | — | not-in-catalog | HEAD `cb59b23d`; Codex app-server não projeta config.toml/secret para runtime confinado; patch seguro necessário, alinhado à #157; gates locais bloqueados por uv/podman; CI verde; sem publicação | +| CLI-076 | P3 | VibePod | `VibePod/vibepod-cli` | concluida | `config-only` | `not-applicable` | `feat/omniroute-vibepod-integration` | — | — | — | not-in-catalog | Claude Code via `/api`, container usa `host.docker.internal`; Codex não injeta chave; compileall verde, pytest bloqueado por typer; sem publicação | +| CLI-077 | P3 | zeroshot | `the-open-engine/zeroshot` | concluida | `config-only` | `not-applicable` | `feat/omniroute-zeroshot-integration` | — | — | — | not-in-catalog | Gateway OpenAI `/api/v1`, `auto`, tools fail-closed; 22 testes + build verdes; sem streaming JSON/reasoning/MCP no gateway; sem publicação | +| CLI-078 | P3 | Fractal | `plasma-ai/fractal` | concluida | `config-only` / `needs-wrapper` | `awaiting-maintainer` | `feat/omniroute-fractal-integration` | — | — | — | not-in-catalog | Codex Responses por node `CODEX_HOME`; caveat tmux quente não encaminha `OMNIROUTE_API_KEY`; fix genérico recomendado, sem PR | +| CLI-079 | P3 | Bernstein | `chernistry/bernstein` | concluida | `config-only` | `not-applicable` | `feat/omniroute-bernstein-integration` | — | — | — | not-in-catalog | Canonical `sipyourdrink-ltd/bernstein`; openai_agents `/api/v1`, auto, api_key_env allowlisted; testes bloqueados por openai ausente; sem publicação | +| CLI-080 | P3 | Traycer | `traycerai/traycer` | concluida | `config-only` indireto | `not-applicable` | `feat/omniroute-traycer-integration` | — | — | — | not-in-catalog | Harness OpenCode + provider `@ai-sdk/openai-compatible`, `/api/v1`, `omniroute/auto`; host central fechado; sem publicação | +| CLI-081 | P3 | h5i | `h5i-dev/h5i` | concluida | `patch-required` | `awaiting-maintainer` | `feat/omniroute-h5i-integration` | — | — | — | not-in-catalog | Auth proxy/egress Codex fixos em OpenAI anulam base custom; patch seguro/policy-pinned necessário; CI externa verde; sem publicação | +| CLI-082 | P3 | OMK | `dmae97/open-multi-agent-kit` | concluida | `viable-mcp` | `not-applicable` | `feat/omniroute-omk-integration` | — | — | — | not-in-catalog | pesquisa concluída neste lote; controle multiagente, MCP é caminho primário; sem provider nominal | +| CLI-083 | P3 | kodo | `ikamensh/kodo` | concluida | `config-only` indireto | `not-applicable` | `feat/omniroute-kodo-integration` | — | — | — | not-in-catalog | pesquisa concluída neste lote; orquestrador/agent child, propagar env/base/model ao agente filho | +| CLI-084 | P3 | ORCH | `oxgeneral/ORCH` | concluida | `needs-wrapper` | `awaiting-maintainer` | `feat/omniroute-orch-integration` | — | — | — | not-in-catalog | pesquisa concluída neste lote; fila/controle sem provider LLM direto, wrapper/adaptador necessário | +| CLI-085 | P3 | LoopTroop | `LoopTroop-ai/LoopTroop` | concluida | `config-only` indireto | `not-applicable` | `feat/omniroute-looptroop-integration` | — | — | — | not-in-catalog | HEAD `cbfc81c5`; OpenCode recebe provider `@ai-sdk/openai-compatible`, `/api/v1`, `omniroute/auto`; 16 testes verdes; sem publicação | +| CLI-086 | P3 | Galley | `shinpr/galley` | concluida | `patch-required` | `awaiting-maintainer` | `feat/omniroute-galley-integration` | — | — | — | not-in-catalog | HEAD `6bcc593d`; registry/transports fechados, requer transport OpenAI-compatible para executor e supervisor; Go ausente; sem publicação | +| CLI-087 | P3 | Relay | `jcast90/relay` | concluida | `config-only` | `not-applicable` | `feat/omniroute-relay-integration` | — | — | — | not-in-catalog | HEAD `7bd5a2f6`; provider profile Codex com `OPENAI_BASE_URL`, key ref e modelo; smoke Responses obrigatório; MCP separado; sem publicação | +| CLI-088 | P3 | SageCLI | `youwangd/SageCLI` | concluida | `config-only` indireto | `not-applicable` | `feat/omniroute-sagecli-integration` | — | — | — | not-in-catalog | HEAD `c167712d`; Codex runtime, base/key configuradas fora do Sage; env plaintext caveat; 45 testes verdes; sem publicação | +| CLI-089 | P3 | 5dive | `5dive-ai/5dive` | concluida | `patch-required` | `awaiting-maintainer` | `feat/omniroute-5dive-integration` | — | — | — | not-in-catalog | HEAD `b64b6dac`; provider/base maps fechados; patch OpenAI-compatible genérico; 50 testes focados verdes; sem publicação | +| CLI-090 | P3 | agx | `ramarlina/agx` | concluida | `config-only` indireto | `not-applicable` | `feat/omniroute-agx-integration` | — | — | — | not-in-catalog | HEAD `e674cec1`; Codex herda base/key/model; smoke Responses e governança `--full-auto`; Jest ausente; sem publicação | +| CLI-091 | P3 | claude-code-router | `musistudio/claude-code-router` | concluida | `config-only` | `not-applicable` | `feat/omniroute-claude-code-router-integration` | — | — | — | not-in-catalog | HEAD `bc8a8e62`; provider custom OpenAI/Anthropic/Gemini, Chat/Responses; smoke por protocolo; sem publicação | +| CLI-092 | P3 | cc-router | `finch-xu/cc-router` | concluida | `config-only` | `not-applicable` | `feat/omniroute-cc-router-integration` | — | — | — | not-in-catalog | HEAD `c4c7579`; custom Responses/Chat com base/path/header, SSE/tools/reasoning; cargo bloqueado por glib; sem publicação | +| CLI-093 | P3 | OneCLI | `onecli/onecli` | concluida | `config-only` | `not-applicable` | `feat/omniroute-onecli-integration` | — | — | — | not-in-catalog | HEAD `84ccaf74`; MITM credential gateway, generic host injection; MCP separado; sem publicação | +| CLI-094 | P3 | agent-browser | `vercel-labs/agent-browser` | concluida | `config-only` | `not-applicable` | `feat/omniroute-agent-browser-integration` | — | — | — | not-in-catalog | HEAD `01c1147d`; chat usa gateway Chat/SSE/tools com env key/model; base precisa validar sufixo `/v1` para não duplicar path; cargo test exit 0; sem publicação | +| CLI-095 | P3 | OpenWork | `different-ai/openwork` | concluida | `config-only` indireto | `not-applicable` | `feat/omniroute-openwork-integration` | — | — | — | not-in-catalog | HEAD `ecb7a5f0`; OpenCode custom provider `/api/v1`, auth gerenciada; sem testes/deps; sem publicação | +| CLI-096 | P3 | Agent Deck review | `asheshgoplani/agent-deck` | concluida | `config-only` indireto | `not-applicable` | `feat/omniroute-agent-deck-review` | — | — | — | integrated | HEAD `46300807`; env/model propagados a Codex/OpenCode; Go ausente; sem publicação | +| CLI-097 | P4 | Pool | `poolsideai/pool` | concluida | `config-only` | `not-applicable` | `feat/omniroute-pool-integration` | — | — | — | not-in-catalog | HEAD `a6fe0ca1`; `pool exec --api-url` OpenAI-compatible, sandbox required, MCP/ACP separado; EULA; sem publicação | +| CLI-098 | P4 | Junie CLI | `junie.jetbrains.com` | concluida | `config-only` | `not-applicable` | `feat/omniroute-junie-integration` | — | — | — | not-in-catalog | HEAD `d2701be6`; custom profile OpenAICompletion/Responses com baseUrl full e env ref; runtime proprietário/EAP; sem publicação | +| CLI-099 | P4 | Cursor desktop | Anysphere | concluida | `config-only` limitado | `awaiting-maintainer` | `feat/omniroute-cursor-desktop-integration` | — | — | — | integrated | disclosure-only; BYO key/chat panel; Composer/Tab nativos; privado/MITM proibido; sem publicação | +| CLI-100 | P4 | Windsurf | Codeium | concluida | `blocked-closed` / MCP-only | `awaiting-maintainer` | `feat/omniroute-windsurf-integration` | — | — | — | not-in-catalog | sem upstream/base custom; BYOK Anthropic específico; MCP separado; MITM proibido; sem publicação | +| CLI-101 | P4 | Amp | Sourcegraph | concluida | `config-only` parcial / Enterprise-gated | `awaiting-maintainer` | `feat/omniroute-amp-integration` | — | — | — | not-in-catalog | CLI fechada/Amp Server; confirmar provider custom com suporte; MCP viável; sem publicação | +| CLI-102 | P4 | Amazon Q/Kiro CLI | AWS | concluida | `patch-required` legado / `blocked-closed` Kiro | `awaiting-maintainer` | `feat/omniroute-amazon-q-integration` | — | — | — | integrated | Q usa AWS EventStream/SigV4; Kiro fechado sem base custom; MCP-only seguro; sem publicação | +| CLI-103 | P4 | Cowork | Anthropic | concluida | `blocked-closed` / MCP-only | `not-applicable` | — | — | — | — | not-in-catalog | inferência gerida pela Anthropic sem BYOK/base custom; Custom Connector MCP remoto; MITM proibido; sem publicação | + +## Como atualizar + +Ao terminar uma fase, alterar somente os campos comprovados e deixar os demais como `—`. Para uma integracao concluida, registrar: versao/commit pesquisado, mecanismo, arquivos modificados, testes, branch, commit, URL de PR/issue e resposta do mantenedor. Se o caso for apenas configuracao, registrar o comando/config real e marcar `config-only` ou `viable-direct`, sem criar uma PR artificial. + +Antes de publicar uma contribuicao, aplicar o gate e o checklist de +`05-plano-publicacao-prs-upstream.md`. diff --git a/_references/_sistemas_cli/05-plano-publicacao-prs-upstream.md b/_references/_sistemas_cli/05-plano-publicacao-prs-upstream.md new file mode 100644 index 0000000000..44c1715662 --- /dev/null +++ b/_references/_sistemas_cli/05-plano-publicacao-prs-upstream.md @@ -0,0 +1,659 @@ +# Plano de publicacao de integracoes OmniRoute nos repositorios upstream + +> **Status da campanha de pesquisa:** `104/104` casos concluídos. Este plano continua sendo o procedimento de execução e publicação. A matriz final, inclusive os casos em que PR é inadequada ou impossível, está em `06-relatorio-final-104-clis-e-estrategia-prs.md`. + +**Data:** 2026-08-01 +**Escopo:** transformar a fila `CLI-000` a `CLI-103` em contribuicoes upstream verificadas, +publicando PR, issue, guia de configuracao, adaptador ou conclusao de bloqueio conforme o mecanismo +real de cada projeto. +**Documentos-base:** `01-relatorio-pesquisa-clis-omniroute.md`, +`02-prioridade-integracoes-clis.md`, `03-plano-integracao-em-lotes.md` e +`04-tracker-integracoes-clis.md`. + +## 1. Resultado esperado + +Para cada repositorio pesquisado, a campanha deve produzir exatamente um resultado principal: + +1. **PR upstream de integracao nominal:** adiciona provider/preset `omniroute`, configuracao, + documentacao e testes quando isso combina com a arquitetura do projeto. +2. **PR upstream de compatibilidade generica:** melhora suporte a endpoint customizado sem acoplar + o projeto ao nome OmniRoute, acompanhado de documentacao comprovando o uso com OmniRoute. +3. **PR somente de documentacao:** registra uma configuracao funcional quando o codigo ja suporta + OmniRoute e o upstream aceita guias de terceiros. +4. **Issue-first:** solicita decisao de arquitetura ou permissao antes do patch quando a politica do + repositorio, o desenho de providers ou o tamanho da mudanca exigirem alinhamento. +5. **Configuracao sem PR:** documenta no OmniRoute um fluxo que ja funciona e para o qual uma mudanca + upstream seria redundante ou rejeitada pela politica do projeto. +6. **Adaptador ACP/MCP/wrapper:** contribui no ponto de extensao correto quando o projeto nao consome + diretamente APIs de modelos. +7. **MITM, produto fechado ou bloqueado:** registra evidencia e nao fabrica uma contribuicao que o + upstream nao pode receber. + +O objetivo e tentar integrar todos os casos tecnicamente possiveis. O objetivo nao e abrir uma PR em +todo repositorio independentemente da arquitetura, licenca ou politica de contribuicao. + +## 2. Regras da campanha + +- Trabalhar em lotes de no maximo tres repositorios, com um subagente por repositorio. +- Usar uma worktree isolada por repositorio dentro de `.claude/worktrees/`. +- Nao editar implementacoes no checkout compartilhado. +- Nao usar `git stash` ou `git pop`. +- Fazer pesquisa fresca no commit atual do upstream antes de criar branch ou editar arquivos. +- Ler `README`, `CONTRIBUTING`, templates de issue/PR, `SECURITY`, licenca e instrucoes locais de + agentes antes da implementacao. +- Procurar issues e PRs abertas/fechadas sobre custom provider, base URL, OpenAI-compatible, + Anthropic-compatible, Gemini endpoint, proxy, gateway e OmniRoute antes de propor uma mudanca. +- Registrar a base pesquisada por commit SHA ou release. Nao usar apenas `main` como evidencia. +- Executar baseline antes da mudanca e distinguir falhas preexistentes de regressao. +- Nunca expor `OMNIROUTE_API_KEY` ou qualquer outra credencial em comandos publicados, fixtures, + logs, commits, screenshots, PRs ou issues. +- Nao inserir trailers, assinaturas ou rodapes de IA em commits, PRs ou issues. +- Nao afirmar que uma integracao funciona sem um teste reproduzivel ou uma limitacao explicitamente + registrada. +- Nao inventar fork, branch, commit, PR, issue, CI ou resposta de mantenedor. +- Atualizar `04-tracker-integracoes-clis.md` ao concluir cada fase material. + +## 3. Unidade de trabalho por repositorio + +Cada item `CLI-NNN` deve possuir uma task individual. A task e o pacote de contexto entregue ao +subagente e o registro que permite retomar o trabalho sem repetir ou perder evidencias. + +### 3.1 Cabecalho obrigatorio da task + +```md +# CLI-NNN - - integracao OmniRoute upstream + +- Repositorio canonico: +- Prioridade/lote: +- Estado no catalogo OmniRoute: +- Evidencia inicial: +- Worktree: +- Branch planejada: +- Commit/release pesquisado: — +- Responsavel: +- Estado: researching +``` + +### 3.2 Pesquisa obrigatoria dentro da task + +O subagente deve responder, com links e caminhos de codigo: + +1. Qual e o repositorio canonico, commit/release atual, licenca e nivel de atividade? +2. Contribuicoes de forks externos sao aceitas? Ha CLA, DCO, sign-off ou issue previa obrigatoria? +3. Qual e a arquitetura de providers e qual e o menor ponto de extensao? +4. O cliente usa Chat Completions, Responses, Anthropic Messages, Gemini, ACP, MCP ou protocolo + proprietario? +5. A base URL esperada e raiz, `/v1`, `/v1beta` ou uma URL completa por operacao? +6. O cliente acrescenta algum sufixo automaticamente? Pode duplicar `/v1` ou `/v1beta`? +7. Como a autenticacao e resolvida: variavel de ambiente, arquivo, keyring, OAuth ou header custom? +8. Como os modelos sao definidos ou descobertos? O cliente chama um endpoint de modelos? +9. Streaming, tool calling, reasoning, imagens e cancelamento funcionam pelo caminho escolhido? +10. Ja existe issue, PR, discussao ou documentacao para endpoints customizados ou OmniRoute? +11. Quais comandos oficiais executam install, format, lint, typecheck, build e testes? +12. Qual contribuicao agrega valor real: codigo nominal, compatibilidade generica, docs, issue, + wrapper, MCP/ACP, somente configuracao ou nenhum patch? + +### 3.3 Gate de contribuicao + +Antes de editar, preencher uma decisao: + +| Decisao | Quando usar | Saida esperada | +|---|---|---| +| `pr-provider` | O upstream possui catalogo/presets de providers | Provider/preset OmniRoute, docs e testes | +| `pr-generic` | Falta uma capacidade generica necessaria, como base URL customizavel | Patch generico, docs e teste com OmniRoute | +| `pr-docs` | O codigo ja funciona e o upstream aceita guias de integracao | Guia minimo e validado | +| `issue-first` | Mudanca arquitetural, politica incerta ou mantenedor exige proposta | Issue com evidencia e desenho do patch | +| `config-only` | Tudo funciona por configuracao e um PR seria redundante | Guia no OmniRoute e smoke test | +| `adapter-acp` | ACP e o ponto real de integracao | Adaptador/registro ACP e testes | +| `adapter-mcp` | MCP e o ponto real de integracao | Config/servidor MCP e testes | +| `wrapper` | O projeto apenas lanca outro agente | Wrapper/env forwarding e teste do filho | +| `needs-mitm` | Endpoint fechado ou fixo | Pesquisa/guia MITM separado; sem PR artificial | +| `blocked` | Licenca, politica, build ou protocolo impedem progresso | Evidencia reproduzivel e proximo desbloqueio | + +O gate deve incluir a alternativa rejeitada. Exemplo: `pr-provider` escolhido porque o repositorio +mantem presets nomeados; `pr-docs` rejeitado porque a configuracao exigiria cinco campos internos e +nao seria uma experiencia suportada. + +## 4. Ciclo completo da PR + +### Fase PR-0 - Preparar o contexto + +- Reservar o item no tracker e marcar pesquisa em andamento. +- Confirmar que nenhum outro agente esta trabalhando no mesmo repositorio. +- Resolver o repositorio canonico, fork existente e permissao de contribuicao. +- Criar a task individual com a evidencia inicial marcada como hipotese. +- Criar a worktree isolada somente depois de confirmar o upstream correto. + +### Fase PR-1 - Pesquisar upstream e contribuicoes existentes + +- Ler integralmente as regras do repositorio aplicaveis aos arquivos que podem mudar. +- Mapear provider registry, configuracao, transporte HTTP, auth, modelo, streaming e ferramentas. +- Pesquisar issues/PRs por termos de compatibilidade e pelo nome OmniRoute. +- Registrar commit/release, caminhos e links de evidencia na task. +- Escolher o gate de contribuicao da secao 3.3. + +### Fase PR-2 - Baseline reproduzivel + +- Instalar dependencias de acordo com o upstream. +- Rodar format check, lint, typecheck/build e testes relevantes antes do patch. +- Rodar um smoke test do caminho existente, mesmo que ele falhe por falta da integracao. +- Limpar chaves do ambiente nos testes que validem o comportamento sem credenciais. +- Registrar comando, codigo de saida, testes aprovados e falhas preexistentes. +- Se o projeto nao puder ser construido, tentar o ambiente documentado e registrar o bloqueio; nao + declarar regressao nem compatibilidade com base apenas na leitura do README. + +### Fase PR-3 - Desenhar o menor patch aceitavel + +A ordem de preferencia e: + +1. Reusar a abstracao de provider ja existente. +2. Adicionar metadados/preset antes de criar codigo especial. +3. Reusar cliente OpenAI/Anthropic/Gemini ja presente. +4. Adicionar capacidade generica quando ela beneficiar outros gateways e for coerente com o projeto. +5. Criar executor/adapter dedicado somente quando o protocolo realmente divergir. + +O patch normalmente deve cobrir: + +- identificador e nome de exibicao `omniroute`, se presets nomeados forem aceitos; +- base URL correta e sem dupla concatenacao de versao; +- chave obtida de ambiente ou storage seguro; +- configuracao/descoberta de modelo; +- headers estritamente necessarios; +- streaming e tool calling preservados; +- mensagens de erro sem expor segredo; +- documentacao curta e executavel; +- testes unitarios/integracao alinhados ao padrao upstream. + +Nao adicionar telemetria, dependencia, fluxo de login ou codigo de rede novo quando o provider +generico existente ja resolve o caso. + +### Fase PR-4 - Implementar com teste primeiro + +- Criar teste que demonstre a ausencia do preset, config ou comportamento requerido. +- Confirmar a falha pelo motivo esperado. +- Implementar o menor patch. +- Fazer o teste passar e executar testes adjacentes. +- Refatorar apenas o necessario para manter o padrao do upstream. +- Formatar somente os arquivos tocados, salvo exigencia contraria do repositorio. + +Para PR somente de documentacao, substituir o teste vermelho por uma validacao real dos comandos e +do arquivo de configuracao documentado. Nao sintetizar exemplos que nao foram executados. + +### Fase PR-5 - Validar contra OmniRoute + +Escolher a matriz compativel com o cliente: + +| Superficie | Base inicial esperada | Validacoes minimas | +|---|---|---| +| OpenAI Chat Completions | confirmar se o cliente espera raiz ou `/v1` | chamada simples, stream, tool call, erro de modelo | +| OpenAI Responses | confirmar regra de concatenacao do cliente | resposta simples, stream/eventos, tool call | +| Anthropic Messages | normalmente base antes de `/v1/messages`; confirmar no codigo | mensagem, stream, tools, headers de versao | +| Gemini | normalmente base antes das operacoes `v1beta`; confirmar no codigo | generateContent, streamGenerateContent, tools | +| ACP | endpoint/transport definido pelo protocolo | discovery, sessao, request e cancelamento | +| MCP | stdio, SSE ou Streamable HTTP conforme suporte | inicializacao, listagem e invocacao de ferramenta | + +Registrar no resultado quais linhas da matriz foram executadas, omitidas ou bloqueadas. Um smoke +test simples nao deve ser apresentado como prova de tool calling ou streaming. + +### Fase PR-6 - Revisar o diff antes de publicar + +O agente responsavel faz uma auto-revisao e o agente principal verifica: + +- aderencia a `CONTRIBUTING` e instrucoes locais; +- escopo minimo e ausencia de refactor oportunista; +- testes cobrindo config, URL, auth sem segredo e modelo; +- documentacao consistente com o codigo executado; +- ausencia de arquivos gerados, caches, logs ou credenciais; +- licenca e atribuicao preservadas; +- branch baseada no upstream atual; +- commits pequenos e com mensagem no estilo do projeto; +- ausencia de trailers ou texto de IA; +- `git diff --check` e gates oficiais limpos, ou falhas preexistentes documentadas. + +Uma PR nao deve ser publicada enquanto houver alteracao sem explicacao, teste essencial faltando ou +duvida material sobre a politica do upstream. + +### Fase PR-7 - Preparar a publicacao + +- Confirmar fork e remotes sem sobrescrever branches existentes. +- Atualizar a branch sobre o ponto exigido pelo upstream usando operacao nao destrutiva. +- Enviar a branch ao fork somente depois da revisao. +- Criar PR contra a branch correta do repositorio canonico. +- Se a contribuicao externa estiver bloqueada, abrir issue-first e anexar o commit/patch de + referencia somente quando isso for permitido. +- Registrar URLs reais no tracker imediatamente apos a publicacao. + +Convencoes de branch sugeridas, sujeitas ao padrao de cada upstream: + +- `feat/omniroute-provider` para provider/preset nominal; +- `feat/custom-base-url` para capacidade generica; +- `docs/omniroute-setup` para documentacao validada; +- `fix/custom-endpoint-versioning` para correcao de raiz versus `/v1`/`/v1beta`. + +### Fase PR-8 - Corpo da PR + +Usar o template oficial do repositorio quando existir. Na ausencia de template, adaptar: + +```md +## Why + +Explain the user problem and the existing extension point. Avoid marketing claims. + +## What changed + +- Add or enable the smallest provider/configuration path required. +- Document the verified setup. +- Cover URL, authentication and model selection behavior with tests. + +## Verification + +- `` +- `` +- `` + +## Compatibility notes + +- API surface: `` +- Base URL rule: `` +- Streaming: `` +- Tool calling: `` + +## Scope + +No unrelated refactors or credential changes. +``` + +O titulo deve descrever a mudanca, nao a campanha. Exemplos de formato, sujeitos ao estilo do +upstream: `Add OmniRoute provider preset`, `Support configurable OpenAI-compatible base URLs` ou +`Document OmniRoute as a custom endpoint`. + +### Fase PR-9 - Issue-first ou fallback + +Quando uma PR direta nao for apropriada, a issue deve conter: + +- problema reproduzivel e publico afetado; +- ponto de extensao encontrado no codigo; +- proposta minima; +- compatibilidade esperada e protocolo; +- evidencia de teste ou prototipo; +- pergunta objetiva ao mantenedor; +- link para patch de referencia apenas se permitido. + +Nao abrir simultaneamente issue e PR sem necessidade. Se o template exigir issue previa, esperar a +decisao ou seguir a politica declarada. + +### Fase PR-10 - Acompanhar ate a decisao + +Depois da publicacao: + +- observar CI e checks obrigatorios; +- responder perguntas tecnicas com evidencia; +- corrigir somente o escopo da contribuicao ou pedidos claros do mantenedor; +- reexecutar testes depois de cada mudanca; +- registrar novos commits, revisoes e estado no tracker; +- marcar `accepted` somente depois de merge/aceite comprovado; +- marcar `rejected` com o motivo fornecido pelo upstream; +- se a PR ficar inativa, registrar `awaiting-maintainer`, sem declarar abandono prematuramente; +- manter o guia/catalogo OmniRoute coerente com o estado real do upstream. + +O acompanhamento pode usar a skill `babysit` individualmente para uma PR aberta. Como essa skill +acompanha uma unica PR, nunca agrupar tres PRs em uma mesma execucao dela. + +### Fase PR-11 - Fechar a task + +Uma task individual termina com: + +- pesquisa fresca e gate registrados; +- diff, configuracao ou bloqueio documentado; +- baseline e validacao final comparados; +- branch/commit reais, quando criados; +- PR/issue reais, quando publicados; +- status no catalogo OmniRoute; +- limitacoes e proximo passo; +- linha correspondente no tracker atualizada. + +## 5. Estrategia de paralelizacao + +### 5.1 Papeis por lote + +- **Subagente A:** primeiro repositorio do lote; dono exclusivo da worktree e do diff upstream. +- **Subagente B:** segundo repositorio do lote; dono exclusivo da worktree e do diff upstream. +- **Subagente C:** terceiro repositorio do lote; dono exclusivo da worktree e do diff upstream. +- **Agente principal:** coordena o tracker, revisa gates/diffs, impede duplicacao e autoriza a + publicacao depois das evidencias. + +Todos os agentes devem ser avisados de que nao estao sozinhos no workspace e nao podem reverter ou +sobrescrever mudancas de outros agentes. + +### 5.2 Barreira do lote + +O lote seguinte pode comecar quando os tres itens atuais tiverem, no minimo: + +1. commit/release upstream pesquisado; +2. gate de contribuicao definido; +3. baseline registrado; +4. patch validado, configuracao comprovada ou bloqueio reproduzivel; +5. decisao de publicacao tomada; +6. tracker atualizado. + +A espera por resposta de mantenedor nao bloqueia o lote seguinte. Depois de uma PR/issue publicada, +o item passa para acompanhamento e libera o slot de implementacao. + +### 5.3 Limite de trabalho em progresso + +- No maximo tres pesquisas/implementacoes ativas. +- Publicacoes aguardando mantenedor nao contam como slot de implementacao, mas ficam no tracker. +- No maximo uma task ativa por repositorio, inclusive forks ou variantes do mesmo upstream. +- Se dois itens resolverem o mesmo repositorio, consolidar a pesquisa e decidir se ha uma ou duas + contribuicoes antes de abrir branches. + +## 6. Fila de publicacao + +A ordem detalhada continua sendo a do `03-plano-integracao-em-lotes.md`. Esta secao define o objetivo +de publicacao de cada onda; a pesquisa individual pode promover, rebaixar ou mudar o tipo de +contribuicao. + +### Onda 0 - referencia e infraestrutura da campanha + +- `CLI-000` jcode: acompanhar issue upstream e PR de referencia; concluir a secao prometida no + README do OmniRoute. +- Preparar o modelo de task individual e aplicar o mesmo tracker a todos os novos repositorios. + +### Onda 1 - P0.1 a P0.5 + +- `CLI-001` Gemini CLI: confirmar se o endpoint Gemini customizado pede apenas docs/config ou um + preset nominal. +- `CLI-002` Claw Code: confirmar provider OpenAI-compatible e propor preset/docs minimos. +- `CLI-003` Plandex: confirmar o registro de providers customizados e propor provider/preset. +- `CLI-004` MiMo Code: confirmar o adapter OpenAI-compatible e propor configuracao/provider. +- `CLI-005` Trae Agent: confirmar `model_providers` e propor entrada OmniRoute/documentacao. +- `CLI-006` Kimi CLI: escolher uma superficie suportada e evitar um patch que misture tres + protocolos sem testes. +- `CLI-007` Every Code: reutilizar a arquitetura herdada do Codex quando ainda aplicavel. +- `CLI-008` Open Codex: confirmar upstream canonico e propor provider multi-modelo. +- `CLI-009` VT Code: validar provider customizado, modelo e failover. +- `CLI-010` OpenHands CLI: verificar se `LLM_BASE_URL` torna o caso docs/config-only. +- `CLI-011` gptme: verificar se `OPENAI_BASE_URL` torna o caso docs/config-only. +- `CLI-012` Nanocoder: confirmar compatibilidade de tool calling e decidir preset versus docs. +- `CLI-013` RA.Aid: verificar se `OPENAI_API_BASE` torna o caso docs/config-only. +- `CLI-014` CoreCoder: verificar se `OPENAI_BASE_URL` torna o caso docs/config-only. +- `CLI-015` Grok CLI: confirmar se o endpoint e genericamente configuravel ou preso ao protocolo + Grok antes de propor patch. + +### Onda 2 - P1.1 a P1.9 + +- `CLI-016` Gitlawb Zero: provider custom/flag; preferir docs ou preset pequeno. +- `CLI-017` DeepSeek Reasonix: confirmar repositorio, atividade e endpoint antes de qualquer PR. +- `CLI-018` KlaatCode: integrar via `customModels` ou preset se o catalogo aceitar nomes. +- `CLI-019` CodeMini CLI: validar `gateway.base_url` e sua regra de versao. +- `CLI-020` Zot: validar `--base-url` e `models.json`; docs-first se ja suficiente. +- `CLI-021` Octomind: confirmar variaveis de URL por provider e propor configuracao minima. +- `CLI-022` DvalinCode: confirmar o cliente OpenAI-compatible e testes disponiveis. +- `CLI-023` Coro Code: confirmar `OPENAI_BASE_URL`; docs-first se nao houver lacuna de codigo. +- `CLI-024` Mini-Kode: confirmar `MINIKODE_BASE_URL`; docs-first se nao houver lacuna de codigo. +- `CLI-025` Late CLI: testar ambiente e flag `api-url`; corrigir precedencia apenas se necessario. +- `CLI-026` Agentty: escolher entre provider direto e ACP conforme a arquitetura atual. +- `CLI-027` Aizen: validar `AIZEN_BASE_URL` e propor docs/preset. +- `CLI-028` Clif-Code: selecionar um unico protocolo principal para a primeira contribuicao. +- `CLI-029` Minacode: pesquisa confirmatoria antes de definir o tipo de PR. +- `CLI-030` YottaCode: confirmar gateway/provider e selecao de modelo. +- `CLI-031` aichat: integrar via configuracao de modelos ou provider nominal, conforme a politica. +- `CLI-032` ShellGPT: validar `API_BASE_URL` e decidir docs/config-only. +- `CLI-033` Mistral Vibe: confirmar base URL customizada e separar suporte generico de marca. +- `CLI-034` OpenSquilla: localizar o registro de gateways e propor provider/preset. +- `CLI-035` Kode CLI: escolher OpenAI, Anthropic ou Gemini com base na implementacao mais nativa. +- `CLI-036` Neovate Code: preferir plugin/provider oficial ao patch no core, se existir. +- `CLI-037` Deep Agents Code: contribuir no pacote CLI/provider correto, nao apenas no SDK generico. +- `CLI-038` OpenHands principal: evitar duplicar `CLI-010`; consolidar se ambos apontarem para o + mesmo mecanismo e upstream. +- `CLI-039` SWE-agent: confirmar backend de modelos e interface publica suportada. +- `CLI-040` AutoCodeRover: confirmar backend e propor config/provider minimo. +- `CLI-041` Claurst: revisar GPL e politica antes de redistribuir qualquer adaptacao. +- `CLI-042` Codebuff: confirmar se o provider e extensivel e se contribuicoes externas sao aceitas. + +### Onda 3 - P2.1 a P2.11 + +- `CLI-043` Devon, `CLI-044` Letta Code e `CLI-045` CodeMachine CLI: pesquisar backend real; + revisar a entrada local ja existente de Letta antes de nova PR. +- `CLI-046` Groq Code CLI, `CLI-047` Dexto e `CLI-048` claw-code-agent: confirmar endpoints, + protocolos e maturidade antes do patch. +- `CLI-049` g3, `CLI-050` San e `CLI-051` Waveloom: localizar a abstracao de provider e preferir + implementacao generica. +- `CLI-052` picocode, `CLI-053` QQCode e `CLI-054` Keen Code: validar configuracao multi-modelo e + documentar o caminho minimo. +- `CLI-055` Grinta, `CLI-056` Zap e `CLI-057` Binharic: escolher o provider compativel com melhor + cobertura de streaming/tools. +- `CLI-058` Darce, `CLI-059` CLAII e `CLI-060` nori-cli: separar integracao de modelo de MCP e de + codigo herdado do Codex. + +Resultado P2.6: + +- `CLI-058` Darce: `config-only`, sem PR necessária; usar `DARCE_API_BASE` na raiz e `DARCE_MODEL`. +- `CLI-059` CLAII: patch genérico local validado, mas publicação bloqueada pela declaração upstream + `All Rights Reserved`/ausência de licença OSS; só reconsiderar com autorização jurídica explícita. +- `CLI-060` nori-cli: `config-only` via agente ACP customizado OpenCode; não alterar backend Codex; + MCP deve ser configurado uma vez, em Nori ou OpenCode, para evitar duplicação de tools. +- `CLI-061` cursor-agent clone, `CLI-062` Free Code e `CLI-063` Claude Engineer: revisar origem, + licenca e politica do fork antes de publicar. + +Lote P2.7 reservado em 2026-08-02, na branch-base local `release/v3.8.50` em +`35405be6020696a7c66158ea7a25f06d61ff88ff`. Os três upstreams foram clonados em worktrees +separadas, indexados e delegados. Nenhuma publicação está autorizada; patches só podem surgir após +prova RED→GREEN e permanecem sem commit até revisão central. + +Resultado P2.7: + +- `CLI-061` cursor-agent clone: `config-only`; OpenAI usa base com `/v1`, Anthropic usa raiz sem + `/v1`; tools/tool-result foram comprovados nos dois protocolos. O factory rejeita `auto` puro, + mas isso não impede uso com modelos reconhecíveis ou classes diretas. Sem PR. +- `CLI-062` Free Code: `config-only` com `ANTHROPIC_BASE_URL` na raiz e `model=auto`; stream, + tools/tool-result e MCP nativo foram comprovados. O repo canônico agora é `freecodexyz/free-code`, + mas não há licença e o README atribui o código à Anthropic; publicação bloqueada. +- `CLI-063` Claude Engineer: endpoint/chave funcionam como `config-only` com modelo fixo. A lacuna + de `ANTHROPIC_MODEL` já está coberta pela PR #250; não criar patch concorrente. Arquivo de licença + segue ausente apesar da issue #116, portanto publicação permanece bloqueada. +- `CLI-064` Smol Developer, `CLI-065` Agentless e `CLI-066` Amazon Q Developer CLI: decidir entre + SDK/adaptador, config de modelo ou bloqueio por autenticacao. + +Lote P2.8 iniciado em 2026-08-02 na branch-base local `release/v3.8.50`, SHA +`35405be6020696a7c66158ea7a25f06d61ff88ff`, com clones limpos e separados. Smol Developer será +testado primeiro como integração do SDK OpenAI legado; Agentless será avaliado por backend +OpenAI/Anthropic/DeepSeek; Amazon Q Developer CLI será tratado como protocolo AWS próprio, com MCP +avaliado separadamente. Não criar adaptador grande para Amazon Q nem qualquer publicação antes de +issue-first/coordenação exigida por `CONTRIBUTING.md`. Estado inicial: nenhum commit, fork, push, +PR, issue ou Discussion. + +Resultado P2.8: + +- `CLI-064` Smol Developer: `config-only`; `OPENAI_API_BASE` com `/v1` e `model=auto` passaram no + CLI, biblioteca e Agent Protocol histórico. Não há lacuna provider-specific e a PR #134 já cobre + uma expansão LiteLLM. Sem publicação. +- `CLI-065` Agentless: `config-only` pelo backend OpenAI, incluindo embeddings. Anthropic normal + também funciona; cache/tools exige SDK histórico e DeepSeek possui host fixo, mas essas melhorias + não são necessárias para integrar o projeto e propostas LiteLLM anteriores foram fechadas. Sem + publicação. +- `CLI-066` Amazon Q Developer CLI: MCP stdio é a integração direta; o backend de modelo fala AWS + JSON/EventStream e precisa de wrapper/backend novo. O upstream está em manutenção crítica e exige + issue-first; não preparar PR nominal ou adaptador surpresa. Sem publicação. + +Estado final P2.8: commits `0`, pushes `0`, forks `0`, PRs `0`, issues `0`, Discussions `0`. +Próxima fila: P2.9 (`CLI-067` nanobot, `CLI-068` ZeroClaw, `CLI-069` NanoClaw), usando no máximo +três worktrees/agentes e repetindo a pesquisa individual antes de qualquer patch. + +Lote P2.9 iniciado em 2026-08-03 sobre a branch-base local `release/v3.8.50`, SHA +`84b1e5e12f238269e698f400766230f985f4a07b`. O checkout principal já continha uma alteração do +operador em `CLAUDE.md`, preservada fora do escopo. As worktrees foram recriadas e os upstreams +foram clonados nos HEADs `44b7e1bf4` (nanobot), `4770420ab` (ZeroClaw) e `dfac7e0af` (NanoClaw). +Os três índices Codebase Memory moderate estão ready, sem skipped, e a pesquisa foi delegada a um +agente por repositório. Nenhuma publicação está autorizada; o estado inicial continua: commits `0`, +pushes `0`, forks `0`, PRs `0`, issues `0`, Discussions `0`. + +- `CLI-067` nanobot, `CLI-068` ZeroClaw e `CLI-069` NanoClaw: validar providers OpenClaw/Anthropic + e evitar assumir que todos aceitam a mesma base URL. + +Resultado P2.9: + +- `CLI-067` nanobot: `config-only` pelo provider dinâmico OpenAI-compatible. A base correta inclui + `/api/v1`; `omniroute/auto` seleciona o provider custom e envia `auto` no wire. Chat, SSE, tools, + reasoning, usage, imagens, discovery e retry foram validados. Sem publicação upstream. +- `CLI-068` ZeroClaw: `config-only` pela família `custom`, com `uri=/v1`, modelo `auto`, wire Chat e + `native_tools=true`. Responses é opt-in. Suite de provider, config, fmt e smoke HTTP passaram. + Sem provider nominal ou publicação upstream. +- `CLI-069` NanoClaw: `config-only` pelo provider Claude existente, apontando a raiz Anthropic do + OmniRoute sem `/v1/messages` e usando OneCLI para a credencial. Codex e OpenCode têm bloqueios + upstream reproduzidos (#3155/#1984/#2985) e ficam fora do caminho de produção atual. + +Estado final P2.9: commits `0`, pushes `0`, forks `0`, PRs `0`, issues `0`, Discussions `0`. +Progresso da pesquisa: `70/104` (`67,3%`); pendentes: `34/104` (`32,7%`). Próxima fila: P2.10 +(`CLI-070` PicoClaw, `CLI-071` IronClaw, `CLI-072` NullClaw). +- `CLI-070` PicoClaw, `CLI-071` IronClaw e `CLI-072` NullClaw: localizar traits/registries e propor + um provider pequeno com testes. +- `CLI-073` Moltis, `CLI-074` GitClaw e `CLI-075` LionClaw: confirmar atividade, provider e comandos + de validacao antes da publicacao. + +### Onda 4 - P3, integracoes indiretas + +- `CLI-076`, `CLI-077`, `CLI-078`, `CLI-079`, `CLI-080` e `CLI-081`: pesquisar forwarding de + ambiente/configuracao para os agentes filhos; + publicar wrapper ou docs somente quando houver um ponto de extensao real. +- `CLI-082`, `CLI-083`, `CLI-084`, `CLI-085`, `CLI-086`, `CLI-087`, `CLI-088`, `CLI-089` e + `CLI-090`: escolher ACP, MCP, launcher ou integracao do agente filho; nao apresentar uma + integracao de orquestrador como provider de modelo. +- `CLI-091` e `CLI-092`: tratar como interoperabilidade entre proxies; documentar loops, headers, + auth e riscos antes de propor codigo. +- `CLI-093` e `CLI-094`: integrar como broker/ferramenta MCP somente se isso estiver no escopo dos + projetos. +- `CLI-095` e `CLI-096`: configurar o agente filho e revisar a entrada existente de Agent Deck. + +### Onda 5 - P4, fechados, EULA e MITM + +- `CLI-097` Pool: confirmar o que a EULA permite; priorizar configuracao local e nao presumir PR. +- `CLI-098` Junie CLI: pesquisar canal oficial de feedback; sem repositorio publico confirmado, nao + existe fila de PR. +- `CLI-099` Cursor desktop, `CLI-100` Windsurf, `CLI-101` Amp, `CLI-102` Amazon Q/Kiro CLI e + `CLI-103` Cowork: tratar como MITM, configuracao de produto ou pedido oficial de feature. So mover + para PR se um repositorio publico e uma politica de contribuicao forem comprovados. + +## 7. Prompt operacional para cada subagente + +O agente principal deve adaptar e enviar este prompt para cada item: + +```text +Voce e responsavel exclusivamente por CLI-NNN - no repositorio . +Voce nao esta sozinho no workspace: nao reverta, sobrescreva ou reorganize mudancas de outros +agentes. Trabalhe somente na worktree isolada atribuida dentro de .claude/worktrees/ e nunca use +git stash/pop. + +Primeiro pesquise o upstream atual. Leia README, CONTRIBUTING, licenca, templates e instrucoes locais. +Registre commit/release, arquitetura de providers, config/base URL, protocolo, auth, modelos, +streaming, tool calling, issues/PRs existentes e comandos oficiais de build/test. A evidencia inicial +do relatorio e uma hipotese, nao uma conclusao. + +Antes de editar, classifique o caso como pr-provider, pr-generic, pr-docs, issue-first, config-only, +adapter-acp, adapter-mcp, wrapper, needs-mitm ou blocked, com justificativa. Execute o baseline e +registre falhas preexistentes. Se houver patch, trabalhe com teste primeiro e implemente somente a +menor integracao coerente com o upstream. Confirme raiz versus /v1 versus /v1beta, autenticacao, +modelo, streaming e tool calling conforme aplicavel. + +Nao publique nada antes da revisao do agente principal. Entregue: pesquisa com links/caminhos, +gate, baseline, diff, testes, smoke test sanitizado, riscos, branch/commit local se criados e a +atualizacao proposta para 04-tracker-integracoes-clis.md. Nao invente dados e nao exponha chaves. +``` + +## 8. Checklist de autorizacao para enviar uma PR + +O agente principal somente autoriza a publicacao quando todas as respostas forem `sim` ou houver +uma excecao registrada: + +- [ ] O repositorio canonico e a branch-alvo foram confirmados. +- [ ] A politica aceita o tipo de contribuicao planejado. +- [ ] Issues/PRs duplicadas foram pesquisadas. +- [ ] O commit/release de base esta registrado. +- [ ] O gate de contribuicao esta justificado. +- [ ] O baseline foi executado e falhas preexistentes estao separadas. +- [ ] O patch e o menor necessario e segue a arquitetura upstream. +- [ ] A base URL e sua regra de versao foram verificadas no codigo e em runtime. +- [ ] Auth/modelos foram testados sem vazar segredo. +- [ ] Streaming/tool calling foram testados ou marcados explicitamente como nao aplicaveis. +- [ ] Testes, lint, format, typecheck/build relevantes foram executados. +- [ ] A documentacao foi executada e corresponde ao codigo. +- [ ] O diff nao contem caches, builds, logs, credenciais ou refactors sem relacao. +- [ ] O titulo e o corpo seguem o template upstream e nao contêm marketing ou texto de IA. +- [ ] O tracker esta pronto para receber branch, commit e URL reais. + +## 9. Campos adicionais recomendados no tracker + +O tracker atual deve continuar como fonte principal. Durante a execucao, registrar nas observacoes ou +em uma nota individual: + +- commit/release pesquisado; +- decisao `pr-provider`, `pr-generic`, `pr-docs`, `issue-first`, `config-only`, adapter, wrapper, + MITM ou bloqueio; +- protocolo e regra da base URL; +- comandos de baseline e resultado; +- comandos finais e resultado; +- smoke tests realizados; +- arquivos modificados; +- fork, branch e commit; +- PR/issue e estado de CI/review; +- limitacoes e proximo passo. + +Campos ainda nao comprovados permanecem `—`. + +## 10. Inicio recomendado + +O primeiro ciclo de publicacao deve usar o lote P0.1: + +1. `CLI-001` - Gemini CLI (`google-gemini/gemini-cli`) +2. `CLI-002` - Claw Code (`ultraworkers/claw-code`) +3. `CLI-003` - Plandex (`plandex-ai/plandex`) + +Os tres subagentes fazem pesquisa fresca e implementacao em paralelo, mas nenhuma PR e enviada antes +da revisao individual do agente principal. Ao publicar ou concluir config-only/bloqueio, atualizar o +tracker e liberar os mesmos tres slots para o lote P0.2. + +## Lote P2.10 iniciado em 2026-08-03 + +Base local: `release/v3.8.50` em `84b1e5e12f238269e698f400766230f985f4a07b`. Worktrees isoladas e um agente por upstream foram criadas para `CLI-070` PicoClaw, `CLI-071` IronClaw e `CLI-072` NullClaw. Nenhuma publicação está autorizada; os agentes devem pesquisar o HEAD atual, provar `config-only` ou RED→GREEN e registrar governança, gates, smoke e estado limpo. + +Resultado P2.10: + +- `CLI-070` PicoClaw: `config-only`, `openai/auto` com base `/api/v1`; Chat/SSE/tools/usage/images/discovery. Go ausente impediu execução local; monitorar #3298, sem PR. +- `CLI-071` IronClaw: `config-only`, `openai_compatible` com `/api/v1` e `auto`; 889 testes do crate LLM, 5 de resolução e fmt passaram. Sem PR; reasoning proprietário segue limitado por #3673. +- `CLI-072` NullClaw: `config-only`, provider custom com Chat Completions recomendado e Responses/Anthropic como alternativas. Zig ausente; CI do mesmo HEAD verde. Sem PR. + +Estado final P2.10: commits `0`, pushes `0`, forks `0`, PRs `0`, issues `0`, Discussions `0`. +Pesquisa acumulada: `73/104` (`70,2%`); pendentes: `31/104` (`29,8%`). Próxima fila: P2.11 (`CLI-073` Moltis, `CLI-074` GitClaw, `CLI-075` LionClaw). + +Resultado P3.1: + +- `CLI-076` VibePod: `config-only` pelo agente Claude Code com raiz Anthropic `/api`; wrapper injeta env no container. Codex sem chave automática permanece não comprovado. +- `CLI-077` zeroshot: `config-only` pelo gateway OpenAI `/api/v1`; 22 testes focados verdes; limitações de streaming JSON, reasoning e MCP registradas. +- `CLI-078` Fractal: `config-only` por Codex Responses em `CODEX_HOME` por node; servidores tmux quentes podem perder `OMNIROUTE_API_KEY`, recomendando fix genérico upstream. + +Estado final P3.1: commits `0`, pushes `0`, forks `0`, PRs `0`, issues `0`, Discussions `0`. Pesquisa acumulada: `79/104` (`76,0%`); pendentes: `25/104` (`24,0%`). + +Resultado P3.2: Bernstein `config-only` por openai_agents; Traycer `config-only` indireto pelo harness OpenCode; h5i `patch-required` porque auth proxy/egress são fixados em OpenAI. Nenhuma publicação externa. Pesquisa acumulada `82/104` (`78,8%`), pendentes `22/104` (`21,2%`). + +Resultado P2.11: + +- `CLI-073` Moltis: `config-only`, provider `custom-omniroute`, `/api/v1`, `auto`, Chat/SSE/tools e capacidades multimodais. 401 testes e fmt passaram. Sem publicação. +- `CLI-074` GitClaw/GitAgent: `config-only`, loader OpenAI-compatible com `GITAGENT_MODEL_BASE_URL`, `OPENAI_API_KEY` e `omniroute:auto`. Build, 65 testes e smoke passaram. Sem publicação. +- `CLI-075` LionClaw: `patch-required`/`issue-first`. O runtime Codex confinado não recebe `config.toml`/provider secret; preparar proposta genérica alinhada à [#157](https://github.com/moshthepitt/lionclaw/issues/157), sem PR até revisão do mantenedor. + +Estado final P2.11: commits `0`, pushes `0`, forks `0`, PRs `0`, issues `0`, Discussions `0`. Pesquisa acumulada: `76/104` (`73,1%`); pendentes: `28/104` (`26,9%`). +Resultado P3.3: OMK `viable-mcp`; kodo `config-only` indireto; ORCH `needs-wrapper`. Pesquisa acumulada `85/104` (`81,7%`), pendentes `19/104` (`18,3%`). Nenhuma publicação externa. + +Resultado P3.4: LoopTroop `config-only` indireto via provider OpenCode; Galley `patch-required` por não possuir transport OpenAI-compatible configurável; Relay `config-only` via provider profile/Codex, condicionado a smoke da Responses API e controles sobre ferramentas nativas. Nenhuma publicação externa. Pesquisa acumulada `88/104` (`84,6%`), pendentes `16/104` (`15,4%`). + +Resultado P3.5: SageCLI `config-only` indireto via Codex, com caveat de env plaintext; 5dive `patch-required` por mapas fechados de provider/base; agx `config-only` indireto via Codex e com gates de Responses/sandbox. Pesquisa acumulada `91/104` (`87,5%`), pendentes `13/104` (`12,5%`). Nenhuma publicação externa. + +Resultado P3.6: claude-code-router, cc-router e OneCLI são config-only; os dois primeiros oferecem endpoints custom OpenAI-compatible e OneCLI injeta credenciais por proxy MITM. Pesquisa acumulada `94/104` (`90,4%`), pendentes `10/104` (`9,6%`). Nenhuma publicação externa. + +Resultado P3.7: agent-browser `config-only` direto por Chat Completions; OpenWork `config-only` via OpenCode custom; Agent Deck `config-only` via CLIs filhos. Pesquisa acumulada `97/104` (`93,3%`), pendentes `7/104` (`6,7%`). Nenhuma publicação externa. + +Resultado P4.1: Pool e Junie são `config-only` OpenAI-compatible; Cursor é `config-only` limitado ao BYO chat panel, sem MITM/protocolo privado. Pesquisa acumulada `100/104` (`96,2%`), pendentes `4/104` (`3,8%`). Nenhuma publicação externa. + +Resultado P4.2: Windsurf está bloqueado para inferência e permite apenas MCP; Amp depende de confirmação Enterprise; Amazon Q legado requer patch substancial e Kiro atual é MCP-only seguro. Pesquisa acumulada `103/104` (`99,0%`), pendente `1/104` (`1,0%`). Nenhuma publicação externa. + +Resultado P4.3: Cowork não permite substituir oficialmente a inferência; Custom Connector MCP remoto é o único caminho suportado e permanece separado do modelo. Pesquisa concluída `104/104` (`100%`), pendentes `0/104` (`0%`). Nenhuma publicação externa nesta fase de pesquisa. diff --git a/_references/_sistemas_cli/06-relatorio-final-104-clis-e-estrategia-prs.md b/_references/_sistemas_cli/06-relatorio-final-104-clis-e-estrategia-prs.md new file mode 100644 index 0000000000..e1929db328 --- /dev/null +++ b/_references/_sistemas_cli/06-relatorio-final-104-clis-e-estrategia-prs.md @@ -0,0 +1,131 @@ +# Relatório final — campanha de 104 integrações CLI OmniRoute + +**Data de fechamento:** 2026-08-03 +**Escopo:** `CLI-000` a `CLI-103` +**Resultado:** `104/104` pesquisados (`100%`), `0` pendentes de pesquisa. + +## Como consultar o resultado individual + +O documento autoritativo, com uma linha para cada caso, é o [tracker completo](./04-tracker-integracoes-clis.md). Ele contém para cada ID: + +- prioridade; +- projeto e repositório; +- classificação de integração; +- estado de contribuição upstream; +- branch e commit quando existentes; +- URL de PR e/ou issue quando publicados; +- estado no catálogo OmniRoute; +- observações, limitações, testes e próximo passo. + +Além do tracker, existem fichas técnicas individuais em `_tasks/cli-integrations/`. A cobertura foi auditada e agora há uma ficha para cada ID `CLI-000`–`CLI-103`; o caso `CLI-000` jcode foi adicionado como ficha de referência nesta revisão. + +## Resumo quantitativo + +| Grupo operacional | Quantidade | Tratamento | +|---|---:|---| +| Configuração direta ou indireta | 76 | Documentar receita, validar smoke e só abrir PR se houver melhoria upstream real | +| Contribuição upstream (PR/issue/docs/patch) | 17 | Preparar diff mínimo, validar, revisar e publicar conforme política do repositório | +| Patch obrigatório | 4 | Implementar genericamente, com RED→GREEN/TDD e revisão do mantenedor | +| Bloqueados/fechados | 4 | Registrar bloqueio; usar apenas MCP ou canal oficial, sem MITM | +| MCP/wrapper/ACP como caminho principal | 2 | Integrar a camada de ferramentas/orquestração, sem falsificar provider de inferência | +| Outros casos híbridos | 1 | Seguir a combinação específica descrita no tracker | + +Os números são derivados do campo `Tipo` do tracker; categorias podem se sobrepor em casos híbridos. Atualmente há **7 PRs reais** e **9 issues reais** registrados no tracker, além de cinco entradas locais marcadas como integradas ao catálogo OmniRoute. Nenhum link foi inventado para os 97 casos sem publicação externa. + +## O que foi feito na campanha + +1. Inventário inicial e busca extensa de CLIs, runtimes, harnesses e control-planes. +2. Priorização P0–P4 considerando compatibilidade de protocolo, adoção, licença, maturidade e risco. +3. Pesquisa fresca, uma a uma, em worktrees isoladas, em lotes de no máximo três agentes. +4. Uso de Codebase Memory para índices upstream e verificação de cobertura; faixas parciais foram lidas diretamente quando aplicável. +5. Classificação por configuração, patch, PR documental, issue-first, MCP, wrapper ou bloqueio. +6. Registro de comandos, base URL, autenticação, modelos, streaming, tools, reasoning, imagens, MCP/ACP/A2A, testes e limitações. +7. Consolidação de cada lote com commit separado no OmniRoute e no repositório `_tasks`. +8. Atualização final do tracker, plano de integração, plano de publicação e handoff. +9. Nenhuma credencial real, publicação externa ou técnica de interceptação não autorizada foi utilizada. + +## Estratégia para abrir PRs em 100% dos casos + +“Abrir PR para 100%” deve ser interpretado como **dar um destino upstream apropriado a 100% dos casos**, e não criar 104 PRs artificiais. Há quatro trilhas: + +### Trilha A — PR de código ou documentação + +Aplicar aos casos `viable-upstream`, `pr-generic`, `pr-docs`, `patch-required` e híbridos que tenham superfície pública e política de contribuição compatível. + +Processo por caso: + +1. Reconfirmar HEAD, licença, branch default, política de contribuição e duplicatas. +2. Criar worktree/branch baseada na versão local vigente. +3. Executar baseline upstream e registrar falhas preexistentes. +4. Escrever teste RED que demonstre a lacuna. +5. Implementar o menor patch genérico possível — preferir `openai-compatible`, `base_url` ou provider abstrato a um provider nominal OmniRoute. +6. Executar GREEN: testes focados, suite upstream, lint, format, typecheck/build e smoke com fake server ou OmniRoute local usando placeholder. +7. Revisar segurança: nenhuma chave em argv, logs, fixtures, URL ou artefato; erros sanitizados; streaming/tools/cancelamento cobertos. +8. Abrir PR somente se contribuições externas forem aceitas. O corpo deve explicar problema, solução genérica, compatibilidade, testes, limitações e não conter marketing/texto de IA. +9. Se o repositório bloquear fork/PR ou pedir discussão prévia, abrir issue de proposta com o mesmo patch/reprodução, sem enviar PR prematuramente. +10. Atualizar tracker com branch, commit, URL, CI, revisão e resposta do mantenedor; acompanhar até `accepted`, `merged`, `rejected` ou `awaiting-maintainer`. + +### Trilha B — Issue-first, discussão ou suporte ao mantenedor + +Aplicar quando a arquitetura é adequada, mas há bloqueio de governança, firewall, CLA, fork fechado, dúvida de protocolo ou necessidade de decisão do autor. A issue deve conter: + +- caso de uso OmniRoute; +- configuração atualmente possível; +- lacuna reproduzível; +- proposta genérica; +- impacto de segurança; +- testes/fake server; +- disposição para enviar PR após aprovação. + +Não abrir uma PR paralela enquanto a política exigir issue-first. + +### Trilha C — Config-only documentado + +Aplicar aos casos em que o upstream já suporta a integração e uma mudança de código seria redundante. O entregável é: + +- ficha individual; +- receita validada; +- smoke test e limitações; +- eventual documentação externa/local do OmniRoute; +- issue somente se houver pedido de documentação ou descoberta de bug real. + +Não criar provider nominal ou PR apenas para adicionar a palavra “OmniRoute”. + +### Trilha D — MCP, wrapper ou bloqueio seguro + +Aplicar a control-planes, produtos fechados e CLIs sem rota de inferência substituível. O resultado pode ser: + +- MCP remoto/stdio do OmniRoute; +- wrapper local claramente identificado como wrapper; +- solicitação oficial de custom provider; +- registro de bloqueio e gate legal/ToS. + +Nunca mascarar OmniRoute como Claude/Codex, falsificar executável, interceptar TLS ou reutilizar tokens privados para fabricar uma PR upstream. + +## Ordem recomendada de execução + +1. **Primeiro:** PRs e issues já preparadas ou com alto retorno e baixo risco — jcode, Gemini CLI, Claw Code, Plandex, Trae Agent, Every Code, VT Code e CoreCoder. +2. **Segundo:** patches genéricos com boa superfície OSS — AutoCodeRover, Galley, 5dive e demais casos `pr-generic`/`patch-required`. +3. **Terceiro:** issues aguardando decisão — Open Codex, Kimi CLI, Devon, g3, Free Code, Claude Engineer e casos com `awaiting-maintainer`. +4. **Quarto:** documentação e receitas config-only agrupadas por ecossistema — OpenCode, Codex, LiteLLM, AI SDK, OpenAI-compatible e Anthropic-compatible. +5. **Quinto:** MCP/plugins para produtos fechados — Windsurf, Amp, Kiro, Cowork e Cursor, sempre pela superfície oficial. + +Cada rodada deve manter no máximo três agentes ativos. O agente principal revisa o resultado do trio antes de liberar o próximo. + +## Critério de encerramento por caso + +Um caso só pode ser marcado como finalizado quando possui: pesquisa, classificação, evidência de protocolo, baseline ou limitação reproduzível, receita/patch/bloqueio, validação proporcional, estado de publicação e próximo passo. Para produtos fechados, `blocked-closed` ou `MCP-only` é um resultado válido e preferível a uma PR não autorizada. + +## Estado de publicação atual + +Os únicos links de publicação comprovados devem continuar sendo os registrados no tracker. O fato de existir uma branch local de pesquisa não significa que exista PR upstream. A matriz de verdade é: + +- PR/issue preenchida: publicação real; +- campo `—`: nenhuma publicação externa comprovada; +- `not-applicable`: configuração ou bloqueio sem contribuição upstream; +- `awaiting-maintainer`: contato feito, aguardando decisão; +- `published-pr`/`published-issue`: URL real presente no tracker. + +## Próxima fase + +A pesquisa está encerrada. A próxima fase é execução controlada da Trilha A/B/C/D, começando pelos casos com maior retorno e menor risco, com revisão central antes de qualquer push, PR, issue ou contato externo. diff --git a/changelog.d/fixes/9332-port-2649-claude-server-tool-models.md b/changelog.d/fixes/9332-port-2649-claude-server-tool-models.md new file mode 100644 index 0000000000..a1d0d8bd59 --- /dev/null +++ b/changelog.d/fixes/9332-port-2649-claude-server-tool-models.md @@ -0,0 +1 @@ +- **fix(claude):** normalize nested Claude server tool model ids (`cc/` and `claude/` prefixes) on native passthrough, covering non-versioned server tools (Task/subagent). (thanks @AlanSyue) diff --git a/open-sse/executors/base.ts b/open-sse/executors/base.ts index d6883bc451..a4312778d9 100644 --- a/open-sse/executors/base.ts +++ b/open-sse/executors/base.ts @@ -301,22 +301,34 @@ function clampNestedThinkingBudget(body: unknown, max: number): boolean { } /** - * Strip the OmniRoute provider prefix from versioned built-in tool model - * fields (e.g. `cc/claude-opus-4-8` → `claude-opus-4-8`). Versioned built-in - * tool types carry an 8-digit date suffix (`advisor_20260301`, `bash_20250124`); - * the real Claude CLI sends a bare model id there, never a prefixed one, so a - * leaked OmniRoute prefix makes Anthropic reject the request. Mutates in place. + * Strip the OmniRoute provider prefix from tool model fields (e.g. + * `cc/claude-opus-4-8` → `claude-opus-4-8`). Versioned built-in tool types carry + * an 8-digit date suffix (`advisor_20260301`, `bash_20250124`); non-versioned + * server tools (Task/subagent, web_search) carry the same prefixed model. The + * real Claude CLI sends a bare model id there, never a prefixed one, so a leaked + * OmniRoute prefix makes Anthropic reject the request. + * + * Two mechanisms, applied to any tool with a string `model`: + * 1. Versioned built-in types (`type` matches `_\d{8}$`): strip the last path + * segment (`model.split("/").pop()`), matching legacy behavior for kiro/ etc. + * 2. Any tool whose model starts with a 9router Claude provider prefix + * (`cc/`, `claude/`): strip exactly that prefix (`slice`), preserving foreign + * providers such as `openrouter/anthropic/...` — mirrors upstream + * normalizeClaudeServerToolModels (9router#2649). + * Mutates in place. */ +const CLAUDE_TOOL_MODEL_PREFIXES = ["cc/", "claude/"] as const; + export function stripVersionedToolModelPrefix(tools: unknown): void { if (!Array.isArray(tools)) return; for (const t of tools as Array>) { - if ( - typeof t.type === "string" && - /^[a-z][a-z0-9_]*_\d{8}$/.test(t.type) && - typeof t.model === "string" && - t.model.includes("/") - ) { - t.model = t.model.split("/").pop(); + if (typeof t.model !== "string") continue; + const model = t.model; + if (typeof t.type === "string" && /^[a-z][a-z0-9_]*_\d{8}$/.test(t.type) && model.includes("/")) { + t.model = model.split("/").pop(); + } else { + const prefix = CLAUDE_TOOL_MODEL_PREFIXES.find((candidate) => model.startsWith(candidate)); + if (prefix) t.model = model.slice(prefix.length); } } } diff --git a/tests/unit/claude-oauth-tool-cloak.test.ts b/tests/unit/claude-oauth-tool-cloak.test.ts index 46bffc1d90..8841f77333 100644 --- a/tests/unit/claude-oauth-tool-cloak.test.ts +++ b/tests/unit/claude-oauth-tool-cloak.test.ts @@ -346,14 +346,56 @@ describe("native claude OAuth path — versioned built-in tool model prefix stri assert.equal(tools[0].model, "claude-opus-4-8"); }); - it("leaves non-versioned tool types untouched even with a prefixed model", () => { + it("normalizes a non-versioned tool carrying a cc/ or claude/ prefixed model (upstream #2649)", () => { + // Non-versioned server tools (Task/subagent, web_search) leak the same + // provider-prefixed model the versioned ones do; Anthropic rejects both. + // Foreign prefixes (openrouter/...) are preserved. const tools: AnyRecord[] = [ { type: "custom", name: "x", model: "cc/claude-opus-4-8" }, { type: "advisor_2026", name: "y", model: "cc/claude-opus-4-8" }, // not 8 digits + { type: "custom", name: "z", model: "claude/claude-sonnet-4-6" }, + { type: "custom", name: "w", model: "openrouter/anthropic/claude-opus-4.1" }, ]; stripVersionedToolModelPrefix(tools); - assert.equal(tools[0].model, "cc/claude-opus-4-8", "non-versioned type untouched"); - assert.equal(tools[1].model, "cc/claude-opus-4-8", "short date suffix untouched"); + assert.equal(tools[0].model, "claude-opus-4-8", "cc/ stripped from non-versioned type"); + assert.equal(tools[1].model, "claude-opus-4-8", "cc/ stripped from short date suffix"); + assert.equal(tools[2].model, "claude-sonnet-4-6", "claude/ stripped from non-versioned type"); + assert.equal(tools[3].model, "openrouter/anthropic/claude-opus-4.1", "foreign prefix preserved"); + }); + + it("strips cc/ prefix from a NON-versioned server tool (Task/subagent)", () => { + const tools: AnyRecord[] = [ + { name: "Task", description: "Launch a subagent", model: "cc/claude-opus-4-8", input_schema: { type: "object" } }, + ]; + stripVersionedToolModelPrefix(tools); + assert.equal(tools[0].model, "claude-opus-4-8", "cc/ stripped from non-versioned Task tool"); + }); + + it("strips claude/ prefix from a NON-versioned server tool", () => { + const tools: AnyRecord[] = [ + { name: "Task", description: "Launch a subagent", model: "claude/claude-sonnet-4-6", input_schema: { type: "object" } }, + ]; + stripVersionedToolModelPrefix(tools); + assert.equal(tools[0].model, "claude-sonnet-4-6", "claude/ stripped from non-versioned Task tool"); + }); + + it("preserves other-provider prefixes on a non-versioned tool (openrouter/...)", () => { + const tools: AnyRecord[] = [ + { name: "Task", model: "openrouter/anthropic/claude-opus-4.1", input_schema: { type: "object" } }, + ]; + stripVersionedToolModelPrefix(tools); + assert.equal(tools[0].model, "openrouter/anthropic/claude-opus-4.1", "foreign prefix preserved"); + }); + + it("is idempotent across repeated runs", () => { + const tools: AnyRecord[] = [ + { name: "Task", model: "claude/claude-sonnet-4-6", input_schema: { type: "object" } }, + { type: "advisor_20260301", name: "advisor", model: "cc/claude-opus-4-8" }, + ]; + stripVersionedToolModelPrefix(tools); + const first = JSON.stringify(tools); + stripVersionedToolModelPrefix(tools); + assert.equal(JSON.stringify(tools), first, "second run is a no-op"); }); it("is a no-op for non-array input", () => {