From 3fa0c815b286c9e11b28dc04c803529e73b79c1b Mon Sep 17 00:00:00 2001 From: Trevin Chow Date: Sun, 5 Apr 2026 11:30:36 -0700 Subject: [PATCH] fix(cli): resolve repo-wide tsc --noEmit type errors (#512) Co-authored-by: Claude Opus 4.6 (1M context) --- bun.lock | 4 ++- package.json | 1 + src/commands/convert.ts | 4 +-- src/commands/install.ts | 4 +-- src/converters/claude-to-opencode.ts | 10 +++--- src/targets/index.ts | 48 +++++++++++----------------- 6 files changed, 32 insertions(+), 39 deletions(-) diff --git a/bun.lock b/bun.lock index 02ca117..30e2ea4 100644 --- a/bun.lock +++ b/bun.lock @@ -1,6 +1,5 @@ { "lockfileVersion": 1, - "configVersion": 0, "workspaces": { "": { "name": "compound-plugin", @@ -11,6 +10,7 @@ "devDependencies": { "@semantic-release/changelog": "^6.0.3", "@semantic-release/git": "^10.0.1", + "@types/js-yaml": "^4.0.9", "bun-types": "^1.0.0", "semantic-release": "^25.0.3", }, @@ -81,6 +81,8 @@ "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="], + "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], + "@types/node": ["@types/node@25.0.9", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw=="], "@types/normalize-package-data": ["@types/normalize-package-data@2.4.4", "", {}, "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA=="], diff --git a/package.json b/package.json index d007f8e..7e2efa4 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "devDependencies": { "@semantic-release/changelog": "^6.0.3", "@semantic-release/git": "^10.0.1", + "@types/js-yaml": "^4.0.9", "bun-types": "^1.0.0", "semantic-release": "^25.0.3" } diff --git a/src/commands/convert.ts b/src/commands/convert.ts index a616c5f..e317fa5 100644 --- a/src/commands/convert.ts +++ b/src/commands/convert.ts @@ -3,7 +3,7 @@ import os from "os" import path from "path" import { loadClaudePlugin } from "../parsers/claude" import { targets, validateScope } from "../targets" -import type { PermissionMode } from "../converters/claude-to-opencode" +import type { ClaudeToOpenCodeOptions, PermissionMode } from "../converters/claude-to-opencode" import { ensureCodexAgentsFile } from "../utils/codex-agents" import { expandHome, resolveTargetHome } from "../utils/resolve-home" import { resolveTargetOutputRoot } from "../utils/resolve-output" @@ -92,7 +92,7 @@ export default defineCommand({ const openclawHome = resolveTargetHome(args.openclawHome, path.join(os.homedir(), ".openclaw", "extensions")) const qwenHome = resolveTargetHome(args.qwenHome, path.join(os.homedir(), ".qwen", "extensions")) - const options = { + const options: ClaudeToOpenCodeOptions = { agentMode: String(args.agentMode) === "primary" ? "primary" : "subagent", inferTemperature: Boolean(args.inferTemperature), permissions: permissions as PermissionMode, diff --git a/src/commands/install.ts b/src/commands/install.ts index 89ba5dc..4fee800 100644 --- a/src/commands/install.ts +++ b/src/commands/install.ts @@ -6,7 +6,7 @@ import { fileURLToPath } from "url" import { loadClaudePlugin } from "../parsers/claude" import { targets, validateScope } from "../targets" import { pathExists } from "../utils/files" -import type { PermissionMode } from "../converters/claude-to-opencode" +import type { ClaudeToOpenCodeOptions, PermissionMode } from "../converters/claude-to-opencode" import { ensureCodexAgentsFile } from "../utils/codex-agents" import { expandHome, resolveTargetHome } from "../utils/resolve-home" import { resolveTargetOutputRoot } from "../utils/resolve-output" @@ -103,7 +103,7 @@ export default defineCommand({ const openclawHome = resolveTargetHome(args.openclawHome, path.join(os.homedir(), ".openclaw", "extensions")) const qwenHome = resolveTargetHome(args.qwenHome, path.join(os.homedir(), ".qwen", "extensions")) - const options = { + const options: ClaudeToOpenCodeOptions = { agentMode: String(args.agentMode) === "primary" ? "primary" : "subagent", inferTemperature: Boolean(args.inferTemperature), permissions: permissions as PermissionMode, diff --git a/src/converters/claude-to-opencode.ts b/src/converters/claude-to-opencode.ts index 8b15068..e8aa61a 100644 --- a/src/converters/claude-to-opencode.ts +++ b/src/converters/claude-to-opencode.ts @@ -350,7 +350,7 @@ function applyPermissions( } } - const permission: Record = {} + const permission: Record> = {} const tools: Record = {} for (const tool of sourceTools) { @@ -369,7 +369,7 @@ function applyPermissions( for (const pattern of toolPatterns) { patternPermission[pattern] = "allow" } - ;(permission as Record)[tool] = patternPermission + ;(permission)[tool] = patternPermission } else { permission[tool] = enabled.has(tool) ? "allow" : "deny" } @@ -383,7 +383,7 @@ function applyPermissions( for (const pattern of toolPatterns) { patternPermission[pattern] = "allow" } - ;(permission as Record)[tool] = patternPermission + ;(permission)[tool] = patternPermission } } @@ -399,8 +399,8 @@ function applyPermissions( for (const pattern of combined) { combinedPermission[pattern] = "allow" } - ;(permission as Record).edit = combinedPermission - ;(permission as Record).write = combinedPermission + ;(permission).edit = combinedPermission + ;(permission).write = combinedPermission } config.permission = permission diff --git a/src/targets/index.ts b/src/targets/index.ts index b1214d0..a50e7f2 100644 --- a/src/targets/index.ts +++ b/src/targets/index.ts @@ -1,14 +1,4 @@ import type { ClaudePlugin } from "../types/claude" -import type { OpenCodeBundle } from "../types/opencode" -import type { CodexBundle } from "../types/codex" -import type { DroidBundle } from "../types/droid" -import type { PiBundle } from "../types/pi" -import type { CopilotBundle } from "../types/copilot" -import type { GeminiBundle } from "../types/gemini" -import type { KiroBundle } from "../types/kiro" -import type { WindsurfBundle } from "../types/windsurf" -import type { OpenClawBundle } from "../types/openclaw" -import type { QwenBundle } from "../types/qwen" import { convertClaudeToOpenCode, type ClaudeToOpenCodeOptions } from "../converters/claude-to-opencode" import { convertClaudeToCodex } from "../converters/claude-to-codex" import { convertClaudeToDroid } from "../converters/claude-to-droid" @@ -72,62 +62,62 @@ export const targets: Record = { name: "opencode", implemented: true, convert: convertClaudeToOpenCode, - write: writeOpenCodeBundle, + write: writeOpenCodeBundle as TargetHandler["write"], }, codex: { name: "codex", implemented: true, - convert: convertClaudeToCodex as TargetHandler["convert"], - write: writeCodexBundle as TargetHandler["write"], + convert: convertClaudeToCodex as TargetHandler["convert"], + write: writeCodexBundle as TargetHandler["write"], }, droid: { name: "droid", implemented: true, - convert: convertClaudeToDroid as TargetHandler["convert"], - write: writeDroidBundle as TargetHandler["write"], + convert: convertClaudeToDroid as TargetHandler["convert"], + write: writeDroidBundle as TargetHandler["write"], }, pi: { name: "pi", implemented: true, - convert: convertClaudeToPi as TargetHandler["convert"], - write: writePiBundle as TargetHandler["write"], + convert: convertClaudeToPi as TargetHandler["convert"], + write: writePiBundle as TargetHandler["write"], }, copilot: { name: "copilot", implemented: true, - convert: convertClaudeToCopilot as TargetHandler["convert"], - write: writeCopilotBundle as TargetHandler["write"], + convert: convertClaudeToCopilot as TargetHandler["convert"], + write: writeCopilotBundle as TargetHandler["write"], }, gemini: { name: "gemini", implemented: true, - convert: convertClaudeToGemini as TargetHandler["convert"], - write: writeGeminiBundle as TargetHandler["write"], + convert: convertClaudeToGemini as TargetHandler["convert"], + write: writeGeminiBundle as TargetHandler["write"], }, kiro: { name: "kiro", implemented: true, - convert: convertClaudeToKiro as TargetHandler["convert"], - write: writeKiroBundle as TargetHandler["write"], + convert: convertClaudeToKiro as TargetHandler["convert"], + write: writeKiroBundle as TargetHandler["write"], }, windsurf: { name: "windsurf", implemented: true, defaultScope: "global", supportedScopes: ["global", "workspace"], - convert: convertClaudeToWindsurf as TargetHandler["convert"], - write: writeWindsurfBundle as TargetHandler["write"], + convert: convertClaudeToWindsurf as TargetHandler["convert"], + write: writeWindsurfBundle as TargetHandler["write"], }, openclaw: { name: "openclaw", implemented: true, - convert: convertClaudeToOpenClaw as TargetHandler["convert"], - write: writeOpenClawBundle as TargetHandler["write"], + convert: convertClaudeToOpenClaw as TargetHandler["convert"], + write: writeOpenClawBundle as TargetHandler["write"], }, qwen: { name: "qwen", implemented: true, - convert: convertClaudeToQwen as TargetHandler["convert"], - write: writeQwenBundle as TargetHandler["write"], + convert: convertClaudeToQwen as TargetHandler["convert"], + write: writeQwenBundle as TargetHandler["write"], }, }