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,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decision Extractor
|
|
3
|
+
* Identifies and extracts decisions from conversations to prevent regressions
|
|
4
|
+
*/
|
|
5
|
+
import type { Message, ThinkingBlock } from "./ConversationParser.js";
|
|
6
|
+
export interface Decision {
|
|
7
|
+
id: string;
|
|
8
|
+
conversation_id: string;
|
|
9
|
+
message_id: string;
|
|
10
|
+
decision_text: string;
|
|
11
|
+
rationale?: string;
|
|
12
|
+
alternatives_considered: string[];
|
|
13
|
+
rejected_reasons: Record<string, string>;
|
|
14
|
+
context?: string;
|
|
15
|
+
related_files: string[];
|
|
16
|
+
related_commits: string[];
|
|
17
|
+
timestamp: number;
|
|
18
|
+
}
|
|
19
|
+
export declare class DecisionExtractor {
|
|
20
|
+
private readonly DECISION_PATTERNS;
|
|
21
|
+
private readonly CORRECTION_PATTERNS;
|
|
22
|
+
private readonly CONTEXT_KEYWORDS;
|
|
23
|
+
/**
|
|
24
|
+
* Extract decisions from messages and thinking blocks
|
|
25
|
+
*/
|
|
26
|
+
extractDecisions(messages: Message[], thinkingBlocks: ThinkingBlock[]): Decision[];
|
|
27
|
+
/**
|
|
28
|
+
* Extract explicit decisions from assistant messages
|
|
29
|
+
*/
|
|
30
|
+
private extractExplicitDecisions;
|
|
31
|
+
/**
|
|
32
|
+
* Parse a regex match into a Decision object
|
|
33
|
+
*/
|
|
34
|
+
private parseDecisionMatch;
|
|
35
|
+
/**
|
|
36
|
+
* Extract structured decisions (e.g., "Decision: ..." format)
|
|
37
|
+
*/
|
|
38
|
+
private extractStructuredDecisions;
|
|
39
|
+
/**
|
|
40
|
+
* Extract decisions from user corrections
|
|
41
|
+
*/
|
|
42
|
+
private extractCorrections;
|
|
43
|
+
/**
|
|
44
|
+
* Extract decision text from matched pattern
|
|
45
|
+
*/
|
|
46
|
+
private extractDecisionText;
|
|
47
|
+
/**
|
|
48
|
+
* Extract rationale from decision text
|
|
49
|
+
*/
|
|
50
|
+
private extractRationale;
|
|
51
|
+
/**
|
|
52
|
+
* Extract alternative approaches that were considered
|
|
53
|
+
*/
|
|
54
|
+
private extractAlternatives;
|
|
55
|
+
/**
|
|
56
|
+
* Extract reasons for rejecting alternatives
|
|
57
|
+
*/
|
|
58
|
+
private extractRejectedReasons;
|
|
59
|
+
/**
|
|
60
|
+
* Identify what context/area this decision relates to
|
|
61
|
+
*/
|
|
62
|
+
private identifyContext;
|
|
63
|
+
/**
|
|
64
|
+
* Extract related files from message metadata
|
|
65
|
+
*/
|
|
66
|
+
private extractRelatedFiles;
|
|
67
|
+
/**
|
|
68
|
+
* Deduplicate similar decisions
|
|
69
|
+
*/
|
|
70
|
+
private deduplicateDecisions;
|
|
71
|
+
/**
|
|
72
|
+
* Score a decision's importance (for prioritization)
|
|
73
|
+
*/
|
|
74
|
+
scoreDecisionImportance(decision: Decision): number;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=DecisionExtractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DecisionExtractor.d.ts","sourceRoot":"","sources":["../../src/parsers/DecisionExtractor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAEtE,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uBAAuB,EAAE,MAAM,EAAE,CAAC;IAClC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,iBAAiB;IAE5B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAMhC;IAGF,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAMlC;IAGF,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAgB/B;IAEF;;OAEG;IACH,gBAAgB,CACd,QAAQ,EAAE,OAAO,EAAE,EACnB,cAAc,EAAE,aAAa,EAAE,GAC9B,QAAQ,EAAE;IAwBb;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAgChC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgC1B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IA0ClC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA8B1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAa3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAmB3B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoB9B;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAoB5B;;OAEG;IACH,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM;CAuBpD"}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decision Extractor
|
|
3
|
+
* Identifies and extracts decisions from conversations to prevent regressions
|
|
4
|
+
*/
|
|
5
|
+
import { nanoid } from "nanoid";
|
|
6
|
+
export class DecisionExtractor {
|
|
7
|
+
// Decision pattern indicators
|
|
8
|
+
DECISION_PATTERNS = [
|
|
9
|
+
/(?:we|i|let's)\s+(?:decided|choose|chose|went with|picked|selected)\s+(?:to\s+)?(.+?(?:because|since|as|for|due to))/gi,
|
|
10
|
+
/(?:using|use|implement|go with|adopt)\s+(.+?)\s+(?:instead of|over|rather than)\s+(.+?)\s+(?:because|since|as)/gi,
|
|
11
|
+
/(?:decision|chose|selected|picked):\s*(.+?)(?:\.|$)/gi,
|
|
12
|
+
/(?:rationale|reason|why):\s*(.+?)(?:\.|$)/gi,
|
|
13
|
+
/(?:rejected|dismissed|avoided|didn't use)\s+(.+?)\s+(?:because|due to|since)/gi,
|
|
14
|
+
];
|
|
15
|
+
// Correction patterns (user correcting assistant)
|
|
16
|
+
CORRECTION_PATTERNS = [
|
|
17
|
+
/^no[,\s]+/i,
|
|
18
|
+
/that'?s?\s+(?:wrong|incorrect|not right)/i,
|
|
19
|
+
/actually[,\s]+/i,
|
|
20
|
+
/instead[,\s]+(?:we should|you should|do)/i,
|
|
21
|
+
/don't\s+(?:do that|use that)/i,
|
|
22
|
+
];
|
|
23
|
+
// Context keywords to identify what the decision is about
|
|
24
|
+
CONTEXT_KEYWORDS = [
|
|
25
|
+
"authentication",
|
|
26
|
+
"auth",
|
|
27
|
+
"database",
|
|
28
|
+
"api",
|
|
29
|
+
"frontend",
|
|
30
|
+
"backend",
|
|
31
|
+
"testing",
|
|
32
|
+
"deployment",
|
|
33
|
+
"security",
|
|
34
|
+
"performance",
|
|
35
|
+
"architecture",
|
|
36
|
+
"design pattern",
|
|
37
|
+
"library",
|
|
38
|
+
"framework",
|
|
39
|
+
"optimization",
|
|
40
|
+
];
|
|
41
|
+
/**
|
|
42
|
+
* Extract decisions from messages and thinking blocks
|
|
43
|
+
*/
|
|
44
|
+
extractDecisions(messages, thinkingBlocks) {
|
|
45
|
+
const decisions = [];
|
|
46
|
+
// Extract from assistant messages with thinking blocks
|
|
47
|
+
for (const message of messages) {
|
|
48
|
+
if (message.role === "assistant" && message.content) {
|
|
49
|
+
const thinking = thinkingBlocks.find((t) => t.message_id === message.id);
|
|
50
|
+
// Check for explicit decisions in message content
|
|
51
|
+
const explicitDecisions = this.extractExplicitDecisions(message, thinking);
|
|
52
|
+
decisions.push(...explicitDecisions);
|
|
53
|
+
}
|
|
54
|
+
// Extract from user corrections
|
|
55
|
+
if (message.role === "user" && message.content) {
|
|
56
|
+
const corrections = this.extractCorrections(message);
|
|
57
|
+
decisions.push(...corrections);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Deduplicate similar decisions
|
|
61
|
+
return this.deduplicateDecisions(decisions);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Extract explicit decisions from assistant messages
|
|
65
|
+
*/
|
|
66
|
+
extractExplicitDecisions(message, thinkingBlock) {
|
|
67
|
+
const decisions = [];
|
|
68
|
+
const content = message.content || "";
|
|
69
|
+
const thinkingContent = thinkingBlock?.thinking_content || "";
|
|
70
|
+
const combinedContent = `${content}\n${thinkingContent}`;
|
|
71
|
+
// Look for decision patterns
|
|
72
|
+
for (const pattern of this.DECISION_PATTERNS) {
|
|
73
|
+
const matches = Array.from(combinedContent.matchAll(pattern));
|
|
74
|
+
for (const match of matches) {
|
|
75
|
+
const decision = this.parseDecisionMatch(match, message, thinkingBlock);
|
|
76
|
+
if (decision) {
|
|
77
|
+
decisions.push(decision);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Extract from structured decision statements
|
|
82
|
+
const structuredDecisions = this.extractStructuredDecisions(combinedContent, message, thinkingBlock);
|
|
83
|
+
decisions.push(...structuredDecisions);
|
|
84
|
+
return decisions;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Parse a regex match into a Decision object
|
|
88
|
+
*/
|
|
89
|
+
parseDecisionMatch(match, message, _thinking) {
|
|
90
|
+
if (!match[0]) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
const fullText = match[0];
|
|
94
|
+
const decisionText = this.extractDecisionText(fullText);
|
|
95
|
+
const rationale = this.extractRationale(fullText);
|
|
96
|
+
// Extract context (what this decision is about)
|
|
97
|
+
const context = this.identifyContext(fullText);
|
|
98
|
+
// Extract related files from message metadata
|
|
99
|
+
const relatedFiles = this.extractRelatedFiles(message);
|
|
100
|
+
return {
|
|
101
|
+
id: nanoid(),
|
|
102
|
+
conversation_id: message.conversation_id,
|
|
103
|
+
message_id: message.id,
|
|
104
|
+
decision_text: decisionText,
|
|
105
|
+
rationale,
|
|
106
|
+
alternatives_considered: this.extractAlternatives(fullText),
|
|
107
|
+
rejected_reasons: this.extractRejectedReasons(fullText),
|
|
108
|
+
context,
|
|
109
|
+
related_files: relatedFiles,
|
|
110
|
+
related_commits: [], // Will be filled by GitIntegrator
|
|
111
|
+
timestamp: message.timestamp,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Extract structured decisions (e.g., "Decision: ..." format)
|
|
116
|
+
*/
|
|
117
|
+
extractStructuredDecisions(content, message, _thinking) {
|
|
118
|
+
const decisions = [];
|
|
119
|
+
// Look for structured decision blocks
|
|
120
|
+
const decisionBlockPattern = /(?:Decision|Chose|Selected|Using):\s*([^\n]+)(?:\s*Rationale:\s*([^\n]+))?(?:\s*Alternatives:\s*([^\n]+))?/gi;
|
|
121
|
+
const matches = Array.from(content.matchAll(decisionBlockPattern));
|
|
122
|
+
for (const match of matches) {
|
|
123
|
+
const decisionText = match[1]?.trim();
|
|
124
|
+
if (!decisionText) {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
const rationale = match[2]?.trim();
|
|
128
|
+
const alternativesText = match[3]?.trim();
|
|
129
|
+
const alternatives = alternativesText
|
|
130
|
+
? alternativesText.split(/,|;/).map((a) => a.trim())
|
|
131
|
+
: [];
|
|
132
|
+
decisions.push({
|
|
133
|
+
id: nanoid(),
|
|
134
|
+
conversation_id: message.conversation_id,
|
|
135
|
+
message_id: message.id,
|
|
136
|
+
decision_text: decisionText,
|
|
137
|
+
rationale,
|
|
138
|
+
alternatives_considered: alternatives,
|
|
139
|
+
rejected_reasons: {},
|
|
140
|
+
context: this.identifyContext(content),
|
|
141
|
+
related_files: this.extractRelatedFiles(message),
|
|
142
|
+
related_commits: [],
|
|
143
|
+
timestamp: message.timestamp,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
return decisions;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Extract decisions from user corrections
|
|
150
|
+
*/
|
|
151
|
+
extractCorrections(message) {
|
|
152
|
+
const content = message.content || "";
|
|
153
|
+
// Check if this is a correction
|
|
154
|
+
const isCorrection = this.CORRECTION_PATTERNS.some((pattern) => pattern.test(content));
|
|
155
|
+
if (!isCorrection) {
|
|
156
|
+
return [];
|
|
157
|
+
}
|
|
158
|
+
// Extract what the correction is about
|
|
159
|
+
const correctionText = content.replace(/^(no[,\s]+|actually[,\s]+)/i, "").trim();
|
|
160
|
+
return [
|
|
161
|
+
{
|
|
162
|
+
id: nanoid(),
|
|
163
|
+
conversation_id: message.conversation_id,
|
|
164
|
+
message_id: message.id,
|
|
165
|
+
decision_text: correctionText,
|
|
166
|
+
rationale: "User correction - previous approach was incorrect",
|
|
167
|
+
alternatives_considered: [],
|
|
168
|
+
rejected_reasons: { "previous approach": "user rejected" },
|
|
169
|
+
context: this.identifyContext(content),
|
|
170
|
+
related_files: this.extractRelatedFiles(message),
|
|
171
|
+
related_commits: [],
|
|
172
|
+
timestamp: message.timestamp,
|
|
173
|
+
},
|
|
174
|
+
];
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Extract decision text from matched pattern
|
|
178
|
+
*/
|
|
179
|
+
extractDecisionText(text) {
|
|
180
|
+
// Remove common prefixes
|
|
181
|
+
let cleaned = text.replace(/^(?:we|i|let's)\s+(?:decided|choose|chose|went with|picked|selected)\s+(?:to\s+)?/i, "");
|
|
182
|
+
// Remove trailing explanation
|
|
183
|
+
cleaned = cleaned.replace(/\s+(?:because|since|as|for|due to).+$/i, "");
|
|
184
|
+
return cleaned.trim();
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Extract rationale from decision text
|
|
188
|
+
*/
|
|
189
|
+
extractRationale(text) {
|
|
190
|
+
const rationaleMatch = text.match(/(?:because|since|as|for|due to)\s+(.+?)(?:\.|$)/i);
|
|
191
|
+
return rationaleMatch?.[1]?.trim();
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Extract alternative approaches that were considered
|
|
195
|
+
*/
|
|
196
|
+
extractAlternatives(text) {
|
|
197
|
+
const alternatives = [];
|
|
198
|
+
// Look for "instead of X" patterns
|
|
199
|
+
const insteadOfMatch = text.match(/(?:instead of|over|rather than)\s+(.+?)(?:\s+because|$)/i);
|
|
200
|
+
if (insteadOfMatch) {
|
|
201
|
+
alternatives.push(insteadOfMatch[1].trim());
|
|
202
|
+
}
|
|
203
|
+
// Look for "considered X, Y, and Z"
|
|
204
|
+
const consideredMatch = text.match(/considered\s+(.+?)(?:\s+but|$)/i);
|
|
205
|
+
if (consideredMatch) {
|
|
206
|
+
const items = consideredMatch[1].split(/,|and/).map((s) => s.trim());
|
|
207
|
+
alternatives.push(...items);
|
|
208
|
+
}
|
|
209
|
+
return alternatives;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Extract reasons for rejecting alternatives
|
|
213
|
+
*/
|
|
214
|
+
extractRejectedReasons(text) {
|
|
215
|
+
const reasons = {};
|
|
216
|
+
// Look for "rejected X because Y" patterns
|
|
217
|
+
const rejectedPattern = /(?:rejected|dismissed|avoided|didn't use)\s+(.+?)\s+(?:because|due to|since)\s+(.+?)(?:\.|$)/gi;
|
|
218
|
+
const matches = Array.from(text.matchAll(rejectedPattern));
|
|
219
|
+
for (const match of matches) {
|
|
220
|
+
const alternative = match[1]?.trim();
|
|
221
|
+
const reason = match[2]?.trim();
|
|
222
|
+
if (alternative && reason) {
|
|
223
|
+
reasons[alternative] = reason;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return reasons;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Identify what context/area this decision relates to
|
|
230
|
+
*/
|
|
231
|
+
identifyContext(text) {
|
|
232
|
+
const lowerText = text.toLowerCase();
|
|
233
|
+
for (const keyword of this.CONTEXT_KEYWORDS) {
|
|
234
|
+
if (lowerText.includes(keyword)) {
|
|
235
|
+
return keyword;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return undefined;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Extract related files from message metadata
|
|
242
|
+
*/
|
|
243
|
+
extractRelatedFiles(message) {
|
|
244
|
+
const files = [];
|
|
245
|
+
// Check message metadata for file references
|
|
246
|
+
if (message.metadata) {
|
|
247
|
+
// Look for file paths in various metadata fields
|
|
248
|
+
const metadataStr = JSON.stringify(message.metadata);
|
|
249
|
+
const filePathPattern = /(?:\/[\w-]+)+\.[\w]+/g;
|
|
250
|
+
const matches = metadataStr.match(filePathPattern);
|
|
251
|
+
if (matches) {
|
|
252
|
+
files.push(...matches);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return [...new Set(files)]; // Deduplicate
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Deduplicate similar decisions
|
|
259
|
+
*/
|
|
260
|
+
deduplicateDecisions(decisions) {
|
|
261
|
+
const unique = [];
|
|
262
|
+
const seen = new Set();
|
|
263
|
+
for (const decision of decisions) {
|
|
264
|
+
// Create a signature for the decision
|
|
265
|
+
const signature = `${decision.decision_text.toLowerCase()}_${decision.timestamp}`.substring(0, 100);
|
|
266
|
+
if (!seen.has(signature)) {
|
|
267
|
+
seen.add(signature);
|
|
268
|
+
unique.push(decision);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return unique;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Score a decision's importance (for prioritization)
|
|
275
|
+
*/
|
|
276
|
+
scoreDecisionImportance(decision) {
|
|
277
|
+
let score = 0;
|
|
278
|
+
// Has rationale
|
|
279
|
+
if (decision.rationale) {
|
|
280
|
+
score += 2;
|
|
281
|
+
}
|
|
282
|
+
// Has alternatives considered
|
|
283
|
+
if (decision.alternatives_considered.length > 0) {
|
|
284
|
+
score += 3;
|
|
285
|
+
}
|
|
286
|
+
// Has rejected reasons
|
|
287
|
+
if (Object.keys(decision.rejected_reasons).length > 0) {
|
|
288
|
+
score += 3;
|
|
289
|
+
}
|
|
290
|
+
// Has related files
|
|
291
|
+
if (decision.related_files.length > 0) {
|
|
292
|
+
score += 2;
|
|
293
|
+
}
|
|
294
|
+
// Has context
|
|
295
|
+
if (decision.context) {
|
|
296
|
+
score += 1;
|
|
297
|
+
}
|
|
298
|
+
// Is a correction (high importance)
|
|
299
|
+
if (decision.rationale?.includes("User correction")) {
|
|
300
|
+
score += 5;
|
|
301
|
+
}
|
|
302
|
+
return score;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=DecisionExtractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DecisionExtractor.js","sourceRoot":"","sources":["../../src/parsers/DecisionExtractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Integrator
|
|
3
|
+
* Links git commits to conversations based on temporal and contextual analysis
|
|
4
|
+
*/
|
|
5
|
+
import type { Conversation, FileEdit } from "./ConversationParser.js";
|
|
6
|
+
import type { Decision } from "./DecisionExtractor.js";
|
|
7
|
+
export interface GitCommit {
|
|
8
|
+
hash: string;
|
|
9
|
+
message: string;
|
|
10
|
+
author?: string;
|
|
11
|
+
timestamp: number;
|
|
12
|
+
branch?: string;
|
|
13
|
+
files_changed: string[];
|
|
14
|
+
conversation_id?: string;
|
|
15
|
+
related_message_id?: string;
|
|
16
|
+
metadata: Record<string, unknown>;
|
|
17
|
+
}
|
|
18
|
+
export interface CommitLinkage {
|
|
19
|
+
commit: GitCommit;
|
|
20
|
+
conversation: Conversation;
|
|
21
|
+
confidence: number;
|
|
22
|
+
reasons: string[];
|
|
23
|
+
}
|
|
24
|
+
export declare class GitIntegrator {
|
|
25
|
+
private git;
|
|
26
|
+
constructor(projectPath: string);
|
|
27
|
+
/**
|
|
28
|
+
* Parse git history and link to conversations
|
|
29
|
+
*/
|
|
30
|
+
linkCommitsToConversations(conversations: Conversation[], fileEdits: FileEdit[], decisions: Decision[]): Promise<GitCommit[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Parse git history
|
|
33
|
+
*/
|
|
34
|
+
private parseGitHistory;
|
|
35
|
+
/**
|
|
36
|
+
* Get files changed in a commit
|
|
37
|
+
*/
|
|
38
|
+
private getChangedFiles;
|
|
39
|
+
/**
|
|
40
|
+
* Find best conversation match for a commit
|
|
41
|
+
*/
|
|
42
|
+
private findBestConversationMatch;
|
|
43
|
+
/**
|
|
44
|
+
* Score how well a commit matches a conversation
|
|
45
|
+
*/
|
|
46
|
+
private scoreCommitConversationMatch;
|
|
47
|
+
/**
|
|
48
|
+
* Score based on timestamp proximity
|
|
49
|
+
* Returns 0-3 points
|
|
50
|
+
*/
|
|
51
|
+
private scoreTimestampProximity;
|
|
52
|
+
/**
|
|
53
|
+
* Score based on file overlap
|
|
54
|
+
* Returns 0-4 points
|
|
55
|
+
*/
|
|
56
|
+
private scoreFileOverlap;
|
|
57
|
+
/**
|
|
58
|
+
* Score based on commit message keywords
|
|
59
|
+
* Returns 0-2 points
|
|
60
|
+
*/
|
|
61
|
+
private scoreCommitMessageKeywords;
|
|
62
|
+
/**
|
|
63
|
+
* Get recent commits (last N days)
|
|
64
|
+
*/
|
|
65
|
+
getRecentCommits(days?: number): Promise<GitCommit[]>;
|
|
66
|
+
/**
|
|
67
|
+
* Get commits affecting a specific file
|
|
68
|
+
*/
|
|
69
|
+
getCommitsForFile(filePath: string): Promise<GitCommit[]>;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=GitIntegrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitIntegrator.d.ts","sourceRoot":"","sources":["../../src/parsers/GitIntegrator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEvD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,SAAS,CAAC;IAClB,YAAY,EAAE,YAAY,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAAY;gBAEX,WAAW,EAAE,MAAM;IAI/B;;OAEG;IACG,0BAA0B,CAC9B,aAAa,EAAE,YAAY,EAAE,EAC7B,SAAS,EAAE,QAAQ,EAAE,EACrB,SAAS,EAAE,QAAQ,EAAE,GACpB,OAAO,CAAC,SAAS,EAAE,CAAC;IAqCvB;;OAEG;YACW,eAAe;IA4C7B;;OAEG;YACW,eAAe;IAgB7B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IA0BjC;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAiDpC;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAkC/B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IA0BxB;;;OAGG;IACH,OAAO,CAAC,0BAA0B;IAyClC;;OAEG;IACG,gBAAgB,CAAC,IAAI,GAAE,MAAW,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAkC/D;;OAEG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;CAsBhE"}
|