dd-harness 0.39.0 → 0.40.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/atualizar.d.ts +2 -0
- package/dist/atualizar.js +1 -1
- package/dist/index.js +46 -9
- package/dist/skill.d.ts +5 -0
- package/dist/skill.js +11 -0
- package/dist/skills-iniciais.js +614 -608
- package/package.json +44 -44
package/dist/atualizar.d.ts
CHANGED
|
@@ -21,6 +21,8 @@ export type Item = {
|
|
|
21
21
|
* maquina, nao por projeto).
|
|
22
22
|
*/
|
|
23
23
|
export declare function diagnosticaAtualizacao(raiz: string, versaoInstalada: string, versaoPublicada: string | null): Promise<Item[]>;
|
|
24
|
+
/** Reescreve em disco os ponteiros das skills que o serviço tem. */
|
|
25
|
+
export declare function reescrevePonteiros(raiz: string): Promise<string>;
|
|
24
26
|
/**
|
|
25
27
|
* Incorpora ao projeto as skills iniciais escolhidas pelo usuario.
|
|
26
28
|
*
|
package/dist/atualizar.js
CHANGED
|
@@ -140,7 +140,7 @@ export async function diagnosticaAtualizacao(raiz, versaoInstalada, versaoPublic
|
|
|
140
140
|
return itens;
|
|
141
141
|
}
|
|
142
142
|
/** Reescreve em disco os ponteiros das skills que o serviço tem. */
|
|
143
|
-
async function reescrevePonteiros(raiz) {
|
|
143
|
+
export async function reescrevePonteiros(raiz) {
|
|
144
144
|
const destinos = [...new Set((await hostsInstalados(raiz))
|
|
145
145
|
.map(h => h === "claude" ? ".claude" : ".agents"))];
|
|
146
146
|
const r = await escrevePonteirosDeSkills(raiz, await leSkills(raiz), destinos.length ? destinos : [".claude"]);
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { diagnostico } from "./diagnostico.js";
|
|
3
|
-
import { aplicaAtualizacao, diagnosticaAtualizacao, versaoInstalada, versaoPublicada } from "./atualizar.js";
|
|
3
|
+
import { aplicaAtualizacao, diagnosticaAtualizacao, reescrevePonteiros, versaoInstalada, versaoPublicada } from "./atualizar.js";
|
|
4
4
|
import { instalaHosts, selecionaHosts } from "./hosts.js";
|
|
5
5
|
import { achaRaiz } from "./config.js";
|
|
6
6
|
import { abreSessao, guardaSessao, saidaDaGuarda, saidaDoBoot } from "./sessao.js";
|
|
@@ -27,7 +27,7 @@ import { pergunta, escolha, fechaPerguntas } from "./pergunta.js";
|
|
|
27
27
|
import { buscaPolitica } from "./politica.js";
|
|
28
28
|
import { avisoDeOrdem, blocoDeSessao, criaFase, editaFase, formataChangelog, formataRoadmap, leFases, } from "./roadmap.js";
|
|
29
29
|
import { decideDoHook, guardaCache } from "./cinto.js";
|
|
30
|
-
import { escrevePonteirosDeSkills, leSkill, leSkills, semeiaSkills } from "./skill.js";
|
|
30
|
+
import { criaSkill, editaSkill, escrevePonteirosDeSkills, leSkill, leSkills, semeiaSkills } from "./skill.js";
|
|
31
31
|
import { SKILLS_INICIAIS } from "./skills-iniciais.js";
|
|
32
32
|
import { busca } from "./buscar.js";
|
|
33
33
|
import { apaga, arquiva, edita, le, promove } from "./curar.js";
|
|
@@ -80,7 +80,7 @@ const AJUDA = `dd-harness — a política e o Brain do projeto, no serviço
|
|
|
80
80
|
projeto do espaço, inclusive os futuros
|
|
81
81
|
dd-harness despromover <pasta>/<slug>
|
|
82
82
|
traz de volta ao alcance dos vínculos
|
|
83
|
-
dd-harness apagar <pasta>/<slug> [--confirmar "<frase devolvida>"]
|
|
83
|
+
dd-harness apagar <pasta>/<slug> [--confirmar "<frase devolvida>"]
|
|
84
84
|
apaga de vez, em cascata — sem desfazer.
|
|
85
85
|
Para tirar de circulação guardando o
|
|
86
86
|
conteúdo, use "arquivar"
|
|
@@ -101,6 +101,11 @@ const AJUDA = `dd-harness — a política e o Brain do projeto, no serviço
|
|
|
101
101
|
dd-harness skills as skills deste projeto e quando cada uma serve
|
|
102
102
|
dd-harness skill <nome> o procedimento de uma delas (o mesmo que o
|
|
103
103
|
agente recebe ao invocá-la)
|
|
104
|
+
dd-harness skill criar <nome> --descricao "<quando invocar>" [--conteudo <arquivo.md>]
|
|
105
|
+
[--so-por-comando true|false]
|
|
106
|
+
dd-harness skill editar <nome> [--descricao "<d>"] [--conteudo <arquivo.md>]
|
|
107
|
+
[--so-por-comando true|false]
|
|
108
|
+
grava no serviço e reescreve o ponteiro em disco
|
|
104
109
|
dd-harness roadmap as fases abertas: a atual inteira, as próximas
|
|
105
110
|
por título (opcional — projeto sem fase não tem)
|
|
106
111
|
dd-harness changelog [--versao <v>]
|
|
@@ -140,11 +145,9 @@ function argumento(argv, nome) {
|
|
|
140
145
|
const API_PADRAO = "https://dd-harness.vercel.app";
|
|
141
146
|
// --- roadmap e changelog ---
|
|
142
147
|
/**
|
|
143
|
-
* `skills` e `skill <slug>` —
|
|
144
|
-
*
|
|
145
|
-
*
|
|
146
|
-
* texto longo, e um editor de verdade e melhor que um flag de linha de comando. O que o
|
|
147
|
-
* terminal precisa e ver o que existe e conferir um procedimento sem trocar de janela.
|
|
148
|
+
* `skills` e `skill <slug>` — leitura. Criar e editar sao `skill criar|editar`, com o
|
|
149
|
+
* procedimento vindo de um .md (`--conteudo`), como em `fase` e `gravar`: sem isso a skill
|
|
150
|
+
* `escrever-skill` redigia o texto e nao tinha como grava-lo fora da interface.
|
|
148
151
|
*/
|
|
149
152
|
async function comandoSkills() {
|
|
150
153
|
const skills = await leSkills(process.cwd());
|
|
@@ -160,10 +163,44 @@ async function comandoSkills() {
|
|
|
160
163
|
}
|
|
161
164
|
console.log(`${skills.length} skill(s). \`dd-harness skill <nome>\` mostra o procedimento.`);
|
|
162
165
|
}
|
|
166
|
+
/** `--so-por-comando true|false`: flag solta seria so "ligar", e desligar tambem e edicao. */
|
|
167
|
+
function soPorComandoDoArgv(argv) {
|
|
168
|
+
const v = argumento(argv, "so-por-comando");
|
|
169
|
+
if (v === undefined)
|
|
170
|
+
return undefined;
|
|
171
|
+
if (v !== "true" && v !== "false")
|
|
172
|
+
throw new Error("--so-por-comando: use true ou false.");
|
|
173
|
+
return v === "true";
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* `skill criar` e `skill editar`. O ponteiro em disco e reescrito em seguida: descricao e
|
|
177
|
+
* "so por comando" moram no frontmatter dele, e o host so le o disco.
|
|
178
|
+
*/
|
|
179
|
+
async function comandoSkillEscrita(acao, argv) {
|
|
180
|
+
const [slug, ...opcoes] = argv;
|
|
181
|
+
if (!slug || slug.startsWith("--"))
|
|
182
|
+
throw new Error(`skill ${acao} exige o nome da skill.`);
|
|
183
|
+
const campos = {
|
|
184
|
+
descricao: argumento(opcoes, "descricao"),
|
|
185
|
+
conteudo: await conteudoDoArgv(opcoes),
|
|
186
|
+
so_por_comando: soPorComandoDoArgv(opcoes),
|
|
187
|
+
};
|
|
188
|
+
if (acao === "criar") {
|
|
189
|
+
if (!campos.descricao)
|
|
190
|
+
throw new Error('skill criar exige --descricao "<quando invocar>".');
|
|
191
|
+
await criaSkill(process.cwd(), { ...campos, slug, descricao: campos.descricao, conteudo: campos.conteudo ?? "" });
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
await editaSkill(process.cwd(), slug, campos);
|
|
195
|
+
}
|
|
196
|
+
console.log(`Skill ${slug} ${acao === "criar" ? "criada" : "atualizada"}; ${await reescrevePonteiros(process.cwd())}.`);
|
|
197
|
+
}
|
|
163
198
|
async function comandoSkill(argv) {
|
|
164
199
|
const slug = argv[0];
|
|
200
|
+
if (slug === "criar" || slug === "editar")
|
|
201
|
+
return comandoSkillEscrita(slug, argv.slice(1));
|
|
165
202
|
if (!slug || slug.startsWith("-")) {
|
|
166
|
-
throw new Error("uso: dd-harness skill <nome>");
|
|
203
|
+
throw new Error("uso: dd-harness skill <nome> | dd-harness skill criar|editar <nome> [...]");
|
|
167
204
|
}
|
|
168
205
|
const s = await leSkill(process.cwd(), slug);
|
|
169
206
|
console.log(`# ${s.slug}
|
package/dist/skill.d.ts
CHANGED
|
@@ -31,6 +31,11 @@ export declare function leSkill(raiz: string, slug: string): Promise<SkillComple
|
|
|
31
31
|
export declare function criaSkill(raiz: string, dados: NovaSkillInicial & Partial<Pick<Skill, "so_por_comando" | "ferramentas" | "caminhos" | "dica_de_argumento">>): Promise<{
|
|
32
32
|
skill: Skill;
|
|
33
33
|
}>;
|
|
34
|
+
/** Só o que muda: o que não vier fica como está no serviço. */
|
|
35
|
+
export type EdicaoDeSkill = Partial<Pick<SkillCompleta, "descricao" | "conteudo" | "so_por_comando" | "ferramentas" | "caminhos" | "dica_de_argumento">>;
|
|
36
|
+
export declare function editaSkill(raiz: string, slug: string, dados: EdicaoDeSkill): Promise<{
|
|
37
|
+
skill: Skill;
|
|
38
|
+
}>;
|
|
34
39
|
/**
|
|
35
40
|
* O SKILL.md que vai para o disco: frontmatter de verdade, corpo que aponta para o MCP.
|
|
36
41
|
*
|
package/dist/skill.js
CHANGED
|
@@ -38,6 +38,17 @@ dados) {
|
|
|
38
38
|
await recusa(resposta);
|
|
39
39
|
return (await jsonDaEscrita(resposta));
|
|
40
40
|
}
|
|
41
|
+
export async function editaSkill(raiz, slug, dados) {
|
|
42
|
+
const { config, token } = await credencial(raiz);
|
|
43
|
+
const resposta = await pede(`${config.api}/api/v1/skills/${encodeURIComponent(slug)}`, {
|
|
44
|
+
method: "PATCH",
|
|
45
|
+
headers: cabecalhos(token, true),
|
|
46
|
+
body: JSON.stringify({ tenant: config.tenant, projeto: config.projeto, ...dados }),
|
|
47
|
+
});
|
|
48
|
+
if (!resposta.ok)
|
|
49
|
+
await recusa(resposta);
|
|
50
|
+
return (await jsonDaEscrita(resposta));
|
|
51
|
+
}
|
|
41
52
|
// --- o ponteiro em disco (puro, para ser testado sem rede) ---
|
|
42
53
|
/**
|
|
43
54
|
* Escapa o que quebraria o YAML do frontmatter.
|