@domandigital/craft 0.5.0 → 0.7.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,115 @@
1
1
  # @domandigital/craft
2
2
 
3
+ ## 0.7.0
4
+
5
+ ### Minor Changes
6
+
7
+ - dbdef56: Signal 2, the counterfactual. `craft null build --brief "..." --out <dir>` asks `claude -p` for about 20 home pages from the brief alone, renders and fingerprints each, and writes `null.json`. `craft audit <url> --null <dir>` scores how typical a page is against them: the share of the model's own pages that sit further out than this one, typical at 0.10 or above, with the choices it shares with most of them. `craft tells harvest <dir>` lists what recurs across null pages and which tell already catches it, so the next generation of tells comes from what the model builds now. `snapshotUrls` in `@domandigital/craft/audit` snapshots several pages through one browser. The rendered reveal check now also reads the text blocks inside a section, so reveals on cards two levels down are no longer read as a still page.
8
+ - f765c69: Signal 3, the estate. `craft estate add <url | snapshot.json> --id <id>` fingerprints a shipped site into `estate.json`; `craft estate compare` lists every pair, or one site against the rest, closest first, and marks siblings: two sites closer together than two pages Claude builds for one brief (0.31, or measured again from `--null`). What a pair shares is named in plain words ("Fraunces headline", "no accent"). `--strict` exits 1 on a sibling. `craft direction propose --estate estate.json` reads the register. The fingerprint no longer takes a small painted patch, such as a floating chat button, for the accent: a painted colour needs a panel's worth of area.
9
+ - f3c3dc0: The character report. `craft report <url | snapshot.json>` reads a site against all three signals and the reason rule (`--repo`, `--null`, `--estate`, `--direction`) and gives a verdict: default, mixed, decided, or unproven when something was not measured. The actions come in retrofit order, one per choice, with every reason that points at it. `craft retrofit` writes them as a Markdown checklist that names the art-direction choice settling each change, shows the decided value, and ends with what to leave alone. `characterReport` and `retrofitPlan` are exported. System font keywords such as `ui-monospace` no longer read as CSS variable names.
10
+
11
+ ### Patch Changes
12
+
13
+ - 235b558: Export the copy catalogue's word and phrase lists as portable JSON
14
+ (`wordListsJson()`, checked in at `word-lists.json`), so a non-TypeScript
15
+ consumer can source from them instead of duplicating them by hand.
16
+
17
+ `claude-kit`'s `copy_check.py` hardcoded its own copies of these same lists
18
+ and had drifted from this package (documented in claude-kit's
19
+ `house-style/copy-rules.md`, "Note the enforcement gap"). `word-lists.json` is
20
+ the file that ends the drift: `install/sync-copy-wordlists.sh` on that side
21
+ copies it in verbatim, the same shape `sync-craft-standard.sh` already uses
22
+ for `STANDARD.md`.
23
+
24
+ No tell's detection or severity changed. Regenerate the checked-in file with
25
+ `pnpm --filter @domandigital/craft run docs` after editing any list in
26
+ `tells/copy.ts`.
27
+
28
+ ## 0.6.0
29
+
30
+ ### Minor Changes
31
+
32
+ - 8c6304b: Character, phase A: a tell catalogue, a source scanner, a copy engine, and the `craft` command.
33
+
34
+ The standard asks whether a surface is well made. The new CHARACTER.md asks
35
+ whether anyone decided how it looks. A site can pass every craft number and
36
+ still be the indigo-and-Inter answer a model gives any brief.
37
+
38
+ - `scanSource(files)` finds 21 design tells in markup, component code and CSS,
39
+ tagged by generation: the first wave (indigo, blue-to-purple gradients, Inter,
40
+ glass panels, hero straight into a trust strip, icon-card grids, reveal on
41
+ every section, pills everywhere, a stock shadcn dump) and the second (cream
42
+ grounds, italic serif display, eyebrow chips, icon tiles, bento grids, radial
43
+ glows, graph-paper backgrounds, marquees, hairline-border cards, intro
44
+ cinematics).
45
+ - It reads classes the way Tailwind does, through `cn()`, `clsx()` and `cva()`,
46
+ and colour in hex, `rgb()`, `hsl()` and `oklch()` in raw CSS, `@theme` blocks
47
+ and arbitrary values. Hue is judged in OKLCh, so a violet set as `#5a35d1` is
48
+ caught.
49
+ - `checkCopy(files)` finds 8 copy tells, including em dashes, "not just X, it's
50
+ Y", staccato triplets and "where X meets Y". The word and phrase lists are
51
+ exported data with a test per entry.
52
+ - `craft scan [--staged]`, `craft copy`, `craft tells list`. Exceptions are
53
+ declared in `art-direction.json` with a `because`; one without a reason is
54
+ not applied and is reported.
55
+ - Every tell ships as `warn`. Nothing blocks until its estate hits have been
56
+ read. Every entry has a flag case per detection path and a pass case, and
57
+ the test proves each one fires on its own.
58
+
59
+ STANDARD.md section 10 now hands layout defaults to CHARACTER.md. Still eleven sections.
60
+
61
+ - 161a771: The house copy rules move into craft, so `copy-check` can become a thin wrapper over `craft copy --json`.
62
+
63
+ - Ten tells carry the lists that claude-kit's `copy-check` hardcoded: `ai-phrase`,
64
+ `plainer-word`, `plain-english`, `buzzword`, `negative-reassurance`, `emoji`,
65
+ `no-x-no-y`, `no-x-badge`, `review-phrase` and `vague-word`. `not-just-but` now
66
+ covers every form of contrastive negation the house rules name, including the
67
+ parallel participle ("dispatched from here, not shipped in from Seoul").
68
+ Each word and phrase belongs to exactly one tell, with a test per entry.
69
+ Every tell still ships as `warn`. Catalogue `2026.09.2`, 39 tells.
70
+ - `copy-ok` or `craft-ok` on a finding's line, or the line above, suppresses it.
71
+ Suppressed findings are listed in `report.suppressed`, never hidden.
72
+ - `craft copy` never reads a comment as copy, reads JSX text that runs into an
73
+ expression, reads the text inside HTML held in a string, sees short strings
74
+ for the dash, emoji and badge tells, leaves a lone dash placeholder alone,
75
+ and reads `.jsonl` (a Sanity export) a document per line.
76
+ - Class lists written with arbitrary values (`bg-[var(--bg-elevated)]`) are no
77
+ longer read as prose.
78
+
79
+ - 8093ad7: Phase B: the rendered page. `craft snapshot`, `craft audit`, rendered detection paths and a fingerprint.
80
+
81
+ - `@domandigital/craft/audit` captures a snapshot of a live page in Chromium: faces by
82
+ text and headline, colours by painted area, button shape, sections in running order
83
+ and which wait for a scroll, glass, gradients, glows, grid backgrounds, marquees,
84
+ hairline-shadow cards, the eyebrow chip, and an intro that covers the page at load.
85
+ Playwright is an optional peer dependency; the core import never loads a browser.
86
+ `collectInPage` is exported for any caller already driving a page.
87
+ - 18 tells gain a rendered detection path, with their own flag and pass snapshots,
88
+ proved like every other path. `auditSnapshot(snapshot)` judges a saved snapshot
89
+ without a browser. Catalogue `2026.09.3`.
90
+ - `fingerprint(snapshot)` and `fingerprintDistance(a, b)`: accent and ground in
91
+ OKLCh, display and body faces, roundness, reveal density, effects and running order,
92
+ compared 0 to 1. `nearest()` ranks a set.
93
+ - `craft audit <url | snapshot.json> [--repo dir]` reports the page and its source
94
+ together, with the fingerprint. `HTTPS_PROXY` is honoured.
95
+ - Colour parsing reads `oklab()` and `color(srgb ...)`, which browsers return.
96
+ - First estate baseline recorded in CHARACTER.md and `calibration/estate/2026-09-23/`.
97
+
98
+ - ee6d6cd: Phase C: `art-direction.json`, the reason rule, and `craft direction init | validate | propose`.
99
+
100
+ - A schema for the seven expressive choices (accent, ground, display, body, shape, motif,
101
+ signature), the sources in the client's world they come from, and the tell exceptions
102
+ from phase A. Ships as `art-direction.schema.json` for editors.
103
+ - `validateDirection` applies the reason rule: a reason is a sentence, cites a declared
104
+ source and mentions what that source shows; preferences, mood boards and unconfirmed
105
+ proposals are rejected; a value on the tell catalogue needs an exception. Given a
106
+ fingerprint it warns where the page does not show what the file declares.
107
+ - `initDirection` writes today's choices with empty reasons. `propose` reads dominant
108
+ colours off PNG photos (`paletteFromPixels`, k-means in OKLab) and drafts choices ranked
109
+ away from the reflex band and the estate, every one marked `PROPOSED:` until a person
110
+ rewrites it.
111
+ - An exceptions-only file stays valid.
112
+
3
113
  ## 0.5.0
4
114
 
5
115
  ### Minor Changes