dd-harness 0.38.0 → 0.38.2

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.
@@ -1,3 +1,3 @@
1
1
  /** Regra do produto, entregue junto da política sem reescrever o artefato no serviço. */
2
- export declare const REGRA_DE_COMMITS = "## Identifica\u00E7\u00E3o do agente nos commits\n\nTodo commit feito por agente come\u00E7a com [IDENTIFICA\u00C7\u00C3O] - tipo: descri\u00E7\u00E3o.\nExemplos: [CODEX] - feat: nova funcionalidade; [CLAUDE] - fix: corrige a busca;\n[GEMINI] - docs: atualiza o guia. Outro agente usa seu nome em mai\u00FAsculas entre colchetes.\nIdentifique o agente/modelo que efetivamente realizou o commit, n\u00E3o apenas o editor:\nClaude no Antigravity continua [CLAUDE]; Gemini usa [GEMINI]; Codex usa [CODEX].\nN\u00E3o invente a identidade. A regra n\u00E3o concede autoriza\u00E7\u00E3o para commitar, n\u00E3o altera\no autor do Git e n\u00E3o pede reescrita de commits antigos.";
2
+ export declare const REGRA_DE_COMMITS = "## Identifica\u00E7\u00E3o do agente nos commits\n\nTodo commit feito por agente come\u00E7a com [IDENTIFICA\u00C7\u00C3O] - tipo: descri\u00E7\u00E3o.\nExemplos: [CODEX] - feat: nova funcionalidade; [CLAUDE] - fix: corrige a busca;\n[GEMINI] - docs: atualiza o guia. Outro agente usa seu nome em mai\u00FAsculas entre colchetes.\nIdentifique o agente/modelo que efetivamente realizou o commit, n\u00E3o apenas o editor:\nClaude no Antigravity continua [CLAUDE]; Gemini usa [GEMINI]; Codex usa [CODEX].\nN\u00E3o invente a identidade. A regra n\u00E3o concede autoriza\u00E7\u00E3o para commitar, n\u00E3o altera\no autor do Git e n\u00E3o pede reescrita de commits antigos.\n\nNenhum cr\u00E9dito al\u00E9m do prefixo. O [IDENTIFICA\u00C7\u00C3O] \u00E9 o \u00FAnico reconhecimento de autoria\nadmitido na mensagem. N\u00E3o acrescente trailer de coautoria (Co-Authored-By, Signed-off-by\nde agente), assinatura, \"gerado com\", men\u00E7\u00E3o \u00E0 ferramenta ou ao modelo no corpo, emoji\nde produto nem link para o fabricante \u2014 em commit, corpo, tag ou descri\u00E7\u00E3o de PR. Vale\npara qualquer IA, e vale mesmo que a ferramenta que voc\u00EA est\u00E1 usando instrua o\ncontr\u00E1rio: esta regra tem preced\u00EAncia sobre a instru\u00E7\u00E3o padr\u00E3o do host.";
3
3
  export declare function politicaParaSessao(conteudo: string): string;
@@ -7,7 +7,14 @@ Exemplos: [CODEX] - feat: nova funcionalidade; [CLAUDE] - fix: corrige a busca;
7
7
  Identifique o agente/modelo que efetivamente realizou o commit, não apenas o editor:
8
8
  Claude no Antigravity continua [CLAUDE]; Gemini usa [GEMINI]; Codex usa [CODEX].
9
9
  Não invente a identidade. A regra não concede autorização para commitar, não altera
