afterburn-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +281 -0
  3. package/dist/ai/gemini-client.d.ts +21 -0
  4. package/dist/ai/gemini-client.js +105 -0
  5. package/dist/ai/gemini-client.js.map +1 -0
  6. package/dist/ai/index.d.ts +1 -0
  7. package/dist/ai/index.js +3 -0
  8. package/dist/ai/index.js.map +1 -0
  9. package/dist/analysis/diagnosis-schema.d.ts +106 -0
  10. package/dist/analysis/diagnosis-schema.js +54 -0
  11. package/dist/analysis/diagnosis-schema.js.map +1 -0
  12. package/dist/analysis/error-analyzer.d.ts +9 -0
  13. package/dist/analysis/error-analyzer.js +573 -0
  14. package/dist/analysis/error-analyzer.js.map +1 -0
  15. package/dist/analysis/index.d.ts +4 -0
  16. package/dist/analysis/index.js +6 -0
  17. package/dist/analysis/index.js.map +1 -0
  18. package/dist/analysis/source-mapper.d.ts +19 -0
  19. package/dist/analysis/source-mapper.js +329 -0
  20. package/dist/analysis/source-mapper.js.map +1 -0
  21. package/dist/analysis/ui-auditor.d.ts +9 -0
  22. package/dist/analysis/ui-auditor.js +104 -0
  23. package/dist/analysis/ui-auditor.js.map +1 -0
  24. package/dist/artifacts/artifact-storage.d.ts +44 -0
  25. package/dist/artifacts/artifact-storage.js +99 -0
  26. package/dist/artifacts/artifact-storage.js.map +1 -0
  27. package/dist/artifacts/index.d.ts +1 -0
  28. package/dist/artifacts/index.js +3 -0
  29. package/dist/artifacts/index.js.map +1 -0
  30. package/dist/browser/browser-manager.d.ts +45 -0
  31. package/dist/browser/browser-manager.js +88 -0
  32. package/dist/browser/browser-manager.js.map +1 -0
  33. package/dist/browser/challenge-detector.d.ts +10 -0
  34. package/dist/browser/challenge-detector.js +58 -0
  35. package/dist/browser/challenge-detector.js.map +1 -0
  36. package/dist/browser/cookie-dismisser.d.ts +18 -0
  37. package/dist/browser/cookie-dismisser.js +76 -0
  38. package/dist/browser/cookie-dismisser.js.map +1 -0
  39. package/dist/browser/index.d.ts +4 -0
  40. package/dist/browser/index.js +6 -0
  41. package/dist/browser/index.js.map +1 -0
  42. package/dist/browser/stealth-browser.d.ts +13 -0
  43. package/dist/browser/stealth-browser.js +59 -0
  44. package/dist/browser/stealth-browser.js.map +1 -0
  45. package/dist/cli/commander-cli.d.ts +2 -0
  46. package/dist/cli/commander-cli.js +150 -0
  47. package/dist/cli/commander-cli.js.map +1 -0
  48. package/dist/cli/doctor.d.ts +34 -0
  49. package/dist/cli/doctor.js +124 -0
  50. package/dist/cli/doctor.js.map +1 -0
  51. package/dist/cli/first-run.d.ts +6 -0
  52. package/dist/cli/first-run.js +58 -0
  53. package/dist/cli/first-run.js.map +1 -0
  54. package/dist/cli/index.d.ts +3 -0
  55. package/dist/cli/index.js +5 -0
  56. package/dist/cli/index.js.map +1 -0
  57. package/dist/cli/progress.d.ts +11 -0
  58. package/dist/cli/progress.js +30 -0
  59. package/dist/cli/progress.js.map +1 -0
  60. package/dist/core/engine.d.ts +33 -0
  61. package/dist/core/engine.js +269 -0
  62. package/dist/core/engine.js.map +1 -0
  63. package/dist/core/index.d.ts +3 -0
  64. package/dist/core/index.js +4 -0
  65. package/dist/core/index.js.map +1 -0
  66. package/dist/core/validation.d.ts +52 -0
  67. package/dist/core/validation.js +228 -0
  68. package/dist/core/validation.js.map +1 -0
  69. package/dist/discovery/crawler.d.ts +58 -0
  70. package/dist/discovery/crawler.js +240 -0
  71. package/dist/discovery/crawler.js.map +1 -0
  72. package/dist/discovery/discovery-pipeline.d.ts +22 -0
  73. package/dist/discovery/discovery-pipeline.js +256 -0
  74. package/dist/discovery/discovery-pipeline.js.map +1 -0
  75. package/dist/discovery/element-mapper.d.ts +21 -0
  76. package/dist/discovery/element-mapper.js +422 -0
  77. package/dist/discovery/element-mapper.js.map +1 -0
  78. package/dist/discovery/index.d.ts +8 -0
  79. package/dist/discovery/index.js +8 -0
  80. package/dist/discovery/index.js.map +1 -0
  81. package/dist/discovery/link-validator.d.ts +15 -0
  82. package/dist/discovery/link-validator.js +137 -0
  83. package/dist/discovery/link-validator.js.map +1 -0
  84. package/dist/discovery/sitemap-builder.d.ts +19 -0
  85. package/dist/discovery/sitemap-builder.js +166 -0
  86. package/dist/discovery/sitemap-builder.js.map +1 -0
  87. package/dist/discovery/spa-detector.d.ts +12 -0
  88. package/dist/discovery/spa-detector.js +271 -0
  89. package/dist/discovery/spa-detector.js.map +1 -0
  90. package/dist/execution/error-detector.d.ts +10 -0
  91. package/dist/execution/error-detector.js +87 -0
  92. package/dist/execution/error-detector.js.map +1 -0
  93. package/dist/execution/evidence-capture.d.ts +8 -0
  94. package/dist/execution/evidence-capture.js +37 -0
  95. package/dist/execution/evidence-capture.js.map +1 -0
  96. package/dist/execution/index.d.ts +5 -0
  97. package/dist/execution/index.js +7 -0
  98. package/dist/execution/index.js.map +1 -0
  99. package/dist/execution/step-handlers.d.ts +48 -0
  100. package/dist/execution/step-handlers.js +349 -0
  101. package/dist/execution/step-handlers.js.map +1 -0
  102. package/dist/execution/test-data.d.ts +50 -0
  103. package/dist/execution/test-data.js +160 -0
  104. package/dist/execution/test-data.js.map +1 -0
  105. package/dist/execution/workflow-executor.d.ts +56 -0
  106. package/dist/execution/workflow-executor.js +331 -0
  107. package/dist/execution/workflow-executor.js.map +1 -0
  108. package/dist/index.d.ts +2 -0
  109. package/dist/index.js +5 -0
  110. package/dist/index.js.map +1 -0
  111. package/dist/mcp/entry.d.ts +2 -0
  112. package/dist/mcp/entry.js +5 -0
  113. package/dist/mcp/entry.js.map +1 -0
  114. package/dist/mcp/index.d.ts +2 -0
  115. package/dist/mcp/index.js +4 -0
  116. package/dist/mcp/index.js.map +1 -0
  117. package/dist/mcp/server.d.ts +3 -0
  118. package/dist/mcp/server.js +19 -0
  119. package/dist/mcp/server.js.map +1 -0
  120. package/dist/mcp/tools.d.ts +2 -0
  121. package/dist/mcp/tools.js +162 -0
  122. package/dist/mcp/tools.js.map +1 -0
  123. package/dist/planning/heuristic-planner.d.ts +7 -0
  124. package/dist/planning/heuristic-planner.js +238 -0
  125. package/dist/planning/heuristic-planner.js.map +1 -0
  126. package/dist/planning/index.d.ts +3 -0
  127. package/dist/planning/index.js +5 -0
  128. package/dist/planning/index.js.map +1 -0
  129. package/dist/planning/plan-schema.d.ts +74 -0
  130. package/dist/planning/plan-schema.js +39 -0
  131. package/dist/planning/plan-schema.js.map +1 -0
  132. package/dist/planning/workflow-planner.d.ts +39 -0
  133. package/dist/planning/workflow-planner.js +211 -0
  134. package/dist/planning/workflow-planner.js.map +1 -0
  135. package/dist/reports/health-scorer.d.ts +14 -0
  136. package/dist/reports/health-scorer.js +88 -0
  137. package/dist/reports/health-scorer.js.map +1 -0
  138. package/dist/reports/html-generator.d.ts +10 -0
  139. package/dist/reports/html-generator.js +155 -0
  140. package/dist/reports/html-generator.js.map +1 -0
  141. package/dist/reports/index.d.ts +4 -0
  142. package/dist/reports/index.js +6 -0
  143. package/dist/reports/index.js.map +1 -0
  144. package/dist/reports/markdown-generator.d.ts +10 -0
  145. package/dist/reports/markdown-generator.js +334 -0
  146. package/dist/reports/markdown-generator.js.map +1 -0
  147. package/dist/reports/priority-ranker.d.ts +22 -0
  148. package/dist/reports/priority-ranker.js +608 -0
  149. package/dist/reports/priority-ranker.js.map +1 -0
  150. package/dist/screenshots/dual-format.d.ts +14 -0
  151. package/dist/screenshots/dual-format.js +59 -0
  152. package/dist/screenshots/dual-format.js.map +1 -0
  153. package/dist/screenshots/index.d.ts +2 -0
  154. package/dist/screenshots/index.js +4 -0
  155. package/dist/screenshots/index.js.map +1 -0
  156. package/dist/screenshots/screenshot-manager.d.ts +33 -0
  157. package/dist/screenshots/screenshot-manager.js +86 -0
  158. package/dist/screenshots/screenshot-manager.js.map +1 -0
  159. package/dist/testing/accessibility-auditor.d.ts +23 -0
  160. package/dist/testing/accessibility-auditor.js +44 -0
  161. package/dist/testing/accessibility-auditor.js.map +1 -0
  162. package/dist/testing/index.d.ts +4 -0
  163. package/dist/testing/index.js +5 -0
  164. package/dist/testing/index.js.map +1 -0
  165. package/dist/testing/meta-auditor.d.ts +16 -0
  166. package/dist/testing/meta-auditor.js +268 -0
  167. package/dist/testing/meta-auditor.js.map +1 -0
  168. package/dist/testing/performance-monitor.d.ts +15 -0
  169. package/dist/testing/performance-monitor.js +64 -0
  170. package/dist/testing/performance-monitor.js.map +1 -0
  171. package/dist/types/artifacts.d.ts +58 -0
  172. package/dist/types/artifacts.js +3 -0
  173. package/dist/types/artifacts.js.map +1 -0
  174. package/dist/types/discovery.d.ts +124 -0
  175. package/dist/types/discovery.js +3 -0
  176. package/dist/types/discovery.js.map +1 -0
  177. package/dist/types/execution.d.ts +154 -0
  178. package/dist/types/execution.js +3 -0
  179. package/dist/types/execution.js.map +1 -0
  180. package/dist/types/index.d.ts +2 -0
  181. package/dist/types/index.js +4 -0
  182. package/dist/types/index.js.map +1 -0
  183. package/dist/utils/sanitizer.d.ts +25 -0
  184. package/dist/utils/sanitizer.js +98 -0
  185. package/dist/utils/sanitizer.js.map +1 -0
  186. package/package.json +86 -0
  187. package/templates/report.hbs +202 -0
  188. package/templates/styles/report.css +607 -0
