From 9b0264f68769e2d5a46a1acaf78b6358315e0ae4 Mon Sep 17 00:00:00 2001 From: GRayHook Date: Wed, 17 Jun 2026 10:12:04 +0700 Subject: [PATCH] =?UTF-8?q?Phase=202:=20add=20writeGlobalSettings=20?= =?UTF-8?q?=E2=80=94=20merge=20into=20global=20settings.json.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Preserves unrelated keys in ~/.pi/agent/settings.json when persisting /skill-reinject global on|off and other skillReinject fields. Co-authored-by: Cursor --- src/settings.ts | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/settings.ts b/src/settings.ts index bb2a71d..a186c72 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -1,5 +1,7 @@ import type { ExtensionContext } from "@earendil-works/pi-coding-agent"; import { SettingsManager, getAgentDir } from "@earendil-works/pi-coding-agent"; +import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs"; +import { dirname, join } from "path"; import type { AutoCompactIntegration } from "./state"; /** JSON key in global/project settings.json (SPEC §7.3). */ @@ -101,3 +103,35 @@ export function readSettings(ctx: ExtensionContext): SkillReinjectSettings { extractSkillReinject(manager.getProjectSettings()), ); } + +function readSettingsFile(settingsPath: string): Record { + if (!existsSync(settingsPath)) { + return {}; + } + try { + const parsed: unknown = JSON.parse(readFileSync(settingsPath, "utf8")); + if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) { + return {}; + } + return parsed as Record; + } catch { + return {}; + } +} + +/** Merge skillReinject into a settings.json file without replacing unrelated keys (SPEC §7.3). */ +export function mergeSkillReinjectIntoSettingsFile( + settingsPath: string, + partial: PartialSkillReinjectSettings, +): void { + const current = readSettingsFile(settingsPath); + const existing = parseSkillReinjectPartial(current[SKILL_REINJECT_SETTINGS_KEY]); + current[SKILL_REINJECT_SETTINGS_KEY] = { ...existing, ...partial }; + mkdirSync(dirname(settingsPath), { recursive: true }); + writeFileSync(settingsPath, `${JSON.stringify(current, null, 2)}\n`, "utf8"); +} + +/** Persist partial skillReinject settings to global ~/.pi/agent/settings.json (SPEC §7.3). */ +export function writeGlobalSettings(partial: PartialSkillReinjectSettings): void { + mergeSkillReinjectIntoSettingsFile(join(getAgentDir(), "settings.json"), partial); +}