synthesisui 0.16.291 → 0.16.292

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.
@@ -579,8 +579,23 @@ export async function nextStepFor(root) {
579
579
  if (locks.length > 0)
580
580
  return null;
581
581
  const measured = await readFile(join(root, "_synthesisui", "census.json"), "utf8").then(() => true, () => false);
582
+ /**
583
+ * MEDIDO E SEM SISTEMA INSTALADO SÃO DUAS HISTÓRIAS, e a frase antiga contava a errada.
584
+ *
585
+ * Ela dizia *"continue the import"*, e em 23/08 foi exatamente o que o agente fez: mediu o
586
+ * repositório inteiro de novo, refez a leitura, reenviou. O sistema JÁ EXISTIA na conta dele - o
587
+ * que faltava eram os arquivos aqui, e `add` é o comando que os traz. Medir de novo custou sete
588
+ * minutos e não mudou nada do que a plataforma sabia.
589
+ *
590
+ * As duas situações que produzem este estado, e as duas terminam no mesmo comando: um import que
591
+ * criou o sistema e parou antes de instalar (o que este CLI já não faz - ver o fim de `runImport`),
592
+ * e um clone fresco de um repositório onde alguém apagou a pasta `ds/`.
593
+ *
594
+ * `list --mine` primeiro porque o slug nasce no servidor: ele não está em nenhum arquivo daqui, e
595
+ * chutá-lo seria pior que pedir para olhar.
596
+ */
582
597
  return measured
583
- ? 'This repo has been measured but has no design system yet. Ask me: "continue the import."'
598
+ ? "This repo has been measured and has no system installed here. If you already imported, the system is in your account: `synthesisui list --mine`, then `synthesisui add <slug>`."
584
599
  : 'This repo has no design system contract yet. Ask me: "import my design system."';
585
600
  }
586
601
  /**
@@ -49,6 +49,7 @@ import { phase, startProgress } from "../progress.js";
49
49
  import { repoStateOf } from "../repo-state.js";
50
50
  import { detectStack, resolveDeps, stackVersions } from "../stack.js";
51
51
  import { placeInWorkspace } from "../workspace-place.js";
52
+ import { add } from "./add.js";
52
53
  import { walk, walkAll } from "./doctor.js";
53
54
  /**
54
55
  * How many distinct values travel, PER KIND.
@@ -3942,4 +3943,42 @@ export async function runImport(opts) {
3942
3943
  if (payload?.url)
3943
3944
  console.log(body(` ${paint.blue(payload.url)}`));
3944
3945
  console.log("");
3946
+ /**
3947
+ * E O SISTEMA CHEGA NO REPOSITÓRIO DELE - quem manda importar quer usar.
3948
+ *
3949
+ * O QUE ELE VIVEU TRÊS VEZES EM 23/08: mandou importar, viu o sistema no ar com uma URL, e
3950
+ * concluiu que tinha acabado. O repositório ficava com o censo, o ledger e o relatório de
3951
+ * lacunas - sem `ds/`, sem `.lock`, sem `tokens.css`. O agente dele não sabia que o design
3952
+ * system existia, e o comando seguinte falhava com "no design system installed here". E nada
3953
+ * dizia que faltava um passo: nem o fim do import, nem a skill (que não cita `add` uma vez),
3954
+ * nem o `doctor`.
3955
+ *
3956
+ * A LINHA "não escrevemos sem pedir" já foi cruzada aqui: este comando escreve o censo, o
3957
+ * ledger, o `not-expressed.md` e um `.gitignore`. Parar antes de instalar não protegia nada -
3958
+ * interrompia. Quem quer olhar antes de escrever usa `--dry`, que retorna muito acima desta
3959
+ * linha e é onde essa responsabilidade mora.
3960
+ *
3961
+ * E É AQUI, DEPOIS DO RESUMO, e não antes: o resumo é sobre o que a leitura encontrou, e a
3962
+ * instalação é sobre o que passou a existir na máquina dele. Misturar as duas faria a saída
3963
+ * mais longa do produto ficar mais longa no lugar onde ela já é mais difícil de ler.
3964
+ */
3965
+ if (payload?.slug) {
3966
+ try {
3967
+ await add(payload.slug, {
3968
+ registry: opts.registry,
3969
+ dir: root,
3970
+ });
3971
+ }
3972
+ catch (error) {
3973
+ /**
3974
+ * O SISTEMA FOI CRIADO NO SERVIDOR, e isso não se desfaz. Uma rede que cai na materialização
3975
+ * custa os arquivos locais e nada mais - então o comando diz o que rodar, e jamais devolve
3976
+ * um erro que faria a pessoa achar que perdeu a medição.
3977
+ */
3978
+ console.log("");
3979
+ console.log(body(`Your system exists, and the files did not land here: ${error instanceof Error ? error.message : String(error)}`));
3980
+ console.log(body(` synthesisui add ${payload.slug}`));
3981
+ console.log("");
3982
+ }
3983
+ }
3945
3984
  }
