Commit Graph

3952 Commits

Author SHA1 Message Date
diegosouzapw
69a2b27a33 fix(cli): code-review — C1/C2/C3/I1/I3/I4/I5/m1/m2/m4
C1: sanitize opts.name and backupId against path traversal (replace /\\ with _)
C2: read backup files locally as base64 instead of sending local path to cloud API
C3: implement markOAuthDone/markOAuthFailed via module-level callbacks registered
    in useEffect — TUI now transitions to DONE/FAILED when polling signals completion
I1: fix matchesGlob — equality-only for non-glob patterns (removes false-positive
    startsWith), and support multi-wildcard patterns (e.g. **.json) by iterating parts
I3: replace two hardcoded English strings in tunnel.mjs with t() calls; add
    tunnel.notAvailable and tunnel.noTunnels to en.json and pt-BR.json
I4: log HTTP 4xx errors in runKeysAddCommand and return 1 instead of falling
    through silently to DB write on client errors
I5: truncate err.message to 100 chars in ProvidersTestAll.jsx and test-provider.mjs
m1: fix EvalWatch StatusBadge — completed state now uses status="ok" instead of "running"
m2: replace hardcoded ~/.omniroute/backup-schedule.json with resolveDataDir()-based path
m4: remove ...opts spread from all apiFetch calls in keys.mjs — pass only explicit options
    (method, body, retry, acceptNotOk) to avoid leaking apiKey/baseUrl/yes/etc.
2026-05-15 09:48:30 -03:00
diegosouzapw
09db1129a1 feat(cli): R7 — OAuthFlow/EvalWatch/ProvidersTestAll TUI + integração (spec 8.10)
Adiciona 3 componentes TUI Ink faltantes da spec 8.10:
- OAuthFlow.jsx: spinner + URL interativo para fluxo browser OAuth
- EvalWatch.jsx: monitor live de eval run com ProgressBar e DataTable
- ProvidersTestAll.jsx: teste paralelo com concorrência configurável

