cmp-standards 3.7.0 → 3.7.1

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 (33) hide show
  1. package/dist/hooks/auto-learning-hook.d.ts +48 -0
  2. package/dist/hooks/auto-learning-hook.d.ts.map +1 -0
  3. package/dist/hooks/auto-learning-hook.js +258 -0
  4. package/dist/hooks/auto-learning-hook.js.map +1 -0
  5. package/dist/hooks/fast-session-start.d.ts +24 -0
  6. package/dist/hooks/fast-session-start.d.ts.map +1 -0
  7. package/dist/hooks/fast-session-start.js +354 -0
  8. package/dist/hooks/fast-session-start.js.map +1 -0
  9. package/dist/index.d.ts +12 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +17 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/services/auto-evolution-trigger.d.ts +101 -0
  14. package/dist/services/auto-evolution-trigger.d.ts.map +1 -0
  15. package/dist/services/auto-evolution-trigger.js +359 -0
  16. package/dist/services/auto-evolution-trigger.js.map +1 -0
  17. package/dist/services/cloud-memory-service.d.ts +101 -0
  18. package/dist/services/cloud-memory-service.d.ts.map +1 -0
  19. package/dist/services/cloud-memory-service.js +363 -0
  20. package/dist/services/cloud-memory-service.js.map +1 -0
  21. package/dist/services/memory-keeper-client.d.ts +106 -0
  22. package/dist/services/memory-keeper-client.d.ts.map +1 -0
  23. package/dist/services/memory-keeper-client.js +319 -0
  24. package/dist/services/memory-keeper-client.js.map +1 -0
  25. package/dist/services/skill-learning-bridge.d.ts +100 -0
  26. package/dist/services/skill-learning-bridge.d.ts.map +1 -0
  27. package/dist/services/skill-learning-bridge.js +331 -0
  28. package/dist/services/skill-learning-bridge.js.map +1 -0
  29. package/dist/services/unified-memory-router.d.ts +123 -0
  30. package/dist/services/unified-memory-router.d.ts.map +1 -0
  31. package/dist/services/unified-memory-router.js +555 -0
  32. package/dist/services/unified-memory-router.js.map +1 -0
  33. package/package.json +1 -1
