@brad-frost-web/eddie-brain 0.32.0

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 (239) hide show
  1. package/README.md +109 -0
  2. package/dist/analyze/drift-detector.d.ts +30 -0
  3. package/dist/analyze/drift-detector.d.ts.map +1 -0
  4. package/dist/analyze/drift-detector.js +310 -0
  5. package/dist/analyze/drift-detector.js.map +1 -0
  6. package/dist/analyze/health-scorer.d.ts +71 -0
  7. package/dist/analyze/health-scorer.d.ts.map +1 -0
  8. package/dist/analyze/health-scorer.js +420 -0
  9. package/dist/analyze/health-scorer.js.map +1 -0
  10. package/dist/analyze/index.d.ts +11 -0
  11. package/dist/analyze/index.d.ts.map +1 -0
  12. package/dist/analyze/index.js +11 -0
  13. package/dist/analyze/index.js.map +1 -0
  14. package/dist/analyze/naming-validator.d.ts +99 -0
  15. package/dist/analyze/naming-validator.d.ts.map +1 -0
  16. package/dist/analyze/naming-validator.js +430 -0
  17. package/dist/analyze/naming-validator.js.map +1 -0
  18. package/dist/analyze/slot-contract-validator.d.ts +68 -0
  19. package/dist/analyze/slot-contract-validator.d.ts.map +1 -0
  20. package/dist/analyze/slot-contract-validator.js +232 -0
  21. package/dist/analyze/slot-contract-validator.js.map +1 -0
  22. package/dist/analyze/token-validator.d.ts +62 -0
  23. package/dist/analyze/token-validator.d.ts.map +1 -0
  24. package/dist/analyze/token-validator.js +348 -0
  25. package/dist/analyze/token-validator.js.map +1 -0
  26. package/dist/cli/brain.d.ts +12 -0
  27. package/dist/cli/brain.d.ts.map +1 -0
  28. package/dist/cli/brain.js +641 -0
  29. package/dist/cli/brain.js.map +1 -0
  30. package/dist/cli/formatters/json.d.ts +15 -0
  31. package/dist/cli/formatters/json.d.ts.map +1 -0
  32. package/dist/cli/formatters/json.js +18 -0
  33. package/dist/cli/formatters/json.js.map +1 -0
  34. package/dist/cli/formatters/terminal.d.ts +19 -0
  35. package/dist/cli/formatters/terminal.d.ts.map +1 -0
  36. package/dist/cli/formatters/terminal.js +125 -0
  37. package/dist/cli/formatters/terminal.js.map +1 -0
  38. package/dist/cli/index.d.ts +7 -0
  39. package/dist/cli/index.d.ts.map +1 -0
  40. package/dist/cli/index.js +7 -0
  41. package/dist/cli/index.js.map +1 -0
  42. package/dist/data/governance-rules.json +94 -0
  43. package/dist/governance/audit-log.d.ts +17 -0
  44. package/dist/governance/audit-log.d.ts.map +1 -0
  45. package/dist/governance/audit-log.js +44 -0
  46. package/dist/governance/audit-log.js.map +1 -0
  47. package/dist/governance/index.d.ts +8 -0
  48. package/dist/governance/index.d.ts.map +1 -0
  49. package/dist/governance/index.js +8 -0
  50. package/dist/governance/index.js.map +1 -0
  51. package/dist/governance/permissions.d.ts +26 -0
  52. package/dist/governance/permissions.d.ts.map +1 -0
  53. package/dist/governance/permissions.js +75 -0
  54. package/dist/governance/permissions.js.map +1 -0
  55. package/dist/governance/rules-engine.d.ts +24 -0
  56. package/dist/governance/rules-engine.d.ts.map +1 -0
  57. package/dist/governance/rules-engine.js +111 -0
  58. package/dist/governance/rules-engine.js.map +1 -0
  59. package/dist/governance/trust-manager.d.ts +34 -0
  60. package/dist/governance/trust-manager.d.ts.map +1 -0
  61. package/dist/governance/trust-manager.js +148 -0
  62. package/dist/governance/trust-manager.js.map +1 -0
  63. package/dist/index.d.ts +23 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +28 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/knowledge-graph/component-index.d.ts +320 -0
  68. package/dist/knowledge-graph/component-index.d.ts.map +1 -0
  69. package/dist/knowledge-graph/component-index.js +1033 -0
  70. package/dist/knowledge-graph/component-index.js.map +1 -0
  71. package/dist/knowledge-graph/index.d.ts +134 -0
  72. package/dist/knowledge-graph/index.d.ts.map +1 -0
  73. package/dist/knowledge-graph/index.js +249 -0
  74. package/dist/knowledge-graph/index.js.map +1 -0
  75. package/dist/knowledge-graph/learning-history.d.ts +77 -0
  76. package/dist/knowledge-graph/learning-history.d.ts.map +1 -0
  77. package/dist/knowledge-graph/learning-history.js +187 -0
  78. package/dist/knowledge-graph/learning-history.js.map +1 -0
  79. package/dist/knowledge-graph/relationship-map.d.ts +55 -0
  80. package/dist/knowledge-graph/relationship-map.d.ts.map +1 -0
  81. package/dist/knowledge-graph/relationship-map.js +238 -0
  82. package/dist/knowledge-graph/relationship-map.js.map +1 -0
  83. package/dist/knowledge-graph/token-taxonomy.d.ts +127 -0
  84. package/dist/knowledge-graph/token-taxonomy.d.ts.map +1 -0
  85. package/dist/knowledge-graph/token-taxonomy.js +357 -0
  86. package/dist/knowledge-graph/token-taxonomy.js.map +1 -0
  87. package/dist/loop/fix-agent.d.ts +55 -0
  88. package/dist/loop/fix-agent.d.ts.map +1 -0
  89. package/dist/loop/fix-agent.js +344 -0
  90. package/dist/loop/fix-agent.js.map +1 -0
  91. package/dist/loop/index.d.ts +8 -0
  92. package/dist/loop/index.d.ts.map +1 -0
  93. package/dist/loop/index.js +8 -0
  94. package/dist/loop/index.js.map +1 -0
  95. package/dist/loop/issue-fetcher.d.ts +51 -0
  96. package/dist/loop/issue-fetcher.d.ts.map +1 -0
  97. package/dist/loop/issue-fetcher.js +188 -0
  98. package/dist/loop/issue-fetcher.js.map +1 -0
  99. package/dist/loop/observer.d.ts +42 -0
  100. package/dist/loop/observer.d.ts.map +1 -0
  101. package/dist/loop/observer.js +220 -0
  102. package/dist/loop/observer.js.map +1 -0
  103. package/dist/loop/pacer.d.ts +44 -0
  104. package/dist/loop/pacer.d.ts.map +1 -0
  105. package/dist/loop/pacer.js +90 -0
  106. package/dist/loop/pacer.js.map +1 -0
  107. package/dist/loop/reporter.d.ts +9 -0
  108. package/dist/loop/reporter.d.ts.map +1 -0
  109. package/dist/loop/reporter.js +119 -0
  110. package/dist/loop/reporter.js.map +1 -0
  111. package/dist/loop/runner.d.ts +57 -0
  112. package/dist/loop/runner.d.ts.map +1 -0
  113. package/dist/loop/runner.js +390 -0
  114. package/dist/loop/runner.js.map +1 -0
  115. package/dist/loop/types.d.ts +151 -0
  116. package/dist/loop/types.d.ts.map +1 -0
  117. package/dist/loop/types.js +22 -0
  118. package/dist/loop/types.js.map +1 -0
  119. package/dist/mcp/index.d.ts +7 -0
  120. package/dist/mcp/index.d.ts.map +1 -0
  121. package/dist/mcp/index.js +7 -0
  122. package/dist/mcp/index.js.map +1 -0
  123. package/dist/mcp/server.d.ts +12 -0
  124. package/dist/mcp/server.d.ts.map +1 -0
  125. package/dist/mcp/server.js +618 -0
  126. package/dist/mcp/server.js.map +1 -0
  127. package/dist/pipeline/agent-runner.d.ts +34 -0
  128. package/dist/pipeline/agent-runner.d.ts.map +1 -0
  129. package/dist/pipeline/agent-runner.js +323 -0
  130. package/dist/pipeline/agent-runner.js.map +1 -0
  131. package/dist/pipeline/agents/accessibility-auditor.d.ts +10 -0
  132. package/dist/pipeline/agents/accessibility-auditor.d.ts.map +1 -0
  133. package/dist/pipeline/agents/accessibility-auditor.js +69 -0
  134. package/dist/pipeline/agents/accessibility-auditor.js.map +1 -0
  135. package/dist/pipeline/agents/code-reviewer.d.ts +10 -0
  136. package/dist/pipeline/agents/code-reviewer.d.ts.map +1 -0
  137. package/dist/pipeline/agents/code-reviewer.js +75 -0
  138. package/dist/pipeline/agents/code-reviewer.js.map +1 -0
  139. package/dist/pipeline/agents/code-writer.d.ts +10 -0
  140. package/dist/pipeline/agents/code-writer.d.ts.map +1 -0
  141. package/dist/pipeline/agents/code-writer.js +103 -0
  142. package/dist/pipeline/agents/code-writer.js.map +1 -0
  143. package/dist/pipeline/agents/component-architect.d.ts +13 -0
  144. package/dist/pipeline/agents/component-architect.d.ts.map +1 -0
  145. package/dist/pipeline/agents/component-architect.js +81 -0
  146. package/dist/pipeline/agents/component-architect.js.map +1 -0
  147. package/dist/pipeline/agents/index.d.ts +16 -0
  148. package/dist/pipeline/agents/index.d.ts.map +1 -0
  149. package/dist/pipeline/agents/index.js +24 -0
  150. package/dist/pipeline/agents/index.js.map +1 -0
  151. package/dist/pipeline/agents/library-researcher.d.ts +12 -0
  152. package/dist/pipeline/agents/library-researcher.d.ts.map +1 -0
  153. package/dist/pipeline/agents/library-researcher.js +85 -0
  154. package/dist/pipeline/agents/library-researcher.js.map +1 -0
  155. package/dist/pipeline/agents/quality-gate.d.ts +9 -0
  156. package/dist/pipeline/agents/quality-gate.d.ts.map +1 -0
  157. package/dist/pipeline/agents/quality-gate.js +71 -0
  158. package/dist/pipeline/agents/quality-gate.js.map +1 -0
  159. package/dist/pipeline/agents/spec-analyst.d.ts +10 -0
  160. package/dist/pipeline/agents/spec-analyst.d.ts.map +1 -0
  161. package/dist/pipeline/agents/spec-analyst.js +72 -0
  162. package/dist/pipeline/agents/spec-analyst.js.map +1 -0
  163. package/dist/pipeline/agents/story-author.d.ts +9 -0
  164. package/dist/pipeline/agents/story-author.d.ts.map +1 -0
  165. package/dist/pipeline/agents/story-author.js +65 -0
  166. package/dist/pipeline/agents/story-author.js.map +1 -0
  167. package/dist/pipeline/artifact-store.d.ts +27 -0
  168. package/dist/pipeline/artifact-store.d.ts.map +1 -0
  169. package/dist/pipeline/artifact-store.js +77 -0
  170. package/dist/pipeline/artifact-store.js.map +1 -0
  171. package/dist/pipeline/conversational-gate.d.ts +26 -0
  172. package/dist/pipeline/conversational-gate.d.ts.map +1 -0
  173. package/dist/pipeline/conversational-gate.js +122 -0
  174. package/dist/pipeline/conversational-gate.js.map +1 -0
  175. package/dist/pipeline/index.d.ts +14 -0
  176. package/dist/pipeline/index.d.ts.map +1 -0
  177. package/dist/pipeline/index.js +17 -0
  178. package/dist/pipeline/index.js.map +1 -0
  179. package/dist/pipeline/iteration-tracker.d.ts +29 -0
  180. package/dist/pipeline/iteration-tracker.d.ts.map +1 -0
  181. package/dist/pipeline/iteration-tracker.js +102 -0
  182. package/dist/pipeline/iteration-tracker.js.map +1 -0
  183. package/dist/pipeline/learning-bridge.d.ts +37 -0
  184. package/dist/pipeline/learning-bridge.d.ts.map +1 -0
  185. package/dist/pipeline/learning-bridge.js +118 -0
  186. package/dist/pipeline/learning-bridge.js.map +1 -0
  187. package/dist/pipeline/orchestrator.d.ts +45 -0
  188. package/dist/pipeline/orchestrator.d.ts.map +1 -0
  189. package/dist/pipeline/orchestrator.js +473 -0
  190. package/dist/pipeline/orchestrator.js.map +1 -0
  191. package/dist/pipeline/templates/architecture.d.ts +27 -0
  192. package/dist/pipeline/templates/architecture.d.ts.map +1 -0
  193. package/dist/pipeline/templates/architecture.js +111 -0
  194. package/dist/pipeline/templates/architecture.js.map +1 -0
  195. package/dist/pipeline/templates/brief.d.ts +22 -0
  196. package/dist/pipeline/templates/brief.d.ts.map +1 -0
  197. package/dist/pipeline/templates/brief.js +121 -0
  198. package/dist/pipeline/templates/brief.js.map +1 -0
  199. package/dist/pipeline/templates/component-rules.d.ts +25 -0
  200. package/dist/pipeline/templates/component-rules.d.ts.map +1 -0
  201. package/dist/pipeline/templates/component-rules.js +93 -0
  202. package/dist/pipeline/templates/component-rules.js.map +1 -0
  203. package/dist/pipeline/templates/index.d.ts +9 -0
  204. package/dist/pipeline/templates/index.d.ts.map +1 -0
  205. package/dist/pipeline/templates/index.js +7 -0
  206. package/dist/pipeline/templates/index.js.map +1 -0
  207. package/dist/pipeline/tool-handler.d.ts +25 -0
  208. package/dist/pipeline/tool-handler.d.ts.map +1 -0
  209. package/dist/pipeline/tool-handler.js +392 -0
  210. package/dist/pipeline/tool-handler.js.map +1 -0
  211. package/dist/pipeline/types.d.ts +146 -0
  212. package/dist/pipeline/types.d.ts.map +1 -0
  213. package/dist/pipeline/types.js +27 -0
  214. package/dist/pipeline/types.js.map +1 -0
  215. package/dist/plan/action-types.d.ts +31 -0
  216. package/dist/plan/action-types.d.ts.map +1 -0
  217. package/dist/plan/action-types.js +83 -0
  218. package/dist/plan/action-types.js.map +1 -0
  219. package/dist/plan/decision-engine.d.ts +57 -0
  220. package/dist/plan/decision-engine.d.ts.map +1 -0
  221. package/dist/plan/decision-engine.js +162 -0
  222. package/dist/plan/decision-engine.js.map +1 -0
  223. package/dist/plan/index.d.ts +6 -0
  224. package/dist/plan/index.d.ts.map +1 -0
  225. package/dist/plan/index.js +6 -0
  226. package/dist/plan/index.js.map +1 -0
  227. package/dist/types.d.ts +351 -0
  228. package/dist/types.d.ts.map +1 -0
  229. package/dist/types.js +26 -0
  230. package/dist/types.js.map +1 -0
  231. package/dist/utils/anthropic.d.ts +15 -0
  232. package/dist/utils/anthropic.d.ts.map +1 -0
  233. package/dist/utils/anthropic.js +40 -0
  234. package/dist/utils/anthropic.js.map +1 -0
  235. package/dist/utils/id.d.ts +8 -0
  236. package/dist/utils/id.d.ts.map +1 -0
  237. package/dist/utils/id.js +14 -0
  238. package/dist/utils/id.js.map +1 -0
  239. package/package.json +80 -0
