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,151 @@
|
|
|
1
|
+
export function redactMcpCredentials(config) {
|
|
2
|
+
const specs = new Map();
|
|
3
|
+
const rawValues = {};
|
|
4
|
+
const env = redactStringMap(config.env, "env", specs, rawValues);
|
|
5
|
+
const redacted = config.kind === "remote"
|
|
6
|
+
? {
|
|
7
|
+
...config,
|
|
8
|
+
...(env ? { env } : {}),
|
|
9
|
+
...((() => {
|
|
10
|
+
const headers = redactStringMap(config.headers, "header", specs, rawValues);
|
|
11
|
+
return headers ? { headers } : {};
|
|
12
|
+
})()),
|
|
13
|
+
}
|
|
14
|
+
: { ...config, ...(env ? { env } : {}) };
|
|
15
|
+
return {
|
|
16
|
+
redacted,
|
|
17
|
+
credentials: Array.from(specs.values())
|
|
18
|
+
.sort((left, right) => left.key.localeCompare(right.key))
|
|
19
|
+
.map((entry) => ({
|
|
20
|
+
key: entry.key,
|
|
21
|
+
required: true,
|
|
22
|
+
description: `${Array.from(entry.descriptions).sort().join("; ")} required for MCP access`,
|
|
23
|
+
})),
|
|
24
|
+
rawValues,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function redactStringMap(values, source, specs, rawValues) {
|
|
28
|
+
if (!values)
|
|
29
|
+
return undefined;
|
|
30
|
+
const redacted = {};
|
|
31
|
+
for (const [key, value] of Object.entries(values)) {
|
|
32
|
+
if (!shouldRedact(key)) {
|
|
33
|
+
redacted[key] = value;
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
const credentialKey = tokenizeCredentialKey(key).join("_");
|
|
37
|
+
const description = source === "env" ? `Environment variable ${key}` : `Header ${key}`;
|
|
38
|
+
const existing = specs.get(credentialKey);
|
|
39
|
+
if (existing)
|
|
40
|
+
existing.descriptions.add(description);
|
|
41
|
+
else
|
|
42
|
+
specs.set(credentialKey, { key: credentialKey, descriptions: new Set([description]) });
|
|
43
|
+
if (isCredentialPlaceholder(value)) {
|
|
44
|
+
redacted[key] = value; // already a placeholder — keep as-is
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
rawValues[credentialKey] = value;
|
|
48
|
+
redacted[key] = `\${credentials.${credentialKey}}`;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return redacted;
|
|
52
|
+
}
|
|
53
|
+
function shouldRedact(key) {
|
|
54
|
+
const tokens = tokenizeCredentialKey(key);
|
|
55
|
+
if (tokens.length === 0)
|
|
56
|
+
return false;
|
|
57
|
+
const last = tokens[tokens.length - 1];
|
|
58
|
+
return (last === "authorization" ||
|
|
59
|
+
last === "password" ||
|
|
60
|
+
last === "secret" ||
|
|
61
|
+
last === "token" ||
|
|
62
|
+
(last === "key" && (tokens.includes("api") || tokens.includes("auth"))));
|
|
63
|
+
}
|
|
64
|
+
function tokenizeCredentialKey(key) {
|
|
65
|
+
return key
|
|
66
|
+
.trim()
|
|
67
|
+
.replace(/([A-Z]+)([A-Z][a-z0-9])/g, "$1 $2")
|
|
68
|
+
.replace(/([a-z0-9])([A-Z])/g, "$1 $2")
|
|
69
|
+
.toLowerCase()
|
|
70
|
+
.split(/[^a-z0-9]+/g)
|
|
71
|
+
.filter(Boolean);
|
|
72
|
+
}
|
|
73
|
+
function isCredentialPlaceholder(value) {
|
|
74
|
+
return (/^\$\{credentials\.[^}]+\}$/.test(value) ||
|
|
75
|
+
/^(Bearer|Token)\s+\$\{credentials\.[^}]+\}$/i.test(value));
|
|
76
|
+
}
|
|
77
|
+
export function resolveMcpCredentials(config, options = {}) {
|
|
78
|
+
const specs = new Map((options.credentialSpecs ?? []).map((spec) => [spec.key, spec]));
|
|
79
|
+
const missing = new Map();
|
|
80
|
+
const env = resolveStringMap(config.env, specs, missing, options);
|
|
81
|
+
const resolved = config.kind === "remote"
|
|
82
|
+
? {
|
|
83
|
+
...config,
|
|
84
|
+
...(env ? { env } : {}),
|
|
85
|
+
...((() => {
|
|
86
|
+
const headers = resolveStringMap(config.headers, specs, missing, options);
|
|
87
|
+
return headers ? { headers } : {};
|
|
88
|
+
})()),
|
|
89
|
+
}
|
|
90
|
+
: { ...config, ...(env ? { env } : {}) };
|
|
91
|
+
return { resolved, missing: Array.from(missing.values()) };
|
|
92
|
+
}
|
|
93
|
+
function resolveStringMap(values, specs, missing, options) {
|
|
94
|
+
if (!values)
|
|
95
|
+
return undefined;
|
|
96
|
+
const resolved = {};
|
|
97
|
+
for (const [key, value] of Object.entries(values)) {
|
|
98
|
+
const placeholder = parseCredentialPlaceholder(value);
|
|
99
|
+
if (!placeholder) {
|
|
100
|
+
resolved[key] = value;
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const supplied = options.credentials?.[placeholder.key] ?? options.environment?.[placeholder.key];
|
|
104
|
+
if (typeof supplied === "string" && supplied.length > 0) {
|
|
105
|
+
resolved[key] = placeholder.prefix ? `${placeholder.prefix} ${supplied}` : supplied;
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const spec = specs.get(placeholder.key) ?? {
|
|
109
|
+
key: placeholder.key,
|
|
110
|
+
required: true,
|
|
111
|
+
description: `Credential ${placeholder.key} is required`,
|
|
112
|
+
};
|
|
113
|
+
if (spec.required)
|
|
114
|
+
missing.set(spec.key, spec);
|
|
115
|
+
resolved[key] = value; // keep the placeholder; the user can fill it later
|
|
116
|
+
}
|
|
117
|
+
return resolved;
|
|
118
|
+
}
|
|
119
|
+
function parseCredentialPlaceholder(value) {
|
|
120
|
+
const bare = value.match(/^\$\{credentials\.([^}]+)\}$/);
|
|
121
|
+
if (bare)
|
|
122
|
+
return { key: bare[1] };
|
|
123
|
+
const prefixed = value.match(/^(Bearer|Token)\s+\$\{credentials\.([^}]+)\}$/i);
|
|
124
|
+
if (prefixed) {
|
|
125
|
+
return {
|
|
126
|
+
key: prefixed[2],
|
|
127
|
+
prefix: prefixed[1].toLowerCase() === "bearer" ? "Bearer" : "Token",
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
const PLACEHOLDER_PATTERN = /\$\{\s*credentials\.([^}\s]+)\s*\}/g;
|
|
133
|
+
/** Every `${credentials.*}` key still present anywhere in the given MCPs. */
|
|
134
|
+
export function findUnresolvedCredentialKeys(mcps) {
|
|
135
|
+
const keys = new Set();
|
|
136
|
+
const visit = (value) => {
|
|
137
|
+
if (typeof value === "string") {
|
|
138
|
+
for (const match of value.matchAll(PLACEHOLDER_PATTERN))
|
|
139
|
+
keys.add(match[1]);
|
|
140
|
+
}
|
|
141
|
+
else if (Array.isArray(value)) {
|
|
142
|
+
value.forEach(visit);
|
|
143
|
+
}
|
|
144
|
+
else if (value && typeof value === "object") {
|
|
145
|
+
Object.values(value).forEach(visit);
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
visit(mcps);
|
|
149
|
+
return Array.from(keys).sort();
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../../src/core/agent-profiles/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Profiles (ROR-62): named MCP+skill bundles stored under
|
|
3
|
+
* `~/.config/nomoreide/agent-profiles/`, applied to agents through the
|
|
4
|
+
* write-guarded agent-env layer, shared as credential-redacted tarballs.
|
|
5
|
+
*/
|
|
6
|
+
export { applyProfile, previewProfileApply, type ProfileApplyItem, type ProfileApplyPreview, type ProfileApplyResult, type ProfileItemStatus, } from "./apply.js";
|
|
7
|
+
export { findUnresolvedCredentialKeys, redactMcpCredentials, resolveMcpCredentials, } from "./credentials.js";
|
|
8
|
+
export { assertValidProfileName, copySkillBetweenProfiles, createProfile, deleteProfile, getProfile, listProfiles, profileDir, profilesRoot, profileSkillsDir, snapshotProfileFromAgent, updateProfile, writeProfile, type ProfileStoreOptions, } from "./store.js";
|
|
9
|
+
export { exportProfile, importProfile, type ExportResult, type ImportResult } from "./transfer.js";
|
|
10
|
+
export { PROFILE_NAME_PATTERN, profileManifestSchema, profileMcpSchema, profileSchema, slugifyProfileName, type CredentialSpec, type Profile, type ProfileManifest, type ProfileMcp, type ProfileSummary, } from "./types.js";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Profiles (ROR-62): named MCP+skill bundles stored under
|
|
3
|
+
* `~/.config/nomoreide/agent-profiles/`, applied to agents through the
|
|
4
|
+
* write-guarded agent-env layer, shared as credential-redacted tarballs.
|
|
5
|
+
*/
|
|
6
|
+
export { applyProfile, previewProfileApply, } from "./apply.js";
|
|
7
|
+
export { findUnresolvedCredentialKeys, redactMcpCredentials, resolveMcpCredentials, } from "./credentials.js";
|
|
8
|
+
export { assertValidProfileName, copySkillBetweenProfiles, createProfile, deleteProfile, getProfile, listProfiles, profileDir, profilesRoot, profileSkillsDir, snapshotProfileFromAgent, updateProfile, writeProfile, } from "./store.js";
|
|
9
|
+
export { exportProfile, importProfile } from "./transfer.js";
|
|
10
|
+
export { PROFILE_NAME_PATTERN, profileManifestSchema, profileMcpSchema, profileSchema, slugifyProfileName, } from "./types.js";
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/agent-profiles/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,YAAY,EACZ,mBAAmB,GAKpB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,aAAa,EACb,aAAa,EACb,UAAU,EACV,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,wBAAwB,EACxB,aAAa,EACb,YAAY,GAEb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAwC,MAAM,eAAe,CAAC;AACnG,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,EACb,kBAAkB,GAMnB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type AgentMcpEntry, type AgentName, type RemoteMcpEntry } from "../agent-env/index.js";
|
|
2
|
+
import { type Profile, type ProfileMcp, type ProfileSummary } from "./types.js";
|
|
3
|
+
export interface ProfileStoreOptions {
|
|
4
|
+
/** Injectable for tmpdir tests, like the agent-env readers. */
|
|
5
|
+
homeDir?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function profilesRoot(options?: ProfileStoreOptions): string;
|
|
8
|
+
export declare function profileDir(name: string, options?: ProfileStoreOptions): string;
|
|
9
|
+
export declare function profileSkillsDir(name: string, options?: ProfileStoreOptions): string;
|
|
10
|
+
export declare function assertValidProfileName(name: string): string;
|
|
11
|
+
export declare function listProfiles(options?: ProfileStoreOptions): Promise<ProfileSummary[]>;
|
|
12
|
+
export declare function getProfile(name: string, options?: ProfileStoreOptions): Promise<Profile>;
|
|
13
|
+
export declare function createProfile(input: {
|
|
14
|
+
name: string;
|
|
15
|
+
description?: string;
|
|
16
|
+
}, options?: ProfileStoreOptions): Promise<Profile>;
|
|
17
|
+
export declare function updateProfile(name: string, patch: Partial<Pick<Profile, "description" | "mcps" | "skills">>, options?: ProfileStoreOptions): Promise<Profile>;
|
|
18
|
+
export declare function deleteProfile(name: string, options?: ProfileStoreOptions): Promise<void>;
|
|
19
|
+
export declare function writeProfile(profile: Profile, options?: ProfileStoreOptions): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Capture an agent's live config (MCPs + local skills) into a new profile.
|
|
22
|
+
* Raw credential values are kept — the profile lives in the user's own config
|
|
23
|
+
* dir; redaction happens at export time.
|
|
24
|
+
*/
|
|
25
|
+
export declare function snapshotProfileFromAgent(input: {
|
|
26
|
+
agent: AgentName;
|
|
27
|
+
name: string;
|
|
28
|
+
description?: string;
|
|
29
|
+
cwd: string;
|
|
30
|
+
}, options?: ProfileStoreOptions): Promise<Profile>;
|
|
31
|
+
export declare function toLocalProfileMcp(entry: AgentMcpEntry): ProfileMcp;
|
|
32
|
+
export declare function toRemoteProfileMcp(entry: RemoteMcpEntry): ProfileMcp;
|
|
33
|
+
/** Copy one bundled skill dir between profiles (no-op if the source has no files). */
|
|
34
|
+
export declare function copySkillBetweenProfiles(from: string, to: string, skillName: string, options?: ProfileStoreOptions): Promise<void>;
|
|
35
|
+
export declare function pathExists(target: string): Promise<boolean>;
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Profile storage: `<home>/.config/nomoreide/agent-profiles/<name>/` holding a
|
|
3
|
+
* Zod-validated `profile.json` plus bundled skill directories under `skills/`.
|
|
4
|
+
* Writes here only touch nomoreide's own config area — applying a profile to
|
|
5
|
+
* an agent goes through `apply.ts` (which uses the write-guarded
|
|
6
|
+
* agent-env-writers layer).
|
|
7
|
+
*/
|
|
8
|
+
import { cp, mkdir, readdir, readFile, rename, rm, stat, writeFile } from "node:fs/promises";
|
|
9
|
+
import { homedir } from "node:os";
|
|
10
|
+
import path from "node:path";
|
|
11
|
+
import { readAllAgentConfigs, } from "../agent-env/index.js";
|
|
12
|
+
import { PROFILE_NAME_PATTERN, profileSchema, } from "./types.js";
|
|
13
|
+
export function profilesRoot(options = {}) {
|
|
14
|
+
const home = options.homeDir ?? homedir();
|
|
15
|
+
return path.join(home, ".config", "nomoreide", "agent-profiles");
|
|
16
|
+
}
|
|
17
|
+
export function profileDir(name, options = {}) {
|
|
18
|
+
return path.join(profilesRoot(options), path.basename(name));
|
|
19
|
+
}
|
|
20
|
+
function profileFile(name, options = {}) {
|
|
21
|
+
return path.join(profileDir(name, options), "profile.json");
|
|
22
|
+
}
|
|
23
|
+
export function profileSkillsDir(name, options = {}) {
|
|
24
|
+
return path.join(profileDir(name, options), "skills");
|
|
25
|
+
}
|
|
26
|
+
export function assertValidProfileName(name) {
|
|
27
|
+
const trimmed = name.trim();
|
|
28
|
+
if (!PROFILE_NAME_PATTERN.test(trimmed)) {
|
|
29
|
+
throw new Error(`Invalid profile name "${trimmed}". Use letters, numbers, ".", "_", or "-".`);
|
|
30
|
+
}
|
|
31
|
+
return trimmed;
|
|
32
|
+
}
|
|
33
|
+
export async function listProfiles(options = {}) {
|
|
34
|
+
const root = profilesRoot(options);
|
|
35
|
+
const summaries = [];
|
|
36
|
+
let entries;
|
|
37
|
+
try {
|
|
38
|
+
entries = await readdir(root, { withFileTypes: true });
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return []; // no profiles yet
|
|
42
|
+
}
|
|
43
|
+
for (const entry of entries) {
|
|
44
|
+
if (!entry.isDirectory())
|
|
45
|
+
continue;
|
|
46
|
+
try {
|
|
47
|
+
const filePath = profileFile(entry.name, options);
|
|
48
|
+
const info = await stat(filePath);
|
|
49
|
+
const profile = await getProfile(entry.name, options);
|
|
50
|
+
summaries.push({
|
|
51
|
+
name: profile.name,
|
|
52
|
+
description: profile.description,
|
|
53
|
+
mcpCount: Object.keys(profile.mcps).length,
|
|
54
|
+
skillCount: profile.skills.length,
|
|
55
|
+
updatedAt: info.mtime.toISOString(),
|
|
56
|
+
mtimeMs: info.mtimeMs,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// not a profile folder (or corrupt) — skip it
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return summaries
|
|
64
|
+
.sort((left, right) => right.mtimeMs - left.mtimeMs || left.name.localeCompare(right.name))
|
|
65
|
+
.map(({ mtimeMs: _mtimeMs, ...summary }) => summary);
|
|
66
|
+
}
|
|
67
|
+
export async function getProfile(name, options = {}) {
|
|
68
|
+
const filePath = profileFile(name, options);
|
|
69
|
+
let source;
|
|
70
|
+
try {
|
|
71
|
+
source = await readFile(filePath, "utf8");
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
throw new Error(`Profile "${name}" not found.`);
|
|
75
|
+
}
|
|
76
|
+
const parsed = profileSchema.safeParse(JSON.parse(source));
|
|
77
|
+
if (!parsed.success) {
|
|
78
|
+
throw new Error(`Profile "${name}" has an invalid profile.json.`);
|
|
79
|
+
}
|
|
80
|
+
return parsed.data;
|
|
81
|
+
}
|
|
82
|
+
export async function createProfile(input, options = {}) {
|
|
83
|
+
const name = assertValidProfileName(input.name);
|
|
84
|
+
if (await pathExists(profileFile(name, options))) {
|
|
85
|
+
throw new Error(`Profile "${name}" already exists.`);
|
|
86
|
+
}
|
|
87
|
+
const profile = {
|
|
88
|
+
name,
|
|
89
|
+
...(input.description ? { description: input.description } : {}),
|
|
90
|
+
mcps: {},
|
|
91
|
+
skills: [],
|
|
92
|
+
};
|
|
93
|
+
await writeProfile(profile, options);
|
|
94
|
+
return profile;
|
|
95
|
+
}
|
|
96
|
+
export async function updateProfile(name, patch, options = {}) {
|
|
97
|
+
const existing = await getProfile(name, options);
|
|
98
|
+
const next = profileSchema.parse({ ...existing, ...patch, name: existing.name });
|
|
99
|
+
// Drop bundled skill dirs that are no longer referenced.
|
|
100
|
+
if (patch.skills) {
|
|
101
|
+
const kept = new Set(next.skills.map((skill) => skill.name));
|
|
102
|
+
for (const skill of existing.skills) {
|
|
103
|
+
if (!kept.has(skill.name)) {
|
|
104
|
+
await rm(path.join(profileSkillsDir(name, options), path.basename(skill.name)), {
|
|
105
|
+
recursive: true,
|
|
106
|
+
force: true,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
await writeProfile(next, options);
|
|
112
|
+
return next;
|
|
113
|
+
}
|
|
114
|
+
export async function deleteProfile(name, options = {}) {
|
|
115
|
+
if (!(await pathExists(profileFile(name, options)))) {
|
|
116
|
+
throw new Error(`Profile "${name}" not found.`);
|
|
117
|
+
}
|
|
118
|
+
await rm(profileDir(name, options), { recursive: true, force: true });
|
|
119
|
+
}
|
|
120
|
+
export async function writeProfile(profile, options = {}) {
|
|
121
|
+
const folder = profileDir(profile.name, options);
|
|
122
|
+
await mkdir(folder, { recursive: true });
|
|
123
|
+
const filePath = profileFile(profile.name, options);
|
|
124
|
+
const tmpPath = `${filePath}.tmp.${Date.now()}`;
|
|
125
|
+
await writeFile(tmpPath, JSON.stringify(profile, null, 2) + "\n", "utf8");
|
|
126
|
+
await rename(tmpPath, filePath);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Capture an agent's live config (MCPs + local skills) into a new profile.
|
|
130
|
+
* Raw credential values are kept — the profile lives in the user's own config
|
|
131
|
+
* dir; redaction happens at export time.
|
|
132
|
+
*/
|
|
133
|
+
export async function snapshotProfileFromAgent(input, options = {}) {
|
|
134
|
+
const name = assertValidProfileName(input.name);
|
|
135
|
+
if (await pathExists(profileFile(name, options))) {
|
|
136
|
+
throw new Error(`Profile "${name}" already exists.`);
|
|
137
|
+
}
|
|
138
|
+
const configs = await readAllAgentConfigs({ cwd: input.cwd, homeDir: options.homeDir });
|
|
139
|
+
const config = configs.find((candidate) => candidate.agent === input.agent);
|
|
140
|
+
if (!config?.exists && (config?.skills.length ?? 0) === 0) {
|
|
141
|
+
throw new Error(`Agent "${input.agent}" has no live config to snapshot.`);
|
|
142
|
+
}
|
|
143
|
+
const mcps = {};
|
|
144
|
+
for (const [key, entry] of Object.entries(config.mcpServers)) {
|
|
145
|
+
mcps[key] = toLocalProfileMcp(entry);
|
|
146
|
+
}
|
|
147
|
+
for (const [key, entry] of Object.entries(config.remoteMcpServers)) {
|
|
148
|
+
mcps[key] = toRemoteProfileMcp(entry);
|
|
149
|
+
}
|
|
150
|
+
const profile = {
|
|
151
|
+
name,
|
|
152
|
+
...(input.description ? { description: input.description } : {}),
|
|
153
|
+
mcps,
|
|
154
|
+
skills: [],
|
|
155
|
+
};
|
|
156
|
+
// Bundle plain user-scope skills. Plugins are managed installs (excluded,
|
|
157
|
+
// same rule as ROR-61 staged writes); project skills belong to their repo.
|
|
158
|
+
for (const skill of config.skills) {
|
|
159
|
+
if (skill.kind === "plugin" || skill.scope !== "user" || !skill.installPath)
|
|
160
|
+
continue;
|
|
161
|
+
try {
|
|
162
|
+
const target = path.join(profileSkillsDir(name, options), path.basename(skill.name));
|
|
163
|
+
await mkdir(path.dirname(target), { recursive: true });
|
|
164
|
+
await cp(skill.installPath, target, { recursive: true });
|
|
165
|
+
profile.skills.push({ name: skill.name });
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
// unreadable skill dir — skip it rather than failing the snapshot
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
await writeProfile(profile, options);
|
|
172
|
+
return profile;
|
|
173
|
+
}
|
|
174
|
+
export function toLocalProfileMcp(entry) {
|
|
175
|
+
return {
|
|
176
|
+
kind: "local",
|
|
177
|
+
command: entry.command,
|
|
178
|
+
...(entry.args ? { args: entry.args } : {}),
|
|
179
|
+
...(entry.env ? { env: entry.env } : {}),
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
export function toRemoteProfileMcp(entry) {
|
|
183
|
+
return {
|
|
184
|
+
kind: "remote",
|
|
185
|
+
transport: entry.transport,
|
|
186
|
+
url: entry.url,
|
|
187
|
+
...(entry.headers ? { headers: entry.headers } : {}),
|
|
188
|
+
...(entry.env ? { env: entry.env } : {}),
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
/** Copy one bundled skill dir between profiles (no-op if the source has no files). */
|
|
192
|
+
export async function copySkillBetweenProfiles(from, to, skillName, options = {}) {
|
|
193
|
+
const sourceDir = path.join(profileSkillsDir(from, options), path.basename(skillName));
|
|
194
|
+
if (!(await pathExists(sourceDir)))
|
|
195
|
+
return;
|
|
196
|
+
const targetDir = path.join(profileSkillsDir(to, options), path.basename(skillName));
|
|
197
|
+
await mkdir(path.dirname(targetDir), { recursive: true });
|
|
198
|
+
await rm(targetDir, { recursive: true, force: true });
|
|
199
|
+
await cp(sourceDir, targetDir, { recursive: true });
|
|
200
|
+
}
|
|
201
|
+
export async function pathExists(target) {
|
|
202
|
+
try {
|
|
203
|
+
await stat(target);
|
|
204
|
+
return true;
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/core/agent-profiles/store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7F,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,mBAAmB,GAIpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,oBAAoB,EACpB,aAAa,GAId,MAAM,YAAY,CAAC;AAOpB,MAAM,UAAU,YAAY,CAAC,UAA+B,EAAE;IAC5D,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC;IAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,UAA+B,EAAE;IACxE,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,UAA+B,EAAE;IAClE,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,UAA+B,EAAE;IAC9E,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CACb,yBAAyB,OAAO,4CAA4C,CAC7E,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,UAA+B,EAAE;IAEjC,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,SAAS,GAAgD,EAAE,CAAC;IAElE,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,kBAAkB;IAC/B,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAAE,SAAS;QACnC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACtD,SAAS,CAAC,IAAI,CAAC;gBACb,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM;gBAC1C,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM;gBACjC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gBACnC,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,8CAA8C;QAChD,CAAC;IACH,CAAC;IAED,OAAO,SAAS;SACb,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SAC1F,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAY,EACZ,UAA+B,EAAE;IAEjC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,cAAc,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,gCAAgC,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAA6C,EAC7C,UAA+B,EAAE;IAEjC,MAAM,IAAI,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,MAAM,UAAU,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,mBAAmB,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,OAAO,GAAY;QACvB,IAAI;QACJ,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,IAAI,EAAE,EAAE;QACR,MAAM,EAAE,EAAE;KACX,CAAC;IACF,MAAM,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAY,EACZ,KAAgE,EAChE,UAA+B,EAAE;IAEjC,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAEjF,yDAAyD;IACzD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7D,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE;oBAC9E,SAAS,EAAE,IAAI;oBACf,KAAK,EAAE,IAAI;iBACZ,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAY,EACZ,UAA+B,EAAE;IAEjC,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,cAAc,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAgB,EAChB,UAA+B,EAAE;IAEjC,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,GAAG,QAAQ,QAAQ,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAChD,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1E,MAAM,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,KAA4E,EAC5E,UAA+B,EAAE;IAEjC,MAAM,IAAI,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,MAAM,UAAU,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,mBAAmB,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACxF,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5E,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC,KAAK,mCAAmC,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,IAAI,GAA+B,EAAE,CAAC;IAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9D,IAAI,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACpE,IAAI,CAAC,GAAG,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,OAAO,GAAY;QACvB,IAAI;QACJ,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,IAAI;QACJ,MAAM,EAAE,EAAE;KACX,CAAC;IAEF,0EAA0E;IAC1E,2EAA2E;IAC3E,KAAK,MAAM,KAAK,IAAI,MAAO,CAAC,MAAM,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW;YAAE,SAAS;QACtF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACrF,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,MAAM,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzD,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,kEAAkE;QACpE,CAAC;IACH,CAAC;IAED,MAAM,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAoB;IACpD,OAAO;QACL,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAqB;IACtD,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzC,CAAC;AACJ,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,IAAY,EACZ,EAAU,EACV,SAAiB,EACjB,UAA+B,EAAE;IAEjC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACvF,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;QAAE,OAAO;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACrF,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAc;IAC7C,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type ProfileStoreOptions } from "./store.js";
|
|
2
|
+
import { type CredentialSpec } from "./types.js";
|
|
3
|
+
export interface ExportResult {
|
|
4
|
+
archivePath: string;
|
|
5
|
+
/** Credentials that were redacted; the importer must supply these. */
|
|
6
|
+
credentials: CredentialSpec[];
|
|
7
|
+
}
|
|
8
|
+
export declare function exportProfile(input: {
|
|
9
|
+
name: string;
|
|
10
|
+
outputPath?: string;
|
|
11
|
+
cwd: string;
|
|
12
|
+
}, options?: ProfileStoreOptions): Promise<ExportResult>;
|
|
13
|
+
export interface ImportResult {
|
|
14
|
+
name: string;
|
|
15
|
+
mcpCount: number;
|
|
16
|
+
skillCount: number;
|
|
17
|
+
/** Credential keys the caller still has to fill in (placeholders kept). */
|
|
18
|
+
missingCredentials: CredentialSpec[];
|
|
19
|
+
}
|
|
20
|
+
export declare function importProfile(input: {
|
|
21
|
+
archivePath: string;
|
|
22
|
+
force?: boolean;
|
|
23
|
+
credentials?: Record<string, string>;
|
|
24
|
+
/** Override the imported profile's name (e.g. on collision). */
|
|
25
|
+
as?: string;
|
|
26
|
+
}, options?: ProfileStoreOptions): Promise<ImportResult>;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Portable profile archives (`.tar.gz`). Export redacts secret-looking env
|
|
3
|
+
* and header values into `${credentials.<key>}` placeholders — raw secrets
|
|
4
|
+
* never enter an archive. Import resolves placeholders from supplied
|
|
5
|
+
* credentials / the process environment and reports what's still missing.
|
|
6
|
+
*
|
|
7
|
+
* Archive layout: `manifest.json` + `profile.json` + `skills/<name>/…`.
|
|
8
|
+
* Tarballs are produced with the system `tar` (present on macOS, Linux, and
|
|
9
|
+
* Windows 10+), matching what brainctl shipped.
|
|
10
|
+
*/
|
|
11
|
+
import { execFile } from "node:child_process";
|
|
12
|
+
import { cp, mkdir, mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
|
|
13
|
+
import { tmpdir } from "node:os";
|
|
14
|
+
import path from "node:path";
|
|
15
|
+
import { promisify } from "node:util";
|
|
16
|
+
import { findUnresolvedCredentialKeys, redactMcpCredentials, resolveMcpCredentials, } from "./credentials.js";
|
|
17
|
+
import { getProfile, pathExists, profileDir, profileSkillsDir, writeProfile, } from "./store.js";
|
|
18
|
+
import { profileManifestSchema, profileSchema, } from "./types.js";
|
|
19
|
+
const execFileAsync = promisify(execFile);
|
|
20
|
+
export async function exportProfile(input, options = {}) {
|
|
21
|
+
const profile = await getProfile(input.name, options);
|
|
22
|
+
const stagingDir = await mkdtemp(path.join(tmpdir(), "nomoreide-profile-pack-"));
|
|
23
|
+
try {
|
|
24
|
+
const credentials = new Map();
|
|
25
|
+
const redactedMcps = Object.fromEntries(Object.entries(profile.mcps).map(([key, config]) => {
|
|
26
|
+
const result = redactMcpCredentials(config);
|
|
27
|
+
for (const spec of result.credentials)
|
|
28
|
+
credentials.set(spec.key, spec);
|
|
29
|
+
return [key, result.redacted];
|
|
30
|
+
}));
|
|
31
|
+
const manifest = {
|
|
32
|
+
schemaVersion: 1,
|
|
33
|
+
profileName: profile.name,
|
|
34
|
+
createdBy: { tool: "nomoreide", version: await packageVersion() },
|
|
35
|
+
...(credentials.size > 0 ? { credentials: Array.from(credentials.values()) } : {}),
|
|
36
|
+
};
|
|
37
|
+
await writeFile(path.join(stagingDir, "manifest.json"), JSON.stringify(manifest, null, 2) + "\n", "utf8");
|
|
38
|
+
await writeFile(path.join(stagingDir, "profile.json"), JSON.stringify({ ...profile, mcps: redactedMcps }, null, 2) + "\n", "utf8");
|
|
39
|
+
for (const skill of profile.skills) {
|
|
40
|
+
const sourceDir = path.join(profileSkillsDir(input.name, options), path.basename(skill.name));
|
|
41
|
+
if (!(await pathExists(sourceDir)))
|
|
42
|
+
continue;
|
|
43
|
+
const target = path.join(stagingDir, "skills", path.basename(skill.name));
|
|
44
|
+
await mkdir(path.dirname(target), { recursive: true });
|
|
45
|
+
await cp(sourceDir, target, {
|
|
46
|
+
recursive: true,
|
|
47
|
+
filter: (src) => {
|
|
48
|
+
const base = path.basename(src);
|
|
49
|
+
return base !== ".git" && base !== ".DS_Store";
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
const archivePath = input.outputPath ?? path.join(input.cwd, `${profile.name}.tar.gz`);
|
|
54
|
+
await mkdir(path.dirname(archivePath), { recursive: true });
|
|
55
|
+
await execFileAsync("tar", ["-czf", archivePath, "-C", stagingDir, "."]);
|
|
56
|
+
return { archivePath, credentials: Array.from(credentials.values()) };
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
await rm(stagingDir, { recursive: true, force: true });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export async function importProfile(input, options = {}) {
|
|
63
|
+
if (!(await pathExists(input.archivePath))) {
|
|
64
|
+
throw new Error(`Archive not found: ${input.archivePath}`);
|
|
65
|
+
}
|
|
66
|
+
const extractDir = await mkdtemp(path.join(tmpdir(), "nomoreide-profile-import-"));
|
|
67
|
+
try {
|
|
68
|
+
try {
|
|
69
|
+
await execFileAsync("tar", ["-xzf", input.archivePath, "-C", extractDir]);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
throw new Error("Could not extract the archive — is it a .tar.gz profile export?");
|
|
73
|
+
}
|
|
74
|
+
const manifest = profileManifestSchema.safeParse(JSON.parse(await readFile(path.join(extractDir, "manifest.json"), "utf8")));
|
|
75
|
+
if (!manifest.success) {
|
|
76
|
+
throw new Error("Archive has a missing or invalid manifest.json — not a nomoreide profile archive.");
|
|
77
|
+
}
|
|
78
|
+
const parsedProfile = profileSchema.safeParse(JSON.parse(await readFile(path.join(extractDir, "profile.json"), "utf8")));
|
|
79
|
+
if (!parsedProfile.success) {
|
|
80
|
+
throw new Error("Archive has a missing or invalid profile.json.");
|
|
81
|
+
}
|
|
82
|
+
const name = input.as ?? parsedProfile.data.name;
|
|
83
|
+
const profile = { ...parsedProfile.data, name };
|
|
84
|
+
if (!input.force && (await pathExists(path.join(profileDir(name, options), "profile.json")))) {
|
|
85
|
+
throw new Error(`Profile "${name}" already exists. Re-import with force to overwrite.`);
|
|
86
|
+
}
|
|
87
|
+
const missing = new Map();
|
|
88
|
+
profile.mcps = Object.fromEntries(Object.entries(profile.mcps).map(([key, config]) => {
|
|
89
|
+
const result = resolveMcpCredentials(config, {
|
|
90
|
+
credentials: input.credentials,
|
|
91
|
+
credentialSpecs: manifest.data.credentials,
|
|
92
|
+
environment: process.env,
|
|
93
|
+
});
|
|
94
|
+
for (const spec of result.missing)
|
|
95
|
+
missing.set(spec.key, spec);
|
|
96
|
+
return [key, result.resolved];
|
|
97
|
+
}));
|
|
98
|
+
await writeProfile(profile, options);
|
|
99
|
+
let skillCount = 0;
|
|
100
|
+
for (const skill of profile.skills) {
|
|
101
|
+
const sourceDir = path.join(extractDir, "skills", path.basename(skill.name));
|
|
102
|
+
if (!(await pathExists(sourceDir)))
|
|
103
|
+
continue;
|
|
104
|
+
const target = path.join(profileSkillsDir(name, options), path.basename(skill.name));
|
|
105
|
+
await mkdir(path.dirname(target), { recursive: true });
|
|
106
|
+
await rm(target, { recursive: true, force: true });
|
|
107
|
+
await cp(sourceDir, target, { recursive: true });
|
|
108
|
+
skillCount += 1;
|
|
109
|
+
}
|
|
110
|
+
// Anything a spec listed but resolution didn't reach (or that remains as
|
|
111
|
+
// a placeholder in the stored profile) counts as missing.
|
|
112
|
+
for (const key of findUnresolvedCredentialKeys(profile.mcps)) {
|
|
113
|
+
if (!missing.has(key)) {
|
|
114
|
+
missing.set(key, { key, required: true, description: `Credential ${key} is required` });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
name,
|
|
119
|
+
mcpCount: Object.keys(profile.mcps).length,
|
|
120
|
+
skillCount,
|
|
121
|
+
missingCredentials: Array.from(missing.values()),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
finally {
|
|
125
|
+
await rm(extractDir, { recursive: true, force: true });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
let cachedVersion;
|
|
129
|
+
async function packageVersion() {
|
|
130
|
+
if (!cachedVersion) {
|
|
131
|
+
try {
|
|
132
|
+
const pkg = JSON.parse(await readFile(new URL("../../../package.json", import.meta.url), "utf8"));
|
|
133
|
+
cachedVersion = pkg.version ?? "0.0.0";
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
cachedVersion = "0.0.0";
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return cachedVersion;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=transfer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../../src/core/agent-profiles/transfer.ts"],"names":[],"mappings":"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"}
|