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", () => {