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.
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 +164 -145
  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 +247 -125
  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 +83 -80
  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 +53 -44
  87. package/src/monitoring/incident-manager.js +123 -103
  88. package/src/monitoring/index.js +144 -134
  89. package/src/monitoring/observability.js +82 -59
  90. package/src/monitoring/quality-dashboard.js +51 -39
  91. package/src/monitoring/release-manager.js +70 -50
  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,9 +1,9 @@
1
1
  /**
2
2
  * MUSUBI MCP Context Provider
3
- *
3
+ *
4
4
  * Provides context information from MCP resources to the Agent Loop.
5
5
  * Manages resources, prompts, and context from MCP servers.
6
- *
6
+ *
7
7
  * @module integrations/mcp/mcp-context-provider
8
8
  */
9
9
 
@@ -48,24 +48,24 @@ class MCPContextProvider extends EventEmitter {
48
48
  */
49
49
  constructor(options = {}) {
50
50
  super();
51
-
51
+
52
52
  this.connector = options.connector || null;
53
53
  this.cacheTTL = options.cacheTTL ?? 300000;
54
54
  this.maxCacheSize = options.maxCacheSize ?? 100;
55
-
55
+
56
56
  /** @type {Map<string, MCPResource[]>} */
57
57
  this.resources = new Map();
58
-
58
+
59
59
  /** @type {Map<string, MCPPrompt[]>} */
60
60
  this.prompts = new Map();
61
-
61
+
62
62
  /** @type {Map<string, { data: *, timestamp: number }>} */
63
63
  this.cache = new Map();
64
-
64
+
65
65
  /** @type {Map<string, Function>} */
66
66
  this.subscriptions = new Map();
67
67
  }
68
-
68
+
69
69
  /**
70
70
  * Set the MCP connector
71
71
  * @param {Object} connector
@@ -73,7 +73,7 @@ class MCPContextProvider extends EventEmitter {
73
73
  setConnector(connector) {
74
74
  this.connector = connector;
75
75
  }
76
-
76
+
77
77
  /**
78
78
  * Discover resources from an MCP server
79
79
  * @param {string} serverName
@@ -83,29 +83,28 @@ class MCPContextProvider extends EventEmitter {
83
83
  if (!this.connector) {
84
84
  throw new Error('MCP connector not set');
85
85
  }
86
-
86
+
87
87
  try {
88
88
  const response = await this.connector.listResources(serverName);
89
89
  const resources = (response.resources || []).map(r => ({
90
90
  ...r,
91
- serverName
91
+ serverName,
92
92
  }));
93
-
93
+
94
94
  this.resources.set(serverName, resources);
95
-
95
+
96
96
  this.emit('resources:discovered', {
97
97
  serverName,
98
- count: resources.length
98
+ count: resources.length,
99
99
  });
100
-
100
+
101
101
  return resources;
102
-
103
102
  } catch (error) {
104
103
  this.emit('resources:error', { serverName, error });
105
104
  throw error;
106
105
  }
107
106
  }
108
-
107
+
109
108
  /**
110
109
  * Discover prompts from an MCP server
111
110
  * @param {string} serverName
@@ -115,29 +114,28 @@ class MCPContextProvider extends EventEmitter {
115
114
  if (!this.connector) {
116
115
  throw new Error('MCP connector not set');
117
116
  }
118
-
117
+
119
118
  try {
120
119
  const response = await this.connector.listPrompts(serverName);
121
120
  const prompts = (response.prompts || []).map(p => ({
122
121
  ...p,
123
- serverName
122
+ serverName,
124
123
  }));
125
-
124
+
126
125
  this.prompts.set(serverName, prompts);
127
-
126
+
128
127
  this.emit('prompts:discovered', {
129
128
  serverName,
130
- count: prompts.length
129
+ count: prompts.length,
131
130
  });
132
-
131
+
133
132
  return prompts;
134
-
135
133
  } catch (error) {
136
134
  this.emit('prompts:error', { serverName, error });
137
135
  throw error;
138
136
  }
139
137
  }
140
-
138
+
141
139
  /**
142
140
  * Read a resource
143
141
  * @param {string} serverName
@@ -149,7 +147,7 @@ class MCPContextProvider extends EventEmitter {
149
147
  async readResource(serverName, uri, options = {}) {
150
148
  const cacheKey = `resource:${serverName}:${uri}`;
151
149
  const useCache = options.useCache ?? true;
152
-
150
+
153
151
  // Check cache
154
152
  if (useCache) {
155
153
  const cached = this.getFromCache(cacheKey);
@@ -157,13 +155,13 @@ class MCPContextProvider extends EventEmitter {
157
155
  return cached;
158
156
  }
159
157
  }
160
-
158
+
161
159
  if (!this.connector) {
162
160
  throw new Error('MCP connector not set');
163
161
  }
164
-
162
+
165
163
  const response = await this.connector.readResource(serverName, uri);
166
-
164
+
167
165
  const contextData = {
168
166
  type: 'resource',
169
167
  source: `${serverName}:${uri}`,
@@ -171,16 +169,16 @@ class MCPContextProvider extends EventEmitter {
171
169
  metadata: {
172
170
  uri,
173
171
  serverName,
174
- mimeType: response.mimeType
175
- }
172
+ mimeType: response.mimeType,
173
+ },
176
174
  };
177
-
175
+
178
176
  this.addToCache(cacheKey, contextData);
179
177
  this.emit('resource:read', { serverName, uri });
180
-
178
+
181
179
  return contextData;
182
180
  }
183
-
181
+
184
182
  /**
185
183
  * Get a prompt with arguments
186
184
  * @param {string} serverName
@@ -192,9 +190,9 @@ class MCPContextProvider extends EventEmitter {
192
190
  if (!this.connector) {
193
191
  throw new Error('MCP connector not set');
194
192
  }
195
-
193
+
196
194
  const response = await this.connector.getPrompt(serverName, promptName, args);
197
-
195
+
198
196
  const contextData = {
199
197
  type: 'prompt',
200
198
  source: `${serverName}:${promptName}`,
@@ -203,15 +201,15 @@ class MCPContextProvider extends EventEmitter {
203
201
  promptName,
204
202
  serverName,
205
203
  arguments: args,
206
- description: response.description
207
- }
204
+ description: response.description,
205
+ },
208
206
  };
209
-
207
+
210
208
  this.emit('prompt:retrieved', { serverName, promptName });
211
-
209
+
212
210
  return contextData;
213
211
  }
214
-
212
+
215
213
  /**
216
214
  * Subscribe to resource updates
217
215
  * @param {string} serverName
@@ -221,27 +219,27 @@ class MCPContextProvider extends EventEmitter {
221
219
  */
222
220
  subscribeToResource(serverName, uri, callback) {
223
221
  const key = `${serverName}:${uri}`;
224
-
222
+
225
223
  // Store callback
226
224
  this.subscriptions.set(key, callback);
227
-
225
+
228
226
  // Setup MCP subscription if connector supports it
229
227
  if (this.connector && this.connector.subscribe) {
230
- this.connector.subscribe(serverName, uri, (update) => {
228
+ this.connector.subscribe(serverName, uri, update => {
231
229
  // Invalidate cache
232
230
  this.cache.delete(`resource:${serverName}:${uri}`);
233
-
231
+
234
232
  // Call callback
235
233
  callback({
236
234
  type: 'resource:updated',
237
235
  source: key,
238
- content: update
236
+ content: update,
239
237
  });
240
238
  });
241
239
  }
242
-
240
+
243
241
  this.emit('subscription:created', { serverName, uri });
244
-
242
+
245
243
  // Return unsubscribe function
246
244
  return () => {
247
245
  this.subscriptions.delete(key);
@@ -251,7 +249,7 @@ class MCPContextProvider extends EventEmitter {
251
249
  this.emit('subscription:removed', { serverName, uri });
252
250
  };
253
251
  }
254
-
252
+
255
253
  /**
256
254
  * Get all resources
257
255
  * @returns {MCPResource[]}
@@ -263,7 +261,7 @@ class MCPContextProvider extends EventEmitter {
263
261
  }
264
262
  return all;
265
263
  }
266
-
264
+
267
265
  /**
268
266
  * Get resources by server
269
267
  * @param {string} serverName
@@ -272,7 +270,7 @@ class MCPContextProvider extends EventEmitter {
272
270
  getResourcesByServer(serverName) {
273
271
  return this.resources.get(serverName) || [];
274
272
  }
275
-
273
+
276
274
  /**
277
275
  * Get all prompts
278
276
  * @returns {MCPPrompt[]}
@@ -284,7 +282,7 @@ class MCPContextProvider extends EventEmitter {
284
282
  }
285
283
  return all;
286
284
  }
287
-
285
+
288
286
  /**
289
287
  * Get prompts by server
290
288
  * @param {string} serverName
@@ -293,7 +291,7 @@ class MCPContextProvider extends EventEmitter {
293
291
  getPromptsByServer(serverName) {
294
292
  return this.prompts.get(serverName) || [];
295
293
  }
296
-
294
+
297
295
  /**
298
296
  * Build context for Agent Loop
299
297
  * @param {Object} options
@@ -308,10 +306,10 @@ class MCPContextProvider extends EventEmitter {
308
306
  prompts: [],
309
307
  metadata: {
310
308
  builtAt: new Date().toISOString(),
311
- sources: []
312
- }
309
+ sources: [],
310
+ },
313
311
  };
314
-
312
+
315
313
  // Gather resources
316
314
  if (options.resources) {
317
315
  for (const resourceSpec of options.resources) {
@@ -325,7 +323,7 @@ class MCPContextProvider extends EventEmitter {
325
323
  }
326
324
  }
327
325
  }
328
-
326
+
329
327
  // Gather prompts
330
328
  if (options.prompts) {
331
329
  for (const promptSpec of options.prompts) {
@@ -340,15 +338,15 @@ class MCPContextProvider extends EventEmitter {
340
338
  }
341
339
  }
342
340
  }
343
-
341
+
344
342
  this.emit('context:built', {
345
343
  resourceCount: context.resources.length,
346
- promptCount: context.prompts.length
344
+ promptCount: context.prompts.length,
347
345
  });
348
-
346
+
349
347
  return context;
350
348
  }
351
-
349
+
352
350
  /**
353
351
  * Parse resource specification (serverName:uri or serverName/name)
354
352
  * @param {string} spec
@@ -364,7 +362,7 @@ class MCPContextProvider extends EventEmitter {
364
362
  }
365
363
  return [spec, ''];
366
364
  }
367
-
365
+
368
366
  /**
369
367
  * Add item to cache
370
368
  * @param {string} key
@@ -378,13 +376,13 @@ class MCPContextProvider extends EventEmitter {
378
376
  this.cache.delete(oldest);
379
377
  }
380
378
  }
381
-
379
+
382
380
  this.cache.set(key, {
383
381
  data,
384
- timestamp: Date.now()
382
+ timestamp: Date.now(),
385
383
  });
386
384
  }
387
-
385
+
388
386
  /**
389
387
  * Get item from cache
390
388
  * @param {string} key
@@ -393,16 +391,16 @@ class MCPContextProvider extends EventEmitter {
393
391
  getFromCache(key) {
394
392
  const entry = this.cache.get(key);
395
393
  if (!entry) return null;
396
-
394
+
397
395
  // Check TTL
398
396
  if (Date.now() - entry.timestamp > this.cacheTTL) {
399
397
  this.cache.delete(key);
400
398
  return null;
401
399
  }
402
-
400
+
403
401
  return entry.data;
404
402
  }
405
-
403
+
406
404
  /**
407
405
  * Find oldest cache entry
408
406
  * @returns {string|null}
@@ -410,17 +408,17 @@ class MCPContextProvider extends EventEmitter {
410
408
  findOldestCacheEntry() {
411
409
  let oldest = null;
412
410
  let oldestTime = Infinity;
413
-
411
+
414
412
  for (const [key, entry] of this.cache) {
415
413
  if (entry.timestamp < oldestTime) {
416
414
  oldestTime = entry.timestamp;
417
415
  oldest = key;
418
416
  }
419
417
  }
420
-
418
+
421
419
  return oldest;
422
420
  }
423
-
421
+
424
422
  /**
425
423
  * Clear cache
426
424
  */
@@ -428,7 +426,7 @@ class MCPContextProvider extends EventEmitter {
428
426
  this.cache.clear();
429
427
  this.emit('cache:cleared');
430
428
  }
431
-
429
+
432
430
  /**
433
431
  * Get provider statistics
434
432
  * @returns {Object}
@@ -439,22 +437,22 @@ class MCPContextProvider extends EventEmitter {
439
437
  total: this.getAllResources().length,
440
438
  byServer: Object.fromEntries(
441
439
  Array.from(this.resources.entries()).map(([s, r]) => [s, r.length])
442
- )
440
+ ),
443
441
  },
444
442
  prompts: {
445
443
  total: this.getAllPrompts().length,
446
444
  byServer: Object.fromEntries(
447
445
  Array.from(this.prompts.entries()).map(([s, p]) => [s, p.length])
448
- )
446
+ ),
449
447
  },
450
448
  cache: {
451
449
  size: this.cache.size,
452
- maxSize: this.maxCacheSize
450
+ maxSize: this.maxCacheSize,
453
451
  },
454
- subscriptions: this.subscriptions.size
452
+ subscriptions: this.subscriptions.size,
455
453
  };
456
454
  }
457
-
455
+
458
456
  /**
459
457
  * Clear all data
460
458
  */
@@ -468,5 +466,5 @@ class MCPContextProvider extends EventEmitter {
468
466
  }
469
467
 
470
468
  module.exports = {
471
- MCPContextProvider
469
+ MCPContextProvider,
472
470
  };