@@ -21,8 +21,26 @@ import { frontierKind } from "../frontier-kind.js";
21
21
  import { importMap } from "./imports.js";
22
22
  /** Quantos lugares viajam por referência quebrada. Ver `BrokenRef.at`. */
23
23
  const MAX_PLACES = 3;
24
- /** `var(--x)`, including inside a Tailwind arbitrary value: `bg-[var(--x)]`. */
25
- const VAR_REF = /var\(\s*(--[a-zA-Z0-9_-]+)/g;
24
+ /**
25
+ * `var(--x)`, including inside a Tailwind arbitrary value: `bg-[var(--x)]`.
26
+ *
27
+ * O SEGUNDO GRUPO É O FALLBACK, e é ele que separa uma referência quebrada de uma com rede:
28
+ * `var(--aurora-angle,125deg)` pinta 125deg. Chamar isso de "não pinta nada" é dizer ao cliente que
29
+ * o código dele está defeituoso quando ele escreveu a defesa.
30
+ */
31
+ const VAR_REF = /var\(\s*(--[a-zA-Z0-9_-]+)\s*(,)?/g;
32
+ /**
33
+ * `el.style.setProperty("--tx", …)` - uma custom property DECLARADA em JavaScript.
34
+ *
35
+ * O QUE O CLIENTE RECEBIA SEM ISTO: `--tx` e `--ty` na lista de "referências que não pintam nada",
36
+ * quando um hook de tilt dele as escreve a cada movimento do mouse. O agente dele diagnosticou isso à
37
+ * mão em 23/08 e disse a frase que virou esta regra: *"o que um leitor não consegue ver é uma custom
38
+ * property escrita por JS"*. A resposta não é adivinhar - é procurar a escrita, e ela é literal.
39
+ *
40
+ * Medido em quatro populações: 2 nomes no `codelevel-ui`, 0 no `packages/ui` do `frontend-hub`, 2 no
41
+ * dashboard dele e 3 no nosso próprio app. Três de quatro escrevem variável por JS.
42
+ */
43
+ const SET_PROPERTY = /setProperty\(\s*['"`](--[a-zA-Z0-9_-]+)/g;
26
44
  /**
27
45
  * VARIABLES A HEADLESS LIBRARY SETS AT RUNTIME, which no stylesheet can declare.
28
46
  *
@@ -90,12 +108,35 @@ const NAMESPACES = [
90
108
  */
91
109
  export function findBrokenRefs(sources, declared) {
92
110
  const seen = new Map();
111
+ /**
112
+ * AS QUE O PRÓPRIO CÓDIGO DELE ESCREVE EM JAVASCRIPT - ver `SET_PROPERTY`.
113
+ *
114
+ * Colhidas de TODAS as fontes antes do laço, e não por arquivo: quem escreve `--tx` é o hook, e
115
+ * quem a lê é a folha global. São dois arquivos, e perguntar por arquivo diria que a folha
116
+ * referencia algo que ninguém declara.
117
+ */
118
+ const setInJs = new Set();
119
+ for (const { source } of sources)
120
+ for (const m of source.matchAll(SET_PROPERTY))
121
+ setInJs.add(m[1]);
93
122
  for (const { file, source } of sources) {
94
123
  const runtime = importsHeadless(source);
95
124
  for (const m of source.matchAll(VAR_REF)) {
96
125
  const name = m[1];
97
126
  if (declared.has(name))
98
127
  continue;
128
+ /**
129
+ * UMA CHAMADA COM FALLBACK NÃO ESTÁ QUEBRADA - ela pinta o fallback.
130
+ *
131
+ * Por CHAMADA e não por nome: a mesma variável pode ser lida com rede num lugar e sem rede em
132
+ * outro, e é a segunda que precisa de conserto. Contar as duas juntas ou descartar as duas
133
+ * juntas erra em direções opostas.
134
+ */
135
+ if (m[2])
136
+ continue;
137
+ /** Declarada em JS - só não em CSS. Ver `SET_PROPERTY`. */
138
+ if (setInJs.has(name))
139
+ continue;
99
140
  if (runtime && (RUNTIME_ANCHOR.has(name) || RUNTIME_PREFIX.test(name)))
100
141
  continue;
101
142
  const hit = seen.get(name) ?? {
@@ -128,7 +128,7 @@
128
128
  * é sempre o bump deste PR - nunca o número que o `package.json` já carrega, porque alguém pode
129
129
  * publicar no meio.
130
130
  */
131
- export const MATERIALISER_SINCE = "0.16.290";
131
+ export const MATERIALISER_SINCE = "0.16.292";
132
132
  /**
133
133
  * A ÚLTIMA VERSÃO EM QUE O QUE O HOOK RODA MUDOU.
134
134
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "synthesisui",
3
- "version": "0.16.291",
3
+ "version": "0.16.292",
4
4
  "description": "Bring SynthesisUI design systems into any project - tokens, typed components, whole pages and an agent-ready CLAUDE.md manifest.",
5
5
  "type": "module",
6
6
  "bin": {