feat(FN-1423): add promptOverrides to project settings

- Add promptOverrides configuration to project settings with null-as-delete semantics
- Add core prompt-key catalog with resolver primitives in packages/core/src/prompt-overrides.ts
- Export prompt key catalog, resolution functions, and settings merge helpers from @fusion/core
- Add parity tests for promptOverrides settings handling
- Add settings export/import coverage for promptOverrides
- Add settings export tests verifying promptOverrides round-trip
- Update settings reference documentation with promptOverrides section
- Add store methods for loading/exporting project settings with prompt overrides
This commit is contained in:
gsxdsm
2026-04-09 18:21:29 -07:00
parent 9b30cc323d
commit a9e8073d2a
9 changed files with 1167 additions and 0 deletions

View File

@@ -388,6 +388,105 @@ describe("settings-export", () => {
});
});
describe("promptOverrides export/import", () => {
it("should export promptOverrides when set", async () => {
await store.updateSettings({
promptOverrides: { "executor-welcome": "Custom welcome" },
});
const result = await exportSettings(store, { scope: "project" });
expect(result.project?.promptOverrides).toEqual({ "executor-welcome": "Custom welcome" });
});
it("should not export promptOverrides when not set", async () => {
const result = await exportSettings(store, { scope: "project" });
expect(result.project?.promptOverrides).toBeUndefined();
});
it("should import promptOverrides in merge mode", async () => {
const importData: SettingsExportData = {
version: 1,
exportedAt: new Date().toISOString(),
project: {
promptOverrides: { "executor-welcome": "Imported welcome" },
},
};
const result = await importSettings(store, importData, { scope: "project", merge: true });
expect(result.success).toBe(true);
expect(result.projectCount).toBe(1);
const settings = await store.getSettings();
expect(settings.promptOverrides).toEqual({ "executor-welcome": "Imported welcome" });
});
it("should merge promptOverrides with existing overrides", async () => {
// Set initial overrides
await store.updateSettings({
promptOverrides: { "executor-welcome": "Original" },
});
const importData: SettingsExportData = {
version: 1,
exportedAt: new Date().toISOString(),
project: {
promptOverrides: { "triage-welcome": "Imported triage" },
},
};
await importSettings(store, importData, { scope: "project", merge: true });
const settings = await store.getSettings();
expect(settings.promptOverrides).toEqual({
"executor-welcome": "Original",
"triage-welcome": "Imported triage",
});
});
it("should clear promptOverrides when importing null", async () => {
// Set initial overrides
await store.updateSettings({
promptOverrides: { "executor-welcome": "Original", "triage-welcome": "Triage" },
});
const importData: SettingsExportData = {
version: 1,
exportedAt: new Date().toISOString(),
project: {
promptOverrides: null as any,
},
};
await importSettings(store, importData, { scope: "project", merge: true });
const settings = await store.getSettings();
expect(settings.promptOverrides).toBeUndefined();
});
it("should clear specific promptOverride key when importing null value", async () => {
// Set initial overrides
await store.updateSettings({
promptOverrides: { "executor-welcome": "Original", "triage-welcome": "Triage" },
});
const importData: SettingsExportData = {
version: 1,
exportedAt: new Date().toISOString(),
project: {
promptOverrides: { "executor-welcome": null as unknown as string },
},
};
await importSettings(store, importData, { scope: "project", merge: true });
const settings = await store.getSettings();
expect(settings.promptOverrides).toEqual({ "triage-welcome": "Triage" });
});
});
describe("readExportFile", () => {
it("should read and parse valid export file", async () => {
const filePath = join(env.tempDir, "test-export.json");