neuronlayer 0.1.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/CONTRIBUTING.md +127 -0
- package/LICENSE +21 -0
- package/README.md +305 -0
- package/dist/index.js +38016 -0
- package/esbuild.config.js +26 -0
- package/package.json +63 -0
- package/src/cli/commands.ts +382 -0
- package/src/core/adr-exporter.ts +253 -0
- package/src/core/architecture/architecture-enforcement.ts +228 -0
- package/src/core/architecture/duplicate-detector.ts +288 -0
- package/src/core/architecture/index.ts +6 -0
- package/src/core/architecture/pattern-learner.ts +306 -0
- package/src/core/architecture/pattern-library.ts +403 -0
- package/src/core/architecture/pattern-validator.ts +324 -0
- package/src/core/change-intelligence/bug-correlator.ts +444 -0
- package/src/core/change-intelligence/change-intelligence.ts +221 -0
- package/src/core/change-intelligence/change-tracker.ts +334 -0
- package/src/core/change-intelligence/fix-suggester.ts +340 -0
- package/src/core/change-intelligence/index.ts +5 -0
- package/src/core/code-verifier.ts +843 -0
- package/src/core/confidence/confidence-scorer.ts +251 -0
- package/src/core/confidence/conflict-checker.ts +289 -0
- package/src/core/confidence/index.ts +5 -0
- package/src/core/confidence/source-tracker.ts +263 -0
- package/src/core/confidence/warning-detector.ts +241 -0
- package/src/core/context-rot/compaction.ts +284 -0
- package/src/core/context-rot/context-health.ts +243 -0
- package/src/core/context-rot/context-rot-prevention.ts +213 -0
- package/src/core/context-rot/critical-context.ts +221 -0
- package/src/core/context-rot/drift-detector.ts +255 -0
- package/src/core/context-rot/index.ts +7 -0
- package/src/core/context.ts +263 -0
- package/src/core/decision-extractor.ts +339 -0
- package/src/core/decisions.ts +69 -0
- package/src/core/deja-vu.ts +421 -0
- package/src/core/engine.ts +1455 -0
- package/src/core/feature-context.ts +726 -0
- package/src/core/ghost-mode.ts +412 -0
- package/src/core/learning.ts +485 -0
- package/src/core/living-docs/activity-tracker.ts +296 -0
- package/src/core/living-docs/architecture-generator.ts +428 -0
- package/src/core/living-docs/changelog-generator.ts +348 -0
- package/src/core/living-docs/component-generator.ts +230 -0
- package/src/core/living-docs/doc-engine.ts +110 -0
- package/src/core/living-docs/doc-validator.ts +282 -0
- package/src/core/living-docs/index.ts +8 -0
- package/src/core/project-manager.ts +297 -0
- package/src/core/summarizer.ts +267 -0
- package/src/core/test-awareness/change-validator.ts +499 -0
- package/src/core/test-awareness/index.ts +5 -0
- package/src/index.ts +49 -0
- package/src/indexing/ast.ts +563 -0
- package/src/indexing/embeddings.ts +85 -0
- package/src/indexing/indexer.ts +245 -0
- package/src/indexing/watcher.ts +78 -0
- package/src/server/gateways/aggregator.ts +374 -0
- package/src/server/gateways/index.ts +473 -0
- package/src/server/gateways/memory-ghost.ts +343 -0
- package/src/server/gateways/memory-query.ts +452 -0
- package/src/server/gateways/memory-record.ts +346 -0
- package/src/server/gateways/memory-review.ts +410 -0
- package/src/server/gateways/memory-status.ts +517 -0
- package/src/server/gateways/memory-verify.ts +392 -0
- package/src/server/gateways/router.ts +434 -0
- package/src/server/gateways/types.ts +610 -0
- package/src/server/mcp.ts +154 -0
- package/src/server/resources.ts +85 -0
- package/src/server/tools.ts +2261 -0
- package/src/storage/database.ts +262 -0
- package/src/storage/tier1.ts +135 -0
- package/src/storage/tier2.ts +764 -0
- package/src/storage/tier3.ts +123 -0
- package/src/types/documentation.ts +619 -0
- package/src/types/index.ts +222 -0
- package/src/utils/config.ts +193 -0
- package/src/utils/files.ts +117 -0
- package/src/utils/time.ts +37 -0
- package/src/utils/tokens.ts +52 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import {
|
|
4
|
+
CallToolRequestSchema,
|
|
5
|
+
ListToolsRequestSchema,
|
|
6
|
+
ListResourcesRequestSchema,
|
|
7
|
+
ReadResourceRequestSchema,
|
|
8
|
+
} from '@modelcontextprotocol/sdk/types.js';
|
|
9
|
+
import { MemoryLayerEngine } from '../core/engine.js';
|
|
10
|
+
import {
|
|
11
|
+
allToolDefinitions,
|
|
12
|
+
handleGatewayCall,
|
|
13
|
+
isGatewayTool,
|
|
14
|
+
} from './gateways/index.js';
|
|
15
|
+
import { handleToolCall } from './tools.js';
|
|
16
|
+
import { resourceDefinitions, handleResourceRead } from './resources.js';
|
|
17
|
+
import type { MemoryLayerConfig } from '../types/index.js';
|
|
18
|
+
|
|
19
|
+
export class MCPServer {
|
|
20
|
+
private server: Server;
|
|
21
|
+
private engine: MemoryLayerEngine;
|
|
22
|
+
|
|
23
|
+
constructor(config: MemoryLayerConfig) {
|
|
24
|
+
this.engine = new MemoryLayerEngine(config);
|
|
25
|
+
|
|
26
|
+
this.server = new Server(
|
|
27
|
+
{
|
|
28
|
+
name: 'memorylayer',
|
|
29
|
+
version: '0.1.0'
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
capabilities: {
|
|
33
|
+
tools: {},
|
|
34
|
+
resources: {}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
this.setupHandlers();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
private setupHandlers(): void {
|
|
43
|
+
// List available tools - now using gateway pattern (10 tools instead of 51)
|
|
44
|
+
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
45
|
+
return {
|
|
46
|
+
tools: allToolDefinitions.map(t => ({
|
|
47
|
+
name: t.name,
|
|
48
|
+
description: t.description,
|
|
49
|
+
inputSchema: t.inputSchema
|
|
50
|
+
}))
|
|
51
|
+
};
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// Handle tool calls - route to gateways or standalone handlers
|
|
55
|
+
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
56
|
+
const { name, arguments: args } = request.params;
|
|
57
|
+
|
|
58
|
+
try {
|
|
59
|
+
let result;
|
|
60
|
+
|
|
61
|
+
// Check if it's a gateway tool
|
|
62
|
+
if (isGatewayTool(name)) {
|
|
63
|
+
result = await handleGatewayCall(this.engine, name, args || {});
|
|
64
|
+
} else {
|
|
65
|
+
// Standalone tools route to existing handler
|
|
66
|
+
result = await handleToolCall(this.engine, name, args || {});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return {
|
|
70
|
+
content: [
|
|
71
|
+
{
|
|
72
|
+
type: 'text',
|
|
73
|
+
text: JSON.stringify(result, null, 2)
|
|
74
|
+
}
|
|
75
|
+
]
|
|
76
|
+
};
|
|
77
|
+
} catch (error) {
|
|
78
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
79
|
+
return {
|
|
80
|
+
content: [
|
|
81
|
+
{
|
|
82
|
+
type: 'text',
|
|
83
|
+
text: JSON.stringify({ error: errorMessage })
|
|
84
|
+
}
|
|
85
|
+
],
|
|
86
|
+
isError: true
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
// List available resources
|
|
92
|
+
this.server.setRequestHandler(ListResourcesRequestSchema, async () => {
|
|
93
|
+
return {
|
|
94
|
+
resources: resourceDefinitions.map(r => ({
|
|
95
|
+
uri: r.uri,
|
|
96
|
+
name: r.name,
|
|
97
|
+
description: r.description,
|
|
98
|
+
mimeType: r.mimeType
|
|
99
|
+
}))
|
|
100
|
+
};
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// Read resource content
|
|
104
|
+
this.server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
105
|
+
const { uri } = request.params;
|
|
106
|
+
|
|
107
|
+
try {
|
|
108
|
+
const result = await handleResourceRead(this.engine, uri);
|
|
109
|
+
|
|
110
|
+
return {
|
|
111
|
+
contents: [
|
|
112
|
+
{
|
|
113
|
+
uri,
|
|
114
|
+
mimeType: result.mimeType,
|
|
115
|
+
text: result.contents
|
|
116
|
+
}
|
|
117
|
+
]
|
|
118
|
+
};
|
|
119
|
+
} catch (error) {
|
|
120
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
121
|
+
throw new Error(errorMessage);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
async start(): Promise<void> {
|
|
127
|
+
// Connect to stdio transport FIRST (so we can respond to MCP immediately)
|
|
128
|
+
const transport = new StdioServerTransport();
|
|
129
|
+
await this.server.connect(transport);
|
|
130
|
+
|
|
131
|
+
console.error('MemoryLayer MCP server started');
|
|
132
|
+
|
|
133
|
+
// Initialize the engine in the background (indexing, etc.)
|
|
134
|
+
// This allows MCP to respond while indexing happens
|
|
135
|
+
this.engine.initialize().catch(err => {
|
|
136
|
+
console.error('Engine initialization error:', err);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
// Handle shutdown
|
|
140
|
+
process.on('SIGINT', () => {
|
|
141
|
+
this.shutdown();
|
|
142
|
+
process.exit(0);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
process.on('SIGTERM', () => {
|
|
146
|
+
this.shutdown();
|
|
147
|
+
process.exit(0);
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
shutdown(): void {
|
|
152
|
+
this.engine.shutdown();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { MemoryLayerEngine } from '../core/engine.js';
|
|
2
|
+
|
|
3
|
+
export interface ResourceDefinition {
|
|
4
|
+
uri: string;
|
|
5
|
+
name: string;
|
|
6
|
+
description: string;
|
|
7
|
+
mimeType: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const resourceDefinitions: ResourceDefinition[] = [
|
|
11
|
+
{
|
|
12
|
+
uri: 'memorylayer://decisions/recent',
|
|
13
|
+
name: 'Recent Decisions',
|
|
14
|
+
description: 'Last 10 architectural decisions made in this project',
|
|
15
|
+
mimeType: 'application/json'
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
uri: 'memorylayer://project/overview',
|
|
19
|
+
name: 'Project Overview',
|
|
20
|
+
description: 'High-level project summary including languages, files, and structure',
|
|
21
|
+
mimeType: 'text/markdown'
|
|
22
|
+
}
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
export async function handleResourceRead(
|
|
26
|
+
engine: MemoryLayerEngine,
|
|
27
|
+
uri: string
|
|
28
|
+
): Promise<{ contents: string; mimeType: string }> {
|
|
29
|
+
switch (uri) {
|
|
30
|
+
case 'memorylayer://decisions/recent': {
|
|
31
|
+
const decisions = engine.getRecentDecisions(10);
|
|
32
|
+
|
|
33
|
+
const contents = JSON.stringify(
|
|
34
|
+
decisions.map(d => ({
|
|
35
|
+
id: d.id,
|
|
36
|
+
title: d.title,
|
|
37
|
+
description: d.description,
|
|
38
|
+
files: d.files,
|
|
39
|
+
tags: d.tags,
|
|
40
|
+
created_at: d.createdAt.toISOString()
|
|
41
|
+
})),
|
|
42
|
+
null,
|
|
43
|
+
2
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
return { contents, mimeType: 'application/json' };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
case 'memorylayer://project/overview': {
|
|
50
|
+
const summary = engine.getProjectSummary();
|
|
51
|
+
|
|
52
|
+
const markdown = `# ${summary.name}
|
|
53
|
+
|
|
54
|
+
${summary.description || 'No description available.'}
|
|
55
|
+
|
|
56
|
+
## Statistics
|
|
57
|
+
- **Total Files**: ${summary.totalFiles}
|
|
58
|
+
- **Total Lines**: ${summary.totalLines.toLocaleString()}
|
|
59
|
+
- **Languages**: ${summary.languages.join(', ') || 'Unknown'}
|
|
60
|
+
|
|
61
|
+
## Key Directories
|
|
62
|
+
${summary.keyDirectories.map(d => `- \`${d}/\``).join('\n') || 'None detected'}
|
|
63
|
+
|
|
64
|
+
## Dependencies
|
|
65
|
+
${summary.dependencies.slice(0, 10).map(d => `- ${d}`).join('\n') || 'None detected'}
|
|
66
|
+
${summary.dependencies.length > 10 ? `\n... and ${summary.dependencies.length - 10} more` : ''}
|
|
67
|
+
|
|
68
|
+
## Recent Decisions
|
|
69
|
+
${summary.recentDecisions.length > 0
|
|
70
|
+
? summary.recentDecisions.map(d => `### ${d.title}
|
|
71
|
+
${d.description}
|
|
72
|
+
_${d.createdAt.toLocaleDateString()}_
|
|
73
|
+
`).join('\n')
|
|
74
|
+
: 'No decisions recorded yet.'}
|
|
75
|
+
|
|
76
|
+
${summary.architectureNotes ? `## Architecture Notes\n${summary.architectureNotes}` : ''}
|
|
77
|
+
`;
|
|
78
|
+
|
|
79
|
+
return { contents: markdown, mimeType: 'text/markdown' };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
default:
|
|
83
|
+
throw new Error(`Unknown resource: ${uri}`);
|
|
84
|
+
}
|
|
85
|
+
}
|