jig-ui 0.23.0 → 0.25.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,208 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.25.0 (2026-10-09)
4
+
5
+ Link previews, code and tables that reflow on an `editorial` phone, and the
6
+ gate's rules stated before a session stops.
7
+
8
+ ### Added
9
+
10
+ - **The render probe measures a box that scrolls sideways.** `editorial`
11
+ allows no scrolling region on a phone (`M-01`), and the probe only measured
12
+ a page wider than the screen. In a control run on this release's reflow
13
+ text, a spec said the code would wrap and the built page scrolled it in a
14
+ box, and nothing caught it. The probe now records each box that scrolls
15
+ sideways, and on an `editorial` surface at phone width each is a measured
16
+ failure: a critique reports it, `ship` counts it, and the gate holds make and
17
+ tweak until the page reflows.
18
+ - **J-164: an indexable page a link preview cannot read.** A page pasted into a
19
+ message or a post is met as a card before anyone opens it, and the card is
20
+ built from `og:title` and `og:description`. Section J said it covered the link
21
+ preview, and no rule asked for one, so `seo` and `check` passed a site with no
22
+ preview on any page. `check` reports it in a file that writes its own
23
+ `<head>`, and in a head fragment (`<svelte:head>`, Astro, `next/head`) that
24
+ writes the page's own description and no `og:description`, which no layout
25
+ can supply; elsewhere a layout may write it, and the render decides: the probe
26
+ now reads `og:description`, and a served page missing either tag is a
27
+ finding on the page. An image and `og:url` need the page's full address, so
28
+ the rule asks for them once a site has one. 160 rules, 40 of them decided by
29
+ a machine.
30
+
31
+ ### Changed
32
+
33
+ - **`editorial` on a phone says what replaces a scrolling box.** `L-01` sent a
34
+ wide code block or table to scroll inside itself, and the same sentence said
35
+ `editorial` allows no scrolling region on mobile, naming nothing in its
36
+ place. `L-01`, `D-115` and `M-01` now say it: a code block keeps its line
37
+ breaks and indents and wraps its long lines, a table too wide for the screen
38
+ stacks its rows with each cell's column name in front and stays a `<table>`,
39
+ and a long identifier breaks where it must.
40
+ - **`E-51`'s near-universal glyphs are a test, not a list.** Close, search and
41
+ menu were read as the only icon-only controls allowed. The rule now asks
42
+ whether most readers would name the glyph the same way without its label,
43
+ with examples that pass (a theme's sun and moon, a well-known service's mark)
44
+ and that do not.
45
+ - **`E-28` says what a browser's own tab stop on an `<iframe>` gets.** One that
46
+ only shows something is taken out of the tab order rather than given states;
47
+ one the reader uses keeps its stop and shows focus.
48
+ - **spec, mockup and tweak each end with what the gate holds them to.** A short
49
+ "Before you stop" list names the checks the Stop hook makes on what that
50
+ command records, beyond the shape its steps already teach: where it may write, whose words a quotation is, the check record's
51
+ format, what counts as the owner's confirmation or approval, and what
52
+ `tweak.json` holds. Sessions learned these from refusals, and each refusal
53
+ cost a round of fixing, re-checking and committing. A test pairs each check
54
+ with its line in the list, so a check added without one fails.
55
+ - **`jig check` exits non-zero on a mechanical error, with or without `--ci`.**
56
+ It used to exit 0 whatever it found, so a pre-commit hook, a CI step or a
57
+ script running it as a linter read a run full of errors as a pass. Judgment
58
+ findings are still reported without failing the run. `--ci` now only limits
59
+ the run to the mechanical rules.
60
+
61
+ ### Fixed
62
+
63
+ - **The skill and `spec` say `L-01` has six steps, and `spec` names the sixth.**
64
+ `L-01` gained step 6, how a screen collapses, and both kept telling the agent
65
+ to run "its five steps", so it stopped before the one that gives the phone
66
+ composition. In a control run on this release's reflow text, a spec chose a
67
+ sideways-scrolling code block for an `editorial` phone. A test now ties the
68
+ count to `L-01`'s own step headings.
69
+ - **`I-118` exempts quoted output in the rule and in `check`, as the probe
70
+ already did.** The rule exempted a quotation in `<blockquote>` or `<q>`; the
71
+ render probe also leaves `<pre>`, `<code>`, `<samp>` and `<kbd>` alone, and
72
+ `check` exempted none of them. A page quoting a tool's real output was told
73
+ by `check` to rewrite it, and by the rule to keep the quotation's own
74
+ punctuation. All three now agree.
75
+ - **A critique is no longer held on what the page fails.** An em dash on the
76
+ rendered page, a missing or overlong title or description, unresolved tokens
77
+ or the browser's default font are failures of the page, not of the review.
78
+ `verdicts` reported them as a critique left incomplete, so the gate held the
79
+ critique session until they were gone, and the session could clear them only
80
+ by editing the page, which a critique never does. They are now listed apart,
81
+ under `!`, as `measured=` on the `JIG_VERDICTS` line, and once each rather than
82
+ at every width. A critique reports them and finishes; `ship` counts them as
83
+ findings, and the gate holds make and tweak until the page is fixed. A verdict
84
+ the probe contradicts still means the review re-runs.
85
+ - **A quoted `mockup:` value reads as the value it holds.** A spec that wrote
86
+ `mockup: "skipped — the owner: \"…\""`, valid YAML, read to the gate as the
87
+ word `"skipped`, so every tweak of the page was refused for having no approved
88
+ drawing, and the check that the owner's words are quoted was silently skipped.
89
+ - **An em dash inside tool output no longer counts as the page's own.** The
90
+ probe leaves quotations and `<pre>`, `<code>`, `<samp>` and `<kbd>` out of the
91
+ dash scan, but it cut them out of the page's text one string at a time. An
92
+ inline `<code>` earlier in the prose, such as a rule id, removed those
93
+ characters from the output block below it, the block no longer matched, and
94
+ its dash was reported. Quotations are now left out of the text as it is read.
95
+ - **The README no longer says every command is also a slash command.** `gate`
96
+ has no slash form (only the Stop hook runs it), and six slash commands are
97
+ agent procedures with no command of their own in the CLI. The table under it
98
+ was right; the sentence above it now says what the table does.
99
+ - **`check` no longer says it examined nothing while reporting findings.** A
100
+ file styled only with utility classes, such as `class="p-[13px]"`, is read by
101
+ H-47 but was left out of the styled-file count. A change to such a file
102
+ reported H-47 errors and, below them, that no file carried a style region. The
103
+ count now includes markup whose class attributes hold classes.
104
+
105
+ ## 0.24.0 (2026-09-30)
106
+
107
+ The owner's word held to one rule, Jig's instructions in your project's AGENTS.md,
108
+ and Jig tested on Linux, macOS and Windows.
109
+
110
+ ### Added
111
+
112
+ - **`jig checksum <spec>`** prints a spec's checksum, the value its
113
+ `.checked.json` records. It had been left to agents to compute from the
114
+ procedure's description, and a hand-computed value was easily wrong.
115
+ - **`route:` is a spec field**, for a page whose surface name does not say where
116
+ it is served.
117
+ - **Your project's `AGENTS.md` carries Jig's instructions for your agent.**
118
+ `init`, `install` and `update` create the file if it is missing, or add Jig's
119
+ block to the one you have: load the skill before UI work, how the loop runs,
120
+ the owner's-word rule, and what each of Jig's files is for. With Claude Code,
121
+ a block in `CLAUDE.md` imports it, so every session loads it. Jig owns only
122
+ what is between its markers. `check` reports the block missing or edited,
123
+ `ship` is not ready without it, the Stop hook holds a session that removed it,
124
+ and `jig update` puts it back.
125
+
126
+ ### Changed
127
+
128
+ - **The owner's word is held to one rule, everywhere Jig records it.** A spec
129
+ confirmed, a drawing approved or skipped, a re-judge left for later, a tweak's
130
+ change and a decision's reason are each the owner's own words, and words that
131
+ say that thing: a remark about the layout is not a skip of the mockup, and a
132
+ yes to one question is not a yes to the spec. One check now covers all of
133
+ them. Three had no check before: `confirmed: true` needs the owner's yes to
134
+ being asked, a tweak's `change` must be words they said, and `decide`'s quoted
135
+ reasons must be too. The skill states the rule.
136
+ - **A field Jig does not read is refused where it would be written.** When the
137
+ procedure named no place for something, agents invented one: front-matter
138
+ keys, verdict ids, JSON fields that nothing reads, so what they said reached
139
+ no check. A spec key a session adds, a verdict-file field holding a list or an
140
+ object, and an unknown tweak.json field are now refused, each pointing at the
141
+ place that exists. Keys a spec already had are not held against it.
142
+ - **A spec is drafted where Jig reads it, and checked as itself.** It is written
143
+ at `.jig/specs/<name>.spec.md` from the first draft, and its shape is checked
144
+ before the owner is asked to confirm it. Asking to confirm a spec that is not
145
+ there is refused, and so is finishing a spec session without writing it. A
146
+ named spec is never checked in place of another page's.
147
+ - **A critique files one problem once.** A difference goes under `differences`
148
+ only when no rule or decision already holds it, so the counts `ship` reports
149
+ count problems, not entries.
150
+ - **The gate asks for the probe files it re-takes to be committed.** It renders
151
+ a changed page again as a session stops, after the last commit; like the
152
+ lock, it now stops once to have those files committed on their own.
153
+ - **`jig gate` run by hand reports and renders nothing.** Without a transcript
154
+ it cannot tell which pages are in play, and it had re-rendered every one.
155
+ - **`motion: none` can say why**, as in `none — this page adds no movement`.
156
+ - **A file a session never wrote is taken as it found it**, committed or not,
157
+ so a session is not answerable for a draft it found.
158
+
159
+ ### Fixed
160
+
161
+ - **Jig works the same on Linux, macOS and Windows, and is tested on all three.**
162
+ Every change now runs the full suite on each, on Node 22 and 24. The first run
163
+ found that rendering a page needed a WebSocket Node 20 does not have, so Jig
164
+ now needs Node 22 or later (Node 20 is end-of-life) and says so if it is run
165
+ on an older one; and that on Windows no browser was ever found to render with:
166
+ Edge, Chrome installed per user, and commands on PATH are now found.
167
+ - **A project checked out on Windows reads the same as anywhere else.** Git on
168
+ Windows gives files CRLF line endings. Jig parsed a spec with them as having
169
+ no regions at all, a spec's check no longer matched it, and every comparison
170
+ with a file's committed copy read as a change. Every text file Jig parses or
171
+ compares is now read with its line endings normalised.
172
+ - **Two Jig runs at once no longer fail on Windows.** Windows refuses to replace
173
+ a file another process has open, where Linux and macOS allow it; writing a
174
+ file Jig records (the install manifest among them) now retries briefly there,
175
+ and the manifest's lock treats a lock file Windows is still deleting as held
176
+ for a moment, not as an error.
177
+
178
+ - **The docs say what the code does.** The README said `check` reports a
179
+ pre-0.4.0 install's leftovers (only `init` does); the procedure named five
180
+ reasons `ship` owes a page (there are six, one a re-probe) and described the
181
+ spec checksum as leaving out one line where the code leaves out two. Tests
182
+ now fail when the procedure stops naming a state `ship` reports, a line the
183
+ checksum leaves out, or a command the CLI registers.
184
+ - **The README no longer counts the rules `check` decides by hand.** It named
185
+ "the seven mechanical rules" from 0.1.0; it now points at `rules.index.json`.
186
+ - **An `exempt` path works the way you write it.** `./src/card.tsx`,
187
+ `src\\card.tsx` and an absolute path inside the project all mean
188
+ `src/card.tsx`. A path outside the project was dropped without a word; it is
189
+ now named in the report with what to write instead, and a bare file name that
190
+ matches nothing is answered with where that file is.
191
+ - **A fact's `source` that holds a sentence** is told to put it in `note`.
192
+ - **The README says what Jig does.** It said `init` was the only command that
193
+ writes into your repo and that nothing of Jig's is kept in it (a project-scope
194
+ install writes the skill and rules into your repo's agent folder); pointed
195
+ agents at `AGENTS.md`, which users do not receive; counted 95 rules the CLI
196
+ cannot decide (it is 120), two critique readers (three) and four per-page
197
+ commands; described `check --ci` as errors only; said the token layer changes
198
+ nothing on the page, beside a `color-scheme` line that does; and claimed Jig
199
+ knows every page that changed, which it does not for a page rendered on
200
+ request. Its `exempt` example named one project's files as if they were a
201
+ pattern; it now explains how to choose your own: a file that renders outside
202
+ your stylesheets, or a page you will not revisit, since `check --all` and
203
+ `ship` read every file. The slash-command table
204
+ lists `verdicts`, `probe` and `checksum`.
205
+
3
206
  ## 0.23.0 (2026-09-29)
