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,333 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics Tracker
|
|
3
|
+
*
|
|
4
|
+
* Tracks memory system usage and provides insights for optimization.
|
|
5
|
+
*/
|
|
6
|
+
import { createDrizzleClient } from '../db/drizzle-client.js';
|
|
7
|
+
// =============================================================================
|
|
8
|
+
// ANALYTICS TRACKER CLASS
|
|
9
|
+
// =============================================================================
|
|
10
|
+
export class AnalyticsTracker {
|
|
11
|
+
client;
|
|
12
|
+
system;
|
|
13
|
+
constructor(system) {
|
|
14
|
+
this.system = system;
|
|
15
|
+
this.client = createDrizzleClient(system);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Track an analytics event
|
|
19
|
+
*/
|
|
20
|
+
async track(type, metadata = {}) {
|
|
21
|
+
await this.client.create({
|
|
22
|
+
type: 'analytics_event',
|
|
23
|
+
status: 'recorded',
|
|
24
|
+
priority: 'low',
|
|
25
|
+
content: {
|
|
26
|
+
eventType: type,
|
|
27
|
+
metadata,
|
|
28
|
+
timestamp: new Date().toISOString(),
|
|
29
|
+
},
|
|
30
|
+
tags: ['analytics', type],
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get usage statistics for a time period
|
|
35
|
+
*/
|
|
36
|
+
async getUsageStats(period = 'week') {
|
|
37
|
+
const now = new Date();
|
|
38
|
+
const periodStart = new Date();
|
|
39
|
+
switch (period) {
|
|
40
|
+
case 'day':
|
|
41
|
+
periodStart.setDate(now.getDate() - 1);
|
|
42
|
+
break;
|
|
43
|
+
case 'week':
|
|
44
|
+
periodStart.setDate(now.getDate() - 7);
|
|
45
|
+
break;
|
|
46
|
+
case 'month':
|
|
47
|
+
periodStart.setMonth(now.getMonth() - 1);
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
// Get all analytics events
|
|
51
|
+
const events = await this.client.list({
|
|
52
|
+
type: 'analytics_event',
|
|
53
|
+
limit: 10000,
|
|
54
|
+
});
|
|
55
|
+
// Filter by period
|
|
56
|
+
const periodEvents = events.filter(e => {
|
|
57
|
+
const content = e.content;
|
|
58
|
+
if (!content.timestamp)
|
|
59
|
+
return false;
|
|
60
|
+
return new Date(content.timestamp) >= periodStart;
|
|
61
|
+
});
|
|
62
|
+
// Count by event type
|
|
63
|
+
const countByType = (type) => periodEvents.filter(e => {
|
|
64
|
+
const content = e.content;
|
|
65
|
+
return content.eventType === type;
|
|
66
|
+
}).length;
|
|
67
|
+
// Get sessions
|
|
68
|
+
const sessions = await this.client.list({
|
|
69
|
+
type: 'agent_session',
|
|
70
|
+
limit: 1000,
|
|
71
|
+
});
|
|
72
|
+
const periodSessions = sessions.filter(s => {
|
|
73
|
+
const createdAt = s.createdAt;
|
|
74
|
+
return createdAt && new Date(createdAt) >= periodStart;
|
|
75
|
+
});
|
|
76
|
+
// Calculate avg session duration
|
|
77
|
+
let totalDuration = 0;
|
|
78
|
+
let sessionCount = 0;
|
|
79
|
+
for (const session of periodSessions) {
|
|
80
|
+
const content = session.content;
|
|
81
|
+
if (content.startedAt && content.endedAt) {
|
|
82
|
+
totalDuration += new Date(content.endedAt).getTime() - new Date(content.startedAt).getTime();
|
|
83
|
+
sessionCount++;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const avgSessionDuration = sessionCount > 0 ? totalDuration / sessionCount / 1000 : 0;
|
|
87
|
+
return {
|
|
88
|
+
period,
|
|
89
|
+
sessions: periodSessions.length,
|
|
90
|
+
memoriesCreated: countByType('memory_create'),
|
|
91
|
+
memoriesAccessed: countByType('memory_access'),
|
|
92
|
+
searchesPerformed: countByType('search_performed'),
|
|
93
|
+
patternsDetected: countByType('pattern_detected'),
|
|
94
|
+
feedbackGiven: countByType('feedback_given'),
|
|
95
|
+
avgSessionDuration,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get memory insights
|
|
100
|
+
*/
|
|
101
|
+
async getMemoryInsights() {
|
|
102
|
+
const memories = await this.client.list({ type: 'memory', limit: 1000 });
|
|
103
|
+
const events = await this.client.list({ type: 'analytics_event', limit: 10000 });
|
|
104
|
+
// Count access by memory ID
|
|
105
|
+
const accessCounts = new Map();
|
|
106
|
+
for (const event of events) {
|
|
107
|
+
const content = event.content;
|
|
108
|
+
if (content.eventType === 'memory_access' && content.metadata?.memoryId) {
|
|
109
|
+
const id = content.metadata.memoryId;
|
|
110
|
+
accessCounts.set(id, (accessCounts.get(id) ?? 0) + 1);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Most accessed memories
|
|
114
|
+
const mostAccessedMemories = memories
|
|
115
|
+
.map(m => ({
|
|
116
|
+
id: m.id,
|
|
117
|
+
title: m.content?.title ?? 'Untitled',
|
|
118
|
+
accessCount: accessCounts.get(m.id) ?? 0,
|
|
119
|
+
}))
|
|
120
|
+
.filter(m => m.accessCount > 0)
|
|
121
|
+
.sort((a, b) => b.accessCount - a.accessCount)
|
|
122
|
+
.slice(0, 10);
|
|
123
|
+
// Least used memories (no access in 30+ days)
|
|
124
|
+
const thirtyDaysAgo = new Date();
|
|
125
|
+
thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30);
|
|
126
|
+
const leastUsedMemories = memories
|
|
127
|
+
.filter(m => {
|
|
128
|
+
const updatedAt = m.updatedAt ?? m.createdAt;
|
|
129
|
+
return updatedAt && new Date(updatedAt) < thirtyDaysAgo;
|
|
130
|
+
})
|
|
131
|
+
.map(m => {
|
|
132
|
+
const updatedAt = m.updatedAt ?? m.createdAt;
|
|
133
|
+
const daysSinceAccess = updatedAt
|
|
134
|
+
? Math.floor((Date.now() - new Date(updatedAt).getTime()) / (1000 * 60 * 60 * 24))
|
|
135
|
+
: 999;
|
|
136
|
+
return {
|
|
137
|
+
id: m.id,
|
|
138
|
+
title: m.content?.title ?? 'Untitled',
|
|
139
|
+
daysSinceAccess,
|
|
140
|
+
};
|
|
141
|
+
})
|
|
142
|
+
.sort((a, b) => b.daysSinceAccess - a.daysSinceAccess)
|
|
143
|
+
.slice(0, 10);
|
|
144
|
+
// Domain distribution
|
|
145
|
+
const domainDistribution = {};
|
|
146
|
+
for (const memory of memories) {
|
|
147
|
+
const domain = memory.content?.domain ?? 'general';
|
|
148
|
+
domainDistribution[domain] = (domainDistribution[domain] ?? 0) + 1;
|
|
149
|
+
}
|
|
150
|
+
// Source distribution
|
|
151
|
+
const sourceDistribution = {};
|
|
152
|
+
for (const memory of memories) {
|
|
153
|
+
const source = memory.content?.source ?? 'unknown';
|
|
154
|
+
sourceDistribution[source] = (sourceDistribution[source] ?? 0) + 1;
|
|
155
|
+
}
|
|
156
|
+
// Memory growth trend (last 30 days)
|
|
157
|
+
const memoryGrowthTrend = [];
|
|
158
|
+
const today = new Date();
|
|
159
|
+
for (let i = 29; i >= 0; i--) {
|
|
160
|
+
const date = new Date(today);
|
|
161
|
+
date.setDate(date.getDate() - i);
|
|
162
|
+
const dateStr = date.toISOString().split('T')[0];
|
|
163
|
+
const count = memories.filter(m => {
|
|
164
|
+
const createdAt = m.createdAt;
|
|
165
|
+
if (!createdAt)
|
|
166
|
+
return false;
|
|
167
|
+
return new Date(createdAt).toISOString().split('T')[0] === dateStr;
|
|
168
|
+
}).length;
|
|
169
|
+
memoryGrowthTrend.push({ date: dateStr, count });
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
mostAccessedMemories,
|
|
173
|
+
leastUsedMemories,
|
|
174
|
+
domainDistribution,
|
|
175
|
+
sourceDistribution,
|
|
176
|
+
memoryGrowthTrend,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Get pattern insights
|
|
181
|
+
*/
|
|
182
|
+
async getPatternInsights() {
|
|
183
|
+
const patterns = await this.client.list({ type: 'pattern', limit: 500 });
|
|
184
|
+
// Most frequent patterns
|
|
185
|
+
const mostFrequentPatterns = patterns
|
|
186
|
+
.map(p => {
|
|
187
|
+
const content = p.content;
|
|
188
|
+
return {
|
|
189
|
+
patternId: content.patternId,
|
|
190
|
+
occurrences: content.occurrences,
|
|
191
|
+
severity: content.severity,
|
|
192
|
+
};
|
|
193
|
+
})
|
|
194
|
+
.sort((a, b) => b.occurrences - a.occurrences)
|
|
195
|
+
.slice(0, 10);
|
|
196
|
+
// Patterns over time (last 30 days)
|
|
197
|
+
const patternsOverTime = [];
|
|
198
|
+
// Simplified: just show current state
|
|
199
|
+
for (const pattern of patterns) {
|
|
200
|
+
const content = pattern.content;
|
|
201
|
+
patternsOverTime.push({
|
|
202
|
+
date: content.lastSeen ?? new Date().toISOString().split('T')[0],
|
|
203
|
+
patternId: content.patternId,
|
|
204
|
+
count: content.occurrences,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
// Auto-improvement candidates (3+ occurrences)
|
|
208
|
+
const autoImprovementCandidates = patterns
|
|
209
|
+
.filter(p => {
|
|
210
|
+
const content = p.content;
|
|
211
|
+
return content.occurrences >= 3;
|
|
212
|
+
})
|
|
213
|
+
.map(p => {
|
|
214
|
+
const content = p.content;
|
|
215
|
+
return {
|
|
216
|
+
patternId: content.patternId,
|
|
217
|
+
occurrences: content.occurrences,
|
|
218
|
+
files: content.files.length,
|
|
219
|
+
};
|
|
220
|
+
})
|
|
221
|
+
.sort((a, b) => b.occurrences - a.occurrences);
|
|
222
|
+
return {
|
|
223
|
+
mostFrequentPatterns,
|
|
224
|
+
patternsOverTime,
|
|
225
|
+
autoImprovementCandidates,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Get system health status
|
|
230
|
+
*/
|
|
231
|
+
async getSystemHealth() {
|
|
232
|
+
const [stats, memories, patterns, sessions, feedbackEvents] = await Promise.all([
|
|
233
|
+
this.client.getStats(),
|
|
234
|
+
this.client.list({ type: 'memory', limit: 1000 }),
|
|
235
|
+
this.client.list({ type: 'pattern', limit: 500 }),
|
|
236
|
+
this.client.list({ type: 'agent_session', limit: 100 }),
|
|
237
|
+
this.client.list({ type: 'feedback_event', limit: 1000 }),
|
|
238
|
+
]);
|
|
239
|
+
const issues = [];
|
|
240
|
+
const recommendations = [];
|
|
241
|
+
// Check for triggered patterns
|
|
242
|
+
const triggeredPatterns = patterns.filter(p => {
|
|
243
|
+
const content = p.content;
|
|
244
|
+
return content.occurrences >= 3;
|
|
245
|
+
});
|
|
246
|
+
if (triggeredPatterns.length > 0) {
|
|
247
|
+
issues.push(`${triggeredPatterns.length} patterns have reached auto-improvement threshold`);
|
|
248
|
+
recommendations.push('Run "claude-memory improve" to generate ESLint rules');
|
|
249
|
+
}
|
|
250
|
+
// Check feedback rate
|
|
251
|
+
const feedbackRate = memories.length > 0 ? feedbackEvents.length / memories.length : 0;
|
|
252
|
+
if (feedbackRate < 0.1) {
|
|
253
|
+
recommendations.push('Consider requesting more feedback on memories to improve relevance');
|
|
254
|
+
}
|
|
255
|
+
// Check for stale memories (no updates in 60+ days)
|
|
256
|
+
const sixtyDaysAgo = new Date();
|
|
257
|
+
sixtyDaysAgo.setDate(sixtyDaysAgo.getDate() - 60);
|
|
258
|
+
const staleMemories = memories.filter(m => {
|
|
259
|
+
const updatedAt = m.updatedAt ?? m.createdAt;
|
|
260
|
+
return updatedAt && new Date(updatedAt) < sixtyDaysAgo;
|
|
261
|
+
});
|
|
262
|
+
if (staleMemories.length > memories.length * 0.3) {
|
|
263
|
+
issues.push(`${staleMemories.length} memories haven't been updated in 60+ days`);
|
|
264
|
+
recommendations.push('Review and archive stale memories');
|
|
265
|
+
}
|
|
266
|
+
// Calculate average memory age
|
|
267
|
+
let totalAge = 0;
|
|
268
|
+
let memoryCount = 0;
|
|
269
|
+
for (const memory of memories) {
|
|
270
|
+
if (memory.createdAt) {
|
|
271
|
+
totalAge += Date.now() - new Date(memory.createdAt).getTime();
|
|
272
|
+
memoryCount++;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
const avgMemoryAge = memoryCount > 0
|
|
276
|
+
? Math.floor(totalAge / memoryCount / (1000 * 60 * 60 * 24))
|
|
277
|
+
: 0;
|
|
278
|
+
// Determine overall status
|
|
279
|
+
let status = 'healthy';
|
|
280
|
+
if (issues.length >= 3 || triggeredPatterns.length >= 5) {
|
|
281
|
+
status = 'critical';
|
|
282
|
+
}
|
|
283
|
+
else if (issues.length >= 1) {
|
|
284
|
+
status = 'degraded';
|
|
285
|
+
}
|
|
286
|
+
// Recent sessions (24h)
|
|
287
|
+
const oneDayAgo = new Date();
|
|
288
|
+
oneDayAgo.setDate(oneDayAgo.getDate() - 1);
|
|
289
|
+
const recentSessions = sessions.filter(s => {
|
|
290
|
+
const createdAt = s.createdAt;
|
|
291
|
+
return createdAt && new Date(createdAt) >= oneDayAgo;
|
|
292
|
+
}).length;
|
|
293
|
+
return {
|
|
294
|
+
status,
|
|
295
|
+
metrics: {
|
|
296
|
+
totalMemories: stats.totalMemories,
|
|
297
|
+
activePatterns: stats.totalPatterns,
|
|
298
|
+
triggeredPatterns: triggeredPatterns.length,
|
|
299
|
+
recentSessions,
|
|
300
|
+
feedbackRate,
|
|
301
|
+
avgMemoryAge,
|
|
302
|
+
},
|
|
303
|
+
issues,
|
|
304
|
+
recommendations,
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Generate a comprehensive analytics report
|
|
309
|
+
*/
|
|
310
|
+
async generateReport() {
|
|
311
|
+
const [health, usage, memoryInsights, patternInsights] = await Promise.all([
|
|
312
|
+
this.getSystemHealth(),
|
|
313
|
+
this.getUsageStats('week'),
|
|
314
|
+
this.getMemoryInsights(),
|
|
315
|
+
this.getPatternInsights(),
|
|
316
|
+
]);
|
|
317
|
+
return {
|
|
318
|
+
generatedAt: new Date().toISOString(),
|
|
319
|
+
system: this.system,
|
|
320
|
+
health,
|
|
321
|
+
usage,
|
|
322
|
+
memoryInsights,
|
|
323
|
+
patternInsights,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
// =============================================================================
|
|
328
|
+
// FACTORY
|
|
329
|
+
// =============================================================================
|
|
330
|
+
export function createAnalyticsTracker(system) {
|
|
331
|
+
return new AnalyticsTracker(system);
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracker.js","sourceRoot":"","sources":["../../src/analytics/tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ESLint Rule Generator
|
|
3
|
+
*
|
|
4
|
+
* Automatically generates ESLint rules from detected patterns.
|
|
5
|
+
*/
|
|
6
|
+
import type { AutoImprovementResult, DetectedPattern } from '../types/index.js';
|
|
7
|
+
export declare class ESLintGenerator {
|
|
8
|
+
private projectRoot;
|
|
9
|
+
private rulesDir;
|
|
10
|
+
/**
|
|
11
|
+
* Initialize with project root
|
|
12
|
+
*/
|
|
13
|
+
init(projectRoot?: string): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Generate ESLint rule from pattern
|
|
16
|
+
*/
|
|
17
|
+
generateRule(pattern: DetectedPattern): Promise<AutoImprovementResult>;
|
|
18
|
+
/**
|
|
19
|
+
* Generate rule code from pattern definition
|
|
20
|
+
*/
|
|
21
|
+
private generateRuleCode;
|
|
22
|
+
/**
|
|
23
|
+
* Update the rules index file
|
|
24
|
+
*/
|
|
25
|
+
private updateRulesIndex;
|
|
26
|
+
/**
|
|
27
|
+
* Generate rules for all triggered patterns
|
|
28
|
+
*/
|
|
29
|
+
generateAllRules(patterns: DetectedPattern[]): Promise<AutoImprovementResult[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Generate .eslintrc.cjs entry for custom rules
|
|
32
|
+
*/
|
|
33
|
+
generateEslintConfig(rules: string[]): string;
|
|
34
|
+
}
|
|
35
|
+
export declare function runESLintGenerator(patternId: string): Promise<void>;
|
|
36
|
+
//# sourceMappingURL=eslint-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eslint-generator.d.ts","sourceRoot":"","sources":["../../src/auto-improve/eslint-generator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAEV,qBAAqB,EACrB,eAAe,EAChB,MAAM,mBAAmB,CAAA;AA4H1B,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,QAAQ,CAAsB;IAEtC;;OAEG;IACG,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/C;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,qBAAqB,CAAC;IA2D5E;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;OAEG;YACW,gBAAgB;IAsC9B;;OAEG;IACG,gBAAgB,CACpB,QAAQ,EAAE,eAAe,EAAE,GAC1B,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAanC;;OAEG;IACH,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM;CAY9C;AAMD,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAezE"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ESLint Rule Generator
|
|
3
|
+
*
|
|
4
|
+
* Automatically generates ESLint rules from detected patterns.
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'fs/promises';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import { getProjectRoot } from '../utils/paths.js';
|
|
9
|
+
import { BUILTIN_PATTERNS } from './pattern-detector.js';
|
|
10
|
+
// =============================================================================
|
|
11
|
+
// RULE TEMPLATES
|
|
12
|
+
// =============================================================================
|
|
13
|
+
/**
|
|
14
|
+
* ESLint rule code template
|
|
15
|
+
*/
|
|
16
|
+
const RULE_TEMPLATE = `/**
|
|
17
|
+
* @fileoverview {{description}}
|
|
18
|
+
* @author MetaNautical Auto-Improvement
|
|
19
|
+
* @generated {{timestamp}}
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
"use strict";
|
|
23
|
+
|
|
24
|
+
module.exports = {
|
|
25
|
+
meta: {
|
|
26
|
+
type: "{{type}}",
|
|
27
|
+
docs: {
|
|
28
|
+
description: "{{description}}",
|
|
29
|
+
category: "Best Practices",
|
|
30
|
+
recommended: true,
|
|
31
|
+
},
|
|
32
|
+
fixable: {{fixable}},
|
|
33
|
+
schema: [],
|
|
34
|
+
messages: {
|
|
35
|
+
violation: "{{message}}",
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
create(context) {
|
|
40
|
+
return {
|
|
41
|
+
{{visitors}}
|
|
42
|
+
};
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
`;
|
|
46
|
+
/**
|
|
47
|
+
* Generate visitor code for pattern
|
|
48
|
+
*/
|
|
49
|
+
function generateVisitors(pattern) {
|
|
50
|
+
const visitors = [];
|
|
51
|
+
// Common visitors based on pattern type
|
|
52
|
+
switch (pattern.id) {
|
|
53
|
+
case 'any-type':
|
|
54
|
+
visitors.push(`
|
|
55
|
+
TSAnyKeyword(node) {
|
|
56
|
+
context.report({
|
|
57
|
+
node,
|
|
58
|
+
messageId: "violation",
|
|
59
|
+
});
|
|
60
|
+
}`);
|
|
61
|
+
break;
|
|
62
|
+
case 'console-log':
|
|
63
|
+
visitors.push(`
|
|
64
|
+
CallExpression(node) {
|
|
65
|
+
if (
|
|
66
|
+
node.callee.type === "MemberExpression" &&
|
|
67
|
+
node.callee.object.name === "console" &&
|
|
68
|
+
node.callee.property.name === "log"
|
|
69
|
+
) {
|
|
70
|
+
context.report({
|
|
71
|
+
node,
|
|
72
|
+
messageId: "violation",
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}`);
|
|
76
|
+
break;
|
|
77
|
+
case 'eslint-disable':
|
|
78
|
+
visitors.push(`
|
|
79
|
+
Program(node) {
|
|
80
|
+
const comments = context.getSourceCode().getAllComments();
|
|
81
|
+
for (const comment of comments) {
|
|
82
|
+
if (comment.value.includes("eslint-disable")) {
|
|
83
|
+
context.report({
|
|
84
|
+
node: comment,
|
|
85
|
+
messageId: "violation",
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}`);
|
|
90
|
+
break;
|
|
91
|
+
case 'inline-style':
|
|
92
|
+
visitors.push(`
|
|
93
|
+
JSXAttribute(node) {
|
|
94
|
+
if (
|
|
95
|
+
node.name.name === "style" &&
|
|
96
|
+
node.value?.type === "JSXExpressionContainer" &&
|
|
97
|
+
node.value.expression?.type === "ObjectExpression"
|
|
98
|
+
) {
|
|
99
|
+
context.report({
|
|
100
|
+
node,
|
|
101
|
+
messageId: "violation",
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}`);
|
|
105
|
+
break;
|
|
106
|
+
default:
|
|
107
|
+
// Generic pattern - use regex on source
|
|
108
|
+
visitors.push(`
|
|
109
|
+
Program(node) {
|
|
110
|
+
const sourceCode = context.getSourceCode().getText();
|
|
111
|
+
// Pattern: ${pattern.id}
|
|
112
|
+
// Add custom detection logic here
|
|
113
|
+
}`);
|
|
114
|
+
}
|
|
115
|
+
return visitors.join(',\n');
|
|
116
|
+
}
|
|
117
|
+
// =============================================================================
|
|
118
|
+
// ESLINT GENERATOR CLASS
|
|
119
|
+
// =============================================================================
|
|
120
|
+
export class ESLintGenerator {
|
|
121
|
+
projectRoot = null;
|
|
122
|
+
rulesDir = null;
|
|
123
|
+
/**
|
|
124
|
+
* Initialize with project root
|
|
125
|
+
*/
|
|
126
|
+
async init(projectRoot) {
|
|
127
|
+
this.projectRoot = projectRoot ?? await getProjectRoot();
|
|
128
|
+
this.rulesDir = path.join(this.projectRoot, 'eslint-plugin-charter', 'rules');
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Generate ESLint rule from pattern
|
|
132
|
+
*/
|
|
133
|
+
async generateRule(pattern) {
|
|
134
|
+
if (!this.projectRoot) {
|
|
135
|
+
await this.init();
|
|
136
|
+
}
|
|
137
|
+
// Find pattern definition
|
|
138
|
+
const definition = BUILTIN_PATTERNS.find(p => p.id === pattern.patternId);
|
|
139
|
+
if (!definition) {
|
|
140
|
+
return {
|
|
141
|
+
success: false,
|
|
142
|
+
action: 'eslint_rule',
|
|
143
|
+
error: `Pattern definition not found: ${pattern.patternId}`,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
// Check if rule already exists in ESLint
|
|
147
|
+
if (definition.eslintRule) {
|
|
148
|
+
return {
|
|
149
|
+
success: true,
|
|
150
|
+
action: 'eslint_rule',
|
|
151
|
+
filePath: `existing: ${definition.eslintRule}`,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
try {
|
|
155
|
+
// Generate rule code
|
|
156
|
+
const ruleCode = this.generateRuleCode(definition);
|
|
157
|
+
// Determine output path
|
|
158
|
+
const ruleName = `no-${pattern.patternId}`;
|
|
159
|
+
const rulePath = path.join(this.rulesDir, `${ruleName}.js`);
|
|
160
|
+
// Ensure directory exists
|
|
161
|
+
await fs.mkdir(this.rulesDir, { recursive: true });
|
|
162
|
+
// Write rule file
|
|
163
|
+
await fs.writeFile(rulePath, ruleCode);
|
|
164
|
+
// Update rules index
|
|
165
|
+
await this.updateRulesIndex(ruleName);
|
|
166
|
+
console.log(`✅ Generated ESLint rule: ${ruleName}`);
|
|
167
|
+
console.log(` Path: ${rulePath}`);
|
|
168
|
+
return {
|
|
169
|
+
success: true,
|
|
170
|
+
action: 'eslint_rule',
|
|
171
|
+
filePath: rulePath,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
return {
|
|
176
|
+
success: false,
|
|
177
|
+
action: 'eslint_rule',
|
|
178
|
+
error: String(error),
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Generate rule code from pattern definition
|
|
184
|
+
*/
|
|
185
|
+
generateRuleCode(pattern) {
|
|
186
|
+
const visitors = generateVisitors(pattern);
|
|
187
|
+
return RULE_TEMPLATE
|
|
188
|
+
.replace(/{{description}}/g, pattern.description)
|
|
189
|
+
.replace('{{timestamp}}', new Date().toISOString())
|
|
190
|
+
.replace('{{type}}', pattern.severity === 'critical' ? 'problem' : 'suggestion')
|
|
191
|
+
.replace('{{fixable}}', 'null')
|
|
192
|
+
.replace('{{message}}', pattern.message)
|
|
193
|
+
.replace('{{visitors}}', visitors);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Update the rules index file
|
|
197
|
+
*/
|
|
198
|
+
async updateRulesIndex(ruleName) {
|
|
199
|
+
const indexPath = path.join(this.rulesDir, 'index.js');
|
|
200
|
+
let indexContent;
|
|
201
|
+
try {
|
|
202
|
+
indexContent = await fs.readFile(indexPath, 'utf-8');
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
// Create new index
|
|
206
|
+
indexContent = `/**
|
|
207
|
+
* @fileoverview ESLint rules for Charter/MetaNautical projects
|
|
208
|
+
*/
|
|
209
|
+
|
|
210
|
+
"use strict";
|
|
211
|
+
|
|
212
|
+
module.exports = {
|
|
213
|
+
rules: {},
|
|
214
|
+
};
|
|
215
|
+
`;
|
|
216
|
+
}
|
|
217
|
+
// Check if rule already in index
|
|
218
|
+
if (indexContent.includes(`"${ruleName}"`)) {
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
// Add rule to index
|
|
222
|
+
const ruleImport = `"${ruleName}": require("./${ruleName}"),`;
|
|
223
|
+
// Insert into rules object
|
|
224
|
+
indexContent = indexContent.replace(/rules:\s*\{/, `rules: {\n ${ruleImport}`);
|
|
225
|
+
await fs.writeFile(indexPath, indexContent);
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Generate rules for all triggered patterns
|
|
229
|
+
*/
|
|
230
|
+
async generateAllRules(patterns) {
|
|
231
|
+
const results = [];
|
|
232
|
+
for (const pattern of patterns) {
|
|
233
|
+
if (pattern.needsAutoImprove) {
|
|
234
|
+
const result = await this.generateRule(pattern);
|
|
235
|
+
results.push(result);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return results;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Generate .eslintrc.cjs entry for custom rules
|
|
242
|
+
*/
|
|
243
|
+
generateEslintConfig(rules) {
|
|
244
|
+
const ruleConfig = rules
|
|
245
|
+
.map(r => ` "charter/${r}": "error",`)
|
|
246
|
+
.join('\n');
|
|
247
|
+
return `// Add to .eslintrc.cjs plugins array:
|
|
248
|
+
// "charter",
|
|
249
|
+
|
|
250
|
+
// Add to rules:
|
|
251
|
+
${ruleConfig}
|
|
252
|
+
`;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
// =============================================================================
|
|
256
|
+
// STANDALONE EXECUTION
|
|
257
|
+
// =============================================================================
|
|
258
|
+
export async function runESLintGenerator(patternId) {
|
|
259
|
+
const generator = new ESLintGenerator();
|
|
260
|
+
const pattern = {
|
|
261
|
+
patternId,
|
|
262
|
+
description: 'Auto-generated pattern',
|
|
263
|
+
count: 3,
|
|
264
|
+
severity: 'medium',
|
|
265
|
+
files: [],
|
|
266
|
+
needsAutoImprove: true,
|
|
267
|
+
};
|
|
268
|
+
const result = await generator.generateRule(pattern);
|
|
269
|
+
console.log(JSON.stringify(result, null, 2));
|
|
270
|
+
}
|
|
271
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
272
|
+
const patternId = process.argv[2];
|
|
273
|
+
if (patternId) {
|
|
274
|
+
runESLintGenerator(patternId).catch(console.error);
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
console.error('Usage: node eslint-generator.js <pattern-id>');
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=eslint-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eslint-generator.js","sourceRoot":"","sources":["../../src/auto-improve/eslint-generator.ts"],"names":[],"mappings":"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"}
|