ultra11y 5.13.0 → 5.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-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 +8 -3
- package/skills/review-a11y/SKILL.md +1 -1
- package/skills/review-a11y/scripts/ultra11y.mjs +8 -3
- package/skills/ultra11y/SKILL.md +1 -1
- package/skills/ultra11y/scripts/ultra11y.mjs +8 -3
- package/src/pages.ts +15 -2
- 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.13.
|
|
13
|
+
"version": "5.13.1",
|
|
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.13.
|
|
4
|
+
"version": "5.13.1",
|
|
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.13.
|
|
4
|
+
"version": "5.13.1",
|
|
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.13.
|
|
30
|
+
const ULTRA11Y_PLUGIN_VERSION = "5.13.1";
|
|
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.13.
|
|
3
|
+
"version": "5.13.1",
|
|
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 join51, 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.13.
|
|
9
|
+
var VERSION = "5.13.1";
|
|
10
10
|
var SCHEMA_VERSION = 2;
|
|
11
11
|
var INAPPLICABLE_STATUS = "C";
|
|
12
12
|
|
|
@@ -54373,6 +54373,7 @@ function pageStatus(c2, pageFindings, basis) {
|
|
|
54373
54373
|
if (pageFindings.some((f) => !f.advisory)) return "NC";
|
|
54374
54374
|
if (c2.status === "manual") return "manual";
|
|
54375
54375
|
if (c2.status === "NA") return "NA";
|
|
54376
|
+
if (c2.inapplicable) return c2.status;
|
|
54376
54377
|
if (c2.decidedBy === "agent" || c2.decidedBy === "scan") return c2.status;
|
|
54377
54378
|
if (automatability(c2.id) !== "static") return "manual";
|
|
54378
54379
|
return basis === "snapshot" ? "C" : "manual";
|
|
@@ -54390,13 +54391,17 @@ function derivePages(result, pages) {
|
|
|
54390
54391
|
const own = result.findings.filter((f) => f.page === p.id);
|
|
54391
54392
|
const criteria = result.criteria.map((c2) => {
|
|
54392
54393
|
const pf = own.filter((f) => f.criteriaId === c2.id);
|
|
54394
|
+
const status = pageStatus(c2, pf, p.basis);
|
|
54393
54395
|
return {
|
|
54394
54396
|
id: c2.id,
|
|
54395
54397
|
guideline: c2.guideline,
|
|
54396
|
-
status
|
|
54398
|
+
status,
|
|
54397
54399
|
findings: pf,
|
|
54398
54400
|
...c2.justification ? { justification: c2.justification } : {},
|
|
54399
|
-
...c2.decidedBy ? { decidedBy: c2.decidedBy } : {}
|
|
54401
|
+
...c2.decidedBy ? { decidedBy: c2.decidedBy } : {},
|
|
54402
|
+
// Carried, not recomputed: a finding on THIS page proves the subject exists after all,
|
|
54403
|
+
// and `pageStatus` has already turned that into an NC above.
|
|
54404
|
+
...c2.inapplicable && status === c2.status ? { inapplicable: true } : {}
|
|
54400
54405
|
};
|
|
54401
54406
|
});
|
|
54402
54407
|
const { rate, decided, total } = pct(criteria);
|
|
@@ -5,7 +5,7 @@ when_to_use: "Invoke WITHOUT being asked whenever changed front-end code should
|
|
|
5
5
|
allowed-tools: Bash(node ${CLAUDE_SKILL_DIR}/scripts/ultra11y.mjs *), Read, Grep, Glob
|
|
6
6
|
license: MIT
|
|
7
7
|
metadata:
|
|
8
|
-
version: 5.13.
|
|
8
|
+
version: 5.13.1
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
# review-a11y — accessibility review of changed code
|
|
@@ -6,7 +6,7 @@ import { join as join51, 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.13.
|
|
9
|
+
var VERSION = "5.13.1";
|
|
10
10
|
var SCHEMA_VERSION = 2;
|
|
11
11
|
var INAPPLICABLE_STATUS = "C";
|
|
12
12
|
|
|
@@ -54373,6 +54373,7 @@ function pageStatus(c2, pageFindings, basis) {
|
|
|
54373
54373
|
if (pageFindings.some((f) => !f.advisory)) return "NC";
|
|
54374
54374
|
if (c2.status === "manual") return "manual";
|
|
54375
54375
|
if (c2.status === "NA") return "NA";
|
|
54376
|
+
if (c2.inapplicable) return c2.status;
|
|
54376
54377
|
if (c2.decidedBy === "agent" || c2.decidedBy === "scan") return c2.status;
|
|
54377
54378
|
if (automatability(c2.id) !== "static") return "manual";
|
|
54378
54379
|
return basis === "snapshot" ? "C" : "manual";
|
|
@@ -54390,13 +54391,17 @@ function derivePages(result, pages) {
|
|
|
54390
54391
|
const own = result.findings.filter((f) => f.page === p.id);
|
|
54391
54392
|
const criteria = result.criteria.map((c2) => {
|
|
54392
54393
|
const pf = own.filter((f) => f.criteriaId === c2.id);
|
|
54394
|
+
const status = pageStatus(c2, pf, p.basis);
|
|
54393
54395
|
return {
|
|
54394
54396
|
id: c2.id,
|
|
54395
54397
|
guideline: c2.guideline,
|
|
54396
|
-
status
|
|
54398
|
+
status,
|
|
54397
54399
|
findings: pf,
|
|
54398
54400
|
...c2.justification ? { justification: c2.justification } : {},
|
|
54399
|
-
...c2.decidedBy ? { decidedBy: c2.decidedBy } : {}
|
|
54401
|
+
...c2.decidedBy ? { decidedBy: c2.decidedBy } : {},
|
|
54402
|
+
// Carried, not recomputed: a finding on THIS page proves the subject exists after all,
|
|
54403
|
+
// and `pageStatus` has already turned that into an NC above.
|
|
54404
|
+
...c2.inapplicable && status === c2.status ? { inapplicable: true } : {}
|
|
54400
54405
|
};
|
|
54401
54406
|
});
|
|
54402
54407
|
const { rate, decided, total } = pct(criteria);
|
package/skills/ultra11y/SKILL.md
CHANGED
|
@@ -4,7 +4,7 @@ description: "Use to AUDIT existing HTML/CSS/JSX against WCAG 2.2 AA accessibili
|
|
|
4
4
|
when_to_use: "Invoke when the user asks for an accessibility AUDIT or a formal deliverable: audit a repo, site or page against WCAG 2.2 AA or a country standard (RGAA, Section 508, EN 301 549); produce a dated conformance report, a criterion grid, a PRD backlog, or tickets (GitHub/GitLab/Jira); author accessible markup from scratch; wire the repo gate (init --hook/--ci) or a rendered-DOM capture pipeline. For a review of the code UNDER CHANGE (diff, branch, PR), use the `review-a11y` skill instead."
|
|
5
5
|
license: MIT
|
|
6
6
|
metadata:
|
|
7
|
-
version: 5.13.
|
|
7
|
+
version: 5.13.1
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# ultra11y — audit WCAG 2.2 AA and write accessible markup
|
|
@@ -6,7 +6,7 @@ import { join as join51, 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.13.
|
|
9
|
+
var VERSION = "5.13.1";
|
|
10
10
|
var SCHEMA_VERSION = 2;
|
|
11
11
|
var INAPPLICABLE_STATUS = "C";
|
|
12
12
|
|
|
@@ -54373,6 +54373,7 @@ function pageStatus(c2, pageFindings, basis) {
|
|
|
54373
54373
|
if (pageFindings.some((f) => !f.advisory)) return "NC";
|
|
54374
54374
|
if (c2.status === "manual") return "manual";
|
|
54375
54375
|
if (c2.status === "NA") return "NA";
|
|
54376
|
+
if (c2.inapplicable) return c2.status;
|
|
54376
54377
|
if (c2.decidedBy === "agent" || c2.decidedBy === "scan") return c2.status;
|
|
54377
54378
|
if (automatability(c2.id) !== "static") return "manual";
|
|
54378
54379
|
return basis === "snapshot" ? "C" : "manual";
|
|
@@ -54390,13 +54391,17 @@ function derivePages(result, pages) {
|
|
|
54390
54391
|
const own = result.findings.filter((f) => f.page === p.id);
|
|
54391
54392
|
const criteria = result.criteria.map((c2) => {
|
|
54392
54393
|
const pf = own.filter((f) => f.criteriaId === c2.id);
|
|
54394
|
+
const status = pageStatus(c2, pf, p.basis);
|
|
54393
54395
|
return {
|
|
54394
54396
|
id: c2.id,
|
|
54395
54397
|
guideline: c2.guideline,
|
|
54396
|
-
status
|
|
54398
|
+
status,
|
|
54397
54399
|
findings: pf,
|
|
54398
54400
|
...c2.justification ? { justification: c2.justification } : {},
|
|
54399
|
-
...c2.decidedBy ? { decidedBy: c2.decidedBy } : {}
|
|
54401
|
+
...c2.decidedBy ? { decidedBy: c2.decidedBy } : {},
|
|
54402
|
+
// Carried, not recomputed: a finding on THIS page proves the subject exists after all,
|
|
54403
|
+
// and `pageStatus` has already turned that into an NC above.
|
|
54404
|
+
...c2.inapplicable && status === c2.status ? { inapplicable: true } : {}
|
|
54400
54405
|
};
|
|
54401
54406
|
});
|
|
54402
54407
|
const { rate, decided, total } = pct(criteria);
|
package/src/pages.ts
CHANGED
|
@@ -165,7 +165,16 @@ function pageStatus(c: CriterionResult, pageFindings: Finding[], basis: PageScop
|
|
|
165
165
|
// A non-normative recommendation can never flip a criterion to NC — same rule as core.
|
|
166
166
|
if (pageFindings.some((f) => !f.advisory)) return "NC";
|
|
167
167
|
if (c.status === "manual") return "manual"; // the engine cannot decide it anywhere
|
|
168
|
-
if (c.status === "NA") return "NA"; //
|
|
168
|
+
if (c.status === "NA") return "NA"; // legacy audits only — the engine no longer emits it
|
|
169
|
+
// NOTHING OF THAT KIND EXISTS ANYWHERE IN SCOPE, so there is none on this page either.
|
|
170
|
+
//
|
|
171
|
+
// Checked BEFORE rule 3 below, and it is not an exception to it: rule 3 refuses to conclude
|
|
172
|
+
// from silence, and this is not silence — it is a scope-wide absence the engine can point at,
|
|
173
|
+
// carrying the justification that names the subject it looked for. Left to fall through, every
|
|
174
|
+
// media, table and form criterion came back « à évaluer » on each page while the run-wide grid
|
|
175
|
+
// had them settled: measured on a three-page sample, 75 of 106 RGAA criteria open per page
|
|
176
|
+
// against 26 for the run.
|
|
177
|
+
if (c.inapplicable) return c.status;
|
|
169
178
|
|
|
170
179
|
// A verdict SOMEBODY RECORDED is not silence, and rule 3 below is only about silence.
|
|
171
180
|
//
|
|
@@ -225,13 +234,17 @@ export function derivePages(result: AuditResult, pages: PageScope[]): PageResult
|
|
|
225
234
|
const own = result.findings.filter((f) => f.page === p.id);
|
|
226
235
|
const criteria: CriterionResult[] = result.criteria.map((c) => {
|
|
227
236
|
const pf = own.filter((f) => f.criteriaId === c.id);
|
|
237
|
+
const status = pageStatus(c, pf, p.basis);
|
|
228
238
|
return {
|
|
229
239
|
id: c.id,
|
|
230
240
|
guideline: c.guideline,
|
|
231
|
-
status
|
|
241
|
+
status,
|
|
232
242
|
findings: pf,
|
|
233
243
|
...(c.justification ? { justification: c.justification } : {}),
|
|
234
244
|
...(c.decidedBy ? { decidedBy: c.decidedBy } : {}),
|
|
245
|
+
// Carried, not recomputed: a finding on THIS page proves the subject exists after all,
|
|
246
|
+
// and `pageStatus` has already turned that into an NC above.
|
|
247
|
+
...(c.inapplicable && status === c.status ? { inapplicable: true } : {}),
|
|
235
248
|
};
|
|
236
249
|
});
|
|
237
250
|
const { rate, decided, total } = pct(criteria);
|
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.13.
|
|
3
|
+
export const VERSION = "5.13.1";
|
|
4
4
|
export const SCHEMA_VERSION = 2;
|
|
5
5
|
|
|
6
6
|
// Lang = the UI FRAME's language — the `L` localization tables each module (report,
|