synthesisui 0.16.413 → 0.16.414

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.
@@ -159,7 +159,7 @@ async function wireHook(root, command) {
159
159
  * arquivo de um editor que a pessoa não usa, e é a primeira coisa que alguém apaga com raiva - a
160
160
  * mesma regra que já vale para o `AGENTS.md`.
161
161
  */
162
- async function wireMcpAt(root, version, rel) {
162
+ async function wireMcpAt(root, rel) {
163
163
  const path = join(root, rel);
164
164
  const config = await readJson(path);
165
165
  const servers = (config.mcpServers ?? {});
@@ -212,16 +212,21 @@ async function wireMcpAt(root, version, rel) {
212
212
  * Os caminhos de MCP que este repo merece: sempre o do Claude Code, e o do Cursor quando `.cursor/`
213
213
  * já existe. Devolve o que foi escrito, por caminho, para o `connect` poder dizer os nomes.
214
214
  */
215
- async function wireMcp(root, version) {
215
+ /**
216
+ * E NENHUM DOS TRÊS RECEBE VERSÃO, desde 10/09 - o parâmetro morreu quando o Codex passou a seguir
217
+ * a régua de `@latest` (ver `codex-mcp.ts`). Os escritores de JSON nunca a usaram: a decisão de
218
+ * 06/08 é que o MCP flutua. Um argumento que ninguém lê é o próximo a ser lido por engano.
219
+ */
220
+ async function wireMcp(root) {
216
221
  const wrote = [];
217
222
  wrote.push({
218
223
  path: ".mcp.json",
219
- status: await wireMcpAt(root, version, ".mcp.json"),
224
+ status: await wireMcpAt(root, ".mcp.json"),
220
225
  });
221
226
  if (await exists(join(root, ".cursor")))
222
227
  wrote.push({
223
228
  path: ".cursor/mcp.json",
224
- status: await wireMcpAt(root, version, ".cursor/mcp.json"),
229
+ status: await wireMcpAt(root, ".cursor/mcp.json"),
225
230
  });
226
231
  /**
227
232
  * E O CODEX, quando `.codex/` já existe - a mesma regra de evidência que decide o Cursor e a casa
@@ -234,7 +239,7 @@ async function wireMcp(root, version) {
234
239
  if (await exists(join(root, ".codex")))
235
240
  wrote.push({
236
241
  path: ".codex/config.toml",
237
- status: await wireCodexMcp(root, version),
242
+ status: await wireCodexMcp(root),
238
243
  });
239
244
  return wrote;
240
245
  }
@@ -256,11 +261,13 @@ let codexWas = null;
256
261
  export function codexPinBefore() {
257
262
  return codexWas;
258
263
  }
259
- async function wireCodexMcp(root, version) {
264
+ async function wireCodexMcp(root) {
260
265
  const path = join(root, ".codex", "config.toml");
261
266
  const current = await readFile(path, "utf8").catch(() => null);
262
267
  const had = current != null && hasCodexBlock(current);
263
- const next = withCodexBlock(current ?? "", version);
268
+ /** A MESMA pergunta que o escritor de JSON faz - ver `codexBlock`. */
269
+ const local = await exists(join(root, "node_modules", ".bin", "synthesisui"));
270
+ const next = withCodexBlock(current ?? "", local);
264
271
  if (current === next)
265
272
  return "already there";
266
273
  /**
@@ -292,7 +299,7 @@ export async function wireAgent(root, version, want) {
292
299
  session: want.hook
293
300
  ? await wireSessionStart(root, await alignCommand(root, version))
294
301
  : "skipped",
295
- mcp: want.mcp ? await wireMcp(root, version) : "skipped",
302
+ mcp: want.mcp ? await wireMcp(root) : "skipped",
296
303
  };
297
304
  }
298
305
  /**
package/dist/codex-mcp.js CHANGED
@@ -36,8 +36,10 @@ export function hasCodexBlock(text) {
36
36
  /**
37
37
  * A versão pinada dentro da nossa região - `null` quando não há região ou quando ela não pina.
38
38
  *
39
- * O `connect` usa isto para dizer de ONDE para onde a fiação andou, que é a diferença entre
40
- * "atualizei" e uma linha que a pessoa fecha sem ler.
39
+ * O `connect` usa isto para dizer de ONDE a fiação saiu, que é a diferença entre "atualizei" e uma
40
+ * linha que a pessoa fecha sem ler. Desde 10/09 a região nova nunca pina (ver `codexBlock`), então
41
+ * o que esta função encontra é sempre PASSADO - e é exatamente aí que ela vale mais: um arquivo que
42
+ * ainda diz `synthesisui@0.16.413` está preso naquele leitor, e a tela pode dizer que ele saiu.
41
43
  */
42
44
  export function pinnedInCodex(text) {
43
45
  const start = text.indexOf(BEGIN);
@@ -50,14 +52,36 @@ export function pinnedInCodex(text) {
50
52
  /**
51
53
  * A REGIÃO, montada. `args` em duas partes porque é assim que o Codex quer a linha de comando:
52
54
  * o executável em `command`, e o resto quebrado em array.
55
+ *
56
+ * A MESMA RÉGUA DE VERSÃO DO OUTRO ESCRITOR, e isto é um conserto de 10/09. Este bloco nascia
57
+ * PINADO na versão do `connect`, e o `.mcp.json` do Claude Code nasce em `@latest` desde 06/08 -
58
+ * duas ferramentas, o mesmo repositório, o mesmo servidor nosso, e respostas opostas sobre quando
59
+ * ele fica mais novo.
60
+ *
61
+ * A decisão está escrita em `agent-wiring.ts`, e vale para os dois pela mesma razão: *"um servidor
62
+ * MCP sobe UMA VEZ quando o editor abre a sessão e fica estável durante ela. Pinado, ele nunca
63
+ * ficava mais novo - e a regra que manda o agente comparar `ledger.cli` com a versão do servidor
64
+ * quase nunca disparava, porque os dois congelavam juntos no dia do `connect`"* (dono, 06/08). O
65
+ * hook é o caso oposto e continua pinado: ele resolve a CADA escrita, e ali flutuar custa 720ms-1,5s
66
+ * por edição e um comportamento que muda sob a pessoa.
67
+ *
68
+ * O QUE O CLIENTE PERCEBIA: o agente dele no Claude Code recebia o leitor publicado na sessão
69
+ * seguinte; o agente dele no Codex ficava na versão do dia em que ele rodou o `connect`, e nada na
70
+ * tela dizia que os dois estavam em versões diferentes.
71
+ *
72
+ * E O INSTALL LOCAL CONTINUA GANHANDO, também como no outro: quem tem o CLI no `node_modules`
73
+ * escolheu a versão, e `--no-install` respeita a escolha - inclusive a de quem seguiu a sugestão
74
+ * que o próprio `connect` imprime, de pôr o CLI nas `devDependencies`.
53
75
  */
54
- export function codexBlock(version) {
76
+ export function codexBlock(local) {
55
77
  return [
56
78
  BEGIN,
57
79
  "# Managed by synthesisui. Edit outside this block; this region is rewritten on connect.",
58
80
  "[mcp_servers.synthesisui]",
59
81
  'command = "npx"',
60
- `args = ["synthesisui@${version}", "mcp"]`,
82
+ local
83
+ ? 'args = ["--no-install", "synthesisui", "mcp"]'
84
+ : 'args = ["synthesisui@latest", "mcp"]',
61
85
  END,
62
86
  ].join("\n");
63
87
  }
@@ -73,8 +97,8 @@ export function codexBlock(version) {
73
97
  * perdeu. Aí a gente devolve o arquivo COMO ESTÁ: apagar até o fim seria destruir o que vem
74
98
  * depois, e é a mesma decisão que o `withHook` toma no perfil de shell.
75
99
  */
76
- export function withCodexBlock(text, version) {
77
- const block = codexBlock(version);
100
+ export function withCodexBlock(text, local) {
101
+ const block = codexBlock(local);
78
102
  if (!hasCodexBlock(text))
79
103
  return `${text.replace(/\n*$/, "")}\n\n${block}\n`.replace(/^\n+/, "");
80
104
  const start = text.indexOf(BEGIN);
@@ -367,16 +367,13 @@ export async function connect(opts) {
367
367
  ? `✓ ${one.path.padEnd(22)} ${fmt("{n} tools the agent can ask", { n: MCP_TOOL_COUNT })}`
368
368
  : one.status === "updated"
369
369
  ? /**
370
- * DUAS HISTÓRIAS DIFERENTES SOB O MESMO `updated`, e dizer a errada é pior que não
371
- * dizer: no Claude Code e no Cursor a entrada é SOLTA (`@latest`), então o que
372
- * mudou é ela parar de segurar um leitor velho. No Codex a entrada é PINADA numa
373
- * versão, e o que mudou é de qual para qual - a mesma correção que o hook recebeu
374
- * em 06/08, quando "already had it" escondia um pin antigo.
370
+ * O QUE MUDOU É SEMPRE A MESMA COISA AGORA: a entrada parou de segurar um leitor
371
+ * velho. As três ferramentas seguem a régua de 06/08 (ver `codexBlock`), então a
372
+ * frase é uma - e o Codex ganha uma metade a mais, porque ele é o único cujo
373
+ * arquivo pode estar vindo de um PIN nosso, escrito antes de 10/09.
375
374
  */
376
- one.path.endsWith(".toml")
377
- ? `✓ ${one.path.padEnd(22)} ${fmt(codexPinBefore()
378
- ? "the tools moved from {was} to this one"
379
- : "{n} tools the agent can ask", { was: codexPinBefore() ?? "", n: MCP_TOOL_COUNT })}`
375
+ one.path.endsWith(".toml") && codexPinBefore()
376
+ ? `✓ ${one.path.padEnd(22)} ${fmt("was pinned to {was} - now it follows the published reader", { was: codexPinBefore() ?? "" })}`
380
377
  : `✓ ${one.path.padEnd(22)} ${say("unpinned - it follows the published reader")}`
381
378
  : `· ${one.path.padEnd(22)} ${say("already had it")}`);
382
379
  }
@@ -39,7 +39,7 @@ register("pt-BR", {
39
39
  "· .claude/settings.json the session check was already there": "· .claude/settings.json a verificação de sessão já estava lá",
40
40
  // ── o MCP e as skills ──
41
41
  "{n} tools the agent can ask": "{n} ferramentas que o agente pode consultar",
42
- "the tools moved from {was} to this one": "as ferramentas vieram da {was} para esta",
42
+ "was pinned to {was} - now it follows the published reader": "estava pinado na {was} - agora acompanha o leitor publicado",
43
43
  "unpinned - it follows the published reader": "solto - acompanha o leitor publicado",
44
44
  "already had it": "já estava lá",
45
45
  "already current": "já está em dia",
@@ -187,7 +187,20 @@
187
187
  * O que o cliente ganha ao rodar `upgrade`: os componentes que ele já tem voltam a ser reescritos
188
188
  * pelo materializador que respeita a edição dele em TODO comando, e não só em dois.
189
189
  */
190
- export const MATERIALISER_SINCE = "0.16.412";
190
+ /**
191
+ * 0.16.412 -> 0.16.414 em 10/09: as ferramentas do sistema param de congelar no Codex. A região que
192
+ * a gente escreve em `.codex/config.toml` nascia PINADA na versão do `connect`, e o `.mcp.json` do
193
+ * Claude Code nasce solta desde 06/08 - o agente dele numa ferramenta recebia o leitor publicado na
194
+ * sessão seguinte, e na outra ficava no do dia em que ele rodou o comando. Medido no repositório do
195
+ * dono depois de um `connect` da 0.16.413: `@latest` num arquivo, `@0.16.413` no outro.
196
+ *
197
+ * São BYTES DIFERENTES na pasta dele, e o `upgrade` chama `wireAgent`: quem já instalou sai do pin
198
+ * rodando o comando, e a tela diz de qual versão ele saiu.
199
+ *
200
+ * O que o cliente ganha ao rodar `upgrade`: o agente dele no Codex volta a ler o interpretador
201
+ * publicado, em vez do que existia no dia em que ele conectou.
202
+ */
203
+ export const MATERIALISER_SINCE = "0.16.414";
191
204
  /**
192
205
  * A ÚLTIMA VERSÃO EM QUE O QUE O HOOK RODA MUDOU.
193
206
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "synthesisui",
3
- "version": "0.16.413",
3
+ "version": "0.16.414",
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": {