Phase 2: add writeGlobalSettings — merge into global settings.json.

Preserves unrelated keys in ~/.pi/agent/settings.json when persisting
/skill-reinject global on|off and other skillReinject fields.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-17 10:12:04 +07:00
parent d8abd46f90
commit 9b0264f687
+34
View File
@@ -1,5 +1,7 @@
import type { ExtensionContext } from "@earendil-works/pi-coding-agent"; import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
import { SettingsManager, getAgentDir } 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"; import type { AutoCompactIntegration } from "./state";
/** JSON key in global/project settings.json (SPEC §7.3). */ /** JSON key in global/project settings.json (SPEC §7.3). */
@@ -101,3 +103,35 @@ export function readSettings(ctx: ExtensionContext): SkillReinjectSettings {
extractSkillReinject(manager.getProjectSettings()), extractSkillReinject(manager.getProjectSettings()),
); );
} }
function readSettingsFile(settingsPath: string): Record<string, unknown> {
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<string, unknown>;
} 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);
}