@neetru/cli 2.20.3 → 2.22.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.
Files changed (38) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/dist/commands/code.js +381 -27
  3. package/dist/commands/code.js.map +1 -1
  4. package/dist/index.js +2 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/lib/code-agent-files.d.ts +14 -4
  7. package/dist/lib/code-agent-files.js +88 -9
  8. package/dist/lib/code-agent-files.js.map +1 -1
  9. package/dist/lib/code-agent-gateway.d.ts +2 -2
  10. package/dist/lib/code-agent-gateway.js +9 -4
  11. package/dist/lib/code-agent-gateway.js.map +1 -1
  12. package/dist/lib/code-agent-git-tools.d.ts +12 -16
  13. package/dist/lib/code-agent-git-tools.js +35 -26
  14. package/dist/lib/code-agent-git-tools.js.map +1 -1
  15. package/dist/lib/code-agent-protocol.d.ts +9 -0
  16. package/dist/lib/code-agent-protocol.js.map +1 -1
  17. package/dist/lib/code-agent-session.js +8 -1
  18. package/dist/lib/code-agent-session.js.map +1 -1
  19. package/dist/lib/code-agent-skills.d.ts +38 -0
  20. package/dist/lib/code-agent-skills.js +347 -0
  21. package/dist/lib/code-agent-skills.js.map +1 -0
  22. package/dist/lib/code-agent-tools.d.ts +7 -1
  23. package/dist/lib/code-agent-tools.js +72 -15
  24. package/dist/lib/code-agent-tools.js.map +1 -1
  25. package/dist/lib/code-agent-tui.d.ts +16 -0
  26. package/dist/lib/code-agent-tui.js +75 -5
  27. package/dist/lib/code-agent-tui.js.map +1 -1
  28. package/dist/lib/code-agent-types.d.ts +5 -0
  29. package/dist/lib/code-agent-ui.d.ts +16 -0
  30. package/dist/lib/code-agent-ui.js +76 -27
  31. package/dist/lib/code-agent-ui.js.map +1 -1
  32. package/dist/lib/code-agent-web-tools.d.ts +4 -0
  33. package/dist/lib/code-agent-web-tools.js +257 -0
  34. package/dist/lib/code-agent-web-tools.js.map +1 -0
  35. package/dist/lib/code-agent-write-tools.d.ts +5 -0
  36. package/dist/lib/code-agent-write-tools.js +141 -0
  37. package/dist/lib/code-agent-write-tools.js.map +1 -0
  38. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,47 @@
2
2
 
