nfunc-mcp 0.2.0 → 0.4.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 (65) hide show
  1. package/README.md +85 -335
  2. package/dist/index.js +27 -4
  3. package/dist/index.js.map +1 -1
  4. package/dist/mappers/a11yDedupe.d.ts +25 -0
  5. package/dist/mappers/a11yDedupe.js +95 -0
  6. package/dist/mappers/a11yDedupe.js.map +1 -0
  7. package/dist/mappers/compositeScore.d.ts +23 -0
  8. package/dist/mappers/compositeScore.js +107 -0
  9. package/dist/mappers/compositeScore.js.map +1 -0
  10. package/dist/mappers/correlator.js +94 -33
  11. package/dist/mappers/correlator.js.map +1 -1
  12. package/dist/mappers/defectFormatter.js +129 -15
  13. package/dist/mappers/defectFormatter.js.map +1 -1
  14. package/dist/mappers/labFieldComparator.d.ts +62 -0
  15. package/dist/mappers/labFieldComparator.js +134 -0
  16. package/dist/mappers/labFieldComparator.js.map +1 -0
  17. package/dist/mappers/priorityMapper.d.ts +38 -0
  18. package/dist/mappers/priorityMapper.js +126 -0
  19. package/dist/mappers/priorityMapper.js.map +1 -1
  20. package/dist/mappers/psiAggregator.d.ts +130 -0
  21. package/dist/mappers/psiAggregator.js +293 -0
  22. package/dist/mappers/psiAggregator.js.map +1 -0
  23. package/dist/mappers/webVitalsMapper.d.ts +52 -0
  24. package/dist/mappers/webVitalsMapper.js +131 -0
  25. package/dist/mappers/webVitalsMapper.js.map +1 -0
  26. package/dist/tools/accessibility.js +72 -31
  27. package/dist/tools/accessibility.js.map +1 -1
  28. package/dist/tools/lighthouse.d.ts +14 -0
  29. package/dist/tools/lighthouse.js +134 -34
  30. package/dist/tools/lighthouse.js.map +1 -1
  31. package/dist/tools/performanceAudit.d.ts +2 -0
  32. package/dist/tools/performanceAudit.js +446 -0
  33. package/dist/tools/performanceAudit.js.map +1 -0
  34. package/dist/tools/performanceAuditPlan.d.ts +2 -0
  35. package/dist/tools/performanceAuditPlan.js +438 -0
  36. package/dist/tools/performanceAuditPlan.js.map +1 -0
  37. package/dist/tools/qaGate.js +109 -34
  38. package/dist/tools/qaGate.js.map +1 -1
  39. package/dist/utils/csvReader.d.ts +20 -0
  40. package/dist/utils/csvReader.js +172 -0
  41. package/dist/utils/csvReader.js.map +1 -0
  42. package/dist/utils/httpClient.d.ts +84 -0
  43. package/dist/utils/httpClient.js +171 -0
  44. package/dist/utils/httpClient.js.map +1 -0
  45. package/dist/utils/outputParsers.d.ts +25 -0
  46. package/dist/utils/outputParsers.js +42 -0
  47. package/dist/utils/outputParsers.js.map +1 -1
  48. package/dist/utils/psiAuth.d.ts +26 -0
  49. package/dist/utils/psiAuth.js +36 -0
  50. package/dist/utils/psiAuth.js.map +1 -0
  51. package/dist/utils/psiParser.d.ts +124 -0
  52. package/dist/utils/psiParser.js +200 -0
  53. package/dist/utils/psiParser.js.map +1 -0
  54. package/dist/utils/publicUrl.d.ts +17 -0
  55. package/dist/utils/publicUrl.js +115 -0
  56. package/dist/utils/publicUrl.js.map +1 -0
  57. package/dist/utils/sitemapReader.d.ts +27 -0
  58. package/dist/utils/sitemapReader.js +272 -0
  59. package/dist/utils/sitemapReader.js.map +1 -0
  60. package/dist/utils/urlClassifier.d.ts +45 -0
  61. package/dist/utils/urlClassifier.js +267 -0
  62. package/dist/utils/urlClassifier.js.map +1 -0
  63. package/docs/manual.md +558 -0
  64. package/docs/psi-report-spec.md +174 -0
  65. package/package.json +14 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a11yDedupe.js","sourceRoot":"","sources":["../../src/mappers/a11yDedupe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { Finding } from "../types.js";
