synthesisui 0.16.382 → 0.16.384

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.
@@ -27,9 +27,30 @@ export function craftLines(craft) {
27
27
  if (craft.score === null) {
28
28
  return bodyWrapped("No component of yours was read yet, so there is no line to draw. Your tokens came through - the components are next.").map(body);
29
29
  }
30
- const lines = [
31
- body(`${paint.strong(`${craft.score}/100`)} on your ${craft.authored} component${craft.authored === 1 ? "" : "s"} - never on our kit, never on a demo.`),
32
- ];
30
+ /**
31
+ * O DENOMINADOR EM PALAVRAS, e ele existe para a nota não subir calada.
32
+ *
33
+ * Um componente sem receita nenhuma sai da média desde 06/09 - ninguém o escreveu ainda, e
34
+ * contá-lo como zero afirma que o código dele é ruim onde não há código. Mas uma nota que
35
+ * melhora sem explicação lê como régua afrouxada, então a frase diz sobre QUANTOS ela foi
36
+ * tirada.
37
+ *
38
+ * SÓ QUANDO EXISTE, e `unwritten` ausente é diferente de zero: um servidor anterior a esta
39
+ * versão não manda o campo, e afirmar "todos têm receita" ali seria inventar.
40
+ */
41
+ const plural = craft.authored === 1 ? "" : "s";
42
+ const written = craft.unwritten === undefined ? null : craft.authored - craft.unwritten;
43
+ const apart = written !== null && craft.unwritten ? craft.unwritten : 0;
44
+ const lines = bodyWrapped(`${paint.strong(`${craft.score}/100`)} on ${apart ? `${written} of your ${craft.authored}` : `your ${craft.authored}`} component${plural} - never on our kit, never on a demo.`).map(body);
45
+ /**
46
+ * A LINHA PRÓPRIA, e não uma oração dentro da primeira.
47
+ *
48
+ * Escrita junto, a frase ocupava três linhas no terminal e o fato principal - a nota - ficava
49
+ * enterrado no meio da ressalva. A nota é o que ele veio ver; por que ela é sobre 49 e não 62 é
50
+ * a segunda pergunta, e ela merece a segunda linha.
51
+ */
52
+ if (apart)
53
+ lines.push(...bodyWrapped(`${apart} have no recipe yet: counted apart, never against you.`).map((l) => body(paint.dim(l))));
33
54
  /**
34
55
  * OS RÓTULOS ALINHADOS PELO MAIS LONGO, e a largura é medida e não estimada: os nomes chegam do
35
56
  * servidor, então um padding fixo desalinharia no dia em que uma lente for renomeada lá.
@@ -35,7 +35,7 @@ import { parseSchemeBlocks } from "../doctor/scheme-blocks.js";
35
35
  import { describeSignals, emptySignals, finishSignals, readSignalsInto, } from "../doctor/signals.js";
36
36
  import { sketchOf } from "../doctor/sketch.js";
37
37
  import { describeForeign, readStyleIslands, } from "../doctor/style-island.js";
38
- import { buildLedger, describeLedger, } from "../doctor/style-ledger.js";
38
+ import { buildLedger, describeLedger, sampledForUpload, } from "../doctor/style-ledger.js";
39
39
  import { MUI_DEFAULT_SPACING, readStyledComponents, spacingOf, } from "../doctor/style-props.js";
40
40
  import { buildTable } from "../doctor/tokens.js";
41
41
  import { definitionSpan, parseClass, readInlineStyle, rootClasses, rootTag, transcribe, } from "../doctor/transcribe.js";
@@ -2802,7 +2802,10 @@ export async function takeCensus(root, opts) {
2802
2802
  * A PROCEDÊNCIA, GRAVADA - ver `measured` no tipo. `basename` e não o caminho: o nome da pasta
2803
2803
  * distingue dois monorepos parecidos sem mandar o diretório pessoal dele para o nosso servidor.
2804
2804
  */
2805
- measured: { repo: repoNameOf(root, scopeLabel), at: new Date().toISOString() },
2805
+ measured: {
2806
+ repo: repoNameOf(root, scopeLabel),
2807
+ at: new Date().toISOString(),
2808
+ },
2806
2809
  ...(scopeLabel ? { scope: scopeLabel } : {}),
2807
2810
  /**
2808
2811
  * O DENOMINADOR DO FORA - ver `outside-scope.ts`.
@@ -4492,8 +4495,17 @@ export async function runImport(opts) {
4492
4495
  * ler `_synthesisui/ds/<slug>/.lock`, que num import não existe de qualquer forma. Todo campo do
4493
4496
  * payload é opcional, então o que falta simplesmente não viaja - em vez de o conjunto todo faltar.
4494
4497
  */
4498
+ /**
4499
+ * O QUE SOBE É AMOSTRA; O QUE FICA NO REPOSITÓRIO DELE É INTEIRO - `INV-COLETA-18`.
4500
+ *
4501
+ * `sampledForUpload` aplica o teto AQUI, depois de o censo já ter sido gravado em
4502
+ * `_synthesisui/census.json`. O tamanho deste corpo não muda em byte nenhum - é o mesmo 4 096
4503
+ * de sempre -, e o que muda é que o arquivo dele deixou de ser podado por um limite nosso.
4504
+ */
4495
4505
  body: JSON.stringify({
4496
- census,
4506
+ census: census.ledger
4507
+ ? { ...census, ledger: sampledForUpload(census.ledger) }
4508
+ : census,
4497
4509
  name: chosen,
4498
4510
  ...(opts.group ? { group: opts.group } : {}),
4499
4511
  ...(repoAtImport ? { repo: repoAtImport } : {}),
@@ -6,6 +6,7 @@ import { readToken, resolveRegistry } from "../config.js";
6
6
  import { inherit, readDeclaredForms, } from "../doctor/declared-forms.js";
7
7
  import { markSent, readEvents } from "../doctor/ledger.js";
8
8
  import { checkableName, closeRequest, readRequests, verifyAndCloseRequests, } from "../doctor/requests.js";
9
+ import { sampledForUpload } from "../doctor/style-ledger.js";
9
10
  import { describeDelta, fingerprintReadings, readSyncMark, writeSyncMark, } from "../last-sync.js";
10
11
  import { measuredScope, rememberScope } from "../measured-scope.js";
11
12
  import { fromCensus } from "../memory/observation.js";
@@ -556,7 +557,18 @@ export async function remeasure(args) {
556
557
  "content-type": "application/json",
557
558
  Authorization: `Bearer ${token}`,
558
559
  },
559
- body: JSON.stringify({ census }),
560
+ /**
561
+ * O QUE SOBE É AMOSTRA; O QUE FICA NO REPOSITÓRIO DELE É INTEIRO - `INV-COLETA-18`.
562
+ *
563
+ * A gravação em `_synthesisui/census.json` acontece acima, e ela leva o ledger COMPLETO: é dali
564
+ * que `gaps` e a skill `sui-reader` tiram a forma, o lugar e o texto de cada declaração que
565
+ * nenhum leitor entendeu. O teto vale só para o nosso lado, e o tamanho deste corpo não muda.
566
+ */
567
+ body: JSON.stringify({
568
+ census: census.ledger
569
+ ? { ...census, ledger: sampledForUpload(census.ledger) }
570
+ : census,
571
+ }),
560
572
  }).catch(() => null);
561
573
  if (!res?.ok) {
562
574
  console.log(body(res
@@ -291,12 +291,11 @@ declared) {
291
291
  * declarado e um teto silencioso. Inverter as duas linhas devolve o defeito.
292
292
  */
293
293
  group.distinctTexts.add(f.text);
294
- if (group.unreadable.length < DISTINCT_CAP)
295
- group.unreadable.push({
296
- file: f.file,
297
- line: f.line,
298
- text: f.text.replace(/\s+/g, " ").trim().slice(0, 400),
299
- });
294
+ group.unreadable.push({
295
+ file: f.file,
296
+ line: f.line,
297
+ text: f.text.replace(/\s+/g, " ").trim().slice(0, 400),
298
+ });
300
299
  }
301
300
  groups.set(key, group);
302
301
  }
@@ -413,17 +412,27 @@ values) {
413
412
  *
414
413
  * O QUE ELA NÃO FAZ é prometer o desfecho - mesma correção que `shape-not-read` recebeu em
415
414
  * 24/08. Ela diz quantos textos viajam e o que isso significa para um leitor que a gente
416
- * publique depois; para onde vai o resto depende de uma decisão de tamanho de censo que não é
417
- * do cliente e ainda não foi tomada.
415
+ * publique depois.
416
+ *
417
+ * ─────────────────────────────────────────────────────────────────────────
418
+ * E EM 06/09 ELA TROCOU DE SENTIDO, porque o teto trocou de lado - `INV-COLETA-18`.
419
+ *
420
+ * A frase antiga dizia *"de N textos, 4096 viajam"* sobre um arquivo que TAMBÉM estava podado:
421
+ * o corte acontecia na construção, então o `census.json` dele levava os mesmos 4096. Agora o
422
+ * arquivo dele leva todos, e o que é amostrado é só o que sobe para nós.
423
+ *
424
+ * A CONDIÇÃO PASSOU A SER O TETO, e não `unreadable.length`: aquele campo agora vale `distinct`
425
+ * sempre, então a comparação antiga nunca seria verdadeira e a frase sumiria em silêncio - uma
426
+ * lacuna declarada virando lacuna calada por efeito colateral, que é o oposto da lei 8.
418
427
  */
419
- if (g.distinct !== undefined && g.distinct > g.unreadable.length)
428
+ if (g.distinct !== undefined && g.distinct > DISTINCT_CAP)
420
429
  lines.push(
421
430
  /**
422
431
  * `census` ERA O NOSSO NOME NA TELA DELE - trocado por "the measurement we already have",
423
432
  * que é o que a palavra significa do lado dele. Pego pela régua de `INV-VOC-05` no dia em
424
433
  * que `doctor/` entrou nela (03/09).
425
434
  */
426
- ` of ${g.distinct} distinct texts here, ${g.unreadable.length} travel with the measurement we already have - a reader we publish later reaches those without you running this again, and the remaining ${g.distinct - g.unreadable.length} need another scan`);
435
+ ` all ${g.distinct} distinct texts stay in the measurement file in your repository - the ${g.distinct - DISTINCT_CAP} past the first ${DISTINCT_CAP} did not travel to us, so a reader we publish later reaches those only after another scan`);
427
436
  for (const e of g.examples)
428
437
  lines.push(` ${e.file}:${e.line} ${e.text.slice(0, 80)}`);
429
438
  }
