From 77b055aba0a4dec5fe404c356f25131fb1af5da7 Mon Sep 17 00:00:00 2001 From: diegosouzapw Date: Thu, 28 May 2026 12:47:31 -0300 Subject: [PATCH] =?UTF-8?q?fix(cli):=20address=20code=20review=20v2=20find?= =?UTF-8?q?ings=20=E2=80=94=20broken=20test=20path,=20dead=20code,=20type?= =?UTF-8?q?=20narrowing=20(plan=2014)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - tests/unit/custom-cli-config.test.ts: fix ERR_MODULE_NOT_FOUND — stale import path cli-tools → cli-code (regression from F8 git mv, missed by F10 audit because it only ran curated test subset). - tests/unit/ui/CliAgentsPage.test.tsx: update vi.mock path to current cli-code location (was no-op mock pointing to deleted path). - tests/unit/ui/CliToolCard.test.tsx: update URL strings /dashboard/cli-tools/claude → /dashboard/cli-code/claude (cosmetic alignment with new routes). - src/app/(dashboard)/dashboard/cli-code/components/ToolDetailClient.tsx: remove dead case "cliproxyapi" + unused import (no entry in CLI_TOOLS catalog). - src/app/(dashboard)/dashboard/cli-agents/CliAgentsPageClient.tsx: replace inline div skeleton with shared for visual consistency with CliCodePageClient. - src/app/api/cli-tools/{forge,jcode,deepseek-tui,smelt,pi}-settings/route.ts: replace catch (err: any) with catch (err) + (err as NodeJS.ErrnoException).code narrowing (8 instances, eliminates 8 of 11 implicit-any introductions). Validated: custom-cli-config.test.ts now 3/3 PASS (was 0/1 FAIL with ERR_MODULE_NOT_FOUND); F1/F3 tests 147/147 PASS; UI tests 25/25 PASS; typecheck:core + noimplicit clean. --- .../dashboard/cli-agents/CliAgentsPageClient.tsx | 7 ++----- .../dashboard/cli-code/components/ToolDetailClient.tsx | 3 --- src/app/api/cli-tools/deepseek-tui-settings/route.ts | 4 ++-- src/app/api/cli-tools/forge-settings/route.ts | 4 ++-- src/app/api/cli-tools/jcode-settings/route.ts | 8 ++++---- src/app/api/cli-tools/pi-settings/route.ts | 8 ++++---- src/app/api/cli-tools/smelt-settings/route.ts | 8 ++++---- tests/unit/custom-cli-config.test.ts | 2 +- tests/unit/ui/CliAgentsPage.test.tsx | 2 +- tests/unit/ui/CliToolCard.test.tsx | 6 +++--- 10 files changed, 23 insertions(+), 29 deletions(-) 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", () => {