diff --git a/src/app/(dashboard)/dashboard/cli-agents/CliAgentsPageClient.tsx b/src/app/(dashboard)/dashboard/cli-agents/CliAgentsPageClient.tsx index 6c37f0c152..1f471c9330 100644 --- a/src/app/(dashboard)/dashboard/cli-agents/CliAgentsPageClient.tsx +++ b/src/app/(dashboard)/dashboard/cli-agents/CliAgentsPageClient.tsx @@ -3,6 +3,7 @@ import { useMemo, useState } from "react"; import { useTranslations } from "next-intl"; import { CLI_TOOLS } from "@/shared/constants/cliTools"; +import { CardSkeleton } from "@/shared/components"; import { CliToolCard, CliConceptCard, CliComparisonCard } from "@/shared/components/cli"; import { useToolBatchStatuses } from "@/shared/hooks/cli/useToolBatchStatuses"; @@ -123,11 +124,7 @@ export default function CliAgentsPageClient({ machineId: _machineId }: CliAgents {loading ? (
{agentTools.map((tool) => ( - ) : filteredTools.length === 0 ? ( diff --git a/src/app/(dashboard)/dashboard/cli-code/components/ToolDetailClient.tsx b/src/app/(dashboard)/dashboard/cli-code/components/ToolDetailClient.tsx index 383d8d9f9f..77c7ada95b 100644 --- a/src/app/(dashboard)/dashboard/cli-code/components/ToolDetailClient.tsx +++ b/src/app/(dashboard)/dashboard/cli-code/components/ToolDetailClient.tsx @@ -17,7 +17,6 @@ import { KiloToolCard, OpenClawToolCard, } from "./index"; -import CliproxyapiToolCard from "./CliproxyapiToolCard"; export interface ToolDetailClientProps { toolId: string; @@ -211,8 +210,6 @@ export default function ToolDetailClient({ toolId, category }: ToolDetailClientP return ; case "antigravity": return ; - case "cliproxyapi": - return {}} />; case "custom": return ; default: diff --git a/src/app/api/cli-tools/deepseek-tui-settings/route.ts b/src/app/api/cli-tools/deepseek-tui-settings/route.ts index f0399c57bf..76ea68ffa2 100644 --- a/src/app/api/cli-tools/deepseek-tui-settings/route.ts +++ b/src/app/api/cli-tools/deepseek-tui-settings/route.ts @@ -53,8 +53,8 @@ const hasOmniRouteConfig = (content: string | null): boolean => { const readConfig = async (): Promise => { try { return await fs.readFile(getDeepseekTuiConfigPath(), "utf-8"); - } catch (err: any) { - if (err.code === "ENOENT") return null; + } catch (err) { + if ((err as NodeJS.ErrnoException).code === "ENOENT") return null; throw err; } }; diff --git a/src/app/api/cli-tools/forge-settings/route.ts b/src/app/api/cli-tools/forge-settings/route.ts index 380b97e1d0..c9041157a5 100644 --- a/src/app/api/cli-tools/forge-settings/route.ts +++ b/src/app/api/cli-tools/forge-settings/route.ts @@ -54,8 +54,8 @@ const hasOmniRouteConfig = (content: string | null): boolean => { const readConfig = async (): Promise => { try { return await fs.readFile(getForgeConfigPath(), "utf-8"); - } catch (err: any) { - if (err.code === "ENOENT") return null; + } catch (err) { + if ((err as NodeJS.ErrnoException).code === "ENOENT") return null; throw err; } }; diff --git a/src/app/api/cli-tools/jcode-settings/route.ts b/src/app/api/cli-tools/jcode-settings/route.ts index f2088c0167..e74146a556 100644 --- a/src/app/api/cli-tools/jcode-settings/route.ts +++ b/src/app/api/cli-tools/jcode-settings/route.ts @@ -40,8 +40,8 @@ const readConfig = async (): Promise | null> => { try { const content = await fs.readFile(getJcodeConfigPath(), "utf-8"); return JSON.parse(content) as Record; - } catch (err: any) { - if (err.code === "ENOENT") return null; + } catch (err) { + if ((err as NodeJS.ErrnoException).code === "ENOENT") return null; throw err; } }; @@ -193,8 +193,8 @@ export async function DELETE(request: Request) { try { const raw = await fs.readFile(configPath, "utf-8"); existing = JSON.parse(raw) as Record; - } catch (err: any) { - if (err.code === "ENOENT") { + } catch (err) { + if ((err as NodeJS.ErrnoException).code === "ENOENT") { return NextResponse.json({ success: true, message: "No config file to reset" }); } throw err; diff --git a/src/app/api/cli-tools/pi-settings/route.ts b/src/app/api/cli-tools/pi-settings/route.ts index 07e762624b..59aaa9b5e9 100644 --- a/src/app/api/cli-tools/pi-settings/route.ts +++ b/src/app/api/cli-tools/pi-settings/route.ts @@ -40,8 +40,8 @@ const readConfig = async (): Promise | null> => { try { const content = await fs.readFile(getPiConfigPath(), "utf-8"); return JSON.parse(content) as Record; - } catch (err: any) { - if (err.code === "ENOENT") return null; + } catch (err) { + if ((err as NodeJS.ErrnoException).code === "ENOENT") return null; throw err; } }; @@ -193,8 +193,8 @@ export async function DELETE(request: Request) { try { const raw = await fs.readFile(configPath, "utf-8"); existing = JSON.parse(raw) as Record; - } catch (err: any) { - if (err.code === "ENOENT") { + } catch (err) { + if ((err as NodeJS.ErrnoException).code === "ENOENT") { return NextResponse.json({ success: true, message: "No config file to reset" }); } throw err; diff --git a/src/app/api/cli-tools/smelt-settings/route.ts b/src/app/api/cli-tools/smelt-settings/route.ts index 3a8ad02315..a60ecd601b 100644 --- a/src/app/api/cli-tools/smelt-settings/route.ts +++ b/src/app/api/cli-tools/smelt-settings/route.ts @@ -40,8 +40,8 @@ const readConfig = async (): Promise | null> => { try { const content = await fs.readFile(getSmeltConfigPath(), "utf-8"); return JSON.parse(content) as Record; - } catch (err: any) { - if (err.code === "ENOENT") return null; + } catch (err) { + if ((err as NodeJS.ErrnoException).code === "ENOENT") return null; throw err; } }; @@ -193,8 +193,8 @@ export async function DELETE(request: Request) { try { const raw = await fs.readFile(configPath, "utf-8"); existing = JSON.parse(raw) as Record; - } catch (err: any) { - if (err.code === "ENOENT") { + } catch (err) { + if ((err as NodeJS.ErrnoException).code === "ENOENT") { return NextResponse.json({ success: true, message: "No config file to reset" }); } throw err; diff --git a/tests/unit/custom-cli-config.test.ts b/tests/unit/custom-cli-config.test.ts index bc79f6150b..94adffa841 100644 --- a/tests/unit/custom-cli-config.test.ts +++ b/tests/unit/custom-cli-config.test.ts @@ -6,7 +6,7 @@ import { buildCustomCliEnvScript, buildCustomCliJsonConfig, normalizeOpenAiBaseUrl, -} from "../../src/app/(dashboard)/dashboard/cli-tools/components/customCliConfig.ts"; +} from "../../src/app/(dashboard)/dashboard/cli-code/components/customCliConfig.ts"; test("normalizeOpenAiBaseUrl appends /v1 only when needed", () => { assert.equal(normalizeOpenAiBaseUrl("http://localhost:20128"), "http://localhost:20128/v1"); diff --git a/tests/unit/ui/CliAgentsPage.test.tsx b/tests/unit/ui/CliAgentsPage.test.tsx index 09c8c073cc..82f4a5205f 100644 --- a/tests/unit/ui/CliAgentsPage.test.tsx +++ b/tests/unit/ui/CliAgentsPage.test.tsx @@ -36,7 +36,7 @@ vi.mock("next-intl", () => ({ })); // Stub CliStatusBadge so it doesn't depend on next-intl internals -vi.mock("@/app/(dashboard)/dashboard/cli-tools/components/CliStatusBadge", () => ({ +vi.mock("@/app/(dashboard)/dashboard/cli-code/components/CliStatusBadge", () => ({ default: ({ effectiveConfigStatus, }: { diff --git a/tests/unit/ui/CliToolCard.test.tsx b/tests/unit/ui/CliToolCard.test.tsx index 46a69bb2aa..0b6980cfb8 100644 --- a/tests/unit/ui/CliToolCard.test.tsx +++ b/tests/unit/ui/CliToolCard.test.tsx @@ -113,15 +113,15 @@ afterEach(() => { describe("CliToolCard", () => { it("renders tool name", () => { - const container = renderCard(makeTool(), makeBatchStatus(), "/dashboard/cli-tools/claude", true); + const container = renderCard(makeTool(), makeBatchStatus(), "/dashboard/cli-code/claude", true); expect(container.textContent).toContain("Claude Code"); }); it("links to detailHref", () => { - const container = renderCard(makeTool(), makeBatchStatus(), "/dashboard/cli-tools/claude", true); + const container = renderCard(makeTool(), makeBatchStatus(), "/dashboard/cli-code/claude", true); const link = container.querySelector("a"); expect(link).not.toBeNull(); - expect(link!.getAttribute("href")).toBe("/dashboard/cli-tools/claude"); + expect(link!.getAttribute("href")).toBe("/dashboard/cli-code/claude"); }); it("shows version when installed", () => {