@radicool/throughline 0.24.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.
Files changed (31) hide show
  1. package/README.md +6 -4
  2. package/adapters/codex/AGENTS.md +1 -0
  3. package/adapters/codex/prompts/check-figma.md +41 -0
  4. package/adapters/cursor/.cursor/commands/check-figma.md +41 -0
  5. package/adapters/generic/AGENTS.md +1 -0
  6. package/adapters/generic/commands/check-figma.md +41 -0
  7. package/package.json +1 -1
  8. package/references/figma-adherence.md +442 -0
  9. package/references/figma-checks.md +106 -43
  10. package/scripts/README.md +5 -2
  11. package/scripts/build-figma-checks.mjs +121 -23
  12. package/scripts/install.mjs +5 -1
  13. package/scripts/lib/figma-adherence-read.figma.js +207 -0
  14. package/scripts/lib/figma-adherence.mjs +146 -0
  15. package/scripts/lib/figma-checks-read.figma.js +43 -43
  16. package/scripts/lib/figma-checks.mjs +16 -5
  17. package/scripts/lib/figma-variables-read.figma.js +39 -0
  18. package/scripts/lib/fixtures/figma-adherence/clean.json +90 -0
  19. package/scripts/lib/fixtures/figma-adherence/detached-library.json +116 -0
  20. package/scripts/lib/fixtures/figma-adherence/ds01-gaps.json +84 -0
  21. package/scripts/lib/fixtures/figma-adherence/inert-all.json +45 -0
  22. package/scripts/lib/fixtures/figma-adherence/mixed-text.json +61 -0
  23. package/scripts/lib/fixtures/figma-adherence/nothing-scanned.json +49 -0
  24. package/scripts/lib/fixtures/figma-adherence/off-scale-gap.json +65 -0
  25. package/scripts/lib/fixtures/figma-adherence/override-raw.json +72 -0
  26. package/scripts/lib/fixtures/figma-adherence/padding-raw.json +74 -0
  27. package/scripts/lib/fixtures/figma-adherence/raw-colour-token.json +70 -0
  28. package/scripts/lib/fixtures/figma-adherence/root-radius.json +88 -0
  29. package/scripts/lib/fixtures/figma-adherence/skip-colour.json +86 -0
  30. package/scripts/lib/fixtures/figma-adherence/zygarden-override-bound.json +85 -0
  31. package/scripts/lib/fixtures/figma-adherence/zygarden-text-raw.json +208 -0
