From cab4eafc0f6b3fb1dbfa316f5e3a49a3c1a4471c Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Mon, 18 May 2026 18:50:43 +0900 Subject: [PATCH] fix(comment-checker): resolve packaged 0.8 binary --- bun.lock | 32 ++++++++++++------------ package.json | 2 +- src/cli/doctor/checks/dependencies.ts | 36 +++++++++++++++++++++++++++ src/hooks/comment-checker/cli.ts | 33 ++++++++++++++++++++++++ 4 files changed, 86 insertions(+), 17 deletions(-) diff --git a/bun.lock b/bun.lock index 30355f0a2..d49a09bf5 100644 --- a/bun.lock +++ b/bun.lock @@ -8,7 +8,7 @@ "@ast-grep/cli": "^0.40.0", "@ast-grep/napi": "^0.40.0", "@clack/prompts": "^0.11.0", - "@code-yeongyu/comment-checker": "^0.6.1", + "@code-yeongyu/comment-checker": "^0.8.0", "@modelcontextprotocol/sdk": "^1.25.1", "@opencode-ai/plugin": "^1.1.19", "@opencode-ai/sdk": "^1.1.19", @@ -27,13 +27,13 @@ "typescript": "^5.7.3", }, "optionalDependencies": { - "oh-my-opencode-darwin-arm64": "3.0.0", - "oh-my-opencode-darwin-x64": "3.0.0", - "oh-my-opencode-linux-arm64": "3.0.0", - "oh-my-opencode-linux-arm64-musl": "3.0.0", - "oh-my-opencode-linux-x64": "3.0.0", - "oh-my-opencode-linux-x64-musl": "3.0.0", - "oh-my-opencode-windows-x64": "3.0.0", + "oh-my-opencode-darwin-arm64": "3.0.1", + "oh-my-opencode-darwin-x64": "3.0.1", + "oh-my-opencode-linux-arm64": "3.0.1", + "oh-my-opencode-linux-arm64-musl": "3.0.1", + "oh-my-opencode-linux-x64": "3.0.1", + "oh-my-opencode-linux-x64-musl": "3.0.1", + "oh-my-opencode-windows-x64": "3.0.1", }, }, }, @@ -83,7 +83,7 @@ "@clack/prompts": ["@clack/prompts@0.11.0", "", { "dependencies": { "@clack/core": "0.5.0", "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw=="], - "@code-yeongyu/comment-checker": ["@code-yeongyu/comment-checker@0.6.1", "", { "os": [ "linux", "win32", "darwin", ], "cpu": [ "x64", "arm64", ], "bin": { "comment-checker": "bin/comment-checker" } }, "sha512-BBremX+Y5aW8sTzlhHrLsKParupYkPOVUYmq9STrlWvBvfAme6w5IWuZCLl6nHIQScRDdvGdrAjPycJC86EZFA=="], + "@code-yeongyu/comment-checker": ["@code-yeongyu/comment-checker@0.8.0", "", { "bin": { "comment-checker": "cli.js" } }, "sha512-Ret0qHtgDhEemQYNduqSyaihFWJSOKae4YW3sUHS680G8K57CsRUkK6Gs4kbzDuWqiNUYs254+qu5hZZZSEKUA=="], "@hono/node-server": ["@hono/node-server@1.19.7", "", { "peerDependencies": { "hono": "^4" } }, "sha512-vUcD0uauS7EU2caukW8z5lJKtoGMokxNbJtBiwHgpqxEXokaHCBkQUmCHhjFB1VUTWdqj25QoMkMKzgjq+uhrw=="], @@ -225,19 +225,19 @@ "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], - "oh-my-opencode-darwin-arm64": ["oh-my-opencode-darwin-arm64@3.0.0", "", { "os": "darwin", "cpu": "arm64", "bin": { "oh-my-opencode": "bin/oh-my-opencode" } }, "sha512-zelvb7qz5GsS+Dhyz9rACZrkUMtWbAZGijiHSQqmRcjlN/sRPNhXtsL55VheDjlPM3VP+t3+psv+se0WA/aw5w=="], + "oh-my-opencode-darwin-arm64": ["oh-my-opencode-darwin-arm64@3.0.1", "", { "os": "darwin", "cpu": "arm64", "bin": { "oh-my-opencode": "bin/oh-my-opencode" } }, "sha512-LRcLVi6DsmGh3ICFeN4yVJ0KinvCM5jotd2z7tZQ74n0sziHO7grjK1CmJaPV9eCv0clatoK5xfFCeEJ3FvXYg=="], - "oh-my-opencode-darwin-x64": ["oh-my-opencode-darwin-x64@3.0.0", "", { "os": "darwin", "cpu": "x64", "bin": { "oh-my-opencode": "bin/oh-my-opencode" } }, "sha512-dRMD1U5zIrb6BsiKQJZtAFtuD8clAQquZyU2LajMoFTHBNhcBDIgsaBBwvMBIq7dTe8rnFq91ExiFA8OfdrzBA=="], + "oh-my-opencode-darwin-x64": ["oh-my-opencode-darwin-x64@3.0.1", "", { "os": "darwin", "cpu": "x64", "bin": { "oh-my-opencode": "bin/oh-my-opencode" } }, "sha512-ZaC0ZBe5M2f2aMncNsAMu9IZ3MjSPfNVcfUTCgJkp03db8lLPsajgjeG3556Er72hxignDPsEbrLkJBNlsDbAA=="], - "oh-my-opencode-linux-arm64": ["oh-my-opencode-linux-arm64@3.0.0", "", { "os": "linux", "cpu": "arm64", "bin": { "oh-my-opencode": "bin/oh-my-opencode" } }, "sha512-Wx6Cx2Nu2T69mfZa3FQ3gk0OFONvMh48rMVYK0Cp8VX5W4Zb/GZgTUFmZlYsApyxqP+7J9m18skd46qPOhzuEQ=="], + "oh-my-opencode-linux-arm64": ["oh-my-opencode-linux-arm64@3.0.1", "", { "os": "linux", "cpu": "arm64", "bin": { "oh-my-opencode": "bin/oh-my-opencode" } }, "sha512-pcOvV6Y2GSwKr0exDndeB2BtFt297XhJFQgrq1cbeEJawoRONDRp7LNSpjwILSQpQ7YkkYnO2bIczBmxI5llNA=="], - "oh-my-opencode-linux-arm64-musl": ["oh-my-opencode-linux-arm64-musl@3.0.0", "", { "os": "linux", "cpu": "arm64", "bin": { "oh-my-opencode": "bin/oh-my-opencode" } }, "sha512-mfOlptgLoXLVuhFRcXgZU7BYGuL1axZOMOOjONgncNzOp/BQYU5B9BRFihBUXdDsWGmeMiLowrYGBhVpSv3NlA=="], + "oh-my-opencode-linux-arm64-musl": ["oh-my-opencode-linux-arm64-musl@3.0.1", "", { "os": "linux", "cpu": "arm64", "bin": { "oh-my-opencode": "bin/oh-my-opencode" } }, "sha512-7kXKaVbgFnOMSaw+j4JbZNs7O7mkvCekcfWPwh/9I/0WD21/n4PbAGl01ePhRoQh+u9MC6t8FH046hEjL2sk1g=="], - "oh-my-opencode-linux-x64": ["oh-my-opencode-linux-x64@3.0.0", "", { "os": "linux", "cpu": "x64", "bin": { "oh-my-opencode": "bin/oh-my-opencode" } }, "sha512-vVjshfaz0UC9NrGD9FfjlYK5NvckIW0sZaE/wRv/LKjrukHFH1jJpJa5KKXxBWLsEJjt6ooJRguXXxtfNXpAWw=="], + "oh-my-opencode-linux-x64": ["oh-my-opencode-linux-x64@3.0.1", "", { "os": "linux", "cpu": "x64", "bin": { "oh-my-opencode": "bin/oh-my-opencode" } }, "sha512-1BOV1EnKa5BErhZmWiddnbriHwm1KFrPr+0BUCDdFX/d/hrMAJTo1733zaEnvKuXzvrdHSp/VznXheeUI1VjkA=="], - "oh-my-opencode-linux-x64-musl": ["oh-my-opencode-linux-x64-musl@3.0.0", "", { "os": "linux", "cpu": "x64", "bin": { "oh-my-opencode": "bin/oh-my-opencode" } }, "sha512-N6cNJ7+Dj0a5dWqPf6OKfB39o8HWw5HQ3hB4omgYqc6Gzo6nChA4KIiVefEC3+tIL98x4XvMeD7OU+UYgwxHnQ=="], + "oh-my-opencode-linux-x64-musl": ["oh-my-opencode-linux-x64-musl@3.0.1", "", { "os": "linux", "cpu": "x64", "bin": { "oh-my-opencode": "bin/oh-my-opencode" } }, "sha512-ASyTVatvU1nNJ0mk9o+A/GjybT5vOdgU172ystzCsnQ+12Mnv68GgaeMu/UFJgJNaZmKdhyUAP9XhnOKvEDBGQ=="], - "oh-my-opencode-windows-x64": ["oh-my-opencode-windows-x64@3.0.0", "", { "os": "win32", "cpu": "x64", "bin": { "oh-my-opencode": "bin/oh-my-opencode.exe" } }, "sha512-TaC0hiHpnsS42GWTVUKoTwCb+QzNLBlQtTkIQ0PjlkDYFjlEC2LuR2FFcscik055PRRIGishyB9A1n/8XAgcvA=="], + "oh-my-opencode-windows-x64": ["oh-my-opencode-windows-x64@3.0.1", "", { "os": "win32", "cpu": "x64", "bin": { "oh-my-opencode": "bin/oh-my-opencode.exe" } }, "sha512-QIuA564mVpwzCprhhAoyd8TSw0Rt2VM6M9y7H0fOoC/UjXuU+d7wIuUNuqUUMVaUnMedkctTZop0X0i2Q+Bvhg=="], "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], diff --git a/package.json b/package.json index fc4afd9ba..215d192f7 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "@ast-grep/cli": "^0.40.0", "@ast-grep/napi": "^0.40.0", "@clack/prompts": "^0.11.0", - "@code-yeongyu/comment-checker": "^0.6.1", + "@code-yeongyu/comment-checker": "^0.8.0", "@modelcontextprotocol/sdk": "^1.25.1", "@opencode-ai/plugin": "^1.1.19", "@opencode-ai/sdk": "^1.1.19", diff --git a/src/cli/doctor/checks/dependencies.ts b/src/cli/doctor/checks/dependencies.ts index 09a476bcc..bd5ba9594 100644 --- a/src/cli/doctor/checks/dependencies.ts +++ b/src/cli/doctor/checks/dependencies.ts @@ -1,5 +1,7 @@ import type { CheckResult, CheckDefinition, DependencyInfo } from "../types" import { CHECK_IDS, CHECK_NAMES } from "../constants" +import { createRequire } from "module" +import { existsSync } from "fs" async function checkBinaryExists(binary: string): Promise<{ exists: boolean; path: string | null }> { try { @@ -102,6 +104,18 @@ export async function checkAstGrepNapi(): Promise { } export async function checkCommentChecker(): Promise { + const packagePath = checkCommentCheckerPackage() + if (packagePath) { + const version = await getBinaryVersion(packagePath) + return { + name: "Comment Checker", + required: false, + installed: true, + version, + path: packagePath, + } + } + const binaryCheck = await checkBinaryExists("comment-checker") if (!binaryCheck.exists) { @@ -126,6 +140,28 @@ export async function checkCommentChecker(): Promise { } } +function checkCommentCheckerPackage(): string | null { + try { + const require = createRequire(import.meta.url) + const packageExports: unknown = require("@code-yeongyu/comment-checker") + if (!isCommentCheckerPackage(packageExports)) { + return null + } + + const binaryPath = packageExports.getBinaryPath() + return existsSync(binaryPath) ? binaryPath : null + } catch { + return null + } +} + +function isCommentCheckerPackage(value: unknown): value is { getBinaryPath: () => string } { + if (typeof value !== "object" || value === null) { + return false + } + return typeof Object.getOwnPropertyDescriptor(value, "getBinaryPath")?.value === "function" +} + function dependencyToCheckResult(dep: DependencyInfo, checkName: string): CheckResult { if (dep.installed) { return { diff --git a/src/hooks/comment-checker/cli.ts b/src/hooks/comment-checker/cli.ts index 5ec5d4d9f..8541affc6 100644 --- a/src/hooks/comment-checker/cli.ts +++ b/src/hooks/comment-checker/cli.ts @@ -30,6 +30,12 @@ function findCommentCheckerPathSync(): string | null { return cachedPath } + const packageApiPath = findPackageApiBinary() + if (packageApiPath) { + debugLog("found binary from package API:", packageApiPath) + return packageApiPath + } + // Guard against undefined import.meta.url (can happen on Windows during plugin loading) if (!import.meta.url) { debugLog("import.meta.url is undefined, skipping package resolution") @@ -54,6 +60,33 @@ function findCommentCheckerPathSync(): string | null { return null } +function findPackageApiBinary(): string | null { + if (!import.meta.url) { + return null + } + + try { + const require = createRequire(import.meta.url) + const packageExports: unknown = require("@code-yeongyu/comment-checker") + if (!isCommentCheckerPackage(packageExports)) { + return null + } + + const binaryPath = packageExports.getBinaryPath() + return existsSync(binaryPath) ? binaryPath : null + } catch (err) { + debugLog("package API binary resolution failed:", err) + return null + } +} + +function isCommentCheckerPackage(value: unknown): value is { getBinaryPath: () => string } { + if (typeof value !== "object" || value === null) { + return false + } + return typeof Object.getOwnPropertyDescriptor(value, "getBinaryPath")?.value === "function" +} + // Cached resolved path let resolvedCliPath: string | null = null let initPromise: Promise | null = null