synthesisui 0.16.205 → 0.16.207

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.
@@ -5,22 +5,27 @@ import { pinnedHookVersion } from "../agent-wiring.js";
5
5
  import { isOlderCli } from "../cli-version.js";
6
6
  import { readToken, resolveRegistry } from "../config.js";
7
7
  import { unsentEvents } from "../doctor/ledger.js";
8
- import { CHECKER_SINCE, MATERIALISER_SINCE } from "../install-marks.js";
8
+ import { CHECKER_SINCE, MATERIALISER_SINCE, READER_SINCE, } from "../install-marks.js";
9
9
  import { measuredScope } from "../measured-scope.js";
10
- import { READER } from "../reader-version.js";
11
10
  /**
12
- * Qual leitor mediu o censo em disco, quando ele o registra.
11
+ * QUAL CLI MEDIU O CENSO EM DISCO - e era o `reader`, um inteiro, até 11/08.
13
12
  *
14
- * `null` para censo anterior a esta marca: um censo que não diz quem o leu não prova nada, e supor
15
- * que ele é velho faria toda pessoa que ainda não re-mediu ver o aviso para sempre.
13
+ * O carimbo `ledger.reader` existe e continua sendo gravado, mas ele não serve para responder esta
14
+ * pergunta: ficou parado em 1 enquanto os leitores mudavam, então censos de julho e de ontem levam
15
+ * o mesmo número e nada os separa. A versão que mediu separa - ver `READER_SINCE`.
16
+ *
17
+ * `null` para censo que não diz quem o mediu: um censo assim não prova nada, e supor que ele é
18
+ * velho faria toda pessoa que ainda não re-mediu ver o aviso para sempre.
16
19
  */
