@vibe-agent-toolkit/cli 0.1.0 → 0.1.2-rc.1

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.
Files changed (54) hide show
  1. package/README.md +67 -4
  2. package/dist/bin.js +17 -12
  3. package/dist/bin.js.map +1 -1
  4. package/dist/commands/agent/index.d.ts.map +1 -1
  5. package/dist/commands/agent/index.js +0 -37
  6. package/dist/commands/agent/index.js.map +1 -1
  7. package/dist/commands/audit/cache-detector.d.ts +32 -0
  8. package/dist/commands/audit/cache-detector.d.ts.map +1 -0
  9. package/dist/commands/audit/cache-detector.js +68 -0
  10. package/dist/commands/audit/cache-detector.js.map +1 -0
  11. package/dist/commands/audit/hierarchical-output.d.ts +41 -0
  12. package/dist/commands/audit/hierarchical-output.d.ts.map +1 -0
  13. package/dist/commands/audit/hierarchical-output.js +267 -0
  14. package/dist/commands/audit/hierarchical-output.js.map +1 -0
  15. package/dist/commands/audit.d.ts +19 -0
  16. package/dist/commands/audit.d.ts.map +1 -0
  17. package/dist/commands/audit.js +404 -0
  18. package/dist/commands/audit.js.map +1 -0
  19. package/dist/commands/doctor.d.ts +106 -0
  20. package/dist/commands/doctor.d.ts.map +1 -0
  21. package/dist/commands/doctor.js +499 -0
  22. package/dist/commands/doctor.js.map +1 -0
  23. package/dist/commands/mcp/collections.d.ts +48 -0
  24. package/dist/commands/mcp/collections.d.ts.map +1 -0
  25. package/dist/commands/mcp/collections.js +130 -0
  26. package/dist/commands/mcp/collections.js.map +1 -0
  27. package/dist/commands/mcp/index.d.ts +9 -0
  28. package/dist/commands/mcp/index.d.ts.map +1 -0
  29. package/dist/commands/mcp/index.js +80 -0
  30. package/dist/commands/mcp/index.js.map +1 -0
  31. package/dist/commands/mcp/list-collections.d.ts +11 -0
  32. package/dist/commands/mcp/list-collections.d.ts.map +1 -0
  33. package/dist/commands/mcp/list-collections.js +43 -0
  34. package/dist/commands/mcp/list-collections.js.map +1 -0
  35. package/dist/commands/mcp/serve.d.ts +12 -0
  36. package/dist/commands/mcp/serve.d.ts.map +1 -0
  37. package/dist/commands/mcp/serve.js +87 -0
  38. package/dist/commands/mcp/serve.js.map +1 -0
  39. package/dist/commands/resources/scan.d.ts.map +1 -1
  40. package/dist/commands/resources/scan.js +8 -0
  41. package/dist/commands/resources/scan.js.map +1 -1
  42. package/dist/utils/config-loader.d.ts +6 -0
  43. package/dist/utils/config-loader.d.ts.map +1 -1
  44. package/dist/utils/config-loader.js +18 -0
  45. package/dist/utils/config-loader.js.map +1 -1
  46. package/docs/audit.md +446 -0
  47. package/docs/doctor.md +268 -0
  48. package/docs/index.md +32 -0
  49. package/docs/mcp.md +317 -0
  50. package/package.json +14 -8
  51. package/dist/commands/agent/audit.d.ts +0 -9
  52. package/dist/commands/agent/audit.d.ts.map +0 -1
  53. package/dist/commands/agent/audit.js +0 -139
  54. package/dist/commands/agent/audit.js.map +0 -1
