jig-ui 0.24.0 → 0.26.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,149 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.26.0 (2026-10-13)
4
+
5
+ An unbranded page that looks designed, tables that hold together on a phone and
6
+ on a touch screen, and two layout faults the render probe now measures.
7
+
8
+ ### Fixed
9
+
10
+ - **An unbranded page no longer reads as unstyled.** The default font stack put
11
+ `system-ui` first, and on Linux that resolves to the desktop's own font,
12
+ often DejaVu Sans, before any better face is tried. It now names each
13
+ platform's interface face in turn: San Francisco, Segoe UI, Roboto, then
14
+ Noto Sans, Helvetica and Arial. The `A-138` serif check knows these names,
15
+ so the stack is not read as a serif for ending in `sans-serif`.
16
+ - **A table stacked on a phone leads with what each row is.** `L-01`, step 6,
17
+ told an agent to put each column's name in front of every cell, and a member
18
+ list on a phone read like a form: "Member:", "Email:", "Role:", "Status:".
19
+ The row's own name now leads its block with no label, a value that says what
20
+ it is (an email, a role, a status) gets none, and the row's actions sit
21
+ together on one line where they fit, with no "Actions" label. In three runs,
22
+ every row kept its actions on one line at 390px.
23
+ - **A table's rows stay one height.** `operator`'s 36px row is below the 48px
24
+ touch target, and an agent met the floor with a control's own minimum
25
+ height, so rows with an action stood taller than rows without one. A control
26
+ in a row now takes the row's height. For a mouse a dense row is above WCAG
27
+ 2.2's 24px minimum; for a finger it is not, so under a coarse pointer
28
+ `operator` and `product` raise their row tokens to the touch target, and
29
+ every row grows together.
30
+
31
+ ### Added
32
+
33
+ - **The render probe reports a page that scrolls sideways, with or without a
34
+ review.** A page wider than the screen was reported only when a critique had
35
+ called it clean; with no critique the measurement was dropped. Help articles
36
+ built without Jig ran 424 to 478px wide on a 360px phone, with nothing
37
+ reported. It is now a measured failure in every mode (`D-115`).
38
+ - **The render probe reports a table cell that has left its table.** An agent
39
+ set a cell to `display: flex` to line up a name and a tag; the cell stopped
40
+ taking its row's height, and every name drifted above its row's divider. Any
41
+ `td` or `th` that is not a table cell while its table is drawn as a table is
42
+ now a measured failure (`P-06`), which also says to put the flex on a wrapper
43
+ inside the cell. A table stacked on a phone is left out.
44
+
45
+ ## 0.25.0 (2026-10-09)
46
+
47
+ Link previews, code and tables that reflow on an `editorial` phone, and the
48
+ gate's rules stated before a session stops.
49
+
50
+ ### Added
51
+
52
+ - **The render probe measures a box that scrolls sideways.** `editorial`
53
+ allows no scrolling region on a phone (`M-01`), and the probe only measured
54
+ a page wider than the screen. In a control run on this release's reflow
55
+ text, a spec said the code would wrap and the built page scrolled it in a
56
+ box, and nothing caught it. The probe now records each box that scrolls
57
+ sideways, and on an `editorial` surface at phone width each is a measured
58
+ failure: a critique reports it, `ship` counts it, and the gate holds make and
59
+ tweak until the page reflows.
60
+ - **J-164: an indexable page a link preview cannot read.** A page pasted into a
61
+ message or a post is met as a card before anyone opens it, and the card is
62
+ built from `og:title` and `og:description`. Section J said it covered the link
63
+ preview, and no rule asked for one, so `seo` and `check` passed a site with no
64
+ preview on any page. `check` reports it in a file that writes its own
65
+ `<head>`, and in a head fragment (`<svelte:head>`, Astro, `next/head`) that
66
+ writes the page's own description and no `og:description`, which no layout
67
+ can supply; elsewhere a layout may write it, and the render decides: the probe
68
+ now reads `og:description`, and a served page missing either tag is a
69
+ finding on the page. An image and `og:url` need the page's full address, so
70
+ the rule asks for them once a site has one. 160 rules, 40 of them decided by
71
+ a machine.
72
+
73
+ ### Changed
74
+
75
+ - **`editorial` on a phone says what replaces a scrolling box.** `L-01` sent a
76
+ wide code block or table to scroll inside itself, and the same sentence said
77
+ `editorial` allows no scrolling region on mobile, naming nothing in its
78
+ place. `L-01`, `D-115` and `M-01` now say it: a code block keeps its line
79
+ breaks and indents and wraps its long lines, a table too wide for the screen
80
+ stacks its rows with each cell's column name in front and stays a `<table>`,
81
+ and a long identifier breaks where it must.
82
+ - **`E-51`'s near-universal glyphs are a test, not a list.** Close, search and
83
+ menu were read as the only icon-only controls allowed. The rule now asks
84
+ whether most readers would name the glyph the same way without its label,
85
+ with examples that pass (a theme's sun and moon, a well-known service's mark)
86
+ and that do not.
87
+ - **`E-28` says what a browser's own tab stop on an `<iframe>` gets.** One that
88
+ only shows something is taken out of the tab order rather than given states;
89
+ one the reader uses keeps its stop and shows focus.
90
+ - **spec, mockup and tweak each end with what the gate holds them to.** A short
91
+ "Before you stop" list names the checks the Stop hook makes on what that
92
+ command records, beyond the shape its steps already teach: where it may write, whose words a quotation is, the check record's
93
+ format, what counts as the owner's confirmation or approval, and what
94
+ `tweak.json` holds. Sessions learned these from refusals, and each refusal
95
+ cost a round of fixing, re-checking and committing. A test pairs each check
96
+ with its line in the list, so a check added without one fails.
97
+ - **`jig check` exits non-zero on a mechanical error, with or without `--ci`.**
98
+ It used to exit 0 whatever it found, so a pre-commit hook, a CI step or a
99
+ script running it as a linter read a run full of errors as a pass. Judgment
100
+ findings are still reported without failing the run. `--ci` now only limits
101
+ the run to the mechanical rules.
102
+
103
+ ### Fixed
104
+
105
+ - **The skill and `spec` say `L-01` has six steps, and `spec` names the sixth.**
106
+ `L-01` gained step 6, how a screen collapses, and both kept telling the agent
107
+ to run "its five steps", so it stopped before the one that gives the phone
108
+ composition. In a control run on this release's reflow text, a spec chose a
109
+ sideways-scrolling code block for an `editorial` phone. A test now ties the
110
+ count to `L-01`'s own step headings.
111
+ - **`I-118` exempts quoted output in the rule and in `check`, as the probe
112
+ already did.** The rule exempted a quotation in `<blockquote>` or `<q>`; the
113
+ render probe also leaves `<pre>`, `<code>`, `<samp>` and `<kbd>` alone, and
114
+ `check` exempted none of them. A page quoting a tool's real output was told
115
+ by `check` to rewrite it, and by the rule to keep the quotation's own
116
+ punctuation. All three now agree.
117
+ - **A critique is no longer held on what the page fails.** An em dash on the
118
+ rendered page, a missing or overlong title or description, unresolved tokens
119
+ or the browser's default font are failures of the page, not of the review.
120
+ `verdicts` reported them as a critique left incomplete, so the gate held the
121
+ critique session until they were gone, and the session could clear them only
122
+ by editing the page, which a critique never does. They are now listed apart,
123
+ under `!`, as `measured=` on the `JIG_VERDICTS` line, and once each rather than
124
+ at every width. A critique reports them and finishes; `ship` counts them as
125
+ findings, and the gate holds make and tweak until the page is fixed. A verdict
126
+ the probe contradicts still means the review re-runs.
127
+ - **A quoted `mockup:` value reads as the value it holds.** A spec that wrote
128
+ `mockup: "skipped — the owner: \"…\""`, valid YAML, read to the gate as the
129
+ word `"skipped`, so every tweak of the page was refused for having no approved
130
+ drawing, and the check that the owner's words are quoted was silently skipped.
131
+ - **An em dash inside tool output no longer counts as the page's own.** The
132
+ probe leaves quotations and `<pre>`, `<code>`, `<samp>` and `<kbd>` out of the
133
+ dash scan, but it cut them out of the page's text one string at a time. An
134
+ inline `<code>` earlier in the prose, such as a rule id, removed those
135
+ characters from the output block below it, the block no longer matched, and
136
+ its dash was reported. Quotations are now left out of the text as it is read.
137
+ - **The README no longer says every command is also a slash command.** `gate`
138
+ has no slash form (only the Stop hook runs it), and six slash commands are
139
+ agent procedures with no command of their own in the CLI. The table under it
140
+ was right; the sentence above it now says what the table does.
141
+ - **`check` no longer says it examined nothing while reporting findings.** A
142
+ file styled only with utility classes, such as `class="p-[13px]"`, is read by
143
+ H-47 but was left out of the styled-file count. A change to such a file
144
+ reported H-47 errors and, below them, that no file carried a style region. The
145
+ count now includes markup whose class attributes hold classes.
146
+
3
147
  ## 0.24.0 (2026-09-30)