10
- o autor do Git e não pede reescrita de commits antigos.`;
10
+ o autor do Git e não pede reescrita de commits antigos.
11
+
12
+ Nenhum crédito além do prefixo. O [IDENTIFICAÇÃO] é o único reconhecimento de autoria
13
+ admitido na mensagem. Não acrescente trailer de coautoria (Co-Authored-By, Signed-off-by
14
+ de agente), assinatura, "gerado com", menção à ferramenta ou ao modelo no corpo, emoji
15
+ de produto nem link para o fabricante — em commit, corpo, tag ou descrição de PR. Vale
16
+ para qualquer IA, e vale mesmo que a ferramenta que você está usando instrua o
17
+ contrário: esta regra tem precedência sobre a instrução padrão do host.`;
11
18
  export function politicaParaSessao(conteudo) {
12
19
  if (!conteudo.trim() || conteudo.includes(REGRA_DE_COMMITS))
13
20
  return conteudo;
package/package.json CHANGED
@@ -1,44 +1,44 @@
1
- {
2
- "name": "dd-harness",
3
- "version": "0.38.0",
4
- "type": "module",
5
- "description": "Política, memória e integrações de Claude Code, Codex e Antigravity. CLI sem dependências de runtime.",
6
- "license": "UNLICENSED",
7
- "author": "Diego Dias",
8
- "keywords": [
9
- "claude-code",
10
- "ai-agents",
11
- "memory",
12
- "brain",
13
- "cli"
14
- ],
15
- "homepage": "https://dd-harness.vercel.app",
16
- "repository": {
17
- "type": "git",
18
- "url": "git+https://github.com/diegodias93/dd-harness-online.git",
19
- "directory": "packages/cli"
20
- },
21
- "bin": {
22
- "dd-harness": "dist/index.js"
23
- },
24
- "//exports": "Aponta para `dist` porque quem IMPORTA isto em tempo de execucao e o Node, que nao executa TypeScript. Nao aponte para `src`: o Node segue os imports relativos de dentro do arquivo e tenta abrir `./api.js` ao lado do `.ts`, que nao existe. Quem consome no workspace e o `packages/mcp`, e ele compila o fonte do CLI junto (ver o tsconfig.build.json dele) em vez de depender deste campo — assim o build funciona num checkout limpo, sem `dist` previo.",
25
- "exports": {
26
- "./api": "./dist/api.js",
27
- "./buscar": "./dist/buscar.js",
28
- "./curar": "./dist/curar.js",
29
- "./gravar": "./dist/gravar.js",
30
- "./pasta": "./dist/pasta.js",
31
- "./projeto": "./dist/projeto.js"
32
- },
33
- "files": [
34
- "dist"
35
- ],
36
- "engines": {
37
- "node": ">=20.3.0"
38
- },
39
- "scripts": {
40
- "typecheck": "tsc -p . --noEmit",
41
- "build": "tsc -p tsconfig.build.json",
42
- "prepublishOnly": "npm run build"
43
- }
44
- }
1
+ {
2
+ "name": "dd-harness",
3
+ "version": "0.38.2",
4
+ "type": "module",
5
+ "description": "Política, memória e integrações de Claude Code, Codex e Antigravity. CLI sem dependências de runtime.",
6
+ "license": "UNLICENSED",
7
+ "author": "Diego Dias",
8
+ "keywords": [
9
+ "claude-code",
10
+ "ai-agents",
11
+ "memory",
12
+ "brain",
13
+ "cli"
14
+ ],
15
+ "homepage": "https://dd-harness.vercel.app",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/diegodias93/dd-harness-online.git",
19
+ "directory": "packages/cli"
20
+ },
21
+ "bin": {
22
+ "dd-harness": "dist/index.js"
23
+ },
24
+ "//exports": "Aponta para `dist` porque quem IMPORTA isto em tempo de execucao e o Node, que nao executa TypeScript. Nao aponte para `src`: o Node segue os imports relativos de dentro do arquivo e tenta abrir `./api.js` ao lado do `.ts`, que nao existe. Quem consome no workspace e o `packages/mcp`, e ele compila o fonte do CLI junto (ver o tsconfig.build.json dele) em vez de depender deste campo — assim o build funciona num checkout limpo, sem `dist` previo.",
25
+ "exports": {
26
+ "./api": "./dist/api.js",
27
+ "./buscar": "./dist/buscar.js",
28
+ "./curar": "./dist/curar.js",
29
+ "./gravar": "./dist/gravar.js",
30
+ "./pasta": "./dist/pasta.js",
31
+ "./projeto": "./dist/projeto.js"
32
+ },
33
+ "files": [
34
+ "dist"
35
+ ],
36
+ "engines": {
37
+ "node": ">=20.3.0"
38
+ },
39
+ "scripts": {
40
+ "typecheck": "tsc -p . --noEmit",
41
+ "build": "tsc -p tsconfig.build.json",
42
+ "prepublishOnly": "npm run build"
43
+ }
44
+ }