Integração nos comandos:
- oauth start browser flow → OAuthFlow quando TTY
- eval run --watch → EvalWatch quando TTY (fallback texto sem TTY)
- test --all-providers → ProvidersTestAll quando TTY (fallback tabela sem TTY)
2026-05-15 09:13:56 -03:00
Mourad Maatoug
e3e962dbda feat(cc-bridge): config-driven system block transforms (closes #2260)
Adds a config-driven DSL pipeline for normalizing the system blocks sent
to Anthropic via the Claude Code bridge. Removes third-party agent CLI
fingerprints (OpenCode, Cline, Cursor, Continue) and prepends the SDK
identity + signed billing header so the request looks classifier-correct
regardless of which client originally sent it.

Why a DSL: future fingerprint defenses ship as config rows, not new code.
Mode presets (basic/aggressive/custom), reorder, add, delete, reset — all
hot-reloaded through the existing runtimeSettings registry.

Files
- open-sse/services/ccBridgeTransforms.ts   (~440 LOC; 8 op-kinds, executor,
  buildBillingHeaderValue ported from ex-machina cch.ts, singleton config
  matching cliFingerprints pattern, T4-200 fixture-matching defaults)
- tests/unit/cc-bridge-transforms.test.ts    (30 tests; per-op, idempotency,
  ordering, verbatim-OpenCode regression)
- open-sse/services/claudeCodeCompatible.ts  (step 5b in buildAndSign
  pipeline + re-exports for downstream)
- open-sse/executors/base.ts                 (maintainer comment: native
  OAuth path is intentionally not routed through the DSL; it has its own
  billing prepend at lines 744-773)
- src/lib/config/runtimeSettings.ts          (RuntimeReloadSection +
  snapshot + default + normalize + apply + change-detection)
- src/shared/validation/settingsSchemas.ts   (zod discriminatedUnion over
  the 8 op-kinds, max 50 ops per pipeline)
- src/app/(dashboard)/dashboard/settings/components/RoutingTab.tsx
  (Settings UI Card: enabled toggle, ordered pipeline list with reorder
  buttons, add-op dropdown, reset-to-defaults)
- src/i18n/messages/en.json                  (10 new strings under
  settings.ccBridgeTransforms.*)

Defaults match the empirical T4=200 layout: [billing, identity, sanitized,
extras]. Verified against prod call logs (1c1946a2 = plugin-200,
de8ab5bd = raw-429) and four-variant live A/B test (T1=429 baseline,
T2=429 phrase-only, T3=429 sanitizer-only, T4=200 with billing+identity).

Test result: 30/30 ccBridgeTransforms + 6/6 baseline claude-code-compatible-helpers green.

Scope: CC bridge surface only (open-sse/services/claudeCodeCompatible.ts).
Native claude OAuth path is NOT routed through the DSL — it has its own
billing prepend mechanism that already works.

Refs: https://github.com/diegosouzapw/OmniRoute/issues/2260
2026-05-15 14:04:34 +02:00
diegosouzapw
2faf3608b2 fix(cli): R6 — i18n para strings literais em logs.mjs e tunnel.mjs
Substitui 13 strings hardcoded em logs.mjs e 2 em tunnel.mjs por chamadas
t() com chaves adicionadas nas locales en.json e pt-BR.json.
2026-05-15 09:01:48 -03:00
diegosouzapw
dcc21f1052 feat(cli): R5 — test --latency/--repeat/--compare/--save (spec 8.7 test-provider)
Adiciona medição de latência (avg/min/max), repetição de testes N vezes,
comparação de múltiplos modelos side-by-side e exportação de resultados
em JSON via --save. Inclui testes para todas as novas flags.
2026-05-15 08:45:11 -03:00
diegosouzapw
8a471e712c feat(cli): R4 — backup --cloud/--encrypt/--exclude/--retention/auto (spec 8.7)
Expande o comando backup com subcomandos create e auto enable/disable/status.
Adiciona suporte a criptografia AES-256-GCM, exclusão por glob, retenção e
upload cloud. Glob matcher usa apenas operações de string (sem RegExp dinâmico).
2026-05-15 08:40:50 -03:00
diegosouzapw
d8445caf90 feat(cli): R3 — tunnel status/logs/info/rotate (completa spec 8.7 tunnels)
- tunnel.mjs: adiciona runTunnelStatusCommand, runTunnelLogsCommand,
  runTunnelInfoCommand, runTunnelRotateCommand
- 4 novos subcomandos: status (uptime/requests/latency), logs (--tail),
  info (config completo JSON/table), rotate (novo URL com confirmação)
- locales: tunnel.statusDescription/logsDescription/infoDescription/
  rotateDescription/tailOpt/typeRequired/noLogs/infoTitle/rotated/confirmRotate
- testes: valida exports e registro dos 7 subcomandos (list/create/stop+novos)
2026-05-15 08:32:41 -03:00
diegosouzapw
d577759002 fix(cli): R1+R2 — keys.mjs HTTP-first + eliminar SQL cru + policy/expiration/rotate
- provider-store.mjs: adiciona removeProviderConnectionByProvider() para
  abstrair o DELETE que estava inline em keys.mjs (elimina SQL cru de bin/)
- keys.mjs: runKeysListCommand e runKeysRemoveCommand agora tentam HTTP
  primeiro; fallback DB usa funções do provider-store sem SQL inline
- keys.mjs: novos subcomandos keys policy show/set, keys expiration list,
  keys rotate (completa spec 8.7 para keys)
- locales: chaves i18n completas incluindo common.jsonOpt e common.yesOpt
- testes: cobre novos exports e comportamento offline de runKeysListCommand
2026-05-15 08:28:15 -03:00
diegosouzapw
956208c251 Merge PR #2276: feat(skills): add 3 operational SKILL.md manifests + AI Skills dashboard tab
- 3 new SKILL.md manifests: omniroute-routing, omniroute-compression, omniroute-monitoring
- agentSkills.ts: single source of truth for all 13 agent skills
- dashboard AI Skills tab with copy-button UX and GitHub links
- Review fixes: clipboard try/catch fallback, i18n key for tab label
2026-05-15 08:25:59 -03:00
diegosouzapw
1dd17260ac fix(skills): harden clipboard copy + add i18n key for AI Skills tab
- AgentSkillCopyButton: wrap navigator.clipboard.writeText in try/catch
  with textarea fallback for HTTP contexts and older browsers
- Replace hardcoded 'AI Skills' tab label with t('agentSkillsTab') i18n key
- Add 'agentSkillsTab' key to en.json skills namespace
2026-05-15 08:25:33 -03:00
diegosouzapw
b3e5ee3333 feat(cli): fase 9.4 — plugin system (omniroute-cmd-*)
Adds plugin discovery, loading, and management to the omniroute CLI.

- bin/cli/plugins.mjs: discoverPlugins / loadPlugins / buildPluginContext
- bin/cli/commands/plugin.mjs: list / install / remove / info / search / update / scaffold
- examples/omniroute-cmd-hello/: minimal working plugin example
- docs/dev/plugins.md: plugin API contract and authoring guide
- .env.example + ENVIRONMENT.md: document OMNIROUTE_PLUGIN_PATH
2026-05-15 05:11:18 -03:00
diegosouzapw
cd62899f31 feat(cli): fase 9.3 — codegen de comandos a partir do OpenAPI spec (omniroute api <tag> <op>)
Gera automaticamente 24 grupos de comandos (170+ operações) em bin/cli/api-commands/ a
partir de docs/reference/openapi.yaml via npm run build:cli-api. Integrado em registry.mjs;
prepublishOnly regenera antes de publicar.
2026-05-15 04:58:40 -03:00
diegosouzapw
d28d756e80 feat(cli): fase 8.11 — REPL interativo multi-turn com Ink (runRepl, session, slash commands)
Adiciona REPL Ink com painel lateral de tokens/custo, 16 slash commands (/model, /combo,
/system, /clear, /save, /load, /list, /export, /history, /tokens, /help, /exit etc.),
persistência de sessão em ~/.omniroute/repl-sessions/, autosave ao sair, e comando
`omniroute repl` com flags --model, --combo, --system, --resume.
2026-05-15 04:51:23 -03:00
diegosouzapw
79438ef391 feat(cli): 8.12/8.14 — testes server-side e doc CLI_TOKEN_AUTH
Adiciona testes de isLoopback (aceita loopback, rejeita IPs públicos), verificação
de hash por máquina e DISABLE flag; testes de detectRestrictedEnvironment para
Codespaces/WSL/CI/Gitpod; e docs/security/CLI_TOKEN_AUTH.md com threat model.
2026-05-15 04:44:07 -03:00
diegosouzapw
59128b6742 feat(cli): TUI dashboard interativo e menu de interface (Fases 8.10+8.9)
Adiciona dashboard TUI com 7 abas (Overview, Combos, Providers, Keys, Logs, Health, Cost)
via Ink, 13 componentes reutilizáveis em tui-components/, menu interativo ao iniciar sem
subcomando, e flag --tui no comando dashboard.
2026-05-15 04:36:21 -03:00
diegosouzapw
b3cfac3c14 feat(cli): fase 8.8 — system tray + autostart (omniroute serve --tray)
- bin/cli/tray/index.mjs: initTray/killTray/isTrayActive/isTraySupported
- bin/cli/tray/traySystray.mjs: systray2 para macOS/Linux (graceful fallback)
- bin/cli/tray/trayWindows.mjs: PowerShell NotifyIcon (sem binário extra)
- bin/cli/tray/autostart.mjs: launchd (macOS), reg (Windows), .desktop (Linux)
- bin/cli/commands/tray.mjs: subcomandos show/hide/quit
- bin/cli/commands/autostart.mjs: subcomandos enable/disable/status
- serve.mjs: flags --tray/--no-tray, integração após servidor iniciar
- i18n: chaves tray.*, autostart.*, serve.tray/no_tray em en.json e pt-BR.json
- check-env-doc-sync: DISPLAY e WAYLAND_DISPLAY adicionados ao allowlist (sinais do host OS)
- 8 testes unitários cobrindo autostart por plataforma e importação dos módulos
2026-05-15 04:07:20 -03:00
diegosouzapw
5072b82e93 feat(skills): add 3 operational SKILL.md manifests + AI Skills dashboard tab
- skills/omniroute-routing/SKILL.md: combos, 14 strategies, Auto-combo,
  simulate routing, MCP tools for routing
- skills/omniroute-compression/SKILL.md: RTK, Caveman, stacked mode,
  MCP accessibility filter, language packs
- skills/omniroute-monitoring/SKILL.md: health, circuit breakers,
  p50/p95/p99 metrics, quota, budget guard, MCP audit
- src/shared/constants/agentSkills.ts: single source of truth for all
  13 external agent skills (equivalent of 9route skills.js, adapted)
- dashboard/skills/page.tsx: new "AI Skills" tab with copy-button UX,
  GitHub link, NEW badge for 3 new skills
- skills/omniroute/SKILL.md + README.md: updated index with 13 skills
  (was 10); 5 skills exclusive to OmniRoute highlighted
2026-05-15 03:53:22 -03:00
diegosouzapw
27f7e5c4fe feat(cli): fase 8.3 — i18n completude e linter check-cli-i18n
- Adiciona health.description e health.noServer em en.json e pt-BR.json
- scripts/check/check-cli-i18n.mjs: valida que todas as 567 chaves t() dos
  comandos existem em en.json e que pt-BR.json tem as mesmas seções top-level
- Adiciona check-cli-i18n ao hook pre-commit
- 7 testes unitários: completude do catálogo, detecção de locale (OMNIROUTE_LANG),
  fallback en, interpolação {var}, t() pt-BR
2026-05-15 03:52:13 -03:00
diegosouzapw
b329cfc84a feat(cli): fase 8.13 — self-heal native deps (omniroute runtime check/repair/clean)
- bin/cli/runtime/nativeDeps.mjs: ensureRuntimeDir, hasModule, isBetterSqliteBinaryValid
  (ELF/Mach-O/PE magic bytes), npmInstallRuntime (shell:false, cmd.exe /c no Windows),
  ensureBetterSqliteRuntime, buildEnvWithRuntime com NODE_PATH extendido
- bin/cli/commands/runtime.mjs: subcomandos check/repair --force/clean --yes
- Registrado em commands/registry.mjs
- Chaves i18n runtime.* em en.json e pt-BR.json
- 9 testes unitários cobrindo todas as funções exportadas
2026-05-15 03:46:26 -03:00
diegosouzapw
151528735b Merge remote-tracking branch 'origin/feat/v3.8.0-features' into release/v3.8.0
# Conflicts:
#	CHANGELOG.md
#	bin/omniroute.mjs
#	docs/reference/ENVIRONMENT.md
#	src/server/authz/policies/management.ts
2026-05-15 03:44:51 -03:00
diegosouzapw
ed19c824c0 feat(cli): fase 8.4 — profiles/contexts (omniroute config contexts)
- contexts.mjs: loadContexts/saveContexts/resolveActiveContext (~/.omniroute/config.json)
- commands/contexts.mjs: CRUD completo (add/use/list/show/remove/rename/export/import)
- config.mjs: subgroup contexts registrado sob config contexts
- program.mjs: flag global --context <name> com env OMNIROUTE_CONTEXT
- en.json/pt-BR.json: chaves program.context e config.contexts adicionadas
- import usa validação explícita de campos (sem Object.assign cru)
2026-05-15 03:36:51 -03:00
diegosouzapw
47de3bf60f docs(changelog): add entries for PRs #2269, #2271, #2273
- #2269: ignore .playwright-mcp/ artifacts (@backryun)
- #2271: Command Code stream payload fix (@ddarkr)
- #2273: Android/Termux headless support (@t-way666)
2026-05-15 03:30:56 -03:00
t-way666
4a84ab9c1b feat(termux): Android/Termux headless support (#2273)
- Move wreq-js and tls-client-node to optionalDependencies
- Lazy-load wreq-js WS proxy with graceful 503 when unavailable
- Auto-detect Android platform for headless mode (no browser open)
- Set GYP_DEFINES for better-sqlite3 build on Android/ARM
- Extended build timeout to 600s for ARM compilation
- Skip wreq-js binary fix on Android (unsupported platform)
- Platform warnings for unsupported features (WS proxy, TLS, Electron, MITM)

Co-authored-by: t-way666 <t-way666@users.noreply.github.com>
2026-05-15 03:29:18 -03:00
diegosouzapw
133dd0026d docs: fill documentation gaps for v3.8.0 features
- COMPRESSION_ENGINES.md: add MCP accessibility-tree filter section
  with config reference, algorithm description, and comparison table
- COMPRESSION_LANGUAGE_PACKS.md: document SHARED_BOUNDARIES clause
  (6 patterns × 6 languages × 3 intensities, preservePatterns defaults)
- MCP-SERVER.md: add accessibility-tree filter note in Compression Tools
- CONTRIBUTING.md: fix coverage gate (60%→75/70), add Hard Rules #15/#16
  to PR checklist, add links to new security/ops docs
2026-05-15 03:26:55 -03:00
ddarkr
4f80be1f2f fix(providers/command-code): send required stream payload (#2271)
- Force skills: "" and params.stream: true in Command Code wrapper
- Align validation probe payload with upstream-required shape
- Default validation model to deepseek/deepseek-v4-flash

Co-authored-by: ddarkr <ddarkr@users.noreply.github.com>
2026-05-15 03:25:22 -03:00
diegosouzapw
fe6cffb54b feat(cli): fase 8.5/8.7 — completion dinâmico e expansão de comandos
- 8.5: completion reescrito com subcomandos install/refresh e scripts zsh/bash/fish dinâmicos
       com cache TTL 1h em ~/.omniroute/completion-cache.json
- 8.7: logs novas flags (--request-id --api-key --combo --status --duration-min/max --export)
- 8.7: health.watch (live dashboard) + health.components + --alerts-only
- 8.7: update --apply (npm install -g) + --check (exit 1 se outdated) + --changelog
- 8.7: keys regenerate/revoke/reveal/usage (gestão de management keys)
- en.json/pt-BR.json: chaves completion e logs adicionadas
2026-05-15 03:24:50 -03:00
backryun
76c20240f1 chore: ignore Playwright MCP artifacts (#2269)
Remove tracked .playwright-mcp/ generated artifacts (CSP error logs,
accessibility tree snapshots) and add the directory to .gitignore.

Co-authored-by: backryun <backryun@users.noreply.github.com>
2026-05-15 03:23:45 -03:00
diegosouzapw
96e528e3e2 feat(cli): fase 8.2/8.12 — update-notifier e CLI machine-id token
- 8.2: update-notifier em omniroute.mjs (cache 24h, stderr-only, respeita CI/quiet/json/opt-out)
- 8.12: cliToken.mjs (sha256 de machineId + salt) injetado automaticamente em apiFetch
- 8.12: middleware cliTokenAuth.ts valida token apenas em loopback, timing-safe compare
- 8.12: requireManagementAuth aceita CLI token como bypass local
- env-doc-sync: OMNIROUTE_DISABLE_CLI_TOKEN e OMNIROUTE_NO_UPDATE_NOTIFIER no allowlist
2026-05-15 03:13:06 -03:00
diegosouzapw
853c9574e1 fix(docs): correct repo URLs in i18n FLY_IO deployment guides to diegosouzapw/OmniRoute 2026-05-15 03:03:18 -03:00
diegosouzapw
7a2682efb5 feat(cli): fase 8.1/8.6/8.14 — spinner, open, clipboard e environment helpers
- spinner.mjs: withSpinner/shouldUseSpinner com suporte a quiet/output/CI/NO_COLOR
- open.mjs: comando `open` com 16 recursos, respeita ambientes restritos
- environment.mjs: detectRestrictedEnvironment/getEnvBanner (codespaces/wsl/gitpod/replit/ci)
- clipboard.mjs: copyToClipboard/isClipboardSupported (pbcopy/clip/xclip/xsel/wl-copy)
- check-env-doc-sync: vars de plataforma/OS adicionadas ao IGNORE_FROM_CODE
2026-05-15 03:00:52 -03:00
diegosouzapw
23c10916e0 fix(skills): update SKILL.md URLs to diegosouzapw/OmniRoute 2026-05-15 02:59:13 -03:00
diegosouzapw
7648e4b16e chore(claude): add Hard Rule #16 — no Co-Authored-By in commits 2026-05-15 02:55:44 -03:00
diegosouzapw
2f2583a02f feat(cli): fase 7 — context-eng/sessions/tags/openapi/combo-suggest/oneproxy/telemetry
- 7.1: context-eng (alias ctx) — caveman/rtk config/filters/test, analytics, combos
- 7.2: sessions list/show/expire/expire-all/current
- 7.3: tags list/add/remove/assign/unassign/resources
- 7.4: openapi dump/validate/try/endpoints/paths (YAML sem js-yaml via toYaml inline)
- 7.5: combo suggest via MCP omniroute_best_combo_for_task (extendComboSuggest)
- 7.6: oneproxy status/stats/fetch/rotate/config/pool via MCP + REST
- 7.7: telemetry summary/export com fmtMetric/fmtDelta
45 novos testes passando
2026-05-15 02:47:49 -03:00
diegosouzapw
fc45ff1bdd feat(cli): fase 6.7 — sync push/pull/diff/bundle/import/tokens/initialize/resolve 2026-05-15 02:27:56 -03:00
diegosouzapw
145fcae0e9 feat(cli): fase 6.6 — nodes CRUD/validate/test/metrics 2026-05-15 02:27:20 -03:00
diegosouzapw
f4370ca15f feat(cli): fase 6.5 — resilience status/breakers/cooldowns/lockouts/reset/profile/config 2026-05-15 02:26:41 -03:00
diegosouzapw
92b2f20d32 feat(cli): fase 6.4 — pricing sync/list/get/defaults/diff 2026-05-15 02:25:58 -03:00
diegosouzapw
931024eb5a feat(cli): fase 6.3 — translator detect/translate/send/stream/history 2026-05-15 02:25:24 -03:00
diegosouzapw
761ff3e781 feat(cli): fase 6.1+6.2 — batches e files API (upload/CRUD/output/errors) 2026-05-15 02:24:45 -03:00
diegosouzapw
54be51a664 chore(docs): remove all competitor references from branch
Remove every reference to the competing open-source project from docs,
comparisons, i18n mirrors, comments, and source files so the branch
history does not expose competitive intelligence.
2026-05-15 02:14:58 -03:00
diegosouzapw
379e0bbd3a feat(cli): fase 5.6 — comando compression com engine/configure/rules/preview 2026-05-15 02:09:36 -03:00
diegosouzapw
582e89840d feat(cli): fase 5.5 — comando policy com CRUD e evaluate (exit 0/4) 2026-05-15 02:08:55 -03:00
diegosouzapw
d1880f1d4a feat(cli): fase 5.3+5.4 — a2a invoke JSON-RPC e tasks list/get/cancel/watch/stream/logs 2026-05-15 02:08:12 -03:00
diegosouzapw
3cfba85461 feat(cli): fase 5.1 — mcp call com stream e mcp scopes 2026-05-15 02:05:06 -03:00
diegosouzapw
f79ab2c3d1 fix(settings): default debugMode to true on fresh installations
The Debug sidebar section (Translator, Playground, Search Tools) was
hidden on new installs because debugMode was not in the settings
defaults object. This made data?.debugMode === true evaluate to false,
while the toggle in System & Storage appeared active — an inconsistency.

Changes:
- Add debugMode: true to getSettings() defaults in settings.ts
- Align SystemStorageTab useState initial value to true
- Update CHANGELOG with fix entry
2026-05-15 01:57:17 -03:00
diegosouzapw
55659d92be fix(security): address code-review findings — timing-safe token, OMNIROUTE_CLI_SALT, tray PNG, preservePatterns defaults, missing docs
- management.ts: replace === with timingSafeEqual for CLI token comparison
- machineToken.ts: salt upgraded to omniroute-cli-auth-v1; OMNIROUTE_CLI_SALT env
  var honoured for rotation; full 64-char SHA-256 hex token
- tray.ps1: accept .png via GDI+ Bitmap->Icon handle; Windows tray works without .ico
- tray.ts: getIconPath() tries icon.ico then icon.png on Windows
- compression/types.ts: DEFAULT_CAVEMAN_CONFIG.preservePatterns filled with
  six defaults (fenced code, inline code, URLs, paths, error lines, stack traces)
- CLAUDE.md: Hard Rule #15 — spawn-capable routes must use isLocalOnlyPath()
- .env.example + docs/reference/ENVIRONMENT.md: document OMNIROUTE_CLI_SALT
- docs/security/CLI_TOKEN.md: new (was referenced in changelog but missing)
- docs/security/ROUTE_GUARD_TIERS.md: new (was referenced in changelog but missing)
- tests/unit/lib/machineToken.test.ts: updated for 64-char token; added
  OMNIROUTE_CLI_SALT env-var rotation test
2026-05-15 01:54:09 -03:00
diegosouzapw
23b1bd1ffe feat(cli): fase 4.4 — comando webhooks com CRUD, eventos e dispatch de teste 2026-05-15 01:53:09 -03:00
diegosouzapw
b8707dbbb4 feat(cli): fase 4.3 — comando eval com suites, runs e scorecard ASCII 2026-05-15 01:52:34 -03:00
diegosouzapw
76362c4efe feat(cli): fase 4.2 — comando cloud para agentes codex/devin/jules 2026-05-15 01:51:55 -03:00
diegosouzapw
8c48abc40c feat(cli): fase 4.1 — comando oauth com fluxos browser/import/social/device 2026-05-15 01:51:07 -03:00