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.
@@ -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.0",
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.0",
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.0",
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.0";
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.0",
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",
@@ -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.0";
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: pageStatus(c2, pf, p.basis),
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.0
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.0";
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: pageStatus(c2, pf, p.basis),
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);
@@ -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.0
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.0";
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: pageStatus(c2, pf, p.basis),
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"; // not applicable in scope ⇒ not applicable here
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: pageStatus(c, pf, p.basis),
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.0";
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,