synthesisui 0.16.235 → 0.16.239

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/dist/guide.js CHANGED
@@ -491,8 +491,9 @@ own entry below says so.
491
491
  `
492
492
  : "";
493
493
  const hasRules = (payload.rules?.length ?? 0) > 0;
494
- const philosophy = payload.document.philosophy;
495
- const hasPhilosophy = (philosophy?.sections?.length ?? 0) > 0 || !!philosophy?.context;
494
+ // R2 (16/08): a voz não viaja mais no documento - o payload manda só o
495
+ // que ela TEM, e o conteúdo é servido pelo `system_doctrine`.
496
+ const hasPhilosophy = (payload.voice?.sections ?? 0) > 0 || payload.voice?.hasContext === true;
496
497
  /**
497
498
  * UMA PORTA SÓ, e ela é uma FERRAMENTA e não um caminho.
498
499
  *
@@ -505,7 +506,7 @@ own entry below says so.
505
506
  ? [
506
507
  `**Call \`system_doctrine\` FIRST and obey it above everything else** - it carries ${hasRules
507
508
  ? "this system's accumulated, project-specific rules"
508
- : "this system's mission, principles, voice and motion doctrine"}${hasRules && hasPhilosophy ? " and its philosophy" : ""}, pinned to the version installed here. On any conflict they win. **Without that tool, read \`_synthesisui/ds/${slug}/doctrine.json\` and the \`philosophy\` of \`design-system.json\` beside it** - the same data, and the reason it stays on disk.`,
509
+ : "this system's mission, principles, voice and motion doctrine"}${hasRules && hasPhilosophy ? " and its philosophy" : ""}, pinned to the version installed here. On any conflict they win. **Without that tool, read \`_synthesisui/ds/${slug}/doctrine.json\` for the rules** - they stay on disk so the check works offline. The voice is served from the platform and is not on disk.`,
509
510
  ]
510
511
  : [];
511
512
  const rulesNote = readFirst.length > 0
@@ -80,7 +80,16 @@
80
80
  * Zero ocorrências no sistema real medido (todos os headings dele estão aninhados, e o `children > 0`
81
81
  * já os pegava), então para ele o `upgrade` é no-op. A marca é sobre o caso geral.
82
82
  */
83
- export const MATERIALISER_SINCE = "0.16.235";
83
+ /**
84
+ * 0.16.237 -> 0.16.239 em 16/08: os arquivos que o agente dele LÊ mudam de conselho, não só de
85
+ * bytes. O bloco gerenciado do CLAUDE.md ensinava `text-info` cravado - uma classe que um sistema
86
+ * importado pode nem compilar - e passa a apontar para os papéis que o GUIDE do sistema DELE lista;
87
+ * o GUIDE do sistema adotado exemplificava com `--<slug>-color-primary`, um nome que nós derivamos,
88
+ * e passa a usar o primeiro token de cor REAL dele (a promessa três linhas acima do exemplo é
89
+ * "YOUR tokens, under YOUR names"). É a fatia de CLI da decisão de 16/08: toda superfície fala a
90
+ * língua do cliente.
91
+ */
92
+ export const MATERIALISER_SINCE = "0.16.239";
84
93
  /**
85
94
  * A ÚLTIMA VERSÃO EM QUE O QUE O HOOK RODA MUDOU.
86
95
  *
@@ -1,347 +1,15 @@
1
1
  /**
2
- * A SKILL DE MANUTENÇÃO, como o CLI a distribui.
2
+ * O STUB DA SKILL - o corpo é SERVIDO, não embarcado (R1, dono 16/08).
3
3
  *
4
- * Mesmo motivo do `skill-init.ts` e do `skill-import.ts`: o build é `tsc` e nada mais, então um `.md`
5
- * precisaria de um passo de cópia que pode silenciosamente não rodar. Um módulo TypeScript não pode
6
- * falhar em ser empacotado.
4
+ * O playbook inteiro morava aqui (13 KB) e, por consequência, no tarball
5
+ * público do npm e no repo de cada cliente em texto plano. Ele mudou para a
6
+ * plataforma (apps/web/src/lib/ds/playbooks.ts, gêmeo por spec do
7
+ * `.claude/skills/sui-adapt/SKILL.md`) e é servido pelo catalogue autenticado -
8
+ * a mesma doutrina de sempre: SERVED, NOT SHIPPED. O agente busca o sumário
9
+ * e depois SÓ o capítulo do passo em que está (a dieta de contexto).
7
10
  *
8
- * ESTA É A FONTE. A cópia em `.claude/skills/` é o que o nosso editor lê, e o spec assere que as duas
9
- * são idênticas.
10
- *
11
- * E ela é a TERCEIRA que o `connect` instala - as outras duas são de ENTRADA (primeira corrida,
12
- * import). Esta responde a pergunta do dia seguinte, apontando para uma tela: *"isso aqui está de
13
- * acordo com o meu design system?"*. Deixá-la fora do `connect` faria dela uma skill nossa, e o caso
14
- * de uso que a motivou é o cliente rodando sozinho toda semana.
11
+ * O frontmatter fica INTEIRO no stub: é a description que faz a skill ser
12
+ * invocada, e ela não é segredo - a esteira é.
15
13
  */
