musubi-sdd 5.1.0 → 5.6.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.
- package/README.ja.md +106 -48
- package/README.md +110 -32
- package/bin/musubi-analyze.js +74 -67
- package/bin/musubi-browser.js +27 -26
- package/bin/musubi-change.js +48 -47
- package/bin/musubi-checkpoint.js +10 -7
- package/bin/musubi-convert.js +25 -25
- package/bin/musubi-costs.js +27 -10
- package/bin/musubi-gui.js +52 -46
- package/bin/musubi-init.js +1952 -10
- package/bin/musubi-orchestrate.js +327 -239
- package/bin/musubi-remember.js +69 -56
- package/bin/musubi-resolve.js +53 -45
- package/bin/musubi-trace.js +51 -22
- package/bin/musubi-validate.js +39 -30
- package/bin/musubi-workflow.js +33 -34
- package/bin/musubi.js +39 -2
- package/package.json +1 -1
- package/src/agents/agent-loop.js +94 -95
- package/src/agents/agentic/code-generator.js +119 -109
- package/src/agents/agentic/code-reviewer.js +105 -108
- package/src/agents/agentic/index.js +4 -4
- package/src/agents/browser/action-executor.js +13 -13
- package/src/agents/browser/ai-comparator.js +11 -10
- package/src/agents/browser/context-manager.js +6 -6
- package/src/agents/browser/index.js +5 -5
- package/src/agents/browser/nl-parser.js +31 -46
- package/src/agents/browser/screenshot.js +2 -2
- package/src/agents/browser/test-generator.js +6 -4
- package/src/agents/function-tool.js +71 -65
- package/src/agents/index.js +7 -7
- package/src/agents/schema-generator.js +98 -94
- package/src/analyzers/ast-extractor.js +158 -146
- package/src/analyzers/codegraph-auto-update.js +858 -0
- package/src/analyzers/complexity-analyzer.js +536 -0
- package/src/analyzers/context-optimizer.js +241 -126
- package/src/analyzers/impact-analyzer.js +1 -1
- package/src/analyzers/large-project-analyzer.js +766 -0
- package/src/analyzers/repository-map.js +77 -81
- package/src/analyzers/security-analyzer.js +19 -11
- package/src/analyzers/stuck-detector.js +19 -17
- package/src/converters/index.js +78 -57
- package/src/converters/ir/types.js +12 -12
- package/src/converters/parsers/musubi-parser.js +134 -126
- package/src/converters/parsers/openapi-parser.js +70 -53
- package/src/converters/parsers/speckit-parser.js +239 -175
- package/src/converters/writers/musubi-writer.js +123 -118
- package/src/converters/writers/speckit-writer.js +124 -113
- package/src/generators/rust-migration-generator.js +512 -0
- package/src/gui/public/index.html +1365 -1211
- package/src/gui/server.js +41 -40
- package/src/gui/services/file-watcher.js +23 -8
- package/src/gui/services/project-scanner.js +26 -20
- package/src/gui/services/replanning-service.js +27 -23
- package/src/gui/services/traceability-service.js +8 -8
- package/src/gui/services/workflow-service.js +14 -7
- package/src/index.js +151 -0
- package/src/integrations/cicd.js +90 -104
- package/src/integrations/codegraph-mcp.js +643 -0
- package/src/integrations/documentation.js +142 -103
- package/src/integrations/examples.js +95 -80
- package/src/integrations/github-client.js +17 -17
- package/src/integrations/index.js +5 -5
- package/src/integrations/mcp/index.js +21 -21
- package/src/integrations/mcp/mcp-context-provider.js +76 -78
- package/src/integrations/mcp/mcp-discovery.js +74 -72
- package/src/integrations/mcp/mcp-tool-registry.js +99 -94
- package/src/integrations/mcp-connector.js +70 -66
- package/src/integrations/platforms.js +50 -49
- package/src/integrations/tool-discovery.js +37 -31
- package/src/llm-providers/anthropic-provider.js +11 -11
- package/src/llm-providers/base-provider.js +16 -18
- package/src/llm-providers/copilot-provider.js +22 -19
- package/src/llm-providers/index.js +26 -25
- package/src/llm-providers/ollama-provider.js +11 -11
- package/src/llm-providers/openai-provider.js +12 -12
- package/src/managers/agent-memory.js +36 -24
- package/src/managers/checkpoint-manager.js +4 -8
- package/src/managers/delta-spec.js +19 -19
- package/src/managers/index.js +13 -4
- package/src/managers/memory-condenser.js +35 -45
- package/src/managers/repo-skill-manager.js +57 -31
- package/src/managers/skill-loader.js +25 -22
- package/src/managers/skill-tools.js +36 -72
- package/src/managers/workflow.js +30 -22
- package/src/monitoring/cost-tracker.js +48 -46
- package/src/monitoring/incident-manager.js +116 -106
- package/src/monitoring/index.js +144 -134
- package/src/monitoring/observability.js +75 -62
- package/src/monitoring/quality-dashboard.js +45 -41
- package/src/monitoring/release-manager.js +63 -53
- package/src/orchestration/agent-skill-binding.js +39 -47
- package/src/orchestration/error-handler.js +65 -107
- package/src/orchestration/guardrails/base-guardrail.js +26 -24
- package/src/orchestration/guardrails/guardrail-rules.js +50 -64
- package/src/orchestration/guardrails/index.js +5 -5
- package/src/orchestration/guardrails/input-guardrail.js +58 -45
- package/src/orchestration/guardrails/output-guardrail.js +104 -81
- package/src/orchestration/guardrails/safety-check.js +79 -79
- package/src/orchestration/index.js +38 -55
- package/src/orchestration/mcp-tool-adapters.js +96 -99
- package/src/orchestration/orchestration-engine.js +21 -21
- package/src/orchestration/pattern-registry.js +60 -45
- package/src/orchestration/patterns/auto.js +34 -47
- package/src/orchestration/patterns/group-chat.js +59 -65
- package/src/orchestration/patterns/handoff.js +67 -65
- package/src/orchestration/patterns/human-in-loop.js +51 -72
- package/src/orchestration/patterns/nested.js +25 -40
- package/src/orchestration/patterns/sequential.js +35 -34
- package/src/orchestration/patterns/swarm.js +63 -56
- package/src/orchestration/patterns/triage.js +150 -109
- package/src/orchestration/reasoning/index.js +9 -9
- package/src/orchestration/reasoning/planning-engine.js +143 -140
- package/src/orchestration/reasoning/reasoning-engine.js +206 -144
- package/src/orchestration/reasoning/self-correction.js +121 -128
- package/src/orchestration/replanning/adaptive-goal-modifier.js +107 -112
- package/src/orchestration/replanning/alternative-generator.js +37 -42
- package/src/orchestration/replanning/config.js +63 -59
- package/src/orchestration/replanning/goal-progress-tracker.js +98 -100
- package/src/orchestration/replanning/index.js +24 -20
- package/src/orchestration/replanning/plan-evaluator.js +49 -50
- package/src/orchestration/replanning/plan-monitor.js +32 -28
- package/src/orchestration/replanning/proactive-path-optimizer.js +175 -178
- package/src/orchestration/replanning/replan-history.js +33 -26
- package/src/orchestration/replanning/replanning-engine.js +106 -108
- package/src/orchestration/skill-executor.js +107 -109
- package/src/orchestration/skill-registry.js +85 -89
- package/src/orchestration/workflow-examples.js +228 -231
- package/src/orchestration/workflow-executor.js +65 -68
- package/src/orchestration/workflow-orchestrator.js +72 -73
- package/src/phase4-integration.js +47 -40
- package/src/phase5-integration.js +89 -30
- package/src/reporters/coverage-report.js +82 -30
- package/src/reporters/hierarchical-reporter.js +498 -0
- package/src/reporters/traceability-matrix-report.js +29 -20
- package/src/resolvers/issue-resolver.js +43 -31
- package/src/steering/advanced-validation.js +133 -124
- package/src/steering/auto-updater.js +60 -73
- package/src/steering/index.js +6 -6
- package/src/steering/quality-metrics.js +41 -35
- package/src/steering/steering-auto-update.js +83 -86
- package/src/steering/steering-validator.js +98 -106
- package/src/steering/template-constraints.js +53 -54
- package/src/templates/agents/claude-code/CLAUDE.md +32 -32
- package/src/templates/agents/claude-code/skills/agent-assistant/SKILL.md +13 -5
- package/src/templates/agents/claude-code/skills/ai-ml-engineer/mlops-guide.md +23 -23
- package/src/templates/agents/claude-code/skills/ai-ml-engineer/model-card-template.md +60 -41
- package/src/templates/agents/claude-code/skills/api-designer/api-patterns.md +27 -19
- package/src/templates/agents/claude-code/skills/api-designer/openapi-template.md +11 -7
- package/src/templates/agents/claude-code/skills/bug-hunter/SKILL.md +4 -3
- package/src/templates/agents/claude-code/skills/bug-hunter/root-cause-analysis.md +37 -15
- package/src/templates/agents/claude-code/skills/change-impact-analyzer/dependency-graph-patterns.md +36 -42
- package/src/templates/agents/claude-code/skills/change-impact-analyzer/impact-analysis-template.md +69 -60
- package/src/templates/agents/claude-code/skills/cloud-architect/aws-patterns.md +31 -38
- package/src/templates/agents/claude-code/skills/cloud-architect/azure-patterns.md +28 -23
- package/src/templates/agents/claude-code/skills/code-reviewer/SKILL.md +61 -0
- package/src/templates/agents/claude-code/skills/code-reviewer/best-practices.md +27 -0
- package/src/templates/agents/claude-code/skills/code-reviewer/review-checklist.md +29 -10
- package/src/templates/agents/claude-code/skills/code-reviewer/review-standards.md +29 -24
- package/src/templates/agents/claude-code/skills/constitution-enforcer/SKILL.md +8 -6
- package/src/templates/agents/claude-code/skills/constitution-enforcer/constitutional-articles.md +62 -26
- package/src/templates/agents/claude-code/skills/constitution-enforcer/phase-minus-one-gates.md +35 -16
- package/src/templates/agents/claude-code/skills/database-administrator/backup-recovery.md +27 -17
- package/src/templates/agents/claude-code/skills/database-administrator/tuning-guide.md +25 -20
- package/src/templates/agents/claude-code/skills/database-schema-designer/schema-patterns.md +39 -22
- package/src/templates/agents/claude-code/skills/devops-engineer/ci-cd-templates.md +25 -22
- package/src/templates/agents/claude-code/skills/issue-resolver/SKILL.md +24 -21
- package/src/templates/agents/claude-code/skills/orchestrator/SKILL.md +148 -63
- package/src/templates/agents/claude-code/skills/orchestrator/patterns.md +35 -16
- package/src/templates/agents/claude-code/skills/orchestrator/selection-matrix.md +69 -64
- package/src/templates/agents/claude-code/skills/performance-engineer/optimization-playbook.md +47 -47
- package/src/templates/agents/claude-code/skills/performance-optimizer/SKILL.md +69 -0
- package/src/templates/agents/claude-code/skills/performance-optimizer/benchmark-template.md +63 -45
- package/src/templates/agents/claude-code/skills/performance-optimizer/optimization-patterns.md +33 -35
- package/src/templates/agents/claude-code/skills/project-manager/SKILL.md +7 -6
- package/src/templates/agents/claude-code/skills/project-manager/agile-ceremonies.md +47 -28
- package/src/templates/agents/claude-code/skills/project-manager/project-templates.md +94 -78
- package/src/templates/agents/claude-code/skills/quality-assurance/SKILL.md +20 -17
- package/src/templates/agents/claude-code/skills/quality-assurance/qa-plan-template.md +63 -49
- package/src/templates/agents/claude-code/skills/release-coordinator/SKILL.md +5 -5
- package/src/templates/agents/claude-code/skills/release-coordinator/feature-flag-guide.md +30 -26
- package/src/templates/agents/claude-code/skills/release-coordinator/release-plan-template.md +67 -35
- package/src/templates/agents/claude-code/skills/requirements-analyst/ears-format.md +54 -42
- package/src/templates/agents/claude-code/skills/requirements-analyst/validation-rules.md +36 -33
- package/src/templates/agents/claude-code/skills/security-auditor/SKILL.md +77 -19
- package/src/templates/agents/claude-code/skills/security-auditor/audit-checklists.md +24 -24
- package/src/templates/agents/claude-code/skills/security-auditor/owasp-top-10.md +61 -20
- package/src/templates/agents/claude-code/skills/security-auditor/vulnerability-patterns.md +43 -11
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/SKILL.md +1 -0
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/incident-response-template.md +55 -25
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/observability-patterns.md +78 -68
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/slo-sli-guide.md +73 -53
- package/src/templates/agents/claude-code/skills/software-developer/solid-principles.md +83 -37
- package/src/templates/agents/claude-code/skills/software-developer/test-first-workflow.md +38 -31
- package/src/templates/agents/claude-code/skills/steering/SKILL.md +1 -0
- package/src/templates/agents/claude-code/skills/steering/auto-update-rules.md +31 -0
- package/src/templates/agents/claude-code/skills/system-architect/adr-template.md +25 -7
- package/src/templates/agents/claude-code/skills/system-architect/c4-model-guide.md +74 -61
- package/src/templates/agents/claude-code/skills/technical-writer/doc-templates/documentation-templates.md +70 -52
- package/src/templates/agents/claude-code/skills/test-engineer/SKILL.md +2 -0
- package/src/templates/agents/claude-code/skills/test-engineer/ears-test-mapping.md +75 -71
- package/src/templates/agents/claude-code/skills/test-engineer/test-types.md +85 -63
- package/src/templates/agents/claude-code/skills/traceability-auditor/coverage-matrix-template.md +39 -36
- package/src/templates/agents/claude-code/skills/traceability-auditor/gap-detection-rules.md +22 -17
- package/src/templates/agents/claude-code/skills/ui-ux-designer/SKILL.md +1 -0
- package/src/templates/agents/claude-code/skills/ui-ux-designer/accessibility-guidelines.md +49 -75
- package/src/templates/agents/claude-code/skills/ui-ux-designer/design-system-components.md +71 -59
- package/src/templates/agents/codex/AGENTS.md +74 -42
- package/src/templates/agents/cursor/AGENTS.md +74 -42
- package/src/templates/agents/gemini-cli/GEMINI.md +74 -42
- package/src/templates/agents/github-copilot/AGENTS.md +83 -51
- package/src/templates/agents/qwen-code/QWEN.md +74 -42
- package/src/templates/agents/windsurf/AGENTS.md +74 -42
- package/src/templates/architectures/README.md +41 -0
- package/src/templates/architectures/clean-architecture/README.md +113 -0
- package/src/templates/architectures/event-driven/README.md +162 -0
- package/src/templates/architectures/hexagonal/README.md +130 -0
- package/src/templates/index.js +6 -1
- package/src/templates/locale-manager.js +16 -16
- package/src/templates/shared/delta-spec-template.md +20 -13
- package/src/templates/shared/github-actions/musubi-issue-resolver.yml +5 -5
- package/src/templates/shared/github-actions/musubi-security-check.yml +3 -3
- package/src/templates/shared/github-actions/musubi-validate.yml +4 -4
- package/src/templates/shared/steering/structure.md +95 -0
- package/src/templates/skills/browser-agent.md +21 -16
- package/src/templates/skills/web-gui.md +8 -0
- package/src/templates/template-constraints.js +50 -53
- package/src/validators/advanced-validation.js +30 -36
- package/src/validators/constitutional-validator.js +77 -73
- package/src/validators/critic-system.js +49 -59
- package/src/validators/delta-format.js +59 -55
- package/src/validators/traceability-validator.js +7 -11
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* MUSUBI MCP Server Discovery
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Discovers and manages MCP servers from various configuration sources:
|
|
5
5
|
* - claude_desktop_config.json
|
|
6
6
|
* - .mcp/config.json (project-level)
|
|
7
7
|
* - Environment variables
|
|
8
8
|
* - Dynamic discovery via well-known paths
|
|
9
|
-
*
|
|
9
|
+
*
|
|
10
10
|
* @module integrations/mcp/mcp-discovery
|
|
11
11
|
*/
|
|
12
12
|
|
|
@@ -42,18 +42,20 @@ const EventEmitter = require('events');
|
|
|
42
42
|
const CONFIG_LOCATIONS = {
|
|
43
43
|
// Claude Desktop config
|
|
44
44
|
claudeDesktop: {
|
|
45
|
-
darwin: path.join(
|
|
45
|
+
darwin: path.join(
|
|
46
|
+
os.homedir(),
|
|
47
|
+
'Library',
|
|
48
|
+
'Application Support',
|
|
49
|
+
'Claude',
|
|
50
|
+
'claude_desktop_config.json'
|
|
51
|
+
),
|
|
46
52
|
win32: path.join(os.homedir(), 'AppData', 'Roaming', 'Claude', 'claude_desktop_config.json'),
|
|
47
|
-
linux: path.join(os.homedir(), '.config', 'claude', 'claude_desktop_config.json')
|
|
53
|
+
linux: path.join(os.homedir(), '.config', 'claude', 'claude_desktop_config.json'),
|
|
48
54
|
},
|
|
49
55
|
// Project-level config
|
|
50
|
-
project: [
|
|
51
|
-
'.mcp/config.json',
|
|
52
|
-
'.mcp.json',
|
|
53
|
-
'mcp.config.json'
|
|
54
|
-
],
|
|
56
|
+
project: ['.mcp/config.json', '.mcp.json', 'mcp.config.json'],
|
|
55
57
|
// VS Code settings
|
|
56
|
-
vscode: '.vscode/mcp.json'
|
|
58
|
+
vscode: '.vscode/mcp.json',
|
|
57
59
|
};
|
|
58
60
|
|
|
59
61
|
/**
|
|
@@ -69,22 +71,22 @@ class MCPDiscovery extends EventEmitter {
|
|
|
69
71
|
*/
|
|
70
72
|
constructor(options = {}) {
|
|
71
73
|
super();
|
|
72
|
-
|
|
74
|
+
|
|
73
75
|
this.projectRoot = options.projectRoot || process.cwd();
|
|
74
76
|
this.includeGlobal = options.includeGlobal ?? true;
|
|
75
77
|
this.includeProject = options.includeProject ?? true;
|
|
76
78
|
this.includeEnv = options.includeEnv ?? true;
|
|
77
|
-
|
|
79
|
+
|
|
78
80
|
/** @type {Map<string, MCPServerConfig>} */
|
|
79
81
|
this.servers = new Map();
|
|
80
|
-
|
|
82
|
+
|
|
81
83
|
/** @type {string[]} */
|
|
82
84
|
this.discoveredSources = [];
|
|
83
|
-
|
|
85
|
+
|
|
84
86
|
/** @type {Object<string, Error>} */
|
|
85
87
|
this.errors = {};
|
|
86
88
|
}
|
|
87
|
-
|
|
89
|
+
|
|
88
90
|
/**
|
|
89
91
|
* Discover all available MCP servers
|
|
90
92
|
* @returns {Promise<DiscoveryResult>}
|
|
@@ -93,38 +95,38 @@ class MCPDiscovery extends EventEmitter {
|
|
|
93
95
|
this.servers.clear();
|
|
94
96
|
this.discoveredSources = [];
|
|
95
97
|
this.errors = {};
|
|
96
|
-
|
|
98
|
+
|
|
97
99
|
const promises = [];
|
|
98
|
-
|
|
100
|
+
|
|
99
101
|
// Global configs (Claude Desktop, etc.)
|
|
100
102
|
if (this.includeGlobal) {
|
|
101
103
|
promises.push(this.discoverGlobalConfigs());
|
|
102
104
|
}
|
|
103
|
-
|
|
105
|
+
|
|
104
106
|
// Project-level configs
|
|
105
107
|
if (this.includeProject) {
|
|
106
108
|
promises.push(this.discoverProjectConfigs());
|
|
107
109
|
}
|
|
108
|
-
|
|
110
|
+
|
|
109
111
|
// Environment variable configs
|
|
110
112
|
if (this.includeEnv) {
|
|
111
113
|
promises.push(this.discoverEnvConfigs());
|
|
112
114
|
}
|
|
113
|
-
|
|
115
|
+
|
|
114
116
|
await Promise.all(promises);
|
|
115
|
-
|
|
117
|
+
|
|
116
118
|
this.emit('discovery:complete', {
|
|
117
119
|
serverCount: this.servers.size,
|
|
118
|
-
sources: this.discoveredSources
|
|
120
|
+
sources: this.discoveredSources,
|
|
119
121
|
});
|
|
120
|
-
|
|
122
|
+
|
|
121
123
|
return {
|
|
122
124
|
servers: Array.from(this.servers.values()),
|
|
123
125
|
sources: this.discoveredSources,
|
|
124
|
-
errors: this.errors
|
|
126
|
+
errors: this.errors,
|
|
125
127
|
};
|
|
126
128
|
}
|
|
127
|
-
|
|
129
|
+
|
|
128
130
|
/**
|
|
129
131
|
* Discover global configuration files
|
|
130
132
|
*/
|
|
@@ -132,12 +134,12 @@ class MCPDiscovery extends EventEmitter {
|
|
|
132
134
|
// Claude Desktop config
|
|
133
135
|
const platform = process.platform;
|
|
134
136
|
const claudeConfigPath = CONFIG_LOCATIONS.claudeDesktop[platform];
|
|
135
|
-
|
|
137
|
+
|
|
136
138
|
if (claudeConfigPath) {
|
|
137
139
|
await this.loadConfigFile(claudeConfigPath, 'claude-desktop');
|
|
138
140
|
}
|
|
139
141
|
}
|
|
140
|
-
|
|
142
|
+
|
|
141
143
|
/**
|
|
142
144
|
* Discover project-level configuration files
|
|
143
145
|
*/
|
|
@@ -146,12 +148,12 @@ class MCPDiscovery extends EventEmitter {
|
|
|
146
148
|
const fullPath = path.join(this.projectRoot, configPath);
|
|
147
149
|
await this.loadConfigFile(fullPath, `project:${configPath}`);
|
|
148
150
|
}
|
|
149
|
-
|
|
151
|
+
|
|
150
152
|
// VS Code config
|
|
151
153
|
const vscodePath = path.join(this.projectRoot, CONFIG_LOCATIONS.vscode);
|
|
152
154
|
await this.loadConfigFile(vscodePath, 'vscode');
|
|
153
155
|
}
|
|
154
|
-
|
|
156
|
+
|
|
155
157
|
/**
|
|
156
158
|
* Discover servers from environment variables
|
|
157
159
|
*/
|
|
@@ -170,7 +172,7 @@ class MCPDiscovery extends EventEmitter {
|
|
|
170
172
|
this.errors['env:MCP_SERVERS'] = error;
|
|
171
173
|
}
|
|
172
174
|
}
|
|
173
|
-
|
|
175
|
+
|
|
174
176
|
// Individual MCP_SERVER_* environment variables
|
|
175
177
|
for (const [key, value] of Object.entries(process.env)) {
|
|
176
178
|
if (key.startsWith('MCP_SERVER_') && key !== 'MCP_SERVERS') {
|
|
@@ -184,7 +186,7 @@ class MCPDiscovery extends EventEmitter {
|
|
|
184
186
|
}
|
|
185
187
|
}
|
|
186
188
|
}
|
|
187
|
-
|
|
189
|
+
|
|
188
190
|
/**
|
|
189
191
|
* Load configuration from a file
|
|
190
192
|
* @param {string} filePath - Path to config file
|
|
@@ -195,10 +197,10 @@ class MCPDiscovery extends EventEmitter {
|
|
|
195
197
|
if (!fs.existsSync(filePath)) {
|
|
196
198
|
return;
|
|
197
199
|
}
|
|
198
|
-
|
|
200
|
+
|
|
199
201
|
const content = fs.readFileSync(filePath, 'utf-8');
|
|
200
202
|
const config = JSON.parse(content);
|
|
201
|
-
|
|
203
|
+
|
|
202
204
|
// Handle different config formats
|
|
203
205
|
if (config.mcpServers) {
|
|
204
206
|
// Claude Desktop format
|
|
@@ -216,16 +218,15 @@ class MCPDiscovery extends EventEmitter {
|
|
|
216
218
|
this.addServer(server, source);
|
|
217
219
|
}
|
|
218
220
|
}
|
|
219
|
-
|
|
221
|
+
|
|
220
222
|
this.discoveredSources.push(source);
|
|
221
223
|
this.emit('config:loaded', { source, path: filePath });
|
|
222
|
-
|
|
223
224
|
} catch (error) {
|
|
224
225
|
this.errors[source] = error;
|
|
225
226
|
this.emit('config:error', { source, error });
|
|
226
227
|
}
|
|
227
228
|
}
|
|
228
|
-
|
|
229
|
+
|
|
229
230
|
/**
|
|
230
231
|
* Add a server to the registry
|
|
231
232
|
* @param {MCPServerConfig} serverConfig
|
|
@@ -235,7 +236,7 @@ class MCPDiscovery extends EventEmitter {
|
|
|
235
236
|
if (!serverConfig.name) {
|
|
236
237
|
return;
|
|
237
238
|
}
|
|
238
|
-
|
|
239
|
+
|
|
239
240
|
const existing = this.servers.get(serverConfig.name);
|
|
240
241
|
if (existing) {
|
|
241
242
|
// Merge configurations, later sources override
|
|
@@ -245,22 +246,22 @@ class MCPDiscovery extends EventEmitter {
|
|
|
245
246
|
metadata: {
|
|
246
247
|
...existing.metadata,
|
|
247
248
|
...serverConfig.metadata,
|
|
248
|
-
sources: [...(existing.metadata?.sources || []), source]
|
|
249
|
-
}
|
|
249
|
+
sources: [...(existing.metadata?.sources || []), source],
|
|
250
|
+
},
|
|
250
251
|
});
|
|
251
252
|
} else {
|
|
252
253
|
this.servers.set(serverConfig.name, {
|
|
253
254
|
...serverConfig,
|
|
254
255
|
metadata: {
|
|
255
256
|
...serverConfig.metadata,
|
|
256
|
-
sources: [source]
|
|
257
|
-
}
|
|
257
|
+
sources: [source],
|
|
258
|
+
},
|
|
258
259
|
});
|
|
259
260
|
}
|
|
260
|
-
|
|
261
|
+
|
|
261
262
|
this.emit('server:discovered', { name: serverConfig.name, source });
|
|
262
263
|
}
|
|
263
|
-
|
|
264
|
+
|
|
264
265
|
/**
|
|
265
266
|
* Get a server by name
|
|
266
267
|
* @param {string} name
|
|
@@ -269,7 +270,7 @@ class MCPDiscovery extends EventEmitter {
|
|
|
269
270
|
getServer(name) {
|
|
270
271
|
return this.servers.get(name);
|
|
271
272
|
}
|
|
272
|
-
|
|
273
|
+
|
|
273
274
|
/**
|
|
274
275
|
* Get all servers
|
|
275
276
|
* @returns {MCPServerConfig[]}
|
|
@@ -277,18 +278,16 @@ class MCPDiscovery extends EventEmitter {
|
|
|
277
278
|
getAllServers() {
|
|
278
279
|
return Array.from(this.servers.values());
|
|
279
280
|
}
|
|
280
|
-
|
|
281
|
+
|
|
281
282
|
/**
|
|
282
283
|
* Get servers by transport type
|
|
283
284
|
* @param {string} transport
|
|
284
285
|
* @returns {MCPServerConfig[]}
|
|
285
286
|
*/
|
|
286
287
|
getServersByTransport(transport) {
|
|
287
|
-
return this.getAllServers().filter(s =>
|
|
288
|
-
(s.transport || 'stdio') === transport
|
|
289
|
-
);
|
|
288
|
+
return this.getAllServers().filter(s => (s.transport || 'stdio') === transport);
|
|
290
289
|
}
|
|
291
|
-
|
|
290
|
+
|
|
292
291
|
/**
|
|
293
292
|
* Filter servers by criteria
|
|
294
293
|
* @param {Function} predicate
|
|
@@ -297,7 +296,7 @@ class MCPDiscovery extends EventEmitter {
|
|
|
297
296
|
filterServers(predicate) {
|
|
298
297
|
return this.getAllServers().filter(predicate);
|
|
299
298
|
}
|
|
300
|
-
|
|
299
|
+
|
|
301
300
|
/**
|
|
302
301
|
* Check if a server exists
|
|
303
302
|
* @param {string} name
|
|
@@ -306,7 +305,7 @@ class MCPDiscovery extends EventEmitter {
|
|
|
306
305
|
hasServer(name) {
|
|
307
306
|
return this.servers.has(name);
|
|
308
307
|
}
|
|
309
|
-
|
|
308
|
+
|
|
310
309
|
/**
|
|
311
310
|
* Get server count
|
|
312
311
|
* @returns {number}
|
|
@@ -314,7 +313,7 @@ class MCPDiscovery extends EventEmitter {
|
|
|
314
313
|
get serverCount() {
|
|
315
314
|
return this.servers.size;
|
|
316
315
|
}
|
|
317
|
-
|
|
316
|
+
|
|
318
317
|
/**
|
|
319
318
|
* Create a project configuration file
|
|
320
319
|
* @param {MCPServerConfig[]} servers - Servers to include
|
|
@@ -326,24 +325,27 @@ class MCPDiscovery extends EventEmitter {
|
|
|
326
325
|
async createProjectConfig(servers, options = {}) {
|
|
327
326
|
const format = options.format || 'mcp';
|
|
328
327
|
const configPath = options.path || path.join(this.projectRoot, '.mcp', 'config.json');
|
|
329
|
-
|
|
328
|
+
|
|
330
329
|
// Ensure directory exists
|
|
331
330
|
const dir = path.dirname(configPath);
|
|
332
331
|
if (!fs.existsSync(dir)) {
|
|
333
332
|
fs.mkdirSync(dir, { recursive: true });
|
|
334
333
|
}
|
|
335
|
-
|
|
334
|
+
|
|
336
335
|
let config;
|
|
337
336
|
if (format === 'claude') {
|
|
338
337
|
// Claude Desktop format
|
|
339
338
|
config = {
|
|
340
339
|
mcpServers: Object.fromEntries(
|
|
341
|
-
servers.map(s => [
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
340
|
+
servers.map(s => [
|
|
341
|
+
s.name,
|
|
342
|
+
{
|
|
343
|
+
command: s.command,
|
|
344
|
+
args: s.args,
|
|
345
|
+
env: s.env,
|
|
346
|
+
},
|
|
347
|
+
])
|
|
348
|
+
),
|
|
347
349
|
};
|
|
348
350
|
} else {
|
|
349
351
|
// MUSUBI MCP format
|
|
@@ -355,17 +357,17 @@ class MCPDiscovery extends EventEmitter {
|
|
|
355
357
|
args: s.args,
|
|
356
358
|
env: s.env,
|
|
357
359
|
transport: s.transport || 'stdio',
|
|
358
|
-
metadata: s.metadata
|
|
359
|
-
}))
|
|
360
|
+
metadata: s.metadata,
|
|
361
|
+
})),
|
|
360
362
|
};
|
|
361
363
|
}
|
|
362
|
-
|
|
364
|
+
|
|
363
365
|
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
364
366
|
this.emit('config:created', { path: configPath });
|
|
365
|
-
|
|
367
|
+
|
|
366
368
|
return configPath;
|
|
367
369
|
}
|
|
368
|
-
|
|
370
|
+
|
|
369
371
|
/**
|
|
370
372
|
* Watch for configuration changes
|
|
371
373
|
* @param {Function} callback
|
|
@@ -373,12 +375,12 @@ class MCPDiscovery extends EventEmitter {
|
|
|
373
375
|
*/
|
|
374
376
|
watch(callback) {
|
|
375
377
|
const watchers = [];
|
|
376
|
-
|
|
378
|
+
|
|
377
379
|
// Watch project configs
|
|
378
380
|
for (const configPath of CONFIG_LOCATIONS.project) {
|
|
379
381
|
const fullPath = path.join(this.projectRoot, configPath);
|
|
380
382
|
const dir = path.dirname(fullPath);
|
|
381
|
-
|
|
383
|
+
|
|
382
384
|
if (fs.existsSync(dir)) {
|
|
383
385
|
try {
|
|
384
386
|
const watcher = fs.watch(dir, (eventType, filename) => {
|
|
@@ -392,7 +394,7 @@ class MCPDiscovery extends EventEmitter {
|
|
|
392
394
|
}
|
|
393
395
|
}
|
|
394
396
|
}
|
|
395
|
-
|
|
397
|
+
|
|
396
398
|
// Return unwatch function
|
|
397
399
|
return () => {
|
|
398
400
|
for (const watcher of watchers) {
|
|
@@ -400,7 +402,7 @@ class MCPDiscovery extends EventEmitter {
|
|
|
400
402
|
}
|
|
401
403
|
};
|
|
402
404
|
}
|
|
403
|
-
|
|
405
|
+
|
|
404
406
|
/**
|
|
405
407
|
* Get discovery summary
|
|
406
408
|
* @returns {Object}
|
|
@@ -413,8 +415,8 @@ class MCPDiscovery extends EventEmitter {
|
|
|
413
415
|
servers: this.getAllServers().map(s => ({
|
|
414
416
|
name: s.name,
|
|
415
417
|
transport: s.transport || 'stdio',
|
|
416
|
-
sources: s.metadata?.sources || []
|
|
417
|
-
}))
|
|
418
|
+
sources: s.metadata?.sources || [],
|
|
419
|
+
})),
|
|
418
420
|
};
|
|
419
421
|
}
|
|
420
422
|
}
|
|
@@ -432,5 +434,5 @@ async function discoverMCPServers(options = {}) {
|
|
|
432
434
|
module.exports = {
|
|
433
435
|
MCPDiscovery,
|
|
434
436
|
discoverMCPServers,
|
|
435
|
-
CONFIG_LOCATIONS
|
|
437
|
+
CONFIG_LOCATIONS,
|
|
436
438
|
};
|