2
+ /**
3
+ * Lighthouse's own category scores ARE a calibrated 0–100 health signal, with
4
+ * per-audit weighting Google already tuned. Re-deriving one by counting
5
+ * findings throws that away and double-counts besides: total-blocking-time,
6
+ * bootup-time, mainthread-work-breakdown, interactive and max-potential-fid are
7
+ * five findings describing one overloaded main thread, and the old formula
8
+ * charged 75 points for it. So use the category scores directly.
9
+ */
10
+ export declare function lighthouseSubScore(categoryScores: Record<string, number>): number | null;
11
+ export declare function a11ySubScore(findings: Finding[]): number;
12
+ export declare function staticSubScore(findings: Finding[]): number;
13
+ export interface SubScores {
14
+ lighthouse: number | null;
15
+ pa11y: number | null;
16
+ static: number | null;
17
+ }
18
+ /**
19
+ * Weighted mean over the tools that produced a score. Weights are renormalised
20
+ * across whatever ran, so a url-only run and a url+path run are on the same
21
+ * scale. Returns null when nothing scored.
22
+ */
23
+ export declare function compositeScore(sub: SubScores): number | null;
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Composite health score.
3
+ *
4
+ * The previous formula was a single global subtraction — 100 minus 15 per P1,
5
+ * 7 per P2, 3 per P3 — which had two structural faults:
6
+ *
7
+ * 1. No resolution. Seven P1 findings floored it at 0, so a mediocre page and
8
+ * a catastrophic one were indistinguishable. Real pages routinely exceed
9
+ * that within a single tool.
10
+ * 2. Running more tools lowered the score, because every tool fed the same
11
+ * running subtraction. A url-only run was not comparable to a url+path run,
12
+ * which is exactly backwards: broader checking should not look like worse
13
+ * health.
14
+ *
15
+ * Both are fixed by scoring each tool to its own 0–100 sub-score and taking a
16
+ * weighted mean over only the tools that actually ran.
17
+ */
18
+ const SEVERITY_DAMAGE = { P1: 10, P2: 3, P3: 1 };
19
+ /**
20
+ * Saturating decay. Never reaches 0, always preserves ordering, and each
21
+ * additional finding costs less than the one before — which matches how the
22
+ * information actually behaves: the twentieth P1 tells you far less about the
23
+ * page than the first did.
24
+ *
25
+ * K sets where the curve has resolution. At K = 90 a single P1 scores 89, five
26
+ * P1s score 57, and fifteen P1s score 19 — spread across the range real pages
27
+ * occupy instead of collapsing onto the floor.
28
+ */
29
+ function decay(damage, k) {
30
+ return Math.round(100 * Math.exp(-damage / k));
31
+ }
32
+ function damageOf(findings) {
33
+ return findings.reduce((sum, f) => sum + SEVERITY_DAMAGE[f.priority], 0);
34
+ }
35
+ // Tuned so a page's sub-score lands where a human triager would put it. Static
36
+ // analysis decays faster because code defects are fewer and more directly
37
+ // actionable than page-level accessibility violations.
38
+ const A11Y_K = 90;
39
+ const STATIC_K = 60;
40
+ /**
41
+ * Relative weights of the Lighthouse categories inside the Lighthouse
42
+ * sub-score. Lighthouse publishes per-audit weights but no cross-category
43
+ * weighting, so this is our judgement: performance and accessibility carry the
44
+ * most user impact, SEO and best-practices matter but less directly.
45
+ *
46
+ * Categories not listed here — currently the experimental "agentic-browsing" —
47
+ * get UNKNOWN_CATEGORY_WEIGHT so a new or volatile category cannot dominate the
48
+ * score, while still being visible in the breakdown.
49
+ */
50
+ const CATEGORY_WEIGHTS = {
51
+ performance: 0.3,
52
+ accessibility: 0.3,
53
+ "best-practices": 0.2,
54
+ seo: 0.2,
55
+ };
56
+ const UNKNOWN_CATEGORY_WEIGHT = 0.05;
57
+ /**
58
+ * Lighthouse's own category scores ARE a calibrated 0–100 health signal, with
59
+ * per-audit weighting Google already tuned. Re-deriving one by counting
60
+ * findings throws that away and double-counts besides: total-blocking-time,
61
+ * bootup-time, mainthread-work-breakdown, interactive and max-potential-fid are
62
+ * five findings describing one overloaded main thread, and the old formula
63
+ * charged 75 points for it. So use the category scores directly.
64
+ */
65
+ export function lighthouseSubScore(categoryScores) {
66
+ const entries = Object.entries(categoryScores);
67
+ if (entries.length === 0)
68
+ return null;
69
+ let weighted = 0;
70
+ let totalWeight = 0;
71
+ for (const [name, score] of entries) {
72
+ const w = CATEGORY_WEIGHTS[name] ?? UNKNOWN_CATEGORY_WEIGHT;
73
+ weighted += w * score;
74
+ totalWeight += w;
75
+ }
76
+ return totalWeight > 0 ? Math.round(weighted / totalWeight) : null;
77
+ }
78
+ export function a11ySubScore(findings) {
79
+ return decay(damageOf(findings), A11Y_K);
80
+ }
81
+ export function staticSubScore(findings) {
82
+ return decay(damageOf(findings), STATIC_K);
83
+ }
84
+ // How much each tool contributes to the composite. Static analysis is weighted
85
+ // lowest because a clean scan of a small directory returns 100 and would
86
+ // otherwise flatter a run whose real problems are all in the browser.
87
+ const TOOL_WEIGHTS = { lighthouse: 0.4, pa11y: 0.4, static: 0.2 };
88
+ /**
89
+ * Weighted mean over the tools that produced a score. Weights are renormalised
90
+ * across whatever ran, so a url-only run and a url+path run are on the same
91
+ * scale. Returns null when nothing scored.
92
+ */
93
+ export function compositeScore(sub) {
94
+ const parts = [];
95
+ if (sub.lighthouse !== null)
96
+ parts.push([sub.lighthouse, TOOL_WEIGHTS.lighthouse]);
97
+ if (sub.pa11y !== null)
98
+ parts.push([sub.pa11y, TOOL_WEIGHTS.pa11y]);
99
+ if (sub.static !== null)
100
+ parts.push([sub.static, TOOL_WEIGHTS.static]);
101
+ if (parts.length === 0)
102
+ return null;
103
+ const totalWeight = parts.reduce((s, [, w]) => s + w, 0);
104
+ const weighted = parts.reduce((s, [v, w]) => s + v * w, 0);
105
+ return Math.round(weighted / totalWeight);
106
+ }
107
+ //# sourceMappingURL=compositeScore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compositeScore.js","sourceRoot":"","sources":["../../src/mappers/compositeScore.ts"],"names":[],"mappings":"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"}
@@ -9,17 +9,49 @@ function promotePriority(p) {
9
9
  // Maps Lighthouse accessibility audit IDs to substrings that appear inside the
10
10
  // pa11y rule_code for the same class of issue. A leading "." prevents matching
11
11
  // partial segment names (e.g. ".H44" won't accidentally match ".1H44").
12
+ //
13
+ // Keep this keyed on defects the two tools genuinely detect in common. A wrong
14
+ // entry is worse than a missing one: a bogus match promotes a finding a whole
15
+ // priority tier and stamps it "confirmed by two tools". Where Lighthouse and
16
+ // pa11y test adjacent-but-different criteria (e.g. label-content-name-mismatch
17
+ // under WCAG 2.5.3 vs F68 under 1.3.1) they are deliberately left unmapped.
12
18
  const LH_TO_PA11Y_SUBSTRINGS = {
19
+ // Colour / contrast
13
20
  "color-contrast": [".G18", ".G145", ".G174"],
21
+ // Images
14
22
  "image-alt": [".H37", ".H67", ".F65"],
23
+ "input-image-alt": [".H36"],
24
+ "object-alt": [".H53"],
25
+ // Accessible names on controls
15
26
  label: [".H44", ".F68", ".H91.Input", ".H91.Select", ".H91.Textarea"],
27
+ "form-field-multiple-labels": [".H44", ".F68"],
28
+ "button-name": [".H91.Button"],
29
+ "select-name": [".H91.Select"],
30
+ "aria-input-field-name": [".ARIA6", ".ARIA9", ".H91"],
31
+ "aria-toggle-field-name": [".ARIA6", ".ARIA9", ".H91"],
32
+ "aria-command-name": [".ARIA6", ".ARIA9", ".H91"],
33
+ "aria-dialog-name": [".ARIA6", ".ARIA9"],
34
+ // ARIA misuse
35
+ "aria-prohibited-attr": [".ARIA6", ".ARIA4"],
36
+ "aria-valid-attr-value": [".ARIA9"],
37
+ // Links
16
38
  "link-name": [".H30", ".H91.A."],
39
+ "link-text": [".H30", ".H91.A."],
40
+ "crawlable-anchors": [".G1,G123,G124", ".H30"],
41
+ // Document / language
17
42
  "document-title": [".H25", ".F89"],
18
43
  "html-has-lang": [".H57"],
44
+ "html-lang-valid": [".H57"],
45
+ "valid-lang": [".H58"],
46
+ // Structure
47
+ "heading-order": [".G141", ".H42"],
19
48
  "frame-title": [".H64"],
20
- "button-name": [".H91.Button"],
21
- "select-name": [".H91.Select"],
49
+ // Duplicate identifiers. Lighthouse 12 removed duplicate-id-aria altogether,
50
+ // which is why a page throwing 35 pa11y F77 violations correlated with
51
+ // nothing under Lighthouse 13. Both ids are kept so older Lighthouse output
52
+ // still matches; there is currently no LH 13 equivalent to pair F77 with.
22
53
  "duplicate-id-aria": [".H93", ".F77"],
54
+ "duplicate-id-active": [".H93", ".F77"],
23
55
  };
24
56
  // Lighthouse performance audit IDs where Rule 2 (code linkage) is relevant.
25
57
  const PERFORMANCE_AUDIT_IDS = new Set([
@@ -30,14 +62,27 @@ const PERFORMANCE_AUDIT_IDS = new Set([
30
62
  "mainthread-work-breakdown",
31
63
  "total-blocking-time",
32
64
  ]);
65
+ // Deterministic non-crypto string hash (djb2), base36-encoded.
66
+ // Selectors are long and routinely share long prefixes — e.g.
67
+ // "#accordion-panel-:rn: > div > div > input:nth-child(1)" and the same
68
+ // selector ending ":nth-child(3)" are identical for their first 40 characters.
69
+ // The previous id truncated the selector to 16 chars, so those two distinct
70
+ // findings collapsed to one id and consumedA11yIds claimed the wrong entry
71
+ // during correlation. Hashing the whole selector keeps ids short and unique.
72
+ function shortHash(input) {
73
+ let h = 5381;
74
+ for (let i = 0; i < input.length; i++) {
75
+ h = ((h << 5) + h + input.charCodeAt(i)) | 0;
76
+ }
77
+ return (h >>> 0).toString(36);
78
+ }
33
79
  function makeId(tool, f) {
34
80
  const e = f.evidence;
35
81
  if (tool === "lighthouse")
36
82
  return `lh:${String(e["audit_id"] ?? f.title)}`;
37
83
  if (tool === "a11y") {
38
84
  const code = String(e["rule_code"] ?? "").split(".").slice(-2).join(".");
39
- const sel = String(e["selector"] ?? "").slice(0, 16);
40
- return `a11y:${code}:${sel}`;
85
+ return `a11y:${code}:${shortHash(String(e["selector"] ?? ""))}`;
41
86
  }
42
87
  const basename = String(e["file"] ?? "").split("/").pop() ?? "";
43
88
  return `static:${String(e["source"] ?? "")}:${basename}:${String(e["line"] ?? "")}`;
@@ -58,37 +103,53 @@ function applyRule1(lhFindings, a11yFindings) {
58
103
  const substrings = LH_TO_PA11Y_SUBSTRINGS[auditId];
59
104
  if (!substrings)
60
105
  continue;
61
- for (const a11yF of a11yFindings) {
106
+ // Claim every unconsumed pa11y finding covering the same technique, not
107
+ // just the first. One Lighthouse audit routinely corresponds to several
108
+ // pa11y violations — one per offending element — and stopping at the first
109
+ // left the rest to reappear as uncorroborated copies of the same defect.
110
+ const matches = a11yFindings.filter((a11yF) => {
62
111
  if (consumedA11yIds.has(a11yF.id))
63
- continue;
112
+ return false;
64
113
  const ruleCode = String(a11yF.evidence["rule_code"] ?? "");
65
- if (!substrings.some((s) => ruleCode.includes(s)))
66
- continue;
67
- // Use the better (lower index = higher priority) of the two raw priorities
68
- // as the base, then promote it one tier.
69
- const basePriority = PRIORITY_ORDER[lhF.priority] <= PRIORITY_ORDER[a11yF.priority]
70
- ? lhF.priority
71
- : a11yF.priority;
72
- correlated.push({
73
- id: `corr:lh+a11y:${auditId}`,
74
- source_tool: "lighthouse+pa11y",
75
- priority: promotePriority(basePriority),
76
- title: lhF.title,
77
- description: `[Lighthouse] ${lhF.description} ` +
78
- `[pa11y] ${a11yF.description} ` +
79
- `Two independent tools flagged the same accessibility gap — ` +
80
- `this cross-tool confirmation increases confidence that the issue is real and affects real users.`,
81
- evidence: {
82
- ...lhF.evidence,
83
- pa11y_rule_code: ruleCode,
84
- pa11y_selector: a11yF.evidence["selector"] ?? "",
85
- },
86
- confirmed_by: ["lighthouse", "pa11y"],
87
- });
88
- consumedLhIds.add(lhF.id);
89
- consumedA11yIds.add(a11yF.id);
90
- break; // one correlation per Lighthouse finding
91
- }
114
+ return substrings.some((s) => ruleCode.includes(s));
115
+ });
116
+ if (matches.length === 0)
117
+ continue;
118
+ // Use the most severe of the matched pa11y findings, then take the better
119
+ // (lower index = higher priority) of that and the Lighthouse finding as the
120
+ // base, and promote it one tier.
121
+ const worstA11y = matches.reduce((a, b) => PRIORITY_ORDER[a.priority] <= PRIORITY_ORDER[b.priority] ? a : b);
122
+ const basePriority = PRIORITY_ORDER[lhF.priority] <= PRIORITY_ORDER[worstA11y.priority]
123
+ ? lhF.priority
124
+ : worstA11y.priority;
125
+ // Findings arrive here already deduplicated, so fold the collapsed
126
+ // occurrence counts back in to report how many elements are affected.
127
+ const elementCount = matches.reduce((n, m) => n + Number(m.evidence["occurrences"] ?? 1), 0);
128
+ correlated.push({
129
+ id: `corr:lh+a11y:${auditId}`,
130
+ source_tool: "lighthouse+pa11y",
131
+ priority: promotePriority(basePriority),
132
+ title: lhF.title,
133
+ description: `[Lighthouse] ${lhF.description} ` +
134
+ `[pa11y] ${worstA11y.description} ` +
135
+ `Two independent tools flagged the same accessibility gap across ` +
136
+ `${elementCount} element${elementCount !== 1 ? "s" : ""} — ` +
137
+ `this cross-tool confirmation increases confidence that the issue is real and affects real users.`,
138
+ evidence: {
139
+ ...lhF.evidence,
140
+ pa11y_rule_codes: [
141
+ ...new Set(matches.map((m) => String(m.evidence["rule_code"] ?? ""))),
142
+ ],
143
+ pa11y_selectors: matches
144
+ .slice(0, 5)
145
+ .map((m) => String(m.evidence["selector"] ?? "")),
146
+ pa11y_elements_affected: elementCount,
147
+ },
148
+ confirmed_by: ["lighthouse", "pa11y"],
149
+ });
150
+ consumedLhIds.add(lhF.id);
151
+ for (const m of matches)
152
+ consumedA11yIds.add(m.id);
92
153
  }
93
154
  return { correlated, consumedLhIds, consumedA11yIds };
94
155
  }
@@ -1 +1 @@
1
- {"version":3,"file":"correlator.js","sourceRoot":"","sources":["../../src/mappers/correlator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"correlator.js","sourceRoot":"","sources":["../../src/mappers/correlator.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,42 @@
1
- import { lighthouseScoreToPriority, wcagLevelToPriority, staticAnalysisToPriority, } from "./priorityMapper.js";
1
+ import { lighthouseImpactToPriority, a11yTechniqueToPriority, axeImpactToPriority, staticAnalysisToPriority, } from "./priorityMapper.js";
2
+ /**
3
+ * Parenthesised measurement, or nothing at all.
4
+ *
5
+ * displayValue is absent on binary audits and comes and goes across Lighthouse
6
+ * versions, so interpolating it directly left "()" or a doubled space stranded
7
+ * mid-sentence. Every template that appends a measurement goes through this;
8
+ * templates that build a sentence *around* the value guard it explicitly and
9
+ * supply alternative phrasing instead.
10
+ */
11
+ const paren = (v) => (v ? ` (${v})` : "");
2
12
  const QA_DESCRIPTIONS = {
3
- "first-contentful-paint": (a) => `Users see the first piece of content ${a.displayValue} after navigation, which is slower than the recommended threshold for a smooth perceived load.`,
4
- "largest-contentful-paint": (a) => `Users see the main page content ${a.displayValue} after navigation, above the recommended threshold for a responsive feel.`,
5
- "speed-index": (a) => `The page takes ${a.displayValue} to visually populate, which feels sluggish to users on first load.`,
6
- "total-blocking-time": (a) => `The page is unresponsive to user input for ${a.displayValue} during load, causing noticeable input lag.`,
7
- "cumulative-layout-shift": (a) => `The page layout shifts unexpectedly during load (CLS ${a.displayValue}), causing users to misclick or lose their reading place.`,
8
- interactive: (a) => `The page takes ${a.displayValue} before it can reliably respond to user input.`,
9
- "server-response-time": (a) => `The server takes ${a.displayValue} to respond to the initial request, delaying every downstream load step.`,
10
- "render-blocking-resources": (a) => `Render-blocking scripts or styles are delaying the first paint (${a.displayValue}); users stare at a blank page longer than necessary.`,
11
- "unused-javascript": (a) => `The page ships JavaScript that is never executed (${a.displayValue}), inflating load time on slower connections.`,
12
- "unused-css-rules": (a) => `The page ships CSS rules that go unused (${a.displayValue}), wasting bytes on every visit.`,
13
- "uses-responsive-images": (a) => `Images larger than their displayed size are being served (${a.displayValue}), wasting bandwidth on mobile users.`,
14
- "uses-optimized-images": (a) => `Images are not optimally compressed (${a.displayValue}); users on slower networks wait longer than necessary.`,
13
+ "first-contentful-paint": (a) => a.displayValue
14
+ ? `Users see the first piece of content ${a.displayValue} after navigation, which is slower than the recommended threshold for a smooth perceived load.`
15
+ : `Users see the first piece of content later after navigation than the recommended threshold for a smooth perceived load.`,
16
+ "largest-contentful-paint": (a) => a.displayValue
17
+ ? `Users see the main page content ${a.displayValue} after navigation, above the recommended threshold for a responsive feel.`
18
+ : `Users see the main page content later after navigation than the recommended threshold for a responsive feel.`,
19
+ "speed-index": (a) => a.displayValue
20
+ ? `The page takes ${a.displayValue} to visually populate, which feels sluggish to users on first load.`
21
+ : `The page is slow to visually populate, which feels sluggish to users on first load.`,
22
+ "total-blocking-time": (a) => a.displayValue
23
+ ? `The page is unresponsive to user input for ${a.displayValue} during load, causing noticeable input lag.`
24
+ : `The page is unresponsive to user input for a prolonged stretch of the load, causing noticeable input lag.`,
25
+ "cumulative-layout-shift": (a) => `The page layout shifts unexpectedly during load${a.displayValue ? ` (CLS ${a.displayValue})` : ""}, causing users to misclick or lose their reading place.`,
26
+ interactive: (a) => a.displayValue
27
+ ? `The page takes ${a.displayValue} before it can reliably respond to user input.`
28
+ : `The page takes a long time before it can reliably respond to user input.`,
29
+ // Lighthouse 13 changed this displayValue from a bare duration to a clause
30
+ // ("Root document took 780 ms"), which broke the original inlined phrasing.
31
+ "server-response-time": (a) => a.displayValue
32
+ ? `${a.displayValue} to respond to the initial request, delaying every downstream load step.`
33
+ : `The server is slow to respond to the initial request, delaying every downstream load step.`,
34
+ "document-latency-insight": (a) => `The initial HTML document is slow to arrive${paren(a.displayValue)}; nothing else can start loading until it does, so this delay is paid by every other resource on the page.`,
35
+ "render-blocking-resources": (a) => `Render-blocking scripts or styles are delaying the first paint${paren(a.displayValue)}; users stare at a blank page longer than necessary.`,
36
+ "unused-javascript": (a) => `The page ships JavaScript that is never executed${paren(a.displayValue)}, inflating load time on slower connections.`,
37
+ "unused-css-rules": (a) => `The page ships CSS rules that go unused${paren(a.displayValue)}, wasting bytes on every visit.`,
38
+ "uses-responsive-images": (a) => `Images larger than their displayed size are being served${paren(a.displayValue)}, wasting bandwidth on mobile users.`,
39
+ "uses-optimized-images": (a) => `Images are not optimally compressed${paren(a.displayValue)}; users on slower networks wait longer than necessary.`,
15
40
  "color-contrast": () => `Text on the page does not have sufficient contrast against its background, making it hard to read for users with low vision.`,
16
41
  "image-alt": () => `One or more images are missing alt text; screen-reader users cannot understand what the image conveys.`,
17
42
  label: () => `Form fields are missing accessible labels; assistive-tech users cannot tell what each field is for.`,
@@ -21,13 +46,64 @@ const QA_DESCRIPTIONS = {
21
46
  "meta-description": () => `The page is missing a meta description; search results show no preview snippet to users.`,
22
47
  "is-on-https": () => `The page is served over HTTP rather than HTTPS; browsers warn users that the connection is not secure.`,
23
48
  viewport: () => `The page has no viewport meta tag; on mobile, content renders at desktop width and users must pinch-zoom to read.`,
49
+ // --- Responsiveness / main thread ---
50
+ "max-potential-fid": (a) => a.displayValue
51
+ ? `The worst-case delay between a user's first tap or click and the page reacting to it is ${a.displayValue}; users who interact early during load will feel the page freeze.`
52
+ : `There is a long worst-case delay between a user's first tap or click and the page reacting to it; users who interact early during load will feel the page freeze.`,
53
+ "mainthread-work-breakdown": (a) => a.displayValue
54
+ ? `The browser's main thread is busy for ${a.displayValue} during load, so scrolling, taps, and clicks are ignored or delayed while it catches up.`
55
+ : `The browser's main thread is busy for much of the load, so scrolling, taps, and clicks are ignored or delayed while it catches up.`,
56
+ "bootup-time": (a) => a.displayValue
57
+ ? `JavaScript occupies the main thread for ${a.displayValue}; on mid-range phones this is where most of the perceived slowness comes from.`
58
+ : `JavaScript occupies the main thread for a prolonged stretch of the load; on mid-range phones this is where most of the perceived slowness comes from.`,
59
+ "forced-reflow-insight": (a) => `Scripts read layout values immediately after changing the DOM, forcing the browser to recalculate layout mid-frame${paren(a.displayValue)}; this shows up as stutter during scroll and interaction.`,
60
+ // --- Console / runtime health ---
61
+ "errors-in-console": () => `The page logs JavaScript errors to the browser console during load. Each one is a code path that failed at runtime, and features downstream of it may be silently broken for real users.`,
62
+ deprecations: (a) => `The page relies on browser APIs that are deprecated${paren(a.displayValue)}; these will stop working in a future browser release and break the feature that depends on them.`,
63
+ "inspector-issues": () => `Chrome DevTools recorded issues against this page — typically blocked requests, cookie problems, or content-security violations. Each represents browser-enforced behaviour that may differ from what was tested locally.`,
64
+ "third-party-cookies": (a) => `The page sets third-party cookies${paren(a.displayValue)}. Browsers are phasing these out, so any feature depending on them — analytics, personalisation, embedded checkout — will degrade as that rollout completes.`,
65
+ // --- Caching / payload ---
66
+ "bf-cache": (a) => `The page blocks back/forward cache restoration${paren(a.displayValue)}, so pressing Back triggers a full reload instead of an instant restore — a visible regression on the most common navigation in a browsing session.`,
67
+ "cache-insight": (a) => `Static assets are served with short or missing cache lifetimes${paren(a.displayValue)}; returning visitors re-download content that has not changed.`,
68
+ // displayValue here is already a full clause ("Total size was 4,814 KiB"),
69
+ // unlike the bare metrics most audits report, so it leads the sentence
70
+ // instead of being inlined mid-clause.
71
+ "total-byte-weight": (a) => a.displayValue
72
+ ? `${a.displayValue} — a payload that size is slow and expensive to load for users on mobile data or metered connections.`
73
+ : `The page transfers more data than it needs to render, which is slow and expensive for users on mobile data or metered connections.`,
74
+ "unminified-javascript": (a) => `JavaScript is shipped unminified${paren(a.displayValue)}, sending comments and whitespace to every visitor.`,
75
+ "legacy-javascript-insight": (a) => `The bundle ships transpiled polyfills that modern browsers do not need${paren(a.displayValue)}, penalising up-to-date users to support ones that may no longer be in the support matrix.`,
76
+ "image-delivery-insight": (a) => `Images are not delivered in an optimal format or size${paren(a.displayValue)}; users on slower networks wait longer than necessary for the same visual result.`,
77
+ "unsized-images": () => `Images are missing explicit width and height attributes, so the browser cannot reserve space before they load and surrounding content jumps as each one arrives.`,
78
+ // --- Network / critical path ---
79
+ "render-blocking-insight": (a) => `Scripts or stylesheets block the first paint${paren(a.displayValue)}; users stare at a blank page until they finish downloading.`,
80
+ "lcp-discovery-insight": () => `The browser cannot discover the largest content element early — it is loaded lazily, injected by script, or not preloaded — so the main content paints later than the network allows.`,
81
+ "network-dependency-tree-insight": () => `Critical resources load in a long dependent chain rather than in parallel, so total load time is the sum of the chain instead of its slowest link.`,
82
+ // --- Accessibility (Lighthouse-side) ---
83
+ "aria-prohibited-attr": () => `An element carries an ARIA attribute that its role does not permit; assistive tech either ignores the attribute or announces the element incorrectly.`,
84
+ // Shared with the axe runner, whose rule ids match Lighthouse audit ids.
85
+ "aria-allowed-attr": () => `An element uses an ARIA attribute its role does not support; the attribute is ignored, so the state it was meant to convey — pressed, expanded, selected — never reaches screen-reader users.`,
86
+ "aria-required-children": () => `An ARIA role that requires specific child roles is missing them; assistive tech cannot interpret the widget and may skip or misannounce its contents.`,
87
+ "aria-required-parent": () => `An element with a child ARIA role sits outside the parent role it requires; screen readers lose the relationship and announce the item without its surrounding context.`,
88
+ "aria-valid-attr-value": () => `An ARIA attribute holds an invalid value, often an id reference pointing at an element that does not exist; the name or relationship it was meant to establish silently fails.`,
89
+ "duplicate-id-aria": () => `An id used by an ARIA reference appears more than once; the reference resolves to the wrong element, so labels and relationships attach to the wrong control.`,
90
+ "aria-dialog-name": () => `A dialog or alertdialog has no accessible name; screen-reader users are moved into a modal with no indication of what it is asking them to do.`,
91
+ "heading-order": () => `Heading levels skip a step (for example h2 straight to h4); screen-reader users navigating by heading get a broken outline and may believe content is missing.`,
92
+ "label-content-name-mismatch": () => `An element's visible text is not contained in its accessible name, so speech-control users saying the label they can see fail to activate the control.`,
93
+ "meta-viewport": () => `The viewport tag disables zooming (user-scalable="no" or maximum-scale under 5); low-vision users cannot pinch-zoom to read the page.`,
94
+ // --- SEO / crawlability ---
95
+ "link-text": (a) => `One or more links use non-descriptive text such as "click here"${paren(a.displayValue)}; screen-reader users listing links out of context cannot tell where they lead, and search engines gain no signal from the anchor.`,
96
+ "crawlable-anchors": () => `Links are not crawlable — they lack a resolvable href, so search engines cannot follow them and the destination pages may go unindexed.`,
97
+ "robots-txt": () => `robots.txt is invalid. Crawlers may misread the directives and either index pages meant to stay private or skip pages meant to rank.`,
98
+ "llms-txt": () => `llms.txt is missing or does not follow the recommended format, so AI agents fetching the site get no curated guide to its content.`,
99
+ "agent-accessibility-tree": () => `The accessibility tree is malformed, which degrades both screen readers and automated agents that navigate the page through it.`,
24
100
  };
25
101
  function fallbackDescription(audit) {
26
102
  const detail = audit.displayValue ? ` (current: ${audit.displayValue})` : "";
27
103
  return `The "${audit.title}" check did not meet the recommended quality threshold${detail}.`;
28
104
  }
29
105
  export function formatLighthouseFinding(audit) {
30
- const priority = lighthouseScoreToPriority(audit.score);
106
+ const priority = lighthouseImpactToPriority(audit.score, audit.weight);
31
107
  if (!priority)
32
108
  return null;
33
109
  const describe = QA_DESCRIPTIONS[audit.id];
@@ -39,6 +115,10 @@ export function formatLighthouseFinding(audit) {
39
115
  evidence: {
40
116
  audit_id: audit.id,
41
117
  value: audit.displayValue ?? "",
118
+ // Why this landed where it did — weight is Lighthouse's own importance
119
+ // signal, and weight 0 marks a diagnostic that blocks nothing.
120
+ ...(audit.weight !== undefined ? { category_weight: audit.weight } : {}),
121
+ ...(audit.category ? { category: audit.category } : {}),
42
122
  },
43
123
  };
44
124
  }
@@ -186,10 +266,44 @@ export function formatStaticAnalysisFinding(issue) {
186
266
  },
187
267
  };
188
268
  }
269
+ /**
270
+ * axe rule ids are the same identifiers Lighthouse uses for its accessibility
271
+ * audits — Lighthouse runs axe internally — so an axe finding can borrow the
272
+ * QA prose already written for the matching Lighthouse audit instead of
273
+ * duplicating it. Falls back to axe's own help text, stripped of the trailing
274
+ * documentation URL that would otherwise land in a defect ticket.
275
+ */
276
+ function axeDescription(violation) {
277
+ const shared = QA_DESCRIPTIONS[violation.code];
278
+ if (shared) {
279
+ return shared({ id: violation.code, displayValue: "" });
280
+ }
281
+ const cleaned = violation.message.replace(/\s*\(https?:\/\/[^)]*\)\s*$/, "").trim();
282
+ return cleaned
283
+ ? `${cleaned}. Flagged by axe as ${violation.impact ?? "unrated"} impact; assistive-tech users are likely affected.`
284
+ : `axe rule "${violation.code}" failed; assistive-tech users are likely affected.`;
285
+ }
189
286
  export function formatA11yFinding(violation) {
190
287
  if (violation.type === "notice")
191
288
  return null;
192
- const priority = wcagLevelToPriority(violation.wcagLevel);
289
+ if (violation.runner === "axe") {
290
+ const priority = axeImpactToPriority(violation.impact, violation.needsReview);
291
+ if (!priority)
292
+ return null;
293
+ return {
294
+ priority,
295
+ title: violation.message.replace(/\s*\(https?:\/\/[^)]*\)\s*$/, "").trim() || violation.code,
296
+ description: axeDescription(violation),
297
+ evidence: {
298
+ rule_code: violation.code,
299
+ selector: violation.selector,
300
+ runner: "axe",
301
+ ...(violation.impact ? { axe_impact: violation.impact } : {}),
302
+ ...(violation.needsReview ? { needs_manual_review: true } : {}),
303
+ },
304
+ };
305
+ }
306
+ const priority = a11yTechniqueToPriority(violation.technique, violation.wcagLevel);
193
307
  if (!priority)
194
308
  return null;
195
309
  const describe = lookupA11yTemplate(violation.technique);
@@ -1 +1 @@
1
- {"version":3,"file":"defectFormatter.js","sourceRoot":"","sources":["../../src/mappers/defectFormatter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"defectFormatter.js","sourceRoot":"","sources":["../../src/mappers/defectFormatter.ts"],"names":[],"mappings":"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"}