@whylineee/zerocode 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,101 @@
1
+ # ZeroCode CLI
2
+
3
+ Install MCP servers and skills to any local AI agent from one tool.
4
+
5
+ ## Quick start
6
+
7
+ ```bash
8
+ npx zerocode detect # See which agents are on your machine
9
+ npx zerocode list mcp # Browse 30 available MCP servers
10
+ npx zerocode list skills # Browse 10 available skills
11
+ npx zerocode add mcp filesystem-mcp # Install MCP to an agent (interactive)
12
+ npx zerocode add skill pr-reviewer # Install a skill to the project
13
+ npx zerocode status # See what's installed on each agent
14
+ ```
15
+
16
+ ## Supported agents
17
+
18
+ The CLI detects and writes config for:
19
+
20
+ | Agent | Config location | Scope |
21
+ |-------|----------------|-------|
22
+ | Claude Desktop | `~/Library/Application Support/Claude/claude_desktop_config.json` | global |
23
+ | Claude Code | `.mcp.json` (project root) | project |
24
+ | Cursor | `.cursor/mcp.json` or `~/.cursor/mcp.json` | project / global |
25
+ | Windsurf | `.windsurf/mcp.json` or `~/.codeium/windsurf/mcp_config.json` | project / global |
26
+ | Cline (VS Code) | `.vscode/mcp.json` | project |
27
+ | Continue.dev | `~/.continue/config.json` | global |
28
+ | Codex CLI | `AGENTS.md` (project root) | project |
29
+
30
+ ## Commands
31
+
32
+ ### `zerocode detect`
33
+
34
+ Scans the machine for installed agents and shows their config paths.
35
+
36
+ ### `zerocode list mcp`
37
+
38
+ Lists all MCP servers available in the ZeroCode registry.
39
+
40
+ ### `zerocode list skills`
41
+
42
+ Lists all skills available in the ZeroCode registry.
43
+
44
+ ### `zerocode add mcp <slug>`
45
+
46
+ Installs an MCP server to a detected agent. Interactive agent selection if multiple are found.
47
+
48
+ ```bash
49
+ # Interactive — pick the agent
50
+ npx zerocode add mcp github-mcp
51
+
52
+ # Direct — specify the agent
53
+ npx zerocode add mcp github-mcp --agent claude-desktop
54
+ ```
55
+
56
+ If the server needs API keys, the CLI will prompt for them.
57
+
58
+ ### `zerocode add skill <slug>`
59
+
60
+ Installs a skill's SKILL.md to `.zerocode/skills/<slug>/SKILL.md` in the project.
61
+
62
+ ```bash
63
+ npx zerocode add skill pr-reviewer
64
+ ```
65
+
66
+ ### `zerocode remove mcp <slug>`
67
+
68
+ Removes an MCP server from an agent's config.
69
+
70
+ ```bash
71
+ npx zerocode remove mcp github-mcp --agent claude-desktop
72
+ ```
73
+
74
+ ### `zerocode status`
75
+
76
+ Shows all detected agents and their currently configured MCP servers.
77
+
78
+ ## Development
79
+
80
+ ```bash
81
+ cd cli
82
+ npm install
83
+ npm run build # Compile TypeScript
84
+ node dist/index.js detect # Test locally
85
+ ```
86
+
87
+ ## Architecture
88
+
89
+ ```
90
+ cli/
91
+ ├── src/
92
+ │ ├── index.ts # CLI entry point and command router
93
+ │ ├── agents.ts # Agent detection and config read/write
94
+ │ ├── registry.ts # MCP and skill registry data
95
+ │ ├── prompt.ts # Interactive terminal prompts
96
+ │ └── ui.ts # Terminal output formatting
97
+ ├── package.json
98
+ └── tsconfig.json
99
+ ```
100
+
101
+ Zero external dependencies. Uses only Node.js built-ins.
@@ -0,0 +1,25 @@
1
+ export interface AgentInfo {
2
+ id: string;
3
+ name: string;
4
+ configPath: string;
5
+ detected: boolean;
6
+ configFormat: "claude-desktop" | "cursor" | "windsurf" | "cline" | "continue" | "claude-code";
7
+ scope: "global" | "project";
8
+ }
9
+ export interface McpServerEntry {
10
+ command: string;
11
+ args: string[];
12
+ env?: Record<string, string>;
13
+ }
14
+ export interface McpConfig {
15
+ mcpServers?: Record<string, McpServerEntry>;
16
+ [key: string]: unknown;
17
+ }
18
+ export declare function detectAgents(): AgentInfo[];
19
+ export declare function allAgentTargets(): AgentInfo[];
20
+ export declare function readAgentConfig(agent: AgentInfo): McpConfig;
21
+ export declare function writeAgentConfig(agent: AgentInfo, config: McpConfig): void;
22
+ export declare function addMcpToAgent(agent: AgentInfo, serverName: string, entry: McpServerEntry): void;
23
+ export declare function removeMcpFromAgent(agent: AgentInfo, serverName: string): boolean;
24
+ export declare function listInstalledMcp(agent: AgentInfo): Record<string, McpServerEntry>;
25
+ //# sourceMappingURL=agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,gBAAgB,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,aAAa,CAAC;IAC9F,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC5C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAoID,wBAAgB,YAAY,IAAI,SAAS,EAAE,CAE1C;AAED,wBAAgB,eAAe,IAAI,SAAS,EAAE,CAE7C;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAU3D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAU1E;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,cAAc,GACpB,IAAI,CAON;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAQT;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,GACf,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAGhC"}
package/dist/agents.js ADDED
@@ -0,0 +1,166 @@
1
+ import { existsSync, readFileSync, readdirSync, writeFileSync, mkdirSync, } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join, dirname } from "node:path";
4
+ import { execSync } from "node:child_process";
5
+ const home = homedir();
6
+ const cwd = process.cwd();
7
+ function commandExists(cmd) {
8
+ try {
9
+ execSync(`which ${cmd}`, { stdio: "ignore" });
10
+ return true;
11
+ }
12
+ catch {
13
+ return false;
14
+ }
15
+ }
16
+ function appExists(name) {
17
+ return (existsSync(`/Applications/${name}.app`) ||
18
+ existsSync(join(home, "Applications", `${name}.app`)));
19
+ }
20
+ function dirHasExtension(extDir, prefix) {
21
+ if (!existsSync(extDir))
22
+ return false;
23
+ try {
24
+ return readdirSync(extDir).some((e) => e.toLowerCase().startsWith(prefix));
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ }
30
+ function resolveAgents() {
31
+ const agents = [];
32
+ // ── Claude Desktop ──────────────────────────────────────────────
33
+ const claudeDesktopDir = join(home, "Library", "Application Support", "Claude");
34
+ agents.push({
35
+ id: "claude-desktop",
36
+ name: "Claude Desktop",
37
+ configPath: join(claudeDesktopDir, "claude_desktop_config.json"),
38
+ detected: existsSync(claudeDesktopDir) || appExists("Claude"),
39
+ configFormat: "claude-desktop",
40
+ scope: "global",
41
+ });
42
+ // ── Claude Code (project-level .mcp.json) ───────────────────────
43
+ agents.push({
44
+ id: "claude-code",
45
+ name: "Claude Code",
46
+ configPath: join(cwd, ".mcp.json"),
47
+ detected: commandExists("claude"),
48
+ configFormat: "claude-code",
49
+ scope: "project",
50
+ });
51
+ // ── Cursor (project) ────────────────────────────────────────────
52
+ const cursorDetected = appExists("Cursor") || existsSync(join(home, ".cursor"));
53
+ agents.push({
54
+ id: "cursor",
55
+ name: "Cursor (project)",
56
+ configPath: join(cwd, ".cursor", "mcp.json"),
57
+ detected: cursorDetected,
58
+ configFormat: "cursor",
59
+ scope: "project",
60
+ });
61
+ // ── Cursor (global) ─────────────────────────────────────────────
62
+ agents.push({
63
+ id: "cursor-global",
64
+ name: "Cursor (global)",
65
+ configPath: join(home, ".cursor", "mcp.json"),
66
+ detected: cursorDetected,
67
+ configFormat: "cursor",
68
+ scope: "global",
69
+ });
70
+ // ── Windsurf (project) ──────────────────────────────────────────
71
+ const windsurfDetected = appExists("Windsurf") || existsSync(join(home, ".codeium", "windsurf"));
72
+ agents.push({
73
+ id: "windsurf",
74
+ name: "Windsurf (project)",
75
+ configPath: join(cwd, ".windsurf", "mcp.json"),
76
+ detected: windsurfDetected,
77
+ configFormat: "windsurf",
78
+ scope: "project",
79
+ });
80
+ // ── Windsurf (global) ───────────────────────────────────────────
81
+ agents.push({
82
+ id: "windsurf-global",
83
+ name: "Windsurf (global)",
84
+ configPath: join(home, ".codeium", "windsurf", "mcp_config.json"),
85
+ detected: windsurfDetected,
86
+ configFormat: "windsurf",
87
+ scope: "global",
88
+ });
89
+ // ── Cline (VS Code extension) ───────────────────────────────────
90
+ const vscodeExtDir = join(home, ".vscode", "extensions");
91
+ agents.push({
92
+ id: "cline",
93
+ name: "Cline (VS Code)",
94
+ configPath: join(cwd, ".vscode", "mcp.json"),
95
+ detected: dirHasExtension(vscodeExtDir, "saoudrizwan.claude-dev"),
96
+ configFormat: "cline",
97
+ scope: "project",
98
+ });
99
+ // ── Continue.dev ────────────────────────────────────────────────
100
+ agents.push({
101
+ id: "continue",
102
+ name: "Continue.dev",
103
+ configPath: join(home, ".continue", "config.json"),
104
+ detected: existsSync(join(home, ".continue")) ||
105
+ dirHasExtension(vscodeExtDir, "continue.continue"),
106
+ configFormat: "continue",
107
+ scope: "global",
108
+ });
109
+ // ── Codex CLI ───────────────────────────────────────────────────
110
+ agents.push({
111
+ id: "codex",
112
+ name: "Codex CLI",
113
+ configPath: join(cwd, "AGENTS.md"),
114
+ detected: commandExists("codex"),
115
+ configFormat: "claude-code", // reuse format — Codex uses AGENTS.md, handled separately
116
+ scope: "project",
117
+ });
118
+ return agents;
119
+ }
120
+ export function detectAgents() {
121
+ return resolveAgents().filter((a) => a.detected);
122
+ }
123
+ export function allAgentTargets() {
124
+ return resolveAgents();
125
+ }
126
+ export function readAgentConfig(agent) {
127
+ if (!existsSync(agent.configPath)) {
128
+ return {};
129
+ }
130
+ try {
131
+ const raw = readFileSync(agent.configPath, "utf-8");
132
+ return JSON.parse(raw);
133
+ }
134
+ catch {
135
+ return {};
136
+ }
137
+ }
138
+ export function writeAgentConfig(agent, config) {
139
+ const dir = dirname(agent.configPath);
140
+ if (!existsSync(dir)) {
141
+ mkdirSync(dir, { recursive: true });
142
+ }
143
+ writeFileSync(agent.configPath, JSON.stringify(config, null, 2) + "\n", "utf-8");
144
+ }
145
+ export function addMcpToAgent(agent, serverName, entry) {
146
+ const config = readAgentConfig(agent);
147
+ if (!config.mcpServers) {
148
+ config.mcpServers = {};
149
+ }
150
+ config.mcpServers[serverName] = entry;
151
+ writeAgentConfig(agent, config);
152
+ }
153
+ export function removeMcpFromAgent(agent, serverName) {
154
+ const config = readAgentConfig(agent);
155
+ if (!config.mcpServers || !config.mcpServers[serverName]) {
156
+ return false;
157
+ }
158
+ delete config.mcpServers[serverName];
159
+ writeAgentConfig(agent, config);
160
+ return true;
161
+ }
162
+ export function listInstalledMcp(agent) {
163
+ const config = readAgentConfig(agent);
164
+ return config.mcpServers ?? {};
165
+ }
166
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,341 @@
1
+ #!/usr/bin/env node
2
+ import { writeFileSync, existsSync, mkdirSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { detectAgents, allAgentTargets, addMcpToAgent, removeMcpFromAgent, listInstalledMcp, } from "./agents.js";
5
+ import { mcpRegistry, skillRegistry, findMcp, findSkill } from "./registry.js";
6
+ import { banner, heading, success, warn, error, info, item, table, divider } from "./ui.js";
7
+ import { choose, confirm, askEnvVars } from "./prompt.js";
8
+ // ── Arg parsing ──────────────────────────────────────────────────
9
+ const args = process.argv.slice(2);
10
+ const command = args[0]?.toLowerCase();
11
+ const subCommand = args[1]?.toLowerCase();
12
+ const target = args[2]?.toLowerCase();
13
+ function usage() {
14
+ banner();
15
+ console.log(" Usage:");
16
+ console.log();
17
+ console.log(" zerocode detect Detect installed agents");
18
+ console.log(" zerocode list mcp List available MCP servers");
19
+ console.log(" zerocode list skills List available skills");
20
+ console.log(" zerocode add mcp <name> Install MCP server to an agent");
21
+ console.log(" zerocode add skill <name> Install a skill to the project");
22
+ console.log(" zerocode remove mcp <name> Remove MCP server from an agent");
23
+ console.log(" zerocode status Show what's installed on each agent");
24
+ console.log(" zerocode add mcp <name> --agent <id> Install to a specific agent");
25
+ console.log();
26
+ console.log(" Examples:");
27
+ console.log();
28
+ console.log(" npx zerocode detect");
29
+ console.log(" npx zerocode add mcp filesystem-mcp");
30
+ console.log(" npx zerocode add mcp github-mcp --agent claude-desktop");
31
+ console.log(" npx zerocode add skill pr-reviewer");
32
+ console.log(" npx zerocode status");
33
+ console.log();
34
+ }
35
+ // ── Helpers ──────────────────────────────────────────────────────
36
+ function getAgentFlag() {
37
+ const idx = args.indexOf("--agent");
38
+ if (idx !== -1 && args[idx + 1]) {
39
+ return args[idx + 1].toLowerCase();
40
+ }
41
+ return undefined;
42
+ }
43
+ function resolveEnvPlaceholders(entry, envValues) {
44
+ const resolvedArgs = entry.args.map((a) => {
45
+ if (a === "{PROJECT_DIR}")
46
+ return process.cwd();
47
+ for (const [key, value] of Object.entries(envValues)) {
48
+ if (a === `{${key}}`)
49
+ return value;
50
+ }
51
+ return a;
52
+ });
53
+ let resolvedEnv;
54
+ if (entry.env) {
55
+ resolvedEnv = {};
56
+ for (const [key, val] of Object.entries(entry.env)) {
57
+ resolvedEnv[key] = envValues[key] ?? val;
58
+ }
59
+ }
60
+ return {
61
+ command: entry.command,
62
+ args: resolvedArgs,
63
+ ...(resolvedEnv ? { env: resolvedEnv } : {}),
64
+ };
65
+ }
66
+ // ── Commands ─────────────────────────────────────────────────────
67
+ async function cmdDetect() {
68
+ heading("Detecting installed agents...");
69
+ const detected = detectAgents();
70
+ if (detected.length === 0) {
71
+ warn("No agents detected on this machine.");
72
+ info("Supported: Claude Desktop, Claude Code, Cursor, Windsurf, Cline, Continue.dev, Codex CLI");
73
+ return;
74
+ }
75
+ success(`Found ${detected.length} agent(s):`);
76
+ console.log();
77
+ for (const agent of detected) {
78
+ item(`${agent.name}`, `${agent.scope} · ${agent.configPath}`);
79
+ }
80
+ }
81
+ async function cmdListMcp() {
82
+ heading("Available MCP servers");
83
+ const rows = mcpRegistry.map((m) => [
84
+ m.slug,
85
+ m.description,
86
+ ]);
87
+ table(rows);
88
+ console.log();
89
+ info(`${mcpRegistry.length} servers available. Use: zerocode add mcp <slug>`);
90
+ }
91
+ async function cmdListSkills() {
92
+ heading("Available skills");
93
+ const rows = skillRegistry.map((s) => [
94
+ s.slug,
95
+ s.description,
96
+ ]);
97
+ table(rows);
98
+ console.log();
99
+ info(`${skillRegistry.length} skills available. Use: zerocode add skill <slug>`);
100
+ }
101
+ async function cmdAddMcp() {
102
+ if (!target) {
103
+ error("Missing MCP server name. Usage: zerocode add mcp <name>");
104
+ console.log();
105
+ info("Run 'zerocode list mcp' to see available servers.");
106
+ return;
107
+ }
108
+ const mcp = findMcp(target);
109
+ if (!mcp) {
110
+ error(`MCP server "${target}" not found in registry.`);
111
+ console.log();
112
+ info("Run 'zerocode list mcp' to see available servers.");
113
+ return;
114
+ }
115
+ heading(`Installing ${mcp.name} MCP server`);
116
+ info(mcp.description);
117
+ console.log();
118
+ // Resolve agent target
119
+ const agentFlag = getAgentFlag();
120
+ let agent;
121
+ if (agentFlag) {
122
+ const all = allAgentTargets();
123
+ agent = all.find((a) => a.id === agentFlag);
124
+ if (!agent) {
125
+ error(`Agent "${agentFlag}" not found. Detected agents:`);
126
+ for (const a of detectAgents()) {
127
+ item(a.id, a.name);
128
+ }
129
+ return;
130
+ }
131
+ }
132
+ else {
133
+ // Interactive agent selection
134
+ const detected = detectAgents();
135
+ if (detected.length === 0) {
136
+ warn("No agents detected. Showing all possible targets...");
137
+ const all = allAgentTargets();
138
+ agent = await choose("Select target agent:", all);
139
+ }
140
+ else {
141
+ agent = await choose("Select target agent:", detected);
142
+ }
143
+ }
144
+ if (!agent) {
145
+ error("No agent selected. Aborting.");
146
+ return;
147
+ }
148
+ // Collect env vars if needed
149
+ let envValues = {};
150
+ if (mcp.envVars && mcp.envVars.length > 0) {
151
+ info(`This server requires: ${mcp.envVars.join(", ")}`);
152
+ console.log();
153
+ envValues = await askEnvVars(mcp.envVars);
154
+ }
155
+ // Build final entry
156
+ const entry = resolveEnvPlaceholders({ ...mcp.entry }, envValues);
157
+ // Extract server name from slug (remove -mcp suffix for cleaner config)
158
+ const serverName = mcp.slug.replace(/-mcp$/, "");
159
+ // Confirm
160
+ console.log();
161
+ info(`Server: ${mcp.name}`);
162
+ info(`Agent: ${agent.name}`);
163
+ info(`Config: ${agent.configPath}`);
164
+ info(`Key: ${serverName}`);
165
+ console.log();
166
+ const ok = await confirm("Install this MCP server?");
167
+ if (!ok) {
168
+ warn("Cancelled.");
169
+ return;
170
+ }
171
+ addMcpToAgent(agent, serverName, entry);
172
+ console.log();
173
+ success(`${mcp.name} installed to ${agent.name}`);
174
+ info(`Config written to: ${agent.configPath}`);
175
+ if (mcp.envVars && mcp.envVars.length > 0) {
176
+ const unresolvedVars = mcp.envVars.filter((v) => !envValues[v]);
177
+ if (unresolvedVars.length > 0) {
178
+ console.log();
179
+ warn("Some env vars still have placeholder values:");
180
+ for (const v of unresolvedVars) {
181
+ info(` ${v} — update in the config file or set as env var`);
182
+ }
183
+ }
184
+ }
185
+ console.log();
186
+ info("Restart your agent to pick up the new MCP server.");
187
+ }
188
+ async function cmdAddSkill() {
189
+ if (!target) {
190
+ error("Missing skill name. Usage: zerocode add skill <name>");
191
+ console.log();
192
+ info("Run 'zerocode list skills' to see available skills.");
193
+ return;
194
+ }
195
+ const skill = findSkill(target);
196
+ if (!skill) {
197
+ error(`Skill "${target}" not found in registry.`);
198
+ console.log();
199
+ info("Run 'zerocode list skills' to see available skills.");
200
+ return;
201
+ }
202
+ heading(`Installing ${skill.name} skill`);
203
+ info(skill.description);
204
+ console.log();
205
+ // Write SKILL.md to project .zerocode/skills/<slug>/SKILL.md
206
+ const skillDir = join(process.cwd(), ".zerocode", "skills", skill.slug);
207
+ const skillPath = join(skillDir, "SKILL.md");
208
+ if (existsSync(skillPath)) {
209
+ const overwrite = await confirm(`Skill already exists at ${skillPath}. Overwrite?`);
210
+ if (!overwrite) {
211
+ warn("Cancelled.");
212
+ return;
213
+ }
214
+ }
215
+ if (!existsSync(skillDir)) {
216
+ mkdirSync(skillDir, { recursive: true });
217
+ }
218
+ writeFileSync(skillPath, skill.skillMd + "\n", "utf-8");
219
+ console.log();
220
+ success(`${skill.name} installed to ${skillPath}`);
221
+ info(`Invoke it by referencing the SKILL.md in your agent prompt.`);
222
+ info(`Install command (alternative): ${skill.installCommand}`);
223
+ }
224
+ async function cmdRemoveMcp() {
225
+ if (!target) {
226
+ error("Missing MCP server name. Usage: zerocode remove mcp <name>");
227
+ return;
228
+ }
229
+ const serverName = target.replace(/-mcp$/, "");
230
+ const agentFlag = getAgentFlag();
231
+ let agent;
232
+ if (agentFlag) {
233
+ const all = allAgentTargets();
234
+ agent = all.find((a) => a.id === agentFlag);
235
+ }
236
+ else {
237
+ const detected = detectAgents();
238
+ agent = await choose("Remove from which agent?", detected);
239
+ }
240
+ if (!agent) {
241
+ error("No agent selected. Aborting.");
242
+ return;
243
+ }
244
+ const removed = removeMcpFromAgent(agent, serverName);
245
+ if (removed) {
246
+ success(`Removed "${serverName}" from ${agent.name}`);
247
+ }
248
+ else {
249
+ warn(`"${serverName}" was not found in ${agent.name}'s config.`);
250
+ }
251
+ }
252
+ async function cmdStatus() {
253
+ heading("Agent status");
254
+ const detected = detectAgents();
255
+ if (detected.length === 0) {
256
+ warn("No agents detected.");
257
+ return;
258
+ }
259
+ for (const agent of detected) {
260
+ console.log();
261
+ item(agent.name, `(${agent.scope}) ${agent.configPath}`);
262
+ const installed = listInstalledMcp(agent);
263
+ const keys = Object.keys(installed);
264
+ if (keys.length === 0) {
265
+ info(" No MCP servers configured.");
266
+ }
267
+ else {
268
+ for (const key of keys) {
269
+ const srv = installed[key];
270
+ info(` ├─ ${key}: ${srv.command} ${srv.args.join(" ")}`);
271
+ }
272
+ }
273
+ divider();
274
+ }
275
+ }
276
+ // ── Main ─────────────────────────────────────────────────────────
277
+ async function main() {
278
+ if (!command) {
279
+ usage();
280
+ return;
281
+ }
282
+ switch (command) {
283
+ case "detect":
284
+ await cmdDetect();
285
+ break;
286
+ case "list":
287
+ if (subCommand === "mcp") {
288
+ await cmdListMcp();
289
+ }
290
+ else if (subCommand === "skills" || subCommand === "skill") {
291
+ await cmdListSkills();
292
+ }
293
+ else {
294
+ error(`Unknown list target: ${subCommand}`);
295
+ info("Use: zerocode list mcp | zerocode list skills");
296
+ }
297
+ break;
298
+ case "add":
299
+ if (subCommand === "mcp") {
300
+ await cmdAddMcp();
301
+ }
302
+ else if (subCommand === "skill") {
303
+ await cmdAddSkill();
304
+ }
305
+ else {
306
+ error(`Unknown add target: ${subCommand}`);
307
+ info("Use: zerocode add mcp <name> | zerocode add skill <name>");
308
+ }
309
+ break;
310
+ case "remove":
311
+ if (subCommand === "mcp") {
312
+ await cmdRemoveMcp();
313
+ }
314
+ else {
315
+ error(`Unknown remove target: ${subCommand}`);
316
+ info("Use: zerocode remove mcp <name>");
317
+ }
318
+ break;
319
+ case "status":
320
+ await cmdStatus();
321
+ break;
322
+ case "help":
323
+ case "--help":
324
+ case "-h":
325
+ usage();
326
+ break;
327
+ case "version":
328
+ case "--version":
329
+ case "-v":
330
+ console.log("zerocode 0.1.0");
331
+ break;
332
+ default:
333
+ error(`Unknown command: ${command}`);
334
+ usage();
335
+ }
336
+ }
337
+ main().catch((err) => {
338
+ error(String(err));
339
+ process.exit(1);
340
+ });
341
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}