cmp-memory-system 1.0.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 (161) hide show
  1. package/README.md +541 -0
  2. package/dist/analytics/index.d.ts +5 -0
  3. package/dist/analytics/index.d.ts.map +1 -0
  4. package/dist/analytics/index.js +5 -0
  5. package/dist/analytics/index.js.map +1 -0
  6. package/dist/analytics/tracker.d.ts +107 -0
  7. package/dist/analytics/tracker.d.ts.map +1 -0
  8. package/dist/analytics/tracker.js +333 -0
  9. package/dist/analytics/tracker.js.map +1 -0
  10. package/dist/auto-improve/eslint-generator.d.ts +36 -0
  11. package/dist/auto-improve/eslint-generator.d.ts.map +1 -0
  12. package/dist/auto-improve/eslint-generator.js +280 -0
  13. package/dist/auto-improve/eslint-generator.js.map +1 -0
  14. package/dist/auto-improve/index.d.ts +6 -0
  15. package/dist/auto-improve/index.d.ts.map +1 -0
  16. package/dist/auto-improve/index.js +6 -0
  17. package/dist/auto-improve/index.js.map +1 -0
  18. package/dist/auto-improve/pattern-detector.d.ts +92 -0
  19. package/dist/auto-improve/pattern-detector.d.ts.map +1 -0
  20. package/dist/auto-improve/pattern-detector.js +231 -0
  21. package/dist/auto-improve/pattern-detector.js.map +1 -0
  22. package/dist/cli/index.d.ts +16 -0
  23. package/dist/cli/index.d.ts.map +1 -0
  24. package/dist/cli/index.js +636 -0
  25. package/dist/cli/index.js.map +1 -0
  26. package/dist/dashboard/index.d.ts +6 -0
  27. package/dist/dashboard/index.d.ts.map +1 -0
  28. package/dist/dashboard/index.js +6 -0
  29. package/dist/dashboard/index.js.map +1 -0
  30. package/dist/dashboard/server.d.ts +15 -0
  31. package/dist/dashboard/server.d.ts.map +1 -0
  32. package/dist/dashboard/server.js +373 -0
  33. package/dist/dashboard/server.js.map +1 -0
  34. package/dist/dashboard/ui.d.ts +9 -0
  35. package/dist/dashboard/ui.d.ts.map +1 -0
  36. package/dist/dashboard/ui.js +530 -0
  37. package/dist/dashboard/ui.js.map +1 -0
  38. package/dist/db/client.d.ts +66 -0
  39. package/dist/db/client.d.ts.map +1 -0
  40. package/dist/db/client.js +159 -0
  41. package/dist/db/client.js.map +1 -0
  42. package/dist/db/drizzle-client.d.ts +302 -0
  43. package/dist/db/drizzle-client.d.ts.map +1 -0
  44. package/dist/db/drizzle-client.js +404 -0
  45. package/dist/db/drizzle-client.js.map +1 -0
  46. package/dist/db/index.d.ts +5 -0
  47. package/dist/db/index.d.ts.map +1 -0
  48. package/dist/db/index.js +5 -0
  49. package/dist/db/index.js.map +1 -0
  50. package/dist/feedback/collector.d.ts +74 -0
  51. package/dist/feedback/collector.d.ts.map +1 -0
  52. package/dist/feedback/collector.js +231 -0
  53. package/dist/feedback/collector.js.map +1 -0
  54. package/dist/feedback/index.d.ts +5 -0
  55. package/dist/feedback/index.d.ts.map +1 -0
  56. package/dist/feedback/index.js +5 -0
  57. package/dist/feedback/index.js.map +1 -0
  58. package/dist/hooks/index.d.ts +8 -0
  59. package/dist/hooks/index.d.ts.map +1 -0
  60. package/dist/hooks/index.js +8 -0
  61. package/dist/hooks/index.js.map +1 -0
  62. package/dist/hooks/memory-checkpoint.d.ts +43 -0
  63. package/dist/hooks/memory-checkpoint.d.ts.map +1 -0
  64. package/dist/hooks/memory-checkpoint.js +257 -0
  65. package/dist/hooks/memory-checkpoint.js.map +1 -0
  66. package/dist/hooks/post-tool-use.d.ts +61 -0
  67. package/dist/hooks/post-tool-use.d.ts.map +1 -0
  68. package/dist/hooks/post-tool-use.js +262 -0
  69. package/dist/hooks/post-tool-use.js.map +1 -0
  70. package/dist/hooks/pre-tool-use.d.ts +34 -0
  71. package/dist/hooks/pre-tool-use.d.ts.map +1 -0
  72. package/dist/hooks/pre-tool-use.js +358 -0
  73. package/dist/hooks/pre-tool-use.js.map +1 -0
  74. package/dist/hooks/session-start.d.ts +38 -0
  75. package/dist/hooks/session-start.d.ts.map +1 -0
  76. package/dist/hooks/session-start.js +274 -0
  77. package/dist/hooks/session-start.js.map +1 -0
  78. package/dist/index.d.ts +29 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +39 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/mcp/index.d.ts +5 -0
  83. package/dist/mcp/index.d.ts.map +1 -0
  84. package/dist/mcp/index.js +5 -0
  85. package/dist/mcp/index.js.map +1 -0
  86. package/dist/mcp/server.d.ts +42 -0
  87. package/dist/mcp/server.d.ts.map +1 -0
  88. package/dist/mcp/server.js +599 -0
  89. package/dist/mcp/server.js.map +1 -0
  90. package/dist/registry/embeddings.d.ts +38 -0
  91. package/dist/registry/embeddings.d.ts.map +1 -0
  92. package/dist/registry/embeddings.js +110 -0
  93. package/dist/registry/embeddings.js.map +1 -0
  94. package/dist/registry/generator.d.ts +41 -0
  95. package/dist/registry/generator.d.ts.map +1 -0
  96. package/dist/registry/generator.js +323 -0
  97. package/dist/registry/generator.js.map +1 -0
  98. package/dist/registry/index.d.ts +6 -0
  99. package/dist/registry/index.d.ts.map +1 -0
  100. package/dist/registry/index.js +6 -0
  101. package/dist/registry/index.js.map +1 -0
  102. package/dist/services/IdeaCollector.d.ts +103 -0
  103. package/dist/services/IdeaCollector.d.ts.map +1 -0
  104. package/dist/services/IdeaCollector.js +371 -0
  105. package/dist/services/IdeaCollector.js.map +1 -0
  106. package/dist/services/TaskTracker.d.ts +89 -0
  107. package/dist/services/TaskTracker.d.ts.map +1 -0
  108. package/dist/services/TaskTracker.js +324 -0
  109. package/dist/services/TaskTracker.js.map +1 -0
  110. package/dist/services/WorkPlanManager.d.ts +107 -0
  111. package/dist/services/WorkPlanManager.d.ts.map +1 -0
  112. package/dist/services/WorkPlanManager.js +440 -0
  113. package/dist/services/WorkPlanManager.js.map +1 -0
  114. package/dist/services/auto-inject.d.ts +77 -0
  115. package/dist/services/auto-inject.d.ts.map +1 -0
  116. package/dist/services/auto-inject.js +289 -0
  117. package/dist/services/auto-inject.js.map +1 -0
  118. package/dist/services/auto-tag.d.ts +61 -0
  119. package/dist/services/auto-tag.d.ts.map +1 -0
  120. package/dist/services/auto-tag.js +203 -0
  121. package/dist/services/auto-tag.js.map +1 -0
  122. package/dist/services/cross-project-sync.d.ts +76 -0
  123. package/dist/services/cross-project-sync.d.ts.map +1 -0
  124. package/dist/services/cross-project-sync.js +235 -0
  125. package/dist/services/cross-project-sync.js.map +1 -0
  126. package/dist/services/index.d.ts +15 -0
  127. package/dist/services/index.d.ts.map +1 -0
  128. package/dist/services/index.js +18 -0
  129. package/dist/services/index.js.map +1 -0
  130. package/dist/services/memory-consolidation.d.ts +77 -0
  131. package/dist/services/memory-consolidation.d.ts.map +1 -0
  132. package/dist/services/memory-consolidation.js +298 -0
  133. package/dist/services/memory-consolidation.js.map +1 -0
  134. package/dist/services/semantic-search.d.ts +93 -0
  135. package/dist/services/semantic-search.d.ts.map +1 -0
  136. package/dist/services/semantic-search.js +278 -0
  137. package/dist/services/semantic-search.js.map +1 -0
  138. package/dist/services/weekly-digest.d.ts +105 -0
  139. package/dist/services/weekly-digest.d.ts.map +1 -0
  140. package/dist/services/weekly-digest.js +292 -0
  141. package/dist/services/weekly-digest.js.map +1 -0
  142. package/dist/types/index.d.ts +274 -0
  143. package/dist/types/index.d.ts.map +1 -0
  144. package/dist/types/index.js +84 -0
  145. package/dist/types/index.js.map +1 -0
  146. package/dist/utils/config.d.ts +21 -0
  147. package/dist/utils/config.d.ts.map +1 -0
  148. package/dist/utils/config.js +89 -0
  149. package/dist/utils/config.js.map +1 -0
  150. package/dist/utils/index.d.ts +6 -0
  151. package/dist/utils/index.d.ts.map +1 -0
  152. package/dist/utils/index.js +6 -0
  153. package/dist/utils/index.js.map +1 -0
  154. package/dist/utils/paths.d.ts +28 -0
  155. package/dist/utils/paths.d.ts.map +1 -0
  156. package/dist/utils/paths.js +80 -0
  157. package/dist/utils/paths.js.map +1 -0
  158. package/package.json +89 -0
  159. package/templates/memory-config.json +82 -0
  160. package/templates/memory-config.schema.json +212 -0
  161. package/templates/settings.json +58 -0
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Feedback Collector
3
+ *
4
+ * Collects and processes user feedback on memories and suggestions.
5
+ * Uses feedback to improve memory relevance over time.
6
+ */
7
+ import { createDrizzleClient } from '../db/drizzle-client.js';
8
+ // =============================================================================
9
+ // FEEDBACK COLLECTOR CLASS
10
+ // =============================================================================
11
+ export class FeedbackCollector {
12
+ client;
13
+ constructor(system) {
14
+ this.client = createDrizzleClient(system);
15
+ }
16
+ /**
17
+ * Submit feedback for a memory
18
+ */
19
+ async submitFeedback(memoryId, helpful, comment, context) {
20
+ const memory = await this.client.get(memoryId);
21
+ if (!memory) {
22
+ return { success: false };
23
+ }
24
+ const content = memory.content;
25
+ const feedback = (content.feedback ?? []);
26
+ // Add new feedback
27
+ feedback.push({
28
+ memoryId,
29
+ helpful,
30
+ comment,
31
+ context,
32
+ timestamp: new Date().toISOString(),
33
+ });
34
+ // Calculate new score based on feedback
35
+ const { newPriority, score } = this.calculateNewPriority(feedback, memory.priority ?? 'medium');
36
+ // Update memory with feedback and new priority
37
+ await this.client.update(memoryId, {
38
+ content: {
39
+ ...content,
40
+ feedback,
41
+ feedbackScore: score,
42
+ lastFeedbackAt: new Date().toISOString(),
43
+ },
44
+ priority: newPriority,
45
+ });
46
+ // Record feedback event
47
+ await this.recordFeedbackEvent(memoryId, helpful, comment);
48
+ return { success: true, newScore: score };
49
+ }
50
+ /**
51
+ * Calculate new priority based on feedback history
52
+ */
53
+ calculateNewPriority(feedback, currentPriority) {
54
+ if (feedback.length === 0) {
55
+ return { newPriority: currentPriority, score: 0.5 };
56
+ }
57
+ const helpfulCount = feedback.filter(f => f.helpful).length;
58
+ const totalCount = feedback.length;
59
+ const helpfulRate = helpfulCount / totalCount;
60
+ // Calculate score (0-1)
61
+ const score = helpfulRate;
62
+ // Determine priority based on score and feedback count
63
+ let newPriority = currentPriority;
64
+ if (totalCount >= 3) {
65
+ // Enough feedback to make adjustments
66
+ if (helpfulRate >= 0.8) {
67
+ newPriority = 'critical';
68
+ }
69
+ else if (helpfulRate >= 0.6) {
70
+ newPriority = 'high';
71
+ }
72
+ else if (helpfulRate >= 0.4) {
73
+ newPriority = 'medium';
74
+ }
75
+ else {
76
+ newPriority = 'low';
77
+ }
78
+ }
79
+ else if (totalCount >= 1) {
80
+ // Limited feedback - minor adjustments only
81
+ if (helpfulRate >= 0.7 && currentPriority !== 'critical') {
82
+ const priorities = ['low', 'medium', 'high', 'critical'];
83
+ const currentIdx = priorities.indexOf(currentPriority);
84
+ if (currentIdx < priorities.length - 1) {
85
+ newPriority = priorities[currentIdx + 1];
86
+ }
87
+ }
88
+ else if (helpfulRate <= 0.3 && currentPriority !== 'low') {
89
+ const priorities = ['low', 'medium', 'high', 'critical'];
90
+ const currentIdx = priorities.indexOf(currentPriority);
91
+ if (currentIdx > 0) {
92
+ newPriority = priorities[currentIdx - 1];
93
+ }
94
+ }
95
+ }
96
+ return { newPriority, score };
97
+ }
98
+ /**
99
+ * Record a feedback event for analytics
100
+ */
101
+ async recordFeedbackEvent(memoryId, helpful, comment) {
102
+ await this.client.create({
103
+ type: 'feedback_event',
104
+ status: 'recorded',
105
+ priority: 'low',
106
+ content: {
107
+ memoryId,
108
+ helpful,
109
+ comment,
110
+ timestamp: new Date().toISOString(),
111
+ },
112
+ tags: ['feedback', helpful ? 'helpful' : 'not-helpful'],
113
+ });
114
+ }
115
+ /**
116
+ * Get feedback statistics
117
+ */
118
+ async getStats() {
119
+ const feedbackEvents = await this.client.list({
120
+ type: 'feedback_event',
121
+ limit: 1000,
122
+ });
123
+ const helpfulCount = feedbackEvents.filter(e => e.content?.helpful).length;
124
+ const notHelpfulCount = feedbackEvents.length - helpfulCount;
125
+ // Get memories with their feedback
126
+ const memories = await this.client.list({ type: 'memory', limit: 500 });
127
+ // Calculate top helpful memories
128
+ const memoriesWithFeedback = memories
129
+ .map(m => {
130
+ const content = m.content;
131
+ const feedback = content.feedback ?? [];
132
+ const helpful = feedback.filter(f => f.helpful).length;
133
+ const unhelpful = feedback.filter(f => !f.helpful).length;
134
+ return {
135
+ id: m.id,
136
+ title: content.title ?? 'Untitled',
137
+ helpfulCount: helpful,
138
+ unhelpfulCount: unhelpful,
139
+ };
140
+ })
141
+ .filter(m => m.helpfulCount > 0 || m.unhelpfulCount > 0);
142
+ const topHelpful = memoriesWithFeedback
143
+ .sort((a, b) => b.helpfulCount - a.helpfulCount)
144
+ .slice(0, 5)
145
+ .map(m => ({ id: m.id, title: m.title, helpfulCount: m.helpfulCount }));
146
+ const topUnhelpful = memoriesWithFeedback
147
+ .filter(m => m.unhelpfulCount > 0)
148
+ .sort((a, b) => b.unhelpfulCount - a.unhelpfulCount)
149
+ .slice(0, 5)
150
+ .map(m => ({ id: m.id, title: m.title, unhelpfulCount: m.unhelpfulCount }));
151
+ return {
152
+ totalFeedback: feedbackEvents.length,
153
+ helpfulCount,
154
+ notHelpfulCount,
155
+ helpfulRate: feedbackEvents.length > 0 ? helpfulCount / feedbackEvents.length : 0,
156
+ topHelpfulMemories: topHelpful,
157
+ topUnhelpfulMemories: topUnhelpful,
158
+ };
159
+ }
160
+ /**
161
+ * Score memories for relevance (higher = more relevant)
162
+ */
163
+ async scoreMemories(memoryIds) {
164
+ const scores = [];
165
+ for (const memoryId of memoryIds) {
166
+ const memory = await this.client.get(memoryId);
167
+ if (!memory)
168
+ continue;
169
+ const content = memory.content;
170
+ const feedback = content.feedback ?? [];
171
+ const feedbackScore = content.feedbackScore ?? 0.5;
172
+ // Base score from priority
173
+ const priorityScores = {
174
+ critical: 1.0,
175
+ high: 0.75,
176
+ medium: 0.5,
177
+ low: 0.25,
178
+ };
179
+ const baseScore = priorityScores[memory.priority ?? 'medium'] ?? 0.5;
180
+ // Feedback boost (-0.3 to +0.3)
181
+ const feedbackBoost = (feedbackScore - 0.5) * 0.6;
182
+ // Confidence based on feedback count
183
+ const confidence = Math.min(1, feedback.length / 10);
184
+ scores.push({
185
+ memoryId,
186
+ baseScore,
187
+ feedbackBoost: feedbackBoost * confidence,
188
+ finalScore: Math.max(0, Math.min(1, baseScore + feedbackBoost * confidence)),
189
+ confidence,
190
+ });
191
+ }
192
+ return scores.sort((a, b) => b.finalScore - a.finalScore);
193
+ }
194
+ /**
195
+ * Suggest memories to deprecate based on negative feedback
196
+ */
197
+ async getSuggestedDeprecations() {
198
+ const memories = await this.client.list({ type: 'memory', limit: 500 });
199
+ return memories.filter(m => {
200
+ const content = m.content;
201
+ const feedbackScore = content.feedbackScore ?? 0.5;
202
+ const feedback = content.feedback ?? [];
203
+ // Suggest deprecation if:
204
+ // - Score is below 0.3 AND
205
+ // - Has at least 3 feedback entries
206
+ return feedbackScore < 0.3 && feedback.length >= 3;
207
+ });
208
+ }
209
+ /**
210
+ * Get memories that need more feedback
211
+ */
212
+ async getMemoriesNeedingFeedback(limit = 10) {
213
+ const memories = await this.client.list({ type: 'memory', limit: 100 });
214
+ // Sort by least feedback and return top N
215
+ return memories
216
+ .map(m => {
217
+ const content = m.content;
218
+ return { memory: m, feedbackCount: content.feedback?.length ?? 0 };
219
+ })
220
+ .sort((a, b) => a.feedbackCount - b.feedbackCount)
221
+ .slice(0, limit)
222
+ .map(m => m.memory);
223
+ }
224
+ }
225
+ // =============================================================================
226
+ // FACTORY
227
+ // =============================================================================
228
+ export function createFeedbackCollector(system) {
229
+ return new FeedbackCollector(system);
230
+ }
231
+ //# sourceMappingURL=collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector.js","sourceRoot":"","sources":["../../src/feedback/collector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Feedback module exports
3
+ */
4
+ export { FeedbackCollector, createFeedbackCollector, type FeedbackEntry, type FeedbackStats, type MemoryScore, } from './collector.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/feedback/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,WAAW,GACjB,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Feedback module exports
3
+ */
4
+ export { FeedbackCollector, createFeedbackCollector, } from './collector.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/feedback/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GAIxB,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Hooks module exports
3
+ */
4
+ export { SessionStartHook, runSessionStartHook } from './session-start.js';
5
+ export { PreToolUseHook, runPreToolUseHook } from './pre-tool-use.js';
6
+ export { PostToolUseHook, runPostToolUseHook } from './post-tool-use.js';
7
+ export { MemoryCheckpointHook, runMemoryCheckpointHook } from './memory-checkpoint.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAC1E,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACxE,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Hooks module exports
3
+ */
4
+ export { SessionStartHook, runSessionStartHook } from './session-start.js';
5
+ export { PreToolUseHook, runPreToolUseHook } from './pre-tool-use.js';
6
+ export { PostToolUseHook, runPostToolUseHook } from './post-tool-use.js';
7
+ export { MemoryCheckpointHook, runMemoryCheckpointHook } from './memory-checkpoint.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAC1E,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACxE,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Memory Checkpoint Hook - Executable
3
+ *
4
+ * Records learnings after significant code changes:
5
+ * 1. Tracks which files were modified
6
+ * 2. Extracts patterns from changes
7
+ * 3. Creates memory entries in DEV_Items
8
+ */
9
+ import type { HookResult } from '../types/index.js';
10
+ interface ExtractedPattern {
11
+ id: string;
12
+ description: string;
13
+ type: 'component' | 'api' | 'schema' | 'hook' | 'service' | 'bugfix' | 'refactor';
14
+ severity: 'critical' | 'high' | 'medium' | 'low';
15
+ }
16
+ interface CheckpointMemory {
17
+ title: string;
18
+ body: string;
19
+ domain: string;
20
+ files: string[];
21
+ patterns: ExtractedPattern[];
22
+ }
23
+ export declare class MemoryCheckpointHook {
24
+ private config;
25
+ private projectRoot;
26
+ /**
27
+ * Initialize the hook
28
+ */
29
+ init(projectRoot?: string): Promise<void>;
30
+ /**
31
+ * Execute the checkpoint hook
32
+ */
33
+ execute(): Promise<HookResult & {
34
+ checkpoint?: CheckpointMemory;
35
+ }>;
36
+ /**
37
+ * Manually trigger a checkpoint with custom data
38
+ */
39
+ createManualCheckpoint(title: string, body: string, domain: string, files: string[]): Promise<CheckpointMemory>;
40
+ }
41
+ export declare function runMemoryCheckpointHook(): Promise<void>;
42
+ export {};
43
+ //# sourceMappingURL=memory-checkpoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-checkpoint.d.ts","sourceRoot":"","sources":["../../src/hooks/memory-checkpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EACV,UAAU,EAIX,MAAM,mBAAmB,CAAA;AAkF1B,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAA;IACjF,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAA;CACjD;AAqED,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,QAAQ,EAAE,gBAAgB,EAAE,CAAA;CAC7B;AA4ED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,WAAW,CAAsB;IAEzC;;OAEG;IACG,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,UAAU,GAAG;QAAE,UAAU,CAAC,EAAE,gBAAgB,CAAA;KAAE,CAAC;IA2DxE;;OAEG;IACG,sBAAsB,CAC1B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,gBAAgB,CAAC;CAS7B;AAMD,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAQ7D"}
@@ -0,0 +1,257 @@
1
+ /**
2
+ * Memory Checkpoint Hook - Executable
3
+ *
4
+ * Records learnings after significant code changes:
5
+ * 1. Tracks which files were modified
6
+ * 2. Extracts patterns from changes
7
+ * 3. Creates memory entries in DEV_Items
8
+ */
9
+ import { exec } from 'child_process';
10
+ import { promisify } from 'util';
11
+ import { loadConfig } from '../utils/config.js';
12
+ import { getProjectRoot, matchesPattern } from '../utils/paths.js';
13
+ const execAsync = promisify(exec);
14
+ /**
15
+ * Get recent file changes from git
16
+ */
17
+ async function getRecentChanges(projectRoot) {
18
+ try {
19
+ // Get staged changes
20
+ const { stdout } = await execAsync('git diff --cached --numstat', { cwd: projectRoot });
21
+ const changes = [];
22
+ for (const line of stdout.trim().split('\n').filter(Boolean)) {
23
+ const [added, removed, file] = line.split('\t');
24
+ if (!file)
25
+ continue;
26
+ changes.push({
27
+ path: file,
28
+ type: added === '0' && removed !== '0' ? 'delete'
29
+ : removed === '0' && added !== '0' ? 'add'
30
+ : 'modify',
31
+ linesAdded: parseInt(added ?? '0', 10) || 0,
32
+ linesRemoved: parseInt(removed ?? '0', 10) || 0,
33
+ });
34
+ }
35
+ return changes;
36
+ }
37
+ catch {
38
+ return [];
39
+ }
40
+ }
41
+ /**
42
+ * Check if changes are significant enough for checkpoint
43
+ */
44
+ function isSignificantChange(changes, config) {
45
+ // Check total lines changed
46
+ const totalLines = changes.reduce((sum, c) => sum + c.linesAdded + c.linesRemoved, 0);
47
+ if (totalLines >= config.checkpoint.minLinesChanged) {
48
+ return true;
49
+ }
50
+ // Check if any critical path was modified
51
+ for (const change of changes) {
52
+ if (matchesPattern(change.path, config.checkpoint.criticalPaths)) {
53
+ return true;
54
+ }
55
+ }
56
+ return false;
57
+ }
58
+ /**
59
+ * Extract patterns from file changes
60
+ */
61
+ function extractPatterns(changes) {
62
+ const patterns = [];
63
+ for (const change of changes) {
64
+ const path = change.path.toLowerCase();
65
+ // Schema changes are critical
66
+ if (path.includes('/schema/')) {
67
+ patterns.push({
68
+ id: `schema-change-${Date.now()}`,
69
+ description: `Schema modification: ${change.path}`,
70
+ type: 'schema',
71
+ severity: 'critical',
72
+ });
73
+ }
74
+ // API changes are high priority
75
+ if (path.includes('/api/') || path.includes('/routers/')) {
76
+ patterns.push({
77
+ id: `api-change-${Date.now()}`,
78
+ description: `API modification: ${change.path}`,
79
+ type: 'api',
80
+ severity: 'high',
81
+ });
82
+ }
83
+ // New components
84
+ if (change.type === 'add' && path.includes('/components/')) {
85
+ patterns.push({
86
+ id: `new-component-${Date.now()}`,
87
+ description: `New component: ${change.path}`,
88
+ type: 'component',
89
+ severity: 'medium',
90
+ });
91
+ }
92
+ // New hooks
93
+ if (change.type === 'add' && path.includes('/hooks/')) {
94
+ patterns.push({
95
+ id: `new-hook-${Date.now()}`,
96
+ description: `New hook: ${change.path}`,
97
+ type: 'hook',
98
+ severity: 'medium',
99
+ });
100
+ }
101
+ // Services
102
+ if (path.includes('/services/')) {
103
+ patterns.push({
104
+ id: `service-change-${Date.now()}`,
105
+ description: `Service modification: ${change.path}`,
106
+ type: 'service',
107
+ severity: 'high',
108
+ });
109
+ }
110
+ }
111
+ return patterns;
112
+ }
113
+ /**
114
+ * Create a memory entry from changes
115
+ */
116
+ function createCheckpointMemory(changes, patterns, config) {
117
+ // Detect domain from most common path
118
+ const domainCounts = new Map();
119
+ for (const change of changes) {
120
+ for (const domain of config.domains) {
121
+ if (change.path.toLowerCase().includes(domain.replace(/-/g, '/'))) {
122
+ domainCounts.set(domain, (domainCounts.get(domain) ?? 0) + 1);
123
+ }
124
+ }
125
+ }
126
+ let detectedDomain = 'general';
127
+ let maxCount = 0;
128
+ for (const [domain, count] of domainCounts) {
129
+ if (count > maxCount) {
130
+ maxCount = count;
131
+ detectedDomain = domain;
132
+ }
133
+ }
134
+ // Build title
135
+ const changeTypes = new Set(patterns.map(p => p.type));
136
+ const typeStr = Array.from(changeTypes).slice(0, 3).join(', ');
137
+ const title = `Checkpoint: ${typeStr} changes in ${detectedDomain}`;
138
+ // Build body
139
+ const lines = [];
140
+ lines.push(`## Changes Summary`);
141
+ lines.push('');
142
+ lines.push(`**Domain**: ${detectedDomain}`);
143
+ lines.push(`**Files modified**: ${changes.length}`);
144
+ lines.push(`**Total lines**: +${changes.reduce((s, c) => s + c.linesAdded, 0)} / -${changes.reduce((s, c) => s + c.linesRemoved, 0)}`);
145
+ lines.push('');
146
+ if (patterns.length > 0) {
147
+ lines.push(`## Patterns Detected`);
148
+ lines.push('');
149
+ for (const pattern of patterns) {
150
+ lines.push(`- **${pattern.type}** (${pattern.severity}): ${pattern.description}`);
151
+ }
152
+ lines.push('');
153
+ }
154
+ lines.push(`## Files`);
155
+ lines.push('');
156
+ for (const change of changes.slice(0, 10)) {
157
+ const indicator = change.type === 'add' ? '+' : change.type === 'delete' ? '-' : '~';
158
+ lines.push(`- ${indicator} ${change.path}`);
159
+ }
160
+ if (changes.length > 10) {
161
+ lines.push(`- ... and ${changes.length - 10} more files`);
162
+ }
163
+ return {
164
+ title,
165
+ body: lines.join('\n'),
166
+ domain: detectedDomain,
167
+ files: changes.map(c => c.path),
168
+ patterns,
169
+ };
170
+ }
171
+ // =============================================================================
172
+ // MAIN HOOK CLASS
173
+ // =============================================================================
174
+ export class MemoryCheckpointHook {
175
+ config = null;
176
+ projectRoot = null;
177
+ /**
178
+ * Initialize the hook
179
+ */
180
+ async init(projectRoot) {
181
+ this.projectRoot = projectRoot ?? await getProjectRoot();
182
+ this.config = await loadConfig(this.projectRoot);
183
+ }
184
+ /**
185
+ * Execute the checkpoint hook
186
+ */
187
+ async execute() {
188
+ if (!this.config || !this.projectRoot) {
189
+ await this.init();
190
+ }
191
+ const config = this.config;
192
+ const projectRoot = this.projectRoot;
193
+ // Check if checkpointing is enabled
194
+ if (!config.checkpoint.enabled) {
195
+ return { mode: 'proceed' };
196
+ }
197
+ try {
198
+ // 1. Get recent changes
199
+ const changes = await getRecentChanges(projectRoot);
200
+ if (changes.length === 0) {
201
+ return { mode: 'proceed' };
202
+ }
203
+ // 2. Filter excluded paths
204
+ const filteredChanges = changes.filter(c => !matchesPattern(c.path, config.checkpoint.excludePaths));
205
+ // 3. Check if significant
206
+ if (!isSignificantChange(filteredChanges, config)) {
207
+ return { mode: 'proceed' };
208
+ }
209
+ // 4. Extract patterns
210
+ const patterns = config.checkpoint.patternDetection
211
+ ? extractPatterns(filteredChanges)
212
+ : [];
213
+ // 5. Create memory entry
214
+ const checkpoint = createCheckpointMemory(filteredChanges, patterns, config);
215
+ console.log(`📝 [Checkpoint] Created: ${checkpoint.title}`);
216
+ console.log(` Files: ${checkpoint.files.length}, Patterns: ${checkpoint.patterns.length}`);
217
+ // In real implementation, this would save to database
218
+ // await this.saveCheckpoint(checkpoint)
219
+ return {
220
+ mode: 'proceed',
221
+ checkpoint,
222
+ };
223
+ }
224
+ catch (error) {
225
+ console.error('[Checkpoint] Error:', error);
226
+ return { mode: 'proceed' };
227
+ }
228
+ }
229
+ /**
230
+ * Manually trigger a checkpoint with custom data
231
+ */
232
+ async createManualCheckpoint(title, body, domain, files) {
233
+ return {
234
+ title,
235
+ body,
236
+ domain,
237
+ files,
238
+ patterns: [],
239
+ };
240
+ }
241
+ }
242
+ // =============================================================================
243
+ // STANDALONE EXECUTION
244
+ // =============================================================================
245
+ export async function runMemoryCheckpointHook() {
246
+ const hook = new MemoryCheckpointHook();
247
+ const result = await hook.execute();
248
+ if (result.checkpoint) {
249
+ console.log('\n--- Checkpoint Data ---');
250
+ console.log(JSON.stringify(result.checkpoint, null, 2));
251
+ }
252
+ }
253
+ // Execute if run directly
254
+ if (import.meta.url === `file://${process.argv[1]}`) {
255
+ runMemoryCheckpointHook().catch(console.error);
256
+ }
257
+ //# sourceMappingURL=memory-checkpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-checkpoint.js","sourceRoot":"","sources":["../../src/hooks/memory-checkpoint.ts"],"names":[],"mappings":"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"}