4
207
 
5
208
  Rules for the prose a page ships and for how it moves, a spec that says what
package/README.md CHANGED
@@ -2,23 +2,38 @@
2
2
 
3
3
  A design system written to be consumed by coding agents, not read by designers.
4
4
 
5
- Framework-agnostic. Tokens are CSS custom properties; rules are stated in CSS
6
- properties and behaviour, never in one framework's class names.
7
-
8
- Installed as `npx jig-ui` — the bare name was taken on npm.
5
+ **Jig is framework-agnostic.** It works with what you already build with:
6
+
7
+ - **Any framework.** React and Next.js, Vue and Nuxt, Svelte and SvelteKit,
8
+ Astro, Angular, Solid, Rails, Laravel, Django, Phoenix, ASP.NET, or plain
9
+ HTML. `check` reads each one's files as they are (see
10
+ [What `check` covers](#what-check-covers)).
11
+ - **Any way you style.** Plain CSS, SCSS or Less, CSS modules, Tailwind, or
12
+ CSS-in-JS.
13
+ - **Any content.** Pages built ahead of time or rendered from a backend.
14
+ - **Any coding agent.** Claude Code, Codex, Cursor, opencode, Gemini CLI, or any
15
+ other that reads a skill file.
16
+ - **Any operating system.** macOS, Linux and Windows.
17
+
18
+ Nothing in it belongs to one framework: the tokens are CSS custom properties,
19
+ and every rule is stated in CSS properties and behaviour, never in one
20
+ framework's class names.
21
+
22
+ Installed as `npx jig-ui` — the bare name was taken on npm. It needs Node 22 or
23
+ later.
9
24
 
10
25
  ## Two ways to use it
11
26
 
12
27
  Jig is **a skill your coding agent reads**, and **a CLI you can run yourself**.
13
28
  They are two halves of the same thing, and the split is not arbitrary:
14
29
 
15
- - 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
16
31
  contrast ratio below the floor, a removed focus ring. The CLI decides those.
17
32
  - The other **120 are judgment** — whether an empty state says anything useful,
18
33
  whether a label reads as an instruction, whether motion earns its place. No
19
34
  regex settles those. An agent reads the rules and applies them.
20
35
 
21
- 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
22
37
  no verification. **A clean `jig check` is not a clean review**, and the skill
23
38
  says so to every agent that reads it.
24
39
 
@@ -85,24 +100,43 @@ but never adds one.
85
100
 
86
101
  Every agent reads a `skills/jig/SKILL.md`, so adding a new harness is a config
87
102
  change rather than a new code path. Codex uses the cross-agent `.agents/`
88
- directory and additionally gets a short pointer block in `AGENTS.md` — that file
89
- is read into every session, so it names the skill rather than restating it.
103
+ directory.
90
104
 
91
- Install writes the skill file **and its rules** to one place only — beside the
92
- skill file itself. Nothing of Jig's is vendored into your repo; your agent reads
93
- the rules from the install. Installing at project scope when the same agent is
105
+ Install writes the skill file **and its rules** to one place only, beside the
106
+ skill file itself: in your repo's agent folder at project scope (the default),
107
+ in your home directory with `--scope global`. Your agent reads the rules from
108
+ there; nothing is copied into your source. At project scope it also keeps a
109
+ block in `AGENTS.md` (below). Installing at project scope when the same agent is
94
110
  already installed globally warns rather than creating a second, contradicting
95
111
  skill.
96
112
 
113
+ ### Your agent's instructions: `AGENTS.md` and `CLAUDE.md`
114
+
115
+ Most people run Jig through an agent, and `AGENTS.md` is the file agents read at
116
+ the start of every session. So Jig makes sure your project has one: `init`,
117
+ `install` and `update` create it if it is missing, or add Jig's block to the one
118
+ you have. The block is short: load the Jig skill before any UI work, how the
119
+ loop runs, the owner's-word rule, and what each of Jig's files is for.
120
+
121
+ With Claude Code, which reads `CLAUDE.md` instead, Jig also adds a block there
122
+ that imports `AGENTS.md` (`@AGENTS.md`), so every session loads it without the
123
+ agent having to choose to.
124
+
125
+ Jig owns only what sits between its markers, `<!-- jig:start -->` and
126
+ `<!-- jig:end -->`. Write your own instructions above or below the block; Jig
127
+ never reads or changes them. If the block goes missing or is edited, `check`
128
+ says so, `ship` is not ready until it is back, a session that removed it is held
129
+ by the Stop hook, and `jig update` puts it back.
130
+
97
131
  ## Set the project up
98
132
 
99
133
  ```bash
100
134
  npx jig-ui@latest init
101
135
  ```
102
136
 
103
- `init` is the only command that writes into your repo. It runs on a project
104
- with nothing in it and on one with years of CSS, and behaves differently in
105
- each — because the useful thing to do differs.
137
+ `init` sets the project up: the token layer, `jig.config.json`, one import in
138
+ your stylesheet, and Jig's block in `AGENTS.md` for your agent. It runs on a project with nothing in it and on one with years of
139
+ CSS, and behaves differently in each, because the useful thing to do differs.
106
140
 
107
141
  ### An existing site
108
142
 
@@ -157,15 +191,17 @@ set of cards with no list element — rather than a wall.
157
191
  #### When you do run `init`
158
192
 
159
193
  The token layer is a set of custom property declarations. Declarations nothing
160
- references change no pixel, so adding it does not restyle your site.
194
+ references change no pixel, so adding it does not restyle anything you have
195
+ styled. One line is the exception, below.
161
196
 
162
197
  - **Different names never collide.** Your tokens and Jig's sit side by side; each
163
198
  is used by whoever asks for it. You can adopt one token at a time, or none.
164
199
  - **If a name is the same in both, yours wins.** The import goes above your own
165
200
  rules, and the later declaration is the one that applies.
166
201
  - **One line does more than declare a token:** `color-scheme: light dark`, which
167
- tells the browser your page supports both, so scrollbars and form controls
168
- follow the reader's system setting.
202
+ tells the browser your page supports both. On a reader's dark system,
203
+ scrollbars, form controls and any background you have not set yourself turn
204
+ dark. If your site is light only, remove that line from the brand file.
169
205
 
170
206
  #### You decide how it is wired
171
207
 
@@ -233,8 +269,9 @@ are a list. That is the whole loop. Repeat it wherever it is worth repeating.
233
269
  The first `check --all` on a big repo is a long list, and the list is not a
234
270
  to-do. Read it in this order:
235
271
 
236
- 1. **`check --all --ci` first.** Mechanical bucket, errors only, exit code you
237
- can put in CI. It is the short list, and every line on it is decidable.
272
+ 1. **`check --all --ci` first.** The rules a machine decides, and nothing else,
273
+ with an exit code you can put in CI: it fails on any error. It is the short
274
+ list, and every line on it is decidable.
238
275
  2. **Then warnings, by rule rather than by file.** The report groups by rule id,
239
276
  and a rule firing forty times is one decision made once, not forty.
240
277
  3. **Then one page at a time.** `check` defaults to the files you changed, so
@@ -329,9 +366,6 @@ coherent monochrome UI and makes the missing decision visible instead of
329
366
  inventing a purple (`A-01`). Set `--brand-h/-s/-l` in the brand file when you
330
367
  have decided, or tell your agent to ask you.
331
368
 
332
- Add `--yes` to accept every derived default non-interactively — the mode CI and
333
- agents run in.
334
-
335
369
  ### Where the token layer goes
336
370
 
337
371
  Beside the stylesheet it wires, so it sits with the rest of your CSS rather than
@@ -370,11 +404,12 @@ overwrites a config or brand file you have edited.
370
404
 
371
405
  | Command | What it does |
372
406
  | --- | --- |
373
- | `install --agent <name> [--scope project\|global] [--hook]` | Puts the skill and its rules where your agent will find them. Writes nothing else into your repo, unless you ask for `--hook`. |
374
- | `init [--yes]` | Sets the project up: CSS system, brand colour, token files, `jig.config.json`, wired imports, baseline check. The only command that writes into your repo. |
375
- | `check [--all] [--ci] [--json]` | Runs the rules a machine can decide. Reports findings by rule id. |
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
+ | `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, and exits non-zero on any mechanical error. |
376
410
  | `update` | Refreshes an install to a newer version, leaving alone any file you have edited. |
377
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
+ | `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. |
378
413
  | `verdicts <surface>` | Verifies a critique's verdict files and computes its counts: every rule in each pass judged once, no id that does not exist, no rule in the wrong arm, and no verdict the render probe contradicts. |
379
414
  | `probe` | Prints the render probe — one expression the critique runs in a browser at each width. It operates the menu, measures sideways scroll, and reads whether the styles and tokens applied. |
380
415
  | `ship` | Says whether the project is ready to ship, by everything Jig checks: `check --all --ci` and `seo` with no errors, and every confirmed page critiqued as it stands, with no finding you have not ruled on. Exits non-zero until it is, and names what Jig does not check. |
@@ -387,7 +422,7 @@ Flags worth knowing:
387
422
  | --- | --- |
388
423
  | `check --all` | Scan the whole repo instead of just changed files. Use on a first run. |
389
424
  | `explain --list` | Every rule id and title. Add a section letter (`explain G --list`) for one section. |
390
- | `check --ci` | Mechanical bucket only — deterministic, and exits non-zero on any error. |
425
+ | `check --ci` | Mechanical bucket only, so the run is deterministic. |
391
426
  | `check --json` | Machine-readable findings, for tooling or for reading every finding when the terminal output elides repeats. |
392
427
  | `init --yes` | Non-interactive; accept every derived default. |
393
428
  | `install --scope global` | Install once for every project. |
@@ -400,9 +435,12 @@ mean it could never move.
400
435
 
401
436
  ### As slash commands
402
437
 
403
- Every command is also a slash command in your agent, installed alongside the
404
- skill. `/jig check --all` does what `npx jig-ui check --all` does, and then acts
405
- 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).
406
444
 
