dd-harness 0.9.0 → 0.11.0
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 +73 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
import { spawn } from "node:child_process";
|
|
3
3
|
import { access } from "node:fs/promises";
|
|
4
4
|
import { join } from "node:path";
|
|
5
|
+
// DEP0190: Node imprime esse warning direto no stderr no instante em que
|
|
6
|
+
// `spawn(..., { shell: true })` recebe um array de args — de forma sincrona, ANTES de
|
|
7
|
+
// qualquer listener rodar, entao filtrar dentro de um `process.on("warning")` normal nao
|
|
8
|
+
// bloqueia a impressao (so o listener default e que imprime, e ele continua registrado
|
|
9
|
+
// junto do nosso). Por isso remover o listener default e a unica forma de suprimir.
|
|
10
|
+
// Real quando algum arg vem de fora, mas `instalaMcp` (mais abaixo) so passa literais
|
|
11
|
+
// fixos — sem isto o wizard de `start` mostrava um "DeprecationWarning" no meio do fluxo
|
|
12
|
+
// que parecia falha para quem esta vendo por dentro pela primeira vez.
|
|
13
|
+
process.removeAllListeners("warning");
|
|
5
14
|
import { termosDaConsulta } from "./argv.js";
|
|
6
15
|
import { check, status } from "./check.js";
|
|
7
16
|
import { CAMINHO_CONFIG, guardaConfigDaMaquina, guardaToken, leConfigDaMaquina, leConfigDoRepo, leToken, } from "./config.js";
|
|
@@ -79,6 +88,52 @@ function argumento(argv, nome) {
|
|
|
79
88
|
return i >= 0 ? argv[i + 1] : undefined;
|
|
80
89
|
}
|
|
81
90
|
const API_PADRAO = "https://dd-harness.vercel.app";
|
|
91
|
+
/**
|
|
92
|
+
* Forca o `npx` a baixar e cachear `dd-harness-mcp` AGORA, dentro do wizard — nunca na
|
|
93
|
+
* primeira conexao do Claude Code. Sem isto, a primeira instalacao acontecia so quando
|
|
94
|
+
* o host tentava conectar ao servidor MCP, e o handshake tem timeout curto demais para
|
|
95
|
+
* esperar o download: a sessao real via `CONNECTION_CLOSED` em vez de "instalando".
|
|
96
|
+
*/
|
|
97
|
+
function instalaMcp() {
|
|
98
|
+
return new Promise((resolve) => {
|
|
99
|
+
// stdio "inherit": o usuario ve o download do npx acontecendo (pode levar alguns
|
|
100
|
+
// segundos) e, se falhar, ve POR QUE — em vez do "nao consegui" mudo que nao dava
|
|
101
|
+
// pista nenhuma para diagnosticar. O DEP0190 que isto dispara e suprimido no topo
|
|
102
|
+
// do arquivo (`process.removeAllListeners("warning")`).
|
|
103
|
+
const p = spawn("npx", ["-y", "dd-harness-mcp", "--help"], {
|
|
104
|
+
shell: process.platform === "win32",
|
|
105
|
+
stdio: "inherit",
|
|
106
|
+
});
|
|
107
|
+
p.on("exit", (code) => resolve({ ok: code === 0, erro: code === 0 ? undefined : `código de saída ${code}` }));
|
|
108
|
+
p.on("error", (e) => resolve({ ok: false, erro: e.message }));
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* `start` e o primeiro comando de quem esta chegando — rodar desatualizado aqui e o
|
|
113
|
+
* peor lugar para isso: foi assim que a pre-instalacao do MCP (esta mesma funcao,
|
|
114
|
+
* mais abaixo) ficou muda numa versao anterior que nao tinha essa etapa ainda.
|
|
115
|
+
* Falha de rede aqui nunca trava o wizard — so segue sem avisar.
|
|
116
|
+
*/
|
|
117
|
+
async function versaoDesatualizada() {
|
|
118
|
+
try {
|
|
119
|
+
const atual = await versao();
|
|
120
|
+
const controle = new AbortController();
|
|
121
|
+
const corte = setTimeout(() => controle.abort(), 3000);
|
|
122
|
+
const resp = await fetch("https://registry.npmjs.org/dd-harness/latest", {
|
|
123
|
+
signal: controle.signal,
|
|
124
|
+
});
|
|
125
|
+
clearTimeout(corte);
|
|
126
|
+
if (!resp.ok)
|
|
127
|
+
return null;
|
|
128
|
+
const { version: ultima } = (await resp.json());
|
|
129
|
+
if (!ultima || ultima === atual)
|
|
130
|
+
return null;
|
|
131
|
+
return { atual, ultima };
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
82
137
|
/**
|
|
83
138
|
* Tenta abrir o navegador padrao. Nunca lanca — falhar em abrir nao pode travar o
|
|
84
139
|
* wizard, so degrada para "aqui esta a URL, abra voce mesmo".
|
|
@@ -120,6 +175,15 @@ async function comandoStart() {
|
|
|
120
175
|
// ENOENT: exatamente o caso esperado, segue.
|
|
121
176
|
}
|
|
122
177
|
console.log("Iniciando o dd-harness nesta pasta.\n");
|
|
178
|
+
// 0. Versao. `start` e o comando de bootstrap: rodar velho aqui significa perder
|
|
179
|
+
// correcoes deste proprio wizard sem nenhum aviso (foi o que aconteceu com a
|
|
180
|
+
// pre-instalacao do MCP, passo 5.5 abaixo, numa versao anterior a ela existir).
|
|
181
|
+
const desatualizado = await versaoDesatualizada();
|
|
182
|
+
if (desatualizado) {
|
|
183
|
+
console.log(`AVISO: você está na versão ${desatualizado.atual}, e a mais recente é ` +
|
|
184
|
+
`${desatualizado.ultima}. Rode \`npm install -g dd-harness@latest\` e comece de ` +
|
|
185
|
+
"novo — start segue mesmo assim, mas pode faltar correção.\n");
|
|
186
|
+
}
|
|
123
187
|
// 1. Credencial. Sem ela nada do resto e possivel — nem listar tenant.
|
|
124
188
|
let token = await leToken(API_PADRAO);
|
|
125
189
|
if (!token) {
|
|
@@ -186,6 +250,15 @@ async function comandoStart() {
|
|
|
186
250
|
acrescentado: "atualizado .mcp.json (servidor adicionado ao que já existia)",
|
|
187
251
|
}[mcp.estado]);
|
|
188
252
|
}
|
|
253
|
+
if (mcp.ok) {
|
|
254
|
+
console.log("\nInstalando o servidor dd-harness-mcp (primeira vez pode demorar um pouco)...");
|
|
255
|
+
const { ok: instalou, erro: erroInstalacao } = await instalaMcp();
|
|
256
|
+
console.log(instalou
|
|
257
|
+
? "dd-harness-mcp instalado — a próxima sessão do Claude Code conecta na hora."
|
|
258
|
+
: `AVISO: não consegui pré-instalar dd-harness-mcp (${erroInstalacao}). A primeira ` +
|
|
259
|
+
"conexão do Claude Code pode demorar ou falhar; se falhar, abra uma nova sessão " +
|
|
260
|
+
"e tente de novo.");
|
|
261
|
+
}
|
|
189
262
|
// 6. AGENTS.md — so quem usa outra ferramenta alem do Claude Code precisa.
|
|
190
263
|
const outraFerramenta = await pergunta("\nVai abrir este projeto em Codex, Cursor ou outra ferramenta além do Claude " +
|
|
191
264
|
"Code? [s/N]: ");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dd-harness",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Cliente do dd-harness: politica no inicio da sessao, e memoria por busca — nada em disco. Sem dependencia: fetch, crypto e fs sao do Node.",
|
|
6
6
|
"license": "UNLICENSED",
|