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 +149 -8
- package/README.md +14 -10
- package/dist/index.js +274 -168
- package/examples/J-164.html +7 -0
- package/package.json +2 -2
- package/rules/00-anti-patterns.md +8 -2
- package/rules/01-modes.md +2 -2
- package/rules/02-tokens.md +10 -0
- package/rules/03-patterns.md +22 -4
- package/rules/05-copy.md +1 -1
- package/rules.index.json +7 -0
- package/templates/COMMAND.md.tmpl +72 -7
- package/templates/SKILL.md.tmpl +1 -1
- package/tokens/brand.default.css +6 -2
- package/tokens/mode.operator.css +9 -0
- package/tokens/mode.product.css +7 -0
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
439
|
-
|
|
440
|
-
on the result — the CLI reports, the
|
|
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
|
|
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:
|
|
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` |
|
|
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 |
|