synthesisui 0.16.186 → 0.16.188

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.
@@ -0,0 +1,32 @@
1
+ /**
2
+ * QUEM ESTÁ ATRÁS DE QUEM, e só isso.
3
+ *
4
+ * O aviso "a newer reader is published" disparava por DIFERENÇA, nos dois sentidos. Em 08/08 o dono
5
+ * rodou `sync` com 0.16.187 recém-publicada, e a plataforma - que ainda não tinha feito deploy -
6
+ * respondia 0.16.186. A tela dele disse *"You are running 0.16.187 and 0.16.186 is published"* debaixo
7
+ * de um título que promete o contrário, e mandou rodar `connect` para "atualizar" para uma versão
8
+ * mais velha que a dele.
9
+ *
10
+ * Esse estado não é raro, é a regra: publicar no npm e fazer deploy da plataforma não são o mesmo
11
+ * instante, então entre um e outro quem instala do npm fica na frente. Um alarme que toca quando está
12
+ * tudo certo é um alarme que a pessoa aprende a ignorar - e é o mesmo alarme que precisa ser lido no
13
+ * dia em que ela estiver de verdade para trás.
14
+ *
15
+ * Espelha `isOlderCli` de `apps/web/src/lib/ds/reinterpret.ts`. Não é um gêmeo por spec como
16
+ * `frontier-kind.ts`: aqui não há contrato compartilhado, só a mesma aritmética de três números.
17
+ */
18
+ export function isOlderCli(mine, published) {
19
+ const parts = (v) => v.split(".").map((p) => Number.parseInt(p, 10));
20
+ const a = parts(mine);
21
+ const b = parts(published);
22
+ for (let i = 0; i < Math.max(a.length, b.length); i += 1) {
23
+ const left = a[i];
24
+ const right = b[i];
25
+ /** Versão que não é numérica não se compara - e acusar o que não se sabe ler é pior que calar. */
26
+ if (!Number.isFinite(left) || !Number.isFinite(right))
27
+ return false;
28
+ if (left !== right)
29
+ return left < right;
30
+ }
31
+ return false;
32
+ }
@@ -1,5 +1,6 @@
1
1
  import { readdir, readFile } from "node:fs/promises";
2
2
  import { join, resolve } from "node:path";
3
+ import { isOlderCli } from "../cli-version.js";
3
4
  import { readToken, resolveRegistry } from "../config.js";
4
5
  import { readEvents } from "../doctor/ledger.js";
5
6
  import { readRequests } from "../doctor/requests.js";
@@ -150,7 +151,7 @@ export async function status(opts) {
150
151
  * Não vira um item do `align`: o CLI subiu seis vezes num dia e nenhuma delas mudou um leitor, e a
151
152
  * verificação de abertura tem que ficar muda nesses casos. Aqui é diferente - a pessoa PERGUNTOU.
152
153
  */
153
- const behindCli = remote.publishedCli && opts.cli && remote.publishedCli !== opts.cli
154
+ const behindCli = remote.publishedCli && opts.cli && isOlderCli(opts.cli, remote.publishedCli)
154
155
  ? {
155
156
  says: `your CLI is ${opts.cli} and ${remote.publishedCli} is published - a newer reader sees styles this one cannot.`,
156
157
  run: "npx synthesisui@latest upgrade",
@@ -1,5 +1,6 @@
1
1
  import { readdir, readFile, writeFile } from "node:fs/promises";
2
2
  import { join, resolve } from "node:path";
3
+ import { isOlderCli } from "../cli-version.js";
3
4
  import { readToken, resolveRegistry } from "../config.js";
4
5
  import { markSent, readEvents } from "../doctor/ledger.js";
5
6
  import { checkableName, closeRequest, readRequests, verifyAndCloseRequests, } from "../doctor/requests.js";
@@ -201,7 +202,9 @@ export async function remeasure(args) {
201
202
  * pode movê-lo é quem roda o comando. Então o número é dito aqui, com o comando ao lado, em vez de
202
203
  * viver numa tela que alguém precisa lembrar de abrir.
203
204
  */
204
- if (stored.publishedCli && args.cli && stored.publishedCli !== args.cli) {
205
+ if (stored.publishedCli &&
206
+ args.cli &&
207
+ isOlderCli(args.cli, stored.publishedCli)) {
205
208
  console.log(section("A newer reader is published"));
206
209
  console.log(body(`You are running ${args.cli} and ${stored.publishedCli} is published. The measurement below uses ${args.cli}.`));
207
210
  console.log(paint.blue(snippet(["npx synthesisui@latest connect"])));
package/dist/progress.js CHANGED
@@ -14,6 +14,19 @@
14
14
  * writes a carriage return into a transcript.
15
15
  */
16
16
  const BAR_WIDTH = 24;
17
+ /**
18
+ * O INTERVALO MÍNIMO ENTRE DOIS QUADROS - e ele existe por causa do CLIPBOARD, não da velocidade.
19
+ *
20
+ * A linha se redesenha com `\r`, então na tela ela é UMA linha e a leitura é ótima. Copiar é outra
21
+ * história: o `\r` não sobrevive à seleção, então cada repintura vira um pedaço do texto colado. Em
22
+ * 08/08 o dono tentou copiar a saída de um `sync` e levou junto 2 172 quadros - um por arquivo de
23
+ * evidência -, o que enterrou o relatório que ele queria mostrar (dono, 08/08).
24
+ *
25
+ * 80ms é o teto do que um olho aproveita: acima de ~12 quadros por segundo a animação já lê como
26
+ * contínua, e o resto é trabalho que só o clipboard vê. No caso dele isso troca 2 172 quadros por
27
+ * algumas dezenas, sem tirar um único frame que alguém fosse perceber.
28
+ */
29
+ const MIN_FRAME_MS = 80;
17
30
  /** Every this-many items, the non-TTY path prints one line. Enough to see movement in
18
31
  * a piped log without turning it into the log. */
19
32
  const MILESTONE_EVERY = 25;
@@ -49,9 +62,12 @@ function tail(label, width) {
49
62
  export function startProgress(title, opts) {
50
63
  const write = opts?.write ?? ((s) => process.stdout.write(s));
51
64
  const tty = opts?.isTty ?? Boolean(process.stdout.isTTY);
65
+ const now = opts?.now ?? (() => Date.now());
52
66
  let total = opts?.total ?? 0;
53
67
  let done = 0;
54
68
  let last = "";
69
+ /** `-Infinity` para o PRIMEIRO passo pintar sempre: silêncio no começo lê como travado. */
70
+ let painted = Number.NEGATIVE_INFINITY;
55
71
  const paint = () => {
56
72
  const count = total > 0 ? `${done} of ${total}` : String(done);
57
73
  const line = ` ${bar(done, total)} ${count} ${tail(last, 40)}`;
@@ -64,6 +80,14 @@ export function startProgress(title, opts) {
64
80
  done += 1;
65
81
  last = label;
66
82
  if (tty) {
83
+ /**
84
+ * O ÚLTIMO SEMPRE PINTA, mesmo dentro da janela: parar num "2 100 de 2 172" e pular para o
85
+ * resumo faria a barra parecer que desistiu antes do fim.
86
+ */
87
+ const at = now();
88
+ if (at - painted < MIN_FRAME_MS && !(total > 0 && done === total))
89
+ return;
90
+ painted = at;
67
91
  paint();
68
92
  return;
69
93
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "synthesisui",
3
- "version": "0.16.186",
3
+ "version": "0.16.188",
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": {