From b1de116690cdd3602aee113edb52597c9f06cdb9 Mon Sep 17 00:00:00 2001 From: A <258483684+la14-1@users.noreply.github.com> Date: Tue, 17 Mar 2026 18:40:16 -0700 Subject: [PATCH] refactor: replace manual multi-level type guards with toRecord/isString in index.ts (#2731) Two instances of the pattern `err && typeof err === "object" && "code" in err` violated the type-safety rule requiring valibot or shared type-guard utilities instead of manual multi-level type checks. Replaced with `toRecord(err)` and `isString()` from @openrouter/spawn-shared for consistent, rule-compliant error code extraction. Also bumps CLI patch version per cli-version.md. -- qa/code-quality Co-authored-by: spawn-qa-bot Co-authored-by: L <6723574+louisgv@users.noreply.github.com> --- packages/cli/package.json | 2 +- packages/cli/src/index.ts | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 9f6cedaf..f581efd2 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@openrouter/spawn", - "version": "0.21.0", + "version": "0.21.1", "type": "module", "bin": { "spawn": "cli.js" diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index e19fcef0..b6662c37 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -1,6 +1,6 @@ #!/usr/bin/env bun -import { getErrorMessage } from "@openrouter/spawn-shared"; +import { getErrorMessage, isString, toRecord } from "@openrouter/spawn-shared"; import pc from "picocolors"; import pkg from "../package.json" with { type: "json" }; import { @@ -320,7 +320,8 @@ async function suggestCloudsForPrompt(agent: string): Promise { /** Print a descriptive error for a failed prompt file read and exit */ function handlePromptFileError(promptFile: string, err: unknown): never { - const code = err && typeof err === "object" && "code" in err ? err.code : ""; + const errObj = toRecord(err); + const code = isString(errObj?.code) ? errObj.code : ""; if (code === "ENOENT") { console.error(pc.red(`Prompt file not found: ${pc.bold(promptFile)}`)); console.error("\nCheck the path and try again."); @@ -353,7 +354,8 @@ async function readPromptFile(promptFile: string): Promise { }); if (!statsResult.ok) { const err = statsResult.error; - const code = err && typeof err === "object" && "code" in err ? err.code : ""; + const errRec = toRecord(err); + const code = isString(errRec?.code) ? errRec.code : ""; if (code === "ENOENT" || code === "EACCES" || code === "EISDIR") { handlePromptFileError(promptFile, err); }