4
148
 
5
149
  The owner's word held to one rule, Jig's instructions in your project's AGENTS.md,
@@ -237,8 +381,7 @@ and `jig ship` is where nothing is optional.
237
381
 
238
382
  ## 0.21.0 (2026-09-28)
239
383
 
240
- Dev builds, so a fix is tried on a real project before it ships, and the gate
241
- fixes that trial on jig-site turned up.
384
+ Dev builds, so a fix is tried on a real project before it ships, and gate fixes that trial turned up.
242
385
 
243
386
  ### Added
244
387
 
@@ -520,7 +663,7 @@ The gate holds an HTML mockup that does not draw the page at every size.
520
663
 
521
664
  ## 0.18.4 (2026-09-25)
522
665
 
523
- Every release summary is one or two lines, for jig-site's Versions page.
666
+ Every release summary is one or two lines.
524
667
 
525
668
  ### Changed
526
669
 
@@ -552,8 +695,7 @@ older probe file says it is older rather than forged.
552
695
 
553
696
  ## 0.18.2 (2026-09-25)
554
697
 
555
- Every release in this changelog now carries its date and a one-line summary,
556
- for jig-site's Versions page.
698
+ Every release in this changelog now carries its date and a one-line summary.
557
699
 
558
700
  ### Changed
