@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.
Files changed (42) hide show
  1. package/.claude/skills/seven/SKILL.md +162 -0
  2. package/.claude/skills/seven/reference/audit.md +120 -0
  3. package/.claude/skills/seven/reference/brand.md +24 -0
  4. package/.claude/skills/seven/reference/clarify.md +76 -0
  5. package/.claude/skills/seven/reference/color-and-contrast.md +84 -0
  6. package/.claude/skills/seven/reference/motion-design.md +71 -0
  7. package/.claude/skills/seven/reference/polish.md +55 -0
  8. package/.claude/skills/seven/reference/product.md +45 -0
  9. package/.claude/skills/seven/reference/shape.md +85 -0
  10. package/.claude/skills/seven/reference/spatial-design.md +60 -0
  11. package/.claude/skills/seven/reference/typography.md +43 -0
  12. package/.claude/skills/seven/reference/ux-writing.md +47 -0
  13. package/.claude/skills/seven/scripts/load-context.mjs +84 -0
  14. package/.claude-plugin/marketplace.json +34 -0
  15. package/.claude-plugin/plugin.json +12 -0
  16. package/LICENSE +190 -0
  17. package/NOTICE.md +26 -0
  18. package/README.md +118 -0
  19. package/cli/bin/commands/skills.mjs +664 -0
  20. package/cli/bin/seven.mjs +68 -0
  21. package/cli/engine/browser/injected/index.mjs +84 -0
  22. package/cli/engine/cli/main.mjs +215 -0
  23. package/cli/engine/detect-antipatterns-browser.js +3014 -0
  24. package/cli/engine/detect-antipatterns.mjs +44 -0
  25. package/cli/engine/engines/browser/detect-url.mjs +108 -0
  26. package/cli/engine/engines/regex/detect-text.mjs +508 -0
  27. package/cli/engine/engines/static-html/css-cascade.mjs +957 -0
  28. package/cli/engine/engines/static-html/detect-html.mjs +211 -0
  29. package/cli/engine/engines/visual/screenshot-contrast.mjs +192 -0
  30. package/cli/engine/findings.mjs +28 -0
  31. package/cli/engine/node/file-system.mjs +212 -0
  32. package/cli/engine/profile/profiler.mjs +169 -0
  33. package/cli/engine/registry/seven-antipatterns.mjs +494 -0
  34. package/cli/engine/rules/checks.mjs +1518 -0
  35. package/cli/engine/shared/color.mjs +204 -0
  36. package/cli/engine/shared/constants.mjs +91 -0
  37. package/cli/engine/shared/page.mjs +9 -0
  38. package/cli/engine/shared/tokens.mjs +153 -0
  39. package/cli/engine/token-data.generated.mjs +691 -0
  40. package/docs/detector-rules.md +605 -0
  41. package/docs/figma-token-rule-exploration.md +185 -0
  42. 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
+ }