cmp-standards 2.8.0-alpha → 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/dist/cache/EmbeddingCache.d.ts +2 -1
- package/dist/cache/EmbeddingCache.d.ts.map +1 -1
- package/dist/cache/EmbeddingCache.js +12 -12
- package/dist/cache/EmbeddingCache.js.map +1 -1
- 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 +49 -38
- package/dist/db/turso-client.js.map +1 -1
- package/dist/events/EventBus.d.ts +10 -0
- package/dist/events/EventBus.d.ts.map +1 -1
- package/dist/events/EventBus.js +57 -1
- package/dist/events/EventBus.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/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/package.json +1 -1
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Learning Feedback Loop
|
|
3
|
+
* @description Connects expert panel votes to pattern detection for continuous improvement
|
|
4
|
+
*
|
|
5
|
+
* The feedback loop works as follows:
|
|
6
|
+
* 1. Expert panel reviews code
|
|
7
|
+
* 2. Each expert vote (APPROVE/REJECT/WARN) provides signal
|
|
8
|
+
* 3. Rejected findings increase pattern confidence
|
|
9
|
+
* 4. Approved findings with no issues may mark false positives
|
|
10
|
+
* 5. Patterns automatically adjust sensitivity based on feedback
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const loop = getLearningFeedbackLoop('PANEL')
|
|
15
|
+
* await loop.processExpertReview(review)
|
|
16
|
+
* await loop.processPanelConsensus(consensus)
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* @version 1.0.0
|
|
20
|
+
*/
|
|
21
|
+
import { z } from 'zod';
|
|
22
|
+
import { type PatternStatus } from './registry.js';
|
|
23
|
+
import type { DevSystem } from '../types/index.js';
|
|
24
|
+
export declare const ExpertVoteSchema: z.ZodEnum<["APPROVE", "REJECT", "WARN", "ABSTAIN"]>;
|
|
25
|
+
export type ExpertVote = z.infer<typeof ExpertVoteSchema>;
|
|
26
|
+
export declare const ExpertTypeSchema: z.ZodEnum<["security", "performance", "architecture", "ux", "database", "documentation", "memory"]>;
|
|
27
|
+
export type ExpertType = z.infer<typeof ExpertTypeSchema>;
|
|
28
|
+
export declare const ExpertFindingSchema: z.ZodObject<{
|
|
29
|
+
patternId: z.ZodString;
|
|
30
|
+
filePath: z.ZodString;
|
|
31
|
+
line: z.ZodDefault<z.ZodNumber>;
|
|
32
|
+
code: z.ZodDefault<z.ZodString>;
|
|
33
|
+
severity: z.ZodDefault<z.ZodEnum<["critical", "high", "medium", "low"]>>;
|
|
34
|
+
description: z.ZodString;
|
|
35
|
+
expertType: z.ZodEnum<["security", "performance", "architecture", "ux", "database", "documentation", "memory"]>;
|
|
36
|
+
}, "strip", z.ZodTypeAny, {
|
|
37
|
+
code: string;
|
|
38
|
+
patternId: string;
|
|
39
|
+
description: string;
|
|
40
|
+
line: number;
|
|
41
|
+
severity: "critical" | "high" | "medium" | "low";
|
|
42
|
+
filePath: string;
|
|
43
|
+
expertType: "memory" | "documentation" | "performance" | "security" | "ux" | "architecture" | "database";
|
|
44
|
+
}, {
|
|
45
|
+
patternId: string;
|
|
46
|
+
description: string;
|
|
47
|
+
filePath: string;
|
|
48
|
+
expertType: "memory" | "documentation" | "performance" | "security" | "ux" | "architecture" | "database";
|
|
49
|
+
code?: string | undefined;
|
|
50
|
+
line?: number | undefined;
|
|
51
|
+
severity?: "critical" | "high" | "medium" | "low" | undefined;
|
|
52
|
+
}>;
|
|
53
|
+
export type ExpertFinding = z.infer<typeof ExpertFindingSchema>;
|
|
54
|
+
export declare const ExpertReviewResultSchema: z.ZodObject<{
|
|
55
|
+
expertType: z.ZodEnum<["security", "performance", "architecture", "ux", "database", "documentation", "memory"]>;
|
|
56
|
+
vote: z.ZodEnum<["APPROVE", "REJECT", "WARN", "ABSTAIN"]>;
|
|
57
|
+
findings: z.ZodArray<z.ZodObject<{
|
|
58
|
+
patternId: z.ZodString;
|
|
59
|
+
filePath: z.ZodString;
|
|
60
|
+
line: z.ZodDefault<z.ZodNumber>;
|
|
61
|
+
code: z.ZodDefault<z.ZodString>;
|
|
62
|
+
severity: z.ZodDefault<z.ZodEnum<["critical", "high", "medium", "low"]>>;
|
|
63
|
+
description: z.ZodString;
|
|
64
|
+
expertType: z.ZodEnum<["security", "performance", "architecture", "ux", "database", "documentation", "memory"]>;
|
|
65
|
+
}, "strip", z.ZodTypeAny, {
|
|
66
|
+
code: string;
|
|
67
|
+
patternId: string;
|
|
68
|
+
description: string;
|
|
69
|
+
line: number;
|
|
70
|
+
severity: "critical" | "high" | "medium" | "low";
|
|
71
|
+
filePath: string;
|
|
72
|
+
expertType: "memory" | "documentation" | "performance" | "security" | "ux" | "architecture" | "database";
|
|
73
|
+
}, {
|
|
74
|
+
patternId: string;
|
|
75
|
+
description: string;
|
|
76
|
+
filePath: string;
|
|
77
|
+
expertType: "memory" | "documentation" | "performance" | "security" | "ux" | "architecture" | "database";
|
|
78
|
+
code?: string | undefined;
|
|
79
|
+
line?: number | undefined;
|
|
80
|
+
severity?: "critical" | "high" | "medium" | "low" | undefined;
|
|
81
|
+
}>, "many">;
|
|
82
|
+
reasoning: z.ZodOptional<z.ZodString>;
|
|
83
|
+
timestamp: z.ZodString;
|
|
84
|
+
}, "strip", z.ZodTypeAny, {
|
|
85
|
+
timestamp: string;
|
|
86
|
+
vote: "APPROVE" | "REJECT" | "WARN" | "ABSTAIN";
|
|
87
|
+
expertType: "memory" | "documentation" | "performance" | "security" | "ux" | "architecture" | "database";
|
|
88
|
+
findings: {
|
|
89
|
+
code: string;
|
|
90
|
+
patternId: string;
|
|
91
|
+
description: string;
|
|
92
|
+
line: number;
|
|
93
|
+
severity: "critical" | "high" | "medium" | "low";
|
|
94
|
+
filePath: string;
|
|
95
|
+
expertType: "memory" | "documentation" | "performance" | "security" | "ux" | "architecture" | "database";
|
|
96
|
+
}[];
|
|
97
|
+
reasoning?: string | undefined;
|
|
98
|
+
}, {
|
|
99
|
+
timestamp: string;
|
|
100
|
+
vote: "APPROVE" | "REJECT" | "WARN" | "ABSTAIN";
|
|
101
|
+
expertType: "memory" | "documentation" | "performance" | "security" | "ux" | "architecture" | "database";
|
|
102
|
+
findings: {
|
|
103
|
+
patternId: string;
|
|
104
|
+
description: string;
|
|
105
|
+
filePath: string;
|
|
106
|
+
expertType: "memory" | "documentation" | "performance" | "security" | "ux" | "architecture" | "database";
|
|
107
|
+
code?: string | undefined;
|
|
108
|
+
line?: number | undefined;
|
|
109
|
+
severity?: "critical" | "high" | "medium" | "low" | undefined;
|
|
110
|
+
}[];
|
|
111
|
+
reasoning?: string | undefined;
|
|
112
|
+
}>;
|
|
113
|
+
export type ExpertReviewResult = z.infer<typeof ExpertReviewResultSchema>;
|
|
114
|
+
export declare const PanelConsensusSchema: z.ZodObject<{
|
|
115
|
+
approved: z.ZodBoolean;
|
|
116
|
+
votes: z.ZodRecord<z.ZodEnum<["security", "performance", "architecture", "ux", "database", "documentation", "memory"]>, z.ZodEnum<["APPROVE", "REJECT", "WARN", "ABSTAIN"]>>;
|
|
117
|
+
allFindings: z.ZodArray<z.ZodObject<{
|
|
118
|
+
patternId: z.ZodString;
|
|
119
|
+
filePath: z.ZodString;
|
|
120
|
+
line: z.ZodDefault<z.ZodNumber>;
|
|
121
|
+
code: z.ZodDefault<z.ZodString>;
|
|
122
|
+
severity: z.ZodDefault<z.ZodEnum<["critical", "high", "medium", "low"]>>;
|
|
123
|
+
description: z.ZodString;
|
|
124
|
+
expertType: z.ZodEnum<["security", "performance", "architecture", "ux", "database", "documentation", "memory"]>;
|
|
125
|
+
}, "strip", z.ZodTypeAny, {
|
|
126
|
+
code: string;
|
|
127
|
+
patternId: string;
|
|
128
|
+
description: string;
|
|
129
|
+
line: number;
|
|
130
|
+
severity: "critical" | "high" | "medium" | "low";
|
|
131
|
+
filePath: string;
|
|
132
|
+
expertType: "memory" | "documentation" | "performance" | "security" | "ux" | "architecture" | "database";
|
|
133
|
+
}, {
|
|
134
|
+
patternId: string;
|
|
135
|
+
description: string;
|
|
136
|
+
filePath: string;
|
|
137
|
+
expertType: "memory" | "documentation" | "performance" | "security" | "ux" | "architecture" | "database";
|
|
138
|
+
code?: string | undefined;
|
|
139
|
+
line?: number | undefined;
|
|
140
|
+
severity?: "critical" | "high" | "medium" | "low" | undefined;
|
|
141
|
+
}>, "many">;
|
|
142
|
+
correlationId: z.ZodString;
|
|
143
|
+
filesReviewed: z.ZodArray<z.ZodString, "many">;
|
|
144
|
+
isCritical: z.ZodBoolean;
|
|
145
|
+
}, "strip", z.ZodTypeAny, {
|
|
146
|
+
correlationId: string;
|
|
147
|
+
votes: Partial<Record<"memory" | "documentation" | "performance" | "security" | "ux" | "architecture" | "database", "APPROVE" | "REJECT" | "WARN" | "ABSTAIN">>;
|
|
148
|
+
filesReviewed: string[];
|
|
149
|
+
approved: boolean;
|
|
150
|
+
allFindings: {
|
|
151
|
+
code: string;
|
|
152
|
+
patternId: string;
|
|
153
|
+
description: string;
|
|
154
|
+
line: number;
|
|
155
|
+
severity: "critical" | "high" | "medium" | "low";
|
|
156
|
+
filePath: string;
|
|
157
|
+
expertType: "memory" | "documentation" | "performance" | "security" | "ux" | "architecture" | "database";
|
|
158
|
+
}[];
|
|
159
|
+
isCritical: boolean;
|
|
160
|
+
}, {
|
|
161
|
+
correlationId: string;
|
|
162
|
+
votes: Partial<Record<"memory" | "documentation" | "performance" | "security" | "ux" | "architecture" | "database", "APPROVE" | "REJECT" | "WARN" | "ABSTAIN">>;
|
|
163
|
+
filesReviewed: string[];
|
|
164
|
+
approved: boolean;
|
|
165
|
+
allFindings: {
|
|
166
|
+
patternId: string;
|
|
167
|
+
description: string;
|
|
168
|
+
filePath: string;
|
|
169
|
+
expertType: "memory" | "documentation" | "performance" | "security" | "ux" | "architecture" | "database";
|
|
170
|
+
code?: string | undefined;
|
|
171
|
+
line?: number | undefined;
|
|
172
|
+
severity?: "critical" | "high" | "medium" | "low" | undefined;
|
|
173
|
+
}[];
|
|
174
|
+
isCritical: boolean;
|
|
175
|
+
}>;
|
|
176
|
+
export type PanelConsensus = z.infer<typeof PanelConsensusSchema>;
|
|
177
|
+
export interface FeedbackLoopConfig {
|
|
178
|
+
/** Minimum findings to trigger pattern confirmation */
|
|
179
|
+
confirmationThreshold: number;
|
|
180
|
+
/** Minimum consecutive approvals to reduce pattern sensitivity */
|
|
181
|
+
falsePositiveThreshold: number;
|
|
182
|
+
/** Enable auto-adjustment of pattern sensitivity */
|
|
183
|
+
autoAdjust: boolean;
|
|
184
|
+
/** Debug logging */
|
|
185
|
+
debug: boolean;
|
|
186
|
+
}
|
|
187
|
+
export declare class LearningFeedbackLoop {
|
|
188
|
+
private config;
|
|
189
|
+
private lifecycle;
|
|
190
|
+
private registry;
|
|
191
|
+
private system;
|
|
192
|
+
private patternFeedback;
|
|
193
|
+
constructor(system: DevSystem, config?: Partial<FeedbackLoopConfig>);
|
|
194
|
+
/**
|
|
195
|
+
* Process an individual expert review
|
|
196
|
+
*/
|
|
197
|
+
processExpertReview(review: ExpertReviewResult): Promise<void>;
|
|
198
|
+
/**
|
|
199
|
+
* Process panel consensus result
|
|
200
|
+
*/
|
|
201
|
+
processPanelConsensus(consensus: PanelConsensus): Promise<void>;
|
|
202
|
+
/**
|
|
203
|
+
* Record a finding and update pattern feedback
|
|
204
|
+
*/
|
|
205
|
+
private recordFinding;
|
|
206
|
+
/**
|
|
207
|
+
* Evaluate if findings might be false positives
|
|
208
|
+
*/
|
|
209
|
+
private evaluatePotentialFalsePositives;
|
|
210
|
+
/**
|
|
211
|
+
* Confirm pattern findings when code is rejected
|
|
212
|
+
*/
|
|
213
|
+
private confirmPatternFindings;
|
|
214
|
+
/**
|
|
215
|
+
* Check for regressions - patterns that were fixed but reappear
|
|
216
|
+
*/
|
|
217
|
+
private checkForRegressions;
|
|
218
|
+
/**
|
|
219
|
+
* Get feedback statistics for a pattern
|
|
220
|
+
*/
|
|
221
|
+
getPatternStats(patternId: string): {
|
|
222
|
+
confirmations: number;
|
|
223
|
+
falsePositives: number;
|
|
224
|
+
accuracy: number;
|
|
225
|
+
expertVotes: Array<{
|
|
226
|
+
expert: ExpertType;
|
|
227
|
+
vote: ExpertVote;
|
|
228
|
+
}>;
|
|
229
|
+
} | null;
|
|
230
|
+
/**
|
|
231
|
+
* Get overall learning statistics
|
|
232
|
+
*/
|
|
233
|
+
getStats(): {
|
|
234
|
+
totalPatterns: number;
|
|
235
|
+
totalConfirmations: number;
|
|
236
|
+
totalFalsePositives: number;
|
|
237
|
+
overallAccuracy: number;
|
|
238
|
+
patternsByStatus: Record<PatternStatus, number>;
|
|
239
|
+
};
|
|
240
|
+
/**
|
|
241
|
+
* Submit manual feedback for a pattern
|
|
242
|
+
*/
|
|
243
|
+
submitFeedback(patternId: string, feedback: 'confirmed' | 'false_positive', context?: {
|
|
244
|
+
file?: string;
|
|
245
|
+
reason?: string;
|
|
246
|
+
}): Promise<void>;
|
|
247
|
+
/**
|
|
248
|
+
* Reset feedback for a pattern
|
|
249
|
+
*/
|
|
250
|
+
resetPattern(patternId: string): void;
|
|
251
|
+
/**
|
|
252
|
+
* Clear all feedback data
|
|
253
|
+
*/
|
|
254
|
+
clear(): void;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Get or create the global LearningFeedbackLoop instance
|
|
258
|
+
*/
|
|
259
|
+
export declare function getLearningFeedbackLoop(system: DevSystem, config?: Partial<FeedbackLoopConfig>): LearningFeedbackLoop;
|
|
260
|
+
/**
|
|
261
|
+
* Reset the global feedback loop (useful for testing)
|
|
262
|
+
*/
|
|
263
|
+
export declare function resetLearningFeedbackLoop(): void;
|
|
264
|
+
//# sourceMappingURL=feedback-loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback-loop.d.ts","sourceRoot":"","sources":["../../src/patterns/feedback-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Learning Feedback Loop
|
|
3
|
+
* @description Connects expert panel votes to pattern detection for continuous improvement
|
|
4
|
+
*
|
|
5
|
+
* The feedback loop works as follows:
|
|
6
|
+
* 1. Expert panel reviews code
|
|
7
|
+
* 2. Each expert vote (APPROVE/REJECT/WARN) provides signal
|
|
8
|
+
* 3. Rejected findings increase pattern confidence
|
|
9
|
+
* 4. Approved findings with no issues may mark false positives
|
|
10
|
+
* 5. Patterns automatically adjust sensitivity based on feedback
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const loop = getLearningFeedbackLoop('PANEL')
|
|
15
|
+
* await loop.processExpertReview(review)
|
|
16
|
+
* await loop.processPanelConsensus(consensus)
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* @version 1.0.0
|
|
20
|
+
*/
|
|
21
|
+
import { z } from 'zod';
|
|
22
|
+
import { getPatternRegistry } from './registry.js';
|
|
23
|
+
import { getPatternLifecycleService } from './lifecycle.js';
|
|
24
|
+
// =============================================================================
|
|
25
|
+
// Types
|
|
26
|
+
// =============================================================================
|
|
27
|
+
export const ExpertVoteSchema = z.enum(['APPROVE', 'REJECT', 'WARN', 'ABSTAIN']);
|
|
28
|
+
export const ExpertTypeSchema = z.enum([
|
|
29
|
+
'security',
|
|
30
|
+
'performance',
|
|
31
|
+
'architecture',
|
|
32
|
+
'ux',
|
|
33
|
+
'database',
|
|
34
|
+
'documentation',
|
|
35
|
+
'memory',
|
|
36
|
+
]);
|
|
37
|
+
export const ExpertFindingSchema = z.object({
|
|
38
|
+
patternId: z.string(),
|
|
39
|
+
filePath: z.string(),
|
|
40
|
+
line: z.number().default(0),
|
|
41
|
+
code: z.string().default(''),
|
|
42
|
+
severity: z.enum(['critical', 'high', 'medium', 'low']).default('medium'),
|
|
43
|
+
description: z.string(),
|
|
44
|
+
expertType: ExpertTypeSchema,
|
|
45
|
+
});
|
|
46
|
+
export const ExpertReviewResultSchema = z.object({
|
|
47
|
+
expertType: ExpertTypeSchema,
|
|
48
|
+
vote: ExpertVoteSchema,
|
|
49
|
+
findings: z.array(ExpertFindingSchema),
|
|
50
|
+
reasoning: z.string().optional(),
|
|
51
|
+
timestamp: z.string(),
|
|
52
|
+
});
|
|
53
|
+
export const PanelConsensusSchema = z.object({
|
|
54
|
+
approved: z.boolean(),
|
|
55
|
+
votes: z.record(ExpertTypeSchema, ExpertVoteSchema),
|
|
56
|
+
allFindings: z.array(ExpertFindingSchema),
|
|
57
|
+
correlationId: z.string(),
|
|
58
|
+
filesReviewed: z.array(z.string()),
|
|
59
|
+
isCritical: z.boolean(),
|
|
60
|
+
});
|
|
61
|
+
const DEFAULT_CONFIG = {
|
|
62
|
+
confirmationThreshold: 3,
|
|
63
|
+
falsePositiveThreshold: 5,
|
|
64
|
+
autoAdjust: true,
|
|
65
|
+
debug: false,
|
|
66
|
+
};
|
|
67
|
+
// =============================================================================
|
|
68
|
+
// Learning Feedback Loop Service
|
|
69
|
+
// =============================================================================
|
|
70
|
+
export class LearningFeedbackLoop {
|
|
71
|
+
config;
|
|
72
|
+
lifecycle;
|
|
73
|
+
registry = getPatternRegistry();
|
|
74
|
+
system;
|
|
75
|
+
// Track pattern feedback over sessions
|
|
76
|
+
patternFeedback = new Map();
|
|
77
|
+
constructor(system, config = {}) {
|
|
78
|
+
this.system = system;
|
|
79
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
80
|
+
this.lifecycle = getPatternLifecycleService(system);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Process an individual expert review
|
|
84
|
+
*/
|
|
85
|
+
async processExpertReview(review) {
|
|
86
|
+
if (this.config.debug) {
|
|
87
|
+
console.log(`[FeedbackLoop] Processing ${review.expertType} review: ${review.vote}`);
|
|
88
|
+
}
|
|
89
|
+
for (const finding of review.findings) {
|
|
90
|
+
await this.recordFinding(finding, review.vote);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Process panel consensus result
|
|
95
|
+
*/
|
|
96
|
+
async processPanelConsensus(consensus) {
|
|
97
|
+
if (this.config.debug) {
|
|
98
|
+
console.log(`[FeedbackLoop] Processing consensus: ${consensus.approved ? 'APPROVED' : 'REJECTED'} ` +
|
|
99
|
+
`(${consensus.allFindings.length} findings)`);
|
|
100
|
+
}
|
|
101
|
+
// Group findings by pattern
|
|
102
|
+
const findingsByPattern = new Map();
|
|
103
|
+
for (const finding of consensus.allFindings) {
|
|
104
|
+
const existing = findingsByPattern.get(finding.patternId) || [];
|
|
105
|
+
existing.push(finding);
|
|
106
|
+
findingsByPattern.set(finding.patternId, existing);
|
|
107
|
+
}
|
|
108
|
+
// Process each pattern's findings
|
|
109
|
+
for (const [patternId, findings] of findingsByPattern) {
|
|
110
|
+
if (consensus.approved) {
|
|
111
|
+
// If approved despite findings, might be false positives
|
|
112
|
+
await this.evaluatePotentialFalsePositives(patternId, findings, consensus);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
// If rejected, these findings are confirmed issues
|
|
116
|
+
await this.confirmPatternFindings(patternId, findings);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Check for patterns that were expected but not found (potential regression)
|
|
120
|
+
await this.checkForRegressions(consensus.filesReviewed);
|
|
121
|
+
if (this.config.debug) {
|
|
122
|
+
console.log(`[FeedbackLoop] Learning complete: ${findingsByPattern.size} patterns processed, ` +
|
|
123
|
+
`consensus=${consensus.approved ? 'APPROVED' : 'REJECTED'}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Record a finding and update pattern feedback
|
|
128
|
+
*/
|
|
129
|
+
async recordFinding(finding, vote) {
|
|
130
|
+
const { patternId, expertType } = finding;
|
|
131
|
+
// Get or create feedback entry
|
|
132
|
+
let feedback = this.patternFeedback.get(patternId);
|
|
133
|
+
if (!feedback) {
|
|
134
|
+
feedback = {
|
|
135
|
+
confirmations: 0,
|
|
136
|
+
falsePositives: 0,
|
|
137
|
+
lastSeen: new Date().toISOString(),
|
|
138
|
+
expertVotes: [],
|
|
139
|
+
};
|
|
140
|
+
this.patternFeedback.set(patternId, feedback);
|
|
141
|
+
}
|
|
142
|
+
// Record vote
|
|
143
|
+
feedback.expertVotes.push({
|
|
144
|
+
expert: expertType,
|
|
145
|
+
vote,
|
|
146
|
+
timestamp: new Date().toISOString(),
|
|
147
|
+
});
|
|
148
|
+
feedback.lastSeen = new Date().toISOString();
|
|
149
|
+
// Track occurrence in lifecycle
|
|
150
|
+
await this.lifecycle.track({
|
|
151
|
+
patternId,
|
|
152
|
+
file: finding.filePath,
|
|
153
|
+
line: finding.line ?? 0,
|
|
154
|
+
code: finding.code ?? '',
|
|
155
|
+
timestamp: new Date().toISOString(),
|
|
156
|
+
});
|
|
157
|
+
// If REJECT, this is a confirmed issue
|
|
158
|
+
if (vote === 'REJECT') {
|
|
159
|
+
feedback.confirmations++;
|
|
160
|
+
await this.registry.recordFeedback(patternId, 'confirmed');
|
|
161
|
+
if (this.config.debug) {
|
|
162
|
+
console.log(`[FeedbackLoop] Pattern ${patternId} confirmed (${feedback.confirmations}x)`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Evaluate if findings might be false positives
|
|
168
|
+
*/
|
|
169
|
+
async evaluatePotentialFalsePositives(patternId, findings, consensus) {
|
|
170
|
+
// Count how many experts approved despite this pattern being found
|
|
171
|
+
const approvalCount = Object.values(consensus.votes).filter(v => v === 'APPROVE').length;
|
|
172
|
+
const totalVotes = Object.keys(consensus.votes).length;
|
|
173
|
+
// If strong consensus to approve, these might be false positives
|
|
174
|
+
if (approvalCount >= totalVotes * 0.8) {
|
|
175
|
+
const feedback = this.patternFeedback.get(patternId);
|
|
176
|
+
if (feedback) {
|
|
177
|
+
feedback.falsePositives++;
|
|
178
|
+
// Check if we should reduce sensitivity
|
|
179
|
+
if (this.config.autoAdjust && feedback.falsePositives >= this.config.falsePositiveThreshold) {
|
|
180
|
+
await this.lifecycle.adjustSensitivity(patternId, 'too_sensitive');
|
|
181
|
+
if (this.config.debug) {
|
|
182
|
+
console.log(`[FeedbackLoop] Pattern ${patternId} marked as too sensitive`);
|
|
183
|
+
}
|
|
184
|
+
// Reset counter
|
|
185
|
+
feedback.falsePositives = 0;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
await this.registry.recordFeedback(patternId, 'false_positive');
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Confirm pattern findings when code is rejected
|
|
193
|
+
*/
|
|
194
|
+
async confirmPatternFindings(patternId, findings) {
|
|
195
|
+
const feedback = this.patternFeedback.get(patternId);
|
|
196
|
+
if (feedback) {
|
|
197
|
+
feedback.confirmations += findings.length;
|
|
198
|
+
// Check if pattern should be promoted
|
|
199
|
+
if (feedback.confirmations >= this.config.confirmationThreshold) {
|
|
200
|
+
await this.lifecycle.confirmPattern(patternId);
|
|
201
|
+
// Check if we should generate ESLint rule
|
|
202
|
+
const rule = this.registry.generateEslintRule(patternId);
|
|
203
|
+
if (rule && this.config.debug) {
|
|
204
|
+
console.log(`[FeedbackLoop] Generated ESLint rule for ${patternId}`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Check for regressions - patterns that were fixed but reappear
|
|
211
|
+
*/
|
|
212
|
+
async checkForRegressions(filesReviewed) {
|
|
213
|
+
for (const file of filesReviewed) {
|
|
214
|
+
// Get active patterns that should be checked
|
|
215
|
+
const activePatterns = this.registry.getActive();
|
|
216
|
+
for (const pattern of activePatterns) {
|
|
217
|
+
if (pattern.status === 'implemented') {
|
|
218
|
+
const regression = await this.lifecycle.detectRegression(pattern.id);
|
|
219
|
+
if (regression && this.config.debug) {
|
|
220
|
+
console.log(`[FeedbackLoop] Regression detected: ${pattern.id} in ${file} - ` +
|
|
221
|
+
`${regression.message} (severity: ${regression.severity})`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Get feedback statistics for a pattern
|
|
229
|
+
*/
|
|
230
|
+
getPatternStats(patternId) {
|
|
231
|
+
const feedback = this.patternFeedback.get(patternId);
|
|
232
|
+
if (!feedback)
|
|
233
|
+
return null;
|
|
234
|
+
const total = feedback.confirmations + feedback.falsePositives;
|
|
235
|
+
const accuracy = total > 0 ? feedback.confirmations / total : 0;
|
|
236
|
+
return {
|
|
237
|
+
confirmations: feedback.confirmations,
|
|
238
|
+
falsePositives: feedback.falsePositives,
|
|
239
|
+
accuracy: Math.round(accuracy * 100) / 100,
|
|
240
|
+
expertVotes: feedback.expertVotes.map(v => ({
|
|
241
|
+
expert: v.expert,
|
|
242
|
+
vote: v.vote,
|
|
243
|
+
})),
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Get overall learning statistics
|
|
248
|
+
*/
|
|
249
|
+
getStats() {
|
|
250
|
+
let totalConfirmations = 0;
|
|
251
|
+
let totalFalsePositives = 0;
|
|
252
|
+
for (const feedback of this.patternFeedback.values()) {
|
|
253
|
+
totalConfirmations += feedback.confirmations;
|
|
254
|
+
totalFalsePositives += feedback.falsePositives;
|
|
255
|
+
}
|
|
256
|
+
const total = totalConfirmations + totalFalsePositives;
|
|
257
|
+
const accuracy = total > 0 ? totalConfirmations / total : 0;
|
|
258
|
+
// Count patterns by status
|
|
259
|
+
const patternsByStatus = {
|
|
260
|
+
active: 0,
|
|
261
|
+
triggered: 0,
|
|
262
|
+
implemented: 0,
|
|
263
|
+
retired: 0,
|
|
264
|
+
};
|
|
265
|
+
for (const pattern of this.registry.getAll()) {
|
|
266
|
+
patternsByStatus[pattern.status]++;
|
|
267
|
+
}
|
|
268
|
+
return {
|
|
269
|
+
totalPatterns: this.patternFeedback.size,
|
|
270
|
+
totalConfirmations,
|
|
271
|
+
totalFalsePositives,
|
|
272
|
+
overallAccuracy: Math.round(accuracy * 100) / 100,
|
|
273
|
+
patternsByStatus,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Submit manual feedback for a pattern
|
|
278
|
+
*/
|
|
279
|
+
async submitFeedback(patternId, feedback, context) {
|
|
280
|
+
this.registry.recordFeedback(patternId, feedback);
|
|
281
|
+
const entry = this.patternFeedback.get(patternId);
|
|
282
|
+
if (entry) {
|
|
283
|
+
if (feedback === 'confirmed') {
|
|
284
|
+
entry.confirmations++;
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
entry.falsePositives++;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
if (this.config.debug) {
|
|
291
|
+
console.log(`[FeedbackLoop] Manual feedback: ${patternId} = ${feedback}`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Reset feedback for a pattern
|
|
296
|
+
*/
|
|
297
|
+
resetPattern(patternId) {
|
|
298
|
+
this.patternFeedback.delete(patternId);
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Clear all feedback data
|
|
302
|
+
*/
|
|
303
|
+
clear() {
|
|
304
|
+
this.patternFeedback.clear();
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
// =============================================================================
|
|
308
|
+
// Singleton Instance
|
|
309
|
+
// =============================================================================
|
|
310
|
+
let feedbackLoopInstance = null;
|
|
311
|
+
/**
|
|
312
|
+
* Get or create the global LearningFeedbackLoop instance
|
|
313
|
+
*/
|
|
314
|
+
export function getLearningFeedbackLoop(system, config) {
|
|
315
|
+
if (!feedbackLoopInstance) {
|
|
316
|
+
feedbackLoopInstance = new LearningFeedbackLoop(system, config);
|
|
317
|
+
}
|
|
318
|
+
return feedbackLoopInstance;
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Reset the global feedback loop (useful for testing)
|
|
322
|
+
*/
|
|
323
|
+
export function resetLearningFeedbackLoop() {
|
|
324
|
+
if (feedbackLoopInstance) {
|
|
325
|
+
feedbackLoopInstance.clear();
|
|
326
|
+
}
|
|
327
|
+
feedbackLoopInstance = null;
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=feedback-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback-loop.js","sourceRoot":"","sources":["../../src/patterns/feedback-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Patterns Module Index
|
|
3
|
+
* @description Unified pattern detection and lifecycle management
|
|
4
|
+
* @version 2.8.0
|
|
5
|
+
*/
|
|
6
|
+
export * from './registry.js';
|
|
7
|
+
export * from './lifecycle.js';
|
|
8
|
+
export * from './feedback-loop.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/patterns/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,oBAAoB,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Patterns Module Index
|
|
3
|
+
* @description Unified pattern detection and lifecycle management
|
|
4
|
+
* @version 2.8.0
|
|
5
|
+
*/
|
|
6
|
+
export * from './registry.js';
|
|
7
|
+
export * from './lifecycle.js';
|
|
8
|
+
export * from './feedback-loop.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/patterns/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,oBAAoB,CAAA"}
|