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:
@@ -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);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user