oh-my-claude-sisyphus 3.7.2 → 3.7.4

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 (114) hide show
  1. package/agents/build-fixer-low.md +2 -2
  2. package/agents/build-fixer.md +74 -19
  3. package/agents/code-reviewer.md +7 -7
  4. package/agents/designer-high.md +2 -2
  5. package/agents/designer-low.md +1 -1
  6. package/agents/designer.md +17 -2
  7. package/agents/security-reviewer.md +86 -17
  8. package/agents/tdd-guide.md +151 -12
  9. package/dist/__tests__/compatibility-security.test.d.ts +13 -0
  10. package/dist/__tests__/compatibility-security.test.d.ts.map +1 -0
  11. package/dist/__tests__/compatibility-security.test.js +403 -0
  12. package/dist/__tests__/compatibility-security.test.js.map +1 -0
  13. package/dist/__tests__/compatibility.test.d.ts +7 -0
  14. package/dist/__tests__/compatibility.test.d.ts.map +1 -0
  15. package/dist/__tests__/compatibility.test.js +484 -0
  16. package/dist/__tests__/compatibility.test.js.map +1 -0
  17. package/dist/__tests__/hud/analytics-display.test.js +4 -0
  18. package/dist/__tests__/hud/analytics-display.test.js.map +1 -1
  19. package/dist/__tests__/installer.test.js +1 -1
  20. package/dist/__tests__/skills.test.js +6 -5
  21. package/dist/__tests__/skills.test.js.map +1 -1
  22. package/dist/agents/definitions.js +1 -1
  23. package/dist/agents/definitions.js.map +1 -1
  24. package/dist/compatibility/discovery.d.ts +58 -0
  25. package/dist/compatibility/discovery.d.ts.map +1 -0
  26. package/dist/compatibility/discovery.js +621 -0
  27. package/dist/compatibility/discovery.js.map +1 -0
  28. package/dist/compatibility/index.d.ts +51 -0
  29. package/dist/compatibility/index.d.ts.map +1 -0
  30. package/dist/compatibility/index.js +72 -0
  31. package/dist/compatibility/index.js.map +1 -0
  32. package/dist/compatibility/mcp-bridge.d.ts +138 -0
  33. package/dist/compatibility/mcp-bridge.d.ts.map +1 -0
  34. package/dist/compatibility/mcp-bridge.js +524 -0
  35. package/dist/compatibility/mcp-bridge.js.map +1 -0
  36. package/dist/compatibility/permission-adapter.d.ts +79 -0
  37. package/dist/compatibility/permission-adapter.d.ts.map +1 -0
  38. package/dist/compatibility/permission-adapter.js +369 -0
  39. package/dist/compatibility/permission-adapter.js.map +1 -0
  40. package/dist/compatibility/registry.d.ts +161 -0
  41. package/dist/compatibility/registry.d.ts.map +1 -0
  42. package/dist/compatibility/registry.js +389 -0
  43. package/dist/compatibility/registry.js.map +1 -0
  44. package/dist/compatibility/types.d.ts +249 -0
  45. package/dist/compatibility/types.d.ts.map +1 -0
  46. package/dist/compatibility/types.js +8 -0
  47. package/dist/compatibility/types.js.map +1 -0
  48. package/dist/features/rate-limit-wait/daemon.d.ts.map +1 -1
  49. package/dist/features/rate-limit-wait/daemon.js +3 -0
  50. package/dist/features/rate-limit-wait/daemon.js.map +1 -1
  51. package/dist/hooks/autopilot/prompts.d.ts.map +1 -1
  52. package/dist/hooks/autopilot/prompts.js +17 -3
  53. package/dist/hooks/autopilot/prompts.js.map +1 -1
  54. package/dist/hooks/github-auto-responder/classifier.d.ts +43 -0
  55. package/dist/hooks/github-auto-responder/classifier.d.ts.map +1 -0
  56. package/dist/hooks/github-auto-responder/classifier.js +150 -0
  57. package/dist/hooks/github-auto-responder/classifier.js.map +1 -0
  58. package/dist/hooks/github-auto-responder/config.d.ts +109 -0
  59. package/dist/hooks/github-auto-responder/config.d.ts.map +1 -0
  60. package/dist/hooks/github-auto-responder/config.js +69 -0
  61. package/dist/hooks/github-auto-responder/config.js.map +1 -0
  62. package/dist/hooks/github-auto-responder/constants.d.ts +45 -0
  63. package/dist/hooks/github-auto-responder/constants.d.ts.map +1 -0
  64. package/dist/hooks/github-auto-responder/constants.js +60 -0
  65. package/dist/hooks/github-auto-responder/constants.js.map +1 -0
  66. package/dist/hooks/github-auto-responder/filters.d.ts +95 -0
  67. package/dist/hooks/github-auto-responder/filters.d.ts.map +1 -0
  68. package/dist/hooks/github-auto-responder/filters.js +174 -0
  69. package/dist/hooks/github-auto-responder/filters.js.map +1 -0
  70. package/dist/hooks/github-auto-responder/github-client.d.ts +65 -0
  71. package/dist/hooks/github-auto-responder/github-client.d.ts.map +1 -0
  72. package/dist/hooks/github-auto-responder/github-client.js +128 -0
  73. package/dist/hooks/github-auto-responder/github-client.js.map +1 -0
  74. package/dist/hooks/github-auto-responder/idempotency.d.ts +68 -0
  75. package/dist/hooks/github-auto-responder/idempotency.d.ts.map +1 -0
  76. package/dist/hooks/github-auto-responder/idempotency.js +147 -0
  77. package/dist/hooks/github-auto-responder/idempotency.js.map +1 -0
  78. package/dist/hooks/github-auto-responder/index.d.ts +140 -0
  79. package/dist/hooks/github-auto-responder/index.d.ts.map +1 -0
  80. package/dist/hooks/github-auto-responder/index.js +145 -0
  81. package/dist/hooks/github-auto-responder/index.js.map +1 -0
  82. package/dist/hooks/github-auto-responder/persona.d.ts +40 -0
  83. package/dist/hooks/github-auto-responder/persona.d.ts.map +1 -0
  84. package/dist/hooks/github-auto-responder/persona.js +99 -0
  85. package/dist/hooks/github-auto-responder/persona.js.map +1 -0
  86. package/dist/hooks/github-auto-responder/responder.d.ts +122 -0
  87. package/dist/hooks/github-auto-responder/responder.d.ts.map +1 -0
  88. package/dist/hooks/github-auto-responder/responder.js +264 -0
  89. package/dist/hooks/github-auto-responder/responder.js.map +1 -0
  90. package/dist/hooks/github-auto-responder/server.d.ts +140 -0
  91. package/dist/hooks/github-auto-responder/server.d.ts.map +1 -0
  92. package/dist/hooks/github-auto-responder/server.js +301 -0
  93. package/dist/hooks/github-auto-responder/server.js.map +1 -0
  94. package/dist/hooks/github-auto-responder/signature.d.ts +34 -0
  95. package/dist/hooks/github-auto-responder/signature.d.ts.map +1 -0
  96. package/dist/hooks/github-auto-responder/signature.js +79 -0
  97. package/dist/hooks/github-auto-responder/signature.js.map +1 -0
  98. package/dist/hooks/github-auto-responder/templates.d.ts +16 -0
  99. package/dist/hooks/github-auto-responder/templates.d.ts.map +1 -0
  100. package/dist/hooks/github-auto-responder/templates.js +93 -0
  101. package/dist/hooks/github-auto-responder/templates.js.map +1 -0
  102. package/dist/hooks/github-auto-responder/types.d.ts +246 -0
  103. package/dist/hooks/github-auto-responder/types.d.ts.map +1 -0
  104. package/dist/hooks/github-auto-responder/types.js +7 -0
  105. package/dist/hooks/github-auto-responder/types.js.map +1 -0
  106. package/dist/hud/analytics-display.d.ts +1 -1
  107. package/dist/hud/analytics-display.d.ts.map +1 -1
  108. package/dist/hud/analytics-display.js +24 -7
  109. package/dist/hud/analytics-display.js.map +1 -1
  110. package/dist/installer/index.d.ts +1 -1
  111. package/dist/installer/index.js +1 -1
  112. package/docs/COMPATIBILITY.md +1051 -0
  113. package/package.json +3 -1
  114. package/scripts/github-webhook-server.ts +141 -0
