dd-harness 0.36.0 → 0.38.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/README.md +103 -103
- package/dist/atualizar.d.ts +12 -0
- package/dist/atualizar.js +93 -44
- package/dist/diagnostico.js +13 -3
- package/dist/escreve-config.js +24 -24
- package/dist/hosts.js +80 -4
- package/dist/index.js +184 -112
- package/dist/init.js +45 -45
- package/dist/materializa.js +0 -5
- package/dist/moldes-historicos.js +70 -70
- package/dist/pergunta.d.ts +9 -2
- package/dist/pergunta.js +71 -2
- package/dist/regras-de-commit.js +8 -8
- package/dist/skills-iniciais.js +606 -578
- package/dist/sync.js +1 -2
- package/package.json +44 -44
- package/dist/materializa.d.ts +0 -70
- package/dist/sync.d.ts +0 -59
package/dist/sync.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
2
|
-
import { pede } from "./api.js";
|
|
3
2
|
import { dirname, join } from "node:path";
|
|
4
3
|
import { gravaManifesto, hashDe, leConfigDoRepo, leManifesto, leToken, } from "./config.js";
|
|
5
4
|
import { LINHA_DE_IMPORT, materializa } from "./materializa.js";
|
|
@@ -32,7 +31,7 @@ export async function confereDisco(raiz, arquivos) {
|
|
|
32
31
|
}
|
|
33
32
|
async function buscaBrain(config, token, etag) {
|
|
34
33
|
const url = `${config.api}/api/v1/artefatos?tenant=${encodeURIComponent(config.tenant)}&projeto=${encodeURIComponent(config.projeto)}`;
|
|
35
|
-
const resposta = await
|
|
34
|
+
const resposta = await fetch(url, {
|
|
36
35
|
headers: {
|
|
37
36
|
Authorization: `Bearer ${token}`,
|
|
38
37
|
...(etag ? { "If-None-Match": etag } : {}),
|
package/package.json
CHANGED
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "dd-harness",
|
|
3
|
-
"version": "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.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
|
+
}
|
package/dist/materializa.d.ts
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Do payload do contrato para arquivos em disco.
|
|
3
|
-
*
|
|
4
|
-
* Funcao pura de proposito: recebe o Brain e devolve caminho -> conteudo, sem rede e sem
|
|
5
|
-
* `fs`. E a parte que precisa de teste — o formato tem que casar com o que o
|
|
6
|
-
* `validate_brain.cjs` do molde espera (frontmatter `name` igual ao arquivo, `pasta`
|
|
7
|
-
* igual a pasta que o contem, e uma linha de indice por memoria).
|
|
8
|
-
*/
|
|
9
|
-
export type Ancora = {
|
|
10
|
-
tipo: string;
|
|
11
|
-
valor: string;
|
|
12
|
-
sha: string | null;
|
|
13
|
-
};
|
|
14
|
-
export type Memoria = {
|
|
15
|
-
pasta: string;
|
|
16
|
-
slug: string;
|
|
17
|
-
titulo: string;
|
|
18
|
-
resumo: string;
|
|
19
|
-
corpo: string;
|
|
20
|
-
status: "ativa" | "historico";
|
|
21
|
-
dano: string;
|
|
22
|
-
invisibilidade: string;
|
|
23
|
-
externalidade: string;
|
|
24
|
-
ancoras: Ancora[];
|
|
25
|
-
revisar_ate: string | null;
|
|
26
|
-
/** Observacoes de deriva esperando julgamento. Ausente em payload antigo. */
|
|
27
|
-
deriva_aberta?: number;
|
|
28
|
-
};
|
|
29
|
-
export type Brain = {
|
|
30
|
-
tenant: {
|
|
31
|
-
slug: string;
|
|
32
|
-
nome: string;
|
|
33
|
-
};
|
|
34
|
-
projeto: {
|
|
35
|
-
slug: string;
|
|
36
|
-
nome: string;
|
|
37
|
-
};
|
|
38
|
-
/** `CLAUDE.md`. Nulo ou vazio: ainda nao existe, e nao vira arquivo. */
|
|
39
|
-
politica?: string | null;
|
|
40
|
-
/** `BRIEFING.md`. Mesma regra. */
|
|
41
|
-
briefing?: string | null;
|
|
42
|
-
pastas: {
|
|
43
|
-
slug: string;
|
|
44
|
-
definicao: string;
|
|
45
|
-
}[];
|
|
46
|
-
memorias: Memoria[];
|
|
47
|
-
/**
|
|
48
|
-
* Memorias que excederam as tentativas de indexacao e nao serao mais tentadas. Ficam
|
|
49
|
-
* sem embedding — somem da busca semantica — e so este numero denuncia.
|
|
50
|
-
*/
|
|
51
|
-
travadas_na_fila?: number;
|
|
52
|
-
};
|
|
53
|
-
export declare function arquivoDaMemoria(m: Memoria): string;
|
|
54
|
-
export declare function arquivoDoIndice(brain: Brain): string;
|
|
55
|
-
/** Tudo o que o servico gera vive aqui — e nada fora daqui e escrito pelo `sync`. */
|
|
56
|
-
export declare const PASTA = "dd-harness";
|
|
57
|
-
/** O que a raiz precisa conter para a politica chegar a sessao. */
|
|
58
|
-
export declare const LINHA_DE_IMPORT = "@dd-harness/politica.md";
|
|
59
|
-
/**
|
|
60
|
-
* Caminho relativo (POSIX) -> conteúdo. As chaves são o que o manifesto guarda.
|
|
61
|
-
*
|
|
62
|
-
* Tudo dentro de `dd-harness/`, inclusive a política. Na raiz fica só o `CLAUDE.md`, que
|
|
63
|
-
* é **seu**: o `sync` não o escreve, apenas confere que ele importa a política. É o que
|
|
64
|
-
* deixa conviverem a parte gerenciada e o que aquele repositório tem de próprio — e o
|
|
65
|
-
* que faz adotar um projeto existente ser uma linha, não um ritual.
|
|
66
|
-
*
|
|
67
|
-
* Artefato vazio ou ausente não entra no mapa; como o manifesto remove o que saiu do
|
|
68
|
-
* conjunto, esvaziar no serviço apaga o arquivo no próximo `sync`.
|
|
69
|
-
*/
|
|
70
|
-
export declare function materializa(brain: Brain, pasta?: string): Map<string, string>;
|
package/dist/sync.d.ts
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Busca o Brain e escreve em disco. Uma direcao so.
|
|
3
|
-
*
|
|
4
|
-
* O manifesto guarda o hash de cada arquivo que este comando escreveu. Antes de
|
|
5
|
-
* sobrescrever, ele confere: hash igual ao guardado significa "isto e meu, posso
|
|
6
|
-
* reescrever"; hash diferente significa que alguem editou a mao, e ai o comando **para**.
|
|
7
|
-
* Deriva silenciosa entre repo e servico e exatamente o que este projeto existe para
|
|
8
|
-
* evitar — melhor falhar alto do que engolir a edicao de alguem.
|
|
9
|
-
*/
|
|
10
|
-
/**
|
|
11
|
-
* Estado do ponteiro na raiz.
|
|
12
|
-
*
|
|
13
|
-
* `CLAUDE.md` nao e gerado — e do repositorio, e so precisa importar a politica. Mas o
|
|
14
|
-
* import falha em **silencio**: sem o arquivo alvo, ou sem a linha, a sessao abre e
|
|
15
|
-
* nada avisa que a politica nao veio junto. Foi medido, nao suposto. Como a sessao sem
|
|
16
|
-
* protocolo e a falha que o molde mais combate, o `sync` confere isso toda vez — mesmo
|
|
17
|
-
* quando o servico nao mudou, porque quem apaga a linha e quem mexe no repositorio.
|
|
18
|
-
*/
|
|
19
|
-
export type Ponteiro = "ok" | "sem-claude-md" | "sem-a-linha" | "sem-politica"
|
|
20
|
-
/**
|
|
21
|
-
* A linha de import existe, mas nao ha politica no servico para ela apontar. O `init`
|
|
22
|
-
* escreve a linha antes de existir politica, entao o repositorio novo cai aqui: import
|
|
23
|
-
* pendurado desde o primeiro dia, e o mesmo silencio de sempre.
|
|
24
|
-
*/
|
|
25
|
-
| "aponta-para-o-vazio";
|
|
26
|
-
type Resultado = {
|
|
27
|
-
ponteiro: Ponteiro;
|
|
28
|
-
} & ({
|
|
29
|
-
tipo: "sem-mudanca";
|
|
30
|
-
} | {
|
|
31
|
-
tipo: "sincronizado";
|
|
32
|
-
escritos: string[];
|
|
33
|
-
removidos: string[];
|
|
34
|
-
} | {
|
|
35
|
-
tipo: "editado-a-mao";
|
|
36
|
-
arquivos: string[];
|
|
37
|
-
});
|
|
38
|
-
/**
|
|
39
|
-
* Estado do que este comando escreveu, contra o hash guardado.
|
|
40
|
-
*
|
|
41
|
-
* Duas situacoes diferentes, e confundi-las custa caro: hash diferente e **edicao a
|
|
42
|
-
* mao**, e o comando tem que parar sem escrever; arquivo **ausente** nao e edicao — e
|
|
43
|
-
* trabalho a refazer, e o comando tem que reescrever.
|
|
44
|
-
*/
|
|
45
|
-
export declare function confereDisco(raiz: string, arquivos: Record<string, string>): Promise<{
|
|
46
|
-
editados: string[];
|
|
47
|
-
faltando: string[];
|
|
48
|
-
}>;
|
|
49
|
-
/**
|
|
50
|
-
* O `CLAUDE.md` da raiz existe e importa a politica?
|
|
51
|
-
*
|
|
52
|
-
* Sem politica no servico E sem a linha, nao ha o que apontar nem o que avisar — avisar
|
|
53
|
-
* ai seria ruido que ensina a ignorar aviso. Mas com a linha escrita e a politica vazia o
|
|
54
|
-
* import esta pendurado de verdade, e esse e o silencio que a memoria
|
|
55
|
-
* `import-do-claude-md-falha-calado` manda quebrar.
|
|
56
|
-
*/
|
|
57
|
-
export declare function confereOPonteiro(raiz: string, temPolitica: boolean): Promise<Ponteiro>;
|
|
58
|
-
export declare function sync(raiz: string): Promise<Resultado>;
|
|
59
|
-
export {};
|