fix(utils): save config (#578)
## Description When `saveConfig` is called, the project doc is incorrectly saved into user instructions. This change ensures that only user instructions are saved to `instructions.md` during saveConfig, preventing data corruption. close: #576 --------- Co-authored-by: Thibault Sottiaux <tibo@openai.com>
This commit is contained in:
@@ -157,6 +157,7 @@ export const PRETTY_PRINT = Boolean(process.env["PRETTY_PRINT"] || "");
|
|||||||
export const PROJECT_DOC_MAX_BYTES = 32 * 1024; // 32 kB
|
export const PROJECT_DOC_MAX_BYTES = 32 * 1024; // 32 kB
|
||||||
|
|
||||||
const PROJECT_DOC_FILENAMES = ["codex.md", ".codex.md", "CODEX.md"];
|
const PROJECT_DOC_FILENAMES = ["codex.md", ".codex.md", "CODEX.md"];
|
||||||
|
const PROJECT_DOC_SEPARATOR = "\n\n--- project-doc ---\n\n";
|
||||||
|
|
||||||
export function discoverProjectDocPath(startDir: string): string | null {
|
export function discoverProjectDocPath(startDir: string): string | null {
|
||||||
const cwd = resolvePath(startDir);
|
const cwd = resolvePath(startDir);
|
||||||
@@ -311,7 +312,7 @@ export const loadConfig = (
|
|||||||
|
|
||||||
const combinedInstructions = [userInstructions, projectDoc]
|
const combinedInstructions = [userInstructions, projectDoc]
|
||||||
.filter((s) => s && s.trim() !== "")
|
.filter((s) => s && s.trim() !== "")
|
||||||
.join("\n\n--- project-doc ---\n\n");
|
.join(PROJECT_DOC_SEPARATOR);
|
||||||
|
|
||||||
// Treat empty string ("" or whitespace) as absence so we can fall back to
|
// Treat empty string ("" or whitespace) as absence so we can fall back to
|
||||||
// the latest DEFAULT_MODEL.
|
// the latest DEFAULT_MODEL.
|
||||||
@@ -462,5 +463,9 @@ export const saveConfig = (
|
|||||||
writeFileSync(targetPath, JSON.stringify(configToSave, null, 2), "utf-8");
|
writeFileSync(targetPath, JSON.stringify(configToSave, null, 2), "utf-8");
|
||||||
}
|
}
|
||||||
|
|
||||||
writeFileSync(instructionsPath, config.instructions, "utf-8");
|
// Take everything before the first PROJECT_DOC_SEPARATOR (or the whole string if none).
|
||||||
|
const [userInstructions = ""] = config.instructions.split(
|
||||||
|
PROJECT_DOC_SEPARATOR,
|
||||||
|
);
|
||||||
|
writeFileSync(instructionsPath, userInstructions, "utf-8");
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -234,3 +234,44 @@ test("loads and saves providers correctly", () => {
|
|||||||
expect(mergedConfig.providers["openai"]).toBeDefined();
|
expect(mergedConfig.providers["openai"]).toBeDefined();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("saves and loads instructions with project doc separator correctly", () => {
|
||||||
|
const userInstructions = "user specific instructions";
|
||||||
|
const projectDoc = "project specific documentation";
|
||||||
|
const combinedInstructions = `${userInstructions}\n\n--- project-doc ---\n\n${projectDoc}`;
|
||||||
|
|
||||||
|
const testConfig = {
|
||||||
|
model: "test-model",
|
||||||
|
instructions: combinedInstructions,
|
||||||
|
notify: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
saveConfig(testConfig, testConfigPath, testInstructionsPath);
|
||||||
|
|
||||||
|
expect(memfs[testInstructionsPath]).toBe(userInstructions);
|
||||||
|
|
||||||
|
const loadedConfig = loadConfig(testConfigPath, testInstructionsPath, {
|
||||||
|
disableProjectDoc: true,
|
||||||
|
});
|
||||||
|
expect(loadedConfig.instructions).toBe(userInstructions);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("handles empty user instructions when saving with project doc separator", () => {
|
||||||
|
const projectDoc = "project specific documentation";
|
||||||
|
const combinedInstructions = `\n\n--- project-doc ---\n\n${projectDoc}`;
|
||||||
|
|
||||||
|
const testConfig = {
|
||||||
|
model: "test-model",
|
||||||
|
instructions: combinedInstructions,
|
||||||
|
notify: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
saveConfig(testConfig, testConfigPath, testInstructionsPath);
|
||||||
|
|
||||||
|
expect(memfs[testInstructionsPath]).toBe("");
|
||||||
|
|
||||||
|
const loadedConfig = loadConfig(testConfigPath, testInstructionsPath, {
|
||||||
|
disableProjectDoc: true,
|
||||||
|
});
|
||||||
|
expect(loadedConfig.instructions).toBe("");
|
||||||
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user