@anyi61/codex-claude-delegate-mcp 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 +21 -0
- package/README.md +262 -0
- package/dist/claude-cli.d.ts +84 -0
- package/dist/claude-cli.js +3123 -0
- package/dist/claude-cli.js.map +1 -0
- package/dist/cli.d.ts +61 -0
- package/dist/cli.js +334 -0
- package/dist/cli.js.map +1 -0
- package/dist/codex-config.d.ts +104 -0
- package/dist/codex-config.js +446 -0
- package/dist/codex-config.js.map +1 -0
- package/dist/guard.d.ts +27 -0
- package/dist/guard.js +229 -0
- package/dist/guard.js.map +1 -0
- package/dist/job-runner.d.ts +13 -0
- package/dist/job-runner.js +75 -0
- package/dist/job-runner.js.map +1 -0
- package/dist/jobs.d.ts +46 -0
- package/dist/jobs.js +175 -0
- package/dist/jobs.js.map +1 -0
- package/dist/package-info.d.ts +4 -0
- package/dist/package-info.js +14 -0
- package/dist/package-info.js.map +1 -0
- package/dist/schema.d.ts +779 -0
- package/dist/schema.js +325 -0
- package/dist/schema.js.map +1 -0
- package/dist/server.d.ts +1142 -0
- package/dist/server.js +693 -0
- package/dist/server.js.map +1 -0
- package/dist/session.d.ts +35 -0
- package/dist/session.js +109 -0
- package/dist/session.js.map +1 -0
- package/package.json +49 -0
- package/plugins/codex-claude-delegate/.codex-plugin/plugin.json +36 -0
- package/plugins/codex-claude-delegate/.mcp.json +9 -0
- package/plugins/codex-claude-delegate/hooks/hooks.json +16 -0
- package/plugins/codex-claude-delegate/hooks/review-gate-stop.mjs +66 -0
- package/plugins/codex-claude-delegate/server/job-runner.js +16999 -0
- package/plugins/codex-claude-delegate/server/server.js +28048 -0
- package/plugins/codex-claude-delegate/skills/claude-delegate.md +30 -0
- package/plugins/codex-claude-delegate/skills/claude-rescue.md +52 -0
- package/plugins/codex-claude-delegate/skills/claude-review.md +25 -0
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile, cp, realpath } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { dangerousRoot, getAllowRoots } from "./guard.js";
|
|
4
|
+
const SERVER_NAME = "claude_delegate";
|
|
5
|
+
const ALLOW_ROOTS_KEY = "CODEX_CLAUDE_ALLOW_ROOTS";
|
|
6
|
+
const SHELL_ENV_TABLE = "shell_environment_policy.set";
|
|
7
|
+
function codexConfigPath() {
|
|
8
|
+
const codexHome = process.env.CODEX_HOME ?? (process.env.HOME ? path.join(process.env.HOME, ".codex") : "");
|
|
9
|
+
if (!codexHome)
|
|
10
|
+
throw new Error("Cannot locate Codex config: HOME and CODEX_HOME are both unset.");
|
|
11
|
+
return path.join(codexHome, "config.toml");
|
|
12
|
+
}
|
|
13
|
+
function tomlString(value) {
|
|
14
|
+
return JSON.stringify(value);
|
|
15
|
+
}
|
|
16
|
+
function splitAllowRootsValue(value) {
|
|
17
|
+
const delimiterPattern = path.delimiter === ";" ? /[;,]/g : /[:,]/g;
|
|
18
|
+
return value.split(delimiterPattern).map((part) => part.trim()).filter(Boolean);
|
|
19
|
+
}
|
|
20
|
+
function uniqueRoots(roots) {
|
|
21
|
+
const seen = new Set();
|
|
22
|
+
const result = [];
|
|
23
|
+
for (const root of roots) {
|
|
24
|
+
if (!seen.has(root)) {
|
|
25
|
+
seen.add(root);
|
|
26
|
+
result.push(root);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
function updateTomlTableValue(config, tableName, key, value) {
|
|
32
|
+
const assignment = `${key} = ${tomlString(value)}`;
|
|
33
|
+
const escapedTable = tableName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
34
|
+
const escapedKey = key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
35
|
+
const tablePattern = new RegExp(`(\\[${escapedTable}\\]\\n)([\\s\\S]*?)(?=\\n\\[|$)`);
|
|
36
|
+
const match = config.match(tablePattern);
|
|
37
|
+
if (!match) {
|
|
38
|
+
const needsNewline = config.length > 0 && !config.endsWith("\n");
|
|
39
|
+
return `${config}${needsNewline ? "\n" : ""}\n[${tableName}]\n${assignment}\n`;
|
|
40
|
+
}
|
|
41
|
+
const body = match[2] ?? "";
|
|
42
|
+
const nextBody = body.match(new RegExp(`^\\s*${escapedKey}\\s*=`, "m"))
|
|
43
|
+
? body.replace(new RegExp(`^\\s*${escapedKey}\\s*=.*$`, "m"), assignment)
|
|
44
|
+
: `${body}${body.endsWith("\n") || body.length === 0 ? "" : "\n"}${assignment}\n`;
|
|
45
|
+
return config.replace(tablePattern, `${match[1]}${nextBody}`);
|
|
46
|
+
}
|
|
47
|
+
function hasManualMcpServerTable(config) {
|
|
48
|
+
return new RegExp(`^\\s*\\[mcp_servers\\.${SERVER_NAME}\\]\\s*$`, "m").test(config);
|
|
49
|
+
}
|
|
50
|
+
function updateEnvTable(config, envValue) {
|
|
51
|
+
return updateTomlTableValue(config, `mcp_servers.${SERVER_NAME}.env`, ALLOW_ROOTS_KEY, envValue);
|
|
52
|
+
}
|
|
53
|
+
function updateShellEnvTable(config, envValue) {
|
|
54
|
+
return updateTomlTableValue(config, SHELL_ENV_TABLE, ALLOW_ROOTS_KEY, envValue);
|
|
55
|
+
}
|
|
56
|
+
function readTableValue(config, tableName, key) {
|
|
57
|
+
const escapedTable = tableName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
58
|
+
const tableMatch = config.match(new RegExp(`\\[${escapedTable}\\]\\n([\\s\\S]*?)(?=\\n\\[|$)`));
|
|
59
|
+
if (!tableMatch)
|
|
60
|
+
return null;
|
|
61
|
+
const escapedKey = key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
62
|
+
const keyMatch = tableMatch[1]?.match(new RegExp(`^\\s*${escapedKey}\\s*=\\s*"((?:\\\\.|[^"\\\\])*)"\\s*$`, "m"));
|
|
63
|
+
if (!keyMatch)
|
|
64
|
+
return null;
|
|
65
|
+
try {
|
|
66
|
+
return JSON.parse(`"${keyMatch[1]}"`);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return keyMatch[1].replace(/\\"/g, "\"");
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** Read the string values from a TOML array (e.g. `enabled_tools = ["a", "b"]`). */
|
|
73
|
+
function readTableArrayValues(config, tableName, key) {
|
|
74
|
+
const escapedTable = tableName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
75
|
+
const tableMatch = config.match(new RegExp(`\\[${escapedTable}\\]\\n([\\s\\S]*?)(?=\\n\\[|$)`));
|
|
76
|
+
if (!tableMatch)
|
|
77
|
+
return null;
|
|
78
|
+
const escapedKey = key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
79
|
+
const arrayMatch = tableMatch[1]?.match(new RegExp(`^\\s*${escapedKey}\\s*=\\s*\\[([\\s\\S]*?)\\]\\s*$`, "m"));
|
|
80
|
+
if (!arrayMatch)
|
|
81
|
+
return null;
|
|
82
|
+
const values = [];
|
|
83
|
+
const stringMatches = arrayMatch[1].matchAll(/"((?:\\"|[^"])*)"/g);
|
|
84
|
+
for (const m of stringMatches) {
|
|
85
|
+
values.push(m[1]);
|
|
86
|
+
}
|
|
87
|
+
return values;
|
|
88
|
+
}
|
|
89
|
+
function removeEnvOnlyTable(config) {
|
|
90
|
+
if (hasManualMcpServerTable(config))
|
|
91
|
+
return config;
|
|
92
|
+
return config.replace(new RegExp(`\\n?\\[mcp_servers\\.${SERVER_NAME}\\.env\\]\\n[\\s\\S]*?(?=\\n\\[|$)`), "");
|
|
93
|
+
}
|
|
94
|
+
function updateAllowRootsConfig(config, envValue) {
|
|
95
|
+
if (hasManualMcpServerTable(config)) {
|
|
96
|
+
return updateEnvTable(config, envValue);
|
|
97
|
+
}
|
|
98
|
+
const cleaned = removeEnvOnlyTable(config);
|
|
99
|
+
return updateShellEnvTable(cleaned, envValue);
|
|
100
|
+
}
|
|
101
|
+
function readConfiguredAllowRoots(config) {
|
|
102
|
+
return (readTableValue(config, `mcp_servers.${SERVER_NAME}.env`, ALLOW_ROOTS_KEY)
|
|
103
|
+
?? readTableValue(config, SHELL_ENV_TABLE, ALLOW_ROOTS_KEY));
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Remove a resolved path from a delimiter-separated allow-roots value.
|
|
107
|
+
* Returns null when the result would be empty, the original value when
|
|
108
|
+
* nothing changed, or the new joined string.
|
|
109
|
+
*/
|
|
110
|
+
export function removePathFromAllowRootsValue(currentValue, pathToRemove, delimiter) {
|
|
111
|
+
const normalizedToRemove = path.resolve(pathToRemove);
|
|
112
|
+
const parts = currentValue.split(delimiter).map((p) => p.trim()).filter(Boolean);
|
|
113
|
+
const remaining = parts.filter((p) => {
|
|
114
|
+
try {
|
|
115
|
+
return path.resolve(p) !== normalizedToRemove;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return true; // keep unparsable paths
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
if (remaining.length === 0)
|
|
122
|
+
return null;
|
|
123
|
+
if (remaining.length === parts.length)
|
|
124
|
+
return currentValue;
|
|
125
|
+
return remaining.join(delimiter);
|
|
126
|
+
}
|
|
127
|
+
/** Extract the raw text content of a TOML table body. */
|
|
128
|
+
function getTableContent(config, tableName) {
|
|
129
|
+
const escapedTable = tableName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
130
|
+
const match = config.match(new RegExp(`\\[${escapedTable}\\]\\n([\\s\\S]*?)(?=\\n\\[|$)`));
|
|
131
|
+
return match ? match[1] : null;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Delete a key assignment line from a TOML table section.
|
|
135
|
+
* Does not remove the table header or other keys.
|
|
136
|
+
*/
|
|
137
|
+
export function deleteTomlTableKey(config, tableName, key) {
|
|
138
|
+
const escapedTable = tableName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
139
|
+
const escapedKey = key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
140
|
+
const tablePattern = new RegExp(`(\\[${escapedTable}\\]\\n)([\\s\\S]*?)(?=\\n\\[|$)`);
|
|
141
|
+
return config.replace(tablePattern, (_match, header, body) => {
|
|
142
|
+
const newBody = body.replace(new RegExp(`^[ \\t]*${escapedKey}\\s*=.*\\n?`, "m"), "");
|
|
143
|
+
return `${header}${newBody}`;
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
/** Read the list of key names defined in a TOML table. */
|
|
147
|
+
export function readTableKeys(config, tableName) {
|
|
148
|
+
const content = getTableContent(config, tableName);
|
|
149
|
+
if (!content)
|
|
150
|
+
return [];
|
|
151
|
+
const keyMatches = content.matchAll(/^\s*(\w+)\s*=/gm);
|
|
152
|
+
return [...keyMatches].map((m) => m[1]);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Classify the `[mcp_servers.claude_delegate]` section in a TOML config:
|
|
156
|
+
* - "auto": command="node" and args point to this plugin's server script.
|
|
157
|
+
* - "env_only": only an `.env` subsection exists, no command/args.
|
|
158
|
+
* - "manual": anything else (custom command, different args, etc.).
|
|
159
|
+
* Returns null when no claude_delegate MCP section exists.
|
|
160
|
+
*/
|
|
161
|
+
export function classifyMcpServerSection(config) {
|
|
162
|
+
const mainTablePattern = new RegExp(`^\\s*\\[mcp_servers\\.${SERVER_NAME}\\]\\s*$`, "m");
|
|
163
|
+
const envTablePattern = new RegExp(`^\\s*\\[mcp_servers\\.${SERVER_NAME}\\.env\\]\\s*$`, "m");
|
|
164
|
+
const hasMain = mainTablePattern.test(config);
|
|
165
|
+
const hasEnv = envTablePattern.test(config);
|
|
166
|
+
if (!hasMain && !hasEnv)
|
|
167
|
+
return null;
|
|
168
|
+
let hasCommand = false;
|
|
169
|
+
let hasArgs = false;
|
|
170
|
+
if (hasMain) {
|
|
171
|
+
const mainContent = getTableContent(config, `mcp_servers.${SERVER_NAME}`);
|
|
172
|
+
if (mainContent) {
|
|
173
|
+
hasCommand = /^\s*command\s*=/m.test(mainContent);
|
|
174
|
+
hasArgs = /^\s*args\s*=/m.test(mainContent);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
const command = hasMain ? readTableValue(config, `mcp_servers.${SERVER_NAME}`, "command") : null;
|
|
178
|
+
const isNodeCommand = command === "node";
|
|
179
|
+
const mainContent = hasMain ? getTableContent(config, `mcp_servers.${SERVER_NAME}`) : "";
|
|
180
|
+
const pointsToPlugin = /(?:^|["'\s\[])(?:\.\/server\/server\.js|[^"'\s,\]]*codex-claude-delegate\/server\/server\.js)(?=["'\s,\]]|$)/.test(mainContent ?? "");
|
|
181
|
+
let origin;
|
|
182
|
+
if (isNodeCommand && pointsToPlugin) {
|
|
183
|
+
origin = "auto";
|
|
184
|
+
}
|
|
185
|
+
else if (!hasCommand && !hasArgs && hasEnv) {
|
|
186
|
+
origin = "env_only";
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
origin = "manual";
|
|
190
|
+
}
|
|
191
|
+
return { origin, hasCommand, hasArgs, hasEnv };
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Read-only scan of ~/.codex/config.toml for claude_delegate related configuration.
|
|
195
|
+
* Returns an empty result when the config file does not exist (never throws).
|
|
196
|
+
*/
|
|
197
|
+
export async function scanClaudeDelegateConfig() {
|
|
198
|
+
const configPath = codexConfigPath();
|
|
199
|
+
let config = "";
|
|
200
|
+
let exists = false;
|
|
201
|
+
try {
|
|
202
|
+
config = await readFile(configPath, "utf8");
|
|
203
|
+
exists = true;
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
return { configPath, exists: false, hasAllowRoots: false, allowRootsValue: null, mcpClassification: null, mcpServerKeys: [], envKeys: [], mcpCommand: null, mcpEnabledTools: null };
|
|
207
|
+
}
|
|
208
|
+
const classification = classifyMcpServerSection(config);
|
|
209
|
+
const mcpServerKeys = classification ? readTableKeys(config, `mcp_servers.${SERVER_NAME}`) : [];
|
|
210
|
+
const envKeys = (classification?.hasEnv ?? false) ? readTableKeys(config, `mcp_servers.${SERVER_NAME}.env`) : [];
|
|
211
|
+
const envAllowRoot = readTableValue(config, `mcp_servers.${SERVER_NAME}.env`, ALLOW_ROOTS_KEY);
|
|
212
|
+
const shellAllowRoot = readTableValue(config, SHELL_ENV_TABLE, ALLOW_ROOTS_KEY);
|
|
213
|
+
const allowRootsValue = envAllowRoot ?? shellAllowRoot ?? null;
|
|
214
|
+
const mcpCommand = classification ? readTableValue(config, `mcp_servers.${SERVER_NAME}`, "command") : null;
|
|
215
|
+
const mcpEnabledTools = classification ? readTableArrayValues(config, `mcp_servers.${SERVER_NAME}`, "enabled_tools") : null;
|
|
216
|
+
return { configPath, exists, hasAllowRoots: allowRootsValue !== null, allowRootsValue, mcpClassification: classification, mcpServerKeys, envKeys, mcpCommand, mcpEnabledTools };
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Remove the given cwd from CODEX_CLAUDE_ALLOW_ROWS in the TOML config.
|
|
220
|
+
* Only operates on `CODEX_CLAUDE_ALLOW_ROOTS`; preserves other keys in the same table.
|
|
221
|
+
* Idempotent: returns changed=false when the path is already absent.
|
|
222
|
+
*/
|
|
223
|
+
export async function removeAllowRoot(cwd) {
|
|
224
|
+
const configPath = codexConfigPath();
|
|
225
|
+
let config = "";
|
|
226
|
+
try {
|
|
227
|
+
config = await readFile(configPath, "utf8");
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
return { configPath, changed: false, message: "Config file not found." };
|
|
231
|
+
}
|
|
232
|
+
// Use path.resolve (not realpath) to avoid symlink resolution differences
|
|
233
|
+
// (e.g. /var → /private/var on macOS).
|
|
234
|
+
const resolved = path.resolve(cwd);
|
|
235
|
+
let currentValue = null;
|
|
236
|
+
let sourceTable = null;
|
|
237
|
+
const envValue = readTableValue(config, `mcp_servers.${SERVER_NAME}.env`, ALLOW_ROOTS_KEY);
|
|
238
|
+
if (envValue !== null) {
|
|
239
|
+
currentValue = envValue;
|
|
240
|
+
sourceTable = `mcp_servers.${SERVER_NAME}.env`;
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
const shellValue = readTableValue(config, SHELL_ENV_TABLE, ALLOW_ROOTS_KEY);
|
|
244
|
+
if (shellValue !== null) {
|
|
245
|
+
currentValue = shellValue;
|
|
246
|
+
sourceTable = SHELL_ENV_TABLE;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
if (currentValue === null || sourceTable === null) {
|
|
250
|
+
return { configPath, changed: false, message: `${ALLOW_ROOTS_KEY} not found in config.` };
|
|
251
|
+
}
|
|
252
|
+
const delimiter = currentValue.includes(path.delimiter)
|
|
253
|
+
? path.delimiter
|
|
254
|
+
: currentValue.includes(",")
|
|
255
|
+
? ","
|
|
256
|
+
: path.delimiter;
|
|
257
|
+
const newValue = removePathFromAllowRootsValue(currentValue, resolved, delimiter);
|
|
258
|
+
if (newValue === currentValue) {
|
|
259
|
+
return { configPath, changed: false, message: `Path ${resolved} not found in ${ALLOW_ROOTS_KEY}.` };
|
|
260
|
+
}
|
|
261
|
+
if (newValue === null) {
|
|
262
|
+
config = deleteTomlTableKey(config, sourceTable, ALLOW_ROOTS_KEY);
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
config = updateTomlTableValue(config, sourceTable, ALLOW_ROOTS_KEY, newValue);
|
|
266
|
+
}
|
|
267
|
+
await writeFile(configPath, config, "utf8");
|
|
268
|
+
return { configPath, changed: true, message: `Removed ${resolved} from ${ALLOW_ROOTS_KEY}.` };
|
|
269
|
+
}
|
|
270
|
+
function removeMcpServerTables(config) {
|
|
271
|
+
let modified = config;
|
|
272
|
+
const envPattern = new RegExp(`\\n?\\[mcp_servers\\.${SERVER_NAME}\\.env\\]\\n[\\s\\S]*?(?=\\n\\[|$)`);
|
|
273
|
+
modified = modified.replace(envPattern, "");
|
|
274
|
+
const mainPattern = new RegExp(`\\n?\\[mcp_servers\\.${SERVER_NAME}\\]\\n[\\s\\S]*?(?=\\n\\[|$)`);
|
|
275
|
+
return modified.replace(mainPattern, "");
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Remove or flag the `[mcp_servers.claude_delegate]` section:
|
|
279
|
+
* - "auto": delete the entire section (including .env subsection).
|
|
280
|
+
* - "env_only": delete .env subsection; also removes empty parent header.
|
|
281
|
+
* - "manual": no-op, returns manual_skip for caller to decide.
|
|
282
|
+
*/
|
|
283
|
+
export async function removeOrFlagMcpServerSection() {
|
|
284
|
+
const configPath = codexConfigPath();
|
|
285
|
+
let config = "";
|
|
286
|
+
try {
|
|
287
|
+
config = await readFile(configPath, "utf8");
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
return { configPath, changed: false, action: "not_found", message: "Config file not found." };
|
|
291
|
+
}
|
|
292
|
+
const classification = classifyMcpServerSection(config);
|
|
293
|
+
if (!classification) {
|
|
294
|
+
return { configPath, changed: false, action: "not_found", message: `[mcp_servers.${SERVER_NAME}] not found in config.` };
|
|
295
|
+
}
|
|
296
|
+
if (classification.origin === "manual") {
|
|
297
|
+
return { configPath, changed: false, action: "manual_skip", message: `[mcp_servers.${SERVER_NAME}] appears manually configured; skipped.` };
|
|
298
|
+
}
|
|
299
|
+
if (classification.origin === "auto") {
|
|
300
|
+
const modified = removeMcpServerTables(config);
|
|
301
|
+
if (modified !== config) {
|
|
302
|
+
await writeFile(configPath, modified, "utf8");
|
|
303
|
+
}
|
|
304
|
+
return { configPath, changed: modified !== config, action: "deleted", message: `Deleted [mcp_servers.${SERVER_NAME}] section.` };
|
|
305
|
+
}
|
|
306
|
+
// env_only: remove the .env subsection, then clean up empty parent
|
|
307
|
+
let modified = config;
|
|
308
|
+
const envPattern = new RegExp(`\\n?\\[mcp_servers\\.${SERVER_NAME}\\.env\\]\\n[\\s\\S]*?(?=\\n\\[|$)`, "m");
|
|
309
|
+
modified = modified.replace(envPattern, "");
|
|
310
|
+
const mainContent = getTableContent(modified, `mcp_servers.${SERVER_NAME}`);
|
|
311
|
+
if (mainContent !== null && mainContent.trim() === "") {
|
|
312
|
+
modified = modified.replace(new RegExp(`\\n?\\[mcp_servers\\.${SERVER_NAME}\\]\\n?`), "");
|
|
313
|
+
}
|
|
314
|
+
if (modified !== config) {
|
|
315
|
+
await writeFile(configPath, modified, "utf8");
|
|
316
|
+
}
|
|
317
|
+
return { configPath, changed: modified !== config, action: "env_deleted", message: `Deleted [mcp_servers.${SERVER_NAME}.env] section.` };
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Remove the claude_delegate MCP section after an explicit user confirmation.
|
|
321
|
+
* This is intentionally separate from removeOrFlagMcpServerSection so --yes
|
|
322
|
+
* mode can keep manual MCP config fail-closed.
|
|
323
|
+
*/
|
|
324
|
+
export async function removeConfirmedMcpServerSection() {
|
|
325
|
+
const configPath = codexConfigPath();
|
|
326
|
+
let config = "";
|
|
327
|
+
try {
|
|
328
|
+
config = await readFile(configPath, "utf8");
|
|
329
|
+
}
|
|
330
|
+
catch {
|
|
331
|
+
return { configPath, changed: false, action: "not_found", message: "Config file not found." };
|
|
332
|
+
}
|
|
333
|
+
const classification = classifyMcpServerSection(config);
|
|
334
|
+
if (!classification) {
|
|
335
|
+
return { configPath, changed: false, action: "not_found", message: `[mcp_servers.${SERVER_NAME}] not found in config.` };
|
|
336
|
+
}
|
|
337
|
+
const modified = removeMcpServerTables(config);
|
|
338
|
+
if (modified !== config) {
|
|
339
|
+
await writeFile(configPath, modified, "utf8");
|
|
340
|
+
}
|
|
341
|
+
return { configPath, changed: modified !== config, action: "deleted", message: `Deleted [mcp_servers.${SERVER_NAME}] section after user confirmation.` };
|
|
342
|
+
}
|
|
343
|
+
export async function configureCodexAllowRoot(rawCwd) {
|
|
344
|
+
let resolved;
|
|
345
|
+
try {
|
|
346
|
+
resolved = await realpath(rawCwd);
|
|
347
|
+
}
|
|
348
|
+
catch {
|
|
349
|
+
throw new Error(`Cannot configure allow root because path does not exist: ${rawCwd}`);
|
|
350
|
+
}
|
|
351
|
+
if (dangerousRoot(rawCwd) || dangerousRoot(resolved)) {
|
|
352
|
+
throw new Error(`Refusing to configure dangerous allow root: ${resolved}`);
|
|
353
|
+
}
|
|
354
|
+
const configPath = codexConfigPath();
|
|
355
|
+
await mkdir(path.dirname(configPath), { recursive: true });
|
|
356
|
+
let config = "";
|
|
357
|
+
try {
|
|
358
|
+
config = await readFile(configPath, "utf8");
|
|
359
|
+
}
|
|
360
|
+
catch { }
|
|
361
|
+
const existingValue = readConfiguredAllowRoots(config);
|
|
362
|
+
const configuredRoots = existingValue ? splitAllowRootsValue(existingValue) : getAllowRoots();
|
|
363
|
+
const allowRoots = uniqueRoots([...configuredRoots, resolved]);
|
|
364
|
+
const envValue = allowRoots.join(path.delimiter);
|
|
365
|
+
const nextConfig = updateAllowRootsConfig(config, envValue);
|
|
366
|
+
const changed = nextConfig !== config;
|
|
367
|
+
if (changed) {
|
|
368
|
+
await writeFile(configPath, nextConfig, "utf8");
|
|
369
|
+
}
|
|
370
|
+
process.env.CODEX_CLAUDE_ALLOW_ROOTS = envValue;
|
|
371
|
+
return {
|
|
372
|
+
config_path: configPath,
|
|
373
|
+
changed,
|
|
374
|
+
allow_roots: allowRoots,
|
|
375
|
+
env_value: envValue,
|
|
376
|
+
message: changed
|
|
377
|
+
? `Added ${resolved} to ${ALLOW_ROOTS_KEY} for ${SERVER_NAME}.`
|
|
378
|
+
: `${resolved} is already present in ${ALLOW_ROOTS_KEY} for ${SERVER_NAME}.`,
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
// =============== NPM global setup config helpers ===============
|
|
382
|
+
export const DEFAULT_ENABLED_TOOLS = [
|
|
383
|
+
"claude_setup",
|
|
384
|
+
"claude_task",
|
|
385
|
+
"claude_job_wait",
|
|
386
|
+
"claude_result",
|
|
387
|
+
"claude_apply",
|
|
388
|
+
"claude_cleanup",
|
|
389
|
+
];
|
|
390
|
+
export function renderClaudeDelegateMcpConfig() {
|
|
391
|
+
const tools = DEFAULT_ENABLED_TOOLS.map((tool) => ` "${tool}"`).join(",\n");
|
|
392
|
+
return `[mcp_servers.claude_delegate]\ncommand = "codex-claude"\nstartup_timeout_sec = 20\ntool_timeout_sec = 600\nenabled_tools = [\n${tools}\n]\n`;
|
|
393
|
+
}
|
|
394
|
+
export function upsertClaudeDelegateMcpServer(config, options = {}) {
|
|
395
|
+
const hasServer = /^\s*\[mcp_servers\.claude_delegate\]\s*$/m.test(config);
|
|
396
|
+
if (hasServer && !options.force) {
|
|
397
|
+
return { changed: false, existed: true, content: config, message: "Existing MCP server found: claude_delegate" };
|
|
398
|
+
}
|
|
399
|
+
const nextSection = renderClaudeDelegateMcpConfig();
|
|
400
|
+
if (!hasServer) {
|
|
401
|
+
const separator = config.length > 0 && !config.endsWith("\n") ? "\n\n" : config.length > 0 ? "\n" : "";
|
|
402
|
+
return { changed: true, existed: false, content: `${config}${separator}${nextSection}`, message: "Added MCP server: claude_delegate" };
|
|
403
|
+
}
|
|
404
|
+
const tablePattern = /^\s*\[mcp_servers\.claude_delegate\]\s*\n[\s\S]*?(?=^\s*\[|$(?![\s\S]))/m;
|
|
405
|
+
return { changed: true, existed: true, content: config.replace(tablePattern, nextSection), message: "Replaced MCP server config: claude_delegate" };
|
|
406
|
+
}
|
|
407
|
+
export async function setupWrite(options = {}) {
|
|
408
|
+
const configDir = options.isProject
|
|
409
|
+
? path.join(process.cwd(), ".codex")
|
|
410
|
+
: process.env.CODEX_HOME
|
|
411
|
+
? path.join(process.env.CODEX_HOME)
|
|
412
|
+
: path.join(process.env.HOME ?? "/tmp", ".codex");
|
|
413
|
+
const configPath = path.join(configDir, "config.toml");
|
|
414
|
+
await mkdir(configDir, { recursive: true });
|
|
415
|
+
let config = "";
|
|
416
|
+
let configExisted = false;
|
|
417
|
+
try {
|
|
418
|
+
config = await readFile(configPath, "utf8");
|
|
419
|
+
configExisted = true;
|
|
420
|
+
}
|
|
421
|
+
catch {
|
|
422
|
+
config = "";
|
|
423
|
+
}
|
|
424
|
+
if (options.force && configExisted) {
|
|
425
|
+
const now = new Date();
|
|
426
|
+
const ts = `${now.getFullYear()}${String(now.getMonth() + 1).padStart(2, "0")}${String(now.getDate()).padStart(2, "0")}-${String(now.getHours()).padStart(2, "0")}${String(now.getMinutes()).padStart(2, "0")}${String(now.getSeconds()).padStart(2, "0")}`;
|
|
427
|
+
const backupPath = `${configPath}.bak-${ts}`;
|
|
428
|
+
await cp(configPath, backupPath);
|
|
429
|
+
}
|
|
430
|
+
const upsertResult = upsertClaudeDelegateMcpServer(config, { force: options.force });
|
|
431
|
+
let message = upsertResult.message;
|
|
432
|
+
if (upsertResult.changed) {
|
|
433
|
+
await writeFile(configPath, upsertResult.content, "utf8");
|
|
434
|
+
}
|
|
435
|
+
if (options.allowRoot) {
|
|
436
|
+
try {
|
|
437
|
+
const allowResult = await configureCodexAllowRoot(options.allowRoot);
|
|
438
|
+
message += `\n${allowResult.message}`;
|
|
439
|
+
}
|
|
440
|
+
catch (err) {
|
|
441
|
+
return { exitCode: 1, message: `${message}\nError: ${err instanceof Error ? err.message : String(err)}` };
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
return { exitCode: 0, message };
|
|
445
|
+
}
|
|
446
|
+
//# sourceMappingURL=codex-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-config.js","sourceRoot":"","sources":["../src/codex-config.ts"],"names":[],"mappings":"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"}
|
package/dist/guard.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export declare function dangerousRoot(raw: string): boolean;
|
|
2
|
+
export declare function getAllowRoots(): string[];
|
|
3
|
+
export interface CwdCheck {
|
|
4
|
+
ok: boolean;
|
|
5
|
+
resolved: string;
|
|
6
|
+
error?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function validateCwd(raw: string): Promise<CwdCheck>;
|
|
9
|
+
export declare function validateFilesWithinCwd(cwd: string, files?: string[]): Promise<CwdCheck>;
|
|
10
|
+
export declare function resolveRepoLocalPath(cwd: string, relativePath: string): CwdCheck;
|
|
11
|
+
export declare function isGitRepo(cwd: string): Promise<boolean>;
|
|
12
|
+
export declare function supportsWorktree(cwd: string): Promise<boolean>;
|
|
13
|
+
export declare const MAX_BRIDGE_DEPTH = 2;
|
|
14
|
+
export declare function checkRecursion(): number;
|
|
15
|
+
export declare function assertCanDelegate(): void;
|
|
16
|
+
export declare function sanitizeEnv(): Record<string, string>;
|
|
17
|
+
export declare function execCapture(command: string, args: string[], opts: {
|
|
18
|
+
cwd: string;
|
|
19
|
+
timeoutMs?: number;
|
|
20
|
+
}): Promise<string>;
|
|
21
|
+
export declare function execStream(command: string, args: string[], opts: {
|
|
22
|
+
cwd: string;
|
|
23
|
+
timeoutMs?: number;
|
|
24
|
+
}, onStdout?: (line: string) => void): Promise<{
|
|
25
|
+
code: number | null;
|
|
26
|
+
stderr: string;
|
|
27
|
+
}>;
|