agentic-qe 1.3.5 → 1.3.7
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/qe-code-complexity.md +291 -0
- package/.claude/settings.json +2 -2
- package/CHANGELOG.md +67 -0
- package/README.md +36 -6
- package/dist/agents/BaseAgent.d.ts +6 -2
- package/dist/agents/BaseAgent.d.ts.map +1 -1
- package/dist/agents/BaseAgent.js +62 -51
- package/dist/agents/BaseAgent.js.map +1 -1
- package/dist/agents/CodeComplexityAnalyzerAgent.d.ts +139 -0
- package/dist/agents/CodeComplexityAnalyzerAgent.d.ts.map +1 -0
- package/dist/agents/CodeComplexityAnalyzerAgent.js +403 -0
- package/dist/agents/CodeComplexityAnalyzerAgent.js.map +1 -0
- package/dist/agents/FleetCommanderAgent.js +2 -2
- package/dist/agents/FleetCommanderAgent.js.map +1 -1
- package/dist/agents/QualityGateAgent.d.ts +5 -5
- package/dist/agents/QualityGateAgent.d.ts.map +1 -1
- package/dist/agents/QualityGateAgent.js +33 -19
- package/dist/agents/QualityGateAgent.js.map +1 -1
- package/dist/agents/TestDataArchitectAgent.d.ts +9 -0
- package/dist/agents/TestDataArchitectAgent.d.ts.map +1 -1
- package/dist/agents/TestDataArchitectAgent.js +96 -2
- package/dist/agents/TestDataArchitectAgent.js.map +1 -1
- package/dist/agents/TestGeneratorAgent.d.ts +23 -1
- package/dist/agents/TestGeneratorAgent.d.ts.map +1 -1
- package/dist/agents/TestGeneratorAgent.js +279 -54
- package/dist/agents/TestGeneratorAgent.js.map +1 -1
- package/dist/agents/coordination/AgentCoordinator.d.ts +98 -0
- package/dist/agents/coordination/AgentCoordinator.d.ts.map +1 -0
- package/dist/agents/coordination/AgentCoordinator.js +196 -0
- package/dist/agents/coordination/AgentCoordinator.js.map +1 -0
- package/dist/agents/lifecycle/AgentLifecycleManager.d.ts +107 -0
- package/dist/agents/lifecycle/AgentLifecycleManager.d.ts.map +1 -0
- package/dist/agents/lifecycle/AgentLifecycleManager.js +220 -0
- package/dist/agents/lifecycle/AgentLifecycleManager.js.map +1 -0
- package/dist/agents/memory/AgentMemoryService.d.ts +173 -0
- package/dist/agents/memory/AgentMemoryService.d.ts.map +1 -0
- package/dist/agents/memory/AgentMemoryService.js +297 -0
- package/dist/agents/memory/AgentMemoryService.js.map +1 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +45 -3
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/skills/index.d.ts +4 -0
- package/dist/cli/commands/skills/index.d.ts.map +1 -1
- package/dist/cli/commands/skills/index.js +8 -2
- package/dist/cli/commands/skills/index.js.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.d.ts +2 -1
- package/dist/core/memory/SwarmMemoryManager.d.ts.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.js +4 -1
- package/dist/core/memory/SwarmMemoryManager.js.map +1 -1
- package/dist/core/memory/dao/AccessControlDAO.d.ts +66 -0
- package/dist/core/memory/dao/AccessControlDAO.d.ts.map +1 -0
- package/dist/core/memory/dao/AccessControlDAO.js +140 -0
- package/dist/core/memory/dao/AccessControlDAO.js.map +1 -0
- package/dist/core/memory/dao/BaseDAO.d.ts +34 -0
- package/dist/core/memory/dao/BaseDAO.d.ts.map +1 -0
- package/dist/core/memory/dao/BaseDAO.js +34 -0
- package/dist/core/memory/dao/BaseDAO.js.map +1 -0
- package/dist/core/memory/dao/BlackboardDAO.d.ts +90 -0
- package/dist/core/memory/dao/BlackboardDAO.d.ts.map +1 -0
- package/dist/core/memory/dao/BlackboardDAO.js +223 -0
- package/dist/core/memory/dao/BlackboardDAO.js.map +1 -0
- package/dist/core/memory/dao/EventDAO.d.ts +83 -0
- package/dist/core/memory/dao/EventDAO.d.ts.map +1 -0
- package/dist/core/memory/dao/EventDAO.js +177 -0
- package/dist/core/memory/dao/EventDAO.js.map +1 -0
- package/dist/core/memory/dao/MemoryEntryDAO.d.ts +57 -0
- package/dist/core/memory/dao/MemoryEntryDAO.d.ts.map +1 -0
- package/dist/core/memory/dao/MemoryEntryDAO.js +159 -0
- package/dist/core/memory/dao/MemoryEntryDAO.js.map +1 -0
- package/dist/core/memory/dao/WorkflowDAO.d.ts +85 -0
- package/dist/core/memory/dao/WorkflowDAO.d.ts.map +1 -0
- package/dist/core/memory/dao/WorkflowDAO.js +182 -0
- package/dist/core/memory/dao/WorkflowDAO.js.map +1 -0
- package/dist/core/memory/services/AccessControlService.d.ts +123 -0
- package/dist/core/memory/services/AccessControlService.d.ts.map +1 -0
- package/dist/core/memory/services/AccessControlService.js +249 -0
- package/dist/core/memory/services/AccessControlService.js.map +1 -0
- package/dist/core/memory/services/MemoryStoreService.d.ts +69 -0
- package/dist/core/memory/services/MemoryStoreService.d.ts.map +1 -0
- package/dist/core/memory/services/MemoryStoreService.js +214 -0
- package/dist/core/memory/services/MemoryStoreService.js.map +1 -0
- package/dist/mcp/handlers/base-handler.d.ts.map +1 -1
- package/dist/mcp/handlers/base-handler.js +4 -1
- package/dist/mcp/handlers/base-handler.js.map +1 -1
- package/dist/mcp/handlers/prediction/regression-risk-analyze.d.ts +11 -1
- package/dist/mcp/handlers/prediction/regression-risk-analyze.d.ts.map +1 -1
- package/dist/mcp/handlers/prediction/regression-risk-analyze.js +63 -8
- package/dist/mcp/handlers/prediction/regression-risk-analyze.js.map +1 -1
- package/dist/mcp/handlers/quality-analyze.d.ts +7 -1
- package/dist/mcp/handlers/quality-analyze.d.ts.map +1 -1
- package/dist/mcp/handlers/quality-analyze.js +18 -1
- package/dist/mcp/handlers/quality-analyze.js.map +1 -1
- package/dist/mcp/handlers/test-generate.d.ts.map +1 -1
- package/dist/mcp/handlers/test-generate.js +24 -8
- package/dist/mcp/handlers/test-generate.js.map +1 -1
- package/dist/mcp/services/AgentRegistry.d.ts +5 -0
- package/dist/mcp/services/AgentRegistry.d.ts.map +1 -1
- package/dist/mcp/services/AgentRegistry.js +19 -0
- package/dist/mcp/services/AgentRegistry.js.map +1 -1
- package/dist/utils/__mocks__/Database.d.ts +64 -0
- package/dist/utils/__mocks__/Database.d.ts.map +1 -0
- package/dist/utils/__mocks__/Database.js +134 -0
- package/dist/utils/__mocks__/Database.js.map +1 -0
- package/package.json +5 -1
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: qe-code-complexity
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: Educational code complexity analyzer demonstrating the Agentic QE Fleet architecture
|
|
5
|
+
tags: [quality-engineering, complexity-analysis, refactoring, learning-example]
|
|
6
|
+
capabilities: [complexity-analysis, refactoring-recommendations, pattern-detection]
|
|
7
|
+
type: quality-analyzer
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# QE Code Complexity Analyzer
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
|
|
14
|
+
The Code Complexity Analyzer is an **educational agent** that demonstrates the complete Agentic QE Fleet architecture. It analyzes code complexity metrics and provides AI-powered refactoring recommendations.
|
|
15
|
+
|
|
16
|
+
**Purpose**: Learning tool to understand how agents work in the AQE fleet.
|
|
17
|
+
|
|
18
|
+
## Capabilities
|
|
19
|
+
|
|
20
|
+
### 1. Complexity Analysis
|
|
21
|
+
- **Cyclomatic Complexity**: Measures decision point density
|
|
22
|
+
- **Cognitive Complexity**: Accounts for nesting and control flow
|
|
23
|
+
- **File Size Analysis**: Identifies overly large files
|
|
24
|
+
- **Function Metrics**: Tracks function count and average complexity
|
|
25
|
+
|
|
26
|
+
### 2. Refactoring Recommendations
|
|
27
|
+
- AI-powered suggestions based on detected patterns
|
|
28
|
+
- Severity-based prioritization (low, medium, high, critical)
|
|
29
|
+
- Specific actionable advice (e.g., "Extract Method", "Reduce Nesting")
|
|
30
|
+
|
|
31
|
+
### 3. Quality Scoring
|
|
32
|
+
- Holistic quality score (0-100)
|
|
33
|
+
- Issue-based deductions
|
|
34
|
+
- Helps prioritize refactoring efforts
|
|
35
|
+
|
|
36
|
+
## Key Learning Concepts
|
|
37
|
+
|
|
38
|
+
### BaseAgent Pattern
|
|
39
|
+
```typescript
|
|
40
|
+
// All agents extend BaseAgent
|
|
41
|
+
export class CodeComplexityAnalyzerAgent extends BaseAgent {
|
|
42
|
+
// Define capabilities in constructor
|
|
43
|
+
constructor(config: CodeComplexityConfig) {
|
|
44
|
+
super({
|
|
45
|
+
...config,
|
|
46
|
+
type: QEAgentType.QUALITY_ANALYZER,
|
|
47
|
+
capabilities: [/* ... */]
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Lifecycle Hooks
|
|
54
|
+
```typescript
|
|
55
|
+
// Pre-task: Load context before work
|
|
56
|
+
protected async onPreTask(data: { assignment: any }): Promise<void> {
|
|
57
|
+
const history = await this.memoryStore.retrieve('aqe/complexity/.../history');
|
|
58
|
+
// Use historical data to improve analysis
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Post-task: Store results and coordinate
|
|
62
|
+
protected async onPostTask(data: PostTaskData): Promise<void> {
|
|
63
|
+
await this.memoryStore.store('aqe/complexity/.../results', data.result);
|
|
64
|
+
this.eventBus.emit('complexity:analysis:completed', { ... });
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Error handling: Learn from failures
|
|
68
|
+
protected async onTaskError(data: { assignment: any; error: Error }): Promise<void> {
|
|
69
|
+
await this.memoryStore.store('aqe/complexity/.../errors/...', { ... });
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Memory System
|
|
74
|
+
```typescript
|
|
75
|
+
// Store results for other agents
|
|
76
|
+
await this.memoryStore.store(
|
|
77
|
+
'aqe/complexity/${agentId}/latest-result',
|
|
78
|
+
result,
|
|
79
|
+
86400 // 24 hour TTL
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
// Retrieve for coordination
|
|
83
|
+
const previous = await this.memoryStore.retrieve(
|
|
84
|
+
'aqe/complexity/${agentId}/history'
|
|
85
|
+
);
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Event-Driven Architecture
|
|
89
|
+
```typescript
|
|
90
|
+
// Emit events for coordination
|
|
91
|
+
this.eventBus.emit('complexity:analysis:completed', {
|
|
92
|
+
agentId: this.agentId,
|
|
93
|
+
result: analysisResult,
|
|
94
|
+
timestamp: new Date()
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
// Other agents can subscribe
|
|
98
|
+
eventBus.on('complexity:analysis:completed', (event) => {
|
|
99
|
+
// Test generator could prioritize complex code
|
|
100
|
+
// Coverage analyzer could focus on complex functions
|
|
101
|
+
});
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Usage Examples
|
|
105
|
+
|
|
106
|
+
### From Claude Code CLI
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
# Analyze a single file
|
|
110
|
+
claude "Use qe-code-complexity to analyze src/services/order-processor.ts"
|
|
111
|
+
|
|
112
|
+
# Analyze multiple files
|
|
113
|
+
claude "Run complexity analysis on all files in src/services/"
|
|
114
|
+
|
|
115
|
+
# Get refactoring recommendations
|
|
116
|
+
claude "Analyze src/utils/validator.ts and suggest refactorings"
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Via TypeScript
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
import { CodeComplexityAnalyzerAgent } from './agents/CodeComplexityAnalyzerAgent';
|
|
123
|
+
|
|
124
|
+
// Initialize agent
|
|
125
|
+
const agent = new CodeComplexityAnalyzerAgent({
|
|
126
|
+
type: QEAgentType.QUALITY_ANALYZER,
|
|
127
|
+
capabilities: [],
|
|
128
|
+
context: { /* ... */ },
|
|
129
|
+
memoryStore,
|
|
130
|
+
eventBus,
|
|
131
|
+
thresholds: {
|
|
132
|
+
cyclomaticComplexity: 10,
|
|
133
|
+
cognitiveComplexity: 15,
|
|
134
|
+
linesOfCode: 300
|
|
135
|
+
},
|
|
136
|
+
enableRecommendations: true
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
await agent.initialize();
|
|
140
|
+
|
|
141
|
+
// Analyze code
|
|
142
|
+
const result = await agent.analyzeComplexity({
|
|
143
|
+
files: [{
|
|
144
|
+
path: 'complex.ts',
|
|
145
|
+
content: sourceCode,
|
|
146
|
+
language: 'typescript'
|
|
147
|
+
}]
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
console.log('Quality Score:', result.score);
|
|
151
|
+
console.log('Issues:', result.issues);
|
|
152
|
+
console.log('Recommendations:', result.recommendations);
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Configuration
|
|
156
|
+
|
|
157
|
+
### Thresholds
|
|
158
|
+
|
|
159
|
+
Customize complexity thresholds:
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
{
|
|
163
|
+
thresholds: {
|
|
164
|
+
cyclomaticComplexity: 10, // Default: 10
|
|
165
|
+
cognitiveComplexity: 15, // Default: 15
|
|
166
|
+
linesOfCode: 300 // Default: 300
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Features
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
174
|
+
{
|
|
175
|
+
enableRecommendations: true, // Default: true
|
|
176
|
+
enableLearning: true // Default: false (demo uses false)
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## Integration with Other Agents
|
|
181
|
+
|
|
182
|
+
### Test Generator
|
|
183
|
+
The test-generator agent can use complexity analysis to:
|
|
184
|
+
- Prioritize complex functions for testing
|
|
185
|
+
- Generate more comprehensive tests for high-complexity code
|
|
186
|
+
- Focus on edge cases in nested logic
|
|
187
|
+
|
|
188
|
+
```typescript
|
|
189
|
+
eventBus.on('complexity:analysis:completed', async (event) => {
|
|
190
|
+
if (event.result.issues.some(i => i.severity === 'critical')) {
|
|
191
|
+
// Test generator: Create extra tests for critical complexity
|
|
192
|
+
await testGeneratorAgent.generateTests({
|
|
193
|
+
focusAreas: event.result.issues
|
|
194
|
+
.filter(i => i.severity === 'critical')
|
|
195
|
+
.map(i => i.file)
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Coverage Analyzer
|
|
202
|
+
The coverage-analyzer can use complexity data to:
|
|
203
|
+
- Ensure high-complexity code has high coverage
|
|
204
|
+
- Identify risk areas (high complexity + low coverage)
|
|
205
|
+
|
|
206
|
+
### Quality Gate
|
|
207
|
+
The quality-gate can use complexity metrics as criteria:
|
|
208
|
+
- Fail builds with critical complexity issues
|
|
209
|
+
- Track complexity trends over time
|
|
210
|
+
- Prevent complexity regressions
|
|
211
|
+
|
|
212
|
+
## Example Output
|
|
213
|
+
|
|
214
|
+
```
|
|
215
|
+
Quality Score: 65/100
|
|
216
|
+
|
|
217
|
+
⚠️ Issues Detected:
|
|
218
|
+
1. [HIGH] cyclomatic
|
|
219
|
+
Current: 23, Threshold: 10
|
|
220
|
+
Consider breaking down complex logic into smaller functions
|
|
221
|
+
|
|
222
|
+
2. [MEDIUM] cognitive
|
|
223
|
+
Current: 18, Threshold: 15
|
|
224
|
+
Reduce nesting levels and simplify control flow
|
|
225
|
+
|
|
226
|
+
💡 Recommendations:
|
|
227
|
+
1. Apply Extract Method refactoring to reduce cyclomatic complexity
|
|
228
|
+
2. Use early returns to reduce nesting levels
|
|
229
|
+
3. Extract nested loops into separate methods
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## Learning Objectives
|
|
233
|
+
|
|
234
|
+
By studying this agent, you'll learn:
|
|
235
|
+
|
|
236
|
+
1. ✅ **BaseAgent Pattern**: How to extend and customize agents
|
|
237
|
+
2. ✅ **Lifecycle Hooks**: Pre-task, post-task, and error handling
|
|
238
|
+
3. ✅ **Memory System**: Storing and retrieving agent data
|
|
239
|
+
4. ✅ **Event System**: Coordinating multiple agents
|
|
240
|
+
5. ✅ **Testing Patterns**: Comprehensive test coverage
|
|
241
|
+
6. ✅ **Agent Coordination**: How agents work together
|
|
242
|
+
|
|
243
|
+
## Running the Example
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
# Run the demo
|
|
247
|
+
npx ts-node examples/complexity-analysis/demo.ts
|
|
248
|
+
|
|
249
|
+
# Run tests
|
|
250
|
+
npm test tests/agents/CodeComplexityAnalyzerAgent.test.ts
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
## Architecture Insights
|
|
254
|
+
|
|
255
|
+
### Memory Namespace
|
|
256
|
+
- `aqe/complexity/${agentId}/current-request` - Active analysis request
|
|
257
|
+
- `aqe/complexity/${agentId}/latest-result` - Most recent result
|
|
258
|
+
- `aqe/complexity/${agentId}/history` - Historical analyses (last 100)
|
|
259
|
+
- `aqe/complexity/${agentId}/errors/*` - Error tracking
|
|
260
|
+
|
|
261
|
+
### Events Emitted
|
|
262
|
+
- `complexity:analysis:completed` - When analysis finishes successfully
|
|
263
|
+
- `complexity:analysis:stored` - When results are persisted
|
|
264
|
+
|
|
265
|
+
### Capabilities Provided
|
|
266
|
+
- `complexity-analysis` - Core analysis functionality
|
|
267
|
+
- `refactoring-recommendations` - AI-powered suggestions
|
|
268
|
+
- `pattern-detection` - Complex code pattern recognition
|
|
269
|
+
|
|
270
|
+
## Next Steps
|
|
271
|
+
|
|
272
|
+
After understanding this agent, explore:
|
|
273
|
+
- **TestGeneratorAgent**: See how it generates tests
|
|
274
|
+
- **CoverageAnalyzerAgent**: Learn about O(log n) gap detection
|
|
275
|
+
- **FleetManager**: Understand multi-agent coordination
|
|
276
|
+
- **LearningEngine**: Discover how agents improve over time
|
|
277
|
+
|
|
278
|
+
## Resources
|
|
279
|
+
|
|
280
|
+
- **Source Code**: `src/agents/CodeComplexityAnalyzerAgent.ts`
|
|
281
|
+
- **Tests**: `tests/agents/CodeComplexityAnalyzerAgent.test.ts`
|
|
282
|
+
- **Demo**: `examples/complexity-analysis/demo.ts`
|
|
283
|
+
- **BaseAgent**: `src/agents/BaseAgent.ts`
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
**Educational Agent**: This agent is designed for learning. For production complexity analysis, consider:
|
|
288
|
+
- ESLint with complexity rules
|
|
289
|
+
- SonarQube
|
|
290
|
+
- CodeClimate
|
|
291
|
+
- Commercial static analysis tools
|
package/.claude/settings.json
CHANGED
|
@@ -145,9 +145,9 @@
|
|
|
145
145
|
]
|
|
146
146
|
},
|
|
147
147
|
"includeCoAuthoredBy": true,
|
|
148
|
-
"enabledMcpjsonServers": ["claude-flow", "ruv-swarm"],
|
|
148
|
+
"enabledMcpjsonServers": ["claude-flow", "ruv-swarm", "agentic-qe"],
|
|
149
149
|
"statusLine": {
|
|
150
150
|
"type": "command",
|
|
151
|
-
"command": ".claude/statusline-
|
|
151
|
+
"command": ".claude/statusline-command.sh"
|
|
152
152
|
}
|
|
153
153
|
}
|
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,73 @@ All notable changes to the Agentic QE project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.3.7] - 2025-10-30
|
|
9
|
+
|
|
10
|
+
### 📚 Documentation Updates
|
|
11
|
+
|
|
12
|
+
#### README Improvements
|
|
13
|
+
- **Updated agent count**: 17 → 18 specialized agents (added qe-code-complexity)
|
|
14
|
+
- **Added qe-code-complexity agent** to initialization section
|
|
15
|
+
- **Added 34 QE skills library** to "What gets initialized" section
|
|
16
|
+
- **Updated Agent Types table**: Core Testing Agents (5 → 6 agents)
|
|
17
|
+
- **Added usage example** for code complexity analysis in Example 5
|
|
18
|
+
|
|
19
|
+
#### Agent Documentation
|
|
20
|
+
- **qe-code-complexity**: Educational agent demonstrating AQE Fleet architecture
|
|
21
|
+
- Cyclomatic complexity analysis
|
|
22
|
+
- Cognitive complexity metrics
|
|
23
|
+
- AI-powered refactoring recommendations
|
|
24
|
+
- Complete BaseAgent pattern demonstration
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
- README.md: Version 1.3.6 → 1.3.7
|
|
28
|
+
- Agent count references updated throughout documentation
|
|
29
|
+
- Skills library properly documented in initialization
|
|
30
|
+
|
|
31
|
+
### Quality
|
|
32
|
+
- **Release Type**: Documentation-only patch release
|
|
33
|
+
- **Breaking Changes**: None
|
|
34
|
+
- **Migration Required**: None (automatic on npm install)
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## [1.3.6] - 2025-10-30
|
|
39
|
+
|
|
40
|
+
### 🔒 Security & UX Improvements
|
|
41
|
+
|
|
42
|
+
#### Security Fixes
|
|
43
|
+
- **eval() Removal**: Replaced unsafe `eval()` in TestDataArchitectAgent with safe expression evaluator
|
|
44
|
+
- Supports comparison operators (===, !==, ==, !=, >=, <=, >, <)
|
|
45
|
+
- Supports logical operators (&&, ||)
|
|
46
|
+
- Eliminates arbitrary code execution vulnerability
|
|
47
|
+
- File: `src/agents/TestDataArchitectAgent.ts`
|
|
48
|
+
|
|
49
|
+
#### UX Enhancements
|
|
50
|
+
- **CLAUDE.md Append Strategy**: User-friendly placement of AQE instructions
|
|
51
|
+
- Interactive mode: Prompts user to choose prepend or append
|
|
52
|
+
- `--yes` mode: Defaults to append (less disruptive)
|
|
53
|
+
- Clear visual separator (---) between sections
|
|
54
|
+
- Backup existing CLAUDE.md automatically
|
|
55
|
+
- File: `src/cli/commands/init.ts`
|
|
56
|
+
|
|
57
|
+
- **CLI Skills Count Fix**: Accurate display of installed skills
|
|
58
|
+
- Dynamic counting instead of hardcoded values
|
|
59
|
+
- Now shows correct "34/34" instead of "8/17"
|
|
60
|
+
- Future-proof (auto-updates when skills added)
|
|
61
|
+
- File: `src/cli/commands/skills/index.ts`
|
|
62
|
+
|
|
63
|
+
#### Additional Improvements
|
|
64
|
+
- **CodeComplexityAnalyzerAgent**: Cherry-picked from PR #22 with full integration
|
|
65
|
+
- **TypeScript Compilation**: All errors resolved (0 compilation errors)
|
|
66
|
+
- **Documentation**: Comprehensive fix reports and verification
|
|
67
|
+
|
|
68
|
+
### Testing
|
|
69
|
+
- ✅ TypeScript compilation: 0 errors
|
|
70
|
+
- ✅ All three fixes verified and working
|
|
71
|
+
- ✅ Backward compatible changes only
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
8
75
|
## [1.3.5] - 2025-10-27
|
|
9
76
|
|
|
10
77
|
### ✨ Features Complete - Production Ready Release
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
[](https://www.typescriptlang.org/)
|
|
8
8
|
[](https://nodejs.org/)
|
|
9
9
|
|
|
10
|
-
**Version 1.3.
|
|
10
|
+
**Version 1.3.7** | [Changelog](CHANGELOG.md) | [Issues](https://github.com/proffesor-for-testing/agentic-qe/issues) | [Discussions](https://github.com/proffesor-for-testing/agentic-qe/discussions)
|
|
11
11
|
|
|
12
12
|
> Enterprise-grade test automation with AI learning, comprehensive skills library (34 QE skills), and 85.7% cost savings through intelligent model routing.
|
|
13
13
|
|
|
@@ -30,7 +30,7 @@ cd your-project
|
|
|
30
30
|
aqe init
|
|
31
31
|
|
|
32
32
|
# Add MCP server to Claude Code (optional)
|
|
33
|
-
claude mcp add agentic-qe npx -
|
|
33
|
+
claude mcp add agentic-qe npx aqe-mcp
|
|
34
34
|
|
|
35
35
|
# Verify connection
|
|
36
36
|
claude mcp list
|
|
@@ -56,7 +56,8 @@ claude "Use qe-flaky-test-hunter to analyze the last 100 test runs and identify
|
|
|
56
56
|
- ✅ Learning System (20% improvement target)
|
|
57
57
|
- ✅ Pattern Bank (cross-project reuse)
|
|
58
58
|
- ✅ ML Flaky Detection (100% accuracy)
|
|
59
|
-
- ✅
|
|
59
|
+
- ✅ 18 Specialized agent definitions (including qe-code-complexity)
|
|
60
|
+
- ✅ 34 World-class QE skills library
|
|
60
61
|
- ✅ 8 AQE slash commands
|
|
61
62
|
- ✅ Configuration directory
|
|
62
63
|
|
|
@@ -65,7 +66,7 @@ claude "Use qe-flaky-test-hunter to analyze the last 100 test runs and identify
|
|
|
65
66
|
## ✨ Features
|
|
66
67
|
|
|
67
68
|
### 🤖 Autonomous Agent Fleet
|
|
68
|
-
- **
|
|
69
|
+
- **18 Specialized Agents**: Expert agents for every QE domain (test generation, coverage analysis, security scanning, performance testing, code complexity analysis)
|
|
69
70
|
- **AI-Powered Coordination**: Event-driven architecture with intelligent task distribution
|
|
70
71
|
- **Zero External Dependencies**: Native AQE hooks system (100-500x faster than external coordination)
|
|
71
72
|
- **Scalable**: From single developer projects to enterprise-scale testing infrastructure
|
|
@@ -205,6 +206,9 @@ claude "Use qe-chaos-engineer to inject random failures and validate system resi
|
|
|
205
206
|
|
|
206
207
|
# Flaky test detection with ML
|
|
207
208
|
claude "Use qe-flaky-test-hunter to analyze the last 100 test runs and identify flaky tests with ML-powered root cause analysis"
|
|
209
|
+
|
|
210
|
+
# Code complexity analysis
|
|
211
|
+
claude "Use qe-code-complexity to analyze src/ directory and get refactoring recommendations for complex code"
|
|
208
212
|
```
|
|
209
213
|
|
|
210
214
|
### Example 6: Fleet Coordination at Scale
|
|
@@ -358,7 +362,7 @@ Model Usage:
|
|
|
358
362
|
## 🤖 Agent Types
|
|
359
363
|
|
|
360
364
|
<details>
|
|
361
|
-
<summary><b>Core Testing Agents (
|
|
365
|
+
<summary><b>Core Testing Agents (6 agents)</b></summary>
|
|
362
366
|
|
|
363
367
|
| Agent | Purpose | Key Features | Phase 2 Enhancements |
|
|
364
368
|
|-------|---------|-------------|---------------------|
|
|
@@ -367,6 +371,7 @@ Model Usage:
|
|
|
367
371
|
| **coverage-analyzer** | Real-time gap analysis | O(log n) algorithms, trend tracking | ✅ Learning, Pattern recommendations |
|
|
368
372
|
| **quality-gate** | Intelligent validation | ML-driven decisions, risk assessment | ✅ Flaky test metrics |
|
|
369
373
|
| **quality-analyzer** | Metrics analysis | ESLint, SonarQube, Lighthouse integration | - |
|
|
374
|
+
| **code-complexity** | Complexity analysis | Cyclomatic/cognitive metrics, refactoring recommendations | ✅ Educational agent |
|
|
370
375
|
|
|
371
376
|
</details>
|
|
372
377
|
|
|
@@ -423,7 +428,7 @@ Model Usage:
|
|
|
423
428
|
|
|
424
429
|
</details>
|
|
425
430
|
|
|
426
|
-
**Total:
|
|
431
|
+
**Total: 19 Agents** (18 QE-specific + 1 general-purpose)
|
|
427
432
|
|
|
428
433
|
---
|
|
429
434
|
|
|
@@ -501,6 +506,31 @@ Model Usage:
|
|
|
501
506
|
|
|
502
507
|
## 📝 Recent Changes
|
|
503
508
|
|
|
509
|
+
### v1.3.6 (2025-10-30)
|
|
510
|
+
**Stability & Educational Release**
|
|
511
|
+
|
|
512
|
+
- ✅ **Fixed 16 critical TypeScript compilation errors** blocking production builds
|
|
513
|
+
- ✅ **Integrated CodeComplexityAnalyzerAgent** (educational example from PR #22 by @mondweep)
|
|
514
|
+
- ✅ **Zero functional regressions** - all core functionality tested and stable
|
|
515
|
+
- ✅ **Build stability improvements** - TypeScript compilation passing with 0 errors
|
|
516
|
+
- ✅ **BaseAgent property encapsulation** - proper lifecycle manager integration
|
|
517
|
+
- ✅ **Clean cherry-pick** from PR #22 with zero conflicts
|
|
518
|
+
|
|
519
|
+
**Technical Improvements**:
|
|
520
|
+
- BaseAgent property access patterns now use lifecycle manager accessors
|
|
521
|
+
- AccessControlDAO interface mapping corrected (`resourceId`, `owner` properties)
|
|
522
|
+
- Permission enum usage standardized (READ, WRITE, DELETE, SHARE)
|
|
523
|
+
- AgentLifecycleManager and AgentCoordinator properly integrated
|
|
524
|
+
|
|
525
|
+
**New Capabilities**:
|
|
526
|
+
- 📊 Code complexity analysis agent (cyclomatic & cognitive complexity)
|
|
527
|
+
- 🎯 Quality scoring system (0-100 scale)
|
|
528
|
+
- 🤖 AI-powered refactoring recommendations
|
|
529
|
+
- 📚 Complete BaseAgent pattern demonstration
|
|
530
|
+
- 📖 463-line architecture guide for learning
|
|
531
|
+
|
|
532
|
+
**Contributors**: @mondweep (CodeComplexityAnalyzerAgent), AQE Development Team
|
|
533
|
+
|
|
504
534
|
### v1.3.5 (2025-10-27) - Learning System Complete & Critical Policies
|
|
505
535
|
|
|
506
536
|
**Phase 2 Features Complete:**
|
|
@@ -10,6 +10,9 @@ import { PerformanceTracker } from '../learning/PerformanceTracker';
|
|
|
10
10
|
import { LearningEngine } from '../learning/LearningEngine';
|
|
11
11
|
import { LearningConfig, StrategyRecommendation } from '../learning/types';
|
|
12
12
|
import { AgentDBManager, AgentDBConfig } from '../core/memory/AgentDBManager';
|
|
13
|
+
import { AgentLifecycleManager } from './lifecycle/AgentLifecycleManager';
|
|
14
|
+
import { AgentCoordinator } from './coordination/AgentCoordinator';
|
|
15
|
+
import { AgentMemoryService } from './memory/AgentMemoryService';
|
|
13
16
|
export interface BaseAgentConfig {
|
|
14
17
|
id?: string;
|
|
15
18
|
type: AgentType;
|
|
@@ -28,12 +31,10 @@ export interface BaseAgentConfig {
|
|
|
28
31
|
}
|
|
29
32
|
export declare abstract class BaseAgent extends EventEmitter {
|
|
30
33
|
protected readonly agentId: AgentId;
|
|
31
|
-
protected status: AgentStatus;
|
|
32
34
|
protected readonly capabilities: Map<string, AgentCapability>;
|
|
33
35
|
protected readonly context: AgentContext;
|
|
34
36
|
protected readonly memoryStore: MemoryStore;
|
|
35
37
|
protected readonly eventBus: EventEmitter;
|
|
36
|
-
protected readonly eventHandlers: Map<string, EventHandler[]>;
|
|
37
38
|
protected currentTask?: TaskAssignment;
|
|
38
39
|
protected hookManager: VerificationHookManager;
|
|
39
40
|
protected performanceTracker?: PerformanceTracker;
|
|
@@ -49,6 +50,9 @@ export declare abstract class BaseAgent extends EventEmitter {
|
|
|
49
50
|
lastActivity: Date;
|
|
50
51
|
};
|
|
51
52
|
private taskStartTime?;
|
|
53
|
+
protected readonly lifecycleManager: AgentLifecycleManager;
|
|
54
|
+
protected readonly coordinator: AgentCoordinator;
|
|
55
|
+
protected readonly memoryService: AgentMemoryService;
|
|
52
56
|
constructor(config: BaseAgentConfig);
|
|
53
57
|
/**
|
|
54
58
|
* Initialize the agent - must be called after construction
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseAgent.d.ts","sourceRoot":"","sources":["../../src/agents/BaseAgent.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EACL,OAAO,EACP,WAAW,IAAI,SAAS,EACxB,WAAW,EACX,YAAY,EACZ,eAAe,EAEf,YAAY,EACZ,WAAW,EACX,MAAM,EACN,cAAc,EAGd,WAAW,EACX,YAAY,EACZ,aAAa,EACd,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAExD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,aAAa,EAAwB,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"BaseAgent.d.ts","sourceRoot":"","sources":["../../src/agents/BaseAgent.ts"],"names":[],"mappings":"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"}
|