@@ -0,0 +1,621 @@
1
+ /**
2
+ * Plugin and MCP Server Discovery
3
+ *
4
+ * Discovers external plugins, MCP servers, and tools from:
5
+ * - ~/.claude/plugins/ (Claude Code plugins)
6
+ * - ~/.claude/settings.json (MCP servers config)
7
+ * - ~/.claude/claude_desktop_config.json (Desktop app MCP config)
8
+ * - Project-local .claude-plugin/ directories
9
+ */
10
+ import { existsSync, readdirSync, readFileSync, realpathSync } from 'fs';
11
+ import { join, basename, resolve, normalize } from 'path';
12
+ import { homedir } from 'os';
13
+ import Ajv from 'ajv';
14
+ /**
15
+ * Security Error for discovery operations
16
+ */
17
+ export class DiscoverySecurityError extends Error {
18
+ constructor(message) {
19
+ super(message);
20
+ this.name = 'DiscoverySecurityError';
21
+ }
22
+ }
23
+ /**
24
+ * JSON Schema for plugin manifest validation
25
+ */
26
+ const pluginManifestSchema = {
27
+ type: 'object',
28
+ required: ['name', 'version'],
29
+ properties: {
30
+ name: { type: 'string', pattern: '^[a-zA-Z0-9_-]+$', maxLength: 100 },
31
+ version: { type: 'string', maxLength: 50 },
32
+ description: { type: 'string', maxLength: 500 },
33
+ namespace: { type: 'string', pattern: '^[a-zA-Z0-9_-]+$', maxLength: 100 },
34
+ skills: {
35
+ oneOf: [
36
+ { type: 'string', maxLength: 200 },
37
+ { type: 'array', items: { type: 'string', maxLength: 200 }, maxItems: 50 },
38
+ ],
39
+ },
40
+ agents: {
41
+ oneOf: [
42
+ { type: 'string', maxLength: 200 },
43
+ { type: 'array', items: { type: 'string', maxLength: 200 }, maxItems: 50 },
44
+ ],
45
+ },
46
+ tools: {
47
+ type: 'array',
48
+ maxItems: 100,
49
+ items: {
50
+ type: 'object',
51
+ required: ['name'],
52
+ properties: {
53
+ name: { type: 'string', pattern: '^[a-zA-Z0-9_-]+$', maxLength: 100 },
54
+ description: { type: 'string', maxLength: 500 },
55
+ inputSchema: { type: 'object' },
56
+ },
57
+ additionalProperties: false,
58
+ },
59
+ },
60
+ permissions: {
61
+ type: 'array',
62
+ maxItems: 100,
63
+ items: {
64
+ type: 'object',
65
+ properties: {
66
+ tool: { type: 'string', maxLength: 200 },
67
+ scope: { type: 'string', enum: ['read', 'write', 'execute'] },
68
+ patterns: { type: 'array', items: { type: 'string', maxLength: 500 }, maxItems: 50 },
69
+ reason: { type: 'string', maxLength: 500 },
70
+ },
71
+ },
72
+ },
73
+ mcpServers: {
74
+ type: 'object',
75
+ additionalProperties: {
76
+ type: 'object',
77
+ required: ['command'],
78
+ properties: {
79
+ command: { type: 'string', maxLength: 500 },
80
+ args: { type: 'array', items: { type: 'string', maxLength: 500 }, maxItems: 50 },
81
+ env: { type: 'object', additionalProperties: { type: 'string', maxLength: 1000 } },
82
+ enabled: { type: 'boolean' },
83
+ },
84
+ },
85
+ },
86
+ },
87
+ additionalProperties: true,
88
+ };
89
+ /**
90
+ * JSON Schema for MCP server config validation
91
+ */
92
+ const mcpServerConfigSchema = {
93
+ type: 'object',
94
+ required: ['command'],
95
+ properties: {
96
+ command: { type: 'string', minLength: 1, maxLength: 500 },
97
+ args: { type: 'array', items: { type: 'string', maxLength: 500 }, maxItems: 50 },
98
+ env: { type: 'object', additionalProperties: { type: 'string', maxLength: 1000 } },
99
+ enabled: { type: 'boolean' },
100
+ },
101
+ additionalProperties: false,
102
+ };
103
+ // Compile schemas
104
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
105
+ const AjvConstructor = Ajv.default ?? Ajv;
106
+ const ajv = new AjvConstructor({ allErrors: true, strict: false });
107
+ const validatePluginManifest = ajv.compile(pluginManifestSchema);
108
+ const validateMcpServerConfig = ajv.compile(mcpServerConfigSchema);
109
+ /**
110
+ * SECURITY: Validate that a path stays within a base directory
111
+ * Prevents path traversal attacks like ../../../../etc/passwd
112
+ */
113
+ function isPathWithinDirectory(basePath, targetPath) {
114
+ try {
115
+ // Resolve both paths to absolute form
116
+ const resolvedBase = resolve(basePath);
117
+ const resolvedTarget = resolve(basePath, targetPath);
118
+ // Normalize paths to handle ../ sequences
119
+ const normalizedBase = normalize(resolvedBase);
120
+ const normalizedTarget = normalize(resolvedTarget);
121
+ // Check if target is within base (starts with base path)
122
+ if (!normalizedTarget.startsWith(normalizedBase)) {
123
+ return false;
124
+ }
125
+ // Additional check: verify the path actually exists within base
126
+ // by checking real path (follows symlinks)
127
+ if (existsSync(normalizedTarget)) {
128
+ const realTarget = realpathSync(normalizedTarget);
129
+ const realBase = existsSync(normalizedBase) ? realpathSync(normalizedBase) : normalizedBase;
130
+ if (!realTarget.startsWith(realBase)) {
131
+ return false;
132
+ }
133
+ }
134
+ return true;
135
+ }
136
+ catch {
137
+ return false;
138
+ }
139
+ }
140
+ /**
141
+ * Default paths for discovery
142
+ */
143
+ const DEFAULT_PLUGIN_PATHS = [
144
+ join(homedir(), '.claude', 'plugins'),
145
+ join(homedir(), '.claude', 'installed-plugins'),
146
+ ];
147
+ const DEFAULT_MCP_CONFIG_PATH = join(homedir(), '.claude', 'claude_desktop_config.json');
148
+ const DEFAULT_SETTINGS_PATH = join(homedir(), '.claude', 'settings.json');
149
+ /**
150
+ * Infer capabilities from tool name and description
151
+ */
152
+ function inferCapabilities(name, description) {
153
+ const capabilities = [];
154
+ const text = `${name} ${description || ''}`.toLowerCase();
155
+ if (text.includes('read') || text.includes('get') || text.includes('fetch') || text.includes('list')) {
156
+ capabilities.push('read');
157
+ }
158
+ if (text.includes('write') || text.includes('create') || text.includes('update') || text.includes('edit')) {
159
+ capabilities.push('write');
160
+ }
161
+ if (text.includes('exec') || text.includes('run') || text.includes('bash') || text.includes('command')) {
162
+ capabilities.push('execute');
163
+ }
164
+ if (text.includes('search') || text.includes('find') || text.includes('query') || text.includes('grep')) {
165
+ capabilities.push('search');
166
+ }
167
+ if (text.includes('http') || text.includes('fetch') || text.includes('web') || text.includes('api')) {
168
+ capabilities.push('network');
169
+ }
170
+ if (text.includes('analyz') || text.includes('inspect') || text.includes('check') || text.includes('review')) {
171
+ capabilities.push('analyze');
172
+ }
173
+ if (text.includes('generat') || text.includes('creat') || text.includes('build') || text.includes('make')) {
174
+ capabilities.push('generate');
175
+ }
176
+ return capabilities.length > 0 ? capabilities : ['unknown'];
177
+ }
178
+ /**
179
+ * Parse and validate a plugin manifest file
180
+ */
181
+ function parsePluginManifest(manifestPath) {
182
+ try {
183
+ const content = readFileSync(manifestPath, 'utf-8');
184
+ const parsed = JSON.parse(content);
185
+ // SECURITY: Validate manifest against schema
186
+ if (!validatePluginManifest(parsed)) {
187
+ const errors = validatePluginManifest.errors
188
+ ?.map((e) => `${e.instancePath}: ${e.message}`)
189
+ .join(', ');
190
+ console.warn(`[Security] Invalid plugin manifest at ${manifestPath}: ${errors}`);
191
+ return null;
192
+ }
193
+ return parsed;
194
+ }
195
+ catch (error) {
196
+ return null;
197
+ }
198
+ }
199
+ /**
200
+ * Discover skills from a plugin directory
201
+ */
202
+ function discoverPluginSkills(pluginPath, manifest) {
203
+ const tools = [];
204
+ const namespace = manifest.namespace || manifest.name;
205
+ // Handle skills directory
206
+ let skillsPaths = [];
207
+ if (typeof manifest.skills === 'string') {
208
+ // SECURITY: Validate path stays within plugin directory
209
+ if (!isPathWithinDirectory(pluginPath, manifest.skills)) {
210
+ console.warn(`[Security] Path traversal detected in plugin ${manifest.name}: skills path "${manifest.skills}" escapes plugin directory`);
211
+ return tools;
212
+ }
213
+ skillsPaths = [join(pluginPath, manifest.skills)];
214
+ }
215
+ else if (Array.isArray(manifest.skills)) {
216
+ skillsPaths = [];
217
+ for (const s of manifest.skills) {
218
+ // SECURITY: Validate each path
219
+ if (!isPathWithinDirectory(pluginPath, s)) {
220
+ console.warn(`[Security] Path traversal detected in plugin ${manifest.name}: skills path "${s}" escapes plugin directory`);
221
+ continue;
222
+ }
223
+ skillsPaths.push(join(pluginPath, s));
224
+ }
225
+ }
226
+ for (const skillsPath of skillsPaths) {
227
+ if (!existsSync(skillsPath))
228
+ continue;
229
+ try {
230
+ const entries = readdirSync(skillsPath, { withFileTypes: true });
231
+ for (const entry of entries) {
232
+ if (!entry.isDirectory())
233
+ continue;
234
+ const skillMdPath = join(skillsPath, entry.name, 'SKILL.md');
235
+ if (!existsSync(skillMdPath))
236
+ continue;
237
+ // Parse skill metadata from SKILL.md frontmatter
238
+ const skillContent = readFileSync(skillMdPath, 'utf-8');
239
+ const frontmatterMatch = skillContent.match(/^---\r?\n([\s\S]*?)\r?\n---/);
240
+ const metadata = {};
241
+ if (frontmatterMatch) {
242
+ for (const line of frontmatterMatch[1].split('\n')) {
243
+ const colonIdx = line.indexOf(':');
244
+ if (colonIdx > 0) {
245
+ const key = line.slice(0, colonIdx).trim();
246
+ let value = line.slice(colonIdx + 1).trim();
247
+ // Remove quotes
248
+ if ((value.startsWith('"') && value.endsWith('"')) ||
249
+ (value.startsWith("'") && value.endsWith("'"))) {
250
+ value = value.slice(1, -1);
251
+ }
252
+ metadata[key] = value;
253
+ }
254
+ }
255
+ }
256
+ tools.push({
257
+ name: `${namespace}:${entry.name}`,
258
+ type: 'skill',
259
+ source: manifest.name,
260
+ description: metadata.description || `Skill from ${manifest.name}`,
261
+ commands: [entry.name],
262
+ capabilities: inferCapabilities(entry.name, metadata.description),
263
+ enabled: true,
264
+ priority: 50, // Default priority for external skills
265
+ });
266
+ }
267
+ }
268
+ catch {
269
+ // Skip directories we can't read
270
+ }
271
+ }
272
+ return tools;
273
+ }
274
+ /**
275
+ * Discover agents from a plugin directory
276
+ */
277
+ function discoverPluginAgents(pluginPath, manifest) {
278
+ const tools = [];
279
+ const namespace = manifest.namespace || manifest.name;
280
+ // Handle agents directory
281
+ let agentsPaths = [];
282
+ if (typeof manifest.agents === 'string') {
283
+ // SECURITY: Validate path stays within plugin directory
284
+ if (!isPathWithinDirectory(pluginPath, manifest.agents)) {
285
+ console.warn(`[Security] Path traversal detected in plugin ${manifest.name}: agents path "${manifest.agents}" escapes plugin directory`);
286
+ return tools;
287
+ }
288
+ agentsPaths = [join(pluginPath, manifest.agents)];
289
+ }
290
+ else if (Array.isArray(manifest.agents)) {
291
+ agentsPaths = [];
292
+ for (const a of manifest.agents) {
293
+ // SECURITY: Validate each path
294
+ if (!isPathWithinDirectory(pluginPath, a)) {
295
+ console.warn(`[Security] Path traversal detected in plugin ${manifest.name}: agents path "${a}" escapes plugin directory`);
296
+ continue;
297
+ }
298
+ agentsPaths.push(join(pluginPath, a));
299
+ }
300
+ }
301
+ for (const agentsPath of agentsPaths) {
302
+ if (!existsSync(agentsPath))
303
+ continue;
304
+ try {
305
+ const entries = readdirSync(agentsPath);
306
+ for (const entry of entries) {
307
+ if (!entry.endsWith('.md'))
308
+ continue;
309
+ const agentPath = join(agentsPath, entry);
310
+ const agentContent = readFileSync(agentPath, 'utf-8');
311
+ const agentName = basename(entry, '.md');
312
+ // Parse agent metadata from frontmatter
313
+ const frontmatterMatch = agentContent.match(/^---\r?\n([\s\S]*?)\r?\n---/);
314
+ const metadata = {};
315
+ if (frontmatterMatch) {
316
+ for (const line of frontmatterMatch[1].split('\n')) {
317
+ const colonIdx = line.indexOf(':');
318
+ if (colonIdx > 0) {
319
+ const key = line.slice(0, colonIdx).trim();
320
+ let value = line.slice(colonIdx + 1).trim();
321
+ if ((value.startsWith('"') && value.endsWith('"')) ||
322
+ (value.startsWith("'") && value.endsWith("'"))) {
323
+ value = value.slice(1, -1);
324
+ }
325
+ metadata[key] = value;
326
+ }
327
+ }
328
+ }
329
+ tools.push({
330
+ name: `${namespace}:${agentName}`,
331
+ type: 'agent',
332
+ source: manifest.name,
333
+ description: metadata.description || `Agent from ${manifest.name}`,
334
+ capabilities: ['analyze', 'generate'],
335
+ enabled: true,
336
+ priority: 50,
337
+ });
338
+ }
339
+ }
340
+ catch {
341
+ // Skip directories we can't read
342
+ }
343
+ }
344
+ return tools;
345
+ }
346
+ /**
347
+ * Discover a single plugin from a directory
348
+ */
349
+ function discoverPlugin(pluginPath) {
350
+ // Look for plugin.json in the directory or in .claude-plugin subdirectory
351
+ let manifestPath = join(pluginPath, 'plugin.json');
352
+ if (!existsSync(manifestPath)) {
353
+ manifestPath = join(pluginPath, '.claude-plugin', 'plugin.json');
354
+ }
355
+ if (!existsSync(manifestPath)) {
356
+ return null;
357
+ }
358
+ const manifest = parsePluginManifest(manifestPath);
359
+ if (!manifest) {
360
+ return {
361
+ name: basename(pluginPath),
362
+ version: 'unknown',
363
+ path: pluginPath,
364
+ manifest: { name: basename(pluginPath), version: 'unknown' },
365
+ loaded: false,
366
+ error: 'Failed to parse plugin manifest',
367
+ tools: [],
368
+ };
369
+ }
370
+ // Discover tools from this plugin
371
+ const tools = [
372
+ ...discoverPluginSkills(pluginPath, manifest),
373
+ ...discoverPluginAgents(pluginPath, manifest),
374
+ ];
375
+ // Add tool definitions from manifest
376
+ if (manifest.tools) {
377
+ for (const toolDef of manifest.tools) {
378
+ tools.push({
379
+ name: `${manifest.namespace || manifest.name}:${toolDef.name}`,
380
+ type: 'plugin',
381
+ source: manifest.name,
382
+ description: toolDef.description,
383
+ capabilities: inferCapabilities(toolDef.name, toolDef.description),
384
+ enabled: true,
385
+ schema: toolDef.inputSchema,
386
+ priority: 50,
387
+ });
388
+ }
389
+ }
390
+ return {
391
+ name: manifest.name,
392
+ version: manifest.version,
393
+ path: pluginPath,
394
+ manifest,
395
+ loaded: true,
396
+ tools,
397
+ };
398
+ }
399
+ /**
400
+ * Discover all plugins from configured paths
401
+ */
402
+ export function discoverPlugins(options) {
403
+ const plugins = [];
404
+ const paths = options?.pluginPaths || DEFAULT_PLUGIN_PATHS;
405
+ for (const basePath of paths) {
406
+ if (!existsSync(basePath))
407
+ continue;
408
+ try {
409
+ const entries = readdirSync(basePath, { withFileTypes: true });
410
+ for (const entry of entries) {
411
+ if (!entry.isDirectory())
412
+ continue;
413
+ // Skip our own plugin
414
+ if (entry.name === 'oh-my-claudecode')
415
+ continue;
416
+ const pluginPath = join(basePath, entry.name);
417
+ const plugin = discoverPlugin(pluginPath);
418
+ if (plugin) {
419
+ plugins.push(plugin);
420
+ }
421
+ }
422
+ }
423
+ catch {
424
+ // Skip paths we can't read
425
+ }
426
+ }
427
+ return plugins;
428
+ }
429
+ /**
430
+ * Parse MCP servers from Claude Desktop config format
431
+ */
432
+ function parseMcpDesktopConfig(configPath) {
433
+ const servers = [];
434
+ if (!existsSync(configPath)) {
435
+ return servers;
436
+ }
437
+ try {
438
+ const content = readFileSync(configPath, 'utf-8');
439
+ const config = JSON.parse(content);
440
+ if (!config.mcpServers) {
441
+ return servers;
442
+ }
443
+ for (const [name, serverConfig] of Object.entries(config.mcpServers)) {
444
+ // SECURITY: Validate server config against schema
445
+ if (!validateMcpServerConfig(serverConfig)) {
446
+ const errors = validateMcpServerConfig.errors
447
+ ?.map((e) => `${e.instancePath}: ${e.message}`)
448
+ .join(', ');
449
+ console.warn(`[Security] Invalid MCP server config for "${name}": ${errors}`);
450
+ continue;
451
+ }
452
+ servers.push({
453
+ name,
454
+ config: serverConfig,
455
+ source: 'claude_desktop_config',
456
+ connected: false,
457
+ tools: [], // Tools discovered after connection
458
+ });
459
+ }
460
+ }
461
+ catch {
462
+ // Ignore parse errors
463
+ }
464
+ return servers;
465
+ }
466
+ /**
467
+ * Parse MCP servers from Claude Code settings.json
468
+ */
469
+ function parseMcpSettings(settingsPath) {
470
+ const servers = [];
471
+ if (!existsSync(settingsPath)) {
472
+ return servers;
473
+ }
474
+ try {
475
+ const content = readFileSync(settingsPath, 'utf-8');
476
+ const settings = JSON.parse(content);
477
+ if (!settings.mcpServers) {
478
+ return servers;
479
+ }
480
+ for (const [name, serverConfig] of Object.entries(settings.mcpServers)) {
481
+ // SECURITY: Validate server config against schema
482
+ if (!validateMcpServerConfig(serverConfig)) {
483
+ const errors = validateMcpServerConfig.errors
484
+ ?.map((e) => `${e.instancePath}: ${e.message}`)
485
+ .join(', ');
486
+ console.warn(`[Security] Invalid MCP server config for "${name}": ${errors}`);
487
+ continue;
488
+ }
489
+ servers.push({
490
+ name,
491
+ config: serverConfig,
492
+ source: 'settings.json',
493
+ connected: false,
494
+ tools: [],
495
+ });
496
+ }
497
+ }
498
+ catch {
499
+ // Ignore parse errors
500
+ }
501
+ return servers;
502
+ }
503
+ /**
504
+ * Discover all MCP servers from configuration files
505
+ */
506
+ export function discoverMcpServers(options) {
507
+ const servers = [];
508
+ const seen = new Set();
509
+ // Check settings.json first (higher priority)
510
+ const settingsPath = options?.settingsPath || DEFAULT_SETTINGS_PATH;
511
+ const settingsServers = parseMcpSettings(settingsPath);
512
+ for (const server of settingsServers) {
513
+ if (!seen.has(server.name)) {
514
+ servers.push(server);
515
+ seen.add(server.name);
516
+ }
517
+ }
518
+ // Check claude_desktop_config.json
519
+ const mcpConfigPath = options?.mcpConfigPath || DEFAULT_MCP_CONFIG_PATH;
520
+ const desktopServers = parseMcpDesktopConfig(mcpConfigPath);
521
+ for (const server of desktopServers) {
522
+ if (!seen.has(server.name)) {
523
+ servers.push(server);
524
+ seen.add(server.name);
525
+ }
526
+ }
527
+ return servers;
528
+ }
529
+ /**
530
+ * Discover MCP servers from plugin manifests
531
+ */
532
+ export function discoverPluginMcpServers(plugins) {
533
+ const servers = [];
534
+ for (const plugin of plugins) {
535
+ if (!plugin.manifest.mcpServers)
536
+ continue;
537
+ for (const [name, serverConfig] of Object.entries(plugin.manifest.mcpServers)) {
538
+ servers.push({
539
+ name: `${plugin.name}:${name}`,
540
+ config: serverConfig,
541
+ source: plugin.name,
542
+ connected: false,
543
+ tools: [],
544
+ });
545
+ }
546
+ }
547
+ return servers;
548
+ }
549
+ /**
550
+ * Perform full discovery of plugins and MCP servers
551
+ */
552
+ export function discoverAll(options) {
553
+ // Discover plugins
554
+ const plugins = discoverPlugins(options);
555
+ // Discover MCP servers from config files
556
+ const configMcpServers = discoverMcpServers(options);
557
+ // Discover MCP servers from plugin manifests
558
+ const pluginMcpServers = discoverPluginMcpServers(plugins);
559
+ // Merge MCP servers (config takes priority)
560
+ const mcpServers = [...configMcpServers];
561
+ const seenServers = new Set(configMcpServers.map(s => s.name));
562
+ for (const server of pluginMcpServers) {
563
+ if (!seenServers.has(server.name)) {
564
+ mcpServers.push(server);
565
+ }
566
+ }
567
+ // Collect all tools
568
+ const allTools = [];
569
+ for (const plugin of plugins) {
570
+ allTools.push(...plugin.tools);
571
+ }
572
+ return {
573
+ plugins,
574
+ mcpServers,
575
+ allTools,
576
+ timestamp: Date.now(),
577
+ };
578
+ }
579
+ /**
580
+ * Get paths being scanned for plugins
581
+ */
582
+ export function getPluginPaths() {
583
+ return DEFAULT_PLUGIN_PATHS.filter(p => existsSync(p));
584
+ }
585
+ /**
586
+ * Get path to MCP config file if it exists
587
+ */
588
+ export function getMcpConfigPath() {
589
+ if (existsSync(DEFAULT_MCP_CONFIG_PATH)) {
590
+ return DEFAULT_MCP_CONFIG_PATH;
591
+ }
592
+ if (existsSync(DEFAULT_SETTINGS_PATH)) {
593
+ return DEFAULT_SETTINGS_PATH;
594
+ }
595
+ return null;
596
+ }
597
+ /**
598
+ * Check if a specific plugin is installed
599
+ */
600
+ export function isPluginInstalled(pluginName) {
601
+ for (const basePath of DEFAULT_PLUGIN_PATHS) {
602
+ const pluginPath = join(basePath, pluginName);
603
+ if (existsSync(pluginPath)) {
604
+ return true;
605
+ }
606
+ }
607
+ return false;
608
+ }
609
+ /**
610
+ * Get plugin info by name
611
+ */
612
+ export function getPluginInfo(pluginName) {
613
+ for (const basePath of DEFAULT_PLUGIN_PATHS) {
614
+ const pluginPath = join(basePath, pluginName);
615
+ if (existsSync(pluginPath)) {
616
+ return discoverPlugin(pluginPath);
617
+ }
618
+ }
619
+ return null;
620
+ }
621
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/compatibility/discovery.ts"],"names":[],"mappings":"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"}