proagents 1.6.20 → 1.6.22

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 (136) hide show
  1. package/.claude/settings.local.json +3 -1
  2. package/.proagents/.cursorrules +1 -1
  3. package/.proagents/.windsurfrules +1 -1
  4. package/.proagents/AGENTS.md +1 -1
  5. package/.proagents/AI_INSTRUCTIONS.md +29 -1
  6. package/.proagents/BOLT.md +1 -1
  7. package/.proagents/CLAUDE.md +1 -1
  8. package/.proagents/GEMINI.md +1 -1
  9. package/.proagents/KIRO.md +1 -1
  10. package/.proagents/LOVABLE.md +1 -1
  11. package/.proagents/REPLIT.md +1 -1
  12. package/.proagents/custom-commands.yaml +1 -2
  13. package/.proagents/docs/command-details.md +1 -2
  14. package/.proagents/getting-started/ai-training-setup.md +0 -1
  15. package/.proagents/performance/README.md +59 -0
  16. package/.proagents/performance/bundle-analysis.md +375 -0
  17. package/.proagents/performance/load-testing.md +563 -0
  18. package/.proagents/performance/runtime-metrics.md +489 -0
  19. package/.proagents/performance/web-vitals.md +425 -0
  20. package/.proagents/proagents.config.yaml +55 -1
  21. package/.proagents/prompts/11-session-tracking.md +100 -0
  22. package/.proagents/prompts/13-commit.md +426 -0
  23. package/.proagents/workflow-modes/entry-modes.md +1 -6
  24. package/COMMANDS.md +19 -0
  25. package/lib/commands/init.js +62 -11
  26. package/package.json +1 -1
  27. package/.proagents/api-versioning/README.md +0 -257
  28. package/.proagents/api-versioning/changelog-template.md +0 -225
  29. package/.proagents/api-versioning/deprecation-workflow.md +0 -470
  30. package/.proagents/api-versioning/versioning-strategy.md +0 -291
  31. package/.proagents/automation/README.md +0 -38
  32. package/.proagents/automation/ai-behavior-rules.md +0 -339
  33. package/.proagents/automation/ai-prompt-injection.md +0 -331
  34. package/.proagents/automation/auto-decisions.md +0 -535
  35. package/.proagents/automation/decision-defaults.yaml +0 -317
  36. package/.proagents/cache/README.md +0 -110
  37. package/.proagents/cache/analysis-metadata.json +0 -76
  38. package/.proagents/cache/conventions.json +0 -125
  39. package/.proagents/cache/dependencies.json +0 -85
  40. package/.proagents/cache/features.json +0 -115
  41. package/.proagents/cache/patterns.json +0 -105
  42. package/.proagents/cache/schemas/conventions-schema.json +0 -138
  43. package/.proagents/cache/schemas/dependencies-schema.json +0 -95
  44. package/.proagents/cache/schemas/features-schema.json +0 -104
  45. package/.proagents/cache/schemas/metadata-schema.json +0 -83
  46. package/.proagents/cache/schemas/patterns-schema.json +0 -136
  47. package/.proagents/cache/schemas/structure-schema.json +0 -72
  48. package/.proagents/cache/structure.json +0 -109
  49. package/.proagents/checklists/README.md +0 -261
  50. package/.proagents/checklists/code-quality.md +0 -137
  51. package/.proagents/checklists/code-review.md +0 -148
  52. package/.proagents/checklists/pr-checklist.md +0 -78
  53. package/.proagents/checklists/pre-deployment.md +0 -132
  54. package/.proagents/checklists/pre-implementation.md +0 -80
  55. package/.proagents/checklists/testing.md +0 -120
  56. package/.proagents/checkpoints.json +0 -13
  57. package/.proagents/cicd/README.md +0 -338
  58. package/.proagents/cicd/azure-devops.md +0 -267
  59. package/.proagents/cicd/github-actions.md +0 -375
  60. package/.proagents/cicd/gitlab-ci.md +0 -278
  61. package/.proagents/cicd/jenkins.md +0 -317
  62. package/.proagents/collaboration/README.md +0 -143
  63. package/.proagents/collaboration/roles.md +0 -248
  64. package/.proagents/collaboration/sessions.md +0 -390
  65. package/.proagents/collaboration/sync.md +0 -358
  66. package/.proagents/cost/README.md +0 -48
  67. package/.proagents/cost/cost-template.md +0 -283
  68. package/.proagents/cost/estimation-framework.md +0 -287
  69. package/.proagents/database/README.md +0 -72
  70. package/.proagents/database/examples/001-create-users.sql +0 -129
  71. package/.proagents/database/examples/002-add-preferences.sql +0 -94
  72. package/.proagents/database/examples/003-add-index.sql +0 -105
  73. package/.proagents/database/examples/004-rename-column.sql +0 -122
  74. package/.proagents/database/examples/005-add-foreign-key.sql +0 -142
  75. package/.proagents/database/examples/006-data-migration.sql +0 -196
  76. package/.proagents/database/examples/007-drop-column.sql +0 -163
  77. package/.proagents/database/examples/README.md +0 -89
  78. package/.proagents/database/migration-workflow.md +0 -478
  79. package/.proagents/database/rollback-scripts.md +0 -487
  80. package/.proagents/database/safety-checks.md +0 -447
  81. package/.proagents/git/README.md +0 -68
  82. package/.proagents/git/branch-strategy.md +0 -164
  83. package/.proagents/git/commit-conventions.md +0 -241
  84. package/.proagents/git/pr-workflow.md +0 -286
  85. package/.proagents/git/rollback-procedures.md +0 -416
  86. package/.proagents/ide-integration/README.md +0 -124
  87. package/.proagents/ide-integration/cline-config.md +0 -429
  88. package/.proagents/ide-integration/continue-config.md +0 -380
  89. package/.proagents/ide-integration/cursor-rules.md +0 -280
  90. package/.proagents/ide-integration/github-copilot.md +0 -384
  91. package/.proagents/ide-integration/windsurf-rules.md +0 -314
  92. package/.proagents/integrations/README.md +0 -97
  93. package/.proagents/integrations/pm/README.md +0 -344
  94. package/.proagents/learning/README.md +0 -136
  95. package/.proagents/learning/adaptation.md +0 -305
  96. package/.proagents/learning/data-collection.md +0 -283
  97. package/.proagents/learning/implementation-guide.md +0 -865
  98. package/.proagents/learning/reports.md +0 -306
  99. package/.proagents/mcp/README.md +0 -133
  100. package/.proagents/mcp/context-providers.md +0 -442
  101. package/.proagents/mcp/server-config.md +0 -306
  102. package/.proagents/mcp/tools-definition.md +0 -513
  103. package/.proagents/pm-integration/README.md +0 -151
  104. package/.proagents/pm-integration/asana.md +0 -346
  105. package/.proagents/pm-integration/github-issues.md +0 -308
  106. package/.proagents/pm-integration/gitlab-issues.md +0 -482
  107. package/.proagents/pm-integration/jira.md +0 -364
  108. package/.proagents/pm-integration/linear.md +0 -409
  109. package/.proagents/pm-integration/notion.md +0 -275
  110. package/.proagents/pm-integration/sync-config.md +0 -533
  111. package/.proagents/pm-integration/trello.md +0 -159
  112. package/.proagents/rules/README.md +0 -179
  113. package/.proagents/rules/custom-rules-template.yaml +0 -286
  114. package/.proagents/rules/custom-rules.md +0 -754
  115. package/.proagents/rules/validation-rules-template.yaml +0 -517
  116. package/.proagents/runbooks/README.md +0 -219
  117. package/.proagents/runbooks/dependency-vulnerability.md +0 -505
  118. package/.proagents/runbooks/incident-response.md +0 -451
  119. package/.proagents/runbooks/performance-degradation.md +0 -584
  120. package/.proagents/runbooks/production-debugging.md +0 -489
  121. package/.proagents/sessions/README.md +0 -5
  122. package/.proagents/sprints/README.md +0 -58
  123. package/.proagents/team/README.md +0 -256
  124. package/.proagents/team/code-ownership.md +0 -306
  125. package/.proagents/team/communication-templates.md +0 -441
  126. package/.proagents/team/handoff-protocol.md +0 -380
  127. package/.proagents/team/ide-setup/README.md +0 -103
  128. package/.proagents/team/ide-setup/cursor.md +0 -276
  129. package/.proagents/team/ide-setup/jetbrains.md +0 -330
  130. package/.proagents/team/ide-setup/neovim.md +0 -640
  131. package/.proagents/team/ide-setup/vscode.md +0 -348
  132. package/.proagents/team/onboarding.md +0 -278
  133. package/.proagents/time-tracking.json +0 -19
  134. package/.proagents/troubleshooting/README.md +0 -730
  135. package/.proagents/troubleshooting/ai-issues.md +0 -601
  136. package/.proagents/troubleshooting/workflow-issues.md +0 -571