@@ -0,0 +1,130 @@
1
+ /**
2
+ * MCP collection resolution and loading
3
+ *
4
+ * Supports:
5
+ * - Package names: @vibe-agent-toolkit/vat-example-cat-agents
6
+ * - File paths: ./packages/vat-example-cat-agents
7
+ * - Collection suffix: @scope/package:collection-name
8
+ *
9
+ * Phase 1: Dynamic loading from npm packages or file paths
10
+ * Phase 2+: Global discovery registry
11
+ */
12
+ import { pathToFileURL } from 'node:url';
13
+ /**
14
+ * Resolve package name or file path to a collection
15
+ *
16
+ * Supports:
17
+ * - @scope/package → import from node_modules
18
+ * - @scope/package:collection → import specific collection
19
+ * - ./path → import from file path
20
+ * - /abs/path → import from absolute path
21
+ */
22
+ export async function resolveCollection(packageOrPath) {
23
+ const parts = packageOrPath.split(':');
24
+ const packagePart = parts[0] ?? packageOrPath;
25
+ const collectionName = parts[1];
26
+ const importPath = buildImportPath(packagePart);
27
+ const module = await loadCollectionModule(importPath, packageOrPath);
28
+ return selectCollection(module, collectionName, packagePart, packageOrPath);
29
+ }
30
+ /**
31
+ * Build import path from package name or file path
32
+ */
33
+ function buildImportPath(packagePart) {
34
+ const isFilePath = packagePart.startsWith('.') || packagePart.startsWith('/');
35
+ if (isFilePath) {
36
+ // File path: convert to file:// URL for ESM import
37
+ const absolutePath = new URL(packagePart, pathToFileURL(process.cwd() + '/').href).href;
38
+ return `${absolutePath}/dist/mcp-collections.js`;
39
+ }
40
+ // Package name: import from node_modules
41
+ return `${packagePart}/mcp-collections`;
42
+ }
43
+ /**
44
+ * Load collection module with error handling
45
+ */
46
+ async function loadCollectionModule(importPath, originalInput) {
47
+ try {
48
+ return (await import(importPath));
49
+ }
50
+ catch (error) {
51
+ throw new Error(`Failed to load MCP collections from '${originalInput}':\n` +
52
+ ` Import path: ${importPath}\n` +
53
+ ` Error: ${error instanceof Error ? error.message : String(error)}\n\n` +
54
+ `Make sure the package:\n` +
55
+ ` 1. Is installed (npm/bun install)\n` +
56
+ ` 2. Exports 'mcp-collections' entrypoint\n` +
57
+ ` 3. Has been built (bun run build)`);
58
+ }
59
+ }
60
+ /**
61
+ * Select collection from module
62
+ */
63
+ function selectCollection(module, collectionName, packagePart, originalInput) {
64
+ // Explicit collection requested
65
+ if (collectionName) {
66
+ return selectExplicitCollection(module, collectionName, packagePart);
67
+ }
68
+ // Auto-select collection
69
+ if (module.defaultCollection) {
70
+ return module.defaultCollection;
71
+ }
72
+ if (module.catAgents) {
73
+ return module.catAgents; // Legacy support
74
+ }
75
+ if (module.collections) {
76
+ return selectFromCollections(module.collections, packagePart);
77
+ }
78
+ throw new Error(`No MCP collections found in '${originalInput}'.\n` +
79
+ `Package must export:\n` +
80
+ ` - collections: Record<string, MCPCollection>\n` +
81
+ ` - defaultCollection: MCPCollection (optional)\n\n` +
82
+ `See: packages/vat-example-cat-agents/src/mcp-collections.ts`);
83
+ }
84
+ /**
85
+ * Select explicit collection by name
86
+ */
87
+ function selectExplicitCollection(module, collectionName, packagePart) {
88
+ const collection = module.collections?.[collectionName];
89
+ if (!collection) {
90
+ const available = module.collections ? Object.keys(module.collections).join(', ') : 'none';
91
+ throw new Error(`Collection '${collectionName}' not found in '${packagePart}'.\n` +
92
+ `Available collections: ${available}\n\n` +
93
+ `Usage: ${packagePart}:${available.split(', ')[0] ?? collectionName}`);
94
+ }
95
+ return collection;
96
+ }
97
+ /**
98
+ * Select collection from collections map
99
+ */
100
+ function selectFromCollections(collections, packagePart) {
101
+ const collectionNames = Object.keys(collections);
102
+ if (collectionNames.length === 1) {
103
+ const firstKey = collectionNames[0];
104
+ const collection = firstKey ? collections[firstKey] : undefined;
105
+ if (collection) {
106
+ return collection;
107
+ }
108
+ }
109
+ if (collectionNames.length > 1) {
110
+ throw new Error(`Package '${packagePart}' exports multiple collections.\n` +
111
+ `Please specify which one to use:\n` +
112
+ collectionNames.map((name) => ` ${packagePart}:${name}`).join('\n'));
113
+ }
114
+ throw new Error(`No collections found in collections object`);
115
+ }
116
+ /**
117
+ * List known packages with MCP collections
118
+ *
119
+ * Phase 1: Hardcoded known packages
120
+ * Phase 2+: Global registry or package.json discovery
121
+ */
122
+ export function listKnownPackages() {
123
+ return [
124
+ {
125
+ name: '@vibe-agent-toolkit/vat-example-cat-agents',
126
+ description: 'Example cat breeding agents (haiku validator, photo analyzer)',
127
+ },
128
+ ];
129
+ }
130
+ //# sourceMappingURL=collections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collections.js","sourceRoot":"","sources":["../../../src/commands/mcp/collections.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * MCP command group - expose VAT agents via Model Context Protocol
3
+ */
4
+ import { Command } from 'commander';
5
+ /**
6
+ * Create MCP command group
7
+ */
8
+ export declare function createMCPCommand(): Command;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/mcp/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CA+E1C"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * MCP command group - expose VAT agents via Model Context Protocol
3
+ */
4
+ import { Command } from 'commander';
5
+ import { listCollectionsCommand } from './list-collections.js';
6
+ import { serveCommand } from './serve.js';
7
+ /**
8
+ * Create MCP command group
9
+ */
10
+ export function createMCPCommand() {
11
+ const mcp = new Command('mcp');
12
+ mcp
13
+ .description('Expose agents via Model Context Protocol (MCP) for Claude Desktop')
14
+ .addHelpText('after', `
15
+ Description:
16
+ MCP Gateway exposes VAT agents as tools that Claude Desktop and other
17
+ MCP clients can discover and use.
18
+
19
+ Phase 1: Package-scoped collections (@scope/package or ./path)
20
+ Phase 2+: Global discovery registry with versioning
21
+
22
+ Examples:
23
+ $ vat mcp list-collections # Show known packages
24
+ $ vat mcp serve @vibe-agent-toolkit/vat-example-cat-agents
25
+ $ vat mcp serve ./packages/vat-example-cat-agents # Local development
26
+ `);
27
+ // vat mcp list-collections
28
+ mcp
29
+ .command('list-collections')
30
+ .description('List known MCP agent packages')
31
+ .option('--debug', 'Enable debug logging')
32
+ .action(listCollectionsCommand);
33
+ // vat mcp serve <package>
34
+ mcp
35
+ .command('serve <package>')
36
+ .description('Start MCP server for agent package')
37
+ .option('--debug', 'Enable debug logging')
38
+ .option('--print-config', 'Print Claude Desktop configuration and exit')
39
+ .addHelpText('after', `
40
+ Description:
41
+ Starts an MCP stdio server exposing agents from the specified package.
42
+ The server runs until terminated (Ctrl+C).
43
+
44
+ Supports:
45
+ - Package names: @scope/package (from node_modules)
46
+ - File paths: ./path or /abs/path (local development)
47
+ - Collection suffix: package:collection-name (if multiple)
48
+
49
+ For Claude Desktop integration, add the generated config to:
50
+ ~/.claude/config.json
51
+
52
+ Output:
53
+ - MCP protocol messages on stdout (for Claude Desktop)
54
+ - Logs to stderr (does not interfere with MCP protocol)
55
+
56
+ Examples:
57
+ # Production (from npm)
58
+ $ vat mcp serve @vibe-agent-toolkit/vat-example-cat-agents
59
+
60
+ # Local development (file path)
61
+ $ vat mcp serve ./packages/vat-example-cat-agents
62
+
63
+ # Show Claude Desktop config
64
+ $ vat mcp serve @vibe-agent-toolkit/vat-example-cat-agents --print-config
65
+
66
+ Claude Desktop Config:
67
+ Add to ~/.claude/config.json:
68
+ {
69
+ "mcpServers": {
70
+ "vat-agents": {
71
+ "command": "vat",
72
+ "args": ["mcp", "serve", "@vibe-agent-toolkit/vat-example-cat-agents"]
73
+ }
74
+ }
75
+ }
76
+ `)
77
+ .action(serveCommand);
78
+ return mcp;
79
+ }
80
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/mcp/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;IAE/B,GAAG;SACA,WAAW,CAAC,mEAAmE,CAAC;SAChF,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;CAYL,CACI,CAAC;IAEJ,2BAA2B;IAC3B,GAAG;SACA,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,SAAS,EAAE,sBAAsB,CAAC;SACzC,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAElC,0BAA0B;IAC1B,GAAG;SACA,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,oCAAoC,CAAC;SACjD,MAAM,CAAC,SAAS,EAAE,sBAAsB,CAAC;SACzC,MAAM,CAAC,gBAAgB,EAAE,6CAA6C,CAAC;SACvE,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCL,CACI;SACA,MAAM,CAAC,YAAY,CAAC,CAAC;IAExB,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * MCP list-collections command - lists available agent collections
3
+ */
4
+ export interface ListCollectionsOptions {
5
+ debug?: boolean;
6
+ }
7
+ /**
8
+ * List available MCP agent collections
9
+ */
10
+ export declare function listCollectionsCommand(options: ListCollectionsOptions): Promise<void>;
11
+ //# sourceMappingURL=list-collections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-collections.d.ts","sourceRoot":"","sources":["../../../src/commands/mcp/list-collections.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,WAAW,sBAAsB;IACrC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAqCf"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * MCP list-collections command - lists available agent collections
3
+ */
4
+ import { handleCommandError } from '../../utils/command-error.js';
5
+ import { createLogger } from '../../utils/logger.js';
6
+ import { writeYamlOutput } from '../../utils/output.js';
7
+ import { listKnownPackages } from './collections.js';
8
+ /**
9
+ * List available MCP agent collections
10
+ */
11
+ export async function listCollectionsCommand(options) {
12
+ const logger = createLogger(options.debug ? { debug: true } : {});
13
+ const startTime = Date.now();
14
+ try {
15
+ const packages = listKnownPackages();
16
+ const output = {
17
+ status: 'success',
18
+ packages: packages.map((p) => ({
19
+ name: p.name,
20
+ description: p.description,
21
+ })),
22
+ count: packages.length,
23
+ duration: `${Date.now() - startTime}ms`,
24
+ };
25
+ writeYamlOutput(output);
26
+ logger.info(`\nAvailable MCP agent packages:\n`);
27
+ for (const pkg of packages) {
28
+ logger.info(` ${pkg.name}`);
29
+ logger.info(` ${pkg.description}\n`);
30
+ }
31
+ logger.info(`Usage:`);
32
+ logger.info(` vat mcp serve <package> # Start MCP server`);
33
+ logger.info(` vat mcp serve <package> --print-config # Show Claude Desktop config\n`);
34
+ logger.info(`Examples:`);
35
+ logger.info(` vat mcp serve @vibe-agent-toolkit/vat-example-cat-agents`);
36
+ logger.info(` vat mcp serve ./packages/vat-example-cat-agents # Local development\n`);
37
+ process.exit(0);
38
+ }
39
+ catch (error) {
40
+ handleCommandError(error, logger, startTime, 'MCPListCollections');
41
+ }
42
+ }
43
+ //# sourceMappingURL=list-collections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-collections.js","sourceRoot":"","sources":["../../../src/commands/mcp/list-collections.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAMrD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAA+B;IAE/B,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;QAErC,MAAM,MAAM,GAAG;YACb,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;aAC3B,CAAC,CAAC;YACH,KAAK,EAAE,QAAQ,CAAC,MAAM;YACtB,QAAQ,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI;SACxC,CAAC;QAEF,eAAe,CAAC,MAAM,CAAC,CAAC;QAExB,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACjD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;QAC5E,MAAM,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;QAExF,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;QAC1E,MAAM,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;QAExF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC;IACrE,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * MCP serve command - exposes agent collections via MCP stdio transport
3
+ */
4
+ export interface ServeCommandOptions {
5
+ debug?: boolean;
6
+ printConfig?: boolean;
7
+ }
8
+ /**
9
+ * MCP serve command
10
+ */
11
+ export declare function serveCommand(packageOrPath: string, options: ServeCommandOptions): Promise<void>;
12
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../src/commands/mcp/serve.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAmCD;;GAEG;AACH,wBAAsB,YAAY,CAChC,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAwDf"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * MCP serve command - exposes agent collections via MCP stdio transport
3
+ */
4
+ import { StdioMCPGateway, ConsoleLogger, NoOpObservabilityProvider, } from '@vibe-agent-toolkit/gateway-mcp';
5
+ import { handleCommandError } from '../../utils/command-error.js';
6
+ import { createLogger } from '../../utils/logger.js';
7
+ import { resolveCollection } from './collections.js';
8
+ /**
9
+ * Custom observability provider with console logger
10
+ * Extends NoOpObservabilityProvider and overrides getLogger() to provide console output
11
+ */
12
+ class ConsoleObservabilityProvider extends NoOpObservabilityProvider {
13
+ consoleLogger = new ConsoleLogger();
14
+ getLogger() {
15
+ return this.consoleLogger;
16
+ }
17
+ }
18
+ /**
19
+ * Generate Claude Desktop configuration for a package
20
+ */
21
+ function generateClaudeDesktopConfig(packageOrPath) {
22
+ // Use package name as MCP server key (sanitize for JSON key)
23
+ const serverKey = packageOrPath
24
+ .replaceAll('@vibe-agent-toolkit/', 'vat-')
25
+ .replaceAll(/[^a-z0-9-]/gi, '-');
26
+ const config = {
27
+ mcpServers: {
28
+ [serverKey]: {
29
+ command: 'vat',
30
+ args: ['mcp', 'serve', packageOrPath],
31
+ },
32
+ },
33
+ };
34
+ return JSON.stringify(config, null, 2);
35
+ }
36
+ /**
37
+ * MCP serve command
38
+ */
39
+ export async function serveCommand(packageOrPath, options) {
40
+ const logger = createLogger(options.debug ? { debug: true } : {});
41
+ const startTime = Date.now();
42
+ try {
43
+ // Handle --print-config flag
44
+ if (options.printConfig) {
45
+ logger.info(`\nClaude Desktop configuration for '${packageOrPath}':\n`);
46
+ logger.info('Add this to ~/.claude/config.json:\n');
47
+ console.log(generateClaudeDesktopConfig(packageOrPath));
48
+ logger.info('\nThen restart Claude Desktop to load the MCP server.');
49
+ process.exit(0);
50
+ }
51
+ // Resolve collection from package name or file path
52
+ logger.debug(`Resolving MCP collection from: ${packageOrPath}`);
53
+ const collection = await resolveCollection(packageOrPath);
54
+ logger.debug(`Collection resolved: ${collection.name}`);
55
+ logger.debug(`Agents: ${collection.agents.map((a) => a.name).join(', ')}`);
56
+ // Create and start gateway
57
+ const gateway = new StdioMCPGateway({
58
+ agents: collection.agents.map((reg) => ({
59
+ name: reg.name,
60
+ agent: reg.agent,
61
+ })),
62
+ transport: 'stdio',
63
+ observability: new ConsoleObservabilityProvider(),
64
+ });
65
+ logger.info(`Starting MCP gateway: ${collection.agents.length} agent(s) (${Date.now() - startTime}ms)`);
66
+ await gateway.start();
67
+ // Setup graceful shutdown
68
+ process.on('SIGINT', () => {
69
+ logger.info('Shutting down MCP gateway...');
70
+ process.exit(0);
71
+ });
72
+ // Wait for stdin to close (stdio server lifetime = stdin lifetime)
73
+ await new Promise((resolve) => {
74
+ process.stdin.on('end', () => {
75
+ logger.info('Stdin closed, shutting down...');
76
+ resolve();
77
+ });
78
+ process.stdin.on('error', () => {
79
+ resolve();
80
+ });
81
+ });
82
+ }
83
+ catch (error) {
84
+ handleCommandError(error, logger, startTime, 'MCPServe');
85
+ }
86
+ }
87
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/commands/mcp/serve.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/commands/resources/scan.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAiDf"}
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/commands/resources/scan.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CA0Df"}
@@ -25,16 +25,24 @@ export async function scanCommand(pathArg, options) {
25
25
  return count;
26
26
  };
