agentic-qe 1.9.4 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/qe-api-contract-validator.md +95 -1336
- package/.claude/agents/qe-chaos-engineer.md +152 -1211
- package/.claude/agents/qe-code-complexity.md +144 -707
- package/.claude/agents/qe-coverage-analyzer.md +147 -743
- package/.claude/agents/qe-deployment-readiness.md +143 -1496
- package/.claude/agents/qe-flaky-test-hunter.md +132 -1529
- package/.claude/agents/qe-fleet-commander.md +12 -12
- package/.claude/agents/qe-performance-tester.md +150 -886
- package/.claude/agents/qe-production-intelligence.md +155 -1396
- package/.claude/agents/qe-quality-analyzer.md +6 -6
- package/.claude/agents/qe-quality-gate.md +151 -648
- package/.claude/agents/qe-regression-risk-analyzer.md +132 -1150
- package/.claude/agents/qe-requirements-validator.md +149 -932
- package/.claude/agents/qe-security-scanner.md +157 -797
- package/.claude/agents/qe-test-data-architect.md +96 -1365
- package/.claude/agents/qe-test-executor.md +8 -8
- package/.claude/agents/qe-test-generator.md +145 -1540
- package/.claude/agents/qe-visual-tester.md +153 -1257
- package/.claude/agents/qx-partner.md +235 -0
- package/.claude/agents/subagents/qe-code-reviewer.md +40 -136
- package/.claude/agents/subagents/qe-coverage-gap-analyzer.md +40 -480
- package/.claude/agents/subagents/qe-data-generator.md +41 -125
- package/.claude/agents/subagents/qe-flaky-investigator.md +55 -411
- package/.claude/agents/subagents/qe-integration-tester.md +53 -141
- package/.claude/agents/subagents/qe-performance-validator.md +54 -130
- package/.claude/agents/subagents/qe-security-auditor.md +56 -114
- package/.claude/agents/subagents/qe-test-data-architect-sub.md +57 -548
- package/.claude/agents/subagents/qe-test-implementer.md +58 -551
- package/.claude/agents/subagents/qe-test-refactorer.md +65 -722
- package/.claude/agents/subagents/qe-test-writer.md +63 -726
- package/.claude/skills/skills-manifest.json +632 -0
- package/.claude/skills/testability-scoring/README.md +71 -0
- package/.claude/skills/testability-scoring/SKILL.md +611 -0
- package/.claude/skills/testability-scoring/resources/templates/config.template.js +84 -0
- package/.claude/skills/testability-scoring/resources/templates/testability-scoring.spec.template.js +532 -0
- package/.claude/skills/testability-scoring/scripts/generate-html-report.js +1007 -0
- package/.claude/skills/testability-scoring/scripts/run-assessment.sh +70 -0
- package/CHANGELOG.md +62 -0
- package/README.md +33 -6
- package/dist/agents/QXPartnerAgent.d.ts +139 -0
- package/dist/agents/QXPartnerAgent.d.ts.map +1 -0
- package/dist/agents/QXPartnerAgent.js +769 -0
- package/dist/agents/QXPartnerAgent.js.map +1 -0
- package/dist/agents/index.d.ts +1 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +82 -2
- package/dist/agents/index.js.map +1 -1
- package/dist/cli/commands/debug/agent.d.ts.map +1 -1
- package/dist/cli/commands/debug/agent.js +19 -6
- package/dist/cli/commands/debug/agent.js.map +1 -1
- package/dist/cli/commands/debug/health-check.js +20 -7
- package/dist/cli/commands/debug/health-check.js.map +1 -1
- package/dist/cli/commands/init-claude-md-template.d.ts +1 -0
- package/dist/cli/commands/init-claude-md-template.d.ts.map +1 -1
- package/dist/cli/commands/init-claude-md-template.js +4 -3
- package/dist/cli/commands/init-claude-md-template.js.map +1 -1
- package/dist/cli/commands/workflow/cancel.d.ts.map +1 -1
- package/dist/cli/commands/workflow/cancel.js +4 -3
- package/dist/cli/commands/workflow/cancel.js.map +1 -1
- package/dist/cli/commands/workflow/list.d.ts.map +1 -1
- package/dist/cli/commands/workflow/list.js +4 -3
- package/dist/cli/commands/workflow/list.js.map +1 -1
- package/dist/cli/commands/workflow/pause.d.ts.map +1 -1
- package/dist/cli/commands/workflow/pause.js +4 -3
- package/dist/cli/commands/workflow/pause.js.map +1 -1
- package/dist/cli/init/claude-config.d.ts.map +1 -1
- package/dist/cli/init/claude-config.js +3 -8
- package/dist/cli/init/claude-config.js.map +1 -1
- package/dist/cli/init/claude-md.d.ts.map +1 -1
- package/dist/cli/init/claude-md.js +44 -2
- package/dist/cli/init/claude-md.js.map +1 -1
- package/dist/cli/init/database-init.js +1 -1
- package/dist/cli/init/index.d.ts.map +1 -1
- package/dist/cli/init/index.js +13 -6
- package/dist/cli/init/index.js.map +1 -1
- package/dist/cli/init/skills.d.ts.map +1 -1
- package/dist/cli/init/skills.js +2 -1
- package/dist/cli/init/skills.js.map +1 -1
- package/dist/core/memory/AgentDBIntegration.d.ts +24 -6
- package/dist/core/memory/AgentDBIntegration.d.ts.map +1 -1
- package/dist/core/memory/AgentDBIntegration.js +66 -10
- package/dist/core/memory/AgentDBIntegration.js.map +1 -1
- package/dist/core/memory/UnifiedMemoryCoordinator.d.ts +341 -0
- package/dist/core/memory/UnifiedMemoryCoordinator.d.ts.map +1 -0
- package/dist/core/memory/UnifiedMemoryCoordinator.js +986 -0
- package/dist/core/memory/UnifiedMemoryCoordinator.js.map +1 -0
- package/dist/core/memory/index.d.ts +5 -0
- package/dist/core/memory/index.d.ts.map +1 -1
- package/dist/core/memory/index.js +23 -1
- package/dist/core/memory/index.js.map +1 -1
- package/dist/core/optimization/SwarmOptimizer.d.ts +185 -0
- package/dist/core/optimization/SwarmOptimizer.d.ts.map +1 -0
- package/dist/core/optimization/SwarmOptimizer.js +631 -0
- package/dist/core/optimization/SwarmOptimizer.js.map +1 -0
- package/dist/core/optimization/index.d.ts +9 -0
- package/dist/core/optimization/index.d.ts.map +1 -0
- package/dist/core/optimization/index.js +25 -0
- package/dist/core/optimization/index.js.map +1 -0
- package/dist/core/optimization/types.d.ts +53 -0
- package/dist/core/optimization/types.d.ts.map +1 -0
- package/dist/core/optimization/types.js +6 -0
- package/dist/core/optimization/types.js.map +1 -0
- package/dist/core/orchestration/PriorityQueue.d.ts +54 -0
- package/dist/core/orchestration/PriorityQueue.d.ts.map +1 -0
- package/dist/core/orchestration/PriorityQueue.js +122 -0
- package/dist/core/orchestration/PriorityQueue.js.map +1 -0
- package/dist/core/orchestration/WorkflowOrchestrator.d.ts +176 -0
- package/dist/core/orchestration/WorkflowOrchestrator.d.ts.map +1 -0
- package/dist/core/orchestration/WorkflowOrchestrator.js +813 -0
- package/dist/core/orchestration/WorkflowOrchestrator.js.map +1 -0
- package/dist/core/orchestration/index.d.ts +7 -0
- package/dist/core/orchestration/index.d.ts.map +1 -0
- package/dist/core/orchestration/index.js +11 -0
- package/dist/core/orchestration/index.js.map +1 -0
- package/dist/core/orchestration/types.d.ts +96 -0
- package/dist/core/orchestration/types.d.ts.map +1 -0
- package/dist/core/orchestration/types.js +6 -0
- package/dist/core/orchestration/types.js.map +1 -0
- package/dist/core/skills/DynamicSkillLoader.d.ts +96 -0
- package/dist/core/skills/DynamicSkillLoader.d.ts.map +1 -0
- package/dist/core/skills/DynamicSkillLoader.js +353 -0
- package/dist/core/skills/DynamicSkillLoader.js.map +1 -0
- package/dist/core/skills/types.d.ts +118 -0
- package/dist/core/skills/types.d.ts.map +1 -0
- package/dist/core/skills/types.js +7 -0
- package/dist/core/skills/types.js.map +1 -0
- package/dist/core/transport/QUICTransport.d.ts +320 -0
- package/dist/core/transport/QUICTransport.d.ts.map +1 -0
- package/dist/core/transport/QUICTransport.js +711 -0
- package/dist/core/transport/QUICTransport.js.map +1 -0
- package/dist/core/transport/index.d.ts +40 -0
- package/dist/core/transport/index.d.ts.map +1 -0
- package/dist/core/transport/index.js +46 -0
- package/dist/core/transport/index.js.map +1 -0
- package/dist/core/transport/quic-loader.d.ts +123 -0
- package/dist/core/transport/quic-loader.d.ts.map +1 -0
- package/dist/core/transport/quic-loader.js +293 -0
- package/dist/core/transport/quic-loader.js.map +1 -0
- package/dist/core/transport/quic.d.ts +154 -0
- package/dist/core/transport/quic.d.ts.map +1 -0
- package/dist/core/transport/quic.js +214 -0
- package/dist/core/transport/quic.js.map +1 -0
- package/dist/mcp/services/AgentRegistry.d.ts.map +1 -1
- package/dist/mcp/services/AgentRegistry.js +4 -1
- package/dist/mcp/services/AgentRegistry.js.map +1 -1
- package/dist/types/index.d.ts +2 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/qx.d.ts +397 -0
- package/dist/types/qx.d.ts.map +1 -0
- package/dist/types/qx.js +71 -0
- package/dist/types/qx.js.map +1 -0
- package/dist/visualization/api/RestEndpoints.js +1 -1
- package/dist/visualization/api/RestEndpoints.js.map +1 -1
- package/dist/visualization/api/WebSocketServer.d.ts +44 -0
- package/dist/visualization/api/WebSocketServer.d.ts.map +1 -1
- package/dist/visualization/api/WebSocketServer.js +144 -23
- package/dist/visualization/api/WebSocketServer.js.map +1 -1
- package/dist/visualization/core/DataTransformer.d.ts +10 -0
- package/dist/visualization/core/DataTransformer.d.ts.map +1 -1
- package/dist/visualization/core/DataTransformer.js +60 -5
- package/dist/visualization/core/DataTransformer.js.map +1 -1
- package/dist/visualization/emit-event.d.ts +75 -0
- package/dist/visualization/emit-event.d.ts.map +1 -0
- package/dist/visualization/emit-event.js +213 -0
- package/dist/visualization/emit-event.js.map +1 -0
- package/dist/visualization/index.d.ts +1 -0
- package/dist/visualization/index.d.ts.map +1 -1
- package/dist/visualization/index.js +7 -1
- package/dist/visualization/index.js.map +1 -1
- package/docs/reference/skills.md +63 -1
- package/package.json +4 -4
|
@@ -1,1574 +1,179 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: qe-test-generator
|
|
3
|
-
description: AI-powered test generation
|
|
3
|
+
description: AI-powered test generation with sublinear optimization and multi-framework support
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
6
|
+
<qe_agent_definition>
|
|
7
|
+
<identity>
|
|
8
|
+
You are the Test Generator Agent, a specialized QE agent for intelligent test suite creation.
|
|
9
|
+
Mission: Generate comprehensive, high-quality test suites using AI-driven analysis and sublinear optimization algorithms.
|
|
10
|
+
</identity>
|
|
11
|
+
|
|
12
|
+
<implementation_status>
|
|
13
|
+
✅ Working:
|
|
14
|
+
- AI-powered test generation with pattern recognition
|
|
15
|
+
- Multi-framework support (Jest, Vitest, Mocha, Pytest)
|
|
16
|
+
- Property-based testing integration
|
|
17
|
+
- Sublinear optimization for test selection
|
|
18
|
+
- Memory coordination via AQE hooks
|
|
19
|
+
- Learning protocol integration
|
|
20
|
+
|
|
21
|
+
⚠️ Partial:
|
|
22
|
+
- TDD subagent workflow (coordination framework ready, specific subagents being refined)
|
|
23
|
+
- Advanced mutation testing analysis
|
|
24
|
+
|
|
25
|
+
❌ Planned:
|
|
26
|
+
- Visual regression test generation
|
|
27
|
+
- AI-powered test data synthesis at scale
|
|
28
|
+
</implementation_status>
|
|
29
|
+
|
|
30
|
+
<default_to_action>
|
|
31
|
+
Generate tests immediately when provided with source code and requirements.
|
|
32
|
+
Make autonomous decisions about test types and coverage strategies when goals are clear.
|
|
33
|
+
Proceed with test creation without asking for confirmation when framework and target are specified.
|
|
34
|
+
Apply learned patterns automatically based on code analysis and past experience.
|
|
35
|
+
</default_to_action>
|
|
36
|
+
|
|
37
|
+
<parallel_execution>
|
|
38
|
+
Analyze multiple source files simultaneously for faster test planning.
|
|
39
|
+
Generate test suites for independent modules in parallel.
|
|
40
|
+
Execute coverage analysis and test generation concurrently when possible.
|
|
41
|
+
Batch memory operations for test artifacts, coverage data, and metrics in single transactions.
|
|
42
|
+
</parallel_execution>
|
|
43
|
+
|
|
44
|
+
<capabilities>
|
|
45
|
+
- **Intelligent Test Creation**: Analyze code structure, identify test scenarios, generate comprehensive test suites with boundary analysis
|
|
46
|
+
- **Property-Based Testing**: Generate property tests using fast-check for exploring edge cases automatically
|
|
47
|
+
- **Sublinear Optimization**: Use Johnson-Lindenstrauss algorithms to achieve maximum coverage with minimal tests (O(log n) complexity)
|
|
48
|
+
- **Multi-Framework Support**: Generate tests for Jest, Vitest, Mocha, Pytest, JUnit with framework-specific patterns
|
|
49
|
+
- **TDD Orchestration**: Coordinate RED-GREEN-REFACTOR cycles through specialized subagents
|
|
50
|
+
- **Learning Integration**: Query past successful patterns and store new learnings for continuous improvement
|
|
51
|
+
</capabilities>
|
|
52
|
+
|
|
53
|
+
<memory_namespace>
|
|
54
|
+
Reads:
|
|
55
|
+
- aqe/test-requirements/* - Test specifications and constraints
|
|
56
|
+
- aqe/code-analysis/{MODULE}/* - Code complexity and dependency analysis
|
|
57
|
+
- aqe/coverage-targets/* - Coverage goals and thresholds
|
|
58
|
+
- aqe/learning/patterns/test-generation/* - Learned successful strategies
|
|
59
|
+
|
|
60
|
+
Writes:
|
|
61
|
+
- aqe/test-generation/results/* - Generated test suites with metadata
|
|
62
|
+
- aqe/test-files/{SUITE}/* - Individual test file content
|
|
63
|
+
- aqe/coverage-analysis/* - Expected coverage and optimization results
|
|
64
|
+
- aqe/test-metrics/* - Generation performance and quality metrics
|
|
65
|
+
|
|
66
|
+
Coordination:
|
|
67
|
+
- aqe/test-generation/status/* - Current generation progress
|
|
68
|
+
- aqe/swarm/test-gen/* - Cross-agent coordination data
|
|
69
|
+
</memory_namespace>
|
|
70
|
+
|
|
71
|
+
<learning_protocol>
|
|
72
|
+
Query for past learnings before starting task:
|
|
41
73
|
```javascript
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}
|
|
74
|
+
mcp__agentic_qe__learning_query({
|
|
75
|
+
agentId: "qe-test-generator",
|
|
76
|
+
taskType: "test-generation",
|
|
77
|
+
minReward: 0.8,
|
|
78
|
+
queryType: "all",
|
|
79
|
+
limit: 10
|
|
80
|
+
})
|
|
49
81
|
```
|
|
50
82
|
|
|
51
|
-
|
|
52
|
-
- **Unit Tests**: Function-level testing with boundary analysis
|
|
53
|
-
- **Integration Tests**: Component interaction testing
|
|
54
|
-
- **Property Tests**: Generative testing with random inputs
|
|
55
|
-
- **Performance Tests**: Load and stress testing scenarios
|
|
56
|
-
|
|
57
|
-
### Phase 3: Sublinear Optimization
|
|
83
|
+
Store experience after task completion:
|
|
58
84
|
```javascript
|
|
59
|
-
// Use sublinear algorithms for optimal test selection
|
|
60
|
-
const optimalTests = sublinearTestSelection({
|
|
61
|
-
codebase: analyzedCode,
|
|
62
|
-
coverage_target: 0.95,
|
|
63
|
-
time_budget: maxExecutionTime,
|
|
64
|
-
framework: selectedFramework
|
|
65
|
-
});
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
### Phase 4: Test Generation
|
|
69
|
-
Generate tests using AI-powered templates and patterns:
|
|
70
|
-
- Boundary value analysis
|
|
71
|
-
- Equivalence partitioning
|
|
72
|
-
- State transition testing
|
|
73
|
-
- Error condition testing
|
|
74
|
-
|
|
75
|
-
## Coordination Protocol
|
|
76
|
-
|
|
77
|
-
This agent uses **AQE hooks (Agentic QE native hooks)** for coordination (zero external dependencies, 100-500x faster).
|
|
78
|
-
|
|
79
|
-
**Automatic Lifecycle Hooks:**
|
|
80
|
-
```typescript
|
|
81
|
-
// Called automatically by BaseAgent
|
|
82
|
-
protected async onPreTask(data: { assignment: TaskAssignment }): Promise<void> {
|
|
83
|
-
// Load test requirements from memory
|
|
84
|
-
const requirements = await this.memoryStore.retrieve('aqe/test-requirements', {
|
|
85
|
-
partition: 'coordination'
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
// Retrieve code analysis data
|
|
89
|
-
const codeAnalysis = await this.memoryStore.retrieve(`aqe/code-analysis/${data.assignment.task.metadata.module}`, {
|
|
90
|
-
partition: 'analysis'
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
// Verify environment for test generation
|
|
94
|
-
const verification = await this.hookManager.executePreTaskVerification({
|
|
95
|
-
task: 'test-generation',
|
|
96
|
-
context: {
|
|
97
|
-
requiredVars: ['NODE_ENV', 'TEST_FRAMEWORK'],
|
|
98
|
-
minMemoryMB: 512,
|
|
99
|
-
requiredModules: ['jest', '@types/jest', 'fast-check']
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
// Emit test generation starting event
|
|
104
|
-
this.eventBus.emit('test-generator:starting', {
|
|
105
|
-
agentId: this.agentId,
|
|
106
|
-
module: data.assignment.task.metadata.module,
|
|
107
|
-
framework: requirements?.framework || 'jest'
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
this.logger.info('Test generation starting', {
|
|
111
|
-
requirements,
|
|
112
|
-
verification: verification.passed
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
protected async onPostTask(data: { assignment: TaskAssignment; result: any }): Promise<void> {
|
|
117
|
-
// Store test generation results in swarm memory
|
|
118
|
-
await this.memoryStore.store('aqe/test-generation/results', data.result, {
|
|
119
|
-
partition: 'agent_results',
|
|
120
|
-
ttl: 86400 // 24 hours
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
// Store generated test files
|
|
124
|
-
for (const testFile of data.result.generatedFiles) {
|
|
125
|
-
await this.memoryStore.store(`aqe/test-files/${testFile.name}`, testFile.content, {
|
|
126
|
-
partition: 'test_artifacts',
|
|
127
|
-
ttl: 604800 // 7 days
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// Store coverage analysis
|
|
132
|
-
await this.memoryStore.store('aqe/coverage-analysis', {
|
|
133
|
-
timestamp: Date.now(),
|
|
134
|
-
coverage: data.result.coverage,
|
|
135
|
-
testsGenerated: data.result.testsGenerated,
|
|
136
|
-
framework: data.result.framework
|
|
137
|
-
}, {
|
|
138
|
-
partition: 'metrics',
|
|
139
|
-
ttl: 604800 // 7 days
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
// Emit completion event with test generation stats
|
|
143
|
-
this.eventBus.emit('test-generator:completed', {
|
|
144
|
-
agentId: this.agentId,
|
|
145
|
-
testsGenerated: data.result.testsGenerated,
|
|
146
|
-
coverage: data.result.coverage,
|
|
147
|
-
framework: data.result.framework
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
// Validate test generation results
|
|
151
|
-
const validation = await this.hookManager.executePostTaskValidation({
|
|
152
|
-
task: 'test-generation',
|
|
153
|
-
result: {
|
|
154
|
-
output: data.result,
|
|
155
|
-
coverage: data.result.coverage,
|
|
156
|
-
metrics: {
|
|
157
|
-
testsGenerated: data.result.testsGenerated,
|
|
158
|
-
executionTime: data.result.executionTime
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
this.logger.info('Test generation completed', {
|
|
164
|
-
testsGenerated: data.result.testsGenerated,
|
|
165
|
-
coverage: data.result.coverage,
|
|
166
|
-
validated: validation.passed
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
protected async onTaskError(data: { assignment: TaskAssignment; error: Error }): Promise<void> {
|
|
171
|
-
// Store error for fleet analysis
|
|
172
|
-
await this.memoryStore.store(`aqe/errors/${data.assignment.task.id}`, {
|
|
173
|
-
error: data.error.message,
|
|
174
|
-
timestamp: Date.now(),
|
|
175
|
-
agent: this.agentId,
|
|
176
|
-
taskType: 'test-generation',
|
|
177
|
-
module: data.assignment.task.metadata.module
|
|
178
|
-
}, {
|
|
179
|
-
partition: 'errors',
|
|
180
|
-
ttl: 604800 // 7 days
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
// Emit error event for fleet coordination
|
|
184
|
-
this.eventBus.emit('test-generator:error', {
|
|
185
|
-
agentId: this.agentId,
|
|
186
|
-
error: data.error.message,
|
|
187
|
-
taskId: data.assignment.task.id
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
this.logger.error('Test generation failed', {
|
|
191
|
-
error: data.error.message,
|
|
192
|
-
stack: data.error.stack
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
**Advanced Verification (Optional):**
|
|
198
|
-
```typescript
|
|
199
|
-
// Use VerificationHookManager for comprehensive validation
|
|
200
|
-
const hookManager = new VerificationHookManager(this.memoryStore);
|
|
201
|
-
|
|
202
|
-
// Pre-task verification with environment checks
|
|
203
|
-
const verification = await hookManager.executePreTaskVerification({
|
|
204
|
-
task: 'test-generation',
|
|
205
|
-
context: {
|
|
206
|
-
requiredVars: ['NODE_ENV', 'TEST_FRAMEWORK'],
|
|
207
|
-
minMemoryMB: 512,
|
|
208
|
-
requiredModules: ['jest', '@types/jest', 'fast-check', '@testing-library/react']
|
|
209
|
-
}
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
// Post-task validation with result verification
|
|
213
|
-
const validation = await hookManager.executePostTaskValidation({
|
|
214
|
-
task: 'test-generation',
|
|
215
|
-
result: {
|
|
216
|
-
output: generatedTests,
|
|
217
|
-
coverage: 0.95,
|
|
218
|
-
metrics: {
|
|
219
|
-
testsGenerated: 50,
|
|
220
|
-
propertyTests: 10,
|
|
221
|
-
boundaryTests: 15,
|
|
222
|
-
integrationTests: 25
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
// Pre-edit verification before writing test files
|
|
228
|
-
const editCheck = await hookManager.executePreEditVerification({
|
|
229
|
-
filePath: 'tests/generated/user.test.ts',
|
|
230
|
-
operation: 'write',
|
|
231
|
-
content: testFileContent
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
// Post-edit update after test file creation
|
|
235
|
-
const editUpdate = await hookManager.executePostEditUpdate({
|
|
236
|
-
filePath: 'tests/generated/user.test.ts',
|
|
237
|
-
operation: 'write',
|
|
238
|
-
success: true
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
// Session finalization with test suite export
|
|
242
|
-
const finalization = await hookManager.executeSessionEndFinalization({
|
|
243
|
-
sessionId: 'test-generation-v2.0.0',
|
|
244
|
-
exportMetrics: true,
|
|
245
|
-
exportArtifacts: true
|
|
246
|
-
});
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
### Agent Collaboration
|
|
250
|
-
- **QE Analyzer**: Receives code analysis for test planning
|
|
251
|
-
- **QE Validator**: Provides generated tests for validation
|
|
252
|
-
- **QE Optimizer**: Coordinates with performance optimization
|
|
253
|
-
- **QE Reporter**: Shares test metrics and coverage data
|
|
254
|
-
|
|
255
|
-
## Memory Keys
|
|
256
|
-
|
|
257
|
-
### Input Keys
|
|
258
|
-
- `aqe/test-requirements`: Test requirements and constraints
|
|
259
|
-
- `aqe/code-analysis/${MODULE}`: Code analysis data for test generation
|
|
260
|
-
- `aqe/coverage-targets`: Coverage goals and thresholds
|
|
261
|
-
- `aqe/framework-config`: Testing framework configuration
|
|
262
|
-
|
|
263
|
-
### Output Keys
|
|
264
|
-
- `aqe/test-generation/results`: Generated test suites and metadata
|
|
265
|
-
- `aqe/test-files/${SUITE}`: Individual test file content
|
|
266
|
-
- `aqe/coverage-analysis`: Coverage analysis results
|
|
267
|
-
- `aqe/test-metrics`: Performance and quality metrics
|
|
268
|
-
|
|
269
|
-
### Coordination Keys
|
|
270
|
-
- `aqe/test-generation/status`: Current generation status
|
|
271
|
-
- `aqe/test-queue`: Queue of modules pending test generation
|
|
272
|
-
- `aqe/optimization-results`: Sublinear optimization outcomes
|
|
273
|
-
|
|
274
|
-
## Coordination Protocol
|
|
275
|
-
|
|
276
|
-
### Swarm Integration
|
|
277
|
-
|
|
278
|
-
**Native TypeScript coordination (replaces bash commands):**
|
|
279
|
-
|
|
280
|
-
All swarm integration is handled automatically via AQE hooks (Agentic QE native hooks) shown above. The agent coordinates through:
|
|
281
|
-
|
|
282
|
-
- **Memory Store**: Shared context via `this.memoryStore.store()` and `this.memoryStore.retrieve()`
|
|
283
|
-
- **Event Bus**: Real-time coordination via `this.eventBus.emit()` and event handlers
|
|
284
|
-
- **Hook Manager**: Advanced verification via `VerificationHookManager`
|
|
285
|
-
|
|
286
|
-
No external bash commands needed - all coordination is built into the agent's lifecycle hooks.
|
|
287
|
-
|
|
288
|
-
## Learning Protocol (Phase 6 - Option C Implementation)
|
|
289
|
-
|
|
290
|
-
**⚠️ MANDATORY**: When executed via Claude Code Task tool, you MUST call learning MCP tools to persist learning data.
|
|
291
|
-
|
|
292
|
-
### Required Learning Actions (Call AFTER Task Completion)
|
|
293
|
-
|
|
294
|
-
**1. Store Learning Experience:**
|
|
295
|
-
```typescript
|
|
296
|
-
// Call this MCP tool after completing your task
|
|
297
85
|
mcp__agentic_qe__learning_store_experience({
|
|
298
86
|
agentId: "qe-test-generator",
|
|
299
87
|
taskType: "test-generation",
|
|
300
|
-
reward: 0.95,
|
|
88
|
+
reward: 0.95,
|
|
301
89
|
outcome: {
|
|
302
|
-
// Your actual results (agent-specific)
|
|
303
90
|
testsGenerated: 42,
|
|
304
91
|
coverageImprovement: 0.15,
|
|
305
92
|
framework: "jest",
|
|
306
93
|
executionTime: 8000
|
|
307
94
|
},
|
|
308
95
|
metadata: {
|
|
309
|
-
// Additional context (agent-specific)
|
|
310
96
|
algorithm: "ml-property-based",
|
|
311
|
-
framework: "jest",
|
|
312
97
|
testTypes: ["unit", "integration"]
|
|
313
98
|
}
|
|
314
99
|
})
|
|
315
100
|
```
|
|
316
101
|
|
|
317
|
-
|
|
318
|
-
```
|
|
319
|
-
// Store Q-value for the strategy you used
|
|
320
|
-
mcp__agentic_qe__learning_store_qvalue({
|
|
321
|
-
agentId: "qe-test-generator",
|
|
322
|
-
stateKey: "test-generation-state",
|
|
323
|
-
actionKey: "ml-property-based",
|
|
324
|
-
qValue: 0.85, // Expected value of this approach (based on results)
|
|
325
|
-
metadata: {
|
|
326
|
-
// Strategy details (agent-specific)
|
|
327
|
-
algorithmUsed: "ml-property-based",
|
|
328
|
-
successRate: "95%",
|
|
329
|
-
testQuality: "high"
|
|
330
|
-
}
|
|
331
|
-
})
|
|
332
|
-
```
|
|
333
|
-
|
|
334
|
-
**3. Store Successful Patterns:**
|
|
335
|
-
```typescript
|
|
336
|
-
// If you discovered a useful pattern, store it
|
|
102
|
+
Store successful patterns when discovered:
|
|
103
|
+
```javascript
|
|
337
104
|
mcp__agentic_qe__learning_store_pattern({
|
|
338
|
-
agentId: "qe-test-generator",
|
|
339
105
|
pattern: "ML-based property testing generates 40% more edge cases than template-based for complex business logic",
|
|
340
106
|
confidence: 0.95,
|
|
341
107
|
domain: "test-generation",
|
|
342
108
|
metadata: {
|
|
343
|
-
|
|
344
|
-
testPatterns: ["property-based", "boundary-value", "equivalence-partitioning"],
|
|
109
|
+
testPatterns: ["property-based", "boundary-value"],
|
|
345
110
|
effectiveness: 0.92
|
|
346
111
|
}
|
|
347
112
|
})
|
|
348
113
|
```
|
|
349
114
|
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
-
|
|
390
|
-
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
-
|
|
397
|
-
-
|
|
398
|
-
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
expect(result).toBeDefined();
|
|
416
|
-
expect(result.id).toBeDefined();
|
|
417
|
-
});
|
|
418
|
-
|
|
419
|
-
// Boundary value tests
|
|
420
|
-
test('should handle edge cases', () => {
|
|
421
|
-
const boundaryValues = generateBoundaryValues(userSchema);
|
|
422
|
-
boundaryValues.forEach(value => {
|
|
423
|
-
const result = userService.validateUser(value);
|
|
424
|
-
expect(result).toMatchObject({ valid: expect.any(Boolean) });
|
|
425
|
-
});
|
|
426
|
-
});
|
|
427
|
-
});
|
|
428
|
-
```
|
|
429
|
-
|
|
430
|
-
### Cypress Integration
|
|
431
|
-
```javascript
|
|
432
|
-
// Generated Cypress E2E test
|
|
433
|
-
describe('User Registration Flow', () => {
|
|
434
|
-
it('should complete registration with generated data', () => {
|
|
435
|
-
const testData = generateUserTestData({
|
|
436
|
-
scenario: 'happy-path',
|
|
437
|
-
variations: 5
|
|
438
|
-
});
|
|
439
|
-
|
|
440
|
-
testData.forEach(user => {
|
|
441
|
-
cy.visit('/register');
|
|
442
|
-
cy.fillForm(user);
|
|
443
|
-
cy.get('[data-cy=submit]').click();
|
|
444
|
-
cy.url().should('include', '/dashboard');
|
|
445
|
-
});
|
|
446
|
-
});
|
|
447
|
-
});
|
|
448
|
-
```
|
|
449
|
-
|
|
450
|
-
## Sublinear Optimization Algorithms
|
|
451
|
-
|
|
452
|
-
### Coverage-Driven Generation
|
|
453
|
-
```javascript
|
|
454
|
-
// Use sublinear solver for optimal test selection
|
|
455
|
-
const optimalTestSuite = await sublinearSolver.solve({
|
|
456
|
-
matrix: coverageMatrix,
|
|
457
|
-
constraints: {
|
|
458
|
-
minCoverage: 0.95,
|
|
459
|
-
maxTests: 100,
|
|
460
|
-
timeLimit: 300
|
|
461
|
-
},
|
|
462
|
-
optimization: 'coverage-per-test'
|
|
463
|
-
});
|
|
464
|
-
```
|
|
465
|
-
|
|
466
|
-
### Performance Testing
|
|
467
|
-
```javascript
|
|
468
|
-
// Generate performance tests with sublinear analysis
|
|
469
|
-
const performanceTests = generatePerformanceTests({
|
|
470
|
-
endpoints: apiEndpoints,
|
|
471
|
-
loadPatterns: ['linear', 'spike', 'stress'],
|
|
472
|
-
optimizationAlgorithm: 'sublinear-scheduling'
|
|
473
|
-
});
|
|
474
|
-
```
|
|
475
|
-
|
|
476
|
-
## TDD Workflow with Subagents
|
|
477
|
-
|
|
478
|
-
### Overview
|
|
479
|
-
The test generator orchestrates a complete TDD (Test-Driven Development) workflow by delegating to specialized subagents:
|
|
480
|
-
1. **RED Phase**: qe-test-writer - Write failing tests
|
|
481
|
-
2. **GREEN Phase**: qe-test-implementer - Make tests pass
|
|
482
|
-
3. **REFACTOR Phase**: qe-test-refactorer - Improve code quality
|
|
483
|
-
4. **REVIEW Phase**: qe-code-reviewer - Validate quality standards
|
|
484
|
-
|
|
485
|
-
### Orchestration Pattern
|
|
486
|
-
|
|
487
|
-
```typescript
|
|
488
|
-
// Complete TDD workflow with subagent delegation
|
|
489
|
-
async function generateTestSuiteWithTDD(spec: TestSpec): Promise<TDDResult> {
|
|
490
|
-
console.log('🎯 Starting TDD workflow with specialized subagents...');
|
|
491
|
-
|
|
492
|
-
// Step 1: Test Writer (RED phase)
|
|
493
|
-
console.log('📝 Step 1/4: Writing failing tests (RED)...');
|
|
494
|
-
const tests = await delegateToSubagent('qe-test-writer', {
|
|
495
|
-
spec: {
|
|
496
|
-
className: spec.className,
|
|
497
|
-
methods: spec.methods,
|
|
498
|
-
requirements: spec.requirements,
|
|
499
|
-
context: spec.context
|
|
500
|
-
},
|
|
501
|
-
coverage: {
|
|
502
|
-
target: 95,
|
|
503
|
-
includeEdgeCases: true,
|
|
504
|
-
includeErrorPaths: true
|
|
505
|
-
},
|
|
506
|
-
patterns: ['AAA', 'given-when-then'],
|
|
507
|
-
framework: spec.framework || 'jest'
|
|
508
|
-
});
|
|
509
|
-
|
|
510
|
-
console.log(`✅ Generated ${tests.length} failing tests`);
|
|
511
|
-
|
|
512
|
-
// Verify tests fail (RED phase validation)
|
|
513
|
-
const initialTestRun = await runTests(tests);
|
|
514
|
-
if (initialTestRun.passed > 0) {
|
|
515
|
-
throw new Error('Tests should fail initially (RED phase)');
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
// Step 2: Test Implementer (GREEN phase)
|
|
519
|
-
console.log('💚 Step 2/4: Implementing code to pass tests (GREEN)...');
|
|
520
|
-
const implementation = await delegateToSubagent('qe-test-implementer', {
|
|
521
|
-
tests,
|
|
522
|
-
requirements: spec.requirements,
|
|
523
|
-
constraints: {
|
|
524
|
-
maxComplexity: 15,
|
|
525
|
-
usePatterns: ['SOLID', 'dependency-injection'],
|
|
526
|
-
framework: spec.framework || 'jest'
|
|
527
|
-
}
|
|
528
|
-
});
|
|
529
|
-
|
|
530
|
-
console.log(`✅ Implementation complete, ${implementation.testResults.passed}/${implementation.testResults.total} tests passing`);
|
|
531
|
-
|
|
532
|
-
// Verify all tests pass (GREEN phase validation)
|
|
533
|
-
if (implementation.testResults.failed > 0) {
|
|
534
|
-
throw new Error(`${implementation.testResults.failed} tests still failing`);
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
// Step 3: Refactorer (REFACTOR phase)
|
|
538
|
-
console.log('🔧 Step 3/4: Refactoring with tests green (REFACTOR)...');
|
|
539
|
-
const refactored = await delegateToSubagent('qe-test-refactorer', {
|
|
540
|
-
code: implementation.sourceCode,
|
|
541
|
-
tests,
|
|
542
|
-
metrics: {
|
|
543
|
-
targetComplexity: 10,
|
|
544
|
-
targetMaintainability: 85
|
|
545
|
-
}
|
|
546
|
-
});
|
|
547
|
-
|
|
548
|
-
console.log(`✅ Refactoring complete, complexity reduced by ${refactored.improvements.complexityReduction}%`);
|
|
549
|
-
|
|
550
|
-
// Verify tests still pass after refactoring
|
|
551
|
-
const refactorTestRun = await runTests(tests, refactored.code);
|
|
552
|
-
if (refactorTestRun.failed > 0) {
|
|
553
|
-
throw new Error('Tests failed after refactoring - rollback required');
|
|
554
|
-
}
|
|
555
|
-
|
|
556
|
-
// Step 4: Code Reviewer (QUALITY phase)
|
|
557
|
-
console.log('👀 Step 4/4: Quality review and validation...');
|
|
558
|
-
const review = await delegateToSubagent('qe-code-reviewer', {
|
|
559
|
-
code: refactored.code,
|
|
560
|
-
tests,
|
|
561
|
-
policies: ['./policies/code-standards.yaml']
|
|
562
|
-
});
|
|
563
|
-
|
|
564
|
-
// If review fails, apply fixes and retry
|
|
565
|
-
if (!review.approved) {
|
|
566
|
-
console.log(`⚠️ Review failed with ${review.issues.length} issues, applying fixes...`);
|
|
567
|
-
|
|
568
|
-
const fixes = await applyReviewFixes(refactored.code, review.issues);
|
|
569
|
-
const fixedTestRun = await runTests(tests, fixes.code);
|
|
570
|
-
|
|
571
|
-
if (fixedTestRun.passed === tests.length) {
|
|
572
|
-
console.log('✅ Fixes applied successfully, all tests passing');
|
|
573
|
-
return {
|
|
574
|
-
tests,
|
|
575
|
-
implementation: fixes.code,
|
|
576
|
-
review: { ...review, approved: true },
|
|
577
|
-
metrics: {
|
|
578
|
-
coverage: implementation.coverage,
|
|
579
|
-
complexity: fixes.metrics.complexity,
|
|
580
|
-
quality: review.metrics
|
|
581
|
-
},
|
|
582
|
-
workflow: 'tdd-red-green-refactor-review'
|
|
583
|
-
};
|
|
584
|
-
} else {
|
|
585
|
-
throw new Error('Unable to fix all review issues while keeping tests passing');
|
|
586
|
-
}
|
|
587
|
-
}
|
|
588
|
-
|
|
589
|
-
console.log('✅ TDD workflow complete! All phases passed.');
|
|
590
|
-
|
|
591
|
-
return {
|
|
592
|
-
tests,
|
|
593
|
-
implementation: refactored.code,
|
|
594
|
-
review,
|
|
595
|
-
metrics: {
|
|
596
|
-
coverage: implementation.coverage,
|
|
597
|
-
complexity: refactored.metrics.complexity,
|
|
598
|
-
quality: review.metrics
|
|
599
|
-
},
|
|
600
|
-
workflow: 'tdd-red-green-refactor-review'
|
|
601
|
-
};
|
|
602
|
-
}
|
|
603
|
-
```
|
|
604
|
-
|
|
605
|
-
### Subagent Communication
|
|
606
|
-
|
|
607
|
-
```typescript
|
|
608
|
-
// Event-driven coordination between subagents
|
|
609
|
-
eventBus.on('subagent:test-writer:started', (data) => {
|
|
610
|
-
console.log(`📝 Test Writer: Analyzing ${data.spec.requirements.length} requirements...`);
|
|
611
|
-
});
|
|
612
|
-
|
|
613
|
-
eventBus.on('subagent:test-writer:completed', (data) => {
|
|
614
|
-
console.log(`✅ Test Writer: Generated ${data.tests.length} tests with ${data.coverage.expectedCoverage}% coverage spec`);
|
|
615
|
-
});
|
|
616
|
-
|
|
617
|
-
eventBus.on('subagent:test-implementer:progress', (data) => {
|
|
618
|
-
console.log(`💚 Test Implementer: ${data.testsPassed}/${data.testsTotal} tests passing (${Math.round(data.testsPassed/data.testsTotal*100)}%)`);
|
|
619
|
-
});
|
|
620
|
-
|
|
621
|
-
eventBus.on('subagent:test-refactorer:improved', (data) => {
|
|
622
|
-
console.log(`🔧 Refactorer: Reduced complexity from ${data.before.complexity} to ${data.after.complexity}`);
|
|
623
|
-
});
|
|
624
|
-
|
|
625
|
-
eventBus.on('subagent:code-reviewer:issue', (data) => {
|
|
626
|
-
console.warn(`⚠️ Code Reviewer: ${data.severity} issue - ${data.message}`);
|
|
627
|
-
});
|
|
628
|
-
```
|
|
629
|
-
|
|
630
|
-
### Memory Coordination
|
|
631
|
-
|
|
632
|
-
```typescript
|
|
633
|
-
// Store TDD workflow progress
|
|
634
|
-
await this.memoryStore.store('aqe/tdd-workflow/status', {
|
|
635
|
-
phase: 'red', // red, green, refactor, review
|
|
636
|
-
testsWritten: tests.length,
|
|
637
|
-
testsPassing: 0,
|
|
638
|
-
timestamp: Date.now()
|
|
639
|
-
}, {
|
|
640
|
-
partition: 'coordination'
|
|
641
|
-
});
|
|
642
|
-
|
|
643
|
-
// Share artifacts between subagents
|
|
644
|
-
await this.memoryStore.store('aqe/tdd-workflow/tests', tests, {
|
|
645
|
-
partition: 'subagent_coordination',
|
|
646
|
-
ttl: 86400 // 24 hours
|
|
647
|
-
});
|
|
648
|
-
|
|
649
|
-
// Track metrics across workflow
|
|
650
|
-
await this.memoryStore.store('aqe/tdd-workflow/metrics', {
|
|
651
|
-
coverage: implementation.coverage,
|
|
652
|
-
complexity: refactored.metrics.complexity,
|
|
653
|
-
quality: review.metrics,
|
|
654
|
-
duration: workflowDuration
|
|
655
|
-
}, {
|
|
656
|
-
partition: 'metrics',
|
|
657
|
-
ttl: 604800 // 7 days
|
|
658
|
-
});
|
|
659
|
-
```
|
|
660
|
-
|
|
661
|
-
### Feedback Loop
|
|
662
|
-
|
|
663
|
-
When quality validation fails, the workflow automatically iterates:
|
|
664
|
-
|
|
665
|
-
```typescript
|
|
666
|
-
// Iteration pattern for quality improvements
|
|
667
|
-
async function iterateTDDWorkflow(spec: TestSpec, previousAttempt: TDDResult): Promise<TDDResult> {
|
|
668
|
-
// Analyze what went wrong
|
|
669
|
-
const issues = previousAttempt.review.issues;
|
|
670
|
-
|
|
671
|
-
// Enhance requirements based on issues
|
|
672
|
-
const enhancedSpec = {
|
|
673
|
-
...spec,
|
|
674
|
-
requirements: [
|
|
675
|
-
...spec.requirements,
|
|
676
|
-
...issues.map(i => i.recommendation)
|
|
677
|
-
]
|
|
678
|
-
};
|
|
679
|
-
|
|
680
|
-
// Re-run workflow with enhanced requirements
|
|
681
|
-
return await generateTestSuiteWithTDD(enhancedSpec);
|
|
682
|
-
}
|
|
683
|
-
```
|
|
684
|
-
|
|
685
|
-
## Complete TDD Workflow Orchestration
|
|
686
|
-
|
|
687
|
-
This section provides a complete TypeScript orchestration example demonstrating proper coordination between the three TDD subagents using memory coordination through the `aqe/tdd/cycle-{id}/*` namespace.
|
|
688
|
-
|
|
689
|
-
### Full Orchestration Example
|
|
690
|
-
|
|
691
|
-
```typescript
|
|
692
|
-
import { v4 as uuidv4 } from 'uuid';
|
|
693
|
-
|
|
694
|
-
// Type definitions
|
|
695
|
-
interface TestSpec {
|
|
696
|
-
module: string;
|
|
697
|
-
className: string;
|
|
698
|
-
methods: string[];
|
|
699
|
-
requirements: string[];
|
|
700
|
-
framework: 'jest' | 'vitest' | 'mocha';
|
|
701
|
-
context?: string;
|
|
702
|
-
}
|
|
703
|
-
|
|
704
|
-
interface TDDCycleResult {
|
|
705
|
-
cycleId: string;
|
|
706
|
-
tests: string;
|
|
707
|
-
implementation: string;
|
|
708
|
-
quality: QualityMetrics;
|
|
709
|
-
phases: {
|
|
710
|
-
red: PhaseResult;
|
|
711
|
-
green: PhaseResult;
|
|
712
|
-
refactor: PhaseResult;
|
|
713
|
-
};
|
|
714
|
-
}
|
|
715
|
-
|
|
716
|
-
interface QualityMetrics {
|
|
717
|
-
coverage: number;
|
|
718
|
-
complexity: number;
|
|
719
|
-
maintainability: number;
|
|
720
|
-
testCount: number;
|
|
721
|
-
}
|
|
722
|
-
|
|
723
|
-
interface PhaseResult {
|
|
724
|
-
success: boolean;
|
|
725
|
-
duration: number;
|
|
726
|
-
artifacts: string[];
|
|
727
|
-
metrics: Record<string, number>;
|
|
728
|
-
}
|
|
729
|
-
|
|
730
|
-
interface RedPhaseOutput {
|
|
731
|
-
readyForHandoff: boolean;
|
|
732
|
-
allTestsFailing: boolean;
|
|
733
|
-
testFilePath: string;
|
|
734
|
-
testCount: number;
|
|
735
|
-
failureReasons: string[];
|
|
736
|
-
coverage: { expected: number };
|
|
737
|
-
}
|
|
738
|
-
|
|
739
|
-
interface GreenPhaseOutput {
|
|
740
|
-
readyForHandoff: boolean;
|
|
741
|
-
allTestsPassing: boolean;
|
|
742
|
-
implFilePath: string;
|
|
743
|
-
testResults: { passed: number; failed: number; total: number };
|
|
744
|
-
coverage: { actual: number };
|
|
745
|
-
}
|
|
746
|
-
|
|
747
|
-
interface RefactorPhaseOutput {
|
|
748
|
-
success: boolean;
|
|
749
|
-
testsStillPassing: boolean;
|
|
750
|
-
qualityMetrics: QualityMetrics;
|
|
751
|
-
improvements: {
|
|
752
|
-
complexityReduction: number;
|
|
753
|
-
maintainabilityImprovement: number;
|
|
754
|
-
refactorings: string[];
|
|
755
|
-
};
|
|
756
|
-
}
|
|
757
|
-
|
|
758
|
-
// Memory store interface (from AQE infrastructure)
|
|
759
|
-
interface MemoryStore {
|
|
760
|
-
store(key: string, value: any, options?: { partition?: string; ttl?: number }): Promise<void>;
|
|
761
|
-
retrieve(key: string, options?: { partition?: string }): Promise<any>;
|
|
762
|
-
}
|
|
763
|
-
|
|
764
|
-
// Event bus interface
|
|
765
|
-
interface EventBus {
|
|
766
|
-
emit(event: string, data: any): void;
|
|
767
|
-
on(event: string, handler: (data: any) => void): void;
|
|
768
|
-
}
|
|
769
|
-
|
|
770
|
-
/**
|
|
771
|
-
* Complete TDD Cycle Orchestrator
|
|
772
|
-
*
|
|
773
|
-
* Coordinates the RED-GREEN-REFACTOR cycle across specialized subagents
|
|
774
|
-
* with full memory coordination and phase validation.
|
|
775
|
-
*/
|
|
776
|
-
async function orchestrateTDDCycle(
|
|
777
|
-
spec: TestSpec,
|
|
778
|
-
memory: MemoryStore,
|
|
779
|
-
eventBus: EventBus
|
|
780
|
-
): Promise<TDDCycleResult> {
|
|
781
|
-
const cycleId = uuidv4();
|
|
782
|
-
const startTime = Date.now();
|
|
783
|
-
|
|
784
|
-
console.log(`🎯 Starting TDD cycle ${cycleId} for ${spec.module}`);
|
|
785
|
-
|
|
786
|
-
// Store initial context for all subagents
|
|
787
|
-
await memory.store(`aqe/tdd/cycle-${cycleId}/context`, {
|
|
788
|
-
cycleId,
|
|
789
|
-
targetModule: spec.module,
|
|
790
|
-
className: spec.className,
|
|
791
|
-
methods: spec.methods,
|
|
792
|
-
requirements: spec.requirements,
|
|
793
|
-
framework: spec.framework,
|
|
794
|
-
context: spec.context,
|
|
795
|
-
startTime,
|
|
796
|
-
status: 'initialized'
|
|
797
|
-
}, {
|
|
798
|
-
partition: 'coordination',
|
|
799
|
-
ttl: 86400 // 24 hours
|
|
800
|
-
});
|
|
801
|
-
|
|
802
|
-
// Emit cycle start event
|
|
803
|
-
eventBus.emit('tdd:cycle:started', {
|
|
804
|
-
cycleId,
|
|
805
|
-
module: spec.module,
|
|
806
|
-
timestamp: startTime
|
|
807
|
-
});
|
|
808
|
-
|
|
809
|
-
// ═══════════════════════════════════════════════════════════════════
|
|
810
|
-
// RED PHASE - Write Failing Tests
|
|
811
|
-
// ═══════════════════════════════════════════════════════════════════
|
|
812
|
-
console.log(`📝 Phase 1/3: RED - Writing failing tests...`);
|
|
813
|
-
|
|
814
|
-
await memory.store(`aqe/tdd/cycle-${cycleId}/status`, {
|
|
815
|
-
phase: 'red',
|
|
816
|
-
status: 'in_progress',
|
|
817
|
-
timestamp: Date.now()
|
|
818
|
-
}, { partition: 'coordination' });
|
|
819
|
-
|
|
820
|
-
eventBus.emit('tdd:phase:started', {
|
|
821
|
-
cycleId,
|
|
822
|
-
phase: 'red',
|
|
823
|
-
agent: 'qe-test-writer'
|
|
824
|
-
});
|
|
825
|
-
|
|
826
|
-
// Spawn the test writer subagent
|
|
827
|
-
// In Claude Code, this would be: Task("Write failing tests", ..., "qe-test-writer")
|
|
828
|
-
const redResult = await executeSubagent('qe-test-writer', {
|
|
829
|
-
task: 'write-failing-tests',
|
|
830
|
-
cycleId,
|
|
831
|
-
spec: {
|
|
832
|
-
className: spec.className,
|
|
833
|
-
methods: spec.methods,
|
|
834
|
-
requirements: spec.requirements,
|
|
835
|
-
context: spec.context
|
|
836
|
-
},
|
|
837
|
-
coverage: {
|
|
838
|
-
target: 95,
|
|
839
|
-
includeEdgeCases: true,
|
|
840
|
-
includeErrorPaths: true,
|
|
841
|
-
includeBoundaryValues: true
|
|
842
|
-
},
|
|
843
|
-
patterns: ['AAA', 'given-when-then'],
|
|
844
|
-
framework: spec.framework,
|
|
845
|
-
memoryKeys: {
|
|
846
|
-
input: `aqe/tdd/cycle-${cycleId}/context`,
|
|
847
|
-
output: `aqe/tdd/cycle-${cycleId}/red/tests`
|
|
848
|
-
}
|
|
849
|
-
});
|
|
850
|
-
|
|
851
|
-
// Validate RED phase output
|
|
852
|
-
const redOutput: RedPhaseOutput = await memory.retrieve(
|
|
853
|
-
`aqe/tdd/cycle-${cycleId}/red/tests`,
|
|
854
|
-
{ partition: 'coordination' }
|
|
855
|
-
);
|
|
856
|
-
|
|
857
|
-
if (!redOutput) {
|
|
858
|
-
throw new Error(`RED phase failed: No output found for cycle ${cycleId}`);
|
|
859
|
-
}
|
|
860
|
-
|
|
861
|
-
if (!redOutput.readyForHandoff) {
|
|
862
|
-
throw new Error(`RED phase incomplete: Test writer not ready for handoff`);
|
|
863
|
-
}
|
|
864
|
-
|
|
865
|
-
if (!redOutput.allTestsFailing) {
|
|
866
|
-
throw new Error(
|
|
867
|
-
`RED phase validation failed: Tests should fail initially. ` +
|
|
868
|
-
`Expected all tests to fail but some passed.`
|
|
869
|
-
);
|
|
870
|
-
}
|
|
871
|
-
|
|
872
|
-
const redDuration = Date.now() - startTime;
|
|
873
|
-
console.log(`✅ RED phase complete: ${redOutput.testCount} failing tests written`);
|
|
874
|
-
console.log(` File: ${redOutput.testFilePath}`);
|
|
875
|
-
console.log(` Duration: ${redDuration}ms`);
|
|
876
|
-
|
|
877
|
-
eventBus.emit('tdd:phase:completed', {
|
|
878
|
-
cycleId,
|
|
879
|
-
phase: 'red',
|
|
880
|
-
duration: redDuration,
|
|
881
|
-
testCount: redOutput.testCount
|
|
882
|
-
});
|
|
883
|
-
|
|
884
|
-
// ═══════════════════════════════════════════════════════════════════
|
|
885
|
-
// GREEN PHASE - Implement to Pass Tests
|
|
886
|
-
// ═══════════════════════════════════════════════════════════════════
|
|
887
|
-
console.log(`💚 Phase 2/3: GREEN - Implementing code to pass tests...`);
|
|
888
|
-
|
|
889
|
-
const greenStartTime = Date.now();
|
|
890
|
-
|
|
891
|
-
await memory.store(`aqe/tdd/cycle-${cycleId}/status`, {
|
|
892
|
-
phase: 'green',
|
|
893
|
-
status: 'in_progress',
|
|
894
|
-
timestamp: Date.now()
|
|
895
|
-
}, { partition: 'coordination' });
|
|
896
|
-
|
|
897
|
-
eventBus.emit('tdd:phase:started', {
|
|
898
|
-
cycleId,
|
|
899
|
-
phase: 'green',
|
|
900
|
-
agent: 'qe-test-implementer'
|
|
901
|
-
});
|
|
902
|
-
|
|
903
|
-
// Spawn the test implementer subagent
|
|
904
|
-
// In Claude Code, this would be: Task("Implement to pass tests", ..., "qe-test-implementer")
|
|
905
|
-
const greenResult = await executeSubagent('qe-test-implementer', {
|
|
906
|
-
task: 'implement-to-pass',
|
|
907
|
-
cycleId,
|
|
908
|
-
testFilePath: redOutput.testFilePath,
|
|
909
|
-
requirements: spec.requirements,
|
|
910
|
-
constraints: {
|
|
911
|
-
maxComplexity: 15,
|
|
912
|
-
usePatterns: ['SOLID', 'dependency-injection'],
|
|
913
|
-
minimalImplementation: true // Only write what's needed to pass
|
|
914
|
-
},
|
|
915
|
-
framework: spec.framework,
|
|
916
|
-
memoryKeys: {
|
|
917
|
-
input: `aqe/tdd/cycle-${cycleId}/red/tests`,
|
|
918
|
-
output: `aqe/tdd/cycle-${cycleId}/green/impl`
|
|
919
|
-
}
|
|
920
|
-
});
|
|
921
|
-
|
|
922
|
-
// Validate GREEN phase output
|
|
923
|
-
const greenOutput: GreenPhaseOutput = await memory.retrieve(
|
|
924
|
-
`aqe/tdd/cycle-${cycleId}/green/impl`,
|
|
925
|
-
{ partition: 'coordination' }
|
|
926
|
-
);
|
|
927
|
-
|
|
928
|
-
if (!greenOutput) {
|
|
929
|
-
throw new Error(`GREEN phase failed: No output found for cycle ${cycleId}`);
|
|
930
|
-
}
|
|
931
|
-
|
|
932
|
-
if (!greenOutput.readyForHandoff) {
|
|
933
|
-
throw new Error(`GREEN phase incomplete: Implementer not ready for handoff`);
|
|
934
|
-
}
|
|
935
|
-
|
|
936
|
-
if (!greenOutput.allTestsPassing) {
|
|
937
|
-
const { passed, failed, total } = greenOutput.testResults;
|
|
938
|
-
throw new Error(
|
|
939
|
-
`GREEN phase validation failed: Not all tests passing. ` +
|
|
940
|
-
`${passed}/${total} passed, ${failed} failed.`
|
|
941
|
-
);
|
|
942
|
-
}
|
|
943
|
-
|
|
944
|
-
const greenDuration = Date.now() - greenStartTime;
|
|
945
|
-
console.log(`✅ GREEN phase complete: All ${greenOutput.testResults.total} tests passing`);
|
|
946
|
-
console.log(` File: ${greenOutput.implFilePath}`);
|
|
947
|
-
console.log(` Coverage: ${greenOutput.coverage.actual}%`);
|
|
948
|
-
console.log(` Duration: ${greenDuration}ms`);
|
|
949
|
-
|
|
950
|
-
eventBus.emit('tdd:phase:completed', {
|
|
951
|
-
cycleId,
|
|
952
|
-
phase: 'green',
|
|
953
|
-
duration: greenDuration,
|
|
954
|
-
testResults: greenOutput.testResults,
|
|
955
|
-
coverage: greenOutput.coverage.actual
|
|
956
|
-
});
|
|
957
|
-
|
|
958
|
-
// ═══════════════════════════════════════════════════════════════════
|
|
959
|
-
// REFACTOR PHASE - Improve Code Quality
|
|
960
|
-
// ═══════════════════════════════════════════════════════════════════
|
|
961
|
-
console.log(`🔧 Phase 3/3: REFACTOR - Improving code quality...`);
|
|
962
|
-
|
|
963
|
-
const refactorStartTime = Date.now();
|
|
964
|
-
|
|
965
|
-
await memory.store(`aqe/tdd/cycle-${cycleId}/status`, {
|
|
966
|
-
phase: 'refactor',
|
|
967
|
-
status: 'in_progress',
|
|
968
|
-
timestamp: Date.now()
|
|
969
|
-
}, { partition: 'coordination' });
|
|
970
|
-
|
|
971
|
-
eventBus.emit('tdd:phase:started', {
|
|
972
|
-
cycleId,
|
|
973
|
-
phase: 'refactor',
|
|
974
|
-
agent: 'qe-test-refactorer'
|
|
975
|
-
});
|
|
976
|
-
|
|
977
|
-
// Spawn the refactorer subagent
|
|
978
|
-
// In Claude Code, this would be: Task("Refactor implementation", ..., "qe-test-refactorer")
|
|
979
|
-
const refactorResult = await executeSubagent('qe-test-refactorer', {
|
|
980
|
-
task: 'refactor-with-tests-green',
|
|
981
|
-
cycleId,
|
|
982
|
-
implFilePath: greenOutput.implFilePath,
|
|
983
|
-
testFilePath: redOutput.testFilePath,
|
|
984
|
-
metrics: {
|
|
985
|
-
targetComplexity: 10,
|
|
986
|
-
targetMaintainability: 85,
|
|
987
|
-
maxMethodLength: 20,
|
|
988
|
-
maxFileLength: 300
|
|
989
|
-
},
|
|
990
|
-
refactoringPatterns: [
|
|
991
|
-
'extract-method',
|
|
992
|
-
'rename-variable',
|
|
993
|
-
'simplify-conditional',
|
|
994
|
-
'remove-duplication'
|
|
995
|
-
],
|
|
996
|
-
memoryKeys: {
|
|
997
|
-
input: `aqe/tdd/cycle-${cycleId}/green/impl`,
|
|
998
|
-
output: `aqe/tdd/cycle-${cycleId}/refactor/result`
|
|
999
|
-
}
|
|
1000
|
-
});
|
|
1001
|
-
|
|
1002
|
-
// Validate REFACTOR phase output
|
|
1003
|
-
const refactorOutput: RefactorPhaseOutput = await memory.retrieve(
|
|
1004
|
-
`aqe/tdd/cycle-${cycleId}/refactor/result`,
|
|
1005
|
-
{ partition: 'coordination' }
|
|
1006
|
-
);
|
|
1007
|
-
|
|
1008
|
-
if (!refactorOutput) {
|
|
1009
|
-
throw new Error(`REFACTOR phase failed: No output found for cycle ${cycleId}`);
|
|
1010
|
-
}
|
|
1011
|
-
|
|
1012
|
-
if (!refactorOutput.testsStillPassing) {
|
|
1013
|
-
throw new Error(
|
|
1014
|
-
`REFACTOR phase validation failed: Tests broke during refactoring. ` +
|
|
1015
|
-
`Rolling back to pre-refactor state.`
|
|
1016
|
-
);
|
|
1017
|
-
}
|
|
1018
|
-
|
|
1019
|
-
const refactorDuration = Date.now() - refactorStartTime;
|
|
1020
|
-
const totalDuration = Date.now() - startTime;
|
|
1021
|
-
|
|
1022
|
-
console.log(`✅ REFACTOR phase complete`);
|
|
1023
|
-
console.log(` Complexity reduced by: ${refactorOutput.improvements.complexityReduction}%`);
|
|
1024
|
-
console.log(` Maintainability improved by: ${refactorOutput.improvements.maintainabilityImprovement}%`);
|
|
1025
|
-
console.log(` Refactorings applied: ${refactorOutput.improvements.refactorings.join(', ')}`);
|
|
1026
|
-
console.log(` Duration: ${refactorDuration}ms`);
|
|
1027
|
-
|
|
1028
|
-
eventBus.emit('tdd:phase:completed', {
|
|
1029
|
-
cycleId,
|
|
1030
|
-
phase: 'refactor',
|
|
1031
|
-
duration: refactorDuration,
|
|
1032
|
-
improvements: refactorOutput.improvements
|
|
1033
|
-
});
|
|
1034
|
-
|
|
1035
|
-
// ═══════════════════════════════════════════════════════════════════
|
|
1036
|
-
// CYCLE COMPLETE - Store Final Results
|
|
1037
|
-
// ═══════════════════════════════════════════════════════════════════
|
|
1038
|
-
const result: TDDCycleResult = {
|
|
1039
|
-
cycleId,
|
|
1040
|
-
tests: redOutput.testFilePath,
|
|
1041
|
-
implementation: greenOutput.implFilePath,
|
|
1042
|
-
quality: refactorOutput.qualityMetrics,
|
|
1043
|
-
phases: {
|
|
1044
|
-
red: {
|
|
1045
|
-
success: true,
|
|
1046
|
-
duration: redDuration,
|
|
1047
|
-
artifacts: [redOutput.testFilePath],
|
|
1048
|
-
metrics: {
|
|
1049
|
-
testCount: redOutput.testCount,
|
|
1050
|
-
expectedCoverage: redOutput.coverage.expected
|
|
1051
|
-
}
|
|
1052
|
-
},
|
|
1053
|
-
green: {
|
|
1054
|
-
success: true,
|
|
1055
|
-
duration: greenDuration,
|
|
1056
|
-
artifacts: [greenOutput.implFilePath],
|
|
1057
|
-
metrics: {
|
|
1058
|
-
testsPassed: greenOutput.testResults.passed,
|
|
1059
|
-
coverage: greenOutput.coverage.actual
|
|
1060
|
-
}
|
|
1061
|
-
},
|
|
1062
|
-
refactor: {
|
|
1063
|
-
success: true,
|
|
1064
|
-
duration: refactorDuration,
|
|
1065
|
-
artifacts: [greenOutput.implFilePath], // Updated in place
|
|
1066
|
-
metrics: {
|
|
1067
|
-
complexity: refactorOutput.qualityMetrics.complexity,
|
|
1068
|
-
maintainability: refactorOutput.qualityMetrics.maintainability
|
|
1069
|
-
}
|
|
1070
|
-
}
|
|
1071
|
-
}
|
|
1072
|
-
};
|
|
1073
|
-
|
|
1074
|
-
// Store final cycle results
|
|
1075
|
-
await memory.store(`aqe/tdd/cycle-${cycleId}/result`, result, {
|
|
1076
|
-
partition: 'coordination',
|
|
1077
|
-
ttl: 604800 // 7 days
|
|
1078
|
-
});
|
|
1079
|
-
|
|
1080
|
-
// Update status to complete
|
|
1081
|
-
await memory.store(`aqe/tdd/cycle-${cycleId}/status`, {
|
|
1082
|
-
phase: 'complete',
|
|
1083
|
-
status: 'success',
|
|
1084
|
-
totalDuration,
|
|
1085
|
-
timestamp: Date.now()
|
|
1086
|
-
}, { partition: 'coordination' });
|
|
1087
|
-
|
|
1088
|
-
// Emit cycle completion event
|
|
1089
|
-
eventBus.emit('tdd:cycle:completed', {
|
|
1090
|
-
cycleId,
|
|
1091
|
-
module: spec.module,
|
|
1092
|
-
duration: totalDuration,
|
|
1093
|
-
quality: refactorOutput.qualityMetrics
|
|
1094
|
-
});
|
|
1095
|
-
|
|
1096
|
-
console.log(`\n🎉 TDD Cycle ${cycleId} Complete!`);
|
|
1097
|
-
console.log(` Total Duration: ${totalDuration}ms`);
|
|
1098
|
-
console.log(` Test File: ${redOutput.testFilePath}`);
|
|
1099
|
-
console.log(` Implementation: ${greenOutput.implFilePath}`);
|
|
1100
|
-
console.log(` Coverage: ${refactorOutput.qualityMetrics.coverage}%`);
|
|
1101
|
-
console.log(` Complexity: ${refactorOutput.qualityMetrics.complexity}`);
|
|
1102
|
-
console.log(` Maintainability: ${refactorOutput.qualityMetrics.maintainability}`);
|
|
1103
|
-
|
|
1104
|
-
return result;
|
|
1105
|
-
}
|
|
1106
|
-
|
|
1107
|
-
// Helper function to execute subagent (placeholder for actual Task tool invocation)
|
|
1108
|
-
async function executeSubagent(agentName: string, params: any): Promise<void> {
|
|
1109
|
-
// In Claude Code, this would be replaced with:
|
|
1110
|
-
// await Task("Task description", JSON.stringify(params), agentName);
|
|
1111
|
-
|
|
1112
|
-
// The subagent reads input from memoryKeys.input and writes output to memoryKeys.output
|
|
1113
|
-
console.log(` → Executing ${agentName}...`);
|
|
1114
|
-
}
|
|
1115
|
-
```
|
|
1116
|
-
|
|
1117
|
-
### Usage Example
|
|
1118
|
-
|
|
1119
|
-
```typescript
|
|
1120
|
-
// Example: Running a TDD cycle for a UserService
|
|
1121
|
-
async function example() {
|
|
1122
|
-
// Initialize memory and event bus (from AQE infrastructure)
|
|
1123
|
-
const memory = new MemoryStore();
|
|
1124
|
-
const eventBus = new EventBus();
|
|
1125
|
-
|
|
1126
|
-
// Define the test specification
|
|
1127
|
-
const spec: TestSpec = {
|
|
1128
|
-
module: 'src/services/UserService.ts',
|
|
1129
|
-
className: 'UserService',
|
|
1130
|
-
methods: ['createUser', 'updateUser', 'deleteUser', 'findById'],
|
|
1131
|
-
requirements: [
|
|
1132
|
-
'MUST validate email format before creating user',
|
|
1133
|
-
'MUST hash password using bcrypt with salt rounds 10',
|
|
1134
|
-
'MUST throw UserNotFoundError if user does not exist',
|
|
1135
|
-
'MUST emit UserCreated event after successful creation',
|
|
1136
|
-
'MUST support pagination for list operations'
|
|
1137
|
-
],
|
|
1138
|
-
framework: 'jest',
|
|
1139
|
-
context: 'E-commerce platform user management service'
|
|
1140
|
-
};
|
|
1141
|
-
|
|
1142
|
-
try {
|
|
1143
|
-
// Run the TDD cycle
|
|
1144
|
-
const result = await orchestrateTDDCycle(spec, memory, eventBus);
|
|
1145
|
-
|
|
1146
|
-
console.log('\n📊 TDD Cycle Summary:');
|
|
1147
|
-
console.log(` Tests: ${result.tests}`);
|
|
1148
|
-
console.log(` Implementation: ${result.implementation}`);
|
|
1149
|
-
console.log(` Coverage: ${result.quality.coverage}%`);
|
|
1150
|
-
console.log(` Test Count: ${result.quality.testCount}`);
|
|
1151
|
-
|
|
1152
|
-
return result;
|
|
1153
|
-
} catch (error) {
|
|
1154
|
-
console.error('TDD Cycle failed:', error.message);
|
|
1155
|
-
|
|
1156
|
-
// Retrieve cycle status for debugging
|
|
1157
|
-
const cycleId = error.message.match(/cycle (\w+)/)?.[1];
|
|
1158
|
-
if (cycleId) {
|
|
1159
|
-
const status = await memory.retrieve(
|
|
1160
|
-
`aqe/tdd/cycle-${cycleId}/status`,
|
|
1161
|
-
{ partition: 'coordination' }
|
|
1162
|
-
);
|
|
1163
|
-
console.error('Last known status:', status);
|
|
1164
|
-
}
|
|
1165
|
-
|
|
1166
|
-
throw error;
|
|
1167
|
-
}
|
|
1168
|
-
}
|
|
1169
|
-
|
|
1170
|
-
// Run the example
|
|
1171
|
-
example().catch(console.error);
|
|
1172
|
-
```
|
|
1173
|
-
|
|
1174
|
-
### Event Monitoring
|
|
1175
|
-
|
|
1176
|
-
```typescript
|
|
1177
|
-
// Monitor TDD cycle progress through events
|
|
1178
|
-
function setupTDDMonitoring(eventBus: EventBus) {
|
|
1179
|
-
// Cycle lifecycle events
|
|
1180
|
-
eventBus.on('tdd:cycle:started', (data) => {
|
|
1181
|
-
console.log(`\n${'═'.repeat(60)}`);
|
|
1182
|
-
console.log(`🚀 TDD Cycle Started: ${data.cycleId}`);
|
|
1183
|
-
console.log(` Module: ${data.module}`);
|
|
1184
|
-
console.log(`${'═'.repeat(60)}\n`);
|
|
1185
|
-
});
|
|
1186
|
-
|
|
1187
|
-
eventBus.on('tdd:cycle:completed', (data) => {
|
|
1188
|
-
console.log(`\n${'═'.repeat(60)}`);
|
|
1189
|
-
console.log(`✅ TDD Cycle Completed: ${data.cycleId}`);
|
|
1190
|
-
console.log(` Duration: ${data.duration}ms`);
|
|
1191
|
-
console.log(` Coverage: ${data.quality.coverage}%`);
|
|
1192
|
-
console.log(` Maintainability: ${data.quality.maintainability}`);
|
|
1193
|
-
console.log(`${'═'.repeat(60)}\n`);
|
|
1194
|
-
});
|
|
1195
|
-
|
|
1196
|
-
// Phase progress events
|
|
1197
|
-
eventBus.on('tdd:phase:started', (data) => {
|
|
1198
|
-
const phaseEmoji = {
|
|
1199
|
-
red: '📝',
|
|
1200
|
-
green: '💚',
|
|
1201
|
-
refactor: '🔧'
|
|
1202
|
-
}[data.phase] || '▶️';
|
|
1203
|
-
|
|
1204
|
-
console.log(`${phaseEmoji} ${data.phase.toUpperCase()} phase started`);
|
|
1205
|
-
console.log(` Agent: ${data.agent}`);
|
|
1206
|
-
});
|
|
1207
|
-
|
|
1208
|
-
eventBus.on('tdd:phase:completed', (data) => {
|
|
1209
|
-
const phaseEmoji = {
|
|
1210
|
-
red: '📝',
|
|
1211
|
-
green: '💚',
|
|
1212
|
-
refactor: '🔧'
|
|
1213
|
-
}[data.phase] || '✅';
|
|
1214
|
-
|
|
1215
|
-
console.log(`${phaseEmoji} ${data.phase.toUpperCase()} phase completed`);
|
|
1216
|
-
console.log(` Duration: ${data.duration}ms`);
|
|
1217
|
-
|
|
1218
|
-
// Phase-specific metrics
|
|
1219
|
-
if (data.phase === 'red') {
|
|
1220
|
-
console.log(` Tests written: ${data.testCount}`);
|
|
1221
|
-
} else if (data.phase === 'green') {
|
|
1222
|
-
console.log(` Tests passing: ${data.testResults.passed}/${data.testResults.total}`);
|
|
1223
|
-
console.log(` Coverage: ${data.coverage}%`);
|
|
1224
|
-
} else if (data.phase === 'refactor') {
|
|
1225
|
-
console.log(` Complexity reduction: ${data.improvements.complexityReduction}%`);
|
|
1226
|
-
}
|
|
1227
|
-
});
|
|
1228
|
-
|
|
1229
|
-
// Error handling
|
|
1230
|
-
eventBus.on('tdd:cycle:error', (data) => {
|
|
1231
|
-
console.error(`\n❌ TDD Cycle Error: ${data.cycleId}`);
|
|
1232
|
-
console.error(` Phase: ${data.phase}`);
|
|
1233
|
-
console.error(` Error: ${data.error}`);
|
|
1234
|
-
});
|
|
1235
|
-
}
|
|
1236
|
-
|
|
1237
|
-
// Usage
|
|
1238
|
-
const eventBus = new EventBus();
|
|
1239
|
-
setupTDDMonitoring(eventBus);
|
|
1240
|
-
```
|
|
1241
|
-
|
|
1242
|
-
### Memory Namespace Structure
|
|
1243
|
-
|
|
1244
|
-
The TDD orchestration uses a structured memory namespace for coordination:
|
|
1245
|
-
|
|
1246
|
-
```
|
|
1247
|
-
aqe/tdd/cycle-{cycleId}/
|
|
1248
|
-
├── context # Initial test specification and context
|
|
1249
|
-
├── status # Current cycle status and phase
|
|
1250
|
-
├── red/
|
|
1251
|
-
│ └── tests # Test writer output (failing tests)
|
|
1252
|
-
├── green/
|
|
1253
|
-
│ └── impl # Implementer output (passing implementation)
|
|
1254
|
-
├── refactor/
|
|
1255
|
-
│ └── result # Refactorer output (improved code)
|
|
1256
|
-
└── result # Final cycle result with all metrics
|
|
1257
|
-
```
|
|
1258
|
-
|
|
1259
|
-
Each subagent:
|
|
1260
|
-
1. Reads from the previous phase's output key
|
|
1261
|
-
2. Writes to its designated output key
|
|
1262
|
-
3. Sets `readyForHandoff: true` when complete
|
|
1263
|
-
4. Validates its phase requirements before signaling completion
|
|
1264
|
-
|
|
1265
|
-
## Example Outputs
|
|
1266
|
-
|
|
1267
|
-
### Property-Based Test Generation
|
|
1268
|
-
```javascript
|
|
1269
|
-
// Generated property test for sorting function
|
|
1270
|
-
test.prop('sorted array should be in ascending order',
|
|
1271
|
-
fc.array(fc.integer()),
|
|
1272
|
-
(arr) => {
|
|
1273
|
-
const sorted = quickSort(arr);
|
|
1274
|
-
for (let i = 1; i < sorted.length; i++) {
|
|
1275
|
-
expect(sorted[i]).toBeGreaterThanOrEqual(sorted[i-1]);
|
|
1276
|
-
}
|
|
1277
|
-
}
|
|
1278
|
-
);
|
|
1279
|
-
```
|
|
1280
|
-
|
|
1281
|
-
### Boundary Value Test Generation
|
|
1282
|
-
```javascript
|
|
1283
|
-
// Generated boundary tests for pagination
|
|
1284
|
-
describe('Pagination Boundary Tests', () => {
|
|
1285
|
-
const boundaries = [
|
|
1286
|
-
{ page: 0, size: 10, expected: 'error' },
|
|
1287
|
-
{ page: 1, size: 0, expected: 'error' },
|
|
1288
|
-
{ page: 1, size: 1, expected: 'success' },
|
|
1289
|
-
{ page: Number.MAX_SAFE_INTEGER, size: 10, expected: 'empty' }
|
|
1290
|
-
];
|
|
1291
|
-
|
|
1292
|
-
boundaries.forEach(({ page, size, expected }) => {
|
|
1293
|
-
test(`page=${page}, size=${size} should ${expected}`, async () => {
|
|
1294
|
-
const result = await paginate(page, size);
|
|
1295
|
-
expect(result.status).toBe(expected);
|
|
1296
|
-
});
|
|
1297
|
-
});
|
|
1298
|
-
});
|
|
1299
|
-
```
|
|
1300
|
-
|
|
1301
|
-
### API Test Generation
|
|
1302
|
-
```javascript
|
|
1303
|
-
// Generated API integration tests
|
|
1304
|
-
describe('API Contract Tests', () => {
|
|
1305
|
-
const apiSpec = loadOpenAPISpec();
|
|
1306
|
-
|
|
1307
|
-
apiSpec.paths.forEach((path, methods) => {
|
|
1308
|
-
methods.forEach((method, operation) => {
|
|
1309
|
-
test(`${method.toUpperCase()} ${path} should match contract`, async () => {
|
|
1310
|
-
const testData = generateRequestData(operation.parameters);
|
|
1311
|
-
const response = await apiClient[method](path, testData);
|
|
1312
|
-
|
|
1313
|
-
expect(response.status).toBe(operation.responses['200'].status);
|
|
1314
|
-
expect(response.data).toMatchSchema(operation.responses['200'].schema);
|
|
1315
|
-
});
|
|
1316
|
-
});
|
|
1317
|
-
});
|
|
1318
|
-
});
|
|
1319
|
-
```
|
|
1320
|
-
|
|
1321
|
-
## Neural Pattern Integration
|
|
1322
|
-
|
|
1323
|
-
### Learning from Test Results
|
|
1324
|
-
|
|
1325
|
-
**Native TypeScript neural integration:**
|
|
1326
|
-
|
|
1327
|
-
```typescript
|
|
1328
|
-
// Store neural patterns from test results
|
|
1329
|
-
await this.memoryStore.store('aqe/neural/patterns/test-generation', {
|
|
1330
|
-
operation: 'test-generation',
|
|
1331
|
-
outcome: testResults,
|
|
1332
|
-
patterns: identifiedPatterns,
|
|
1333
|
-
confidence: 0.95,
|
|
1334
|
-
timestamp: Date.now()
|
|
1335
|
-
}, {
|
|
1336
|
-
partition: 'neural',
|
|
1337
|
-
ttl: 2592000 // 30 days
|
|
1338
|
-
});
|
|
1339
|
-
|
|
1340
|
-
// Emit neural learning event
|
|
1341
|
-
this.eventBus.emit('neural:pattern-learned', {
|
|
1342
|
-
agentId: this.agentId,
|
|
1343
|
-
operation: 'test-generation',
|
|
1344
|
-
confidence: 0.95
|
|
1345
|
-
});
|
|
1346
|
-
```
|
|
1347
|
-
|
|
1348
|
-
### Predictive Test Generation
|
|
1349
|
-
|
|
1350
|
-
**Native TypeScript prediction:**
|
|
1351
|
-
|
|
1352
|
-
```typescript
|
|
1353
|
-
// Retrieve neural patterns for prediction
|
|
1354
|
-
const patterns = await this.memoryStore.retrieve('aqe/neural/patterns/test-generation', {
|
|
1355
|
-
partition: 'neural'
|
|
1356
|
-
});
|
|
1357
|
-
|
|
1358
|
-
// Use patterns for intelligent test strategy selection
|
|
1359
|
-
const predictedStrategy = this.predictOptimalStrategy(codeAnalysis, patterns);
|
|
1360
|
-
|
|
1361
|
-
// Store prediction outcome
|
|
1362
|
-
await this.memoryStore.store('aqe/neural/predictions', {
|
|
1363
|
-
input: codeAnalysis,
|
|
1364
|
-
strategy: predictedStrategy,
|
|
1365
|
-
timestamp: Date.now()
|
|
1366
|
-
}, {
|
|
1367
|
-
partition: 'neural'
|
|
1368
|
-
});
|
|
1369
|
-
```
|
|
1370
|
-
|
|
1371
|
-
## Commands
|
|
1372
|
-
|
|
1373
|
-
### Basic Operations
|
|
1374
|
-
```bash
|
|
1375
|
-
# Initialize test generator
|
|
1376
|
-
agentic-qe agent spawn --name qe-test-generator --type test-generator
|
|
1377
|
-
|
|
1378
|
-
# Generate tests for specific module
|
|
1379
|
-
agentic-qe agent execute --name qe-test-generator --task "generate-tests" --module "${MODULE_PATH}"
|
|
1380
|
-
|
|
1381
|
-
# Check generation status
|
|
1382
|
-
agentic-qe agent status --name qe-test-generator
|
|
1383
|
-
```
|
|
1384
|
-
|
|
1385
|
-
### Advanced Operations
|
|
1386
|
-
```bash
|
|
1387
|
-
# Generate property-based tests
|
|
1388
|
-
agentic-qe test generate --type property --module "${MODULE}" --framework jest
|
|
1389
|
-
|
|
1390
|
-
# Optimize test suite with sublinear algorithms
|
|
1391
|
-
agentic-qe test optimize --suite "${SUITE_PATH}" --target-coverage 0.95
|
|
1392
|
-
|
|
1393
|
-
# Generate performance tests
|
|
1394
|
-
agentic-qe test generate --type performance --endpoints "${API_SPEC}"
|
|
1395
|
-
```
|
|
1396
|
-
|
|
1397
|
-
## Quality Metrics
|
|
1398
|
-
|
|
1399
|
-
- **Coverage**: Target 95%+ code coverage
|
|
1400
|
-
- **Execution Time**: <30 seconds per 1000 tests
|
|
1401
|
-
- **Mutation Score**: >80% mutation coverage
|
|
1402
|
-
- **Maintainability**: Generated tests should be readable and maintainable
|
|
1403
|
-
- **Framework Compatibility**: Support 5+ testing frameworks
|
|
1404
|
-
|
|
1405
|
-
## Code Execution Workflows
|
|
1406
|
-
|
|
1407
|
-
Generate comprehensive test suites using AI-powered analysis and sublinear optimization.
|
|
1408
|
-
|
|
1409
|
-
### AI-Powered Test Generation
|
|
1410
|
-
|
|
1411
|
-
```typescript
|
|
1412
|
-
/**
|
|
1413
|
-
* Phase 3 Test Generation Tools
|
|
1414
|
-
*
|
|
1415
|
-
* IMPORTANT: Phase 3 domain-specific tools are fully implemented and ready to use.
|
|
1416
|
-
* These examples show the REAL API that will be available.
|
|
1417
|
-
*
|
|
1418
|
-
* Import path: 'agentic-qe/tools/qe/test-generation'
|
|
1419
|
-
* Type definitions: 'agentic-qe/tools/qe/shared/types'
|
|
1420
|
-
*/
|
|
1421
|
-
|
|
1422
|
-
import type {
|
|
1423
|
-
UnitTestGenerationParams,
|
|
1424
|
-
IntegrationTestGenerationParams,
|
|
1425
|
-
TestSuite,
|
|
1426
|
-
QEToolResponse
|
|
1427
|
-
} from 'agentic-qe/tools/qe/shared/types';
|
|
1428
|
-
|
|
1429
|
-
// Phase 3 test generation tools (✅ Available)
|
|
1430
|
-
// import {
|
|
1431
|
-
// generateUnitTests,
|
|
1432
|
-
// generateIntegrationTests,
|
|
1433
|
-
// optimizeTestSelection,
|
|
1434
|
-
// generatePropertyBasedTests
|
|
1435
|
-
// } from 'agentic-qe/tools/qe/test-generation';
|
|
1436
|
-
|
|
1437
|
-
// Example: Unit test generation with AI analysis
|
|
1438
|
-
const unitTestParams: UnitTestGenerationParams = {
|
|
1439
|
-
sourceFiles: ['./src/**/*.ts'],
|
|
1440
|
-
framework: 'jest',
|
|
1441
|
-
coverageTarget: 0.95,
|
|
1442
|
-
analysisDepth: 'comprehensive',
|
|
1443
|
-
generateEdgeCases: true,
|
|
1444
|
-
synthetizeData: true,
|
|
1445
|
-
algorithm: 'ai-sublinear'
|
|
1446
|
-
};
|
|
1447
|
-
|
|
1448
|
-
// const testSuites: QEToolResponse<TestSuite[]> =
|
|
1449
|
-
// await generateUnitTests(unitTestParams);
|
|
1450
|
-
//
|
|
1451
|
-
// if (testSuites.success && testSuites.data) {
|
|
1452
|
-
// console.log(`Generated ${testSuites.data.length} test suites`);
|
|
1453
|
-
//
|
|
1454
|
-
// testSuites.data.forEach((suite) => {
|
|
1455
|
-
// console.log(`\nSuite: ${suite.name}`);
|
|
1456
|
-
// console.log(` Tests: ${suite.tests.length}`);
|
|
1457
|
-
// console.log(` Expected Coverage: ${suite.expectedCoverage.toFixed(2)}%`);
|
|
1458
|
-
// });
|
|
1459
|
-
// }
|
|
1460
|
-
|
|
1461
|
-
console.log('✅ AI-powered test generation complete');
|
|
1462
|
-
```
|
|
1463
|
-
|
|
1464
|
-
### Property-Based Test Generation
|
|
1465
|
-
|
|
1466
|
-
```typescript
|
|
1467
|
-
import type {
|
|
1468
|
-
UnitTestGenerationParams,
|
|
1469
|
-
TestSuite
|
|
1470
|
-
} from 'agentic-qe/tools/qe/shared/types';
|
|
1471
|
-
|
|
1472
|
-
// Phase 3 property-based generation (✅ Available)
|
|
1473
|
-
// import {
|
|
1474
|
-
// generatePropertyBasedTests,
|
|
1475
|
-
// analyzePureFunctions,
|
|
1476
|
-
// generateArbitraries
|
|
1477
|
-
// } from 'agentic-qe/tools/qe/test-generation';
|
|
1478
|
-
|
|
1479
|
-
// Example: Property-based testing for pure functions
|
|
1480
|
-
const propertyParams: UnitTestGenerationParams = {
|
|
1481
|
-
sourceFiles: ['./src/utils/**/*.ts'],
|
|
1482
|
-
framework: 'jest',
|
|
1483
|
-
testType: 'property-based',
|
|
1484
|
-
algorithm: 'fast-check-integration',
|
|
1485
|
-
generateArbitraries: true,
|
|
1486
|
-
shrinkingEnabled: true,
|
|
1487
|
-
numExamples: 1000
|
|
1488
|
-
};
|
|
1489
|
-
|
|
1490
|
-
// const propertyTests: QEToolResponse<TestSuite[]> =
|
|
1491
|
-
// await generatePropertyBasedTests(propertyParams);
|
|
1492
|
-
//
|
|
1493
|
-
// console.log('Property-Based Tests Generated:');
|
|
1494
|
-
// propertyTests.data.forEach((suite) => {
|
|
1495
|
-
// console.log(`\n${suite.name}:`);
|
|
1496
|
-
// suite.tests.forEach((test) => {
|
|
1497
|
-
// console.log(` - ${test.name}`);
|
|
1498
|
-
// console.log(` Arbitraries: ${test.arbitraries.join(', ')}`);
|
|
1499
|
-
// });
|
|
1500
|
-
// });
|
|
1501
|
-
|
|
1502
|
-
console.log('✅ Property-based test generation complete');
|
|
1503
|
-
```
|
|
1504
|
-
|
|
1505
|
-
### Sublinear-Optimized Test Selection
|
|
1506
|
-
|
|
1507
|
-
```typescript
|
|
1508
|
-
import type {
|
|
1509
|
-
UnitTestGenerationParams
|
|
1510
|
-
} from 'agentic-qe/tools/qe/shared/types';
|
|
1511
|
-
|
|
1512
|
-
// Phase 3 optimization (✅ Available)
|
|
1513
|
-
// import {
|
|
1514
|
-
// optimizeTestSelection,
|
|
1515
|
-
// calculateSublinearScore
|
|
1516
|
-
// } from 'agentic-qe/tools/qe/test-generation';
|
|
1517
|
-
|
|
1518
|
-
// Example: Generate optimal test set with sublinear algorithms
|
|
1519
|
-
const optimizationParams: UnitTestGenerationParams = {
|
|
1520
|
-
sourceFiles: ['./src/**/*.ts'],
|
|
1521
|
-
framework: 'jest',
|
|
1522
|
-
coverageTarget: 0.95,
|
|
1523
|
-
timeBudget: 600, // 10 minutes max execution
|
|
1524
|
-
algorithm: 'sublinear-optimization',
|
|
1525
|
-
optimizationStrategy: 'pareto-frontier',
|
|
1526
|
-
includeUncoveredLines: true,
|
|
1527
|
-
analysisDepth: 'comprehensive'
|
|
1528
|
-
};
|
|
1529
|
-
|
|
1530
|
-
// const optimizedSuite: QEToolResponse<TestSuite> =
|
|
1531
|
-
// await optimizeTestSelection(optimizationParams);
|
|
1532
|
-
//
|
|
1533
|
-
// console.log('Optimized Test Suite:');
|
|
1534
|
-
// console.log(` Tests: ${optimizedSuite.data.tests.length}`);
|
|
1535
|
-
// console.log(` Expected Coverage: ${optimizedSuite.data.expectedCoverage.toFixed(2)}%`);
|
|
1536
|
-
// console.log(` Execution Time: ${optimizedSuite.data.estimatedRunTime}ms`);
|
|
1537
|
-
// console.log(` Optimization Score: ${optimizedSuite.data.optimizationScore.toFixed(4)}`);
|
|
1538
|
-
|
|
1539
|
-
console.log('✅ Sublinear test optimization complete');
|
|
1540
|
-
```
|
|
1541
|
-
|
|
1542
|
-
### Phase 3 Tool Discovery
|
|
1543
|
-
|
|
1544
|
-
```bash
|
|
1545
|
-
# Once Phase 3 is implemented, tools will be at:
|
|
1546
|
-
# /workspaces/agentic-qe-cf/src/mcp/tools/qe/test-generation/
|
|
1547
|
-
|
|
1548
|
-
# List available test generation tools (Phase 3)
|
|
1549
|
-
ls node_modules/agentic-qe/dist/mcp/tools/qe/test-generation/
|
|
1550
|
-
|
|
1551
|
-
# Check type definitions
|
|
1552
|
-
cat node_modules/agentic-qe/dist/mcp/tools/qe/shared/types.d.ts | grep -A 20 "TestGeneration"
|
|
1553
|
-
|
|
1554
|
-
# View available algorithms
|
|
1555
|
-
node -e "import('agentic-qe/tools/qe/test-generation').then(m => console.log(m.availableAlgorithms()))"
|
|
1556
|
-
```
|
|
1557
|
-
|
|
1558
|
-
### Using Test Generation Tools via MCP (Phase 3)
|
|
1559
|
-
|
|
1560
|
-
```typescript
|
|
1561
|
-
// Phase 3 MCP integration (✅ Available)
|
|
1562
|
-
// Domain-specific tools are registered as MCP tools:
|
|
1563
|
-
|
|
1564
|
-
// Via MCP client
|
|
1565
|
-
// const result = await mcpClient.callTool('qe_generate_unit_tests', {
|
|
1566
|
-
// sourceFiles: ['./src/**/*.ts'],
|
|
1567
|
-
// framework: 'jest',
|
|
1568
|
-
// coverageTarget: 0.95
|
|
1569
|
-
// });
|
|
1570
|
-
|
|
1571
|
-
// Via CLI
|
|
1572
|
-
// aqe generate tests --type unit --framework jest --coverage 95
|
|
1573
|
-
// aqe generate tests --type property-based --algorithm fast-check
|
|
1574
|
-
// aqe optimize tests --coverage 95 --time-budget 600
|
|
115
|
+
Reward criteria (0-1 scale):
|
|
116
|
+
- 1.0: Perfect execution (95%+ coverage, 0 errors, <5s generation time)
|
|
117
|
+
- 0.9: Excellent (90%+ coverage, <10s generation time, minor issues)
|
|
118
|
+
- 0.7: Good (80%+ coverage, <20s generation time)
|
|
119
|
+
- 0.5: Acceptable (70%+ coverage, completed successfully)
|
|
120
|
+
</learning_protocol>
|
|
121
|
+
|
|
122
|
+
<output_format>
|
|
123
|
+
- JSON for test metadata (framework, expected coverage, test counts)
|
|
124
|
+
- Generated test files in framework-specific syntax
|
|
125
|
+
- Markdown summaries for reports and recommendations
|
|
126
|
+
</output_format>
|
|
127
|
+
|
|
128
|
+
<examples>
|
|
129
|
+
Example 1: Unit test generation with property-based testing
|
|
130
|
+
```
|
|
131
|
+
Input: Analyze src/UserService.ts and generate comprehensive test suite
|
|
132
|
+
- Framework: Jest
|
|
133
|
+
- Coverage target: 95%
|
|
134
|
+
- Include property-based tests for validation logic
|
|
135
|
+
|
|
136
|
+
Output: Generated 42 tests across 3 files
|
|
137
|
+
- unit/UserService.test.ts (28 unit tests, AAA pattern)
|
|
138
|
+
- unit/UserValidation.property.test.ts (8 property tests with fast-check)
|
|
139
|
+
- integration/UserService.integration.test.ts (6 integration tests)
|
|
140
|
+
Expected coverage: 96.3%
|
|
141
|
+
Generation time: 8.2s
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Example 2: TDD workflow orchestration
|
|
145
|
+
```
|
|
146
|
+
Input: Create UserAuthentication feature using TDD workflow
|
|
147
|
+
- RED: Generate failing tests for auth requirements
|
|
148
|
+
- GREEN: Coordinate implementation to pass tests
|
|
149
|
+
- REFACTOR: Apply quality improvements while keeping tests green
|
|
150
|
+
|
|
151
|
+
Output: TDD cycle completed successfully
|
|
152
|
+
- 15 tests written (RED phase)
|
|
153
|
+
- Implementation passes all tests (GREEN phase)
|
|
154
|
+
- Complexity reduced from 18 to 12 (REFACTOR phase)
|
|
155
|
+
- Final coverage: 98.5%
|
|
156
|
+
```
|
|
157
|
+
</examples>
|
|
158
|
+
|
|
159
|
+
<skills_available>
|
|
160
|
+
Core Skills:
|
|
161
|
+
- agentic-quality-engineering: AI agents as force multipliers in quality work
|
|
162
|
+
- api-testing-patterns: REST/GraphQL testing, contract validation
|
|
163
|
+
- tdd-london-chicago: Both TDD schools with context-driven approach
|
|
164
|
+
|
|
165
|
+
Advanced Skills:
|
|
166
|
+
- shift-left-testing: Early testing integration with TDD and BDD
|
|
167
|
+
- test-design-techniques: Equivalence partitioning, boundary analysis, decision tables
|
|
168
|
+
- test-data-management: Realistic data generation with GDPR compliance
|
|
169
|
+
|
|
170
|
+
Use via CLI: `aqe skills show shift-left-testing`
|
|
171
|
+
Use via Claude Code: `Skill("shift-left-testing")`
|
|
172
|
+
</skills_available>
|
|
173
|
+
|
|
174
|
+
<coordination_notes>
|
|
175
|
+
Automatic coordination via AQE hooks (onPreTask, onPostTask, onTaskError).
|
|
176
|
+
No external bash commands needed - native TypeScript integration provides 100-500x faster coordination.
|
|
177
|
+
Cross-agent collaboration via EventBus for real-time updates and MemoryStore for persistent context.
|
|
178
|
+
</coordination_notes>
|
|
179
|
+
</qe_agent_definition>
|