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.
Files changed (232) hide show
  1. package/README.ja.md +106 -48
  2. package/README.md +110 -32
  3. package/bin/musubi-analyze.js +74 -67
  4. package/bin/musubi-browser.js +27 -26
  5. package/bin/musubi-change.js +48 -47
  6. package/bin/musubi-checkpoint.js +10 -7
  7. package/bin/musubi-convert.js +25 -25
  8. package/bin/musubi-costs.js +27 -10
  9. package/bin/musubi-gui.js +52 -46
  10. package/bin/musubi-init.js +1952 -10
  11. package/bin/musubi-orchestrate.js +327 -239
  12. package/bin/musubi-remember.js +69 -56
  13. package/bin/musubi-resolve.js +53 -45
  14. package/bin/musubi-trace.js +51 -22
  15. package/bin/musubi-validate.js +39 -30
  16. package/bin/musubi-workflow.js +33 -34
  17. package/bin/musubi.js +39 -2
  18. package/package.json +1 -1
  19. package/src/agents/agent-loop.js +94 -95
  20. package/src/agents/agentic/code-generator.js +119 -109
  21. package/src/agents/agentic/code-reviewer.js +105 -108
  22. package/src/agents/agentic/index.js +4 -4
  23. package/src/agents/browser/action-executor.js +13 -13
  24. package/src/agents/browser/ai-comparator.js +11 -10
  25. package/src/agents/browser/context-manager.js +6 -6
  26. package/src/agents/browser/index.js +5 -5
  27. package/src/agents/browser/nl-parser.js +31 -46
  28. package/src/agents/browser/screenshot.js +2 -2
  29. package/src/agents/browser/test-generator.js +6 -4
  30. package/src/agents/function-tool.js +71 -65
  31. package/src/agents/index.js +7 -7
  32. package/src/agents/schema-generator.js +98 -94
  33. package/src/analyzers/ast-extractor.js +158 -146
  34. package/src/analyzers/codegraph-auto-update.js +858 -0
  35. package/src/analyzers/complexity-analyzer.js +536 -0
  36. package/src/analyzers/context-optimizer.js +241 -126
  37. package/src/analyzers/impact-analyzer.js +1 -1
  38. package/src/analyzers/large-project-analyzer.js +766 -0
  39. package/src/analyzers/repository-map.js +77 -81
  40. package/src/analyzers/security-analyzer.js +19 -11
  41. package/src/analyzers/stuck-detector.js +19 -17
  42. package/src/converters/index.js +78 -57
  43. package/src/converters/ir/types.js +12 -12
  44. package/src/converters/parsers/musubi-parser.js +134 -126
  45. package/src/converters/parsers/openapi-parser.js +70 -53
  46. package/src/converters/parsers/speckit-parser.js +239 -175
  47. package/src/converters/writers/musubi-writer.js +123 -118
  48. package/src/converters/writers/speckit-writer.js +124 -113
  49. package/src/generators/rust-migration-generator.js +512 -0
  50. package/src/gui/public/index.html +1365 -1211
  51. package/src/gui/server.js +41 -40
  52. package/src/gui/services/file-watcher.js +23 -8
  53. package/src/gui/services/project-scanner.js +26 -20
  54. package/src/gui/services/replanning-service.js +27 -23
  55. package/src/gui/services/traceability-service.js +8 -8
  56. package/src/gui/services/workflow-service.js +14 -7
  57. package/src/index.js +151 -0
  58. package/src/integrations/cicd.js +90 -104
  59. package/src/integrations/codegraph-mcp.js +643 -0
  60. package/src/integrations/documentation.js +142 -103
  61. package/src/integrations/examples.js +95 -80
  62. package/src/integrations/github-client.js +17 -17
  63. package/src/integrations/index.js +5 -5
  64. package/src/integrations/mcp/index.js +21 -21
  65. package/src/integrations/mcp/mcp-context-provider.js +76 -78
  66. package/src/integrations/mcp/mcp-discovery.js +74 -72
  67. package/src/integrations/mcp/mcp-tool-registry.js +99 -94
  68. package/src/integrations/mcp-connector.js +70 -66
  69. package/src/integrations/platforms.js +50 -49
  70. package/src/integrations/tool-discovery.js +37 -31
  71. package/src/llm-providers/anthropic-provider.js +11 -11
  72. package/src/llm-providers/base-provider.js +16 -18
  73. package/src/llm-providers/copilot-provider.js +22 -19
  74. package/src/llm-providers/index.js +26 -25
  75. package/src/llm-providers/ollama-provider.js +11 -11
  76. package/src/llm-providers/openai-provider.js +12 -12
  77. package/src/managers/agent-memory.js +36 -24
  78. package/src/managers/checkpoint-manager.js +4 -8
  79. package/src/managers/delta-spec.js +19 -19
  80. package/src/managers/index.js +13 -4
  81. package/src/managers/memory-condenser.js +35 -45
  82. package/src/managers/repo-skill-manager.js +57 -31
  83. package/src/managers/skill-loader.js +25 -22
  84. package/src/managers/skill-tools.js +36 -72
  85. package/src/managers/workflow.js +30 -22
  86. package/src/monitoring/cost-tracker.js +48 -46
  87. package/src/monitoring/incident-manager.js +116 -106
  88. package/src/monitoring/index.js +144 -134
  89. package/src/monitoring/observability.js +75 -62
  90. package/src/monitoring/quality-dashboard.js +45 -41
  91. package/src/monitoring/release-manager.js +63 -53
  92. package/src/orchestration/agent-skill-binding.js +39 -47
  93. package/src/orchestration/error-handler.js +65 -107
  94. package/src/orchestration/guardrails/base-guardrail.js +26 -24
  95. package/src/orchestration/guardrails/guardrail-rules.js +50 -64
  96. package/src/orchestration/guardrails/index.js +5 -5
  97. package/src/orchestration/guardrails/input-guardrail.js +58 -45
  98. package/src/orchestration/guardrails/output-guardrail.js +104 -81
  99. package/src/orchestration/guardrails/safety-check.js +79 -79
  100. package/src/orchestration/index.js +38 -55
  101. package/src/orchestration/mcp-tool-adapters.js +96 -99
  102. package/src/orchestration/orchestration-engine.js +21 -21
  103. package/src/orchestration/pattern-registry.js +60 -45
  104. package/src/orchestration/patterns/auto.js +34 -47
  105. package/src/orchestration/patterns/group-chat.js +59 -65
  106. package/src/orchestration/patterns/handoff.js +67 -65
  107. package/src/orchestration/patterns/human-in-loop.js +51 -72
  108. package/src/orchestration/patterns/nested.js +25 -40
  109. package/src/orchestration/patterns/sequential.js +35 -34
  110. package/src/orchestration/patterns/swarm.js +63 -56
  111. package/src/orchestration/patterns/triage.js +150 -109
  112. package/src/orchestration/reasoning/index.js +9 -9
  113. package/src/orchestration/reasoning/planning-engine.js +143 -140
  114. package/src/orchestration/reasoning/reasoning-engine.js +206 -144
  115. package/src/orchestration/reasoning/self-correction.js +121 -128
  116. package/src/orchestration/replanning/adaptive-goal-modifier.js +107 -112
  117. package/src/orchestration/replanning/alternative-generator.js +37 -42
  118. package/src/orchestration/replanning/config.js +63 -59
  119. package/src/orchestration/replanning/goal-progress-tracker.js +98 -100
  120. package/src/orchestration/replanning/index.js +24 -20
  121. package/src/orchestration/replanning/plan-evaluator.js +49 -50
  122. package/src/orchestration/replanning/plan-monitor.js +32 -28
  123. package/src/orchestration/replanning/proactive-path-optimizer.js +175 -178
  124. package/src/orchestration/replanning/replan-history.js +33 -26
  125. package/src/orchestration/replanning/replanning-engine.js +106 -108
  126. package/src/orchestration/skill-executor.js +107 -109
  127. package/src/orchestration/skill-registry.js +85 -89
  128. package/src/orchestration/workflow-examples.js +228 -231
  129. package/src/orchestration/workflow-executor.js +65 -68
  130. package/src/orchestration/workflow-orchestrator.js +72 -73
  131. package/src/phase4-integration.js +47 -40
  132. package/src/phase5-integration.js +89 -30
  133. package/src/reporters/coverage-report.js +82 -30
  134. package/src/reporters/hierarchical-reporter.js +498 -0
  135. package/src/reporters/traceability-matrix-report.js +29 -20
  136. package/src/resolvers/issue-resolver.js +43 -31
  137. package/src/steering/advanced-validation.js +133 -124
  138. package/src/steering/auto-updater.js +60 -73
  139. package/src/steering/index.js +6 -6
  140. package/src/steering/quality-metrics.js +41 -35
  141. package/src/steering/steering-auto-update.js +83 -86
  142. package/src/steering/steering-validator.js +98 -106
  143. package/src/steering/template-constraints.js +53 -54
  144. package/src/templates/agents/claude-code/CLAUDE.md +32 -32
  145. package/src/templates/agents/claude-code/skills/agent-assistant/SKILL.md +13 -5
  146. package/src/templates/agents/claude-code/skills/ai-ml-engineer/mlops-guide.md +23 -23
  147. package/src/templates/agents/claude-code/skills/ai-ml-engineer/model-card-template.md +60 -41
  148. package/src/templates/agents/claude-code/skills/api-designer/api-patterns.md +27 -19
  149. package/src/templates/agents/claude-code/skills/api-designer/openapi-template.md +11 -7
  150. package/src/templates/agents/claude-code/skills/bug-hunter/SKILL.md +4 -3
  151. package/src/templates/agents/claude-code/skills/bug-hunter/root-cause-analysis.md +37 -15
  152. package/src/templates/agents/claude-code/skills/change-impact-analyzer/dependency-graph-patterns.md +36 -42
  153. package/src/templates/agents/claude-code/skills/change-impact-analyzer/impact-analysis-template.md +69 -60
  154. package/src/templates/agents/claude-code/skills/cloud-architect/aws-patterns.md +31 -38
  155. package/src/templates/agents/claude-code/skills/cloud-architect/azure-patterns.md +28 -23
  156. package/src/templates/agents/claude-code/skills/code-reviewer/SKILL.md +61 -0
  157. package/src/templates/agents/claude-code/skills/code-reviewer/best-practices.md +27 -0
  158. package/src/templates/agents/claude-code/skills/code-reviewer/review-checklist.md +29 -10
  159. package/src/templates/agents/claude-code/skills/code-reviewer/review-standards.md +29 -24
  160. package/src/templates/agents/claude-code/skills/constitution-enforcer/SKILL.md +8 -6
  161. package/src/templates/agents/claude-code/skills/constitution-enforcer/constitutional-articles.md +62 -26
  162. package/src/templates/agents/claude-code/skills/constitution-enforcer/phase-minus-one-gates.md +35 -16
  163. package/src/templates/agents/claude-code/skills/database-administrator/backup-recovery.md +27 -17
  164. package/src/templates/agents/claude-code/skills/database-administrator/tuning-guide.md +25 -20
  165. package/src/templates/agents/claude-code/skills/database-schema-designer/schema-patterns.md +39 -22
  166. package/src/templates/agents/claude-code/skills/devops-engineer/ci-cd-templates.md +25 -22
  167. package/src/templates/agents/claude-code/skills/issue-resolver/SKILL.md +24 -21
  168. package/src/templates/agents/claude-code/skills/orchestrator/SKILL.md +148 -63
  169. package/src/templates/agents/claude-code/skills/orchestrator/patterns.md +35 -16
  170. package/src/templates/agents/claude-code/skills/orchestrator/selection-matrix.md +69 -64
  171. package/src/templates/agents/claude-code/skills/performance-engineer/optimization-playbook.md +47 -47
  172. package/src/templates/agents/claude-code/skills/performance-optimizer/SKILL.md +69 -0
  173. package/src/templates/agents/claude-code/skills/performance-optimizer/benchmark-template.md +63 -45
  174. package/src/templates/agents/claude-code/skills/performance-optimizer/optimization-patterns.md +33 -35
  175. package/src/templates/agents/claude-code/skills/project-manager/SKILL.md +7 -6
  176. package/src/templates/agents/claude-code/skills/project-manager/agile-ceremonies.md +47 -28
  177. package/src/templates/agents/claude-code/skills/project-manager/project-templates.md +94 -78
  178. package/src/templates/agents/claude-code/skills/quality-assurance/SKILL.md +20 -17
  179. package/src/templates/agents/claude-code/skills/quality-assurance/qa-plan-template.md +63 -49
  180. package/src/templates/agents/claude-code/skills/release-coordinator/SKILL.md +5 -5
  181. package/src/templates/agents/claude-code/skills/release-coordinator/feature-flag-guide.md +30 -26
  182. package/src/templates/agents/claude-code/skills/release-coordinator/release-plan-template.md +67 -35
  183. package/src/templates/agents/claude-code/skills/requirements-analyst/ears-format.md +54 -42
  184. package/src/templates/agents/claude-code/skills/requirements-analyst/validation-rules.md +36 -33
  185. package/src/templates/agents/claude-code/skills/security-auditor/SKILL.md +77 -19
  186. package/src/templates/agents/claude-code/skills/security-auditor/audit-checklists.md +24 -24
  187. package/src/templates/agents/claude-code/skills/security-auditor/owasp-top-10.md +61 -20
  188. package/src/templates/agents/claude-code/skills/security-auditor/vulnerability-patterns.md +43 -11
  189. package/src/templates/agents/claude-code/skills/site-reliability-engineer/SKILL.md +1 -0
  190. package/src/templates/agents/claude-code/skills/site-reliability-engineer/incident-response-template.md +55 -25
  191. package/src/templates/agents/claude-code/skills/site-reliability-engineer/observability-patterns.md +78 -68
  192. package/src/templates/agents/claude-code/skills/site-reliability-engineer/slo-sli-guide.md +73 -53
  193. package/src/templates/agents/claude-code/skills/software-developer/solid-principles.md +83 -37
  194. package/src/templates/agents/claude-code/skills/software-developer/test-first-workflow.md +38 -31
  195. package/src/templates/agents/claude-code/skills/steering/SKILL.md +1 -0
  196. package/src/templates/agents/claude-code/skills/steering/auto-update-rules.md +31 -0
  197. package/src/templates/agents/claude-code/skills/system-architect/adr-template.md +25 -7
  198. package/src/templates/agents/claude-code/skills/system-architect/c4-model-guide.md +74 -61
  199. package/src/templates/agents/claude-code/skills/technical-writer/doc-templates/documentation-templates.md +70 -52
  200. package/src/templates/agents/claude-code/skills/test-engineer/SKILL.md +2 -0
  201. package/src/templates/agents/claude-code/skills/test-engineer/ears-test-mapping.md +75 -71
  202. package/src/templates/agents/claude-code/skills/test-engineer/test-types.md +85 -63
  203. package/src/templates/agents/claude-code/skills/traceability-auditor/coverage-matrix-template.md +39 -36
  204. package/src/templates/agents/claude-code/skills/traceability-auditor/gap-detection-rules.md +22 -17
  205. package/src/templates/agents/claude-code/skills/ui-ux-designer/SKILL.md +1 -0
  206. package/src/templates/agents/claude-code/skills/ui-ux-designer/accessibility-guidelines.md +49 -75
  207. package/src/templates/agents/claude-code/skills/ui-ux-designer/design-system-components.md +71 -59
  208. package/src/templates/agents/codex/AGENTS.md +74 -42
  209. package/src/templates/agents/cursor/AGENTS.md +74 -42
  210. package/src/templates/agents/gemini-cli/GEMINI.md +74 -42
  211. package/src/templates/agents/github-copilot/AGENTS.md +83 -51
  212. package/src/templates/agents/qwen-code/QWEN.md +74 -42
  213. package/src/templates/agents/windsurf/AGENTS.md +74 -42
  214. package/src/templates/architectures/README.md +41 -0
  215. package/src/templates/architectures/clean-architecture/README.md +113 -0
  216. package/src/templates/architectures/event-driven/README.md +162 -0
  217. package/src/templates/architectures/hexagonal/README.md +130 -0
  218. package/src/templates/index.js +6 -1
  219. package/src/templates/locale-manager.js +16 -16
  220. package/src/templates/shared/delta-spec-template.md +20 -13
  221. package/src/templates/shared/github-actions/musubi-issue-resolver.yml +5 -5
  222. package/src/templates/shared/github-actions/musubi-security-check.yml +3 -3
  223. package/src/templates/shared/github-actions/musubi-validate.yml +4 -4
  224. package/src/templates/shared/steering/structure.md +95 -0
  225. package/src/templates/skills/browser-agent.md +21 -16
  226. package/src/templates/skills/web-gui.md +8 -0
  227. package/src/templates/template-constraints.js +50 -53
  228. package/src/validators/advanced-validation.js +30 -36
  229. package/src/validators/constitutional-validator.js +77 -73
  230. package/src/validators/critic-system.js +49 -59
  231. package/src/validators/delta-format.js +59 -55
  232. 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(os.homedir(), 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json'),
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 => [s.name, {
342
- command: s.command,
343
- args: s.args,
344
- env: s.env
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
  };