559
701
 
@@ -567,8 +709,7 @@ for jig-site's Versions page.
567
709
 
568
710
  ## 0.18.1 (2026-09-25)
569
711
 
570
- Two fixes found by jig-site's fourth round: the probe misread a `<details>`
571
- menu, and the emoji rule missed an arrow that renders as an emoji.
712
+ Two fixes: the probe misread a `<details>` menu, and the emoji rule missed an arrow that renders as an emoji.
572
713
 
573
714
  ### Fixed
574
715
 
@@ -637,7 +778,7 @@ keyboard access a rule requires fits every script budget.
637
778
 
638
779
  ## 0.17.3 (2026-09-25)
639
780
 
640
- Three defects found building jig-site's header with the full loop.
781
+ Three defects found building a site header with the full loop.
641
782
 
642
783
  ### Fixed
643
784
 
package/README.md CHANGED
@@ -27,13 +27,13 @@ later.
27
27
  Jig is **a skill your coding agent reads**, and **a CLI you can run yourself**.
28
28
  They are two halves of the same thing, and the split is not arbitrary:
29
29
 
30
- - Of the 159 rules, **39 can be decided by a machine** — a hard-coded colour, a
30
+ - Of the 160 rules, **40 can be decided by a machine** — a hard-coded colour, a
31
31
  contrast ratio below the floor, a removed focus ring. The CLI decides those.
32
32
  - The other **120 are judgment** — whether an empty state says anything useful,
33
33
  whether a label reads as an instruction, whether motion earns its place. No
34
34
  regex settles those. An agent reads the rules and applies them.
35
35
 
36
- Running only the CLI gets you the 39. Running only the agent gets you the 120 with
36
+ Running only the CLI gets you the 40. Running only the agent gets you the 120 with
37
37
  no verification. **A clean `jig check` is not a clean review**, and the skill
38
38
  says so to every agent that reads it.
39
39
 
@@ -406,7 +406,7 @@ overwrites a config or brand file you have edited.
406
406
  | --- | --- |
407
407
  | `install --agent <name> [--scope project\|global] [--hook]` | Puts the skill and its rules where your agent will find them. At project scope, also keeps Jig's block in `AGENTS.md` (and `CLAUDE.md` for Claude Code); with `--hook`, adds the Stop hook. |
408
408
  | `init [--yes]` | Sets the project up: CSS system, brand colour, token files, `jig.config.json`, wired imports, baseline check. |