@@ -0,0 +1,618 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Eddie's Brain MCP Server
4
+ *
5
+ * Exposes Eddie's Brain capabilities to AI agents via the Model Context Protocol.
6
+ * Runs over stdio so Claude Code, Cursor, etc. can connect directly.
7
+ */
8
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
9
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
10
+ import { z } from 'zod';
11
+ import { existsSync, watchFile } from 'fs';
12
+ import { join, resolve } from 'path';
13
+ import { KnowledgeGraph } from '../knowledge-graph/index.js';
14
+ import { LearningHistory } from '../knowledge-graph/learning-history.js';
15
+ import { TokenValidator, NamingValidator, SlotContractValidator, HealthScorer } from '../analyze/index.js';
16
+ import { DEFAULT_CONFIG } from '../types.js';
17
+ /**
18
+ * Initialize and start the MCP server
19
+ */
20
+ export async function main() {
21
+ const server = new McpServer({
22
+ name: 'eddie-brain',
23
+ version: '0.19.1',
24
+ });
25
+ // Resolve the root dir — check env var, then walk up from cwd looking for .eddie-brain
26
+ const rootDir = resolveRootDir();
27
+ const brainDir = join(rootDir, '.eddie-brain');
28
+ let knowledgeGraph = null;
29
+ if (existsSync(join(brainDir, 'knowledge-graph.json'))) {
30
+ try {
31
+ knowledgeGraph = await KnowledgeGraph.load(brainDir);
32
+ }
33
+ catch (err) {
34
+ console.error(`Failed to load knowledge graph: ${err instanceof Error ? err.message : String(err)}`);
35
+ }
36
+ }
37
+ else {
38
+ console.error(`Knowledge graph not found at ${brainDir}. Run \`npm run eddie-brain:init\` first.`);
39
+ }
40
+ // =========================================================================
41
+ // Auto-reload: watch knowledge-graph.json for changes
42
+ // =========================================================================
43
+ // When `brain init` or `brain scan` regenerates the knowledge graph, the
44
+ // MCP server automatically reloads it so subsequent tool calls return fresh
45
+ // data. Without this, agents had to restart the MCP server manually after
46
+ // every rebuild — a significant workflow friction that blocked iterative
47
+ // Phase C work (#492).
48
+ //
49
+ // Uses Node's built-in fs.watchFile (polling at 2s) rather than chokidar's
50
+ // fs.watch because:
51
+ // - The file is written atomically by KnowledgeGraph.save() (single
52
+ // writeFileSync), so there's no partial-read risk on the poll boundary
53
+ // - watchFile is simpler to reason about than inotify/FSEvents for a
54
+ // single file
55
+ // - 2s polling interval is fine for a file that changes at most once per
56
+ // `brain init` run (every few minutes at most)
57
+ const graphPath = join(brainDir, 'knowledge-graph.json');
58
+ if (existsSync(graphPath)) {
59
+ watchFile(graphPath, { interval: 2000 }, async (curr, prev) => {
60
+ // Only reload if mtime actually changed (not just accessed)
61
+ if (curr.mtimeMs === prev.mtimeMs)
62
+ return;
63
+ try {
64
+ knowledgeGraph = await KnowledgeGraph.load(brainDir);
65
+ console.error(`[eddie-brain] knowledge graph reloaded (${new Date().toISOString()})`);
66
+ }
67
+ catch (err) {
68
+ console.error(`[eddie-brain] failed to reload knowledge graph: ${err instanceof Error ? err.message : String(err)}`);
69
+ // Keep the old graph — better stale than null
70
+ }
71
+ });
72
+ console.error(`[eddie-brain] watching ${graphPath} for changes`);
73
+ }
74
+ // =========================================================================
75
+ // Learning History — loads from .eddie-brain/learning.json
76
+ // =========================================================================
77
+ const learningPath = join(brainDir, 'learning.json');
78
+ let learningHistory;
79
+ if (existsSync(learningPath)) {
80
+ learningHistory = LearningHistory.load(learningPath);
81
+ }
82
+ else {
83
+ learningHistory = new LearningHistory();
84
+ }
85
+ // =========================================================================
86
+ // Tool: eddie_get_component
87
+ // =========================================================================
88
+ server.tool('eddie_get_component', 'Look up an Eddie component by name. Returns full metadata: properties, slots, events, intent, guidelines, and composition recipes. Use this before writing any Eddie component markup.', { name: z.string().describe('Component name (e.g. "button", "ed-button", "card")') }, async ({ name }) => {
89
+ if (!knowledgeGraph)
90
+ throw new Error('Knowledge graph not initialized. Run eddie-brain init.');
91
+ const tagName = name.startsWith('ed-') ? name : `ed-${name}`;
92
+ const component = knowledgeGraph.componentIndex.getComponent(tagName);
93
+ if (!component) {
94
+ // Try fuzzy match
95
+ const all = knowledgeGraph.componentIndex.getAll();
96
+ const matches = all.filter((c) => c.tagName.includes(name) ||
97
+ c.displayName.toLowerCase().includes(name.toLowerCase()));
98
+ if (matches.length > 0) {
99
+ return {
100
+ content: [
101
+ {
102
+ type: 'text',
103
+ text: JSON.stringify({
104
+ error: `Component "${tagName}" not found. Did you mean one of these?`,
105
+ suggestions: matches.map((m) => ({
106
+ tagName: m.tagName,
107
+ displayName: m.displayName,
108
+ intent: m.intent,
109
+ })),
110
+ }, null, 2),
111
+ },
112
+ ],
113
+ };
114
+ }
115
+ return {
116
+ content: [{ type: 'text', text: `Component "${tagName}" not found in Eddie.` }],
117
+ };
118
+ }
119
+ return {
120
+ content: [{ type: 'text', text: JSON.stringify(component, null, 2) }],
121
+ };
122
+ });
123
+ // =========================================================================
124
+ // Tool: eddie_get_token
125
+ // =========================================================================
126
+ server.tool('eddie_get_token', 'Look up a design token by name. Returns the value, tier (definition/usage/component), category, intent, and which components reference it.', { name: z.string().describe('Token name (e.g. "--ed-theme-color-background-default")') }, async ({ name }) => {
127
+ if (!knowledgeGraph)
128
+ throw new Error('Knowledge graph not initialized.');
129
+ const token = knowledgeGraph.tokenTaxonomy.getToken(name);
130
+ if (!token) {
131
+ // Search for partial matches
132
+ const all = knowledgeGraph.tokenTaxonomy.getAll();
133
+ const matches = all.filter((t) => t.name.includes(name)).slice(0, 10);
134
+ return {
135
+ content: [
136
+ {
137
+ type: 'text',
138
+ text: JSON.stringify({
139
+ error: `Token "${name}" not found.`,
140
+ suggestions: matches.map((m) => ({
141
+ name: m.name,
142
+ tier: m.tier,
143
+ category: m.category,
144
+ value: m.value,
145
+ })),
146
+ }, null, 2),
147
+ },
148
+ ],
149
+ };
150
+ }
151
+ return {
152
+ content: [{ type: 'text', text: JSON.stringify(token, null, 2) }],
153
+ };
154
+ });
155
+ // =========================================================================
156
+ // Tool: eddie_validate_file
157
+ // =========================================================================
158
+ server.tool('eddie_validate_file', 'Validate a file for token usage violations and naming convention issues. Run this on any .ts or .scss file before committing.', { path: z.string().describe('Path to the file to validate') }, async ({ path }) => {
159
+ if (!knowledgeGraph)
160
+ throw new Error('Knowledge graph not initialized.');
161
+ const filePath = resolve(path);
162
+ const issues = [];
163
+ const tokenValidator = new TokenValidator();
164
+ const tokenIssues = await tokenValidator.validateFile(filePath, knowledgeGraph.tokenTaxonomy);
165
+ issues.push(...tokenIssues);
166
+ const namingValidator = new NamingValidator();
167
+ const namingIssues = await namingValidator.validateFile(filePath);
168
+ issues.push(...namingIssues);
169
+ const slotValidator = new SlotContractValidator(knowledgeGraph.componentIndex);
170
+ const slotIssues = await slotValidator.validateFile(filePath);
171
+ issues.push(...slotIssues);
172
+ return {
173
+ content: [
174
+ {
175
+ type: 'text',
176
+ text: JSON.stringify({
177
+ file: path,
178
+ issueCount: issues.length,
179
+ issues: issues.map((i) => ({
180
+ severity: i.severity,
181
+ message: i.message,
182
+ line: i.line,
183
+ actual: i.actual,
184
+ expected: i.expected,
185
+ autoFixable: i.autoFixable,
186
+ suggestion: i.suggestion,
187
+ })),
188
+ }, null, 2),
189
+ },
190
+ ],
191
+ };
192
+ });
193
+ // =========================================================================
194
+ // Tool: eddie_check_health
195
+ // =========================================================================
196
+ server.tool('eddie_check_health', 'Run health scoring on the Eddie design system or a specific component. Scores across tokens, naming, documentation, coverage, accessibility, and consistency.', { component: z.string().optional().describe('Optional: specific component to score (e.g. "ed-button")') }, async ({ component }) => {
197
+ if (!knowledgeGraph)
198
+ throw new Error('Knowledge graph not initialized.');
199
+ const config = { ...DEFAULT_CONFIG, rootDir };
200
+ if (component) {
201
+ const scorer = new HealthScorer(knowledgeGraph, config);
202
+ const scores = await scorer.scoreComponent(component);
203
+ return {
204
+ content: [
205
+ {
206
+ type: 'text',
207
+ text: JSON.stringify({ type: 'component', component, scores }, null, 2),
208
+ },
209
+ ],
210
+ };
211
+ }
212
+ // System summary — include live learning stats from the feedback loop
213
+ const learningStats = learningHistory.getStats();
214
+ return {
215
+ content: [
216
+ {
217
+ type: 'text',
218
+ text: JSON.stringify({
219
+ type: 'system',
220
+ summary: knowledgeGraph.getSummary(),
221
+ learning: {
222
+ total: learningStats.totalSuggestions,
223
+ acceptanceRate: Math.round(learningStats.acceptanceRate * 100) + '%',
224
+ rejectionRate: Math.round(learningStats.rejectionRate * 100) + '%',
225
+ modificationRate: Math.round(learningStats.modificationRate * 100) + '%',
226
+ acceptedCount: learningStats.acceptedCount,
227
+ rejectedCount: learningStats.rejectedCount,
228
+ modifiedCount: learningStats.modifiedCount,
229
+ mostAcceptedType: learningStats.mostAcceptedType,
230
+ mostRejectedType: learningStats.mostRejectedType,
231
+ accuracyTrend: learningStats.accuracyTrend,
232
+ },
233
+ }, null, 2),
234
+ },
235
+ ],
236
+ };
237
+ });
238
+ // =========================================================================
239
+ // Tool: eddie_compose_recipe
240
+ // =========================================================================
241
+ server.tool('eddie_compose_recipe', 'Find canonical composition recipes for a given UI intent. Returns which Eddie components to combine and how. Use this when you need to build a UI recipe (e.g. "destructive confirmation dialog", "login form", "navigation header").', { intent: z.string().describe('Natural language description of the UI recipe you need') }, async ({ intent }) => {
242
+ if (!knowledgeGraph)
243
+ throw new Error('Knowledge graph not initialized.');
244
+ // Split query into terms, filtering out common stopwords and very
245
+ // short tokens that cause false-positive substring matches (e.g., "of"
246
+ // matching inside "pr-of-ile", "a" matching inside "c-a-rd", etc.)
247
+ const STOPWORDS = new Set([
248
+ 'a', 'an', 'the', 'of', 'in', 'on', 'at', 'to', 'for', 'by',
249
+ 'is', 'it', 'as', 'or', 'and', 'with', 'that', 'this', 'from',
250
+ ]);
251
+ const terms = intent
252
+ .toLowerCase()
253
+ .split(/\s+/)
254
+ .filter((t) => t.length > 2 && !STOPWORDS.has(t));
255
+ // Score a component entry against the query terms.
256
+ // tagName matches score highest (exact identifier), then intent
257
+ // (the real description), then displayName (the human label).
258
+ const scoreEntry = (c) => {
259
+ let score = 0;
260
+ for (const t of terms) {
261
+ if (c.tagName.includes(t))
262
+ score += 3;
263
+ if (c.intent.toLowerCase().includes(t))
264
+ score += 2;
265
+ if (c.displayName.toLowerCase().includes(t))
266
+ score += 1;
267
+ }
268
+ return score;
269
+ };
270
+ const matchesQuery = (c) => scoreEntry(c) > 0;
271
+ // 1. Search canonical recipes from the RelationshipMap (the legacy
272
+ // 4 recipe entries — button-with-icon, form-fields, etc.)
273
+ const recipes = knowledgeGraph.relationshipMap
274
+ .getAll()
275
+ .filter((r) => terms.some((t) => r.intent.toLowerCase().includes(t)) ||
276
+ terms.some((t) => r.name.toLowerCase().includes(t)));
277
+ // 2. Search page-level entries from the ComponentIndex.
278
+ // Pages are full-page reference compositions — the MOST relevant
279
+ // result type for a compose_recipe query because they show the
280
+ // complete top-to-bottom structure of common application pages.
281
+ const pages = knowledgeGraph.componentIndex
282
+ .getAll()
283
+ .filter((c) => c.atomicLevel === 'page')
284
+ .filter(matchesQuery)
285
+ .sort((a, b) => scoreEntry(b) - scoreEntry(a));
286
+ // 3. Search recipe-level components from the ComponentIndex.
287
+ // These are product-specific compositions that sit between pages
288
+ // and individual components in the atomic hierarchy.
289
+ const recipeComponents = knowledgeGraph.componentIndex
290
+ .getAll()
291
+ .filter((c) => c.atomicLevel === 'recipe')
292
+ .filter(matchesQuery)
293
+ .sort((a, b) => scoreEntry(b) - scoreEntry(a));
294
+ // 4. Search all other relevant components, ranked by score then
295
+ // by atomic level (organisms > molecules > atoms — higher-level
296
+ // components are more relevant for composition).
297
+ const levelOrder = {
298
+ page: 0,
299
+ organism: 1,
300
+ recipe: 2,
301
+ molecule: 3,
302
+ atom: 4,
303
+ };
304
+ const otherComponents = knowledgeGraph.componentIndex
305
+ .getAll()
306
+ .filter((c) => c.atomicLevel !== 'page' && c.atomicLevel !== 'recipe')
307
+ .filter(matchesQuery)
308
+ .sort((a, b) => {
309
+ const scoreDiff = scoreEntry(b) - scoreEntry(a);
310
+ if (scoreDiff !== 0)
311
+ return scoreDiff;
312
+ return (levelOrder[a.atomicLevel] ?? 5) - (levelOrder[b.atomicLevel] ?? 5);
313
+ })
314
+ .slice(0, 15);
315
+ return {
316
+ content: [
317
+ {
318
+ type: 'text',
319
+ text: JSON.stringify({
320
+ query: intent,
321
+ // Canonical recipes from the RelationshipMap
322
+ recipes: recipes.map((r) => ({
323
+ name: r.name,
324
+ intent: r.intent,
325
+ status: r.status,
326
+ components: r.components,
327
+ rules: r.rules,
328
+ })),
329
+ // Full-page reference compositions (NEW in v0.21.0)
330
+ // These are the highest-value results for composition queries.
331
+ // Each page shows the complete top-to-bottom structure of
332
+ // a common application layout (dashboard, article, form, etc.)
333
+ pages: pages.map((c) => ({
334
+ tagName: c.tagName,
335
+ intent: c.intent,
336
+ package: c.package,
337
+ paths: c.paths,
338
+ slots: c.slots.map((s) => ({ name: s.name, description: s.description })),
339
+ guidelines: c.guidelines,
340
+ })),
341
+ // Recipe-level composition components (NEW in v0.21.0)
342
+ // Sub-page compositions like site-header, project-card, etc.
343
+ recipeComponents: recipeComponents.map((c) => ({
344
+ tagName: c.tagName,
345
+ intent: c.intent,
346
+ package: c.package,
347
+ paths: c.paths,
348
+ guidelines: c.guidelines,
349
+ })),
350
+ // Individual building-block components, ranked by relevance
351
+ // then by atomic level (organisms first)
352
+ relevantComponents: otherComponents.map((c) => ({
353
+ tagName: c.tagName,
354
+ intent: c.intent,
355
+ properties: c.properties.map((p) => p.name),
356
+ slots: c.slots.map((s) => s.name),
357
+ })),
358
+ }, null, 2),
359
+ },
360
+ ],
361
+ };
362
+ });
363
+ // =========================================================================
364
+ // Tool: eddie_get_relationships
365
+ // =========================================================================
366
+ server.tool('eddie_get_relationships', 'Get all composition recipes that involve a specific component. Shows how the component relates to and composes with others.', { component: z.string().describe('Component name (e.g. "ed-button", "button")') }, async ({ component }) => {
367
+ if (!knowledgeGraph)
368
+ throw new Error('Knowledge graph not initialized.');
369
+ const tagName = component.startsWith('ed-') ? component : `ed-${component}`;
370
+ const recipes = knowledgeGraph.relationshipMap.findRecipesFor(tagName);
371
+ const entry = knowledgeGraph.componentIndex.getComponent(tagName);
372
+ return {
373
+ content: [
374
+ {
375
+ type: 'text',
376
+ text: JSON.stringify({
377
+ component: tagName,
378
+ composesWith: entry?.composesWith || [],
379
+ childComponents: entry?.childComponents || [],
380
+ parentComponent: entry?.parentComponent || null,
381
+ recipes: recipes.map((r) => ({
382
+ name: r.name,
383
+ intent: r.intent,
384
+ status: r.status,
385
+ components: r.components,
386
+ })),
387
+ }, null, 2),
388
+ },
389
+ ],
390
+ };
391
+ });
392
+ // =========================================================================
393
+ // Tool: eddie_search
394
+ // =========================================================================
395
+ server.tool('eddie_search', 'Search across all Eddie components, tokens, recipes, and boilerplates. Use this when you need to find the right component or token for a task.', { query: z.string().describe('Search query (e.g. "form input", "accent color", "navigation", "starter project")') }, async ({ query }) => {
396
+ if (!knowledgeGraph)
397
+ throw new Error('Knowledge graph not initialized.');
398
+ const results = knowledgeGraph.search(query, brainDir);
399
+ // Split results by atomic level so agents can jump straight to the
400
+ // highest-fidelity matches without scanning a flat list.
401
+ const pages = results.components.filter((c) => c.atomicLevel === 'page').slice(0, 5);
402
+ const recipeComponents = results.components
403
+ .filter((c) => c.atomicLevel === 'recipe')
404
+ .slice(0, 5);
405
+ const otherComponents = results.components
406
+ .filter((c) => c.atomicLevel !== 'page' && c.atomicLevel !== 'recipe')
407
+ .slice(0, 10);
408
+ const response = {
409
+ query,
410
+ pages: pages.map((c) => ({
411
+ tagName: c.tagName,
412
+ intent: c.intent,
413
+ canonicalUsage: c.canonicalUsage,
414
+ paths: c.paths,
415
+ })),
416
+ recipeComponents: recipeComponents.map((c) => ({
417
+ tagName: c.tagName,
418
+ intent: c.intent,
419
+ canonicalUsage: c.canonicalUsage,
420
+ overridableSurface: c.overridableSurface,
421
+ })),
422
+ components: otherComponents.map((c) => ({
423
+ tagName: c.tagName,
424
+ intent: c.intent,
425
+ atomicLevel: c.atomicLevel,
426
+ })),
427
+ recipes: results.recipes.slice(0, 5).map((r) => ({
428
+ name: r.name,
429
+ intent: r.intent,
430
+ status: r.status,
431
+ })),
432
+ };
433
+ if (results.boilerplates.length > 0) {
434
+ response.boilerplates = results.boilerplates.map((b) => ({
435
+ name: b.name,
436
+ slug: b.slug,
437
+ description: b.description,
438
+ stack: b.stack,
439
+ useCase: b.useCase,
440
+ }));
441
+ }
442
+ return {
443
+ content: [
444
+ {
445
+ type: 'text',
446
+ text: JSON.stringify(response, null, 2),
447
+ },
448
+ ],
449
+ };
450
+ });
451
+ // =========================================================================
452
+ // Tool: eddie_list_pages
453
+ // =========================================================================
454
+ //
455
+ // Dedicated page-discovery surface. Pages are the canonical "working
456
+ // draft" starting point for new BFW projects, and they should be the FIRST
457
+ // call an agent makes when starting a new page surface — before dropping
458
+ // to recipes or primitives. See #610 for why this is a separate tool.
459
+ server.tool('eddie_list_pages', 'List all Eddie page templates (ed-p-*). Pages are full reference compositions — the recommended starting point for any new BFW project page. Call this before building from primitives.', {
460
+ scope: z
461
+ .enum(['common', 'all'])
462
+ .optional()
463
+ .describe('Optional: "common" (default) returns framework-agnostic page templates; "all" includes project-specific pages (we-are-here, etc.)'),
464
+ }, async ({ scope }) => {
465
+ if (!knowledgeGraph)
466
+ throw new Error('Knowledge graph not initialized.');
467
+ const all = knowledgeGraph.componentIndex.getByAtomicLevel('page');
468
+ const resolvedScope = scope ?? 'common';
469
+ // Common pages live under packages/eddie-pages/pages/common/
470
+ // Project-specific ones live under packages/eddie-pages/pages/<project>/
471
+ const filtered = resolvedScope === 'common'
472
+ ? all.filter((p) => p.paths.component.startsWith('pages/common/'))
473
+ : all;
474
+ return {
475
+ content: [
476
+ {
477
+ type: 'text',
478
+ text: JSON.stringify({
479
+ scope: resolvedScope,
480
+ count: filtered.length,
481
+ pages: filtered.map((p) => ({
482
+ tagName: p.tagName,
483
+ displayName: p.displayName,
484
+ intent: p.intent,
485
+ canonicalUsage: p.canonicalUsage,
486
+ overridableSurface: p.overridableSurface,
487
+ guidelines: {
488
+ use: p.guidelines.use,
489
+ dontUse: p.guidelines.dontUse,
490
+ },
491
+ paths: p.paths,
492
+ })),
493
+ }, null, 2),
494
+ },
495
+ ],
496
+ };
497
+ });
498
+ // =========================================================================
499
+ // Tool: eddie_suggest_fix
500
+ // =========================================================================
501
+ server.tool('eddie_suggest_fix', 'Get a suggested fix for a validation issue. Provide the issue type and file location.', {
502
+ issue_type: z.string().describe('Issue type (e.g. "token-raw-hex", "naming-unclassed")'),
503
+ file: z.string().describe('File path where the issue was found'),
504
+ line: z.number().optional().describe('Line number of the issue'),
505
+ }, async ({ issue_type, file, line }) => {
506
+ const suggestions = {
507
+ 'token-raw-hex': 'Replace the raw hex color with an Eddie token. Use --ed-theme-color-* tokens. Check `eddie_search` with the color context (e.g. "background", "text", "border") to find the right token.',
508
+ 'token-raw-px': 'Replace raw pixel value with --ed-spacing-* token. Available: --ed-spacing-2xs, --ed-spacing-xs, --ed-spacing-sm, --ed-spacing-md, --ed-spacing-lg, --ed-spacing-xl, --ed-spacing-2xl.',
509
+ 'token-wrong-tier': 'Use semantic (tier 2) tokens (--ed-theme-*) instead of definition (tier 1) tokens. Tier 1 tokens are primitives and should never be used directly in components.',
510
+ 'token-intent-mismatch': 'The token category does not match the CSS property. Use a background token for background properties, a content/text token for color properties, etc.',
511
+ 'token-deprecated': 'This token is deprecated. Search for its replacement using `eddie_search` or check docs/TOKENS.md.',
512
+ 'naming-unclassed': 'Add a BEM class to this element. Component elements use ed-c-{component}__{element} pattern. Layout uses ed-l-*, utilities use ed-u-*.',
513
+ 'naming-invalid-prefix': 'Class names must start with a valid Eddie prefix: ed-c- (component), ed-l- (layout), ed-u- (utility), ed-r- (recipe), or is-/has- (state).',
514
+ 'naming-bad-bem': 'Class does not follow BEM structure. Format: ed-c-block__element--modifier. Use double underscore for elements, double dash for modifiers.',
515
+ };
516
+ const suggestion = suggestions[issue_type] || 'Review docs/CODE_GUIDELINES.md for conventions.';
517
+ return {
518
+ content: [
519
+ {
520
+ type: 'text',
521
+ text: JSON.stringify({
522
+ issue_type,
523
+ file,
524
+ line: line ?? 'unknown',
525
+ suggestion,
526
+ references: [
527
+ 'docs/CODE_GUIDELINES.md — BEM naming and component conventions',
528
+ 'docs/TOKENS.md — Token naming tiers and categories',
529
+ 'docs/THEMING.md — Theme structure and accent color tokens',
530
+ ],
531
+ }, null, 2),
532
+ },
533
+ ],
534
+ };
535
+ });
536
+ // =========================================================================
537
+ // Tool: eddie_record_feedback
538
+ // =========================================================================
539
+ server.tool('eddie_record_feedback', 'Record feedback on a suggestion from eddie_suggest_fix. Call this after acting on (or rejecting) a suggestion so the system learns which suggestion types are most useful.', {
540
+ issue_type: z.string().describe('The issue type that was suggested (e.g. "token-raw-hex", "naming-unclassed")'),
541
+ file: z.string().describe('File path the suggestion applied to'),
542
+ action: z.enum(['accepted', 'rejected', 'modified']).describe('What the agent/user did with the suggestion'),
543
+ modification: z.string().optional().describe('If modified, what was done instead'),
544
+ notes: z.string().optional().describe('Optional notes explaining why'),
545
+ }, async ({ issue_type, file, action, modification, notes }) => {
546
+ const entry = {
547
+ id: `learning-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
548
+ timestamp: new Date().toISOString(),
549
+ suggestion: {
550
+ type: issue_type,
551
+ target: file,
552
+ proposed: `Fix ${issue_type} issue`,
553
+ },
554
+ decision: action,
555
+ modification: modification,
556
+ reason: notes,
557
+ tags: [issue_type, action],
558
+ };
559
+ learningHistory.record(entry);
560
+ learningHistory.save(learningPath);
561
+ const stats = learningHistory.getStats();
562
+ console.error(`[eddie-brain] feedback recorded: ${action} for ${issue_type} in ${file} (total: ${stats.totalSuggestions})`);
563
+ return {
564
+ content: [
565
+ {
566
+ type: 'text',
567
+ text: JSON.stringify({
568
+ recorded: true,
569
+ entry: {
570
+ id: entry.id,
571
+ issue_type,
572
+ file,
573
+ action,
574
+ timestamp: entry.timestamp,
575
+ },
576
+ stats: {
577
+ totalSuggestions: stats.totalSuggestions,
578
+ acceptanceRate: Math.round(stats.acceptanceRate * 100) + '%',
579
+ rejectionRate: Math.round(stats.rejectionRate * 100) + '%',
580
+ modificationRate: Math.round(stats.modificationRate * 100) + '%',
581
+ mostAcceptedType: stats.mostAcceptedType,
582
+ mostRejectedType: stats.mostRejectedType,
583
+ },
584
+ }, null, 2),
585
+ },
586
+ ],
587
+ };
588
+ });
589
+ // Start server
590
+ const transport = new StdioServerTransport();
591
+ await server.connect(transport);
592
+ }
593
+ /**
594
+ * Walk up from cwd to find the monorepo root (where .eddie-brain lives),
595
+ * or use EDDIE_ROOT env var if set.
596
+ */
597
+ function resolveRootDir() {
598
+ if (process.env.EDDIE_ROOT) {
599
+ return resolve(process.env.EDDIE_ROOT);
600
+ }
601
+ let dir = process.cwd();
602
+ while (dir !== '/') {
603
+ if (existsSync(join(dir, '.eddie-brain'))) {
604
+ return dir;
605
+ }
606
+ if (existsSync(join(dir, 'packages', 'eddie-brain'))) {
607
+ return dir;
608
+ }
609
+ dir = resolve(dir, '..');
610
+ }
611
+ return process.cwd();
612
+ }
613
+ // Run server
614
+ main().catch((err) => {
615
+ console.error('Server error:', err);
616
+ process.exit(1);
617
+ });
618
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}