nomoreide 0.1.68 → 0.1.69
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/antigravity-reader.d.ts +7 -0
- package/dist/core/agent-env/antigravity-reader.js +86 -0
- package/dist/core/agent-env/antigravity-reader.js.map +1 -0
- package/dist/core/agent-env/availability.d.ts +6 -0
- package/dist/core/agent-env/availability.js +79 -0
- package/dist/core/agent-env/availability.js.map +1 -0
- package/dist/core/agent-env/claude-reader.d.ts +7 -0
- package/dist/core/agent-env/claude-reader.js +93 -0
- package/dist/core/agent-env/claude-reader.js.map +1 -0
- package/dist/core/agent-env/codex-reader.d.ts +9 -0
- package/dist/core/agent-env/codex-reader.js +145 -0
- package/dist/core/agent-env/codex-reader.js.map +1 -0
- package/dist/core/agent-env/index.d.ts +9 -0
- package/dist/core/agent-env/index.js +29 -0
- package/dist/core/agent-env/index.js.map +1 -0
- package/dist/core/agent-env/managed-plugins.d.ts +13 -0
- package/dist/core/agent-env/managed-plugins.js +36 -0
- package/dist/core/agent-env/managed-plugins.js.map +1 -0
- package/dist/core/agent-env/plugin-reader.d.ts +9 -0
- package/dist/core/agent-env/plugin-reader.js +174 -0
- package/dist/core/agent-env/plugin-reader.js.map +1 -0
- package/dist/core/agent-env/shared.d.ts +25 -0
- package/dist/core/agent-env/shared.js +115 -0
- package/dist/core/agent-env/shared.js.map +1 -0
- package/dist/core/agent-env/types.d.ts +66 -0
- package/dist/core/agent-env/types.js +7 -0
- package/dist/core/agent-env/types.js.map +1 -0
- package/dist/mcp/tools/agent-env.d.ts +8 -0
- package/dist/mcp/tools/agent-env.js +40 -0
- package/dist/mcp/tools/agent-env.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-woFvM3aJ.js → code-editor-B4fwOZmz.js} +1 -1
- package/dist/web/client/assets/{index-B4hwsHPU.js → index-Bv9X1Rmi.js} +110 -110
- package/dist/web/client/assets/index-CNvFKnAK.css +1 -0
- package/dist/web/client/index.html +2 -2
- package/dist/web/routes/agent-env-routes.d.ts +7 -0
- package/dist/web/routes/agent-env-routes.js +36 -0
- package/dist/web/routes/agent-env-routes.js.map +1 -0
- package/dist/web/routes/index.js +2 -0
- package/dist/web/routes/index.js.map +1 -1
- package/dist/web/routes/shell-routes.js +1 -0
- package/dist/web/routes/shell-routes.js.map +1 -1
- package/package.json +1 -1
- package/dist/web/client/assets/index-CeyRPbeV.css +0 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AgentEnvReadOptions, AgentLiveConfig } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Antigravity (Gemini's agent CLI) has shipped its MCP config under several
|
|
4
|
+
* paths across releases; the first candidate that exists wins. Remote servers
|
|
5
|
+
* use `httpUrl` (http) or `url` (sse). Skills live in `~/.gemini/skills/`.
|
|
6
|
+
*/
|
|
7
|
+
export declare function readAntigravityConfig(options: AgentEnvReadOptions): Promise<AgentLiveConfig>;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { mergeManagedPluginsIntoSkills, readManagedPlugins } from "./managed-plugins.js";
|
|
5
|
+
import { filterPluginOwnedMcps, parseEnvObject, readBrainctlProjectMcps, readSkillDirs, } from "./shared.js";
|
|
6
|
+
/**
|
|
7
|
+
* Antigravity (Gemini's agent CLI) has shipped its MCP config under several
|
|
8
|
+
* paths across releases; the first candidate that exists wins. Remote servers
|
|
9
|
+
* use `httpUrl` (http) or `url` (sse). Skills live in `~/.gemini/skills/`.
|
|
10
|
+
*/
|
|
11
|
+
export async function readAntigravityConfig(options) {
|
|
12
|
+
const homeDir = options.homeDir ?? homedir();
|
|
13
|
+
const candidates = [
|
|
14
|
+
path.join(homeDir, ".gemini", "antigravity-cli", "mcp_config.json"),
|
|
15
|
+
path.join(homeDir, ".gemini", "config", "mcp_config.json"),
|
|
16
|
+
path.join(homeDir, ".gemini", "antigravity", "mcp_config.json"),
|
|
17
|
+
path.join(homeDir, ".gemini", "antigravity-ide", "mcp_config.json"),
|
|
18
|
+
];
|
|
19
|
+
let configPath = candidates[0];
|
|
20
|
+
const projectMaps = await readBrainctlProjectMcps(options.cwd, "antigravity");
|
|
21
|
+
let rawServers = {};
|
|
22
|
+
let exists = false;
|
|
23
|
+
for (const candidatePath of candidates) {
|
|
24
|
+
try {
|
|
25
|
+
const source = await readFile(candidatePath, "utf8");
|
|
26
|
+
configPath = candidatePath;
|
|
27
|
+
exists = true;
|
|
28
|
+
// An empty placeholder file is a live (empty) config, not a missing one.
|
|
29
|
+
if (source.trim().length > 0) {
|
|
30
|
+
const data = JSON.parse(source);
|
|
31
|
+
rawServers = (data.mcpServers ?? {});
|
|
32
|
+
}
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// try the next known Antigravity config location
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const mcpServers = {};
|
|
40
|
+
const remoteMcpServers = {};
|
|
41
|
+
for (const [name, entry] of Object.entries(rawServers)) {
|
|
42
|
+
const remoteEntry = toRemoteEntry(entry);
|
|
43
|
+
if (remoteEntry) {
|
|
44
|
+
remoteMcpServers[name] = remoteEntry;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
mcpServers[name] = {
|
|
48
|
+
command: String(entry.command ?? ""),
|
|
49
|
+
args: Array.isArray(entry.args) ? entry.args.map(String) : undefined,
|
|
50
|
+
env: parseEnvObject(entry.env),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const skills = await readAntigravitySkills(homeDir);
|
|
54
|
+
const filtered = filterPluginOwnedMcps({ mcpServers, remoteMcpServers, ...projectMaps }, skills);
|
|
55
|
+
return { agent: "antigravity", configPath, exists, ...filtered, skills };
|
|
56
|
+
}
|
|
57
|
+
function toRemoteEntry(entry) {
|
|
58
|
+
if (typeof entry.httpUrl === "string" && entry.httpUrl.trim().length > 0) {
|
|
59
|
+
return {
|
|
60
|
+
transport: "http",
|
|
61
|
+
url: entry.httpUrl,
|
|
62
|
+
headers: parseEnvObject(entry.headers),
|
|
63
|
+
env: parseEnvObject(entry.env),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
if (typeof entry.url === "string" && entry.url.trim().length > 0) {
|
|
67
|
+
return {
|
|
68
|
+
transport: "sse",
|
|
69
|
+
url: entry.url,
|
|
70
|
+
headers: parseEnvObject(entry.headers),
|
|
71
|
+
env: parseEnvObject(entry.env),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
async function readAntigravitySkills(homeDir) {
|
|
77
|
+
const managedPlugins = await readManagedPlugins({ agent: "antigravity", homeDir });
|
|
78
|
+
try {
|
|
79
|
+
const localSkills = await readSkillDirs(path.join(homeDir, ".gemini", "skills"));
|
|
80
|
+
return mergeManagedPluginsIntoSkills(localSkills, managedPlugins);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return managedPlugins;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=antigravity-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"antigravity-reader.js","sourceRoot":"","sources":["../../../src/core/agent-env/antigravity-reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,6BAA6B,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,uBAAuB,EACvB,aAAa,GACd,MAAM,aAAa,CAAC;AASrB;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAA4B;IAE5B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC;IAC7C,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,iBAAiB,CAAC;QACnE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,iBAAiB,CAAC;QAC1D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,CAAC;QAC/D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,iBAAiB,CAAC;KACpE,CAAC;IACF,IAAI,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,WAAW,GAAG,MAAM,uBAAuB,CAAC,OAAO,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAE9E,IAAI,UAAU,GAA4C,EAAE,CAAC;IAC7D,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,MAAM,aAAa,IAAI,UAAU,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;YACrD,UAAU,GAAG,aAAa,CAAC;YAC3B,MAAM,GAAG,IAAI,CAAC;YACd,yEAAyE;YACzE,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAA4B,CAAC;gBAC3D,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAA4C,CAAC;YAClF,CAAC;YACD,MAAM;QACR,CAAC;QAAC,MAAM,CAAC;YACP,iDAAiD;QACnD,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAkC,EAAE,CAAC;IACrD,MAAM,gBAAgB,GAAmC,EAAE,CAAC;IAC5D,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACvD,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,WAAW,EAAE,CAAC;YAChB,gBAAgB,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC;YACrC,SAAS;QACX,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,GAAG;YACjB,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;YACpC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;YACpE,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC;SAC/B,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,qBAAqB,CACpC,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,WAAW,EAAE,EAChD,MAAM,CACP,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC3E,CAAC;AAED,SAAS,aAAa,CAAC,KAA8B;IACnD,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzE,OAAO;YACL,SAAS,EAAE,MAAM;YACjB,GAAG,EAAE,KAAK,CAAC,OAAO;YAClB,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC;YACtC,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC;SAC/B,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjE,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC;YACtC,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC;SAC/B,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,OAAe;IAClD,MAAM,cAAc,GAAG,MAAM,kBAAkB,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC;IACnF,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QACjF,OAAO,6BAA6B,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,cAAc,CAAC;IACxB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type AgentAvailability, type AgentDoctorResult, type AgentLiveConfig } from "./types.js";
|
|
2
|
+
/** PATH lookup without shelling out to `which` (works on win32 via PATHEXT). */
|
|
3
|
+
export declare function findExecutable(command: string): Promise<string | null>;
|
|
4
|
+
export declare function getAgentAvailability(): Promise<AgentAvailability[]>;
|
|
5
|
+
/** Availability + config-file presence, summarized as pass/warn checks. */
|
|
6
|
+
export declare function buildDoctorResult(availability: AgentAvailability[], configs: AgentLiveConfig[]): AgentDoctorResult;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { constants } from "node:fs";
|
|
2
|
+
import { access } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { AGENT_NAMES, } from "./types.js";
|
|
5
|
+
const AGENT_COMMANDS = {
|
|
6
|
+
claude: "claude",
|
|
7
|
+
codex: "codex",
|
|
8
|
+
antigravity: "antigravity",
|
|
9
|
+
};
|
|
10
|
+
/** PATH lookup without shelling out to `which` (works on win32 via PATHEXT). */
|
|
11
|
+
export async function findExecutable(command) {
|
|
12
|
+
if (command.includes(path.sep)) {
|
|
13
|
+
return (await isExecutable(command)) ? command : null;
|
|
14
|
+
}
|
|
15
|
+
const pathEntries = (process.env.PATH ?? "")
|
|
16
|
+
.split(path.delimiter)
|
|
17
|
+
.filter((entry) => entry.length > 0);
|
|
18
|
+
const extensions = process.platform === "win32"
|
|
19
|
+
? (process.env.PATHEXT ?? ".EXE;.CMD;.BAT;.COM").split(";").filter((entry) => entry.length > 0)
|
|
20
|
+
: [""];
|
|
21
|
+
for (const pathEntry of pathEntries) {
|
|
22
|
+
for (const extension of extensions) {
|
|
23
|
+
const candidate = process.platform === "win32" &&
|
|
24
|
+
extension.length > 0 &&
|
|
25
|
+
!command.toLowerCase().endsWith(extension.toLowerCase())
|
|
26
|
+
? path.join(pathEntry, `${command}${extension}`)
|
|
27
|
+
: path.join(pathEntry, command);
|
|
28
|
+
if (await isExecutable(candidate)) {
|
|
29
|
+
return candidate;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
async function isExecutable(filePath) {
|
|
36
|
+
try {
|
|
37
|
+
await access(filePath, process.platform === "win32" ? constants.F_OK : constants.X_OK);
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export async function getAgentAvailability() {
|
|
45
|
+
return Promise.all(AGENT_NAMES.map(async (agent) => {
|
|
46
|
+
const command = AGENT_COMMANDS[agent];
|
|
47
|
+
const resolvedPath = await findExecutable(command);
|
|
48
|
+
return {
|
|
49
|
+
agent,
|
|
50
|
+
command,
|
|
51
|
+
available: resolvedPath !== null,
|
|
52
|
+
resolvedPath: resolvedPath ?? undefined,
|
|
53
|
+
};
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
56
|
+
/** Availability + config-file presence, summarized as pass/warn checks. */
|
|
57
|
+
export function buildDoctorResult(availability, configs) {
|
|
58
|
+
const checks = [];
|
|
59
|
+
for (const agent of availability) {
|
|
60
|
+
checks.push({
|
|
61
|
+
label: "Agent CLI",
|
|
62
|
+
status: agent.available ? "ok" : "warn",
|
|
63
|
+
message: agent.available
|
|
64
|
+
? `${agent.agent} is available (${agent.resolvedPath})`
|
|
65
|
+
: `${agent.agent} is not available on PATH`,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
for (const config of configs) {
|
|
69
|
+
checks.push({
|
|
70
|
+
label: "Config file",
|
|
71
|
+
status: config.exists ? "ok" : "warn",
|
|
72
|
+
message: config.exists
|
|
73
|
+
? `${config.agent} config found at ${config.configPath}`
|
|
74
|
+
: `${config.agent} has no config at ${config.configPath}`,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return { checks, hasIssues: checks.some((check) => check.status !== "ok") };
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=availability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"availability.js","sourceRoot":"","sources":["../../../src/core/agent-env/availability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AgentEnvReadOptions, AgentLiveConfig } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Claude Code keeps everything in `~/.claude.json`: top-level `mcpServers`
|
|
4
|
+
* (user scope) and `projects[cwd].mcpServers` (project scope). Skills come
|
|
5
|
+
* from marketplace plugins, `~/.claude/skills/`, and `<repo>/.claude/skills/`.
|
|
6
|
+
*/
|
|
7
|
+
export declare function readClaudeConfig(options: AgentEnvReadOptions): Promise<AgentLiveConfig>;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { readInstalledPlugins } from "./plugin-reader.js";
|
|
5
|
+
import { filterPluginOwnedMcps, parseEnvObject, readProjectSkills, readSkillDirs, } from "./shared.js";
|
|
6
|
+
/**
|
|
7
|
+
* Claude Code keeps everything in `~/.claude.json`: top-level `mcpServers`
|
|
8
|
+
* (user scope) and `projects[cwd].mcpServers` (project scope). Skills come
|
|
9
|
+
* from marketplace plugins, `~/.claude/skills/`, and `<repo>/.claude/skills/`.
|
|
10
|
+
*/
|
|
11
|
+
export async function readClaudeConfig(options) {
|
|
12
|
+
const homeDir = options.homeDir ?? homedir();
|
|
13
|
+
const configPath = path.join(homeDir, ".claude.json");
|
|
14
|
+
const skills = [
|
|
15
|
+
...(await readClaudeUserSkills(homeDir)),
|
|
16
|
+
...(await readProjectSkills(options.cwd)),
|
|
17
|
+
];
|
|
18
|
+
try {
|
|
19
|
+
const source = await readFile(configPath, "utf8");
|
|
20
|
+
const data = JSON.parse(source);
|
|
21
|
+
const userServers = (data.mcpServers ?? {});
|
|
22
|
+
const projects = (data.projects ?? {});
|
|
23
|
+
const projectConfig = (projects[options.cwd] ?? {});
|
|
24
|
+
const projectServers = (projectConfig.mcpServers ?? {});
|
|
25
|
+
const user = splitClaudeServers(userServers);
|
|
26
|
+
const project = splitClaudeServers(projectServers);
|
|
27
|
+
const filtered = filterPluginOwnedMcps({
|
|
28
|
+
mcpServers: user.local,
|
|
29
|
+
remoteMcpServers: user.remote,
|
|
30
|
+
projectMcpServers: project.local,
|
|
31
|
+
projectRemoteMcpServers: project.remote,
|
|
32
|
+
}, skills);
|
|
33
|
+
return { agent: "claude", configPath, exists: true, ...filtered, skills };
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return {
|
|
37
|
+
agent: "claude",
|
|
38
|
+
configPath,
|
|
39
|
+
exists: false,
|
|
40
|
+
mcpServers: {},
|
|
41
|
+
remoteMcpServers: {},
|
|
42
|
+
projectMcpServers: {},
|
|
43
|
+
projectRemoteMcpServers: {},
|
|
44
|
+
skills,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function splitClaudeServers(servers) {
|
|
49
|
+
const local = {};
|
|
50
|
+
const remote = {};
|
|
51
|
+
for (const [name, entry] of Object.entries(servers)) {
|
|
52
|
+
if (isClaudeRemoteEntry(entry)) {
|
|
53
|
+
remote[name] = {
|
|
54
|
+
transport: entry.type === "sse" ? "sse" : "http",
|
|
55
|
+
url: String(entry.url ?? ""),
|
|
56
|
+
headers: parseEnvObject(entry.headers),
|
|
57
|
+
env: parseEnvObject(entry.env),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
local[name] = {
|
|
62
|
+
command: String(entry.command ?? ""),
|
|
63
|
+
args: Array.isArray(entry.args) ? entry.args.map(String) : undefined,
|
|
64
|
+
env: parseEnvObject(entry.env),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return { local, remote };
|
|
69
|
+
}
|
|
70
|
+
function isClaudeRemoteEntry(entry) {
|
|
71
|
+
if (typeof entry.url !== "string" || entry.url.trim().length === 0) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
return entry.type === "http" || entry.type === "sse" || !("command" in entry);
|
|
75
|
+
}
|
|
76
|
+
async function readClaudeUserSkills(homeDir) {
|
|
77
|
+
const results = [];
|
|
78
|
+
try {
|
|
79
|
+
const pluginsPath = path.join(homeDir, ".claude", "plugins", "installed_plugins.json");
|
|
80
|
+
results.push(...(await readInstalledPlugins(pluginsPath)));
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// no plugins file
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
results.push(...(await readSkillDirs(path.join(homeDir, ".claude", "skills"))));
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// no skills dir
|
|
90
|
+
}
|
|
91
|
+
return results;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=claude-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-reader.js","sourceRoot":"","sources":["../../../src/core/agent-env/claude-reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AgentEnvReadOptions, AgentLiveConfig } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Codex CLI stores MCP servers as `[mcp_servers.*]` TOML sections in
|
|
4
|
+
* `~/.codex/config.toml` and skills as SKILL.md dirs under `~/.codex/skills/`.
|
|
5
|
+
* The TOML subset parser is deliberate — the config format only uses flat
|
|
6
|
+
* sections with string/array values, and a dependency-free parse mirrors what
|
|
7
|
+
* brainctl shipped and tested.
|
|
8
|
+
*/
|
|
9
|
+
export declare function readCodexConfig(options: AgentEnvReadOptions): Promise<AgentLiveConfig>;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { mergeManagedPluginsIntoSkills, readManagedPlugins } from "./managed-plugins.js";
|
|
5
|
+
import { readCodexPlugins } from "./plugin-reader.js";
|
|
6
|
+
import { filterPluginOwnedMcps, readBrainctlProjectMcps, readSkillDirs, } from "./shared.js";
|
|
7
|
+
/**
|
|
8
|
+
* Codex CLI stores MCP servers as `[mcp_servers.*]` TOML sections in
|
|
9
|
+
* `~/.codex/config.toml` and skills as SKILL.md dirs under `~/.codex/skills/`.
|
|
10
|
+
* The TOML subset parser is deliberate — the config format only uses flat
|
|
11
|
+
* sections with string/array values, and a dependency-free parse mirrors what
|
|
12
|
+
* brainctl shipped and tested.
|
|
13
|
+
*/
|
|
14
|
+
export async function readCodexConfig(options) {
|
|
15
|
+
const homeDir = options.homeDir ?? homedir();
|
|
16
|
+
const configPath = path.join(homeDir, ".codex", "config.toml");
|
|
17
|
+
const projectMaps = await readBrainctlProjectMcps(options.cwd, "codex");
|
|
18
|
+
const skills = await readCodexSkills(homeDir);
|
|
19
|
+
try {
|
|
20
|
+
const source = await readFile(configPath, "utf8");
|
|
21
|
+
const { mcpServers, remoteMcpServers } = parseCodexToml(source);
|
|
22
|
+
const filtered = filterPluginOwnedMcps({ mcpServers, remoteMcpServers, ...projectMaps }, skills);
|
|
23
|
+
return { agent: "codex", configPath, exists: true, ...filtered, skills };
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return {
|
|
27
|
+
agent: "codex",
|
|
28
|
+
configPath,
|
|
29
|
+
exists: false,
|
|
30
|
+
mcpServers: {},
|
|
31
|
+
remoteMcpServers: {},
|
|
32
|
+
...projectMaps,
|
|
33
|
+
skills,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async function readCodexSkills(homeDir) {
|
|
38
|
+
const nativePlugins = await readCodexPlugins({
|
|
39
|
+
configTomlPath: path.join(homeDir, ".codex", "config.toml"),
|
|
40
|
+
pluginsCacheDir: path.join(homeDir, ".codex", "plugins", "cache"),
|
|
41
|
+
});
|
|
42
|
+
const managedPlugins = await readManagedPlugins({ agent: "codex", homeDir });
|
|
43
|
+
let localSkills = [];
|
|
44
|
+
try {
|
|
45
|
+
localSkills = await readSkillDirs(path.join(homeDir, ".codex", "skills"));
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
localSkills = [];
|
|
49
|
+
}
|
|
50
|
+
const allPlugins = dedupePluginsByName([...managedPlugins, ...nativePlugins]);
|
|
51
|
+
return mergeManagedPluginsIntoSkills(localSkills, allPlugins);
|
|
52
|
+
}
|
|
53
|
+
function dedupePluginsByName(plugins) {
|
|
54
|
+
const seen = new Map();
|
|
55
|
+
for (const plugin of plugins) {
|
|
56
|
+
if (!seen.has(plugin.name))
|
|
57
|
+
seen.set(plugin.name, plugin);
|
|
58
|
+
}
|
|
59
|
+
return Array.from(seen.values());
|
|
60
|
+
}
|
|
61
|
+
function parseCodexToml(source) {
|
|
62
|
+
const mcpServers = {};
|
|
63
|
+
const remoteMcpServers = {};
|
|
64
|
+
let currentServer = null;
|
|
65
|
+
let inEnv = false;
|
|
66
|
+
let currentEntry = { command: "" };
|
|
67
|
+
let currentEnv = {};
|
|
68
|
+
let currentUrl = null;
|
|
69
|
+
const flush = () => {
|
|
70
|
+
if (!currentServer)
|
|
71
|
+
return;
|
|
72
|
+
if (currentUrl) {
|
|
73
|
+
remoteMcpServers[currentServer] = { transport: "http", url: currentUrl };
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
if (Object.keys(currentEnv).length > 0)
|
|
77
|
+
currentEntry.env = currentEnv;
|
|
78
|
+
mcpServers[currentServer] = currentEntry;
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
for (const line of source.split("\n")) {
|
|
82
|
+
const trimmed = line.trim();
|
|
83
|
+
if (/^\[mcp_servers\.([^.]+)\.env\]$/.test(trimmed)) {
|
|
84
|
+
inEnv = true;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
const serverMatch = trimmed.match(/^\[mcp_servers\.([^\].]+)\]$/);
|
|
88
|
+
if (serverMatch) {
|
|
89
|
+
flush();
|
|
90
|
+
currentServer = serverMatch[1];
|
|
91
|
+
currentEntry = { command: "" };
|
|
92
|
+
currentEnv = {};
|
|
93
|
+
currentUrl = null;
|
|
94
|
+
inEnv = false;
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (/^\[/.test(trimmed) && !/^\[mcp_servers/.test(trimmed)) {
|
|
98
|
+
flush();
|
|
99
|
+
currentServer = null;
|
|
100
|
+
currentEntry = { command: "" };
|
|
101
|
+
currentEnv = {};
|
|
102
|
+
currentUrl = null;
|
|
103
|
+
inEnv = false;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const kvMatch = trimmed.match(/^(\w+)\s*=\s*(.+)$/);
|
|
107
|
+
if (!kvMatch || !currentServer)
|
|
108
|
+
continue;
|
|
109
|
+
const [, key, rawValue] = kvMatch;
|
|
110
|
+
if (inEnv) {
|
|
111
|
+
currentEnv[key] = parseTomlValue(rawValue);
|
|
112
|
+
}
|
|
113
|
+
else if (key === "url") {
|
|
114
|
+
currentUrl = parseTomlValue(rawValue);
|
|
115
|
+
}
|
|
116
|
+
else if (key === "command") {
|
|
117
|
+
currentEntry.command = parseTomlValue(rawValue);
|
|
118
|
+
}
|
|
119
|
+
else if (key === "args") {
|
|
120
|
+
currentEntry.args = parseTomlArray(rawValue);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
flush();
|
|
124
|
+
return { mcpServers, remoteMcpServers };
|
|
125
|
+
}
|
|
126
|
+
function parseTomlValue(raw) {
|
|
127
|
+
const trimmed = raw.trim();
|
|
128
|
+
if (trimmed.startsWith('"') && trimmed.endsWith('"')) {
|
|
129
|
+
return trimmed.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, "\\");
|
|
130
|
+
}
|
|
131
|
+
return trimmed;
|
|
132
|
+
}
|
|
133
|
+
function parseTomlArray(raw) {
|
|
134
|
+
const trimmed = raw.trim();
|
|
135
|
+
if (!trimmed.startsWith("[") || !trimmed.endsWith("]"))
|
|
136
|
+
return [];
|
|
137
|
+
const result = [];
|
|
138
|
+
for (const part of trimmed.slice(1, -1).split(",")) {
|
|
139
|
+
const value = parseTomlValue(part.trim());
|
|
140
|
+
if (value.length > 0)
|
|
141
|
+
result.push(value);
|
|
142
|
+
}
|
|
143
|
+
return result;
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=codex-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-reader.js","sourceRoot":"","sources":["../../../src/core/agent-env/codex-reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AgentDoctorResult, AgentEnvReadOptions, AgentLiveConfig } from "./types.js";
|
|
2
|
+
export declare function readAllAgentConfigs(options: AgentEnvReadOptions): Promise<AgentLiveConfig[]>;
|
|
3
|
+
export declare function runAgentDoctor(options: AgentEnvReadOptions): Promise<AgentDoctorResult>;
|
|
4
|
+
export { readClaudeConfig } from "./claude-reader.js";
|
|
5
|
+
export { readCodexConfig } from "./codex-reader.js";
|
|
6
|
+
export { readAntigravityConfig } from "./antigravity-reader.js";
|
|
7
|
+
export { findExecutable, getAgentAvailability } from "./availability.js";
|
|
8
|
+
export type { AgentAvailability, AgentDoctorCheck, AgentDoctorResult, AgentEnvReadOptions, AgentLiveConfig, AgentMcpEntry, AgentName, AgentSkillEntry, RemoteMcpEntry, } from "./types.js";
|
|
9
|
+
export { AGENT_NAMES } from "./types.js";
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Environments core — read-only. Every function here only reads agent
|
|
3
|
+
* config files; mutations belong to the (future, ROR-61) write-guarded
|
|
4
|
+
* agent-env-actions module, mirroring the GitManager/GitActions split.
|
|
5
|
+
*/
|
|
6
|
+
import { readAntigravityConfig } from "./antigravity-reader.js";
|
|
7
|
+
import { buildDoctorResult, getAgentAvailability } from "./availability.js";
|
|
8
|
+
import { readClaudeConfig } from "./claude-reader.js";
|
|
9
|
+
import { readCodexConfig } from "./codex-reader.js";
|
|
10
|
+
export async function readAllAgentConfigs(options) {
|
|
11
|
+
return Promise.all([
|
|
12
|
+
readClaudeConfig(options),
|
|
13
|
+
readCodexConfig(options),
|
|
14
|
+
readAntigravityConfig(options),
|
|
15
|
+
]);
|
|
16
|
+
}
|
|
17
|
+
export async function runAgentDoctor(options) {
|
|
18
|
+
const [availability, configs] = await Promise.all([
|
|
19
|
+
getAgentAvailability(),
|
|
20
|
+
readAllAgentConfigs(options),
|
|
21
|
+
]);
|
|
22
|
+
return buildDoctorResult(availability, configs);
|
|
23
|
+
}
|
|
24
|
+
export { readClaudeConfig } from "./claude-reader.js";
|
|
25
|
+
export { readCodexConfig } from "./codex-reader.js";
|
|
26
|
+
export { readAntigravityConfig } from "./antigravity-reader.js";
|
|
27
|
+
export { findExecutable, getAgentAvailability } from "./availability.js";
|
|
28
|
+
export { AGENT_NAMES } from "./types.js";
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/agent-env/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAOpD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAA4B;IAE5B,OAAO,OAAO,CAAC,GAAG,CAAC;QACjB,gBAAgB,CAAC,OAAO,CAAC;QACzB,eAAe,CAAC,OAAO,CAAC;QACxB,qBAAqB,CAAC,OAAO,CAAC;KAC/B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAA4B;IAE5B,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAChD,oBAAoB,EAAE;QACtB,mBAAmB,CAAC,OAAO,CAAC;KAC7B,CAAC,CAAC;IACH,OAAO,iBAAiB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC;AAED,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAYzE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AgentName, AgentSkillEntry } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Plugins brainctl installed for agents without a native plugin system are
|
|
4
|
+
* tracked in `~/.brainctl/managed-plugins.json`. Read-only here — Phase 1 never
|
|
5
|
+
* mutates the registry; keeping the path lets migrated brainctl users see the
|
|
6
|
+
* plugins it manages.
|
|
7
|
+
*/
|
|
8
|
+
export declare function readManagedPlugins(options: {
|
|
9
|
+
agent: AgentName;
|
|
10
|
+
homeDir?: string;
|
|
11
|
+
}): Promise<AgentSkillEntry[]>;
|
|
12
|
+
/** Managed plugins first; local skills a plugin already owns are dropped. */
|
|
13
|
+
export declare function mergeManagedPluginsIntoSkills(localSkills: AgentSkillEntry[], managedPlugins: AgentSkillEntry[]): AgentSkillEntry[];
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
/**
|
|
5
|
+
* Plugins brainctl installed for agents without a native plugin system are
|
|
6
|
+
* tracked in `~/.brainctl/managed-plugins.json`. Read-only here — Phase 1 never
|
|
7
|
+
* mutates the registry; keeping the path lets migrated brainctl users see the
|
|
8
|
+
* plugins it manages.
|
|
9
|
+
*/
|
|
10
|
+
export async function readManagedPlugins(options) {
|
|
11
|
+
const homeDir = options.homeDir ?? homedir();
|
|
12
|
+
const registryPath = path.join(homeDir, ".brainctl", "managed-plugins.json");
|
|
13
|
+
try {
|
|
14
|
+
const source = await readFile(registryPath, "utf8");
|
|
15
|
+
const parsed = JSON.parse(source);
|
|
16
|
+
return (parsed.agents?.[options.agent] ?? []).map((entry) => ({
|
|
17
|
+
...entry,
|
|
18
|
+
kind: "plugin",
|
|
19
|
+
scope: entry.scope ?? "user",
|
|
20
|
+
managed: true,
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** Managed plugins first; local skills a plugin already owns are dropped. */
|
|
28
|
+
export function mergeManagedPluginsIntoSkills(localSkills, managedPlugins) {
|
|
29
|
+
const pluginOwnedSkills = new Set(managedPlugins.flatMap((plugin) => [
|
|
30
|
+
...(plugin.pluginSkills ?? []),
|
|
31
|
+
...(plugin.pluginCommands ?? []),
|
|
32
|
+
]));
|
|
33
|
+
const filteredLocalSkills = localSkills.filter((skill) => !pluginOwnedSkills.has(skill.name));
|
|
34
|
+
return [...managedPlugins, ...filteredLocalSkills];
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=managed-plugins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managed-plugins.js","sourceRoot":"","sources":["../../../src/core/agent-env/managed-plugins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAQ7B;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAGxC;IACC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC;IAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,sBAAsB,CAAC,CAAC;IAE7E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAA8B,CAAC;QAC/D,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC5D,GAAG,KAAK;YACR,IAAI,EAAE,QAAiB;YACvB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,MAAM;YAC5B,OAAO,EAAE,IAAI;SACd,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,6BAA6B,CAC3C,WAA8B,EAC9B,cAAiC;IAEjC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAC/B,cAAc,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QACjC,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;QAC9B,GAAG,CAAC,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC;KACjC,CAAC,CACH,CAAC;IAEF,MAAM,mBAAmB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9F,OAAO,CAAC,GAAG,cAAc,EAAE,GAAG,mBAAmB,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AgentSkillEntry } from "./types.js";
|
|
2
|
+
/** Marketplace plugins from Claude's `~/.claude/plugins/installed_plugins.json`. */
|
|
3
|
+
export declare function readInstalledPlugins(installedPluginsPath: string): Promise<AgentSkillEntry[]>;
|
|
4
|
+
/** Enabled Codex plugins declared in config.toml and materialized in the plugins cache. */
|
|
5
|
+
export declare function readCodexPlugins(options: {
|
|
6
|
+
configTomlPath: string;
|
|
7
|
+
pluginsCacheDir: string;
|
|
8
|
+
}): Promise<AgentSkillEntry[]>;
|
|
9
|
+
export declare function readPluginMcpKeys(installPath: string): Promise<string[]>;
|