@@ -445,3 +454,39 @@ export function describeValueRuler(values) {
445
454
  `Of the ${values.seen} class declarations on your components, ${values.structure} are structure (layout plumbing, not design decisions). Of the ${decisions} design decisions, ${closed} are interpreted${values.answered > 0 ? ` (${values.answered} of them answered by you)` : ""} - ${percent}%.`,
446
455
  ];
447
456
  }
457
+ /**
458
+ * O CORTE, APLICADO DEPOIS DA BIFURCAÇÃO - fecha o `pending` de `INV-COLETA-18`.
459
+ *
460
+ * A REGRA, do dono (05/09): *"coisas que a gente não interpreta a gente continua enviando para o
461
+ * usuário, para o agente saber o que fazer"*. Falhar em ler degrada a NOSSA metade; nunca o insumo
462
+ * dele.
463
+ *
464
+ * O QUE ACONTECIA. `buildLedger` cortava em `DISTINCT_CAP` durante a CONSTRUÇÃO, e o objeto podado
465
+ * era o mesmo que ia para os dois lados: gravado em `_synthesisui/census.json` na máquina dele E
466
+ * enviado ao nosso banco. Um teto que existe pelo NOSSO custo de armazenamento estava podando o
467
+ * arquivo de onde o agente DELE tira a forma, o lugar e o texto. Medido em 03/09, com o teto solto:
468
+ *
469
+ * web-subscribe component-not-admitted 9 722 distintos, 4 096 viajavam 58% fora
470
+ * web-subscribe shape-not-read 8 016 distintos, 4 096 viajavam 49% fora
471
+ * frontend-hub/dashboard component-not-admitted 6 394 distintos, 4 096 viajavam 36% fora
472
+ *
473
+ * AGORA A CONSTRUÇÃO GUARDA TUDO e quem chama decide. O disco dele recebe o ledger inteiro; o corpo
474
+ * do POST passa por aqui. O tamanho do que sobe não muda em byte nenhum - é o mesmo 4 096 de antes.
475
+ *
476
+ * E `distinct` NÃO É RECALCULADO aqui, de propósito: ele conta os distintos que a MEDIÇÃO viu, e é
477
+ * exatamente a diferença entre ele e `unreadable.length` que diz ao servidor que a lista recebida é
478
+ * amostra. Recalcular apagaria a única evidência do corte - o defeito que `INV-COB-14` protege.
479
+ *
480
+ * O TETO DAS FORMAS entra junto porque responde à mesma pergunta e ao mesmo custo: `formsTotal`
481
+ * continua dizendo quantas existem.
482
+ */
483
+ export function sampledForUpload(ledger) {
484
+ return {
485
+ ...ledger,
486
+ unread: ledger.unread.map((group) => ({
487
+ ...group,
488
+ unreadable: group.unreadable.slice(0, DISTINCT_CAP),
489
+ ...(group.forms ? { forms: group.forms.slice(0, FORM_CAP) } : {}),
490
+ })),
491
+ };
492
+ }
@@ -680,7 +680,18 @@ export const CHECKER_SINCE = "0.16.378";
680
680
  * posição de conteúdo. Um censo medido antes desta versão conta como deriva o que a folha do app
