agentic-qe 3.5.0 → 3.5.2
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/.claude/agents/n8n/n8n-base-agent.md +3 -3
- package/.claude/agents/n8n/n8n-bdd-scenario-tester.md +2 -2
- package/.claude/agents/n8n/n8n-chaos-tester.md +2 -2
- package/.claude/agents/n8n/n8n-ci-orchestrator.md +2 -2
- package/.claude/agents/n8n/n8n-compliance-validator.md +2 -2
- package/.claude/agents/n8n/n8n-expression-validator.md +2 -2
- package/.claude/agents/n8n/n8n-integration-test.md +2 -2
- package/.claude/agents/n8n/n8n-monitoring-validator.md +2 -2
- package/.claude/agents/n8n/n8n-node-validator.md +2 -2
- package/.claude/agents/n8n/n8n-performance-tester.md +2 -2
- package/.claude/agents/n8n/n8n-security-auditor.md +2 -2
- package/.claude/agents/n8n/n8n-trigger-test.md +2 -2
- package/.claude/agents/n8n/n8n-unit-tester.md +2 -2
- package/.claude/agents/n8n/n8n-version-comparator.md +2 -2
- package/.claude/agents/n8n/n8n-workflow-executor.md +2 -2
- package/.claude/agents/subagents/qe-code-reviewer.md +2 -2
- package/.claude/agents/subagents/qe-coverage-gap-analyzer.md +2 -2
- package/.claude/agents/subagents/qe-data-generator.md +2 -2
- package/.claude/agents/subagents/qe-flaky-investigator.md +2 -2
- package/.claude/agents/subagents/qe-integration-tester.md +2 -2
- package/.claude/agents/subagents/qe-performance-validator.md +2 -2
- package/.claude/agents/subagents/qe-security-auditor.md +2 -2
- package/.claude/agents/subagents/qe-test-data-architect-sub.md +2 -2
- package/.claude/agents/subagents/qe-test-implementer.md +2 -2
- package/.claude/agents/subagents/qe-test-refactorer.md +2 -2
- package/.claude/agents/subagents/qe-test-writer.md +2 -2
- package/.claude/agents/v3/qe-accessibility-auditor.md +3 -3
- package/.claude/agents/v3/qe-bdd-generator.md +4 -4
- package/.claude/agents/v3/qe-chaos-engineer.md +3 -3
- package/.claude/agents/v3/qe-code-complexity.md +3 -3
- package/.claude/agents/v3/qe-code-intelligence.md +3 -3
- package/.claude/agents/v3/qe-contract-validator.md +3 -3
- package/.claude/agents/v3/qe-coverage-specialist.md +4 -4
- package/.claude/agents/v3/qe-defect-predictor.md +4 -4
- package/.claude/agents/v3/qe-dependency-mapper.md +3 -3
- package/.claude/agents/v3/qe-deployment-advisor.md +3 -3
- package/.claude/agents/v3/qe-flaky-hunter.md +3 -3
- package/.claude/agents/v3/qe-fleet-commander.md +3 -3
- package/.claude/agents/v3/qe-gap-detector.md +4 -4
- package/.claude/agents/v3/qe-graphql-tester.md +3 -3
- package/.claude/agents/v3/qe-impact-analyzer.md +3 -3
- package/.claude/agents/v3/qe-integration-architect.md +2 -2
- package/.claude/agents/v3/qe-integration-tester.md +3 -3
- package/.claude/agents/v3/qe-kg-builder.md +3 -3
- package/.claude/agents/v3/qe-learning-coordinator.md +24 -15
- package/.claude/agents/v3/qe-load-tester.md +3 -3
- package/.claude/agents/v3/qe-metrics-optimizer.md +3 -3
- package/.claude/agents/v3/qe-mutation-tester.md +3 -3
- package/.claude/agents/v3/qe-parallel-executor.md +4 -4
- package/.claude/agents/v3/qe-pattern-learner.md +16 -12
- package/.claude/agents/v3/qe-performance-tester.md +3 -3
- package/.claude/agents/v3/qe-product-factors-assessor.md +4 -4
- package/.claude/agents/v3/qe-property-tester.md +3 -3
- package/.claude/agents/v3/qe-quality-criteria-recommender.md +4 -4
- package/.claude/agents/v3/qe-quality-gate.md +4 -4
- package/.claude/agents/v3/qe-qx-partner.md +3 -3
- package/.claude/agents/v3/qe-regression-analyzer.md +3 -3
- package/.claude/agents/v3/qe-requirements-validator.md +4 -4
- package/.claude/agents/v3/qe-responsive-tester.md +3 -3
- package/.claude/agents/v3/qe-retry-handler.md +3 -3
- package/.claude/agents/v3/qe-risk-assessor.md +4 -4
- package/.claude/agents/v3/qe-root-cause-analyzer.md +3 -3
- package/.claude/agents/v3/qe-security-auditor.md +3 -3
- package/.claude/agents/v3/qe-security-scanner.md +3 -3
- package/.claude/agents/v3/qe-tdd-specialist.md +4 -4
- package/.claude/agents/v3/qe-test-architect.md +4 -4
- package/.claude/agents/v3/qe-test-idea-rewriter.md +3 -3
- package/.claude/agents/v3/qe-transfer-specialist.md +3 -3
- package/.claude/agents/v3/qe-visual-tester.md +3 -3
- package/.claude/agents/v3/reasoningbank-learner.md +4 -4
- package/.claude/agents/v3/subagents/qe-code-reviewer.md +3 -3
- package/.claude/agents/v3/subagents/qe-integration-reviewer.md +3 -3
- package/.claude/agents/v3/subagents/qe-performance-reviewer.md +3 -3
- package/.claude/agents/v3/subagents/qe-security-reviewer.md +3 -3
- package/.claude/agents/v3/subagents/qe-tdd-green.md +3 -3
- package/.claude/agents/v3/subagents/qe-tdd-red.md +3 -3
- package/.claude/agents/v3/subagents/qe-tdd-refactor.md +3 -3
- package/.claude/helpers/daemon-manager.sh +10 -10
- package/.claude/helpers/github-safe.js +10 -10
- package/.claude/helpers/statusline-v3.cjs +9 -3
- package/.claude/helpers/statusline.cjs +891 -59
- package/.claude/skills/agentic-quality-engineering/SKILL.md +6 -6
- package/.claude/skills/qcsd-cicd-swarm/SKILL.md +14 -14
- package/.claude/skills/qcsd-development-swarm/SKILL.md +14 -14
- package/.claude/skills/qcsd-ideation-swarm/SKILL.md +21 -21
- package/.claude/skills/qcsd-refinement-swarm/SKILL.md +22 -22
- package/.claude/skills/qe-iterative-loop/SKILL.md +4 -4
- package/.claude/skills/skills-manifest.json +17 -9
- package/.claude/skills/verification-quality/SKILL.md +0 -6
- package/CHANGELOG.md +52 -0
- package/README.md +22 -10
- package/package.json +5 -3
- package/v3/CHANGELOG.md +51 -3
- package/v3/README.md +9 -9
- package/v3/assets/agents/v3/qe-accessibility-auditor.md +12 -8
- package/v3/assets/agents/v3/qe-bdd-generator.md +13 -9
- package/v3/assets/agents/v3/qe-chaos-engineer.md +12 -8
- package/v3/assets/agents/v3/qe-code-complexity.md +12 -8
- package/v3/assets/agents/v3/qe-code-intelligence.md +12 -8
- package/v3/assets/agents/v3/qe-contract-validator.md +12 -8
- package/v3/assets/agents/v3/qe-coverage-specialist.md +13 -9
- package/v3/assets/agents/v3/qe-defect-predictor.md +13 -9
- package/v3/assets/agents/v3/qe-dependency-mapper.md +12 -8
- package/v3/assets/agents/v3/qe-deployment-advisor.md +12 -8
- package/v3/assets/agents/v3/qe-flaky-hunter.md +12 -8
- package/v3/assets/agents/v3/qe-fleet-commander.md +12 -8
- package/v3/assets/agents/v3/qe-gap-detector.md +13 -9
- package/v3/assets/agents/v3/qe-graphql-tester.md +12 -8
- package/v3/assets/agents/v3/qe-impact-analyzer.md +12 -8
- package/v3/assets/agents/v3/qe-integration-architect.md +2 -2
- package/v3/assets/agents/v3/qe-integration-tester.md +3 -3
- package/v3/assets/agents/v3/qe-kg-builder.md +12 -8
- package/v3/assets/agents/v3/qe-learning-coordinator.md +24 -15
- package/v3/assets/agents/v3/qe-load-tester.md +12 -8
- package/v3/assets/agents/v3/qe-metrics-optimizer.md +12 -8
- package/v3/assets/agents/v3/qe-mutation-tester.md +12 -8
- package/v3/assets/agents/v3/qe-parallel-executor.md +4 -4
- package/v3/assets/agents/v3/qe-pattern-learner.md +16 -12
- package/v3/assets/agents/v3/qe-performance-tester.md +12 -8
- package/v3/assets/agents/v3/qe-product-factors-assessor.md +4 -4
- package/v3/assets/agents/v3/qe-property-tester.md +12 -8
- package/v3/assets/agents/v3/qe-quality-criteria-recommender.md +4 -4
- package/v3/assets/agents/v3/qe-quality-gate.md +4 -4
- package/v3/assets/agents/v3/qe-qx-partner.md +12 -8
- package/v3/assets/agents/v3/qe-regression-analyzer.md +12 -8
- package/v3/assets/agents/v3/qe-requirements-validator.md +13 -9
- package/v3/assets/agents/v3/qe-responsive-tester.md +12 -8
- package/v3/assets/agents/v3/qe-retry-handler.md +12 -8
- package/v3/assets/agents/v3/qe-risk-assessor.md +13 -9
- package/v3/assets/agents/v3/qe-root-cause-analyzer.md +12 -8
- package/v3/assets/agents/v3/qe-security-auditor.md +12 -8
- package/v3/assets/agents/v3/qe-security-scanner.md +12 -8
- package/v3/assets/agents/v3/qe-tdd-specialist.md +4 -4
- package/v3/assets/agents/v3/qe-test-architect.md +13 -9
- package/v3/assets/agents/v3/qe-test-idea-rewriter.md +3 -3
- package/v3/assets/agents/v3/qe-transfer-specialist.md +12 -8
- package/v3/assets/agents/v3/qe-visual-tester.md +3 -3
- package/v3/assets/agents/v3/subagents/qe-code-reviewer.md +12 -8
- package/v3/assets/agents/v3/subagents/qe-integration-reviewer.md +12 -8
- package/v3/assets/agents/v3/subagents/qe-performance-reviewer.md +12 -8
- package/v3/assets/agents/v3/subagents/qe-security-reviewer.md +12 -8
- package/v3/assets/agents/v3/subagents/qe-tdd-green.md +12 -8
- package/v3/assets/agents/v3/subagents/qe-tdd-red.md +12 -8
- package/v3/assets/agents/v3/subagents/qe-tdd-refactor.md +12 -8
- package/v3/assets/skills/agentic-quality-engineering/SKILL.md +6 -6
- package/v3/assets/skills/qcsd-ideation-swarm/SKILL.md +21 -21
- package/v3/assets/skills/qe-iterative-loop/SKILL.md +4 -4
- package/v3/dist/cli/bundle.js +2508 -816
- package/v3/dist/cli/commands/hooks.d.ts.map +1 -1
- package/v3/dist/cli/commands/hooks.js +34 -21
- package/v3/dist/cli/commands/hooks.js.map +1 -1
- package/v3/dist/cli/commands/learning.d.ts +23 -0
- package/v3/dist/cli/commands/learning.d.ts.map +1 -0
- package/v3/dist/cli/commands/learning.js +1448 -0
- package/v3/dist/cli/commands/learning.js.map +1 -0
- package/v3/dist/cli/index.js +2 -0
- package/v3/dist/cli/index.js.map +1 -1
- package/v3/dist/init/init-wizard.d.ts +2 -1
- package/v3/dist/init/init-wizard.d.ts.map +1 -1
- package/v3/dist/init/init-wizard.js +25 -23
- package/v3/dist/init/init-wizard.js.map +1 -1
- package/v3/dist/init/phases/07-hooks.d.ts +3 -0
- package/v3/dist/init/phases/07-hooks.d.ts.map +1 -1
- package/v3/dist/init/phases/07-hooks.js +12 -9
- package/v3/dist/init/phases/07-hooks.js.map +1 -1
- package/v3/dist/kernel/unified-memory.d.ts +8 -3
- package/v3/dist/kernel/unified-memory.d.ts.map +1 -1
- package/v3/dist/kernel/unified-memory.js +39 -9
- package/v3/dist/kernel/unified-memory.js.map +1 -1
- package/v3/dist/learning/aqe-learning-engine.d.ts +26 -0
- package/v3/dist/learning/aqe-learning-engine.d.ts.map +1 -1
- package/v3/dist/learning/aqe-learning-engine.js +116 -2
- package/v3/dist/learning/aqe-learning-engine.js.map +1 -1
- package/v3/dist/learning/index.d.ts +4 -0
- package/v3/dist/learning/index.d.ts.map +1 -1
- package/v3/dist/learning/index.js +8 -0
- package/v3/dist/learning/index.js.map +1 -1
- package/v3/dist/learning/metrics-tracker.d.ts +133 -0
- package/v3/dist/learning/metrics-tracker.d.ts.map +1 -0
- package/v3/dist/learning/metrics-tracker.js +396 -0
- package/v3/dist/learning/metrics-tracker.js.map +1 -0
- package/v3/dist/learning/pattern-lifecycle.d.ts +203 -0
- package/v3/dist/learning/pattern-lifecycle.d.ts.map +1 -0
- package/v3/dist/learning/pattern-lifecycle.js +614 -0
- package/v3/dist/learning/pattern-lifecycle.js.map +1 -0
- package/v3/dist/learning/sqlite-persistence.d.ts +30 -0
- package/v3/dist/learning/sqlite-persistence.d.ts.map +1 -1
- package/v3/dist/learning/sqlite-persistence.js +137 -0
- package/v3/dist/learning/sqlite-persistence.js.map +1 -1
- package/v3/dist/mcp/bundle.js +104568 -102038
- package/v3/dist/mcp/handlers/handler-factory.d.ts +5 -0
- package/v3/dist/mcp/handlers/handler-factory.d.ts.map +1 -1
- package/v3/dist/mcp/handlers/handler-factory.js +84 -0
- package/v3/dist/mcp/handlers/handler-factory.js.map +1 -1
- package/v3/dist/mcp/services/task-router.d.ts +32 -0
- package/v3/dist/mcp/services/task-router.d.ts.map +1 -1
- package/v3/dist/mcp/services/task-router.js +28 -0
- package/v3/dist/mcp/services/task-router.js.map +1 -1
- package/v3/dist/workers/workers/learning-consolidation.d.ts +29 -0
- package/v3/dist/workers/workers/learning-consolidation.d.ts.map +1 -1
- package/v3/dist/workers/workers/learning-consolidation.js +294 -3
- package/v3/dist/workers/workers/learning-consolidation.js.map +1 -1
- package/v3/package.json +3 -2
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Learning Metrics Tracker
|
|
3
|
+
* Phase 6: Learning Metrics & Dashboard (Learning Improvement Plan)
|
|
4
|
+
*
|
|
5
|
+
* Tracks learning improvement over time with metrics collection and analysis.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Pattern creation and reuse tracking
|
|
9
|
+
* - Reward improvement analysis
|
|
10
|
+
* - Domain coverage metrics
|
|
11
|
+
* - Daily snapshots for trend analysis
|
|
12
|
+
* - Dashboard data generation
|
|
13
|
+
*/
|
|
14
|
+
import Database from 'better-sqlite3';
|
|
15
|
+
import path from 'node:path';
|
|
16
|
+
import { existsSync } from 'node:fs';
|
|
17
|
+
import { QE_DOMAIN_LIST } from './qe-patterns.js';
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// Learning Metrics Tracker
|
|
20
|
+
// ============================================================================
|
|
21
|
+
/**
|
|
22
|
+
* Learning Metrics Tracker
|
|
23
|
+
*
|
|
24
|
+
* Collects and analyzes learning system metrics for dashboard display.
|
|
25
|
+
*/
|
|
26
|
+
export class LearningMetricsTracker {
|
|
27
|
+
db = null;
|
|
28
|
+
dbPath;
|
|
29
|
+
initialized = false;
|
|
30
|
+
constructor(projectRoot = process.cwd()) {
|
|
31
|
+
this.dbPath = path.join(projectRoot, '.agentic-qe', 'memory.db');
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Initialize the tracker (open database, ensure tables exist)
|
|
35
|
+
*/
|
|
36
|
+
async initialize() {
|
|
37
|
+
if (this.initialized)
|
|
38
|
+
return;
|
|
39
|
+
if (!existsSync(this.dbPath)) {
|
|
40
|
+
throw new Error(`Database not found: ${this.dbPath}. Run "aqe init --auto" first.`);
|
|
41
|
+
}
|
|
42
|
+
this.db = new Database(this.dbPath, { readonly: false });
|
|
43
|
+
// Ensure learning_metrics table exists for snapshots
|
|
44
|
+
this.ensureMetricsTable();
|
|
45
|
+
this.initialized = true;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Ensure the learning_daily_snapshots table exists
|
|
49
|
+
*/
|
|
50
|
+
ensureMetricsTable() {
|
|
51
|
+
if (!this.db)
|
|
52
|
+
return;
|
|
53
|
+
this.db.exec(`
|
|
54
|
+
CREATE TABLE IF NOT EXISTS learning_daily_snapshots (
|
|
55
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
56
|
+
snapshot_date TEXT NOT NULL UNIQUE,
|
|
57
|
+
total_patterns INTEGER DEFAULT 0,
|
|
58
|
+
patterns_created_today INTEGER DEFAULT 0,
|
|
59
|
+
total_experiences INTEGER DEFAULT 0,
|
|
60
|
+
experiences_today INTEGER DEFAULT 0,
|
|
61
|
+
total_q_values INTEGER DEFAULT 0,
|
|
62
|
+
avg_reward REAL DEFAULT 0.0,
|
|
63
|
+
avg_confidence REAL DEFAULT 0.0,
|
|
64
|
+
avg_quality_score REAL DEFAULT 0.0,
|
|
65
|
+
success_rate REAL DEFAULT 0.0,
|
|
66
|
+
pattern_reuse_count INTEGER DEFAULT 0,
|
|
67
|
+
short_term_patterns INTEGER DEFAULT 0,
|
|
68
|
+
long_term_patterns INTEGER DEFAULT 0,
|
|
69
|
+
domain_coverage_json TEXT,
|
|
70
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
71
|
+
);
|
|
72
|
+
CREATE INDEX IF NOT EXISTS idx_learning_daily_snapshots_date ON learning_daily_snapshots(snapshot_date DESC);
|
|
73
|
+
`);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get current learning metrics
|
|
77
|
+
*/
|
|
78
|
+
async getCurrentMetrics() {
|
|
79
|
+
if (!this.initialized)
|
|
80
|
+
await this.initialize();
|
|
81
|
+
if (!this.db)
|
|
82
|
+
throw new Error('Database not initialized');
|
|
83
|
+
const today = new Date().toISOString().split('T')[0];
|
|
84
|
+
const oneWeekAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString().split('T')[0];
|
|
85
|
+
// Pattern metrics
|
|
86
|
+
const patternStats = this.getPatternStats(today);
|
|
87
|
+
// Experience metrics (from learning_experiences if exists, or qe_pattern_usage)
|
|
88
|
+
const experienceStats = this.getExperienceStats(today);
|
|
89
|
+
// Q-value metrics
|
|
90
|
+
const qValueStats = this.getQValueStats();
|
|
91
|
+
// Domain coverage
|
|
92
|
+
const domainCoverage = this.getDomainCoverage();
|
|
93
|
+
// Get last week's avg reward for delta calculation
|
|
94
|
+
const lastWeekReward = this.getHistoricalAvgReward(oneWeekAgo);
|
|
95
|
+
return {
|
|
96
|
+
timestamp: new Date(),
|
|
97
|
+
totalPatterns: patternStats.total,
|
|
98
|
+
patternsCreatedToday: patternStats.createdToday,
|
|
99
|
+
totalExperiences: experienceStats.total,
|
|
100
|
+
experiencesToday: experienceStats.recordedToday,
|
|
101
|
+
totalQValues: qValueStats.total,
|
|
102
|
+
avgReward: experienceStats.avgReward,
|
|
103
|
+
avgRewardDelta: experienceStats.avgReward - lastWeekReward,
|
|
104
|
+
domainCoverage,
|
|
105
|
+
patternReuseCount: patternStats.reuseCount,
|
|
106
|
+
shortTermPatterns: patternStats.shortTerm,
|
|
107
|
+
longTermPatterns: patternStats.longTerm,
|
|
108
|
+
avgConfidence: patternStats.avgConfidence,
|
|
109
|
+
avgQualityScore: patternStats.avgQualityScore,
|
|
110
|
+
successRate: experienceStats.successRate,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get pattern statistics
|
|
115
|
+
*/
|
|
116
|
+
getPatternStats(today) {
|
|
117
|
+
if (!this.db) {
|
|
118
|
+
return {
|
|
119
|
+
total: 0,
|
|
120
|
+
createdToday: 0,
|
|
121
|
+
shortTerm: 0,
|
|
122
|
+
longTerm: 0,
|
|
123
|
+
avgConfidence: 0,
|
|
124
|
+
avgQualityScore: 0,
|
|
125
|
+
reuseCount: 0,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
// Check if qe_patterns table exists
|
|
129
|
+
const tableExists = this.db.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name='qe_patterns'`).get();
|
|
130
|
+
if (!tableExists) {
|
|
131
|
+
return {
|
|
132
|
+
total: 0,
|
|
133
|
+
createdToday: 0,
|
|
134
|
+
shortTerm: 0,
|
|
135
|
+
longTerm: 0,
|
|
136
|
+
avgConfidence: 0,
|
|
137
|
+
avgQualityScore: 0,
|
|
138
|
+
reuseCount: 0,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
const stats = this.db.prepare(`
|
|
142
|
+
SELECT
|
|
143
|
+
COUNT(*) as total,
|
|
144
|
+
SUM(CASE WHEN date(created_at) = ? THEN 1 ELSE 0 END) as created_today,
|
|
145
|
+
SUM(CASE WHEN tier = 'short-term' THEN 1 ELSE 0 END) as short_term,
|
|
146
|
+
SUM(CASE WHEN tier = 'long-term' THEN 1 ELSE 0 END) as long_term,
|
|
147
|
+
AVG(confidence) as avg_confidence,
|
|
148
|
+
AVG(quality_score) as avg_quality_score,
|
|
149
|
+
SUM(usage_count) as total_usage
|
|
150
|
+
FROM qe_patterns
|
|
151
|
+
`).get(today);
|
|
152
|
+
return {
|
|
153
|
+
total: stats.total || 0,
|
|
154
|
+
createdToday: stats.created_today || 0,
|
|
155
|
+
shortTerm: stats.short_term || 0,
|
|
156
|
+
longTerm: stats.long_term || 0,
|
|
157
|
+
avgConfidence: stats.avg_confidence || 0,
|
|
158
|
+
avgQualityScore: stats.avg_quality_score || 0,
|
|
159
|
+
reuseCount: stats.total_usage || 0,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get experience statistics
|
|
164
|
+
*/
|
|
165
|
+
getExperienceStats(today) {
|
|
166
|
+
if (!this.db) {
|
|
167
|
+
return { total: 0, recordedToday: 0, avgReward: 0, successRate: 0 };
|
|
168
|
+
}
|
|
169
|
+
// Try learning_experiences table first (v2 compatible)
|
|
170
|
+
const learningTableExists = this.db.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name='learning_experiences'`).get();
|
|
171
|
+
if (learningTableExists) {
|
|
172
|
+
const stats = this.db.prepare(`
|
|
173
|
+
SELECT
|
|
174
|
+
COUNT(*) as total,
|
|
175
|
+
SUM(CASE WHEN date(datetime(created_at, 'unixepoch')) = ? THEN 1 ELSE 0 END) as recorded_today,
|
|
176
|
+
AVG(reward) as avg_reward,
|
|
177
|
+
AVG(CASE WHEN reward >= 0.5 THEN 1.0 ELSE 0.0 END) as success_rate
|
|
178
|
+
FROM learning_experiences
|
|
179
|
+
`).get(today);
|
|
180
|
+
return {
|
|
181
|
+
total: stats.total || 0,
|
|
182
|
+
recordedToday: stats.recorded_today || 0,
|
|
183
|
+
avgReward: stats.avg_reward || 0,
|
|
184
|
+
successRate: stats.success_rate || 0,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
// Fall back to qe_pattern_usage table
|
|
188
|
+
const usageTableExists = this.db.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name='qe_pattern_usage'`).get();
|
|
189
|
+
if (usageTableExists) {
|
|
190
|
+
const stats = this.db.prepare(`
|
|
191
|
+
SELECT
|
|
192
|
+
COUNT(*) as total,
|
|
193
|
+
SUM(CASE WHEN date(created_at) = ? THEN 1 ELSE 0 END) as recorded_today,
|
|
194
|
+
AVG(success) as success_rate
|
|
195
|
+
FROM qe_pattern_usage
|
|
196
|
+
`).get(today);
|
|
197
|
+
return {
|
|
198
|
+
total: stats.total || 0,
|
|
199
|
+
recordedToday: stats.recorded_today || 0,
|
|
200
|
+
avgReward: stats.success_rate || 0, // Use success as reward proxy
|
|
201
|
+
successRate: stats.success_rate || 0,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
return { total: 0, recordedToday: 0, avgReward: 0, successRate: 0 };
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Get Q-value statistics
|
|
208
|
+
*/
|
|
209
|
+
getQValueStats() {
|
|
210
|
+
if (!this.db)
|
|
211
|
+
return { total: 0 };
|
|
212
|
+
const tableExists = this.db.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name='rl_q_values'`).get();
|
|
213
|
+
if (!tableExists)
|
|
214
|
+
return { total: 0 };
|
|
215
|
+
const stats = this.db.prepare(`
|
|
216
|
+
SELECT COUNT(*) as total FROM rl_q_values
|
|
217
|
+
`).get();
|
|
218
|
+
return { total: stats.total || 0 };
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Get domain coverage (patterns per domain)
|
|
222
|
+
*/
|
|
223
|
+
getDomainCoverage() {
|
|
224
|
+
const coverage = {};
|
|
225
|
+
// Initialize all domains to 0
|
|
226
|
+
for (const domain of QE_DOMAIN_LIST) {
|
|
227
|
+
coverage[domain] = 0;
|
|
228
|
+
}
|
|
229
|
+
if (!this.db)
|
|
230
|
+
return coverage;
|
|
231
|
+
const tableExists = this.db.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name='qe_patterns'`).get();
|
|
232
|
+
if (!tableExists)
|
|
233
|
+
return coverage;
|
|
234
|
+
const rows = this.db.prepare(`
|
|
235
|
+
SELECT qe_domain, COUNT(*) as count
|
|
236
|
+
FROM qe_patterns
|
|
237
|
+
GROUP BY qe_domain
|
|
238
|
+
`).all();
|
|
239
|
+
for (const row of rows) {
|
|
240
|
+
if (QE_DOMAIN_LIST.includes(row.qe_domain)) {
|
|
241
|
+
coverage[row.qe_domain] = row.count;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return coverage;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Get historical average reward
|
|
248
|
+
*/
|
|
249
|
+
getHistoricalAvgReward(date) {
|
|
250
|
+
if (!this.db)
|
|
251
|
+
return 0;
|
|
252
|
+
// Try learning_experiences first
|
|
253
|
+
const tableExists = this.db.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name='learning_experiences'`).get();
|
|
254
|
+
if (tableExists) {
|
|
255
|
+
const result = this.db.prepare(`
|
|
256
|
+
SELECT AVG(reward) as avg_reward
|
|
257
|
+
FROM learning_experiences
|
|
258
|
+
WHERE datetime(created_at, 'unixepoch') <= datetime(?)
|
|
259
|
+
`).get(date + ' 23:59:59');
|
|
260
|
+
return result?.avg_reward || 0;
|
|
261
|
+
}
|
|
262
|
+
return 0;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Get dashboard data for CLI display
|
|
266
|
+
*/
|
|
267
|
+
async getDashboardData() {
|
|
268
|
+
if (!this.initialized)
|
|
269
|
+
await this.initialize();
|
|
270
|
+
const current = await this.getCurrentMetrics();
|
|
271
|
+
const history = await this.getMetricsHistory(7);
|
|
272
|
+
// Calculate trends
|
|
273
|
+
const patternsPerDay = history.map(h => h.patternsCreatedToday);
|
|
274
|
+
const experiencesPerDay = history.map(h => h.experiencesToday);
|
|
275
|
+
const avgRewardPerDay = history.map(h => h.avgReward);
|
|
276
|
+
// Top domains by pattern count
|
|
277
|
+
const topDomains = Object.entries(current.domainCoverage)
|
|
278
|
+
.filter(([_, count]) => count > 0)
|
|
279
|
+
.sort((a, b) => b[1] - a[1])
|
|
280
|
+
.slice(0, 5)
|
|
281
|
+
.map(([domain, count]) => ({
|
|
282
|
+
domain: domain,
|
|
283
|
+
count,
|
|
284
|
+
}));
|
|
285
|
+
return {
|
|
286
|
+
current,
|
|
287
|
+
history,
|
|
288
|
+
trends: {
|
|
289
|
+
patternsPerDay,
|
|
290
|
+
experiencesPerDay,
|
|
291
|
+
avgRewardPerDay,
|
|
292
|
+
},
|
|
293
|
+
topDomains,
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Get metrics history for the last N days
|
|
298
|
+
*/
|
|
299
|
+
async getMetricsHistory(days) {
|
|
300
|
+
if (!this.initialized)
|
|
301
|
+
await this.initialize();
|
|
302
|
+
if (!this.db)
|
|
303
|
+
return [];
|
|
304
|
+
const history = [];
|
|
305
|
+
// Check if learning_daily_snapshots table exists
|
|
306
|
+
const tableExists = this.db.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name='learning_daily_snapshots'`).get();
|
|
307
|
+
if (!tableExists) {
|
|
308
|
+
return [];
|
|
309
|
+
}
|
|
310
|
+
const rows = this.db.prepare(`
|
|
311
|
+
SELECT *
|
|
312
|
+
FROM learning_daily_snapshots
|
|
313
|
+
ORDER BY snapshot_date DESC
|
|
314
|
+
LIMIT ?
|
|
315
|
+
`).all(days);
|
|
316
|
+
for (const row of rows) {
|
|
317
|
+
let domainCoverage = {};
|
|
318
|
+
try {
|
|
319
|
+
domainCoverage = JSON.parse(row.domain_coverage_json || '{}');
|
|
320
|
+
}
|
|
321
|
+
catch {
|
|
322
|
+
// Use empty coverage if parse fails
|
|
323
|
+
for (const domain of QE_DOMAIN_LIST) {
|
|
324
|
+
domainCoverage[domain] = 0;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
history.push({
|
|
328
|
+
timestamp: new Date(row.snapshot_date),
|
|
329
|
+
totalPatterns: row.total_patterns,
|
|
330
|
+
patternsCreatedToday: row.patterns_created_today,
|
|
331
|
+
totalExperiences: row.total_experiences,
|
|
332
|
+
experiencesToday: row.experiences_today,
|
|
333
|
+
totalQValues: row.total_q_values,
|
|
334
|
+
avgReward: row.avg_reward,
|
|
335
|
+
avgRewardDelta: 0, // Not stored in history
|
|
336
|
+
domainCoverage,
|
|
337
|
+
patternReuseCount: row.pattern_reuse_count,
|
|
338
|
+
shortTermPatterns: row.short_term_patterns,
|
|
339
|
+
longTermPatterns: row.long_term_patterns,
|
|
340
|
+
avgConfidence: row.avg_confidence,
|
|
341
|
+
avgQualityScore: row.avg_quality_score,
|
|
342
|
+
successRate: row.success_rate,
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
return history;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Save a daily metrics snapshot
|
|
349
|
+
*/
|
|
350
|
+
async saveSnapshot() {
|
|
351
|
+
if (!this.initialized)
|
|
352
|
+
await this.initialize();
|
|
353
|
+
if (!this.db)
|
|
354
|
+
throw new Error('Database not initialized');
|
|
355
|
+
const metrics = await this.getCurrentMetrics();
|
|
356
|
+
const today = new Date().toISOString().split('T')[0];
|
|
357
|
+
this.db.prepare(`
|
|
358
|
+
INSERT OR REPLACE INTO learning_daily_snapshots (
|
|
359
|
+
snapshot_date,
|
|
360
|
+
total_patterns,
|
|
361
|
+
patterns_created_today,
|
|
362
|
+
total_experiences,
|
|
363
|
+
experiences_today,
|
|
364
|
+
total_q_values,
|
|
365
|
+
avg_reward,
|
|
366
|
+
avg_confidence,
|
|
367
|
+
avg_quality_score,
|
|
368
|
+
success_rate,
|
|
369
|
+
pattern_reuse_count,
|
|
370
|
+
short_term_patterns,
|
|
371
|
+
long_term_patterns,
|
|
372
|
+
domain_coverage_json
|
|
373
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
374
|
+
`).run(today, metrics.totalPatterns, metrics.patternsCreatedToday, metrics.totalExperiences, metrics.experiencesToday, metrics.totalQValues, metrics.avgReward, metrics.avgConfidence, metrics.avgQualityScore, metrics.successRate, metrics.patternReuseCount, metrics.shortTermPatterns, metrics.longTermPatterns, JSON.stringify(metrics.domainCoverage));
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Close the database connection
|
|
378
|
+
*/
|
|
379
|
+
close() {
|
|
380
|
+
if (this.db) {
|
|
381
|
+
this.db.close();
|
|
382
|
+
this.db = null;
|
|
383
|
+
this.initialized = false;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
// ============================================================================
|
|
388
|
+
// Factory Function
|
|
389
|
+
// ============================================================================
|
|
390
|
+
/**
|
|
391
|
+
* Create a new LearningMetricsTracker instance
|
|
392
|
+
*/
|
|
393
|
+
export function createLearningMetricsTracker(projectRoot) {
|
|
394
|
+
return new LearningMetricsTracker(projectRoot);
|
|
395
|
+
}
|
|
396
|
+
//# sourceMappingURL=metrics-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics-tracker.js","sourceRoot":"","sources":["../../src/learning/metrics-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Pattern Lifecycle Management
|
|
3
|
+
* Phase 7: Continuous Learning Loop
|
|
4
|
+
*
|
|
5
|
+
* Manages the full lifecycle of QE patterns including:
|
|
6
|
+
* - Pattern promotion from short-term to long-term
|
|
7
|
+
* - Pattern deprecation after failures
|
|
8
|
+
* - Quality feedback loops
|
|
9
|
+
* - Confidence decay over time
|
|
10
|
+
*/
|
|
11
|
+
import type { Database as DatabaseType } from 'better-sqlite3';
|
|
12
|
+
import type { QEDomain, QEPatternType } from './qe-patterns.js';
|
|
13
|
+
/**
|
|
14
|
+
* Pattern lifecycle configuration
|
|
15
|
+
*/
|
|
16
|
+
export interface PatternLifecycleConfig {
|
|
17
|
+
/** Minimum reward threshold for pattern promotion (0-1) */
|
|
18
|
+
promotionRewardThreshold: number;
|
|
19
|
+
/** Minimum occurrence count for pattern promotion */
|
|
20
|
+
promotionMinOccurrences: number;
|
|
21
|
+
/** Minimum success rate for pattern promotion (0-1) */
|
|
22
|
+
promotionMinSuccessRate: number;
|
|
23
|
+
/** Number of consecutive failures before deprecation */
|
|
24
|
+
deprecationFailureThreshold: number;
|
|
25
|
+
/** Days without use before pattern becomes stale */
|
|
26
|
+
staleDaysThreshold: number;
|
|
27
|
+
/** Daily confidence decay rate (0-1) */
|
|
28
|
+
confidenceDecayRate: number;
|
|
29
|
+
/** Minimum confidence to keep pattern active */
|
|
30
|
+
minActiveConfidence: number;
|
|
31
|
+
/** Maximum age in days before automatic deprecation review */
|
|
32
|
+
maxAgeForActivePatterns: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Default lifecycle configuration
|
|
36
|
+
*/
|
|
37
|
+
export declare const DEFAULT_LIFECYCLE_CONFIG: PatternLifecycleConfig;
|
|
38
|
+
/**
|
|
39
|
+
* Experience aggregation for pattern candidate identification
|
|
40
|
+
*/
|
|
41
|
+
export interface ExperienceAggregate {
|
|
42
|
+
taskType: string;
|
|
43
|
+
domain: QEDomain | null;
|
|
44
|
+
count: number;
|
|
45
|
+
avgReward: number;
|
|
46
|
+
maxReward: number;
|
|
47
|
+
minReward: number;
|
|
48
|
+
actions: string[];
|
|
49
|
+
successCount: number;
|
|
50
|
+
latestAt: Date;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Pattern candidate identified from experiences
|
|
54
|
+
*/
|
|
55
|
+
export interface PatternCandidate {
|
|
56
|
+
name: string;
|
|
57
|
+
domain: QEDomain;
|
|
58
|
+
patternType: QEPatternType;
|
|
59
|
+
confidence: number;
|
|
60
|
+
sourceExperiences: number;
|
|
61
|
+
avgReward: number;
|
|
62
|
+
successRate: number;
|
|
63
|
+
actions: string[];
|
|
64
|
+
templateContent: string;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Result of pattern promotion check
|
|
68
|
+
*/
|
|
69
|
+
export interface PromotionCheckResult {
|
|
70
|
+
shouldPromote: boolean;
|
|
71
|
+
meetsRewardThreshold: boolean;
|
|
72
|
+
meetsOccurrenceThreshold: boolean;
|
|
73
|
+
meetsSuccessRateThreshold: boolean;
|
|
74
|
+
currentReward: number;
|
|
75
|
+
currentOccurrences: number;
|
|
76
|
+
currentSuccessRate: number;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Result of deprecation check
|
|
80
|
+
*/
|
|
81
|
+
export interface DeprecationCheckResult {
|
|
82
|
+
shouldDeprecate: boolean;
|
|
83
|
+
reason: 'failures' | 'stale' | 'low_confidence' | 'age' | null;
|
|
84
|
+
consecutiveFailures?: number;
|
|
85
|
+
daysSinceLastUse?: number;
|
|
86
|
+
currentConfidence?: number;
|
|
87
|
+
ageInDays?: number;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Pattern lifecycle statistics
|
|
91
|
+
*/
|
|
92
|
+
export interface PatternLifecycleStats {
|
|
93
|
+
totalPatterns: number;
|
|
94
|
+
activePatterns: number;
|
|
95
|
+
deprecatedPatterns: number;
|
|
96
|
+
promotedPatterns: number;
|
|
97
|
+
shortTermPatterns: number;
|
|
98
|
+
longTermPatterns: number;
|
|
99
|
+
avgConfidence: number;
|
|
100
|
+
avgSuccessRate: number;
|
|
101
|
+
patternsNearDeprecation: number;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Pattern Lifecycle Manager
|
|
105
|
+
*
|
|
106
|
+
* Handles pattern promotion, deprecation, and quality tracking
|
|
107
|
+
* as part of the continuous learning loop.
|
|
108
|
+
*/
|
|
109
|
+
export declare class PatternLifecycleManager {
|
|
110
|
+
private readonly db;
|
|
111
|
+
private readonly config;
|
|
112
|
+
constructor(db: DatabaseType, config?: Partial<PatternLifecycleConfig>);
|
|
113
|
+
/**
|
|
114
|
+
* Ensure required schema extensions exist
|
|
115
|
+
*/
|
|
116
|
+
private ensureSchema;
|
|
117
|
+
/**
|
|
118
|
+
* Get recent experiences from learning_experiences table
|
|
119
|
+
*/
|
|
120
|
+
getRecentExperiences(options?: {
|
|
121
|
+
minReward?: number;
|
|
122
|
+
limit?: number;
|
|
123
|
+
sinceDays?: number;
|
|
124
|
+
}): ExperienceAggregate[];
|
|
125
|
+
/**
|
|
126
|
+
* Map task type to QE domain
|
|
127
|
+
*/
|
|
128
|
+
private taskTypeToQEDomain;
|
|
129
|
+
/**
|
|
130
|
+
* Map task type to pattern type
|
|
131
|
+
*/
|
|
132
|
+
private taskTypeToPatternType;
|
|
133
|
+
/**
|
|
134
|
+
* Find pattern candidates from experience aggregates
|
|
135
|
+
*/
|
|
136
|
+
findPatternCandidates(experiences: ExperienceAggregate[]): PatternCandidate[];
|
|
137
|
+
/**
|
|
138
|
+
* Find existing pattern by task type and domain
|
|
139
|
+
*/
|
|
140
|
+
private findExistingPattern;
|
|
141
|
+
/**
|
|
142
|
+
* Generate template content from experience aggregate
|
|
143
|
+
*/
|
|
144
|
+
private generateTemplateContent;
|
|
145
|
+
/**
|
|
146
|
+
* Check if a pattern should be promoted
|
|
147
|
+
*/
|
|
148
|
+
checkPromotion(patternId: string): PromotionCheckResult;
|
|
149
|
+
/**
|
|
150
|
+
* Promote pattern to long-term tier
|
|
151
|
+
*/
|
|
152
|
+
promotePattern(patternId: string): boolean;
|
|
153
|
+
/**
|
|
154
|
+
* Promote all eligible patterns
|
|
155
|
+
*/
|
|
156
|
+
promoteEligiblePatterns(): {
|
|
157
|
+
promoted: number;
|
|
158
|
+
checked: number;
|
|
159
|
+
};
|
|
160
|
+
/**
|
|
161
|
+
* Check if a pattern should be deprecated
|
|
162
|
+
*/
|
|
163
|
+
checkDeprecation(patternId: string): DeprecationCheckResult;
|
|
164
|
+
/**
|
|
165
|
+
* Deprecate a pattern (soft delete)
|
|
166
|
+
*/
|
|
167
|
+
deprecatePattern(patternId: string, reason?: string): boolean;
|
|
168
|
+
/**
|
|
169
|
+
* Deprecate all patterns that meet deprecation criteria
|
|
170
|
+
*/
|
|
171
|
+
deprecateStalePatterns(): {
|
|
172
|
+
deprecated: number;
|
|
173
|
+
checked: number;
|
|
174
|
+
};
|
|
175
|
+
/**
|
|
176
|
+
* Apply confidence decay to patterns that haven't been used recently
|
|
177
|
+
*/
|
|
178
|
+
applyConfidenceDecay(daysSinceLastRun?: number): {
|
|
179
|
+
updated: number;
|
|
180
|
+
decayed: number;
|
|
181
|
+
};
|
|
182
|
+
/**
|
|
183
|
+
* Record pattern usage success/failure
|
|
184
|
+
*/
|
|
185
|
+
recordUsage(patternId: string, success: boolean): void;
|
|
186
|
+
/**
|
|
187
|
+
* Get pattern lifecycle statistics
|
|
188
|
+
*/
|
|
189
|
+
getStats(): PatternLifecycleStats;
|
|
190
|
+
/**
|
|
191
|
+
* Get a pattern by ID
|
|
192
|
+
*/
|
|
193
|
+
private getPattern;
|
|
194
|
+
/**
|
|
195
|
+
* Convert database row to QEPattern
|
|
196
|
+
*/
|
|
197
|
+
private rowToPattern;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Create a pattern lifecycle manager
|
|
201
|
+
*/
|
|
202
|
+
export declare function createPatternLifecycleManager(db: DatabaseType, config?: Partial<PatternLifecycleConfig>): PatternLifecycleManager;
|
|
203
|
+
//# sourceMappingURL=pattern-lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-lifecycle.d.ts","sourceRoot":"","sources":["../../src/learning/pattern-lifecycle.ts"],"names":[],"mappings":"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"}
|