407
445
  | Slash command | Equivalent |
408
446
  | --- | --- |
@@ -417,12 +455,17 @@ on the result — the CLI reports, the agent applies the judgment half.
417
455
  | `/jig spec invoice page` | No CLI. What exactly is being built — a page, feature or functionality — at its smallest useful version, at every screen size |
418
456
  | `/jig mockup` | No CLI. Low-fidelity design of that spec, reviewed before code — in HTML, Figma or Google Stitch, whichever you choose |
419
457
  | `/jig make` | No CLI. High-fidelity: builds the actual page or feature from the spec and mockup |
420
- | `/jig critique` | `jig verdicts` + `jig probe`. Scrutinises what was built against the rules, its spec and its mockup: two reader arms write their verdicts to files, the CLI decides whether the review is complete, and a browser probe checks the verdicts against what the page actually does |
458
+ | `/jig critique` | `jig verdicts` + `jig probe`. Scrutinises what was built against the rules, its spec and its mockup: three readers that cannot see each other (one looks at the rendered page, one reads the source, one holds it to your decisions) write their verdicts to files, the CLI decides whether the review is complete, and a browser probe checks the verdicts against what the page actually does |
421
459
  | `/jig tweak` | No CLI. A small change to a built page that its approved mockup does not show: decided if it is a decision, specced, built, and re-judged where it could matter |
