From fc08267cdab427ebc23e239030c1b06283b8cc54 Mon Sep 17 00:00:00 2001 From: sunteya Date: Thu, 5 Feb 2026 19:35:15 +0800 Subject: [PATCH] feat(config): support comments in JSON configuration files --- bun.lock | 3 +++ package.json | 1 + src/config-loader.ts | 7 ++++--- src/hooks/fragment-injector.ts | 3 ++- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/bun.lock b/bun.lock index bb3032b..349074b 100644 --- a/bun.lock +++ b/bun.lock @@ -7,6 +7,7 @@ "dependencies": { "@opencode-ai/plugin": "1.1.23", "bun-pty": "^0.4.5", + "jsonc-parser": "^3.2.1", "valibot": "^1.2.0", "yaml": "^2.8.2", }, @@ -47,6 +48,8 @@ "bun-types": ["bun-types@1.3.5", "", { "dependencies": { "@types/node": "*" } }, "sha512-inmAYe2PFLs0SUbFOWSVD24sg1jFlMPxOjOSSCYqUgn4Hsc3rDc7dFvfVYjFPNHtov6kgUeulV4SxbuIV/stPw=="], + "jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="], + "lefthook": ["lefthook@2.0.15", "", { "optionalDependencies": { "lefthook-darwin-arm64": "2.0.15", "lefthook-darwin-x64": "2.0.15", "lefthook-freebsd-arm64": "2.0.15", "lefthook-freebsd-x64": "2.0.15", "lefthook-linux-arm64": "2.0.15", "lefthook-linux-x64": "2.0.15", "lefthook-openbsd-arm64": "2.0.15", "lefthook-openbsd-x64": "2.0.15", "lefthook-windows-arm64": "2.0.15", "lefthook-windows-x64": "2.0.15" }, "bin": { "lefthook": "bin/index.js" } }, "sha512-sl5rePO6UUOLKp6Ci+MMKOc86zicBaPUCvSw2Cq4gCAgTmxpxhIjhz7LOu2ObYerVRPpTq3gvzPTjI71UotjnA=="], "lefthook-darwin-arm64": ["lefthook-darwin-arm64@2.0.15", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ygAqG/NzOgY9bEiqeQtiOmCRTtp9AmOd3eyrpEaSrRB9V9f3RHRgWDrWbde9BiHSsCzcbeY9/X2NuKZ69eUsNA=="], diff --git a/package.json b/package.json index ee5d18b..4b19fe0 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "dependencies": { "@opencode-ai/plugin": "1.1.23", "bun-pty": "^0.4.5", + "jsonc-parser": "^3.2.1", "valibot": "^1.2.0", "yaml": "^2.8.2" }, diff --git a/src/config-loader.ts b/src/config-loader.ts index 6129782..4c3cfef 100644 --- a/src/config-loader.ts +++ b/src/config-loader.ts @@ -5,6 +5,7 @@ import { homedir } from "node:os"; import { join } from "node:path"; import type { AgentConfig } from "@opencode-ai/sdk"; +import Jsonc from "jsonc-parser"; // Minimal type for provider validation - only what we need export interface ProviderInfo { @@ -30,7 +31,7 @@ function loadOpencodeConfig(configDir?: string): OpencodeConfig | null { try { const configPath = join(baseDir, "opencode.json"); const content = readFileSync(configPath, "utf-8"); - return JSON.parse(content) as OpencodeConfig; + return Jsonc.parse(content) as OpencodeConfig; } catch { return null; } @@ -100,7 +101,7 @@ export async function loadMicodeConfig(configDir?: string): Promise; + const parsed = Jsonc.parse(content) as Record; const result: MicodeConfig = {}; @@ -176,7 +177,7 @@ export function loadModelContextLimits(configDir?: string): Map try { const configPath = join(baseDir, "opencode.json"); const content = readFileSync(configPath, "utf-8"); - const config = JSON.parse(content) as { + const config = Jsonc.parse(content) as { provider?: Record }>; }; diff --git a/src/hooks/fragment-injector.ts b/src/hooks/fragment-injector.ts index 698af57..2757cb4 100644 --- a/src/hooks/fragment-injector.ts +++ b/src/hooks/fragment-injector.ts @@ -3,6 +3,7 @@ import { readFile } from "node:fs/promises"; import { join } from "node:path"; import type { PluginInput } from "@opencode-ai/plugin"; +import Jsonc from "jsonc-parser"; import type { MicodeConfig } from "../config-loader"; @@ -15,7 +16,7 @@ export async function loadProjectFragments(projectDir: string): Promise; + const parsed = Jsonc.parse(content) as Record; const fragments: Record = {};