agentic-qe 2.4.0 → 2.5.1
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-a11y-ally.md +855 -0
- package/.claude/agents/qx-partner.md +120 -4
- package/.claude/skills/testability-scoring/SKILL.md +107 -6
- package/CHANGELOG.md +135 -0
- package/README.md +7 -6
- package/dist/agents/AccessibilityAllyAgent.d.ts +168 -0
- package/dist/agents/AccessibilityAllyAgent.d.ts.map +1 -0
- package/dist/agents/AccessibilityAllyAgent.js +462 -0
- package/dist/agents/AccessibilityAllyAgent.js.map +1 -0
- package/dist/agents/SONAIntegration.d.ts +109 -0
- package/dist/agents/SONAIntegration.d.ts.map +1 -0
- package/dist/agents/SONAIntegration.js +167 -0
- package/dist/agents/SONAIntegration.js.map +1 -0
- package/dist/agents/index.d.ts +3 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +93 -2
- package/dist/agents/index.js.map +1 -1
- package/dist/cli/init/agents.js +1 -1
- package/dist/cli/init/claude-config.js +2 -2
- package/dist/cli/init/database-init.js +1 -1
- package/dist/core/cache/BinaryCacheImpl.d.ts +161 -0
- package/dist/core/cache/BinaryCacheImpl.d.ts.map +1 -0
- package/dist/core/cache/BinaryCacheImpl.js +685 -0
- package/dist/core/cache/BinaryCacheImpl.js.map +1 -0
- package/dist/core/cache/BinaryMetadataCache.d.ts +244 -0
- package/dist/core/cache/BinaryMetadataCache.d.ts.map +1 -1
- package/dist/core/cache/BinaryMetadataCache.js +63 -1
- package/dist/core/cache/BinaryMetadataCache.js.map +1 -1
- package/dist/core/cache/index.d.ts +1 -0
- package/dist/core/cache/index.d.ts.map +1 -1
- package/dist/core/cache/index.js +10 -1
- package/dist/core/cache/index.js.map +1 -1
- package/dist/core/memory/AgentDBService.d.ts +30 -4
- package/dist/core/memory/AgentDBService.d.ts.map +1 -1
- package/dist/core/memory/AgentDBService.js +122 -12
- package/dist/core/memory/AgentDBService.js.map +1 -1
- package/dist/core/memory/CachedHNSWVectorMemory.d.ts +153 -0
- package/dist/core/memory/CachedHNSWVectorMemory.d.ts.map +1 -0
- package/dist/core/memory/CachedHNSWVectorMemory.js +329 -0
- package/dist/core/memory/CachedHNSWVectorMemory.js.map +1 -0
- package/dist/core/memory/HNSWVectorMemory.js +1 -1
- package/dist/core/memory/RuVectorPatternStore.d.ts.map +1 -1
- package/dist/core/memory/RuVectorPatternStore.js +8 -2
- package/dist/core/memory/RuVectorPatternStore.js.map +1 -1
- package/dist/core/memory/UnifiedMemoryCoordinator.d.ts +50 -0
- package/dist/core/memory/UnifiedMemoryCoordinator.d.ts.map +1 -1
- package/dist/core/memory/UnifiedMemoryCoordinator.js +206 -0
- package/dist/core/memory/UnifiedMemoryCoordinator.js.map +1 -1
- package/dist/core/memory/index.d.ts +2 -0
- package/dist/core/memory/index.d.ts.map +1 -1
- package/dist/core/memory/index.js +8 -1
- package/dist/core/memory/index.js.map +1 -1
- package/dist/core/optimization/RecursiveOptimizer.d.ts +233 -0
- package/dist/core/optimization/RecursiveOptimizer.d.ts.map +1 -0
- package/dist/core/optimization/RecursiveOptimizer.js +509 -0
- package/dist/core/optimization/RecursiveOptimizer.js.map +1 -0
- package/dist/core/strategies/SONALearningStrategy.d.ts +115 -0
- package/dist/core/strategies/SONALearningStrategy.d.ts.map +1 -0
- package/dist/core/strategies/SONALearningStrategy.js +656 -0
- package/dist/core/strategies/SONALearningStrategy.js.map +1 -0
- package/dist/core/strategies/TRMLearningStrategy.d.ts +162 -0
- package/dist/core/strategies/TRMLearningStrategy.d.ts.map +1 -0
- package/dist/core/strategies/TRMLearningStrategy.js +670 -0
- package/dist/core/strategies/TRMLearningStrategy.js.map +1 -0
- package/dist/core/strategies/index.d.ts +10 -1
- package/dist/core/strategies/index.d.ts.map +1 -1
- package/dist/core/strategies/index.js +4 -1
- package/dist/core/strategies/index.js.map +1 -1
- package/dist/learning/SONAFeedbackLoop.d.ts +168 -0
- package/dist/learning/SONAFeedbackLoop.d.ts.map +1 -0
- package/dist/learning/SONAFeedbackLoop.js +344 -0
- package/dist/learning/SONAFeedbackLoop.js.map +1 -0
- package/dist/learning/baselines/BaselineCollector.d.ts +1 -1
- package/dist/learning/baselines/BaselineCollector.js +1 -1
- package/dist/learning/baselines/StandardTaskSuite.d.ts +1 -1
- package/dist/learning/baselines/StandardTaskSuite.js +1 -1
- package/dist/learning/index.d.ts +2 -0
- package/dist/learning/index.d.ts.map +1 -1
- package/dist/learning/index.js +6 -1
- package/dist/learning/index.js.map +1 -1
- package/dist/mcp/server-instructions.d.ts +1 -1
- package/dist/mcp/server-instructions.js +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +23 -16
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/services/AgentRegistry.d.ts.map +1 -1
- package/dist/mcp/services/AgentRegistry.js +6 -1
- package/dist/mcp/services/AgentRegistry.js.map +1 -1
- package/dist/mcp/tools/qe/accessibility/accname-computation.d.ts +114 -0
- package/dist/mcp/tools/qe/accessibility/accname-computation.d.ts.map +1 -0
- package/dist/mcp/tools/qe/accessibility/accname-computation.js +566 -0
- package/dist/mcp/tools/qe/accessibility/accname-computation.js.map +1 -0
- package/dist/mcp/tools/qe/accessibility/apg-patterns.d.ts +103 -0
- package/dist/mcp/tools/qe/accessibility/apg-patterns.d.ts.map +1 -0
- package/dist/mcp/tools/qe/accessibility/apg-patterns.js +1028 -0
- package/dist/mcp/tools/qe/accessibility/apg-patterns.js.map +1 -0
- package/dist/mcp/tools/qe/accessibility/en-301-549-mapping.d.ts +48 -0
- package/dist/mcp/tools/qe/accessibility/en-301-549-mapping.d.ts.map +1 -0
- package/dist/mcp/tools/qe/accessibility/en-301-549-mapping.js +565 -0
- package/dist/mcp/tools/qe/accessibility/en-301-549-mapping.js.map +1 -0
- package/dist/mcp/tools/qe/accessibility/eu-accessibility-act.d.ts +117 -0
- package/dist/mcp/tools/qe/accessibility/eu-accessibility-act.d.ts.map +1 -0
- package/dist/mcp/tools/qe/accessibility/eu-accessibility-act.js +571 -0
- package/dist/mcp/tools/qe/accessibility/eu-accessibility-act.js.map +1 -0
- package/dist/mcp/tools/qe/accessibility/html-report-generator.d.ts +23 -0
- package/dist/mcp/tools/qe/accessibility/html-report-generator.d.ts.map +1 -0
- package/dist/mcp/tools/qe/accessibility/html-report-generator.js +1152 -0
- package/dist/mcp/tools/qe/accessibility/html-report-generator.js.map +1 -0
- package/dist/mcp/tools/qe/accessibility/index.d.ts +22 -0
- package/dist/mcp/tools/qe/accessibility/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/accessibility/index.js +38 -0
- package/dist/mcp/tools/qe/accessibility/index.js.map +1 -0
- package/dist/mcp/tools/qe/accessibility/markdown-report-generator.d.ts +18 -0
- package/dist/mcp/tools/qe/accessibility/markdown-report-generator.d.ts.map +1 -0
- package/dist/mcp/tools/qe/accessibility/markdown-report-generator.js +549 -0
- package/dist/mcp/tools/qe/accessibility/markdown-report-generator.js.map +1 -0
- package/dist/mcp/tools/qe/accessibility/remediation-code-generator.d.ts +139 -0
- package/dist/mcp/tools/qe/accessibility/remediation-code-generator.d.ts.map +1 -0
- package/dist/mcp/tools/qe/accessibility/remediation-code-generator.js +1300 -0
- package/dist/mcp/tools/qe/accessibility/remediation-code-generator.js.map +1 -0
- package/dist/mcp/tools/qe/accessibility/scan-comprehensive.d.ts +138 -0
- package/dist/mcp/tools/qe/accessibility/scan-comprehensive.d.ts.map +1 -0
- package/dist/mcp/tools/qe/accessibility/scan-comprehensive.js +1298 -0
- package/dist/mcp/tools/qe/accessibility/scan-comprehensive.js.map +1 -0
- package/dist/mcp/tools/qe/accessibility/video-vision-analyzer.d.ts +50 -0
- package/dist/mcp/tools/qe/accessibility/video-vision-analyzer.d.ts.map +1 -0
- package/dist/mcp/tools/qe/accessibility/video-vision-analyzer.js +469 -0
- package/dist/mcp/tools/qe/accessibility/video-vision-analyzer.js.map +1 -0
- package/dist/mcp/tools/qe/accessibility/webvtt-generator.d.ts +193 -0
- package/dist/mcp/tools/qe/accessibility/webvtt-generator.d.ts.map +1 -0
- package/dist/mcp/tools/qe/accessibility/webvtt-generator.js +511 -0
- package/dist/mcp/tools/qe/accessibility/webvtt-generator.js.map +1 -0
- package/dist/mcp/tools.d.ts +1 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +61 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/providers/HybridRouter.d.ts +34 -3
- package/dist/providers/HybridRouter.d.ts.map +1 -1
- package/dist/providers/HybridRouter.js +69 -4
- package/dist/providers/HybridRouter.js.map +1 -1
- package/dist/providers/LLMProviderFactory.d.ts +68 -1
- package/dist/providers/LLMProviderFactory.d.ts.map +1 -1
- package/dist/providers/LLMProviderFactory.js +173 -6
- package/dist/providers/LLMProviderFactory.js.map +1 -1
- package/dist/providers/OpenRouterProvider.d.ts +150 -0
- package/dist/providers/OpenRouterProvider.d.ts.map +1 -0
- package/dist/providers/OpenRouterProvider.js +545 -0
- package/dist/providers/OpenRouterProvider.js.map +1 -0
- package/dist/providers/RuvllmProvider.d.ts +130 -16
- package/dist/providers/RuvllmProvider.d.ts.map +1 -1
- package/dist/providers/RuvllmProvider.js +399 -83
- package/dist/providers/RuvllmProvider.js.map +1 -1
- package/dist/providers/index.d.ts +33 -4
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +72 -21
- package/dist/providers/index.js.map +1 -1
- package/dist/telemetry/instrumentation/agent.d.ts +1 -1
- package/dist/telemetry/instrumentation/agent.js +1 -1
- package/dist/telemetry/instrumentation/index.d.ts +1 -1
- package/dist/telemetry/instrumentation/index.js +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/ruvllm.d.ts +97 -0
- package/dist/types/ruvllm.d.ts.map +1 -0
- package/dist/types/ruvllm.js +46 -0
- package/dist/types/ruvllm.js.map +1 -0
- package/dist/utils/ruvllm-loader.d.ts +94 -0
- package/dist/utils/ruvllm-loader.d.ts.map +1 -0
- package/dist/utils/ruvllm-loader.js +87 -0
- package/dist/utils/ruvllm-loader.js.map +1 -0
- package/docs/reference/agents.md +36 -1
- package/package.json +5 -2
|
@@ -0,0 +1,549 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateMarkdownReport = generateMarkdownReport;
|
|
4
|
+
const remediation_code_generator_js_1 = require("./remediation-code-generator.js");
|
|
5
|
+
function generateRemediationPlan(violations, url) {
|
|
6
|
+
let plan = '';
|
|
7
|
+
plan += `## 🎯 Context-Aware Remediation Plan\n\n`;
|
|
8
|
+
// Extract site context from URL
|
|
9
|
+
const domain = new URL(url).hostname.replace('www.', '');
|
|
10
|
+
const siteName = domain.split('.')[0];
|
|
11
|
+
plan += `### 📋 Executive Summary\n\n`;
|
|
12
|
+
plan += `This remediation plan addresses **${violations.length} accessibility violations** found on **${siteName}**. `;
|
|
13
|
+
const criticalCount = violations.filter(v => v.severity === 'critical').length;
|
|
14
|
+
const seriousCount = violations.filter(v => v.severity === 'serious').length;
|
|
15
|
+
const totalElements = violations.reduce((sum, v) => sum + (v.elements?.length || 0), 0);
|
|
16
|
+
plan += `The issues affect **${totalElements} elements** and impact up to **`;
|
|
17
|
+
const maxImpact = Math.max(...violations.map(v => v.userImpact?.affectedUserPercentage || 0));
|
|
18
|
+
plan += `${maxImpact}% of users** (including blind, deaf, low-vision, and mobility-impaired visitors).\n\n`;
|
|
19
|
+
if (criticalCount > 0) {
|
|
20
|
+
plan += `**⚠️ URGENT**: ${criticalCount} critical ${criticalCount === 1 ? 'issue requires' : 'issues require'} immediate attention to avoid legal risk and ensure basic accessibility.\n\n`;
|
|
21
|
+
}
|
|
22
|
+
// Create remediation tasks
|
|
23
|
+
const tasks = [];
|
|
24
|
+
violations.forEach((v, idx) => {
|
|
25
|
+
const task = {
|
|
26
|
+
id: `TASK-${idx + 1}`,
|
|
27
|
+
title: v.description.split('Ensure ')[1] || v.description,
|
|
28
|
+
severity: v.severity,
|
|
29
|
+
effort: estimateEffort(v),
|
|
30
|
+
impact: estimateImpact(v),
|
|
31
|
+
affectedUsers: `${v.userImpact?.affectedUserPercentage || 0}% (${v.userImpact?.disabilityTypes?.join(', ') || 'general'})`,
|
|
32
|
+
elementCount: v.elements?.length || 0,
|
|
33
|
+
steps: generateSteps(v, url),
|
|
34
|
+
testing: generateTestingSteps(v),
|
|
35
|
+
estimatedTime: estimateTime(v),
|
|
36
|
+
dependencies: identifyDependencies(v, violations)
|
|
37
|
+
};
|
|
38
|
+
tasks.push(task);
|
|
39
|
+
});
|
|
40
|
+
// Sort by priority: critical first, then by impact/effort ratio
|
|
41
|
+
tasks.sort((a, b) => {
|
|
42
|
+
const severityOrder = { critical: 0, serious: 1, moderate: 2, minor: 3 };
|
|
43
|
+
const sevA = severityOrder[a.severity];
|
|
44
|
+
const sevB = severityOrder[b.severity];
|
|
45
|
+
if (sevA !== sevB)
|
|
46
|
+
return sevA - sevB;
|
|
47
|
+
const effortScore = { low: 1, medium: 2, high: 3 };
|
|
48
|
+
const impactScore = { low: 1, medium: 2, high: 3 };
|
|
49
|
+
const ratioA = impactScore[a.impact] / effortScore[a.effort];
|
|
50
|
+
const ratioB = impactScore[b.impact] / effortScore[b.effort];
|
|
51
|
+
return ratioB - ratioA;
|
|
52
|
+
});
|
|
53
|
+
// Quick Wins
|
|
54
|
+
const quickWins = tasks.filter(t => t.effort === 'low' && (t.severity === 'critical' || t.severity === 'serious'));
|
|
55
|
+
if (quickWins.length > 0) {
|
|
56
|
+
plan += `### ⚡ Quick Wins (Start Here!)\n\n`;
|
|
57
|
+
plan += `These ${quickWins.length} high-impact, low-effort tasks provide immediate accessibility improvements:\n\n`;
|
|
58
|
+
quickWins.forEach((task, i) => {
|
|
59
|
+
plan += `${i + 1}. **${task.title}** (${task.elementCount} elements, ~${task.estimatedTime})\n`;
|
|
60
|
+
});
|
|
61
|
+
plan += `\n`;
|
|
62
|
+
}
|
|
63
|
+
// Prioritized Action Plan
|
|
64
|
+
plan += `### 📌 Prioritized Action Plan\n\n`;
|
|
65
|
+
const phases = [
|
|
66
|
+
{ name: 'Phase 1: Critical Fixes (Week 1)', filter: (t) => t.severity === 'critical' },
|
|
67
|
+
{ name: 'Phase 2: Serious Issues (Week 2-3)', filter: (t) => t.severity === 'serious' },
|
|
68
|
+
{ name: 'Phase 3: Remaining Issues (Week 4+)', filter: (t) => t.severity !== 'critical' && t.severity !== 'serious' }
|
|
69
|
+
];
|
|
70
|
+
phases.forEach(phase => {
|
|
71
|
+
const phaseTasks = tasks.filter(phase.filter);
|
|
72
|
+
if (phaseTasks.length === 0)
|
|
73
|
+
return;
|
|
74
|
+
plan += `#### ${phase.name}\n\n`;
|
|
75
|
+
phaseTasks.forEach(task => {
|
|
76
|
+
plan += `**${task.id}: ${task.title}**\n`;
|
|
77
|
+
plan += `- **Severity**: ${task.severity.toUpperCase()} | **Effort**: ${task.effort} | **Impact**: ${task.impact}\n`;
|
|
78
|
+
plan += `- **Affects**: ${task.affectedUsers}\n`;
|
|
79
|
+
plan += `- **Elements**: ${task.elementCount}\n`;
|
|
80
|
+
plan += `- **Time**: ${task.estimatedTime}\n`;
|
|
81
|
+
if (task.dependencies && task.dependencies.length > 0) {
|
|
82
|
+
plan += `- **Dependencies**: ${task.dependencies.join(', ')}\n`;
|
|
83
|
+
}
|
|
84
|
+
plan += `\n**Steps**:\n`;
|
|
85
|
+
task.steps.forEach((step, i) => {
|
|
86
|
+
plan += `${i + 1}. ${step}\n`;
|
|
87
|
+
});
|
|
88
|
+
plan += `\n**Testing**:\n`;
|
|
89
|
+
task.testing.forEach((test, i) => {
|
|
90
|
+
plan += `- [ ] ${test}\n`;
|
|
91
|
+
});
|
|
92
|
+
plan += `\n`;
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
// Timeline Summary
|
|
96
|
+
plan += `### 📅 Implementation Timeline\n\n`;
|
|
97
|
+
const totalTime = tasks.reduce((sum, t) => {
|
|
98
|
+
const hours = parseInt(t.estimatedTime) || 0;
|
|
99
|
+
return sum + hours;
|
|
100
|
+
}, 0);
|
|
101
|
+
plan += `| Phase | Tasks | Estimated Time | Deliverables |\n`;
|
|
102
|
+
plan += `|-------|-------|----------------|---------------|\n`;
|
|
103
|
+
plan += `| **Week 1** | ${tasks.filter(t => t.severity === 'critical').length} critical | ${tasks.filter(t => t.severity === 'critical').reduce((sum, t) => sum + (parseInt(t.estimatedTime) || 0), 0)}h | Basic accessibility compliance |\n`;
|
|
104
|
+
plan += `| **Week 2-3** | ${tasks.filter(t => t.severity === 'serious').length} serious | ${tasks.filter(t => t.severity === 'serious').reduce((sum, t) => sum + (parseInt(t.estimatedTime) || 0), 0)}h | WCAG 2.2 AA compliance |\n`;
|
|
105
|
+
plan += `| **Week 4+** | ${tasks.filter(t => t.severity !== 'critical' && t.severity !== 'serious').length} remaining | ${tasks.filter(t => t.severity !== 'critical' && t.severity !== 'serious').reduce((sum, t) => sum + (parseInt(t.estimatedTime) || 0), 0)}h | Full remediation |\n`;
|
|
106
|
+
plan += `| **Total** | ${tasks.length} | **${totalTime}h** | ${siteName} fully accessible |\n\n`;
|
|
107
|
+
// Success Metrics
|
|
108
|
+
plan += `### 📊 Success Metrics\n\n`;
|
|
109
|
+
plan += `Track progress using these KPIs:\n\n`;
|
|
110
|
+
plan += `- [ ] **Zero critical violations** (currently ${criticalCount})\n`;
|
|
111
|
+
plan += `- [ ] **Zero serious violations** (currently ${seriousCount})\n`;
|
|
112
|
+
plan += `- [ ] **Compliance score ≥ 90/100** (currently ${violations.length > 0 ? 0 : 100})\n`;
|
|
113
|
+
plan += `- [ ] **Screen reader navigation test passed**\n`;
|
|
114
|
+
plan += `- [ ] **Keyboard-only navigation test passed**\n`;
|
|
115
|
+
plan += `- [ ] **WAVE tool shows 0 errors**\n`;
|
|
116
|
+
plan += `- [ ] **axe DevTools shows 0 violations**\n\n`;
|
|
117
|
+
return plan;
|
|
118
|
+
}
|
|
119
|
+
function estimateEffort(violation) {
|
|
120
|
+
const elementCount = violation.elements?.length || 0;
|
|
121
|
+
// Video captions = high effort
|
|
122
|
+
if (violation.description.toLowerCase().includes('video'))
|
|
123
|
+
return 'high';
|
|
124
|
+
// Many elements = higher effort
|
|
125
|
+
if (elementCount > 50)
|
|
126
|
+
return 'high';
|
|
127
|
+
if (elementCount > 20)
|
|
128
|
+
return 'medium';
|
|
129
|
+
// ARIA fixes = low-medium effort
|
|
130
|
+
if (violation.description.toLowerCase().includes('aria'))
|
|
131
|
+
return 'low';
|
|
132
|
+
// Color contrast = medium effort (requires design changes)
|
|
133
|
+
if (violation.description.toLowerCase().includes('contrast'))
|
|
134
|
+
return 'medium';
|
|
135
|
+
// Alt text = low effort
|
|
136
|
+
if (violation.description.toLowerCase().includes('alt'))
|
|
137
|
+
return 'low';
|
|
138
|
+
return 'medium';
|
|
139
|
+
}
|
|
140
|
+
function estimateImpact(violation) {
|
|
141
|
+
const userImpact = violation.userImpact?.affectedUserPercentage || 0;
|
|
142
|
+
if (violation.severity === 'critical')
|
|
143
|
+
return 'high';
|
|
144
|
+
if (userImpact >= 15)
|
|
145
|
+
return 'high';
|
|
146
|
+
if (userImpact >= 10)
|
|
147
|
+
return 'medium';
|
|
148
|
+
return 'low';
|
|
149
|
+
}
|
|
150
|
+
function estimateTime(violation) {
|
|
151
|
+
const elementCount = violation.elements?.length || 0;
|
|
152
|
+
const effort = estimateEffort(violation);
|
|
153
|
+
if (effort === 'low') {
|
|
154
|
+
if (elementCount <= 5)
|
|
155
|
+
return '30min';
|
|
156
|
+
if (elementCount <= 20)
|
|
157
|
+
return '1h';
|
|
158
|
+
return '2h';
|
|
159
|
+
}
|
|
160
|
+
if (effort === 'medium') {
|
|
161
|
+
if (elementCount <= 10)
|
|
162
|
+
return '2h';
|
|
163
|
+
if (elementCount <= 50)
|
|
164
|
+
return '4h';
|
|
165
|
+
return '8h';
|
|
166
|
+
}
|
|
167
|
+
// high effort
|
|
168
|
+
if (violation.description.toLowerCase().includes('video'))
|
|
169
|
+
return '4h';
|
|
170
|
+
return '8h';
|
|
171
|
+
}
|
|
172
|
+
function generateSteps(violation, url) {
|
|
173
|
+
const steps = [];
|
|
174
|
+
const desc = violation.description.toLowerCase();
|
|
175
|
+
if (desc.includes('video')) {
|
|
176
|
+
steps.push('Review generated WebVTT caption file (provided in violation details)');
|
|
177
|
+
steps.push('Save caption file to your server (e.g., `/captions/video-1.vtt`)');
|
|
178
|
+
steps.push('Add `<track kind="captions" src="/captions/video-1.vtt" srclang="en" label="English">` to video element');
|
|
179
|
+
steps.push('Add `aria-describedby` attribute with comprehensive description (provided)');
|
|
180
|
+
steps.push('Test with video player controls - captions should toggle on/off');
|
|
181
|
+
}
|
|
182
|
+
else if (desc.includes('alt') || desc.includes('alternative text')) {
|
|
183
|
+
steps.push('Identify the purpose/content of each image');
|
|
184
|
+
steps.push('Add descriptive `alt` attribute (e.g., `alt="Author profile photo"`)');
|
|
185
|
+
steps.push('For decorative images, use `alt=""` or `role="presentation"`');
|
|
186
|
+
}
|
|
187
|
+
else if (desc.includes('aria') && desc.includes('role')) {
|
|
188
|
+
steps.push('Review ARIA roles structure (tabs must be in tablist)');
|
|
189
|
+
steps.push('Ensure parent elements have correct container roles');
|
|
190
|
+
steps.push('Add missing wrapper elements with appropriate roles');
|
|
191
|
+
steps.push('Verify role hierarchy matches ARIA authoring practices');
|
|
192
|
+
}
|
|
193
|
+
else if (desc.includes('contrast')) {
|
|
194
|
+
steps.push('Use browser DevTools to identify elements with contrast issues');
|
|
195
|
+
steps.push('Darken text color OR lighten background to achieve 4.5:1 ratio');
|
|
196
|
+
steps.push('Update CSS variables/theme if using design system');
|
|
197
|
+
steps.push('Test with contrast checker tool (e.g., WebAIM Contrast Checker)');
|
|
198
|
+
}
|
|
199
|
+
else if (desc.includes('link') && desc.includes('text')) {
|
|
200
|
+
steps.push('Add `aria-label` to icon-only links with descriptive text');
|
|
201
|
+
steps.push('Example: `<a href="#" aria-label="Search the site"><i class="icon-magnifier"></i></a>`');
|
|
202
|
+
steps.push('Ensure label describes destination, not just icon');
|
|
203
|
+
}
|
|
204
|
+
else if (desc.includes('<li>') || desc.includes('list')) {
|
|
205
|
+
steps.push('Wrap orphaned `<li>` elements in proper `<ul>` or `<ol>` container');
|
|
206
|
+
steps.push('If using ARIA roles, ensure tab items are in role="tablist"');
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
steps.push('Review WCAG documentation for specific guidance');
|
|
210
|
+
steps.push('Implement recommended fix from violation details');
|
|
211
|
+
steps.push('Test with screen reader after changes');
|
|
212
|
+
}
|
|
213
|
+
return steps;
|
|
214
|
+
}
|
|
215
|
+
function generateTestingSteps(violation) {
|
|
216
|
+
const tests = [];
|
|
217
|
+
const desc = violation.description.toLowerCase();
|
|
218
|
+
if (desc.includes('video')) {
|
|
219
|
+
tests.push('Play video and verify captions appear automatically');
|
|
220
|
+
tests.push('Toggle captions on/off using player controls');
|
|
221
|
+
tests.push('Test with screen reader - aria-describedby should be announced');
|
|
222
|
+
tests.push('Verify caption timing matches video content');
|
|
223
|
+
}
|
|
224
|
+
else if (desc.includes('aria') || desc.includes('role')) {
|
|
225
|
+
tests.push('Test with NVDA/JAWS - verify correct role announcements');
|
|
226
|
+
tests.push('Navigate with keyboard - Tab key should work correctly');
|
|
227
|
+
tests.push('Re-run axe DevTools - violation should be resolved');
|
|
228
|
+
}
|
|
229
|
+
else if (desc.includes('contrast')) {
|
|
230
|
+
tests.push('Use WebAIM Contrast Checker - verify 4.5:1 minimum');
|
|
231
|
+
tests.push('Test in low-light conditions or with reduced brightness');
|
|
232
|
+
tests.push('Verify with color blindness simulator');
|
|
233
|
+
}
|
|
234
|
+
else if (desc.includes('link')) {
|
|
235
|
+
tests.push('Test with screen reader - link purpose should be clear');
|
|
236
|
+
tests.push('Tab to link - tooltip/aria-label should be evident');
|
|
237
|
+
}
|
|
238
|
+
tests.push('Re-run full accessibility scan to confirm fix');
|
|
239
|
+
return tests;
|
|
240
|
+
}
|
|
241
|
+
function identifyDependencies(violation, allViolations) {
|
|
242
|
+
const deps = [];
|
|
243
|
+
// ARIA role issues often depend on DOM structure fixes
|
|
244
|
+
if (violation.description.toLowerCase().includes('aria required children')) {
|
|
245
|
+
const parentIssue = allViolations.find(v => v.description.toLowerCase().includes('aria required parent'));
|
|
246
|
+
if (parentIssue) {
|
|
247
|
+
deps.push('Fix ARIA parent roles first');
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// Color contrast might depend on design system updates
|
|
251
|
+
if (violation.description.toLowerCase().includes('contrast') && (violation.elements?.length || 0) > 50) {
|
|
252
|
+
deps.push('Update global CSS variables/theme first');
|
|
253
|
+
}
|
|
254
|
+
return deps;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Generate detailed code examples section
|
|
258
|
+
*/
|
|
259
|
+
function generateDetailedCodeExamples(violations, url, pageLanguage = 'en', pageTitle = '') {
|
|
260
|
+
let md = '';
|
|
261
|
+
md += `## 📝 Detailed Code Examples (Copy-Paste Ready)\n\n`;
|
|
262
|
+
md += `The following code examples are context-aware and ready to implement.\n\n`;
|
|
263
|
+
// Detect frameworks from all violations
|
|
264
|
+
const allHtml = violations.flatMap(v => v.elements?.map(e => e.html) || []).join(' ');
|
|
265
|
+
const allSelectors = violations.flatMap(v => v.elements?.map(e => e.selector) || []);
|
|
266
|
+
const framework = (0, remediation_code_generator_js_1.detectFramework)(allHtml, allSelectors);
|
|
267
|
+
if (framework.framework !== 'unknown') {
|
|
268
|
+
md += `**Detected Framework**: ${framework.framework} (confidence: ${Math.round(framework.confidence * 100)}%)\n\n`;
|
|
269
|
+
}
|
|
270
|
+
// Group violations by type
|
|
271
|
+
const videoViolations = violations.filter(v => v.id.includes('video') || v.description.toLowerCase().includes('video') || v.wcagCriterion?.includes('1.2'));
|
|
272
|
+
const ariaViolations = violations.filter(v => v.id.includes('aria') || v.description.toLowerCase().includes('aria'));
|
|
273
|
+
const contrastViolations = violations.filter(v => v.id.includes('contrast') || v.description.toLowerCase().includes('contrast'));
|
|
274
|
+
let sectionNumber = 1;
|
|
275
|
+
// Video Caption Examples
|
|
276
|
+
if (videoViolations.length > 0) {
|
|
277
|
+
md += `### ${sectionNumber}. Video Caption Implementation\n\n`;
|
|
278
|
+
sectionNumber++;
|
|
279
|
+
videoViolations.forEach((violation, idx) => {
|
|
280
|
+
const codes = (0, remediation_code_generator_js_1.generateRemediationCodes)(violation, { url, pageLanguage, pageTitle });
|
|
281
|
+
codes.forEach(code => {
|
|
282
|
+
md += `#### ${code.title}\n\n`;
|
|
283
|
+
if (code.explanation) {
|
|
284
|
+
md += `${code.explanation}\n\n`;
|
|
285
|
+
}
|
|
286
|
+
md += `**Before (Broken)**:\n`;
|
|
287
|
+
md += `\`\`\`${code.language}\n${code.beforeCode}\n\`\`\`\n\n`;
|
|
288
|
+
md += `**After (Fixed)**:\n`;
|
|
289
|
+
md += `\`\`\`${code.language}\n${code.afterCode}\n\`\`\`\n\n`;
|
|
290
|
+
if (code.notes && code.notes.length > 0) {
|
|
291
|
+
md += `**Notes**:\n`;
|
|
292
|
+
code.notes.forEach(note => {
|
|
293
|
+
md += `- ${note}\n`;
|
|
294
|
+
});
|
|
295
|
+
md += `\n`;
|
|
296
|
+
}
|
|
297
|
+
md += `**Estimated Time**: ${code.estimatedTime}\n\n`;
|
|
298
|
+
md += `---\n\n`;
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
// ARIA/Focus Examples
|
|
303
|
+
if (ariaViolations.length > 0) {
|
|
304
|
+
md += `### ${sectionNumber}. ARIA & Focus Management\n\n`;
|
|
305
|
+
sectionNumber++;
|
|
306
|
+
// Generate one comprehensive fix for similar violations
|
|
307
|
+
const firstViolation = ariaViolations[0];
|
|
308
|
+
const codes = (0, remediation_code_generator_js_1.generateRemediationCodes)(firstViolation, { url, pageLanguage, pageTitle, framework });
|
|
309
|
+
codes.forEach(code => {
|
|
310
|
+
md += `#### ${code.title}\n\n`;
|
|
311
|
+
if (code.explanation) {
|
|
312
|
+
md += `${code.explanation}\n\n`;
|
|
313
|
+
}
|
|
314
|
+
md += `**Before (Broken)**:\n`;
|
|
315
|
+
md += `\`\`\`${code.language}\n${code.beforeCode}\n\`\`\`\n\n`;
|
|
316
|
+
md += `**After (Fixed)**:\n`;
|
|
317
|
+
md += `\`\`\`${code.language}\n${code.afterCode}\n\`\`\`\n\n`;
|
|
318
|
+
if (code.notes && code.notes.length > 0) {
|
|
319
|
+
md += `**Notes**:\n`;
|
|
320
|
+
code.notes.forEach(note => {
|
|
321
|
+
md += `- ${note}\n`;
|
|
322
|
+
});
|
|
323
|
+
md += `\n`;
|
|
324
|
+
}
|
|
325
|
+
md += `**Estimated Time**: ${code.estimatedTime}\n\n`;
|
|
326
|
+
md += `---\n\n`;
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
// Color Contrast Examples
|
|
330
|
+
if (contrastViolations.length > 0) {
|
|
331
|
+
md += `### ${sectionNumber}. Color Contrast Fixes\n\n`;
|
|
332
|
+
sectionNumber++;
|
|
333
|
+
const firstViolation = contrastViolations[0];
|
|
334
|
+
const codes = (0, remediation_code_generator_js_1.generateRemediationCodes)(firstViolation, { url, pageLanguage, pageTitle });
|
|
335
|
+
codes.forEach(code => {
|
|
336
|
+
md += `#### ${code.title}\n\n`;
|
|
337
|
+
if (code.explanation) {
|
|
338
|
+
md += `${code.explanation}\n\n`;
|
|
339
|
+
}
|
|
340
|
+
md += `**Before (Broken)**:\n`;
|
|
341
|
+
md += `\`\`\`${code.language}\n${code.beforeCode}\n\`\`\`\n\n`;
|
|
342
|
+
md += `**After (Fixed)**:\n`;
|
|
343
|
+
md += `\`\`\`${code.language}\n${code.afterCode}\n\`\`\`\n\n`;
|
|
344
|
+
if (code.notes && code.notes.length > 0) {
|
|
345
|
+
md += `**Notes**:\n`;
|
|
346
|
+
code.notes.forEach(note => {
|
|
347
|
+
md += `- ${note}\n`;
|
|
348
|
+
});
|
|
349
|
+
md += `\n`;
|
|
350
|
+
}
|
|
351
|
+
md += `**Estimated Time**: ${code.estimatedTime}\n\n`;
|
|
352
|
+
md += `---\n\n`;
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
// Automated Test Examples
|
|
356
|
+
md += `### ${sectionNumber}. Automated Test Suite (Playwright + axe-core)\n\n`;
|
|
357
|
+
sectionNumber++;
|
|
358
|
+
md += `Add this test to your CI/CD pipeline to prevent accessibility regressions:\n\n`;
|
|
359
|
+
md += `\`\`\`typescript
|
|
360
|
+
import { test, expect } from '@playwright/test';
|
|
361
|
+
import AxeBuilder from '@axe-core/playwright';
|
|
362
|
+
|
|
363
|
+
const URL = '${url}';
|
|
364
|
+
|
|
365
|
+
test.describe('Accessibility Tests', () => {
|
|
366
|
+
test('should have no WCAG 2.2 AA violations', async ({ page }) => {
|
|
367
|
+
await page.goto(URL);
|
|
368
|
+
|
|
369
|
+
const results = await new AxeBuilder({ page })
|
|
370
|
+
.withTags(['wcag2a', 'wcag2aa', 'wcag22aa'])
|
|
371
|
+
.analyze();
|
|
372
|
+
|
|
373
|
+
if (results.violations.length > 0) {
|
|
374
|
+
console.log('Violations:', results.violations.map(v => \`\${v.id}: \${v.nodes.length} elements\`));
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
expect(results.violations).toHaveLength(0);
|
|
378
|
+
});
|
|
379
|
+
${videoViolations.length > 0 ? `
|
|
380
|
+
test('videos should have caption tracks', async ({ page }) => {
|
|
381
|
+
await page.goto(URL);
|
|
382
|
+
|
|
383
|
+
const videos = await page.locator('video').all();
|
|
384
|
+
for (const video of videos) {
|
|
385
|
+
const track = video.locator('track[kind="captions"]');
|
|
386
|
+
await expect(track).toHaveCount(1);
|
|
387
|
+
}
|
|
388
|
+
});
|
|
389
|
+
` : ''}${ariaViolations.length > 0 ? `
|
|
390
|
+
test('no focus on aria-hidden elements', async ({ page }) => {
|
|
391
|
+
await page.goto(URL);
|
|
392
|
+
|
|
393
|
+
for (let i = 0; i < 30; i++) {
|
|
394
|
+
await page.keyboard.press('Tab');
|
|
395
|
+
const hiddenFocused = await page.evaluate(() =>
|
|
396
|
+
document.activeElement?.closest('[aria-hidden="true"]') !== null
|
|
397
|
+
);
|
|
398
|
+
expect(hiddenFocused).toBe(false);
|
|
399
|
+
}
|
|
400
|
+
});
|
|
401
|
+
` : ''}});
|
|
402
|
+
\`\`\`
|
|
403
|
+
|
|
404
|
+
**Installation**:
|
|
405
|
+
\`\`\`bash
|
|
406
|
+
npm install -D @playwright/test @axe-core/playwright
|
|
407
|
+
\`\`\`
|
|
408
|
+
|
|
409
|
+
---
|
|
410
|
+
|
|
411
|
+
`;
|
|
412
|
+
// CSS Utilities
|
|
413
|
+
md += `### ${sectionNumber}. Accessibility CSS Utilities\n\n`;
|
|
414
|
+
sectionNumber++;
|
|
415
|
+
const cssUtilities = (0, remediation_code_generator_js_1.generateAccessibilityCSSUtilities)();
|
|
416
|
+
md += `${cssUtilities.explanation}\n\n`;
|
|
417
|
+
md += `\`\`\`css\n${cssUtilities.afterCode}\n\`\`\`\n\n`;
|
|
418
|
+
if (cssUtilities.notes && cssUtilities.notes.length > 0) {
|
|
419
|
+
md += `**Notes**:\n`;
|
|
420
|
+
cssUtilities.notes.forEach(note => {
|
|
421
|
+
md += `- ${note}\n`;
|
|
422
|
+
});
|
|
423
|
+
md += `\n`;
|
|
424
|
+
}
|
|
425
|
+
md += `---\n\n`;
|
|
426
|
+
// Quick Reference
|
|
427
|
+
md += `### ${sectionNumber}. Quick Reference\n\n`;
|
|
428
|
+
md += `#### WCAG Violation Quick Reference\n\n`;
|
|
429
|
+
md += `| Issue | WCAG | Level | Typical Fix Time |\n`;
|
|
430
|
+
md += `|-------|------|-------|------------------|\n`;
|
|
431
|
+
md += `| Video captions | 1.2.2 | A | 4h per video |\n`;
|
|
432
|
+
md += `| Color contrast | 1.4.3 | AA | 2h |\n`;
|
|
433
|
+
md += `| ARIA focus | 4.1.2 | A | 30min per component |\n`;
|
|
434
|
+
md += `| Alt text | 1.1.1 | A | 15min per image |\n`;
|
|
435
|
+
md += `| Form labels | 1.3.1 | A | 15min per field |\n`;
|
|
436
|
+
md += `| Skip links | 2.4.1 | A | 1h |\n`;
|
|
437
|
+
md += `| Focus visible | 2.4.7 | AA | 1h |\n\n`;
|
|
438
|
+
md += `#### Screen Reader Test Commands\n\n`;
|
|
439
|
+
md += `| Reader | Platform | Start | Stop |\n`;
|
|
440
|
+
md += `|--------|----------|-------|------|\n`;
|
|
441
|
+
md += `| VoiceOver | macOS | Cmd+F5 | Cmd+F5 |\n`;
|
|
442
|
+
md += `| NVDA | Windows | Ctrl+Alt+N | Insert+Q |\n`;
|
|
443
|
+
md += `| TalkBack | Android | Settings > Accessibility | Same |\n`;
|
|
444
|
+
md += `| VoiceOver | iOS | Triple-click Home | Same |\n\n`;
|
|
445
|
+
return md;
|
|
446
|
+
}
|
|
447
|
+
function generateMarkdownReport(options) {
|
|
448
|
+
const { url, scanId, timestamp, violations, complianceScore, complianceStatus, level, pageLanguage = 'en', pageTitle = '', includeCodeExamples = true } = options;
|
|
449
|
+
const criticalCount = violations.filter(v => v.severity === 'critical').length;
|
|
450
|
+
const seriousCount = violations.filter(v => v.severity === 'serious').length;
|
|
451
|
+
const moderateCount = violations.filter(v => v.severity === 'moderate').length;
|
|
452
|
+
const minorCount = violations.filter(v => v.severity === 'minor').length;
|
|
453
|
+
let md = '';
|
|
454
|
+
// Header
|
|
455
|
+
md += `# 🔍 Accessibility Scan Report\n\n`;
|
|
456
|
+
md += `**URL**: ${url}\n`;
|
|
457
|
+
md += `**Scan ID**: ${scanId}\n`;
|
|
458
|
+
md += `**Date**: ${new Date(timestamp).toLocaleString()}\n`;
|
|
459
|
+
md += `**WCAG Level**: ${level}\n\n`;
|
|
460
|
+
// Summary
|
|
461
|
+
md += `## 📊 Summary\n\n`;
|
|
462
|
+
md += `- **Compliance Score**: ${complianceScore}/100\n`;
|
|
463
|
+
md += `- **Status**: ${complianceStatus.toUpperCase()}\n`;
|
|
464
|
+
md += `- **Total Violations**: ${violations.length}\n`;
|
|
465
|
+
md += ` - 🔴 Critical: ${criticalCount}\n`;
|
|
466
|
+
md += ` - 🟠 Serious: ${seriousCount}\n`;
|
|
467
|
+
md += ` - 🟡 Moderate: ${moderateCount}\n`;
|
|
468
|
+
md += ` - 🔵 Minor: ${minorCount}\n\n`;
|
|
469
|
+
md += `---\n\n`;
|
|
470
|
+
// Context-Aware Remediation Plan
|
|
471
|
+
md += generateRemediationPlan(violations, url);
|
|
472
|
+
md += `---\n\n`;
|
|
473
|
+
// Violations
|
|
474
|
+
md += `## ⚠️ Violations (${violations.length})\n\n`;
|
|
475
|
+
violations.forEach((violation, index) => {
|
|
476
|
+
const severityIcon = {
|
|
477
|
+
critical: '🔴',
|
|
478
|
+
serious: '🟠',
|
|
479
|
+
moderate: '🟡',
|
|
480
|
+
minor: '🔵'
|
|
481
|
+
}[violation.severity];
|
|
482
|
+
md += `### ${severityIcon} [${index + 1}] ${violation.description}\n\n`;
|
|
483
|
+
md += `**Severity**: ${violation.severity.toUpperCase()}\n`;
|
|
484
|
+
md += `**WCAG**: ${violation.wcagCriterion} (Level ${violation.wcagLevel})\n`;
|
|
485
|
+
md += `**Impact**: ${violation.impact}\n`;
|
|
486
|
+
md += `**Affected Users**: ${violation.userImpact?.affectedUserPercentage || 'Unknown'}% `;
|
|
487
|
+
md += `(${violation.userImpact?.disabilityTypes?.join(', ') || 'general'})\n\n`;
|
|
488
|
+
// Elements
|
|
489
|
+
if (violation.elements && violation.elements.length > 0) {
|
|
490
|
+
md += `**Affected Elements**: ${violation.elements.length}\n\n`;
|
|
491
|
+
violation.elements.slice(0, 3).forEach((el, i) => {
|
|
492
|
+
md += `<details>\n`;
|
|
493
|
+
md += `<summary>Element ${i + 1}: ${el.selector || 'Unknown selector'}</summary>\n\n`;
|
|
494
|
+
md += `\`\`\`html\n${el.html?.slice(0, 200) || 'No HTML available'}${el.html && el.html.length > 200 ? '...' : ''}\n\`\`\`\n\n`;
|
|
495
|
+
md += `</details>\n\n`;
|
|
496
|
+
});
|
|
497
|
+
if (violation.elements.length > 3) {
|
|
498
|
+
md += `_...and ${violation.elements.length - 3} more elements_\n\n`;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
// Solution - Generate context-specific code fixes
|
|
502
|
+
md += `#### 🔧 Context-Specific Solution\n\n`;
|
|
503
|
+
// Generate remediation codes for this violation
|
|
504
|
+
const remediationCodes = (0, remediation_code_generator_js_1.generateRemediationCodes)(violation, { url, pageLanguage, pageTitle });
|
|
505
|
+
if (remediationCodes.length > 0) {
|
|
506
|
+
// Show the first (most relevant) code fix
|
|
507
|
+
const primaryFix = remediationCodes[0];
|
|
508
|
+
md += `**${primaryFix.title}**\n\n`;
|
|
509
|
+
if (primaryFix.explanation) {
|
|
510
|
+
md += `> ${primaryFix.explanation}\n\n`;
|
|
511
|
+
}
|
|
512
|
+
md += `**Before (Current):**\n`;
|
|
513
|
+
md += `\`\`\`${primaryFix.language}\n${primaryFix.beforeCode}\n\`\`\`\n\n`;
|
|
514
|
+
md += `**After (Fixed):**\n`;
|
|
515
|
+
md += `\`\`\`${primaryFix.language}\n${primaryFix.afterCode}\n\`\`\`\n\n`;
|
|
516
|
+
if (primaryFix.notes && primaryFix.notes.length > 0) {
|
|
517
|
+
md += `**Implementation Notes:**\n`;
|
|
518
|
+
primaryFix.notes.forEach(note => {
|
|
519
|
+
md += `- ${note}\n`;
|
|
520
|
+
});
|
|
521
|
+
md += '\n';
|
|
522
|
+
}
|
|
523
|
+
md += `**Estimated Fix Time:** ${primaryFix.estimatedTime}\n\n`;
|
|
524
|
+
}
|
|
525
|
+
else if (violation.howToFix && !violation.howToFix.startsWith('http')) {
|
|
526
|
+
// Use custom howToFix if it's actual code (not a URL)
|
|
527
|
+
md += `\`\`\`html\n${violation.howToFix}\n\`\`\`\n\n`;
|
|
528
|
+
}
|
|
529
|
+
else {
|
|
530
|
+
// Fallback to generic guidance
|
|
531
|
+
md += `_See WCAG guidelines for ${violation.wcagCriterion}_\n\n`;
|
|
532
|
+
if (violation.helpUrl) {
|
|
533
|
+
md += `📚 Reference: ${violation.helpUrl}\n\n`;
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
md += `---\n\n`;
|
|
537
|
+
});
|
|
538
|
+
// Detailed Code Examples (enabled by default)
|
|
539
|
+
if (includeCodeExamples && violations.length > 0) {
|
|
540
|
+
md += generateDetailedCodeExamples(violations, url, pageLanguage, pageTitle);
|
|
541
|
+
}
|
|
542
|
+
// Footer
|
|
543
|
+
md += `\n## 🤖 Generated by\n\n`;
|
|
544
|
+
md += `qe-a11y-ally Agent (Agentic QE Fleet)\n`;
|
|
545
|
+
md += `Scan Time: ${new Date(timestamp).toISOString()}\n`;
|
|
546
|
+
md += `\n**Features**: Context-aware remediation, Framework detection, Automated test generation\n`;
|
|
547
|
+
return md;
|
|
548
|
+
}
|
|
549
|
+
//# sourceMappingURL=markdown-report-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-report-generator.js","sourceRoot":"","sources":["../../../../../src/mcp/tools/qe/accessibility/markdown-report-generator.ts"],"names":[],"mappings":"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"}
|