dd-harness 0.40.1 → 0.41.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/artefato.d.ts +30 -3
- package/dist/artefato.js +44 -1
- package/dist/sessao.js +1 -1
- package/package.json +44 -44
package/dist/artefato.d.ts
CHANGED
|
@@ -23,13 +23,40 @@ export declare function leArtefato(raiz: string, tipo: TipoDeArtefato): Promise<
|
|
|
23
23
|
existe: boolean;
|
|
24
24
|
atualizadaEm: string | null;
|
|
25
25
|
}>;
|
|
26
|
+
/** O que o `PUT` devolve. `sem_alteracao`: o texto era igual ao atual e nao virou versao. */
|
|
27
|
+
export type EscritaDeArtefato = {
|
|
28
|
+
artefato: string;
|
|
29
|
+
criou: boolean;
|
|
30
|
+
tamanho: number;
|
|
31
|
+
versao: number;
|
|
32
|
+
sem_alteracao: boolean;
|
|
33
|
+
};
|
|
26
34
|
/**
|
|
27
35
|
* Substituicao total, nao append: quem quer acrescentar um paragrafo le, concatena e
|
|
28
36
|
* reenvia. Conteudo vazio e valido e significa "apagar" — a linha fica no banco, guardando
|
|
29
37
|
* quem mexeu por ultimo.
|
|
38
|
+
*
|
|
39
|
+
* Toda escrita vira uma versao numerada no servico, e `resumo` e a linha que o historico
|
|
40
|
+
* guarda sobre ela: o que mudou e por que.
|
|
30
41
|
*/
|
|
31
|
-
export declare function escreveArtefato(raiz: string, tipo: TipoDeArtefato, conteudo: string, atualizadaEm: string | null): Promise<
|
|
32
|
-
|
|
33
|
-
|
|
42
|
+
export declare function escreveArtefato(raiz: string, tipo: TipoDeArtefato, conteudo: string, atualizadaEm: string | null, resumo: string): Promise<EscritaDeArtefato>;
|
|
43
|
+
export type VersaoDeArtefato = {
|
|
44
|
+
versao: number;
|
|
45
|
+
resumo: string;
|
|
46
|
+
criada_em: string;
|
|
34
47
|
tamanho: number;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* O historico do artefato: a lista de versoes, da mais recente para a mais antiga. Nao
|
|
51
|
+
* entra no boot — chega so quando alguem precisa entender por que o texto esta assim.
|
|
52
|
+
*/
|
|
53
|
+
export declare function leVersoesDoArtefato(raiz: string, tipo: TipoDeArtefato): Promise<VersaoDeArtefato[]>;
|
|
54
|
+
/**
|
|
55
|
+
* Uma linha por versao, e nao tabela: o resumo e texto livre, e um `|` dentro dele
|
|
56
|
+
* quebraria a tabela markdown que o agente le.
|
|
57
|
+
*/
|
|
58
|
+
export declare function formataHistorico(tipo: TipoDeArtefato, versoes: VersaoDeArtefato[]): string;
|
|
59
|
+
/** O texto integral de uma versao antiga, com o resumo do que ela mudou. */
|
|
60
|
+
export declare function leVersaoDoArtefato(raiz: string, tipo: TipoDeArtefato, versao: number): Promise<Omit<VersaoDeArtefato, "tamanho"> & {
|
|
61
|
+
conteudo: string;
|
|
35
62
|
}>;
|
package/dist/artefato.js
CHANGED
|
@@ -27,8 +27,11 @@ export async function leArtefato(raiz, tipo) {
|
|
|
27
27
|
* Substituicao total, nao append: quem quer acrescentar um paragrafo le, concatena e
|
|
28
28
|
* reenvia. Conteudo vazio e valido e significa "apagar" — a linha fica no banco, guardando
|
|
29
29
|
* quem mexeu por ultimo.
|
|
30
|
+
*
|
|
31
|
+
* Toda escrita vira uma versao numerada no servico, e `resumo` e a linha que o historico
|
|
32
|
+
* guarda sobre ela: o que mudou e por que.
|
|
30
33
|
*/
|
|
31
|
-
export async function escreveArtefato(raiz, tipo, conteudo, atualizadaEm) {
|
|
34
|
+
export async function escreveArtefato(raiz, tipo, conteudo, atualizadaEm, resumo) {
|
|
32
35
|
const { config, token } = await credencial(raiz);
|
|
33
36
|
const resposta = await pede(`${config.api}/api/v1/artefatos`, {
|
|
34
37
|
method: "PUT",
|
|
@@ -43,6 +46,7 @@ export async function escreveArtefato(raiz, tipo, conteudo, atualizadaEm) {
|
|
|
43
46
|
projeto: config.projeto,
|
|
44
47
|
tipo,
|
|
45
48
|
conteudo,
|
|
49
|
+
resumo,
|
|
46
50
|
}),
|
|
47
51
|
});
|
|
48
52
|
if (!resposta.ok)
|
|
@@ -52,3 +56,42 @@ export async function escreveArtefato(raiz, tipo, conteudo, atualizadaEm) {
|
|
|
52
56
|
});
|
|
53
57
|
return (await jsonDaEscrita(resposta));
|
|
54
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* O historico do artefato: a lista de versoes, da mais recente para a mais antiga. Nao
|
|
61
|
+
* entra no boot — chega so quando alguem precisa entender por que o texto esta assim.
|
|
62
|
+
*/
|
|
63
|
+
export async function leVersoesDoArtefato(raiz, tipo) {
|
|
64
|
+
const corpo = (await pedeHistorico(raiz, tipo));
|
|
65
|
+
return corpo.versoes;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Uma linha por versao, e nao tabela: o resumo e texto livre, e um `|` dentro dele
|
|
69
|
+
* quebraria a tabela markdown que o agente le.
|
|
70
|
+
*/
|
|
71
|
+
export function formataHistorico(tipo, versoes) {
|
|
72
|
+
if (versoes.length === 0)
|
|
73
|
+
return `O ${tipo} ainda não tem versões — nunca foi escrito.`;
|
|
74
|
+
return [
|
|
75
|
+
`Histórico do ${tipo} — ${versoes.length} versão(ões), da mais recente para a mais antiga:`,
|
|
76
|
+
"",
|
|
77
|
+
...versoes.map((v, i) => `- v${v.versao}${i === 0 ? " (atual)" : ""} · ${v.criada_em.slice(0, 16).replace("T", " ")} · ` +
|
|
78
|
+
`${v.tamanho} caractere(s) — ${v.resumo}`),
|
|
79
|
+
].join("\n");
|
|
80
|
+
}
|
|
81
|
+
/** O texto integral de uma versao antiga, com o resumo do que ela mudou. */
|
|
82
|
+
export async function leVersaoDoArtefato(raiz, tipo, versao) {
|
|
83
|
+
return (await pedeHistorico(raiz, tipo, versao));
|
|
84
|
+
}
|
|
85
|
+
async function pedeHistorico(raiz, tipo, versao) {
|
|
86
|
+
const { config, token } = await credencial(raiz);
|
|
87
|
+
const url = new URL(`${config.api}/api/v1/artefatos/historico`);
|
|
88
|
+
url.searchParams.set("tenant", config.tenant);
|
|
89
|
+
url.searchParams.set("projeto", config.projeto);
|
|
90
|
+
url.searchParams.set("tipo", tipo);
|
|
91
|
+
if (versao !== undefined)
|
|
92
|
+
url.searchParams.set("versao", String(versao));
|
|
93
|
+
const resposta = await pede(url, { headers: cabecalhos(token) });
|
|
94
|
+
if (!resposta.ok)
|
|
95
|
+
await recusa(resposta);
|
|
96
|
+
return resposta.json();
|
|
97
|
+
}
|
package/dist/sessao.js
CHANGED
|
@@ -116,7 +116,7 @@ export function saidaDaGuarda(host, motivo, contexto) {
|
|
|
116
116
|
}
|
|
117
117
|
// Só ferramentas conhecidas de leitura passam quando o boot falta. Shell não é classificado por regex.
|
|
118
118
|
const LEITURA = /^(Read|Glob|Grep|view_file|list_dir|find_by_name|grep_search|ask_question|AskUserQuestion|request_user_input)$/;
|
|
119
|
-
const LEITURA_MCP = /^mcp__dd[-_]harness__(ler_artefato|ler_roadmap|ler_changelog|listar_skills|ler_skill|ler_memoria|buscar_memoria)$/;
|
|
119
|
+
const LEITURA_MCP = /^mcp__dd[-_]harness__(ler_artefato|ler_historico_artefato|ler_roadmap|ler_changelog|listar_skills|ler_skill|ler_memoria|buscar_memoria)$/;
|
|
120
120
|
/**
|
|
121
121
|
* O que um projeto SEM politica precisa para ganhar uma.
|
|
122
122
|
*
|
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.41.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
|
+
}
|