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,566 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Accessible Name and Description Computation (AccName)
|
|
4
|
+
*
|
|
5
|
+
* Implementation of W3C Accessible Name and Description Computation 1.2
|
|
6
|
+
* Version: Based on W3C Recommendation (2023)
|
|
7
|
+
*
|
|
8
|
+
* Purpose: Compute accessible names and descriptions for elements as perceived by assistive technologies
|
|
9
|
+
* Reference: https://www.w3.org/TR/accname-1.2/
|
|
10
|
+
*
|
|
11
|
+
* WCAG Success Criteria:
|
|
12
|
+
* - 4.1.2 Name, Role, Value - Level A
|
|
13
|
+
* - 2.4.6 Headings and Labels - Level AA
|
|
14
|
+
* - 3.3.2 Labels or Instructions - Level A
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.ACCNAME_EXAMPLES = void 0;
|
|
18
|
+
exports.computeAccessibleName = computeAccessibleName;
|
|
19
|
+
exports.generateAccessibleNameRecommendation = generateAccessibleNameRecommendation;
|
|
20
|
+
exports.visualizeAccNameComputation = visualizeAccNameComputation;
|
|
21
|
+
/**
|
|
22
|
+
* Compute accessible name for an element
|
|
23
|
+
*
|
|
24
|
+
* Implements the W3C AccName algorithm
|
|
25
|
+
*/
|
|
26
|
+
function computeAccessibleName(element, options = {}) {
|
|
27
|
+
const trace = [];
|
|
28
|
+
const allSources = [];
|
|
29
|
+
if (options.includeTrace) {
|
|
30
|
+
trace.push(`Starting AccName computation for <${element.tagName}${element.role ? ` role="${element.role}"` : ''}>`);
|
|
31
|
+
}
|
|
32
|
+
let accessibleName = '';
|
|
33
|
+
let source = null;
|
|
34
|
+
// Step 1: Check aria-labelledby (highest priority)
|
|
35
|
+
const ariaLabelledBy = element.attributes['aria-labelledby'];
|
|
36
|
+
if (ariaLabelledBy) {
|
|
37
|
+
trace.push(`Found aria-labelledby="${ariaLabelledBy}"`);
|
|
38
|
+
// In real implementation, would fetch referenced element's text
|
|
39
|
+
// For this implementation, we'll note it exists
|
|
40
|
+
const labelledBySource = {
|
|
41
|
+
type: 'aria-labelledby',
|
|
42
|
+
value: `[Referenced element: ${ariaLabelledBy}]`,
|
|
43
|
+
priority: 1,
|
|
44
|
+
recommended: true,
|
|
45
|
+
details: 'Highest priority - references visible label element(s)'
|
|
46
|
+
};
|
|
47
|
+
allSources.push(labelledBySource);
|
|
48
|
+
if (!source) {
|
|
49
|
+
source = labelledBySource;
|
|
50
|
+
accessibleName = labelledBySource.value;
|
|
51
|
+
trace.push(`✓ Using aria-labelledby (priority 1)`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Step 2: Check aria-label
|
|
55
|
+
const ariaLabel = element.attributes['aria-label'];
|
|
56
|
+
if (ariaLabel) {
|
|
57
|
+
trace.push(`Found aria-label="${ariaLabel}"`);
|
|
58
|
+
const ariaLabelSource = {
|
|
59
|
+
type: 'aria-label',
|
|
60
|
+
value: ariaLabel,
|
|
61
|
+
priority: 2,
|
|
62
|
+
recommended: true,
|
|
63
|
+
details: 'Direct text label - good for icon buttons or when visual label inadequate'
|
|
64
|
+
};
|
|
65
|
+
allSources.push(ariaLabelSource);
|
|
66
|
+
if (!source) {
|
|
67
|
+
source = ariaLabelSource;
|
|
68
|
+
accessibleName = ariaLabel;
|
|
69
|
+
trace.push(`✓ Using aria-label (priority 2)`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Step 3: Check for native label (for form inputs)
|
|
73
|
+
const id = element.attributes['id'];
|
|
74
|
+
const nativeLabel = element.attributes['_native-label']; // Placeholder for <label for="id">
|
|
75
|
+
if (id && nativeLabel) {
|
|
76
|
+
trace.push(`Found <label for="${id}"> with text: "${nativeLabel}"`);
|
|
77
|
+
const nativeLabelSource = {
|
|
78
|
+
type: 'native-label',
|
|
79
|
+
value: nativeLabel,
|
|
80
|
+
priority: 3,
|
|
81
|
+
recommended: true,
|
|
82
|
+
details: 'Native HTML label - preferred for form inputs'
|
|
83
|
+
};
|
|
84
|
+
allSources.push(nativeLabelSource);
|
|
85
|
+
if (!source) {
|
|
86
|
+
source = nativeLabelSource;
|
|
87
|
+
accessibleName = nativeLabel;
|
|
88
|
+
trace.push(`✓ Using native <label> (priority 3)`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Step 4: Check native semantics
|
|
92
|
+
const nativeSemantics = getNativeSemanticName(element);
|
|
93
|
+
if (nativeSemantics) {
|
|
94
|
+
trace.push(`Native semantics provide: "${nativeSemantics.value}"`);
|
|
95
|
+
allSources.push(nativeSemantics);
|
|
96
|
+
if (!source) {
|
|
97
|
+
source = nativeSemantics;
|
|
98
|
+
accessibleName = nativeSemantics.value;
|
|
99
|
+
trace.push(`✓ Using native semantics (priority 4)`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Step 5: Check title attribute
|
|
103
|
+
const title = element.attributes['title'];
|
|
104
|
+
if (title) {
|
|
105
|
+
trace.push(`Found title="${title}"`);
|
|
106
|
+
const titleSource = {
|
|
107
|
+
type: 'title',
|
|
108
|
+
value: title,
|
|
109
|
+
priority: 5,
|
|
110
|
+
recommended: false,
|
|
111
|
+
details: 'Title attribute - discouraged as primary name source (not always announced)'
|
|
112
|
+
};
|
|
113
|
+
allSources.push(titleSource);
|
|
114
|
+
if (!source) {
|
|
115
|
+
source = titleSource;
|
|
116
|
+
accessibleName = title;
|
|
117
|
+
trace.push(`⚠ Using title attribute (priority 5) - not recommended as primary source`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Step 6: Check placeholder (for inputs only)
|
|
121
|
+
const placeholder = element.attributes['placeholder'];
|
|
122
|
+
if (placeholder && (element.tagName.toLowerCase() === 'input' || element.tagName.toLowerCase() === 'textarea')) {
|
|
123
|
+
trace.push(`Found placeholder="${placeholder}"`);
|
|
124
|
+
const placeholderSource = {
|
|
125
|
+
type: 'placeholder',
|
|
126
|
+
value: placeholder,
|
|
127
|
+
priority: 6,
|
|
128
|
+
recommended: false,
|
|
129
|
+
details: 'Placeholder - strongly discouraged as accessible name (disappears on focus)'
|
|
130
|
+
};
|
|
131
|
+
allSources.push(placeholderSource);
|
|
132
|
+
if (!source) {
|
|
133
|
+
source = placeholderSource;
|
|
134
|
+
accessibleName = placeholder;
|
|
135
|
+
trace.push(`❌ Using placeholder (priority 6) - NOT RECOMMENDED`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// If no source found, accessible name is empty
|
|
139
|
+
if (!source) {
|
|
140
|
+
source = {
|
|
141
|
+
type: 'none',
|
|
142
|
+
value: '',
|
|
143
|
+
priority: 99,
|
|
144
|
+
recommended: false,
|
|
145
|
+
details: 'No accessible name found - CRITICAL ISSUE'
|
|
146
|
+
};
|
|
147
|
+
trace.push(`❌ No accessible name found!`);
|
|
148
|
+
}
|
|
149
|
+
// Compute accessible description
|
|
150
|
+
const accessibleDescription = computeAccessibleDescription(element, trace);
|
|
151
|
+
// Validate and score the accessible name
|
|
152
|
+
const validation = validateAccessibleName(accessibleName, source, element);
|
|
153
|
+
return {
|
|
154
|
+
accessibleName,
|
|
155
|
+
source,
|
|
156
|
+
allSources,
|
|
157
|
+
accessibleDescription,
|
|
158
|
+
sufficient: validation.sufficient,
|
|
159
|
+
quality: validation.quality,
|
|
160
|
+
issues: validation.issues,
|
|
161
|
+
trace: options.includeTrace ? trace : []
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Get accessible name from native HTML semantics
|
|
166
|
+
*/
|
|
167
|
+
function getNativeSemanticName(element) {
|
|
168
|
+
const tagName = element.tagName.toLowerCase();
|
|
169
|
+
// Image alt text
|
|
170
|
+
if (tagName === 'img') {
|
|
171
|
+
const alt = element.attributes['alt'];
|
|
172
|
+
if (alt !== undefined) {
|
|
173
|
+
return {
|
|
174
|
+
type: 'native-semantics',
|
|
175
|
+
value: alt,
|
|
176
|
+
priority: 4,
|
|
177
|
+
recommended: true,
|
|
178
|
+
details: 'Alt attribute on <img> - required for accessibility'
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Button or link text content
|
|
183
|
+
if (tagName === 'button' || tagName === 'a') {
|
|
184
|
+
const textContent = element.textContent?.trim();
|
|
185
|
+
if (textContent) {
|
|
186
|
+
return {
|
|
187
|
+
type: 'native-semantics',
|
|
188
|
+
value: textContent,
|
|
189
|
+
priority: 4,
|
|
190
|
+
recommended: true,
|
|
191
|
+
details: 'Text content of interactive element'
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// Input type="submit" or type="button" value
|
|
196
|
+
if (tagName === 'input') {
|
|
197
|
+
const type = element.attributes['type'];
|
|
198
|
+
if (type === 'submit' || type === 'button' || type === 'reset') {
|
|
199
|
+
const value = element.attributes['value'];
|
|
200
|
+
if (value) {
|
|
201
|
+
return {
|
|
202
|
+
type: 'native-semantics',
|
|
203
|
+
value,
|
|
204
|
+
priority: 4,
|
|
205
|
+
recommended: true,
|
|
206
|
+
details: `Value attribute on <input type="${type}">`
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Area element with alt
|
|
212
|
+
if (tagName === 'area') {
|
|
213
|
+
const alt = element.attributes['alt'];
|
|
214
|
+
if (alt !== undefined) {
|
|
215
|
+
return {
|
|
216
|
+
type: 'native-semantics',
|
|
217
|
+
value: alt,
|
|
218
|
+
priority: 4,
|
|
219
|
+
recommended: true,
|
|
220
|
+
details: 'Alt attribute on <area> (image map)'
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Compute accessible description
|
|
228
|
+
*/
|
|
229
|
+
function computeAccessibleDescription(element, trace) {
|
|
230
|
+
// aria-describedby (highest priority)
|
|
231
|
+
const ariaDescribedBy = element.attributes['aria-describedby'];
|
|
232
|
+
if (ariaDescribedBy) {
|
|
233
|
+
trace.push(`Description: Found aria-describedby="${ariaDescribedBy}"`);
|
|
234
|
+
return `[Referenced element: ${ariaDescribedBy}]`;
|
|
235
|
+
}
|
|
236
|
+
// title attribute (if not used for name)
|
|
237
|
+
const title = element.attributes['title'];
|
|
238
|
+
if (title) {
|
|
239
|
+
trace.push(`Description: Using title="${title}"`);
|
|
240
|
+
return title;
|
|
241
|
+
}
|
|
242
|
+
trace.push(`Description: None found`);
|
|
243
|
+
return undefined;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Validate accessible name quality
|
|
247
|
+
*/
|
|
248
|
+
function validateAccessibleName(name, source, element) {
|
|
249
|
+
const issues = [];
|
|
250
|
+
let quality = 100;
|
|
251
|
+
// Check if name exists
|
|
252
|
+
if (!name || name.trim().length === 0) {
|
|
253
|
+
issues.push({
|
|
254
|
+
severity: 'error',
|
|
255
|
+
message: 'No accessible name found',
|
|
256
|
+
recommendation: 'Add aria-label, aria-labelledby, or native label to this element'
|
|
257
|
+
});
|
|
258
|
+
quality = 0;
|
|
259
|
+
return { sufficient: false, quality, issues };
|
|
260
|
+
}
|
|
261
|
+
// Check if using non-recommended source
|
|
262
|
+
if (!source.recommended) {
|
|
263
|
+
if (source.type === 'placeholder') {
|
|
264
|
+
issues.push({
|
|
265
|
+
severity: 'error',
|
|
266
|
+
message: 'Using placeholder as accessible name',
|
|
267
|
+
recommendation: 'Add a proper <label> or aria-label. Placeholder disappears when user starts typing.'
|
|
268
|
+
});
|
|
269
|
+
quality -= 50;
|
|
270
|
+
}
|
|
271
|
+
else if (source.type === 'title') {
|
|
272
|
+
issues.push({
|
|
273
|
+
severity: 'warning',
|
|
274
|
+
message: 'Using title attribute as accessible name',
|
|
275
|
+
recommendation: 'Title is not consistently announced by screen readers. Use aria-label or visible label instead.'
|
|
276
|
+
});
|
|
277
|
+
quality -= 30;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
// Check name length
|
|
281
|
+
if (name.length < 2) {
|
|
282
|
+
issues.push({
|
|
283
|
+
severity: 'warning',
|
|
284
|
+
message: `Accessible name is very short: "${name}"`,
|
|
285
|
+
recommendation: 'Provide more descriptive name for better context'
|
|
286
|
+
});
|
|
287
|
+
quality -= 20;
|
|
288
|
+
}
|
|
289
|
+
if (name.length > 100) {
|
|
290
|
+
issues.push({
|
|
291
|
+
severity: 'warning',
|
|
292
|
+
message: `Accessible name is very long (${name.length} characters)`,
|
|
293
|
+
recommendation: 'Consider using aria-describedby for detailed information, keep name concise'
|
|
294
|
+
});
|
|
295
|
+
quality -= 10;
|
|
296
|
+
}
|
|
297
|
+
// Check for generic names
|
|
298
|
+
const genericNames = ['button', 'link', 'click here', 'read more', 'submit', 'image', 'icon'];
|
|
299
|
+
const nameLower = name.toLowerCase().trim();
|
|
300
|
+
if (genericNames.includes(nameLower)) {
|
|
301
|
+
issues.push({
|
|
302
|
+
severity: 'warning',
|
|
303
|
+
message: `Accessible name is too generic: "${name}"`,
|
|
304
|
+
recommendation: 'Provide specific, descriptive name (e.g., "Submit Contact Form" instead of "Submit")'
|
|
305
|
+
});
|
|
306
|
+
quality -= 25;
|
|
307
|
+
}
|
|
308
|
+
// Check for technical content (IDs, class names)
|
|
309
|
+
if (/^[a-z0-9-_]+$/.test(name) && name.includes('-')) {
|
|
310
|
+
issues.push({
|
|
311
|
+
severity: 'warning',
|
|
312
|
+
message: `Accessible name looks like technical identifier: "${name}"`,
|
|
313
|
+
recommendation: 'Use human-readable text instead of IDs or class names'
|
|
314
|
+
});
|
|
315
|
+
quality -= 30;
|
|
316
|
+
}
|
|
317
|
+
// Element-specific validation
|
|
318
|
+
if (element.tagName.toLowerCase() === 'img' && source.type === 'native-semantics') {
|
|
319
|
+
if (name === '') {
|
|
320
|
+
// Empty alt is valid for decorative images
|
|
321
|
+
issues.push({
|
|
322
|
+
severity: 'info',
|
|
323
|
+
message: 'Image has empty alt attribute (alt="")',
|
|
324
|
+
recommendation: 'This is correct for decorative images. If image conveys information, add descriptive alt text.'
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
// Form input specific checks
|
|
329
|
+
if (['input', 'select', 'textarea'].includes(element.tagName.toLowerCase())) {
|
|
330
|
+
if (source.type !== 'native-label' && source.type !== 'aria-labelledby' && source.type !== 'aria-label') {
|
|
331
|
+
issues.push({
|
|
332
|
+
severity: 'error',
|
|
333
|
+
message: 'Form input lacks proper label',
|
|
334
|
+
recommendation: 'Add <label for="inputId"> or aria-label for form inputs'
|
|
335
|
+
});
|
|
336
|
+
quality -= 40;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
// Interactive element checks
|
|
340
|
+
if (['button', 'a'].includes(element.tagName.toLowerCase()) || element.role === 'button' || element.role === 'link') {
|
|
341
|
+
if (!name || name.trim().length === 0) {
|
|
342
|
+
issues.push({
|
|
343
|
+
severity: 'error',
|
|
344
|
+
message: 'Interactive element has no accessible name',
|
|
345
|
+
recommendation: 'Add visible text content or aria-label to describe the action'
|
|
346
|
+
});
|
|
347
|
+
quality = 0;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
const sufficient = quality >= 60 && issues.filter(i => i.severity === 'error').length === 0;
|
|
351
|
+
return {
|
|
352
|
+
sufficient,
|
|
353
|
+
quality: Math.max(0, quality),
|
|
354
|
+
issues
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Generate accessible name recommendation
|
|
359
|
+
*/
|
|
360
|
+
function generateAccessibleNameRecommendation(computation, element) {
|
|
361
|
+
const tagName = element.tagName.toLowerCase();
|
|
362
|
+
const role = element.role;
|
|
363
|
+
// No accessible name - CRITICAL
|
|
364
|
+
if (!computation.accessibleName || computation.accessibleName.trim().length === 0) {
|
|
365
|
+
if (tagName === 'img') {
|
|
366
|
+
return {
|
|
367
|
+
recommendation: 'Add descriptive alt attribute to image',
|
|
368
|
+
codeExample: `<img src="..." alt="Description of what the image shows">`,
|
|
369
|
+
priority: 'critical'
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
if (tagName === 'button' || role === 'button') {
|
|
373
|
+
const context = element.context?.toLowerCase() || '';
|
|
374
|
+
const suggestedLabel = context.includes('close') ? 'Close dialog' :
|
|
375
|
+
context.includes('menu') ? 'Open menu' :
|
|
376
|
+
context.includes('search') ? 'Search' :
|
|
377
|
+
'Describe button action';
|
|
378
|
+
return {
|
|
379
|
+
recommendation: 'Add accessible name to button',
|
|
380
|
+
codeExample: `<!-- Option 1: Visible text (preferred) -->
|
|
381
|
+
<button type="button">${suggestedLabel}</button>
|
|
382
|
+
|
|
383
|
+
<!-- Option 2: aria-label for icon buttons -->
|
|
384
|
+
<button type="button" aria-label="${suggestedLabel}">
|
|
385
|
+
<svg aria-hidden="true">...</svg>
|
|
386
|
+
</button>`,
|
|
387
|
+
priority: 'critical'
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
if (['input', 'select', 'textarea'].includes(tagName)) {
|
|
391
|
+
const type = element.attributes['type'] || 'text';
|
|
392
|
+
return {
|
|
393
|
+
recommendation: 'Add label to form input',
|
|
394
|
+
codeExample: `<!-- Preferred: Visible label -->
|
|
395
|
+
<label for="inputId">Field label:</label>
|
|
396
|
+
<input type="${type}" id="inputId" name="...">
|
|
397
|
+
|
|
398
|
+
<!-- Alternative: aria-label if visible label not possible -->
|
|
399
|
+
<input type="${type}" aria-label="Field label">`,
|
|
400
|
+
priority: 'critical'
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
return {
|
|
404
|
+
recommendation: 'Add accessible name via aria-label or aria-labelledby',
|
|
405
|
+
codeExample: `<${tagName} aria-label="Descriptive name">...</${tagName}>`,
|
|
406
|
+
priority: 'critical'
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
// Using placeholder as name - HIGH PRIORITY FIX
|
|
410
|
+
if (computation.source.type === 'placeholder') {
|
|
411
|
+
return {
|
|
412
|
+
recommendation: 'Replace placeholder with proper label',
|
|
413
|
+
codeExample: `<!-- WRONG (current) -->
|
|
414
|
+
<input type="text" placeholder="Enter email">
|
|
415
|
+
|
|
416
|
+
<!-- CORRECT -->
|
|
417
|
+
<label for="email">Email address:</label>
|
|
418
|
+
<input type="text" id="email" placeholder="you@example.com">`,
|
|
419
|
+
priority: 'high'
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
// Using title as name - MEDIUM PRIORITY
|
|
423
|
+
if (computation.source.type === 'title') {
|
|
424
|
+
return {
|
|
425
|
+
recommendation: 'Replace title with aria-label or visible label',
|
|
426
|
+
codeExample: `<!-- WRONG (current) -->
|
|
427
|
+
<button title="Submit form">→</button>
|
|
428
|
+
|
|
429
|
+
<!-- CORRECT -->
|
|
430
|
+
<button type="button" aria-label="Submit form">→</button>
|
|
431
|
+
|
|
432
|
+
<!-- BETTER: Visible text -->
|
|
433
|
+
<button type="button">Submit Form</button>`,
|
|
434
|
+
priority: 'medium'
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
// Name too generic - MEDIUM PRIORITY
|
|
438
|
+
if (computation.quality < 70) {
|
|
439
|
+
return {
|
|
440
|
+
recommendation: 'Make accessible name more descriptive',
|
|
441
|
+
codeExample: `<!-- Current: Generic -->
|
|
442
|
+
<button>Click Here</button>
|
|
443
|
+
|
|
444
|
+
<!-- Better: Specific -->
|
|
445
|
+
<button>Download PDF Report</button>`,
|
|
446
|
+
priority: 'medium'
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
return {
|
|
450
|
+
recommendation: 'Accessible name is adequate',
|
|
451
|
+
codeExample: '',
|
|
452
|
+
priority: 'low'
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Visualize accessible name computation for debugging
|
|
457
|
+
*/
|
|
458
|
+
function visualizeAccNameComputation(computation) {
|
|
459
|
+
let output = '=== Accessible Name Computation ===\n\n';
|
|
460
|
+
output += `Final Name: "${computation.accessibleName}"\n`;
|
|
461
|
+
output += `Quality Score: ${computation.quality}/100\n`;
|
|
462
|
+
output += `Sufficient: ${computation.sufficient ? '✓ Yes' : '✗ No'}\n`;
|
|
463
|
+
output += `Source: ${computation.source.type} (priority ${computation.source.priority})\n`;
|
|
464
|
+
if (computation.accessibleDescription) {
|
|
465
|
+
output += `Description: "${computation.accessibleDescription}"\n`;
|
|
466
|
+
}
|
|
467
|
+
output += '\n--- All Sources (Priority Order) ---\n';
|
|
468
|
+
computation.allSources.forEach(source => {
|
|
469
|
+
const icon = source === computation.source ? '→' : ' ';
|
|
470
|
+
output += `${icon} [${source.priority}] ${source.type}: "${source.value}"\n`;
|
|
471
|
+
output += ` ${source.recommended ? '✓' : '⚠'} ${source.details}\n`;
|
|
472
|
+
});
|
|
473
|
+
if (computation.issues.length > 0) {
|
|
474
|
+
output += '\n--- Issues ---\n';
|
|
475
|
+
computation.issues.forEach(issue => {
|
|
476
|
+
const icon = issue.severity === 'error' ? '❌' :
|
|
477
|
+
issue.severity === 'warning' ? '⚠️' : 'ℹ️';
|
|
478
|
+
output += `${icon} ${issue.message}\n`;
|
|
479
|
+
output += ` Recommendation: ${issue.recommendation}\n`;
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
if (computation.trace.length > 0) {
|
|
483
|
+
output += '\n--- Computation Trace ---\n';
|
|
484
|
+
computation.trace.forEach(step => {
|
|
485
|
+
output += `${step}\n`;
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
return output;
|
|
489
|
+
}
|
|
490
|
+
/**
|
|
491
|
+
* Example usage and test cases
|
|
492
|
+
*/
|
|
493
|
+
exports.ACCNAME_EXAMPLES = {
|
|
494
|
+
/**
|
|
495
|
+
* Perfect accessible name (visible label)
|
|
496
|
+
*/
|
|
497
|
+
perfectButton: () => {
|
|
498
|
+
return computeAccessibleName({
|
|
499
|
+
tagName: 'button',
|
|
500
|
+
attributes: {},
|
|
501
|
+
textContent: 'Submit Contact Form'
|
|
502
|
+
}, { includeTrace: true });
|
|
503
|
+
},
|
|
504
|
+
/**
|
|
505
|
+
* Icon button with aria-label
|
|
506
|
+
*/
|
|
507
|
+
iconButton: () => {
|
|
508
|
+
return computeAccessibleName({
|
|
509
|
+
tagName: 'button',
|
|
510
|
+
role: 'button',
|
|
511
|
+
attributes: {
|
|
512
|
+
'aria-label': 'Close navigation menu'
|
|
513
|
+
},
|
|
514
|
+
textContent: '' // No visible text
|
|
515
|
+
}, { includeTrace: true });
|
|
516
|
+
},
|
|
517
|
+
/**
|
|
518
|
+
* Form input with label
|
|
519
|
+
*/
|
|
520
|
+
formInput: () => {
|
|
521
|
+
return computeAccessibleName({
|
|
522
|
+
tagName: 'input',
|
|
523
|
+
attributes: {
|
|
524
|
+
'type': 'email',
|
|
525
|
+
'id': 'user-email',
|
|
526
|
+
'_native-label': 'Email Address' // Simulated <label for="user-email">
|
|
527
|
+
}
|
|
528
|
+
}, { includeTrace: true });
|
|
529
|
+
},
|
|
530
|
+
/**
|
|
531
|
+
* WRONG: Using placeholder as name
|
|
532
|
+
*/
|
|
533
|
+
wrongPlaceholder: () => {
|
|
534
|
+
return computeAccessibleName({
|
|
535
|
+
tagName: 'input',
|
|
536
|
+
attributes: {
|
|
537
|
+
'type': 'text',
|
|
538
|
+
'placeholder': 'Enter your name'
|
|
539
|
+
// Missing: aria-label or <label>
|
|
540
|
+
}
|
|
541
|
+
}, { includeTrace: true });
|
|
542
|
+
},
|
|
543
|
+
/**
|
|
544
|
+
* Image with alt text
|
|
545
|
+
*/
|
|
546
|
+
imageWithAlt: () => {
|
|
547
|
+
return computeAccessibleName({
|
|
548
|
+
tagName: 'img',
|
|
549
|
+
attributes: {
|
|
550
|
+
'src': 'logo.png',
|
|
551
|
+
'alt': 'Company Logo'
|
|
552
|
+
}
|
|
553
|
+
}, { includeTrace: true });
|
|
554
|
+
},
|
|
555
|
+
/**
|
|
556
|
+
* Missing accessible name
|
|
557
|
+
*/
|
|
558
|
+
missingName: () => {
|
|
559
|
+
return computeAccessibleName({
|
|
560
|
+
tagName: 'button',
|
|
561
|
+
attributes: {},
|
|
562
|
+
textContent: '' // Empty button
|
|
563
|
+
}, { includeTrace: true });
|
|
564
|
+
}
|
|
565
|
+
};
|
|
566
|
+
//# sourceMappingURL=accname-computation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accname-computation.js","sourceRoot":"","sources":["../../../../../src/mcp/tools/qe/accessibility/accname-computation.ts"],"names":[],"mappings":"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"}
|