nomoreide 0.1.69 → 0.1.71
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/dist/core/agent-env-actions.d.ts +117 -0
- package/dist/core/agent-env-actions.js +234 -0
- package/dist/core/agent-env-actions.js.map +1 -0
- package/dist/core/agent-env-writers.d.ts +46 -0
- package/dist/core/agent-env-writers.js +385 -0
- package/dist/core/agent-env-writers.js.map +1 -0
- package/dist/core/agent-profiles/apply.d.ts +36 -0
- package/dist/core/agent-profiles/apply.js +160 -0
- package/dist/core/agent-profiles/apply.js.map +1 -0
- package/dist/core/agent-profiles/credentials.d.ts +26 -0
- package/dist/core/agent-profiles/credentials.js +151 -0
- package/dist/core/agent-profiles/credentials.js.map +1 -0
- package/dist/core/agent-profiles/index.d.ts +10 -0
- package/dist/core/agent-profiles/index.js +11 -0
- package/dist/core/agent-profiles/index.js.map +1 -0
- package/dist/core/agent-profiles/store.d.ts +35 -0
- package/dist/core/agent-profiles/store.js +210 -0
- package/dist/core/agent-profiles/store.js.map +1 -0
- package/dist/core/agent-profiles/transfer.d.ts +26 -0
- package/dist/core/agent-profiles/transfer.js +141 -0
- package/dist/core/agent-profiles/transfer.js.map +1 -0
- package/dist/core/agent-profiles/types.d.ts +250 -0
- package/dist/core/agent-profiles/types.js +63 -0
- package/dist/core/agent-profiles/types.js.map +1 -0
- package/dist/mcp/tools/agent-env.d.ts +4 -3
- package/dist/mcp/tools/agent-env.js +129 -9
- package/dist/mcp/tools/agent-env.js.map +1 -1
- package/dist/mcp/tools/agent-profiles.d.ts +9 -0
- package/dist/mcp/tools/agent-profiles.js +165 -0
- package/dist/mcp/tools/agent-profiles.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +1 -1
- package/dist/mcp/tools/index.js +3 -0
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/web/client/assets/{code-editor-B4fwOZmz.js → code-editor-B0j6kcLb.js} +1 -1
- package/dist/web/client/assets/{index-Bv9X1Rmi.js → index-DAiSqTLR.js} +139 -139
- package/dist/web/client/assets/index-n7aEcfkd.css +1 -0
- package/dist/web/client/index.html +2 -2
- package/dist/web/routes/agent-env-routes.d.ts +5 -3
- package/dist/web/routes/agent-env-routes.js +54 -4
- package/dist/web/routes/agent-env-routes.js.map +1 -1
- package/dist/web/routes/agent-profile-routes.d.ts +8 -0
- package/dist/web/routes/agent-profile-routes.js +180 -0
- package/dist/web/routes/agent-profile-routes.js.map +1 -0
- package/dist/web/routes/index.js +2 -0
- package/dist/web/routes/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/web/client/assets/index-CNvFKnAK.css +0 -1
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Environments low-level writers — the ONLY code that mutates coding
|
|
3
|
+
* agents' config files. Ported from brainctl's agent-config-service (ROR-61).
|
|
4
|
+
* Kept separate from the read-safe `core/agent-env/` module, mirroring the
|
|
5
|
+
* GitManager/GitActions and DbPeek/DbWrite splits; callers go through the
|
|
6
|
+
* staged preview → apply flow in `agent-env-actions.ts`.
|
|
7
|
+
*
|
|
8
|
+
* Every mutation backs up the touched file to a timestamped sibling
|
|
9
|
+
* (`<file>.bak.<ts>`) and writes atomically (temp file + rename). Skill
|
|
10
|
+
* directory removals are backed up under
|
|
11
|
+
* `<home>/.config/nomoreide/agent-env-backups/` first.
|
|
12
|
+
*/
|
|
13
|
+
import { constants } from "node:fs";
|
|
14
|
+
import { copyFile, cp, mkdir, readFile, rename, rm, stat, writeFile } from "node:fs/promises";
|
|
15
|
+
import { homedir } from "node:os";
|
|
16
|
+
import path from "node:path";
|
|
17
|
+
import { readAntigravityConfig, readCodexConfig, } from "./agent-env/index.js";
|
|
18
|
+
export function formatTimestamp() {
|
|
19
|
+
const now = new Date();
|
|
20
|
+
const pad = (n) => String(n).padStart(2, "0");
|
|
21
|
+
return `${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}-${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}`;
|
|
22
|
+
}
|
|
23
|
+
async function backupFile(filePath) {
|
|
24
|
+
const base = `${filePath}.bak.${formatTimestamp()}`;
|
|
25
|
+
// COPYFILE_EXCL + suffix loop: two writes within the same second (e.g. the
|
|
26
|
+
// add+remove halves of a move) must not overwrite each other's backup.
|
|
27
|
+
for (let attempt = 0; attempt < 10; attempt++) {
|
|
28
|
+
const backupPath = attempt === 0 ? base : `${base}-${attempt}`;
|
|
29
|
+
try {
|
|
30
|
+
await copyFile(filePath, backupPath, constants.COPYFILE_EXCL);
|
|
31
|
+
return backupPath;
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
const code = error.code;
|
|
35
|
+
if (code === "EEXIST")
|
|
36
|
+
continue;
|
|
37
|
+
return null; // source file does not exist yet — nothing to back up
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
async function atomicWrite(filePath, content) {
|
|
43
|
+
const tmpPath = `${filePath}.tmp.${Date.now()}`;
|
|
44
|
+
await writeFile(tmpPath, content, "utf8");
|
|
45
|
+
await rename(tmpPath, filePath);
|
|
46
|
+
}
|
|
47
|
+
async function atomicWriteJson(filePath, data) {
|
|
48
|
+
await atomicWrite(filePath, JSON.stringify(data, null, 2) + "\n");
|
|
49
|
+
}
|
|
50
|
+
export async function addMcp(options) {
|
|
51
|
+
const { agent, key, entry, remoteEntry, scope } = options;
|
|
52
|
+
if (!entry && !remoteEntry) {
|
|
53
|
+
throw new Error(`MCP "${key}" has neither a command nor a URL; nothing to add.`);
|
|
54
|
+
}
|
|
55
|
+
if (agent === "claude") {
|
|
56
|
+
return mutateClaudeConfig(options, scope, (servers) => {
|
|
57
|
+
servers[key] = remoteEntry ? toClaudeRemoteEntry(remoteEntry) : toClaudeEntry(entry);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
if (scope === "project") {
|
|
61
|
+
// Codex and Antigravity have no native per-project config; brainctl's
|
|
62
|
+
// `.brainctl/project-mcps.json` convention is kept for compatibility.
|
|
63
|
+
return mutateBrainctlProjectMcps(options, agent, (servers) => {
|
|
64
|
+
servers[key] = remoteEntry
|
|
65
|
+
? { transport: remoteEntry.transport, url: remoteEntry.url }
|
|
66
|
+
: {
|
|
67
|
+
command: entry.command,
|
|
68
|
+
...(entry.args ? { args: entry.args } : {}),
|
|
69
|
+
...(entry.env ? { env: entry.env } : {}),
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
if (agent === "codex") {
|
|
74
|
+
return mutateCodexConfig(options, (state) => {
|
|
75
|
+
delete state.mcpServers[key];
|
|
76
|
+
delete state.remoteMcpServers[key];
|
|
77
|
+
if (remoteEntry)
|
|
78
|
+
state.remoteMcpServers[key] = remoteEntry;
|
|
79
|
+
else
|
|
80
|
+
state.mcpServers[key] = entry;
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
return mutateAntigravityConfig(options, (servers) => {
|
|
84
|
+
servers[key] = remoteEntry ? toAntigravityRemoteEntry(remoteEntry) : toAntigravityEntry(entry);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
export async function removeMcp(options) {
|
|
88
|
+
const { agent, key, scope } = options;
|
|
89
|
+
if (agent === "claude") {
|
|
90
|
+
return mutateClaudeConfig(options, scope, (servers) => {
|
|
91
|
+
delete servers[key];
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
if (scope === "project") {
|
|
95
|
+
return mutateBrainctlProjectMcps(options, agent, (servers) => {
|
|
96
|
+
delete servers[key];
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
if (agent === "codex") {
|
|
100
|
+
return mutateCodexConfig(options, (state) => {
|
|
101
|
+
delete state.mcpServers[key];
|
|
102
|
+
delete state.remoteMcpServers[key];
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
return mutateAntigravityConfig(options, (servers) => {
|
|
106
|
+
delete servers[key];
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/* ---- Claude: ~/.claude.json with top-level and projects[cwd] mcpServers ---- */
|
|
110
|
+
async function mutateClaudeConfig(options, scope, mutate) {
|
|
111
|
+
const homeDir = options.homeDir ?? homedir();
|
|
112
|
+
const configPath = path.join(homeDir, ".claude.json");
|
|
113
|
+
const backups = [];
|
|
114
|
+
let existing = {};
|
|
115
|
+
try {
|
|
116
|
+
existing = JSON.parse(await readFile(configPath, "utf8"));
|
|
117
|
+
const backup = await backupFile(configPath);
|
|
118
|
+
if (backup)
|
|
119
|
+
backups.push(backup);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// fresh config
|
|
123
|
+
}
|
|
124
|
+
if (scope === "user") {
|
|
125
|
+
const servers = (existing.mcpServers ?? {});
|
|
126
|
+
mutate(servers);
|
|
127
|
+
existing.mcpServers = servers;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
const projects = (existing.projects ?? {});
|
|
131
|
+
const projectConfig = (projects[options.cwd] ?? {});
|
|
132
|
+
const servers = (projectConfig.mcpServers ?? {});
|
|
133
|
+
mutate(servers);
|
|
134
|
+
projectConfig.mcpServers = servers;
|
|
135
|
+
projects[options.cwd] = projectConfig;
|
|
136
|
+
existing.projects = projects;
|
|
137
|
+
}
|
|
138
|
+
await atomicWriteJson(configPath, existing);
|
|
139
|
+
return { backups };
|
|
140
|
+
}
|
|
141
|
+
function toClaudeEntry(entry) {
|
|
142
|
+
return {
|
|
143
|
+
type: "stdio",
|
|
144
|
+
command: entry.command,
|
|
145
|
+
args: entry.args ?? [],
|
|
146
|
+
...(entry.env ? { env: entry.env } : {}),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
function toClaudeRemoteEntry(entry) {
|
|
150
|
+
return {
|
|
151
|
+
type: entry.transport === "sse" ? "sse" : "http",
|
|
152
|
+
url: entry.url,
|
|
153
|
+
...(entry.headers ? { headers: entry.headers } : {}),
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/* ---- Codex: [mcp_servers.*] TOML sections in ~/.codex/config.toml ---- */
|
|
157
|
+
async function mutateCodexConfig(options, mutate) {
|
|
158
|
+
const homeDir = options.homeDir ?? homedir();
|
|
159
|
+
const configPath = path.join(homeDir, ".codex", "config.toml");
|
|
160
|
+
const backups = [];
|
|
161
|
+
let existingContent = "";
|
|
162
|
+
try {
|
|
163
|
+
existingContent = await readFile(configPath, "utf8");
|
|
164
|
+
const backup = await backupFile(configPath);
|
|
165
|
+
if (backup)
|
|
166
|
+
backups.push(backup);
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
// fresh config
|
|
170
|
+
}
|
|
171
|
+
const current = await readCodexConfig({ cwd: options.cwd, homeDir });
|
|
172
|
+
const state = {
|
|
173
|
+
mcpServers: { ...current.mcpServers },
|
|
174
|
+
remoteMcpServers: { ...current.remoteMcpServers },
|
|
175
|
+
};
|
|
176
|
+
mutate(state);
|
|
177
|
+
// Rebuild the file: everything that isn't an mcp_servers section, then ours.
|
|
178
|
+
const nonMcp = stripCodexMcpSections(existingContent).trim();
|
|
179
|
+
const mcpToml = buildCodexMcpToml(state);
|
|
180
|
+
const final = [nonMcp, mcpToml].filter((part) => part.length > 0).join("\n\n");
|
|
181
|
+
await mkdir(path.dirname(configPath), { recursive: true });
|
|
182
|
+
await atomicWrite(configPath, final + "\n");
|
|
183
|
+
return { backups };
|
|
184
|
+
}
|
|
185
|
+
function stripCodexMcpSections(content) {
|
|
186
|
+
const lines = content.split("\n");
|
|
187
|
+
const result = [];
|
|
188
|
+
let inMcp = false;
|
|
189
|
+
for (const line of lines) {
|
|
190
|
+
if (/^\[mcp_servers[\].]/.test(line)) {
|
|
191
|
+
inMcp = true;
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
if (inMcp && /^\[/.test(line) && !/^\[mcp_servers[\].]/.test(line)) {
|
|
195
|
+
inMcp = false;
|
|
196
|
+
}
|
|
197
|
+
if (!inMcp)
|
|
198
|
+
result.push(line);
|
|
199
|
+
}
|
|
200
|
+
return result.join("\n");
|
|
201
|
+
}
|
|
202
|
+
function buildCodexMcpToml(state) {
|
|
203
|
+
const lines = [];
|
|
204
|
+
for (const [name, entry] of Object.entries(state.mcpServers)) {
|
|
205
|
+
lines.push(`[mcp_servers.${name}]`);
|
|
206
|
+
lines.push(`command = ${tomlStr(entry.command)}`);
|
|
207
|
+
if (entry.args && entry.args.length > 0) {
|
|
208
|
+
lines.push(`args = [${entry.args.map(tomlStr).join(", ")}]`);
|
|
209
|
+
}
|
|
210
|
+
if (entry.env && Object.keys(entry.env).length > 0) {
|
|
211
|
+
lines.push("");
|
|
212
|
+
lines.push(`[mcp_servers.${name}.env]`);
|
|
213
|
+
for (const [key, value] of Object.entries(entry.env)) {
|
|
214
|
+
lines.push(`${key} = ${tomlStr(value)}`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
lines.push("");
|
|
218
|
+
}
|
|
219
|
+
// Codex TOML only carries a URL for remote servers; transport/headers are
|
|
220
|
+
// Claude/Antigravity concepts and are dropped (preview warns about this).
|
|
221
|
+
for (const [name, entry] of Object.entries(state.remoteMcpServers)) {
|
|
222
|
+
lines.push(`[mcp_servers.${name}]`);
|
|
223
|
+
lines.push(`url = ${tomlStr(entry.url)}`);
|
|
224
|
+
lines.push("");
|
|
225
|
+
}
|
|
226
|
+
return lines.join("\n").trim();
|
|
227
|
+
}
|
|
228
|
+
function tomlStr(value) {
|
|
229
|
+
return `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
|
|
230
|
+
}
|
|
231
|
+
/* ---- Antigravity: JSON mcpServers at the live candidate path ---- */
|
|
232
|
+
async function mutateAntigravityConfig(options, mutate) {
|
|
233
|
+
const homeDir = options.homeDir ?? homedir();
|
|
234
|
+
// Antigravity has shipped several config locations; write to whichever one
|
|
235
|
+
// is live (the reader resolves it), falling back to the current default.
|
|
236
|
+
const live = await readAntigravityConfig({ cwd: options.cwd, homeDir });
|
|
237
|
+
const configPath = live.configPath;
|
|
238
|
+
const backups = [];
|
|
239
|
+
let existing = {};
|
|
240
|
+
try {
|
|
241
|
+
const source = await readFile(configPath, "utf8");
|
|
242
|
+
if (source.trim().length > 0) {
|
|
243
|
+
existing = JSON.parse(source);
|
|
244
|
+
}
|
|
245
|
+
const backup = await backupFile(configPath);
|
|
246
|
+
if (backup)
|
|
247
|
+
backups.push(backup);
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
// fresh config
|
|
251
|
+
}
|
|
252
|
+
const servers = (existing.mcpServers ?? {});
|
|
253
|
+
mutate(servers);
|
|
254
|
+
existing.mcpServers = servers;
|
|
255
|
+
await mkdir(path.dirname(configPath), { recursive: true });
|
|
256
|
+
await atomicWriteJson(configPath, existing);
|
|
257
|
+
return { backups };
|
|
258
|
+
}
|
|
259
|
+
function toAntigravityEntry(entry) {
|
|
260
|
+
return {
|
|
261
|
+
command: entry.command,
|
|
262
|
+
args: entry.args ?? [],
|
|
263
|
+
...(entry.env ? { env: entry.env } : {}),
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
function toAntigravityRemoteEntry(entry) {
|
|
267
|
+
return {
|
|
268
|
+
...(entry.transport === "http" ? { httpUrl: entry.url } : { url: entry.url }),
|
|
269
|
+
...(entry.headers ? { headers: entry.headers } : {}),
|
|
270
|
+
...(entry.env ? { env: entry.env } : {}),
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
/* ---- brainctl-compat project MCPs: <cwd>/.brainctl/project-mcps.json ---- */
|
|
274
|
+
async function mutateBrainctlProjectMcps(options, agent, mutate) {
|
|
275
|
+
const filePath = path.join(options.cwd, ".brainctl", "project-mcps.json");
|
|
276
|
+
const backups = [];
|
|
277
|
+
let data = {};
|
|
278
|
+
try {
|
|
279
|
+
data = JSON.parse(await readFile(filePath, "utf8"));
|
|
280
|
+
const backup = await backupFile(filePath);
|
|
281
|
+
if (backup)
|
|
282
|
+
backups.push(backup);
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
// fresh file
|
|
286
|
+
}
|
|
287
|
+
const agentData = (data[agent] ?? {});
|
|
288
|
+
const servers = (agentData.mcpServers ?? {});
|
|
289
|
+
mutate(servers);
|
|
290
|
+
agentData.mcpServers = servers;
|
|
291
|
+
data[agent] = agentData;
|
|
292
|
+
await mkdir(path.dirname(filePath), { recursive: true });
|
|
293
|
+
await atomicWriteJson(filePath, data);
|
|
294
|
+
return { backups };
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Resolve the directory holding a skill's SKILL.md. Project scope is
|
|
298
|
+
* Claude-only — Codex and Antigravity have no project-skills concept.
|
|
299
|
+
*/
|
|
300
|
+
export function getSkillDir(location, cwd, homeDir) {
|
|
301
|
+
const { agent, scope } = location;
|
|
302
|
+
const safeName = path.basename(location.skillName);
|
|
303
|
+
if (scope === "project") {
|
|
304
|
+
if (agent !== "claude") {
|
|
305
|
+
throw new Error(`Project-scoped skills are not supported for ${agent}; only Claude reads .claude/skills/ from the workspace.`);
|
|
306
|
+
}
|
|
307
|
+
return path.join(cwd, ".claude", "skills", safeName);
|
|
308
|
+
}
|
|
309
|
+
const home = homeDir ?? homedir();
|
|
310
|
+
const agentDir = { claude: ".claude", codex: ".codex", antigravity: ".gemini" }[agent];
|
|
311
|
+
return path.join(home, agentDir, "skills", safeName);
|
|
312
|
+
}
|
|
313
|
+
export async function copySkill(options) {
|
|
314
|
+
const sourceDir = getSkillDir(options.source, options.cwd, options.homeDir);
|
|
315
|
+
const targetDir = getSkillDir(options.target, options.cwd, options.homeDir);
|
|
316
|
+
try {
|
|
317
|
+
await stat(sourceDir);
|
|
318
|
+
}
|
|
319
|
+
catch {
|
|
320
|
+
throw new Error(`Skill "${options.source.skillName}" not found for ${options.source.agent} at ${sourceDir}.`);
|
|
321
|
+
}
|
|
322
|
+
await mkdir(path.dirname(targetDir), { recursive: true });
|
|
323
|
+
await rm(targetDir, { recursive: true, force: true });
|
|
324
|
+
await cp(sourceDir, targetDir, { recursive: true });
|
|
325
|
+
return { backups: [] };
|
|
326
|
+
}
|
|
327
|
+
export async function removeSkill(options) {
|
|
328
|
+
const skillDir = getSkillDir(options.location, options.cwd, options.homeDir);
|
|
329
|
+
const backup = await backupSkillDir(options, skillDir);
|
|
330
|
+
await rm(skillDir, { recursive: true, force: true });
|
|
331
|
+
return { backups: backup ? [backup] : [] };
|
|
332
|
+
}
|
|
333
|
+
export async function moveSkill(options) {
|
|
334
|
+
const sourceDir = getSkillDir(options.source, options.cwd, options.homeDir);
|
|
335
|
+
const targetDir = getSkillDir(options.target, options.cwd, options.homeDir);
|
|
336
|
+
try {
|
|
337
|
+
await stat(sourceDir);
|
|
338
|
+
}
|
|
339
|
+
catch {
|
|
340
|
+
// Idempotent: source already gone but destination present → done.
|
|
341
|
+
try {
|
|
342
|
+
await stat(targetDir);
|
|
343
|
+
return { backups: [] };
|
|
344
|
+
}
|
|
345
|
+
catch {
|
|
346
|
+
throw new Error(`Skill "${options.source.skillName}" not found for ${options.source.agent} at ${sourceDir}.`);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
await mkdir(path.dirname(targetDir), { recursive: true });
|
|
350
|
+
await rm(targetDir, { recursive: true, force: true });
|
|
351
|
+
await cp(sourceDir, targetDir, { recursive: true });
|
|
352
|
+
const backup = await backupSkillDir(options, sourceDir);
|
|
353
|
+
await rm(sourceDir, { recursive: true, force: true });
|
|
354
|
+
return { backups: backup ? [backup] : [] };
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Copy a skill dir that is about to be deleted into the central backup area.
|
|
358
|
+
* Deliberately NOT a sibling `.bak.*` directory — the readers would list that
|
|
359
|
+
* as a new skill.
|
|
360
|
+
*/
|
|
361
|
+
async function backupSkillDir(options, skillDir) {
|
|
362
|
+
try {
|
|
363
|
+
await stat(skillDir);
|
|
364
|
+
}
|
|
365
|
+
catch {
|
|
366
|
+
return null;
|
|
367
|
+
}
|
|
368
|
+
const homeDir = options.homeDir ?? homedir();
|
|
369
|
+
const backupDir = path.join(homeDir, ".config", "nomoreide", "agent-env-backups", `${path.basename(skillDir)}.${formatTimestamp()}`);
|
|
370
|
+
await mkdir(path.dirname(backupDir), { recursive: true });
|
|
371
|
+
await cp(skillDir, backupDir, { recursive: true });
|
|
372
|
+
return backupDir;
|
|
373
|
+
}
|
|
374
|
+
/* ---- Snapshot: back up an agent's config file before bulk operations ---- */
|
|
375
|
+
export async function snapshotAgentConfig(options) {
|
|
376
|
+
const homeDir = options.homeDir ?? homedir();
|
|
377
|
+
const configPath = options.agent === "claude"
|
|
378
|
+
? path.join(homeDir, ".claude.json")
|
|
379
|
+
: options.agent === "codex"
|
|
380
|
+
? path.join(homeDir, ".codex", "config.toml")
|
|
381
|
+
: (await readAntigravityConfig({ cwd: options.cwd, homeDir })).configPath;
|
|
382
|
+
const backup = await backupFile(configPath);
|
|
383
|
+
return { backups: backup ? [backup] : [] };
|
|
384
|
+
}
|
|
385
|
+
//# sourceMappingURL=agent-env-writers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-env-writers.js","sourceRoot":"","sources":["../../src/core/agent-env-writers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type AgentName } from "../agent-env/index.js";
|
|
2
|
+
import { type ProfileStoreOptions } from "./store.js";
|
|
3
|
+
export type ProfileItemStatus = "add" | "identical" | "conflict";
|
|
4
|
+
export interface ProfileApplyItem {
|
|
5
|
+
category: "mcp" | "skill";
|
|
6
|
+
name: string;
|
|
7
|
+
status: ProfileItemStatus;
|
|
8
|
+
warnings: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface ProfileApplyPreview {
|
|
11
|
+
profile: string;
|
|
12
|
+
agent: AgentName;
|
|
13
|
+
items: ProfileApplyItem[];
|
|
14
|
+
/** `${credentials.*}` keys still unresolved in the profile — applied as-is. */
|
|
15
|
+
unresolvedCredentials: string[];
|
|
16
|
+
}
|
|
17
|
+
export interface ProfileApplyOptions extends ProfileStoreOptions {
|
|
18
|
+
cwd: string;
|
|
19
|
+
name: string;
|
|
20
|
+
agent: AgentName;
|
|
21
|
+
/** Item names (per category) to leave untouched — typically conflicts the user kept. */
|
|
22
|
+
skip?: {
|
|
23
|
+
mcps?: string[];
|
|
24
|
+
skills?: string[];
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export declare function previewProfileApply(options: Omit<ProfileApplyOptions, "skip">): Promise<ProfileApplyPreview>;
|
|
28
|
+
export interface ProfileApplyResult {
|
|
29
|
+
profile: string;
|
|
30
|
+
agent: AgentName;
|
|
31
|
+
mcpsApplied: string[];
|
|
32
|
+
skillsApplied: string[];
|
|
33
|
+
skipped: string[];
|
|
34
|
+
backups: string[];
|
|
35
|
+
}
|
|
36
|
+
export declare function applyProfile(options: ProfileApplyOptions): Promise<ProfileApplyResult>;
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Apply a profile to an agent — the write-gated half of Agent Profiles.
|
|
3
|
+
* Mirrors the ROR-61 staged-writes gate: `previewProfileApply` classifies
|
|
4
|
+
* every item (add / identical / conflict) and surfaces warnings, then
|
|
5
|
+
* `applyProfile` snapshots the agent's config, writes through the
|
|
6
|
+
* write-guarded agent-env-writers layer, and reports every backup created.
|
|
7
|
+
*/
|
|
8
|
+
import { cp, mkdir, rm } from "node:fs/promises";
|
|
9
|
+
import path from "node:path";
|
|
10
|
+
import { addMcp, getSkillDir, snapshotAgentConfig } from "../agent-env-writers.js";
|
|
11
|
+
import { readAllAgentConfigs, } from "../agent-env/index.js";
|
|
12
|
+
import { findUnresolvedCredentialKeys } from "./credentials.js";
|
|
13
|
+
import { getProfile, profileSkillsDir, pathExists } from "./store.js";
|
|
14
|
+
export async function previewProfileApply(options) {
|
|
15
|
+
const [profile, live] = await Promise.all([
|
|
16
|
+
getProfile(options.name, options),
|
|
17
|
+
readLiveConfig(options),
|
|
18
|
+
]);
|
|
19
|
+
const items = [];
|
|
20
|
+
for (const [key, mcp] of Object.entries(profile.mcps)) {
|
|
21
|
+
const existing = findLiveMcp(live, key);
|
|
22
|
+
const warnings = [];
|
|
23
|
+
if (options.agent === "codex" &&
|
|
24
|
+
mcp.kind === "remote" &&
|
|
25
|
+
(mcp.headers || mcp.transport === "sse")) {
|
|
26
|
+
warnings.push("Codex config only stores a URL for remote MCPs; transport and headers will be dropped.");
|
|
27
|
+
}
|
|
28
|
+
items.push({
|
|
29
|
+
category: "mcp",
|
|
30
|
+
name: key,
|
|
31
|
+
status: existing === undefined ? "add" : sameMcp(existing, mcp) ? "identical" : "conflict",
|
|
32
|
+
warnings,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
const liveSkillNames = new Set(live.skills.filter((skill) => skill.scope === "user").map((skill) => skill.name));
|
|
36
|
+
for (const skill of profile.skills) {
|
|
37
|
+
items.push({
|
|
38
|
+
category: "skill",
|
|
39
|
+
name: skill.name,
|
|
40
|
+
// Skill contents aren't diffed — an existing dir with the same name is a conflict.
|
|
41
|
+
status: liveSkillNames.has(skill.name) ? "conflict" : "add",
|
|
42
|
+
warnings: [],
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
profile: profile.name,
|
|
47
|
+
agent: options.agent,
|
|
48
|
+
items,
|
|
49
|
+
unresolvedCredentials: findUnresolvedCredentialKeys(profile.mcps),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export async function applyProfile(options) {
|
|
53
|
+
const profile = await getProfile(options.name, options);
|
|
54
|
+
const base = { cwd: options.cwd, homeDir: options.homeDir };
|
|
55
|
+
const skipMcps = new Set(options.skip?.mcps ?? []);
|
|
56
|
+
const skipSkills = new Set(options.skip?.skills ?? []);
|
|
57
|
+
const backups = [];
|
|
58
|
+
const skipped = [];
|
|
59
|
+
// One snapshot of the agent's config file before the batch (plus the
|
|
60
|
+
// per-write .bak.* copies the writers create anyway).
|
|
61
|
+
const snapshot = await snapshotAgentConfig({ ...base, agent: options.agent });
|
|
62
|
+
backups.push(...snapshot.backups);
|
|
63
|
+
const mcpsApplied = [];
|
|
64
|
+
for (const [key, mcp] of Object.entries(profile.mcps)) {
|
|
65
|
+
if (skipMcps.has(key)) {
|
|
66
|
+
skipped.push(`mcp "${key}"`);
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const outcome = await addMcp({
|
|
70
|
+
...base,
|
|
71
|
+
agent: options.agent,
|
|
72
|
+
key,
|
|
73
|
+
scope: "user",
|
|
74
|
+
entry: mcp.kind === "local"
|
|
75
|
+
? { command: mcp.command, args: mcp.args, env: mcp.env }
|
|
76
|
+
: undefined,
|
|
77
|
+
remoteEntry: mcp.kind === "remote"
|
|
78
|
+
? { transport: mcp.transport, url: mcp.url, headers: mcp.headers, env: mcp.env }
|
|
79
|
+
: undefined,
|
|
80
|
+
});
|
|
81
|
+
backups.push(...outcome.backups);
|
|
82
|
+
mcpsApplied.push(key);
|
|
83
|
+
}
|
|
84
|
+
const skillsApplied = [];
|
|
85
|
+
for (const skill of profile.skills) {
|
|
86
|
+
if (skipSkills.has(skill.name)) {
|
|
87
|
+
skipped.push(`skill "${skill.name}"`);
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
const sourceDir = path.join(profileSkillsDir(options.name, options), path.basename(skill.name));
|
|
91
|
+
if (!(await pathExists(sourceDir))) {
|
|
92
|
+
skipped.push(`skill "${skill.name}" (missing from profile bundle)`);
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
await installProfileSkill(sourceDir, skill.name, options);
|
|
96
|
+
skillsApplied.push(skill.name);
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
profile: profile.name,
|
|
100
|
+
agent: options.agent,
|
|
101
|
+
mcpsApplied,
|
|
102
|
+
skillsApplied,
|
|
103
|
+
skipped,
|
|
104
|
+
backups,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/** Copy a bundled skill dir into the agent's user skills dir (idempotent overwrite). */
|
|
108
|
+
async function installProfileSkill(sourceDir, skillName, options) {
|
|
109
|
+
const targetDir = getSkillDir({ agent: options.agent, skillName, scope: "user" }, options.cwd, options.homeDir);
|
|
110
|
+
await mkdir(path.dirname(targetDir), { recursive: true });
|
|
111
|
+
await rm(targetDir, { recursive: true, force: true });
|
|
112
|
+
await cp(sourceDir, targetDir, { recursive: true });
|
|
113
|
+
}
|
|
114
|
+
async function readLiveConfig(options) {
|
|
115
|
+
const configs = await readAllAgentConfigs({ cwd: options.cwd, homeDir: options.homeDir });
|
|
116
|
+
const config = configs.find((candidate) => candidate.agent === options.agent);
|
|
117
|
+
if (!config)
|
|
118
|
+
throw new Error(`Unknown agent "${options.agent}".`);
|
|
119
|
+
return config;
|
|
120
|
+
}
|
|
121
|
+
function findLiveMcp(config, key) {
|
|
122
|
+
const local = config.mcpServers[key];
|
|
123
|
+
if (local)
|
|
124
|
+
return { kind: "local", command: local.command, args: local.args, env: local.env };
|
|
125
|
+
const remote = config.remoteMcpServers[key];
|
|
126
|
+
if (remote) {
|
|
127
|
+
return {
|
|
128
|
+
kind: "remote",
|
|
129
|
+
transport: remote.transport,
|
|
130
|
+
url: remote.url,
|
|
131
|
+
headers: remote.headers,
|
|
132
|
+
env: remote.env,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
return undefined;
|
|
136
|
+
}
|
|
137
|
+
function sameMcp(left, right) {
|
|
138
|
+
return JSON.stringify(normalizeMcp(left)) === JSON.stringify(normalizeMcp(right));
|
|
139
|
+
}
|
|
140
|
+
function normalizeMcp(mcp) {
|
|
141
|
+
if (mcp.kind === "local") {
|
|
142
|
+
return {
|
|
143
|
+
kind: "local",
|
|
144
|
+
command: mcp.command,
|
|
145
|
+
args: mcp.args ?? [],
|
|
146
|
+
env: sortedEntries(mcp.env),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
kind: "remote",
|
|
151
|
+
transport: mcp.transport,
|
|
152
|
+
url: mcp.url,
|
|
153
|
+
headers: sortedEntries(mcp.headers),
|
|
154
|
+
env: sortedEntries(mcp.env),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
function sortedEntries(map) {
|
|
158
|
+
return Object.entries(map ?? {}).sort(([a], [b]) => a.localeCompare(b));
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=apply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/core/agent-profiles/apply.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credential redaction (export) and resolution (import) for portable
|
|
3
|
+
* profiles, ported from brainctl's credential services. Exported archives
|
|
4
|
+
* must never contain raw secrets: secret-looking env/header values become
|
|
5
|
+
* `${credentials.<key>}` placeholders plus a spec describing what the
|
|
6
|
+
* importer has to supply.
|
|
7
|
+
*/
|
|
8
|
+
import type { CredentialSpec, ProfileMcp } from "./types.js";
|
|
9
|
+
export interface RedactionResult {
|
|
10
|
+
redacted: ProfileMcp;
|
|
11
|
+
credentials: CredentialSpec[];
|
|
12
|
+
/** Original secret values, keyed by normalized credential key (kept out of archives). */
|
|
13
|
+
rawValues: Record<string, string>;
|
|
14
|
+
}
|
|
15
|
+
export declare function redactMcpCredentials(config: ProfileMcp): RedactionResult;
|
|
16
|
+
export interface ResolutionResult {
|
|
17
|
+
resolved: ProfileMcp;
|
|
18
|
+
missing: CredentialSpec[];
|
|
19
|
+
}
|
|
20
|
+
export declare function resolveMcpCredentials(config: ProfileMcp, options?: {
|
|
21
|
+
credentials?: Record<string, string>;
|
|
22
|
+
credentialSpecs?: CredentialSpec[];
|
|
23
|
+
environment?: Record<string, string | undefined>;
|
|
24
|
+
}): ResolutionResult;
|
|
25
|
+
/** Every `${credentials.*}` key still present anywhere in the given MCPs. */
|
|
26
|
+
export declare function findUnresolvedCredentialKeys(mcps: Record<string, ProfileMcp>): string[];
|