@etus/seven-skill 0.1.0-beta.1
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/.claude/skills/seven/SKILL.md +162 -0
- package/.claude/skills/seven/reference/audit.md +120 -0
- package/.claude/skills/seven/reference/brand.md +24 -0
- package/.claude/skills/seven/reference/clarify.md +76 -0
- package/.claude/skills/seven/reference/color-and-contrast.md +84 -0
- package/.claude/skills/seven/reference/motion-design.md +71 -0
- package/.claude/skills/seven/reference/polish.md +55 -0
- package/.claude/skills/seven/reference/product.md +45 -0
- package/.claude/skills/seven/reference/shape.md +85 -0
- package/.claude/skills/seven/reference/spatial-design.md +60 -0
- package/.claude/skills/seven/reference/typography.md +43 -0
- package/.claude/skills/seven/reference/ux-writing.md +47 -0
- package/.claude/skills/seven/scripts/load-context.mjs +84 -0
- package/.claude-plugin/marketplace.json +34 -0
- package/.claude-plugin/plugin.json +12 -0
- package/LICENSE +190 -0
- package/NOTICE.md +26 -0
- package/README.md +118 -0
- package/cli/bin/commands/skills.mjs +664 -0
- package/cli/bin/seven.mjs +68 -0
- package/cli/engine/browser/injected/index.mjs +84 -0
- package/cli/engine/cli/main.mjs +215 -0
- package/cli/engine/detect-antipatterns-browser.js +3014 -0
- package/cli/engine/detect-antipatterns.mjs +44 -0
- package/cli/engine/engines/browser/detect-url.mjs +108 -0
- package/cli/engine/engines/regex/detect-text.mjs +508 -0
- package/cli/engine/engines/static-html/css-cascade.mjs +957 -0
- package/cli/engine/engines/static-html/detect-html.mjs +211 -0
- package/cli/engine/engines/visual/screenshot-contrast.mjs +192 -0
- package/cli/engine/findings.mjs +28 -0
- package/cli/engine/node/file-system.mjs +212 -0
- package/cli/engine/profile/profiler.mjs +169 -0
- package/cli/engine/registry/seven-antipatterns.mjs +494 -0
- package/cli/engine/rules/checks.mjs +1518 -0
- package/cli/engine/shared/color.mjs +204 -0
- package/cli/engine/shared/constants.mjs +91 -0
- package/cli/engine/shared/page.mjs +9 -0
- package/cli/engine/shared/tokens.mjs +153 -0
- package/cli/engine/token-data.generated.mjs +691 -0
- package/docs/detector-rules.md +605 -0
- package/docs/figma-token-rule-exploration.md +185 -0
- package/package.json +76 -0
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# Exploração de regras a partir de tokens e Figma
|
|
2
|
+
|
|
3
|
+
Data: 2026-05-20
|
|
4
|
+
|
|
5
|
+
## Objetivo
|
|
6
|
+
|
|
7
|
+
Adaptar o detector do `pbakaus/impeccable` para o Seven sem copiar o gosto visual
|
|
8
|
+
genérico do upstream. A regra para Seven é: o detector precisa proteger o que o
|
|
9
|
+
Design System já declarou como verdade, principalmente Figma, `@etus/tokens` e
|
|
10
|
+
os componentes canônicos.
|
|
11
|
+
|
|
12
|
+
## Fontes verificadas
|
|
13
|
+
|
|
14
|
+
- Upstream `pbakaus/impeccable` em `642f03d`, com detector CLI, skill, browser
|
|
15
|
+
bundle e catálogo de anti-patterns.
|
|
16
|
+
- Registro Figma/código em `docs/seven-ds-components.md`: arquivo
|
|
17
|
+
`Core Components - Seven` (`ssJ2nEYUiAsMylSuP9KTzE`), 147 bullets Figma,
|
|
18
|
+
106 matches Figma/código e 89 itens code-only.
|
|
19
|
+
- Fontes Figma em `.claude/skills/figma-sync/figma-sources.json`: arquivo de
|
|
20
|
+
tokens `Tokens - Seven` (`ZDTC9C9iBrBLwaZkteuYit`) e arquivo de componentes
|
|
21
|
+
`Core Components - Seven`.
|
|
22
|
+
- Tokens locais em `packages/tokens/src/**/*.tokens.json`, especialmente
|
|
23
|
+
`semantic-colors`, `radius`, `spacing`, `typography`, `focus-ring` e tokens
|
|
24
|
+
por componente.
|
|
25
|
+
- 87 caches locais de Figma em `ai_review/components/*/variables.json`.
|
|
26
|
+
- Figma MCP ao vivo:
|
|
27
|
+
- Button `1007:301`: Inter, `radius/md = 8`, `border-width/border = 1`,
|
|
28
|
+
`height/h-8|h-9|h-10`, `brand/primary/*`, `brand/secondary/*`,
|
|
29
|
+
`core/border/ring`.
|
|
30
|
+
- Sidebar nav item `1087:204`: Inter, spacing `8/12`, radius `4`, foreground
|
|
31
|
+
e muted foreground semânticos.
|
|
32
|
+
- Tokens spacing `125:941`: escala documentada de spacing pequeno, médio e
|
|
33
|
+
grande.
|
|
34
|
+
|
|
35
|
+
## O que já está bem encaminhado
|
|
36
|
+
|
|
37
|
+
O port atual acertou na decisão mais importante: manteve a arquitetura do
|
|
38
|
+
impeccable, mas trocou os julgamentos de gosto por contratos do Seven. Exemplos:
|
|
39
|
+
|
|
40
|
+
- `overused-font` virou `non-inter-font`, porque Inter é requisito do Seven.
|
|
41
|
+
- `gradient-text` virou `gradient-text-decorative`, mantendo o tell de IA, mas
|
|
42
|
+
com justificativa do sistema.
|
|
43
|
+
- `side-tab` e `border-accent-on-rounded` foram fundidos em
|
|
44
|
+
`side-stripe-border`, agora condicionado a stripe lateral colorido.
|
|
45
|
+
- Regras próprias do Seven já existem: type hints Tailwind v4, fuchsia fora de
|
|
46
|
+
chart, pt-BR, radius misturado, Lucide-only, tactile press e copy sem dash
|
|
47
|
+
longo.
|
|
48
|
+
- O pacote agora está separado como `@etus/seven-skill`, evitando conflito com
|
|
49
|
+
o pacote umbrella do Design System.
|
|
50
|
+
|
|
51
|
+
## Regra adicionada nesta exploração
|
|
52
|
+
|
|
53
|
+
### `raw-tailwind-palette-color`
|
|
54
|
+
|
|
55
|
+
Problema: o detector já pegava `#19e699`, `rgb(...)` e `oklch(...)`, mas deixava
|
|
56
|
+
passar `bg-green-500`, `text-neutral-900`, `border-red-200`, `ring-blue-500`.
|
|
57
|
+
Esses utilitários também bypassam a camada semântica de `@etus/tokens`.
|
|
58
|
+
|
|
59
|
+
Evidência:
|
|
60
|
+
|
|
61
|
+
- `PRODUCT.md` fixa a escada: Figma > `tokens.css` > `DESIGN.md` > docs.
|
|
62
|
+
- Figma Button vivo usa `brand/primary/*`, `brand/secondary/*`,
|
|
63
|
+
`core/background/*`, `core/border/*`, não classes de paleta Tailwind.
|
|
64
|
+
- Nos 87 `variables.json`, os tokens recorrentes são semânticos:
|
|
65
|
+
`core/background/muted-foreground` apareceu 62 vezes, `core/border/border`
|
|
66
|
+
48 vezes, `core/background/foreground` 42 vezes e `core/border/ring` 26 vezes.
|
|
67
|
+
|
|
68
|
+
Implementação:
|
|
69
|
+
|
|
70
|
+
- Regra textual em `cli/engine/rules/checks.mjs`.
|
|
71
|
+
- Catálogo em `cli/engine/registry/seven-antipatterns.mjs`.
|
|
72
|
+
- Fixture fail/pass em `tests/fixtures/antipatterns/`.
|
|
73
|
+
- Documentação em `docs/detector-rules.md` e `source/reference/color-and-contrast.md`.
|
|
74
|
+
- Exceção para `data-role="chart"` e SVG, preservando chart colors.
|
|
75
|
+
|
|
76
|
+
## Regras que eu adicionaria depois
|
|
77
|
+
|
|
78
|
+
### 1. `focus-ring-token-required`
|
|
79
|
+
|
|
80
|
+
Detectar elementos interativos com `outline: none`, `focus:outline-none` ou
|
|
81
|
+
remover foco sem restaurar `focus-visible` via `var(--ring)`.
|
|
82
|
+
|
|
83
|
+
Por que vale: Figma Button declara efeitos `Focus Ring - Primary`,
|
|
84
|
+
`Focus Ring - Secondary`, `Focus Ring - Ghost` e `Focus Ring - Destructive`.
|
|
85
|
+
O token local também tem `focus-ring.tokens.json`. Essa regra protege
|
|
86
|
+
acessibilidade e identidade ao mesmo tempo.
|
|
87
|
+
|
|
88
|
+
Risco: precisa evitar falso positivo em componentes que delegam foco para
|
|
89
|
+
Radix ou para wrappers. Eu faria primeiro como regex text-only com fixture e
|
|
90
|
+
depois aprofundaria no engine DOM.
|
|
91
|
+
|
|
92
|
+
### 2. `off-scale-radius`
|
|
93
|
+
|
|
94
|
+
Detectar radius bruto fora da escala canônica: `2, 4, 8, 12, 16, 20, 24, 32,
|
|
95
|
+
999/9999`. A regra atual `radius-mixed-scales` pega mistura no mesmo elemento,
|
|
96
|
+
mas não pega `rounded-[7px]` ou `border-radius: 10px`.
|
|
97
|
+
|
|
98
|
+
Por que vale: `radius.tokens.json`, Figma Button e vários caches convergem em
|
|
99
|
+
`radius/md = 8`, `radius/sm = 4`, `radius/lg = 12`, `radius/pill = 999`.
|
|
100
|
+
|
|
101
|
+
Risco: Figma ainda tem aliases legados como `border-radius/md = 6` e alguns
|
|
102
|
+
componentes cacheados usam `rounded-sm = 2`. Antes de ativar como erro, eu
|
|
103
|
+
criaria uma allowlist gerada dos tokens locais + caches Figma.
|
|
104
|
+
|
|
105
|
+
### 3. `off-scale-spacing`
|
|
106
|
+
|
|
107
|
+
Detectar `padding`, `margin` e `gap` com valores fora da escala de spacing.
|
|
108
|
+
|
|
109
|
+
Por que vale: Figma spacing e os caches mostram escala recorrente (`2, 4, 6, 8,
|
|
110
|
+
12, 16, 20, 24, 32, 40, 48, 56, 64`) e o pacote local expõe aliases de spacing.
|
|
111
|
+
|
|
112
|
+
Risco: há uma diferença real entre `packages/tokens/src/spacing.tokens.json`
|
|
113
|
+
(aliases 4/8/16/32/48/64 e local-only 80+) e Figma vivo/cacheado (também usa
|
|
114
|
+
2/6/10/12/20/24/40/56). Eu não bloquearia isso sem antes consolidar a tabela.
|
|
115
|
+
|
|
116
|
+
### 4. `component-height-drift`
|
|
117
|
+
|
|
118
|
+
Detectar botões/inputs/controles usando alturas que não batem com tokens do
|
|
119
|
+
componente. Exemplo: Button vivo usa `h-8`, `h-9`, `h-10` e radius `md`.
|
|
120
|
+
|
|
121
|
+
Por que vale: pega drift de implementação que passa por cor/contraste, mas
|
|
122
|
+
quebra a sensação do componente.
|
|
123
|
+
|
|
124
|
+
Risco: precisa mapear componente para token. Eu só faria depois de extrair uma
|
|
125
|
+
matriz `component -> allowed sizes` a partir de `packages/tokens/src/components`
|
|
126
|
+
e Figma `variables.json`.
|
|
127
|
+
|
|
128
|
+
### 5. `semantic-neutral-bypass`
|
|
129
|
+
|
|
130
|
+
Versão mais estrita da regra adicionada agora: além de utilitários Tailwind de
|
|
131
|
+
paleta crua, detectar usos de variáveis muito primitivas (`--neutral-*`,
|
|
132
|
+
`--brand-primary-*`) quando existe token semântico (`--foreground`,
|
|
133
|
+
`--primary`, `--border`, `--muted-foreground`).
|
|
134
|
+
|
|
135
|
+
Por que vale: Seven quer que runtime consuma semântica, não escala primitiva.
|
|
136
|
+
|
|
137
|
+
Risco: componentes do próprio DS às vezes precisam referenciar primitives para
|
|
138
|
+
definir semântica. Essa regra deve ser consumer-only ou ter path/package
|
|
139
|
+
exemptions fortes.
|
|
140
|
+
|
|
141
|
+
## Regras que eu não portaria do impeccable
|
|
142
|
+
|
|
143
|
+
- `single-font`: no upstream é problema, no Seven é requisito.
|
|
144
|
+
- `overused-font`: idem, Inter é fonte canônica.
|
|
145
|
+
- `italic-serif-display`: Seven não tem serif display.
|
|
146
|
+
- `hero-eyebrow-chip` e `repeated-section-kickers`: são regras de landing page,
|
|
147
|
+
não de um design system operacional.
|
|
148
|
+
- `ai-color-palette` genérica: melhor substituir por regras concretas do Seven
|
|
149
|
+
(`fuchsia-in-ui-chrome`, `raw-tailwind-palette-color`, tokens semânticos,
|
|
150
|
+
contraste).
|
|
151
|
+
|
|
152
|
+
## Como eu geraria regras daqui para frente
|
|
153
|
+
|
|
154
|
+
1. Extrair uma tabela versionada de evidências:
|
|
155
|
+
- tokens locais: nome, tipo, valor, origem.
|
|
156
|
+
- Figma caches: frequência de chave/valor em `ai_review/components`.
|
|
157
|
+
- Figma live: amostras de nós críticos, principalmente Button, Input, Tabs,
|
|
158
|
+
Sidebar e Drawer.
|
|
159
|
+
2. Classificar cada candidato:
|
|
160
|
+
- `deterministic`: dá para detectar com AST/texto/DOM sem julgamento.
|
|
161
|
+
- `advisory`: precisa de contexto visual ou decisão humana.
|
|
162
|
+
- `do-not-port`: regra upstream que conflita com Seven.
|
|
163
|
+
3. Para cada regra deterministic:
|
|
164
|
+
- registrar no catálogo;
|
|
165
|
+
- criar fixture fail/pass;
|
|
166
|
+
- documentar em `docs/detector-rules.md`;
|
|
167
|
+
- rodar dogfood em `packages/ui/src` com baseline explícito;
|
|
168
|
+
- só então considerar CI/gate.
|
|
169
|
+
4. Manter uma regra por comportamento observável. Evitar regras que só
|
|
170
|
+
descrevem "parece estranho" sem token, Figma node ou guideline local.
|
|
171
|
+
|
|
172
|
+
## Próximo corte recomendado
|
|
173
|
+
|
|
174
|
+
O próximo PR deveria ser `focus-ring-token-required`. É mais seguro e mais
|
|
175
|
+
valioso do que spacing/radius neste momento, porque:
|
|
176
|
+
|
|
177
|
+
- tem fonte clara no Figma e nos tokens;
|
|
178
|
+
- afeta acessibilidade;
|
|
179
|
+
- tem baixo risco de bloquear layout legítimo;
|
|
180
|
+
- complementa `missing-tactile-press`, que já olha affordance interativa.
|
|
181
|
+
|
|
182
|
+
Depois disso, eu faria uma mini-ferramenta de extração de evidência para
|
|
183
|
+
`off-scale-radius` e `off-scale-spacing`, mas deixaria as duas como advisory até
|
|
184
|
+
resolver a divergência entre tokens locais e aliases que ainda aparecem nos
|
|
185
|
+
caches do Figma.
|
package/package.json
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@etus/seven-skill",
|
|
3
|
+
"version": "0.1.0-beta.1",
|
|
4
|
+
"description": "Seven Design System skill, plugin, and CLI detector for AI coding agents — ETUS Digital",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/etusdigital/seven.git",
|
|
9
|
+
"directory": "packages/seven-skill"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/etusdigital/seven#readme",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/etusdigital/seven/issues"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"design-system",
|
|
17
|
+
"claude-code",
|
|
18
|
+
"skill",
|
|
19
|
+
"plugin",
|
|
20
|
+
"ai",
|
|
21
|
+
"etus",
|
|
22
|
+
"seven"
|
|
23
|
+
],
|
|
24
|
+
"type": "module",
|
|
25
|
+
"bin": {
|
|
26
|
+
"seven": "./cli/bin/seven.mjs"
|
|
27
|
+
},
|
|
28
|
+
"exports": {
|
|
29
|
+
".": "./cli/engine/detect-antipatterns.mjs",
|
|
30
|
+
"./detect": "./cli/engine/detect-antipatterns.mjs",
|
|
31
|
+
"./package.json": "./package.json"
|
|
32
|
+
},
|
|
33
|
+
"files": [
|
|
34
|
+
"cli",
|
|
35
|
+
".claude",
|
|
36
|
+
".claude-plugin",
|
|
37
|
+
"docs",
|
|
38
|
+
"README.md",
|
|
39
|
+
"LICENSE",
|
|
40
|
+
"NOTICE.md"
|
|
41
|
+
],
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"css-select": "^5.2.2",
|
|
44
|
+
"css-tree": "^3.0.0",
|
|
45
|
+
"domutils": "^3.1.0",
|
|
46
|
+
"htmlparser2": "^9.1.0"
|
|
47
|
+
},
|
|
48
|
+
"optionalDependencies": {
|
|
49
|
+
"puppeteer": "^23.0.0"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@types/css-tree": "^2.3.10",
|
|
53
|
+
"@types/node": "^25.0.6",
|
|
54
|
+
"tsx": "^4.21.0",
|
|
55
|
+
"typescript": "^5.9.3",
|
|
56
|
+
"vitest": "^4.1.7",
|
|
57
|
+
"@etus/tokens": "^0.4.0-beta.2",
|
|
58
|
+
"@etus/tsconfig": "0.0.0"
|
|
59
|
+
},
|
|
60
|
+
"engines": {
|
|
61
|
+
"node": ">=18.0.0"
|
|
62
|
+
},
|
|
63
|
+
"publishConfig": {
|
|
64
|
+
"access": "public"
|
|
65
|
+
},
|
|
66
|
+
"scripts": {
|
|
67
|
+
"build": "tsx build/build.ts && node build/build-token-data.mjs && node build/build-browser-detector.mjs",
|
|
68
|
+
"build:harnesses": "tsx build/build.ts",
|
|
69
|
+
"build:tokens": "node build/build-token-data.mjs",
|
|
70
|
+
"build:browser": "node build/build-browser-detector.mjs",
|
|
71
|
+
"test": "vitest run",
|
|
72
|
+
"test:watch": "vitest",
|
|
73
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
74
|
+
"detect": "node cli/bin/seven.mjs detect"
|
|
75
|
+
}
|
|
76
|
+
}
|