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.
Files changed (116) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +223 -0
  3. package/dist/ConversationMemory.d.ts +80 -0
  4. package/dist/ConversationMemory.d.ts.map +1 -0
  5. package/dist/ConversationMemory.js +203 -0
  6. package/dist/ConversationMemory.js.map +1 -0
  7. package/dist/documentation/CodeAnalyzer.d.ts +29 -0
  8. package/dist/documentation/CodeAnalyzer.d.ts.map +1 -0
  9. package/dist/documentation/CodeAnalyzer.js +122 -0
  10. package/dist/documentation/CodeAnalyzer.js.map +1 -0
  11. package/dist/documentation/ConversationAnalyzer.d.ts +19 -0
  12. package/dist/documentation/ConversationAnalyzer.d.ts.map +1 -0
  13. package/dist/documentation/ConversationAnalyzer.js +156 -0
  14. package/dist/documentation/ConversationAnalyzer.js.map +1 -0
  15. package/dist/documentation/CrossReferencer.d.ts +67 -0
  16. package/dist/documentation/CrossReferencer.d.ts.map +1 -0
  17. package/dist/documentation/CrossReferencer.js +247 -0
  18. package/dist/documentation/CrossReferencer.js.map +1 -0
  19. package/dist/documentation/DocumentationGenerator.d.ts +22 -0
  20. package/dist/documentation/DocumentationGenerator.d.ts.map +1 -0
  21. package/dist/documentation/DocumentationGenerator.js +57 -0
  22. package/dist/documentation/DocumentationGenerator.js.map +1 -0
  23. package/dist/documentation/MarkdownFormatter.d.ts +26 -0
  24. package/dist/documentation/MarkdownFormatter.d.ts.map +1 -0
  25. package/dist/documentation/MarkdownFormatter.js +301 -0
  26. package/dist/documentation/MarkdownFormatter.js.map +1 -0
  27. package/dist/documentation/types.d.ts +176 -0
  28. package/dist/documentation/types.d.ts.map +1 -0
  29. package/dist/documentation/types.js +5 -0
  30. package/dist/documentation/types.js.map +1 -0
  31. package/dist/embeddings/EmbeddingConfig.d.ts +39 -0
  32. package/dist/embeddings/EmbeddingConfig.d.ts.map +1 -0
  33. package/dist/embeddings/EmbeddingConfig.js +132 -0
  34. package/dist/embeddings/EmbeddingConfig.js.map +1 -0
  35. package/dist/embeddings/EmbeddingGenerator.d.ts +45 -0
  36. package/dist/embeddings/EmbeddingGenerator.d.ts.map +1 -0
  37. package/dist/embeddings/EmbeddingGenerator.js +129 -0
  38. package/dist/embeddings/EmbeddingGenerator.js.map +1 -0
  39. package/dist/embeddings/EmbeddingProvider.d.ts +34 -0
  40. package/dist/embeddings/EmbeddingProvider.d.ts.map +1 -0
  41. package/dist/embeddings/EmbeddingProvider.js +6 -0
  42. package/dist/embeddings/EmbeddingProvider.js.map +1 -0
  43. package/dist/embeddings/VectorStore.d.ts +75 -0
  44. package/dist/embeddings/VectorStore.d.ts.map +1 -0
  45. package/dist/embeddings/VectorStore.js +220 -0
  46. package/dist/embeddings/VectorStore.js.map +1 -0
  47. package/dist/embeddings/providers/OllamaEmbeddings.d.ts +38 -0
  48. package/dist/embeddings/providers/OllamaEmbeddings.d.ts.map +1 -0
  49. package/dist/embeddings/providers/OllamaEmbeddings.js +132 -0
  50. package/dist/embeddings/providers/OllamaEmbeddings.js.map +1 -0
  51. package/dist/embeddings/providers/OpenAIEmbeddings.d.ts +40 -0
  52. package/dist/embeddings/providers/OpenAIEmbeddings.d.ts.map +1 -0
  53. package/dist/embeddings/providers/OpenAIEmbeddings.js +128 -0
  54. package/dist/embeddings/providers/OpenAIEmbeddings.js.map +1 -0
  55. package/dist/embeddings/providers/TransformersEmbeddings.d.ts +38 -0
  56. package/dist/embeddings/providers/TransformersEmbeddings.d.ts.map +1 -0
  57. package/dist/embeddings/providers/TransformersEmbeddings.js +114 -0
  58. package/dist/embeddings/providers/TransformersEmbeddings.js.map +1 -0
  59. package/dist/index.d.ts +7 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +127 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/parsers/ConversationParser.d.ts +138 -0
  64. package/dist/parsers/ConversationParser.d.ts.map +1 -0
  65. package/dist/parsers/ConversationParser.js +325 -0
  66. package/dist/parsers/ConversationParser.js.map +1 -0
  67. package/dist/parsers/DecisionExtractor.d.ts +76 -0
  68. package/dist/parsers/DecisionExtractor.d.ts.map +1 -0
  69. package/dist/parsers/DecisionExtractor.js +305 -0
  70. package/dist/parsers/DecisionExtractor.js.map +1 -0
  71. package/dist/parsers/GitIntegrator.d.ts +71 -0
  72. package/dist/parsers/GitIntegrator.d.ts.map +1 -0
  73. package/dist/parsers/GitIntegrator.js +283 -0
  74. package/dist/parsers/GitIntegrator.js.map +1 -0
  75. package/dist/parsers/MistakeExtractor.d.ts +86 -0
  76. package/dist/parsers/MistakeExtractor.d.ts.map +1 -0
  77. package/dist/parsers/MistakeExtractor.js +341 -0
  78. package/dist/parsers/MistakeExtractor.js.map +1 -0
  79. package/dist/parsers/RequirementsExtractor.d.ts +70 -0
  80. package/dist/parsers/RequirementsExtractor.d.ts.map +1 -0
  81. package/dist/parsers/RequirementsExtractor.js +252 -0
  82. package/dist/parsers/RequirementsExtractor.js.map +1 -0
  83. package/dist/search/SemanticSearch.d.ts +90 -0
  84. package/dist/search/SemanticSearch.d.ts.map +1 -0
  85. package/dist/search/SemanticSearch.js +352 -0
  86. package/dist/search/SemanticSearch.js.map +1 -0
  87. package/dist/storage/ConversationStorage.d.ts +53 -0
  88. package/dist/storage/ConversationStorage.d.ts.map +1 -0
  89. package/dist/storage/ConversationStorage.js +249 -0
  90. package/dist/storage/ConversationStorage.js.map +1 -0
  91. package/dist/storage/SQLiteManager.d.ts +88 -0
  92. package/dist/storage/SQLiteManager.d.ts.map +1 -0
  93. package/dist/storage/SQLiteManager.js +281 -0
  94. package/dist/storage/SQLiteManager.js.map +1 -0
  95. package/dist/storage/migrations.d.ts +54 -0
  96. package/dist/storage/migrations.d.ts.map +1 -0
  97. package/dist/storage/migrations.js +153 -0
  98. package/dist/storage/migrations.js.map +1 -0
  99. package/dist/storage/schema.sql +321 -0
  100. package/dist/tools/ToolDefinitions.d.ts +265 -0
  101. package/dist/tools/ToolDefinitions.d.ts.map +1 -0
  102. package/dist/tools/ToolDefinitions.js +261 -0
  103. package/dist/tools/ToolDefinitions.js.map +1 -0
  104. package/dist/tools/ToolHandlers.d.ts +56 -0
  105. package/dist/tools/ToolHandlers.d.ts.map +1 -0
  106. package/dist/tools/ToolHandlers.js +431 -0
  107. package/dist/tools/ToolHandlers.js.map +1 -0
  108. package/dist/types/ToolTypes.d.ts +333 -0
  109. package/dist/types/ToolTypes.d.ts.map +1 -0
  110. package/dist/types/ToolTypes.js +6 -0
  111. package/dist/types/ToolTypes.js.map +1 -0
  112. package/dist/utils/sanitization.d.ts +35 -0
  113. package/dist/utils/sanitization.d.ts.map +1 -0
  114. package/dist/utils/sanitization.js +97 -0
  115. package/dist/utils/sanitization.js.map +1 -0
  116. 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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"}