@@ -1,865 +0,0 @@
1
- # Learning System Implementation Guide
2
-
3
- Technical guide for implementing and customizing the ProAgents learning system.
4
-
5
- ---
6
-
7
- ## Architecture Overview
8
-
9
- ```
10
- ┌─────────────────────────────────────────────────────────────────┐
11
- │ Learning System Architecture │
12
- ├─────────────────────────────────────────────────────────────────┤
13
- │ │
14
- │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
15
- │ │ Events │───▶│ Collector │───▶│ Storage │ │
16
- │ └─────────────┘ └─────────────┘ └─────────────┘ │
17
- │ │ │ │
18
- │ │ │ │
19
- │ ▼ ▼ │
20
- │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
21
- │ │ Analysis │◀───│ Adapter │◀───│ Loader │ │
22
- │ └─────────────┘ └─────────────┘ └─────────────┘ │
23
- │ │ │
24
- │ │ │
25
- │ ▼ │
26
- │ ┌─────────────────────────────────────────────────────┐ │
27
- │ │ Applied to AI Interactions │ │
28
- │ └─────────────────────────────────────────────────────┘ │
29
- │ │
30
- └─────────────────────────────────────────────────────────────────┘
31
- ```
32
-
33
- ---
34
-
35
- ## Core Components
36
-
37
- ### 1. Event Collector
38
-
39
- Captures learning events from user interactions.
40
-
41
- ```typescript
42
- // learning/collector.ts
43
-
44
- interface LearningEvent {
45
- type: EventType;
46
- timestamp: string;
47
- sessionId: string;
48
- data: Record<string, unknown>;
49
- }
50
-
51
- type EventType =
52
- | 'checkpoint_skipped'
53
- | 'checkpoint_reviewed'
54
- | 'output_modified'
55
- | 'correction_made'
56
- | 'feature_completed'
57
- | 'phase_duration'
58
- | 'explicit_feedback';
59
-
60
- class LearningCollector {
61
- private events: LearningEvent[] = [];
62
- private sessionId: string;
63
- private flushInterval: NodeJS.Timer;
64
-
65
- constructor(sessionId: string) {
66
- this.sessionId = sessionId;
67
- // Flush events every 30 seconds
68
- this.flushInterval = setInterval(() => this.flush(), 30000);
69
- }
70
-
71
- track(type: EventType, data: Record<string, unknown>): void {
72
- this.events.push({
73
- type,
74
- timestamp: new Date().toISOString(),
75
- sessionId: this.sessionId,
76
- data,
77
- });
78
-
79
- // Flush if buffer is large
80
- if (this.events.length >= 50) {
81
- this.flush();
82
- }
83
- }
84
-
85
- async flush(): Promise<void> {
86
- if (this.events.length === 0) return;
87
-
88
- const eventsToFlush = [...this.events];
89
- this.events = [];
90
-
91
- await learningStorage.appendEvents(eventsToFlush);
92
- }
93
-
94
- destroy(): void {
95
- clearInterval(this.flushInterval);
96
- this.flush();
97
- }
98
- }
99
-
100
- // Singleton instance
101
- export const collector = new LearningCollector(generateSessionId());
102
- ```
103
-
104
- ### 2. Learning Storage
105
-
106
- Persists learned data to the file system.
107
-
108
- ```typescript
109
- // learning/storage.ts
110
-
111
- import * as fs from 'fs/promises';
112
- import * as path from 'path';
113
-
114
- interface StorageConfig {
115
- basePath: string;
116
- projectHash: string;
117
- }
118
-
119
- class LearningStorage {
120
- private basePath: string;
121
- private projectHash: string;
122
-
123
- constructor(config: StorageConfig) {
124
- this.basePath = config.basePath;
125
- this.projectHash = config.projectHash;
126
- }
127
-
128
- private get globalPath(): string {
129
- return path.join(this.basePath, '.learning', 'global');
130
- }
131
-
132
- private get projectPath(): string {
133
- return path.join(
134
- this.basePath,
135
- '.learning',
136
- 'projects',
137
- this.projectHash
138
- );
139
- }
140
-
141
- async initialize(): Promise<void> {
142
- await fs.mkdir(this.globalPath, { recursive: true });
143
- await fs.mkdir(this.projectPath, { recursive: true });
144
- }
145
-
146
- // Preferences (global)
147
- async loadPreferences(): Promise<UserPreferences> {
148
- const filePath = path.join(this.globalPath, 'preferences.json');
149
- try {
150
- const content = await fs.readFile(filePath, 'utf-8');
151
- return JSON.parse(content);
152
- } catch {
153
- return getDefaultPreferences();
154
- }
155
- }
156
-
157
- async savePreferences(prefs: UserPreferences): Promise<void> {
158
- const filePath = path.join(this.globalPath, 'preferences.json');
159
- await fs.writeFile(filePath, JSON.stringify(prefs, null, 2));
160
- }
161
-
162
- // Patterns (project-specific)
163
- async loadPatterns(): Promise<ProjectPatterns> {
164
- const filePath = path.join(this.projectPath, 'patterns.json');
165
- try {
166
- const content = await fs.readFile(filePath, 'utf-8');
167
- return JSON.parse(content);
168
- } catch {
169
- return getDefaultPatterns();
170
- }
171
- }
172
-
173
- async savePatterns(patterns: ProjectPatterns): Promise<void> {
174
- const filePath = path.join(this.projectPath, 'patterns.json');
175
- await fs.writeFile(filePath, JSON.stringify(patterns, null, 2));
176
- }
177
-
178
- // Corrections (project-specific)
179
- async loadCorrections(): Promise<Correction[]> {
180
- const filePath = path.join(this.projectPath, 'corrections.json');
181
- try {
182
- const content = await fs.readFile(filePath, 'utf-8');
183
- return JSON.parse(content);
184
- } catch {
185
- return [];
186
- }
187
- }
188
-
189
- async appendCorrection(correction: Correction): Promise<void> {
190
- const corrections = await this.loadCorrections();
191
- corrections.push(correction);
192
- const filePath = path.join(this.projectPath, 'corrections.json');
193
- await fs.writeFile(filePath, JSON.stringify(corrections, null, 2));
194
- }
195
-
196
- // Events (raw data for analysis)
197
- async appendEvents(events: LearningEvent[]): Promise<void> {
198
- const filePath = path.join(this.projectPath, 'events.jsonl');
199
- const lines = events.map((e) => JSON.stringify(e)).join('\n') + '\n';
200
- await fs.appendFile(filePath, lines);
201
- }
202
- }
203
-
204
- export const learningStorage = new LearningStorage({
205
- basePath: process.env.PROAGENTS_PATH || process.cwd(),
206
- projectHash: getProjectHash(),
207
- });
208
- ```
209
-
210
- ### 3. Pattern Analyzer
211
-
212
- Extracts patterns from collected events.
213
-
214
- ```typescript
215
- // learning/analyzer.ts
216
-
217
- interface PatternAnalysis {
218
- codePatterns: CodePattern[];
219
- checkpointPreferences: CheckpointPreference[];
220
- corrections: CorrectionPattern[];
221
- metrics: PhaseMetrics;
222
- }
223
-
224
- class PatternAnalyzer {
225
- async analyze(events: LearningEvent[]): Promise<PatternAnalysis> {
226
- return {
227
- codePatterns: this.extractCodePatterns(events),
228
- checkpointPreferences: this.extractCheckpointPreferences(events),
229
- corrections: this.extractCorrectionPatterns(events),
230
- metrics: this.calculateMetrics(events),
231
- };
232
- }
233
-
234
- private extractCodePatterns(events: LearningEvent[]): CodePattern[] {
235
- const patterns: CodePattern[] = [];
236
-
237
- // Group modifications by category
238
- const modifications = events
239
- .filter((e) => e.type === 'output_modified')
240
- .map((e) => e.data as OutputModification);
241
-
242
- // Naming convention patterns
243
- const namingChanges = modifications.filter((m) =>
244
- m.category === 'naming'
245
- );
246
- if (namingChanges.length >= 3) {
247
- const commonPattern = findCommonPattern(namingChanges);
248
- if (commonPattern) {
249
- patterns.push({
250
- type: 'naming',
251
- pattern: commonPattern,
252
- confidence: namingChanges.length / modifications.length,
253
- examples: namingChanges.slice(0, 3),
254
- });
255
- }
256
- }
257
-
258
- // Import ordering patterns
259
- const importChanges = modifications.filter((m) =>
260
- m.category === 'imports'
261
- );
262
- if (importChanges.length >= 3) {
263
- patterns.push({
264
- type: 'imports',
265
- pattern: extractImportOrder(importChanges),
266
- confidence: 0.8,
267
- examples: importChanges.slice(0, 3),
268
- });
269
- }
270
-
271
- return patterns;
272
- }
273
-
274
- private extractCheckpointPreferences(
275
- events: LearningEvent[]
276
- ): CheckpointPreference[] {
277
- const preferences: CheckpointPreference[] = [];
278
-
279
- const checkpointEvents = events.filter(
280
- (e) =>
281
- e.type === 'checkpoint_skipped' ||
282
- e.type === 'checkpoint_reviewed'
283
- );
284
-
285
- // Group by checkpoint name
286
- const grouped = groupBy(checkpointEvents, (e) =>
287
- e.data.checkpoint as string
288
- );
289
-
290
- for (const [checkpoint, events] of Object.entries(grouped)) {
291
- const skipped = events.filter(
292
- (e) => e.type === 'checkpoint_skipped'
293
- ).length;
294
- const reviewed = events.filter(
295
- (e) => e.type === 'checkpoint_reviewed'
296
- ).length;
297
- const total = skipped + reviewed;
298
-
299
- if (total >= 3) {
300
- preferences.push({
301
- checkpoint,
302
- skipRate: skipped / total,
303
- sampleSize: total,
304
- recommendation:
305
- skipped / total > 0.8
306
- ? 'auto_skip'
307
- : skipped / total < 0.2
308
- ? 'always_review'
309
- : 'ask',
310
- });
311
- }
312
- }
313
-
314
- return preferences;
315
- }
316
-
317
- private extractCorrectionPatterns(
318
- events: LearningEvent[]
319
- ): CorrectionPattern[] {
320
- const corrections = events
321
- .filter((e) => e.type === 'correction_made')
322
- .map((e) => e.data as Correction);
323
-
324
- // Group similar corrections
325
- const grouped = groupSimilarCorrections(corrections);
326
-
327
- return grouped
328
- .filter((g) => g.count >= 3) // Only patterns seen 3+ times
329
- .map((g) => ({
330
- originalPattern: g.pattern,
331
- correctedPattern: g.correction,
332
- count: g.count,
333
- autoApply: g.count >= 5, // Auto-apply after 5 occurrences
334
- }));
335
- }
336
-
337
- private calculateMetrics(events: LearningEvent[]): PhaseMetrics {
338
- const durations = events
339
- .filter((e) => e.type === 'phase_duration')
340
- .map((e) => e.data as PhaseDuration);
341
-
342
- const byPhase = groupBy(durations, (d) => d.phase);
343
- const metrics: PhaseMetrics = {};
344
-
345
- for (const [phase, phaseDurations] of Object.entries(byPhase)) {
346
- const times = phaseDurations.map((d) => d.durationMs);
347
- metrics[phase] = {
348
- average: average(times),
349
- median: median(times),
350
- min: Math.min(...times),
351
- max: Math.max(...times),
352
- sampleSize: times.length,
353
- };
354
- }
355
-
356
- return metrics;
357
- }
358
- }
359
-
360
- export const analyzer = new PatternAnalyzer();
361
- ```
362
-
363
- ### 4. Learning Adapter
364
-
365
- Applies learned patterns to AI interactions.
366
-
367
- ```typescript
368
- // learning/adapter.ts
369
-
370
- interface AdaptedContext {
371
- skipCheckpoints: string[];
372
- autoCorrections: CorrectionPattern[];
373
- suggestedPatterns: CodePattern[];
374
- projectInsights: string[];
375
- }
376
-
377
- class LearningAdapter {
378
- private storage: LearningStorage;
379
- private cachedContext: AdaptedContext | null = null;
380
-
381
- constructor(storage: LearningStorage) {
382
- this.storage = storage;
383
- }
384
-
385
- async getAdaptedContext(): Promise<AdaptedContext> {
386
- if (this.cachedContext) {
387
- return this.cachedContext;
388
- }
389
-
390
- const [preferences, patterns, corrections] = await Promise.all([
391
- this.storage.loadPreferences(),
392
- this.storage.loadPatterns(),
393
- this.storage.loadCorrections(),
394
- ]);
395
-
396
- this.cachedContext = {
397
- skipCheckpoints: this.determineSkipCheckpoints(preferences),
398
- autoCorrections: this.getAutoCorrections(corrections),
399
- suggestedPatterns: this.getSuggestedPatterns(patterns),
400
- projectInsights: this.generateInsights(patterns),
401
- };
402
-
403
- return this.cachedContext;
404
- }
405
-
406
- private determineSkipCheckpoints(prefs: UserPreferences): string[] {
407
- return Object.entries(prefs.checkpoints)
408
- .filter(([_, pref]) => pref.skipRate > 0.8 && pref.sampleSize >= 5)
409
- .map(([checkpoint]) => checkpoint);
410
- }
411
-
412
- private getAutoCorrections(corrections: Correction[]): CorrectionPattern[] {
413
- // Group similar corrections and return those with 5+ occurrences
414
- const grouped = groupSimilarCorrections(corrections);
415
- return grouped
416
- .filter((g) => g.count >= 5)
417
- .map((g) => ({
418
- originalPattern: g.pattern,
419
- correctedPattern: g.correction,
420
- count: g.count,
421
- autoApply: true,
422
- }));
423
- }
424
-
425
- private getSuggestedPatterns(patterns: ProjectPatterns): CodePattern[] {
426
- return patterns.codePatterns.filter((p) => p.confidence >= 0.8);
427
- }
428
-
429
- private generateInsights(patterns: ProjectPatterns): string[] {
430
- const insights: string[] = [];
431
-
432
- // Naming convention insight
433
- const namingPattern = patterns.codePatterns.find(
434
- (p) => p.type === 'naming'
435
- );
436
- if (namingPattern) {
437
- insights.push(
438
- `Use ${namingPattern.pattern} for ${namingPattern.appliesTo}`
439
- );
440
- }
441
-
442
- // State management insight
443
- if (patterns.stateManagement) {
444
- insights.push(
445
- `Use ${patterns.stateManagement} for state management`
446
- );
447
- }
448
-
449
- // API patterns
450
- if (patterns.apiPatterns) {
451
- insights.push(`Follow ${patterns.apiPatterns} for API calls`);
452
- }
453
-
454
- return insights;
455
- }
456
-
457
- invalidateCache(): void {
458
- this.cachedContext = null;
459
- }
460
- }
461
-
462
- export const adapter = new LearningAdapter(learningStorage);
463
- ```
464
-
465
- ---
466
-
467
- ## Integration Points
468
-
469
- ### 1. Checkpoint System Integration
470
-
471
- ```typescript
472
- // workflow/checkpoint.ts
473
-
474
- import { adapter } from '../learning/adapter';
475
-
476
- async function shouldShowCheckpoint(
477
- checkpointName: string
478
- ): Promise<boolean> {
479
- const context = await adapter.getAdaptedContext();
480
-
481
- // Skip if in auto-skip list
482
- if (context.skipCheckpoints.includes(checkpointName)) {
483
- console.log(`[Learning] Auto-skipping checkpoint: ${checkpointName}`);
484
- return false;
485
- }
486
-
487
- return true;
488
- }
489
-
490
- async function recordCheckpointDecision(
491
- checkpointName: string,
492
- skipped: boolean
493
- ): Promise<void> {
494
- collector.track(
495
- skipped ? 'checkpoint_skipped' : 'checkpoint_reviewed',
496
- { checkpoint: checkpointName }
497
- );
498
- }
499
- ```
500
-
501
- ### 2. Code Generation Integration
502
-
503
- ```typescript
504
- // workflow/codegen.ts
505
-
506
- import { adapter } from '../learning/adapter';
507
-
508
- async function generateCode(request: CodeRequest): Promise<string> {
509
- const context = await adapter.getAdaptedContext();
510
-
511
- // Build enhanced prompt with learned patterns
512
- const enhancedPrompt = buildPrompt(request, {
513
- patterns: context.suggestedPatterns,
514
- insights: context.projectInsights,
515
- });
516
-
517
- let code = await aiGenerate(enhancedPrompt);
518
-
519
- // Apply auto-corrections
520
- for (const correction of context.autoCorrections) {
521
- code = applyCorrection(code, correction);
522
- }
523
-
524
- return code;
525
- }
526
-
527
- function buildPrompt(
528
- request: CodeRequest,
529
- context: { patterns: CodePattern[]; insights: string[] }
530
- ): string {
531
- let prompt = request.basePrompt;
532
-
533
- if (context.patterns.length > 0) {
534
- prompt += '\n\nFollow these project patterns:\n';
535
- for (const pattern of context.patterns) {
536
- prompt += `- ${pattern.type}: ${pattern.pattern}\n`;
537
- }
538
- }
539
-
540
- if (context.insights.length > 0) {
541
- prompt += '\n\nProject conventions:\n';
542
- for (const insight of context.insights) {
543
- prompt += `- ${insight}\n`;
544
- }
545
- }
546
-
547
- return prompt;
548
- }
549
- ```
550
-
551
- ### 3. Output Modification Tracking
552
-
553
- ```typescript
554
- // workflow/review.ts
555
-
556
- import { collector } from '../learning/collector';
557
-
558
- function trackModification(
559
- original: string,
560
- modified: string,
561
- category: string
562
- ): void {
563
- if (original === modified) return;
564
-
565
- collector.track('output_modified', {
566
- category,
567
- original: original.slice(0, 200), // Truncate for privacy
568
- modified: modified.slice(0, 200),
569
- diff: generateDiff(original, modified),
570
- });
571
- }
572
-
573
- // Called when user edits AI-generated code
574
- function onCodeEdited(
575
- originalCode: string,
576
- editedCode: string,
577
- filePath: string
578
- ): void {
579
- const changes = detectChanges(originalCode, editedCode);
580
-
581
- for (const change of changes) {
582
- if (change.type === 'naming') {
583
- trackModification(change.original, change.modified, 'naming');
584
- } else if (change.type === 'formatting') {
585
- trackModification(change.original, change.modified, 'formatting');
586
- } else if (change.type === 'structure') {
587
- trackModification(change.original, change.modified, 'structure');
588
- }
589
- }
590
- }
591
- ```
592
-
593
- ---
594
-
595
- ## Data Schemas
596
-
597
- ### User Preferences Schema
598
-
599
- ```typescript
600
- interface UserPreferences {
601
- version: string;
602
- checkpoints: Record<
603
- string,
604
- {
605
- skipRate: number;
606
- sampleSize: number;
607
- lastUpdated: string;
608
- }
609
- >;
610
- detailLevel: 'minimal' | 'moderate' | 'detailed';
611
- commonCorrections: Array<{
612
- pattern: string;
613
- correction: string;
614
- count: number;
615
- }>;
616
- }
617
- ```
618
-
619
- ### Project Patterns Schema
620
-
621
- ```typescript
622
- interface ProjectPatterns {
623
- version: string;
624
- projectHash: string;
625
- analyzedAt: string;
626
-
627
- codePatterns: CodePattern[];
628
- stateManagement?: string;
629
- apiPatterns?: string;
630
- testingPatterns?: string;
631
-
632
- conventions: {
633
- naming: Record<string, string>;
634
- imports: string[];
635
- formatting: Record<string, unknown>;
636
- };
637
- }
638
-
639
- interface CodePattern {
640
- type: 'naming' | 'imports' | 'structure' | 'style';
641
- pattern: string;
642
- appliesTo?: string;
643
- confidence: number;
644
- examples: unknown[];
645
- learnedFrom: number; // Number of observations
646
- }
647
- ```
648
-
649
- ### Correction Schema
650
-
651
- ```typescript
652
- interface Correction {
653
- id: string;
654
- timestamp: string;
655
- type: 'naming' | 'code' | 'structure' | 'other';
656
- original: string;
657
- corrected: string;
658
- context?: string;
659
- autoApply: boolean;
660
- }
661
- ```
662
-
663
- ---
664
-
665
- ## CLI Commands
666
-
667
- ### Learning Management Commands
668
-
669
- ```typescript
670
- // cli/commands/learning.ts
671
-
672
- import { Command } from 'commander';
673
- import { learningStorage, analyzer, adapter } from '../learning';
674
-
675
- export const learningCommand = new Command('learning')
676
- .description('Manage learning system');
677
-
678
- learningCommand
679
- .command('report')
680
- .description('Show learning report')
681
- .action(async () => {
682
- const [prefs, patterns, corrections] = await Promise.all([
683
- learningStorage.loadPreferences(),
684
- learningStorage.loadPatterns(),
685
- learningStorage.loadCorrections(),
686
- ]);
687
-
688
- console.log('ProAgents Learning Report');
689
- console.log('='.repeat(40));
690
- console.log(`Patterns Learned: ${patterns.codePatterns.length}`);
691
- console.log(`Auto-corrections: ${corrections.filter(c => c.autoApply).length}`);
692
- console.log(`Checkpoint preferences: ${Object.keys(prefs.checkpoints).length}`);
693
- console.log();
694
-
695
- if (patterns.codePatterns.length > 0) {
696
- console.log('Top Patterns:');
697
- for (const p of patterns.codePatterns.slice(0, 5)) {
698
- console.log(` - ${p.type}: ${p.pattern}`);
699
- }
700
- }
701
- });
702
-
703
- learningCommand
704
- .command('reset')
705
- .description('Reset learning data')
706
- .option('--preferences', 'Reset only preferences')
707
- .option('--patterns', 'Reset only patterns')
708
- .option('--all', 'Reset everything')
709
- .action(async (options) => {
710
- if (options.all) {
711
- await learningStorage.reset();
712
- console.log('All learning data reset.');
713
- } else if (options.preferences) {
714
- await learningStorage.resetPreferences();
715
- console.log('Preferences reset.');
716
- } else if (options.patterns) {
717
- await learningStorage.resetPatterns();
718
- console.log('Patterns reset.');
719
- }
720
- adapter.invalidateCache();
721
- });
722
-
723
- learningCommand
724
- .command('export')
725
- .description('Export learning data')
726
- .argument('<path>', 'Export path')
727
- .action(async (exportPath) => {
728
- const data = await learningStorage.exportAll();
729
- await fs.writeFile(exportPath, JSON.stringify(data, null, 2));
730
- console.log(`Exported to ${exportPath}`);
731
- });
732
- ```
733
-
734
- ---
735
-
736
- ## Configuration Options
737
-
738
- ```yaml
739
- # proagents.config.yaml
740
-
741
- learning:
742
- # Enable/disable learning
743
- enabled: true
744
-
745
- # What to track
746
- tracking:
747
- preferences: true
748
- patterns: true
749
- corrections: true
750
- metrics: true
751
-
752
- # Auto-apply settings
753
- auto_apply:
754
- corrections: true
755
- corrections_threshold: 5 # Apply after this many occurrences
756
- checkpoint_skip: true
757
- checkpoint_skip_threshold: 0.8 # Skip if >80% skip rate
758
-
759
- # Privacy settings
760
- privacy:
761
- truncate_code_samples: true
762
- max_sample_length: 200
763
- exclude_paths:
764
- - "**/.env*"
765
- - "**/secrets/**"
766
-
767
- # Storage settings
768
- storage:
769
- max_events_file_size_mb: 10
770
- archive_after_days: 30
771
- retention_days: 90
772
- ```
773
-
774
- ---
775
-
776
- ## Testing the Learning System
777
-
778
- ```typescript
779
- // learning/__tests__/analyzer.test.ts
780
-
781
- describe('PatternAnalyzer', () => {
782
- it('extracts naming patterns from modifications', async () => {
783
- const events: LearningEvent[] = [
784
- { type: 'output_modified', data: { category: 'naming', original: 'getData', modified: 'fetchUserData' } },
785
- { type: 'output_modified', data: { category: 'naming', original: 'handleClick', modified: 'handleUserClick' } },
786
- { type: 'output_modified', data: { category: 'naming', original: 'process', modified: 'processUserInput' } },
787
- ];
788
-
789
- const analysis = await analyzer.analyze(events);
790
-
791
- expect(analysis.codePatterns).toContainEqual(
792
- expect.objectContaining({
793
- type: 'naming',
794
- pattern: expect.stringContaining('descriptive'),
795
- })
796
- );
797
- });
798
-
799
- it('identifies checkpoint preferences', async () => {
800
- const events: LearningEvent[] = [
801
- { type: 'checkpoint_skipped', data: { checkpoint: 'after_requirements' } },
802
- { type: 'checkpoint_skipped', data: { checkpoint: 'after_requirements' } },
803
- { type: 'checkpoint_skipped', data: { checkpoint: 'after_requirements' } },
804
- { type: 'checkpoint_reviewed', data: { checkpoint: 'after_design' } },
805
- { type: 'checkpoint_reviewed', data: { checkpoint: 'after_design' } },
806
- { type: 'checkpoint_reviewed', data: { checkpoint: 'after_design' } },
807
- ];
808
-
809
- const analysis = await analyzer.analyze(events);
810
-
811
- expect(analysis.checkpointPreferences).toContainEqual(
812
- expect.objectContaining({
813
- checkpoint: 'after_requirements',
814
- recommendation: 'auto_skip',
815
- })
816
- );
817
- });
818
- });
819
- ```
820
-
821
- ---
822
-
823
- ## Extending the Learning System
824
-
825
- ### Adding Custom Learners
826
-
827
- ```typescript
828
- // learning/custom/myLearner.ts
829
-
830
- import { BaseLearner } from '../base';
831
-
832
- export class CustomApiPatternLearner extends BaseLearner {
833
- name = 'api-patterns';
834
-
835
- async learn(events: LearningEvent[]): Promise<Pattern[]> {
836
- // Filter relevant events
837
- const apiEvents = events.filter((e) =>
838
- e.data.filePath?.includes('/api/') ||
839
- e.data.filePath?.includes('/services/')
840
- );
841
-
842
- // Extract patterns
843
- return this.extractPatterns(apiEvents);
844
- }
845
-
846
- async apply(code: string, patterns: Pattern[]): Promise<string> {
847
- // Apply learned API patterns
848
- return this.applyPatterns(code, patterns);
849
- }
850
- }
851
-
852
- // Register learner
853
- learningSystem.registerLearner(new CustomApiPatternLearner());
854
- ```
855
-
856
- ---
857
-
858
- ## Best Practices
859
-
860
- 1. **Privacy First**: Never store sensitive data (credentials, personal info)
861
- 2. **Confidence Thresholds**: Only apply patterns with high confidence (>0.8)
862
- 3. **Sample Size Requirements**: Require minimum observations (3-5) before learning
863
- 4. **User Override**: Always allow users to override learned behavior
864
- 5. **Transparency**: Show users what has been learned via reports
865
- 6. **Graceful Degradation**: System works without learning data