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.
- package/agents/build-fixer-low.md +2 -2
- package/agents/build-fixer.md +74 -19
- package/agents/code-reviewer.md +7 -7
- package/agents/designer-high.md +2 -2
- package/agents/designer-low.md +1 -1
- package/agents/designer.md +17 -2
- package/agents/security-reviewer.md +86 -17
- package/agents/tdd-guide.md +151 -12
- package/dist/__tests__/compatibility-security.test.d.ts +13 -0
- package/dist/__tests__/compatibility-security.test.d.ts.map +1 -0
- package/dist/__tests__/compatibility-security.test.js +403 -0
- package/dist/__tests__/compatibility-security.test.js.map +1 -0
- package/dist/__tests__/compatibility.test.d.ts +7 -0
- package/dist/__tests__/compatibility.test.d.ts.map +1 -0
- package/dist/__tests__/compatibility.test.js +484 -0
- package/dist/__tests__/compatibility.test.js.map +1 -0
- package/dist/__tests__/hud/analytics-display.test.js +4 -0
- package/dist/__tests__/hud/analytics-display.test.js.map +1 -1
- package/dist/__tests__/installer.test.js +1 -1
- package/dist/__tests__/skills.test.js +6 -5
- package/dist/__tests__/skills.test.js.map +1 -1
- package/dist/agents/definitions.js +1 -1
- package/dist/agents/definitions.js.map +1 -1
- package/dist/compatibility/discovery.d.ts +58 -0
- package/dist/compatibility/discovery.d.ts.map +1 -0
- package/dist/compatibility/discovery.js +621 -0
- package/dist/compatibility/discovery.js.map +1 -0
- package/dist/compatibility/index.d.ts +51 -0
- package/dist/compatibility/index.d.ts.map +1 -0
- package/dist/compatibility/index.js +72 -0
- package/dist/compatibility/index.js.map +1 -0
- package/dist/compatibility/mcp-bridge.d.ts +138 -0
- package/dist/compatibility/mcp-bridge.d.ts.map +1 -0
- package/dist/compatibility/mcp-bridge.js +524 -0
- package/dist/compatibility/mcp-bridge.js.map +1 -0
- package/dist/compatibility/permission-adapter.d.ts +79 -0
- package/dist/compatibility/permission-adapter.d.ts.map +1 -0
- package/dist/compatibility/permission-adapter.js +369 -0
- package/dist/compatibility/permission-adapter.js.map +1 -0
- package/dist/compatibility/registry.d.ts +161 -0
- package/dist/compatibility/registry.d.ts.map +1 -0
- package/dist/compatibility/registry.js +389 -0
- package/dist/compatibility/registry.js.map +1 -0
- package/dist/compatibility/types.d.ts +249 -0
- package/dist/compatibility/types.d.ts.map +1 -0
- package/dist/compatibility/types.js +8 -0
- package/dist/compatibility/types.js.map +1 -0
- package/dist/features/rate-limit-wait/daemon.d.ts.map +1 -1
- package/dist/features/rate-limit-wait/daemon.js +3 -0
- package/dist/features/rate-limit-wait/daemon.js.map +1 -1
- package/dist/hooks/autopilot/prompts.d.ts.map +1 -1
- package/dist/hooks/autopilot/prompts.js +17 -3
- package/dist/hooks/autopilot/prompts.js.map +1 -1
- package/dist/hooks/github-auto-responder/classifier.d.ts +43 -0
- package/dist/hooks/github-auto-responder/classifier.d.ts.map +1 -0
- package/dist/hooks/github-auto-responder/classifier.js +150 -0
- package/dist/hooks/github-auto-responder/classifier.js.map +1 -0
- package/dist/hooks/github-auto-responder/config.d.ts +109 -0
- package/dist/hooks/github-auto-responder/config.d.ts.map +1 -0
- package/dist/hooks/github-auto-responder/config.js +69 -0
- package/dist/hooks/github-auto-responder/config.js.map +1 -0
- package/dist/hooks/github-auto-responder/constants.d.ts +45 -0
- package/dist/hooks/github-auto-responder/constants.d.ts.map +1 -0
- package/dist/hooks/github-auto-responder/constants.js +60 -0
- package/dist/hooks/github-auto-responder/constants.js.map +1 -0
- package/dist/hooks/github-auto-responder/filters.d.ts +95 -0
- package/dist/hooks/github-auto-responder/filters.d.ts.map +1 -0
- package/dist/hooks/github-auto-responder/filters.js +174 -0
- package/dist/hooks/github-auto-responder/filters.js.map +1 -0
- package/dist/hooks/github-auto-responder/github-client.d.ts +65 -0
- package/dist/hooks/github-auto-responder/github-client.d.ts.map +1 -0
- package/dist/hooks/github-auto-responder/github-client.js +128 -0
- package/dist/hooks/github-auto-responder/github-client.js.map +1 -0
- package/dist/hooks/github-auto-responder/idempotency.d.ts +68 -0
- package/dist/hooks/github-auto-responder/idempotency.d.ts.map +1 -0
- package/dist/hooks/github-auto-responder/idempotency.js +147 -0
- package/dist/hooks/github-auto-responder/idempotency.js.map +1 -0
- package/dist/hooks/github-auto-responder/index.d.ts +140 -0
- package/dist/hooks/github-auto-responder/index.d.ts.map +1 -0
- package/dist/hooks/github-auto-responder/index.js +145 -0
- package/dist/hooks/github-auto-responder/index.js.map +1 -0
- package/dist/hooks/github-auto-responder/persona.d.ts +40 -0
- package/dist/hooks/github-auto-responder/persona.d.ts.map +1 -0
- package/dist/hooks/github-auto-responder/persona.js +99 -0
- package/dist/hooks/github-auto-responder/persona.js.map +1 -0
- package/dist/hooks/github-auto-responder/responder.d.ts +122 -0
- package/dist/hooks/github-auto-responder/responder.d.ts.map +1 -0
- package/dist/hooks/github-auto-responder/responder.js +264 -0
- package/dist/hooks/github-auto-responder/responder.js.map +1 -0
- package/dist/hooks/github-auto-responder/server.d.ts +140 -0
- package/dist/hooks/github-auto-responder/server.d.ts.map +1 -0
- package/dist/hooks/github-auto-responder/server.js +301 -0
- package/dist/hooks/github-auto-responder/server.js.map +1 -0
- package/dist/hooks/github-auto-responder/signature.d.ts +34 -0
- package/dist/hooks/github-auto-responder/signature.d.ts.map +1 -0
- package/dist/hooks/github-auto-responder/signature.js +79 -0
- package/dist/hooks/github-auto-responder/signature.js.map +1 -0
- package/dist/hooks/github-auto-responder/templates.d.ts +16 -0
- package/dist/hooks/github-auto-responder/templates.d.ts.map +1 -0
- package/dist/hooks/github-auto-responder/templates.js +93 -0
- package/dist/hooks/github-auto-responder/templates.js.map +1 -0
- package/dist/hooks/github-auto-responder/types.d.ts +246 -0
- package/dist/hooks/github-auto-responder/types.d.ts.map +1 -0
- package/dist/hooks/github-auto-responder/types.js +7 -0
- package/dist/hooks/github-auto-responder/types.js.map +1 -0
- package/dist/hud/analytics-display.d.ts +1 -1
- package/dist/hud/analytics-display.d.ts.map +1 -1
- package/dist/hud/analytics-display.js +24 -7
- package/dist/hud/analytics-display.js.map +1 -1
- package/dist/installer/index.d.ts +1 -1
- package/dist/installer/index.js +1 -1
- package/docs/COMPATIBILITY.md +1051 -0
- package/package.json +3 -1
- 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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"}
|