@@ -0,0 +1,116 @@
1
+ {
2
+ "covers": "01. Design System 2026-10-13: a frame detached from a library component, and one from a local component on another page; raw values inside a detached frame are not reported again",
3
+ "snapshot": {
4
+ "fileKey": "FILE",
5
+ "screens": [
6
+ {
7
+ "id": "0:1",
8
+ "name": "Screen"
9
+ }
10
+ ],
11
+ "nodes": [
12
+ {
13
+ "id": "4:1",
14
+ "path": "Archtypes / hud-Jordan",
15
+ "isRoot": false,
16
+ "inInstance": false,
17
+ "overridden": [],
18
+ "paints": [],
19
+ "mixedPaints": false,
20
+ "gap": null,
21
+ "padding": [],
22
+ "radius": [],
23
+ "detached": {
24
+ "kind": "library",
25
+ "name": null,
26
+ "id": null,
27
+ "key": "4412e315f15a0af7a26382d2b05781f7974a30d9"
28
+ },
29
+ "underDetached": true
30
+ },
31
+ {
32
+ "id": "4:2",
33
+ "path": "Archtypes / hud-maria",
34
+ "isRoot": false,
35
+ "inInstance": false,
36
+ "overridden": [],
37
+ "paints": [],
38
+ "mixedPaints": false,
39
+ "gap": null,
40
+ "padding": [],
41
+ "radius": [],
42
+ "detached": {
43
+ "kind": "local",
44
+ "name": null,
45
+ "id": "9:9",
46
+ "key": null
47
+ },
48
+ "underDetached": true
49
+ },
50
+ {
51
+ "id": "4:3",
52
+ "path": "Archtypes / hud-Jordan / Card",
53
+ "isRoot": false,
54
+ "inInstance": false,
55
+ "overridden": [],
56
+ "paints": [
57
+ {
58
+ "kind": "fill",
59
+ "hex": "#ffffff",
60
+ "bound": false,
61
+ "styled": false
62
+ }
63
+ ],
64
+ "mixedPaints": false,
65
+ "gap": null,
66
+ "padding": [
67
+ {
68
+ "side": "top",
69
+ "value": 16,
70
+ "bound": false
71
+ }
72
+ ],
73
+ "radius": [],
74
+ "detached": null,
75
+ "underDetached": true
76
+ }
77
+ ],
78
+ "tokens": {
79
+ "colours": {
80
+ "#ffffff": [
81
+ "color/bg/canvas"
82
+ ],
83
+ "#111827": [
84
+ "color/text/primary"
85
+ ]
86
+ },
87
+ "gap": {
88
+ "8": [
89
+ "spacing/2"
90
+ ],
91
+ "12": [
92
+ "spacing/3"
93
+ ],
94
+ "16": [
95
+ "spacing/4"
96
+ ]
97
+ },
98
+ "radius": {
99
+ "8": [
100
+ "radius/md"
101
+ ],
102
+ "32": [
103
+ "radius/xl"
104
+ ]
105
+ }
106
+ }
107
+ },
108
+ "expected": {
109
+ "pass": false,
110
+ "failures": [
111
+ "detached-component",
112
+ "detached-component"
113
+ ],
114
+ "advisories": 0
115
+ }
116
+ }
@@ -0,0 +1,84 @@
1
+ {
2
+ "covers": "01. Design System 2026-10-13: a rendering gap of 12 fails naming the token; a one-child gap of 8 is not checked",
3
+ "snapshot": {
4
+ "fileKey": "FILE",
5
+ "screens": [
6
+ {
7
+ "id": "0:1",
8
+ "name": "Screen"
9
+ }
10
+ ],
11
+ "nodes": [
12
+ {
13
+ "id": "2:1",
14
+ "path": "Templates / hero / Frame 6",
15
+ "isRoot": false,
16
+ "inInstance": false,
17
+ "overridden": [],
18
+ "paints": [],
19
+ "mixedPaints": false,
20
+ "gap": {
21
+ "value": 12,
22
+ "bound": false,
23
+ "renders": true
24
+ },
25
+ "padding": [],
26
+ "radius": [],
27
+ "detached": null
28
+ },
29
+ {
30
+ "id": "2:2",
31
+ "path": "Templates / hero / container-left",
32
+ "isRoot": false,
33
+ "inInstance": false,
34
+ "overridden": [],
35
+ "paints": [],
36
+ "mixedPaints": false,
37
+ "gap": {
38
+ "value": 8,
39
+ "bound": false,
40
+ "renders": false
41
+ },
42
+ "padding": [],
43
+ "radius": [],
44
+ "detached": null
45
+ }
46
+ ],
47
+ "tokens": {
48
+ "colours": {
49
+ "#ffffff": [
50
+ "color/bg/canvas"
51
+ ],
52
+ "#111827": [
53
+ "color/text/primary"
54
+ ]
55
+ },
56
+ "gap": {
57
+ "8": [
58
+ "spacing/2"
59
+ ],
60
+ "12": [
61
+ "spacing/3"
62
+ ],
63
+ "16": [
64
+ "spacing/4"
65
+ ]
66
+ },
67
+ "radius": {
68
+ "8": [
69
+ "radius/md"
70
+ ],
71
+ "32": [
72
+ "radius/xl"
73
+ ]
74
+ }
75
+ }
76
+ },
77
+ "expected": {
78
+ "pass": false,
79
+ "failures": [
80
+ "raw-dimension"
81
+ ],
82
+ "advisories": 0
83
+ }
84
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "covers": "a file with no colour or dimension variables fails both inert checks",
3
+ "tokens": {
4
+ "colours": {},
5
+ "gap": {},
6
+ "radius": {}
7
+ },
8
+ "snapshot": {
9
+ "fileKey": "FILE",
10
+ "screens": [
11
+ {
12
+ "id": "0:1",
13
+ "name": "Screen"
14
+ }
15
+ ],
16
+ "nodes": [
17
+ {
18
+ "id": "1:1",
19
+ "path": "Templates / Screen / Node",
20
+ "isRoot": false,
21
+ "inInstance": false,
22
+ "overridden": [],
23
+ "paints": [],
24
+ "mixedPaints": false,
25
+ "gap": null,
26
+ "padding": [],
27
+ "radius": [],
28
+ "detached": null
29
+ }
30
+ ],
31
+ "tokens": {
32
+ "colours": {},
33
+ "gap": {},
34
+ "radius": {}
35
+ }
36
+ },
37
+ "expected": {
38
+ "pass": false,
39
+ "failures": [
40
+ "colour-rule-inert",
41
+ "dimension-rule-inert"
42
+ ],
43
+ "advisories": 0
44
+ }
45
+ }
@@ -0,0 +1,61 @@
1
+ {
2
+ "covers": "a text node with mixed paints is an advisory, not a pass and not a crash",
3
+ "snapshot": {
4
+ "fileKey": "FILE",
5
+ "screens": [
6
+ {
7
+ "id": "0:1",
8
+ "name": "Screen"
9
+ }
10
+ ],
11
+ "nodes": [
12
+ {
13
+ "id": "1:1",
14
+ "path": "Templates / Screen / Node",
15
+ "isRoot": false,
16
+ "inInstance": false,
17
+ "overridden": [],
18
+ "paints": [],
19
+ "mixedPaints": true,
20
+ "gap": null,
21
+ "padding": [],
22
+ "radius": [],
23
+ "detached": null
24
+ }
25
+ ],
26
+ "tokens": {
27
+ "colours": {
28
+ "#ffffff": [
29
+ "color/bg/canvas"
30
+ ],
31
+ "#111827": [
32
+ "color/text/primary"
33
+ ]
34
+ },
35
+ "gap": {
36
+ "8": [
37
+ "spacing/2"
38
+ ],
39
+ "12": [
40
+ "spacing/3"
41
+ ],
42
+ "16": [
43
+ "spacing/4"
44
+ ]
45
+ },
46
+ "radius": {
47
+ "8": [
48
+ "radius/md"
49
+ ],
50
+ "32": [
51
+ "radius/xl"
52
+ ]
53
+ }
54
+ }
55
+ },
56
+ "expected": {
57
+ "pass": true,
58
+ "failures": [],
59
+ "advisories": 1
60
+ }
61
+ }
@@ -0,0 +1,49 @@
1
+ {
2
+ "covers": "no nodes read fails",
3
+ "snapshot": {
4
+ "fileKey": "FILE",
5
+ "screens": [
6
+ {
7
+ "id": "0:1",
8
+ "name": "Screen"
9
+ }
10
+ ],
11
+ "nodes": [],
12
+ "tokens": {
13
+ "colours": {
14
+ "#ffffff": [
15
+ "color/bg/canvas"
16
+ ],
17
+ "#111827": [
18
+ "color/text/primary"
19
+ ]
20
+ },
21
+ "gap": {
22
+ "8": [
23
+ "spacing/2"
24
+ ],
25
+ "12": [
26
+ "spacing/3"
27
+ ],
28
+ "16": [
29
+ "spacing/4"
30
+ ]
31
+ },
32
+ "radius": {
33
+ "8": [
34
+ "radius/md"
35
+ ],
36
+ "32": [
37
+ "radius/xl"
38
+ ]
39
+ }
40
+ }
41
+ },
42
+ "expected": {
43
+ "pass": false,
44
+ "failures": [
45
+ "nothing-scanned"
46
+ ],
47
+ "advisories": 0
48
+ }
49
+ }
@@ -0,0 +1,65 @@
1
+ {
2
+ "covers": "Zygarden 2026-10-13: a 200 gap no token has is an advisory",
3
+ "snapshot": {
4
+ "fileKey": "FILE",
5
+ "screens": [
6
+ {
7
+ "id": "0:1",
8
+ "name": "Screen"
9
+ }
10
+ ],
11
+ "nodes": [
12
+ {
13
+ "id": "1:1",
14
+ "path": "Templates / bg",
15
+ "isRoot": false,
16
+ "inInstance": false,
17
+ "overridden": [],
18
+ "paints": [],
19
+ "mixedPaints": false,
20
+ "gap": {
21
+ "value": 200,
22
+ "bound": false,
23
+ "renders": true
24
+ },
25
+ "padding": [],
26
+ "radius": [],
27
+ "detached": null
28
+ }
29
+ ],
30
+ "tokens": {
31
+ "colours": {
32
+ "#ffffff": [
33
+ "color/bg/canvas"
34
+ ],
35
+ "#111827": [
36
+ "color/text/primary"
37
+ ]
38
+ },
39
+ "gap": {
40
+ "8": [
41
+ "spacing/2"
42
+ ],
43
+ "12": [
44
+ "spacing/3"
45
+ ],
46
+ "16": [
47
+ "spacing/4"
48
+ ]
49
+ },
50
+ "radius": {
51
+ "8": [
52
+ "radius/md"
53
+ ],
54
+ "32": [
55
+ "radius/xl"
56
+ ]
57
+ }
58
+ }
59
+ },
60
+ "expected": {
61
+ "pass": true,
62
+ "failures": [],
63
+ "advisories": 1
64
+ }
65
+ }
@@ -0,0 +1,72 @@
1
+ {
2
+ "covers": "an overridden fill inside an instance, unbound and token-valued, fails",
3
+ "snapshot": {
4
+ "fileKey": "FILE",
5
+ "screens": [
6
+ {
7
+ "id": "0:1",
8
+ "name": "Screen"
9
+ }
10
+ ],
11
+ "nodes": [
12
+ {
13
+ "id": "1:1",
14
+ "path": "Templates / Screen / Node",
15
+ "isRoot": false,
16
+ "inInstance": true,
17
+ "overridden": [
18
+ "fills"
19
+ ],
20
+ "paints": [
21
+ {
22
+ "kind": "fill",
23
+ "hex": "#111827",
24
+ "bound": false,
25
+ "styled": false
26
+ }
27
+ ],
28
+ "mixedPaints": false,
29
+ "gap": null,
30
+ "padding": [],
31
+ "radius": [],
32
+ "detached": null
33
+ }
34
+ ],
35
+ "tokens": {
36
+ "colours": {
37
+ "#ffffff": [
38
+ "color/bg/canvas"
39
+ ],
40
+ "#111827": [
41
+ "color/text/primary"
42
+ ]
43
+ },
44
+ "gap": {
45
+ "8": [
46
+ "spacing/2"
47
+ ],
48
+ "12": [
49
+ "spacing/3"
50
+ ],
51
+ "16": [
52
+ "spacing/4"
53
+ ]
54
+ },
55
+ "radius": {
56
+ "8": [
57
+ "radius/md"
58
+ ],
59
+ "32": [
60
+ "radius/xl"
61
+ ]
62
+ }
63
+ }
64
+ },
65
+ "expected": {
66
+ "pass": false,
67
+ "failures": [
68
+ "raw-colour"
69
+ ],
70
+ "advisories": 0
71
+ }
72
+ }
@@ -0,0 +1,74 @@
1
+ {
2
+ "covers": "an unbound padding side a token has fails",
3
+ "snapshot": {
4
+ "fileKey": "FILE",
5
+ "screens": [
6
+ {
7
+ "id": "0:1",
8
+ "name": "Screen"
9
+ }
10
+ ],
11
+ "nodes": [
12
+ {
13
+ "id": "1:1",
14
+ "path": "Templates / Screen / Node",
15
+ "isRoot": false,
16
+ "inInstance": false,
17
+ "overridden": [],
18
+ "paints": [],
19
+ "mixedPaints": false,
20
+ "gap": null,
21
+ "padding": [
22
+ {
23
+ "side": "left",
24
+ "value": 16,
25
+ "bound": false
26
+ },
27
+ {
28
+ "side": "top",
29
+ "value": 16,
30
+ "bound": true
31
+ }
32
+ ],
33
+ "radius": [],
34
+ "detached": null
35
+ }
36
+ ],
37
+ "tokens": {
38
+ "colours": {
39
+ "#ffffff": [
40
+ "color/bg/canvas"
41
+ ],
42
+ "#111827": [
43
+ "color/text/primary"
44
+ ]
45
+ },
46
+ "gap": {
47
+ "8": [
48
+ "spacing/2"
49
+ ],
50
+ "12": [
51
+ "spacing/3"
52
+ ],
53
+ "16": [
54
+ "spacing/4"
55
+ ]
56
+ },
57
+ "radius": {
58
+ "8": [
59
+ "radius/md"
60
+ ],
61
+ "32": [
62
+ "radius/xl"
63
+ ]
64
+ }
65
+ }
66
+ },
67
+ "expected": {
68
+ "pass": false,
69
+ "failures": [
70
+ "raw-dimension"
71
+ ],
72
+ "advisories": 0
73
+ }
74
+ }
@@ -0,0 +1,70 @@
1
+ {
2
+ "covers": "an unbound fill whose colour a token has fails, naming the token",
3
+ "snapshot": {
4
+ "fileKey": "FILE",
5
+ "screens": [
6
+ {
7
+ "id": "0:1",
8
+ "name": "Screen"
9
+ }
10
+ ],
11
+ "nodes": [
12
+ {
13
+ "id": "1:1",
14
+ "path": "Templates / Screen / Node",
15
+ "isRoot": false,
16
+ "inInstance": false,
17
+ "overridden": [],
18
+ "paints": [
19
+ {
20
+ "kind": "fill",
21
+ "hex": "#ffffff",
22
+ "bound": false,
23
+ "styled": false
24
+ }
25
+ ],
26
+ "mixedPaints": false,
27
+ "gap": null,
28
+ "padding": [],
29
+ "radius": [],
30
+ "detached": null
31
+ }
32
+ ],
33
+ "tokens": {
34
+ "colours": {
35
+ "#ffffff": [
36
+ "color/bg/canvas"
37
+ ],
38
+ "#111827": [
39
+ "color/text/primary"
40
+ ]
41
+ },
42
+ "gap": {
43
+ "8": [
44
+ "spacing/2"
45
+ ],
46
+ "12": [
47
+ "spacing/3"
48
+ ],
49
+ "16": [
50
+ "spacing/4"
51
+ ]
52
+ },
53
+ "radius": {
54
+ "8": [
55
+ "radius/md"
56
+ ],
57
+ "32": [
58
+ "radius/xl"
59
+ ]
60
+ }
61
+ }
62
+ },
63
+ "expected": {
64
+ "pass": false,
65
+ "failures": [
66
+ "raw-colour"
67
+ ],
68
+ "advisories": 0
69
+ }
70
+ }