ultra11y 5.14.2 → 5.14.3
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 +18 -3
- package/skills/review-a11y/SKILL.md +1 -1
- package/skills/review-a11y/scripts/ultra11y.mjs +18 -3
- package/skills/ultra11y/SKILL.md +1 -1
- package/skills/ultra11y/scripts/ultra11y.mjs +18 -3
- package/src/check.ts +26 -4
- 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.14.
|
|
13
|
+
"version": "5.14.3",
|
|
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.14.
|
|
4
|
+
"version": "5.14.3",
|
|
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.14.
|
|
4
|
+
"version": "5.14.3",
|
|
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.14.
|
|
30
|
+
const ULTRA11Y_PLUGIN_VERSION = "5.14.3";
|
|
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.14.
|
|
3
|
+
"version": "5.14.3",
|
|
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.14.
|
|
9
|
+
var VERSION = "5.14.3";
|
|
10
10
|
var SCHEMA_VERSION = 2;
|
|
11
11
|
var INAPPLICABLE_STATUS = "C";
|
|
12
12
|
|
|
@@ -56864,12 +56864,27 @@ function sectionBody(md, n) {
|
|
|
56864
56864
|
function checkSampleCaptured(root = ".", lang = "en") {
|
|
56865
56865
|
const fr = lang === "fr";
|
|
56866
56866
|
let declared = [];
|
|
56867
|
+
const rc = join34(root, ".ultra11yrc.json");
|
|
56868
|
+
let raw;
|
|
56867
56869
|
try {
|
|
56868
|
-
|
|
56869
|
-
declared = cfg.sample?.pages ?? [];
|
|
56870
|
+
raw = readFileSync18(rc, "utf8");
|
|
56870
56871
|
} catch {
|
|
56871
56872
|
return { ok: true, issues: [], missing: [], declared: 0, captured: 0 };
|
|
56872
56873
|
}
|
|
56874
|
+
try {
|
|
56875
|
+
const cfg = JSON.parse(raw);
|
|
56876
|
+
declared = cfg.sample?.pages ?? [];
|
|
56877
|
+
} catch (e) {
|
|
56878
|
+
return {
|
|
56879
|
+
ok: false,
|
|
56880
|
+
issues: [
|
|
56881
|
+
fr ? `.ultra11yrc.json est pr\xE9sent mais illisible (${e instanceof Error ? e.message : String(e)}) \u2014 impossible de savoir quelles pages ce run devait couvrir. La porte de couverture ne peut pas r\xE9pondre, et ne r\xE9pondra donc pas \xAB couvert \xBB.` : `.ultra11yrc.json is present but unreadable (${e instanceof Error ? e.message : String(e)}) \u2014 there is no way to know which pages this run was meant to cover. The coverage gate cannot answer, so it does not answer "covered".`
|
|
56882
|
+
],
|
|
56883
|
+
missing: [],
|
|
56884
|
+
declared: 0,
|
|
56885
|
+
captured: 0
|
|
56886
|
+
};
|
|
56887
|
+
}
|
|
56873
56888
|
if (!declared.length) return { ok: true, issues: [], missing: [], declared: 0, captured: 0 };
|
|
56874
56889
|
let captured = /* @__PURE__ */ new Set();
|
|
56875
56890
|
try {
|
|
@@ -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.14.
|
|
8
|
+
version: 5.14.3
|
|
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.14.
|
|
9
|
+
var VERSION = "5.14.3";
|
|
10
10
|
var SCHEMA_VERSION = 2;
|
|
11
11
|
var INAPPLICABLE_STATUS = "C";
|
|
12
12
|
|
|
@@ -56864,12 +56864,27 @@ function sectionBody(md, n) {
|
|
|
56864
56864
|
function checkSampleCaptured(root = ".", lang = "en") {
|
|
56865
56865
|
const fr = lang === "fr";
|
|
56866
56866
|
let declared = [];
|
|
56867
|
+
const rc = join34(root, ".ultra11yrc.json");
|
|
56868
|
+
let raw;
|
|
56867
56869
|
try {
|
|
56868
|
-
|
|
56869
|
-
declared = cfg.sample?.pages ?? [];
|
|
56870
|
+
raw = readFileSync18(rc, "utf8");
|
|
56870
56871
|
} catch {
|
|
56871
56872
|
return { ok: true, issues: [], missing: [], declared: 0, captured: 0 };
|
|
56872
56873
|
}
|
|
56874
|
+
try {
|
|
56875
|
+
const cfg = JSON.parse(raw);
|
|
56876
|
+
declared = cfg.sample?.pages ?? [];
|
|
56877
|
+
} catch (e) {
|
|
56878
|
+
return {
|
|
56879
|
+
ok: false,
|
|
56880
|
+
issues: [
|
|
56881
|
+
fr ? `.ultra11yrc.json est pr\xE9sent mais illisible (${e instanceof Error ? e.message : String(e)}) \u2014 impossible de savoir quelles pages ce run devait couvrir. La porte de couverture ne peut pas r\xE9pondre, et ne r\xE9pondra donc pas \xAB couvert \xBB.` : `.ultra11yrc.json is present but unreadable (${e instanceof Error ? e.message : String(e)}) \u2014 there is no way to know which pages this run was meant to cover. The coverage gate cannot answer, so it does not answer "covered".`
|
|
56882
|
+
],
|
|
56883
|
+
missing: [],
|
|
56884
|
+
declared: 0,
|
|
56885
|
+
captured: 0
|
|
56886
|
+
};
|
|
56887
|
+
}
|
|
56873
56888
|
if (!declared.length) return { ok: true, issues: [], missing: [], declared: 0, captured: 0 };
|
|
56874
56889
|
let captured = /* @__PURE__ */ new Set();
|
|
56875
56890
|
try {
|
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.14.
|
|
7
|
+
version: 5.14.3
|
|
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.14.
|
|
9
|
+
var VERSION = "5.14.3";
|
|
10
10
|
var SCHEMA_VERSION = 2;
|
|
11
11
|
var INAPPLICABLE_STATUS = "C";
|
|
12
12
|
|
|
@@ -56864,12 +56864,27 @@ function sectionBody(md, n) {
|
|
|
56864
56864
|
function checkSampleCaptured(root = ".", lang = "en") {
|
|
56865
56865
|
const fr = lang === "fr";
|
|
56866
56866
|
let declared = [];
|
|
56867
|
+
const rc = join34(root, ".ultra11yrc.json");
|
|
56868
|
+
let raw;
|
|
56867
56869
|
try {
|
|
56868
|
-
|
|
56869
|
-
declared = cfg.sample?.pages ?? [];
|
|
56870
|
+
raw = readFileSync18(rc, "utf8");
|
|
56870
56871
|
} catch {
|
|
56871
56872
|
return { ok: true, issues: [], missing: [], declared: 0, captured: 0 };
|
|
56872
56873
|
}
|
|
56874
|
+
try {
|
|
56875
|
+
const cfg = JSON.parse(raw);
|
|
56876
|
+
declared = cfg.sample?.pages ?? [];
|
|
56877
|
+
} catch (e) {
|
|
56878
|
+
return {
|
|
56879
|
+
ok: false,
|
|
56880
|
+
issues: [
|
|
56881
|
+
fr ? `.ultra11yrc.json est pr\xE9sent mais illisible (${e instanceof Error ? e.message : String(e)}) \u2014 impossible de savoir quelles pages ce run devait couvrir. La porte de couverture ne peut pas r\xE9pondre, et ne r\xE9pondra donc pas \xAB couvert \xBB.` : `.ultra11yrc.json is present but unreadable (${e instanceof Error ? e.message : String(e)}) \u2014 there is no way to know which pages this run was meant to cover. The coverage gate cannot answer, so it does not answer "covered".`
|
|
56882
|
+
],
|
|
56883
|
+
missing: [],
|
|
56884
|
+
declared: 0,
|
|
56885
|
+
captured: 0
|
|
56886
|
+
};
|
|
56887
|
+
}
|
|
56873
56888
|
if (!declared.length) return { ok: true, issues: [], missing: [], declared: 0, captured: 0 };
|
|
56874
56889
|
let captured = /* @__PURE__ */ new Set();
|
|
56875
56890
|
try {
|
package/src/check.ts
CHANGED
|
@@ -362,14 +362,36 @@ export interface SampleCoverage {
|
|
|
362
362
|
export function checkSampleCaptured(root = ".", lang: Lang = "en"): SampleCoverage {
|
|
363
363
|
const fr = lang === "fr";
|
|
364
364
|
let declared: { id: string; name?: string; url?: string }[] = [];
|
|
365
|
+
const rc = join(root, ".ultra11yrc.json");
|
|
366
|
+
let raw: string;
|
|
365
367
|
try {
|
|
366
|
-
|
|
367
|
-
sample?: { pages?: { id: string; name?: string; url?: string }[] };
|
|
368
|
-
};
|
|
369
|
-
declared = cfg.sample?.pages ?? [];
|
|
368
|
+
raw = readFileSync(rc, "utf8");
|
|
370
369
|
} catch {
|
|
370
|
+
// NO CONFIG AT ALL — nothing is declared, so there is nothing to answer for. This is the
|
|
371
|
+
// one silence that may pass: a gate that fails on its own absence is a gate that gets
|
|
372
|
+
// turned off.
|
|
371
373
|
return { ok: true, issues: [], missing: [], declared: 0, captured: 0 };
|
|
372
374
|
}
|
|
375
|
+
try {
|
|
376
|
+
const cfg = JSON.parse(raw) as { sample?: { pages?: { id: string; name?: string; url?: string }[] } };
|
|
377
|
+
declared = cfg.sample?.pages ?? [];
|
|
378
|
+
} catch (e) {
|
|
379
|
+
// A CONFIG THAT EXISTS AND CANNOT BE READ is the opposite case, and it must not pass. The
|
|
380
|
+
// file is where the sample is declared, so an unparseable one means this gate does not know
|
|
381
|
+
// what the run was supposed to cover — and answering "covered" to that is how a gate
|
|
382
|
+
// disarms itself at exactly the moment something is wrong.
|
|
383
|
+
return {
|
|
384
|
+
ok: false,
|
|
385
|
+
issues: [
|
|
386
|
+
fr
|
|
387
|
+
? `.ultra11yrc.json est présent mais illisible (${e instanceof Error ? e.message : String(e)}) — impossible de savoir quelles pages ce run devait couvrir. La porte de couverture ne peut pas répondre, et ne répondra donc pas « couvert ».`
|
|
388
|
+
: `.ultra11yrc.json is present but unreadable (${e instanceof Error ? e.message : String(e)}) — there is no way to know which pages this run was meant to cover. The coverage gate cannot answer, so it does not answer "covered".`,
|
|
389
|
+
],
|
|
390
|
+
missing: [],
|
|
391
|
+
declared: 0,
|
|
392
|
+
captured: 0,
|
|
393
|
+
};
|
|
394
|
+
}
|
|
373
395
|
if (!declared.length) return { ok: true, issues: [], missing: [], declared: 0, captured: 0 };
|
|
374
396
|
|
|
375
397
|
let captured = new Set<string>();
|
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.14.
|
|
3
|
+
export const VERSION = "5.14.3";
|
|
4
4
|
export const SCHEMA_VERSION = 2;
|
|
5
5
|
|
|
6
6
|
// Lang = the UI FRAME's language — the `L` localization tables each module (report,
|