@@ -0,0 +1,331 @@
1
+ /**
2
+ * @file Skill-Learning Bridge Service
3
+ * @description Connects memory systems with the skills learning framework
4
+ *
5
+ * ## Purpose
6
+ *
7
+ * This bridge service synchronizes learnings across:
8
+ * 1. memory-keeper MCP (local SQLite)
9
+ * 2. cmp-standards cloud (Turso/Upstash)
10
+ * 3. Skills markdown files (.claude/skills/SKILL/learnings.md)
11
+ *
12
+ * ## Flow
13
+ *
14
+ * Learning Detected -> SkillLearningBridge
15
+ * - memory-keeper (immediate, local)
16
+ * - skills/learnings.md (immediate, local)
17
+ * - cmp-standards cloud (async, persistent)
18
+ *
19
+ * @version 1.0.0
20
+ */
21
+ import { existsSync, readFileSync, writeFileSync } from 'fs';
22
+ import { join } from 'path';
23
+ import { homedir } from 'os';
24
+ // =============================================================================
25
+ // Constants
26
+ // =============================================================================
27
+ const DEFAULT_CONFIG = {
28
+ skillsDir: join(homedir(), '.claude', 'skills'),
29
+ evolutionThreshold: 10,
30
+ syncToCloud: true
31
+ };
32
+ const SKILL_PATHS = {
33
+ 'type-safety-enforcer': 'quality/type-safety-enforcer',
34
+ 'useeffect-reducer': 'quality/useeffect-reducer',
35
+ 'systematic-debugging': 'quality/systematic-debugging',
36
+ 'code-deduplicator': 'quality/code-deduplicator',
37
+ 'pre-commit-validator': 'quality/pre-commit-validator',
38
+ 'domain-structure-guardian': 'architecture/domain-structure-guardian',
39
+ 'simplification-cascades': 'architecture/simplification-cascades',
40
+ 'skill-evolver': 'meta/skill-evolver',
41
+ 'changelog-generator': 'meta/changelog-generator'
42
+ };
43
+ // =============================================================================
44
+ // Skill Learning Bridge
45
+ // =============================================================================
46
+ export class SkillLearningBridge {
47
+ config;
48
+ constructor(config = {}) {
49
+ this.config = { ...DEFAULT_CONFIG, ...config };
50
+ }
51
+ /**
52
+ * Record a learning to all systems
53
+ */
54
+ async recordLearning(learning) {
55
+ const result = {
56
+ skillsWritten: false,
57
+ memoryKeeperWritten: false,
58
+ cloudSynced: false
59
+ };
60
+ // 1. Write to skills/learnings.md
61
+ try {
62
+ result.skillsWritten = this.writeToSkillFile(learning);
63
+ }
64
+ catch (error) {
65
+ console.error('[bridge] Failed to write to skills:', error);
66
+ }
67
+ // 2. Write to memory-keeper (would need MCP client)
68
+ // TODO: Integrate with memory-keeper MCP
69
+ // result.memoryKeeperWritten = await this.writeToMemoryKeeper(learning)
70
+ // 3. Sync to cloud (async, non-blocking)
71
+ if (this.config.syncToCloud) {
72
+ // TODO: Integrate with cmp-standards cloud
73
+ // this.syncToCloud(learning).catch(console.error)
74
+ }
75
+ return result;
76
+ }
77
+ /**
78
+ * Write learning to skill's learnings.md file
79
+ */
80
+ writeToSkillFile(learning) {
81
+ const skillPath = SKILL_PATHS[learning.skill];
82
+ if (!skillPath) {
83
+ console.warn(`[bridge] Unknown skill: ${learning.skill}`);
84
+ return false;
85
+ }
86
+ const learningsFile = join(this.config.skillsDir, skillPath, 'learnings.md');
87
+ if (!existsSync(learningsFile)) {
88
+ console.warn(`[bridge] Learnings file not found: ${learningsFile}`);
89
+ return false;
90
+ }
91
+ let content = readFileSync(learningsFile, 'utf-8');
92
+ // Format the learning entry
93
+ const entry = this.formatLearningEntry(learning);
94
+ // Update total count
95
+ const countMatch = content.match(/\*\*Learnings Totales:\*\* (\d+)/);
96
+ if (countMatch) {
97
+ const currentCount = parseInt(countMatch[1], 10);
98
+ content = content.replace(/\*\*Learnings Totales:\*\* \d+/, `**Learnings Totales:** ${currentCount + 1}`);
99
+ // Also update pending count
100
+ const pendingMatch = content.match(/\*\*Learnings Pendientes:\*\* (\d+)/);
101
+ if (pendingMatch) {
102
+ const pendingCount = parseInt(pendingMatch[1], 10);
103
+ content = content.replace(/\*\*Learnings Pendientes:\*\* \d+/, `**Learnings Pendientes:** ${pendingCount + 1}`);
104
+ }
105
+ }
106
+ // Insert learning after "## Learnings" header
107
+ const learningsHeader = '## Learnings';
108
+ const headerIndex = content.indexOf(learningsHeader);
109
+ if (headerIndex !== -1) {
110
+ const insertPoint = content.indexOf('\n', headerIndex) + 1;
111
+ content = content.slice(0, insertPoint) + '\n' + entry + content.slice(insertPoint);
112
+ }
113
+ else {
114
+ // Fallback: append to end
115
+ content += '\n' + entry;
116
+ }
117
+ writeFileSync(learningsFile, content);
118
+ return true;
119
+ }
120
+ /**
121
+ * Format a learning entry as markdown
122
+ */
123
+ formatLearningEntry(learning) {
124
+ const date = learning.timestamp.split('T')[0];
125
+ const time = learning.timestamp.split('T')[1]?.slice(0, 5) || '';
126
+ return `### Learning ${date} ${time}
127
+
128
+ **Context:** ${learning.context}
129
+ **Problem:** ${learning.problem}
130
+ **Solution:** ${learning.solution}
131
+ **Confidence:** ${Math.round(learning.confidence * 100)}%${learning.file ? `\n**File:** ${learning.file}` : ''}
132
+ **Source:** ${learning.source}
133
+
134
+ ---
135
+ `;
136
+ }
137
+ /**
138
+ * Get statistics for all skills
139
+ */
140
+ async getSkillStats() {
141
+ const stats = [];
142
+ for (const [skillName, skillPath] of Object.entries(SKILL_PATHS)) {
143
+ const fullPath = join(this.config.skillsDir, skillPath);
144
+ const learningsFile = join(fullPath, 'learnings.md');
145
+ if (!existsSync(learningsFile))
146
+ continue;
147
+ const content = readFileSync(learningsFile, 'utf-8');
148
+ // Parse stats from content
149
+ const totalMatch = content.match(/\*\*Learnings Totales:\*\* (\d+)/);
150
+ const pendingMatch = content.match(/\*\*Learnings Pendientes:\*\* (\d+)/);
151
+ const evolutionMatch = content.match(/\*\*Última Evolución:\*\* (.+)/);
152
+ const total = totalMatch ? parseInt(totalMatch[1], 10) : 0;
153
+ const pending = pendingMatch ? parseInt(pendingMatch[1], 10) : 0;
154
+ const lastEvolution = evolutionMatch?.[1] === 'Nunca' ? null : (evolutionMatch?.[1] || null);
155
+ stats.push({
156
+ name: skillName,
157
+ path: skillPath,
158
+ totalLearnings: total,
159
+ pendingLearnings: pending,
160
+ lastEvolution,
161
+ readyForEvolution: pending >= this.config.evolutionThreshold
162
+ });
163
+ }
164
+ return stats;
165
+ }
166
+ /**
167
+ * Check if any skills are ready for evolution
168
+ */
169
+ async getSkillsReadyForEvolution() {
170
+ const allStats = await this.getSkillStats();
171
+ return allStats.filter(s => s.readyForEvolution);
172
+ }
173
+ /**
174
+ * Trigger skill evolution for ready skills
175
+ */
176
+ async triggerEvolution(skillName) {
177
+ const readySkills = await this.getSkillsReadyForEvolution();
178
+ if (skillName) {
179
+ const target = readySkills.find(s => s.name === skillName);
180
+ if (!target) {
181
+ throw new Error(`Skill ${skillName} not ready for evolution or not found`);
182
+ }
183
+ return this.evolveSkill(target);
184
+ }
185
+ // Evolve all ready skills
186
+ const results = [];
187
+ for (const skill of readySkills) {
188
+ const evolved = await this.evolveSkill(skill);
189
+ results.push(...evolved);
190
+ }
191
+ return results;
192
+ }
193
+ /**
194
+ * Evolve a single skill
195
+ */
196
+ async evolveSkill(skill) {
197
+ const changes = [];
198
+ const learningsFile = join(this.config.skillsDir, skill.path, 'learnings.md');
199
+ const skillFile = join(this.config.skillsDir, skill.path, 'SKILL.md');
200
+ if (!existsSync(learningsFile) || !existsSync(skillFile)) {
201
+ return changes;
202
+ }
203
+ const learningsContent = readFileSync(learningsFile, 'utf-8');
204
+ // Extract learnings
205
+ const learningBlocks = learningsContent.match(/### Learning \d{4}-\d{2}-\d{2}[\s\S]*?(?=### Learning|\n## |$)/g) || [];
206
+ // Analyze patterns
207
+ const patterns = this.analyzeLearningPatterns(learningBlocks);
208
+ if (patterns.length > 0) {
209
+ changes.push(`Found ${patterns.length} patterns to add to ${skill.name}`);
210
+ // Log the evolution
211
+ const evolutionLog = join(this.config.skillsDir, 'meta/skill-evolver/evolution-log.md');
212
+ if (existsSync(evolutionLog)) {
213
+ const date = new Date().toISOString();
214
+ const entry = `
215
+ ## Evolution ${date}
216
+
217
+ **Skill Evolved:** ${skill.name}
218
+ **Learnings Analyzed:** ${skill.pendingLearnings}
219
+ **Patterns Found:** ${patterns.length}
220
+
221
+ **Patterns:**
222
+ ${patterns.map(p => `- ${p}`).join('\n')}
223
+
224
+ ---
225
+ `;
226
+ let logContent = readFileSync(evolutionLog, 'utf-8');
227
+ // Update total evolutions
228
+ const totalMatch = logContent.match(/\*\*Total Evoluciones:\*\* (\d+)/);
229
+ if (totalMatch) {
230
+ const total = parseInt(totalMatch[1], 10);
231
+ logContent = logContent.replace(/\*\*Total Evoluciones:\*\* \d+/, `**Total Evoluciones:** ${total + 1}`);
232
+ }
233
+ // Insert after ## Evolution History
234
+ const historyHeader = '## Evolution History';
235
+ const historyIndex = logContent.indexOf(historyHeader);
236
+ if (historyIndex !== -1) {
237
+ const insertPoint = logContent.indexOf('\n', historyIndex) + 1;
238
+ logContent = logContent.slice(0, insertPoint) + '\n' + entry + logContent.slice(insertPoint);
239
+ }
240
+ writeFileSync(evolutionLog, logContent);
241
+ }
242
+ // Reset pending count in learnings.md
243
+ let content = readFileSync(learningsFile, 'utf-8');
244
+ content = content.replace(/\*\*Learnings Pendientes:\*\* \d+/, '**Learnings Pendientes:** 0');
245
+ content = content.replace(/\*\*Última Evolución:\*\* .+/, `**Última Evolución:** ${new Date().toISOString().split('T')[0]}`);
246
+ writeFileSync(learningsFile, content);
247
+ }
248
+ return changes;
249
+ }
250
+ /**
251
+ * Analyze learnings to find common patterns
252
+ */
253
+ analyzeLearningPatterns(learningBlocks) {
254
+ const patterns = [];
255
+ const problemCounts = new Map();
256
+ for (const block of learningBlocks) {
257
+ const problemMatch = block.match(/\*\*Problem:\*\* (.+)/);
258
+ if (problemMatch) {
259
+ const problem = problemMatch[1].toLowerCase().trim();
260
+ problemCounts.set(problem, (problemCounts.get(problem) || 0) + 1);
261
+ }
262
+ }
263
+ // Find patterns that appear 2+ times
264
+ for (const [problem, count] of problemCounts) {
265
+ if (count >= 2) {
266
+ patterns.push(`"${problem}" (${count} occurrences)`);
267
+ }
268
+ }
269
+ return patterns;
270
+ }
271
+ /**
272
+ * Migrate memories from memory-keeper to skills
273
+ */
274
+ async migrateFromMemoryKeeper(memories) {
275
+ let migrated = 0;
276
+ for (const memory of memories) {
277
+ // Try to detect skill from memory content
278
+ const skill = this.detectSkillFromContent(memory.value);
279
+ if (!skill)
280
+ continue;
281
+ const learning = {
282
+ type: 'general',
283
+ skill,
284
+ context: memory.key,
285
+ problem: 'Migrated from memory-keeper',
286
+ solution: memory.value.slice(0, 200),
287
+ confidence: 0.6,
288
+ timestamp: new Date().toISOString(),
289
+ source: 'sync'
290
+ };
291
+ const result = await this.recordLearning(learning);
292
+ if (result.skillsWritten)
293
+ migrated++;
294
+ }
295
+ return migrated;
296
+ }
297
+ /**
298
+ * Detect which skill a memory content relates to
299
+ */
300
+ detectSkillFromContent(content) {
301
+ const lower = content.toLowerCase();
302
+ if (lower.includes('type') || lower.includes('any') || lower.includes('typescript')) {
303
+ return 'type-safety-enforcer';
304
+ }
305
+ if (lower.includes('useeffect') || lower.includes('render') || lower.includes('performance')) {
306
+ return 'useeffect-reducer';
307
+ }
308
+ if (lower.includes('debug') || lower.includes('error') || lower.includes('fix')) {
309
+ return 'systematic-debugging';
310
+ }
311
+ if (lower.includes('structure') || lower.includes('domain') || lower.includes('architecture')) {
312
+ return 'domain-structure-guardian';
313
+ }
314
+ if (lower.includes('duplicate') || lower.includes('refactor')) {
315
+ return 'code-deduplicator';
316
+ }
317
+ return null;
318
+ }
319
+ }
320
+ // =============================================================================
321
+ // Factory & Export
322
+ // =============================================================================
323
+ let bridgeInstance = null;
324
+ export function getSkillLearningBridge(config) {
325
+ if (!bridgeInstance || config) {
326
+ bridgeInstance = new SkillLearningBridge(config);
327
+ }
328
+ return bridgeInstance;
329
+ }
330
+ export default SkillLearningBridge;
331
+ //# sourceMappingURL=skill-learning-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-learning-bridge.js","sourceRoot":"","sources":["../../src/services/skill-learning-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * @file Unified Memory Router
3
+ * @description Routes memory operations across all storage backends
4
+ *
5
+ * ## Architecture
6
+ *
7
+ * UnifiedMemoryRouter routes operations to multiple backends:
8
+ *
9
+ * save(item):
10
+ * - memory-keeper MCP (local, fast, session-based)
11
+ * - skills/learnings.md (if learning type)
12
+ * - cmp-standards cloud (persistent, cross-project)
13
+ *
14
+ * search(query):
15
+ * - memory-keeper (local context)
16
+ * - skills (learned patterns)
17
+ * - cloud (historical knowledge)
18
+ *
19
+ * sync():
20
+ * - Bidirectional sync between all backends
21
+ *
22
+ * @version 1.0.0
23
+ */
24
+ import type { DevSystem } from '../types/index.js';
25
+ export interface MemoryItem {
26
+ id?: string;
27
+ type: 'memory' | 'learning' | 'pattern' | 'task' | 'decision' | 'knowledge';
28
+ title: string;
29
+ content: string;
30
+ domain?: string;
31
+ tags?: string[];
32
+ priority?: 'critical' | 'high' | 'normal' | 'low';
33
+ source?: 'auto' | 'manual' | 'sync' | 'claude' | 'gemini';
34
+ metadata?: Record<string, unknown>;
35
+ }
36
+ export interface SearchQuery {
37
+ text?: string;
38
+ type?: MemoryItem['type'] | MemoryItem['type'][];
39
+ domain?: string;
40
+ tags?: string[];
41
+ limit?: number;
42
+ includeSkills?: boolean;
43
+ includeCloud?: boolean;
44
+ }
45
+ export interface SearchResult {
46
+ item: MemoryItem;
47
+ source: 'memory-keeper' | 'skills' | 'cloud';
48
+ score: number;
49
+ }
50
+ export interface SyncResult {
51
+ memoryKeeperToCloud: number;
52
+ cloudToMemoryKeeper: number;
53
+ skillsUpdated: number;
54
+ errors: string[];
55
+ }
56
+ export interface RouterConfig {
57
+ system: DevSystem;
58
+ skillsDir: string;
59
+ enableCloud: boolean;
60
+ enableSkills: boolean;
61
+ cloudSyncInterval: number;
62
+ }
63
+ export declare class UnifiedMemoryRouter {
64
+ private config;
65
+ private skillBridge;
66
+ private memoryKeeper;
67
+ private cloudMemory;
68
+ private syncTimer;
69
+ private syncedKeys;
70
+ constructor(config?: Partial<RouterConfig>);
71
+ /**
72
+ * Save an item to all appropriate backends
73
+ */
74
+ save(item: MemoryItem): Promise<{
75
+ memoryKeeper: boolean;
76
+ skills: boolean;
77
+ cloud: boolean;
78
+ }>;
79
+ /**
80
+ * Search across all backends
81
+ */
82
+ search(query: SearchQuery): Promise<SearchResult[]>;
83
+ /**
84
+ * Get context for session start
85
+ */
86
+ getSessionContext(domain?: string): Promise<{
87
+ recentMemories: MemoryItem[];
88
+ recentLearnings: MemoryItem[];
89
+ activePatterns: MemoryItem[];
90
+ skillsStatus: Array<{
91
+ name: string;
92
+ learnings: number;
93
+ ready: boolean;
94
+ }>;
95
+ }>;
96
+ /**
97
+ * Sync between all backends
98
+ */
99
+ sync(): Promise<SyncResult>;
100
+ /**
101
+ * Start periodic sync
102
+ */
103
+ private startPeriodicSync;
104
+ /**
105
+ * Stop periodic sync
106
+ */
107
+ stopPeriodicSync(): void;
108
+ private saveToMemoryKeeper;
109
+ private searchMemoryKeeper;
110
+ private getUnsyncedFromMemoryKeeper;
111
+ private mapTypeToCategory;
112
+ private mapCategoryToType;
113
+ private cloudInitialized;
114
+ private initCloudIfNeeded;
115
+ private saveToCloud;
116
+ private searchCloud;
117
+ private getUnsyncedFromCloud;
118
+ private searchSkills;
119
+ private itemToLearning;
120
+ }
121
+ export declare function getUnifiedMemoryRouter(config?: Partial<RouterConfig>): UnifiedMemoryRouter;
122
+ export default UnifiedMemoryRouter;
123
+ //# sourceMappingURL=unified-memory-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unified-memory-router.d.ts","sourceRoot":"","sources":["../../src/services/unified-memory-router.ts"],"names":[],"mappings":"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"}