From bb90dda1ca24e8ed40bb97077b979183aaae4689 Mon Sep 17 00:00:00 2001 From: diegosouzapw Date: Thu, 28 May 2026 08:19:26 -0300 Subject: [PATCH] chore(plan-14): audit report + docs + plan11 MITM backlog cross-ref (plan 14 F10) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - docs/reference/CLI-TOOLS.md: update to v3.8.6 (3 pages, unified catalog, MITM backlog, batch API) - src/shared/components/cli/CliToolCard.tsx: fix stale import path cli-tools → cli-code (audit micro-fix) - tests/unit/ui/CliToolCard.test.tsx: align mock path to match production import (audit micro-fix) - src/app/(dashboard)/dashboard/providers/[id]/page.tsx: update stale link /dashboard/cli-tools → /cli-code - .source/browser.ts + .source/server.ts: auto-regenerated fumadocs MDX index (CLI-TOOLS.md update) - _tasks/features-v3.8.6/refactorpages/_orchestration/audit-report-14.md: comprehensive audit (gitignored) - _tasks/features-v3.8.6/refactorpages/_orchestration/_plan11-mitm-backlog.md: updated date/format (gitignored) Audit conclusion: GREEN — 0 Hard Rule violations, 217+98 tests passing, coverage 56.7/66.2/50.6/56.7 (gate 40/40/40/40). --- .source/browser.ts | 2 +- .source/server.ts | 46 +- docs/reference/CLI-TOOLS.md | 829 +++++------------- .../dashboard/providers/[id]/page.tsx | 2 +- src/shared/components/cli/CliToolCard.tsx | 2 +- tests/unit/ui/CliToolCard.test.tsx | 2 +- 6 files changed, 264 insertions(+), 619 deletions(-) diff --git a/.source/browser.ts b/.source/browser.ts index 11f0eef61a..c3bc050c5b 100644 --- a/.source/browser.ts +++ b/.source/browser.ts @@ -7,6 +7,6 @@ const create = browser(); const browserCollections = { - docs: create.doc("docs", {"architecture/ARCHITECTURE.md": () => import("../docs/architecture/ARCHITECTURE.md?collection=docs"), "architecture/AUTHZ_GUIDE.md": () => import("../docs/architecture/AUTHZ_GUIDE.md?collection=docs"), "architecture/CODEBASE_DOCUMENTATION.md": () => import("../docs/architecture/CODEBASE_DOCUMENTATION.md?collection=docs"), "architecture/REPOSITORY_MAP.md": () => import("../docs/architecture/REPOSITORY_MAP.md?collection=docs"), "architecture/RESILIENCE_GUIDE.md": () => import("../docs/architecture/RESILIENCE_GUIDE.md?collection=docs"), "compression/COMPRESSION_ENGINES.md": () => import("../docs/compression/COMPRESSION_ENGINES.md?collection=docs"), "compression/COMPRESSION_GUIDE.md": () => import("../docs/compression/COMPRESSION_GUIDE.md?collection=docs"), "compression/COMPRESSION_LANGUAGE_PACKS.md": () => import("../docs/compression/COMPRESSION_LANGUAGE_PACKS.md?collection=docs"), "compression/COMPRESSION_RULES_FORMAT.md": () => import("../docs/compression/COMPRESSION_RULES_FORMAT.md?collection=docs"), "compression/RTK_COMPRESSION.md": () => import("../docs/compression/RTK_COMPRESSION.md?collection=docs"), "guides/DOCKER_GUIDE.md": () => import("../docs/guides/DOCKER_GUIDE.md?collection=docs"), "guides/ELECTRON_GUIDE.md": () => import("../docs/guides/ELECTRON_GUIDE.md?collection=docs"), "guides/FEATURES.md": () => import("../docs/guides/FEATURES.md?collection=docs"), "guides/I18N.md": () => import("../docs/guides/I18N.md?collection=docs"), "guides/KIRO_SETUP.md": () => import("../docs/guides/KIRO_SETUP.md?collection=docs"), "guides/PWA_GUIDE.md": () => import("../docs/guides/PWA_GUIDE.md?collection=docs"), "guides/SETUP_GUIDE.md": () => import("../docs/guides/SETUP_GUIDE.md?collection=docs"), "guides/TERMUX_GUIDE.md": () => import("../docs/guides/TERMUX_GUIDE.md?collection=docs"), "guides/TROUBLESHOOTING.md": () => import("../docs/guides/TROUBLESHOOTING.md?collection=docs"), "guides/UNINSTALL.md": () => import("../docs/guides/UNINSTALL.md?collection=docs"), "guides/USER_GUIDE.md": () => import("../docs/guides/USER_GUIDE.md?collection=docs"), "frameworks/A2A-SERVER.md": () => import("../docs/frameworks/A2A-SERVER.md?collection=docs"), "frameworks/AGENT_PROTOCOLS_GUIDE.md": () => import("../docs/frameworks/AGENT_PROTOCOLS_GUIDE.md?collection=docs"), "frameworks/CLOUD_AGENT.md": () => import("../docs/frameworks/CLOUD_AGENT.md?collection=docs"), "frameworks/EMBEDDED-SERVICES.md": () => import("../docs/frameworks/EMBEDDED-SERVICES.md?collection=docs"), "frameworks/EVALS.md": () => import("../docs/frameworks/EVALS.md?collection=docs"), "frameworks/GAMIFICATION.md": () => import("../docs/frameworks/GAMIFICATION.md?collection=docs"), "frameworks/MCP-SERVER.md": () => import("../docs/frameworks/MCP-SERVER.md?collection=docs"), "frameworks/MEMORY.md": () => import("../docs/frameworks/MEMORY.md?collection=docs"), "frameworks/OPENCODE.md": () => import("../docs/frameworks/OPENCODE.md?collection=docs"), "frameworks/SKILLS.md": () => import("../docs/frameworks/SKILLS.md?collection=docs"), "frameworks/WEBHOOKS.md": () => import("../docs/frameworks/WEBHOOKS.md?collection=docs"), "ops/COVERAGE_PLAN.md": () => import("../docs/ops/COVERAGE_PLAN.md?collection=docs"), "ops/E2E_DASHBOARD_SHAKEDOWN_v3.8.0.md": () => import("../docs/ops/E2E_DASHBOARD_SHAKEDOWN_v3.8.0.md?collection=docs"), "ops/FLY_IO_DEPLOYMENT_GUIDE.md": () => import("../docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md?collection=docs"), "ops/PROXY_GUIDE.md": () => import("../docs/ops/PROXY_GUIDE.md?collection=docs"), "ops/RELEASE_CHECKLIST.md": () => import("../docs/ops/RELEASE_CHECKLIST.md?collection=docs"), "ops/SQLITE_RUNTIME.md": () => import("../docs/ops/SQLITE_RUNTIME.md?collection=docs"), "ops/TUNNELS_GUIDE.md": () => import("../docs/ops/TUNNELS_GUIDE.md?collection=docs"), "ops/VM_DEPLOYMENT_GUIDE.md": () => import("../docs/ops/VM_DEPLOYMENT_GUIDE.md?collection=docs"), "reference/API_REFERENCE.md": () => import("../docs/reference/API_REFERENCE.md?collection=docs"), "reference/CLI-TOOLS.md": () => import("../docs/reference/CLI-TOOLS.md?collection=docs"), "reference/ENVIRONMENT.md": () => import("../docs/reference/ENVIRONMENT.md?collection=docs"), "reference/FREE_TIERS.md": () => import("../docs/reference/FREE_TIERS.md?collection=docs"), "reference/PROVIDER_REFERENCE.md": () => import("../docs/reference/PROVIDER_REFERENCE.md?collection=docs"), "routing/AUTO-COMBO.md": () => import("../docs/routing/AUTO-COMBO.md?collection=docs"), "routing/REASONING_REPLAY.md": () => import("../docs/routing/REASONING_REPLAY.md?collection=docs"), "security/CLI_TOKEN.md": () => import("../docs/security/CLI_TOKEN.md?collection=docs"), "security/CLI_TOKEN_AUTH.md": () => import("../docs/security/CLI_TOKEN_AUTH.md?collection=docs"), "security/COMPLIANCE.md": () => import("../docs/security/COMPLIANCE.md?collection=docs"), "security/ERROR_SANITIZATION.md": () => import("../docs/security/ERROR_SANITIZATION.md?collection=docs"), "security/GUARDRAILS.md": () => import("../docs/security/GUARDRAILS.md?collection=docs"), "security/PUBLIC_CREDS.md": () => import("../docs/security/PUBLIC_CREDS.md?collection=docs"), "security/ROUTE_GUARD_TIERS.md": () => import("../docs/security/ROUTE_GUARD_TIERS.md?collection=docs"), "security/STEALTH_GUIDE.md": () => import("../docs/security/STEALTH_GUIDE.md?collection=docs"), }), + docs: create.doc("docs", {"architecture/ARCHITECTURE.md": () => import("../docs/architecture/ARCHITECTURE.md?collection=docs"), "architecture/AUTHZ_GUIDE.md": () => import("../docs/architecture/AUTHZ_GUIDE.md?collection=docs"), "architecture/CODEBASE_DOCUMENTATION.md": () => import("../docs/architecture/CODEBASE_DOCUMENTATION.md?collection=docs"), "architecture/REPOSITORY_MAP.md": () => import("../docs/architecture/REPOSITORY_MAP.md?collection=docs"), "architecture/RESILIENCE_GUIDE.md": () => import("../docs/architecture/RESILIENCE_GUIDE.md?collection=docs"), "compression/COMPRESSION_ENGINES.md": () => import("../docs/compression/COMPRESSION_ENGINES.md?collection=docs"), "compression/COMPRESSION_GUIDE.md": () => import("../docs/compression/COMPRESSION_GUIDE.md?collection=docs"), "compression/COMPRESSION_LANGUAGE_PACKS.md": () => import("../docs/compression/COMPRESSION_LANGUAGE_PACKS.md?collection=docs"), "compression/COMPRESSION_RULES_FORMAT.md": () => import("../docs/compression/COMPRESSION_RULES_FORMAT.md?collection=docs"), "compression/RTK_COMPRESSION.md": () => import("../docs/compression/RTK_COMPRESSION.md?collection=docs"), "frameworks/A2A-SERVER.md": () => import("../docs/frameworks/A2A-SERVER.md?collection=docs"), "frameworks/AGENT_PROTOCOLS_GUIDE.md": () => import("../docs/frameworks/AGENT_PROTOCOLS_GUIDE.md?collection=docs"), "frameworks/CLOUD_AGENT.md": () => import("../docs/frameworks/CLOUD_AGENT.md?collection=docs"), "frameworks/EMBEDDED-SERVICES.md": () => import("../docs/frameworks/EMBEDDED-SERVICES.md?collection=docs"), "frameworks/EVALS.md": () => import("../docs/frameworks/EVALS.md?collection=docs"), "frameworks/GAMIFICATION.md": () => import("../docs/frameworks/GAMIFICATION.md?collection=docs"), "frameworks/MCP-SERVER.md": () => import("../docs/frameworks/MCP-SERVER.md?collection=docs"), "frameworks/MEMORY.md": () => import("../docs/frameworks/MEMORY.md?collection=docs"), "frameworks/OPENCODE.md": () => import("../docs/frameworks/OPENCODE.md?collection=docs"), "frameworks/SKILLS.md": () => import("../docs/frameworks/SKILLS.md?collection=docs"), "frameworks/WEBHOOKS.md": () => import("../docs/frameworks/WEBHOOKS.md?collection=docs"), "guides/DOCKER_GUIDE.md": () => import("../docs/guides/DOCKER_GUIDE.md?collection=docs"), "guides/ELECTRON_GUIDE.md": () => import("../docs/guides/ELECTRON_GUIDE.md?collection=docs"), "guides/FEATURES.md": () => import("../docs/guides/FEATURES.md?collection=docs"), "guides/I18N.md": () => import("../docs/guides/I18N.md?collection=docs"), "guides/KIRO_SETUP.md": () => import("../docs/guides/KIRO_SETUP.md?collection=docs"), "guides/PWA_GUIDE.md": () => import("../docs/guides/PWA_GUIDE.md?collection=docs"), "guides/SETUP_GUIDE.md": () => import("../docs/guides/SETUP_GUIDE.md?collection=docs"), "guides/TERMUX_GUIDE.md": () => import("../docs/guides/TERMUX_GUIDE.md?collection=docs"), "guides/TROUBLESHOOTING.md": () => import("../docs/guides/TROUBLESHOOTING.md?collection=docs"), "guides/UNINSTALL.md": () => import("../docs/guides/UNINSTALL.md?collection=docs"), "guides/USER_GUIDE.md": () => import("../docs/guides/USER_GUIDE.md?collection=docs"), "ops/COVERAGE_PLAN.md": () => import("../docs/ops/COVERAGE_PLAN.md?collection=docs"), "ops/E2E_DASHBOARD_SHAKEDOWN_v3.8.0.md": () => import("../docs/ops/E2E_DASHBOARD_SHAKEDOWN_v3.8.0.md?collection=docs"), "ops/FLY_IO_DEPLOYMENT_GUIDE.md": () => import("../docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md?collection=docs"), "ops/PROXY_GUIDE.md": () => import("../docs/ops/PROXY_GUIDE.md?collection=docs"), "ops/RELEASE_CHECKLIST.md": () => import("../docs/ops/RELEASE_CHECKLIST.md?collection=docs"), "ops/SQLITE_RUNTIME.md": () => import("../docs/ops/SQLITE_RUNTIME.md?collection=docs"), "ops/TUNNELS_GUIDE.md": () => import("../docs/ops/TUNNELS_GUIDE.md?collection=docs"), "ops/VM_DEPLOYMENT_GUIDE.md": () => import("../docs/ops/VM_DEPLOYMENT_GUIDE.md?collection=docs"), "reference/API_REFERENCE.md": () => import("../docs/reference/API_REFERENCE.md?collection=docs"), "reference/CLI-TOOLS.md": () => import("../docs/reference/CLI-TOOLS.md?collection=docs"), "reference/ENVIRONMENT.md": () => import("../docs/reference/ENVIRONMENT.md?collection=docs"), "reference/FREE_TIERS.md": () => import("../docs/reference/FREE_TIERS.md?collection=docs"), "reference/PROVIDER_REFERENCE.md": () => import("../docs/reference/PROVIDER_REFERENCE.md?collection=docs"), "routing/AUTO-COMBO.md": () => import("../docs/routing/AUTO-COMBO.md?collection=docs"), "routing/REASONING_REPLAY.md": () => import("../docs/routing/REASONING_REPLAY.md?collection=docs"), "security/CLI_TOKEN.md": () => import("../docs/security/CLI_TOKEN.md?collection=docs"), "security/CLI_TOKEN_AUTH.md": () => import("../docs/security/CLI_TOKEN_AUTH.md?collection=docs"), "security/COMPLIANCE.md": () => import("../docs/security/COMPLIANCE.md?collection=docs"), "security/ERROR_SANITIZATION.md": () => import("../docs/security/ERROR_SANITIZATION.md?collection=docs"), "security/GUARDRAILS.md": () => import("../docs/security/GUARDRAILS.md?collection=docs"), "security/PUBLIC_CREDS.md": () => import("../docs/security/PUBLIC_CREDS.md?collection=docs"), "security/ROUTE_GUARD_TIERS.md": () => import("../docs/security/ROUTE_GUARD_TIERS.md?collection=docs"), "security/STEALTH_GUIDE.md": () => import("../docs/security/STEALTH_GUIDE.md?collection=docs"), }), }; export default browserCollections; \ No newline at end of file diff --git a/.source/server.ts b/.source/server.ts index 923e119f5a..ea427fcb51 100644 --- a/.source/server.ts +++ b/.source/server.ts @@ -32,28 +32,28 @@ import * as __fd_glob_35 from "../docs/ops/PROXY_GUIDE.md?collection=docs" import * as __fd_glob_34 from "../docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md?collection=docs" import * as __fd_glob_33 from "../docs/ops/E2E_DASHBOARD_SHAKEDOWN_v3.8.0.md?collection=docs" import * as __fd_glob_32 from "../docs/ops/COVERAGE_PLAN.md?collection=docs" -import * as __fd_glob_31 from "../docs/frameworks/WEBHOOKS.md?collection=docs" -import * as __fd_glob_30 from "../docs/frameworks/SKILLS.md?collection=docs" -import * as __fd_glob_29 from "../docs/frameworks/OPENCODE.md?collection=docs" -import * as __fd_glob_28 from "../docs/frameworks/MEMORY.md?collection=docs" -import * as __fd_glob_27 from "../docs/frameworks/MCP-SERVER.md?collection=docs" -import * as __fd_glob_26 from "../docs/frameworks/GAMIFICATION.md?collection=docs" -import * as __fd_glob_25 from "../docs/frameworks/EVALS.md?collection=docs" -import * as __fd_glob_24 from "../docs/frameworks/EMBEDDED-SERVICES.md?collection=docs" -import * as __fd_glob_23 from "../docs/frameworks/CLOUD_AGENT.md?collection=docs" -import * as __fd_glob_22 from "../docs/frameworks/AGENT_PROTOCOLS_GUIDE.md?collection=docs" -import * as __fd_glob_21 from "../docs/frameworks/A2A-SERVER.md?collection=docs" -import * as __fd_glob_20 from "../docs/guides/USER_GUIDE.md?collection=docs" -import * as __fd_glob_19 from "../docs/guides/UNINSTALL.md?collection=docs" -import * as __fd_glob_18 from "../docs/guides/TROUBLESHOOTING.md?collection=docs" -import * as __fd_glob_17 from "../docs/guides/TERMUX_GUIDE.md?collection=docs" -import * as __fd_glob_16 from "../docs/guides/SETUP_GUIDE.md?collection=docs" -import * as __fd_glob_15 from "../docs/guides/PWA_GUIDE.md?collection=docs" -import * as __fd_glob_14 from "../docs/guides/KIRO_SETUP.md?collection=docs" -import * as __fd_glob_13 from "../docs/guides/I18N.md?collection=docs" -import * as __fd_glob_12 from "../docs/guides/FEATURES.md?collection=docs" -import * as __fd_glob_11 from "../docs/guides/ELECTRON_GUIDE.md?collection=docs" -import * as __fd_glob_10 from "../docs/guides/DOCKER_GUIDE.md?collection=docs" +import * as __fd_glob_31 from "../docs/guides/USER_GUIDE.md?collection=docs" +import * as __fd_glob_30 from "../docs/guides/UNINSTALL.md?collection=docs" +import * as __fd_glob_29 from "../docs/guides/TROUBLESHOOTING.md?collection=docs" +import * as __fd_glob_28 from "../docs/guides/TERMUX_GUIDE.md?collection=docs" +import * as __fd_glob_27 from "../docs/guides/SETUP_GUIDE.md?collection=docs" +import * as __fd_glob_26 from "../docs/guides/PWA_GUIDE.md?collection=docs" +import * as __fd_glob_25 from "../docs/guides/KIRO_SETUP.md?collection=docs" +import * as __fd_glob_24 from "../docs/guides/I18N.md?collection=docs" +import * as __fd_glob_23 from "../docs/guides/FEATURES.md?collection=docs" +import * as __fd_glob_22 from "../docs/guides/ELECTRON_GUIDE.md?collection=docs" +import * as __fd_glob_21 from "../docs/guides/DOCKER_GUIDE.md?collection=docs" +import * as __fd_glob_20 from "../docs/frameworks/WEBHOOKS.md?collection=docs" +import * as __fd_glob_19 from "../docs/frameworks/SKILLS.md?collection=docs" +import * as __fd_glob_18 from "../docs/frameworks/OPENCODE.md?collection=docs" +import * as __fd_glob_17 from "../docs/frameworks/MEMORY.md?collection=docs" +import * as __fd_glob_16 from "../docs/frameworks/MCP-SERVER.md?collection=docs" +import * as __fd_glob_15 from "../docs/frameworks/GAMIFICATION.md?collection=docs" +import * as __fd_glob_14 from "../docs/frameworks/EVALS.md?collection=docs" +import * as __fd_glob_13 from "../docs/frameworks/EMBEDDED-SERVICES.md?collection=docs" +import * as __fd_glob_12 from "../docs/frameworks/CLOUD_AGENT.md?collection=docs" +import * as __fd_glob_11 from "../docs/frameworks/AGENT_PROTOCOLS_GUIDE.md?collection=docs" +import * as __fd_glob_10 from "../docs/frameworks/A2A-SERVER.md?collection=docs" import * as __fd_glob_9 from "../docs/compression/RTK_COMPRESSION.md?collection=docs" import * as __fd_glob_8 from "../docs/compression/COMPRESSION_RULES_FORMAT.md?collection=docs" import * as __fd_glob_7 from "../docs/compression/COMPRESSION_LANGUAGE_PACKS.md?collection=docs" @@ -72,4 +72,4 @@ const create = server({"doc":{"passthroughs":["extractedReferences"]}}); -export const docs = await create.docs("docs", "docs", {"meta.json": __fd_glob_55, "architecture/meta.json": __fd_glob_56, "compression/meta.json": __fd_glob_57, "frameworks/meta.json": __fd_glob_58, "guides/meta.json": __fd_glob_59, "ops/meta.json": __fd_glob_60, "reference/meta.json": __fd_glob_61, "reference/openapi.yaml": __fd_glob_62, "routing/meta.json": __fd_glob_63, "security/meta.json": __fd_glob_64, }, {"architecture/ARCHITECTURE.md": __fd_glob_0, "architecture/AUTHZ_GUIDE.md": __fd_glob_1, "architecture/CODEBASE_DOCUMENTATION.md": __fd_glob_2, "architecture/REPOSITORY_MAP.md": __fd_glob_3, "architecture/RESILIENCE_GUIDE.md": __fd_glob_4, "compression/COMPRESSION_ENGINES.md": __fd_glob_5, "compression/COMPRESSION_GUIDE.md": __fd_glob_6, "compression/COMPRESSION_LANGUAGE_PACKS.md": __fd_glob_7, "compression/COMPRESSION_RULES_FORMAT.md": __fd_glob_8, "compression/RTK_COMPRESSION.md": __fd_glob_9, "guides/DOCKER_GUIDE.md": __fd_glob_10, "guides/ELECTRON_GUIDE.md": __fd_glob_11, "guides/FEATURES.md": __fd_glob_12, "guides/I18N.md": __fd_glob_13, "guides/KIRO_SETUP.md": __fd_glob_14, "guides/PWA_GUIDE.md": __fd_glob_15, "guides/SETUP_GUIDE.md": __fd_glob_16, "guides/TERMUX_GUIDE.md": __fd_glob_17, "guides/TROUBLESHOOTING.md": __fd_glob_18, "guides/UNINSTALL.md": __fd_glob_19, "guides/USER_GUIDE.md": __fd_glob_20, "frameworks/A2A-SERVER.md": __fd_glob_21, "frameworks/AGENT_PROTOCOLS_GUIDE.md": __fd_glob_22, "frameworks/CLOUD_AGENT.md": __fd_glob_23, "frameworks/EMBEDDED-SERVICES.md": __fd_glob_24, "frameworks/EVALS.md": __fd_glob_25, "frameworks/GAMIFICATION.md": __fd_glob_26, "frameworks/MCP-SERVER.md": __fd_glob_27, "frameworks/MEMORY.md": __fd_glob_28, "frameworks/OPENCODE.md": __fd_glob_29, "frameworks/SKILLS.md": __fd_glob_30, "frameworks/WEBHOOKS.md": __fd_glob_31, "ops/COVERAGE_PLAN.md": __fd_glob_32, "ops/E2E_DASHBOARD_SHAKEDOWN_v3.8.0.md": __fd_glob_33, "ops/FLY_IO_DEPLOYMENT_GUIDE.md": __fd_glob_34, "ops/PROXY_GUIDE.md": __fd_glob_35, "ops/RELEASE_CHECKLIST.md": __fd_glob_36, "ops/SQLITE_RUNTIME.md": __fd_glob_37, "ops/TUNNELS_GUIDE.md": __fd_glob_38, "ops/VM_DEPLOYMENT_GUIDE.md": __fd_glob_39, "reference/API_REFERENCE.md": __fd_glob_40, "reference/CLI-TOOLS.md": __fd_glob_41, "reference/ENVIRONMENT.md": __fd_glob_42, "reference/FREE_TIERS.md": __fd_glob_43, "reference/PROVIDER_REFERENCE.md": __fd_glob_44, "routing/AUTO-COMBO.md": __fd_glob_45, "routing/REASONING_REPLAY.md": __fd_glob_46, "security/CLI_TOKEN.md": __fd_glob_47, "security/CLI_TOKEN_AUTH.md": __fd_glob_48, "security/COMPLIANCE.md": __fd_glob_49, "security/ERROR_SANITIZATION.md": __fd_glob_50, "security/GUARDRAILS.md": __fd_glob_51, "security/PUBLIC_CREDS.md": __fd_glob_52, "security/ROUTE_GUARD_TIERS.md": __fd_glob_53, "security/STEALTH_GUIDE.md": __fd_glob_54, }); \ No newline at end of file +export const docs = await create.docs("docs", "docs", {"meta.json": __fd_glob_55, "architecture/meta.json": __fd_glob_56, "compression/meta.json": __fd_glob_57, "frameworks/meta.json": __fd_glob_58, "guides/meta.json": __fd_glob_59, "ops/meta.json": __fd_glob_60, "reference/meta.json": __fd_glob_61, "reference/openapi.yaml": __fd_glob_62, "routing/meta.json": __fd_glob_63, "security/meta.json": __fd_glob_64, }, {"architecture/ARCHITECTURE.md": __fd_glob_0, "architecture/AUTHZ_GUIDE.md": __fd_glob_1, "architecture/CODEBASE_DOCUMENTATION.md": __fd_glob_2, "architecture/REPOSITORY_MAP.md": __fd_glob_3, "architecture/RESILIENCE_GUIDE.md": __fd_glob_4, "compression/COMPRESSION_ENGINES.md": __fd_glob_5, "compression/COMPRESSION_GUIDE.md": __fd_glob_6, "compression/COMPRESSION_LANGUAGE_PACKS.md": __fd_glob_7, "compression/COMPRESSION_RULES_FORMAT.md": __fd_glob_8, "compression/RTK_COMPRESSION.md": __fd_glob_9, "frameworks/A2A-SERVER.md": __fd_glob_10, "frameworks/AGENT_PROTOCOLS_GUIDE.md": __fd_glob_11, "frameworks/CLOUD_AGENT.md": __fd_glob_12, "frameworks/EMBEDDED-SERVICES.md": __fd_glob_13, "frameworks/EVALS.md": __fd_glob_14, "frameworks/GAMIFICATION.md": __fd_glob_15, "frameworks/MCP-SERVER.md": __fd_glob_16, "frameworks/MEMORY.md": __fd_glob_17, "frameworks/OPENCODE.md": __fd_glob_18, "frameworks/SKILLS.md": __fd_glob_19, "frameworks/WEBHOOKS.md": __fd_glob_20, "guides/DOCKER_GUIDE.md": __fd_glob_21, "guides/ELECTRON_GUIDE.md": __fd_glob_22, "guides/FEATURES.md": __fd_glob_23, "guides/I18N.md": __fd_glob_24, "guides/KIRO_SETUP.md": __fd_glob_25, "guides/PWA_GUIDE.md": __fd_glob_26, "guides/SETUP_GUIDE.md": __fd_glob_27, "guides/TERMUX_GUIDE.md": __fd_glob_28, "guides/TROUBLESHOOTING.md": __fd_glob_29, "guides/UNINSTALL.md": __fd_glob_30, "guides/USER_GUIDE.md": __fd_glob_31, "ops/COVERAGE_PLAN.md": __fd_glob_32, "ops/E2E_DASHBOARD_SHAKEDOWN_v3.8.0.md": __fd_glob_33, "ops/FLY_IO_DEPLOYMENT_GUIDE.md": __fd_glob_34, "ops/PROXY_GUIDE.md": __fd_glob_35, "ops/RELEASE_CHECKLIST.md": __fd_glob_36, "ops/SQLITE_RUNTIME.md": __fd_glob_37, "ops/TUNNELS_GUIDE.md": __fd_glob_38, "ops/VM_DEPLOYMENT_GUIDE.md": __fd_glob_39, "reference/API_REFERENCE.md": __fd_glob_40, "reference/CLI-TOOLS.md": __fd_glob_41, "reference/ENVIRONMENT.md": __fd_glob_42, "reference/FREE_TIERS.md": __fd_glob_43, "reference/PROVIDER_REFERENCE.md": __fd_glob_44, "routing/AUTO-COMBO.md": __fd_glob_45, "routing/REASONING_REPLAY.md": __fd_glob_46, "security/CLI_TOKEN.md": __fd_glob_47, "security/CLI_TOKEN_AUTH.md": __fd_glob_48, "security/COMPLIANCE.md": __fd_glob_49, "security/ERROR_SANITIZATION.md": __fd_glob_50, "security/GUARDRAILS.md": __fd_glob_51, "security/PUBLIC_CREDS.md": __fd_glob_52, "security/ROUTE_GUARD_TIERS.md": __fd_glob_53, "security/STEALTH_GUIDE.md": __fd_glob_54, }); \ No newline at end of file diff --git a/docs/reference/CLI-TOOLS.md b/docs/reference/CLI-TOOLS.md index fdd298cba2..24e2a199b6 100644 --- a/docs/reference/CLI-TOOLS.md +++ b/docs/reference/CLI-TOOLS.md @@ -1,30 +1,39 @@ --- -title: "CLI Tools — OmniRoute v3.8.0" -version: 3.8.2 -lastUpdated: 2026-05-13 +title: "CLI Tools — OmniRoute v3.8.6" +version: 3.8.6 +lastUpdated: 2026-05-28 --- -# CLI Tools — OmniRoute v3.8.0 +# CLI Tools — OmniRoute v3.8.6 -Last updated: 2026-05-13 +Last updated: 2026-05-28 -OmniRoute integrates with two categories of CLI tools: +OmniRoute integrates with three categories of CLI tools spread across three dedicated dashboard pages: -1. **External CLI integrations** — third-party CLIs (Cursor, Cline, Codex, Claude Code, Qwen Code, Windsurf, Hermes, Amp, etc.) that you point at OmniRoute's local OpenAI-compatible endpoint. -2. **Internal OmniRoute CLI** — commands bundled with the `omniroute` binary for server lifecycle, setup, diagnostics, and provider management. +| Page | Route | Concept | Count | +|------|-------|---------|-------| +| **CLI Code's** | `/dashboard/cli-code` | Coding tools you point at OmniRoute (Client → CLI → OmniRoute → Provider) | 19 | +| **CLI Agents** | `/dashboard/cli-agents` | Autonomous agents you point at OmniRoute (same flow, broader scope) | 6 | +| **ACP Agents** | `/dashboard/acp-agents` | CLIs that OmniRoute spawns as backend via stdio/ACP (reverse flow) | see registry | + +Legacy routes redirect via 308: `/dashboard/cli-tools` → `/dashboard/cli-code`, `/dashboard/agents` → `/dashboard/acp-agents`. --- ## How It Works ``` -Claude / Codex / OpenCode / Cline / KiloCode / Continue / Cursor / Windsurf / Hermes / Amp / Qwen +CLI Code's / CLI Agents (consumption flow): +Claude / Codex / OpenCode / Cline / KiloCode / Continue / Hermes Agent / Goose / ... │ ▼ (all point to OmniRoute) http://YOUR_SERVER:20128/v1 │ ▼ (OmniRoute routes to the right provider) Anthropic / OpenAI / Gemini / DeepSeek / Groq / Mistral / ... + +ACP Agents (reverse spawn flow): + Client request → OmniRoute → spawns CLI via stdio/ACP → response ``` **Benefits:** @@ -36,70 +45,197 @@ Claude / Codex / OpenCode / Cline / KiloCode / Continue / Cursor / Windsurf / He --- -## 1. External CLI Integrations +## Source of Truth -### Source of Truth +The unified catalog lives in `src/shared/constants/cliTools.ts` as `CLI_TOOLS: Record`. -The dashboard cards in `/dashboard/cli-tools` are generated from -`src/shared/constants/cliTools.ts`. The `omniroute setup` command can write -config files automatically for the scriptable tools. +Each entry has these fields (defined in `src/shared/schemas/cliCatalog.ts`): -### Current Catalog (v3.8.0) +| Field | Type | Description | +|-------|------|-------------| +| `category` | `"code" \| "agent"` | Which page the tool appears on | +| `vendor` | `string` | Tool origin ("Anthropic", "OSS (P. Gauthier)") | +| `acpSpawnable` | `boolean` | Also usable as an ACP Agent (badge shown) | +| `baseUrlSupport` | `"full" \| "partial" \| "none"` | Custom endpoint support level. `"none"` = MITM backlog | +| `configType` | `"env" \| "custom" \| "guide" \| "custom-builder" \| "mitm"` | Configuration mechanism | +| `id`, `name`, `color`, `description`, `docsUrl` | standard | Core display fields | -| Tool | ID | Type / Config | Install / Access | Auth | -| ------------------ | ------------- | ------------------- | ------------------------------------ | ----------------------------------- | -| **Claude Code** | `claude` | env / settings.json | `npm i -g @anthropic-ai/claude-code` | API key (Anthropic gateway) | -| **OpenAI Codex** | `codex` | custom (toml) | `npm i -g @openai/codex` | API key (OpenAI) | -| **Factory Droid** | `droid` | custom | bundled / CLI | API key | -| **Open Claw** | `openclaw` | custom | bundled / CLI | API key | -| **Cursor** | `cursor` | guide (Cloud) | Cursor desktop app | API key (Cloud Endpoint) | -| **Windsurf** | `windsurf` | guide | Windsurf desktop IDE | API key (BYOK) | -| **Cline** | `cline` | custom / VS Code | `npm i -g cline` + VS Code ext | API key | -| **Kilo Code** | `kilo` | custom / VS Code | `npm i -g kilocode` + VS Code ext | API key | -| **Continue** | `continue` | guide (config.yaml) | VS Code extension | API key | -| **Antigravity** | `antigravity` | MITM | OmniRoute built-in | API key (MITM proxy) | -| **GitHub Copilot** | `copilot` | custom / VS Code | VS Code extension | API key (CLI fingerprint: `github`) | -| **OpenCode** | `opencode` | guide (json) | `npm i -g opencode-ai` | API key (OpenAI-compatible) | -| **Hermes** | `hermes` | guide (json) | install per docs | API key (OpenAI-compatible) | -| **Amp CLI** | `amp` | guide (env) | install per Sourcegraph docs | API key (OpenAI-compatible) | -| **Kiro AI** | `kiro` | MITM | Amazon Kiro IDE / CLI | API key (MITM proxy) | -| **Qwen Code** | `qwen` | guide (json/env) | `npm i -g @qwen-code/qwen-code` | API key (OpenAI-compatible) | -| **Custom CLI** | `custom` | custom-builder | any OpenAI-compatible client | API key | - -> Notes: -> -> - "Web wrappers" like ChatGPT/Claude/Grok/Perplexity browser sessions are not -> listed here. OmniRoute can proxy them through the `chatgpt-web`, -> `claude-web`, `grok-web`, `perplexity-web`, `blackbox-web`, -> `muse-spark-web` provider connections, but those are **provider connections** -> (configured under `/dashboard/providers`), not CLI tools. They do not surface -> as cards under `/dashboard/cli-tools`. -> - Tools marked **MITM** (Antigravity, Kiro) intercept the desktop app traffic -> locally and require enabling the corresponding mitm endpoint in -> `/dashboard/settings`. - -### CLI fingerprint sync (Agents + Settings) - -`/dashboard/agents` and `Settings > CLI Fingerprint` use -`src/shared/constants/cliCompatProviders.ts`. This keeps provider IDs aligned -with the CLI cards and legacy IDs. - -| CLI ID | Fingerprint Provider ID | -| --------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------- | -| `kilo` | `kilocode` | -| `copilot` | `github` | -| `claude` / `codex` / `antigravity` / `kiro` / `cursor` / `windsurf` / `cline` / `opencode` / `hermes` / `amp` / `qwen` / `droid` / `openclaw` | same ID | - -Legacy IDs still accepted for compatibility: `copilot`, `kimi-coding`, `qwen`. +Entries with `baseUrlSupport: "none"` are **not shown** in the dashboard pages — they are registered in the MITM backlog for plan 11 (see `_tasks/features-v3.8.6/refactorpages/_orchestration/_plan11-mitm-backlog.md`). --- +## 1. CLI Code's Catalog (19 tools) + +Tools that support custom base URL and appear in `/dashboard/cli-code`: + +| id | name | vendor | baseUrlSupport | configType | acpSpawnable | +|----|------|--------|---------------|-----------|-------------| +| claude | Claude Code | Anthropic | full | env | true | +| codex | OpenAI Codex CLI | OpenAI | full | custom | true | +| cline | Cline | OSS (ex-Claude Dev) | full | custom | true | +| kilo | Kilo Code | Kilo-Org | full | custom | false | +| roo | Roo Code | Roo (OSS) | full | guide | false | +| continue | Continue | continue.dev | full | guide | false | +| qwen | Qwen Code | Alibaba | full | guide | true | +| aider | Aider | OSS (P. Gauthier) | full | guide | true | +| forge | ForgeCode | Antinomy HQ | full | custom | true | +| jcode | jcode | 1jehuang (OSS) | full | custom | false | +| deepseek-tui | DeepSeek TUI | Hunter Bown (OSS) | full | custom | false | +| opencode | OpenCode | Anomaly (ex-SST) | full | guide | true | +| droid | Factory Droid | Factory AI | partial | guide | false | +| copilot | GitHub Copilot CLI | GitHub/MS | full | custom | false | +| gemini-cli | Gemini CLI | Google | partial | guide | true | +| cursor-cli | Cursor CLI | Anysphere | partial | guide | true | +| smelt | Smelt | leonardcser (OSS) | full | custom | false | +| pi | Pi (pi-coding-agent) | M. Zechner (OSS) | full | custom | false | +| custom | Custom CLI | — | full | custom-builder | false | + +Tools with `baseUrlSupport: "partial"` show a badge "⚠ Base URL parcial" in the dashboard card. + +--- + +## 2. CLI Agents Catalog (6 tools) + +Autonomous agents that appear in `/dashboard/cli-agents`: + +| id | name | vendor | baseUrlSupport | acpSpawnable | +|----|------|--------|---------------|-------------| +| hermes-agent | Hermes Agent | Nous Research | full | false | +| openclaw | OpenClaw | OSS (P. Steinberger) | full | true | +| goose | Goose | Block / Linux Foundation | full | true | +| interpreter | Open Interpreter | OSS | full | true | +| warp | Warp AI | Warp Inc. | partial | true | +| agent-deck | Agent Deck | asheshgoplani (OSS) | full | false | + +--- + +## 3. ACP Agents (/dashboard/acp-agents) + +This page (renamed from `/dashboard/agents`) shows CLIs that OmniRoute can **spawn** as backend execution engines via stdio/ACP protocol. The catalog is maintained separately in `src/lib/acp/registry.ts` and is **not** the same as `CLI_TOOLS`. + +Current ACP-spawnable CLIs (from `acpSpawnable: true` in `CLI_TOOLS` + ACP registry): codex, claude, goose, gemini-cli, openclaw, aider, opencode, cline, qwen-code, forge, interpreter, cursor-cli, warp. + +--- + +## 4. MITM Backlog (not shown in dashboard) + +The following CLIs do not support custom base URL natively and are **not listed** in CLI Code's or CLI Agents pages. They are candidates for MITM interception in plan 11: + +| CLI | Reason | +|-----|--------| +| windsurf | BYOK limited to select Claude models + corporate URL/token | +| amp | Closed ecosystem (Sourcegraph) | +| amazon-q / kiro-cli | AWS SSO auth, no custom URL | +| cowork | Anthropic Desktop, no configurable endpoint | + +See `_tasks/features-v3.8.6/refactorpages/_orchestration/_plan11-mitm-backlog.md` for the full cross-reference. + +--- + +## 5. Batch Detection API + +All tool detection is aggregated via a single endpoint: + +**`GET /api/cli-tools/all-statuses`** + +- Auth: `requireCliToolsAuth(request)` (same as other `/api/cli-tools/` routes) +- Returns: `Record` (type: `src/shared/types/cliBatchStatus.ts`) +- Strategy: `Promise.all` over all tools, 5s timeout per tool +- Cache: in-memory LRU indexed by config file `mtime`. Cache invalidated when mtime changes. Reset on server restart. + +Response shape per tool: +```ts +interface ToolBatchStatus { + detection: { + installed: boolean; + runnable: boolean; + version?: string; + command?: string; + commandPath?: string; + reason?: string; + }; + config: { + status: "configured" | "not_configured" | "not_installed" | "unknown" | "other"; + endpoint?: string | null; + lastConfiguredAt?: string | null; + }; + error?: string; // sanitized, no stack traces +} +``` + +--- + +## 6. Settings Handlers for New Tools + +New tools with `configType: "custom"` have dedicated settings API routes: + +| Route | Tool | +|-------|------| +| `POST /api/cli-tools/forge-settings` | ForgeCode (.forge.toml) | +| `POST /api/cli-tools/jcode-settings` | jcode (--base-url flag) | +| `POST /api/cli-tools/deepseek-tui-settings` | DeepSeek TUI (OPENAI_BASE_URL) | +| `POST /api/cli-tools/smelt-settings` | Smelt | +| `POST /api/cli-tools/pi-settings` | Pi coding agent | + +All routes use `sanitizeErrorMessage()` for error responses (Hard Rule #12). + +--- + +## 7. Dashboard Pages Architecture + +### CLI Code's (`/dashboard/cli-code`) +- `src/app/(dashboard)/dashboard/cli-code/page.tsx` — server component +- `src/app/(dashboard)/dashboard/cli-code/CliCodePageClient.tsx` — client grid +- `src/app/(dashboard)/dashboard/cli-code/[id]/page.tsx` — tool detail page +- `src/app/(dashboard)/dashboard/cli-code/components/` — 12 specialized tool cards + `ToolDetailClient.tsx` + +### CLI Agents (`/dashboard/cli-agents`) +- `src/app/(dashboard)/dashboard/cli-agents/page.tsx` — server component +- `src/app/(dashboard)/dashboard/cli-agents/CliAgentsPageClient.tsx` — client grid +- `src/app/(dashboard)/dashboard/cli-agents/[id]/page.tsx` — reuses `ToolDetailClient` + +### ACP Agents (`/dashboard/acp-agents`) +- `src/app/(dashboard)/dashboard/acp-agents/page.tsx` — server component (moved from `agents/`) + +### Shared UI Components (`src/shared/components/cli/`) +| File | Purpose | +|------|---------| +| `CliToolCard.tsx` | Smart status card (detection + config + endpoint) | +| `CliConceptCard.tsx` | Per-page concept explanation card | +| `CliComparisonCard.tsx` | Three-column comparison across CLI types | +| `BaseUrlSelect.tsx` | Endpoint dropdown (Local/Cloud/Custom) | +| `ApiKeySelect.tsx` | API key selector | +| `ManualConfigModal.tsx` | Copiable config snippet modal | + +### Shared Hook (`src/shared/hooks/cli/`) +| File | Purpose | +|------|---------| +| `useToolBatchStatuses.ts` | Fetches `/api/cli-tools/all-statuses`, manages loading/refresh state | + +--- + +## 8. i18n + +New namespaces added in plan 14 F9: + +| Namespace | Purpose | +|-----------|---------| +| `cliCommon` | Shared strings (card labels, concept/comparison texts, detail page labels) | +| `cliCode` | CLI Code's page strings | +| `cliAgents` | CLI Agents page strings | +| `acpAgents` | ACP Agents page strings | + +Full PT-BR and EN translations are provided. 39 other locales fall back to EN automatically via namespace-level merge in `src/i18n/request.ts`. + +--- + +## 9. Quick Start + ### Step 1 — Get an OmniRoute API Key -1. Open the OmniRoute dashboard → **API Manager** (`/dashboard/api-manager`) -2. Click **Create API Key** -3. Give it a name (e.g. `cli-tools`) and select all permissions -4. Copy the key — you'll need it for every CLI below +1. Open `/dashboard/api-manager` → **Create API Key** +2. Give it a name (e.g. `cli-tools`) and select all permissions +3. Copy the key — you'll need it for every CLI below > Your key looks like: `sk-xxxxxxxxxxxxxxxx-xxxxxxxxx` @@ -128,29 +264,32 @@ npm install -g kilocode # Qwen Code (Alibaba) npm install -g @qwen-code/qwen-code -# Kiro CLI (Amazon — requires curl + unzip) -apt-get install -y unzip # on Debian/Ubuntu -curl -fsSL https://cli.kiro.dev/install | bash -export PATH="$HOME/.local/bin:$PATH" # add to ~/.bashrc -``` +# Aider +pip install aider-chat -**Verify:** +# Smelt +cargo install smelt # Rust-based -```bash -claude --version # 2.x.x -codex --version # 0.x.x -opencode --version # x.x.x -cline --version # 2.x.x -kilocode --version # x.x.x (or: kilo --version) -qwen --version # x.x.x -kiro-cli --version # 1.x.x +# Pi coding agent +# see https://github.com/zechnerj/pi-coding-agent for install + +# jcode +# see https://github.com/1jehuang/jcode for install ``` --- -### Step 3 — Set Global Environment Variables +### Step 3 — Configure via Dashboard -Add to `~/.bashrc` (or `~/.zshrc`), then run `source ~/.bashrc`: +1. Go to `http://localhost:20128/dashboard/cli-code` +2. Find your tool in the grid +3. Click the card to open the tool detail page +4. Select your API key and base URL +5. Click **Apply Config** or copy the manual config snippet + +--- + +### Step 4 — Set Global Environment Variables ```bash # OmniRoute Universal Endpoint @@ -158,533 +297,39 @@ export OPENAI_BASE_URL="http://localhost:20128/v1" export OPENAI_API_KEY="sk-your-omniroute-key" export ANTHROPIC_BASE_URL="http://localhost:20128" export ANTHROPIC_AUTH_TOKEN="sk-your-omniroute-key" -export GEMINI_BASE_URL="http://localhost:20128/v1" -export GEMINI_API_KEY="sk-your-omniroute-key" -``` - -> For a **remote server** replace `localhost:20128` with the server IP or domain, -> e.g. `http://192.168.0.15:20128`. - ---- - -### Step 4 — Configure Each Tool - -#### Claude Code - -```bash -# Create ~/.claude/settings.json: -mkdir -p ~/.claude && cat > ~/.claude/settings.json << EOF -{ - "env": { - "ANTHROPIC_BASE_URL": "http://localhost:20128", - "ANTHROPIC_AUTH_TOKEN": "sk-your-omniroute-key" - } -} -EOF -``` - -Use the unified Anthropic gateway root for Claude Code. Do not append `/v1` here. - -**Test:** `claude "say hello"` - ---- - -#### OpenAI Codex - -```bash -mkdir -p ~/.codex && cat > ~/.codex/config.yaml << EOF -model: auto -apiKey: sk-your-omniroute-key -apiBaseUrl: http://localhost:20128/v1 -EOF -``` - -**Test:** `codex "what is 2+2?"` - ---- - -#### OpenCode - -```bash -mkdir -p ~/.config/opencode && cat > ~/.config/opencode/opencode.json << EOF -{ - "\$schema": "https://opencode.ai/config.json", - "provider": { - "omniroute": { - "npm": "@ai-sdk/openai-compatible", - "name": "OmniRoute", - "options": { - "baseURL": "http://localhost:20128/v1", - "apiKey": "sk-your-omniroute-key" - }, - "models": { - "claude-sonnet-4-5": { "name": "claude-sonnet-4-5" }, - "claude-sonnet-4-5-thinking": { "name": "claude-sonnet-4-5-thinking" }, - "gemini-3-flash": { "name": "gemini-3-flash" } - } - } - } -} -EOF -``` - -**Test:** `opencode` - -> Use `opencode run "your prompt" --model omniroute/claude-sonnet-4-5-thinking --variant high` -> to send thinking variants. - ---- - -#### Cline (CLI or VS Code) - -**CLI mode:** - -```bash -mkdir -p ~/.cline/data && cat > ~/.cline/data/globalState.json << EOF -{ - "apiProvider": "openai", - "openAiBaseUrl": "http://localhost:20128/v1", - "openAiApiKey": "sk-your-omniroute-key" -} -EOF -``` - -**VS Code mode:** -Cline extension settings → API Provider: `OpenAI Compatible` → Base URL: `http://localhost:20128/v1` - -Or use the OmniRoute dashboard → **CLI Tools → Cline → Apply Config**. - ---- - -#### KiloCode (CLI or VS Code) - -**CLI mode:** - -```bash -kilocode --api-base http://localhost:20128/v1 --api-key sk-your-omniroute-key -``` - -**VS Code settings:** - -```json -{ - "kilo-code.openAiBaseUrl": "http://localhost:20128/v1", - "kilo-code.apiKey": "sk-your-omniroute-key" -} -``` - -Or use the OmniRoute dashboard → **CLI Tools → KiloCode → Apply Config**. - ---- - -#### Continue (VS Code Extension) - -Edit `~/.continue/config.yaml`: - -```yaml -models: - - name: OmniRoute - provider: openai - model: auto - apiBase: http://localhost:20128/v1 - apiKey: sk-your-omniroute-key - default: true -``` - -Restart VS Code after editing. - ---- - -#### Kiro CLI (Amazon) - -```bash -# Login to your AWS/Kiro account: -kiro-cli login - -# The CLI uses its own auth — OmniRoute is not needed as backend for Kiro CLI itself. -# Use kiro-cli alongside OmniRoute for other tools. -kiro-cli status -``` - -For the **Kiro IDE** desktop app, use the MITM endpoint exposed by OmniRoute -under `/dashboard/cli-tools → Kiro`. - ---- - -#### Qwen Code (Alibaba) - -Qwen Code supports OpenAI-compatible API endpoints via environment variables or `settings.json`. - -> Qwen OAuth free tier was discontinued on 2026-04-15. Use OmniRoute with -> `bailian-coding-plan` / `alibaba` / `alibaba-cn` / `openrouter` / `anthropic` / -> `gemini` providers instead. - -**Option 1: Environment variables (`~/.qwen/.env`)** - -```bash -mkdir -p ~/.qwen && cat > ~/.qwen/.env << EOF -OPENAI_API_KEY="sk-your-omniroute-key" -OPENAI_BASE_URL="http://localhost:20128/v1" -OPENAI_MODEL="auto" -EOF -``` - -**Option 2: `settings.json` with `security.auth`** - -```json -// ~/.qwen/settings.json -{ - "security": { - "auth": { - "selectedType": "openai", - "apiKey": "sk-your-omniroute-key", - "baseUrl": "http://localhost:20128/v1" - } - }, - "model": { - "name": "claude-sonnet-4-6" - } -} -``` - -**Option 3: Inline CLI flags** - -```bash -OPENAI_BASE_URL="http://localhost:20128/v1" \ -OPENAI_API_KEY="sk-your-omniroute-key" \ -OPENAI_MODEL="auto" \ -qwen ``` > For a **remote server** replace `localhost:20128` with the server IP or domain. -**Test:** `qwen "say hello"` - --- -#### Cursor (Desktop App) +## 10. Internal OmniRoute CLI -> **Note:** Cursor routes requests through its cloud. For OmniRoute integration, -> enable **Cloud Endpoint** in OmniRoute Settings and use your public domain URL. - -Via GUI: **Settings → Models → OpenAI API Key** - -- Base URL: `https://your-domain.com/v1` -- API Key: your OmniRoute key - ---- - -#### Windsurf (Desktop IDE) - -> Official Windsurf docs currently describe BYOK for select Claude models plus -> enterprise URL/token settings, not a generic custom OpenAI-compatible provider. -> Test BYOK behavior in your environment before relying on this integration. - -1. Open AI Settings inside Windsurf. -2. Select **Add custom provider** (OpenAI-compatible). -3. Base URL: `http://localhost:20128/v1` -4. API Key: your OmniRoute key -5. Pick a model from the OmniRoute catalog. - ---- - -#### Hermes - -```json -// Hermes config file -{ - "provider": { - "type": "openai", - "baseURL": "http://localhost:20128/v1", - "apiKey": "sk-your-omniroute-key", - "model": "claude-sonnet-4-6" - } -} -``` - ---- - -#### Amp CLI (Sourcegraph) - -```bash -export OPENAI_API_KEY="sk-your-omniroute-key" -export OPENAI_BASE_URL="http://localhost:20128/v1" -amp --model "claude-sonnet-4-6" - -# Suggested shorthand aliases you can map locally: -# g25p -> gemini/gemini-2.5-pro -# g25f -> gemini/gemini-2.5-flash -# cs45 -> cc/claude-sonnet-4-5-20250929 -# g54 -> gemini/gemini-3.1-pro-high -``` - ---- - -### Dashboard Auto-Configuration - -The OmniRoute dashboard automates configuration for most tools: - -1. Go to `http://localhost:20128/dashboard/cli-tools` -2. Expand any tool card -3. Select your API key from the dropdown -4. Click **Apply Config** (if the tool is detected as installed) -5. Or copy the generated config snippet manually - ---- - -### Built-in Agents: Droid & Open Claw - -**Droid** and **Open Claw** are AI agents built directly into OmniRoute — no -installation needed. They run as internal routes and use OmniRoute's model -routing automatically. - -- Access: `http://localhost:20128/dashboard/agents` -- Configure: same combos and providers as all other tools -- No API key or CLI install required - ---- - -## 2. Internal OmniRoute CLI - -The `omniroute` binary (installed via `npm install -g omniroute` or bundled -with the desktop app) provides commands beyond running the server. The full -matrix is implemented in: - -- `bin/omniroute.mjs` — entry point, env loading, special-case dispatch (`--mcp`) -- `bin/cli/program.mjs` — Commander program builder -- `bin/cli/commands/.mjs` — one file per command/group, registered in `registry.mjs` -- `bin/cli/output.mjs` — output formatters (json/jsonl/table/csv) -- `bin/cli/runtime.mjs` — withRuntime helper (server-first/db-fallback) -- `bin/cli/i18n.mjs` — t() helper with locales - -### Server Lifecycle +The `omniroute` binary provides commands for server lifecycle, setup, diagnostics, and provider management. Entry point: `bin/omniroute.mjs`. ```bash omniroute # Start server (default port 20128) -omniroute --port 3000 # Override port -omniroute --no-open # Don't auto-open browser -omniroute --mcp # Start as MCP server (stdio transport) -omniroute serve # Same as `omniroute` -omniroute stop # Stop the running server -omniroute restart # Restart the server -omniroute dashboard # Open dashboard in default browser -omniroute open # Alias for `dashboard` +omniroute setup # Interactive setup wizard +omniroute doctor # Check config, DB, ports, runtime +omniroute providers list # Configured provider connections +omniroute providers test-all # Test every active connection +omniroute reset-password # Reset the admin password +omniroute logs # Stream request logs +omniroute health # Detailed health (breakers, cache, memory) omniroute --version # Print version omniroute --help # Show all commands ``` -### Setup & Initialization - -```bash -omniroute setup # Interactive setup wizard -omniroute setup --non-interactive # CI/automation mode (reads env vars + flags) -omniroute setup --password '' # Set admin password directly -omniroute setup --add-provider \ - --provider openai \ - --api-key '' \ - --test-provider # Add and test a provider in one shot -``` - -Recognized environment variables for non-interactive setup: - -| Var | Purpose | -| ----------------------------- | -------------------------------------------- | -| `OMNIROUTE_SETUP_PASSWORD` | Admin password (>=8 chars) | -| `OMNIROUTE_PROVIDER` | Provider id (e.g. `openai`, `anthropic`) | -| `OMNIROUTE_PROVIDER_NAME` | Display name for the connection | -| `OMNIROUTE_PROVIDER_BASE_URL` | Optional OpenAI-compatible base URL override | -| `OMNIROUTE_API_KEY` | Provider API key | -| `OMNIROUTE_DEFAULT_MODEL` | Optional default model | -| `DATA_DIR` | Override the OmniRoute data directory | - -### Diagnostics - -```bash -omniroute doctor # Check config, DB, ports, runtime, memory, liveness -omniroute doctor --json # Machine-readable JSON -omniroute doctor --no-liveness # Skip the HTTP health probe -omniroute doctor --host 0.0.0.0 # Override liveness host -omniroute doctor --liveness-url # Full health endpoint URL override -``` - -The doctor runs these checks: `Config`, `Database`, `Storage/encryption`, -`Port availability`, `Node runtime`, `Native binary` (better-sqlite3), -`Memory`, and `Server liveness`. It exits non-zero if any check is `fail`. - -### Provider Management - -```bash -omniroute providers available # OmniRoute provider catalog -omniroute providers available --search openai # Filter catalog by id/name/alias/category -omniroute providers available --category api-key # Filter by category (api-key, oauth, free, ...) -omniroute providers available --json # Machine-readable JSON - -omniroute providers list # Configured provider connections -omniroute providers list --json - -omniroute providers test # Test one configured connection -omniroute providers test-all # Test every active connection -omniroute providers validate # Local-only structural validation -``` - -> `providers available` reads the OmniRoute catalog; `providers list/test/test-all/validate` -> read the local SQLite database directly and do not require the server to be running. - -### Recovery & Reset - -```bash -omniroute reset-password # Reset the admin password (legacy alias still works) -omniroute reset-encrypted-columns # Show warning + dry-run for encrypted credential reset -omniroute reset-encrypted-columns --force # Actually null out encrypted credentials in SQLite -``` - -### Other subcommands - -These assume a running OmniRoute server, unless noted otherwise: - -```bash -omniroute status # Comprehensive runtime status -omniroute logs # Stream request logs (--json, --search, --follow) -omniroute config show # Display current configuration - -omniroute provider list # List available providers (alias of providers list) -omniroute provider add # Register OmniRoute as a provider on a tool -omniroute keys add | list | remove # Manage API keys -omniroute models [provider] # List models (--json, --search) -omniroute combo list | switch | create | delete - -omniroute backup # Snapshot config + DB -omniroute restore # Restore from a previous snapshot - -omniroute health # Detailed health (breakers, cache, memory) -omniroute quota # Provider quota usage -omniroute cache # Cache status -omniroute cache clear # Clear semantic + signature caches - -omniroute mcp status | restart # MCP server status / restart -omniroute a2a status | card # A2A server status / agent card - -omniroute tunnel list | create | stop # Manage tunnels (cloudflare/tailscale/ngrok) -omniroute env show | get | set # Inspect / set env vars (temporary) - -omniroute test # Provider connectivity smoke test -omniroute update # Check for updates -omniroute completion # Generate shell completion -``` - -### Common flags - -| Flag | Description | -| ------------------- | ------------------------------------------------------ | -| `--no-open` | Don't auto-open the browser on start | -| `--port ` | Override the API port (default 20128) | -| `--mcp` | Run as MCP server over stdio (for IDEs) | -| `--non-interactive` | CI mode (no prompts; reads from env/flags) | -| `--json` | Machine-readable JSON output (doctor, providers, etc.) | -| `--help`, `-h` | Show command-specific help | -| `--version`, `-v` | Print the installed version | - ---- - -## Available API Endpoints - -| Endpoint | Description | Use For | -| -------------------------- | ----------------------------- | --------------------------- | -| `/v1/chat/completions` | Standard chat (all providers) | All modern tools | -| `/v1/responses` | Responses API (OpenAI format) | Codex, agentic workflows | -| `/v1/completions` | Legacy text completions | Older tools using `prompt:` | -| `/v1/embeddings` | Text embeddings | RAG, search | -| `/v1/images/generations` | Image generation | GPT-Image, Flux, etc. | -| `/v1/audio/speech` | Text-to-speech | ElevenLabs, OpenAI TTS | -| `/v1/audio/transcriptions` | Speech-to-text | Deepgram, AssemblyAI | - --- ## Troubleshooting -| Error | Cause | Fix | -| ------------------------------------------------- | --------------------------- | --------------------------------------------------------------------------- | -| `Connection refused` | OmniRoute not running | `omniroute serve` or `pm2 start omniroute` | -| `401 Unauthorized` | Wrong API key | Check in `/dashboard/api-manager` | -| `No combo configured` | No active routing combo | Set up in `/dashboard/combos` | -| `invalid model` | Model not in catalog | Use `auto` or check `/dashboard/providers` | -| CLI shows "not installed" | Binary not in PATH | Check `which ` | -| `kiro-cli: not found` | Not in PATH | `export PATH="$HOME/.local/bin:$PATH"` | -| `doctor` reports SQLite incompatible | Wrong native binary | `cd app && npm rebuild better-sqlite3` | -| `doctor` reports `STORAGE_ENCRYPTION_KEY` missing | Encrypted creds without key | Set `STORAGE_ENCRYPTION_KEY` or `omniroute reset-encrypted-columns --force` | - ---- - -## Quick Setup Script (One Command) - -```bash -cat > my-setup.sh <<'EOF' -#!/usr/bin/env bash -set -euo pipefail - -# === Edit these === -OMNIROUTE_URL="http://localhost:20128/v1" -OMNIROUTE_ANTHROPIC_URL="http://localhost:20128" -OMNIROUTE_KEY="sk-your-omniroute-key" -# ================== - -# 1. Install the external CLIs -npm install -g \ - @anthropic-ai/claude-code \ - @openai/codex \ - opencode-ai \ - cline \ - kilocode \ - @qwen-code/qwen-code - -# 2. Optional: Kiro CLI (needs unzip) -if ! command -v unzip >/dev/null 2>&1; then - sudo apt-get install -y unzip -fi -curl -fsSL https://cli.kiro.dev/install | bash - -# 3. Write the per-tool config files -mkdir -p ~/.claude ~/.codex ~/.config/opencode ~/.continue ~/.qwen - -cat > ~/.claude/settings.json < ~/.codex/config.yaml < ~/.qwen/.env </dev/null; then - cat >> ~/.bashrc <` | +| Dashboard shows "not detected" after install | Cache stale | Click "⟳ Refresh detection" in dashboard | +| Old link `/dashboard/cli-tools` | Pre-v3.8.6 bookmark | Auto-redirected to `/dashboard/cli-code` (308) | +| Old link `/dashboard/agents` | Pre-v3.8.6 bookmark | Auto-redirected to `/dashboard/acp-agents` (308) | diff --git a/src/app/(dashboard)/dashboard/providers/[id]/page.tsx b/src/app/(dashboard)/dashboard/providers/[id]/page.tsx index 7464925ce3..d02dbd7063 100644 --- a/src/app/(dashboard)/dashboard/providers/[id]/page.tsx +++ b/src/app/(dashboard)/dashboard/providers/[id]/page.tsx @@ -4594,7 +4594,7 @@ export default function ProviderDetailPage() {
terminal diff --git a/src/shared/components/cli/CliToolCard.tsx b/src/shared/components/cli/CliToolCard.tsx index ef03983bfa..5f885bdcbf 100644 --- a/src/shared/components/cli/CliToolCard.tsx +++ b/src/shared/components/cli/CliToolCard.tsx @@ -4,7 +4,7 @@ import Link from "next/link"; import Image from "next/image"; import type { CliCatalogEntry } from "@/shared/schemas/cliCatalog"; import type { ToolBatchStatus } from "@/shared/types/cliBatchStatus"; -import CliStatusBadge from "@/app/(dashboard)/dashboard/cli-tools/components/CliStatusBadge"; +import CliStatusBadge from "@/app/(dashboard)/dashboard/cli-code/components/CliStatusBadge"; import { cn } from "@/shared/utils/cn"; export interface CliToolCardProps { diff --git a/tests/unit/ui/CliToolCard.test.tsx b/tests/unit/ui/CliToolCard.test.tsx index f0049d2c15..46a69bb2aa 100644 --- a/tests/unit/ui/CliToolCard.test.tsx +++ b/tests/unit/ui/CliToolCard.test.tsx @@ -26,7 +26,7 @@ vi.mock("next-intl", () => ({ })); // Stub CliStatusBadge so it doesn't need next-intl internals -vi.mock("@/app/(dashboard)/dashboard/cli-tools/components/CliStatusBadge", () => ({ +vi.mock("@/app/(dashboard)/dashboard/cli-code/components/CliStatusBadge", () => ({ default: ({ effectiveConfigStatus, }: {