dd-harness 0.33.0 → 0.33.2
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/sessao.js +45 -3
- package/package.json +1 -1
package/dist/sessao.js
CHANGED
|
@@ -97,15 +97,57 @@ export function saidaDaGuarda(host, motivo, contexto) {
|
|
|
97
97
|
// Só ferramentas conhecidas de leitura passam quando o boot falta. Shell não é classificado por regex.
|
|
98
98
|
const LEITURA = /^(Read|Glob|Grep|view_file|list_dir|find_by_name|grep_search|ask_question|AskUserQuestion|request_user_input)$/;
|
|
99
99
|
const LEITURA_MCP = /^mcp__dd[-_]harness__(ler_artefato|ler_roadmap|ler_changelog|listar_skills|ler_skill|ler_memoria|buscar_memoria)$/;
|
|
100
|
+
/**
|
|
101
|
+
* O que um projeto SEM politica precisa para ganhar uma.
|
|
102
|
+
*
|
|
103
|
+
* `escrever_artefato` grava os dois obrigatorios; `criar_pasta`/`criar_projeto` completam
|
|
104
|
+
* o onboarding. `ToolSearch` entra porque nao toca no projeto — so descreve ferramentas —,
|
|
105
|
+
* e barra-lo tira do agente a chance de achar a que resolveria.
|
|
106
|
+
*
|
|
107
|
+
* **`Bash` fica de fora, e isso e deliberado.** O onboarding e a janela em que a guarda
|
|
108
|
+
* confia no servico em vez do boot, e shell arbitrario e superficie grande demais para
|
|
109
|
+
* entrar por ela: o codigo do projeto e justamente o que a guarda existe para proteger.
|
|
110
|
+
* Conduzir briefing se faz lendo (Read/Glob/Grep ja passam) e perguntando. Ha teste que
|
|
111
|
+
* tranca isto — se for para mudar, e decisao consciente, nao efeito colateral.
|
|
112
|
+
*/
|
|
113
|
+
const ONBOARDING = /^(ToolSearch|mcp__dd[-_]harness__(escrever_artefato|criar_pasta|criar_projeto))$/;
|
|
100
114
|
export async function guardaSessao(host, entrada) {
|
|
101
115
|
const c = normalizaEntrada(host, entrada);
|
|
102
116
|
const raiz = await achaRaiz(c.raiz);
|
|
103
117
|
const e = c.sessao ? await estadoAtual(raiz, c.sessao, host) : null;
|
|
104
118
|
if (e?.estado !== "ok") {
|
|
105
|
-
|
|
106
|
-
if (LEITURA.test(c.ferramenta) || LEITURA_MCP.test(c.ferramenta) || onboarding)
|
|
119
|
+
if (LEITURA.test(c.ferramenta) || LEITURA_MCP.test(c.ferramenta))
|
|
107
120
|
return saidaDaGuarda(host);
|
|
108
|
-
|
|
121
|
+
// O dia zero de um projeto novo trava num ciclo: gravar o briefing exige a guarda
|
|
122
|
+
// liberada, e a guarda so libera com briefing gravado. `estadoAtual` devolve `null`
|
|
123
|
+
// tanto para "projeto novo" quanto para "sessao expirada", entao o estado local nao
|
|
124
|
+
// distingue os dois — quem sabe e o SERVICO. Se ele diz que nao ha politica, este
|
|
125
|
+
// projeto ainda esta em onboarding e as ferramentas de escreve-lo passam.
|
|
126
|
+
//
|
|
127
|
+
// Nao e afrouxamento: o que passa aqui e so o que CONSTROI o contexto obrigatorio, e
|
|
128
|
+
// so enquanto ele nao existe. Na primeira politica gravada, este caminho fecha sozinho.
|
|
129
|
+
const r = await buscaPolitica(raiz).catch(() => null);
|
|
130
|
+
if (ONBOARDING.test(c.ferramenta) && r?.estado === "sem-politica")
|
|
131
|
+
return saidaDaGuarda(host);
|
|
132
|
+
// O briefing acabou de ser gravado NESTA sessao: o servico ja tem os dois, mas o boot
|
|
133
|
+
// desta sessao rodou quando nao havia nada, e o estado local ficou velho. O agente sai
|
|
134
|
+
// do onboarding direto para um segundo bloqueio, sem nada indicando o que fazer —
|
|
135
|
+
// medido no dd-playwright, onde ele concluiu sozinho que precisava reiniciar e pediu
|
|
136
|
+
// ao usuario.
|
|
137
|
+
//
|
|
138
|
+
// Continua NEGANDO, e de proposito: e o SessionStart que entrega politica e briefing ao
|
|
139
|
+
// modelo, e liberar aqui daria trabalho sem o contexto que a guarda existe para
|
|
140
|
+
// garantir. O que muda e a mensagem — quem le passa a saber que o projeto esta pronto e
|
|
141
|
+
// que falta so reabrir, em vez de procurar o que ainda estaria faltando.
|
|
142
|
+
if (r?.estado === "ok") {
|
|
143
|
+
return saidaDaGuarda(host, "dd-harness: política e briefing JÁ EXISTEM no serviço, mas o boot " +
|
|
144
|
+
"desta sessão rodou antes de eles existirem — por isso o contexto não chegou ao modelo. " +
|
|
145
|
+
"Nada falta gravar: **reabra a sessão** para o boot carregá-los. " +
|
|
146
|
+
"Enquanto isso, leitura (Read/Glob/Grep) e as ferramentas de leitura do dd-harness continuam liberadas.");
|
|
147
|
+
}
|
|
148
|
+
return saidaDaGuarda(host, "dd-harness: política e briefing não foram carregados nesta sessão/projeto. " +
|
|
149
|
+
"Se este projeto é novo, conduza o briefing e grave os dois com `escrever_artefato`; " +
|
|
150
|
+
"se não, reabra a sessão para o boot rodar.");
|
|
109
151
|
}
|
|
110
152
|
const edicoes = edicoesDaChamada(c);
|
|
111
153
|
const avisos = [];
|
package/package.json
CHANGED