agentseal 0.9.0 → 0.9.2

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.
@@ -0,0 +1,580 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ AgentCollector,
4
+ appdata,
5
+ collectSkillDirs,
6
+ collectSkillFiles,
7
+ extractMcpServers,
8
+ home,
9
+ isDir,
10
+ isFile,
11
+ makeAgent,
12
+ platformPath,
13
+ readConfig,
14
+ registerCollector
15
+ } from "./chunk-2WEF3SNR.js";
16
+ import {
17
+ createMCPServerConfig
18
+ } from "./chunk-4EOVMNW5.js";
19
+
20
+ // src/guard/collectors/claude-desktop.ts
21
+ import { dirname } from "path";
22
+ var ClaudeDesktopCollector = class extends AgentCollector {
23
+ name = "Claude Desktop";
24
+ collect() {
25
+ const configPath = platformPath({
26
+ Darwin: home("Library", "Application Support", "Claude", "claude_desktop_config.json"),
27
+ Windows: appdata("Claude", "claude_desktop_config.json"),
28
+ Linux: home(".config", "Claude", "claude_desktop_config.json")
29
+ });
30
+ if (!configPath) return [];
31
+ if (!isFile(configPath)) {
32
+ return [
33
+ makeAgent(
34
+ this.name,
35
+ "claude-desktop",
36
+ configPath,
37
+ [],
38
+ [],
39
+ isDir(dirname(configPath)) ? "installed_no_config" : "not_installed"
40
+ )
41
+ ];
42
+ }
43
+ const data = readConfig(configPath);
44
+ if (!data) {
45
+ return [makeAgent(this.name, "claude-desktop", configPath, [], [], "error")];
46
+ }
47
+ const servers = extractMcpServers(data, configPath, "claude-desktop");
48
+ return [makeAgent(this.name, "claude-desktop", configPath, servers, [], "found")];
49
+ }
50
+ };
51
+ registerCollector(new ClaudeDesktopCollector());
52
+
53
+ // src/guard/collectors/claude-code.ts
54
+ var ClaudeCodeCollector = class extends AgentCollector {
55
+ name = "Claude Code";
56
+ collect() {
57
+ const candidates = [home(".claude.json"), home(".claude", "settings.json")];
58
+ const configPath = candidates.find(isFile);
59
+ if (!configPath) {
60
+ const dirExists = isDir(home(".claude"));
61
+ return [
62
+ makeAgent(
63
+ this.name,
64
+ "claude-code",
65
+ candidates[0],
66
+ [],
67
+ [],
68
+ dirExists ? "installed_no_config" : "not_installed"
69
+ )
70
+ ];
71
+ }
72
+ const data = readConfig(configPath);
73
+ if (!data) {
74
+ return [makeAgent(this.name, "claude-code", configPath, [], [], "error")];
75
+ }
76
+ const servers = extractMcpServers(data, configPath, "claude-code");
77
+ const skills = collectSkillFiles([home(".claude", "CLAUDE.md")]);
78
+ return [makeAgent(this.name, "claude-code", configPath, servers, skills, "found")];
79
+ }
80
+ };
81
+ registerCollector(new ClaudeCodeCollector());
82
+
83
+ // src/guard/collectors/cursor.ts
84
+ var CursorCollector = class extends AgentCollector {
85
+ name = "Cursor";
86
+ collect() {
87
+ const configPath = home(".cursor", "mcp.json");
88
+ if (!isFile(configPath)) {
89
+ return [
90
+ makeAgent(
91
+ this.name,
92
+ "cursor",
93
+ configPath,
94
+ [],
95
+ [],
96
+ isDir(home(".cursor")) ? "installed_no_config" : "not_installed"
97
+ )
98
+ ];
99
+ }
100
+ const data = readConfig(configPath);
101
+ if (!data) {
102
+ return [makeAgent(this.name, "cursor", configPath, [], [], "error")];
103
+ }
104
+ const servers = extractMcpServers(data, configPath, "cursor");
105
+ const skills = [
106
+ ...collectSkillFiles([home(".cursorrules")]),
107
+ ...collectSkillDirs([home(".cursor", "rules")])
108
+ ];
109
+ return [makeAgent(this.name, "cursor", configPath, servers, skills, "found")];
110
+ }
111
+ };
112
+ registerCollector(new CursorCollector());
113
+
114
+ // src/guard/collectors/vscode.ts
115
+ import { dirname as dirname2 } from "path";
116
+ var VSCodeCollector = class extends AgentCollector {
117
+ name = "VS Code";
118
+ collect() {
119
+ const configPath = platformPath({
120
+ Darwin: home("Library", "Application Support", "Code", "User", "mcp.json"),
121
+ Windows: appdata("Code", "User", "mcp.json"),
122
+ Linux: home(".config", "Code", "User", "mcp.json")
123
+ });
124
+ if (!configPath) return [];
125
+ if (!isFile(configPath)) {
126
+ return [
127
+ makeAgent(
128
+ this.name,
129
+ "vscode",
130
+ configPath,
131
+ [],
132
+ [],
133
+ isDir(dirname2(configPath)) ? "installed_no_config" : "not_installed"
134
+ )
135
+ ];
136
+ }
137
+ const data = readConfig(configPath, "jsonc");
138
+ if (!data) {
139
+ return [makeAgent(this.name, "vscode", configPath, [], [], "error")];
140
+ }
141
+ const servers = extractMcpServers(data, configPath, "vscode", "servers");
142
+ const skills = collectSkillFiles([home(".github", "copilot-instructions.md")]);
143
+ return [makeAgent(this.name, "vscode", configPath, servers, skills, "found")];
144
+ }
145
+ };
146
+ registerCollector(new VSCodeCollector());
147
+
148
+ // src/guard/collectors/windsurf.ts
149
+ var WindsurfCollector = class extends AgentCollector {
150
+ name = "Windsurf";
151
+ collect() {
152
+ const configPath = home(".codeium", "windsurf", "mcp_config.json");
153
+ if (!isFile(configPath)) {
154
+ return [
155
+ makeAgent(
156
+ this.name,
157
+ "windsurf",
158
+ configPath,
159
+ [],
160
+ [],
161
+ isDir(home(".codeium", "windsurf")) ? "installed_no_config" : "not_installed"
162
+ )
163
+ ];
164
+ }
165
+ const data = readConfig(configPath);
166
+ if (!data) {
167
+ return [makeAgent(this.name, "windsurf", configPath, [], [], "error")];
168
+ }
169
+ const servers = extractMcpServers(data, configPath, "windsurf");
170
+ const skills = collectSkillFiles([home(".windsurfrules")]);
171
+ return [makeAgent(this.name, "windsurf", configPath, servers, skills, "found")];
172
+ }
173
+ };
174
+ registerCollector(new WindsurfCollector());
175
+
176
+ // src/guard/collectors/cline.ts
177
+ import { dirname as dirname3 } from "path";
178
+ var VARIANTS = [
179
+ {
180
+ name: "Cline",
181
+ agentType: "cline",
182
+ extensionId: "saoudrizwan.claude-dev",
183
+ skillFile: ".clinerules"
184
+ },
185
+ {
186
+ name: "Roo Code",
187
+ agentType: "roo-code",
188
+ extensionId: "rooveterinaryinc.roo-cline"
189
+ },
190
+ {
191
+ name: "Kilo Code",
192
+ agentType: "kilo-code",
193
+ extensionId: "kilocode.kilo"
194
+ }
195
+ ];
196
+ function vsCodeGlobalStoragePath(extensionId, filename) {
197
+ const sub = ["globalStorage", extensionId, "settings", filename];
198
+ return {
199
+ Darwin: home("Library", "Application Support", "Code", "User", ...sub),
200
+ Windows: appdata("Code", "User", ...sub),
201
+ Linux: home(".config", "Code", "User", ...sub)
202
+ };
203
+ }
204
+ var ClineCollector = class extends AgentCollector {
205
+ name = "Cline/Roo/Kilo";
206
+ collect() {
207
+ const results = [];
208
+ for (const variant of VARIANTS) {
209
+ const filename = variant.agentType === "cline" ? "cline_mcp_settings.json" : "mcp_settings.json";
210
+ const paths = vsCodeGlobalStoragePath(variant.extensionId, filename);
211
+ const configPath = platformPath(paths);
212
+ if (!configPath) continue;
213
+ if (!isFile(configPath)) {
214
+ results.push(
215
+ makeAgent(
216
+ variant.name,
217
+ variant.agentType,
218
+ configPath,
219
+ [],
220
+ [],
221
+ isDir(dirname3(configPath)) ? "installed_no_config" : "not_installed"
222
+ )
223
+ );
224
+ continue;
225
+ }
226
+ const data = readConfig(configPath);
227
+ if (!data) {
228
+ results.push(makeAgent(variant.name, variant.agentType, configPath, [], [], "error"));
229
+ continue;
230
+ }
231
+ const servers = extractMcpServers(data, configPath, variant.agentType);
232
+ const skills = variant.skillFile ? collectSkillFiles([home(variant.skillFile)]) : [];
233
+ results.push(
234
+ makeAgent(variant.name, variant.agentType, configPath, servers, skills, "found")
235
+ );
236
+ }
237
+ return results;
238
+ }
239
+ };
240
+ registerCollector(new ClineCollector());
241
+
242
+ // src/guard/collectors/codex.ts
243
+ var CodexCollector = class extends AgentCollector {
244
+ name = "Codex CLI";
245
+ collect() {
246
+ const configPath = home(".codex", "config.json");
247
+ if (!isFile(configPath)) {
248
+ return [
249
+ makeAgent(
250
+ this.name,
251
+ "codex",
252
+ configPath,
253
+ [],
254
+ [],
255
+ isDir(home(".codex")) ? "installed_no_config" : "not_installed"
256
+ )
257
+ ];
258
+ }
259
+ const data = readConfig(configPath);
260
+ if (!data) {
261
+ return [makeAgent(this.name, "codex", configPath, [], [], "error")];
262
+ }
263
+ const servers = extractMcpServers(data, configPath, "codex", "mcp_servers");
264
+ return [makeAgent(this.name, "codex", configPath, servers, [], "found")];
265
+ }
266
+ };
267
+ registerCollector(new CodexCollector());
268
+
269
+ // src/guard/collectors/gemini.ts
270
+ var GeminiCollector = class extends AgentCollector {
271
+ name = "Gemini CLI";
272
+ collect() {
273
+ const configPath = home(".gemini", "settings.json");
274
+ if (!isFile(configPath)) {
275
+ return [
276
+ makeAgent(
277
+ this.name,
278
+ "gemini-cli",
279
+ configPath,
280
+ [],
281
+ [],
282
+ isDir(home(".gemini")) ? "installed_no_config" : "not_installed"
283
+ )
284
+ ];
285
+ }
286
+ const data = readConfig(configPath);
287
+ if (!data) {
288
+ return [makeAgent(this.name, "gemini-cli", configPath, [], [], "error")];
289
+ }
290
+ const servers = extractMcpServers(data, configPath, "gemini-cli");
291
+ const skills = collectSkillFiles([home("GEMINI.md")]);
292
+ return [makeAgent(this.name, "gemini-cli", configPath, servers, skills, "found")];
293
+ }
294
+ };
295
+ registerCollector(new GeminiCollector());
296
+
297
+ // src/guard/collectors/zed.ts
298
+ import { dirname as dirname4 } from "path";
299
+ var ZedCollector = class extends AgentCollector {
300
+ name = "Zed";
301
+ collect() {
302
+ const configPath = platformPath({
303
+ Darwin: home(".zed", "settings.json"),
304
+ Linux: home(".config", "zed", "settings.json"),
305
+ Windows: appdata("Zed", "settings.json")
306
+ });
307
+ if (!configPath) return [];
308
+ if (!isFile(configPath)) {
309
+ return [
310
+ makeAgent(
311
+ this.name,
312
+ "zed",
313
+ configPath,
314
+ [],
315
+ [],
316
+ isDir(dirname4(configPath)) ? "installed_no_config" : "not_installed"
317
+ )
318
+ ];
319
+ }
320
+ const data = readConfig(configPath, "jsonc");
321
+ if (!data) {
322
+ return [makeAgent(this.name, "zed", configPath, [], [], "error")];
323
+ }
324
+ const servers = extractMcpServers(data, configPath, "zed", "context_servers");
325
+ return [makeAgent(this.name, "zed", configPath, servers, [], "found")];
326
+ }
327
+ };
328
+ registerCollector(new ZedCollector());
329
+
330
+ // src/guard/collectors/continue-dev.ts
331
+ var ContinueCollector = class extends AgentCollector {
332
+ name = "Continue";
333
+ collect() {
334
+ const configPath = home(".continue", "config.json");
335
+ if (!isFile(configPath)) {
336
+ return [
337
+ makeAgent(
338
+ this.name,
339
+ "continue",
340
+ configPath,
341
+ [],
342
+ [],
343
+ isDir(home(".continue")) ? "installed_no_config" : "not_installed"
344
+ )
345
+ ];
346
+ }
347
+ const data = readConfig(configPath);
348
+ if (!data) {
349
+ return [makeAgent(this.name, "continue", configPath, [], [], "error")];
350
+ }
351
+ const servers = extractMcpServers(data, configPath, "continue");
352
+ const skills = collectSkillDirs([home(".continue", "rules")]);
353
+ return [makeAgent(this.name, "continue", configPath, servers, skills, "found")];
354
+ }
355
+ };
356
+ registerCollector(new ContinueCollector());
357
+
358
+ // src/guard/collectors/pi-code.ts
359
+ var PiCodeCollector = class extends AgentCollector {
360
+ name = "Pi Code";
361
+ collect() {
362
+ const configPath = home(".pi", "agent", "config.json");
363
+ if (!isFile(configPath)) {
364
+ return [
365
+ makeAgent(
366
+ this.name,
367
+ "pi-code",
368
+ configPath,
369
+ [],
370
+ [],
371
+ isDir(home(".pi", "agent")) ? "installed_no_config" : "not_installed"
372
+ )
373
+ ];
374
+ }
375
+ const data = readConfig(configPath);
376
+ if (!data) {
377
+ return [makeAgent(this.name, "pi-code", configPath, [], [], "error")];
378
+ }
379
+ const servers = extractMcpServers(data, configPath, "pi-code");
380
+ const skills = collectSkillDirs([home(".pi", "agent", "extensions")]);
381
+ return [makeAgent(this.name, "pi-code", configPath, servers, skills, "found")];
382
+ }
383
+ };
384
+ registerCollector(new PiCodeCollector());
385
+
386
+ // src/guard/collectors/generic.ts
387
+ import { dirname as dirname5 } from "path";
388
+ function defs() {
389
+ return [
390
+ {
391
+ name: "Aider",
392
+ agentType: "aider",
393
+ paths: { all: home(".aider.conf.yml") },
394
+ mcpKey: ""
395
+ },
396
+ {
397
+ name: "Goose",
398
+ agentType: "goose",
399
+ paths: {
400
+ Darwin: home(".config", "goose", "config.yaml"),
401
+ Linux: home(".config", "goose", "config.yaml")
402
+ },
403
+ mcpKey: "extensions",
404
+ format: "yaml"
405
+ },
406
+ {
407
+ name: "Amazon Q",
408
+ agentType: "amazon-q",
409
+ paths: { all: home(".aws", "amazonq", "mcp.json") },
410
+ mcpKey: "mcpServers"
411
+ },
412
+ {
413
+ name: "Copilot CLI",
414
+ agentType: "copilot-cli",
415
+ paths: { all: home(".copilot", "mcp-config.json") },
416
+ mcpKey: "mcpServers"
417
+ },
418
+ {
419
+ name: "Amp",
420
+ agentType: "amp",
421
+ paths: {
422
+ Darwin: home(".config", "amp", "settings.json"),
423
+ Linux: home(".config", "amp", "settings.json"),
424
+ Windows: appdata("amp", "settings.json")
425
+ },
426
+ mcpKey: "amp.mcpServers"
427
+ },
428
+ {
429
+ name: "Junie",
430
+ agentType: "junie",
431
+ paths: { all: home(".junie", "mcp", "mcp.json") },
432
+ mcpKey: "mcpServers"
433
+ },
434
+ {
435
+ name: "Kiro",
436
+ agentType: "kiro",
437
+ paths: { all: home(".kiro", "settings", "mcp.json") },
438
+ mcpKey: "mcpServers"
439
+ },
440
+ {
441
+ name: "OpenCode",
442
+ agentType: "opencode",
443
+ paths: {
444
+ Darwin: home(".config", "opencode", "opencode.json"),
445
+ Linux: home(".config", "opencode", "opencode.json"),
446
+ Windows: appdata("opencode", "opencode.json")
447
+ },
448
+ mcpKey: "mcp"
449
+ },
450
+ {
451
+ name: "OpenClaw",
452
+ agentType: "openclaw",
453
+ paths: { all: home(".openclaw", "openclaw.json") },
454
+ mcpKey: "mcpServers",
455
+ format: "jsonc"
456
+ },
457
+ {
458
+ name: "Crush",
459
+ agentType: "crush",
460
+ paths: { all: home(".config", "crush", "crush.json") },
461
+ mcpKey: "mcp"
462
+ },
463
+ {
464
+ name: "Qwen Code",
465
+ agentType: "qwen-code",
466
+ paths: { all: home(".qwen", "settings.json") },
467
+ mcpKey: "mcpServers"
468
+ },
469
+ {
470
+ name: "Grok CLI",
471
+ agentType: "grok-cli",
472
+ paths: { all: home(".grok", "user-settings.json") },
473
+ mcpKey: "mcpServers"
474
+ },
475
+ {
476
+ name: "Kimi CLI",
477
+ agentType: "kimi-cli",
478
+ paths: { all: home(".kimi", "mcp.json") },
479
+ mcpKey: "mcpServers"
480
+ },
481
+ {
482
+ name: "Trae",
483
+ agentType: "trae",
484
+ paths: {
485
+ Darwin: home("Library", "Application Support", "Trae", "mcp_config.json"),
486
+ Linux: home(".config", "Trae", "mcp_config.json")
487
+ },
488
+ mcpKey: "mcpServers"
489
+ },
490
+ {
491
+ name: "MaxClaw",
492
+ agentType: "maxclaw",
493
+ paths: { all: home(".maxclaw", "config.json") },
494
+ mcpKey: "mcpServers"
495
+ }
496
+ ];
497
+ }
498
+ var GenericCollector = class extends AgentCollector {
499
+ name = "Generic";
500
+ collect() {
501
+ const results = [];
502
+ for (const def of defs()) {
503
+ const configPath = platformPath(def.paths);
504
+ if (!configPath) continue;
505
+ if (!isFile(configPath)) {
506
+ results.push(
507
+ makeAgent(
508
+ def.name,
509
+ def.agentType,
510
+ configPath,
511
+ [],
512
+ [],
513
+ isDir(dirname5(configPath)) ? "installed_no_config" : "not_installed"
514
+ )
515
+ );
516
+ continue;
517
+ }
518
+ if (def.format === "yaml" || def.format === "toml" || !def.mcpKey) {
519
+ results.push(makeAgent(def.name, def.agentType, configPath, [], [], "found"));
520
+ continue;
521
+ }
522
+ const data = readConfig(configPath, def.format === "jsonc" ? "jsonc" : null);
523
+ if (!data) {
524
+ results.push(makeAgent(def.name, def.agentType, configPath, [], [], "error"));
525
+ continue;
526
+ }
527
+ const servers = extractMcpServers(data, configPath, def.agentType, def.mcpKey);
528
+ results.push(makeAgent(def.name, def.agentType, configPath, servers, [], "found"));
529
+ }
530
+ return results;
531
+ }
532
+ };
533
+ registerCollector(new GenericCollector());
534
+
535
+ // src/guard/collectors/process.ts
536
+ import { execSync } from "child_process";
537
+ var MCP_PATTERNS = [
538
+ { pattern: /\bnpx\b.*\b(@modelcontextprotocol\/server-[\w-]+|mcp-server-[\w-]+)\b/i, prefix: "npx" },
539
+ { pattern: /\buvx\b.*\b(mcp-server-[\w-]+)\b/i, prefix: "uvx" },
540
+ { pattern: /\bnode\b.*\b(mcp-server-[\w-]+|@modelcontextprotocol\/server-[\w-]+)\b/i, prefix: "node" },
541
+ { pattern: /\bpython[3]?\b.*\b(mcp[_-]server[_-][\w-]+)\b/i, prefix: "python" },
542
+ { pattern: /\bdeno\b.*\b(mcp-server-[\w-]+)\b/i, prefix: "deno" },
543
+ { pattern: /\bbun\b.*\b(mcp-server-[\w-]+)\b/i, prefix: "bun" }
544
+ ];
545
+ var ProcessCollector = class extends AgentCollector {
546
+ name = "Process";
547
+ collect() {
548
+ let psOutput;
549
+ try {
550
+ psOutput = execSync("ps aux", { encoding: "utf-8", timeout: 5e3 });
551
+ } catch {
552
+ return [];
553
+ }
554
+ const servers = [];
555
+ const seen = /* @__PURE__ */ new Set();
556
+ for (const line of psOutput.split("\n")) {
557
+ for (const { pattern, prefix } of MCP_PATTERNS) {
558
+ const match = pattern.exec(line);
559
+ if (!match) continue;
560
+ const serverName = match[1] ?? `${prefix}-unknown`;
561
+ if (seen.has(serverName)) continue;
562
+ seen.add(serverName);
563
+ servers.push(
564
+ createMCPServerConfig({
565
+ name: serverName,
566
+ command: prefix,
567
+ args: [serverName],
568
+ agents: ["process"],
569
+ sourceFile: "process:ps"
570
+ })
571
+ );
572
+ }
573
+ }
574
+ if (servers.length === 0) return [];
575
+ return [
576
+ makeAgent("Running Processes", "process", "ps:aux", servers, [], "found")
577
+ ];
578
+ }
579
+ };
580
+ registerCollector(new ProcessCollector());