422
460
  | `/jig ship` | `jig ship` — then critiques every page that owes one, puts the findings to you, and runs again until the project is ready |
461
+ | `/jig verdicts <page>` | `jig verdicts <page>` — reports whether a critique is complete, unchanged |
462
+ | `/jig probe` | `jig probe` — the render probe a critique runs in a browser |
463
+ | `/jig checksum <spec>` | `jig checksum <spec>` — the value a spec's check records |
423
464
 
424
- `decide` runs once. The other four run for each page, feature or functionality, one
425
- at a time — never the whole product at once.
465
+ `decide` runs once. `spec`, `mockup` (or skipping it), `make` and `critique` run for
466
+ each page, feature or functionality, one at a time, never the whole product at
467
+ once; `tweak` handles a small change to a built page, and `ship` checks the whole
468
+ project before you release.
426
469
 
427
470
  Where each lands:
428
471
 
@@ -579,7 +622,10 @@ critiquing any page whenever you like, and `ship` judges every one.
579
622
 
580
623
  Waiting is tracked, not forgotten. The verdict lock records the page each
581
624
  critique judged, so Jig knows every page that changed since, every tweak that
582
- left its re-judge for later, and every page never judged. `/jig ship` is where
625
+ left its re-judge for later, and every page never judged. It knows a page by its
626
+ built file: a page rendered only on request is not tracked this way yet, and a
627
+ built page whose content comes from a backend reads as changed when that content
628
+ does. `/jig ship` is where
583
629
  none of it is optional: `jig ship` runs `check --all --ci` and `seo`, and names
