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.
Files changed (2) hide show
  1. package/dist/sessao.js +45 -3
  2. 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
- const onboarding = e?.estado === "sem-politica" && /^mcp__dd[-_]harness__escrever_artefato$/.test(c.ferramenta);
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
- return saidaDaGuarda(host, "dd-harness: política e briefing não foram carregados nesta sessão/projeto. Corrija o boot e reabra a sessão.");
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dd-harness",
3
- "version": "0.33.0",
3
+ "version": "0.33.2",
4
4
  "type": "module",
5
5
  "description": "Política, memória e integrações de Claude Code, Codex e Antigravity. CLI sem dependências de runtime.",
6
6
  "license": "UNLICENSED",