409
- | `check [--all] [--ci] [--json]` | Runs the rules a machine can decide. Reports findings by rule id. |
409
+ | `check [--all] [--ci] [--json]` | Runs the rules a machine can decide. Reports findings by rule id, and exits non-zero on any mechanical error. |
410
410
  | `update` | Refreshes an install to a newer version, leaving alone any file you have edited. |
411
411
  | `seo [--json]` | Audits what a search engine and a link preview read, across the whole project: a route whose metadata says `noindex` sitting in the sitemap, two pages claiming one title, a sitemap that lists nothing or lists paths a crawler drops. Whether a sitemap and a robots file exist is counted, not reported: no rule asks for either, and a site with no domain yet cannot write an honest sitemap. Needs no config, no decisions and no spec. |
412
412
  | `checksum <spec>` | Prints a spec's checksum, the value its `.checked.json` records as `spec`, so the spec's reader never computes it by hand. |
@@ -422,7 +422,7 @@ Flags worth knowing:
422
422
  | --- | --- |
423
423
  | `check --all` | Scan the whole repo instead of just changed files. Use on a first run. |
424
424
  | `explain --list` | Every rule id and title. Add a section letter (`explain G --list`) for one section. |
425
- | `check --ci` | Mechanical bucket only — deterministic, and exits non-zero on any error. |
425
+ | `check --ci` | Mechanical bucket only, so the run is deterministic. |
426
426
  | `check --json` | Machine-readable findings, for tooling or for reading every finding when the terminal output elides repeats. |
427
427
  | `init --yes` | Non-interactive; accept every derived default. |
428
428
  | `install --scope global` | Install once for every project. |
@@ -435,9 +435,12 @@ mean it could never move.
435
435
 
436
436
  ### As slash commands
437
437
 
438
- Every command is also a slash command in your agent, installed alongside the
439
- skill. `/jig check --all` does what `npx jig-ui check --all` does, and then acts
440
- on the result — the CLI reports, the agent applies the judgment half.
438
+ Every command but `gate`, which only the Stop hook runs, is also a slash command
439
+ in your agent, installed alongside the skill. `/jig check --all` does what
440
+ `npx jig-ui check --all` does, and then acts on the result — the CLI reports, the
441
+ agent applies the judgment half. Six slash commands are agent procedures with no
442
+ command of their own in the CLI: `decide`, `spec`, `mockup`, `make`, `critique` and
443
+ `tweak` (`critique` runs `verdicts` and `probe` along the way).
441
444
 
442
445
  | Slash command | Equivalent |
443
446
  | --- | --- |
@@ -642,7 +645,8 @@ metadata in the same change as the headline, and `check` holds the budgets.
642
645
 
643
646
  **Which pages are meant to be found is decided by mode, not by taste.**
644
647
  `editorial` is first-visit content, so it is indexable and needs its own title
645
- and description. `product` and `operator` are what somebody reaches after signing
648
+ and description, and its own link preview (`og:title` and `og:description`) for
649
+ the card a pasted link shows. `product` and `operator` are what somebody reaches after signing
646
650
  in, so they must carry `noindex` — an admin screen in a search result is an
647
651
  invitation, and a sign-in page in one invites credential stuffing. A spec
648
652
  overrides the default per page, with a reason: a CV shared by link, a
@@ -697,7 +701,7 @@ No agent required. `check` is a linter with a design system behind it.
697
701
  ```bash
698
702
  npx jig-ui@latest check --all # everything
699
703
  npx jig-ui@latest check # just what changed
700
- npx jig-ui@latest check --ci # for CI: deterministic, non-zero on error
704
+ npx jig-ui@latest check --ci # for CI: mechanical rules only, deterministic
701
705
  npx jig-ui@latest check --json # for tooling
702
706
  ```
703
707
 
@@ -793,7 +797,7 @@ treatment.
793
797
 
794
798
  | File | Contents |
795
799
  | --- | --- |
796
- | `rules/00-anti-patterns.md` | 128 universal rules with corrections |
800
+ | `rules/00-anti-patterns.md` | 129 universal rules with corrections |
797
801
  | `rules/01-modes.md` | `editorial` / `product` / `operator` profiles |
798
802
  | `rules/02-tokens.md` | Token contract, naming, consumption |
799
803
  | `rules/03-patterns.md` | Component anatomy and behaviour |