584
630
  each page that owes a critique; the agent critiques each one in full, with
585
631
  readers that have not seen the conversation, and puts the findings to you. Each
@@ -599,7 +645,8 @@ metadata in the same change as the headline, and `check` holds the budgets.
599
645
 
600
646
  **Which pages are meant to be found is decided by mode, not by taste.**
601
647
  `editorial` is first-visit content, so it is indexable and needs its own title
602
- 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
603
650
  in, so they must carry `noindex` — an admin screen in a search result is an
604
651
  invitation, and a sign-in page in one invites credential stuffing. A spec
605
652
  overrides the default per page, with a reason: a CV shared by link, a
@@ -654,7 +701,7 @@ No agent required. `check` is a linter with a design system behind it.
654
701
  ```bash
655
702
  npx jig-ui@latest check --all # everything
656
703
  npx jig-ui@latest check # just what changed
657
- 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
658
705
  npx jig-ui@latest check --json # for tooling
659
706
  ```
660
707
 
@@ -668,8 +715,8 @@ In CI:
668
715
  code — nothing model-dependent, no network. As a pre-commit hook, plain `check`
669
716
  looks at changed files only.
670
717
 
671
- What you will not get from the CLI alone is the other 95 rules. `check` says so
672
- rather than letting a narrow pass read as a broad one.
718
+ What you will not get from the CLI alone is the 120 judgment rules. `check` says
719
+ so rather than letting a narrow pass read as a broad one.
673
720
 
