musubi-sdd 5.0.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 +164 -145
- package/src/analyzers/codegraph-auto-update.js +858 -0
- package/src/analyzers/complexity-analyzer.js +536 -0
- package/src/analyzers/context-optimizer.js +247 -125
- package/src/analyzers/impact-analyzer.js +1 -1
- package/src/analyzers/large-project-analyzer.js +766 -0
- package/src/analyzers/repository-map.js +83 -80
- 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 +53 -44
- package/src/monitoring/incident-manager.js +123 -103
- package/src/monitoring/index.js +144 -134
- package/src/monitoring/observability.js +82 -59
- package/src/monitoring/quality-dashboard.js +51 -39
- package/src/monitoring/release-manager.js +70 -50
- 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,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* MCP Tool Adapters - Bidirectional MCP-Skill Integration
|
|
3
3
|
* Sprint 3.3.5: MCP Tool Ecosystem
|
|
4
|
-
*
|
|
4
|
+
*
|
|
5
5
|
* Features:
|
|
6
6
|
* - MCP tool to MUSUBI skill conversion
|
|
7
7
|
* - MUSUBI skill to MCP tool export
|
|
@@ -19,7 +19,7 @@ const MCPTransport = {
|
|
|
19
19
|
STDIO: 'stdio',
|
|
20
20
|
SSE: 'sse',
|
|
21
21
|
HTTP: 'http',
|
|
22
|
-
WEBSOCKET: 'websocket'
|
|
22
|
+
WEBSOCKET: 'websocket',
|
|
23
23
|
};
|
|
24
24
|
|
|
25
25
|
/**
|
|
@@ -27,7 +27,7 @@ const MCPTransport = {
|
|
|
27
27
|
*/
|
|
28
28
|
const AdapterDirection = {
|
|
29
29
|
MCP_TO_SKILL: 'mcp-to-skill',
|
|
30
|
-
SKILL_TO_MCP: 'skill-to-mcp'
|
|
30
|
+
SKILL_TO_MCP: 'skill-to-mcp',
|
|
31
31
|
};
|
|
32
32
|
|
|
33
33
|
/**
|
|
@@ -45,18 +45,18 @@ class MCPToolDefinition {
|
|
|
45
45
|
|
|
46
46
|
validate() {
|
|
47
47
|
const errors = [];
|
|
48
|
-
|
|
48
|
+
|
|
49
49
|
if (!this.name) {
|
|
50
50
|
errors.push('Tool name is required');
|
|
51
51
|
}
|
|
52
|
-
|
|
52
|
+
|
|
53
53
|
if (!this.inputSchema || this.inputSchema.type !== 'object') {
|
|
54
54
|
errors.push('Input schema must be an object type');
|
|
55
55
|
}
|
|
56
|
-
|
|
56
|
+
|
|
57
57
|
return {
|
|
58
58
|
valid: errors.length === 0,
|
|
59
|
-
errors
|
|
59
|
+
errors,
|
|
60
60
|
};
|
|
61
61
|
}
|
|
62
62
|
}
|
|
@@ -73,14 +73,14 @@ class SchemaTranslator {
|
|
|
73
73
|
return {
|
|
74
74
|
type: 'object',
|
|
75
75
|
properties: {},
|
|
76
|
-
required: []
|
|
76
|
+
required: [],
|
|
77
77
|
};
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
const musubiSchema = {
|
|
81
81
|
type: mcpSchema.type || 'object',
|
|
82
82
|
properties: {},
|
|
83
|
-
required: mcpSchema.required || []
|
|
83
|
+
required: mcpSchema.required || [],
|
|
84
84
|
};
|
|
85
85
|
|
|
86
86
|
if (mcpSchema.properties) {
|
|
@@ -91,7 +91,7 @@ class SchemaTranslator {
|
|
|
91
91
|
|
|
92
92
|
// Add MUSUBI-specific metadata
|
|
93
93
|
musubiSchema.$schema = 'https://musubi.dev/schemas/skill-input/v1';
|
|
94
|
-
|
|
94
|
+
|
|
95
95
|
return musubiSchema;
|
|
96
96
|
}
|
|
97
97
|
|
|
@@ -102,13 +102,13 @@ class SchemaTranslator {
|
|
|
102
102
|
if (!musubiSchema) {
|
|
103
103
|
return {
|
|
104
104
|
type: 'object',
|
|
105
|
-
properties: {}
|
|
105
|
+
properties: {},
|
|
106
106
|
};
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
const mcpSchema = {
|
|
110
110
|
type: musubiSchema.type || 'object',
|
|
111
|
-
properties: {}
|
|
111
|
+
properties: {},
|
|
112
112
|
};
|
|
113
113
|
|
|
114
114
|
if (musubiSchema.required && musubiSchema.required.length > 0) {
|
|
@@ -129,7 +129,7 @@ class SchemaTranslator {
|
|
|
129
129
|
*/
|
|
130
130
|
static _translateProperty(prop) {
|
|
131
131
|
const result = {
|
|
132
|
-
type: prop.type || 'string'
|
|
132
|
+
type: prop.type || 'string',
|
|
133
133
|
};
|
|
134
134
|
|
|
135
135
|
if (prop.description) {
|
|
@@ -173,7 +173,7 @@ class SchemaTranslator {
|
|
|
173
173
|
*/
|
|
174
174
|
static _translatePropertyToMcp(prop) {
|
|
175
175
|
const result = {
|
|
176
|
-
type: prop.type || 'string'
|
|
176
|
+
type: prop.type || 'string',
|
|
177
177
|
};
|
|
178
178
|
|
|
179
179
|
if (prop.description) {
|
|
@@ -219,7 +219,7 @@ class MCPToSkillAdapter extends EventEmitter {
|
|
|
219
219
|
this.retryConfig = options.retry || {
|
|
220
220
|
maxRetries: 3,
|
|
221
221
|
baseDelay: 1000,
|
|
222
|
-
maxDelay: 10000
|
|
222
|
+
maxDelay: 10000,
|
|
223
223
|
};
|
|
224
224
|
}
|
|
225
225
|
|
|
@@ -239,7 +239,7 @@ class MCPToSkillAdapter extends EventEmitter {
|
|
|
239
239
|
transport,
|
|
240
240
|
endpoint,
|
|
241
241
|
status: 'connected',
|
|
242
|
-
registeredAt: new Date()
|
|
242
|
+
registeredAt: new Date(),
|
|
243
243
|
});
|
|
244
244
|
|
|
245
245
|
// Import tools as skills
|
|
@@ -253,9 +253,9 @@ class MCPToSkillAdapter extends EventEmitter {
|
|
|
253
253
|
}
|
|
254
254
|
}
|
|
255
255
|
|
|
256
|
-
this.emit('server-registered', {
|
|
257
|
-
serverId: id,
|
|
258
|
-
skillCount: importedSkills.length
|
|
256
|
+
this.emit('server-registered', {
|
|
257
|
+
serverId: id,
|
|
258
|
+
skillCount: importedSkills.length,
|
|
259
259
|
});
|
|
260
260
|
|
|
261
261
|
return importedSkills;
|
|
@@ -267,14 +267,14 @@ class MCPToSkillAdapter extends EventEmitter {
|
|
|
267
267
|
async importTool(serverId, mcpTool) {
|
|
268
268
|
const toolDef = new MCPToolDefinition(mcpTool);
|
|
269
269
|
const validation = toolDef.validate();
|
|
270
|
-
|
|
270
|
+
|
|
271
271
|
if (!validation.valid) {
|
|
272
272
|
throw new Error(`Invalid MCP tool: ${validation.errors.join(', ')}`);
|
|
273
273
|
}
|
|
274
274
|
|
|
275
275
|
// Generate skill ID from server and tool name
|
|
276
276
|
const skillId = `mcp.${serverId}.${mcpTool.name}`;
|
|
277
|
-
|
|
277
|
+
|
|
278
278
|
// Create skill definition
|
|
279
279
|
const skillDefinition = {
|
|
280
280
|
id: skillId,
|
|
@@ -287,8 +287,8 @@ class MCPToSkillAdapter extends EventEmitter {
|
|
|
287
287
|
type: 'object',
|
|
288
288
|
properties: {
|
|
289
289
|
content: { type: 'array' },
|
|
290
|
-
isError: { type: 'boolean' }
|
|
291
|
-
}
|
|
290
|
+
isError: { type: 'boolean' },
|
|
291
|
+
},
|
|
292
292
|
},
|
|
293
293
|
tags: ['mcp', `mcp-server:${serverId}`],
|
|
294
294
|
metadata: {
|
|
@@ -296,12 +296,12 @@ class MCPToSkillAdapter extends EventEmitter {
|
|
|
296
296
|
serverId,
|
|
297
297
|
originalName: mcpTool.name,
|
|
298
298
|
transport: toolDef.transport,
|
|
299
|
-
annotations: mcpTool.annotations || {}
|
|
299
|
+
annotations: mcpTool.annotations || {},
|
|
300
300
|
},
|
|
301
301
|
// Execution handler
|
|
302
|
-
handler: async
|
|
302
|
+
handler: async input => {
|
|
303
303
|
return this.executeMCPTool(serverId, mcpTool.name, input);
|
|
304
|
-
}
|
|
304
|
+
},
|
|
305
305
|
};
|
|
306
306
|
|
|
307
307
|
// Store adapter mapping
|
|
@@ -309,7 +309,7 @@ class MCPToSkillAdapter extends EventEmitter {
|
|
|
309
309
|
skillId,
|
|
310
310
|
serverId,
|
|
311
311
|
toolName: mcpTool.name,
|
|
312
|
-
definition: toolDef
|
|
312
|
+
definition: toolDef,
|
|
313
313
|
});
|
|
314
314
|
|
|
315
315
|
// Register with skill registry if available
|
|
@@ -327,7 +327,7 @@ class MCPToSkillAdapter extends EventEmitter {
|
|
|
327
327
|
*/
|
|
328
328
|
async executeMCPTool(serverId, toolName, input) {
|
|
329
329
|
const connection = this.connections.get(serverId);
|
|
330
|
-
|
|
330
|
+
|
|
331
331
|
if (!connection) {
|
|
332
332
|
throw new Error(`Server ${serverId} not found`);
|
|
333
333
|
}
|
|
@@ -345,24 +345,23 @@ class MCPToSkillAdapter extends EventEmitter {
|
|
|
345
345
|
method: 'tools/call',
|
|
346
346
|
params: {
|
|
347
347
|
name: toolName,
|
|
348
|
-
arguments: input
|
|
348
|
+
arguments: input,
|
|
349
349
|
},
|
|
350
|
-
id: this._generateRequestId()
|
|
350
|
+
id: this._generateRequestId(),
|
|
351
351
|
};
|
|
352
352
|
|
|
353
353
|
// Execute based on transport
|
|
354
354
|
const response = await this._sendRequest(connection, request);
|
|
355
355
|
|
|
356
356
|
const duration = Date.now() - startTime;
|
|
357
|
-
this.emit('tool-executed', {
|
|
358
|
-
serverId,
|
|
359
|
-
toolName,
|
|
357
|
+
this.emit('tool-executed', {
|
|
358
|
+
serverId,
|
|
359
|
+
toolName,
|
|
360
360
|
duration,
|
|
361
|
-
success: !response.isError
|
|
361
|
+
success: !response.isError,
|
|
362
362
|
});
|
|
363
363
|
|
|
364
364
|
return response;
|
|
365
|
-
|
|
366
365
|
} catch (error) {
|
|
367
366
|
this.emit('tool-error', { serverId, toolName, error });
|
|
368
367
|
throw error;
|
|
@@ -375,20 +374,20 @@ class MCPToSkillAdapter extends EventEmitter {
|
|
|
375
374
|
async _sendRequest(connection, request) {
|
|
376
375
|
// Note: This is a simplified implementation
|
|
377
376
|
// Real implementation would handle actual transport protocols
|
|
378
|
-
|
|
377
|
+
|
|
379
378
|
switch (connection.transport) {
|
|
380
379
|
case MCPTransport.STDIO:
|
|
381
380
|
return this._sendStdioRequest(connection, request);
|
|
382
|
-
|
|
381
|
+
|
|
383
382
|
case MCPTransport.HTTP:
|
|
384
383
|
return this._sendHttpRequest(connection, request);
|
|
385
|
-
|
|
384
|
+
|
|
386
385
|
case MCPTransport.SSE:
|
|
387
386
|
return this._sendSseRequest(connection, request);
|
|
388
|
-
|
|
387
|
+
|
|
389
388
|
case MCPTransport.WEBSOCKET:
|
|
390
389
|
return this._sendWebSocketRequest(connection, request);
|
|
391
|
-
|
|
390
|
+
|
|
392
391
|
default:
|
|
393
392
|
throw new Error(`Unsupported transport: ${connection.transport}`);
|
|
394
393
|
}
|
|
@@ -397,7 +396,7 @@ class MCPToSkillAdapter extends EventEmitter {
|
|
|
397
396
|
/**
|
|
398
397
|
* Stdio transport (placeholder)
|
|
399
398
|
*/
|
|
400
|
-
async _sendStdioRequest(
|
|
399
|
+
async _sendStdioRequest(_connection, _request) {
|
|
401
400
|
// Placeholder for stdio transport implementation
|
|
402
401
|
// In real implementation, this would:
|
|
403
402
|
// 1. Spawn child process
|
|
@@ -405,40 +404,40 @@ class MCPToSkillAdapter extends EventEmitter {
|
|
|
405
404
|
// 3. Read response from stdout
|
|
406
405
|
return {
|
|
407
406
|
content: [{ type: 'text', text: 'Stdio transport result' }],
|
|
408
|
-
isError: false
|
|
407
|
+
isError: false,
|
|
409
408
|
};
|
|
410
409
|
}
|
|
411
410
|
|
|
412
411
|
/**
|
|
413
412
|
* HTTP transport (placeholder)
|
|
414
413
|
*/
|
|
415
|
-
async _sendHttpRequest(
|
|
414
|
+
async _sendHttpRequest(_connection, _request) {
|
|
416
415
|
// Placeholder for HTTP transport implementation
|
|
417
416
|
return {
|
|
418
417
|
content: [{ type: 'text', text: 'HTTP transport result' }],
|
|
419
|
-
isError: false
|
|
418
|
+
isError: false,
|
|
420
419
|
};
|
|
421
420
|
}
|
|
422
421
|
|
|
423
422
|
/**
|
|
424
423
|
* SSE transport (placeholder)
|
|
425
424
|
*/
|
|
426
|
-
async _sendSseRequest(
|
|
425
|
+
async _sendSseRequest(_connection, _request) {
|
|
427
426
|
// Placeholder for SSE transport implementation
|
|
428
427
|
return {
|
|
429
428
|
content: [{ type: 'text', text: 'SSE transport result' }],
|
|
430
|
-
isError: false
|
|
429
|
+
isError: false,
|
|
431
430
|
};
|
|
432
431
|
}
|
|
433
432
|
|
|
434
433
|
/**
|
|
435
434
|
* WebSocket transport (placeholder)
|
|
436
435
|
*/
|
|
437
|
-
async _sendWebSocketRequest(
|
|
436
|
+
async _sendWebSocketRequest(_connection, _request) {
|
|
438
437
|
// Placeholder for WebSocket transport implementation
|
|
439
438
|
return {
|
|
440
439
|
content: [{ type: 'text', text: 'WebSocket transport result' }],
|
|
441
|
-
isError: false
|
|
440
|
+
isError: false,
|
|
442
441
|
};
|
|
443
442
|
}
|
|
444
443
|
|
|
@@ -454,7 +453,7 @@ class MCPToSkillAdapter extends EventEmitter {
|
|
|
454
453
|
*/
|
|
455
454
|
async disconnectServer(serverId) {
|
|
456
455
|
const connection = this.connections.get(serverId);
|
|
457
|
-
|
|
456
|
+
|
|
458
457
|
if (!connection) {
|
|
459
458
|
return false;
|
|
460
459
|
}
|
|
@@ -480,8 +479,8 @@ class MCPToSkillAdapter extends EventEmitter {
|
|
|
480
479
|
*/
|
|
481
480
|
getServerSkills(serverId) {
|
|
482
481
|
const skills = [];
|
|
483
|
-
|
|
484
|
-
for (const [
|
|
482
|
+
|
|
483
|
+
for (const [_skillId, adapter] of this.adapters) {
|
|
485
484
|
if (adapter.serverId === serverId) {
|
|
486
485
|
skills.push(adapter);
|
|
487
486
|
}
|
|
@@ -495,13 +494,13 @@ class MCPToSkillAdapter extends EventEmitter {
|
|
|
495
494
|
*/
|
|
496
495
|
getConnectionStatus() {
|
|
497
496
|
const status = {};
|
|
498
|
-
|
|
497
|
+
|
|
499
498
|
for (const [id, conn] of this.connections) {
|
|
500
499
|
status[id] = {
|
|
501
500
|
status: conn.status,
|
|
502
501
|
transport: conn.transport,
|
|
503
502
|
skillCount: this.getServerSkills(id).length,
|
|
504
|
-
registeredAt: conn.registeredAt
|
|
503
|
+
registeredAt: conn.registeredAt,
|
|
505
504
|
};
|
|
506
505
|
}
|
|
507
506
|
|
|
@@ -522,7 +521,7 @@ class SkillToMCPAdapter extends EventEmitter {
|
|
|
522
521
|
this.serverInfo = {
|
|
523
522
|
name: options.serverName || 'musubi-mcp-server',
|
|
524
523
|
version: options.version || '1.0.0',
|
|
525
|
-
protocolVersion: '2024-11-05'
|
|
524
|
+
protocolVersion: '2024-11-05',
|
|
526
525
|
};
|
|
527
526
|
}
|
|
528
527
|
|
|
@@ -547,8 +546,8 @@ class SkillToMCPAdapter extends EventEmitter {
|
|
|
547
546
|
musubiSkillId: skillId,
|
|
548
547
|
category: skill.category,
|
|
549
548
|
version: skill.version,
|
|
550
|
-
tags: skill.tags
|
|
551
|
-
}
|
|
549
|
+
tags: skill.tags,
|
|
550
|
+
},
|
|
552
551
|
};
|
|
553
552
|
|
|
554
553
|
this.exportedTools.set(skillId, mcpTool);
|
|
@@ -562,7 +561,7 @@ class SkillToMCPAdapter extends EventEmitter {
|
|
|
562
561
|
*/
|
|
563
562
|
exportSkills(skillIds) {
|
|
564
563
|
const tools = [];
|
|
565
|
-
|
|
564
|
+
|
|
566
565
|
for (const skillId of skillIds) {
|
|
567
566
|
try {
|
|
568
567
|
tools.push(this.exportSkill(skillId));
|
|
@@ -591,8 +590,8 @@ class SkillToMCPAdapter extends EventEmitter {
|
|
|
591
590
|
*/
|
|
592
591
|
handleListTools() {
|
|
593
592
|
const tools = [];
|
|
594
|
-
|
|
595
|
-
for (const [
|
|
593
|
+
|
|
594
|
+
for (const [_skillId, tool] of this.exportedTools) {
|
|
596
595
|
tools.push(tool);
|
|
597
596
|
}
|
|
598
597
|
|
|
@@ -604,7 +603,7 @@ class SkillToMCPAdapter extends EventEmitter {
|
|
|
604
603
|
*/
|
|
605
604
|
async handleCallTool(params) {
|
|
606
605
|
const { name, arguments: args } = params;
|
|
607
|
-
|
|
606
|
+
|
|
608
607
|
// Find skill by tool name
|
|
609
608
|
let skillId = null;
|
|
610
609
|
for (const [id, tool] of this.exportedTools) {
|
|
@@ -617,7 +616,7 @@ class SkillToMCPAdapter extends EventEmitter {
|
|
|
617
616
|
if (!skillId) {
|
|
618
617
|
return {
|
|
619
618
|
content: [{ type: 'text', text: `Tool not found: ${name}` }],
|
|
620
|
-
isError: true
|
|
619
|
+
isError: true,
|
|
621
620
|
};
|
|
622
621
|
}
|
|
623
622
|
|
|
@@ -637,14 +636,13 @@ class SkillToMCPAdapter extends EventEmitter {
|
|
|
637
636
|
|
|
638
637
|
return {
|
|
639
638
|
content: [{ type: 'text', text: 'No handler available for skill' }],
|
|
640
|
-
isError: true
|
|
639
|
+
isError: true,
|
|
641
640
|
};
|
|
642
|
-
|
|
643
641
|
} catch (error) {
|
|
644
642
|
this.emit('call-error', { toolName: name, skillId, error });
|
|
645
643
|
return {
|
|
646
644
|
content: [{ type: 'text', text: error.message }],
|
|
647
|
-
isError: true
|
|
645
|
+
isError: true,
|
|
648
646
|
};
|
|
649
647
|
}
|
|
650
648
|
}
|
|
@@ -656,14 +654,14 @@ class SkillToMCPAdapter extends EventEmitter {
|
|
|
656
654
|
if (result === null || result === undefined) {
|
|
657
655
|
return {
|
|
658
656
|
content: [{ type: 'text', text: 'null' }],
|
|
659
|
-
isError: false
|
|
657
|
+
isError: false,
|
|
660
658
|
};
|
|
661
659
|
}
|
|
662
660
|
|
|
663
661
|
if (typeof result === 'string') {
|
|
664
662
|
return {
|
|
665
663
|
content: [{ type: 'text', text: result }],
|
|
666
|
-
isError: false
|
|
664
|
+
isError: false,
|
|
667
665
|
};
|
|
668
666
|
}
|
|
669
667
|
|
|
@@ -675,17 +673,19 @@ class SkillToMCPAdapter extends EventEmitter {
|
|
|
675
673
|
|
|
676
674
|
// Convert to JSON text
|
|
677
675
|
return {
|
|
678
|
-
content: [
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
676
|
+
content: [
|
|
677
|
+
{
|
|
678
|
+
type: 'text',
|
|
679
|
+
text: JSON.stringify(result, null, 2),
|
|
680
|
+
},
|
|
681
|
+
],
|
|
682
|
+
isError: false,
|
|
683
683
|
};
|
|
684
684
|
}
|
|
685
685
|
|
|
686
686
|
return {
|
|
687
687
|
content: [{ type: 'text', text: String(result) }],
|
|
688
|
-
isError: false
|
|
688
|
+
isError: false,
|
|
689
689
|
};
|
|
690
690
|
}
|
|
691
691
|
|
|
@@ -704,8 +704,8 @@ class SkillToMCPAdapter extends EventEmitter {
|
|
|
704
704
|
return {
|
|
705
705
|
...this.serverInfo,
|
|
706
706
|
capabilities: {
|
|
707
|
-
tools: { listChanged: true }
|
|
708
|
-
}
|
|
707
|
+
tools: { listChanged: true },
|
|
708
|
+
},
|
|
709
709
|
};
|
|
710
710
|
}
|
|
711
711
|
|
|
@@ -713,7 +713,7 @@ class SkillToMCPAdapter extends EventEmitter {
|
|
|
713
713
|
* Create MCP protocol handler
|
|
714
714
|
*/
|
|
715
715
|
createProtocolHandler() {
|
|
716
|
-
return async
|
|
716
|
+
return async request => {
|
|
717
717
|
const { method, params, id } = request;
|
|
718
718
|
|
|
719
719
|
switch (method) {
|
|
@@ -721,23 +721,24 @@ class SkillToMCPAdapter extends EventEmitter {
|
|
|
721
721
|
return {
|
|
722
722
|
jsonrpc: '2.0',
|
|
723
723
|
id,
|
|
724
|
-
result: this.getServerManifest()
|
|
724
|
+
result: this.getServerManifest(),
|
|
725
725
|
};
|
|
726
726
|
|
|
727
727
|
case 'tools/list':
|
|
728
728
|
return {
|
|
729
729
|
jsonrpc: '2.0',
|
|
730
730
|
id,
|
|
731
|
-
result: this.handleListTools()
|
|
731
|
+
result: this.handleListTools(),
|
|
732
732
|
};
|
|
733
733
|
|
|
734
|
-
case 'tools/call':
|
|
734
|
+
case 'tools/call': {
|
|
735
735
|
const result = await this.handleCallTool(params);
|
|
736
736
|
return {
|
|
737
737
|
jsonrpc: '2.0',
|
|
738
738
|
id,
|
|
739
|
-
result
|
|
739
|
+
result,
|
|
740
740
|
};
|
|
741
|
+
}
|
|
741
742
|
|
|
742
743
|
default:
|
|
743
744
|
return {
|
|
@@ -745,8 +746,8 @@ class SkillToMCPAdapter extends EventEmitter {
|
|
|
745
746
|
id,
|
|
746
747
|
error: {
|
|
747
748
|
code: -32601,
|
|
748
|
-
message: `Method not found: ${method}
|
|
749
|
-
}
|
|
749
|
+
message: `Method not found: ${method}`,
|
|
750
|
+
},
|
|
750
751
|
};
|
|
751
752
|
}
|
|
752
753
|
};
|
|
@@ -762,18 +763,18 @@ class MCPAdapterManager extends EventEmitter {
|
|
|
762
763
|
super();
|
|
763
764
|
this.registry = options.registry || null;
|
|
764
765
|
this.executor = options.executor || null;
|
|
765
|
-
|
|
766
|
+
|
|
766
767
|
this.importAdapter = new MCPToSkillAdapter({
|
|
767
768
|
registry: this.registry,
|
|
768
769
|
timeout: options.timeout,
|
|
769
|
-
retry: options.retry
|
|
770
|
+
retry: options.retry,
|
|
770
771
|
});
|
|
771
772
|
|
|
772
773
|
this.exportAdapter = new SkillToMCPAdapter({
|
|
773
774
|
registry: this.registry,
|
|
774
775
|
executor: this.executor,
|
|
775
776
|
serverName: options.serverName,
|
|
776
|
-
version: options.version
|
|
777
|
+
version: options.version,
|
|
777
778
|
});
|
|
778
779
|
|
|
779
780
|
// Forward events
|
|
@@ -785,28 +786,24 @@ class MCPAdapterManager extends EventEmitter {
|
|
|
785
786
|
*/
|
|
786
787
|
_setupEventForwarding() {
|
|
787
788
|
const importEvents = [
|
|
788
|
-
'server-registered',
|
|
789
|
-
'server-disconnected',
|
|
790
|
-
'tool-imported',
|
|
789
|
+
'server-registered',
|
|
790
|
+
'server-disconnected',
|
|
791
|
+
'tool-imported',
|
|
791
792
|
'tool-executed',
|
|
792
793
|
'tool-error',
|
|
793
|
-
'import-error'
|
|
794
|
+
'import-error',
|
|
794
795
|
];
|
|
795
796
|
|
|
796
|
-
const exportEvents = [
|
|
797
|
-
'skill-exported',
|
|
798
|
-
'export-error',
|
|
799
|
-
'call-error'
|
|
800
|
-
];
|
|
797
|
+
const exportEvents = ['skill-exported', 'export-error', 'call-error'];
|
|
801
798
|
|
|
802
799
|
for (const event of importEvents) {
|
|
803
|
-
this.importAdapter.on(event,
|
|
800
|
+
this.importAdapter.on(event, data => {
|
|
804
801
|
this.emit(`import:${event}`, data);
|
|
805
802
|
});
|
|
806
803
|
}
|
|
807
804
|
|
|
808
805
|
for (const event of exportEvents) {
|
|
809
|
-
this.exportAdapter.on(event,
|
|
806
|
+
this.exportAdapter.on(event, data => {
|
|
810
807
|
this.emit(`export:${event}`, data);
|
|
811
808
|
});
|
|
812
809
|
}
|
|
@@ -861,12 +858,12 @@ class MCPAdapterManager extends EventEmitter {
|
|
|
861
858
|
return {
|
|
862
859
|
import: {
|
|
863
860
|
connections: this.importAdapter.getConnectionStatus(),
|
|
864
|
-
adapterCount: this.importAdapter.adapters.size
|
|
861
|
+
adapterCount: this.importAdapter.adapters.size,
|
|
865
862
|
},
|
|
866
863
|
export: {
|
|
867
864
|
toolCount: this.exportAdapter.exportedTools.size,
|
|
868
|
-
serverInfo: this.exportAdapter.serverInfo
|
|
869
|
-
}
|
|
865
|
+
serverInfo: this.exportAdapter.serverInfo,
|
|
866
|
+
},
|
|
870
867
|
};
|
|
871
868
|
}
|
|
872
869
|
|
|
@@ -892,5 +889,5 @@ module.exports = {
|
|
|
892
889
|
SchemaTranslator,
|
|
893
890
|
MCPToSkillAdapter,
|
|
894
891
|
SkillToMCPAdapter,
|
|
895
|
-
MCPAdapterManager
|
|
892
|
+
MCPAdapterManager,
|
|
896
893
|
};
|