cccmemory 1.8.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 (216) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +349 -0
  3. package/dist/ConversationMemory.d.ts +231 -0
  4. package/dist/ConversationMemory.d.ts.map +1 -0
  5. package/dist/ConversationMemory.js +357 -0
  6. package/dist/ConversationMemory.js.map +1 -0
  7. package/dist/cache/QueryCache.d.ts +215 -0
  8. package/dist/cache/QueryCache.d.ts.map +1 -0
  9. package/dist/cache/QueryCache.js +294 -0
  10. package/dist/cache/QueryCache.js.map +1 -0
  11. package/dist/cli/commands.d.ts +9 -0
  12. package/dist/cli/commands.d.ts.map +1 -0
  13. package/dist/cli/commands.js +954 -0
  14. package/dist/cli/commands.js.map +1 -0
  15. package/dist/cli/help.d.ts +16 -0
  16. package/dist/cli/help.d.ts.map +1 -0
  17. package/dist/cli/help.js +361 -0
  18. package/dist/cli/help.js.map +1 -0
  19. package/dist/cli/index.d.ts +30 -0
  20. package/dist/cli/index.d.ts.map +1 -0
  21. package/dist/cli/index.js +111 -0
  22. package/dist/cli/index.js.map +1 -0
  23. package/dist/context/ContextInjector.d.ts +38 -0
  24. package/dist/context/ContextInjector.d.ts.map +1 -0
  25. package/dist/context/ContextInjector.js +235 -0
  26. package/dist/context/ContextInjector.js.map +1 -0
  27. package/dist/documentation/CodeAnalyzer.d.ts +29 -0
  28. package/dist/documentation/CodeAnalyzer.d.ts.map +1 -0
  29. package/dist/documentation/CodeAnalyzer.js +122 -0
  30. package/dist/documentation/CodeAnalyzer.js.map +1 -0
  31. package/dist/documentation/ConversationAnalyzer.d.ts +19 -0
  32. package/dist/documentation/ConversationAnalyzer.d.ts.map +1 -0
  33. package/dist/documentation/ConversationAnalyzer.js +157 -0
  34. package/dist/documentation/ConversationAnalyzer.js.map +1 -0
  35. package/dist/documentation/CrossReferencer.d.ts +67 -0
  36. package/dist/documentation/CrossReferencer.d.ts.map +1 -0
  37. package/dist/documentation/CrossReferencer.js +247 -0
  38. package/dist/documentation/CrossReferencer.js.map +1 -0
  39. package/dist/documentation/DocumentationGenerator.d.ts +22 -0
  40. package/dist/documentation/DocumentationGenerator.d.ts.map +1 -0
  41. package/dist/documentation/DocumentationGenerator.js +57 -0
  42. package/dist/documentation/DocumentationGenerator.js.map +1 -0
  43. package/dist/documentation/MarkdownFormatter.d.ts +26 -0
  44. package/dist/documentation/MarkdownFormatter.d.ts.map +1 -0
  45. package/dist/documentation/MarkdownFormatter.js +301 -0
  46. package/dist/documentation/MarkdownFormatter.js.map +1 -0
  47. package/dist/documentation/types.d.ts +176 -0
  48. package/dist/documentation/types.d.ts.map +1 -0
  49. package/dist/documentation/types.js +5 -0
  50. package/dist/documentation/types.js.map +1 -0
  51. package/dist/embeddings/ConfigManager.d.ts +46 -0
  52. package/dist/embeddings/ConfigManager.d.ts.map +1 -0
  53. package/dist/embeddings/ConfigManager.js +177 -0
  54. package/dist/embeddings/ConfigManager.js.map +1 -0
  55. package/dist/embeddings/EmbeddingConfig.d.ts +39 -0
  56. package/dist/embeddings/EmbeddingConfig.d.ts.map +1 -0
  57. package/dist/embeddings/EmbeddingConfig.js +132 -0
  58. package/dist/embeddings/EmbeddingConfig.js.map +1 -0
  59. package/dist/embeddings/EmbeddingGenerator.d.ts +51 -0
  60. package/dist/embeddings/EmbeddingGenerator.d.ts.map +1 -0
  61. package/dist/embeddings/EmbeddingGenerator.js +157 -0
  62. package/dist/embeddings/EmbeddingGenerator.js.map +1 -0
  63. package/dist/embeddings/EmbeddingProvider.d.ts +34 -0
  64. package/dist/embeddings/EmbeddingProvider.d.ts.map +1 -0
  65. package/dist/embeddings/EmbeddingProvider.js +6 -0
  66. package/dist/embeddings/EmbeddingProvider.js.map +1 -0
  67. package/dist/embeddings/ModelRegistry.d.ts +48 -0
  68. package/dist/embeddings/ModelRegistry.d.ts.map +1 -0
  69. package/dist/embeddings/ModelRegistry.js +170 -0
  70. package/dist/embeddings/ModelRegistry.js.map +1 -0
  71. package/dist/embeddings/VectorStore.d.ts +114 -0
  72. package/dist/embeddings/VectorStore.d.ts.map +1 -0
  73. package/dist/embeddings/VectorStore.js +393 -0
  74. package/dist/embeddings/VectorStore.js.map +1 -0
  75. package/dist/embeddings/providers/OllamaEmbeddings.d.ts +38 -0
  76. package/dist/embeddings/providers/OllamaEmbeddings.d.ts.map +1 -0
  77. package/dist/embeddings/providers/OllamaEmbeddings.js +125 -0
  78. package/dist/embeddings/providers/OllamaEmbeddings.js.map +1 -0
  79. package/dist/embeddings/providers/OpenAIEmbeddings.d.ts +40 -0
  80. package/dist/embeddings/providers/OpenAIEmbeddings.d.ts.map +1 -0
  81. package/dist/embeddings/providers/OpenAIEmbeddings.js +129 -0
  82. package/dist/embeddings/providers/OpenAIEmbeddings.js.map +1 -0
  83. package/dist/embeddings/providers/TransformersEmbeddings.d.ts +38 -0
  84. package/dist/embeddings/providers/TransformersEmbeddings.d.ts.map +1 -0
  85. package/dist/embeddings/providers/TransformersEmbeddings.js +115 -0
  86. package/dist/embeddings/providers/TransformersEmbeddings.js.map +1 -0
  87. package/dist/handoff/SessionHandoffStore.d.ts +80 -0
  88. package/dist/handoff/SessionHandoffStore.d.ts.map +1 -0
  89. package/dist/handoff/SessionHandoffStore.js +314 -0
  90. package/dist/handoff/SessionHandoffStore.js.map +1 -0
  91. package/dist/index.d.ts +7 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +115 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/mcp-server.d.ts +27 -0
  96. package/dist/mcp-server.d.ts.map +1 -0
  97. package/dist/mcp-server.js +157 -0
  98. package/dist/mcp-server.js.map +1 -0
  99. package/dist/memory/WorkingMemoryStore.d.ts +83 -0
  100. package/dist/memory/WorkingMemoryStore.d.ts.map +1 -0
  101. package/dist/memory/WorkingMemoryStore.js +318 -0
  102. package/dist/memory/WorkingMemoryStore.js.map +1 -0
  103. package/dist/memory/types.d.ts +192 -0
  104. package/dist/memory/types.d.ts.map +1 -0
  105. package/dist/memory/types.js +8 -0
  106. package/dist/memory/types.js.map +1 -0
  107. package/dist/parsers/CodexConversationParser.d.ts +51 -0
  108. package/dist/parsers/CodexConversationParser.d.ts.map +1 -0
  109. package/dist/parsers/CodexConversationParser.js +301 -0
  110. package/dist/parsers/CodexConversationParser.js.map +1 -0
  111. package/dist/parsers/ConversationParser.d.ts +286 -0
  112. package/dist/parsers/ConversationParser.d.ts.map +1 -0
  113. package/dist/parsers/ConversationParser.js +795 -0
  114. package/dist/parsers/ConversationParser.js.map +1 -0
  115. package/dist/parsers/DecisionExtractor.d.ts +144 -0
  116. package/dist/parsers/DecisionExtractor.d.ts.map +1 -0
  117. package/dist/parsers/DecisionExtractor.js +434 -0
  118. package/dist/parsers/DecisionExtractor.js.map +1 -0
  119. package/dist/parsers/GitIntegrator.d.ts +156 -0
  120. package/dist/parsers/GitIntegrator.d.ts.map +1 -0
  121. package/dist/parsers/GitIntegrator.js +348 -0
  122. package/dist/parsers/GitIntegrator.js.map +1 -0
  123. package/dist/parsers/MistakeExtractor.d.ts +151 -0
  124. package/dist/parsers/MistakeExtractor.d.ts.map +1 -0
  125. package/dist/parsers/MistakeExtractor.js +460 -0
  126. package/dist/parsers/MistakeExtractor.js.map +1 -0
  127. package/dist/parsers/RequirementsExtractor.d.ts +166 -0
  128. package/dist/parsers/RequirementsExtractor.d.ts.map +1 -0
  129. package/dist/parsers/RequirementsExtractor.js +338 -0
  130. package/dist/parsers/RequirementsExtractor.js.map +1 -0
  131. package/dist/realtime/ConversationWatcher.d.ts +87 -0
  132. package/dist/realtime/ConversationWatcher.d.ts.map +1 -0
  133. package/dist/realtime/ConversationWatcher.js +204 -0
  134. package/dist/realtime/ConversationWatcher.js.map +1 -0
  135. package/dist/realtime/IncrementalParser.d.ts +83 -0
  136. package/dist/realtime/IncrementalParser.d.ts.map +1 -0
  137. package/dist/realtime/IncrementalParser.js +232 -0
  138. package/dist/realtime/IncrementalParser.js.map +1 -0
  139. package/dist/realtime/LiveExtractor.d.ts +72 -0
  140. package/dist/realtime/LiveExtractor.d.ts.map +1 -0
  141. package/dist/realtime/LiveExtractor.js +288 -0
  142. package/dist/realtime/LiveExtractor.js.map +1 -0
  143. package/dist/search/SemanticSearch.d.ts +121 -0
  144. package/dist/search/SemanticSearch.d.ts.map +1 -0
  145. package/dist/search/SemanticSearch.js +823 -0
  146. package/dist/search/SemanticSearch.js.map +1 -0
  147. package/dist/storage/BackupManager.d.ts +58 -0
  148. package/dist/storage/BackupManager.d.ts.map +1 -0
  149. package/dist/storage/BackupManager.js +223 -0
  150. package/dist/storage/BackupManager.js.map +1 -0
  151. package/dist/storage/ConversationStorage.d.ts +341 -0
  152. package/dist/storage/ConversationStorage.d.ts.map +1 -0
  153. package/dist/storage/ConversationStorage.js +792 -0
  154. package/dist/storage/ConversationStorage.js.map +1 -0
  155. package/dist/storage/DeletionService.d.ts +70 -0
  156. package/dist/storage/DeletionService.d.ts.map +1 -0
  157. package/dist/storage/DeletionService.js +253 -0
  158. package/dist/storage/DeletionService.js.map +1 -0
  159. package/dist/storage/GlobalIndex.d.ts +133 -0
  160. package/dist/storage/GlobalIndex.d.ts.map +1 -0
  161. package/dist/storage/GlobalIndex.js +310 -0
  162. package/dist/storage/GlobalIndex.js.map +1 -0
  163. package/dist/storage/SQLiteManager.d.ts +114 -0
  164. package/dist/storage/SQLiteManager.d.ts.map +1 -0
  165. package/dist/storage/SQLiteManager.js +636 -0
  166. package/dist/storage/SQLiteManager.js.map +1 -0
  167. package/dist/storage/migrations.d.ts +54 -0
  168. package/dist/storage/migrations.d.ts.map +1 -0
  169. package/dist/storage/migrations.js +285 -0
  170. package/dist/storage/migrations.js.map +1 -0
  171. package/dist/storage/schema.sql +436 -0
  172. package/dist/tools/ToolDefinitions.d.ts +946 -0
  173. package/dist/tools/ToolDefinitions.d.ts.map +1 -0
  174. package/dist/tools/ToolDefinitions.js +937 -0
  175. package/dist/tools/ToolDefinitions.js.map +1 -0
  176. package/dist/tools/ToolHandlers.d.ts +791 -0
  177. package/dist/tools/ToolHandlers.d.ts.map +1 -0
  178. package/dist/tools/ToolHandlers.js +3262 -0
  179. package/dist/tools/ToolHandlers.js.map +1 -0
  180. package/dist/types/ToolTypes.d.ts +824 -0
  181. package/dist/types/ToolTypes.d.ts.map +1 -0
  182. package/dist/types/ToolTypes.js +6 -0
  183. package/dist/types/ToolTypes.js.map +1 -0
  184. package/dist/utils/Logger.d.ts +70 -0
  185. package/dist/utils/Logger.d.ts.map +1 -0
  186. package/dist/utils/Logger.js +131 -0
  187. package/dist/utils/Logger.js.map +1 -0
  188. package/dist/utils/McpConfig.d.ts +54 -0
  189. package/dist/utils/McpConfig.d.ts.map +1 -0
  190. package/dist/utils/McpConfig.js +136 -0
  191. package/dist/utils/McpConfig.js.map +1 -0
  192. package/dist/utils/ProjectMigration.d.ts +82 -0
  193. package/dist/utils/ProjectMigration.d.ts.map +1 -0
  194. package/dist/utils/ProjectMigration.js +416 -0
  195. package/dist/utils/ProjectMigration.js.map +1 -0
  196. package/dist/utils/constants.d.ts +75 -0
  197. package/dist/utils/constants.d.ts.map +1 -0
  198. package/dist/utils/constants.js +105 -0
  199. package/dist/utils/constants.js.map +1 -0
  200. package/dist/utils/safeJson.d.ts +37 -0
  201. package/dist/utils/safeJson.d.ts.map +1 -0
  202. package/dist/utils/safeJson.js +48 -0
  203. package/dist/utils/safeJson.js.map +1 -0
  204. package/dist/utils/sanitization.d.ts +45 -0
  205. package/dist/utils/sanitization.d.ts.map +1 -0
  206. package/dist/utils/sanitization.js +153 -0
  207. package/dist/utils/sanitization.js.map +1 -0
  208. package/dist/utils/worktree.d.ts +15 -0
  209. package/dist/utils/worktree.d.ts.map +1 -0
  210. package/dist/utils/worktree.js +86 -0
  211. package/dist/utils/worktree.js.map +1 -0
  212. package/package.json +98 -0
  213. package/scripts/changelog-check.sh +62 -0
  214. package/scripts/check-node.js +17 -0
  215. package/scripts/dev-config.js +56 -0
  216. package/scripts/postinstall.js +117 -0
