ultra11y 5.5.0 → 5.5.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.5.0",
13
+ "version": "5.5.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.5.0",
4
+ "version": "5.5.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.5.0",
4
+ "version": "5.5.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.5.0";
30
+ const ULTRA11Y_PLUGIN_VERSION = "5.5.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.5.0",
3
+ "version": "5.5.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.5.0";
9
+ var VERSION = "5.5.1";
10
10
  var SCHEMA_VERSION = 2;
11
11
 
12
12
  // src/audit.ts
@@ -5456,8 +5456,11 @@ function snippet(doc, el, max = 120) {
5456
5456
  const lineStart = doc.lineStarts[el.line - 1] ?? 0;
5457
5457
  let end = doc.source.indexOf("\n", lineStart);
5458
5458
  if (end === -1) end = doc.source.length;
5459
- const raw = doc.source.slice(lineStart, end).trim();
5460
- return raw.length > max ? raw.slice(0, max - 1) + "\u2026" : raw;
5459
+ const from = Math.min(Math.max(el.start, lineStart), end);
5460
+ const tagEnd = doc.source.indexOf(">", from);
5461
+ const to = Math.min(from + max, Math.max(Math.min(end, from + max), tagEnd === -1 ? end : tagEnd + 1));
5462
+ const raw = doc.source.slice(from, Math.min(to, doc.source.length)).replace(/\s+/g, " ").trim();
5463
+ return raw.length > max ? `${raw.slice(0, max - 1)}\u2026` : raw;
5461
5464
  }
5462
5465
 
5463
5466
  // src/parse/jsx.ts
@@ -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.5.0
8
+ version: 5.5.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.5.0";
9
+ var VERSION = "5.5.1";
10
10
  var SCHEMA_VERSION = 2;
11
11
 
12
12
  // src/audit.ts
@@ -5456,8 +5456,11 @@ function snippet(doc, el, max = 120) {
5456
5456
  const lineStart = doc.lineStarts[el.line - 1] ?? 0;
5457
5457
  let end = doc.source.indexOf("\n", lineStart);
5458
5458
  if (end === -1) end = doc.source.length;
5459
- const raw = doc.source.slice(lineStart, end).trim();
5460
- return raw.length > max ? raw.slice(0, max - 1) + "\u2026" : raw;
5459
+ const from = Math.min(Math.max(el.start, lineStart), end);
5460
+ const tagEnd = doc.source.indexOf(">", from);
5461
+ const to = Math.min(from + max, Math.max(Math.min(end, from + max), tagEnd === -1 ? end : tagEnd + 1));
5462
+ const raw = doc.source.slice(from, Math.min(to, doc.source.length)).replace(/\s+/g, " ").trim();
5463
+ return raw.length > max ? `${raw.slice(0, max - 1)}\u2026` : raw;
5461
5464
  }
5462
5465
 
5463
5466
  // src/parse/jsx.ts
@@ -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.5.0
7
+ version: 5.5.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.5.0";
9
+ var VERSION = "5.5.1";
10
10
  var SCHEMA_VERSION = 2;
11
11
 
12
12
  // src/audit.ts
@@ -5456,8 +5456,11 @@ function snippet(doc, el, max = 120) {
5456
5456
  const lineStart = doc.lineStarts[el.line - 1] ?? 0;
5457
5457
  let end = doc.source.indexOf("\n", lineStart);
5458
5458
  if (end === -1) end = doc.source.length;
5459
- const raw = doc.source.slice(lineStart, end).trim();
5460
- return raw.length > max ? raw.slice(0, max - 1) + "\u2026" : raw;
5459
+ const from = Math.min(Math.max(el.start, lineStart), end);
5460
+ const tagEnd = doc.source.indexOf(">", from);
5461
+ const to = Math.min(from + max, Math.max(Math.min(end, from + max), tagEnd === -1 ? end : tagEnd + 1));
5462
+ const raw = doc.source.slice(from, Math.min(to, doc.source.length)).replace(/\s+/g, " ").trim();
5463
+ return raw.length > max ? `${raw.slice(0, max - 1)}\u2026` : raw;
5461
5464
  }
5462
5465
 
5463
5466
  // src/parse/jsx.ts
package/src/parse/html.ts CHANGED
@@ -261,10 +261,32 @@ export function allIds(doc: Doc): { id: string; el: El }[] {
261
261
  }
262
262
 
263
263
  /** The source line(s) the element starts on, trimmed and truncated. */
264
+ /** The source text that SHOWS this element, bounded to `max`.
265
+ *
266
+ * Anchored at the element's own offset, not at the start of its line. On hand-written source
267
+ * the two are the same thing once indentation is trimmed — but a serialized DOM capture is a
268
+ * SINGLE LINE, so anchoring on the line handed back the document head for every element in
269
+ * the page, identical for all of them. Measured on a real capture: every one of 128 form
270
+ * controls carried `<html data-fr-scheme="system" lang="fr">…` as its snippet, which tells a
271
+ * reader nothing and gives the grounding check nothing to match on.
272
+ *
273
+ * The line still bounds the slice, so a multi-line element shows its opening tag rather than
274
+ * its whole subtree. */
264
275
  export function snippet(doc: Doc, el: El, max = 120): string {
265
276
  const lineStart = doc.lineStarts[el.line - 1] ?? 0;
266
277
  let end = doc.source.indexOf("\n", lineStart);
267
278
  if (end === -1) end = doc.source.length;
268
- const raw = doc.source.slice(lineStart, end).trim();
269
- return raw.length > max ? raw.slice(0, max - 1) + "…" : raw;
279
+ const from = Math.min(Math.max(el.start, lineStart), end);
280
+ // A JSX element usually opens on one line and carries its attributes on the next ones, so
281
+ // stopping at the line break showed "<a" and nothing else. Read to the end of the OPENING
282
+ // TAG instead — that is what identifies the element — and collapse the whitespace, which
283
+ // grounding normalises on both sides anyway (src/grounding.ts).
284
+ //
285
+ // The opening tag and not the element: a snippet longer than `max` gets an ellipsis, and an
286
+ // ellipsis is not in the source, so `includes` stops matching and grounding refuses a
287
+ // citation that was perfectly real. Keeping the slice short keeps it verbatim.
288
+ const tagEnd = doc.source.indexOf(">", from);
289
+ const to = Math.min(from + max, Math.max(Math.min(end, from + max), tagEnd === -1 ? end : tagEnd + 1));
290
+ const raw = doc.source.slice(from, Math.min(to, doc.source.length)).replace(/\s+/g, " ").trim();
291
+ return raw.length > max ? `${raw.slice(0, max - 1)}…` : raw;
270
292
  }
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.5.0";
3
+ export const VERSION = "5.5.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,