dd-harness 0.33.0 → 0.33.1

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 +31 -3
  2. package/package.json +1 -1
package/dist/sessao.js CHANGED
@@ -97,15 +97,43 @@ 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
+ if (ONBOARDING.test(c.ferramenta)) {
130
+ const r = await buscaPolitica(raiz).catch(() => null);
131
+ if (r?.estado === "sem-politica")
132
+ return saidaDaGuarda(host);
133
+ }
134
+ return saidaDaGuarda(host, "dd-harness: política e briefing não foram carregados nesta sessão/projeto. " +
135
+ "Se este projeto é novo, conduza o briefing e grave os dois com `escrever_artefato`; " +
136
+ "se não, reabra a sessão para o boot rodar.");
109
137
  }
110
138
  const edicoes = edicoesDaChamada(c);
111
139
  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.1",
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",