jig-ui 0.20.1 → 0.22.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 +120 -0
- package/README.md +149 -1
- package/dist/index.js +725 -182
- package/package.json +1 -1
- package/templates/COMMAND.md.tmpl +242 -27
- package/templates/SKILL.md.tmpl +5 -0
- package/templates/command-metadata.json +5 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jig-ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.22.0",
|
|
4
4
|
"description": "A design system for coding agents. 143 numbered UI rules, brand x mode design tokens, and an installer for Claude Code, Codex, Cursor and opencode.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -6,7 +6,7 @@ these, say so, list them, and stop.
|
|
|
6
6
|
|
|
7
7
|
There are two kinds of subcommand, and they are not run the same way.
|
|
8
8
|
|
|
9
|
-
**CLI-backed** — `install`, `update`, `init`, `check`, `explain`, `verdicts`, `gate`, `probe`, `seo`. Run the
|
|
9
|
+
**CLI-backed** — `install`, `update`, `init`, `check`, `explain`, `verdicts`, `gate`, `probe`, `seo`, `ship`. Run the
|
|
10
10
|
matching command with `{{scripts_path}}`, passing the flags through unchanged,
|
|
11
11
|
then do the work below for that subcommand. Read the command's full output —
|
|
12
12
|
findings are ordered by severity, not position, so `head`, `tail`, `grep` and
|
|
@@ -25,10 +25,14 @@ decide project-wide decisions, and the reason for each once per project
|
|
|
25
25
|
spec what exactly is being built: its smallest useful version, at every screen size
|
|
26
26
|
mockup low-fidelity design of that spec, reviewed before any code
|
|
27
27
|
make high-fidelity: the actual page or feature, built from the spec & mockup
|
|
28
|
-
critique scrutinises what was built against the rules, its spec & mockup
|
|
28
|
+
critique scrutinises what was built against the rules, its spec & mockup;
|
|
29
|
+
now, or later: a page judged as it stands gets the same verdicts
|
|
29
30
|
|
|
30
31
|
tweak a small change the approved mockup does not show: decided if it is a
|
|
31
32
|
decision, specced, built, and re-judged where it could matter
|
|
33
|
+
|
|
34
|
+
ship everything Jig checks, with nothing optional: critiques every page
|
|
35
|
+
that owes one, and says what Jig does not check
|
|
32
36
|
```
|
|
33
37
|
|
|
34
38
|
## init
|
|
@@ -50,10 +54,16 @@ the answer and the CLI is not. So, first:
|
|
|
50
54
|
`editorial` for first-visit content, `product` for the signed-in app,
|
|
51
55
|
`operator` for dense daily tools. State the mapping in one line and let them
|
|
52
56
|
correct it.
|
|
53
|
-
3. **
|
|
54
|
-
`
|
|
55
|
-
|
|
56
|
-
|
|
57
|
+
3. **Ask when pages should be critiqued**: after every build, left for
|
|
58
|
+
`{{command_prefix}}ship`, or decided page by page. Page by page is the default
|
|
59
|
+
and writes nothing; each spec then asks. The other two go in as
|
|
60
|
+
`"critique": "each"` or `"critique": "at-ship"`. It is how the owner works,
|
|
61
|
+
so it is asked here, not in `decide`.
|
|
62
|
+
4. **Write `jig.config.json`** with those surfaces, and the critique answer,
|
|
63
|
+
before running anything. `init` reads an existing config and honours it —
|
|
64
|
+
writing one mode file per declared mode — so this is how a decision reaches
|
|
65
|
+
the tokens.
|
|
66
|
+
5. **Then run the command.**
|
|
57
67
|
|
|
58
68
|
Where there is genuinely one surface, say so and move on; the point is that the
|
|
59
69
|
mode was chosen rather than defaulted into.
|
|
@@ -289,6 +299,7 @@ the example shows the shape. Say it is an example, not a suggestion.
|
|
|
289
299
|
> plan goes straight to sign-up. Nothing on this page may ask for a sales
|
|
290
300
|
> call."*
|
|
291
301
|
|
|
302
|
+
|
|
292
303
|
**Ask about the phone by name.** What does the reader see first on a phone, and
|
|
293
304
|
what moves, stacks, or goes behind a control?
|
|
294
305
|
> *For example: "the plans come first on the phone" — that is the answer this
|
|
@@ -297,6 +308,16 @@ what moves, stacks, or goes behind a control?
|
|
|
297
308
|
describes the wide screen, the phone composition will be derived from it rather
|
|
298
309
|
than designed — and a derived phone composition is a squeezed desktop.
|
|
299
310
|
|
|
311
|
+
**Last, ask when this page is critiqued: after each build, or left for
|
|
312
|
+
`ship`?** It is the one question about how the owner works rather than what the
|
|
313
|
+
page is, so it comes after all of them. Skip it only where the owner has already
|
|
314
|
+
said, for this page or in asking for the spec. Where the page sets up what later
|
|
315
|
+
pages reuse (a header, a card, a layout), say why now is worth it; otherwise
|
|
316
|
+
offer the project's default from `{{config_file}}`, or "each" where it has none.
|
|
317
|
+
Write the answer as `critique: each` or `critique: at-ship`.
|
|
318
|
+
> *For example: "each: every page has this header, so a finding in it is fixed
|
|
319
|
+
> once, now, not in ten pages later."*
|
|
320
|
+
|
|
300
321
|
### 2. Run `L-01`
|
|
301
322
|
|
|
302
323
|
Read `L-01 · Layout method` in `{{rules_path}}/03-patterns.md` and run its five
|
|
@@ -353,9 +374,10 @@ later: [social sign-in, remember this device] # cut from V1, by name — the n
|
|
|
353
374
|
indexable: true # from the mode — editorial yes, product/operator no. Say why when you override it.
|
|
354
375
|
title: "Pricing — Hoistline" # ≤ 60 characters, the search result's first line
|
|
355
376
|
description: "Three plans, every price visible. No sales call." # ≤ 155
|
|
356
|
-
mockup: pending #
|
|
377
|
+
mockup: pending # approved or skipped, quoting the user: approved by `mockup`, skipped by whichever command they said it to
|
|
357
378
|
mockup_at: # where the approved drawing is: a .jig/mockups path, or a Figma or Stitch link
|
|
358
379
|
deviations: [] # `make` writes here; `spec` leaves it empty
|
|
380
|
+
critique: each # optional: each, or at-ship; left out, the project's default in {{config_file}}
|
|
359
381
|
---
|
|
360
382
|
```
|
|
361
383
|
|
|
@@ -452,9 +474,83 @@ to the spec, never the spec to the decisions.
|
|
|
452
474
|
say in the confirmation message which fields those are, so the user can decide
|
|
453
475
|
them instead.
|
|
454
476
|
|
|
477
|
+
### 3c. Have it checked by a reader who did not write it
|
|
478
|
+
|
|
479
|
+
Step 3b checks the spec against the decisions. Nothing after it checks the spec
|
|
480
|
+
against the owner's words or against the facts it states: `make` builds a
|
|
481
|
+
confirmed spec as written, and `critique` compares the page to the spec, never
|
|
482
|
+
the spec to what is true. On jig-site a confirmed spec for a docs chapter carried
|
|
483
|
+
seven errors to the built page, among them a procedure Jig does not have and a
|
|
484
|
+
lock written at the wrong moment, and the owner had confirmed it. The writer
|
|
485
|
+
cannot catch these, for the same reason a builder cannot review its own page.
|
|
486
|
+
|
|
487
|
+
**Delegate to a subagent.** Give it the spec, `DECISIONS.md`, the owner's messages
|
|
488
|
+
from this conversation, and read access to the project. Not your reasoning, and
|
|
489
|
+
not your summary of what the owner meant. It writes
|
|
490
|
+
`.jig/specs/<name>.checked.json`:
|
|
491
|
+
|
|
492
|
+
```json
|
|
493
|
+
{
|
|
494
|
+
"spec": "sha256 of the spec file with its confirmed: line removed",
|
|
495
|
+
"quotes": [
|
|
496
|
+
{ "quote": "Only where the steps differ by path", "said": "the owner, this conversation", "holds": true }
|
|
497
|
+
],
|
|
498
|
+
"facts": [
|
|
499
|
+
{ "claim": "the gate records the verdicts when a critique or tweak stops", "source": "templates/COMMAND.md.tmpl:1360", "holds": false, "note": "the spec says only after the findings are fixed" },
|
|
500
|
+
{ "claim": "Stitch needs an API key", "source": "https://stitch.withgoogle.com", "holds": "unchecked", "note": "no network access in this session" }
|
|
501
|
+
],
|
|
502
|
+
"copy": ["Before you start"],
|
|
503
|
+
"conditions": [{ "owner": "three columns from 1280 up", "spec": "desktop: three columns at 1280 and wider" }],
|
|
504
|
+
"open": ["density of the chapter list: unspecified, make chooses"]
|
|
505
|
+
}
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
- **`quotes`**: every quotation the spec gives as the owner's, and where the owner
|
|
509
|
+
said it. One the owner's words do not hold is removed from the spec or put back
|
|
510
|
+
as they said it.
|
|
511
|
+
- **`facts`**: every statement the spec makes about how something works (the
|
|
512
|
+
product, an API, an existing page, a file, a tool), with the source the reader
|
|
513
|
+
opened: `path` or `path:line` in the project, or a URL. `holds` is `true`,
|
|
514
|
+
`false` or `"unchecked"`, with a `note` for anything but `true`. A fact that
|
|
515
|
+
does not hold is fixed in the spec before anyone is asked; `"unchecked"` says why
|
|
516
|
+
it could not be opened.
|
|
517
|
+
- **`copy`**: the words the spec writes for the page to show as written:
|
|
518
|
+
headings, labels, sentences.
|
|
519
|
+
- **`conditions`**: each condition the owner gave, beside the spec's line for it.
|
|
520
|
+
- **`open`**: every `unspecified` field and every **Unresolved** item the spec
|
|
521
|
+
touches.
|
|
522
|
+
|
|
523
|
+
Fix what it found, then have the spec checked again: the record is of the spec
|
|
524
|
+
you show, and the gate compares its `spec` checksum to the file. **If you cannot
|
|
525
|
+
delegate, write the record yourself, with `"reader": "the writer"` in it, and say
|
|
526
|
+
in the confirmation message that nobody else checked the spec.** That is an
|
|
527
|
+
honest gap the owner can close by reading more closely; a check you ran on your
|
|
528
|
+
own words and reported as independent is not.
|
|
529
|
+
|
|
455
530
|
### 4. Get it confirmed
|
|
456
531
|
|
|
457
|
-
Show the spec and
|
|
532
|
+
Show the spec, and with it the sheet the owner checks it by, from
|
|
533
|
+
`<name>.checked.json`:
|
|
534
|
+
|
|
535
|
+
- **Your words:** each quotation given as theirs, and where they said it.
|
|
536
|
+
- **Facts:** each claim and its source, the ones that could not be checked
|
|
537
|
+
first.
|
|
538
|
+
- **Copy the page will show as written.**
|
|
539
|
+
- **Your conditions**, beside the lines that carry them.
|
|
540
|
+
- **Left for you:** the `open` items, which they can decide now.
|
|
541
|
+
|
|
542
|
+
The owner confirms a spec by checking it, and the sheet is what makes that a few
|
|
543
|
+
minutes' work rather than a reread. Ask them to confirm it. Then **stop**.
|
|
544
|
+
|
|
545
|
+
If, in confirming, they also say to skip the mockup, record that too:
|
|
546
|
+
`mockup: skipped — "<their words>"`.
|
|
547
|
+
|
|
548
|
+
**Checking a spec for the owner.** When the owner asks an agent to check a spec
|
|
549
|
+
and confirm it on their behalf, that agent works from the same sheet and confirms
|
|
550
|
+
only what it checked itself: it opens every source marked `"unchecked"` and
|
|
551
|
+
every one it doubts, reads the copy as the person arriving would, and holds each
|
|
552
|
+
condition to the owner's own words. Anything it could not check it names to the
|
|
553
|
+
owner instead of confirming.
|
|
458
554
|
|
|
459
555
|
`confirmed: true` records that **the user said so in their own response**. You
|
|
460
556
|
may not set it on their behalf, and you may not treat your own summary,
|
|
@@ -657,7 +753,10 @@ down the spec's `regions:` and its `nav:` and find each one in that frame. A reg
|
|
|
657
753
|
the spec names and the frame lacks is drawn now, not raised in review. The gate
|
|
658
754
|
checks an HTML drawing when you stop: a frame for each of the four sizes, each
|
|
659
755
|
size's regions labelled in its frame (by name where the spec names them), a
|
|
660
|
-
frame either side of each recorded switch, and no icon or image in any frame.
|
|
756
|
+
frame either side of each recorded switch, and no icon or image in any frame. It checks
|
|
757
|
+
the same while you wait for the user's word, so a drawing it refuses cannot be put to
|
|
758
|
+
them. When it stops you, say what it refused and fix it; never report a gate block as
|
|
759
|
+
waiting on the user. This matters
|
|
661
760
|
most on the phone, where a region dropped for space is easy to miss and the reviewer
|
|
662
761
|
is looking at what is there, not at what is not.
|
|
663
762
|
|
|
@@ -670,6 +769,27 @@ Then ask **structural** questions, not whether they like it: is the most importa
|
|
|
670
769
|
thing the first thing seen at each size? Does anything belong in a different group?
|
|
671
770
|
Is anything here that V1 does not need?
|
|
672
771
|
|
|
772
|
+
**Give them the sheet they check it by.** The drawing is the confirmed spec,
|
|
773
|
+
drawn, so what the owner checks first is that it matches. The gate has checked
|
|
774
|
+
that each region is labelled; whether each is drawn the way the spec says is
|
|
775
|
+
theirs to see. Size by size, set the spec's line beside what the frame shows:
|
|
776
|
+
|
|
777
|
+
- the regions in the spec's order, what comes first, what is grouped, where each
|
|
778
|
+
sits;
|
|
779
|
+
- `nav:` for that size, and the navigation drawn;
|
|
780
|
+
- each state in `states:` that changes the layout, and where it is drawn;
|
|
781
|
+
- anything the spec says a part does that a still drawing cannot show, quoted
|
|
782
|
+
from the spec. Name only what the spec says: a behaviour it does not mention is
|
|
783
|
+
not yours to raise here, and one you add is a spec change;
|
|
784
|
+
- the owner's conditions from the spec, beside the lines that carry them;
|
|
785
|
+
- and what the drawing leaves out on purpose: `later:`, and colour, type and
|
|
786
|
+
spacing, which the tokens settle.
|
|
787
|
+
|
|
788
|
+
**Checking a mockup for the owner.** When the owner asks an agent to check the
|
|
789
|
+
drawing and approve it on their behalf, that agent renders every frame, compares
|
|
790
|
+
each with its line in the spec, and approves only what it checked itself. What
|
|
791
|
+
it could not check, it names to the owner instead of approving.
|
|
792
|
+
|
|
673
793
|
### 4. Every change goes into the spec first
|
|
674
794
|
|
|
675
795
|
When the review moves, adds, cuts or regroups anything, **edit the spec**, then
|
|
@@ -683,13 +803,20 @@ confirmed again.
|
|
|
683
803
|
|
|
684
804
|
### 5. Record the outcome in the user's words
|
|
685
805
|
|
|
686
|
-
- The user approves → set `mockup: approved` in the spec,
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
or
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
806
|
+
- The user approves → set `mockup: approved — "<their words>"` in the spec,
|
|
807
|
+
quoting the reply that approved it, and `confirmed: true` if review changed it.
|
|
808
|
+
Record where the approved drawing is in `mockup_at:` — the file path, or the
|
|
809
|
+
Figma or Stitch link. Only their own response counts; your summary of the
|
|
810
|
+
drawing, or no objection, does not. **A condition they attach goes into the
|
|
811
|
+
spec first**, in their words, on the lines it governs: on jig-site the owner
|
|
812
|
+
approved with "three columns at 1280 and wider, inside the page margins", the
|
|
813
|
+
condition lived only in the conversation, and `make` moved the switch to 1290.
|
|
814
|
+
- The user says to skip it → `mockup: skipped — "<their words>"`. For a change
|
|
815
|
+
small enough that drawing it costs more than building it, that is a reasonable
|
|
816
|
+
call; it is still theirs to make.
|
|
817
|
+
|
|
818
|
+
With the Stop hook, the gate reads the quotation after `approved` or `skipped` and
|
|
819
|
+
holds it to what the owner said in this session.
|
|
693
820
|
|
|
694
821
|
Then stop. The next step is `{{command_prefix}}make`.
|
|
695
822
|
|
|
@@ -710,9 +837,12 @@ each finding, run the finish again, and then `critique` runs again. See step 5 o
|
|
|
710
837
|
prevent.
|
|
711
838
|
- `confirmed: false` → the spec exists but nobody has agreed to it. Ask for
|
|
712
839
|
confirmation and stop.
|
|
713
|
-
- `mockup: pending` →
|
|
714
|
-
|
|
715
|
-
skip it
|
|
840
|
+
- `mockup: pending` → nobody has said whether to draw it. Unless the user already
|
|
841
|
+
said to skip it in asking for `make`, ask once: draw it with
|
|
842
|
+
`{{command_prefix}}mockup`, or skip it? If they skip it, write
|
|
843
|
+
`mockup: skipped — "<their words>"` in the spec and build from the spec alone.
|
|
844
|
+
Do not decide to skip it yourself, and do not finish with the spec still
|
|
845
|
+
pending: the gate holds a `make` that does.
|
|
716
846
|
|
|
717
847
|
### Build
|
|
718
848
|
|
|
@@ -817,7 +947,16 @@ and was never looked at on a phone has satisfied a third of its spec. Then run t
|
|
|
817
947
|
self-check at the end of `{{rules_path}}/00-anti-patterns.md`.
|
|
818
948
|
|
|
819
949
|
Report the `JIG_CHECK:` line, the table, and any new deviations. Then suggest
|
|
820
|
-
`{{command_prefix}}critique
|
|
950
|
+
`{{command_prefix}}critique`, now or later: the owner decides when. A page judged
|
|
951
|
+
once, as it stands, gets the verdicts it would have got straight after this build,
|
|
952
|
+
so a critique can wait for a batch of pages, or for `{{command_prefix}}ship`,
|
|
953
|
+
which will not pass until every page is judged. Where the spec says
|
|
954
|
+
`critique: at-ship`, or it is silent and `{{config_file}}` says
|
|
955
|
+
`"critique": "at-ship"`, the owner has already said to wait; do not ask. Where the
|
|
956
|
+
spec says `critique: each`, suggest it now. One
|
|
957
|
+
thing to say when it applies: if this page sets up something later pages will
|
|
958
|
+
reuse (a header, a card, a layout), a finding in it found late is fixed in every
|
|
959
|
+
page built on it, so its critique is worth running now.
|
|
821
960
|
|
|
822
961
|
## critique
|
|
823
962
|
|
|
@@ -1159,11 +1298,16 @@ preserve while fixing them.
|
|
|
1159
1298
|
|
|
1160
1299
|
**Say what happened to the last round's findings.** `verdicts` compares this
|
|
1161
1300
|
critique with the one before it in git and prints `Since the critique before
|
|
1162
|
-
this one: <n> fixed, <n>
|
|
1163
|
-
|
|
1164
|
-
The owner should not have to set two reports side
|
|
1165
|
-
make round worked. The comparison is made after both
|
|
1166
|
-
tells the arms nothing.
|
|
1301
|
+
this one: <n> fixed, <n> judged ok though the lines they cited did not change, <n>
|
|
1302
|
+
still open, <n> ruled by the owner, <n> new`, with the ids. Put that line in the
|
|
1303
|
+
report, as `verdicts` printed it, above the findings. The owner should not have to set two reports side
|
|
1304
|
+
by side to learn whether the make round worked. The comparison is made after both
|
|
1305
|
+
arms have written, so it tells the arms nothing.
|
|
1306
|
+
|
|
1307
|
+
A finding counts as fixed only where the lines it cited changed. One judged ok
|
|
1308
|
+
where nothing it pointed at changed is either two readers disagreeing about the
|
|
1309
|
+
same code, or a fix made somewhere the finding did not point. Look at which, and
|
|
1310
|
+
say so: the reading you stand by and why, or where the fix landed.
|
|
1167
1311
|
|
|
1168
1312
|
List `ruled` verdicts after the findings, under their own heading, each with the
|
|
1169
1313
|
decision it cites. They are not findings, and they are not hidden either.
|
|
@@ -1238,7 +1382,9 @@ because the drawing stays true, and no full critique, because nothing else moved
|
|
|
1238
1382
|
a page being made, not changed. Run `{{command_prefix}}spec`, `mockup` and
|
|
1239
1383
|
`make`.
|
|
1240
1384
|
- **No critique record for the page yet** (`.jig/critique/<surface>/`) → nothing
|
|
1241
|
-
has been judged, so nothing can be re-judged. Run `{{command_prefix}}critique
|
|
1385
|
+
has been judged, so nothing can be re-judged. Run `{{command_prefix}}critique`,
|
|
1386
|
+
unless the re-judge is deferred (step 4): then the page's first critique judges
|
|
1387
|
+
it whole.
|
|
1242
1388
|
- **The change adds, removes, reorders or regroups a region, changes the
|
|
1243
1389
|
navigation at any size, or would make the drawing wrong** → it is not a tweak.
|
|
1244
1390
|
Say so and name the route: `spec`, then `mockup`, then `make`. The gate checks
|
|
@@ -1256,6 +1402,14 @@ colour for a mark, how versions are written), record it in `DECISIONS.md` the wa
|
|
|
1256
1402
|
applies a rule, or answers a finding the rules already settle (a word stranded on
|
|
1257
1403
|
its own line, `B-106`), there is nothing to decide; do not invent a decision.
|
|
1258
1404
|
|
|
1405
|
+
The owner's words are the ones tweak.json records as `change`. A `**Why:**` you
|
|
1406
|
+
add quotes them, in quotation marks, and nothing else; what you read into them,
|
|
1407
|
+
or into a screenshot the owner pointed at, goes under `**Why (inferred):**`. On
|
|
1408
|
+
jig-site a tweak shown a picture of a copy button wrote an exception to `E-51`
|
|
1409
|
+
"given directly by the owner … by reference rather than words": a ruling nobody
|
|
1410
|
+
gave, which every later critique would have judged the page by. The gate stops a
|
|
1411
|
+
tweak whose new `**Why:**` quotes words tweak.json does not hold.
|
|
1412
|
+
|
|
1259
1413
|
### 2. Bring the spec in line, if it disagrees
|
|
1260
1414
|
|
|
1261
1415
|
If the spec says something the change contradicts, or the page will no longer
|
|
@@ -1297,12 +1451,61 @@ verdict and reason, adding `"tweak": "<at>"`. It changes nothing else. Then run
|
|
|
1297
1451
|
The gate holds both ends: it refuses a tweak that changed a verdict it did not
|
|
1298
1452
|
name, and one that named a verdict it did not re-judge.
|
|
1299
1453
|
|
|
1454
|
+
**The re-judge can wait**, when the owner says so. Write their words in
|
|
1455
|
+
tweak.json as `"deferred": "<what they said>"`, or `"deferred": true` where the
|
|
1456
|
+
page's spec says `critique: at-ship` (or, the spec silent, `{{config_file}}`
|
|
1457
|
+
does); keep `ids` named for whoever
|
|
1458
|
+
judges it, and leave the verdicts alone. The page then owes a critique, and
|
|
1459
|
+
`{{command_prefix}}ship` will not pass until one has judged it. Never defer it
|
|
1460
|
+
on your own account: the gate refuses a deferral nobody gave.
|
|
1461
|
+
|
|
1300
1462
|
### Finish
|
|
1301
1463
|
|
|
1302
1464
|
Report what changed, in the owner's words; the decision and spec lines you
|
|
1303
1465
|
touched, if any; each re-judged verdict and what it says now; and the
|
|
1304
1466
|
`JIG_CHECK` line. A re-judged verdict that is a finding goes to the owner: it is
|
|
1305
|
-
fixed by another tweak, or by `make` if it needs more.
|
|
1467
|
+
fixed by another tweak, or by `make` if it needs more. A deferred re-judge is
|
|
1468
|
+
reported as deferred, with the ids it will cover.
|
|
1469
|
+
|
|
1470
|
+
## ship
|
|
1471
|
+
|
|
1472
|
+
**Get the project ready to ship, by everything Jig checks.** `critique` can wait
|
|
1473
|
+
while pages are built and tweaked; here nothing is optional. `ship` does not
|
|
1474
|
+
deploy anything, and it is not a security review: Jig has no rules for security,
|
|
1475
|
+
performance or what a real screen reader does, and the report says so every time.
|
|
1476
|
+
|
|
1477
|
+
### 1. Build, then ask the CLI what is owed
|
|
1478
|
+
|
|
1479
|
+
Build the project the way it ships, then run `{{scripts_path}} ship`. It runs
|
|
1480
|
+
`check --all --ci` and `seo`, and reads every confirmed spec's critique: a page
|
|
1481
|
+
is owed a critique when it has none, when its page changed after it was judged,
|
|
1482
|
+
when a tweak deferred its re-judge, when its verdicts are incomplete, or when a
|
|
1483
|
+
finding stands that the owner has not ruled on. It prints each page's state and
|
|
1484
|
+
a `JIG_SHIP:` line, and exits non-zero until the project is ready. A spec that
|
|
1485
|
+
is not confirmed yet is in progress and not held against the ship.
|
|
1486
|
+
|
|
1487
|
+
### 2. Clear what it names
|
|
1488
|
+
|
|
1489
|
+
- **Mechanical or `seo` errors** → fix them as `make` would, and run `check`
|
|
1490
|
+
again.
|
|
1491
|
+
- **A page owed a critique** → run `critique` on it by its own procedure, in
|
|
1492
|
+
full: three arms, each a reader that has not seen this conversation or the
|
|
1493
|
+
build. The readers are independent here as everywhere; that you are
|
|
1494
|
+
orchestrating does not make you one of them.
|
|
1495
|
+
- **Findings** → put them to the owner. Each is fixed (by `make`, or `tweak` for
|
|
1496
|
+
a small one), or the owner rules on it in their own words and the ruling is
|
|
1497
|
+
recorded (`decide`, or `tweak`'s decision step), after which the verdict is
|
|
1498
|
+
`ruled`. Your view that a finding is minor is not a ruling.
|
|
1499
|
+
|
|
1500
|
+
Then build again and run `{{scripts_path}} ship` again. Repeat until it says
|
|
1501
|
+
`ready=yes`.
|
|
1502
|
+
|
|
1503
|
+
### Finish
|
|
1504
|
+
|
|
1505
|
+
Report the `JIG_SHIP:` line as printed, each page's state, what was fixed and
|
|
1506
|
+
what the owner ruled, and the line the CLI ends with naming what Jig does not
|
|
1507
|
+
check. With the Stop hook, a `ship` session is held while `jig ship` fails,
|
|
1508
|
+
unless you stop to ask the owner something.
|
|
1306
1509
|
|
|
1307
1510
|
## probe
|
|
1308
1511
|
|
|
@@ -1341,6 +1544,18 @@ blocking. It also refuses when a critique's verdict files changed after `critiqu
|
|
|
1341
1544
|
wrote them, in a session that did not run `critique`: a fix is judged by the next
|
|
1342
1545
|
review, never by the builder editing the last one.
|
|
1343
1546
|
|
|
1547
|
+
When a `critique` or `tweak` session stops, the gate records its verdicts in
|
|
1548
|
+
`.jig/critique/<surface>/verdicts.lock`. That happens after you have committed, so
|
|
1549
|
+
if your verdicts are committed it stops you once more to commit the lock on its
|
|
1550
|
+
own; the next stop passes.
|
|
1551
|
+
|
|
1552
|
+
**The lock is the gate's to write, never yours.** When the gate is wrong (it
|
|
1553
|
+
misreads the session, or asks for something the procedure does not), say what it
|
|
1554
|
+
got wrong, leave the lock as it is, and report the work as held by the gate. On
|
|
1555
|
+
jig-site the gate misread a tweak as no command at all, and the session computed
|
|
1556
|
+
the lock by hand and committed it. The lock was right that time, and a lock an
|
|
1557
|
+
agent can write is still a record of nothing.
|
|
1558
|
+
|
|
1344
1559
|
It judges the critiques this session touched: any with a file changed since the
|
|
1345
1560
|
session began, and the current spec's surface when you ran `critique`. Another
|
|
1346
1561
|
page's older critique does not hold you back. To set a critique aside for good,
|
package/templates/SKILL.md.tmpl
CHANGED
|
@@ -31,6 +31,11 @@ cite the number when you follow or deliberately break one.
|
|
|
31
31
|
so ask for the step you need rather than doing it from this summary. Never design the whole product up front. Critique findings go back to
|
|
32
32
|
`make`, then `critique` again, until clean or accepted by the user — then the
|
|
33
33
|
next feature.
|
|
34
|
+
**Asked to check or confirm a spec, or a mockup, for the owner?** Work from
|
|
35
|
+
the sheet the command shows with it: `{{command_prefix}}spec`'s from
|
|
36
|
+
`.jig/specs/<name>.checked.json` (its step 4), `{{command_prefix}}mockup`'s
|
|
37
|
+
size by size against the spec (its step 3, rendering every frame). Confirm
|
|
38
|
+
only what you checked yourself, and name to the owner what you could not.
|
|
34
39
|
**Building a screen rather than a single component?** Read `L-01 · Layout
|
|
35
40
|
method` in `{{rules_path}}/03-patterns.md` and run its five steps before
|
|
36
41
|
writing any markup. It is a procedure, not a component, so step 4 never
|
|
@@ -29,6 +29,11 @@
|
|
|
29
29
|
"argumentHint": "[--json]",
|
|
30
30
|
"status": "available"
|
|
31
31
|
},
|
|
32
|
+
"ship": {
|
|
33
|
+
"description": "Say whether the project is ready to ship, by everything Jig checks: no mechanical or seo errors, and every confirmed page critiqued as it stands, with nothing the owner has not ruled on. The slash command critiques what is owed first. Security, performance and deployment are not Jig's to check.",
|
|
34
|
+
"argumentHint": "",
|
|
35
|
+
"status": "available"
|
|
36
|
+
},
|
|
32
37
|
"verdicts": {
|
|
33
38
|
"description": "Verify a critique's verdict files: every rule in each pass judged once, no id that does not exist, no rule in the wrong arm, rendered only with a screenshot. Computes the counts the critique reports, so the agent never writes them.",
|
|
34
39
|
"argumentHint": "<surface>",
|