synthesisui 0.16.446 → 0.16.448

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.
@@ -1,4 +1,5 @@
1
1
  import { access, mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { homedir } from "node:os";
2
3
  import { dirname, join } from "node:path";
3
4
  import { hasCodexBlock, pinnedInCodex, withCodexBlock } from "./codex-mcp.js";
4
5
  import { wrapperSource } from "./statusline-wrapper.js";
@@ -341,7 +342,16 @@ async function wireCodexMcp(root) {
341
342
  * o `settings.json`, nem o invólucro, que guardaria o comando ERRADO se fosse regravado (ele já
342
343
  * aponta para si mesmo, e o anterior se perderia).
343
344
  */
344
- export async function wireStatusLine(root) {
345
+ export async function wireStatusLine(root,
346
+ /**
347
+ * A CASA, INJETADA - e não lida de `process.env` dentro do teste.
348
+ *
349
+ * O teste precisa de um `~/.claude/settings.json` de mentira, e a primeira versão trocava o
350
+ * `HOME` do processo para consegui-lo. Duas coisas erradas nisso: o gate de provas dependentes de
351
+ * máquina passa a ver este spec como quem lê a casa de quem roda - e ele estaria certo, porque
352
+ * trocar env é global e vaza para o que roda em paralelo ao lado.
353
+ */
354
+ home = homedir()) {
345
355
  const rel = "_synthesisui/statusline.mjs";
346
356
  const ours = `node ${rel}`;
347
357
  const dir = join(root, ".claude");
@@ -349,9 +359,46 @@ export async function wireStatusLine(root) {
349
359
  const settings = await readJson(path);
350
360
  const current = settings.statusLine;
351
361
  const command = typeof current?.command === "string" ? current.command : "";
352
- if (command.includes(rel))
362
+ /**
363
+ * "JÁ ESTÁ LÁ" SÃO DUAS COISAS: o ponteiro é nosso E o arquivo existe - 21/09, com o repositório
364
+ * dele na mão.
365
+ *
366
+ * Ele apagou o `_synthesisui/statusline.mjs` para recuperar a barra e rodou o `connect` de novo.
367
+ * A checagem olhava só o `statusLine` do settings, que continuava apontando para o nosso caminho:
368
+ * o comando respondeu "já está lá" e não escreveu nada. Sobrou uma configuração apontando para um
369
+ * arquivo ausente, e o Claude Code tenta rodá-lo a cada respiração da barra.
370
+ *
371
+ * Um ponteiro sem o arquivo é pior que nenhum dos dois - por isso ele é reescrito em vez de
372
+ * aceito como pronto.
373
+ */
374
+ const jaEscrito = await access(join(root, rel))
375
+ .then(() => true)
376
+ .catch(() => false);
377
+ if (command.includes(rel) && jaEscrito)
353
378
  return { status: "already there", command: ours };
354
- const was = command.trim() ? command : null;
379
+ /**
380
+ * A BARRA DELE PODE MORAR NO SETTINGS GLOBAL, E QUASE SEMPRE MORA - achado em 21/09, com o print
381
+ * dele na mão e o invólucro já instalado.
382
+ *
383
+ * A primeira versão olhava só o `.claude/settings.json` DO PROJETO. No repositório dele não havia
384
+ * `statusLine` ali - o Pulse está em `~/.claude/settings.json` -, então o invólucro nasceu com
385
+ * "não havia barra anterior" e deixaria de chamar o Pulse. Na sessão seguinte ele perderia a barra
386
+ * inteira e veria só o nosso segmento: exatamente o contrário do que ele pediu.
387
+ *
388
+ * O Claude Code resolve `statusLine` do projeto SOBRE o global, então o que a gente substitui é o
389
+ * que estava valendo ali - e o que estava valendo é o global quando o projeto cala.
390
+ */
391
+ const globalPath = join(home, ".claude", "settings.json");
392
+ const globalSettings = await readJson(globalPath);
393
+ const globalLine = globalSettings.statusLine;
394
+ const fallback = typeof globalLine?.command === "string" ? globalLine.command : "";
395
+ /**
396
+ * E O NOSSO PRÓPRIO COMANDO NUNCA VIRA "O ANTERIOR": se o `statusLine` aponta para o invólucro e
397
+ * o arquivo sumiu, guardar aquilo faria o script novo chamar a si mesmo. A barra dele, nesse
398
+ * caso, é a do global - que é onde ela estava antes de tudo isto.
399
+ */
400
+ const dele = command.includes(rel) ? "" : command;
401
+ const was = dele.trim() ? dele : fallback.trim() ? fallback : null;
355
402
  await mkdir(join(root, "_synthesisui"), { recursive: true });
356
403
  await writeFile(join(root, rel), wrapperSource(was), "utf8");
357
404
  await mkdir(dir, { recursive: true });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "synthesisui",
3
- "version": "0.16.446",
3
+ "version": "0.16.448",
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": {