cmp-standards 2.7.0 → 2.8.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 +633 -633
- package/dist/cache/EmbeddingCache.d.ts +110 -0
- package/dist/cache/EmbeddingCache.d.ts.map +1 -0
- package/dist/cache/EmbeddingCache.js +239 -0
- package/dist/cache/EmbeddingCache.js.map +1 -0
- package/dist/cache/index.d.ts +6 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +6 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cli/index.js +0 -0
- package/dist/db/cloud.d.ts +1 -0
- package/dist/db/cloud.d.ts.map +1 -1
- package/dist/db/drizzle-client.d.ts +10 -1
- package/dist/db/drizzle-client.d.ts.map +1 -1
- package/dist/db/drizzle-client.js +57 -3
- package/dist/db/drizzle-client.js.map +1 -1
- package/dist/db/errors.d.ts +13 -1
- package/dist/db/errors.d.ts.map +1 -1
- package/dist/db/errors.js +49 -5
- package/dist/db/errors.js.map +1 -1
- package/dist/db/migrations.d.ts +42 -0
- package/dist/db/migrations.d.ts.map +1 -0
- package/dist/db/migrations.js +173 -0
- package/dist/db/migrations.js.map +1 -0
- package/dist/db/turso-client.d.ts +15 -3
- package/dist/db/turso-client.d.ts.map +1 -1
- package/dist/db/turso-client.js +50 -39
- package/dist/db/turso-client.js.map +1 -1
- package/dist/eslint/rules/no-async-useeffect.js +6 -6
- package/dist/events/EventBus.d.ts +97 -0
- package/dist/events/EventBus.d.ts.map +1 -0
- package/dist/events/EventBus.js +256 -0
- package/dist/events/EventBus.js.map +1 -0
- package/dist/events/index.d.ts +7 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +9 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/types.d.ts +989 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/events/types.js +136 -0
- package/dist/events/types.js.map +1 -0
- package/dist/experts/ConsensusEngine.d.ts +57 -0
- package/dist/experts/ConsensusEngine.d.ts.map +1 -0
- package/dist/experts/ConsensusEngine.js +146 -0
- package/dist/experts/ConsensusEngine.js.map +1 -0
- package/dist/experts/ExpertPanelService.d.ts +84 -0
- package/dist/experts/ExpertPanelService.d.ts.map +1 -0
- package/dist/experts/ExpertPanelService.js +204 -0
- package/dist/experts/ExpertPanelService.js.map +1 -0
- package/dist/experts/ExpertRouter.d.ts +68 -0
- package/dist/experts/ExpertRouter.d.ts.map +1 -0
- package/dist/experts/ExpertRouter.js +374 -0
- package/dist/experts/ExpertRouter.js.map +1 -0
- package/dist/experts/VoteCollector.d.ts +58 -0
- package/dist/experts/VoteCollector.d.ts.map +1 -0
- package/dist/experts/VoteCollector.js +146 -0
- package/dist/experts/VoteCollector.js.map +1 -0
- package/dist/experts/index.d.ts +9 -0
- package/dist/experts/index.d.ts.map +1 -0
- package/dist/experts/index.js +13 -0
- package/dist/experts/index.js.map +1 -0
- package/dist/hooks/cloud-pre-tool-use.js +20 -20
- package/dist/hooks/expert-review.d.ts +74 -0
- package/dist/hooks/expert-review.d.ts.map +1 -0
- package/dist/hooks/expert-review.js +220 -0
- package/dist/hooks/expert-review.js.map +1 -0
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces/index.d.ts +450 -0
- package/dist/interfaces/index.d.ts.map +1 -0
- package/dist/interfaces/index.js +50 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/mcp/schemas.d.ts +278 -0
- package/dist/mcp/schemas.d.ts.map +1 -0
- package/dist/mcp/schemas.js +166 -0
- package/dist/mcp/schemas.js.map +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +14 -3
- package/dist/mcp/server.js.map +1 -1
- package/dist/patterns/feedback-loop.d.ts +264 -0
- package/dist/patterns/feedback-loop.d.ts.map +1 -0
- package/dist/patterns/feedback-loop.js +329 -0
- package/dist/patterns/feedback-loop.js.map +1 -0
- package/dist/patterns/index.d.ts +9 -0
- package/dist/patterns/index.d.ts.map +1 -0
- package/dist/patterns/index.js +9 -0
- package/dist/patterns/index.js.map +1 -0
- package/dist/patterns/lifecycle.d.ts +88 -0
- package/dist/patterns/lifecycle.d.ts.map +1 -0
- package/dist/patterns/lifecycle.js +284 -0
- package/dist/patterns/lifecycle.js.map +1 -0
- package/dist/patterns/registry.d.ts +142 -0
- package/dist/patterns/registry.d.ts.map +1 -0
- package/dist/patterns/registry.js +442 -0
- package/dist/patterns/registry.js.map +1 -0
- package/dist/performance/Debouncer.d.ts +91 -0
- package/dist/performance/Debouncer.d.ts.map +1 -0
- package/dist/performance/Debouncer.js +198 -0
- package/dist/performance/Debouncer.js.map +1 -0
- package/dist/performance/MemoryDecay.d.ts +82 -0
- package/dist/performance/MemoryDecay.d.ts.map +1 -0
- package/dist/performance/MemoryDecay.js +153 -0
- package/dist/performance/MemoryDecay.js.map +1 -0
- package/dist/performance/index.d.ts +7 -0
- package/dist/performance/index.d.ts.map +1 -0
- package/dist/performance/index.js +9 -0
- package/dist/performance/index.js.map +1 -0
- package/dist/schema/expert-types.d.ts +395 -0
- package/dist/schema/expert-types.d.ts.map +1 -0
- package/dist/schema/expert-types.js +250 -0
- package/dist/schema/expert-types.js.map +1 -0
- package/dist/services/ContextGenerator.js +7 -7
- package/dist/services/PlanManager.d.ts +1 -1
- package/dist/services/PlanManager.d.ts.map +1 -1
- package/dist/services/PlanManager.js +26 -6
- package/dist/services/PlanManager.js.map +1 -1
- package/dist/services/ProjectScaffold.js +76 -76
- package/dist/services/memory-router.js +35 -35
- package/dist/services/pattern-tracker.js +90 -90
- package/dist/services/semantic-search.js +2 -2
- package/package.json +105 -104
- package/standards/README.md +50 -50
- package/standards/experts/expert-routing.md +215 -215
- package/standards/general/code-quality.md +86 -86
- package/standards/general/memory-usage.md +205 -205
- package/standards/general/sync-workflow.md +235 -235
- package/standards/general/workflow.md +82 -82
- package/standards/hooks/mandatory-tracking.md +446 -446
- package/standards/infrastructure/cloud-database.md +287 -287
- package/standards/mcp/server-design.md +243 -243
- package/standards/mcp/tool-patterns.md +354 -354
- package/standards/skills/skill-structure.md +286 -286
- package/standards/skills/workflow-design.md +323 -323
- package/standards/tools/tool-design.md +297 -297
- package/templates/agents/architecture-expert.md +61 -61
- package/templates/agents/database-expert.md +62 -62
- package/templates/agents/documentation-expert.md +57 -57
- package/templates/agents/memory-expert.md +88 -88
- package/templates/agents/performance-expert.md +61 -61
- package/templates/agents/security-expert.md +59 -59
- package/templates/agents/ux-expert.md +63 -63
- package/templates/agents/worker.md +75 -75
- package/templates/ai-skills/SKILL_TEMPLATE.md +55 -55
- package/templates/claude-settings.json +72 -72
- package/templates/commands/experts.md +138 -138
- package/templates/hooks/README.md +158 -158
- package/templates/hooks/project.config.json.template +77 -77
- package/templates/hooks/settings.local.json.template +57 -57
- package/templates/memory-config.json +56 -56
- package/templates/memory-config.schema.json +212 -212
- package/templates/settings.json +58 -58
- package/templates/skills/continue.md +205 -205
- package/templates/workflows/business-improvement.md +264 -264
- package/templates/workflows/expert-review.md +153 -153
- package/templates/workflows/internal-app.md +245 -245
- package/templates/workflows/sync-docs.md +187 -187
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Pattern Lifecycle Service
|
|
3
|
+
* @description Manages pattern evolution, regression detection, and auto-improvement
|
|
4
|
+
* @version 2.8.0
|
|
5
|
+
*/
|
|
6
|
+
import { type UnifiedPattern } from './registry.js';
|
|
7
|
+
export interface PatternOccurrence {
|
|
8
|
+
patternId: string;
|
|
9
|
+
file: string;
|
|
10
|
+
line: number;
|
|
11
|
+
code: string;
|
|
12
|
+
timestamp: string;
|
|
13
|
+
sessionId?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface PatternStats {
|
|
16
|
+
patternId: string;
|
|
17
|
+
occurrences: number;
|
|
18
|
+
lastSeen: string;
|
|
19
|
+
firstSeen: string;
|
|
20
|
+
files: string[];
|
|
21
|
+
triggered: boolean;
|
|
22
|
+
implemented: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface RegressionAlert {
|
|
25
|
+
patternId: string;
|
|
26
|
+
message: string;
|
|
27
|
+
occurrencesSinceImplemented: number;
|
|
28
|
+
suggestedAction: 'strengthen_rule' | 'investigate' | 'retire_pattern';
|
|
29
|
+
severity: 'critical' | 'high' | 'medium' | 'low';
|
|
30
|
+
}
|
|
31
|
+
export declare class PatternLifecycleService {
|
|
32
|
+
private occurrences;
|
|
33
|
+
private system;
|
|
34
|
+
constructor(system: string);
|
|
35
|
+
/**
|
|
36
|
+
* Track a pattern occurrence
|
|
37
|
+
*/
|
|
38
|
+
track(occurrence: PatternOccurrence): Promise<{
|
|
39
|
+
count: number;
|
|
40
|
+
triggered: boolean;
|
|
41
|
+
rule?: string;
|
|
42
|
+
}>;
|
|
43
|
+
/**
|
|
44
|
+
* Confirm a pattern detection (from expert approval)
|
|
45
|
+
*/
|
|
46
|
+
confirmPattern(patternId: string): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Mark pattern as false positive (from expert rejection)
|
|
49
|
+
*/
|
|
50
|
+
markFalsePositive(patternId: string): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Promote pattern severity (warning -> error)
|
|
53
|
+
*/
|
|
54
|
+
promotePattern(patternId: string): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Retire a pattern
|
|
57
|
+
*/
|
|
58
|
+
retirePattern(patternId: string, reason: string): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Detect regression (pattern reappearing after implementation)
|
|
61
|
+
*/
|
|
62
|
+
detectRegression(patternId: string): Promise<RegressionAlert | null>;
|
|
63
|
+
/**
|
|
64
|
+
* Adjust pattern sensitivity based on feedback
|
|
65
|
+
*/
|
|
66
|
+
adjustSensitivity(patternId: string, feedback: 'too_sensitive' | 'not_sensitive_enough'): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Get stats for all patterns
|
|
69
|
+
*/
|
|
70
|
+
getStats(): Promise<PatternStats[]>;
|
|
71
|
+
/**
|
|
72
|
+
* Export learnings as snapshot
|
|
73
|
+
*/
|
|
74
|
+
exportLearnings(): Promise<{
|
|
75
|
+
patterns: UnifiedPattern[];
|
|
76
|
+
stats: PatternStats[];
|
|
77
|
+
exportedAt: string;
|
|
78
|
+
}>;
|
|
79
|
+
private triggerAutoImprovement;
|
|
80
|
+
private persistOccurrence;
|
|
81
|
+
private saveAutoImprovement;
|
|
82
|
+
private createPatternMemory;
|
|
83
|
+
}
|
|
84
|
+
export declare function getPatternLifecycle(system: string): PatternLifecycleService;
|
|
85
|
+
/** Alias for getPatternLifecycle */
|
|
86
|
+
export declare const getPatternLifecycleService: typeof getPatternLifecycle;
|
|
87
|
+
export declare function resetPatternLifecycle(): void;
|
|
88
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/patterns/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAsB,KAAK,cAAc,EAAsB,MAAM,eAAe,CAAA;AAM3F,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,2BAA2B,EAAE,MAAM,CAAA;IACnC,eAAe,EAAE,iBAAiB,GAAG,aAAa,GAAG,gBAAgB,CAAA;IACrE,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAA;CACjD;AAMD,qBAAa,uBAAuB;IAClC,OAAO,CAAC,WAAW,CAA8C;IACjE,OAAO,CAAC,MAAM,CAAQ;gBAEV,MAAM,EAAE,MAAM;IAI1B;;OAEG;IACG,KAAK,CAAC,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC;QAClD,KAAK,EAAE,MAAM,CAAA;QACb,SAAS,EAAE,OAAO,CAAA;QAClB,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAC;IA4CF;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBtD;;OAEG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzD;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBtD;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYrE;;OAEG;IACG,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAiC1E;;OAEG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB7G;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAwBzC;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC;QAC/B,QAAQ,EAAE,cAAc,EAAE,CAAA;QAC1B,KAAK,EAAE,YAAY,EAAE,CAAA;QACrB,UAAU,EAAE,MAAM,CAAA;KACnB,CAAC;YAeY,sBAAsB;YAuCtB,iBAAiB;YAejB,mBAAmB;YAenB,mBAAmB;CAiBlC;AAQD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,uBAAuB,CAK3E;AAED,oCAAoC;AACpC,eAAO,MAAM,0BAA0B,4BAAsB,CAAA;AAE7D,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Pattern Lifecycle Service
|
|
3
|
+
* @description Manages pattern evolution, regression detection, and auto-improvement
|
|
4
|
+
* @version 2.8.0
|
|
5
|
+
*/
|
|
6
|
+
import { turso } from '../db/turso-client.js';
|
|
7
|
+
import { getEventBus } from '../events/EventBus.js';
|
|
8
|
+
import { getPatternRegistry } from './registry.js';
|
|
9
|
+
// =============================================================================
|
|
10
|
+
// Pattern Lifecycle Service
|
|
11
|
+
// =============================================================================
|
|
12
|
+
export class PatternLifecycleService {
|
|
13
|
+
occurrences = new Map();
|
|
14
|
+
system;
|
|
15
|
+
constructor(system) {
|
|
16
|
+
this.system = system;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Track a pattern occurrence
|
|
20
|
+
*/
|
|
21
|
+
async track(occurrence) {
|
|
22
|
+
const registry = getPatternRegistry();
|
|
23
|
+
const pattern = registry.get(occurrence.patternId);
|
|
24
|
+
if (!pattern) {
|
|
25
|
+
return { count: 0, triggered: false };
|
|
26
|
+
}
|
|
27
|
+
// Add to local tracking
|
|
28
|
+
if (!this.occurrences.has(occurrence.patternId)) {
|
|
29
|
+
this.occurrences.set(occurrence.patternId, []);
|
|
30
|
+
}
|
|
31
|
+
const patternOccurrences = this.occurrences.get(occurrence.patternId);
|
|
32
|
+
// Check for duplicates
|
|
33
|
+
const isDuplicate = patternOccurrences.some(o => o.file === occurrence.file && o.line === occurrence.line);
|
|
34
|
+
if (!isDuplicate) {
|
|
35
|
+
patternOccurrences.push(occurrence);
|
|
36
|
+
}
|
|
37
|
+
// Persist to database
|
|
38
|
+
await this.persistOccurrence(occurrence);
|
|
39
|
+
// Check threshold
|
|
40
|
+
const threshold = registry.getEffectiveThreshold(occurrence.patternId);
|
|
41
|
+
const count = patternOccurrences.length;
|
|
42
|
+
const triggered = count >= threshold && pattern.status === 'active';
|
|
43
|
+
if (triggered) {
|
|
44
|
+
await this.triggerAutoImprovement(pattern, patternOccurrences);
|
|
45
|
+
return {
|
|
46
|
+
count,
|
|
47
|
+
triggered: true,
|
|
48
|
+
rule: registry.generateEslintRule(occurrence.patternId) ?? undefined
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return { count, triggered: false };
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Confirm a pattern detection (from expert approval)
|
|
55
|
+
*/
|
|
56
|
+
async confirmPattern(patternId) {
|
|
57
|
+
const registry = getPatternRegistry();
|
|
58
|
+
registry.recordFeedback(patternId, 'confirmed');
|
|
59
|
+
// Emit event for learning loop
|
|
60
|
+
const eventBus = getEventBus();
|
|
61
|
+
await eventBus.publish({
|
|
62
|
+
type: 'pattern.confirmed',
|
|
63
|
+
patternId,
|
|
64
|
+
timestamp: Date.now(),
|
|
65
|
+
metadata: {
|
|
66
|
+
source: 'lifecycle',
|
|
67
|
+
timestamp: Date.now(),
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Mark pattern as false positive (from expert rejection)
|
|
73
|
+
*/
|
|
74
|
+
async markFalsePositive(patternId) {
|
|
75
|
+
const registry = getPatternRegistry();
|
|
76
|
+
registry.recordFeedback(patternId, 'false_positive');
|
|
77
|
+
const pattern = registry.get(patternId);
|
|
78
|
+
if (pattern && pattern.falsePositives >= 5) {
|
|
79
|
+
console.log(`[PatternLifecycle] Pattern ${patternId} has many false positives, consider retirement`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Promote pattern severity (warning -> error)
|
|
84
|
+
*/
|
|
85
|
+
async promotePattern(patternId) {
|
|
86
|
+
const registry = getPatternRegistry();
|
|
87
|
+
const pattern = registry.get(patternId);
|
|
88
|
+
if (!pattern)
|
|
89
|
+
return;
|
|
90
|
+
const severityOrder = ['low', 'medium', 'high', 'critical'];
|
|
91
|
+
const currentIndex = severityOrder.indexOf(pattern.severity);
|
|
92
|
+
if (currentIndex < severityOrder.length - 1) {
|
|
93
|
+
const newSeverity = severityOrder[currentIndex + 1];
|
|
94
|
+
pattern.severity = newSeverity;
|
|
95
|
+
pattern.updatedAt = new Date().toISOString();
|
|
96
|
+
console.log(`[PatternLifecycle] Promoted ${patternId}: ${severityOrder[currentIndex]} -> ${newSeverity}`);
|
|
97
|
+
// Create memory entry
|
|
98
|
+
await this.createPatternMemory(pattern, 'promoted', `Promoted to ${newSeverity} severity`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Retire a pattern
|
|
103
|
+
*/
|
|
104
|
+
async retirePattern(patternId, reason) {
|
|
105
|
+
const registry = getPatternRegistry();
|
|
106
|
+
registry.updateStatus(patternId, 'retired', reason);
|
|
107
|
+
console.log(`[PatternLifecycle] Retired pattern ${patternId}: ${reason}`);
|
|
108
|
+
const pattern = registry.get(patternId);
|
|
109
|
+
if (pattern) {
|
|
110
|
+
await this.createPatternMemory(pattern, 'retired', reason);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Detect regression (pattern reappearing after implementation)
|
|
115
|
+
*/
|
|
116
|
+
async detectRegression(patternId) {
|
|
117
|
+
const registry = getPatternRegistry();
|
|
118
|
+
const pattern = registry.get(patternId);
|
|
119
|
+
if (!pattern || pattern.status !== 'implemented') {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
const occurrences = this.occurrences.get(patternId) || [];
|
|
123
|
+
const implementedAt = pattern.implementedAt ? new Date(pattern.implementedAt) : null;
|
|
124
|
+
if (!implementedAt)
|
|
125
|
+
return null;
|
|
126
|
+
// Count occurrences after implementation
|
|
127
|
+
const postImplementation = occurrences.filter(o => new Date(o.timestamp) > implementedAt);
|
|
128
|
+
if (postImplementation.length >= 3) {
|
|
129
|
+
return {
|
|
130
|
+
patternId,
|
|
131
|
+
message: `Pattern ${pattern.name} has reappeared ${postImplementation.length} times since ESLint rule was implemented`,
|
|
132
|
+
occurrencesSinceImplemented: postImplementation.length,
|
|
133
|
+
suggestedAction: postImplementation.length >= 10
|
|
134
|
+
? 'investigate'
|
|
135
|
+
: 'strengthen_rule',
|
|
136
|
+
severity: pattern.severity
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Adjust pattern sensitivity based on feedback
|
|
143
|
+
*/
|
|
144
|
+
async adjustSensitivity(patternId, feedback) {
|
|
145
|
+
const registry = getPatternRegistry();
|
|
146
|
+
const pattern = registry.get(patternId);
|
|
147
|
+
if (!pattern)
|
|
148
|
+
return;
|
|
149
|
+
if (feedback === 'too_sensitive') {
|
|
150
|
+
pattern.adjustedThreshold = (pattern.adjustedThreshold ?? pattern.threshold) + 1;
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
pattern.adjustedThreshold = Math.max(1, (pattern.adjustedThreshold ?? pattern.threshold) - 1);
|
|
154
|
+
}
|
|
155
|
+
pattern.updatedAt = new Date().toISOString();
|
|
156
|
+
console.log(`[PatternLifecycle] Adjusted ${patternId} threshold to ${pattern.adjustedThreshold}`);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Get stats for all patterns
|
|
160
|
+
*/
|
|
161
|
+
async getStats() {
|
|
162
|
+
const registry = getPatternRegistry();
|
|
163
|
+
const patterns = registry.getAll();
|
|
164
|
+
return patterns.map(pattern => {
|
|
165
|
+
const occurrences = this.occurrences.get(pattern.id) || [];
|
|
166
|
+
const files = [...new Set(occurrences.map(o => o.file))];
|
|
167
|
+
return {
|
|
168
|
+
patternId: pattern.id,
|
|
169
|
+
occurrences: occurrences.length,
|
|
170
|
+
lastSeen: occurrences.length > 0
|
|
171
|
+
? occurrences[occurrences.length - 1].timestamp
|
|
172
|
+
: '',
|
|
173
|
+
firstSeen: occurrences.length > 0
|
|
174
|
+
? occurrences[0].timestamp
|
|
175
|
+
: '',
|
|
176
|
+
files,
|
|
177
|
+
triggered: pattern.status === 'triggered' || pattern.status === 'implemented',
|
|
178
|
+
implemented: pattern.status === 'implemented'
|
|
179
|
+
};
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Export learnings as snapshot
|
|
184
|
+
*/
|
|
185
|
+
async exportLearnings() {
|
|
186
|
+
const registry = getPatternRegistry();
|
|
187
|
+
const stats = await this.getStats();
|
|
188
|
+
return {
|
|
189
|
+
patterns: registry.export(),
|
|
190
|
+
stats,
|
|
191
|
+
exportedAt: new Date().toISOString()
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
// ===========================================================================
|
|
195
|
+
// Private Methods
|
|
196
|
+
// ===========================================================================
|
|
197
|
+
async triggerAutoImprovement(pattern, occurrences) {
|
|
198
|
+
const registry = getPatternRegistry();
|
|
199
|
+
registry.updateStatus(pattern.id, 'triggered');
|
|
200
|
+
console.log(`[PatternLifecycle] Auto-improvement triggered for ${pattern.id}`);
|
|
201
|
+
console.log(` Occurrences: ${occurrences.length}`);
|
|
202
|
+
console.log(` Files: ${[...new Set(occurrences.map(o => o.file))].join(', ')}`);
|
|
203
|
+
// Generate ESLint rule
|
|
204
|
+
const rule = registry.generateEslintRule(pattern.id);
|
|
205
|
+
if (rule) {
|
|
206
|
+
await this.saveAutoImprovement(pattern, rule);
|
|
207
|
+
}
|
|
208
|
+
// Create memory entry
|
|
209
|
+
await this.createPatternMemory(pattern, 'triggered', `Pattern detected ${occurrences.length} times. ESLint rule generated.`);
|
|
210
|
+
// Emit event
|
|
211
|
+
const eventBus = getEventBus();
|
|
212
|
+
await eventBus.publish({
|
|
213
|
+
type: 'pattern.detected',
|
|
214
|
+
patternId: pattern.id,
|
|
215
|
+
occurrences: occurrences.length,
|
|
216
|
+
severity: pattern.severity,
|
|
217
|
+
timestamp: Date.now(),
|
|
218
|
+
metadata: {
|
|
219
|
+
source: 'lifecycle',
|
|
220
|
+
timestamp: Date.now(),
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
async persistOccurrence(occurrence) {
|
|
225
|
+
try {
|
|
226
|
+
await turso.create('pattern_occurrence', this.system, {
|
|
227
|
+
patternId: occurrence.patternId,
|
|
228
|
+
file: occurrence.file,
|
|
229
|
+
line: occurrence.line,
|
|
230
|
+
code: occurrence.code,
|
|
231
|
+
sessionId: occurrence.sessionId,
|
|
232
|
+
detectedAt: occurrence.timestamp
|
|
233
|
+
}, 'active');
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
console.warn('[PatternLifecycle] Failed to persist occurrence:', error);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
async saveAutoImprovement(pattern, ruleCode) {
|
|
240
|
+
try {
|
|
241
|
+
await turso.create('auto_improvement', this.system, {
|
|
242
|
+
patternId: pattern.id,
|
|
243
|
+
action: 'eslint_rule',
|
|
244
|
+
status: 'pending',
|
|
245
|
+
generatedCode: ruleCode,
|
|
246
|
+
filePath: `src/eslint/rules/${pattern.eslintRuleName}.ts`,
|
|
247
|
+
createdAt: new Date().toISOString()
|
|
248
|
+
}, 'pending');
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
console.warn('[PatternLifecycle] Failed to save auto-improvement:', error);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
async createPatternMemory(pattern, action, details) {
|
|
255
|
+
try {
|
|
256
|
+
await turso.create('memory', this.system, {
|
|
257
|
+
title: `Pattern ${action}: ${pattern.name}`,
|
|
258
|
+
body: `## ${pattern.name}\n\n**Action**: ${action}\n**Severity**: ${pattern.severity}\n\n${details}`,
|
|
259
|
+
domain: 'auto-improvement',
|
|
260
|
+
source: 'system',
|
|
261
|
+
tags: ['auto', 'pattern', pattern.id, action]
|
|
262
|
+
}, 'active');
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
console.warn('[PatternLifecycle] Failed to create memory:', error);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
// =============================================================================
|
|
270
|
+
// Singleton
|
|
271
|
+
// =============================================================================
|
|
272
|
+
let lifecycleInstance = null;
|
|
273
|
+
export function getPatternLifecycle(system) {
|
|
274
|
+
if (!lifecycleInstance) {
|
|
275
|
+
lifecycleInstance = new PatternLifecycleService(system);
|
|
276
|
+
}
|
|
277
|
+
return lifecycleInstance;
|
|
278
|
+
}
|
|
279
|
+
/** Alias for getPatternLifecycle */
|
|
280
|
+
export const getPatternLifecycleService = getPatternLifecycle;
|
|
281
|
+
export function resetPatternLifecycle() {
|
|
282
|
+
lifecycleInstance = null;
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/patterns/lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Unified Pattern Registry
|
|
3
|
+
* @description Single source of truth for all pattern definitions
|
|
4
|
+
* @version 2.8.0
|
|
5
|
+
*
|
|
6
|
+
* Combines functionality from:
|
|
7
|
+
* - auto-improve/pattern-detector.ts
|
|
8
|
+
* - services/pattern-tracker.ts
|
|
9
|
+
*/
|
|
10
|
+
import { z } from 'zod';
|
|
11
|
+
export declare const PatternSeveritySchema: z.ZodEnum<["critical", "high", "medium", "low"]>;
|
|
12
|
+
export type PatternSeverity = z.infer<typeof PatternSeveritySchema>;
|
|
13
|
+
export declare const PatternStatusSchema: z.ZodEnum<["active", "triggered", "implemented", "retired"]>;
|
|
14
|
+
export type PatternStatus = z.infer<typeof PatternStatusSchema>;
|
|
15
|
+
export declare const UnifiedPatternSchema: z.ZodObject<{
|
|
16
|
+
id: z.ZodString;
|
|
17
|
+
name: z.ZodString;
|
|
18
|
+
description: z.ZodString;
|
|
19
|
+
severity: z.ZodEnum<["critical", "high", "medium", "low"]>;
|
|
20
|
+
regex: z.ZodOptional<z.ZodString>;
|
|
21
|
+
filePatterns: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
22
|
+
excludePatterns: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
23
|
+
eslintRuleName: z.ZodOptional<z.ZodString>;
|
|
24
|
+
astVisitorTemplate: z.ZodOptional<z.ZodString>;
|
|
25
|
+
status: z.ZodDefault<z.ZodEnum<["active", "triggered", "implemented", "retired"]>>;
|
|
26
|
+
triggeredAt: z.ZodOptional<z.ZodString>;
|
|
27
|
+
implementedAt: z.ZodOptional<z.ZodString>;
|
|
28
|
+
retiredAt: z.ZodOptional<z.ZodString>;
|
|
29
|
+
retiredReason: z.ZodOptional<z.ZodString>;
|
|
30
|
+
threshold: z.ZodDefault<z.ZodNumber>;
|
|
31
|
+
falsePositives: z.ZodDefault<z.ZodNumber>;
|
|
32
|
+
confirmedViolations: z.ZodDefault<z.ZodNumber>;
|
|
33
|
+
adjustedThreshold: z.ZodOptional<z.ZodNumber>;
|
|
34
|
+
createdAt: z.ZodOptional<z.ZodString>;
|
|
35
|
+
updatedAt: z.ZodOptional<z.ZodString>;
|
|
36
|
+
createdBy: z.ZodOptional<z.ZodString>;
|
|
37
|
+
}, "strip", z.ZodTypeAny, {
|
|
38
|
+
status: "active" | "triggered" | "implemented" | "retired";
|
|
39
|
+
description: string;
|
|
40
|
+
severity: "critical" | "high" | "medium" | "low";
|
|
41
|
+
id: string;
|
|
42
|
+
name: string;
|
|
43
|
+
threshold: number;
|
|
44
|
+
falsePositives: number;
|
|
45
|
+
confirmedViolations: number;
|
|
46
|
+
createdAt?: string | undefined;
|
|
47
|
+
updatedAt?: string | undefined;
|
|
48
|
+
implementedAt?: string | undefined;
|
|
49
|
+
createdBy?: string | undefined;
|
|
50
|
+
regex?: string | undefined;
|
|
51
|
+
filePatterns?: string[] | undefined;
|
|
52
|
+
excludePatterns?: string[] | undefined;
|
|
53
|
+
eslintRuleName?: string | undefined;
|
|
54
|
+
astVisitorTemplate?: string | undefined;
|
|
55
|
+
triggeredAt?: string | undefined;
|
|
56
|
+
retiredAt?: string | undefined;
|
|
57
|
+
retiredReason?: string | undefined;
|
|
58
|
+
adjustedThreshold?: number | undefined;
|
|
59
|
+
}, {
|
|
60
|
+
description: string;
|
|
61
|
+
severity: "critical" | "high" | "medium" | "low";
|
|
62
|
+
id: string;
|
|
63
|
+
name: string;
|
|
64
|
+
status?: "active" | "triggered" | "implemented" | "retired" | undefined;
|
|
65
|
+
createdAt?: string | undefined;
|
|
66
|
+
updatedAt?: string | undefined;
|
|
67
|
+
implementedAt?: string | undefined;
|
|
68
|
+
createdBy?: string | undefined;
|
|
69
|
+
threshold?: number | undefined;
|
|
70
|
+
regex?: string | undefined;
|
|
71
|
+
filePatterns?: string[] | undefined;
|
|
72
|
+
excludePatterns?: string[] | undefined;
|
|
73
|
+
eslintRuleName?: string | undefined;
|
|
74
|
+
astVisitorTemplate?: string | undefined;
|
|
75
|
+
triggeredAt?: string | undefined;
|
|
76
|
+
retiredAt?: string | undefined;
|
|
77
|
+
retiredReason?: string | undefined;
|
|
78
|
+
falsePositives?: number | undefined;
|
|
79
|
+
confirmedViolations?: number | undefined;
|
|
80
|
+
adjustedThreshold?: number | undefined;
|
|
81
|
+
}>;
|
|
82
|
+
export type UnifiedPattern = z.infer<typeof UnifiedPatternSchema>;
|
|
83
|
+
export declare const BUILTIN_PATTERNS: UnifiedPattern[];
|
|
84
|
+
export declare class PatternRegistry {
|
|
85
|
+
private patterns;
|
|
86
|
+
private customPatterns;
|
|
87
|
+
constructor();
|
|
88
|
+
/**
|
|
89
|
+
* Get pattern by ID
|
|
90
|
+
*/
|
|
91
|
+
get(patternId: string): UnifiedPattern | undefined;
|
|
92
|
+
/**
|
|
93
|
+
* Get all patterns
|
|
94
|
+
*/
|
|
95
|
+
getAll(): UnifiedPattern[];
|
|
96
|
+
/**
|
|
97
|
+
* Get active patterns
|
|
98
|
+
*/
|
|
99
|
+
getActive(): UnifiedPattern[];
|
|
100
|
+
/**
|
|
101
|
+
* Get patterns by severity
|
|
102
|
+
*/
|
|
103
|
+
getBySeverity(severity: PatternSeverity): UnifiedPattern[];
|
|
104
|
+
/**
|
|
105
|
+
* Register custom pattern
|
|
106
|
+
*/
|
|
107
|
+
register(pattern: UnifiedPattern): void;
|
|
108
|
+
/**
|
|
109
|
+
* Update pattern status
|
|
110
|
+
*/
|
|
111
|
+
updateStatus(patternId: string, status: PatternStatus, reason?: string): void;
|
|
112
|
+
/**
|
|
113
|
+
* Record feedback (adjust learning)
|
|
114
|
+
*/
|
|
115
|
+
recordFeedback(patternId: string, type: 'confirmed' | 'false_positive'): void;
|
|
116
|
+
/**
|
|
117
|
+
* Get effective threshold for a pattern
|
|
118
|
+
*/
|
|
119
|
+
getEffectiveThreshold(patternId: string): number;
|
|
120
|
+
/**
|
|
121
|
+
* Detect pattern in content
|
|
122
|
+
*/
|
|
123
|
+
detect(content: string, filePath: string): Array<{
|
|
124
|
+
pattern: UnifiedPattern;
|
|
125
|
+
matches: RegExpMatchArray[];
|
|
126
|
+
}>;
|
|
127
|
+
/**
|
|
128
|
+
* Generate ESLint rule code for a pattern
|
|
129
|
+
*/
|
|
130
|
+
generateEslintRule(patternId: string): string | null;
|
|
131
|
+
/**
|
|
132
|
+
* Export all patterns for persistence
|
|
133
|
+
*/
|
|
134
|
+
export(): UnifiedPattern[];
|
|
135
|
+
/**
|
|
136
|
+
* Import patterns from persistence
|
|
137
|
+
*/
|
|
138
|
+
import(patterns: UnifiedPattern[]): void;
|
|
139
|
+
}
|
|
140
|
+
export declare function getPatternRegistry(): PatternRegistry;
|
|
141
|
+
export declare function resetPatternRegistry(): void;
|
|
142
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/patterns/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAMvB,eAAO,MAAM,qBAAqB,kDAAgD,CAAA;AAClF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAEnE,eAAO,MAAM,mBAAmB,8DAA4D,CAAA;AAC5F,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAE/D,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgC/B,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAMjE,eAAO,MAAM,gBAAgB,EAAE,cAAc,EAqM5C,CAAA;AAMD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,cAAc,CAAuB;;IAW7C;;OAEG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIlD;;OAEG;IACH,MAAM,IAAI,cAAc,EAAE;IAI1B;;OAEG;IACH,SAAS,IAAI,cAAc,EAAE;IAI7B;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,eAAe,GAAG,cAAc,EAAE;IAI1D;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAMvC;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAiB7E;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,gBAAgB,GAAG,IAAI;IAmB7E;;OAEG;IACH,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAMhD;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,OAAO,EAAE,cAAc,CAAC;QAAC,OAAO,EAAE,gBAAgB,EAAE,CAAA;KAAE,CAAC;IAmC1G;;OAEG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAiCpD;;OAEG;IACH,MAAM,IAAI,cAAc,EAAE;IAI1B;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,IAAI;CAUzC;AAQD,wBAAgB,kBAAkB,IAAI,eAAe,CAKpD;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
|