dd-harness 0.35.0 → 0.36.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.js +77 -0
- package/package.json +1 -1
package/dist/atualizar.js
CHANGED
|
@@ -4,6 +4,9 @@ import { analisa } from "./bloco.js";
|
|
|
4
4
|
import { MOLDES_HISTORICOS } from "./moldes-historicos.js";
|
|
5
5
|
import { COMANDO_DO_CINTO, COMANDO_DO_HOOK, SUGESTAO_AGENTS, VERSAO_DO_MOLDE, escreveHook, escrevePonteiro } from "./escreve-config.js";
|
|
6
6
|
import { versaoDoPacote } from "./versao.js";
|
|
7
|
+
import { criaSkill, escrevePonteirosDeSkills, leSkills } from "./skill.js";
|
|
8
|
+
import { hostsInstalados } from "./hosts.js";
|
|
9
|
+
import { SKILLS_INICIAIS } from "./skills-iniciais.js";
|
|
7
10
|
/**
|
|
8
11
|
* `aplicar` e o que esta funcao pode fazer sozinha com seguranca; `perguntar` exige o dono
|
|
9
12
|
* do arquivo; `manual` e o que nao se resolve de dentro do repositorio (o CLI global e por
|
|
@@ -64,8 +67,74 @@ export async function diagnosticaAtualizacao(raiz, versaoInstalada, versaoPublic
|
|
|
64
67
|
? { o_que: "hooks", situacao: "sessão e cinto declarados", acao: "em-dia" }
|
|
65
68
|
: { o_que: "hooks", situacao: settings ? "incompletos ou legados" : "ausentes", acao: "aplicar",
|
|
66
69
|
detalhe: "acrescenta sem duplicar nem tocar em hook de terceiro" });
|
|
70
|
+
// 4. Skills iniciais que nasceram depois deste projeto.
|
|
71
|
+
//
|
|
72
|
+
// A semeadura so roda em projeto SEM skill alguma, e o efeito colateral e que skill NOVA
|
|
73
|
+
// nunca alcanca projeto que ja existe: um projeto de dois meses atras ficou com as seis
|
|
74
|
+
// daquela epoca, e as que vieram depois so existiam em projeto criado do zero. Este item
|
|
75
|
+
// e o caminho que faltava.
|
|
76
|
+
//
|
|
77
|
+
// Skill inicial que falta e skill que NASCEU DEPOIS deste projeto — as padrao nao se
|
|
78
|
+
// apagam, entao ausencia aqui nao e decisao de ninguem, e recria-la nao desfaz nada.
|
|
79
|
+
// Por isso `aplicar`: e o mesmo caso do hook que faltava, e nao o do CLAUDE.md editado.
|
|
80
|
+
//
|
|
81
|
+
// A skill do projeto continua editavel: criar a que falta nao mexe em nenhuma existente,
|
|
82
|
+
// e o `criaSkill` erra de proposito se o slug ja existir.
|
|
83
|
+
try {
|
|
84
|
+
const existentes = new Set((await leSkills(raiz)).map(s => s.slug));
|
|
85
|
+
const faltando = SKILLS_INICIAIS.filter(s => !existentes.has(s.slug)).map(s => s.slug);
|
|
86
|
+
itens.push(faltando.length === 0
|
|
87
|
+
? { o_que: "skills", situacao: `${existentes.size} no projeto; nenhuma inicial faltando`, acao: "em-dia" }
|
|
88
|
+
: {
|
|
89
|
+
o_que: "skills",
|
|
90
|
+
situacao: `${faltando.length} skill(s) inicial(is) nasceram depois deste projeto`,
|
|
91
|
+
acao: "aplicar",
|
|
92
|
+
detalhe: `${faltando.join(", ")} — serão criadas no serviço; as existentes não são tocadas`,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// Sem rede ou sem credencial: o resto do diagnostico continua valendo, e skill faltando
|
|
97
|
+
// nao e urgente o bastante para derrubar a checagem inteira.
|
|
98
|
+
itens.push({ o_que: "skills", situacao: "não consegui consultar o serviço", acao: "manual",
|
|
99
|
+
detalhe: "confira com `dd-harness skills` quando o serviço responder" });
|
|
100
|
+
}
|
|
67
101
|
return itens;
|
|
68
102
|
}
|
|
103
|
+
/** Cria no serviço as skills iniciais que este projeto ainda não tem. */
|
|
104
|
+
async function criaSkillsFaltantes(raiz) {
|
|
105
|
+
const existentes = new Set((await leSkills(raiz)).map(s => s.slug));
|
|
106
|
+
const faltando = SKILLS_INICIAIS.filter(s => !existentes.has(s.slug));
|
|
107
|
+
const criadas = [];
|
|
108
|
+
const falharam = [];
|
|
109
|
+
for (const inicial of faltando) {
|
|
110
|
+
try {
|
|
111
|
+
await criaSkill(raiz, inicial);
|
|
112
|
+
criadas.push(inicial.slug);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// Uma que nao entrou nao impede as outras: metade criada e melhor que nenhuma, e a
|
|
116
|
+
// linha de retorno diz exatamente qual faltou.
|
|
117
|
+
falharam.push(inicial.slug);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
let ponteiros = "";
|
|
121
|
+
// A skill no servico nao e descoberta por host nenhum sem o ponteiro em disco: o Claude
|
|
122
|
+
// Code le `.claude/skills/*/SKILL.md` na abertura da sessao, e MCP nao fornece skill.
|
|
123
|
+
// Criar no servico e parar aqui entregaria uma skill que so aparece no boot seguinte.
|
|
124
|
+
if (criadas.length) {
|
|
125
|
+
try {
|
|
126
|
+
const hosts = await hostsInstalados(raiz);
|
|
127
|
+
const destinos = [...new Set(hosts.map(h => h === "claude" ? ".claude" : ".agents"))];
|
|
128
|
+
const r = await escrevePonteirosDeSkills(raiz, await leSkills(raiz), destinos.length ? destinos : [".claude"]);
|
|
129
|
+
ponteiros = `; ${r.escritos} ponteiro(s) em disco`;
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
ponteiros = "; ponteiros NÃO escritos — rode `dd-harness integrar` ou reabra a sessão";
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return `skills: ${criadas.length} criada(s)${criadas.length ? " — " + criadas.join(", ") : ""}` +
|
|
136
|
+
(falharam.length ? `; FALHARAM: ${falharam.join(", ")}` : "") + ponteiros;
|
|
137
|
+
}
|
|
69
138
|
/**
|
|
70
139
|
* Aplica so os itens marcados `aplicar`. Os de `perguntar` ficam intactos de proposito —
|
|
71
140
|
* quem decide sobre arquivo editado a mao e o dono dele.
|
|
@@ -83,6 +152,14 @@ export async function aplicaAtualizacao(raiz, itens) {
|
|
|
83
152
|
// um projeto que continua sem o cinto.
|
|
84
153
|
feitos.push(r.ok ? `hooks: ${r.estado}` : `hooks: NÃO aplicado (${r.motivo})`);
|
|
85
154
|
}
|
|
155
|
+
else if (item.o_que === "skills") {
|
|
156
|
+
try {
|
|
157
|
+
feitos.push(await criaSkillsFaltantes(raiz));
|
|
158
|
+
}
|
|
159
|
+
catch (erro) {
|
|
160
|
+
feitos.push(`skills: NÃO aplicado (${erro instanceof Error ? erro.message : String(erro)})`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
86
163
|
}
|
|
87
164
|
return feitos;
|
|
88
165
|
}
|
package/package.json
CHANGED