codex-config 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 codex-config contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,40 @@
1
+ # codex-config
2
+
3
+ Apply a `config.toml.template` to `~/.codex/config.toml` without taking over the whole file.
4
+
5
+ By default, `codex-config` only adds template options that are missing. Existing options stay unchanged, and unrelated tables such as `[mcp_servers.*]`, `[model_providers.*]`, `[notice]`, and `[projects.*]` are preserved.
6
+
7
+ Use `--override-all` to reset template-covered options to the template values.
8
+
9
+ ## Run
10
+
11
+ ```bash
12
+ npx codex-config apply
13
+ ```
14
+
15
+ ## Usage
16
+
17
+ ```bash
18
+ npx codex-config apply
19
+ npx codex-config apply --dry-run
20
+ npx codex-config apply --override-all
21
+ npx codex-config diff
22
+ npx codex-config check
23
+ npx codex-config doctor
24
+ ```
25
+
26
+ Optional global install:
27
+
28
+ ```bash
29
+ npm install -g codex-config
30
+ codex-config apply
31
+ ```
32
+
33
+ Options:
34
+
35
+ - `--target PATH`: target config path, default `~/.codex/config.toml`
36
+ - `--template PATH`: template path, default bundled template
37
+ - `--override-all`: overwrite template-covered keys
38
+ - `--json`: print JSON output
39
+
40
+ One-shot vibe coded by Codex.
@@ -0,0 +1,32 @@
1
+ approval_policy = "never"
2
+ sandbox_mode = "danger-full-access"
3
+ model_reasoning_effort = "high"
4
+ plan_mode_reasoning_effort = "high"
5
+ web_search = "live"
6
+ model = "gpt-5.5"
7
+ #model_context_window = 1050000
8
+ personality = "friendly"
9
+ # model_reasoning_summary options: "auto", "concise", "detailed", "none"
10
+ model_reasoning_summary = "concise"
11
+ service_tier = "fast"
12
+ suppress_unstable_features_warning = true
13
+
14
+ [analytics]
15
+ enabled = false
16
+
17
+ [features]
18
+ multi_agent = true
19
+ image_detail_original = true
20
+ memories = true
21
+ terminal_resize_reflow = true
22
+ goals = true
23
+
24
+ [tui]
25
+ alternate_screen = "never"
26
+ status_line = ["model-with-reasoning", "project-name", "context-used", "weekly-limit", "fast-mode", "five-hour-limit"]
27
+ terminal_title = ["spinner", "project", "status", "task-progress"]
28
+
29
+ [memories]
30
+ use_memories = true
31
+ generate_memories = true
32
+
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,102 @@
1
+ #!/usr/bin/env node
2
+ import { program } from "commander";
3
+ import { applyConfig, diffConfig, doctor, formatDoctorText, formatTextResult, } from "./commands.js";
4
+ let jsonMode = false;
5
+ program
6
+ .name("codex-config")
7
+ .description("Idempotently apply config.toml.template to ~/.codex/config.toml.")
8
+ .version("0.1.0")
9
+ .option("--json", "print machine-readable JSON");
10
+ program
11
+ .command("apply")
12
+ .description("Apply the template to the target config.")
13
+ .option("--target <path>", "target config.toml path")
14
+ .option("--template <path>", "template config.toml path")
15
+ .option("--override-all", "overwrite template-covered keys that already exist")
16
+ .option("--dry-run", "show planned changes without writing")
17
+ .option("--json", "print machine-readable JSON")
18
+ .action(async (options) => {
19
+ jsonMode = shouldUseJson(options);
20
+ const result = await applyConfig(options);
21
+ writeResult(jsonMode, result, formatTextResult("apply", result));
22
+ });
23
+ program
24
+ .command("diff")
25
+ .description("Show whether applying the template would change the target.")
26
+ .option("--target <path>", "target config.toml path")
27
+ .option("--template <path>", "template config.toml path")
28
+ .option("--override-all", "compare using override-all behavior")
29
+ .option("--json", "print machine-readable JSON")
30
+ .action(async (options) => {
31
+ jsonMode = shouldUseJson(options);
32
+ const result = await diffConfig(options);
33
+ writeResult(jsonMode, result, formatTextResult("diff", result));
34
+ });
35
+ program
36
+ .command("check")
37
+ .description("Exit nonzero when the target is not up to date with the template.")
38
+ .option("--target <path>", "target config.toml path")
39
+ .option("--template <path>", "template config.toml path")
40
+ .option("--override-all", "check using override-all behavior")
41
+ .option("--json", "print machine-readable JSON")
42
+ .action(async (options) => {
43
+ jsonMode = shouldUseJson(options);
44
+ const result = await diffConfig(options);
45
+ writeResult(jsonMode, result, formatTextResult("check", result));
46
+ if (result.changed) {
47
+ process.exitCode = 1;
48
+ }
49
+ });
50
+ program
51
+ .command("doctor")
52
+ .description("Validate default paths and TOML parser readiness.")
53
+ .option("--target <path>", "target config.toml path")
54
+ .option("--template <path>", "template config.toml path")
55
+ .option("--json", "print machine-readable JSON")
56
+ .action(async (options) => {
57
+ jsonMode = shouldUseJson(options);
58
+ const result = await doctor(options);
59
+ writeResult(jsonMode, result, formatDoctorText(result));
60
+ if (!result.ok) {
61
+ process.exitCode = 1;
62
+ }
63
+ });
64
+ program.exitOverride();
65
+ try {
66
+ await program.parseAsync();
67
+ }
68
+ catch (error) {
69
+ if (isCommanderHelpOrVersion(error)) {
70
+ process.exitCode = 0;
71
+ }
72
+ else {
73
+ printError(error, jsonMode);
74
+ process.exitCode = 1;
75
+ }
76
+ }
77
+ function writeResult(json, value, text) {
78
+ if (json) {
79
+ process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
80
+ return;
81
+ }
82
+ process.stdout.write(text);
83
+ }
84
+ function printError(error, json) {
85
+ const message = error instanceof Error ? error.message : String(error);
86
+ if (json) {
87
+ process.stderr.write(`${JSON.stringify({ ok: false, error: { message } }, null, 2)}\n`);
88
+ return;
89
+ }
90
+ process.stderr.write(`error: ${message}\n`);
91
+ }
92
+ function shouldUseJson(options) {
93
+ return Boolean(options.json || program.opts().json);
94
+ }
95
+ function isCommanderHelpOrVersion(error) {
96
+ if (typeof error !== "object" || error === null || !("code" in error)) {
97
+ return false;
98
+ }
99
+ const code = error.code;
100
+ return code === "commander.helpDisplayed" || code === "commander.version";
101
+ }
102
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { type ChangeOperation, type MergeMode } from "./toml-merge.js";
2
+ export interface CommandOptions {
3
+ target?: string;
4
+ template?: string;
5
+ overrideAll?: boolean;
6
+ }
7
+ export interface ApplyOptions extends CommandOptions {
8
+ dryRun?: boolean;
9
+ }
10
+ export interface CommandResult {
11
+ ok: true;
12
+ changed: boolean;
13
+ target: string;
14
+ template: string;
15
+ mode: MergeMode;
16
+ operations: ChangeOperation[];
17
+ dryRun?: boolean;
18
+ }
19
+ export interface DoctorResult {
20
+ ok: boolean;
21
+ target: {
22
+ path: string;
23
+ exists: boolean;
24
+ validToml: boolean | null;
25
+ };
26
+ template: {
27
+ path: string;
28
+ exists: boolean;
29
+ validToml: boolean;
30
+ };
31
+ authRequired: false;
32
+ }
33
+ export declare function applyConfig(options: ApplyOptions): Promise<CommandResult>;
34
+ export declare function diffConfig(options: CommandOptions): Promise<CommandResult>;
35
+ export declare function doctor(options: CommandOptions): Promise<DoctorResult>;
36
+ export declare function formatTextResult(command: "apply" | "diff" | "check", result: CommandResult): string;
37
+ export declare function formatDoctorText(result: DoctorResult): string;
38
+ export declare function targetDirectory(options: CommandOptions): string;
@@ -0,0 +1,116 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { dirname, resolve } from "node:path";
3
+ import { atomicWriteFile, fileExists, readTextIfExists } from "./fs.js";
4
+ import { defaultTargetPath, defaultTemplatePath } from "./paths.js";
5
+ import { planConfigChange, validateToml } from "./toml-merge.js";
6
+ export async function applyConfig(options) {
7
+ const paths = resolvePaths(options);
8
+ const mode = modeFromOptions(options);
9
+ const templateText = await readFile(paths.template, "utf8");
10
+ const targetText = await readTextIfExists(paths.target);
11
+ const plan = planConfigChange({ targetText, templateText, mode, targetPath: paths.target });
12
+ if (plan.changed && !options.dryRun) {
13
+ await atomicWriteFile(paths.target, plan.outputText);
14
+ }
15
+ return {
16
+ ok: true,
17
+ changed: plan.changed,
18
+ target: paths.target,
19
+ template: paths.template,
20
+ mode,
21
+ operations: plan.operations,
22
+ dryRun: options.dryRun,
23
+ };
24
+ }
25
+ export async function diffConfig(options) {
26
+ const paths = resolvePaths(options);
27
+ const mode = modeFromOptions(options);
28
+ const templateText = await readFile(paths.template, "utf8");
29
+ const targetText = await readTextIfExists(paths.target);
30
+ const plan = planConfigChange({ targetText, templateText, mode, targetPath: paths.target });
31
+ return {
32
+ ok: true,
33
+ changed: plan.changed,
34
+ target: paths.target,
35
+ template: paths.template,
36
+ mode,
37
+ operations: plan.operations,
38
+ };
39
+ }
40
+ export async function doctor(options) {
41
+ const paths = resolvePaths(options);
42
+ const templateExists = await fileExists(paths.template);
43
+ let templateValid = false;
44
+ if (templateExists) {
45
+ validateToml(await readFile(paths.template, "utf8"), "template");
46
+ templateValid = true;
47
+ }
48
+ const targetExists = await fileExists(paths.target);
49
+ let targetValid = null;
50
+ if (targetExists) {
51
+ validateToml((await readTextIfExists(paths.target)) ?? "", "target");
52
+ targetValid = true;
53
+ }
54
+ return {
55
+ ok: templateExists && templateValid && (!targetExists || targetValid === true),
56
+ target: {
57
+ path: paths.target,
58
+ exists: targetExists,
59
+ validToml: targetValid,
60
+ },
61
+ template: {
62
+ path: paths.template,
63
+ exists: templateExists,
64
+ validToml: templateValid,
65
+ },
66
+ authRequired: false,
67
+ };
68
+ }
69
+ function resolvePaths(options) {
70
+ const target = resolve(options.target ?? defaultTargetPath());
71
+ const template = resolve(options.template ?? defaultTemplatePath());
72
+ return { target, template };
73
+ }
74
+ function modeFromOptions(options) {
75
+ return options.overrideAll ? "override" : "missing";
76
+ }
77
+ export function formatTextResult(command, result) {
78
+ const lines = [];
79
+ if (command === "apply") {
80
+ if (result.dryRun) {
81
+ lines.push(result.changed ? "Changes would be applied." : "Already up to date.");
82
+ }
83
+ else {
84
+ lines.push(result.changed ? "Config updated." : "Already up to date.");
85
+ }
86
+ }
87
+ else if (command === "check") {
88
+ lines.push(result.changed ? "Config is not up to date." : "Config is up to date.");
89
+ }
90
+ else {
91
+ lines.push(result.changed ? "Changes found." : "No changes.");
92
+ }
93
+ lines.push(`target: ${result.target}`);
94
+ lines.push(`template: ${result.template}`);
95
+ lines.push(`mode: ${result.mode}`);
96
+ for (const operation of result.operations) {
97
+ lines.push(`${operation.action}: ${operation.path}`);
98
+ }
99
+ return `${lines.join("\n")}\n`;
100
+ }
101
+ export function formatDoctorText(result) {
102
+ return [
103
+ result.ok ? "codex-config is ready." : "codex-config is not ready.",
104
+ `target: ${result.target.path}`,
105
+ `target exists: ${String(result.target.exists)}`,
106
+ `target valid TOML: ${String(result.target.validToml)}`,
107
+ `template: ${result.template.path}`,
108
+ `template exists: ${String(result.template.exists)}`,
109
+ `template valid TOML: ${String(result.template.validToml)}`,
110
+ "auth required: false",
111
+ ].join("\n") + "\n";
112
+ }
113
+ export function targetDirectory(options) {
114
+ return dirname(resolve(options.target ?? defaultTargetPath()));
115
+ }
116
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
package/dist/fs.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export declare function readTextIfExists(path: string): Promise<string | undefined>;
2
+ export declare function fileExists(path: string): Promise<boolean>;
3
+ export declare function atomicWriteFile(path: string, content: string): Promise<void>;
package/dist/fs.js ADDED
@@ -0,0 +1,56 @@
1
+ import { constants } from "node:fs";
2
+ import { access, mkdir, readFile, rename, rm, stat, writeFile, chmod } from "node:fs/promises";
3
+ import { dirname, join } from "node:path";
4
+ export async function readTextIfExists(path) {
5
+ try {
6
+ return await readFile(path, "utf8");
7
+ }
8
+ catch (error) {
9
+ if (isNodeError(error) && error.code === "ENOENT") {
10
+ return undefined;
11
+ }
12
+ throw error;
13
+ }
14
+ }
15
+ export async function fileExists(path) {
16
+ try {
17
+ await access(path, constants.F_OK);
18
+ return true;
19
+ }
20
+ catch (error) {
21
+ if (isNodeError(error) && error.code === "ENOENT") {
22
+ return false;
23
+ }
24
+ throw error;
25
+ }
26
+ }
27
+ export async function atomicWriteFile(path, content) {
28
+ const directory = dirname(path);
29
+ await mkdir(directory, { recursive: true });
30
+ const mode = await existingMode(path);
31
+ const tempPath = join(directory, `.${Date.now()}-${process.pid}.tmp`);
32
+ try {
33
+ await writeFile(tempPath, content, { encoding: "utf8", mode });
34
+ await chmod(tempPath, mode);
35
+ await rename(tempPath, path);
36
+ }
37
+ catch (error) {
38
+ await rm(tempPath, { force: true }).catch(() => undefined);
39
+ throw error;
40
+ }
41
+ }
42
+ async function existingMode(path) {
43
+ try {
44
+ return (await stat(path)).mode & 0o777;
45
+ }
46
+ catch (error) {
47
+ if (isNodeError(error) && error.code === "ENOENT") {
48
+ return 0o600;
49
+ }
50
+ throw error;
51
+ }
52
+ }
53
+ function isNodeError(error) {
54
+ return error instanceof Error && "code" in error;
55
+ }
56
+ //# sourceMappingURL=fs.js.map
package/dist/fs.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC/F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY;IACjD,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,OAAe;IACjE,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;IACtE,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,MAAM,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC5B,MAAM,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC3D,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAY;IACtC,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC;AACnD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function defaultTargetPath(): string;
2
+ export declare function defaultTemplatePath(): string;
package/dist/paths.js ADDED
@@ -0,0 +1,11 @@
1
+ import { homedir } from "node:os";
2
+ import { dirname, resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ export function defaultTargetPath() {
5
+ return resolve(homedir(), ".codex/config.toml");
6
+ }
7
+ export function defaultTemplatePath() {
8
+ const currentDirectory = dirname(fileURLToPath(import.meta.url));
9
+ return resolve(currentDirectory, "../config.toml.template");
10
+ }
11
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,iBAAiB;IAC/B,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,oBAAoB,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,MAAM,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACjE,OAAO,OAAO,CAAC,gBAAgB,EAAE,yBAAyB,CAAC,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,18 @@
1
+ export type MergeMode = "missing" | "override";
2
+ export interface PlanConfigChangeOptions {
3
+ targetText: string | undefined;
4
+ templateText: string;
5
+ mode: MergeMode;
6
+ targetPath?: string;
7
+ }
8
+ export interface ChangeOperation {
9
+ action: "create" | "add" | "update";
10
+ path: string;
11
+ }
12
+ export interface ConfigChangePlan {
13
+ changed: boolean;
14
+ outputText: string;
15
+ operations: ChangeOperation[];
16
+ }
17
+ export declare function planConfigChange(options: PlanConfigChangeOptions): ConfigChangePlan;
18
+ export declare function validateToml(text: string, label: string): void;
@@ -0,0 +1,414 @@
1
+ import { parse } from "smol-toml";
2
+ export function planConfigChange(options) {
3
+ const templateText = normalizeNewlines(options.templateText);
4
+ const templateParsed = parseToml(templateText, "template");
5
+ const templateScan = scanToml(templateText, true);
6
+ if (options.targetText === undefined) {
7
+ return {
8
+ changed: true,
9
+ outputText: ensureTrailingNewline(templateText),
10
+ operations: [{ action: "create", path: options.targetPath ?? "~/.codex/config.toml" }],
11
+ };
12
+ }
13
+ const targetText = normalizeNewlines(options.targetText);
14
+ const targetParsed = parseToml(targetText, "target");
15
+ const targetScan = scanToml(targetText, false);
16
+ const operations = [];
17
+ const mutations = [];
18
+ const missingByTable = new Map();
19
+ for (const entry of templateScan.entries) {
20
+ const fullKey = pathKey(entry.fullPath);
21
+ const templateValue = getPath(templateParsed, entry.fullPath);
22
+ const targetHasValue = hasPath(targetParsed, entry.fullPath);
23
+ if (!targetHasValue) {
24
+ const tableKey = pathKey(entry.tablePath);
25
+ const group = missingByTable.get(tableKey) ?? [];
26
+ group.push(entry);
27
+ missingByTable.set(tableKey, group);
28
+ operations.push({ action: "add", path: formatPath(entry.fullPath) });
29
+ continue;
30
+ }
31
+ if (options.mode === "override") {
32
+ const targetValue = getPath(targetParsed, entry.fullPath);
33
+ if (!deepEqual(templateValue, targetValue)) {
34
+ const targetEntry = targetScan.entryByPath.get(fullKey);
35
+ if (!targetEntry) {
36
+ throw new Error(`Cannot override ${formatPath(entry.fullPath)} because it is not represented as a standalone TOML key.`);
37
+ }
38
+ mutations.push({
39
+ start: targetEntry.start,
40
+ end: targetEntry.end,
41
+ lines: entry.valueLines,
42
+ });
43
+ operations.push({ action: "update", path: formatPath(entry.fullPath) });
44
+ }
45
+ }
46
+ }
47
+ for (const [tableKey, entries] of missingByTable) {
48
+ entries.sort((a, b) => a.order - b.order);
49
+ const tablePath = entries[0]?.tablePath ?? [];
50
+ const table = targetScan.tables.get(tableKey);
51
+ if (table) {
52
+ const insertAt = tableInsertIndex(targetScan.lines, table);
53
+ mutations.push({
54
+ start: insertAt,
55
+ end: insertAt,
56
+ lines: linesForExistingTableInsert(targetScan.lines, insertAt, entries),
57
+ });
58
+ }
59
+ else {
60
+ const insertAt = targetScan.lines.length;
61
+ mutations.push({
62
+ start: insertAt,
63
+ end: insertAt,
64
+ lines: linesForNewTable(targetScan.lines, tablePath, entries),
65
+ });
66
+ }
67
+ }
68
+ if (mutations.length === 0) {
69
+ return {
70
+ changed: false,
71
+ outputText: ensureTrailingNewline(targetText),
72
+ operations,
73
+ };
74
+ }
75
+ const outputLines = applyMutations(targetScan.lines, mutations);
76
+ return {
77
+ changed: true,
78
+ outputText: ensureTrailingNewline(outputLines.join("\n")),
79
+ operations,
80
+ };
81
+ }
82
+ export function validateToml(text, label) {
83
+ parseToml(text, label);
84
+ }
85
+ function parseToml(text, label) {
86
+ try {
87
+ return parse(text);
88
+ }
89
+ catch (error) {
90
+ const message = error instanceof Error ? error.message : String(error);
91
+ throw new Error(`Invalid ${label} TOML: ${message}`);
92
+ }
93
+ }
94
+ function scanToml(text, includeLeadingComments) {
95
+ const lines = splitLines(text);
96
+ const entries = [];
97
+ const tables = new Map();
98
+ const entryByPath = new Map();
99
+ let currentTable = [];
100
+ let currentTableKey = pathKey([]);
101
+ let pendingCommentStart;
102
+ let order = 0;
103
+ tables.set(currentTableKey, { path: [], header: undefined, start: 0, end: lines.length });
104
+ for (let i = 0; i < lines.length; i += 1) {
105
+ const line = lines[i] ?? "";
106
+ const header = parseHeader(line);
107
+ if (header) {
108
+ closeTable(tables, currentTableKey, i);
109
+ currentTable = header.path;
110
+ currentTableKey = pathKey(currentTable);
111
+ tables.set(currentTableKey, {
112
+ path: currentTable,
113
+ header: i,
114
+ start: i + 1,
115
+ end: lines.length,
116
+ });
117
+ pendingCommentStart = undefined;
118
+ continue;
119
+ }
120
+ const trimmed = line.trim();
121
+ if (trimmed === "") {
122
+ pendingCommentStart = undefined;
123
+ continue;
124
+ }
125
+ if (trimmed.startsWith("#")) {
126
+ if (pendingCommentStart === undefined) {
127
+ pendingCommentStart = i;
128
+ }
129
+ continue;
130
+ }
131
+ const keyLine = parseKeyLine(line);
132
+ if (!keyLine) {
133
+ pendingCommentStart = undefined;
134
+ continue;
135
+ }
136
+ const end = valueEndLine(lines, i, keyLine.valueStartColumn);
137
+ const keyPath = parseTomlPath(keyLine.keySource);
138
+ const fullPath = [...currentTable, ...keyPath];
139
+ const start = includeLeadingComments && pendingCommentStart !== undefined
140
+ ? pendingCommentStart
141
+ : i;
142
+ const entry = {
143
+ tablePath: currentTable,
144
+ keyPath,
145
+ fullPath,
146
+ valueLines: lines.slice(i, end),
147
+ insertionLines: lines.slice(start, end),
148
+ start: i,
149
+ end,
150
+ order,
151
+ };
152
+ order += 1;
153
+ entries.push(entry);
154
+ entryByPath.set(pathKey(fullPath), entry);
155
+ pendingCommentStart = undefined;
156
+ i = end - 1;
157
+ }
158
+ closeTable(tables, currentTableKey, lines.length);
159
+ return { entries, entryByPath, tables, lines };
160
+ }
161
+ function closeTable(tables, tableKey, end) {
162
+ const table = tables.get(tableKey);
163
+ if (table) {
164
+ table.end = end;
165
+ }
166
+ }
167
+ function parseHeader(line) {
168
+ const trimmed = stripInlineComment(line).trim();
169
+ const match = trimmed.match(/^\[{1,2}(.+?)\]{1,2}$/);
170
+ if (!match?.[1]) {
171
+ return undefined;
172
+ }
173
+ return { path: parseTomlPath(match[1].trim()) };
174
+ }
175
+ function parseKeyLine(line) {
176
+ const equalIndex = findFirstEqual(line);
177
+ if (equalIndex < 0) {
178
+ return undefined;
179
+ }
180
+ const keySource = line.slice(0, equalIndex).trim();
181
+ if (keySource === "") {
182
+ return undefined;
183
+ }
184
+ return { keySource, valueStartColumn: equalIndex + 1 };
185
+ }
186
+ function findFirstEqual(line) {
187
+ let quote;
188
+ let escaped = false;
189
+ for (let i = 0; i < line.length; i += 1) {
190
+ const char = line[i];
191
+ if (quote) {
192
+ if (quote === "\"" && char === "\\" && !escaped) {
193
+ escaped = true;
194
+ continue;
195
+ }
196
+ if (char === quote && !escaped) {
197
+ quote = undefined;
198
+ }
199
+ escaped = false;
200
+ continue;
201
+ }
202
+ if (char === "\"" || char === "'") {
203
+ quote = char;
204
+ continue;
205
+ }
206
+ if (char === "#") {
207
+ return -1;
208
+ }
209
+ if (char === "=") {
210
+ return i;
211
+ }
212
+ }
213
+ return -1;
214
+ }
215
+ function valueEndLine(lines, start, valueStartColumn) {
216
+ let depth = 0;
217
+ let quote;
218
+ let escaped = false;
219
+ for (let i = start; i < lines.length; i += 1) {
220
+ const line = lines[i] ?? "";
221
+ const from = i === start ? valueStartColumn : 0;
222
+ for (let column = from; column < line.length; column += 1) {
223
+ const char = line[column];
224
+ if (quote) {
225
+ if (quote === "\"" && char === "\\" && !escaped) {
226
+ escaped = true;
227
+ continue;
228
+ }
229
+ if (char === quote && !escaped) {
230
+ quote = undefined;
231
+ }
232
+ escaped = false;
233
+ continue;
234
+ }
235
+ if (char === "\"" || char === "'") {
236
+ quote = char;
237
+ continue;
238
+ }
239
+ if (char === "#") {
240
+ break;
241
+ }
242
+ if (char === "[" || char === "{") {
243
+ depth += 1;
244
+ }
245
+ else if (char === "]" || char === "}") {
246
+ depth -= 1;
247
+ }
248
+ }
249
+ if (depth <= 0 && !quote) {
250
+ return i + 1;
251
+ }
252
+ }
253
+ return start + 1;
254
+ }
255
+ function parseTomlPath(source) {
256
+ const segments = [];
257
+ let current = "";
258
+ let quote;
259
+ let escaped = false;
260
+ for (let i = 0; i < source.length; i += 1) {
261
+ const char = source[i];
262
+ if (quote) {
263
+ current += char;
264
+ if (quote === "\"" && char === "\\" && !escaped) {
265
+ escaped = true;
266
+ continue;
267
+ }
268
+ if (char === quote && !escaped) {
269
+ quote = undefined;
270
+ }
271
+ escaped = false;
272
+ continue;
273
+ }
274
+ if (char === "\"" || char === "'") {
275
+ quote = char;
276
+ current += char;
277
+ continue;
278
+ }
279
+ if (char === ".") {
280
+ segments.push(unquoteKey(current.trim()));
281
+ current = "";
282
+ continue;
283
+ }
284
+ current += char;
285
+ }
286
+ segments.push(unquoteKey(current.trim()));
287
+ return segments.filter((segment) => segment.length > 0);
288
+ }
289
+ function unquoteKey(segment) {
290
+ if (segment.startsWith("\"") && segment.endsWith("\"")) {
291
+ return JSON.parse(segment);
292
+ }
293
+ if (segment.startsWith("'") && segment.endsWith("'")) {
294
+ return segment.slice(1, -1);
295
+ }
296
+ return segment;
297
+ }
298
+ function stripInlineComment(line) {
299
+ let quote;
300
+ let escaped = false;
301
+ for (let i = 0; i < line.length; i += 1) {
302
+ const char = line[i];
303
+ if (quote) {
304
+ if (quote === "\"" && char === "\\" && !escaped) {
305
+ escaped = true;
306
+ continue;
307
+ }
308
+ if (char === quote && !escaped) {
309
+ quote = undefined;
310
+ }
311
+ escaped = false;
312
+ continue;
313
+ }
314
+ if (char === "\"" || char === "'") {
315
+ quote = char;
316
+ continue;
317
+ }
318
+ if (char === "#") {
319
+ return line.slice(0, i);
320
+ }
321
+ }
322
+ return line;
323
+ }
324
+ function linesForExistingTableInsert(targetLines, insertAt, entries) {
325
+ const insertLines = entries.flatMap((entry) => entry.insertionLines);
326
+ if (insertLines.length === 0) {
327
+ return [];
328
+ }
329
+ if (insertAt > 0 && targetLines[insertAt - 1]?.trim() === "") {
330
+ return insertLines;
331
+ }
332
+ return insertLines;
333
+ }
334
+ function linesForNewTable(targetLines, tablePath, entries) {
335
+ const block = [];
336
+ if (targetLines.length > 0 && targetLines[targetLines.length - 1]?.trim() !== "") {
337
+ block.push("");
338
+ }
339
+ if (tablePath.length > 0) {
340
+ block.push(`[${tablePath.map(formatTomlKey).join(".")}]`);
341
+ }
342
+ block.push(...entries.flatMap((entry) => entry.insertionLines));
343
+ return block;
344
+ }
345
+ function tableInsertIndex(lines, table) {
346
+ let index = table.end;
347
+ while (index > table.start && lines[index - 1]?.trim() === "") {
348
+ index -= 1;
349
+ }
350
+ return index;
351
+ }
352
+ function applyMutations(lines, mutations) {
353
+ const sorted = [...mutations].sort((a, b) => {
354
+ if (a.start !== b.start) {
355
+ return b.start - a.start;
356
+ }
357
+ return b.end - a.end;
358
+ });
359
+ const output = [...lines];
360
+ for (const mutation of sorted) {
361
+ output.splice(mutation.start, mutation.end - mutation.start, ...mutation.lines);
362
+ }
363
+ return output;
364
+ }
365
+ function getPath(value, path) {
366
+ let current = value;
367
+ for (const segment of path) {
368
+ if (!isRecord(current) || !Object.prototype.hasOwnProperty.call(current, segment)) {
369
+ return undefined;
370
+ }
371
+ current = current[segment];
372
+ }
373
+ return current;
374
+ }
375
+ function hasPath(value, path) {
376
+ let current = value;
377
+ for (const segment of path) {
378
+ if (!isRecord(current) || !Object.prototype.hasOwnProperty.call(current, segment)) {
379
+ return false;
380
+ }
381
+ current = current[segment];
382
+ }
383
+ return true;
384
+ }
385
+ function isRecord(value) {
386
+ return typeof value === "object" && value !== null && !Array.isArray(value);
387
+ }
388
+ function deepEqual(left, right) {
389
+ return JSON.stringify(left) === JSON.stringify(right);
390
+ }
391
+ function splitLines(text) {
392
+ const normalized = normalizeNewlines(text);
393
+ const lines = normalized.split("\n");
394
+ if (lines[lines.length - 1] === "") {
395
+ lines.pop();
396
+ }
397
+ return lines;
398
+ }
399
+ function normalizeNewlines(text) {
400
+ return text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
401
+ }
402
+ function ensureTrailingNewline(text) {
403
+ return text.endsWith("\n") ? text : `${text}\n`;
404
+ }
405
+ function pathKey(path) {
406
+ return JSON.stringify(path);
407
+ }
408
+ function formatPath(path) {
409
+ return path.map(formatTomlKey).join(".");
410
+ }
411
+ function formatTomlKey(key) {
412
+ return /^[A-Za-z0-9_-]+$/.test(key) ? key : JSON.stringify(key);
413
+ }
414
+ //# sourceMappingURL=toml-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toml-merge.js","sourceRoot":"","sources":["../src/toml-merge.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "codex-config",
3
+ "version": "0.1.0",
4
+ "description": "Idempotently apply a Codex config.toml template without overwriting user-owned settings.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "packageManager": "pnpm@10.33.4",
8
+ "bin": {
9
+ "codex-config": "dist/cli.js"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "config.toml.template",
14
+ "README.md",
15
+ "LICENSE"
16
+ ],
17
+ "scripts": {
18
+ "build": "rm -rf dist && tsc -p tsconfig.json",
19
+ "check": "tsc -p tsconfig.json --noEmit",
20
+ "test": "vitest run",
21
+ "dev": "tsx src/cli.ts"
22
+ },
23
+ "engines": {
24
+ "node": ">=22"
25
+ },
26
+ "dependencies": {
27
+ "commander": "^14.0.2",
28
+ "smol-toml": "^1.4.2"
29
+ },
30
+ "devDependencies": {
31
+ "@types/node": "^24.10.1",
32
+ "tsx": "^4.21.0",
33
+ "typescript": "^5.9.3",
34
+ "vitest": "^4.0.14"
35
+ },
36
+ "keywords": [
37
+ "codex",
38
+ "config",
39
+ "toml",
40
+ "cli"
41
+ ],
42
+ "repository": {
43
+ "type": "git",
44
+ "url": "git+https://github.com/PsychArch/codex-config.git"
45
+ }
46
+ }