@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.
- package/README.md +109 -0
- package/dist/analyze/drift-detector.d.ts +30 -0
- package/dist/analyze/drift-detector.d.ts.map +1 -0
- package/dist/analyze/drift-detector.js +310 -0
- package/dist/analyze/drift-detector.js.map +1 -0
- package/dist/analyze/health-scorer.d.ts +71 -0
- package/dist/analyze/health-scorer.d.ts.map +1 -0
- package/dist/analyze/health-scorer.js +420 -0
- package/dist/analyze/health-scorer.js.map +1 -0
- package/dist/analyze/index.d.ts +11 -0
- package/dist/analyze/index.d.ts.map +1 -0
- package/dist/analyze/index.js +11 -0
- package/dist/analyze/index.js.map +1 -0
- package/dist/analyze/naming-validator.d.ts +99 -0
- package/dist/analyze/naming-validator.d.ts.map +1 -0
- package/dist/analyze/naming-validator.js +430 -0
- package/dist/analyze/naming-validator.js.map +1 -0
- package/dist/analyze/slot-contract-validator.d.ts +68 -0
- package/dist/analyze/slot-contract-validator.d.ts.map +1 -0
- package/dist/analyze/slot-contract-validator.js +232 -0
- package/dist/analyze/slot-contract-validator.js.map +1 -0
- package/dist/analyze/token-validator.d.ts +62 -0
- package/dist/analyze/token-validator.d.ts.map +1 -0
- package/dist/analyze/token-validator.js +348 -0
- package/dist/analyze/token-validator.js.map +1 -0
- package/dist/cli/brain.d.ts +12 -0
- package/dist/cli/brain.d.ts.map +1 -0
- package/dist/cli/brain.js +641 -0
- package/dist/cli/brain.js.map +1 -0
- package/dist/cli/formatters/json.d.ts +15 -0
- package/dist/cli/formatters/json.d.ts.map +1 -0
- package/dist/cli/formatters/json.js +18 -0
- package/dist/cli/formatters/json.js.map +1 -0
- package/dist/cli/formatters/terminal.d.ts +19 -0
- package/dist/cli/formatters/terminal.d.ts.map +1 -0
- package/dist/cli/formatters/terminal.js +125 -0
- package/dist/cli/formatters/terminal.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +7 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/data/governance-rules.json +94 -0
- package/dist/governance/audit-log.d.ts +17 -0
- package/dist/governance/audit-log.d.ts.map +1 -0
- package/dist/governance/audit-log.js +44 -0
- package/dist/governance/audit-log.js.map +1 -0
- package/dist/governance/index.d.ts +8 -0
- package/dist/governance/index.d.ts.map +1 -0
- package/dist/governance/index.js +8 -0
- package/dist/governance/index.js.map +1 -0
- package/dist/governance/permissions.d.ts +26 -0
- package/dist/governance/permissions.d.ts.map +1 -0
- package/dist/governance/permissions.js +75 -0
- package/dist/governance/permissions.js.map +1 -0
- package/dist/governance/rules-engine.d.ts +24 -0
- package/dist/governance/rules-engine.d.ts.map +1 -0
- package/dist/governance/rules-engine.js +111 -0
- package/dist/governance/rules-engine.js.map +1 -0
- package/dist/governance/trust-manager.d.ts +34 -0
- package/dist/governance/trust-manager.d.ts.map +1 -0
- package/dist/governance/trust-manager.js +148 -0
- package/dist/governance/trust-manager.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge-graph/component-index.d.ts +320 -0
- package/dist/knowledge-graph/component-index.d.ts.map +1 -0
- package/dist/knowledge-graph/component-index.js +1033 -0
- package/dist/knowledge-graph/component-index.js.map +1 -0
- package/dist/knowledge-graph/index.d.ts +134 -0
- package/dist/knowledge-graph/index.d.ts.map +1 -0
- package/dist/knowledge-graph/index.js +249 -0
- package/dist/knowledge-graph/index.js.map +1 -0
- package/dist/knowledge-graph/learning-history.d.ts +77 -0
- package/dist/knowledge-graph/learning-history.d.ts.map +1 -0
- package/dist/knowledge-graph/learning-history.js +187 -0
- package/dist/knowledge-graph/learning-history.js.map +1 -0
- package/dist/knowledge-graph/relationship-map.d.ts +55 -0
- package/dist/knowledge-graph/relationship-map.d.ts.map +1 -0
- package/dist/knowledge-graph/relationship-map.js +238 -0
- package/dist/knowledge-graph/relationship-map.js.map +1 -0
- package/dist/knowledge-graph/token-taxonomy.d.ts +127 -0
- package/dist/knowledge-graph/token-taxonomy.d.ts.map +1 -0
- package/dist/knowledge-graph/token-taxonomy.js +357 -0
- package/dist/knowledge-graph/token-taxonomy.js.map +1 -0
- package/dist/loop/fix-agent.d.ts +55 -0
- package/dist/loop/fix-agent.d.ts.map +1 -0
- package/dist/loop/fix-agent.js +344 -0
- package/dist/loop/fix-agent.js.map +1 -0
- package/dist/loop/index.d.ts +8 -0
- package/dist/loop/index.d.ts.map +1 -0
- package/dist/loop/index.js +8 -0
- package/dist/loop/index.js.map +1 -0
- package/dist/loop/issue-fetcher.d.ts +51 -0
- package/dist/loop/issue-fetcher.d.ts.map +1 -0
- package/dist/loop/issue-fetcher.js +188 -0
- package/dist/loop/issue-fetcher.js.map +1 -0
- package/dist/loop/observer.d.ts +42 -0
- package/dist/loop/observer.d.ts.map +1 -0
- package/dist/loop/observer.js +220 -0
- package/dist/loop/observer.js.map +1 -0
- package/dist/loop/pacer.d.ts +44 -0
- package/dist/loop/pacer.d.ts.map +1 -0
- package/dist/loop/pacer.js +90 -0
- package/dist/loop/pacer.js.map +1 -0
- package/dist/loop/reporter.d.ts +9 -0
- package/dist/loop/reporter.d.ts.map +1 -0
- package/dist/loop/reporter.js +119 -0
- package/dist/loop/reporter.js.map +1 -0
- package/dist/loop/runner.d.ts +57 -0
- package/dist/loop/runner.d.ts.map +1 -0
- package/dist/loop/runner.js +390 -0
- package/dist/loop/runner.js.map +1 -0
- package/dist/loop/types.d.ts +151 -0
- package/dist/loop/types.d.ts.map +1 -0
- package/dist/loop/types.js +22 -0
- package/dist/loop/types.js.map +1 -0
- package/dist/mcp/index.d.ts +7 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +7 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +12 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +618 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/pipeline/agent-runner.d.ts +34 -0
- package/dist/pipeline/agent-runner.d.ts.map +1 -0
- package/dist/pipeline/agent-runner.js +323 -0
- package/dist/pipeline/agent-runner.js.map +1 -0
- package/dist/pipeline/agents/accessibility-auditor.d.ts +10 -0
- package/dist/pipeline/agents/accessibility-auditor.d.ts.map +1 -0
- package/dist/pipeline/agents/accessibility-auditor.js +69 -0
- package/dist/pipeline/agents/accessibility-auditor.js.map +1 -0
- package/dist/pipeline/agents/code-reviewer.d.ts +10 -0
- package/dist/pipeline/agents/code-reviewer.d.ts.map +1 -0
- package/dist/pipeline/agents/code-reviewer.js +75 -0
- package/dist/pipeline/agents/code-reviewer.js.map +1 -0
- package/dist/pipeline/agents/code-writer.d.ts +10 -0
- package/dist/pipeline/agents/code-writer.d.ts.map +1 -0
- package/dist/pipeline/agents/code-writer.js +103 -0
- package/dist/pipeline/agents/code-writer.js.map +1 -0
- package/dist/pipeline/agents/component-architect.d.ts +13 -0
- package/dist/pipeline/agents/component-architect.d.ts.map +1 -0
- package/dist/pipeline/agents/component-architect.js +81 -0
- package/dist/pipeline/agents/component-architect.js.map +1 -0
- package/dist/pipeline/agents/index.d.ts +16 -0
- package/dist/pipeline/agents/index.d.ts.map +1 -0
- package/dist/pipeline/agents/index.js +24 -0
- package/dist/pipeline/agents/index.js.map +1 -0
- package/dist/pipeline/agents/library-researcher.d.ts +12 -0
- package/dist/pipeline/agents/library-researcher.d.ts.map +1 -0
- package/dist/pipeline/agents/library-researcher.js +85 -0
- package/dist/pipeline/agents/library-researcher.js.map +1 -0
- package/dist/pipeline/agents/quality-gate.d.ts +9 -0
- package/dist/pipeline/agents/quality-gate.d.ts.map +1 -0
- package/dist/pipeline/agents/quality-gate.js +71 -0
- package/dist/pipeline/agents/quality-gate.js.map +1 -0
- package/dist/pipeline/agents/spec-analyst.d.ts +10 -0
- package/dist/pipeline/agents/spec-analyst.d.ts.map +1 -0
- package/dist/pipeline/agents/spec-analyst.js +72 -0
- package/dist/pipeline/agents/spec-analyst.js.map +1 -0
- package/dist/pipeline/agents/story-author.d.ts +9 -0
- package/dist/pipeline/agents/story-author.d.ts.map +1 -0
- package/dist/pipeline/agents/story-author.js +65 -0
- package/dist/pipeline/agents/story-author.js.map +1 -0
- package/dist/pipeline/artifact-store.d.ts +27 -0
- package/dist/pipeline/artifact-store.d.ts.map +1 -0
- package/dist/pipeline/artifact-store.js +77 -0
- package/dist/pipeline/artifact-store.js.map +1 -0
- package/dist/pipeline/conversational-gate.d.ts +26 -0
- package/dist/pipeline/conversational-gate.d.ts.map +1 -0
- package/dist/pipeline/conversational-gate.js +122 -0
- package/dist/pipeline/conversational-gate.js.map +1 -0
- package/dist/pipeline/index.d.ts +14 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +17 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/iteration-tracker.d.ts +29 -0
- package/dist/pipeline/iteration-tracker.d.ts.map +1 -0
- package/dist/pipeline/iteration-tracker.js +102 -0
- package/dist/pipeline/iteration-tracker.js.map +1 -0
- package/dist/pipeline/learning-bridge.d.ts +37 -0
- package/dist/pipeline/learning-bridge.d.ts.map +1 -0
- package/dist/pipeline/learning-bridge.js +118 -0
- package/dist/pipeline/learning-bridge.js.map +1 -0
- package/dist/pipeline/orchestrator.d.ts +45 -0
- package/dist/pipeline/orchestrator.d.ts.map +1 -0
- package/dist/pipeline/orchestrator.js +473 -0
- package/dist/pipeline/orchestrator.js.map +1 -0
- package/dist/pipeline/templates/architecture.d.ts +27 -0
- package/dist/pipeline/templates/architecture.d.ts.map +1 -0
- package/dist/pipeline/templates/architecture.js +111 -0
- package/dist/pipeline/templates/architecture.js.map +1 -0
- package/dist/pipeline/templates/brief.d.ts +22 -0
- package/dist/pipeline/templates/brief.d.ts.map +1 -0
- package/dist/pipeline/templates/brief.js +121 -0
- package/dist/pipeline/templates/brief.js.map +1 -0
- package/dist/pipeline/templates/component-rules.d.ts +25 -0
- package/dist/pipeline/templates/component-rules.d.ts.map +1 -0
- package/dist/pipeline/templates/component-rules.js +93 -0
- package/dist/pipeline/templates/component-rules.js.map +1 -0
- package/dist/pipeline/templates/index.d.ts +9 -0
- package/dist/pipeline/templates/index.d.ts.map +1 -0
- package/dist/pipeline/templates/index.js +7 -0
- package/dist/pipeline/templates/index.js.map +1 -0
- package/dist/pipeline/tool-handler.d.ts +25 -0
- package/dist/pipeline/tool-handler.d.ts.map +1 -0
- package/dist/pipeline/tool-handler.js +392 -0
- package/dist/pipeline/tool-handler.js.map +1 -0
- package/dist/pipeline/types.d.ts +146 -0
- package/dist/pipeline/types.d.ts.map +1 -0
- package/dist/pipeline/types.js +27 -0
- package/dist/pipeline/types.js.map +1 -0
- package/dist/plan/action-types.d.ts +31 -0
- package/dist/plan/action-types.d.ts.map +1 -0
- package/dist/plan/action-types.js +83 -0
- package/dist/plan/action-types.js.map +1 -0
- package/dist/plan/decision-engine.d.ts +57 -0
- package/dist/plan/decision-engine.d.ts.map +1 -0
- package/dist/plan/decision-engine.js +162 -0
- package/dist/plan/decision-engine.js.map +1 -0
- package/dist/plan/index.d.ts +6 -0
- package/dist/plan/index.d.ts.map +1 -0
- package/dist/plan/index.js +6 -0
- package/dist/plan/index.js.map +1 -0
- package/dist/types.d.ts +351 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +26 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/anthropic.d.ts +15 -0
- package/dist/utils/anthropic.d.ts.map +1 -0
- package/dist/utils/anthropic.js +40 -0
- package/dist/utils/anthropic.js.map +1 -0
- package/dist/utils/id.d.ts +8 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +14 -0
- package/dist/utils/id.js.map +1 -0
- 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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"}
|