dd-harness 0.38.0 → 0.38.1

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.
package/dist/index.js CHANGED
@@ -446,32 +446,21 @@ async function comandoStart(argv) {
446
446
  `${desatualizado.atual}, e a mais recente é ${desatualizado.ultima}: rode ` +
447
447
  "`npm install -g dd-harness@latest` quando puder. O start continua assim mesmo.\n");
448
448
  }
449
- // 1. Credencial. Sem ela nada do resto e possivel — nem listar tenant.
450
- // O estado aparece SEMPRE, mesmo quando ja existe credencial: antes o passo era
451
- // pulado em silencio, e quem rodava `start` com um token velho (ou de outra conta)
452
- // nao tinha como perceber — o wizard so falhava depois, ao listar espacos.
453
- let token = await leToken(API_PADRAO);
454
- if (token) {
455
- // Escolha nomeada em vez de `[S/n]`: ali o Enter aceitava a credencial salva sem que
456
- // ninguem lesse qual era, e um token de outra conta so aparecia como erro varios
457
- // passos adiante. Aqui as duas saidas estao escritas, e o valor truncado fica a vista.
458
- const usar = await escolha(`Credencial em ${API_PADRAO}:`, [
459
- { rotulo: `Usar esta credencial (${mascara(token)})`, valor: true },
460
- { rotulo: "Colar outro token", valor: false },
461
- ]);
462
- if (!usar)
463
- token = null;
464
- }
465
- if (!token) {
466
- const url = `${API_PADRAO}/tokens`;
467
- console.log(`\nCrie um token pessoal em ${url} — abrindo no navegador...`);
468
- tentaAbrirNavegador(url);
469
- token = await pergunta("Cole o token aqui: ");
470
- if (!token)
471
- throw new Error("sem token não dá para seguir: `start` fala com o serviço em todos os passos.");
472
- await guardaToken(API_PADRAO, token);
473
- console.log("Credencial guardada.");
474
- }
449
+ // 1. Credencial. SEMPRE digitada, mesmo havendo uma guardada nesta maquina.
450
+ //
451
+ // Oferecer a credencial salva como opcao de menu transformava o segredo num clique:
452
+ // quem tivesse acesso ao terminal comecava a operar como o dono da conta sem nunca
453
+ // provar posse do token. Guardar para os comandos seguintes e outra coisa — ali a
454
+ // pessoa ja demonstrou que o tem. O `start` e a porta, e a porta pede a chave.
455
+ const url = `${API_PADRAO}/tokens`;
456
+ console.log(`Cole o seu token de ${API_PADRAO}.`);
457
+ console.log(`Crie um em ${url} — abrindo no navegador...`);
458
+ tentaAbrirNavegador(url);
459
+ const token = await pergunta("Token: ");
460
+ if (!token)
461
+ throw new Error("sem token não dá para seguir: `start` fala com o serviço em todos os passos.");
462
+ await guardaToken(API_PADRAO, token);
463
+ console.log("Credencial guardada.");
475
464
  console.log("");
476
465
  // 2. Espaco (tenant). Criar um e ato de dono — nunca por aqui — mas ESCOLHER entre
477
466
  // os que ja existem e so leitura, e e o que faltava para nao exigir o slug de memoria.
package/dist/pergunta.js CHANGED
@@ -8,8 +8,24 @@ import { createInterface } from "node:readline/promises";
8
8
  * projeto do zero, sem saber os slugs de memoria.
9
9
  */
10
10
  let rl = null;
11
+ let fechada = false;
12
+ /**
13
+ * Uma interface por vez, recriada quando a anterior morreu.
14
+ *
15
+ * Com stdin vindo de pipe (script, `printf | dd-harness start`), o readline consome o
16
+ * buffer e emite `close` no EOF. A referencia continua valendo, mas todo `question`
17
+ * seguinte rejeita com "readline was closed" — e o wizard morre no meio, depois de ja ter
18
+ * gravado credencial. Enquanto houve UMA pergunta por execucao isso nunca apareceu.
19
+ */
11
20
  function interfaceAtual() {
12
- return (rl ??= createInterface({ input: process.stdin, output: process.stdout }));
21
+ if (rl && fechada)
22
+ rl = null;
23
+ if (!rl) {
24
+ fechada = false;
25
+ rl = createInterface({ input: process.stdin, output: process.stdout });
26
+ rl.once("close", () => { fechada = true; });
27
+ }
28
+ return rl;
13
29
  }
14
30
  export async function pergunta(texto) {
15
31
  return (await interfaceAtual().question(texto)).trim();
@@ -17,6 +33,7 @@ export async function pergunta(texto) {
17
33
  export function fechaPerguntas() {
18
34
  rl?.close();
19
35
  rl = null;
36
+ fechada = false;
20
37
  }
21
38
  /**
22
39
  * Escolha de uma opcao: setas e Enter quando ha terminal, numeracao quando nao ha.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dd-harness",
3
- "version": "0.38.0",
3
+ "version": "0.38.1",
4
4
  "type": "module",
5
5
  "description": "Política, memória e integrações de Claude Code, Codex e Antigravity. CLI sem dependências de runtime.",
6
6
  "license": "UNLICENSED",