27
27
  const totalHeadings = allResources.reduce((sum, resource) => sum + countHeadings(resource.headings), 0);
28
+ // Get duplicate statistics
29
+ const duplicates = registry.getDuplicates();
30
+ const duplicateFileCount = duplicates.reduce((sum, group) => sum + group.length, 0);
31
+ const uniqueResources = registry.getUniqueByChecksum();
28
32
  // Output results as YAML
29
33
  writeYamlOutput({
30
34
  status: 'success',
31
35
  filesScanned: stats.totalResources,
36
+ uniqueFiles: uniqueResources.length,
37
+ duplicateGroups: duplicates.length,
38
+ duplicateFiles: duplicateFileCount,
32
39
  linksFound: stats.totalLinks,
33
40
  anchorsFound: totalHeadings,
34
41
  files: allResources.map(resource => ({
35
42
  path: resource.filePath,
36
43
  links: resource.links.length,
37
44
  anchors: countHeadings(resource.headings),
45
+ checksum: resource.checksum,
38
46
  })),
39
47
  duration: `${duration}ms`,
40
48
  });
@@ -1 +1 @@
1
- {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/commands/resources/scan.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAEzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAM1D,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAA2B,EAC3B,OAAoB;IAEpB,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,qCAAqC;QACrC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEpE,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAExC,oBAAoB;QACpB,MAAM,YAAY,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAC;QAIhD,MAAM,aAAa,GAAG,CAAC,QAA+B,EAAU,EAAE;YAChE,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC5B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACrB,KAAK,IAAI,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CACvC,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,GAAG,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACzD,CAAC,CACF,CAAC;QAEF,yBAAyB;QACzB,eAAe,CAAC;YACd,MAAM,EAAE,SAAS;YACjB,YAAY,EAAE,KAAK,CAAC,cAAc;YAClC,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,YAAY,EAAE,aAAa;YAC3B,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACnC,IAAI,EAAE,QAAQ,CAAC,QAAQ;gBACvB,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM;gBAC5B,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC;aAC1C,CAAC,CAAC;YACH,QAAQ,EAAE,GAAG,QAAQ,IAAI;SAC1B,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/commands/resources/scan.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAEzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAM1D,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAA2B,EAC3B,OAAoB;IAEpB,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,qCAAqC;QACrC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEpE,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAExC,oBAAoB;QACpB,MAAM,YAAY,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAC;QAIhD,MAAM,aAAa,GAAG,CAAC,QAA+B,EAAU,EAAE;YAChE,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC5B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACrB,KAAK,IAAI,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CACvC,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,GAAG,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACzD,CAAC,CACF,CAAC;QAEF,2BAA2B;QAC3B,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,kBAAkB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpF,MAAM,eAAe,GAAG,QAAQ,CAAC,mBAAmB,EAAE,CAAC;QAEvD,yBAAyB;QACzB,eAAe,CAAC;YACd,MAAM,EAAE,SAAS;YACjB,YAAY,EAAE,KAAK,CAAC,cAAc;YAClC,WAAW,EAAE,eAAe,CAAC,MAAM;YACnC,eAAe,EAAE,UAAU,CAAC,MAAM;YAClC,cAAc,EAAE,kBAAkB;YAClC,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,YAAY,EAAE,aAAa;YAC3B,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACnC,IAAI,EAAE,QAAQ,CAAC,QAAQ;gBACvB,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM;gBAC5B,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACzC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;aAC5B,CAAC,CAAC;YACH,QAAQ,EAAE,GAAG,QAAQ,IAAI;SAC1B,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;AACH,CAAC"}
@@ -2,6 +2,12 @@
2
2
  * Configuration file loading and validation
3
3
  */
4
4
  import { type ProjectConfig } from '../schemas/config.js';
5
+ /**
6
+ * Find configuration file by walking up directory tree
7
+ * @param startDir - Starting directory (defaults to cwd)
8
+ * @returns Path to config file, or null if not found
9
+ */
10
+ export declare function findConfigPath(startDir?: string): string | null;
5
11
  /**
6
12
  * Load and validate project configuration
7
13
  * @param projectRoot - Project root directory
@@ -1 +1 @@
1
- {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,EAAuC,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI/F;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CA6B7D"}
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,EAAuC,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI/F;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAc/D;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CA6B7D"}
@@ -6,6 +6,24 @@ import { join } from 'node:path';
6
6
  import * as yaml from 'js-yaml';
7
7
  import { ProjectConfigSchema, DEFAULT_CONFIG } from '../schemas/config.js';
8
8
  const CONFIG_FILENAME = 'vibe-agent-toolkit.config.yaml';
9
+ /**
10
+ * Find configuration file by walking up directory tree
11
+ * @param startDir - Starting directory (defaults to cwd)
12
+ * @returns Path to config file, or null if not found
13
+ */
14
+ export function findConfigPath(startDir) {
15
+ let currentDir = startDir ?? process.cwd();
16
+ const root = '/';
17
+ while (currentDir !== root) {
18
+ const configPath = join(currentDir, CONFIG_FILENAME);
19
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- Dynamic path walking is required for config file search
20
+ if (existsSync(configPath)) {
21
+ return configPath;
22
+ }
23
+ currentDir = join(currentDir, '..');
24
+ }
25
+ return null;
26
+ }
9
27
  /**
10
28
  * Load and validate project configuration
11
29
  * @param projectRoot - Project root directory
@@ -1 +1 @@
1
- {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAEhC,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAsB,MAAM,sBAAsB,CAAC;AAE/F,MAAM,eAAe,GAAG,gCAAgC,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,WAAmB;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAEtD,uHAAuH;IACvH,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,IAAI,CAAC;QACH,uHAAuH;QACvH,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAElC,2BAA2B;QAC3B,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAErD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,+BAA+B,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CACtD,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAEhC,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAsB,MAAM,sBAAsB,CAAC;AAE/F,MAAM,eAAe,GAAG,gCAAgC,CAAC;AAEzD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,QAAiB;IAC9C,IAAI,UAAU,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3C,MAAM,IAAI,GAAG,GAAG,CAAC;IAEjB,OAAO,UAAU,KAAK,IAAI,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QACrD,8HAA8H;QAC9H,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,WAAmB;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAEtD,uHAAuH;IACvH,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,IAAI,CAAC;QACH,uHAAuH;QACvH,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAElC,2BAA2B;QAC3B,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAErD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,+BAA+B,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CACtD,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}