3
3
  Convenção: [Keep a Changelog](https://keepachangelog.com/) + [SemVer](https://semver.org/).
4
4
 
5
+ ## [2.22.0] — 2026-07-13 (`neetru code` — autocomplete de slash commands, ferramentas deterministicas de escrita, limite de turnos inteligente)
6
+
7
+ > Feedback direto do uso real (transcript colado pelo usuário): um modelo preso reescrevendo o mesmo diff quebrado gastava o orçamento de turnos INTEIRO em correções de patch e a sessão inteira falhava com "Limite de turnos atingido" sem chance de continuar. Diagnóstico confirmado por revisão de código (Codex): o problema é arquitetural — o CLI depende só de `NEETRU_PATCH` (unified diff cru gerado pelo modelo) como único caminho de escrita.
8
+
9
+ ### Adicionado
10
+
11
+ - **Autocomplete de slash commands** — digitar `/` na sessão interativa lista os comandos, narrowing conforme digita (substring, não só prefixo), setas ↑/↓ navegam, Tab ou Enter (quando a sugestão ainda não é o texto exato) completa em vez de submeter. Fonte única (`SLASH_COMMANDS` em `code-agent-ui.ts`) compartilhada com `/help`, pra nunca ficar desalinhada.
12
+ - **3 ferramentas deterministicas de escrita** (`code-agent-write-tools.ts`) — `write_file` (cria/sobrescreve um arquivo inteiro), `append_file` (adiciona ao final), `replace_in_file` (troca um trecho exato, com detecção de ocorrência ambígua e `"replace_all":true` explícito). Viram o caminho PRINCIPAL pra criar/editar UM arquivo por vez; `NEETRU_PATCH` vira fallback só pra diff multi-arquivo/multi-hunk num único turno. Mesmo tier de confirmação de `git_commit`/`git_branch` (local/reversível, `--yes` dispensa a pergunta); path sempre resolvido via `resolveInside` (contenção + symlink real path) e escrita em arquivo de segredo (.env/chave) bloqueada, espelhando o bloqueio de leitura. Bloqueadas em modo plano.
13
+
14
+ ### Corrigido
15
+
16
+ - **Loop de patch inválido gastava o orçamento de turnos inteiro** — cada tentativa de correção consumia 1 turno igual a qualquer outro; um modelo preso no mesmo erro nunca sobrava turno pra nada. Depois de 3 tentativas SEGUIDAS de patch inválido, o loop para de pedir "corrija o diff" e força o modelo a mudar de estratégia (explicar em texto, ou — com as novas ferramentas de escrita — usar `write_file`/`replace_in_file` no arquivo específico).
17
+ - **"Limite de turnos atingido" matava a sessão sem chance de continuar** — esgotar `maxTurns` agora pergunta "Continuar mais N turnos?" antes de falhar, mas SÓ quando há um humano de verdade (`!silent`) — subagentes e sessões não-interativas (sem TTY) continuam falhando direto, sem regressão de comportamento nem risco de loop custando dinheiro sem supervisão.
18
+ - **Achado testando a própria correção acima: a extensão de turnos podia rodar PARA SEMPRE** — um `confirm` que sempre aprova (script/automação, ou um `confirm` de teste ingênuo) mantinha um modelo genuinamente preso (nunca conclui, nunca bloqueia) estendendo o limite indefinidamente — travou de verdade um worker de teste até estourar memória. Novo teto `MAX_TURN_LIMIT_EXTENSIONS` (2): depois disso, falha direto mesmo que a extensão continue sendo aprovada.
19
+
20
+ ### Docs
21
+
22
+ - System prompt (`buildSystemPrompt`) atualizado pra orientar o modelo a preferir write_file/append_file/replace_in_file sobre NEETRU_PATCH pra mudança de um arquivo só, e a abandonar um diff que já falhou 2-3 vezes em vez de insistir.
23
+
24
+ ## [2.21.0] — 2026-07-13 (`neetru code` — skills, modo objetivo/plano/auto, ferramentas web/GitHub + hardening pós-review)
25
+
26
+ > Sessão com trabalho concorrente Claude+Codex no mesmo repo. Codex implementou skills, patch pre-check, modo objetivo/plano/auto, `/approve`/`/auto` e as ferramentas `web_search`/`web_fetch`/`github_search`/`github_repo`. Um Codex-review dedicado (`codex-rescue`) auditou os 4 commits anteriores (2.20.1-2.20.3 + o `feat` de base); os achados P1/P2 confirmados por leitura direta do código + os achados adicionais encontrados nesta revisão foram corrigidos nesta mesma versão, antes da publicação.
27
+
28
+ ### Adicionado
29
+
30
+ - **Skills locais do `neetru code`** — skills vivem em `.neetru/code/skills/<nome>/SKILL.md` (frontmatter `name`/`description`). Nova ferramenta `NEETRU_TOOL {"tool":"create_skill","name":"...","description":"..."}` (pede confirmação, respeita `--yes`). Comando `/skills` (lista carregadas), `/skills init` (materializa as skills builtin em disco), `/skills show <nome>`. O system prompt carrega as skills disponíveis no início da sessão (`src/lib/code-agent-skills.ts`).
31
+ - **3 skills builtin** (sempre carregadas, mesmo sem `.neetru/code/skills/` local) — `skill-creator`, `design-excellence` (cores/contraste/tipografia/layout/estados de UI) e `structured-programming` (funções pequenas e coesas, sem abstração prematura, erro tratado só na fronteira). `/skills init` materializa as 3 de uma vez (`installAllBuiltinSkills`).
32
+ - **Validação de patch ANTES da confirmação** — `checkPatchApplies` (`code-agent-files.ts`) roda `git apply --check` assim que o modelo propõe um patch, antes de mostrar "Aplicar este patch? [y/N]". Se inválido, o erro volta pro modelo pedindo um diff corrigido.
33
+ - **Modo plano / modo objetivo / auto mode / `/approve`** — 4 modos reais agora (`somente plano`, `manual`, `aceita mudanças`, `auto`), com Shift+Tab ciclando entre eles. Modo plano bloqueia toda ferramenta que escreve/executa/publica (`PLAN_MODE_BLOCKED_TOOLS`); modo objetivo (`/goal`, `--goal`/`--objective`) continua trabalhando entre turnos até `NEETRU_DONE`/`NEETRU_BLOCKED`/limite, em vez de parar em toda resposta parcial; `/approve` aprova um plano e entra em auto mode executando a tarefa planejada; `/auto` entra direto em auto mode. Auto mode (`yes && objectiveMode`) é o único em que `git_push`/`gh_pr_create`/`shell_exec`/`create_skill` rodam sem confirmação — nos demais modos essas 4 ferramentas continuam confirmando sempre.
34
+ - **Ferramentas de pesquisa externa** — `web_search`/`web_fetch` (DuckDuckGo HTML + fetch genérico, com bloqueio de host privado/SSRF) e `github_search`/`github_repo` (API pública do GitHub) em `code-agent-web-tools.ts`.
35
+
36
+ ### Corrigido
37
+
38
+ - **`thinking -> thinking` inválido no loop de auto-correção de patch** — auto-transição faltava em `VALID_TRANSITIONS`.
39
+ - **P1 (Codex-rescue, confirmado por leitura direta) — preview de confirmação não sanitizava texto do modelo** — `shell_exec`/`gh_pr_create`/`git_commit` interpolavam `command`/`title`/`body`/`message` crus no prompt `[y/N]`; um valor "repetido" de conteúdo de arquivo lido (prompt injection) podia usar ESC/CR pra reescrever visualmente o que aparece na tela, tornando a confirmação tecnicamente real mas enganosa. Nova `sanitizeForPreview()` (`code-agent-git-tools.ts`) remove C0/C1 antes de montar a preview — só a preview muda, o valor original continua sendo o que roda após aprovado.
40
+ - **P2 (Codex-rescue, confirmado por leitura direta) — `/agents stop` não cancelava a chamada de rede em voo** — o `AbortSignal` do subagente só era checado nas bordas do turno; `callGateway`/`streamGatewayChat` nunca recebiam esse signal, então parar um subagente cortava só o PRÓXIMO turno, não a requisição HTTP já em andamento. `streamGatewayChat` agora combina (`AbortSignal.any`) o timeout interno com o signal do chamador; `callGateway` encaminha pro `apiRequest`.
41
+ - **P2 (Codex-rescue, confirmado por leitura direta) — contagem regressiva do retry (GAP-M1-21) não aparecia na tela** — `callGatewayWithProgress` já para o spinner recebido antes de lançar (streaming + fallback sem stream falharam); o wrapper de retry atualizava esse MESMO spinner morto pra mostrar "tentando de novo em Ns". Agora cria um spinner novo pra cada rodada de retry.
42
+ - **Cabeçalho/`​/status` não distinguiam "aceita mudanças" de "auto"** — `renderHeader`/`renderSessionStatus` ainda usavam a lógica binária antiga (`apply`×`yes`) e mostravam os dois modos como "auto-aplica", apesar de terem garantias de confirmação diferentes. Nova `formatPatchMode()` (`code-agent-ui.ts`) reflete os 4 estados reais.
43
+ - **Troca de modo truncava o histórico pra 12 mensagens em silêncio** — Shift+Tab e todo comando de modo (`/goal`, `/ultracode`, `/plan`, `/approve`, `/auto`, `/apply`, `/yes`, `/no`) reconstroem o system prompt preservando só as últimas 12 mensagens; agora avisa quando isso de fato corta contexto.
44
+ - Doc comments perdidos em `InkSessionContext` (`code-agent-tui.tsx`) restaurados.
45
+
5
46
  ## [2.20.3] — 2026-07-11 (`neetru code` — HOTFIX: erro real de patch mascarado por "Transicao de estado invalida")
6
47
 
7
48
  > Reportado ao vivo: usuário aprovou um patch, `git apply` rejeitou (hunk header malformado no diff gerado pelo modelo), mas em vez do erro real apareceu `Falha Transicao de estado invalida: awaiting_confirm -> failed`.