@@ -0,0 +1,608 @@
1
+ // Categorize and prioritize issues from diagnosed errors, UI audits, and execution results
2
+ /**
3
+ * Convert raw Playwright selectors into human-readable button labels.
4
+ * e.g. 'button:has-text("Subscribe")' → '"Subscribe" button'
5
+ * 'form:nth-of-type(1) [type="submit"]' → 'Submit button'
6
+ */
7
+ function humanizeSelector(selector) {
8
+ // Extract button text from :has-text("...") patterns
9
+ const hasTextMatch = selector.match(/:?has-text\("([^"]+)"\)/);
10
+ if (hasTextMatch)
11
+ return `"${hasTextMatch[1]}" button`;
12
+ // Identify submit buttons
13
+ if (selector.includes('[type="submit"]')) {
14
+ const formMatch = selector.match(/form#([\w-]+)/);
15
+ if (formMatch)
16
+ return `Submit button (${formMatch[1].replace(/-/g, ' ')} form)`;
17
+ return 'Submit button';
18
+ }
19
+ // Keep simple IDs as-is (e.g. #submit-btn)
20
+ if (/^#[\w-]+$/.test(selector))
21
+ return selector;
22
+ // Generic fallback
23
+ return 'A button on the page';
24
+ }
25
+ /**
26
+ * Convert form selectors to human-readable names.
27
+ * e.g. 'form#contact-form' → 'contact form'
28
+ * 'form.newsletter-form' → 'newsletter form'
29
+ */
30
+ function humanizeFormSelector(selector) {
31
+ const idMatch = selector.match(/form#([\w-]+)/);
32
+ if (idMatch)
33
+ return idMatch[1].replace(/[-_]/g, ' ').replace(/\bform\b/gi, '').trim() + ' form';
34
+ const classMatch = selector.match(/form\.([\w-]+)/);
35
+ if (classMatch)
36
+ return classMatch[1].replace(/[-_]/g, ' ').replace(/\bform\b/gi, '').trim() + ' form';
37
+ return 'form';
38
+ }
39
+ /**
40
+ * Extract the pathname from a full URL for readable display.
41
+ */
42
+ function extractPathFromUrl(url) {
43
+ try {
44
+ const parsed = new URL(url);
45
+ return parsed.pathname || url;
46
+ }
47
+ catch {
48
+ return url;
49
+ }
50
+ }
51
+ /**
52
+ * Build specific fix text for accessibility violations based on the violation ID and description.
53
+ */
54
+ function buildAccessibilityFix(violation) {
55
+ const id = violation.id.toLowerCase();
56
+ if (id.includes('color-contrast') || id.includes('contrast')) {
57
+ return `Increase the contrast ratio between text and background colors. Use a tool like WebAIM's contrast checker to find a pair that passes WCAG AA (4.5:1 for normal text, 3:1 for large text).`;
58
+ }
59
+ if (id.includes('html-has-lang') || id.includes('lang')) {
60
+ return `Add a lang attribute to your <html> tag: <html lang="en">. This tells screen readers which language to use for pronunciation.`;
61
+ }
62
+ if (id.includes('image-alt') || id.includes('alt')) {
63
+ return `Add descriptive alt text to every <img> tag. For decorative images, use alt="" (empty). For informative images, describe what the image shows.`;
64
+ }
65
+ if (id.includes('label') || id.includes('form-field')) {
66
+ return `Add a <label> element linked to each form input using the "for" attribute, or wrap the input inside a <label> tag.`;
67
+ }
68
+ if (id.includes('heading') || id.includes('heading-order')) {
69
+ return `Use headings in order (h1, then h2, then h3) — don't skip levels. Each page should have exactly one <h1>.`;
70
+ }
71
+ if (id.includes('link-name') || id.includes('anchor')) {
72
+ return `Give every link descriptive text that makes sense out of context. Avoid "click here" or "read more" — say what the link leads to.`;
73
+ }
74
+ if (id.includes('button-name')) {
75
+ return `Add visible text or an aria-label to every <button> element so screen readers can announce its purpose.`;
76
+ }
77
+ if (id.includes('aria')) {
78
+ return `Review ARIA attributes on the flagged elements — make sure roles, states, and properties match the element's actual behavior.`;
79
+ }
80
+ if (id.includes('tabindex')) {
81
+ return `Remove positive tabindex values (tabindex="2", etc.) and use tabindex="0" or "-1" instead. Let the natural DOM order control focus.`;
82
+ }
83
+ if (id.includes('landmark') || id.includes('region')) {
84
+ return `Wrap your page sections in landmark elements: <header>, <nav>, <main>, <footer>. This helps screen reader users jump between sections.`;
85
+ }
86
+ // Fallback: still include the help URL but add actionable context
87
+ return `Fix the ${violation.nodes} affected element(s): ${violation.description}. See ${violation.helpUrl} for step-by-step guidance.`;
88
+ }
89
+ /**
90
+ * Build differentiated impact text for accessibility violations.
91
+ */
92
+ function buildAccessibilityImpact(violation) {
93
+ const id = violation.id.toLowerCase();
94
+ if (id.includes('color-contrast') || id.includes('contrast')) {
95
+ return `${violation.nodes} element(s) have text that's hard to read against the background — users with low vision may not be able to read your content`;
96
+ }
97
+ if (id.includes('html-has-lang') || id.includes('lang')) {
98
+ return `Screen readers won't know what language to use, so they may mispronounce all text on the page`;
99
+ }
100
+ if (id.includes('image-alt') || id.includes('alt')) {
101
+ return `${violation.nodes} image(s) are invisible to screen reader users — they'll hear nothing or a useless filename`;
102
+ }
103
+ if (id.includes('label') || id.includes('form-field')) {
104
+ return `Form fields without labels are confusing for screen reader users — they won't know what to type`;
105
+ }
106
+ if (id.includes('heading') || id.includes('heading-order')) {
107
+ return `Broken heading hierarchy makes it hard for screen reader users to navigate and understand your page structure`;
108
+ }
109
+ if (id.includes('link-name') || id.includes('anchor')) {
110
+ return `Links without descriptive text leave screen reader users guessing where the link goes`;
111
+ }
112
+ if (id.includes('button-name')) {
113
+ return `Buttons without names are invisible to screen reader users — they can't tell what the button does`;
114
+ }
115
+ // Severity-based fallback with node count
116
+ if (violation.impact === 'critical') {
117
+ return `This blocks ${violation.nodes} element(s) from being usable by people with disabilities — some users cannot access this content at all`;
118
+ }
119
+ if (violation.impact === 'serious') {
120
+ return `${violation.nodes} element(s) are significantly harder to use for people with disabilities`;
121
+ }
122
+ return `A minor accessibility gap affecting ${violation.nodes} element(s) — fixing it makes your site more inclusive`;
123
+ }
124
+ /**
125
+ * Build specific impact text for JavaScript errors based on the error details.
126
+ */
127
+ function buildJsErrorImpact(error) {
128
+ const msg = error.originalError.toLowerCase();
129
+ if (msg.includes('typeerror')) {
130
+ return 'This JavaScript crash means a feature on the page is completely broken — buttons, forms, or dynamic content may not work';
131
+ }
132
+ if (msg.includes('referenceerror')) {
133
+ return 'A script on this page references something that doesn\'t exist — any feature depending on it will fail silently';
134
+ }
135
+ if (msg.includes('syntaxerror')) {
136
+ return 'A syntax error prevents the entire script from running — every feature in that script file is dead';
137
+ }
138
+ if (msg.includes('rangeerror')) {
139
+ return 'The page hit an infinite loop or memory limit — this can freeze the browser tab for your users';
140
+ }
141
+ return 'This JavaScript error breaks interactive features — buttons, forms, or dynamic content may stop working';
142
+ }
143
+ /**
144
+ * Build specific impact text for network errors based on the error details.
145
+ */
146
+ function buildNetworkErrorImpact(error) {
147
+ const msg = error.originalError.toLowerCase();
148
+ if (msg.includes('404')) {
149
+ const resourceMatch = error.originalError.match(/([^\s/]+\.[a-z]{2,4})(?:\s|\)|$)/i);
150
+ if (resourceMatch) {
151
+ return `The file "${resourceMatch[1]}" is missing — users will see a broken image, missing style, or failed feature`;
152
+ }
153
+ return 'A resource is missing (404) — users may see broken images, missing styles, or failed features';
154
+ }
155
+ if (msg.includes('500')) {
156
+ return 'The server is crashing on this request — any feature that depends on this API call is broken';
157
+ }
158
+ if (msg.includes('cors')) {
159
+ return 'A cross-origin request is being blocked — the feature that makes this API call won\'t work for any user';
160
+ }
161
+ return 'A resource failed to load — users may see missing content, broken images, or failed features';
162
+ }
163
+ /**
164
+ * Build differentiated impact text for dead buttons based on what the button does.
165
+ */
166
+ function buildDeadButtonImpact(selector, buttonName) {
167
+ if (selector.includes('submit') || selector.includes('[type="submit"]')) {
168
+ return `The submit button is dead — users fill out the form and nothing happens when they submit`;
169
+ }
170
+ if (selector.includes('subscribe') || selector.includes('newsletter')) {
171
+ return `Users trying to subscribe will click ${buttonName} and get no response — you're losing newsletter signups`;
172
+ }
173
+ if (selector.includes('cta') || selector.includes('get-started') || selector.includes('free-trial') || selector.includes('hero')) {
174
+ return `Your main call-to-action (${buttonName}) does nothing — potential customers will leave without converting`;
175
+ }
176
+ if (selector.includes('send') || selector.includes('contact') || selector.includes('message')) {
177
+ return `${buttonName} is broken — users who reach out through your contact form will think their message was lost`;
178
+ }
179
+ if (selector.includes('search')) {
180
+ return `The search button doesn't work — users can't find content on your site`;
181
+ }
182
+ if (selector.includes('login') || selector.includes('signin') || selector.includes('sign-in')) {
183
+ return `The login button is dead — users cannot sign into their accounts`;
184
+ }
185
+ return `Users will click ${buttonName} expecting something to happen, but nothing does`;
186
+ }
187
+ /**
188
+ * Build specific fix suggestion for dead buttons based on selector and reason.
189
+ */
190
+ function buildDeadButtonFix(selector, reason) {
191
+ const hasTextMatch = selector.match(/:?has-text\("([^"]+)"\)/);
192
+ const buttonLabel = hasTextMatch ? `the "${hasTextMatch[1]}" button` : 'this button';
193
+ if (selector.includes('submit') || selector.includes('[type="submit"]')) {
194
+ return `The submit button has no working handler. Add a form action URL or a JavaScript submit handler to ${buttonLabel}.`;
195
+ }
196
+ if (selector.includes('cta') || selector.includes('get-started') || selector.includes('hero')) {
197
+ return `${buttonLabel} is a call-to-action with no action. Wire it up to navigate to a signup page or open a modal.`;
198
+ }
199
+ return `Add an onclick handler or addEventListener to make ${buttonLabel} respond to clicks. Currently it does nothing.`;
200
+ }
201
+ /**
202
+ * Build differentiated impact text for broken forms based on form type.
203
+ */
204
+ function buildBrokenFormImpact(selector, formName) {
205
+ const s = selector.toLowerCase();
206
+ if (s.includes('contact') || s.includes('message') || s.includes('inquiry')) {
207
+ return `Users who fill out the ${formName} and hit submit get no confirmation — you're losing every customer inquiry`;
208
+ }
209
+ if (s.includes('newsletter') || s.includes('subscribe') || s.includes('email')) {
210
+ return `The ${formName} silently fails — users think they subscribed but their email is never captured`;
211
+ }
212
+ if (s.includes('login') || s.includes('signin') || s.includes('sign-in')) {
213
+ return `The ${formName} doesn't submit — users cannot log into their accounts`;
214
+ }
215
+ if (s.includes('signup') || s.includes('register') || s.includes('sign-up')) {
216
+ return `The ${formName} is broken — new users cannot create accounts on your site`;
217
+ }
218
+ if (s.includes('search')) {
219
+ return `The search form doesn't work — users cannot find content on your site`;
220
+ }
221
+ if (s.includes('checkout') || s.includes('payment') || s.includes('order')) {
222
+ return `The ${formName} is dead — customers cannot complete their purchase`;
223
+ }
224
+ return `Users who fill out the ${formName} and hit submit get nothing — you're losing every submission`;
225
+ }
226
+ /**
227
+ * Build specific fix suggestion for broken forms.
228
+ */
229
+ function buildBrokenFormFix(form) {
230
+ if (form.reason?.includes('no navigation or network')) {
231
+ return `The form at "${form.formSelector}" has no backend connection. Either set a form action URL (e.g., action="/api/submit") or add a JavaScript handler that sends the data to your server.`;
232
+ }
233
+ if (form.skippedFields > 0) {
234
+ return `The form at "${form.formSelector}" couldn't be fully filled out (${form.skippedFields} fields skipped). Check that all form fields have proper name attributes and are accessible.`;
235
+ }
236
+ return `The form at "${form.formSelector}" doesn't respond to submission. Add a form action attribute or a JavaScript submit handler.`;
237
+ }
238
+ /**
239
+ * Find a page screenshot from workflow results (for issues without their own screenshot)
240
+ */
241
+ function findPageScreenshot(workflowResults) {
242
+ for (const workflow of workflowResults) {
243
+ if (workflow.pageScreenshotRef) {
244
+ return workflow.pageScreenshotRef;
245
+ }
246
+ }
247
+ return undefined;
248
+ }
249
+ export function prioritizeIssues(diagnosedErrors, uiAudits, executionArtifact) {
250
+ const issues = [];
251
+ const fallbackScreenshot = findPageScreenshot(executionArtifact.workflowResults);
252
+ // HIGH PRIORITY: Workflow-blocking errors
253
+ // Low-confidence diagnoses are downgraded to medium to avoid false-alarm noise
254
+ for (const error of diagnosedErrors) {
255
+ if (['navigation', 'authentication', 'form'].includes(error.errorType)) {
256
+ const priority = error.confidence === 'low' ? 'medium' : 'high';
257
+ issues.push({
258
+ priority,
259
+ category: 'Workflow Error',
260
+ summary: error.summary,
261
+ impact: 'This breaks a core user flow on your site',
262
+ fixSuggestion: error.suggestedFix,
263
+ location: error.sourceLocation ? `${error.sourceLocation.file}:${error.sourceLocation.line}` : (error.pageUrl || 'Unknown'),
264
+ screenshotRef: error.screenshotRef,
265
+ technicalDetails: error.technicalDetails,
266
+ });
267
+ }
268
+ }
269
+ // HIGH PRIORITY: JavaScript errors that crash page functionality
270
+ // Network 404s and broken images stay medium since they're cosmetic, but JS errors break interactivity
271
+ for (const error of diagnosedErrors) {
272
+ if (error.errorType === 'javascript') {
273
+ const priority = error.confidence === 'low' ? 'medium' : 'high';
274
+ issues.push({
275
+ priority,
276
+ category: 'Console Error',
277
+ summary: error.summary,
278
+ impact: buildJsErrorImpact(error),
279
+ fixSuggestion: error.suggestedFix,
280
+ location: error.sourceLocation ? `${error.sourceLocation.file}:${error.sourceLocation.line}` : (error.pageUrl || 'Unknown'),
281
+ screenshotRef: error.screenshotRef,
282
+ technicalDetails: error.technicalDetails,
283
+ });
284
+ }
285
+ }
286
+ // MEDIUM PRIORITY: Network errors (missing resources, API failures)
287
+ for (const error of diagnosedErrors) {
288
+ if (error.errorType === 'network') {
289
+ const priority = error.confidence === 'low' ? 'low' : 'medium';
290
+ issues.push({
291
+ priority,
292
+ category: 'Console Error',
293
+ summary: error.summary,
294
+ impact: buildNetworkErrorImpact(error),
295
+ fixSuggestion: error.suggestedFix,
296
+ location: error.sourceLocation ? `${error.sourceLocation.file}:${error.sourceLocation.line}` : (error.pageUrl || 'Unknown'),
297
+ screenshotRef: error.screenshotRef,
298
+ technicalDetails: error.technicalDetails,
299
+ });
300
+ }
301
+ }
302
+ // HIGH PRIORITY: Dead buttons — users clicking and getting no response is a core UX failure
303
+ for (const deadButton of executionArtifact.deadButtons) {
304
+ if (deadButton.isDead) {
305
+ const buttonName = humanizeSelector(deadButton.selector);
306
+ issues.push({
307
+ priority: 'high',
308
+ category: 'Dead Button',
309
+ summary: `${buttonName} doesn't do anything when clicked`,
310
+ impact: buildDeadButtonImpact(deadButton.selector, buttonName),
311
+ fixSuggestion: buildDeadButtonFix(deadButton.selector, deadButton.reason),
312
+ location: executionArtifact.targetUrl,
313
+ screenshotRef: fallbackScreenshot,
314
+ technicalDetails: deadButton.reason,
315
+ });
316
+ }
317
+ }
318
+ // HIGH PRIORITY: Broken forms — lost leads, signups, and user data
319
+ for (const brokenForm of executionArtifact.brokenForms) {
320
+ if (brokenForm.isBroken) {
321
+ const formName = humanizeFormSelector(brokenForm.formSelector);
322
+ issues.push({
323
+ priority: 'high',
324
+ category: 'Broken Form',
325
+ summary: `The ${formName} doesn't work — submitting it has no effect`,
326
+ impact: buildBrokenFormImpact(brokenForm.formSelector, formName),
327
+ fixSuggestion: buildBrokenFormFix(brokenForm),
328
+ location: `${executionArtifact.targetUrl} (${brokenForm.formSelector})`,
329
+ screenshotRef: fallbackScreenshot,
330
+ technicalDetails: `Filled fields: ${brokenForm.filledFields}, Skipped fields: ${brokenForm.skippedFields}`,
331
+ });
332
+ }
333
+ }
334
+ // MEDIUM PRIORITY: Broken links (discovered during crawl)
335
+ for (const brokenLink of executionArtifact.brokenLinks) {
336
+ const statusLabel = brokenLink.statusCode === 0 ? 'unreachable' : `${brokenLink.statusCode}`;
337
+ const linkPath = extractPathFromUrl(brokenLink.url);
338
+ issues.push({
339
+ priority: 'medium',
340
+ category: 'Broken Link',
341
+ summary: `Link to ${linkPath} is broken (${statusLabel})`,
342
+ impact: `Visitors who click the "${linkPath}" link will see an error page instead of content`,
343
+ fixSuggestion: brokenLink.statusCode === 404
344
+ ? `Create the missing page at ${linkPath}, or update the link to point to an existing page`
345
+ : brokenLink.statusCode === 0
346
+ ? `The page at ${brokenLink.url} could not be reached — check if the URL is spelled correctly`
347
+ : `The server returned ${brokenLink.statusCode} for ${linkPath} — check server logs for the error`,
348
+ location: brokenLink.sourceUrl,
349
+ technicalDetails: `HTTP ${brokenLink.statusCode}: ${brokenLink.url} (found on ${brokenLink.sourceUrl})`,
350
+ });
351
+ }
352
+ // MEDIUM PRIORITY: UI audit layout/contrast issues (high severity)
353
+ for (const audit of uiAudits) {
354
+ for (const layoutIssue of audit.layoutIssues) {
355
+ if (layoutIssue.severity === 'high') {
356
+ issues.push({
357
+ priority: 'medium',
358
+ category: 'UI Issue',
359
+ summary: layoutIssue.description,
360
+ impact: `A layout problem at "${layoutIssue.location}" is making part of your page hard to read or use`,
361
+ fixSuggestion: `Inspect the "${layoutIssue.location}" area in your browser DevTools and fix the CSS causing "${layoutIssue.description.toLowerCase()}"`,
362
+ location: audit.pageUrl,
363
+ screenshotRef: audit.screenshotRef,
364
+ technicalDetails: `Severity: ${layoutIssue.severity}`,
365
+ });
366
+ }
367
+ }
368
+ for (const contrastIssue of audit.contrastIssues) {
369
+ issues.push({
370
+ priority: 'medium',
371
+ category: 'UI Issue',
372
+ summary: `${contrastIssue.element}: ${contrastIssue.issue}`,
373
+ impact: 'Low contrast makes text hard to read, especially for users with vision impairments',
374
+ fixSuggestion: contrastIssue.suggestion,
375
+ location: audit.pageUrl,
376
+ screenshotRef: audit.screenshotRef,
377
+ technicalDetails: undefined,
378
+ });
379
+ }
380
+ }
381
+ // HIGH/MEDIUM PRIORITY: Accessibility violations (critical or serious)
382
+ for (const pageAudit of executionArtifact.pageAudits) {
383
+ if (pageAudit.accessibility) {
384
+ for (const violation of pageAudit.accessibility.violations) {
385
+ if (violation.impact === 'critical') {
386
+ issues.push({
387
+ priority: 'high',
388
+ category: 'Accessibility',
389
+ summary: violation.description,
390
+ impact: buildAccessibilityImpact(violation),
391
+ fixSuggestion: buildAccessibilityFix(violation),
392
+ location: pageAudit.url,
393
+ screenshotRef: fallbackScreenshot,
394
+ technicalDetails: `${violation.nodes} element(s) affected`,
395
+ });
396
+ }
397
+ else if (violation.impact === 'serious') {
398
+ issues.push({
399
+ priority: 'medium',
400
+ category: 'Accessibility',
401
+ summary: violation.description,
402
+ impact: buildAccessibilityImpact(violation),
403
+ fixSuggestion: buildAccessibilityFix(violation),
404
+ location: pageAudit.url,
405
+ screenshotRef: fallbackScreenshot,
406
+ technicalDetails: `${violation.nodes} element(s) affected`,
407
+ });
408
+ }
409
+ }
410
+ }
411
+ }
412
+ // MEDIUM/LOW PRIORITY: Meta and SEO issues (from heuristic auditor)
413
+ for (const pageAudit of executionArtifact.pageAudits) {
414
+ if (pageAudit.metaIssues) {
415
+ for (const metaIssue of pageAudit.metaIssues) {
416
+ const priority = metaIssue.severity === 'high' ? 'medium' : 'low';
417
+ issues.push({
418
+ priority,
419
+ category: 'SEO / Meta',
420
+ summary: metaIssue.description,
421
+ impact: metaIssue.severity === 'high'
422
+ ? 'Search engines may not index your site correctly, costing you traffic'
423
+ : 'A small SEO tweak that could improve how your site appears in search results',
424
+ fixSuggestion: metaIssue.suggestion,
425
+ location: pageAudit.url,
426
+ technicalDetails: `Meta issue: ${metaIssue.id}`,
427
+ });
428
+ }
429
+ }
430
+ }
431
+ // LOW PRIORITY: DOM and unknown errors
432
+ for (const error of diagnosedErrors) {
433
+ if (['dom', 'unknown'].includes(error.errorType)) {
434
+ issues.push({
435
+ priority: 'low',
436
+ category: 'Console Error',
437
+ summary: error.summary,
438
+ impact: 'A background error that may not affect users yet, but could cause problems later',
439
+ fixSuggestion: error.suggestedFix,
440
+ location: error.sourceLocation ? `${error.sourceLocation.file}:${error.sourceLocation.line}` : (error.pageUrl || 'Unknown'),
441
+ screenshotRef: error.screenshotRef,
442
+ technicalDetails: error.technicalDetails,
443
+ });
444
+ }
445
+ }
446
+ // LOW PRIORITY: UI audit layout/contrast issues (medium/low severity)
447
+ for (const audit of uiAudits) {
448
+ for (const layoutIssue of audit.layoutIssues) {
449
+ if (layoutIssue.severity === 'medium' || layoutIssue.severity === 'low') {
450
+ issues.push({
451
+ priority: 'low',
452
+ category: 'UI Issue',
453
+ summary: layoutIssue.description,
454
+ impact: `A minor layout quirk at "${layoutIssue.location}" that could look better with a small CSS tweak`,
455
+ fixSuggestion: `Inspect the "${layoutIssue.location}" area in your browser DevTools and adjust the CSS to fix "${layoutIssue.description.toLowerCase()}"`,
456
+ location: audit.pageUrl,
457
+ screenshotRef: audit.screenshotRef,
458
+ technicalDetails: `Severity: ${layoutIssue.severity}`,
459
+ });
460
+ }
461
+ }
462
+ for (const formattingIssue of audit.formattingIssues) {
463
+ issues.push({
464
+ priority: 'low',
465
+ category: 'UI Issue',
466
+ summary: formattingIssue.problem,
467
+ impact: 'A formatting issue that affects the visual polish of your site',
468
+ fixSuggestion: formattingIssue.suggestion,
469
+ location: audit.pageUrl,
470
+ screenshotRef: audit.screenshotRef,
471
+ technicalDetails: undefined,
472
+ });
473
+ }
474
+ for (const improvement of audit.improvements) {
475
+ issues.push({
476
+ priority: 'low',
477
+ category: 'UI Issue',
478
+ summary: improvement,
479
+ impact: 'A nice-to-have improvement that would make your site feel more polished',
480
+ fixSuggestion: 'Consider this improvement to enhance user experience',
481
+ location: audit.pageUrl,
482
+ screenshotRef: audit.screenshotRef,
483
+ technicalDetails: undefined,
484
+ });
485
+ }
486
+ }
487
+ // LOW PRIORITY: Accessibility violations (moderate or minor)
488
+ for (const pageAudit of executionArtifact.pageAudits) {
489
+ if (pageAudit.accessibility) {
490
+ for (const violation of pageAudit.accessibility.violations) {
491
+ if (violation.impact === 'moderate' || violation.impact === 'minor') {
492
+ issues.push({
493
+ priority: 'low',
494
+ category: 'Accessibility',
495
+ summary: violation.description,
496
+ impact: buildAccessibilityImpact(violation),
497
+ fixSuggestion: buildAccessibilityFix(violation),
498
+ location: pageAudit.url,
499
+ screenshotRef: fallbackScreenshot,
500
+ technicalDetails: `${violation.nodes} element(s) affected`,
501
+ });
502
+ }
503
+ }
504
+ }
505
+ }
506
+ // SORT: high first, then medium, then low (within each priority, maintain insertion order)
507
+ const highPriority = issues.filter(i => i.priority === 'high');
508
+ const mediumPriority = issues.filter(i => i.priority === 'medium');
509
+ const lowPriority = issues.filter(i => i.priority === 'low');
510
+ return [...highPriority, ...mediumPriority, ...lowPriority];
511
+ }
512
+ /**
513
+ * Extract a resource URL from technicalDetails if present (e.g., "HTTP 404: http://...").
514
+ * Returns the URL if found, undefined otherwise.
515
+ */
516
+ function extractResourceUrl(issue) {
517
+ if (!issue.technicalDetails)
518
+ return undefined;
519
+ const match = issue.technicalDetails.match(/https?:\/\/[^\s)]+/);
520
+ return match?.[0];
521
+ }
522
+ /**
523
+ * Build a deduplication key for an issue based on its category.
524
+ * Groups issues that represent the same underlying problem, even across different pages.
525
+ */
526
+ function buildDedupKey(issue) {
527
+ switch (issue.category) {
528
+ case 'Console Error': {
529
+ // For network errors with a specific resource URL (e.g., "HTTP 404: http://..."),
530
+ // deduplicate by the resource URL alone — the same broken resource on multiple pages is one issue.
531
+ const resourceUrl = extractResourceUrl(issue);
532
+ if (resourceUrl) {
533
+ return `${issue.category}|resource:${resourceUrl}`;
534
+ }
535
+ // For other console errors, strip URLs and variable-specific details from summary for grouping
536
+ const normalizedSummary = issue.summary
537
+ .replace(/https?:\/\/[^\s)]+/g, '<URL>')
538
+ .replace(/'[^']*'/g, "'...'");
539
+ return `${issue.category}|${normalizedSummary}`;
540
+ }
541
+ case 'Broken Link':
542
+ // Same broken URL = same issue, regardless of which page the link was found on
543
+ return `${issue.category}|${issue.summary}`;
544
+ case 'Dead Button':
545
+ // Same button summary = same dead button, regardless of which page it was found on
546
+ return `${issue.category}|${issue.summary}`;
547
+ case 'Broken Form':
548
+ return `${issue.category}|${issue.location}`;
549
+ case 'SEO / Meta':
550
+ // Same meta issue across pages = one issue (e.g., missing viewport on every page)
551
+ return `${issue.category}|${issue.summary}`;
552
+ case 'Accessibility':
553
+ // Same accessibility violation across pages = one issue (e.g., missing lang on every page)
554
+ return `${issue.category}|${issue.summary}`;
555
+ case 'UI Issue':
556
+ return `${issue.category}|${issue.summary}|${issue.location}`;
557
+ case 'Workflow Error':
558
+ return `${issue.category}|${issue.summary}|${issue.location}`;
559
+ default:
560
+ return `${issue.category}|${issue.summary}|${issue.location}`;
561
+ }
562
+ }
563
+ const PRIORITY_RANK = { high: 0, medium: 1, low: 2 };
564
+ /**
565
+ * Deduplicate prioritized issues by grouping identical findings.
566
+ * Within each group, keeps the highest-priority instance and annotates with occurrence count.
567
+ * When issues from different pages are merged, aggregates unique page locations.
568
+ * Returns a new array sorted by priority (high > medium > low).
569
+ */
570
+ export function deduplicateIssues(issues) {
571
+ if (issues.length === 0)
572
+ return [];
573
+ const groups = new Map();
574
+ for (const issue of issues) {
575
+ const key = buildDedupKey(issue);
576
+ const existing = groups.get(key);
577
+ if (existing) {
578
+ existing.count++;
579
+ existing.locations.add(issue.location);
580
+ // Keep the higher-priority instance
581
+ if (PRIORITY_RANK[issue.priority] < PRIORITY_RANK[existing.best.priority]) {
582
+ existing.best = issue;
583
+ }
584
+ }
585
+ else {
586
+ groups.set(key, { best: issue, count: 1, locations: new Set([issue.location]) });
587
+ }
588
+ }
589
+ // Build result with occurrence counts and aggregated locations
590
+ const deduped = [];
591
+ for (const { best, count, locations } of groups.values()) {
592
+ const dedupedIssue = {
593
+ ...best,
594
+ occurrenceCount: count > 1 ? count : undefined,
595
+ };
596
+ // If the issue was found on multiple distinct pages, annotate the location
597
+ if (locations.size > 1) {
598
+ dedupedIssue.location = `${best.location} (and ${locations.size - 1} other page${locations.size - 1 > 1 ? 's' : ''})`;
599
+ }
600
+ deduped.push(dedupedIssue);
601
+ }
602
+ // Re-sort by priority
603
+ const high = deduped.filter(i => i.priority === 'high');
604
+ const medium = deduped.filter(i => i.priority === 'medium');
605
+ const low = deduped.filter(i => i.priority === 'low');
606
+ return [...high, ...medium, ...low];
607
+ }
608
+ //# sourceMappingURL=priority-ranker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"priority-ranker.js","sourceRoot":"","sources":["../../src/reports/priority-ranker.ts"],"names":[],"mappings":"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"}