jig-ui 0.22.0 → 0.24.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 +185 -0
- package/README.md +107 -58
- package/dist/index.js +1066 -536
- package/examples/G-161.html +7 -0
- package/examples/G-162.html +18 -0
- package/examples/G-163.html +7 -0
- package/examples/I-148.html +7 -0
- package/examples/I-149.html +7 -0
- package/examples/I-150.html +7 -0
- package/examples/I-151.html +7 -0
- package/examples/I-152.html +7 -0
- package/examples/I-153.html +7 -0
- package/examples/I-154.html +7 -0
- package/examples/I-155.html +7 -0
- package/examples/I-156.html +7 -0
- package/examples/I-157.html +7 -0
- package/examples/I-158.html +7 -0
- package/examples/I-159.html +7 -0
- package/examples/I-160.html +7 -0
- package/package.json +4 -3
- package/rules/00-anti-patterns.md +19 -0
- package/rules/01-modes.md +1 -1
- package/rules/02-tokens.md +3 -0
- package/rules/03-patterns.md +2 -1
- package/rules/05-copy.md +88 -2
- package/rules.index.json +114 -0
- package/templates/COMMAND.md.tmpl +133 -38
- package/templates/SKILL.md.tmpl +13 -1
- package/templates/command-metadata.json +5 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,190 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.24.0 (2026-09-30)
|
|
4
|
+
|
|
5
|
+
The owner's word held to one rule, Jig's instructions in your project's AGENTS.md,
|
|
6
|
+
and Jig tested on Linux, macOS and Windows.
|
|
7
|
+
|
|
8
|
+
### Added
|
|
9
|
+
|
|
10
|
+
- **`jig checksum <spec>`** prints a spec's checksum, the value its
|
|
11
|
+
`.checked.json` records. It had been left to agents to compute from the
|
|
12
|
+
procedure's description, and a hand-computed value was easily wrong.
|
|
13
|
+
- **`route:` is a spec field**, for a page whose surface name does not say where
|
|
14
|
+
it is served.
|
|
15
|
+
- **Your project's `AGENTS.md` carries Jig's instructions for your agent.**
|
|
16
|
+
`init`, `install` and `update` create the file if it is missing, or add Jig's
|
|
17
|
+
block to the one you have: load the skill before UI work, how the loop runs,
|
|
18
|
+
the owner's-word rule, and what each of Jig's files is for. With Claude Code,
|
|
19
|
+
a block in `CLAUDE.md` imports it, so every session loads it. Jig owns only
|
|
20
|
+
what is between its markers. `check` reports the block missing or edited,
|
|
21
|
+
`ship` is not ready without it, the Stop hook holds a session that removed it,
|
|
22
|
+
and `jig update` puts it back.
|
|
23
|
+
|
|
24
|
+
### Changed
|
|
25
|
+
|
|
26
|
+
- **The owner's word is held to one rule, everywhere Jig records it.** A spec
|
|
27
|
+
confirmed, a drawing approved or skipped, a re-judge left for later, a tweak's
|
|
28
|
+
change and a decision's reason are each the owner's own words, and words that
|
|
29
|
+
say that thing: a remark about the layout is not a skip of the mockup, and a
|
|
30
|
+
yes to one question is not a yes to the spec. One check now covers all of
|
|
31
|
+
them. Three had no check before: `confirmed: true` needs the owner's yes to
|
|
32
|
+
being asked, a tweak's `change` must be words they said, and `decide`'s quoted
|
|
33
|
+
reasons must be too. The skill states the rule.
|
|
34
|
+
- **A field Jig does not read is refused where it would be written.** When the
|
|
35
|
+
procedure named no place for something, agents invented one: front-matter
|
|
36
|
+
keys, verdict ids, JSON fields that nothing reads, so what they said reached
|
|
37
|
+
no check. A spec key a session adds, a verdict-file field holding a list or an
|
|
38
|
+
object, and an unknown tweak.json field are now refused, each pointing at the
|
|
39
|
+
place that exists. Keys a spec already had are not held against it.
|
|
40
|
+
- **A spec is drafted where Jig reads it, and checked as itself.** It is written
|
|
41
|
+
at `.jig/specs/<name>.spec.md` from the first draft, and its shape is checked
|
|
42
|
+
before the owner is asked to confirm it. Asking to confirm a spec that is not
|
|
43
|
+
there is refused, and so is finishing a spec session without writing it. A
|
|
44
|
+
named spec is never checked in place of another page's.
|
|
45
|
+
- **A critique files one problem once.** A difference goes under `differences`
|
|
46
|
+
only when no rule or decision already holds it, so the counts `ship` reports
|
|
47
|
+
count problems, not entries.
|
|
48
|
+
- **The gate asks for the probe files it re-takes to be committed.** It renders
|
|
49
|
+
a changed page again as a session stops, after the last commit; like the
|
|
50
|
+
lock, it now stops once to have those files committed on their own.
|
|
51
|
+
- **`jig gate` run by hand reports and renders nothing.** Without a transcript
|
|
52
|
+
it cannot tell which pages are in play, and it had re-rendered every one.
|
|
53
|
+
- **`motion: none` can say why**, as in `none — this page adds no movement`.
|
|
54
|
+
- **A file a session never wrote is taken as it found it**, committed or not,
|
|
55
|
+
so a session is not answerable for a draft it found.
|
|
56
|
+
|
|
57
|
+
### Fixed
|
|
58
|
+
|
|
59
|
+
- **Jig works the same on Linux, macOS and Windows, and is tested on all three.**
|
|
60
|
+
Every change now runs the full suite on each, on Node 22 and 24. The first run
|
|
61
|
+
found that rendering a page needed a WebSocket Node 20 does not have, so Jig
|
|
62
|
+
now needs Node 22 or later (Node 20 is end-of-life) and says so if it is run
|
|
63
|
+
on an older one; and that on Windows no browser was ever found to render with:
|
|
64
|
+
Edge, Chrome installed per user, and commands on PATH are now found.
|
|
65
|
+
- **A project checked out on Windows reads the same as anywhere else.** Git on
|
|
66
|
+
Windows gives files CRLF line endings. Jig parsed a spec with them as having
|
|
67
|
+
no regions at all, a spec's check no longer matched it, and every comparison
|
|
68
|
+
with a file's committed copy read as a change. Every text file Jig parses or
|
|
69
|
+
compares is now read with its line endings normalised.
|
|
70
|
+
- **Two Jig runs at once no longer fail on Windows.** Windows refuses to replace
|
|
71
|
+
a file another process has open, where Linux and macOS allow it; writing a
|
|
72
|
+
file Jig records (the install manifest among them) now retries briefly there,
|
|
73
|
+
and the manifest's lock treats a lock file Windows is still deleting as held
|
|
74
|
+
for a moment, not as an error.
|
|
75
|
+
|
|
76
|
+
- **The docs say what the code does.** The README said `check` reports a
|
|
77
|
+
pre-0.4.0 install's leftovers (only `init` does); the procedure named five
|
|
78
|
+
reasons `ship` owes a page (there are six, one a re-probe) and described the
|
|
79
|
+
spec checksum as leaving out one line where the code leaves out two. Tests
|
|
80
|
+
now fail when the procedure stops naming a state `ship` reports, a line the
|
|
81
|
+
checksum leaves out, or a command the CLI registers.
|
|
82
|
+
- **The README no longer counts the rules `check` decides by hand.** It named
|
|
83
|
+
"the seven mechanical rules" from 0.1.0; it now points at `rules.index.json`.
|
|
84
|
+
- **An `exempt` path works the way you write it.** `./src/card.tsx`,
|
|
85
|
+
`src\\card.tsx` and an absolute path inside the project all mean
|
|
86
|
+
`src/card.tsx`. A path outside the project was dropped without a word; it is
|
|
87
|
+
now named in the report with what to write instead, and a bare file name that
|
|
88
|
+
matches nothing is answered with where that file is.
|
|
89
|
+
- **A fact's `source` that holds a sentence** is told to put it in `note`.
|
|
90
|
+
- **The README says what Jig does.** It said `init` was the only command that
|
|
91
|
+
writes into your repo and that nothing of Jig's is kept in it (a project-scope
|
|
92
|
+
install writes the skill and rules into your repo's agent folder); pointed
|
|
93
|
+
agents at `AGENTS.md`, which users do not receive; counted 95 rules the CLI
|
|
94
|
+
cannot decide (it is 120), two critique readers (three) and four per-page
|
|
95
|
+
commands; described `check --ci` as errors only; said the token layer changes
|
|
96
|
+
nothing on the page, beside a `color-scheme` line that does; and claimed Jig
|
|
97
|
+
knows every page that changed, which it does not for a page rendered on
|
|
98
|
+
request. Its `exempt` example named one project's files as if they were a
|
|
99
|
+
pattern; it now explains how to choose your own: a file that renders outside
|
|
100
|
+
your stylesheets, or a page you will not revisit, since `check --all` and
|
|
101
|
+
`ship` read every file. The slash-command table
|
|
102
|
+
lists `verdicts`, `probe` and `checksum`.
|
|
103
|
+
|
|
104
|
+
## 0.23.0 (2026-09-29)
|
|
105
|
+
|
|
106
|
+
Rules for the prose a page ships and for how it moves, a spec that says what
|
|
107
|
+
moves and why, and a critique that reads the page against its spec both ways.
|
|
108
|
+
|
|
109
|
+
### Added
|
|
110
|
+
|
|
111
|
+
- **Rules for the prose a page ships.** The copy rules were written for
|
|
112
|
+
interface strings: a label, a button, an error. A docs chapter, a guide or a
|
|
113
|
+
blog post was held only to those, and a paragraph could claim a figure nobody
|
|
114
|
+
measured, open with "In today's rapidly changing world" and restate its
|
|
115
|
+
introduction as its conclusion, and pass. Nine rules now cover prose longer
|
|
116
|
+
than a paragraph (`I-148` to `I-156`): a claim with no source, a sentence
|
|
117
|
+
specific in sound and empty in fact, formula openers and closers, saying it
|
|
118
|
+
twice, a rhetorical shape on repeat, enthusiasm the content has not earned,
|
|
119
|
+
stacked hedges, emoji in headings, and structure imposed on the content.
|
|
120
|
+
Four more cover writing a person puts their name to, a blog post or a case
|
|
121
|
+
study (`I-157` to `I-160`): nothing only the author could say, no point of
|
|
122
|
+
view, an even rhythm, and a feeling named rather than shown.
|
|
123
|
+
- **They judge the writing, never the writer.** A finding says the copy reads
|
|
124
|
+
as generic; it never says a model wrote it. Nothing is measured: rhythm and
|
|
125
|
+
voice have no number a check could hold, and a score would reward prose that
|
|
126
|
+
games it.
|
|
127
|
+
- **`check` catches two of them.** `I-150` warns on a short list of formula
|
|
128
|
+
phrases ("it is important to note", "let's dive in", "in conclusion") in the
|
|
129
|
+
text a reader sees, and leaves a quotation alone. `I-155` warns on an emoji
|
|
130
|
+
in a Markdown page's heading; in markup, `A-05` already reports it.
|
|
131
|
+
- **The copy checklist asks three more questions** (`L-06`): whether every
|
|
132
|
+
figure traces to a source, whether prose says something specific once, and
|
|
133
|
+
whether a long-form piece holds something only its author could say.
|
|
134
|
+
|
|
135
|
+
- **Three motion rules.** `G-161`: a layout change the user caused shows
|
|
136
|
+
where things went (a deleted row's neighbours slide into the gap) rather than
|
|
137
|
+
jumping, and stays instant when the user did not cause it. `G-162`: animate
|
|
138
|
+
`transform` and `opacity`, never layout, and never `all`; `check` warns on a
|
|
139
|
+
transition or keyframe that names a layout property or `all`, and on
|
|
140
|
+
Tailwind's `transition-all`. `G-163`: one thing moves at a time. Moving
|
|
141
|
+
within the screen takes `--ease-in-out` (`T-04`). No new tokens.
|
|
142
|
+
- **A spec says what moves, and why.** `motion:` lists each movement: what
|
|
143
|
+
moves, its trigger, and what it tells the reader. One that cannot say is cut
|
|
144
|
+
before it is built. The owner reads it on the confirmation sheet, `make`
|
|
145
|
+
builds that motion and no other, and `critique` judges the page against it.
|
|
146
|
+
A spec confirmed before it has none, and is judged by the rules alone.
|
|
147
|
+
|
|
148
|
+
### Changed
|
|
149
|
+
|
|
150
|
+
- **A critique reads the page against the spec, not only the spec against the
|
|
151
|
+
page.** A section, a paragraph or a claim the page carries that no line of the
|
|
152
|
+
spec asks for, and no deviation records, is now a finding. On jig-site a
|
|
153
|
+
chapter carried an accurate paragraph the owner never confirmed, and two
|
|
154
|
+
critiques saw it and filed nothing, because it broke no rule. The fix is a
|
|
155
|
+
tweak that writes it into the spec for the owner to confirm, or removes it.
|
|
156
|
+
- **Each critique arm is told the shape of a `ruled` verdict.** An arm wrote
|
|
157
|
+
four that named the owner's decision only in their reason, and `verdicts`
|
|
158
|
+
refused them all.
|
|
159
|
+
- **A CLI run from a checkout reads the checkout's rules.** `prepack` copies the
|
|
160
|
+
rules beside the CLI package for each publish, and the copies stayed behind:
|
|
161
|
+
a clone that had published read the rules as they were then, and Jig's own
|
|
162
|
+
first test run after each rule change failed 14 tests. An installed package
|
|
163
|
+
still reads its own copies.
|
|
164
|
+
- **`jig ship` leaves a replaced spec to the spec that replaced it.**
|
|
165
|
+
`superseded_by: <spec>` in a spec's front matter marks it, and `ship` reports
|
|
166
|
+
it apart instead of as never critiqued, once it has checked the spec it names
|
|
167
|
+
exists. On jig-site two replaced specs were owed a critique at every `ship`,
|
|
168
|
+
each marked a different way by the agent that replaced it.
|
|
169
|
+
- **A tweak that records a decision applies it to the whole page.** The owner
|
|
170
|
+
rules on one instance, and the decision states a kind; the tweak now finds the
|
|
171
|
+
other instances on the page and fixes them in the same change. On jig-site a
|
|
172
|
+
decision to set every quotation mark curly fixed the one named, and four
|
|
173
|
+
straight marks survived to the next critique.
|
|
174
|
+
- **A spec's second check covers what changed.** The reader gets the earlier
|
|
175
|
+
record and the diff; a quotation or fact on an unchanged line, whose source
|
|
176
|
+
has not changed either, carries over. On jig-site every re-check reopened
|
|
177
|
+
every source, about $10 a round.
|
|
178
|
+
- **A critique has a place for what no rule names.** A difference between the
|
|
179
|
+
page and its spec, or a source it teaches, goes under `differences` in the
|
|
180
|
+
arm's verdict file and counts as a finding. On jig-site both arms of one
|
|
181
|
+
critique invented rule ids to carry one, and `verdicts` refused them. The
|
|
182
|
+
report now says what the page-against-spec pass found, "none" included, and
|
|
183
|
+
`verdicts` explains that a decision is judged, never `ruled`.
|
|
184
|
+
- **Every page is owed a critique again.** A critique judges every rule, so one
|
|
185
|
+
written before these sixteen is incomplete, and `jig ship` lists each page
|
|
186
|
+
until it is critiqued on this release.
|
|
187
|
+
|
|
3
188
|
## 0.22.0 (2026-09-29)
|
|
4
189
|
|
|
5
190
|
A spec and a mockup are checked before the owner says yes, a critique can wait,
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
|
30
|
+
- Of the 159 rules, **39 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
|
-
- The other **
|
|
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
|
|
36
|
+
Running only the CLI gets you the 39. 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
|
|
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
|
|
92
|
-
skill file itself
|
|
93
|
-
|
|
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`
|
|
104
|
-
with nothing in it and on one with years of
|
|
105
|
-
each
|
|
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
|
|
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
|
|
168
|
-
|
|
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.**
|
|
237
|
-
can put in CI. It is the short
|
|
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.
|
|
374
|
-
| `init [--yes]` | Sets the project up: CSS system, brand colour, token files, `jig.config.json`, wired imports, baseline check.
|
|
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. |
|
|
375
409
|
| `check [--all] [--ci] [--json]` | Runs the rules a machine can decide. Reports findings by rule id. |
|
|
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. |
|
|
@@ -407,7 +442,7 @@ on the result — the CLI reports, the agent applies the judgment half.
|
|
|
407
442
|
| Slash command | Equivalent |
|
|
408
443
|
| --- | --- |
|
|
409
444
|
| `/jig init` | `jig init` — then states the mode it chose and what it wired |
|
|
410
|
-
| `/jig check` | `jig check` — then applies the
|
|
445
|
+
| `/jig check` | `jig check` — then applies the 120 judgment rules and reports both halves |
|
|
411
446
|
| `/jig explain C-19` | `jig explain C-19` — prints the rule as-is, without paraphrasing it |
|
|
412
447
|
| `/jig explain contrast` | `jig explain contrast` — every rule matching a word, when you do not have an id |
|
|
413
448
|
| `/jig install --agent cursor` | `jig install --agent cursor` |
|
|
@@ -417,12 +452,17 @@ on the result — the CLI reports, the agent applies the judgment half.
|
|
|
417
452
|
| `/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
453
|
| `/jig mockup` | No CLI. Low-fidelity design of that spec, reviewed before code — in HTML, Figma or Google Stitch, whichever you choose |
|
|
419
454
|
| `/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:
|
|
455
|
+
| `/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
456
|
| `/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
457
|
| `/jig ship` | `jig ship` — then critiques every page that owes one, puts the findings to you, and runs again until the project is ready |
|
|
458
|
+
| `/jig verdicts <page>` | `jig verdicts <page>` — reports whether a critique is complete, unchanged |
|
|
459
|
+
| `/jig probe` | `jig probe` — the render probe a critique runs in a browser |
|
|
460
|
+
| `/jig checksum <spec>` | `jig checksum <spec>` — the value a spec's check records |
|
|
423
461
|
|
|
424
|
-
`decide` runs once.
|
|
425
|
-
at a time
|
|
462
|
+
`decide` runs once. `spec`, `mockup` (or skipping it), `make` and `critique` run for
|
|
463
|
+
each page, feature or functionality, one at a time, never the whole product at
|
|
464
|
+
once; `tweak` handles a small change to a built page, and `ship` checks the whole
|
|
465
|
+
project before you release.
|
|
426
466
|
|
|
427
467
|
Where each lands:
|
|
428
468
|
|
|
@@ -489,6 +529,9 @@ before you say yes:
|
|
|
489
529
|
the navigation you would expect there.
|
|
490
530
|
- **States cover what the page will meet.** Empty, one, a lot, loading, failure:
|
|
491
531
|
whichever the page can actually be in.
|
|
532
|
+
- **Everything that moves has a reason.** Each line of `motion:` names what
|
|
533
|
+
moves, what sets it off, and what it tells the reader. Cut any line that
|
|
534
|
+
can't say, and expect nothing on the page to move that the list leaves out.
|
|
492
535
|
- **Open questions were asked, not answered for you.** A spec touching an item
|
|
493
536
|
under `Unresolved` in `DECISIONS.md` carries your answer, and a field reading
|
|
494
537
|
`unspecified — make chooses one it can defend` is one you can decide now.
|
|
@@ -576,7 +619,10 @@ critiquing any page whenever you like, and `ship` judges every one.
|
|
|
576
619
|
|
|
577
620
|
Waiting is tracked, not forgotten. The verdict lock records the page each
|
|
578
621
|
critique judged, so Jig knows every page that changed since, every tweak that
|
|
579
|
-
left its re-judge for later, and every page never judged.
|
|
622
|
+
left its re-judge for later, and every page never judged. It knows a page by its
|
|
623
|
+
built file: a page rendered only on request is not tracked this way yet, and a
|
|
624
|
+
built page whose content comes from a backend reads as changed when that content
|
|
625
|
+
does. `/jig ship` is where
|
|
580
626
|
none of it is optional: `jig ship` runs `check --all --ci` and `seo`, and names
|
|
581
627
|
each page that owes a critique; the agent critiques each one in full, with
|
|
582
628
|
readers that have not seen the conversation, and puts the findings to you. Each
|
|
@@ -665,8 +711,8 @@ In CI:
|
|
|
665
711
|
code — nothing model-dependent, no network. As a pre-commit hook, plain `check`
|
|
666
712
|
looks at changed files only.
|
|
667
713
|
|
|
668
|
-
What you will not get from the CLI alone is the
|
|
669
|
-
rather than letting a narrow pass read as a broad one.
|
|
714
|
+
What you will not get from the CLI alone is the 120 judgment rules. `check` says
|
|
715
|
+
so rather than letting a narrow pass read as a broad one.
|
|
670
716
|
|
|
671
717
|
## What `check` covers
|
|
672
718
|
|
|
@@ -687,10 +733,11 @@ character positions preserved, so a finding's line points at the real line in
|
|
|
687
733
|
your `.vue` or `.tsx` file. Application code outside a style region is never read
|
|
688
734
|
as CSS.
|
|
689
735
|
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
violet-band hue check
|
|
736
|
+
Which rules it decides: every rule in `rules.index.json` that names a
|
|
737
|
+
`detector`, among them hard-coded values past the token layer (`H-47`), contrast
|
|
738
|
+
below the floor (`C-19`) and removed focus rings (`E-29`). A `hybrid` one warns
|
|
739
|
+
and asks rather than fails (the violet-band hue check, `A-01`). `jig explain
|
|
740
|
+
<id>` prints any rule with who checks it.
|
|
694
741
|
|
|
695
742
|
**It also reads the token layer itself.** The token layer is not application
|
|
696
743
|
code, so no detector scans it — but it is where a mistake costs most, since every
|
|
@@ -733,10 +780,10 @@ npx jig-ui@latest update
|
|
|
733
780
|
```
|
|
734
781
|
|
|
735
782
|
Files you have edited are left alone. Upgrading from a pre-0.4.0 install that
|
|
736
|
-
vendored rules into your project's `.jig/`? `init`
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
and
|
|
783
|
+
vendored rules into your project's `.jig/`? `init` detects the leftover files,
|
|
784
|
+
reports them, and — with your consent, and never for a file you have edited —
|
|
785
|
+
offers to remove just the install artifacts, keeping your tokens and config
|
|
786
|
+
untouched. (`update`, finding no install, names them and points you to `init`.)
|
|
740
787
|
|
|
741
788
|
Cursor's skill moved from `.cursor/rules/jig.mdc` to
|
|
742
789
|
`.cursor/skills/jig/SKILL.md`; `init` finds the old file and offers the same
|
|
@@ -746,23 +793,26 @@ treatment.
|
|
|
746
793
|
|
|
747
794
|
| File | Contents |
|
|
748
795
|
| --- | --- |
|
|
749
|
-
| `rules/00-anti-patterns.md` |
|
|
796
|
+
| `rules/00-anti-patterns.md` | 128 universal rules with corrections |
|
|
750
797
|
| `rules/01-modes.md` | `editorial` / `product` / `operator` profiles |
|
|
751
798
|
| `rules/02-tokens.md` | Token contract, naming, consumption |
|
|
752
799
|
| `rules/03-patterns.md` | Component anatomy and behaviour |
|
|
753
800
|
| `rules/04-principles.md` | Five frames + seven tiebreakers |
|
|
754
|
-
| `rules/05-copy.md` | Interface text rules |
|
|
801
|
+
| `rules/05-copy.md` | Interface text rules, and the prose a page ships |
|
|
755
802
|
| `examples/<ID>.html` | For every rule, a small dont and do: self-contained HTML fragments that render in a sandboxed frame. `jig explain <ID>` names the file. |
|
|
756
803
|
| `<css dir>/jig/brand.*.css` | Identity. One per project. |
|
|
757
804
|
| `<css dir>/jig/mode.*.css` | Density, scale, rhythm, motion |
|
|
758
805
|
| `<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. |
|
|
759
806
|
| `.jig/state.json` | What `init` wrote, with checksums. `update` reads it to leave your edits alone. |
|
|
807
|
+
| `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. |
|
|
760
808
|
| `.jig/specs/`, `.jig/mockups/`, `.jig/critique/` | The design loop's record: what was agreed, what was drawn, what the review found. |
|
|
761
809
|
|
|
762
|
-
`rules/*` and `rules.index.json` live beside your installed skill file
|
|
763
|
-
|
|
810
|
+
`rules/*` and `rules.index.json` live beside your installed skill file: in
|
|
811
|
+
your repo's agent folder at project scope, in your home directory at global
|
|
812
|
+
scope. See Install, above.
|
|
764
813
|
|
|
765
|
-
Which of these an agent loads, and when, is `
|
|
814
|
+
Which of these an agent loads, and when, is the skill file's to say: `SKILL.md`,
|
|
815
|
+
beside the rules.
|
|
766
816
|
|
|
767
817
|
## Per-project declaration
|
|
768
818
|
|
|
@@ -784,20 +834,19 @@ Drop this in the project root so mode selection does not require asking on every
|
|
|
784
834
|
{ "match": "/admin/**", "mode": "operator" }
|
|
785
835
|
],
|
|
786
836
|
|
|
787
|
-
// Files
|
|
788
|
-
//
|
|
789
|
-
//
|
|
790
|
-
//
|
|
791
|
-
//
|
|
792
|
-
//
|
|
793
|
-
//
|
|
794
|
-
// about that tree; `**/*-card.tsx` is a naming coincidence that would also
|
|
795
|
-
// excuse every real card component you have.
|
|
837
|
+
// Files `check` should skip. Empty unless you add to it; Jig never does.
|
|
838
|
+
// Add:
|
|
839
|
+
// - a file that renders outside your stylesheets (a generated social
|
|
840
|
+
// card, a PDF or email template), where literal values are the only
|
|
841
|
+
// thing that works;
|
|
842
|
+
// - an old page you will not revisit. Plain `check` reads only the files
|
|
843
|
+
// you change, but `check --all` and `ship` read every file.
|
|
796
844
|
//
|
|
797
|
-
//
|
|
798
|
-
//
|
|
799
|
-
//
|
|
800
|
-
|
|
845
|
+
// Write each path from the project folder (where this file is), the way
|
|
846
|
+
// your editor shows it: "src/social-card.tsx". A whole folder:
|
|
847
|
+
// "src/emails/**". `check` lists every entry and how many files it
|
|
848
|
+
// matched on every run, and tells you when one matches nothing.
|
|
849
|
+
"exempt": ["src/social-card.tsx", "src/emails/**"],
|
|
801
850
|
|
|
802
851
|
// When pages are critiqued. Leave it out to decide each time; "at-ship"
|
|
803
852
|
// says once that critiques and a tweak's re-judge wait for `/jig ship`,
|