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.
- package/README.md +541 -0
- package/dist/analytics/index.d.ts +5 -0
- package/dist/analytics/index.d.ts.map +1 -0
- package/dist/analytics/index.js +5 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/tracker.d.ts +107 -0
- package/dist/analytics/tracker.d.ts.map +1 -0
- package/dist/analytics/tracker.js +333 -0
- package/dist/analytics/tracker.js.map +1 -0
- package/dist/auto-improve/eslint-generator.d.ts +36 -0
- package/dist/auto-improve/eslint-generator.d.ts.map +1 -0
- package/dist/auto-improve/eslint-generator.js +280 -0
- package/dist/auto-improve/eslint-generator.js.map +1 -0
- package/dist/auto-improve/index.d.ts +6 -0
- package/dist/auto-improve/index.d.ts.map +1 -0
- package/dist/auto-improve/index.js +6 -0
- package/dist/auto-improve/index.js.map +1 -0
- package/dist/auto-improve/pattern-detector.d.ts +92 -0
- package/dist/auto-improve/pattern-detector.d.ts.map +1 -0
- package/dist/auto-improve/pattern-detector.js +231 -0
- package/dist/auto-improve/pattern-detector.js.map +1 -0
- package/dist/cli/index.d.ts +16 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +636 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/dashboard/index.d.ts +6 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +6 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/server.d.ts +15 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +373 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/dashboard/ui.d.ts +9 -0
- package/dist/dashboard/ui.d.ts.map +1 -0
- package/dist/dashboard/ui.js +530 -0
- package/dist/dashboard/ui.js.map +1 -0
- package/dist/db/client.d.ts +66 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +159 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/drizzle-client.d.ts +302 -0
- package/dist/db/drizzle-client.d.ts.map +1 -0
- package/dist/db/drizzle-client.js +404 -0
- package/dist/db/drizzle-client.js.map +1 -0
- package/dist/db/index.d.ts +5 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +5 -0
- package/dist/db/index.js.map +1 -0
- package/dist/feedback/collector.d.ts +74 -0
- package/dist/feedback/collector.d.ts.map +1 -0
- package/dist/feedback/collector.js +231 -0
- package/dist/feedback/collector.js.map +1 -0
- package/dist/feedback/index.d.ts +5 -0
- package/dist/feedback/index.d.ts.map +1 -0
- package/dist/feedback/index.js +5 -0
- package/dist/feedback/index.js.map +1 -0
- package/dist/hooks/index.d.ts +8 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +8 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/memory-checkpoint.d.ts +43 -0
- package/dist/hooks/memory-checkpoint.d.ts.map +1 -0
- package/dist/hooks/memory-checkpoint.js +257 -0
- package/dist/hooks/memory-checkpoint.js.map +1 -0
- package/dist/hooks/post-tool-use.d.ts +61 -0
- package/dist/hooks/post-tool-use.d.ts.map +1 -0
- package/dist/hooks/post-tool-use.js +262 -0
- package/dist/hooks/post-tool-use.js.map +1 -0
- package/dist/hooks/pre-tool-use.d.ts +34 -0
- package/dist/hooks/pre-tool-use.d.ts.map +1 -0
- package/dist/hooks/pre-tool-use.js +358 -0
- package/dist/hooks/pre-tool-use.js.map +1 -0
- package/dist/hooks/session-start.d.ts +38 -0
- package/dist/hooks/session-start.d.ts.map +1 -0
- package/dist/hooks/session-start.js +274 -0
- package/dist/hooks/session-start.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +5 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +5 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +42 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +599 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/registry/embeddings.d.ts +38 -0
- package/dist/registry/embeddings.d.ts.map +1 -0
- package/dist/registry/embeddings.js +110 -0
- package/dist/registry/embeddings.js.map +1 -0
- package/dist/registry/generator.d.ts +41 -0
- package/dist/registry/generator.d.ts.map +1 -0
- package/dist/registry/generator.js +323 -0
- package/dist/registry/generator.js.map +1 -0
- package/dist/registry/index.d.ts +6 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +6 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/services/IdeaCollector.d.ts +103 -0
- package/dist/services/IdeaCollector.d.ts.map +1 -0
- package/dist/services/IdeaCollector.js +371 -0
- package/dist/services/IdeaCollector.js.map +1 -0
- package/dist/services/TaskTracker.d.ts +89 -0
- package/dist/services/TaskTracker.d.ts.map +1 -0
- package/dist/services/TaskTracker.js +324 -0
- package/dist/services/TaskTracker.js.map +1 -0
- package/dist/services/WorkPlanManager.d.ts +107 -0
- package/dist/services/WorkPlanManager.d.ts.map +1 -0
- package/dist/services/WorkPlanManager.js +440 -0
- package/dist/services/WorkPlanManager.js.map +1 -0
- package/dist/services/auto-inject.d.ts +77 -0
- package/dist/services/auto-inject.d.ts.map +1 -0
- package/dist/services/auto-inject.js +289 -0
- package/dist/services/auto-inject.js.map +1 -0
- package/dist/services/auto-tag.d.ts +61 -0
- package/dist/services/auto-tag.d.ts.map +1 -0
- package/dist/services/auto-tag.js +203 -0
- package/dist/services/auto-tag.js.map +1 -0
- package/dist/services/cross-project-sync.d.ts +76 -0
- package/dist/services/cross-project-sync.d.ts.map +1 -0
- package/dist/services/cross-project-sync.js +235 -0
- package/dist/services/cross-project-sync.js.map +1 -0
- package/dist/services/index.d.ts +15 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +18 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/memory-consolidation.d.ts +77 -0
- package/dist/services/memory-consolidation.d.ts.map +1 -0
- package/dist/services/memory-consolidation.js +298 -0
- package/dist/services/memory-consolidation.js.map +1 -0
- package/dist/services/semantic-search.d.ts +93 -0
- package/dist/services/semantic-search.d.ts.map +1 -0
- package/dist/services/semantic-search.js +278 -0
- package/dist/services/semantic-search.js.map +1 -0
- package/dist/services/weekly-digest.d.ts +105 -0
- package/dist/services/weekly-digest.d.ts.map +1 -0
- package/dist/services/weekly-digest.js +292 -0
- package/dist/services/weekly-digest.js.map +1 -0
- package/dist/types/index.d.ts +274 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +84 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/config.d.ts +21 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +89 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/paths.d.ts +28 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +80 -0
- package/dist/utils/paths.js.map +1 -0
- package/package.json +89 -0
- package/templates/memory-config.json +82 -0
- package/templates/memory-config.schema.json +212 -0
- 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":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,mBAAmB,EAA4B,MAAM,yBAAyB,CAAA;AA+BvF,gFAAgF;AAChF,2BAA2B;AAC3B,gFAAgF;AAEhF,MAAM,OAAO,iBAAiB;IACpB,MAAM,CAAqB;IAEnC,YAAY,MAAiB;QAC3B,IAAI,CAAC,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAA;IAC3C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAClB,QAAgB,EAChB,OAAgB,EAChB,OAAgB,EAChB,OAAgB;QAEhB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;QAC3B,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAkC,CAAA;QACzD,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAoB,CAAA;QAE5D,mBAAmB;QACnB,QAAQ,CAAC,IAAI,CAAC;YACZ,QAAQ;YACR,OAAO;YACP,OAAO;YACP,OAAO;YACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAA;QAEF,wCAAwC;QACxC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAA;QAE/F,+CAA+C;QAC/C,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;YACjC,OAAO,EAAE;gBACP,GAAG,OAAO;gBACV,QAAQ;gBACR,aAAa,EAAE,KAAK;gBACpB,cAAc,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACzC;YACD,QAAQ,EAAE,WAAW;SACtB,CAAC,CAAA;QAEF,wBAAwB;QACxB,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;QAE1D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAA;IAC3C,CAAC;IAED;;OAEG;IACK,oBAAoB,CAC1B,QAAyB,EACzB,eAAuB;QAEvB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,EAAE,CAAA;QACrD,CAAC;QAED,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAA;QAC3D,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAA;QAClC,MAAM,WAAW,GAAG,YAAY,GAAG,UAAU,CAAA;QAE7C,wBAAwB;QACxB,MAAM,KAAK,GAAG,WAAW,CAAA;QAEzB,uDAAuD;QACvD,IAAI,WAAW,GAAG,eAAe,CAAA;QAEjC,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;YACpB,sCAAsC;YACtC,IAAI,WAAW,IAAI,GAAG,EAAE,CAAC;gBACvB,WAAW,GAAG,UAAU,CAAA;YAC1B,CAAC;iBAAM,IAAI,WAAW,IAAI,GAAG,EAAE,CAAC;gBAC9B,WAAW,GAAG,MAAM,CAAA;YACtB,CAAC;iBAAM,IAAI,WAAW,IAAI,GAAG,EAAE,CAAC;gBAC9B,WAAW,GAAG,QAAQ,CAAA;YACxB,CAAC;iBAAM,CAAC;gBACN,WAAW,GAAG,KAAK,CAAA;YACrB,CAAC;QACH,CAAC;aAAM,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;YAC3B,4CAA4C;YAC5C,IAAI,WAAW,IAAI,GAAG,IAAI,eAAe,KAAK,UAAU,EAAE,CAAC;gBACzD,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;gBACxD,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;gBACtD,IAAI,UAAU,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvC,WAAW,GAAG,UAAU,CAAC,UAAU,GAAG,CAAC,CAAE,CAAA;gBAC3C,CAAC;YACH,CAAC;iBAAM,IAAI,WAAW,IAAI,GAAG,IAAI,eAAe,KAAK,KAAK,EAAE,CAAC;gBAC3D,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;gBACxD,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;gBACtD,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;oBACnB,WAAW,GAAG,UAAU,CAAC,UAAU,GAAG,CAAC,CAAE,CAAA;gBAC3C,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAA;IAC/B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB,CAC/B,QAAgB,EAChB,OAAgB,EAChB,OAAgB;QAEhB,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YACvB,IAAI,EAAE,gBAAgB;YACtB,MAAM,EAAE,UAAU;YAClB,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE;gBACP,QAAQ;gBACR,OAAO;gBACP,OAAO;gBACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC;YACD,IAAI,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC;SACxD,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YAC5C,IAAI,EAAE,gBAAgB;YACtB,KAAK,EAAE,IAAI;SACZ,CAAC,CAAA;QAEF,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC5C,CAAC,CAAC,OAAgC,EAAE,OAAO,CAC7C,CAAC,MAAM,CAAA;QACR,MAAM,eAAe,GAAG,cAAc,CAAC,MAAM,GAAG,YAAY,CAAA;QAE5D,mCAAmC;QACnC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;QAEvE,iCAAiC;QACjC,MAAM,oBAAoB,GAAG,QAAQ;aAClC,GAAG,CAAC,CAAC,CAAC,EAAE;YACP,MAAM,OAAO,GAAG,CAAC,CAAC,OAAoE,CAAA;YACtF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAA;YACvC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAA;YACtD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAA;YACzD,OAAO;gBACL,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,UAAU;gBAClC,YAAY,EAAE,OAAO;gBACrB,cAAc,EAAE,SAAS;aAC1B,CAAA;QACH,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,CAAA;QAE1D,MAAM,UAAU,GAAG,oBAAoB;aACpC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC;aAC/C,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAA;QAEzE,MAAM,YAAY,GAAG,oBAAoB;aACtC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC;aACjC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAC;aACnD,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAA;QAE7E,OAAO;YACL,aAAa,EAAE,cAAc,CAAC,MAAM;YACpC,YAAY;YACZ,eAAe;YACf,WAAW,EAAE,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACjF,kBAAkB,EAAE,UAAU;YAC9B,oBAAoB,EAAE,YAAY;SACnC,CAAA;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,SAAmB;QACrC,MAAM,MAAM,GAAkB,EAAE,CAAA;QAEhC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAC9C,IAAI,CAAC,MAAM;gBAAE,SAAQ;YAErB,MAAM,OAAO,GAAG,MAAM,CAAC,OAA4F,CAAA;YACnH,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAA;YACvC,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,GAAG,CAAA;YAElD,2BAA2B;YAC3B,MAAM,cAAc,GAA2B;gBAC7C,QAAQ,EAAE,GAAG;gBACb,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,GAAG;gBACX,GAAG,EAAE,IAAI;aACV,CAAA;YACD,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAA;YAEpE,gCAAgC;YAChC,MAAM,aAAa,GAAG,CAAC,aAAa,GAAG,GAAG,CAAC,GAAG,GAAG,CAAA;YAEjD,qCAAqC;YACrC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;YAEpD,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ;gBACR,SAAS;gBACT,aAAa,EAAE,aAAa,GAAG,UAAU;gBACzC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,UAAU,CAAC,CAAC;gBAC5E,UAAU;aACX,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAA;IAC3D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,wBAAwB;QAC5B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;QAEvE,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YACzB,MAAM,OAAO,GAAG,CAAC,CAAC,OAA4F,CAAA;YAC9G,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,GAAG,CAAA;YAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAA;YAEvC,0BAA0B;YAC1B,2BAA2B;YAC3B,oCAAoC;YACpC,OAAO,aAAa,GAAG,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAA;QACpD,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,0BAA0B,CAAC,KAAK,GAAG,EAAE;QACzC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;QAEvE,0CAA0C;QAC1C,OAAO,QAAQ;aACZ,GAAG,CAAC,CAAC,CAAC,EAAE;YACP,MAAM,OAAO,GAAG,CAAC,CAAC,OAAoE,CAAA;YACtF,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAE,CAAA;QACpE,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,CAAC;aACjD,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;aACf,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;IACvB,CAAC;CACF;AAED,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAA;AACtC,CAAC"}
|
|
@@ -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 @@
|
|
|
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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"}
|