16
- export const ADAPT_SKILL = `---
17
- name: sui-adapt
18
- description: Confronta UM componente (ou uma página, ou uma pasta) contra o design system instalado e adapta o que der - cobertura de token medida, conserto mecânico proposto antes de escrever, e o que sobra classificado em "regra nova" ou "conserto local". Use quando alguém aponta para uma peça e pergunta se ela está de acordo com o sistema (ex. "/sui-adapt components/ui/card", "analisa esse componente aqui", "isso aqui segue o meu design system?"), como rotina semanal, ou logo depois de criar/alterar um componente. Mede antes de propor, propõe antes de escrever, e nunca arquiva pedido em nome de ninguém.
19
- ---
20
-
21
- # Adaptar uma peça ao sistema
22
-
23
- **Seu primeiro comando é a medição.** Não leia \`.mcp.json\`, não abra o censo, não liste
24
- arquivo: \`check_file\` ou \`doctor <alvo>\` responde tudo isso em um passo, e é o que o resto
25
- desta skill consome. Um agente que sai explorando antes gasta a paciência de quem pediu e
26
- chega ao mesmo lugar.
27
-
28
- O propósito do produto, que decide todo empate abaixo: **ler o repositório do cliente e
29
- devolver receitas com paridade visual, semântica e funcional, sem supor e sem inventar
30
- nada.**
31
-
32
- Esta skill é a ponta de manutenção. As outras duas que o cliente tem são de ENTRADA -
33
- \`sui-init\` e \`sui-import-ds\` transformam o repositório dele em sistema. Esta responde a
34
- pergunta do dia seguinte, que ele faz apontando para uma tela: *"isso aqui está de acordo
35
- com o meu design system?"*.
36
-
37
- \`CLAUDE.md\` manda. Quando os dois divergirem, este arquivo é que está velho.
38
-
39
- ---
40
-
41
- ## 0. COMO VOCÊ FALA COM ELE
42
-
43
- **Ele quer saber o que está no projeto DELE. Nada do que está do nosso lado interessa.**
44
-
45
- Esta seção vale acima de qualquer outra abaixo, porque uma medição perfeita escrita na
46
- nossa língua é uma medição que ele não lê. Palavras que **nunca** aparecem para ele:
47
-
48
- \`\`\`
49
- ledger · census · scope · reading as ADOPTION · refresh_system · check_file
50
- system_doctrine · carrier · alcançável · o número da versão do CLI · --fix --write
51
- cobertura de token · o nome de qualquer comando ou ferramenta nossa
52
- \`\`\`
53
-
54
- A tradução é sempre a mesma: fale do **arquivo**, da **propriedade**, do **valor** e da
55
- **variável dele**.
56
-
57
- \`\`\`
58
- em vez de diga
59
- o ledger.cli está em 0.16.229 sua ferramenta está em dia
60
- o scope do sistema é packages/ui este arquivo fica fora da pasta de onde o
61
- seu design system nasceu, e isso é normal
62
- 1em → var(--ds-spacing-md) o seu projeto já chama esse valor de \`--spacing-md\`
63
- cobertura de token: 0% nenhum destes valores vem do seu design system
64
- rode doctor --fix --write eu troco para você, se você quiser
65
- \`\`\`
66
-
67
- **A variável que você oferece é a DELE.** O comando já devolve o nome do vocabulário dele
68
- quando o repositório tem um - \`--color-lightgray-700\`, e não \`--ds-color-gray-400\`. Nunca
69
- reescreva a sugestão para o nosso prefixo: renomear a variável dele não é adotar o sistema.
70
-
71
- ## 0b. O QUE ESTA SKILL NÃO FAZ
72
-
73
- Três limites, e cada um existe por um motivo que já custou alguma coisa:
74
-
75
- \`\`\`
76
- não escreve sem propor é o repositório DELE. Escrever sem confirmação é outra
77
- categoria de confiança, e uma skill que perde essa
78
- confiança não é rodada uma segunda vez
79
- não arquiva pedido um pedido fila uma decisão na plataforma. A skill
80
- PERGUNTA; quem decide é ele
81
- não inventa token, nome um agente que cala um relatório fazendo o sistema crescer é
82
- nem regra pior que a deriva que ele veio medir
83
- \`\`\`
84
-
85
- ## 1. O ALVO, E POR QUE O ESCOPO É DECISÃO DA SKILL
86
-
87
- Componente quase nunca é um arquivo. \`Card.tsx\` costuma vir com \`Card.css\`, \`Card.stories.tsx\`
88
- e às vezes um \`index.ts\` - e medir só o \`.tsx\` produz um número que mente por omissão: o css
89
- ao lado é justamente onde os valores à mão se escondem.
90
-
91
- \`\`\`
92
- 1. resolva o alvo o que ele apontou, ou o arquivo aberto, ou o que ele acabou de mexer
93
- 2. suba para a PASTA quando o irmão existir (mesmo nome, extensão diferente)
94
- 3. DIGA qual escopo você usou, com o número de arquivos
95
- \`\`\`
96
-
97
- Nunca meça os dois e escolha o maior. Diga o que mediu - **com os nomes dos arquivos**, não
98
- com a palavra "escopo".
99
-
100
- **O alvo fora da pasta importada é o caso COMUM, e não um erro.** O sistema nasceu de uma
101
- pasta, e uma tela de app que consome o DS está fora dela - é literalmente o pedido
102
- *"conserta essa página pro meu design system"*. Ali as variáveis valem igual, porque elas
103
- são globais; o que não existe é receita daquele componente. Diga isso em uma linha, sem a
104
- palavra "escopo", e siga.
105
-
106
- ## 2. MEÇA - e a medida é determinística, não sua
107
-
108
- Duas portas, mesma resposta. Use a que a sessão tiver:
109
-
110
- \`\`\`
111
- MCP check_file { path }
112
- terminal npx synthesisui doctor <alvo>
113
- \`\`\`
114
-
115
- Não recalcule nada de cabeça. O número que você reporta é o que o comando disse.
116
-
117
- **A abertura tem três linhas e nenhuma a mais.** Ela responde "está em dia?", "o que você
118
- leu?" e "como estou?", nesta ordem:
119
-
120
- \`\`\`
121
- sua ferramenta está em dia
122
-
123
- li OverviewHeaderInformation - o componente e a folha de estilo dele, 2 arquivos
124
-
125
- 17 valores estão escritos à mão aqui, e nenhum vem do seu design system
126
- \`\`\`
127
-
128
- Se a ferramenta NÃO estiver em dia, essa primeira linha vira o primeiro item da fila, com o
129
- comando à vista - uma medição feita com a versão velha responde outra coisa.
130
-
131
- Os três grupos que o comando separa, e o que cada um vira:
132
-
133
- \`\`\`
134
- já usa uma variável nada a fazer
135
- o projeto já nomeia é uma troca - vira item, com a variável DELE ao lado
136
- ninguém nomeia é uma decisão dele - vira item, com as três saídas
137
- \`\`\`
138
-
139
- ## 3. MONTE A FILA, E CONTE OS ITENS ANTES DE COMEÇAR
140
-
141
- Aqui é onde esta skill se ganha ou se perde. Despejar tudo de uma vez - duas regras, quatro
142
- decisões, dez trocas - não é um relatório, é uma parede. Quem lê não tem como agir; só
143
- concordar ou fechar a aba.
144
-
145
- Junte tudo o que você achou numa fila ÚNICA e **ordene por custo**:
146
-
147
- \`\`\`
148
- 1º não muda um pixel troca por uma variável de mesmo valor
149
- 2º pode mudar o pixel \`em\` que segue a fonte, um degrau que colapsa
150
- 3º não é troca, é pedido variável nova, peça nova, regra nova
151
- \`\`\`
152
-
153
- Assim ele despacha o barato primeiro e para quando quiser, sem ficar devendo nada.
154
-
155
- Anuncie o tamanho antes do primeiro item, sempre, e em uma frase que ele leia:
156
-
157
- \`\`\`
158
- achei 8 coisas. 2 não mudam nada na tela, 4 podem mudar, e 2 são decisão sua.
159
- \`\`\`
160
-
161
- ## 4. UM ITEM POR VEZ, COM AS TRÊS SAÍDAS - e espere a resposta
162
-
163
- Nunca apresente o item 2 antes de ele responder o 1. O cabeçalho carrega a posição, para
164
- ele saber onde está e quanto falta. O corpo fala do componente dele, e termina numa
165
- pergunta:
166
-
167
- \`\`\`
168
- item 1 de 8
169
-
170
- OverviewHeaderInformation espaça com \`1em\` em 4 lugares, e esse valor não está
171
- ligado ao seu design system.
172
-
173
- styles.module.scss padding: 1em 0
174
- padding-right: 1em
175
- margin-left: 1em
176
- margin-right: 0.5em
177
-
178
- O que você quer fazer?
179
-
180
- 1 deixar como está
181
- 2 usar \`--spacing-md\`, que o seu projeto já tem
182
- ⚠ \`em\` segue a fonte do elemento, então isto pode mudar o espaçamento na tela
183
- 3 criar um nome novo para este valor no seu design system
184
-
185
- [1] [2] [3] ou me diga outra coisa · [parar por aqui]
186
- \`\`\`
187
-
188
- As três saídas são sempre as mesmas, porque são as três que existem de verdade:
189
-
190
- \`\`\`
191
- 1 deixar como está ele segue para o próximo, e o item entra no resumo como não mexido
192
- 2 usar uma variável você faz a edição e confirma em uma linha
193
- SE a troca puder mudar a tela, isso vem escrito NA OPÇÃO, não depois
194
- 3 criar um nome novo vira um pedido, e é ele quem manda - ver o passo 6
195
- \`\`\`
196
-
197
- E \`parar por aqui\` fecha o resumo com o que andou. É sempre legítimo.
198
-
199
- **Quando ele pedir para ver antes**, mostre as linhas e volte a perguntar - isso não conta
200
- como resposta.
201
-
202
- **Na opção 2, liste as variáveis dele quando houver mais de uma candidata.** Ele não decora
203
- o vocabulário do próprio projeto, e escolher entre dois nomes é mais fácil que lembrar de
204
- um.
205
-
206
- ## 5. AS REGRAS, QUE É A METADE QUE NENHUM COMANDO FAZ
207
-
208
- O passo 2 é determinístico e sai de graça. Este não: o sistema carrega uma doutrina em
209
- prosa, e **nada a verifica mecanicamente**. É aqui que você trabalha.
210
-
211
- \`\`\`
212
- MCP system_doctrine
213
- terminal as regras viajam no documento instalado (_synthesisui/ds/<slug>/doctrine.json)
214
- \`\`\`
215
-
216
- Leia as regras e confronte o componente com cada uma. Três respostas possíveis por regra,
217
- e a terceira é a que interessa:
218
-
219
- \`\`\`
220
- cumpre some do relatório. Diga só o total no fim
221
- NÃO cumpre vira um ITEM da fila, com arquivo, linha e as três saídas
222
- a regra não fala sobre isto vira um item de decisão - uma regra nova
223
- \`\`\`
224
-
225
- Uma regra que você teve que interpretar para aplicar não é "cumpre". É o terceiro caso.
226
-
227
- E nunca escreva "3 de 5 cumpridas". Isso lê como boletim, e as 2 que faltam são justamente
228
- as que TÊM conserto pronto - é a melhor notícia do relatório vestida como a pior.
229
-
230
- ## 6. OS PEDIDOS - você mostra o comando, ele roda
231
-
232
- Quando ele escolhe a saída 3, existem três destinos, e todos existem de verdade:
233
-
234
- \`\`\`
235
- um valor sem nome no sistema
236
- -> npx synthesisui request token --value "<valor>" --name "<como se chamaria>" --for "<o caso>"
237
- uma peça que falta
238
- -> npx synthesisui request component --name "<nome>" --for "<o caso>"
239
- o sistema não tem regra sobre este caso
240
- -> npx synthesisui request rule --name "<o que a regra diria>" --for "<o caso que pediu>"
241
- \`\`\`
242
-
243
- **Arquivar em nome dele seria decidir por ele** - e tirar dele a chance de dizer "não, isso
244
- fica local mesmo". Antes de propor uma regra nova, leia a doutrina inteira: uma regra que já
245
- existe e você não achou vira duplicata na fila, e a fila perde valor na terceira.
246
-
247
- E o nome que você propõe para a variável nova segue a convenção DELE. Se o projeto escreve
248
- \`--color-lightgray-700\`, o valor novo não vira \`--ds-color-neutral-4\`.
249
-
250
- ## 6b. A RÉGUA É O QUE DÁ PARA FAZER HOJE, E O TETO SE DIZ JUNTO
251
-
252
- **100% quase nunca é alcançável hoje, e isso não é falha dele.** Se o sistema não tem nome
253
- para \`#555\`, ninguém chega a 100% sem antes decidir criar esse nome. Um medidor que mostra
254
- 0% contra um teto imaginário faz trabalho completo parecer trabalho pela metade.
255
-
256
- Os números para a conta certa já vêm do comando:
257
-
258
- \`\`\`
259
- 3 valores à mão
260
- 2 o projeto já nomeia -> alcançável hoje: 67%
261
- 1 ninguém nomeia -> precisa de uma decisão dele
262
- \`\`\`
263
-
264
- Então o teto de hoje é 67% - e ao falar com ele, isso não se chama "alcançável", se chama
265
- *"o máximo que dá para resolver sem você decidir nada novo"*.
266
-
267
- ## 6b-2. O ÚLTIMO ITEM DA FILA É MANDAR O REGISTRO
268
-
269
- Cada escrita fica gravada numa fila local, e ela **nunca toca a rede** sozinha - essa
270
- divisão é o que mantém a verificação instalada. Uma skill que mandasse por conta própria
271
- seria a verificação ligando para casa.
272
-
273
- Então o envio é um item como os outros, o último, e ele só acontece se ele mandar:
274
-
275
- \`\`\`
276
- item 8 de 8
277
-
278
- você mudou 3 coisas nesta conversa. A plataforma ainda está pontuando este
279
- repositório pelo que ela viu da última vez.
280
-
281
- [mandar agora] [depois] npx synthesisui sync --record-only
282
- \`\`\`
283
-
284
- **\`--record-only\`, e não \`sync\` puro.** O \`sync\` completo re-mede tudo e reescreve as
285
- receitas no RASCUNHO - fazer isso no fim de uma revisão move o chão de quem está revisando.
286
-
287
- O \`sync\` COMPLETO é outro item, e só aparece quando algum item mexeu em FUNDAÇÃO (uma cor,
288
- um degrau, uma variável nova). Aí a plataforma precisa reler, e a skill diz isso sem jargão:
289
-
290
- \`\`\`
291
- isto mexeu numa das bases do seu design system, então a plataforma precisa reler o
292
- seu repositório. Você vê o resultado antes de publicar - ele reescreve as receitas no rascunho.
293
- [rodar agora] [depois] npx synthesisui sync
294
- \`\`\`
295
-
296
- Se nada foi escrito, não ofereça nem um nem outro. Um item que não tem o que mandar é ruído.
297
-
298
- ## 6c. FECHE PELO QUE ANDOU, E MOSTRE O CAMINHO ATÉ 100%
299
-
300
- \`\`\`
301
- OverviewHeaderInformation 2 arquivos
302
-
303
- dá para resolver hoje 82% é o que o seu vocabulário já cobre
304
- resolvido 82% ✓ nada mecânico ficou para trás
305
- deixado como estava 12 os \`em\`, que podem mexer no layout
306
- esperando você 3 valores que ainda não têm nome
307
- \`\`\`
308
-
309
- Nunca "0% -> 0%". Se nada era mecânico, o teto era zero, e a frase é *"não havia nada que
310
- o seu vocabulário de hoje resolvesse - o que existe são N decisões suas"*.
311
-
312
- E quando sobrou pedido, termine com o caminho, porque ele é de dois passos e o primeiro é
313
- dele:
314
-
315
- \`\`\`
316
- para chegar a 100%, faltam dois passos:
317
- 1. autorize o pedido no painel (ele já está na fila)
318
- 2. publique, e rode \`npx synthesisui upgrade\` aqui
319
- depois disso, /sui-adapt neste componente fecha em 100%
320
- \`\`\`
321
-
322
- Autorizar escreve o RASCUNHO, e o repo recebe a última PUBLICADA - por isso os dois passos.
323
- Prometer que \`upgrade\` sozinho traz a variável é mandar a pessoa rodar um comando que
324
- responde "already at the latest version".
325
-
326
- Se a fila esvaziou, o fim é uma linha só:
327
-
328
- \`\`\`
329
- dá para resolver hoje 100%
330
- resolvido 100% ✓ este componente está inteiro no seu design system
331
- \`\`\`
332
-
333
- ## 7. ROTINA
334
-
335
- Ela foi desenhada para duas horas do dia, e a segunda é a que mais rende:
336
-
337
- \`\`\`
338
- semanal "roda o sui-adapt no dashboard" - pega deriva antes de virar hábito
339
- depois de mexer componente novo, ou alteração grande: rode ANTES do commit, enquanto a
340
- decisão ainda está quente e o conserto ainda é barato
341
- \`\`\`
342
-
343
- A verificação automática já roda a metade determinística a cada escrita, calada quando não
344
- há o que dizer. Esta skill é o passo deliberado: ela junta a verificação, a doutrina e a
345
- fila numa conversa só, e termina com o cliente decidindo - não com um relatório.
346
- `;
347
14
  export const ADAPT_SKILL_PATH = ".claude/skills/sui-adapt/SKILL.md";