@@ -0,0 +1,460 @@
1
+ /**
2
+ * Mistake Extractor - Identifies errors and how they were corrected.
3
+ *
4
+ * This extractor analyzes conversation messages and tool results to identify
5
+ * mistakes made during development and how they were corrected. It helps prevent
6
+ * repeating the same errors by documenting:
7
+ * - What went wrong
8
+ * - How it was corrected
9
+ * - Files affected
10
+ * - Type of mistake (logic error, wrong approach, etc.)
11
+ *
12
+ * Sources of mistakes:
13
+ * - Tool execution errors (failed commands, syntax errors)
14
+ * - User corrections ("that's wrong", "don't do that")
15
+ * - Error discussions (debugging conversations)
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const extractor = new MistakeExtractor();
20
+ * const mistakes = extractor.extractMistakes(messages, toolResults);
21
+ * console.log(`Found ${mistakes.length} mistakes`);
22
+ * mistakes.forEach(m => {
23
+ * console.log(`${m.mistake_type}: ${m.what_went_wrong}`);
24
+ * if (m.correction) console.log(`Fixed by: ${m.correction}`);
25
+ * });
26
+ * ```
27
+ */
28
+ import { nanoid } from "nanoid";
29
+ /**
30
+ * Extracts mistakes and corrections from conversation history.
31
+ *
32
+ * Analyzes tool errors, user corrections, and error discussions to document
33
+ * mistakes and prevent repetition.
34
+ */
35
+ export class MistakeExtractor {
36
+ // Minimum severity score required to store a mistake
37
+ // Score 1 keeps any classified mistake - filtering is done by stricter patterns
38
+ MIN_SEVERITY_SCORE = 1;
39
+ // Noise patterns to filter out
40
+ NOISE_PATTERNS = [
41
+ /this session is being continued/i,
42
+ /conversation is summarized below/i,
43
+ /previous conversation that ran out of context/i,
44
+ /here is the summary/i,
45
+ /summary of the conversation/i,
46
+ ];
47
+ // User correction indicators - must be explicit corrections about code/approach
48
+ CORRECTION_INDICATORS = [
49
+ // "That's wrong, you should use X"
50
+ /that'?s?\s+(?:wrong|incorrect|a mistake)[,\s]+(?:you should|use|the correct)/i,
51
+ // "You made an error in the code/implementation"
52
+ /(?:you|that)\s+(?:made|caused|introduced)\s+(?:a|an)\s+(?:error|bug)\s+(?:in|with|when)/i,
53
+ // "Don't do that because X"
54
+ /don't\s+do\s+that[,\s]+(?:because|it will|it causes)/i,
55
+ // "You shouldn't have done/used X because Y"
56
+ /(?:should not|shouldn't)\s+(?:have\s+)?(?:done|used)\s+(.+?)\s+(?:because|since)/i,
57
+ // "Fix the bug/error in X"
58
+ /(?:fix|correct)\s+(?:the|that)\s+(?:bug|error)\s+(?:in|with)/i,
59
+ ];
60
+ // Error indicators - stricter, real errors only
61
+ ERROR_INDICATORS = [
62
+ /error:\s*\w+/i, // error: SomeError
63
+ /Error:\s*\w+/, // Error: SomeError
64
+ /failed:\s*.+/i, // failed: something
65
+ /exception:\s*.+/i, // exception: something
66
+ /TypeError:|ReferenceError:|SyntaxError:/i, // JS errors
67
+ /ENOENT|EACCES|EPERM/i, // Node.js file errors
68
+ /command\s+failed/i, // command failed
69
+ /exit\s+code\s+[1-9]/i, // non-zero exit code
70
+ ];
71
+ // Mistake type patterns
72
+ MISTAKE_PATTERNS = {
73
+ logic_error: [/logic\s+error/i, /incorrect\s+logic/i, /wrong\s+condition/i],
74
+ wrong_approach: [
75
+ /wrong\s+approach/i,
76
+ /better\s+way/i,
77
+ /should\s+(?:have\s+)?use(?:d)?/i,
78
+ ],
79
+ misunderstanding: [
80
+ /misunderstood/i,
81
+ /(?:didn't|don't)\s+understand/i,
82
+ /confused\s+about/i,
83
+ ],
84
+ syntax_error: [/syntax\s+error/i, /parse\s+error/i, /invalid\s+syntax/i],
85
+ };
86
+ /**
87
+ * Extract mistakes from messages and tool results.
88
+ *
89
+ * Analyzes three sources to identify mistakes:
90
+ * 1. Tool execution errors (failed commands, syntax errors)
91
+ * 2. User corrections (explicit corrections by the user)
92
+ * 3. Error discussions (conversations about bugs and fixes)
93
+ *
94
+ * @param messages - Array of conversation messages
95
+ * @param toolResults - Array of tool execution results
96
+ * @returns Array of extracted Mistake objects, deduplicated
97
+ *
98
+ * @example
99
+ * ```typescript
100
+ * const extractor = new MistakeExtractor();
101
+ * const mistakes = extractor.extractMistakes(messages, toolResults);
102
+ *
103
+ * // Find logic errors
104
+ * const logicErrors = mistakes.filter(m => m.mistake_type === 'logic_error');
105
+ * ```
106
+ */
107
+ extractMistakes(messages, toolResults) {
108
+ const mistakes = [];
109
+ // Filter messages to exclude noise
110
+ const cleanMessages = messages.filter((m) => !this.isNoiseContent(m.content || ""));
111
+ // Extract from tool errors (tool errors are real, keep them)
112
+ const toolErrors = this.extractToolErrors(toolResults, messages);
113
+ mistakes.push(...toolErrors);
114
+ // Extract from user corrections
115
+ const userCorrections = this.extractUserCorrections(cleanMessages);
116
+ mistakes.push(...userCorrections);
117
+ // Extract from error discussions
118
+ const errorDiscussions = this.extractErrorDiscussions(cleanMessages);
119
+ mistakes.push(...errorDiscussions);
120
+ // Deduplicate and filter by severity
121
+ const deduplicated = this.deduplicateMistakes(mistakes);
122
+ return deduplicated.filter((m) => this.scoreMistakeSeverity(m) >= this.MIN_SEVERITY_SCORE);
123
+ }
124
+ /**
125
+ * Check if content is noise that should be filtered out
126
+ */
127
+ isNoiseContent(content) {
128
+ const firstChunk = content.substring(0, 500);
129
+ return this.NOISE_PATTERNS.some((pattern) => pattern.test(firstChunk));
130
+ }
131
+ /**
132
+ * Extract mistakes from tool execution errors
133
+ */
134
+ extractToolErrors(toolResults, messages) {
135
+ const mistakes = [];
136
+ for (const result of toolResults) {
137
+ if (!result.is_error) {
138
+ continue;
139
+ }
140
+ const message = messages.find((m) => m.id === result.message_id);
141
+ if (!message) {
142
+ continue;
143
+ }
144
+ // Combine ALL error sources for better context
145
+ // stderr might just have "exit code 255" while content has the actual error
146
+ const errorParts = [];
147
+ if (result.stderr) {
148
+ errorParts.push(result.stderr);
149
+ }
150
+ if (result.stdout) {
151
+ errorParts.push(result.stdout);
152
+ }
153
+ if (result.content) {
154
+ errorParts.push(result.content);
155
+ }
156
+ const errorContent = errorParts.join("\n");
157
+ const mistakeType = this.classifyMistakeType(errorContent);
158
+ mistakes.push({
159
+ id: nanoid(),
160
+ conversation_id: message.conversation_id,
161
+ message_id: message.id,
162
+ mistake_type: mistakeType || "tool_error",
163
+ what_went_wrong: this.summarizeError(errorContent),
164
+ correction: this.findCorrection(message, messages),
165
+ files_affected: this.extractFilesFromError(errorContent),
166
+ timestamp: result.timestamp,
167
+ });
168
+ }
169
+ return mistakes;
170
+ }
171
+ /**
172
+ * Extract mistakes from user corrections
173
+ */
174
+ extractUserCorrections(messages) {
175
+ const mistakes = [];
176
+ for (let i = 0; i < messages.length; i++) {
177
+ const message = messages[i];
178
+ if (message.role !== "user" || !message.content) {
179
+ continue;
180
+ }
181
+ const content = message.content;
182
+ // Check if this is a correction
183
+ const isCorrection = this.CORRECTION_INDICATORS.some((pattern) => pattern.test(content));
184
+ if (!isCorrection) {
185
+ continue;
186
+ }
187
+ // Find the previous assistant message
188
+ const previousAssistant = this.findPreviousAssistantMessage(messages, i);
189
+ if (!previousAssistant) {
190
+ continue;
191
+ }
192
+ const mistakeType = this.classifyMistakeType(message.content);
193
+ mistakes.push({
194
+ id: nanoid(),
195
+ conversation_id: message.conversation_id,
196
+ message_id: previousAssistant.id,
197
+ mistake_type: mistakeType || "misunderstanding",
198
+ what_went_wrong: this.extractWhatWentWrong(message.content),
199
+ correction: this.extractCorrection(message.content),
200
+ user_correction_message: message.content,
201
+ files_affected: this.extractFilesFromMessage(message),
202
+ timestamp: message.timestamp,
203
+ });
204
+ }
205
+ return mistakes;
206
+ }
207
+ /**
208
+ * Extract mistakes from error discussions in messages
209
+ */
210
+ extractErrorDiscussions(messages) {
211
+ const mistakes = [];
212
+ for (const message of messages) {
213
+ if (message.role !== "assistant" || !message.content) {
214
+ continue;
215
+ }
216
+ const content = message.content;
217
+ // Check if message discusses an error
218
+ const hasErrorDiscussion = this.ERROR_INDICATORS.some((pattern) => pattern.test(content));
219
+ if (!hasErrorDiscussion) {
220
+ continue;
221
+ }
222
+ // Extract error discussion
223
+ const errorText = this.extractErrorDiscussion(message.content);
224
+ if (!errorText) {
225
+ continue;
226
+ }
227
+ const mistakeType = this.classifyMistakeType(errorText);
228
+ mistakes.push({
229
+ id: nanoid(),
230
+ conversation_id: message.conversation_id,
231
+ message_id: message.id,
232
+ mistake_type: mistakeType || "logic_error",
233
+ what_went_wrong: errorText,
234
+ correction: this.extractSolutionFromSameMessage(message.content),
235
+ files_affected: this.extractFilesFromMessage(message),
236
+ timestamp: message.timestamp,
237
+ });
238
+ }
239
+ return mistakes;
240
+ }
241
+ /**
242
+ * Classify the type of mistake
243
+ */
244
+ classifyMistakeType(text) {
245
+ for (const [type, patterns] of Object.entries(this.MISTAKE_PATTERNS)) {
246
+ for (const pattern of patterns) {
247
+ if (pattern.test(text)) {
248
+ return type;
249
+ }
250
+ }
251
+ }
252
+ return null;
253
+ }
254
+ /**
255
+ * Summarize error message - find the most descriptive error line
256
+ */
257
+ summarizeError(errorText) {
258
+ const lines = errorText.split("\n").map(l => l.trim()).filter(l => l.length > 0);
259
+ if (lines.length === 0) {
260
+ return "Unknown error";
261
+ }
262
+ // Patterns that indicate a descriptive error (prioritize these)
263
+ const descriptivePatterns = [
264
+ /permission denied/i,
265
+ /host key verification failed/i,
266
+ /connection refused/i,
267
+ /no such file or directory/i,
268
+ /command not found/i,
269
+ /authentication failed/i,
270
+ /timeout/i,
271
+ /could not resolve/i,
272
+ /network is unreachable/i,
273
+ /operation not permitted/i,
274
+ /access denied/i,
275
+ /invalid argument/i,
276
+ /no space left/i,
277
+ /disk quota exceeded/i,
278
+ /broken pipe/i,
279
+ /connection reset/i,
280
+ /refused|denied|failed|error:|fatal:/i,
281
+ ];
282
+ // Find the first line matching a descriptive pattern
283
+ for (const line of lines) {
284
+ for (const pattern of descriptivePatterns) {
285
+ if (pattern.test(line)) {
286
+ return line.length > 300 ? line.substring(0, 300) + "..." : line;
287
+ }
288
+ }
289
+ }
290
+ // Skip generic "exit code" lines if there's more content
291
+ const nonExitCodeLines = lines.filter(l => !/^exit\s*code\s*\d+$/i.test(l));
292
+ const bestLine = nonExitCodeLines.length > 0 ? nonExitCodeLines[0] : lines[0];
293
+ return bestLine.length > 300 ? bestLine.substring(0, 300) + "..." : bestLine;
294
+ }
295
+ /**
296
+ * Find correction in subsequent messages
297
+ */
298
+ findCorrection(errorMessage, allMessages) {
299
+ const index = allMessages.findIndex((m) => m.id === errorMessage.id);
300
+ if (index === -1) {
301
+ return undefined;
302
+ }
303
+ // Look at next few messages for a fix
304
+ const nextMessages = allMessages.slice(index + 1, index + 5);
305
+ for (const msg of nextMessages) {
306
+ if (msg.role === "assistant" && msg.content) {
307
+ // Look for fix indicators
308
+ if (/(?:fixed|resolved|corrected|solved)/i.test(msg.content)) {
309
+ return msg.content.substring(0, 500);
310
+ }
311
+ }
312
+ }
313
+ return undefined;
314
+ }
315
+ /**
316
+ * Extract files mentioned in error
317
+ */
318
+ extractFilesFromError(errorText) {
319
+ const files = [];
320
+ // Common file path patterns
321
+ const filePathPattern = /(?:\/|\.\/|\.\.\/)?(?:[\w-]+\/)*[\w-]+\.[\w]+/g;
322
+ const matches = errorText.match(filePathPattern);
323
+ if (matches) {
324
+ files.push(...matches);
325
+ }
326
+ return [...new Set(files)];
327
+ }
328
+ /**
329
+ * Extract files from message metadata
330
+ */
331
+ extractFilesFromMessage(message) {
332
+ const files = [];
333
+ if (message.metadata) {
334
+ const metadataStr = JSON.stringify(message.metadata);
335
+ const filePathPattern = /(?:\/[\w-]+)+\.[\w]+/g;
336
+ const matches = metadataStr.match(filePathPattern);
337
+ if (matches) {
338
+ files.push(...matches);
339
+ }
340
+ }
341
+ return [...new Set(files)];
342
+ }
343
+ /**
344
+ * Find previous assistant message
345
+ */
346
+ findPreviousAssistantMessage(messages, currentIndex) {
347
+ for (let i = currentIndex - 1; i >= 0; i--) {
348
+ if (messages[i].role === "assistant") {
349
+ return messages[i];
350
+ }
351
+ }
352
+ return undefined;
353
+ }
354
+ /**
355
+ * Extract what went wrong from correction message
356
+ */
357
+ extractWhatWentWrong(correctionText) {
358
+ // Remove correction indicators
359
+ let cleaned = correctionText;
360
+ for (const pattern of this.CORRECTION_INDICATORS) {
361
+ cleaned = cleaned.replace(pattern, "");
362
+ }
363
+ // Take first sentence or up to 300 characters
364
+ const sentences = cleaned.split(/\.|!|\?/);
365
+ const firstSentence = sentences[0]?.trim();
366
+ return firstSentence && firstSentence.length > 0
367
+ ? firstSentence.substring(0, 300)
368
+ : cleaned.substring(0, 300);
369
+ }
370
+ /**
371
+ * Extract correction from user message
372
+ */
373
+ extractCorrection(correctionText) {
374
+ // Look for "instead" or "should" patterns
375
+ const insteadMatch = correctionText.match(/instead[,\s]+(.+?)(?:\.|$)/i);
376
+ if (insteadMatch) {
377
+ return insteadMatch[1].trim();
378
+ }
379
+ const shouldMatch = correctionText.match(/should\s+(?:have\s+)?(.+?)(?:\.|$)/i);
380
+ if (shouldMatch) {
381
+ return shouldMatch[1].trim();
382
+ }
383
+ return undefined;
384
+ }
385
+ /**
386
+ * Extract error discussion from message
387
+ */
388
+ extractErrorDiscussion(content) {
389
+ // Find sentences containing error indicators
390
+ const sentences = content.split(/\.|!|\?/);
391
+ for (const sentence of sentences) {
392
+ if (this.ERROR_INDICATORS.some((pattern) => pattern.test(sentence))) {
393
+ return sentence.trim();
394
+ }
395
+ }
396
+ return undefined;
397
+ }
398
+ /**
399
+ * Extract solution from same message that discusses error
400
+ */
401
+ extractSolutionFromSameMessage(content) {
402
+ // Look for solution indicators
403
+ const solutionPattern = /(?:to fix|solution|resolved by|corrected by|fixed by)\s+(.+?)(?:\.|$)/i;
404
+ const match = content.match(solutionPattern);
405
+ return match?.[1]?.trim();
406
+ }
407
+ /**
408
+ * Deduplicate similar mistakes
409
+ */
410
+ deduplicateMistakes(mistakes) {
411
+ const unique = [];
412
+ const seen = new Set();
413
+ for (const mistake of mistakes) {
414
+ // Create signature including message_id to avoid collisions
415
+ // between different mistakes with similar text in the same conversation
416
+ const textPrefix = mistake.what_went_wrong.substring(0, 100);
417
+ const signature = `${mistake.message_id}_${textPrefix}_${mistake.timestamp}`;
418
+ if (!seen.has(signature)) {
419
+ seen.add(signature);
420
+ unique.push(mistake);
421
+ }
422
+ }
423
+ return unique;
424
+ }
425
+ /**
426
+ * Score mistake severity (for prioritization)
427
+ */
428
+ scoreMistakeSeverity(mistake) {
429
+ let score = 0;
430
+ // Has correction
431
+ if (mistake.correction) {
432
+ score += 2;
433
+ }
434
+ // User explicitly corrected
435
+ if (mistake.user_correction_message) {
436
+ score += 3;
437
+ }
438
+ // Affects files
439
+ if (mistake.files_affected.length > 0) {
440
+ score += 2;
441
+ }
442
+ // Type-based severity
443
+ switch (mistake.mistake_type) {
444
+ case "logic_error":
445
+ score += 3;
446
+ break;
447
+ case "wrong_approach":
448
+ score += 2;
449
+ break;
450
+ case "syntax_error":
451
+ score += 1;
452
+ break;
453
+ case "tool_error":
454
+ score += 1;
455
+ break;
456
+ }
457
+ return score;
458
+ }
459
+ }
460
+ //# sourceMappingURL=MistakeExtractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MistakeExtractor.js","sourceRoot":"","sources":["../../src/parsers/MistakeExtractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Requirements and Validations Extractor - Tracks constraints, dependencies, and testing context.
3
+ *
4
+ * This extractor analyzes conversation messages and tool executions to identify:
5
+ * - Requirements (dependencies, performance, compatibility, business constraints)
6
+ * - Validations (test runs, results, and performance data)
7
+ *
8
+ * Helps document:
9
+ * - What dependencies are required and why
10
+ * - Performance requirements and constraints
11
+ * - Compatibility requirements (versions, platforms)
12
+ * - Business rules and limitations
13
+ * - Test executions and their results
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const extractor = new RequirementsExtractor();
18
+ * const requirements = extractor.extractRequirements(messages);
19
+ * const validations = extractor.extractValidations(toolUses, toolResults, messages);
20
+ *
21
+ * console.log(`Found ${requirements.length} requirements`);
22
+ * console.log(`Found ${validations.length} test validations`);
23
+ * ```
24
+ */
25
+ import type { Message, ToolUse, ToolResult } from "./ConversationParser.js";
26
+ /**
27
+ * Represents a requirement or constraint for the system.
28
+ */
29
+ export interface Requirement {
30
+ /** Unique requirement identifier */
31
+ id: string;
32
+ /** Category of requirement */
33
+ type: "dependency" | "performance" | "compatibility" | "business";
34
+ /** Description of the requirement */
35
+ description: string;
36
+ /** Why this requirement exists */
37
+ rationale?: string;
38
+ /** Components affected by this requirement */
39
+ affects_components: string[];
40
+ /** Conversation where requirement was discussed */
41
+ conversation_id: string;
42
+ /** Message containing the requirement */
43
+ message_id: string;
44
+ /** When the requirement was documented */
45
+ timestamp: number;
46
+ }
47
+ /**
48
+ * Represents a test validation or verification.
49
+ */
50
+ export interface Validation {
51
+ /** Unique validation identifier */
52
+ id: string;
53
+ /** Conversation where test was run */
54
+ conversation_id: string;
55
+ /** Description of what was tested */
56
+ what_was_tested: string;
57
+ /** Command used to run the test */
58
+ test_command?: string;
59
+ /** Test result status */
60
+ result: "passed" | "failed" | "error";
61
+ /** Performance metrics from the test */
62
+ performance_data?: Record<string, unknown>;
63
+ /** Files that were tested */
64
+ files_tested: string[];
65
+ /** When the test was run */
66
+ timestamp: number;
67
+ }
68
+ /**
69
+ * Extracts requirements and validations from conversation history.
70
+ *
71
+ * Analyzes messages for requirement patterns and tool executions for test results.
72
+ */
73
+ export declare class RequirementsExtractor {
74
+ private readonly REQUIREMENT_PATTERNS;
75
+ private readonly TEST_PATTERNS;
76
+ /**
77
+ * Get combined output from tool result (stdout + stderr + content)
78
+ * Test output may go to either stdout or stderr depending on the tool
79
+ */
80
+ private getToolOutput;
81
+ /**
82
+ * Extract requirements from conversation messages.
83
+ *
84
+ * Analyzes messages using pattern matching to identify four types of requirements:
85
+ * - Dependency: Required libraries, packages, modules
86
+ * - Performance: Speed, latency, throughput constraints
87
+ * - Compatibility: Version requirements, platform support
88
+ * - Business: Business rules, limitations, constraints
89
+ *
90
+ * @param messages - Array of conversation messages to analyze
91
+ * @returns Array of extracted Requirement objects
92
+ *
93
+ * @example
94
+ * ```typescript
95
+ * const extractor = new RequirementsExtractor();
96
+ * const requirements = extractor.extractRequirements(messages);
97
+ *
98
+ * // Find all dependency requirements
99
+ * const deps = requirements.filter(r => r.type === 'dependency');
100
+ * deps.forEach(d => console.log(`${d.description} - ${d.rationale}`));
101
+ * ```
102
+ */
103
+ extractRequirements(messages: Message[]): Requirement[];
104
+ /**
105
+ * Extract validations from tool executions.
106
+ *
107
+ * Analyzes Bash tool uses to identify test command executions and their results.
108
+ * Captures test runs including pass/fail status, performance data, and files tested.
109
+ *
110
+ * Recognized test commands:
111
+ * - npm/yarn/pnpm test
112
+ * - pytest
113
+ * - jest/mocha
114
+ * - cargo test (Rust)
115
+ * - go test (Go)
116
+ *
117
+ * @param toolUses - Array of tool invocations
118
+ * @param toolResults - Array of tool execution results
119
+ * @param messages - Array of conversation messages for context
120
+ * @returns Array of extracted Validation objects
121
+ *
122
+ * @example
123
+ * ```typescript
124
+ * const extractor = new RequirementsExtractor();
125
+ * const validations = extractor.extractValidations(toolUses, toolResults, messages);
126
+ *
127
+ * // Find failed tests
128
+ * const failures = validations.filter(v => v.result === 'failed');
129
+ * console.log(`${failures.length} test failures found`);
130
+ * ```
131
+ */
132
+ extractValidations(toolUses: ToolUse[], toolResults: ToolResult[], messages: Message[]): Validation[];
133
+ /**
134
+ * Parse a requirement from pattern match
135
+ */
136
+ private parseRequirement;
137
+ /**
138
+ * Extract rationale from requirement text
139
+ */
140
+ private extractRationale;
141
+ /**
142
+ * Extract affected components from message metadata
143
+ */
144
+ private extractAffectedComponents;
145
+ /**
146
+ * Extract what was tested from command and result
147
+ */
148
+ private extractWhatWasTested;
149
+ /**
150
+ * Determine test result from tool result
151
+ */
152
+ private determineTestResult;
153
+ /**
154
+ * Extract performance data from test results
155
+ */
156
+ private extractPerformanceData;
157
+ /**
158
+ * Extract files that were tested
159
+ */
160
+ private extractTestedFiles;
161
+ /**
162
+ * Deduplicate similar requirements
163
+ */
164
+ private deduplicateRequirements;
165
+ }
166
+ //# sourceMappingURL=RequirementsExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RequirementsExtractor.d.ts","sourceRoot":"","sources":["../../src/parsers/RequirementsExtractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE5E;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,8BAA8B;IAC9B,IAAI,EAAE,YAAY,GAAG,aAAa,GAAG,eAAe,GAAG,UAAU,CAAC;IAClE,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,mDAAmD;IACnD,eAAe,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,mCAAmC;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,sCAAsC;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,qCAAqC;IACrC,eAAe,EAAE,MAAM,CAAC;IACxB,mCAAmC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yBAAyB;IACzB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACtC,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,6BAA6B;IAC7B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,qBAAa,qBAAqB;IAEhC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAmBnC;IAGF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAQ5B;IAEF;;;OAGG;IACH,OAAO,CAAC,aAAa;IAQrB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE;IA8BvD;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,kBAAkB,CAChB,QAAQ,EAAE,OAAO,EAAE,EACnB,WAAW,EAAE,UAAU,EAAE,EACzB,QAAQ,EAAE,OAAO,EAAE,GAClB,UAAU,EAAE;IAuCf;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAgCxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuBxB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IA0BjC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAqB5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA6B3B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA6B9B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAe1B;;OAEG;IACH,OAAO,CAAC,uBAAuB;CAchC"}