681
681
  * nem alcança - e o número do cliente é a promessa.
682
682
  */
683
- export const READER_SINCE = "0.16.381";
683
+ /**
684
+ * 0.16.381 -> 0.16.383 em 06/09: o censo produzido MUDA, e do lado DELE. `DISTINCT_CAP` cortava os
685
+ * textos durante a construção do ledger, então o mesmo objeto podado era gravado em
686
+ * `_synthesisui/census.json` na máquina dele e enviado para nós - um teto que existe pelo NOSSO
687
+ * custo podando o insumo DELE (`INV-COLETA-18`). Agora `buildLedger` guarda tudo e o corte é
688
+ * aplicado só no corpo do POST. Um censo medido antes desta versão tem o arquivo dele podado em
689
+ * todo grupo acima de 4 096 textos distintos, e só um `sync` traz o resto.
690
+ * QUEM NÃO É AFETADO: quem não tem nenhum grupo acima de 4 096 - o `sync` daquele repositório não
691
+ * muda um byte. Medido em 06/09: `frontend-hub/apps/web-dashboard` tem UM grupo acima (6 393), e
692
+ * `packages/ui` e `apps/web-review` nenhum.
693
+ */
694
+ export const READER_SINCE = "0.16.383";
684
695
  /**
685
696
  * O QUE ESTÁ INSTALADO AQUI FICOU PARA TRÁS - e as DUAS condições que fazem isso ser verdade.
686
697
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "synthesisui",
3
- "version": "0.16.382",
3
+ "version": "0.16.384",
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": {