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); +}