17
- async function censusReader(root) {
20
+ async function censusMeasuredBy(root) {
18
21
  const raw = await readFile(join(root, "_synthesisui", "census.json"), "utf8").catch(() => null);
19
22
  if (!raw)
20
23
  return null;
21
24
  try {
22
25
  const c = JSON.parse(raw);
23
- return typeof c.ledger?.reader === "number" ? c.ledger.reader : null;
26
+ return typeof c.ledger?.cli === "string" && c.ledger.cli
27
+ ? c.ledger.cli
28
+ : null;
24
29
  }
25
30
  catch {
26
31
  return null;
@@ -121,11 +126,13 @@ opts = {}) {
121
126
  * leitura de antes e NENHUMA re-interpretação nossa alcança isso. Só uma medição nova alcança, e
122
127
  * ela é um comando que ninguém tinha motivo para rodar.
123
128
  *
124
- * Compara `READER`, não a string do CLI: em 07/08 o CLI subiu quatro vezes e nenhuma delas mudou um
125
- * leitor - pedir re-medição em cada bump faria a pessoa parar de ler estas linhas.
129
+ * Compara contra `READER_SINCE`, e não contra a string do CLI: em 07/08 o CLI subiu quatro vezes e
130
+ * nenhuma delas mudou um leitor - pedir re-medição em cada bump faria a pessoa parar de ler estas
131
+ * linhas. E não contra o carimbo `reader`, que ficou parado em 1 enquanto os leitores andavam:
132
+ * medido em 11/08, 12 de 36 componentes têm árvore diferente entre o leitor de 07/08 e o de hoje.
126
133
  */
127
- const reader = await censusReader(root);
128
- if (reader != null && reader !== READER)
134
+ const measuredBy = await censusMeasuredBy(root);
135
+ if (behind(measuredBy, cli, READER_SINCE))
129
136
  out.push({
130
137
  says: `the measurement stored in this repo was read by an older reader, so what the platform knows about your components is what that reader could see. A re-measure is the only thing that reaches it - the fix lives on this machine, not on the server.`,
131
138
  run: "npx synthesisui sync",
@@ -58,6 +58,36 @@ const MODULE_REF = /\$\{\s*[A-Za-z_$][\w$]*\.[A-Za-z_$][\w$]*\s*\}/g;
58
58
  * que nenhum leitor cobre (`sx`, `styled`, `runtime`) já saem com o motivo, porque nesses casos o
59
59
  * motivo é a própria forma e não depende de leitura.
60
60
  */
61
+ /**
62
+ * O QUE ESTÁ DENTRO DE UM `cn(...)` E NÃO É CLASSE - e por que isto vira número na tela dele.
63
+ *
64
+ * O corpo da chamada é varrido por literal, e todo literal virava um fragmento de estilo. Dois deles
65
+ * nunca foram estilo, e a esteira estava dizendo ao cliente que não conseguia ler o que ele nem
66
+ * escreveu:
67
+ *
68
+ * status === "success" ? "bg-success-500" : ... "success" é OPERANDO da comparação
69
+ * // ... to prevent the "short width" issue "short width" está num COMENTÁRIO
70
+ *
71
+ * MEDIDO EM 11/08 no repo real, sobre as 26 declarações que o censo listava como `value-not-read`:
72
+ *
73
+ * 8 (31%) operando de === Card, RadioCard x4, SelectionCard x2
74
+ * 2 (8%) comentário Input, Tag
75
+ * 16 (61%) classe de verdade sr-only, flex flex-col, data-[side=top]:top-full, ...
76
+ *
77
+ * Ou seja: 10 das 26 eram acusação NOSSA. E a lei 8 é explícita - lacuna declarada é confiança,
78
+ * mas lacuna FALSA custa o mesmo que a escondida: ela manda a pessoa procurar um problema que não
79
+ * existe no código dela, e gasta a credibilidade do número que está certo.
80
+ */
81
+ /** Apaga comentários preservando o COMPRIMENTO, senão todo índice depois deles aponta para a linha errada. */
82
+ function blankComments(body) {
83
+ return body
84
+ .replace(/\/\*[\s\S]*?\*\//g, (m) => " ".repeat(m.length))
85
+ .replace(/\/\/[^\n]*/g, (m) => " ".repeat(m.length));
86
+ }
87
+ /** `size === "md"`: o literal é o que está sendo COMPARADO, e comparar não é vestir. */
88
+ function isComparedTo(body, index) {
89
+ return /(?:===|!==|==|!=)\s*$/.test(body.slice(0, index));
90
+ }
61
91
  export function fragmentsOfSource(file, source) {
62
92
  const out = [];
63
93
  const at = (index) => source.slice(0, index).split("\n").length;
@@ -93,12 +123,14 @@ export function fragmentsOfSource(file, source) {
93
123
  * classe escrita à mão - a forma mais comum do repo dele (113 arquivos).
94
124
  */
95
125
  for (const call of source.matchAll(CALL_LITERAL)) {
96
- const body = call[1] ?? "";
126
+ const body = blankComments(call[1] ?? "");
97
127
  const base = (call.index ?? 0) + (call[0].length - body.length - 1);
98
128
  for (const s of body.matchAll(STRING_IN_CALL)) {
99
129
  const text = s[1] ?? s[2] ?? "";
100
130
  if (!LOOKS_LIKE_CLASS.test(text))
101
131
  continue;
132
+ if (isComparedTo(body, s.index ?? 0))
133
+ continue;
102
134
  push("class", base + (s.index ?? 0), text);
103
135
  }
104
136
  }
@@ -64,3 +64,29 @@ export const MATERIALISER_SINCE = "0.16.204";
64
64
  * Os arquivos que decidem: `doctor/` inteiro e `commands/hook.ts`.
65
65
  */
66
66
  export const CHECKER_SINCE = "0.16.202";
67
+ /**
68
+ * A ÚLTIMA VERSÃO EM QUE OS LEITORES PASSARAM A PRODUZIR UM CENSO DIFERENTE.
69
+ *
70
+ * A terceira do mesmo bolo, e a que tinha o desenho MAIS antigo e mais errado. O `READER` era um
71
+ * inteiro carimbado no censo na hora da medição, e a comparação era `carimbo !== READER`. O defeito
72
+ * disso não é ruído, é PERDA DE INFORMAÇÃO: com o número parado em 1 desde 07/08, um censo medido
73
+ * ontem e um medido em julho carregam o mesmo `1` e nada os separa. Subir o número para 2 chamaria
74
+ * os dois para re-medir - inclusive quem já está em dia.
75
+ *
76
+ * Uma versão não perde nada, porque o censo já grava QUEM mediu (`StyleLedger.cli`).
77
+ *
78
+ * MEDIDO EM 11/08, rodando o leitor de 07/08 e o de hoje sobre os mesmos 35 componentes do repo
79
+ * real, e comparando o censo canônico:
80
+ *
81
+ * 12 de 36 componentes com ÁRVORE diferente - 10 lendo mais (LineChart +556 bytes)
82
+ * 8 de 36 com FRONTEIRA diferente - Tooltip, Menu, Modal, Select, ColorPicker, ...
83
+ * 2 custom properties que eram descartadas: --loader-color, --color-track
84
+ *
85
+ * Ou seja, o `READER` estava errado e ninguém tinha sido avisado. A marca nasceu em `0.16.202`,
86
+ * bisseccionada: o censo de 0.16.201 difere do de então, o de 0.16.202 é byte a byte igual.
87
+ *
88
+ * ANDOU PARA `0.16.207` no mesmo dia, e desta vez o portão é que mandou. `fragmentsOfSource` parou
89
+ * de tomar operando de `===` e texto de comentário por classe - 11 das 26 declarações que o censo
90
+ * dele listava como ilegíveis eram acusação NOSSA. Um censo medido antes disto carrega as onze.
91
+ */
92
+ export const READER_SINCE = "0.16.207";
@@ -20,5 +20,21 @@
20
20
  * READER a medição na máquina dela -> npx synthesisui sync
21
21
  * COMPILER o CSS de uma versão já instalada -> npx synthesisui connect
22
22
  * INTERPRETATION a nossa metade, sobre censos já guardados -> roda no servidor, sem comando
23
+ *
24
+ * A DECISÃO SAIU DAQUI EM 11/08, e este número virou só um carimbo.
25
+ *
26
+ * O desenho acima está certo na intenção e errado no formato: um inteiro gravado no censo NO
27
+ * MOMENTO DA MEDIÇÃO só separa duas medições se ele tiver subido entre elas. Ele não subiu - ficou
28
+ * em 1 desde 07/08 - enquanto os leitores andavam. Medido rodando o leitor daquele dia e o de hoje
29
+ * sobre os mesmos 35 componentes do repo real: 12 de 36 componentes com ÁRVORE diferente, 8 com
30
+ * FRONTEIRA diferente, e 2 custom properties que eram descartadas. Todos esses censos carregam `1`,
31
+ * e a informação para separá-los não existe mais.
32
+ *
33
+ * Subir para 2 agora chamaria para re-medir também quem já está em dia. Então quem responde
34
+ * *"este censo está velho?"* passou a ser `READER_SINCE`, em `install-marks.ts`, comparado contra a
35
+ * VERSÃO que mediu (`StyleLedger.cli`) - que o censo sempre gravou e nunca se perde.
36
+ *
37
+ * O carimbo continua sendo escrito porque ele é barato e é registro; ele só não decide mais nada.
38
+ * Sobe para 2 aqui por honestidade com o que foi medido.
23
39
  */
24
- export const READER = 1;
40
+ export const READER = 2;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "synthesisui",
3
- "version": "0.16.205",
3
+ "version": "0.16.207",
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": {