ultra11y 5.35.2 → 5.35.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.opencode/plugins/ultra11y.js +1 -1
- package/package.json +1 -1
- package/scripts/ultra11y.mjs +1 -40
- package/skills/review-a11y/SKILL.md +1 -1
- package/skills/review-a11y/scripts/ultra11y.mjs +1 -40
- package/skills/ultra11y/SKILL.md +4 -3
- package/skills/ultra11y/references/ci.md +13 -8
- package/skills/ultra11y/scripts/ultra11y.mjs +1 -40
- package/src/annotate.ts +3 -8
- package/src/types.ts +1 -1
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"name": "ultra11y",
|
|
11
11
|
"source": "./",
|
|
12
12
|
"description": "Automatic accessibility review of the code under change before every commit, push and pull request, plus full WCAG 2.2 AA / RGAA audits and conformance deliverables on demand.",
|
|
13
|
-
"version": "5.35.
|
|
13
|
+
"version": "5.35.4",
|
|
14
14
|
"author": { "name": "maxgfr" },
|
|
15
15
|
"homepage": "https://github.com/maxgfr/ultra11y",
|
|
16
16
|
"repository": "https://github.com/maxgfr/ultra11y",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ultra11y",
|
|
3
3
|
"description": "Accessibility for WCAG 2.2 AA and country standards (RGAA…): an automatic review of the code under change before every commit, push and pull request, plus full audits and conformance deliverables on demand.",
|
|
4
|
-
"version": "5.35.
|
|
4
|
+
"version": "5.35.4",
|
|
5
5
|
"author": { "name": "maxgfr" },
|
|
6
6
|
"homepage": "https://github.com/maxgfr/ultra11y",
|
|
7
7
|
"repository": "https://github.com/maxgfr/ultra11y",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ultra11y",
|
|
3
3
|
"description": "Accessibility for WCAG 2.2 AA and country standards (RGAA…): an automatic review of the code under change before every commit, push and pull request, plus full audits and conformance deliverables on demand.",
|
|
4
|
-
"version": "5.35.
|
|
4
|
+
"version": "5.35.4",
|
|
5
5
|
"author": { "name": "maxgfr", "url": "https://github.com/maxgfr" },
|
|
6
6
|
"homepage": "https://github.com/maxgfr/ultra11y",
|
|
7
7
|
"repository": "https://github.com/maxgfr/ultra11y",
|
|
@@ -27,7 +27,7 @@ import { fileURLToPath } from "node:url";
|
|
|
27
27
|
// Ownership marker: `ultra11y install --opencode` refuses to overwrite a plugin file that
|
|
28
28
|
// does not carry it, so a user's own ultra11y.js is never clobbered.
|
|
29
29
|
const ULTRA11Y_OPENCODE_PLUGIN = "ULTRA11Y_OPENCODE_PLUGIN";
|
|
30
|
-
const ULTRA11Y_PLUGIN_VERSION = "5.35.
|
|
30
|
+
const ULTRA11Y_PLUGIN_VERSION = "5.35.4";
|
|
31
31
|
|
|
32
32
|
const here = dirname(fileURLToPath(import.meta.url));
|
|
33
33
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ultra11y",
|
|
3
|
-
"version": "5.35.
|
|
3
|
+
"version": "5.35.4",
|
|
4
4
|
"description": "Audit HTML/CSS/JSX against WCAG 2.2 AA and produce a dated compliance report, or author/review accessible markup (native-HTML-first). A skills.sh agent skill: an install-free static engine (bundled, no npm install) plus the agent's judgment, with check/verify gates against hallucinated non-conformities, and pluggable in-repo standards packs (RGAA France first; Section 508 & EN 301 549 next).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "pnpm@10.33.0",
|
package/scripts/ultra11y.mjs
CHANGED
|
@@ -6,7 +6,7 @@ import { join as join53, relative as relative5, resolve as resolve16, sep as sep
|
|
|
6
6
|
import { fileURLToPath as fileURLToPath5, pathToFileURL as pathToFileURL3 } from "url";
|
|
7
7
|
|
|
8
8
|
// src/types.ts
|
|
9
|
-
var VERSION = "5.35.
|
|
9
|
+
var VERSION = "5.35.4";
|
|
10
10
|
var SCHEMA_VERSION = 2;
|
|
11
11
|
var INAPPLICABLE_STATUS = "C";
|
|
12
12
|
|
|
@@ -64642,7 +64642,6 @@ function stepSummary(result, opts = {}) {
|
|
|
64642
64642
|
const all = findingsForStandard(result, standard);
|
|
64643
64643
|
if (!all.length) {
|
|
64644
64644
|
out2.push(s.none, "");
|
|
64645
|
-
out2.push(perPageTable(result, standard, lang));
|
|
64646
64645
|
return out2.join("\n");
|
|
64647
64646
|
}
|
|
64648
64647
|
const grouped = groupFindings(all, standard, lang, baseDir);
|
|
@@ -64653,7 +64652,6 @@ function stepSummary(result, opts = {}) {
|
|
|
64653
64652
|
out2.push("");
|
|
64654
64653
|
const unanchored = all.filter((f) => isUrl2(f.file)).length;
|
|
64655
64654
|
if (unanchored) out2.push(`> ${s.unanchored(unanchored)}`, "");
|
|
64656
|
-
out2.push(perPageTable(result, standard, lang));
|
|
64657
64655
|
return out2.join("\n");
|
|
64658
64656
|
}
|
|
64659
64657
|
function reportSectionsBody(result, standard, lang, budget, prefer) {
|
|
@@ -64721,43 +64719,6 @@ function prComment(result, opts = {}) {
|
|
|
64721
64719
|
while (rows > 0 && sizeOf(assemble(rows)) > COMMENT_LIMIT) rows--;
|
|
64722
64720
|
return assemble(rows);
|
|
64723
64721
|
}
|
|
64724
|
-
function perPageTable(result, standard = CORE2, lang = "en") {
|
|
64725
|
-
const s = S[lang];
|
|
64726
|
-
const scope = pagesOf(result);
|
|
64727
|
-
if (!scope.length) return "";
|
|
64728
|
-
attributePages(result, scope);
|
|
64729
|
-
const derived = derivePages(result, scope);
|
|
64730
|
-
return [
|
|
64731
|
-
`### ${s.perPage}`,
|
|
64732
|
-
"",
|
|
64733
|
-
...scoreboardTable(result, derived, standard, s, lang),
|
|
64734
|
-
"",
|
|
64735
|
-
...basisCaveats(result, derived, standard, s, lang),
|
|
64736
|
-
...fullGridBlock(result, derived, standard, s, lang),
|
|
64737
|
-
"",
|
|
64738
|
-
...derived.flatMap((pg) => [...namedCriteriaBlock(result, pg, standard, s, lang), ""])
|
|
64739
|
-
].join("\n");
|
|
64740
|
-
}
|
|
64741
|
-
function namedCriteriaBlock(result, page, standard, s, lang) {
|
|
64742
|
-
const rows = pageCriterionRows(result, page, standard, lang);
|
|
64743
|
-
if (!rows.length) return [];
|
|
64744
|
-
const ids = (status) => rows.filter((r) => r.status === status).map((r) => `\`${r.id}\``);
|
|
64745
|
-
const line = (label, list) => list.length ? [`- **${label}** (${list.length}) : ${list.join(" \xB7 ")}`] : [];
|
|
64746
|
-
return [
|
|
64747
|
-
"<details>",
|
|
64748
|
-
`<summary>${s.pageCriteriaTitle(page.name)}${page.auth ? " \u{1F512}" : ""}</summary>`,
|
|
64749
|
-
// GFM only renders Markdown inside <details> after a blank line; without it the list
|
|
64750
|
-
// ships to the reader as one run-on paragraph.
|
|
64751
|
-
"",
|
|
64752
|
-
// Failures first — that is the work — then what stands, then what nobody has ruled on.
|
|
64753
|
-
...line(s.nonConformingList, ids("NC")),
|
|
64754
|
-
...line(s.conformingList, ids("C")),
|
|
64755
|
-
...line(s.toAssessList, ids("manual")),
|
|
64756
|
-
...line(s.naList, ids("NA")),
|
|
64757
|
-
"",
|
|
64758
|
-
"</details>"
|
|
64759
|
-
];
|
|
64760
|
-
}
|
|
64761
64722
|
function scoreboardTable(result, derived, standard, s, lang) {
|
|
64762
64723
|
const out2 = [
|
|
64763
64724
|
`| ${s.page} | ${s.basis} | ${s.conformingCol} | ${s.nonConformingCol} | \u{1F534} | \u{1F7E0} | \u{1F7E1} |`,
|
|
@@ -3,7 +3,7 @@ name: review-a11y
|
|
|
3
3
|
description: "Use to REVIEW changed frontend code for accessibility: staged files, a working diff, branch, or PR; prompts such as 'review a11y', 'is this accessible?', or 'anything to fix before merge?'; and hook or CI findings on a change. Run the bundled install-free engine with cross-file JSX/TSX analysis, then adjudicate candidates and return a severity-ranked WCAG 2.2 AA review with file:line fixes, residual rendering risks, and a verdict. Use `ultra11y` instead for whole-repo audits, dated conformance reports, country standards, PRD backlogs, or authoring accessible markup."
|
|
4
4
|
license: MIT
|
|
5
5
|
metadata:
|
|
6
|
-
version: 5.35.
|
|
6
|
+
version: 5.35.4
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# review-a11y — accessibility review of changed code
|
|
@@ -6,7 +6,7 @@ import { join as join53, relative as relative5, resolve as resolve16, sep as sep
|
|
|
6
6
|
import { fileURLToPath as fileURLToPath5, pathToFileURL as pathToFileURL3 } from "url";
|
|
7
7
|
|
|
8
8
|
// src/types.ts
|
|
9
|
-
var VERSION = "5.35.
|
|
9
|
+
var VERSION = "5.35.4";
|
|
10
10
|
var SCHEMA_VERSION = 2;
|
|
11
11
|
var INAPPLICABLE_STATUS = "C";
|
|
12
12
|
|
|
@@ -64642,7 +64642,6 @@ function stepSummary(result, opts = {}) {
|
|
|
64642
64642
|
const all = findingsForStandard(result, standard);
|
|
64643
64643
|
if (!all.length) {
|
|
64644
64644
|
out2.push(s.none, "");
|
|
64645
|
-
out2.push(perPageTable(result, standard, lang));
|
|
64646
64645
|
return out2.join("\n");
|
|
64647
64646
|
}
|
|
64648
64647
|
const grouped = groupFindings(all, standard, lang, baseDir);
|
|
@@ -64653,7 +64652,6 @@ function stepSummary(result, opts = {}) {
|
|
|
64653
64652
|
out2.push("");
|
|
64654
64653
|
const unanchored = all.filter((f) => isUrl2(f.file)).length;
|
|
64655
64654
|
if (unanchored) out2.push(`> ${s.unanchored(unanchored)}`, "");
|
|
64656
|
-
out2.push(perPageTable(result, standard, lang));
|
|
64657
64655
|
return out2.join("\n");
|
|
64658
64656
|
}
|
|
64659
64657
|
function reportSectionsBody(result, standard, lang, budget, prefer) {
|
|
@@ -64721,43 +64719,6 @@ function prComment(result, opts = {}) {
|
|
|
64721
64719
|
while (rows > 0 && sizeOf(assemble(rows)) > COMMENT_LIMIT) rows--;
|
|
64722
64720
|
return assemble(rows);
|
|
64723
64721
|
}
|
|
64724
|
-
function perPageTable(result, standard = CORE2, lang = "en") {
|
|
64725
|
-
const s = S[lang];
|
|
64726
|
-
const scope = pagesOf(result);
|
|
64727
|
-
if (!scope.length) return "";
|
|
64728
|
-
attributePages(result, scope);
|
|
64729
|
-
const derived = derivePages(result, scope);
|
|
64730
|
-
return [
|
|
64731
|
-
`### ${s.perPage}`,
|
|
64732
|
-
"",
|
|
64733
|
-
...scoreboardTable(result, derived, standard, s, lang),
|
|
64734
|
-
"",
|
|
64735
|
-
...basisCaveats(result, derived, standard, s, lang),
|
|
64736
|
-
...fullGridBlock(result, derived, standard, s, lang),
|
|
64737
|
-
"",
|
|
64738
|
-
...derived.flatMap((pg) => [...namedCriteriaBlock(result, pg, standard, s, lang), ""])
|
|
64739
|
-
].join("\n");
|
|
64740
|
-
}
|
|
64741
|
-
function namedCriteriaBlock(result, page, standard, s, lang) {
|
|
64742
|
-
const rows = pageCriterionRows(result, page, standard, lang);
|
|
64743
|
-
if (!rows.length) return [];
|
|
64744
|
-
const ids = (status) => rows.filter((r) => r.status === status).map((r) => `\`${r.id}\``);
|
|
64745
|
-
const line = (label, list) => list.length ? [`- **${label}** (${list.length}) : ${list.join(" \xB7 ")}`] : [];
|
|
64746
|
-
return [
|
|
64747
|
-
"<details>",
|
|
64748
|
-
`<summary>${s.pageCriteriaTitle(page.name)}${page.auth ? " \u{1F512}" : ""}</summary>`,
|
|
64749
|
-
// GFM only renders Markdown inside <details> after a blank line; without it the list
|
|
64750
|
-
// ships to the reader as one run-on paragraph.
|
|
64751
|
-
"",
|
|
64752
|
-
// Failures first — that is the work — then what stands, then what nobody has ruled on.
|
|
64753
|
-
...line(s.nonConformingList, ids("NC")),
|
|
64754
|
-
...line(s.conformingList, ids("C")),
|
|
64755
|
-
...line(s.toAssessList, ids("manual")),
|
|
64756
|
-
...line(s.naList, ids("NA")),
|
|
64757
|
-
"",
|
|
64758
|
-
"</details>"
|
|
64759
|
-
];
|
|
64760
|
-
}
|
|
64761
64722
|
function scoreboardTable(result, derived, standard, s, lang) {
|
|
64762
64723
|
const out2 = [
|
|
64763
64724
|
`| ${s.page} | ${s.basis} | ${s.conformingCol} | ${s.nonConformingCol} | \u{1F534} | \u{1F7E0} | \u{1F7E1} |`,
|
package/skills/ultra11y/SKILL.md
CHANGED
|
@@ -3,7 +3,7 @@ name: ultra11y
|
|
|
3
3
|
description: "Use to AUDIT a repository, site, or page against WCAG 2.2 AA or a country standard such as RGAA; produce a dated conformance report, criterion grid, PRD backlog, or tickets; AUTHOR accessible markup; fix accessibility; or wire a repo gate and rendered-DOM capture pipeline. The bundled install-free engine runs 81 static checks tied to success criteria, while the agent adjudicates judgment criteria and routes rendering criteria to browser scans; check/verify reject invented non-conformities. Use `review-a11y` instead for a review scoped only to a diff, branch, or PR."
|
|
4
4
|
license: MIT
|
|
5
5
|
metadata:
|
|
6
|
-
version: 5.35.
|
|
6
|
+
version: 5.35.4
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# ultra11y — audit WCAG 2.2 AA and write accessible markup
|
|
@@ -249,8 +249,9 @@ Domain knowledge first, then the tooling. Read the one that matches the question
|
|
|
249
249
|
A client-rendered SPA exposes no routes in its served HTML — use a sitemap there; read
|
|
250
250
|
**`references/dynamic.md`**.
|
|
251
251
|
- **"Audit these URLs page by page, in CI"** → the shipped Action takes `urls`, `sitemap`,
|
|
252
|
-
`crawl` or `sample`, snapshots every page it visits
|
|
253
|
-
artifact
|
|
252
|
+
`crawl` or `sample`, snapshots every page it visits and writes the per-page dossiers into its
|
|
253
|
+
artifact. The ordinary job summary stays run-level; request a `pages`/`full` PR comment when
|
|
254
|
+
a page scoreboard is wanted; read
|
|
254
255
|
**`references/ci.md`**.
|
|
255
256
|
- **"Nobody is here to rule on the judgment criteria"** → `judge --in audits/audit-latest.json
|
|
256
257
|
--standard rgaa [--apply]` adjudicates them with a model, for a run with no coding agent in
|
|
@@ -334,9 +334,8 @@ What the projection guarantees:
|
|
|
334
334
|
|
|
335
335
|
Advanced Security is not available on every plan. This mode writes
|
|
336
336
|
`::error file=…,line=…,col=…,title=…::` workflow commands to **stdout**, which every GitHub
|
|
337
|
-
plan renders inline on the diff, and appends a Markdown job summary to
|
|
338
|
-
`$GITHUB_STEP_SUMMARY`
|
|
339
|
-
been scanned and merged). With no `$GITHUB_STEP_SUMMARY` set, the summary goes to stderr so a
|
|
337
|
+
plan renders inline on the diff, and appends a compact Markdown job summary to
|
|
338
|
+
`$GITHUB_STEP_SUMMARY`. With no `$GITHUB_STEP_SUMMARY` set, the summary goes to stderr so a
|
|
340
339
|
local run still shows it.
|
|
341
340
|
|
|
342
341
|
The GitHub summary deliberately prints **coverage, never a percentage**:
|
|
@@ -347,7 +346,10 @@ and the occurrence count is derived from the same projection; a WCAG finding tha
|
|
|
347
346
|
RGAA criterion non-conformant therefore appears in neither the heading nor an empty table.
|
|
348
347
|
|
|
349
348
|
URL-keyed findings are **skipped** for annotations — there is no repo line to point at — and
|
|
350
|
-
counted in the summary instead, so they are never silently dropped.
|
|
349
|
+
counted in the summary instead, so they are never silently dropped. The summary deliberately
|
|
350
|
+
stops at the run-level result and distinct non-conformities: the page scoreboard and its
|
|
351
|
+
traffic-light columns live in the explicit `pages`/`full` PR comment and the artifact, not in
|
|
352
|
+
every job summary.
|
|
351
353
|
|
|
352
354
|
## Which command to run it from
|
|
353
355
|
|
|
@@ -492,13 +494,16 @@ grid is almost empty and the job reports far less than it measured.
|
|
|
492
494
|
|
|
493
495
|
Four surfaces come out of it:
|
|
494
496
|
|
|
495
|
-
- **The scoreboard**, in the
|
|
496
|
-
rate and its blocking/major/minor counts, plus a `basis` column.
|
|
497
|
+
- **The scoreboard**, in the explicit `pages`/`full` sticky PR comment and the artifact: one
|
|
498
|
+
row per page with its rate and its blocking/major/minor counts, plus a `basis` column. It is
|
|
499
|
+
omitted from the ordinary job summary so the run-level result is not buried under a second
|
|
500
|
+
dashboard. The `basis` column is not
|
|
497
501
|
decoration — a page marked *source* has no snapshot, so its silence is not conformity.
|
|
498
502
|
It appears on a clean run too, which is exactly when a reviewer wants to see *which* pages
|
|
499
503
|
passed.
|
|
500
|
-
- **The criteria, NAMED, under each page** — in the
|
|
501
|
-
does not, what nobody has ruled on, by id. Counts are the
|
|
504
|
+
- **The criteria, NAMED, under each page** — in the explicit page comment and per-page
|
|
505
|
+
dossiers: what conforms, what does not, what nobody has ruled on, by id. Counts are the
|
|
506
|
+
right shape for a scoreboard and
|
|
502
507
|
the wrong one for acting: « 65 / 6 » says nothing about *which* six, and until now the ids
|
|
503
508
|
lived only in an artifact nobody downloads. Every status comes from the same
|
|
504
509
|
`pageCriterionRows` the dossiers render, so the summary and the deliverable cannot disagree.
|
|
@@ -6,7 +6,7 @@ import { join as join53, relative as relative5, resolve as resolve16, sep as sep
|
|
|
6
6
|
import { fileURLToPath as fileURLToPath5, pathToFileURL as pathToFileURL3 } from "url";
|
|
7
7
|
|
|
8
8
|
// src/types.ts
|
|
9
|
-
var VERSION = "5.35.
|
|
9
|
+
var VERSION = "5.35.4";
|
|
10
10
|
var SCHEMA_VERSION = 2;
|
|
11
11
|
var INAPPLICABLE_STATUS = "C";
|
|
12
12
|
|
|
@@ -64642,7 +64642,6 @@ function stepSummary(result, opts = {}) {
|
|
|
64642
64642
|
const all = findingsForStandard(result, standard);
|
|
64643
64643
|
if (!all.length) {
|
|
64644
64644
|
out2.push(s.none, "");
|
|
64645
|
-
out2.push(perPageTable(result, standard, lang));
|
|
64646
64645
|
return out2.join("\n");
|
|
64647
64646
|
}
|
|
64648
64647
|
const grouped = groupFindings(all, standard, lang, baseDir);
|
|
@@ -64653,7 +64652,6 @@ function stepSummary(result, opts = {}) {
|
|
|
64653
64652
|
out2.push("");
|
|
64654
64653
|
const unanchored = all.filter((f) => isUrl2(f.file)).length;
|
|
64655
64654
|
if (unanchored) out2.push(`> ${s.unanchored(unanchored)}`, "");
|
|
64656
|
-
out2.push(perPageTable(result, standard, lang));
|
|
64657
64655
|
return out2.join("\n");
|
|
64658
64656
|
}
|
|
64659
64657
|
function reportSectionsBody(result, standard, lang, budget, prefer) {
|
|
@@ -64721,43 +64719,6 @@ function prComment(result, opts = {}) {
|
|
|
64721
64719
|
while (rows > 0 && sizeOf(assemble(rows)) > COMMENT_LIMIT) rows--;
|
|
64722
64720
|
return assemble(rows);
|
|
64723
64721
|
}
|
|
64724
|
-
function perPageTable(result, standard = CORE2, lang = "en") {
|
|
64725
|
-
const s = S[lang];
|
|
64726
|
-
const scope = pagesOf(result);
|
|
64727
|
-
if (!scope.length) return "";
|
|
64728
|
-
attributePages(result, scope);
|
|
64729
|
-
const derived = derivePages(result, scope);
|
|
64730
|
-
return [
|
|
64731
|
-
`### ${s.perPage}`,
|
|
64732
|
-
"",
|
|
64733
|
-
...scoreboardTable(result, derived, standard, s, lang),
|
|
64734
|
-
"",
|
|
64735
|
-
...basisCaveats(result, derived, standard, s, lang),
|
|
64736
|
-
...fullGridBlock(result, derived, standard, s, lang),
|
|
64737
|
-
"",
|
|
64738
|
-
...derived.flatMap((pg) => [...namedCriteriaBlock(result, pg, standard, s, lang), ""])
|
|
64739
|
-
].join("\n");
|
|
64740
|
-
}
|
|
64741
|
-
function namedCriteriaBlock(result, page, standard, s, lang) {
|
|
64742
|
-
const rows = pageCriterionRows(result, page, standard, lang);
|
|
64743
|
-
if (!rows.length) return [];
|
|
64744
|
-
const ids = (status) => rows.filter((r) => r.status === status).map((r) => `\`${r.id}\``);
|
|
64745
|
-
const line = (label, list) => list.length ? [`- **${label}** (${list.length}) : ${list.join(" \xB7 ")}`] : [];
|
|
64746
|
-
return [
|
|
64747
|
-
"<details>",
|
|
64748
|
-
`<summary>${s.pageCriteriaTitle(page.name)}${page.auth ? " \u{1F512}" : ""}</summary>`,
|
|
64749
|
-
// GFM only renders Markdown inside <details> after a blank line; without it the list
|
|
64750
|
-
// ships to the reader as one run-on paragraph.
|
|
64751
|
-
"",
|
|
64752
|
-
// Failures first — that is the work — then what stands, then what nobody has ruled on.
|
|
64753
|
-
...line(s.nonConformingList, ids("NC")),
|
|
64754
|
-
...line(s.conformingList, ids("C")),
|
|
64755
|
-
...line(s.toAssessList, ids("manual")),
|
|
64756
|
-
...line(s.naList, ids("NA")),
|
|
64757
|
-
"",
|
|
64758
|
-
"</details>"
|
|
64759
|
-
];
|
|
64760
|
-
}
|
|
64761
64722
|
function scoreboardTable(result, derived, standard, s, lang) {
|
|
64762
64723
|
const out2 = [
|
|
64763
64724
|
`| ${s.page} | ${s.basis} | ${s.conformingCol} | ${s.nonConformingCol} | \u{1F534} | \u{1F7E0} | \u{1F7E1} |`,
|
package/src/annotate.ts
CHANGED
|
@@ -3,10 +3,9 @@
|
|
|
3
3
|
// • `annotations()` — workflow commands (`::error file=…,line=…::`). Every GitHub plan
|
|
4
4
|
// renders these inline on the diff, so this is the fallback when SARIF upload is
|
|
5
5
|
// unavailable (a private repo without Advanced Security).
|
|
6
|
-
// • `stepSummary()` — the Markdown written to `$GITHUB_STEP_SUMMARY`: the run's headline
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// reached it arrived by accident.
|
|
6
|
+
// • `stepSummary()` — the Markdown written to `$GITHUB_STEP_SUMMARY`: the run's headline
|
|
7
|
+
// and grouped severity table. The page-by-page scoreboard is deliberately absent: its
|
|
8
|
+
// traffic-light columns duplicated the artifact and buried the run-level result.
|
|
10
9
|
// • `prComment()` — the DIGEST posted on the pull request. A different document, not a
|
|
11
10
|
// truncation of the one above: a reviewer scanning a PR needs the verdict, the coverage
|
|
12
11
|
// and the handful of distinct defects, then a link. Posting the full summary there is how
|
|
@@ -493,9 +492,6 @@ export function stepSummary(result: AuditResult, opts: AnnotateOptions = {}): st
|
|
|
493
492
|
|
|
494
493
|
if (!all.length) {
|
|
495
494
|
out.push(s.none, "");
|
|
496
|
-
// Still show the scoreboard: a clean run over five pages is exactly when a reviewer
|
|
497
|
-
// wants to see WHICH five, and how much of each was actually decided.
|
|
498
|
-
out.push(perPageTable(result, standard, lang));
|
|
499
495
|
return out.join("\n");
|
|
500
496
|
}
|
|
501
497
|
|
|
@@ -509,7 +505,6 @@ export function stepSummary(result: AuditResult, opts: AnnotateOptions = {}): st
|
|
|
509
505
|
const unanchored = all.filter((f) => isUrl(f.file)).length;
|
|
510
506
|
if (unanchored) out.push(`> ${s.unanchored(unanchored)}`, "");
|
|
511
507
|
|
|
512
|
-
out.push(perPageTable(result, standard, lang));
|
|
513
508
|
return out.join("\n");
|
|
514
509
|
}
|
|
515
510
|
|
package/src/types.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Single source of truth for shared types + the embedded version. sync-version.mjs
|
|
2
2
|
// rewrites VERSION at release time (kept in lockstep with package.json + SKILL.md).
|
|
3
|
-
export const VERSION = "5.35.
|
|
3
|
+
export const VERSION = "5.35.4";
|
|
4
4
|
export const SCHEMA_VERSION = 2;
|
|
5
5
|
|
|
6
6
|
// Lang = the UI FRAME's language — the `L` localization tables each module (report,
|