674
721
  ## What `check` covers
675
722
 
@@ -690,10 +737,11 @@ character positions preserved, so a finding's line points at the real line in
690
737
  your `.vue` or `.tsx` file. Application code outside a style region is never read
691
738
  as CSS.
692
739
 
693
- The seven mechanical rules: hard-coded values past the token layer (`H-47`),
694
- contrast below the floor (`C-19`), removed focus rings (`E-29`), gradient text
695
- (`A-02`), backdrop blur (`A-04`), pure black and white (`C-18`), and the
696
- violet-band hue check (`A-01`, which asks rather than fails).
740
+ Which rules it decides: every rule in `rules.index.json` that names a
741
+ `detector`, among them hard-coded values past the token layer (`H-47`), contrast
742
+ below the floor (`C-19`) and removed focus rings (`E-29`). A `hybrid` one warns
743
+ and asks rather than fails (the violet-band hue check, `A-01`). `jig explain
744
+ <id>` prints any rule with who checks it.
697
745
 
698
746
  **It also reads the token layer itself.** The token layer is not application
699
747
  code, so no detector scans it — but it is where a mistake costs most, since every
@@ -736,10 +784,10 @@ npx jig-ui@latest update
736
784
  ```
737
785
 
738
786
  Files you have edited are left alone. Upgrading from a pre-0.4.0 install that
739
- vendored rules into your project's `.jig/`? `init` and `check` detect the
740
- leftover files, report them, and — with your consent, and never for a file you
741
- have edited — offer to remove just the install artifacts, keeping your tokens
742
- and config untouched.
787
+ vendored rules into your project's `.jig/`? `init` detects the leftover files,
788
+ reports them, and — with your consent, and never for a file you have edited —
789
+ offers to remove just the install artifacts, keeping your tokens and config
790
+ untouched. (`update`, finding no install, names them and points you to `init`.)
743
791
 
744
792
  Cursor's skill moved from `.cursor/rules/jig.mdc` to
745
793
  `.cursor/skills/jig/SKILL.md`; `init` finds the old file and offers the same
@@ -749,7 +797,7 @@ treatment.
749
797
 
750
798
  | File | Contents |
751
799
  | --- | --- |
752
- | `rules/00-anti-patterns.md` | 128 universal rules with corrections |
800
+ | `rules/00-anti-patterns.md` | 129 universal rules with corrections |
753
801
  | `rules/01-modes.md` | `editorial` / `product` / `operator` profiles |
754
802
  | `rules/02-tokens.md` | Token contract, naming, consumption |
755
803
  | `rules/03-patterns.md` | Component anatomy and behaviour |
@@ -760,12 +808,15 @@ treatment.
760
808
  | `<css dir>/jig/mode.*.css` | Density, scale, rhythm, motion |
761
809
  | `<css dir>/jig/theme.css` | The barrel — brand + mode. This is what you import. With more than one mode, `theme.<mode>.css`, one per mode, each imported by its routes' layout. |
762
810
  | `.jig/state.json` | What `init` wrote, with checksums. `update` reads it to leave your edits alone. |
811
+ | `AGENTS.md`, `CLAUDE.md` | Your agent's instructions. Jig keeps one marked block in each (`CLAUDE.md` only with Claude Code); the rest is yours. |
763
812
  | `.jig/specs/`, `.jig/mockups/`, `.jig/critique/` | The design loop's record: what was agreed, what was drawn, what the review found. |
764
813
 
765
- `rules/*` and `rules.index.json` live beside your installed skill file, not
766
- in the project — see above.
814
+ `rules/*` and `rules.index.json` live beside your installed skill file: in
815
+ your repo's agent folder at project scope, in your home directory at global
816
+ scope. See Install, above.
767
817
 
768
- Which of these an agent loads, and when, is `AGENTS.md`.
818
+ Which of these an agent loads, and when, is the skill file's to say: `SKILL.md`,
819
+ beside the rules.
769
820
 
770
821
  ## Per-project declaration
771
822
 
@@ -787,20 +838,19 @@ Drop this in the project root so mode selection does not require asking on every
787
838
  { "match": "/admin/**", "mode": "operator" }
788
839
  ],
789
840
 
790
- // Files that render OUTSIDE the cascade, where a literal is the only thing
791
- // that works: an OG card serialised into an SVG `foreignObject` carries no
792
- // stylesheet, and a PDF drawn by a React renderer never sees CSS.
793
- //
794
- // Prefer an exact path. An exemption is a claim about ONE file's rendering
795
- // context, and that is usually literally true of one file. Reach for a glob
796
- // only where the directory exists to hold them — `src/cv/pdf/**` is a fact
797
- // about that tree; `**/*-card.tsx` is a naming coincidence that would also
798
- // excuse every real card component you have.
841
+ // Files `check` should skip. Empty unless you add to it; Jig never does.
842
+ // Add:
843
+ // - a file that renders outside your stylesheets (a generated social
844
+ // card, a PDF or email template), where literal values are the only
845
+ // thing that works;
846
+ // - an old page you will not revisit. Plain `check` reads only the files
847
+ // you change, but `check --all` and `ship` read every file.
799
848
  //
800
- // `check` names the pattern and its match count on every run, and says so
801
- // when one is excusing enough files to look like a mistake. Nothing is ever
802
- // exempt by default: this list is the only source.
803
- "exempt": ["src/components/og-card.tsx", "src/cv/pdf/**"],
849
+ // Write each path from the project folder (where this file is), the way
850
+ // your editor shows it: "src/social-card.tsx". A whole folder:
851
+ // "src/emails/**". `check` lists every entry and how many files it
852
+ // matched on every run, and tells you when one matches nothing.
853
+ "exempt": ["src/social-card.tsx", "src/emails/**"],
804
854
 
805
855
  // When pages are critiqued. Leave it out to decide each time; "at-ship"
806
856
  // says once that critiques and a tweak's re-judge wait for `/jig ship`,