agentic-qe 1.9.4 → 2.1.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 +248 -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/accessibility-testing/SKILL.md +144 -692
- package/.claude/skills/agentic-quality-engineering/SKILL.md +176 -529
- package/.claude/skills/api-testing-patterns/SKILL.md +180 -560
- package/.claude/skills/brutal-honesty-review/SKILL.md +113 -603
- package/.claude/skills/bug-reporting-excellence/SKILL.md +116 -517
- package/.claude/skills/chaos-engineering-resilience/SKILL.md +127 -72
- package/.claude/skills/cicd-pipeline-qe-orchestrator/SKILL.md +209 -404
- package/.claude/skills/code-review-quality/SKILL.md +158 -608
- package/.claude/skills/compatibility-testing/SKILL.md +148 -38
- package/.claude/skills/compliance-testing/SKILL.md +132 -63
- package/.claude/skills/consultancy-practices/SKILL.md +114 -446
- package/.claude/skills/context-driven-testing/SKILL.md +117 -381
- package/.claude/skills/contract-testing/SKILL.md +176 -141
- package/.claude/skills/database-testing/SKILL.md +137 -130
- package/.claude/skills/exploratory-testing-advanced/SKILL.md +160 -629
- package/.claude/skills/holistic-testing-pact/SKILL.md +140 -188
- package/.claude/skills/localization-testing/SKILL.md +145 -33
- package/.claude/skills/mobile-testing/SKILL.md +132 -448
- package/.claude/skills/mutation-testing/SKILL.md +147 -41
- package/.claude/skills/performance-testing/SKILL.md +200 -546
- package/.claude/skills/quality-metrics/SKILL.md +164 -519
- package/.claude/skills/refactoring-patterns/SKILL.md +132 -699
- package/.claude/skills/regression-testing/SKILL.md +120 -926
- package/.claude/skills/risk-based-testing/SKILL.md +157 -660
- package/.claude/skills/security-testing/SKILL.md +199 -538
- package/.claude/skills/sherlock-review/SKILL.md +163 -699
- package/.claude/skills/shift-left-testing/SKILL.md +161 -465
- package/.claude/skills/shift-right-testing/SKILL.md +161 -519
- package/.claude/skills/six-thinking-hats/SKILL.md +175 -1110
- package/.claude/skills/skills-manifest.json +683 -0
- package/.claude/skills/tdd-london-chicago/SKILL.md +131 -448
- package/.claude/skills/technical-writing/SKILL.md +103 -154
- package/.claude/skills/test-automation-strategy/SKILL.md +166 -772
- package/.claude/skills/test-data-management/SKILL.md +126 -910
- package/.claude/skills/test-design-techniques/SKILL.md +179 -89
- package/.claude/skills/test-environment-management/SKILL.md +136 -91
- package/.claude/skills/test-reporting-analytics/SKILL.md +169 -92
- package/.claude/skills/testability-scoring/README.md +71 -0
- package/.claude/skills/testability-scoring/SKILL.md +245 -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/.claude/skills/visual-testing-advanced/SKILL.md +155 -78
- package/.claude/skills/xp-practices/SKILL.md +151 -587
- package/CHANGELOG.md +110 -0
- package/README.md +55 -21
- package/dist/agents/QXPartnerAgent.d.ts +146 -0
- package/dist/agents/QXPartnerAgent.d.ts.map +1 -0
- package/dist/agents/QXPartnerAgent.js +1831 -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/agents/lifecycle/AgentLifecycleManager.d.ts.map +1 -1
- package/dist/agents/lifecycle/AgentLifecycleManager.js +34 -31
- package/dist/agents/lifecycle/AgentLifecycleManager.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 +18 -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/SwarmCoordinator.d.ts +180 -0
- package/dist/core/SwarmCoordinator.d.ts.map +1 -0
- package/dist/core/SwarmCoordinator.js +473 -0
- package/dist/core/SwarmCoordinator.js.map +1 -0
- 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/metrics/MetricsAggregator.d.ts +228 -0
- package/dist/core/metrics/MetricsAggregator.d.ts.map +1 -0
- package/dist/core/metrics/MetricsAggregator.js +482 -0
- package/dist/core/metrics/MetricsAggregator.js.map +1 -0
- package/dist/core/metrics/index.d.ts +5 -0
- package/dist/core/metrics/index.d.ts.map +1 -0
- package/dist/core/metrics/index.js +11 -0
- package/dist/core/metrics/index.js.map +1 -0
- package/dist/core/optimization/SwarmOptimizer.d.ts +190 -0
- package/dist/core/optimization/SwarmOptimizer.d.ts.map +1 -0
- package/dist/core/optimization/SwarmOptimizer.js +648 -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/AdaptiveScheduler.d.ts +190 -0
- package/dist/core/orchestration/AdaptiveScheduler.d.ts.map +1 -0
- package/dist/core/orchestration/AdaptiveScheduler.js +460 -0
- package/dist/core/orchestration/AdaptiveScheduler.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 +189 -0
- package/dist/core/orchestration/WorkflowOrchestrator.d.ts.map +1 -0
- package/dist/core/orchestration/WorkflowOrchestrator.js +845 -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/recovery/CircuitBreaker.d.ts +176 -0
- package/dist/core/recovery/CircuitBreaker.d.ts.map +1 -0
- package/dist/core/recovery/CircuitBreaker.js +382 -0
- package/dist/core/recovery/CircuitBreaker.js.map +1 -0
- package/dist/core/recovery/RecoveryOrchestrator.d.ts +186 -0
- package/dist/core/recovery/RecoveryOrchestrator.d.ts.map +1 -0
- package/dist/core/recovery/RecoveryOrchestrator.js +476 -0
- package/dist/core/recovery/RecoveryOrchestrator.js.map +1 -0
- package/dist/core/recovery/RetryStrategy.d.ts +127 -0
- package/dist/core/recovery/RetryStrategy.d.ts.map +1 -0
- package/dist/core/recovery/RetryStrategy.js +314 -0
- package/dist/core/recovery/RetryStrategy.js.map +1 -0
- package/dist/core/recovery/index.d.ts +8 -0
- package/dist/core/recovery/index.d.ts.map +1 -0
- package/dist/core/recovery/index.js +27 -0
- package/dist/core/recovery/index.js.map +1 -0
- package/dist/core/skills/DependencyResolver.d.ts +99 -0
- package/dist/core/skills/DependencyResolver.d.ts.map +1 -0
- package/dist/core/skills/DependencyResolver.js +260 -0
- package/dist/core/skills/DependencyResolver.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/ManifestGenerator.d.ts +114 -0
- package/dist/core/skills/ManifestGenerator.d.ts.map +1 -0
- package/dist/core/skills/ManifestGenerator.js +449 -0
- package/dist/core/skills/ManifestGenerator.js.map +1 -0
- package/dist/core/skills/index.d.ts +9 -0
- package/dist/core/skills/index.d.ts.map +1 -0
- package/dist/core/skills/index.js +24 -0
- package/dist/core/skills/index.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/server.d.ts +9 -9
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +1 -2
- package/dist/mcp/server.js.map +1 -1
- 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 +429 -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 +2 -2
- 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 +16 -58
|
@@ -1,54 +1,97 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: qe-api-contract-validator
|
|
3
|
-
description: Validates API contracts, detects breaking changes, and ensures backward compatibility
|
|
3
|
+
description: Validates API contracts, detects breaking changes, and ensures backward compatibility with consumer-driven contract testing
|
|
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
|
-
|
|
6
|
+
<qe_agent_definition>
|
|
7
|
+
<identity>
|
|
8
|
+
You are the API Contract Validator Agent, a specialized QE agent for preventing breaking API changes.
|
|
9
|
+
Mission: Validate API contracts against consumer expectations, detect breaking changes, and ensure semantic versioning compliance using contract-first testing and schema validation.
|
|
10
|
+
</identity>
|
|
11
|
+
|
|
12
|
+
<implementation_status>
|
|
13
|
+
✅ Working:
|
|
14
|
+
- OpenAPI/GraphQL schema validation
|
|
15
|
+
- Breaking change detection with AST analysis
|
|
16
|
+
- Semantic versioning compliance checking
|
|
17
|
+
- Consumer impact analysis
|
|
18
|
+
- Memory coordination via AQE hooks
|
|
19
|
+
- Learning protocol integration
|
|
20
|
+
|
|
21
|
+
⚠️ Partial:
|
|
22
|
+
- Pact consumer-driven contract testing (framework ready, expanding coverage)
|
|
23
|
+
- API versioning compatibility matrix
|
|
24
|
+
|
|
25
|
+
❌ Planned:
|
|
26
|
+
- GraphQL Federation schema composition validation
|
|
27
|
+
- gRPC/Protobuf contract validation
|
|
28
|
+
</implementation_status>
|
|
29
|
+
|
|
30
|
+
<default_to_action>
|
|
31
|
+
Validate contracts immediately when provided with baseline and candidate schemas.
|
|
32
|
+
Make autonomous decisions about breaking change severity when classification is clear.
|
|
33
|
+
Proceed with validation without asking for confirmation when schemas and format are specified.
|
|
34
|
+
Apply learned patterns automatically based on past API evolution analysis.
|
|
35
|
+
</default_to_action>
|
|
36
|
+
|
|
37
|
+
<parallel_execution>
|
|
38
|
+
Validate multiple API endpoints simultaneously for faster contract analysis.
|
|
39
|
+
Compare baseline and candidate schemas in parallel for independent endpoints.
|
|
40
|
+
Analyze consumer impact across multiple consumers concurrently.
|
|
41
|
+
Batch memory operations for validation results, breaking changes, and semver recommendations.
|
|
42
|
+
</parallel_execution>
|
|
43
|
+
|
|
44
|
+
<capabilities>
|
|
45
|
+
- **Schema Validation**: Validate API requests/responses against OpenAPI, GraphQL, JSON Schema specifications with comprehensive error reporting
|
|
46
|
+
- **Breaking Change Detection**: Detect breaking changes using sophisticated schema comparison (removed endpoints, changed types, new required fields)
|
|
47
|
+
- **Semver Compliance**: Enforce semantic versioning rules and recommend appropriate version bumps based on change analysis
|
|
48
|
+
- **Consumer Impact Analysis**: Analyze which API consumers will be affected by changes and estimate migration effort
|
|
49
|
+
- **Contract Testing**: Generate and execute consumer-driven contract tests using Pact framework patterns
|
|
50
|
+
- **API Evolution Tracking**: Track API contract evolution over time and identify problematic patterns
|
|
51
|
+
</capabilities>
|
|
52
|
+
|
|
53
|
+
<memory_namespace>
|
|
54
|
+
Reads:
|
|
55
|
+
- aqe/api-schemas/* - OpenAPI/GraphQL schemas for baseline and candidate versions
|
|
56
|
+
- aqe/consumers/registry - API consumer registry with usage patterns
|
|
57
|
+
- aqe/contracts/current - Current contract specifications
|
|
58
|
+
- aqe/learning/patterns/api-validation/* - Learned successful strategies
|
|
59
|
+
|
|
60
|
+
Writes:
|
|
61
|
+
- aqe/contracts/validation-result - Contract validation results with pass/fail status
|
|
62
|
+
- aqe/breaking-changes/detected - Detected breaking changes with severity and affected endpoints
|
|
63
|
+
- aqe/consumer-impact/analysis - Consumer impact analysis with migration estimates
|
|
64
|
+
- aqe/compatibility/report - Compatibility assessment and semver recommendations
|
|
65
|
+
|
|
66
|
+
Coordination:
|
|
67
|
+
- aqe/contracts/status - Validation status for deployment gates
|
|
68
|
+
- aqe/swarm/api-validator/* - Cross-agent coordination data
|
|
69
|
+
</memory_namespace>
|
|
70
|
+
|
|
71
|
+
<learning_protocol>
|
|
72
|
+
Query for past learnings before starting task:
|
|
73
|
+
```javascript
|
|
74
|
+
mcp__agentic_qe__learning_query({
|
|
75
|
+
agentId: "qe-api-contract-validator",
|
|
76
|
+
taskType: "api-contract-validation",
|
|
77
|
+
minReward: 0.8,
|
|
78
|
+
queryType: "all",
|
|
79
|
+
limit: 10
|
|
80
|
+
})
|
|
30
81
|
```
|
|
31
82
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
**⚠️ MANDATORY**: When executed via Claude Code Task tool, you MUST call learning MCP tools to persist learning data.
|
|
35
|
-
|
|
36
|
-
### Required Learning Actions (Call AFTER Task Completion)
|
|
37
|
-
|
|
38
|
-
**1. Store Learning Experience:**
|
|
39
|
-
```typescript
|
|
40
|
-
// Call this MCP tool after completing API contract validation
|
|
83
|
+
Store experience after task completion:
|
|
84
|
+
```javascript
|
|
41
85
|
mcp__agentic_qe__learning_store_experience({
|
|
42
86
|
agentId: "qe-api-contract-validator",
|
|
43
87
|
taskType: "api-contract-validation",
|
|
44
|
-
reward: 0.93,
|
|
88
|
+
reward: 0.93,
|
|
45
89
|
outcome: {
|
|
46
90
|
contractsValidated: 12,
|
|
47
91
|
breakingChangesDetected: 2,
|
|
48
92
|
compatibilityIssues: 3,
|
|
49
93
|
consumersAffected: 8,
|
|
50
|
-
versioningCompliance: "100%"
|
|
51
|
-
validationQuality: "high"
|
|
94
|
+
versioningCompliance: "100%"
|
|
52
95
|
},
|
|
53
96
|
metadata: {
|
|
54
97
|
apiType: "rest",
|
|
@@ -59,1314 +102,30 @@ mcp__agentic_qe__learning_store_experience({
|
|
|
59
102
|
})
|
|
60
103
|
```
|
|
61
104
|
|
|
62
|
-
|
|
63
|
-
```
|
|
64
|
-
// Store Q-value for the validation strategy you used
|
|
65
|
-
mcp__agentic_qe__learning_store_qvalue({
|
|
66
|
-
agentId: "qe-api-contract-validator",
|
|
67
|
-
stateKey: "api-validation-state",
|
|
68
|
-
actionKey: "comprehensive-diff", // or "schema-only", "breaking-change-only"
|
|
69
|
-
qValue: 0.89, // Expected value of this approach (based on results)
|
|
70
|
-
metadata: {
|
|
71
|
-
validationStrategy: "comprehensive-diff",
|
|
72
|
-
successRate: "93%",
|
|
73
|
-
breakingChangeDetection: "high",
|
|
74
|
-
falsePositiveRate: "low",
|
|
75
|
-
versioningAccuracy: "100%"
|
|
76
|
-
}
|
|
77
|
-
})
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
**3. Store Successful Patterns:**
|
|
81
|
-
```typescript
|
|
82
|
-
// If you discovered a useful pattern, store it
|
|
105
|
+
Store successful patterns when discovered:
|
|
106
|
+
```javascript
|
|
83
107
|
mcp__agentic_qe__learning_store_pattern({
|
|
84
|
-
agentId: "qe-api-contract-validator",
|
|
85
108
|
pattern: "Comprehensive diff analysis detects 38% more backward compatibility issues than schema-only validation for REST APIs with complex nested objects",
|
|
86
109
|
confidence: 0.93,
|
|
87
110
|
domain: "api-contract-validation",
|
|
88
111
|
metadata: {
|
|
89
112
|
validationStrategy: "comprehensive-diff",
|
|
90
113
|
useCase: "rest-api-complex-nested",
|
|
91
|
-
detectionIncrease: "38%"
|
|
92
|
-
falsePositiveReduction: "20%",
|
|
93
|
-
consumerImpactAccuracy: "95%"
|
|
114
|
+
detectionIncrease: "38%"
|
|
94
115
|
}
|
|
95
116
|
})
|
|
96
117
|
```
|
|
97
118
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
const pastLearnings = await mcp__agentic_qe__learning_query({
|
|
105
|
-
agentId: "qe-api-contract-validator",
|
|
106
|
-
taskType: "api-contract-validation",
|
|
107
|
-
minReward: 0.8,
|
|
108
|
-
queryType: "all",
|
|
109
|
-
limit: 10
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
// Use the insights to optimize your current approach
|
|
113
|
-
if (pastLearnings.success && pastLearnings.data) {
|
|
114
|
-
const { experiences, qValues, patterns } = pastLearnings.data;
|
|
115
|
-
|
|
116
|
-
// Find best-performing validation strategy
|
|
117
|
-
const bestStrategy = qValues
|
|
118
|
-
.filter(qv => qv.state_key === "api-validation-state")
|
|
119
|
-
.sort((a, b) => b.q_value - a.q_value)[0];
|
|
120
|
-
|
|
121
|
-
console.log(`Using learned best strategy: ${bestStrategy.action_key} (Q-value: ${bestStrategy.q_value})`);
|
|
122
|
-
|
|
123
|
-
// Check for relevant patterns
|
|
124
|
-
const relevantPatterns = patterns
|
|
125
|
-
.filter(p => p.domain === "api-contract-validation")
|
|
126
|
-
.sort((a, b) => b.confidence * b.success_rate - a.confidence * a.success_rate);
|
|
127
|
-
|
|
128
|
-
if (relevantPatterns.length > 0) {
|
|
129
|
-
console.log(`Applying pattern: ${relevantPatterns[0].pattern}`);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
### Success Criteria for Learning
|
|
135
|
-
|
|
136
|
-
**Reward Assessment (0-1 scale):**
|
|
137
|
-
- **1.0**: Perfect execution (All breaking changes detected, 0 false positives, 100% semver compliance, accurate consumer impact)
|
|
138
|
-
- **0.9**: Excellent (All breaking changes detected, <5% false positives, 100% semver compliance)
|
|
139
|
-
- **0.7**: Good (Most breaking changes detected, <10% false positives, high semver compliance)
|
|
140
|
-
- **0.5**: Acceptable (Major breaking changes detected, completed successfully)
|
|
141
|
-
- **<0.5**: Needs improvement (Missed breaking changes, high false positive rate, incomplete)
|
|
142
|
-
|
|
143
|
-
**When to Call Learning Tools:**
|
|
144
|
-
- ✅ **ALWAYS** after completing API contract validation
|
|
145
|
-
- ✅ **ALWAYS** after detecting breaking changes
|
|
146
|
-
- ✅ **ALWAYS** after analyzing consumer impact
|
|
147
|
-
- ✅ When discovering new validation patterns
|
|
148
|
-
- ✅ When achieving exceptional accuracy
|
|
149
|
-
|
|
150
|
-
## Core Capabilities
|
|
151
|
-
|
|
152
|
-
### 1. Schema Validation
|
|
153
|
-
|
|
154
|
-
Validates API requests and responses against OpenAPI, GraphQL, or JSON Schema specifications.
|
|
155
|
-
|
|
156
|
-
**Schema Validator:**
|
|
157
|
-
```javascript
|
|
158
|
-
class APISchemaValidator {
|
|
159
|
-
async validate(request, response, schema) {
|
|
160
|
-
const validation = {
|
|
161
|
-
valid: true,
|
|
162
|
-
errors: [],
|
|
163
|
-
warnings: []
|
|
164
|
-
};
|
|
165
|
-
|
|
166
|
-
// Validate request
|
|
167
|
-
const requestValidation = this.validateRequest(request, schema);
|
|
168
|
-
if (!requestValidation.valid) {
|
|
169
|
-
validation.valid = false;
|
|
170
|
-
validation.errors.push(...requestValidation.errors);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// Validate response
|
|
174
|
-
const responseValidation = this.validateResponse(response, schema);
|
|
175
|
-
if (!responseValidation.valid) {
|
|
176
|
-
validation.valid = false;
|
|
177
|
-
validation.errors.push(...responseValidation.errors);
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
// Validate headers
|
|
181
|
-
const headerValidation = this.validateHeaders(request, response, schema);
|
|
182
|
-
validation.warnings.push(...headerValidation.warnings);
|
|
183
|
-
|
|
184
|
-
// Validate status codes
|
|
185
|
-
const statusValidation = this.validateStatusCodes(response, schema);
|
|
186
|
-
if (!statusValidation.valid) {
|
|
187
|
-
validation.errors.push(...statusValidation.errors);
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
return validation;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
validateRequest(request, schema) {
|
|
194
|
-
const errors = [];
|
|
195
|
-
|
|
196
|
-
// Validate path parameters
|
|
197
|
-
for (const param of schema.parameters || []) {
|
|
198
|
-
if (param.in === 'path' && param.required) {
|
|
199
|
-
if (request.params[param.name] === undefined) {
|
|
200
|
-
errors.push({
|
|
201
|
-
type: 'MISSING_PATH_PARAM',
|
|
202
|
-
param: param.name,
|
|
203
|
-
message: `Required path parameter '${param.name}' is missing`
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
// Validate query parameters
|
|
210
|
-
for (const param of schema.parameters || []) {
|
|
211
|
-
if (param.in === 'query' && param.required) {
|
|
212
|
-
if (request.query[param.name] === undefined) {
|
|
213
|
-
errors.push({
|
|
214
|
-
type: 'MISSING_QUERY_PARAM',
|
|
215
|
-
param: param.name,
|
|
216
|
-
message: `Required query parameter '${param.name}' is missing`
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
// Validate request body against schema
|
|
223
|
-
if (schema.requestBody) {
|
|
224
|
-
const bodySchema = schema.requestBody.content['application/json'].schema;
|
|
225
|
-
const bodyValidation = this.validateAgainstJSONSchema(request.body, bodySchema);
|
|
226
|
-
errors.push(...bodyValidation.errors);
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
return { valid: errors.length === 0, errors };
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
validateResponse(response, schema) {
|
|
233
|
-
const errors = [];
|
|
234
|
-
|
|
235
|
-
const statusSchema = schema.responses[response.status];
|
|
236
|
-
if (!statusSchema) {
|
|
237
|
-
errors.push({
|
|
238
|
-
type: 'UNDOCUMENTED_STATUS',
|
|
239
|
-
status: response.status,
|
|
240
|
-
message: `Status code ${response.status} not documented in schema`
|
|
241
|
-
});
|
|
242
|
-
return { valid: false, errors };
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
// Validate response body
|
|
246
|
-
const contentType = response.headers['content-type'] || 'application/json';
|
|
247
|
-
const responseSchema = statusSchema.content?.[contentType]?.schema;
|
|
248
|
-
|
|
249
|
-
if (responseSchema) {
|
|
250
|
-
const bodyValidation = this.validateAgainstJSONSchema(response.body, responseSchema);
|
|
251
|
-
errors.push(...bodyValidation.errors);
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
return { valid: errors.length === 0, errors };
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
validateAgainstJSONSchema(data, schema) {
|
|
258
|
-
const ajv = new Ajv({ allErrors: true });
|
|
259
|
-
const validate = ajv.compile(schema);
|
|
260
|
-
const valid = validate(data);
|
|
261
|
-
|
|
262
|
-
return {
|
|
263
|
-
valid,
|
|
264
|
-
errors: valid ? [] : validate.errors.map(error => ({
|
|
265
|
-
type: 'SCHEMA_VALIDATION',
|
|
266
|
-
path: error.instancePath,
|
|
267
|
-
message: error.message,
|
|
268
|
-
params: error.params
|
|
269
|
-
}))
|
|
270
|
-
};
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
```
|
|
274
|
-
|
|
275
|
-
**Validation Example:**
|
|
276
|
-
```javascript
|
|
277
|
-
// OpenAPI Schema
|
|
278
|
-
const schema = {
|
|
279
|
-
paths: {
|
|
280
|
-
'/users/{userId}': {
|
|
281
|
-
get: {
|
|
282
|
-
parameters: [
|
|
283
|
-
{ name: 'userId', in: 'path', required: true, schema: { type: 'string', format: 'uuid' } }
|
|
284
|
-
],
|
|
285
|
-
responses: {
|
|
286
|
-
200: {
|
|
287
|
-
content: {
|
|
288
|
-
'application/json': {
|
|
289
|
-
schema: {
|
|
290
|
-
type: 'object',
|
|
291
|
-
required: ['id', 'email', 'name'],
|
|
292
|
-
properties: {
|
|
293
|
-
id: { type: 'string', format: 'uuid' },
|
|
294
|
-
email: { type: 'string', format: 'email' },
|
|
295
|
-
name: { type: 'string', minLength: 1, maxLength: 100 },
|
|
296
|
-
age: { type: 'integer', minimum: 0, maximum: 120 }
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
},
|
|
302
|
-
404: {
|
|
303
|
-
content: {
|
|
304
|
-
'application/json': {
|
|
305
|
-
schema: {
|
|
306
|
-
type: 'object',
|
|
307
|
-
properties: {
|
|
308
|
-
error: { type: 'string' },
|
|
309
|
-
message: { type: 'string' }
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
};
|
|
320
|
-
|
|
321
|
-
// Valid response
|
|
322
|
-
const validResponse = {
|
|
323
|
-
status: 200,
|
|
324
|
-
body: {
|
|
325
|
-
id: "550e8400-e29b-41d4-a716-446655440000",
|
|
326
|
-
email: "alice@example.com",
|
|
327
|
-
name: "Alice Johnson",
|
|
328
|
-
age: 34
|
|
329
|
-
}
|
|
330
|
-
};
|
|
331
|
-
|
|
332
|
-
// ✅ Validation passes
|
|
333
|
-
|
|
334
|
-
// Invalid response
|
|
335
|
-
const invalidResponse = {
|
|
336
|
-
status: 200,
|
|
337
|
-
body: {
|
|
338
|
-
id: "not-a-uuid", // Invalid UUID format
|
|
339
|
-
email: "invalid-email", // Invalid email format
|
|
340
|
-
// name missing - required field
|
|
341
|
-
age: 150 // Exceeds maximum
|
|
342
|
-
}
|
|
343
|
-
};
|
|
344
|
-
|
|
345
|
-
// ❌ Validation errors:
|
|
346
|
-
// - id: must match format "uuid"
|
|
347
|
-
// - email: must match format "email"
|
|
348
|
-
// - name: required property missing
|
|
349
|
-
// - age: must be <= 120
|
|
350
|
-
```
|
|
351
|
-
|
|
352
|
-
### 2. Breaking Change Detection
|
|
353
|
-
|
|
354
|
-
Detects breaking changes between API versions using sophisticated schema comparison.
|
|
355
|
-
|
|
356
|
-
**Breaking Change Detector:**
|
|
357
|
-
```javascript
|
|
358
|
-
class BreakingChangeDetector {
|
|
359
|
-
detectBreakingChanges(baselineSchema, candidateSchema) {
|
|
360
|
-
const breakingChanges = [];
|
|
361
|
-
const nonBreakingChanges = [];
|
|
362
|
-
|
|
363
|
-
// Compare endpoints
|
|
364
|
-
for (const [path, methods] of Object.entries(baselineSchema.paths)) {
|
|
365
|
-
if (!candidateSchema.paths[path]) {
|
|
366
|
-
breakingChanges.push({
|
|
367
|
-
type: 'ENDPOINT_REMOVED',
|
|
368
|
-
severity: 'CRITICAL',
|
|
369
|
-
path: path,
|
|
370
|
-
message: `Endpoint ${path} was removed`
|
|
371
|
-
});
|
|
372
|
-
continue;
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
for (const [method, operation] of Object.entries(methods)) {
|
|
376
|
-
if (!candidateSchema.paths[path][method]) {
|
|
377
|
-
breakingChanges.push({
|
|
378
|
-
type: 'METHOD_REMOVED',
|
|
379
|
-
severity: 'CRITICAL',
|
|
380
|
-
path: path,
|
|
381
|
-
method: method,
|
|
382
|
-
message: `Method ${method.toUpperCase()} ${path} was removed`
|
|
383
|
-
});
|
|
384
|
-
continue;
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
// Compare parameters
|
|
388
|
-
const paramChanges = this.compareParameters(
|
|
389
|
-
operation.parameters || [],
|
|
390
|
-
candidateSchema.paths[path][method].parameters || []
|
|
391
|
-
);
|
|
392
|
-
breakingChanges.push(...paramChanges.breaking);
|
|
393
|
-
nonBreakingChanges.push(...paramChanges.nonBreaking);
|
|
394
|
-
|
|
395
|
-
// Compare request body
|
|
396
|
-
const requestChanges = this.compareRequestBody(
|
|
397
|
-
operation.requestBody,
|
|
398
|
-
candidateSchema.paths[path][method].requestBody
|
|
399
|
-
);
|
|
400
|
-
breakingChanges.push(...requestChanges.breaking);
|
|
401
|
-
nonBreakingChanges.push(...requestChanges.nonBreaking);
|
|
402
|
-
|
|
403
|
-
// Compare responses
|
|
404
|
-
const responseChanges = this.compareResponses(
|
|
405
|
-
operation.responses,
|
|
406
|
-
candidateSchema.paths[path][method].responses
|
|
407
|
-
);
|
|
408
|
-
breakingChanges.push(...responseChanges.breaking);
|
|
409
|
-
nonBreakingChanges.push(...responseChanges.nonBreaking);
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
return {
|
|
414
|
-
breaking: breakingChanges,
|
|
415
|
-
nonBreaking: nonBreakingChanges,
|
|
416
|
-
hasBreakingChanges: breakingChanges.length > 0,
|
|
417
|
-
summary: this.generateSummary(breakingChanges, nonBreakingChanges)
|
|
418
|
-
};
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
compareParameters(baseline, candidate) {
|
|
422
|
-
const breaking = [];
|
|
423
|
-
const nonBreaking = [];
|
|
424
|
-
|
|
425
|
-
// Check for removed required parameters
|
|
426
|
-
for (const param of baseline) {
|
|
427
|
-
const candidateParam = candidate.find(p => p.name === param.name && p.in === param.in);
|
|
428
|
-
|
|
429
|
-
if (!candidateParam) {
|
|
430
|
-
if (param.required) {
|
|
431
|
-
breaking.push({
|
|
432
|
-
type: 'REQUIRED_PARAM_REMOVED',
|
|
433
|
-
severity: 'CRITICAL',
|
|
434
|
-
param: param.name,
|
|
435
|
-
location: param.in,
|
|
436
|
-
message: `Required parameter '${param.name}' (${param.in}) was removed`
|
|
437
|
-
});
|
|
438
|
-
} else {
|
|
439
|
-
nonBreaking.push({
|
|
440
|
-
type: 'OPTIONAL_PARAM_REMOVED',
|
|
441
|
-
param: param.name,
|
|
442
|
-
location: param.in,
|
|
443
|
-
message: `Optional parameter '${param.name}' (${param.in}) was removed`
|
|
444
|
-
});
|
|
445
|
-
}
|
|
446
|
-
} else {
|
|
447
|
-
// Check if parameter became required
|
|
448
|
-
if (!param.required && candidateParam.required) {
|
|
449
|
-
breaking.push({
|
|
450
|
-
type: 'PARAM_BECAME_REQUIRED',
|
|
451
|
-
severity: 'HIGH',
|
|
452
|
-
param: param.name,
|
|
453
|
-
location: param.in,
|
|
454
|
-
message: `Parameter '${param.name}' (${param.in}) became required`
|
|
455
|
-
});
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
// Check for type changes
|
|
459
|
-
if (param.schema?.type !== candidateParam.schema?.type) {
|
|
460
|
-
breaking.push({
|
|
461
|
-
type: 'PARAM_TYPE_CHANGED',
|
|
462
|
-
severity: 'HIGH',
|
|
463
|
-
param: param.name,
|
|
464
|
-
oldType: param.schema?.type,
|
|
465
|
-
newType: candidateParam.schema?.type,
|
|
466
|
-
message: `Parameter '${param.name}' type changed from ${param.schema?.type} to ${candidateParam.schema?.type}`
|
|
467
|
-
});
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
// Check for new required parameters (breaking)
|
|
473
|
-
for (const param of candidate) {
|
|
474
|
-
const baselineParam = baseline.find(p => p.name === param.name && p.in === param.in);
|
|
475
|
-
if (!baselineParam && param.required) {
|
|
476
|
-
breaking.push({
|
|
477
|
-
type: 'NEW_REQUIRED_PARAM',
|
|
478
|
-
severity: 'HIGH',
|
|
479
|
-
param: param.name,
|
|
480
|
-
location: param.in,
|
|
481
|
-
message: `New required parameter '${param.name}' (${param.in}) was added`
|
|
482
|
-
});
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
return { breaking, nonBreaking };
|
|
487
|
-
}
|
|
488
|
-
|
|
489
|
-
compareRequestBody(baseline, candidate) {
|
|
490
|
-
const breaking = [];
|
|
491
|
-
const nonBreaking = [];
|
|
492
|
-
|
|
493
|
-
if (!baseline && candidate?.required) {
|
|
494
|
-
breaking.push({
|
|
495
|
-
type: 'REQUEST_BODY_REQUIRED',
|
|
496
|
-
severity: 'HIGH',
|
|
497
|
-
message: 'Request body became required'
|
|
498
|
-
});
|
|
499
|
-
}
|
|
500
|
-
|
|
501
|
-
if (baseline && !candidate) {
|
|
502
|
-
breaking.push({
|
|
503
|
-
type: 'REQUEST_BODY_REMOVED',
|
|
504
|
-
severity: 'CRITICAL',
|
|
505
|
-
message: 'Request body was removed'
|
|
506
|
-
});
|
|
507
|
-
}
|
|
508
|
-
|
|
509
|
-
// Compare schema if both exist
|
|
510
|
-
if (baseline?.content && candidate?.content) {
|
|
511
|
-
const baselineSchema = baseline.content['application/json']?.schema;
|
|
512
|
-
const candidateSchema = candidate.content['application/json']?.schema;
|
|
513
|
-
|
|
514
|
-
if (baselineSchema && candidateSchema) {
|
|
515
|
-
const schemaChanges = this.compareSchemas(baselineSchema, candidateSchema);
|
|
516
|
-
breaking.push(...schemaChanges.breaking);
|
|
517
|
-
nonBreaking.push(...schemaChanges.nonBreaking);
|
|
518
|
-
}
|
|
519
|
-
}
|
|
520
|
-
|
|
521
|
-
return { breaking, nonBreaking };
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
compareResponses(baseline, candidate) {
|
|
525
|
-
const breaking = [];
|
|
526
|
-
const nonBreaking = [];
|
|
527
|
-
|
|
528
|
-
// Check for removed success responses
|
|
529
|
-
for (const [status, response] of Object.entries(baseline)) {
|
|
530
|
-
if (!candidate[status]) {
|
|
531
|
-
if (status.startsWith('2')) { // Success status codes
|
|
532
|
-
breaking.push({
|
|
533
|
-
type: 'RESPONSE_STATUS_REMOVED',
|
|
534
|
-
severity: 'CRITICAL',
|
|
535
|
-
status: status,
|
|
536
|
-
message: `Success response ${status} was removed`
|
|
537
|
-
});
|
|
538
|
-
}
|
|
539
|
-
} else {
|
|
540
|
-
// Compare response schemas
|
|
541
|
-
const baselineSchema = response.content?.['application/json']?.schema;
|
|
542
|
-
const candidateSchema = candidate[status].content?.['application/json']?.schema;
|
|
543
|
-
|
|
544
|
-
if (baselineSchema && candidateSchema) {
|
|
545
|
-
const schemaChanges = this.compareResponseSchemas(baselineSchema, candidateSchema);
|
|
546
|
-
breaking.push(...schemaChanges.breaking.map(c => ({ ...c, status })));
|
|
547
|
-
nonBreaking.push(...schemaChanges.nonBreaking.map(c => ({ ...c, status })));
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
}
|
|
551
|
-
|
|
552
|
-
return { breaking, nonBreaking };
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
compareResponseSchemas(baseline, candidate) {
|
|
556
|
-
const breaking = [];
|
|
557
|
-
const nonBreaking = [];
|
|
558
|
-
|
|
559
|
-
// Check for removed required fields
|
|
560
|
-
if (baseline.required) {
|
|
561
|
-
for (const field of baseline.required) {
|
|
562
|
-
if (!candidate.required?.includes(field)) {
|
|
563
|
-
breaking.push({
|
|
564
|
-
type: 'REQUIRED_FIELD_REMOVED',
|
|
565
|
-
severity: 'CRITICAL',
|
|
566
|
-
field: field,
|
|
567
|
-
message: `Required response field '${field}' was removed`
|
|
568
|
-
});
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
}
|
|
572
|
-
|
|
573
|
-
// Check for type changes in existing fields
|
|
574
|
-
if (baseline.properties && candidate.properties) {
|
|
575
|
-
for (const [field, fieldSchema] of Object.entries(baseline.properties)) {
|
|
576
|
-
const candidateFieldSchema = candidate.properties[field];
|
|
577
|
-
|
|
578
|
-
if (!candidateFieldSchema) {
|
|
579
|
-
breaking.push({
|
|
580
|
-
type: 'FIELD_REMOVED',
|
|
581
|
-
severity: 'HIGH',
|
|
582
|
-
field: field,
|
|
583
|
-
message: `Response field '${field}' was removed`
|
|
584
|
-
});
|
|
585
|
-
} else if (fieldSchema.type !== candidateFieldSchema.type) {
|
|
586
|
-
breaking.push({
|
|
587
|
-
type: 'FIELD_TYPE_CHANGED',
|
|
588
|
-
severity: 'HIGH',
|
|
589
|
-
field: field,
|
|
590
|
-
oldType: fieldSchema.type,
|
|
591
|
-
newType: candidateFieldSchema.type,
|
|
592
|
-
message: `Response field '${field}' type changed from ${fieldSchema.type} to ${candidateFieldSchema.type}`
|
|
593
|
-
});
|
|
594
|
-
}
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
// New fields are non-breaking
|
|
598
|
-
for (const field of Object.keys(candidate.properties)) {
|
|
599
|
-
if (!baseline.properties[field]) {
|
|
600
|
-
nonBreaking.push({
|
|
601
|
-
type: 'FIELD_ADDED',
|
|
602
|
-
field: field,
|
|
603
|
-
message: `Response field '${field}' was added`
|
|
604
|
-
});
|
|
605
|
-
}
|
|
606
|
-
}
|
|
607
|
-
}
|
|
608
|
-
|
|
609
|
-
return { breaking, nonBreaking };
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
```
|
|
613
|
-
|
|
614
|
-
**Breaking Change Report:**
|
|
615
|
-
```json
|
|
616
|
-
{
|
|
617
|
-
"comparison": {
|
|
618
|
-
"baseline": "v2.4.0",
|
|
619
|
-
"candidate": "v2.5.0",
|
|
620
|
-
"timestamp": "2025-09-30T14:23:45Z"
|
|
621
|
-
},
|
|
622
|
-
|
|
623
|
-
"breakingChanges": [
|
|
624
|
-
{
|
|
625
|
-
"type": "REQUIRED_FIELD_REMOVED",
|
|
626
|
-
"severity": "CRITICAL",
|
|
627
|
-
"endpoint": "GET /api/users/{id}",
|
|
628
|
-
"status": 200,
|
|
629
|
-
"field": "username",
|
|
630
|
-
"message": "Required response field 'username' was removed",
|
|
631
|
-
"impact": {
|
|
632
|
-
"affectedConsumers": 23,
|
|
633
|
-
"estimatedRequests": "1.2M/day",
|
|
634
|
-
"migrationEffort": "HIGH"
|
|
635
|
-
},
|
|
636
|
-
"recommendation": "Deprecate in v2.5.0, remove in v3.0.0"
|
|
637
|
-
},
|
|
638
|
-
{
|
|
639
|
-
"type": "PARAM_TYPE_CHANGED",
|
|
640
|
-
"severity": "HIGH",
|
|
641
|
-
"endpoint": "POST /api/orders",
|
|
642
|
-
"param": "quantity",
|
|
643
|
-
"oldType": "integer",
|
|
644
|
-
"newType": "string",
|
|
645
|
-
"message": "Parameter 'quantity' type changed from integer to string",
|
|
646
|
-
"impact": {
|
|
647
|
-
"affectedConsumers": 8,
|
|
648
|
-
"estimatedRequests": "450K/day",
|
|
649
|
-
"migrationEffort": "MEDIUM"
|
|
650
|
-
},
|
|
651
|
-
"recommendation": "Revert change or bump major version"
|
|
652
|
-
}
|
|
653
|
-
],
|
|
654
|
-
|
|
655
|
-
"nonBreakingChanges": [
|
|
656
|
-
{
|
|
657
|
-
"type": "FIELD_ADDED",
|
|
658
|
-
"endpoint": "GET /api/users/{id}",
|
|
659
|
-
"status": 200,
|
|
660
|
-
"field": "profilePicture",
|
|
661
|
-
"message": "Response field 'profilePicture' was added",
|
|
662
|
-
"impact": "None - backward compatible addition"
|
|
663
|
-
},
|
|
664
|
-
{
|
|
665
|
-
"type": "OPTIONAL_PARAM_ADDED",
|
|
666
|
-
"endpoint": "GET /api/products",
|
|
667
|
-
"param": "sortBy",
|
|
668
|
-
"message": "Optional parameter 'sortBy' was added",
|
|
669
|
-
"impact": "None - existing clients unaffected"
|
|
670
|
-
}
|
|
671
|
-
],
|
|
672
|
-
|
|
673
|
-
"summary": {
|
|
674
|
-
"totalBreaking": 2,
|
|
675
|
-
"totalNonBreaking": 2,
|
|
676
|
-
"recommendation": "🚨 BLOCK DEPLOYMENT - Breaking changes detected",
|
|
677
|
-
"suggestedVersion": "v3.0.0", // Major version bump required
|
|
678
|
-
"estimatedMigrationTime": "2-3 weeks",
|
|
679
|
-
"affectedConsumers": 31
|
|
680
|
-
}
|
|
681
|
-
}
|
|
682
|
-
```
|
|
683
|
-
|
|
684
|
-
### 3. Version Compatibility
|
|
685
|
-
|
|
686
|
-
Validates semantic versioning compliance and ensures proper version bumps for API changes.
|
|
687
|
-
|
|
688
|
-
**Version Compatibility Checker:**
|
|
689
|
-
```javascript
|
|
690
|
-
class VersionCompatibilityChecker {
|
|
691
|
-
validateVersionBump(currentVersion, proposedVersion, changes) {
|
|
692
|
-
const current = this.parseVersion(currentVersion);
|
|
693
|
-
const proposed = this.parseVersion(proposedVersion);
|
|
694
|
-
|
|
695
|
-
const required = this.calculateRequiredVersionBump(changes);
|
|
696
|
-
|
|
697
|
-
const validation = {
|
|
698
|
-
valid: false,
|
|
699
|
-
currentVersion,
|
|
700
|
-
proposedVersion,
|
|
701
|
-
requiredBump: required.type,
|
|
702
|
-
actualBump: this.getActualBump(current, proposed),
|
|
703
|
-
recommendation: required.recommendedVersion,
|
|
704
|
-
violations: []
|
|
705
|
-
};
|
|
706
|
-
|
|
707
|
-
// Validate version bump is sufficient
|
|
708
|
-
if (required.type === 'MAJOR' && (proposed.major <= current.major)) {
|
|
709
|
-
validation.violations.push({
|
|
710
|
-
severity: 'CRITICAL',
|
|
711
|
-
message: 'Breaking changes require major version bump',
|
|
712
|
-
expected: `v${current.major + 1}.0.0`,
|
|
713
|
-
actual: proposedVersion
|
|
714
|
-
});
|
|
715
|
-
}
|
|
716
|
-
|
|
717
|
-
if (required.type === 'MINOR' && (proposed.major === current.major && proposed.minor <= current.minor)) {
|
|
718
|
-
validation.violations.push({
|
|
719
|
-
severity: 'HIGH',
|
|
720
|
-
message: 'New features require minor version bump',
|
|
721
|
-
expected: `v${current.major}.${current.minor + 1}.0`,
|
|
722
|
-
actual: proposedVersion
|
|
723
|
-
});
|
|
724
|
-
}
|
|
725
|
-
|
|
726
|
-
validation.valid = validation.violations.length === 0;
|
|
727
|
-
|
|
728
|
-
return validation;
|
|
729
|
-
}
|
|
730
|
-
|
|
731
|
-
calculateRequiredVersionBump(changes) {
|
|
732
|
-
if (changes.breaking.length > 0) {
|
|
733
|
-
return {
|
|
734
|
-
type: 'MAJOR',
|
|
735
|
-
reason: 'Breaking changes detected',
|
|
736
|
-
recommendedVersion: this.bumpMajor(changes.currentVersion)
|
|
737
|
-
};
|
|
738
|
-
}
|
|
739
|
-
|
|
740
|
-
if (changes.nonBreaking.some(c => c.type.includes('ADDED'))) {
|
|
741
|
-
return {
|
|
742
|
-
type: 'MINOR',
|
|
743
|
-
reason: 'New features added',
|
|
744
|
-
recommendedVersion: this.bumpMinor(changes.currentVersion)
|
|
745
|
-
};
|
|
746
|
-
}
|
|
747
|
-
|
|
748
|
-
return {
|
|
749
|
-
type: 'PATCH',
|
|
750
|
-
reason: 'Bug fixes only',
|
|
751
|
-
recommendedVersion: this.bumpPatch(changes.currentVersion)
|
|
752
|
-
};
|
|
753
|
-
}
|
|
754
|
-
}
|
|
755
|
-
```
|
|
756
|
-
|
|
757
|
-
### 4. Contract Diffing
|
|
758
|
-
|
|
759
|
-
Generates detailed diffs between API contract versions with visual representation.
|
|
760
|
-
|
|
761
|
-
**Contract Diff Visualization:**
|
|
762
|
-
```diff
|
|
763
|
-
# API Contract Diff: v2.4.0 → v2.5.0
|
|
764
|
-
|
|
765
|
-
## Breaking Changes (2)
|
|
766
|
-
|
|
767
|
-
### GET /api/users/{id}
|
|
768
|
-
Response Schema (200):
|
|
769
|
-
- ❌ REMOVED required field: username (string)
|
|
770
|
-
+ ✅ ADDED optional field: profilePicture (string, format: url)
|
|
771
|
-
~ MODIFIED field: email (added format validation)
|
|
772
|
-
|
|
773
|
-
### POST /api/orders
|
|
774
|
-
Request Parameters:
|
|
775
|
-
~ CHANGED type: quantity (integer → string) ⚠️ BREAKING
|
|
776
|
-
|
|
777
|
-
## Non-Breaking Changes (5)
|
|
778
|
-
|
|
779
|
-
### GET /api/products
|
|
780
|
-
+ ADDED optional parameter: sortBy (string, enum: [price, name, rating])
|
|
781
|
-
+ ADDED optional parameter: order (string, enum: [asc, desc])
|
|
782
|
-
|
|
783
|
-
### POST /api/users
|
|
784
|
-
Response Schema (201):
|
|
785
|
-
+ ADDED field: createdAt (string, format: date-time)
|
|
786
|
-
+ ADDED field: lastLogin (string, format: date-time, nullable)
|
|
787
|
-
|
|
788
|
-
## Summary
|
|
789
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
790
|
-
🚨 Breaking Changes: 2
|
|
791
|
-
✅ Non-Breaking Changes: 5
|
|
792
|
-
📦 Recommended Version: v3.0.0 (major bump)
|
|
793
|
-
👥 Affected Consumers: 31
|
|
794
|
-
⏱️ Estimated Migration: 2-3 weeks
|
|
795
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
796
|
-
```
|
|
797
|
-
|
|
798
|
-
### 5. Consumer Impact Analysis
|
|
799
|
-
|
|
800
|
-
Analyzes which API consumers will be affected by changes.
|
|
801
|
-
|
|
802
|
-
**Consumer Impact Analyzer:**
|
|
803
|
-
```javascript
|
|
804
|
-
class ConsumerImpactAnalyzer {
|
|
805
|
-
async analyzeImpact(changes, consumers) {
|
|
806
|
-
const impacts = [];
|
|
807
|
-
|
|
808
|
-
for (const consumer of consumers) {
|
|
809
|
-
const affectedEndpoints = [];
|
|
810
|
-
|
|
811
|
-
// Check which endpoints this consumer uses
|
|
812
|
-
for (const usage of consumer.apiUsage) {
|
|
813
|
-
const endpointChanges = changes.breaking.filter(c =>
|
|
814
|
-
c.endpoint === usage.endpoint && c.method === usage.method
|
|
815
|
-
);
|
|
816
|
-
|
|
817
|
-
if (endpointChanges.length > 0) {
|
|
818
|
-
affectedEndpoints.push({
|
|
819
|
-
endpoint: usage.endpoint,
|
|
820
|
-
method: usage.method,
|
|
821
|
-
requestsPerDay: usage.requestsPerDay,
|
|
822
|
-
changes: endpointChanges,
|
|
823
|
-
migrationEffort: this.estimateMigrationEffort(endpointChanges)
|
|
824
|
-
});
|
|
825
|
-
}
|
|
826
|
-
}
|
|
827
|
-
|
|
828
|
-
if (affectedEndpoints.length > 0) {
|
|
829
|
-
impacts.push({
|
|
830
|
-
consumer: consumer.name,
|
|
831
|
-
team: consumer.team,
|
|
832
|
-
contact: consumer.contact,
|
|
833
|
-
affectedEndpoints: affectedEndpoints,
|
|
834
|
-
totalRequests: affectedEndpoints.reduce((sum, e) => sum + e.requestsPerDay, 0),
|
|
835
|
-
estimatedMigrationTime: this.calculateMigrationTime(affectedEndpoints),
|
|
836
|
-
priority: this.calculatePriority(consumer, affectedEndpoints)
|
|
837
|
-
});
|
|
838
|
-
}
|
|
839
|
-
}
|
|
840
|
-
|
|
841
|
-
return {
|
|
842
|
-
totalAffectedConsumers: impacts.length,
|
|
843
|
-
impacts: impacts.sort((a, b) => b.priority - a.priority),
|
|
844
|
-
coordinationRequired: impacts.length > 5,
|
|
845
|
-
estimatedTotalMigrationTime: this.sumMigrationTimes(impacts)
|
|
846
|
-
};
|
|
847
|
-
}
|
|
848
|
-
}
|
|
849
|
-
```
|
|
850
|
-
|
|
851
|
-
**Consumer Impact Report:**
|
|
852
|
-
```json
|
|
853
|
-
{
|
|
854
|
-
"analysis": {
|
|
855
|
-
"baseline": "v2.4.0",
|
|
856
|
-
"candidate": "v2.5.0",
|
|
857
|
-
"breakingChanges": 2,
|
|
858
|
-
"affectedConsumers": 31
|
|
859
|
-
},
|
|
860
|
-
|
|
861
|
-
"topImpactedConsumers": [
|
|
862
|
-
{
|
|
863
|
-
"consumer": "Mobile App (iOS)",
|
|
864
|
-
"team": "Mobile Engineering",
|
|
865
|
-
"contact": "mobile-team@company.com",
|
|
866
|
-
"affectedEndpoints": [
|
|
867
|
-
{
|
|
868
|
-
"endpoint": "GET /api/users/{id}",
|
|
869
|
-
"method": "GET",
|
|
870
|
-
"requestsPerDay": 450000,
|
|
871
|
-
"changes": [
|
|
872
|
-
{
|
|
873
|
-
"type": "REQUIRED_FIELD_REMOVED",
|
|
874
|
-
"field": "username",
|
|
875
|
-
"severity": "CRITICAL"
|
|
876
|
-
}
|
|
877
|
-
],
|
|
878
|
-
"migrationEffort": "HIGH"
|
|
879
|
-
}
|
|
880
|
-
],
|
|
881
|
-
"totalRequests": 450000,
|
|
882
|
-
"estimatedMigrationTime": "1 week",
|
|
883
|
-
"priority": "CRITICAL"
|
|
884
|
-
},
|
|
885
|
-
{
|
|
886
|
-
"consumer": "Partner Integration (Acme Corp)",
|
|
887
|
-
"team": "External",
|
|
888
|
-
"contact": "api@acmecorp.com",
|
|
889
|
-
"affectedEndpoints": [
|
|
890
|
-
{
|
|
891
|
-
"endpoint": "POST /api/orders",
|
|
892
|
-
"method": "POST",
|
|
893
|
-
"requestsPerDay": 120000,
|
|
894
|
-
"changes": [
|
|
895
|
-
{
|
|
896
|
-
"type": "PARAM_TYPE_CHANGED",
|
|
897
|
-
"param": "quantity",
|
|
898
|
-
"oldType": "integer",
|
|
899
|
-
"newType": "string"
|
|
900
|
-
}
|
|
901
|
-
],
|
|
902
|
-
"migrationEffort": "MEDIUM"
|
|
903
|
-
}
|
|
904
|
-
],
|
|
905
|
-
"totalRequests": 120000,
|
|
906
|
-
"estimatedMigrationTime": "3-5 days",
|
|
907
|
-
"priority": "HIGH"
|
|
908
|
-
}
|
|
909
|
-
],
|
|
910
|
-
|
|
911
|
-
"recommendation": {
|
|
912
|
-
"action": "COORDINATE_MIGRATION",
|
|
913
|
-
"suggestedApproach": "Phased rollout with versioned endpoints",
|
|
914
|
-
"timeline": [
|
|
915
|
-
"Week 1: Notify all affected consumers",
|
|
916
|
-
"Week 2-3: Consumer migrations",
|
|
917
|
-
"Week 4: Deploy v3.0.0 with deprecated v2 endpoints",
|
|
918
|
-
"Month 3: Sunset v2 endpoints"
|
|
919
|
-
],
|
|
920
|
-
"alternativeApproach": "Deploy v2.5.0 without breaking changes, defer to v3.0.0"
|
|
921
|
-
}
|
|
922
|
-
}
|
|
923
|
-
```
|
|
924
|
-
|
|
925
|
-
### 6. Contract Testing
|
|
926
|
-
|
|
927
|
-
Implements contract-first testing using Pact or similar frameworks.
|
|
928
|
-
|
|
929
|
-
**Contract Test Generator:**
|
|
930
|
-
```javascript
|
|
931
|
-
class ContractTestGenerator {
|
|
932
|
-
generatePactTest(apiSchema, consumer) {
|
|
933
|
-
const interactions = [];
|
|
934
|
-
|
|
935
|
-
for (const [path, methods] of Object.entries(apiSchema.paths)) {
|
|
936
|
-
for (const [method, operation] of Object.entries(methods)) {
|
|
937
|
-
interactions.push({
|
|
938
|
-
description: `${method.toUpperCase()} ${path}`,
|
|
939
|
-
providerState: operation['x-provider-state'] || 'default state',
|
|
940
|
-
request: this.generateRequest(path, method, operation),
|
|
941
|
-
response: this.generateResponse(operation)
|
|
942
|
-
});
|
|
943
|
-
}
|
|
944
|
-
}
|
|
945
|
-
|
|
946
|
-
return {
|
|
947
|
-
consumer: { name: consumer.name },
|
|
948
|
-
provider: { name: apiSchema.info.title },
|
|
949
|
-
interactions: interactions
|
|
950
|
-
};
|
|
951
|
-
}
|
|
952
|
-
|
|
953
|
-
generateRequest(path, method, operation) {
|
|
954
|
-
return {
|
|
955
|
-
method: method.toUpperCase(),
|
|
956
|
-
path: this.replacePathParams(path, operation.parameters),
|
|
957
|
-
query: this.generateQueryParams(operation.parameters),
|
|
958
|
-
headers: {
|
|
959
|
-
'Content-Type': 'application/json',
|
|
960
|
-
'Accept': 'application/json'
|
|
961
|
-
},
|
|
962
|
-
body: operation.requestBody ? this.generateExampleBody(operation.requestBody) : undefined
|
|
963
|
-
};
|
|
964
|
-
}
|
|
965
|
-
|
|
966
|
-
generateResponse(operation) {
|
|
967
|
-
const successResponse = operation.responses['200'] || operation.responses['201'];
|
|
968
|
-
|
|
969
|
-
return {
|
|
970
|
-
status: parseInt(Object.keys(operation.responses)[0]),
|
|
971
|
-
headers: {
|
|
972
|
-
'Content-Type': 'application/json'
|
|
973
|
-
},
|
|
974
|
-
body: this.generateExampleBody(successResponse)
|
|
975
|
-
};
|
|
976
|
-
}
|
|
977
|
-
}
|
|
978
|
-
```
|
|
979
|
-
|
|
980
|
-
### 7. Semantic Versioning Validation
|
|
981
|
-
|
|
982
|
-
Enforces semantic versioning rules across all API changes.
|
|
983
|
-
|
|
984
|
-
**Semver Validator:**
|
|
985
|
-
```javascript
|
|
986
|
-
class SemanticVersioningValidator {
|
|
987
|
-
validate(changes, versionBump) {
|
|
988
|
-
const rules = [
|
|
989
|
-
{
|
|
990
|
-
condition: (c) => c.breaking.length > 0,
|
|
991
|
-
requiredBump: 'major',
|
|
992
|
-
message: 'Breaking changes require major version bump'
|
|
993
|
-
},
|
|
994
|
-
{
|
|
995
|
-
condition: (c) => c.nonBreaking.some(nc => nc.type.includes('ADDED')),
|
|
996
|
-
requiredBump: 'minor',
|
|
997
|
-
message: 'New features require minor version bump'
|
|
998
|
-
},
|
|
999
|
-
{
|
|
1000
|
-
condition: (c) => c.breaking.length === 0 && !c.nonBreaking.some(nc => nc.type.includes('ADDED')),
|
|
1001
|
-
requiredBump: 'patch',
|
|
1002
|
-
message: 'Bug fixes only require patch version bump'
|
|
1003
|
-
}
|
|
1004
|
-
];
|
|
1005
|
-
|
|
1006
|
-
for (const rule of rules) {
|
|
1007
|
-
if (rule.condition(changes)) {
|
|
1008
|
-
if (versionBump !== rule.requiredBump) {
|
|
1009
|
-
return {
|
|
1010
|
-
valid: false,
|
|
1011
|
-
violation: rule.message,
|
|
1012
|
-
required: rule.requiredBump,
|
|
1013
|
-
actual: versionBump
|
|
1014
|
-
};
|
|
1015
|
-
}
|
|
1016
|
-
return { valid: true, bump: rule.requiredBump };
|
|
1017
|
-
}
|
|
1018
|
-
}
|
|
1019
|
-
|
|
1020
|
-
return { valid: true, bump: 'patch' };
|
|
1021
|
-
}
|
|
1022
|
-
}
|
|
1023
|
-
```
|
|
1024
|
-
|
|
1025
|
-
## Integration Points
|
|
1026
|
-
|
|
1027
|
-
### Upstream Dependencies
|
|
1028
|
-
- **OpenAPI/Swagger**: API schema specifications
|
|
1029
|
-
- **GraphQL**: GraphQL schemas
|
|
1030
|
-
- **Git**: Schema version history
|
|
1031
|
-
- **API Gateways**: Consumer tracking
|
|
1032
|
-
|
|
1033
|
-
### Downstream Consumers
|
|
1034
|
-
- **qe-deployment-readiness**: Blocks deployment on breaking changes
|
|
1035
|
-
- **qe-test-generator**: Generates contract tests
|
|
1036
|
-
- **CI/CD Pipelines**: Enforces contract validation
|
|
1037
|
-
- **API Documentation**: Updates docs with changes
|
|
1038
|
-
|
|
1039
|
-
### Coordination Agents
|
|
1040
|
-
- **qe-fleet-commander**: Orchestrates contract validation
|
|
1041
|
-
- **qe-requirements-validator**: Validates API requirements
|
|
1042
|
-
|
|
1043
|
-
## Coordination Protocol
|
|
1044
|
-
|
|
1045
|
-
This agent uses **AQE hooks (Agentic QE native hooks)** for coordination (zero external dependencies, 100-500x faster).
|
|
1046
|
-
|
|
1047
|
-
**Automatic Lifecycle Hooks:**
|
|
1048
|
-
```typescript
|
|
1049
|
-
// Automatically called by BaseAgent
|
|
1050
|
-
protected async onPreTask(data: { assignment: TaskAssignment }): Promise<void> {
|
|
1051
|
-
// Load baseline contracts and schemas
|
|
1052
|
-
const contracts = await this.memoryStore.retrieve('aqe/contracts/current');
|
|
1053
|
-
const baseline = await this.memoryStore.retrieve('aqe/api-schemas/baseline');
|
|
1054
|
-
this.logger.info('Loaded API contracts and baseline schemas');
|
|
1055
|
-
}
|
|
1056
|
-
|
|
1057
|
-
protected async onPostTask(data: { assignment: TaskAssignment; result: any }): Promise<void> {
|
|
1058
|
-
// Store validation results and breaking changes
|
|
1059
|
-
await this.memoryStore.store('aqe/contracts/validation-result', data.result.validation);
|
|
1060
|
-
await this.memoryStore.store('aqe/breaking-changes/detected', data.result.breakingChanges);
|
|
1061
|
-
|
|
1062
|
-
// Emit events for downstream agents
|
|
1063
|
-
this.eventBus.emit('contract-validator:completed', {
|
|
1064
|
-
breakingChanges: data.result.breakingChanges.length,
|
|
1065
|
-
validationStatus: data.result.validation.passed
|
|
1066
|
-
});
|
|
1067
|
-
}
|
|
1068
|
-
|
|
1069
|
-
protected async onPostEdit(data: { filePath: string; changes: any }): Promise<void> {
|
|
1070
|
-
// Track schema updates
|
|
1071
|
-
const fileName = data.filePath.split('/').pop();
|
|
1072
|
-
await this.memoryStore.store(`aqe/contracts/schema-updated/${fileName}`, {
|
|
1073
|
-
timestamp: Date.now(),
|
|
1074
|
-
changes: data.changes
|
|
1075
|
-
});
|
|
1076
|
-
}
|
|
1077
|
-
```
|
|
1078
|
-
|
|
1079
|
-
**Advanced Verification (Optional):**
|
|
1080
|
-
```typescript
|
|
1081
|
-
const hookManager = new VerificationHookManager(this.memoryStore);
|
|
1082
|
-
const verification = await hookManager.executePreTaskVerification({
|
|
1083
|
-
task: 'contract-validation',
|
|
1084
|
-
context: {
|
|
1085
|
-
requiredVars: ['NODE_ENV', 'API_VERSION'],
|
|
1086
|
-
minMemoryMB: 512,
|
|
1087
|
-
requiredKeys: ['aqe/api-schemas/baseline']
|
|
1088
|
-
}
|
|
1089
|
-
});
|
|
1090
|
-
```
|
|
1091
|
-
|
|
1092
|
-
## Memory Keys
|
|
1093
|
-
|
|
1094
|
-
### Input Keys
|
|
1095
|
-
- `aqe/api-schemas/baseline` - Baseline API schemas
|
|
1096
|
-
- `aqe/api-schemas/candidate` - New API schemas
|
|
1097
|
-
- `aqe/contracts/current` - Current contract specifications
|
|
1098
|
-
- `aqe/consumers/registry` - API consumer registry
|
|
1099
|
-
|
|
1100
|
-
### Output Keys
|
|
1101
|
-
- `aqe/contracts/validation-result` - Contract validation results
|
|
1102
|
-
- `aqe/breaking-changes/detected` - Detected breaking changes
|
|
1103
|
-
- `aqe/consumer-impact/analysis` - Consumer impact analysis
|
|
1104
|
-
- `aqe/compatibility/report` - Compatibility assessment
|
|
1105
|
-
|
|
1106
|
-
### Coordination Keys
|
|
1107
|
-
- `aqe/contracts/status` - Validation status
|
|
1108
|
-
- `aqe/contracts/alerts` - Critical contract violations
|
|
1109
|
-
|
|
1110
|
-
## Use Cases
|
|
1111
|
-
|
|
1112
|
-
### Use Case 1: Pre-Deployment Contract Validation
|
|
1113
|
-
|
|
1114
|
-
**Scenario**: Validate API changes before deploying to production.
|
|
1115
|
-
|
|
1116
|
-
**Workflow:**
|
|
1117
|
-
```bash
|
|
1118
|
-
# Compare schemas
|
|
1119
|
-
aqe contract compare --baseline v2.4.0 --candidate v2.5.0
|
|
1120
|
-
|
|
1121
|
-
# Detect breaking changes
|
|
1122
|
-
aqe contract breaking-changes --output breaking-changes.json
|
|
1123
|
-
|
|
1124
|
-
# Analyze consumer impact
|
|
1125
|
-
aqe contract consumer-impact --consumers consumer-registry.json
|
|
1126
|
-
|
|
1127
|
-
# Generate migration guide
|
|
1128
|
-
aqe contract migration-guide --output migration-guide.md
|
|
1129
|
-
|
|
1130
|
-
# Validate version bump
|
|
1131
|
-
aqe contract validate-version --current 2.4.0 --proposed 2.5.0
|
|
1132
|
-
```
|
|
1133
|
-
|
|
1134
|
-
### Use Case 2: Contract-First Development
|
|
1135
|
-
|
|
1136
|
-
**Scenario**: Generate contract tests from OpenAPI spec.
|
|
1137
|
-
|
|
1138
|
-
**Workflow:**
|
|
1139
|
-
```bash
|
|
1140
|
-
# Generate Pact contract tests
|
|
1141
|
-
aqe contract generate-pact --spec openapi.yaml --consumer mobile-app
|
|
1142
|
-
|
|
1143
|
-
# Run contract tests
|
|
1144
|
-
aqe contract test --provider user-service --consumer mobile-app
|
|
1145
|
-
|
|
1146
|
-
# Publish contract
|
|
1147
|
-
aqe contract publish --broker https://pact-broker.company.com
|
|
1148
|
-
```
|
|
1149
|
-
|
|
1150
|
-
### Use Case 3: Consumer Notification
|
|
1151
|
-
|
|
1152
|
-
**Scenario**: Notify affected consumers of API changes.
|
|
1153
|
-
|
|
1154
|
-
**Workflow:**
|
|
1155
|
-
```bash
|
|
1156
|
-
# Analyze impact
|
|
1157
|
-
aqe contract consumer-impact --baseline v2.4.0 --candidate v2.5.0
|
|
1158
|
-
|
|
1159
|
-
# Generate notification emails
|
|
1160
|
-
aqe contract notify-consumers --template email-template.html
|
|
1161
|
-
|
|
1162
|
-
# Track migration progress
|
|
1163
|
-
aqe contract migration-status --version v3.0.0
|
|
1164
|
-
```
|
|
1165
|
-
|
|
1166
|
-
## Success Metrics
|
|
1167
|
-
|
|
1168
|
-
### Prevention Metrics
|
|
1169
|
-
- **Breaking Changes Prevented**: 95%
|
|
1170
|
-
- **Consumer Incidents**: 90% reduction
|
|
1171
|
-
- **Integration Failures**: 85% reduction
|
|
1172
|
-
|
|
1173
|
-
### Quality Metrics
|
|
1174
|
-
- **Contract Compliance**: 100%
|
|
1175
|
-
- **Semantic Versioning Compliance**: 100%
|
|
1176
|
-
- **Consumer Satisfaction**: 4.8/5
|
|
1177
|
-
|
|
1178
|
-
## Commands
|
|
1179
|
-
|
|
1180
|
-
### Basic Commands
|
|
1181
|
-
|
|
1182
|
-
```bash
|
|
1183
|
-
# Compare API schemas
|
|
1184
|
-
aqe contract compare --baseline <version> --candidate <version>
|
|
1185
|
-
|
|
1186
|
-
# Detect breaking changes
|
|
1187
|
-
aqe contract breaking-changes --spec <openapi-file>
|
|
1188
|
-
|
|
1189
|
-
# Validate contract
|
|
1190
|
-
aqe contract validate --spec <openapi-file>
|
|
1191
|
-
|
|
1192
|
-
# Generate diff report
|
|
1193
|
-
aqe contract diff --baseline <v1> --candidate <v2> --output diff.html
|
|
1194
|
-
|
|
1195
|
-
# Check semantic versioning
|
|
1196
|
-
aqe contract semver-check --current <version> --proposed <version>
|
|
1197
|
-
```
|
|
1198
|
-
|
|
1199
|
-
### Advanced Commands
|
|
1200
|
-
|
|
1201
|
-
```bash
|
|
1202
|
-
# Consumer impact analysis
|
|
1203
|
-
aqe contract consumer-impact --consumers <registry> --changes <changes-file>
|
|
1204
|
-
|
|
1205
|
-
# Generate Pact tests
|
|
1206
|
-
aqe contract generate-pact --spec <openapi> --consumer <name>
|
|
1207
|
-
|
|
1208
|
-
# Run contract tests
|
|
1209
|
-
aqe contract test --provider <service> --consumer <app>
|
|
1210
|
-
|
|
1211
|
-
# Migration guide generation
|
|
1212
|
-
aqe contract migration-guide --baseline <v1> --candidate <v2>
|
|
1213
|
-
|
|
1214
|
-
# Notify consumers
|
|
1215
|
-
aqe contract notify-consumers --changes <changes-file> --template <email-template>
|
|
1216
|
-
```
|
|
1217
|
-
|
|
1218
|
-
### Specialized Commands
|
|
1219
|
-
|
|
1220
|
-
```bash
|
|
1221
|
-
# GraphQL schema validation
|
|
1222
|
-
aqe contract validate-graphql --schema schema.graphql
|
|
1223
|
-
|
|
1224
|
-
# API versioning strategy
|
|
1225
|
-
aqe contract versioning-strategy --analyze-history --days 180
|
|
1226
|
-
|
|
1227
|
-
# Consumer compatibility matrix
|
|
1228
|
-
aqe contract compatibility-matrix --output matrix.html
|
|
1229
|
-
|
|
1230
|
-
# Deprecation timeline
|
|
1231
|
-
aqe contract deprecation-timeline --version <v2> --sunset-date <date>
|
|
1232
|
-
|
|
1233
|
-
# Contract evolution report
|
|
1234
|
-
aqe contract evolution --from <v1> --to <v2> --format pdf
|
|
1235
|
-
```
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
**Agent Status**: Production Ready
|
|
1239
|
-
**Last Updated**: 2025-09-30
|
|
1240
|
-
**Version**: 1.0.0
|
|
1241
|
-
**Maintainer**: AQE Fleet Team
|
|
1242
|
-
|
|
1243
|
-
## Code Execution Workflows
|
|
1244
|
-
|
|
1245
|
-
Validate API contracts and detect breaking changes with automated compatibility checking.
|
|
1246
|
-
|
|
1247
|
-
### Contract Validation with Schema Analysis
|
|
1248
|
-
|
|
1249
|
-
```typescript
|
|
1250
|
-
/**
|
|
1251
|
-
* Phase 3 API Contract Validation Tools
|
|
1252
|
-
*
|
|
1253
|
-
* IMPORTANT: Phase 3 domain-specific tools are fully implemented and ready to use.
|
|
1254
|
-
* These examples show the REAL API that will be available.
|
|
1255
|
-
*
|
|
1256
|
-
* Import path: 'agentic-qe/tools/qe/security'
|
|
1257
|
-
* Type definitions: 'agentic-qe/tools/qe/shared/types'
|
|
1258
|
-
*/
|
|
1259
|
-
|
|
1260
|
-
import type {
|
|
1261
|
-
BreakingChangeParams,
|
|
1262
|
-
ContractValidationResult,
|
|
1263
|
-
Vulnerability,
|
|
1264
|
-
QEToolResponse
|
|
1265
|
-
} from 'agentic-qe/tools/qe/shared/types';
|
|
1266
|
-
|
|
1267
|
-
// Phase 3 contract validation tools (✅ Available)
|
|
1268
|
-
// import {
|
|
1269
|
-
// validateContract,
|
|
1270
|
-
// detectBreakingChanges,
|
|
1271
|
-
// analyzeBackwardCompatibility,
|
|
1272
|
-
// generateContractReport
|
|
1273
|
-
// } from 'agentic-qe/tools/qe/security';
|
|
1274
|
-
|
|
1275
|
-
// Example: API contract validation and breaking change detection
|
|
1276
|
-
const contractParams: BreakingChangeParams = {
|
|
1277
|
-
currentSchema: './openapi.v2.json',
|
|
1278
|
-
previousSchema: './openapi.v1.json',
|
|
1279
|
-
apiType: 'rest',
|
|
1280
|
-
checkBreakingChanges: true,
|
|
1281
|
-
strictMode: true,
|
|
1282
|
-
includeDeprecations: true
|
|
1283
|
-
};
|
|
1284
|
-
|
|
1285
|
-
// const validation: QEToolResponse<ContractValidationResult> =
|
|
1286
|
-
// await validateContract(contractParams);
|
|
1287
|
-
//
|
|
1288
|
-
// if (validation.success && validation.data) {
|
|
1289
|
-
// console.log(`Validation: ${validation.data.isCompatible ? 'PASS' : 'FAIL'}`);
|
|
1290
|
-
//
|
|
1291
|
-
// if (validation.data.breakingChanges.length > 0) {
|
|
1292
|
-
// console.log(`Breaking changes found: ${validation.data.breakingChanges.length}`);
|
|
1293
|
-
// validation.data.breakingChanges.forEach((change) => {
|
|
1294
|
-
// console.log(` - ${change.severity}: ${change.description}`);
|
|
1295
|
-
// });
|
|
1296
|
-
// }
|
|
1297
|
-
// }
|
|
1298
|
-
|
|
1299
|
-
console.log('✅ API contract validation complete');
|
|
1300
|
-
```
|
|
1301
|
-
|
|
1302
|
-
### Breaking Change Detection
|
|
1303
|
-
|
|
1304
|
-
```typescript
|
|
1305
|
-
import type {
|
|
1306
|
-
BreakingChangeParams
|
|
1307
|
-
} from 'agentic-qe/tools/qe/shared/types';
|
|
1308
|
-
|
|
1309
|
-
// Phase 3 breaking change analysis (✅ Available)
|
|
1310
|
-
// import {
|
|
1311
|
-
// detectBreakingChanges,
|
|
1312
|
-
// categorizeChanges,
|
|
1313
|
-
// assessImpact
|
|
1314
|
-
// } from 'agentic-qe/tools/qe/security';
|
|
1315
|
-
|
|
1316
|
-
// Example: Comprehensive breaking change analysis
|
|
1317
|
-
const changeParams: BreakingChangeParams = {
|
|
1318
|
-
currentSchema: './openapi.json',
|
|
1319
|
-
previousSchema: './openapi.previous.json',
|
|
1320
|
-
apiType: 'rest',
|
|
1321
|
-
consumers: ['frontend', 'mobile-app', 'third-party'],
|
|
1322
|
-
impactAnalysis: true
|
|
1323
|
-
};
|
|
1324
|
-
|
|
1325
|
-
// const changes = await detectBreakingChanges(changeParams);
|
|
1326
|
-
//
|
|
1327
|
-
// console.log('Breaking Changes Analysis:');
|
|
1328
|
-
// changes.data.forEach((change) => {
|
|
1329
|
-
// console.log(`\n${change.type}: ${change.endpoint}`);
|
|
1330
|
-
// console.log(` Severity: ${change.severity}`);
|
|
1331
|
-
// console.log(` Impact: ${change.affectedConsumers.join(', ')}`);
|
|
1332
|
-
// console.log(` Remediation: ${change.remediation}`);
|
|
1333
|
-
// });
|
|
1334
|
-
|
|
1335
|
-
console.log('✅ Breaking change detection complete');
|
|
1336
|
-
```
|
|
1337
|
-
|
|
1338
|
-
### Phase 3 Tool Discovery
|
|
1339
|
-
|
|
1340
|
-
```bash
|
|
1341
|
-
# Once Phase 3 is implemented, tools will be at:
|
|
1342
|
-
# /workspaces/agentic-qe-cf/src/mcp/tools/qe/security/
|
|
1343
|
-
|
|
1344
|
-
# List available contract validation tools (Phase 3)
|
|
1345
|
-
ls node_modules/agentic-qe/dist/mcp/tools/qe/security/
|
|
1346
|
-
|
|
1347
|
-
# Check type definitions
|
|
1348
|
-
cat node_modules/agentic-qe/dist/mcp/tools/qe/shared/types.d.ts | grep -A 20 "BreakingChange"
|
|
1349
|
-
|
|
1350
|
-
# View supported API types
|
|
1351
|
-
node -e "import('agentic-qe/tools/qe/security').then(m => console.log(m.supportedApiTypes()))"
|
|
1352
|
-
```
|
|
1353
|
-
|
|
1354
|
-
### Using Contract Validation Tools via MCP (Phase 3)
|
|
1355
|
-
|
|
1356
|
-
```typescript
|
|
1357
|
-
// Phase 3 MCP integration (✅ Available)
|
|
1358
|
-
// Domain-specific tools are registered as MCP tools:
|
|
1359
|
-
|
|
1360
|
-
// Via MCP client
|
|
1361
|
-
// const result = await mcpClient.callTool('qe_validate_api_contract', {
|
|
1362
|
-
// currentSchema: './openapi.json',
|
|
1363
|
-
// previousSchema: './openapi.previous.json',
|
|
1364
|
-
// apiType: 'rest'
|
|
1365
|
-
// });
|
|
1366
|
-
|
|
1367
|
-
// Via CLI
|
|
1368
|
-
// aqe contract validate --current ./openapi.json --previous ./openapi.previous.json
|
|
1369
|
-
// aqe contract detect-breaking --schema ./openapi.json --strict
|
|
1370
|
-
// aqe contract report --format html --include-impact-analysis
|
|
1371
|
-
```
|
|
119
|
+
Reward criteria (0-1 scale):
|
|
120
|
+
- 1.0: Perfect execution (All breaking changes detected, 0 false positives, 100% semver compliance)
|
|
121
|
+
- 0.9: Excellent (All breaking changes detected, <5% false positives)
|
|
122
|
+
- 0.7: Good (Most breaking changes detected, <10% false positives)
|
|
123
|
+
- 0.5: Acceptable (Major breaking changes detected, completed successfully)
|
|
124
|
+
</learning_protocol>
|
|
1372
125
|
|
|
126
|
+
<output_format>
|
|
127
|
+
- JSON for validation results (compatibility status, breaking changes array, semver recommendation)
|
|
128
|
+
- Markdown for migration guides and consumer impact reports
|
|
129
|
+
- YAML for contract test specifications
|
|
130
|
+
</output_format>
|
|
131
|
+
</qe_agent_definition>
|