15
+ export const ADAPT_SKILL = '---\nname: sui-adapt\ndescription: Confronta UM componente (ou uma p\u00e1gina, ou uma pasta) contra o design system instalado e adapta o que der - cobertura de token medida, conserto mec\u00e2nico proposto antes de escrever, e o que sobra classificado em "regra nova" ou "conserto local". Use quando algu\u00e9m aponta para uma pe\u00e7a e pergunta se ela est\u00e1 de acordo com o sistema (ex. "/sui-adapt components/ui/card", "analisa esse componente aqui", "isso aqui segue o meu design system?"), como rotina semanal, ou logo depois de criar/alterar um componente. Mede antes de propor, prop\u00f5e antes de escrever, e nunca arquiva pedido em nome de ningu\u00e9m.\n---\n\n# Adaptar uma pe\u00e7a ao sistema - served live\n\nThis playbook is served from the platform, not shipped in this file - it is\nalways current, and your context only carries the step you are on.\n\n1. Call the `playbook` tool on the `synthesisui` MCP server with\n { "skill": "adapt" } - you get the framing and a table of contents.\n2. Fetch ONLY the chapter for the step you are on:\n { "skill": "adapt", "section": "<id from the toc>" }. Never fetch more\n than the current step needs.\n3. Follow it exactly. When the step is done, fetch the next chapter.\n\nIf the tool answers that you are not signed in, run `npx synthesisui login`\nin the terminal and call it again. If the `synthesisui` MCP server is not\navailable at all, run `npx synthesisui connect`, restart the session, and\ninvoke this skill again.\n';