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,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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"}