claude-conversation-memory-mcp 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/LICENSE +21 -0
- package/README.md +223 -0
- package/dist/ConversationMemory.d.ts +80 -0
- package/dist/ConversationMemory.d.ts.map +1 -0
- package/dist/ConversationMemory.js +203 -0
- package/dist/ConversationMemory.js.map +1 -0
- package/dist/documentation/CodeAnalyzer.d.ts +29 -0
- package/dist/documentation/CodeAnalyzer.d.ts.map +1 -0
- package/dist/documentation/CodeAnalyzer.js +122 -0
- package/dist/documentation/CodeAnalyzer.js.map +1 -0
- package/dist/documentation/ConversationAnalyzer.d.ts +19 -0
- package/dist/documentation/ConversationAnalyzer.d.ts.map +1 -0
- package/dist/documentation/ConversationAnalyzer.js +156 -0
- package/dist/documentation/ConversationAnalyzer.js.map +1 -0
- package/dist/documentation/CrossReferencer.d.ts +67 -0
- package/dist/documentation/CrossReferencer.d.ts.map +1 -0
- package/dist/documentation/CrossReferencer.js +247 -0
- package/dist/documentation/CrossReferencer.js.map +1 -0
- package/dist/documentation/DocumentationGenerator.d.ts +22 -0
- package/dist/documentation/DocumentationGenerator.d.ts.map +1 -0
- package/dist/documentation/DocumentationGenerator.js +57 -0
- package/dist/documentation/DocumentationGenerator.js.map +1 -0
- package/dist/documentation/MarkdownFormatter.d.ts +26 -0
- package/dist/documentation/MarkdownFormatter.d.ts.map +1 -0
- package/dist/documentation/MarkdownFormatter.js +301 -0
- package/dist/documentation/MarkdownFormatter.js.map +1 -0
- package/dist/documentation/types.d.ts +176 -0
- package/dist/documentation/types.d.ts.map +1 -0
- package/dist/documentation/types.js +5 -0
- package/dist/documentation/types.js.map +1 -0
- package/dist/embeddings/EmbeddingConfig.d.ts +39 -0
- package/dist/embeddings/EmbeddingConfig.d.ts.map +1 -0
- package/dist/embeddings/EmbeddingConfig.js +132 -0
- package/dist/embeddings/EmbeddingConfig.js.map +1 -0
- package/dist/embeddings/EmbeddingGenerator.d.ts +45 -0
- package/dist/embeddings/EmbeddingGenerator.d.ts.map +1 -0
- package/dist/embeddings/EmbeddingGenerator.js +129 -0
- package/dist/embeddings/EmbeddingGenerator.js.map +1 -0
- package/dist/embeddings/EmbeddingProvider.d.ts +34 -0
- package/dist/embeddings/EmbeddingProvider.d.ts.map +1 -0
- package/dist/embeddings/EmbeddingProvider.js +6 -0
- package/dist/embeddings/EmbeddingProvider.js.map +1 -0
- package/dist/embeddings/VectorStore.d.ts +75 -0
- package/dist/embeddings/VectorStore.d.ts.map +1 -0
- package/dist/embeddings/VectorStore.js +220 -0
- package/dist/embeddings/VectorStore.js.map +1 -0
- package/dist/embeddings/providers/OllamaEmbeddings.d.ts +38 -0
- package/dist/embeddings/providers/OllamaEmbeddings.d.ts.map +1 -0
- package/dist/embeddings/providers/OllamaEmbeddings.js +132 -0
- package/dist/embeddings/providers/OllamaEmbeddings.js.map +1 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.d.ts +40 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.d.ts.map +1 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.js +128 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.js.map +1 -0
- package/dist/embeddings/providers/TransformersEmbeddings.d.ts +38 -0
- package/dist/embeddings/providers/TransformersEmbeddings.d.ts.map +1 -0
- package/dist/embeddings/providers/TransformersEmbeddings.js +114 -0
- package/dist/embeddings/providers/TransformersEmbeddings.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +127 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/ConversationParser.d.ts +138 -0
- package/dist/parsers/ConversationParser.d.ts.map +1 -0
- package/dist/parsers/ConversationParser.js +325 -0
- package/dist/parsers/ConversationParser.js.map +1 -0
- package/dist/parsers/DecisionExtractor.d.ts +76 -0
- package/dist/parsers/DecisionExtractor.d.ts.map +1 -0
- package/dist/parsers/DecisionExtractor.js +305 -0
- package/dist/parsers/DecisionExtractor.js.map +1 -0
- package/dist/parsers/GitIntegrator.d.ts +71 -0
- package/dist/parsers/GitIntegrator.d.ts.map +1 -0
- package/dist/parsers/GitIntegrator.js +283 -0
- package/dist/parsers/GitIntegrator.js.map +1 -0
- package/dist/parsers/MistakeExtractor.d.ts +86 -0
- package/dist/parsers/MistakeExtractor.d.ts.map +1 -0
- package/dist/parsers/MistakeExtractor.js +341 -0
- package/dist/parsers/MistakeExtractor.js.map +1 -0
- package/dist/parsers/RequirementsExtractor.d.ts +70 -0
- package/dist/parsers/RequirementsExtractor.d.ts.map +1 -0
- package/dist/parsers/RequirementsExtractor.js +252 -0
- package/dist/parsers/RequirementsExtractor.js.map +1 -0
- package/dist/search/SemanticSearch.d.ts +90 -0
- package/dist/search/SemanticSearch.d.ts.map +1 -0
- package/dist/search/SemanticSearch.js +352 -0
- package/dist/search/SemanticSearch.js.map +1 -0
- package/dist/storage/ConversationStorage.d.ts +53 -0
- package/dist/storage/ConversationStorage.d.ts.map +1 -0
- package/dist/storage/ConversationStorage.js +249 -0
- package/dist/storage/ConversationStorage.js.map +1 -0
- package/dist/storage/SQLiteManager.d.ts +88 -0
- package/dist/storage/SQLiteManager.d.ts.map +1 -0
- package/dist/storage/SQLiteManager.js +281 -0
- package/dist/storage/SQLiteManager.js.map +1 -0
- package/dist/storage/migrations.d.ts +54 -0
- package/dist/storage/migrations.d.ts.map +1 -0
- package/dist/storage/migrations.js +153 -0
- package/dist/storage/migrations.js.map +1 -0
- package/dist/storage/schema.sql +321 -0
- package/dist/tools/ToolDefinitions.d.ts +265 -0
- package/dist/tools/ToolDefinitions.d.ts.map +1 -0
- package/dist/tools/ToolDefinitions.js +261 -0
- package/dist/tools/ToolDefinitions.js.map +1 -0
- package/dist/tools/ToolHandlers.d.ts +56 -0
- package/dist/tools/ToolHandlers.d.ts.map +1 -0
- package/dist/tools/ToolHandlers.js +431 -0
- package/dist/tools/ToolHandlers.js.map +1 -0
- package/dist/types/ToolTypes.d.ts +333 -0
- package/dist/types/ToolTypes.d.ts.map +1 -0
- package/dist/types/ToolTypes.js +6 -0
- package/dist/types/ToolTypes.js.map +1 -0
- package/dist/utils/sanitization.d.ts +35 -0
- package/dist/utils/sanitization.d.ts.map +1 -0
- package/dist/utils/sanitization.js +97 -0
- package/dist/utils/sanitization.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CodeAnalyzer - Processes code graph data from CODE-GRAPH-RAG-MCP
|
|
3
|
+
*
|
|
4
|
+
* Note: This class processes data that should be fetched from CODE-GRAPH-RAG-MCP
|
|
5
|
+
* The actual MCP calls should be made by the tool handler and passed to this analyzer
|
|
6
|
+
*/
|
|
7
|
+
export class CodeAnalyzer {
|
|
8
|
+
/**
|
|
9
|
+
* Process code graph data from CODE-GRAPH-RAG-MCP
|
|
10
|
+
*/
|
|
11
|
+
async analyze(codeGraphData) {
|
|
12
|
+
console.log('🔍 Processing codebase structure...');
|
|
13
|
+
const entities = this.parseEntities(codeGraphData.entities || []);
|
|
14
|
+
const files = this.groupEntitiesByFile(entities);
|
|
15
|
+
const hotspots = this.parseHotspots(codeGraphData.hotspots || []);
|
|
16
|
+
const clones = this.parseClones(codeGraphData.clones || []);
|
|
17
|
+
console.log(` Found ${entities.length} entities in ${files.length} files`);
|
|
18
|
+
return {
|
|
19
|
+
entities,
|
|
20
|
+
relationships: [],
|
|
21
|
+
files,
|
|
22
|
+
hotspots,
|
|
23
|
+
clones
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
parseEntities(rawEntities) {
|
|
27
|
+
if (!Array.isArray(rawEntities)) {
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
return rawEntities.map(entity => ({
|
|
31
|
+
id: entity.id || entity.name || '',
|
|
32
|
+
name: entity.name || '',
|
|
33
|
+
type: this.normalizeEntityType(entity.type || ''),
|
|
34
|
+
filePath: entity.filePath || entity.file || '',
|
|
35
|
+
lineNumber: entity.lineNumber || entity.line,
|
|
36
|
+
complexity: entity.complexity,
|
|
37
|
+
description: entity.description
|
|
38
|
+
})).filter(e => e.id && e.name);
|
|
39
|
+
}
|
|
40
|
+
normalizeEntityType(type) {
|
|
41
|
+
const normalized = (type || '').toLowerCase();
|
|
42
|
+
if (normalized.includes('class')) {
|
|
43
|
+
return 'class';
|
|
44
|
+
}
|
|
45
|
+
if (normalized.includes('function') || normalized.includes('method')) {
|
|
46
|
+
return 'function';
|
|
47
|
+
}
|
|
48
|
+
if (normalized.includes('interface')) {
|
|
49
|
+
return 'interface';
|
|
50
|
+
}
|
|
51
|
+
if (normalized.includes('module')) {
|
|
52
|
+
return 'module';
|
|
53
|
+
}
|
|
54
|
+
if (normalized.includes('component')) {
|
|
55
|
+
return 'component';
|
|
56
|
+
}
|
|
57
|
+
return 'function';
|
|
58
|
+
}
|
|
59
|
+
groupEntitiesByFile(entities) {
|
|
60
|
+
const fileMap = new Map();
|
|
61
|
+
for (const entity of entities) {
|
|
62
|
+
if (!entity.filePath) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (!fileMap.has(entity.filePath)) {
|
|
66
|
+
fileMap.set(entity.filePath, []);
|
|
67
|
+
}
|
|
68
|
+
const fileEntities = fileMap.get(entity.filePath);
|
|
69
|
+
if (fileEntities) {
|
|
70
|
+
fileEntities.push(entity);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return Array.from(fileMap.entries()).map(([path, entities]) => ({
|
|
74
|
+
path,
|
|
75
|
+
size: 0, // Would need to read file to get actual size
|
|
76
|
+
entities
|
|
77
|
+
}));
|
|
78
|
+
}
|
|
79
|
+
parseHotspots(rawHotspots) {
|
|
80
|
+
if (!Array.isArray(rawHotspots)) {
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
return rawHotspots.map(h => ({
|
|
84
|
+
filePath: h.filePath || h.file || h.path || '',
|
|
85
|
+
complexity: h.complexity || h.score || 0,
|
|
86
|
+
changeCount: h.changeCount || h.changes || 0,
|
|
87
|
+
metric: h.metric || 'complexity'
|
|
88
|
+
})).filter(h => h.filePath);
|
|
89
|
+
}
|
|
90
|
+
parseClones(rawClones) {
|
|
91
|
+
if (!Array.isArray(rawClones)) {
|
|
92
|
+
return [];
|
|
93
|
+
}
|
|
94
|
+
return rawClones.map(c => ({
|
|
95
|
+
files: Array.isArray(c.files) ? c.files : [],
|
|
96
|
+
similarity: c.similarity || c.score || 0,
|
|
97
|
+
description: c.description || 'Code duplication detected'
|
|
98
|
+
})).filter(c => c.files.length >= 2);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Extract file paths from code data for cross-referencing
|
|
102
|
+
*/
|
|
103
|
+
extractFilePaths(codeData) {
|
|
104
|
+
const paths = new Set();
|
|
105
|
+
for (const entity of codeData.entities) {
|
|
106
|
+
if (entity.filePath) {
|
|
107
|
+
paths.add(entity.filePath);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
for (const file of codeData.files) {
|
|
111
|
+
paths.add(file.path);
|
|
112
|
+
}
|
|
113
|
+
for (const hotspot of codeData.hotspots) {
|
|
114
|
+
paths.add(hotspot.filePath);
|
|
115
|
+
}
|
|
116
|
+
for (const clone of codeData.clones) {
|
|
117
|
+
clone.files.forEach(f => paths.add(f));
|
|
118
|
+
}
|
|
119
|
+
return Array.from(paths);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=CodeAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeAnalyzer.js","sourceRoot":"","sources":["../../src/documentation/CodeAnalyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConversationAnalyzer - Queries conversation memory database
|
|
3
|
+
*/
|
|
4
|
+
import type { SQLiteManager } from '../storage/SQLiteManager.js';
|
|
5
|
+
import type { ConversationData } from './types.js';
|
|
6
|
+
export declare class ConversationAnalyzer {
|
|
7
|
+
private db;
|
|
8
|
+
constructor(db: SQLiteManager);
|
|
9
|
+
/**
|
|
10
|
+
* Analyze conversations for a project
|
|
11
|
+
*/
|
|
12
|
+
analyze(projectPath: string, sessionId?: string): Promise<ConversationData>;
|
|
13
|
+
private getDecisions;
|
|
14
|
+
private getMistakes;
|
|
15
|
+
private getRequirements;
|
|
16
|
+
private getFileEdits;
|
|
17
|
+
private getGitCommits;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=ConversationAnalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConversationAnalyzer.d.ts","sourceRoot":"","sources":["../../src/documentation/ConversationAnalyzer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAuD,MAAM,YAAY,CAAC;AAGxG,qBAAa,oBAAoB;IACnB,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,aAAa;IAErC;;OAEG;IACG,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAoBjF,OAAO,CAAC,YAAY;IAkCpB,OAAO,CAAC,WAAW;IAgCnB,OAAO,CAAC,eAAe;IA6BvB,OAAO,CAAC,YAAY;IA4BpB,OAAO,CAAC,aAAa;CA4BtB"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConversationAnalyzer - Queries conversation memory database
|
|
3
|
+
*/
|
|
4
|
+
export class ConversationAnalyzer {
|
|
5
|
+
db;
|
|
6
|
+
constructor(db) {
|
|
7
|
+
this.db = db;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Analyze conversations for a project
|
|
11
|
+
*/
|
|
12
|
+
async analyze(projectPath, sessionId) {
|
|
13
|
+
console.log('📊 Analyzing conversation history...');
|
|
14
|
+
const decisions = this.getDecisions(projectPath, sessionId);
|
|
15
|
+
const mistakes = this.getMistakes(projectPath, sessionId);
|
|
16
|
+
const requirements = this.getRequirements(projectPath, sessionId);
|
|
17
|
+
const fileEdits = this.getFileEdits(projectPath, sessionId);
|
|
18
|
+
const commits = this.getGitCommits(projectPath, sessionId);
|
|
19
|
+
console.log(` Found ${decisions.length} decisions, ${mistakes.length} mistakes`);
|
|
20
|
+
return {
|
|
21
|
+
decisions,
|
|
22
|
+
mistakes,
|
|
23
|
+
requirements,
|
|
24
|
+
fileEdits,
|
|
25
|
+
commits
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
getDecisions(projectPath, sessionId) {
|
|
29
|
+
let sql = `
|
|
30
|
+
SELECT d.*
|
|
31
|
+
FROM decisions d
|
|
32
|
+
JOIN conversations c ON d.conversation_id = c.id
|
|
33
|
+
WHERE c.project_path = ?
|
|
34
|
+
`;
|
|
35
|
+
if (sessionId) {
|
|
36
|
+
sql += ' AND c.id = ?';
|
|
37
|
+
}
|
|
38
|
+
sql += ' ORDER BY d.timestamp DESC';
|
|
39
|
+
const stmt = this.db.getDatabase().prepare(sql);
|
|
40
|
+
const rows = sessionId
|
|
41
|
+
? stmt.all(projectPath, sessionId)
|
|
42
|
+
: stmt.all(projectPath);
|
|
43
|
+
return rows.map((row) => ({
|
|
44
|
+
id: row.id,
|
|
45
|
+
conversation_id: row.conversation_id,
|
|
46
|
+
message_id: row.message_id,
|
|
47
|
+
decision_text: row.decision_text,
|
|
48
|
+
rationale: row.rationale || '',
|
|
49
|
+
alternatives_considered: JSON.parse(row.alternatives_considered || '[]'),
|
|
50
|
+
rejected_reasons: JSON.parse(row.rejected_reasons || '{}'),
|
|
51
|
+
context: row.context,
|
|
52
|
+
related_files: JSON.parse(row.related_files || '[]'),
|
|
53
|
+
related_commits: JSON.parse(row.related_commits || '[]'),
|
|
54
|
+
timestamp: row.timestamp
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
57
|
+
getMistakes(projectPath, sessionId) {
|
|
58
|
+
let sql = `
|
|
59
|
+
SELECT m.*
|
|
60
|
+
FROM mistakes m
|
|
61
|
+
JOIN conversations c ON m.conversation_id = c.id
|
|
62
|
+
WHERE c.project_path = ?
|
|
63
|
+
`;
|
|
64
|
+
if (sessionId) {
|
|
65
|
+
sql += ' AND c.id = ?';
|
|
66
|
+
}
|
|
67
|
+
sql += ' ORDER BY m.timestamp DESC';
|
|
68
|
+
const stmt = this.db.getDatabase().prepare(sql);
|
|
69
|
+
const rows = sessionId
|
|
70
|
+
? stmt.all(projectPath, sessionId)
|
|
71
|
+
: stmt.all(projectPath);
|
|
72
|
+
return rows.map((row) => ({
|
|
73
|
+
id: row.id,
|
|
74
|
+
conversation_id: row.conversation_id,
|
|
75
|
+
what_went_wrong: row.what_went_wrong,
|
|
76
|
+
why_it_happened: '',
|
|
77
|
+
how_it_was_fixed: row.correction || '',
|
|
78
|
+
lesson_learned: row.user_correction_message || '',
|
|
79
|
+
related_files: JSON.parse(row.files_affected || '[]'),
|
|
80
|
+
severity: row.mistake_type || 'general',
|
|
81
|
+
timestamp: row.timestamp
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
getRequirements(projectPath, sessionId) {
|
|
85
|
+
let sql = `
|
|
86
|
+
SELECT r.*
|
|
87
|
+
FROM requirements r
|
|
88
|
+
JOIN conversations c ON r.conversation_id = c.id
|
|
89
|
+
WHERE c.project_path = ?
|
|
90
|
+
`;
|
|
91
|
+
if (sessionId) {
|
|
92
|
+
sql += ' AND c.id = ?';
|
|
93
|
+
}
|
|
94
|
+
sql += ' ORDER BY r.timestamp DESC';
|
|
95
|
+
const stmt = this.db.getDatabase().prepare(sql);
|
|
96
|
+
const rows = sessionId
|
|
97
|
+
? stmt.all(projectPath, sessionId)
|
|
98
|
+
: stmt.all(projectPath);
|
|
99
|
+
return rows.map((row) => ({
|
|
100
|
+
id: row.id,
|
|
101
|
+
requirement_type: row.type,
|
|
102
|
+
description: row.description,
|
|
103
|
+
rationale: row.rationale || '',
|
|
104
|
+
related_files: JSON.parse(row.affects_components || '[]'),
|
|
105
|
+
timestamp: row.timestamp
|
|
106
|
+
}));
|
|
107
|
+
}
|
|
108
|
+
getFileEdits(projectPath, sessionId) {
|
|
109
|
+
let sql = `
|
|
110
|
+
SELECT fe.*
|
|
111
|
+
FROM file_edits fe
|
|
112
|
+
JOIN conversations c ON fe.conversation_id = c.id
|
|
113
|
+
WHERE c.project_path = ?
|
|
114
|
+
`;
|
|
115
|
+
if (sessionId) {
|
|
116
|
+
sql += ' AND c.id = ?';
|
|
117
|
+
}
|
|
118
|
+
sql += ' ORDER BY fe.snapshot_timestamp DESC LIMIT 1000';
|
|
119
|
+
const stmt = this.db.getDatabase().prepare(sql);
|
|
120
|
+
const rows = sessionId
|
|
121
|
+
? stmt.all(projectPath, sessionId)
|
|
122
|
+
: stmt.all(projectPath);
|
|
123
|
+
return rows.map((row) => ({
|
|
124
|
+
id: row.id,
|
|
125
|
+
conversation_id: row.conversation_id,
|
|
126
|
+
file_path: row.file_path,
|
|
127
|
+
edit_type: 'backup', // All file_edits are backups based on schema
|
|
128
|
+
timestamp: row.snapshot_timestamp
|
|
129
|
+
}));
|
|
130
|
+
}
|
|
131
|
+
getGitCommits(projectPath, sessionId) {
|
|
132
|
+
let sql = `
|
|
133
|
+
SELECT gc.*
|
|
134
|
+
FROM git_commits gc
|
|
135
|
+
JOIN conversations c ON gc.conversation_id = c.id
|
|
136
|
+
WHERE c.project_path = ?
|
|
137
|
+
`;
|
|
138
|
+
if (sessionId) {
|
|
139
|
+
sql += ' AND c.id = ?';
|
|
140
|
+
}
|
|
141
|
+
sql += ' ORDER BY gc.timestamp DESC LIMIT 500';
|
|
142
|
+
const stmt = this.db.getDatabase().prepare(sql);
|
|
143
|
+
const rows = sessionId
|
|
144
|
+
? stmt.all(projectPath, sessionId)
|
|
145
|
+
: stmt.all(projectPath);
|
|
146
|
+
return rows.map((row) => ({
|
|
147
|
+
hash: row.hash,
|
|
148
|
+
conversation_id: row.conversation_id || '',
|
|
149
|
+
message: row.message,
|
|
150
|
+
author: row.author || 'Unknown',
|
|
151
|
+
timestamp: row.timestamp,
|
|
152
|
+
files_changed: JSON.parse(row.files_changed || '[]')
|
|
153
|
+
}));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=ConversationAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConversationAnalyzer.js","sourceRoot":"","sources":["../../src/documentation/ConversationAnalyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CrossReferencer - Links code entities with conversation data
|
|
3
|
+
*/
|
|
4
|
+
import type { CodeData, ConversationData, LinkedData } from './types.js';
|
|
5
|
+
export declare class CrossReferencer {
|
|
6
|
+
/**
|
|
7
|
+
* Link code and conversation data
|
|
8
|
+
*/
|
|
9
|
+
link(codeData: CodeData, conversationData: ConversationData): Promise<LinkedData>;
|
|
10
|
+
/**
|
|
11
|
+
* Group files into logical modules and link with conversation data
|
|
12
|
+
*/
|
|
13
|
+
private groupIntoModules;
|
|
14
|
+
/**
|
|
15
|
+
* Extract module path from file path (e.g., src/auth/token.ts → src/auth)
|
|
16
|
+
*/
|
|
17
|
+
private extractModulePath;
|
|
18
|
+
/**
|
|
19
|
+
* Convert path to human-readable module name
|
|
20
|
+
*/
|
|
21
|
+
private pathToModuleName;
|
|
22
|
+
/**
|
|
23
|
+
* Find decisions related to a module
|
|
24
|
+
*/
|
|
25
|
+
private findRelatedDecisions;
|
|
26
|
+
/**
|
|
27
|
+
* Find mistakes related to a module
|
|
28
|
+
*/
|
|
29
|
+
private findRelatedMistakes;
|
|
30
|
+
/**
|
|
31
|
+
* Find requirements related to a module
|
|
32
|
+
*/
|
|
33
|
+
private findRelatedRequirements;
|
|
34
|
+
/**
|
|
35
|
+
* Check if two paths are related (flexible matching)
|
|
36
|
+
*/
|
|
37
|
+
private isRelatedPath;
|
|
38
|
+
/**
|
|
39
|
+
* Calculate module complexity
|
|
40
|
+
*/
|
|
41
|
+
private calculateModuleComplexity;
|
|
42
|
+
/**
|
|
43
|
+
* Calculate how frequently a module changes
|
|
44
|
+
*/
|
|
45
|
+
private calculateChangeFrequency;
|
|
46
|
+
/**
|
|
47
|
+
* Extract module description from decisions and requirements
|
|
48
|
+
*/
|
|
49
|
+
private extractModuleDescription;
|
|
50
|
+
/**
|
|
51
|
+
* Build chronological timeline of events
|
|
52
|
+
*/
|
|
53
|
+
private buildTimeline;
|
|
54
|
+
/**
|
|
55
|
+
* Build quality report with context
|
|
56
|
+
*/
|
|
57
|
+
private buildQualityReport;
|
|
58
|
+
/**
|
|
59
|
+
* Summarize mistakes for learning
|
|
60
|
+
*/
|
|
61
|
+
private summarizeMistakes;
|
|
62
|
+
/**
|
|
63
|
+
* Calculate overall statistics
|
|
64
|
+
*/
|
|
65
|
+
private calculateStatistics;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=CrossReferencer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CrossReferencer.d.ts","sourceRoot":"","sources":["../../src/documentation/CrossReferencer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,QAAQ,EACR,gBAAgB,EAChB,UAAU,EAaX,MAAM,YAAY,CAAC;AAEpB,qBAAa,eAAe;IAC1B;;OAEG;IACG,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IAkBvF;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0CxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAQ5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAQ3B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAQ/B;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAiBjC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAIhC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAchC;;OAEG;IACH,OAAO,CAAC,aAAa;IAwCrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA6BzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAgB5B"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CrossReferencer - Links code entities with conversation data
|
|
3
|
+
*/
|
|
4
|
+
import { basename, dirname } from 'path';
|
|
5
|
+
export class CrossReferencer {
|
|
6
|
+
/**
|
|
7
|
+
* Link code and conversation data
|
|
8
|
+
*/
|
|
9
|
+
async link(codeData, conversationData) {
|
|
10
|
+
console.log('🔗 Cross-referencing code and conversations...');
|
|
11
|
+
const modules = this.groupIntoModules(codeData, conversationData);
|
|
12
|
+
const timeline = this.buildTimeline(conversationData);
|
|
13
|
+
const qualityReport = this.buildQualityReport(codeData, conversationData);
|
|
14
|
+
const statistics = this.calculateStatistics(codeData, conversationData);
|
|
15
|
+
console.log(` Created ${modules.length} module summaries`);
|
|
16
|
+
return {
|
|
17
|
+
modules,
|
|
18
|
+
timeline,
|
|
19
|
+
qualityReport,
|
|
20
|
+
statistics
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Group files into logical modules and link with conversation data
|
|
25
|
+
*/
|
|
26
|
+
groupIntoModules(codeData, conversationData) {
|
|
27
|
+
// Group files by directory
|
|
28
|
+
const moduleMap = new Map();
|
|
29
|
+
for (const file of codeData.files) {
|
|
30
|
+
const modulePath = this.extractModulePath(file.path);
|
|
31
|
+
const moduleName = this.pathToModuleName(modulePath);
|
|
32
|
+
if (!moduleMap.has(modulePath)) {
|
|
33
|
+
moduleMap.set(modulePath, {
|
|
34
|
+
path: modulePath,
|
|
35
|
+
name: moduleName,
|
|
36
|
+
entities: [],
|
|
37
|
+
decisions: [],
|
|
38
|
+
mistakes: [],
|
|
39
|
+
requirements: [],
|
|
40
|
+
complexity: 0,
|
|
41
|
+
changeFrequency: 0,
|
|
42
|
+
description: undefined
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
const module = moduleMap.get(modulePath);
|
|
46
|
+
if (module) {
|
|
47
|
+
module.entities.push(...file.entities);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Link decisions, mistakes, and requirements to modules
|
|
51
|
+
for (const module of moduleMap.values()) {
|
|
52
|
+
module.decisions = this.findRelatedDecisions(module.path, conversationData.decisions);
|
|
53
|
+
module.mistakes = this.findRelatedMistakes(module.path, conversationData.mistakes);
|
|
54
|
+
module.requirements = this.findRelatedRequirements(module.path, conversationData.requirements);
|
|
55
|
+
module.complexity = this.calculateModuleComplexity(module.entities, codeData.hotspots);
|
|
56
|
+
module.changeFrequency = this.calculateChangeFrequency(module.path, conversationData.fileEdits);
|
|
57
|
+
module.description = this.extractModuleDescription(module.decisions, module.requirements);
|
|
58
|
+
}
|
|
59
|
+
return Array.from(moduleMap.values())
|
|
60
|
+
.sort((a, b) => b.decisions.length + b.mistakes.length - (a.decisions.length + a.mistakes.length));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Extract module path from file path (e.g., src/auth/token.ts → src/auth)
|
|
64
|
+
*/
|
|
65
|
+
extractModulePath(filePath) {
|
|
66
|
+
const dir = dirname(filePath);
|
|
67
|
+
// If it's a top-level file, use the filename without extension
|
|
68
|
+
if (dir === '.' || dir === 'src') {
|
|
69
|
+
return basename(filePath, '.ts').replace(/\./g, '/');
|
|
70
|
+
}
|
|
71
|
+
return dir;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Convert path to human-readable module name
|
|
75
|
+
*/
|
|
76
|
+
pathToModuleName(path) {
|
|
77
|
+
const parts = path.split('/');
|
|
78
|
+
const lastPart = parts[parts.length - 1];
|
|
79
|
+
// Convert snake_case or kebab-case to Title Case
|
|
80
|
+
return lastPart
|
|
81
|
+
.split(/[-_]/)
|
|
82
|
+
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
|
|
83
|
+
.join(' ');
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Find decisions related to a module
|
|
87
|
+
*/
|
|
88
|
+
findRelatedDecisions(modulePath, decisions) {
|
|
89
|
+
return decisions.filter(decision => decision.related_files.some((file) => file.startsWith(modulePath) || this.isRelatedPath(file, modulePath)));
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Find mistakes related to a module
|
|
93
|
+
*/
|
|
94
|
+
findRelatedMistakes(modulePath, mistakes) {
|
|
95
|
+
return mistakes.filter(mistake => mistake.related_files.some((file) => file.startsWith(modulePath) || this.isRelatedPath(file, modulePath)));
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Find requirements related to a module
|
|
99
|
+
*/
|
|
100
|
+
findRelatedRequirements(modulePath, requirements) {
|
|
101
|
+
return requirements.filter(req => req.related_files.some((file) => file.startsWith(modulePath) || this.isRelatedPath(file, modulePath)));
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Check if two paths are related (flexible matching)
|
|
105
|
+
*/
|
|
106
|
+
isRelatedPath(filePath, modulePath) {
|
|
107
|
+
return filePath.includes(modulePath) || modulePath.includes(filePath);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Calculate module complexity
|
|
111
|
+
*/
|
|
112
|
+
calculateModuleComplexity(entities, hotspots) {
|
|
113
|
+
if (entities.length === 0) {
|
|
114
|
+
return 0;
|
|
115
|
+
}
|
|
116
|
+
const entityComplexity = entities
|
|
117
|
+
.filter(e => e.complexity)
|
|
118
|
+
.reduce((sum, e) => sum + (e.complexity || 0), 0);
|
|
119
|
+
const hotspotComplexity = hotspots
|
|
120
|
+
.filter(h => entities.some(e => e.filePath === h.filePath))
|
|
121
|
+
.reduce((sum, h) => sum + h.complexity, 0);
|
|
122
|
+
const avgComplexity = (entityComplexity + hotspotComplexity) / (entities.length || 1);
|
|
123
|
+
return Math.min(10, Math.round(avgComplexity));
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Calculate how frequently a module changes
|
|
127
|
+
*/
|
|
128
|
+
calculateChangeFrequency(modulePath, fileEdits) {
|
|
129
|
+
return fileEdits.filter(edit => edit.file_path.startsWith(modulePath)).length;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Extract module description from decisions and requirements
|
|
133
|
+
*/
|
|
134
|
+
extractModuleDescription(decisions, requirements) {
|
|
135
|
+
// Use the first decision's context or rationale as description
|
|
136
|
+
if (decisions.length > 0 && decisions[0].context) {
|
|
137
|
+
return decisions[0].context;
|
|
138
|
+
}
|
|
139
|
+
if (decisions.length > 0 && decisions[0].rationale) {
|
|
140
|
+
return decisions[0].rationale;
|
|
141
|
+
}
|
|
142
|
+
if (requirements.length > 0) {
|
|
143
|
+
return requirements[0].description;
|
|
144
|
+
}
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Build chronological timeline of events
|
|
149
|
+
*/
|
|
150
|
+
buildTimeline(conversationData) {
|
|
151
|
+
const events = [];
|
|
152
|
+
// Add decisions
|
|
153
|
+
for (const decision of conversationData.decisions) {
|
|
154
|
+
events.push({
|
|
155
|
+
timestamp: decision.timestamp,
|
|
156
|
+
type: 'decision',
|
|
157
|
+
description: decision.decision_text,
|
|
158
|
+
files: decision.related_files,
|
|
159
|
+
details: decision
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
// Add mistakes
|
|
163
|
+
for (const mistake of conversationData.mistakes) {
|
|
164
|
+
events.push({
|
|
165
|
+
timestamp: mistake.timestamp,
|
|
166
|
+
type: 'mistake',
|
|
167
|
+
description: mistake.what_went_wrong,
|
|
168
|
+
files: mistake.related_files,
|
|
169
|
+
details: mistake
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
// Add commits
|
|
173
|
+
for (const commit of conversationData.commits) {
|
|
174
|
+
events.push({
|
|
175
|
+
timestamp: commit.timestamp,
|
|
176
|
+
type: 'commit',
|
|
177
|
+
description: commit.message,
|
|
178
|
+
files: commit.files_changed,
|
|
179
|
+
details: commit
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
// Sort by timestamp (newest first)
|
|
183
|
+
return events.sort((a, b) => b.timestamp - a.timestamp);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Build quality report with context
|
|
187
|
+
*/
|
|
188
|
+
buildQualityReport(codeData, conversationData) {
|
|
189
|
+
const hotspotsWithContext = codeData.hotspots.map(hotspot => ({
|
|
190
|
+
...hotspot,
|
|
191
|
+
relatedMistakes: conversationData.mistakes.filter(m => m.related_files.some(f => f === hotspot.filePath)),
|
|
192
|
+
relatedDecisions: conversationData.decisions.filter(d => d.related_files.some(f => f === hotspot.filePath))
|
|
193
|
+
}));
|
|
194
|
+
const mistakeSummary = this.summarizeMistakes(conversationData.mistakes);
|
|
195
|
+
return {
|
|
196
|
+
hotspots: hotspotsWithContext,
|
|
197
|
+
clones: codeData.clones,
|
|
198
|
+
mistakeSummary
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Summarize mistakes for learning
|
|
203
|
+
*/
|
|
204
|
+
summarizeMistakes(mistakes) {
|
|
205
|
+
const byCategory = {};
|
|
206
|
+
const topLessons = [];
|
|
207
|
+
const criticalIssues = [];
|
|
208
|
+
for (const mistake of mistakes) {
|
|
209
|
+
// Categorize by severity
|
|
210
|
+
const category = mistake.severity || 'medium';
|
|
211
|
+
byCategory[category] = (byCategory[category] || 0) + 1;
|
|
212
|
+
// Collect lessons
|
|
213
|
+
if (mistake.lesson_learned && !topLessons.includes(mistake.lesson_learned)) {
|
|
214
|
+
topLessons.push(mistake.lesson_learned);
|
|
215
|
+
}
|
|
216
|
+
// Identify critical issues
|
|
217
|
+
if (mistake.severity === 'critical' || mistake.severity === 'high') {
|
|
218
|
+
criticalIssues.push(mistake);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return {
|
|
222
|
+
total: mistakes.length,
|
|
223
|
+
byCategory,
|
|
224
|
+
topLessons: topLessons.slice(0, 10), // Top 10 lessons
|
|
225
|
+
criticalIssues
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Calculate overall statistics
|
|
230
|
+
*/
|
|
231
|
+
calculateStatistics(codeData, conversationData) {
|
|
232
|
+
const totalComplexity = codeData.entities
|
|
233
|
+
.filter(e => e.complexity)
|
|
234
|
+
.reduce((sum, e) => sum + (e.complexity || 0), 0);
|
|
235
|
+
return {
|
|
236
|
+
totalFiles: codeData.files.length,
|
|
237
|
+
totalEntities: codeData.entities.length,
|
|
238
|
+
totalDecisions: conversationData.decisions.length,
|
|
239
|
+
totalMistakes: conversationData.mistakes.length,
|
|
240
|
+
totalCommits: conversationData.commits.length,
|
|
241
|
+
averageComplexity: codeData.entities.length > 0
|
|
242
|
+
? Math.round((totalComplexity / codeData.entities.length) * 10) / 10
|
|
243
|
+
: 0
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=CrossReferencer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CrossReferencer.js","sourceRoot":"","sources":["../../src/documentation/CrossReferencer.ts"],"names":[],"mappings":"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"}
|