cbrowser 18.82.2 → 19.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.
- package/README.md +42 -3
- package/dist/analysis/accessibility-empathy.d.ts +43 -0
- package/dist/analysis/accessibility-empathy.d.ts.map +1 -1
- package/dist/analysis/accessibility-empathy.js +65 -0
- package/dist/analysis/accessibility-empathy.js.map +1 -1
- package/dist/analysis/agent-ready-audit.d.ts +44 -1
- package/dist/analysis/agent-ready-audit.d.ts.map +1 -1
- package/dist/analysis/agent-ready-audit.js +100 -40
- package/dist/analysis/agent-ready-audit.js.map +1 -1
- package/dist/analysis/bug-hunter.d.ts +11 -1
- package/dist/analysis/bug-hunter.d.ts.map +1 -1
- package/dist/analysis/bug-hunter.js +44 -6
- package/dist/analysis/bug-hunter.js.map +1 -1
- package/dist/analysis/competitive-benchmark.d.ts +49 -1
- package/dist/analysis/competitive-benchmark.d.ts.map +1 -1
- package/dist/analysis/competitive-benchmark.js +138 -14
- package/dist/analysis/competitive-benchmark.js.map +1 -1
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +5 -2
- package/dist/browser.js.map +1 -1
- package/dist/cli.js +5 -5
- package/dist/cli.js.map +1 -1
- package/dist/mcp-tools/base/analysis-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/analysis-tools.js +7 -1
- package/dist/mcp-tools/base/analysis-tools.js.map +1 -1
- package/dist/mcp-tools/base/audit-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/audit-tools.js +10 -0
- package/dist/mcp-tools/base/audit-tools.js.map +1 -1
- package/dist/mcp-tools/base/visual-testing-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/visual-testing-tools.js +29 -1
- package/dist/mcp-tools/base/visual-testing-tools.js.map +1 -1
- package/dist/remediation/patch-generator.js +2 -2
- package/dist/remediation/patch-generator.js.map +1 -1
- package/dist/types.d.ts +80 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/visual/attention-quality.d.ts +32 -0
- package/dist/visual/attention-quality.d.ts.map +1 -1
- package/dist/visual/attention-quality.js +41 -1
- package/dist/visual/attention-quality.js.map +1 -1
- package/dist/visual/freeze-animations.d.ts +71 -0
- package/dist/visual/freeze-animations.d.ts.map +1 -0
- package/dist/visual/freeze-animations.js +111 -0
- package/dist/visual/freeze-animations.js.map +1 -0
- package/dist/visual/llm-relevance.d.ts +6 -0
- package/dist/visual/llm-relevance.d.ts.map +1 -1
- package/dist/visual/llm-relevance.js +42 -1
- package/dist/visual/llm-relevance.js.map +1 -1
- package/dist/visual/persona-context.d.ts +18 -0
- package/dist/visual/persona-context.d.ts.map +1 -1
- package/dist/visual/persona-context.js +6 -0
- package/dist/visual/persona-context.js.map +1 -1
- package/package.json +1 -1
|
@@ -29,7 +29,10 @@ export async function huntBugs(browser, url, options = {}) {
|
|
|
29
29
|
// Check for broken images
|
|
30
30
|
document.querySelectorAll("img").forEach((img, i) => {
|
|
31
31
|
if (!img.complete || img.naturalWidth === 0) {
|
|
32
|
-
|
|
32
|
+
// getAttribute returns null when ABSENT and "" when alt="" is present,
|
|
33
|
+
// and both are falsy — so `!!` conflates a WCAG failure with a valid
|
|
34
|
+
// declaration that the image is decorative. Compare against null.
|
|
35
|
+
const hasAlt = img.getAttribute("alt") !== null;
|
|
33
36
|
issues.push({
|
|
34
37
|
type: "missing-image",
|
|
35
38
|
description: `Broken image: ${img.src || img.alt || "unknown"}`,
|
|
@@ -39,15 +42,36 @@ export async function huntBugs(browser, url, options = {}) {
|
|
|
39
42
|
: "Fix the image source URL and add an alt attribute for accessibility",
|
|
40
43
|
});
|
|
41
44
|
}
|
|
42
|
-
//
|
|
43
|
-
|
|
45
|
+
// alt ABSENT and alt="" are different defects, and `!img.getAttribute("alt")`
|
|
46
|
+
// treated them as one: null and "" are both falsy.
|
|
47
|
+
//
|
|
48
|
+
// A missing alt is an unambiguous WCAG 1.1.1 failure. An empty alt is a
|
|
49
|
+
// VALID declaration that the image is decorative — possibly wrong, but
|
|
50
|
+
// already a decision someone made. Grading the second as high severity and
|
|
51
|
+
// prescribing "add alt attribute" prescribes a fix that is already applied,
|
|
52
|
+
// and contradicted empathy_audit, which grades the same six images as minor
|
|
53
|
+
// and asks the reader to VERIFY the decorative intent. (2026-08-06)
|
|
54
|
+
const altAttr = img.getAttribute("alt");
|
|
55
|
+
const rendered = img.complete && img.naturalWidth > 0;
|
|
56
|
+
// Matches empathy_audit's threshold so the two tools agree on which images
|
|
57
|
+
// are too small to be worth asking about.
|
|
58
|
+
const isTiny = img.width < 20 || img.height < 20;
|
|
59
|
+
if (altAttr === null && rendered) {
|
|
44
60
|
issues.push({
|
|
45
61
|
type: "a11y-violation",
|
|
46
|
-
description: `Image
|
|
62
|
+
description: `Image has no alt attribute: ${img.src?.slice(-50) || "unknown"}`,
|
|
47
63
|
selector: `img:nth-of-type(${i + 1})`,
|
|
48
64
|
recommendation: "Add alt=\"descriptive text\" for screen readers, or alt=\"\" if decorative",
|
|
49
65
|
});
|
|
50
66
|
}
|
|
67
|
+
else if (altAttr === "" && rendered && !isTiny) {
|
|
68
|
+
issues.push({
|
|
69
|
+
type: "a11y-verify",
|
|
70
|
+
description: `Image (${Math.round(img.width)}x${Math.round(img.height)}px) declares alt="" (decorative): ${img.src?.slice(-50) || "unknown"}`,
|
|
71
|
+
selector: `img:nth-of-type(${i + 1})`,
|
|
72
|
+
recommendation: "Verify this image is purely decorative. If it conveys meaning, replace alt=\"\" with descriptive text",
|
|
73
|
+
});
|
|
74
|
+
}
|
|
51
75
|
});
|
|
52
76
|
// Check for empty links
|
|
53
77
|
document.querySelectorAll("a").forEach((a, i) => {
|
|
@@ -277,6 +301,12 @@ export async function huntBugs(browser, url, options = {}) {
|
|
|
277
301
|
else if (issue.type === "a11y-violation") {
|
|
278
302
|
severity = "high";
|
|
279
303
|
}
|
|
304
|
+
else if (issue.type === "a11y-verify") {
|
|
305
|
+
// A prompt to confirm an existing decision, not a violation. Grading it
|
|
306
|
+
// high is what made hunt_bugs contradict empathy_audit on the same six
|
|
307
|
+
// images — one calling it critical, the other minor.
|
|
308
|
+
severity = "low";
|
|
309
|
+
}
|
|
280
310
|
bugs.push({
|
|
281
311
|
type: issue.type,
|
|
282
312
|
severity,
|
|
@@ -341,8 +371,16 @@ export async function huntBugs(browser, url, options = {}) {
|
|
|
341
371
|
if (!img.complete || img.naturalWidth === 0) {
|
|
342
372
|
issues.push({ type: "missing-image", description: `Broken image: ${img.src || "unknown"}`, selector: `img:nth-of-type(${i + 1})` });
|
|
343
373
|
}
|
|
344
|
-
|
|
345
|
-
|
|
374
|
+
// Same null-vs-empty distinction as the first-page check above. This
|
|
375
|
+
// condensed copy is why the class needed sweeping rather than the one
|
|
376
|
+
// reported line fixing.
|
|
377
|
+
const altAttr = img.getAttribute("alt");
|
|
378
|
+
const rendered = img.complete && img.naturalWidth > 0;
|
|
379
|
+
if (altAttr === null && rendered) {
|
|
380
|
+
issues.push({ type: "a11y-violation", description: "Image has no alt attribute", selector: `img:nth-of-type(${i + 1})`, recommendation: "Add alt=\"descriptive text\", or alt=\"\" if decorative" });
|
|
381
|
+
}
|
|
382
|
+
else if (altAttr === "" && rendered && img.width >= 20 && img.height >= 20) {
|
|
383
|
+
issues.push({ type: "a11y-verify", description: `Image (${Math.round(img.width)}x${Math.round(img.height)}px) declares alt="" (decorative)`, selector: `img:nth-of-type(${i + 1})`, recommendation: "Verify this image is purely decorative" });
|
|
346
384
|
}
|
|
347
385
|
});
|
|
348
386
|
document.querySelectorAll("a").forEach((a, i) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bug-hunter.js","sourceRoot":"","sources":["../../src/analysis/bug-hunter.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bug-hunter.js","sourceRoot":"","sources":["../../src/analysis/bug-hunter.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import type { CompetitiveBenchmarkResult, CompetitiveBenchmarkOptions } from "..
|
|
|
7
7
|
export declare function formatCompetitiveBenchmarkReport(result: CompetitiveBenchmarkResult): string;
|
|
8
8
|
export declare function generateCompetitiveBenchmarkHtmlReport(result: CompetitiveBenchmarkResult): string;
|
|
9
9
|
export declare function runCompetitiveBenchmark(options: CompetitiveBenchmarkOptions): Promise<CompetitiveBenchmarkResult>;
|
|
10
|
-
import type { AIBenchmarkResult, AIBenchmarkOptions } from "../types.js";
|
|
10
|
+
import type { AIBenchmarkResult, AIBenchmarkSiteResult, AIBenchmarkOptions } from "../types.js";
|
|
11
11
|
/**
|
|
12
12
|
* Run AI readiness benchmark across multiple competitor sites.
|
|
13
13
|
*
|
|
@@ -21,4 +21,52 @@ import type { AIBenchmarkResult, AIBenchmarkOptions } from "../types.js";
|
|
|
21
21
|
* @since 17.0.0
|
|
22
22
|
*/
|
|
23
23
|
export declare function runAIReadinessBenchmark(options: AIBenchmarkOptions): Promise<AIBenchmarkResult>;
|
|
24
|
+
/**
|
|
25
|
+
* Qualify a strength that the site's own top issues contradict.
|
|
26
|
+
*
|
|
27
|
+
* `/pricing` shipped `strengths: ["Stable selectors that won't break"]` beside
|
|
28
|
+
* `topIssues: ["Element lacks stable selectors (score: 0/10)"]`. Both are
|
|
29
|
+
* arithmetically correct -- the first is an AXIS score at 92, the second is an
|
|
30
|
+
* ELEMENT scoring 0 -- and they are not publishable together unreconciled.
|
|
31
|
+
*
|
|
32
|
+
* Qualified rather than suppressed. Stability 92 is real and useful; deleting
|
|
33
|
+
* the strength would lose it to hide an inconsistency that is actually
|
|
34
|
+
* information. The exception count is what a reader needs, and it is what the
|
|
35
|
+
* old output withheld.
|
|
36
|
+
*/
|
|
37
|
+
export declare function reconcileStrengths(strengths: string[], issueCategories: string[], breakdown: {
|
|
38
|
+
findability: number;
|
|
39
|
+
stability: number;
|
|
40
|
+
agentPerceivability: number;
|
|
41
|
+
semantics: number;
|
|
42
|
+
}): string[];
|
|
43
|
+
/**
|
|
44
|
+
* Drop a plain strength when the superlative for the same axis is already
|
|
45
|
+
* present. "Most stable selectors" and "Stable selectors that won't break" are
|
|
46
|
+
* one claim written twice, and the list shipped both.
|
|
47
|
+
*/
|
|
48
|
+
export declare function dedupeAdvantagesByAxis(advantages: string[]): string[];
|
|
49
|
+
/**
|
|
50
|
+
* A site worth holding up as an example for THIS issue, or nothing.
|
|
51
|
+
*
|
|
52
|
+
* Three conditions, and the tool previously enforced none of them:
|
|
53
|
+
*
|
|
54
|
+
* 1. It must not share the issue. Checked against the full issue surface above,
|
|
55
|
+
* not just `weaknesses`.
|
|
56
|
+
* 2. It must actually score BETTER than the site being advised. The old code
|
|
57
|
+
* took the first array match, so cbrowser.ai/pricing (83) was told that
|
|
58
|
+
* cbrowser.ai/docs/home (80) "handles this better" -- advice to copy a page
|
|
59
|
+
* that is worse.
|
|
60
|
+
* 3. Among those that qualify, the best one, not the first one encountered.
|
|
61
|
+
*
|
|
62
|
+
* Returns undefined rather than degrading to a rank-based guess. ai_benchmark is
|
|
63
|
+
* a competitive-intelligence tool whose output is aimed at customers comparing
|
|
64
|
+
* themselves to rivals; telling one to copy a competitor with the same flaw is
|
|
65
|
+
* the failure most likely to be screenshotted. No reference is strictly better
|
|
66
|
+
* than a wrong one.
|
|
67
|
+
*/
|
|
68
|
+
export declare function pickBetterReference(candidates: AIBenchmarkSiteResult[], subject: {
|
|
69
|
+
siteName: string;
|
|
70
|
+
score: number | null;
|
|
71
|
+
}, issue: string): AIBenchmarkSiteResult | undefined;
|
|
24
72
|
//# sourceMappingURL=competitive-benchmark.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"competitive-benchmark.d.ts","sourceRoot":"","sources":["../../src/analysis/competitive-benchmark.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,OAAO,KAAK,EACV,0BAA0B,EAC1B,2BAA2B,EAO5B,MAAM,aAAa,CAAC;AA03BrB,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,0BAA0B,GAAG,MAAM,CAoH3F;AAED,wBAAgB,sCAAsC,CAAC,MAAM,EAAE,0BAA0B,GAAG,MAAM,CA0OjG;AAMD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,0BAA0B,CAAC,CAiHrC;AAMD,OAAO,KAAK,EACV,iBAAiB,
|
|
1
|
+
{"version":3,"file":"competitive-benchmark.d.ts","sourceRoot":"","sources":["../../src/analysis/competitive-benchmark.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,OAAO,KAAK,EACV,0BAA0B,EAC1B,2BAA2B,EAO5B,MAAM,aAAa,CAAC;AA03BrB,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,0BAA0B,GAAG,MAAM,CAoH3F;AAED,wBAAgB,sCAAsC,CAAC,MAAM,EAAE,0BAA0B,GAAG,MAAM,CA0OjG;AAMD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,0BAA0B,CAAC,CAiHrC;AAMD,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EAGrB,kBAAkB,EAInB,MAAM,aAAa,CAAC;AAoIrB;;;;;;;;;;;GAWG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAkJ5B;AAoGD;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EAAE,EACnB,eAAe,EAAE,MAAM,EAAE,EACzB,SAAS,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACpG,MAAM,EAAE,CAYV;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAarE;AAiBD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,qBAAqB,EAAE,EACnC,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACnD,KAAK,EAAE,MAAM,GACZ,qBAAqB,GAAG,SAAS,CAOnC"}
|
|
@@ -1324,7 +1324,7 @@ export async function runAIReadinessBenchmark(options) {
|
|
|
1324
1324
|
if (audit.score.stability >= 80) {
|
|
1325
1325
|
strengths.push("Stable selectors that won't break");
|
|
1326
1326
|
}
|
|
1327
|
-
if (audit.score.
|
|
1327
|
+
if (audit.score.agentPerceivability >= 80) {
|
|
1328
1328
|
strengths.push("Good ARIA labels for identification");
|
|
1329
1329
|
}
|
|
1330
1330
|
if (audit.score.semantics >= 80) {
|
|
@@ -1338,14 +1338,19 @@ export async function runAIReadinessBenchmark(options) {
|
|
|
1338
1338
|
if (audit.score.stability < 60) {
|
|
1339
1339
|
weaknesses.push("Dynamic selectors break automation");
|
|
1340
1340
|
}
|
|
1341
|
-
if (audit.score.
|
|
1341
|
+
if (audit.score.agentPerceivability < 60) {
|
|
1342
1342
|
weaknesses.push("Missing labels for element identification");
|
|
1343
1343
|
}
|
|
1344
1344
|
if (audit.score.semantics < 60) {
|
|
1345
1345
|
weaknesses.push("Poor semantic structure");
|
|
1346
1346
|
}
|
|
1347
1347
|
// Add issue-based weaknesses
|
|
1348
|
-
const
|
|
1348
|
+
const topThree = audit.issues.slice(0, 3);
|
|
1349
|
+
const issueDescriptions = topThree.map((issue) => issue.description);
|
|
1350
|
+
// Carried alongside the descriptions because reconciliation needs the
|
|
1351
|
+
// CATEGORY, and mapping to description strings threw it away — which is
|
|
1352
|
+
// why a strength and its contradiction could not be matched up.
|
|
1353
|
+
const issueCategories = topThree.map((issue) => String(issue.category));
|
|
1349
1354
|
return {
|
|
1350
1355
|
url,
|
|
1351
1356
|
siteName,
|
|
@@ -1353,7 +1358,10 @@ export async function runAIReadinessBenchmark(options) {
|
|
|
1353
1358
|
score: audit.score.overall,
|
|
1354
1359
|
scoreBreakdown: audit.score,
|
|
1355
1360
|
topIssues: issueDescriptions,
|
|
1356
|
-
|
|
1361
|
+
topIssueCategories: issueCategories,
|
|
1362
|
+
strengths: strengths.length > 0
|
|
1363
|
+
? reconcileStrengths(strengths, issueCategories, audit.score)
|
|
1364
|
+
: ["No major strengths detected"],
|
|
1357
1365
|
weaknesses: weaknesses.length > 0 ? weaknesses : issueDescriptions,
|
|
1358
1366
|
duration: audit.duration,
|
|
1359
1367
|
auditStatus: "complete",
|
|
@@ -1403,7 +1411,7 @@ function generateAIComparison(results) {
|
|
|
1403
1411
|
const byScore = [...successfulResults].sort((a, b) => b.score - a.score);
|
|
1404
1412
|
const byFindability = [...successfulResults].sort((a, b) => b.scoreBreakdown.findability - a.scoreBreakdown.findability);
|
|
1405
1413
|
const byStability = [...successfulResults].sort((a, b) => b.scoreBreakdown.stability - a.scoreBreakdown.stability);
|
|
1406
|
-
const
|
|
1414
|
+
const byAgentPerceivability = [...successfulResults].sort((a, b) => b.scoreBreakdown.agentPerceivability - a.scoreBreakdown.agentPerceivability);
|
|
1407
1415
|
const bySemantics = [...successfulResults].sort((a, b) => b.scoreBreakdown.semantics - a.scoreBreakdown.semantics);
|
|
1408
1416
|
// Find common issues
|
|
1409
1417
|
const issueCounts = new Map();
|
|
@@ -1429,7 +1437,7 @@ function generateAIComparison(results) {
|
|
|
1429
1437
|
if (result.siteName === byStability[0]?.siteName && result.siteName !== byScore[0]?.siteName) {
|
|
1430
1438
|
advantages.push("Most stable selectors");
|
|
1431
1439
|
}
|
|
1432
|
-
if (result.siteName ===
|
|
1440
|
+
if (result.siteName === byAgentPerceivability[0]?.siteName && result.siteName !== byScore[0]?.siteName) {
|
|
1433
1441
|
advantages.push("Best ARIA/accessibility labels");
|
|
1434
1442
|
}
|
|
1435
1443
|
if (result.siteName === bySemantics[0]?.siteName && result.siteName !== byScore[0]?.siteName) {
|
|
@@ -1437,18 +1445,129 @@ function generateAIComparison(results) {
|
|
|
1437
1445
|
}
|
|
1438
1446
|
// Add strength-based advantages
|
|
1439
1447
|
advantages.push(...result.strengths.filter(s => s !== "No major strengths detected"));
|
|
1440
|
-
siteAdvantages[result.siteName] = advantages;
|
|
1448
|
+
siteAdvantages[result.siteName] = dedupeAdvantagesByAxis(advantages);
|
|
1441
1449
|
}
|
|
1442
1450
|
return {
|
|
1443
1451
|
bestOverall: byScore[0]?.siteName || "N/A",
|
|
1444
1452
|
bestFindability: byFindability[0]?.siteName || "N/A",
|
|
1445
1453
|
bestStability: byStability[0]?.siteName || "N/A",
|
|
1446
|
-
|
|
1454
|
+
bestAgentPerceivability: byAgentPerceivability[0]?.siteName || "N/A",
|
|
1447
1455
|
bestSemantics: bySemantics[0]?.siteName || "N/A",
|
|
1448
1456
|
commonIssues,
|
|
1449
1457
|
siteAdvantages,
|
|
1450
1458
|
};
|
|
1451
1459
|
}
|
|
1460
|
+
/**
|
|
1461
|
+
* Which scoring axis a strength phrase is a claim about.
|
|
1462
|
+
*
|
|
1463
|
+
* The phrases are generated from axis thresholds a few lines below, so this map
|
|
1464
|
+
* is their inverse. Kept beside them deliberately: a new strength added without
|
|
1465
|
+
* an entry here is silently exempt from reconciliation, which is how a claim and
|
|
1466
|
+
* its contradiction came to ship side by side.
|
|
1467
|
+
*/
|
|
1468
|
+
const STRENGTH_AXIS = {
|
|
1469
|
+
"Easy for agents to locate elements": "findability",
|
|
1470
|
+
"Stable selectors that won't break": "stability",
|
|
1471
|
+
"Good ARIA labels for identification": "agentPerceivability",
|
|
1472
|
+
"Clear semantic HTML structure": "semantics",
|
|
1473
|
+
};
|
|
1474
|
+
/** Superlatives and plain strengths make the same claim at different scopes. */
|
|
1475
|
+
const ADVANTAGE_AXIS = {
|
|
1476
|
+
"Best element findability": "findability",
|
|
1477
|
+
"Most stable selectors": "stability",
|
|
1478
|
+
"Best ARIA/accessibility labels": "agentPerceivability",
|
|
1479
|
+
"Best semantic structure": "semantics",
|
|
1480
|
+
};
|
|
1481
|
+
/**
|
|
1482
|
+
* Qualify a strength that the site's own top issues contradict.
|
|
1483
|
+
*
|
|
1484
|
+
* `/pricing` shipped `strengths: ["Stable selectors that won't break"]` beside
|
|
1485
|
+
* `topIssues: ["Element lacks stable selectors (score: 0/10)"]`. Both are
|
|
1486
|
+
* arithmetically correct -- the first is an AXIS score at 92, the second is an
|
|
1487
|
+
* ELEMENT scoring 0 -- and they are not publishable together unreconciled.
|
|
1488
|
+
*
|
|
1489
|
+
* Qualified rather than suppressed. Stability 92 is real and useful; deleting
|
|
1490
|
+
* the strength would lose it to hide an inconsistency that is actually
|
|
1491
|
+
* information. The exception count is what a reader needs, and it is what the
|
|
1492
|
+
* old output withheld.
|
|
1493
|
+
*/
|
|
1494
|
+
export function reconcileStrengths(strengths, issueCategories, breakdown) {
|
|
1495
|
+
return strengths.map((strength) => {
|
|
1496
|
+
const axis = STRENGTH_AXIS[strength];
|
|
1497
|
+
if (!axis)
|
|
1498
|
+
return strength;
|
|
1499
|
+
// The deprecated "accessibility" category is out of the type but can still
|
|
1500
|
+
// arrive at runtime from an older caller across a JSON boundary.
|
|
1501
|
+
const exceptions = issueCategories.filter((c) => c === axis
|
|
1502
|
+
|| (axis === "agentPerceivability" && c === "accessibility")).length;
|
|
1503
|
+
if (exceptions === 0)
|
|
1504
|
+
return strength;
|
|
1505
|
+
const score = breakdown[axis];
|
|
1506
|
+
return `${strength} overall (${axis} ${score}), with ${exceptions} element(s) excepted`;
|
|
1507
|
+
});
|
|
1508
|
+
}
|
|
1509
|
+
/**
|
|
1510
|
+
* Drop a plain strength when the superlative for the same axis is already
|
|
1511
|
+
* present. "Most stable selectors" and "Stable selectors that won't break" are
|
|
1512
|
+
* one claim written twice, and the list shipped both.
|
|
1513
|
+
*/
|
|
1514
|
+
export function dedupeAdvantagesByAxis(advantages) {
|
|
1515
|
+
const superlativeAxes = new Set(advantages.map((a) => ADVANTAGE_AXIS[a]).filter(Boolean));
|
|
1516
|
+
const seen = new Set();
|
|
1517
|
+
return advantages.filter((a) => {
|
|
1518
|
+
if (seen.has(a))
|
|
1519
|
+
return false;
|
|
1520
|
+
seen.add(a);
|
|
1521
|
+
// A qualified strength keeps its exception count, so match on the stem.
|
|
1522
|
+
const stem = a.split(" overall (")[0];
|
|
1523
|
+
const axis = STRENGTH_AXIS[stem];
|
|
1524
|
+
if (axis && superlativeAxes.has(axis))
|
|
1525
|
+
return false;
|
|
1526
|
+
return true;
|
|
1527
|
+
});
|
|
1528
|
+
}
|
|
1529
|
+
/**
|
|
1530
|
+
* Everything a site is known to be bad at.
|
|
1531
|
+
*
|
|
1532
|
+
* `weaknesses` alone is not that set. It is `weaknesses.length > 0 ? weaknesses
|
|
1533
|
+
* : issueDescriptions` -- so a site with a low AXIS score gets only its axis
|
|
1534
|
+
* weaknesses, and its element-level issues never appear there at all. That is
|
|
1535
|
+
* the gap the reference check fell through: cbrowser.ai/pricing carried a sticky
|
|
1536
|
+
* -element issue in `topIssues` and not in `weaknesses`, so a check reading only
|
|
1537
|
+
* `weaknesses` concluded it was clean and recommended it as the example to
|
|
1538
|
+
* follow -- for the identical issue.
|
|
1539
|
+
*/
|
|
1540
|
+
function issueSurface(r) {
|
|
1541
|
+
return new Set([...(r.weaknesses ?? []), ...(r.topIssues ?? [])]);
|
|
1542
|
+
}
|
|
1543
|
+
/**
|
|
1544
|
+
* A site worth holding up as an example for THIS issue, or nothing.
|
|
1545
|
+
*
|
|
1546
|
+
* Three conditions, and the tool previously enforced none of them:
|
|
1547
|
+
*
|
|
1548
|
+
* 1. It must not share the issue. Checked against the full issue surface above,
|
|
1549
|
+
* not just `weaknesses`.
|
|
1550
|
+
* 2. It must actually score BETTER than the site being advised. The old code
|
|
1551
|
+
* took the first array match, so cbrowser.ai/pricing (83) was told that
|
|
1552
|
+
* cbrowser.ai/docs/home (80) "handles this better" -- advice to copy a page
|
|
1553
|
+
* that is worse.
|
|
1554
|
+
* 3. Among those that qualify, the best one, not the first one encountered.
|
|
1555
|
+
*
|
|
1556
|
+
* Returns undefined rather than degrading to a rank-based guess. ai_benchmark is
|
|
1557
|
+
* a competitive-intelligence tool whose output is aimed at customers comparing
|
|
1558
|
+
* themselves to rivals; telling one to copy a competitor with the same flaw is
|
|
1559
|
+
* the failure most likely to be screenshotted. No reference is strictly better
|
|
1560
|
+
* than a wrong one.
|
|
1561
|
+
*/
|
|
1562
|
+
export function pickBetterReference(candidates, subject, issue) {
|
|
1563
|
+
if (subject.score === null)
|
|
1564
|
+
return undefined;
|
|
1565
|
+
return candidates
|
|
1566
|
+
.filter((r) => r.siteName !== subject.siteName)
|
|
1567
|
+
.filter((r) => r.score !== null && r.score > subject.score)
|
|
1568
|
+
.filter((r) => !issueSurface(r).has(issue))
|
|
1569
|
+
.sort((a, b) => (b.score ?? 0) - (a.score ?? 0))[0];
|
|
1570
|
+
}
|
|
1452
1571
|
/**
|
|
1453
1572
|
* Generate prioritized recommendations for each site
|
|
1454
1573
|
*/
|
|
@@ -1479,14 +1598,15 @@ function generateAIRecommendations(results, ranking) {
|
|
|
1479
1598
|
}
|
|
1480
1599
|
// Add weakness-based recommendations
|
|
1481
1600
|
for (const weakness of result.weaknesses) {
|
|
1482
|
-
const betterSite = successfulResults
|
|
1483
|
-
!r.weaknesses.includes(weakness));
|
|
1601
|
+
const betterSite = pickBetterReference(successfulResults, { siteName: result.siteName, score: result.score }, weakness);
|
|
1484
1602
|
recommendations.push({
|
|
1485
1603
|
site: result.siteName,
|
|
1486
1604
|
priority: priority++,
|
|
1487
1605
|
improvement: weakness,
|
|
1606
|
+
// Named with its score, so the claim is checkable in the same line
|
|
1607
|
+
// rather than asserted. Omitted entirely when nothing qualifies.
|
|
1488
1608
|
competitorReference: betterSite
|
|
1489
|
-
? `${betterSite.siteName}
|
|
1609
|
+
? `${betterSite.siteName} (${betterSite.score}) does not have this issue`
|
|
1490
1610
|
: undefined,
|
|
1491
1611
|
});
|
|
1492
1612
|
}
|
|
@@ -1504,8 +1624,8 @@ function generateAIRecommendations(results, ranking) {
|
|
|
1504
1624
|
fix: "Use data-testid attributes and semantic selectors",
|
|
1505
1625
|
},
|
|
1506
1626
|
{
|
|
1507
|
-
name: "
|
|
1508
|
-
score: result.scoreBreakdown.
|
|
1627
|
+
name: "agentPerceivability",
|
|
1628
|
+
score: result.scoreBreakdown.agentPerceivability,
|
|
1509
1629
|
fix: "Ensure all form inputs have associated labels",
|
|
1510
1630
|
},
|
|
1511
1631
|
{
|
|
@@ -1522,13 +1642,17 @@ function generateAIRecommendations(results, ranking) {
|
|
|
1522
1642
|
switch (cat.name) {
|
|
1523
1643
|
case "findability": return r.scoreBreakdown.findability;
|
|
1524
1644
|
case "stability": return r.scoreBreakdown.stability;
|
|
1525
|
-
case "
|
|
1645
|
+
case "agentPerceivability": return r.scoreBreakdown.agentPerceivability;
|
|
1526
1646
|
case "semantics": return r.scoreBreakdown.semantics;
|
|
1527
1647
|
default: return 0;
|
|
1528
1648
|
}
|
|
1529
1649
|
};
|
|
1650
|
+
// Must beat the site being advised. Sorting alone still names a
|
|
1651
|
+
// reference when every site is bad at this category, which is advice
|
|
1652
|
+
// to copy someone equally weak.
|
|
1530
1653
|
const bestInCat = successfulResults
|
|
1531
1654
|
.filter((r) => r.siteName !== result.siteName)
|
|
1655
|
+
.filter((r) => getScore(r) > cat.score)
|
|
1532
1656
|
.sort((a, b) => getScore(b) - getScore(a))[0];
|
|
1533
1657
|
recommendations.push({
|
|
1534
1658
|
site: result.siteName,
|