izanagi-ai 3.21.1 → 3.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 (86) hide show
  1. package/.manifest +2 -2
  2. package/AGENTS.md +1 -1
  3. package/CHANGELOG.md +51 -0
  4. package/README.md +81 -2
  5. package/ROADMAP.md +76 -1
  6. package/RULES.md +1 -1
  7. package/SYSTEM.md +42 -3
  8. package/dist/cli/commands/doctor.d.ts.map +1 -1
  9. package/dist/cli/commands/doctor.js +37 -0
  10. package/dist/cli/commands/doctor.js.map +1 -1
  11. package/dist/cli/commands/export.d.ts.map +1 -1
  12. package/dist/cli/commands/export.js +55 -24
  13. package/dist/cli/commands/export.js.map +1 -1
  14. package/dist/cli/commands/models.d.ts.map +1 -1
  15. package/dist/cli/commands/models.js +13 -1
  16. package/dist/cli/commands/models.js.map +1 -1
  17. package/dist/cli/commands/run.d.ts +14 -0
  18. package/dist/cli/commands/run.d.ts.map +1 -1
  19. package/dist/cli/commands/run.js +47 -6
  20. package/dist/cli/commands/run.js.map +1 -1
  21. package/dist/exporters.d.ts +27 -1
  22. package/dist/exporters.d.ts.map +1 -1
  23. package/dist/exporters.js +495 -492
  24. package/dist/exporters.js.map +1 -1
  25. package/dist/installer.d.ts +0 -3
  26. package/dist/installer.d.ts.map +1 -1
  27. package/dist/installer.js +31 -15
  28. package/dist/installer.js.map +1 -1
  29. package/dist/runtime/cache/response-cache.d.ts +7 -0
  30. package/dist/runtime/cache/response-cache.d.ts.map +1 -1
  31. package/dist/runtime/cache/response-cache.js +5 -1
  32. package/dist/runtime/cache/response-cache.js.map +1 -1
  33. package/dist/runtime/contracts/artifacts.d.ts.map +1 -1
  34. package/dist/runtime/contracts/artifacts.js +10 -0
  35. package/dist/runtime/contracts/artifacts.js.map +1 -1
  36. package/dist/runtime/execute.d.ts +21 -1
  37. package/dist/runtime/execute.d.ts.map +1 -1
  38. package/dist/runtime/execute.js +31 -4
  39. package/dist/runtime/execute.js.map +1 -1
  40. package/dist/runtime/llm/agent-cli.d.ts +274 -0
  41. package/dist/runtime/llm/agent-cli.d.ts.map +1 -0
  42. package/dist/runtime/llm/agent-cli.js +515 -0
  43. package/dist/runtime/llm/agent-cli.js.map +1 -0
  44. package/dist/runtime/llm/client.d.ts +35 -2
  45. package/dist/runtime/llm/client.d.ts.map +1 -1
  46. package/dist/runtime/llm/client.js +25 -2
  47. package/dist/runtime/llm/client.js.map +1 -1
  48. package/dist/runtime/model/router.d.ts +22 -1
  49. package/dist/runtime/model/router.d.ts.map +1 -1
  50. package/dist/runtime/model/router.js +63 -3
  51. package/dist/runtime/model/router.js.map +1 -1
  52. package/dist/runtime/orchestrator.d.ts +16 -11
  53. package/dist/runtime/orchestrator.d.ts.map +1 -1
  54. package/dist/runtime/orchestrator.js +4 -1
  55. package/dist/runtime/orchestrator.js.map +1 -1
  56. package/dist/runtime/tests/agent-cli.test.d.ts +2 -0
  57. package/dist/runtime/tests/agent-cli.test.d.ts.map +1 -0
  58. package/dist/runtime/tests/agent-cli.test.js +484 -0
  59. package/dist/runtime/tests/agent-cli.test.js.map +1 -0
  60. package/dist/runtime/tests/capability-fields.test.js +16 -2
  61. package/dist/runtime/tests/capability-fields.test.js.map +1 -1
  62. package/dist/runtime/tests/clean-temp.test.d.ts +2 -0
  63. package/dist/runtime/tests/clean-temp.test.d.ts.map +1 -0
  64. package/dist/runtime/tests/clean-temp.test.js +83 -0
  65. package/dist/runtime/tests/clean-temp.test.js.map +1 -0
  66. package/dist/runtime/tests/export-global.test.d.ts +2 -0
  67. package/dist/runtime/tests/export-global.test.d.ts.map +1 -0
  68. package/dist/runtime/tests/export-global.test.js +46 -0
  69. package/dist/runtime/tests/export-global.test.js.map +1 -0
  70. package/dist/runtime/tests/model.test.js +5 -2
  71. package/dist/runtime/tests/model.test.js.map +1 -1
  72. package/dist/runtime/token/execution-budget.d.ts +8 -0
  73. package/dist/runtime/token/execution-budget.d.ts.map +1 -1
  74. package/dist/runtime/token/execution-budget.js +12 -0
  75. package/dist/runtime/token/execution-budget.js.map +1 -1
  76. package/dist/scripts/clean-temp.d.ts +56 -0
  77. package/dist/scripts/clean-temp.d.ts.map +1 -0
  78. package/dist/scripts/clean-temp.js +141 -0
  79. package/dist/scripts/clean-temp.js.map +1 -0
  80. package/dist/scripts/verify-build.js +27 -13
  81. package/dist/scripts/verify-build.js.map +1 -1
  82. package/dist/sdk.d.ts +6 -0
  83. package/dist/sdk.d.ts.map +1 -1
  84. package/dist/sdk.js +1 -0
  85. package/dist/sdk.js.map +1 -1
  86. package/package.json +101 -100
package/.manifest CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "izanagi-ai",
3
- "version": "3.21.1",
3
+ "version": "3.22.0",
4
4
  "description": "Izanagi AI - Modular Skill-Oriented AI Prompt & Agent Framework for Autonomous Software Engineering",
5
5
  "author": "Pedro Henrique Sanches Leal",
6
6
  "license": "MIT",
7
7
  "homepage": "https://github.com/pedrohenriquesanchesleal4-debug/izanagi-ai#readme",
8
- "generatedAt": "2026-09-08T13:34:29.510Z",
8
+ "generatedAt": "2026-09-09T16:41:15.896Z",
9
9
  "agents": [
10
10
  {
11
11
  "id": "adversarial-critic",
package/AGENTS.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # AGENTS.md: Izanagi AI Framework Reference
2
2
 
3
- > Version 3.21.0
3
+ > Version 3.22.0
4
4
  > Modular Skill-Oriented AI Prompt & Agent Framework for Autonomous Software Engineering
5
5
  > Multi-CLI: Opencode · Claude Code · Codex · Cursor · Copilot · Kimi (Smart Auto-Detection & Selective Generation)
6
6
 
package/CHANGELOG.md CHANGED
@@ -4,6 +4,57 @@
4
4
 
5
5
  ---
6
6
 
7
+ ## [3.22.0]: 2026-09-09
8
+
9
+ ### Added
10
+ - **`izanagi run` executa sem API key e sem modelo local.** Novo executor `claude-cli` (`src/runtime/llm/agent-cli.ts`): `AgentCLIAdapter` implementa `ModelAdapter`, entra no `LLMClient` como qualquer provider e atravessa run/SDK/`models`/juiz semântico/arena sem que nenhum chamador mude. A diferença é que ele não fala HTTP: spawna um agente de codificação **já instalado e autenticado na máquina** (hoje o `claude`, Claude Code CLI) em modo print. Detecção por PATH sem shell e sem `which`/`where` (`findExecutable`, com PATHEXT no Windows, onde o binário é `claude.exe`). Zero configuração: se o binário está lá, o provider aparece.
11
+
12
+ O motivo de existir é de ALCANCE, não de arquitetura. O runtime já planejava, roteava por papel, verificava por evidência, curava e replanejava; sem chave configurada ele executava os nós com `createHeadlessProducer`, que SIMULA o artefato. Quem não quisesse colar uma chave nem subir um modelo local tinha um planejador, não um runtime.
13
+
14
+ - **As flags do CLI hospedeiro viraram os controles do runtime.** Modelo do papel para `--model`; teto de custo restante do run para `--max-budget-usd`; política de tools para `--restricted` + `--tools`; escrita de arquivo em opt-in para `--permission-mode acceptEdits`; sem estado residual entre nós para `--no-session-persistence` e `--strict-mcp-config`; telemetria para `--output-format json` (`usage` + `total_cost_usd`). Os três ids de modelo do catálogo (`claude-haiku-4-5`, `claude-sonnet-5`, `claude-opus-5`) foram validados contra o CLI instalado, que rejeita id desconhecido localmente e de graça (`[claude-code:unrecognized_model]`).
15
+
16
+ - **`--agent-tools none|read|write`** (e `IZANAGI_AGENT_CLI_TOOLS`): política de tools do EXECUTOR, distinta de `--allow-tool` (que governa os nós de tool do grafo). Default `none`: nenhuma tool, nenhum shell, nenhum settings do projeto carregado. `read` libera `Read/Grep/Glob` e dá grounding real no repositório; `write` acrescenta `Write/Edit`. `Bash` não entra em nenhuma das três, e `write` exige o valor literal, sendo o único ponto do adapter que autoriza alteração de arquivo. Exposto também no SDK (`agentTools`).
17
+
18
+ - **`izanagi export --cli claude --global`: os agentes e skills passam a valer em TODO projeto.** Agente e skill são descobertos por PROJETO, então abrir a CLI em outro diretório (ou num subdiretório) não encontra nenhum dos 22 agentes nem a biblioteca de skills, e a conclusão natural de quem vê isso é que o framework não funciona. O escopo pessoal instala em `~/.claude/{agents,commands,skills}` e **nunca** escreve `~/CLAUDE.md`: esse arquivo é a memória global de quem usa, e sobrescrevê-lo injetaria a descrição de um framework em todo repositório aberto. Só existe para `--cli claude`, a única CLI aqui cujo diretório de usuário é lido em todo projeto: fingir suporte para as outras criaria arquivos que nada leria. Junto veio a separação entre FONTE e DESTINO no exportador (`ClaudeExportOptions.sourceDir`), que sempre foram o mesmo `baseDir` — sem isso, exportar para `~/` leria agentes de `~/agents`, não encontraria nada e gravaria um `.claude/` vazio que parece instalado.
19
+
20
+ - **O agente do nó passa a ter voz no modelo que vai rodar.** Os 22 agentes core declaram `model` no próprio JSON (`sonnet` em 20 deles, `opus` em `agent-architect` e `skill-architect`), o `AgentCapabilityRegistry` já expunha isso como `modelHint` e o roteamento **nunca lia o campo**: "o orquestrador escolhe o modelo de cada agente que ele comanda" era verdade pela metade, porque o papel escolhia e o agente não opinava. `ModelRouter.tierForHint` traduz o hint para tier e `routeForRole` o aceita, com precedência: pin do usuário (`--model`, config `roles`, `IZANAGI_MODEL_*`) > hint do agente > default do papel. O hint é TIER e não id de modelo, e é isso que o mantém provider-agnostic. Num grafo real: `agent-architect` sai em `claude-opus-5`, o `qa` em `claude-sonnet-5`, a avaliação em `claude-haiku-4-5` — e o Commander que decidiu isso é determinístico, então a assimetria não custa token nenhum para ser calculada.
21
+
22
+ - **Seção "Executor" no `izanagi doctor`** e linha de executor no `izanagi run`/`izanagi models`: qual dos três caminhos (chave, modelo local, CLI de agente) está disponível AGORA, com o motivo quando não está. Antes, "modo headless" era algo que se descobria vendo o run simular.
23
+
24
+ ### Changed
25
+ - **Custo MEDIDO passa a vencer custo estimado.** `NodeProduction.costUsd` (novo campo opcional no retorno do producer) sobe o `total_cost_usd` reportado pelo executor até o Budget Controller, e `--max-cost` passa a ser cobrado sobre o gasto real em vez da tabela de preço do catálogo. Quando o executor não mede, o estimador de sempre continua valendo: um número medido e um número estimado não podem ocupar o mesmo campo sem se confundirem.
26
+ - **`ExecutionBudget.remainingUsd`**: o teto que ainda cabe no run desce até o executor, que sabe recusar por conta própria (`--max-budget-usd`). O degrau mais confiável do Budget Controller é o que o processo executor também conhece.
27
+ - **Chave do cache de resposta ganhou a política de tools** (esquema `v1` para `v2`). A mesma pergunta respondida com leitura do repositório não é a mesma resposta que sem leitura, e servir uma pela outra seria um hit que mente sobre a evidência que produziu o artefato.
28
+ - **Catálogo default do router: 5 para 6 providers.** Sem entrada de catálogo o roteador nunca teria modelo a escolher, e "adapter disponível" sem "modelo disponível" seria uma cura que não cura nada.
29
+
30
+ ### Fixed
31
+ - **O survey do projeto reprovava qualquer repositório que contivesse a palavra "TODO".** `project-survey` é saída CAPTURADA do disco (nomes de arquivo e primeiras linhas do README), e a varredura anti-stub media o vocabulário do projeto varrido em vez do texto do modelo: o run abortava no PRIMEIRO nó com `artefato inválido (project-survey)`, e o survey vem ligado por default em qualquer diretório com cara de projeto. `capturedOutput: true` nos schemas `project-survey` e `materialization` (um recibo de escrita com `out/TODO.md` na lista tinha o mesmo destino). A marca não é anistia geral: texto autoral com stub continua reprovado, e há teste para os dois lados.
32
+ - **A verificação de build escrevia ~700 arquivos na raiz do repositório.** `verify-build` criava o sandbox em `<repo>/tmp-sandbox-test` e limpava na ÚLTIMA linha do try: qualquer erro antes disso, ou um `rmSync` que falhasse no Windows com arquivo em uso, deixava a instalação simulada inteira sem rastro no git. Era metade do "800 arquivos alterados" que aparecia no `git status`. Agora o sandbox nasce em `os.tmpdir()` e a limpeza roda nos dois caminhos: verificação de build não escreve na árvore que ela verifica.
33
+ - **O espelho de assets em `.agents/` era criado dentro do próprio repo do framework.** `writeRootDocs` tinha a guarda `isFrameworkRepo` desde a v3.21.0; `installToProject` não, e é ele que copia agentes, skills e engines — ~700 arquivos duplicando o que o repositório já É, condenados a divergir do original (e a resposta para "por que existem duas pastas de agentes?" e "por que o `AGENTS.md` dentro de `.agents/` está desatualizado?"). O que é legitimamente rastreado ali (os `*.yaml` derivados do ADR-005) nunca veio desta função e segue intacto.
34
+ - **3.517 diretórios temporários acumulados no TEMP do usuário.** Quase toda suíte cria o próprio `mkdtempSync` e nenhuma remove: `izanagi-mem` (384), `izanagi-tools` (264), `izanagi-dash` (240), `izanagi-artifacts` (240), `izanagi-approvals` (216)... Novo `scripts/clean-temp.ts` (`npm run clean:temp`) varre por PREFIXO conhecido, só no primeiro nível de `os.tmpdir()`, e roda dentro do `npm test` logo depois do build. A varredura vem ANTES do runner de propósito: `&&` não executa o comando seguinte quando a suíte falha, e `;` não existe no `cmd.exe` — um `posttest` pularia exatamente na rodada que mais deixou lixo. Com a limpeza na frente, o acúmulo fica limitado a uma rodada em vez de crescer sem fim. Um limpador que apaga o que não criou seria pior que o vazamento: cada prefixo termina em `-`, e há teste verificando que `izanagi-memorias-do-usuario` NÃO casa `izanagi-mem-`.
35
+ - **O teste de capacidades cobrava dos agentes gerados o que só os core declaram.** `capability-fields.test.ts` varria também `agents/generated/`, onde a AgentFactory grava agentes criados em tempo de run; esses nascem sem `model`/`evaluation` por construção, então bastava alguém rodar `izanagi run` no repositório para o teste ficar vermelho por um motivo que não é regressão.
36
+
37
+ ### Security
38
+ - **Nada de shell.** `spawn` com argv em array e `shell: false`: o objetivo do usuário entra como dado, nunca como texto interpretado por um shell. Há teste com metacaracteres de shell no objetivo verificando que o texto chega íntegro e nada é executado.
39
+ - **Prompt por stdin, nunca por argv.** O system prompt de um nó com chain de skills passa de 30KB e o limite de linha de comando do Windows é 32.767 caracteres para o comando inteiro: por argv, o run quebraria justamente nos nós mais ricos. Vai em blocos delimitados (`izanagi:instructions`, `izanagi:task`), com `--append-system-prompt` carregando só o contrato curto que diz como tratá-los.
40
+ - **Guarda de recursão.** Um `izanagi run` disparado de dentro de uma sessão do agente pode spawnar o agente (profundidade 0 para 1); o filho recebe `IZANAGI_AGENT_CLI_DEPTH+1` e no teto o adapter fica `configured: false`, degradando para headless com aviso em vez de estourar no meio do grafo. `killTree` mata a árvore do processo (no Windows `child.kill()` deixaria os netos vivos consumindo cota de um run já cancelado).
41
+ - **Executor suprimido dentro de test runner.** `NODE_TEST_CONTEXT` presente desliga o adapter: sem isso, qualquer teste que chame a CLI em processo passaria a gastar cota real de quem rodou `npm test`. Medido: um teste de compatibilidade de flag saiu de milissegundos para 28 segundos de chamada de modelo. `IZANAGI_AGENT_CLI_IN_TESTS=1` libera, para quem quer justamente um teste de integração.
42
+ - `IZANAGI_AGENT_CLI_DISABLED=1` desliga o executor por completo; nenhuma política usa `--dangerously-skip-permissions`, e há teste que verifica sua ausência no argv.
43
+
44
+ ### Medições
45
+ - System prompt do próprio CLI hospedeiro: **20.848 para 4.095 tokens** de entrada com `--restricted --tools ""` (US$ 0,042 para US$ 0,005 na mesma pergunta). É o default do adapter.
46
+ - Nó de specialist com chain de skills: **~18.000 tokens** com `tools=none`; **~68.000** com `tools=read` (47.390 in / 20.310 out, porque o agente faz várias voltas de tool antes de responder, ~3,8x). Daí o piso recomendado de `--budget`: 30.000 e 105.000, avisado pela CLI quando o teto declarado fica abaixo.
47
+ - Run real de ponta a ponta sem nenhuma chave configurada: `izanagi run senior-engineer --task "validarCPF..." --output out` terminou **PASS, score 1**, 15.747 tokens, com `Tools: model:claude-cli` no trace e o arquivo entregue em disco contendo TypeScript executável.
48
+
49
+ ### Limitação conhecida (medida, não estimada)
50
+ - **Grounding real não é grounding completo.** Com `--agent-tools read`, o executor leu o repositório de verdade (acertou `3.21.1`, a versão exata do `package.json`) e ainda assim afirmou 5 providers onde havia 6, citando "linhas 16-84" de um array que vai até a linha 112, com a entrada nova na linha 99. É comportamento de modelo, não do runtime, e é exatamente por isso que a Verification Engine e os critérios de aceite continuam sendo o que decide se um artefato passa.
51
+ - **A AgentFactory grava em `<cwd>/agents/generated/`** um agente derivado do texto do objetivo. Rodando dentro do próprio checkout do framework, isso deixa lixo na árvore de agentes do repositório, que foi o que quebrou o teste de capacidades acima.
52
+
53
+ ### Verificação
54
+ - **897 testes, 896 passando** (medido em 2026-09-09, no Windows; 47 novos: detecção de binário, política de tools, argv, stdin, parse de fixtures REAIS capturadas do CLI v2.1.266, spawn de verdade contra um CLI falso, injeção de shell, exit code, timeout, cancelamento, profundidade, supressão em teste, chave de cache, piso de orçamento e as duas regressões corrigidas). O único vermelho segue sendo `polyglot`, que depende de binário Rust local.
55
+
56
+ ---
57
+
7
58
  ## [3.21.1]: 2026-09-08
8
59
 
9
60
  ### Fixed
package/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # Izanagi AI
2
2
 
3
- > **v3.21.0** · Runtime de execução de trabalho orientado a agentes: **Commander** → contrato de tarefa → roteamento por papel (por TAREFA, não por run) → grafo → verificação por evidência → healing → replan → memória. O run **lê o projeto** antes de decidir e **entrega arquivo** no fim, os dois por nós de tool com permissão declarada. Todo teto declarado (tokens, custo, tempo, retries, agentes, tool calls, concorrência, allowlist de tool) **é aplicado e tem teste que mede o teto**; `Ctrl-C` cancela o run e o `resume` retoma do último batch gravado. 22 agentes especializados, catálogo de skills v2, CLI publicada no npm (`izanagi-ai`), SDK programático e **topologia poliglota** (Rust · Go · Python · TypeScript) ao lado do runtime legado.
3
+ > **v3.22.0** · Runtime de execução de trabalho orientado a agentes. **Executa sem API key e sem modelo local**: se você já tem o `claude` (Claude Code CLI) instalado e autenticado, `izanagi run` faz trabalho de verdade usando essa autenticação, por subprocesso.
4
+ >
5
+ > Arquitetura: **Commander** → contrato de tarefa → roteamento por papel (por TAREFA, não por run) → grafo → verificação por evidência → healing → replan → memória. O run **lê o projeto** antes de decidir e **entrega arquivo** no fim, os dois por nós de tool com permissão declarada. Todo teto declarado (tokens, custo, tempo, retries, agentes, tool calls, concorrência, allowlist de tool) **é aplicado e tem teste que mede o teto**; `Ctrl-C` cancela o run e o `resume` retoma do último batch gravado. 22 agentes especializados, catálogo de skills v2, CLI publicada no npm (`izanagi-ai`), SDK programático e **topologia poliglota** (Rust · Go · Python · TypeScript) ao lado do runtime legado.
4
6
 
5
7
  **Filosofia:** Arquitetura primeiro. Código depois. Qualidade medida. Evolução contínua. Zero "cara de IA".
6
8
 
@@ -20,6 +22,81 @@ izanagi --version
20
22
 
21
23
  ---
22
24
 
25
+ ## Executar sem API key
26
+
27
+ O Izanagi precisa de um **executor**: alguém que rode os nós do grafo. Existem três caminhos, e o primeiro não pede chave nenhuma.
28
+
29
+ ```bash
30
+ izanagi doctor # diz qual executor está disponível AGORA
31
+ ```
32
+
33
+ | Caminho | O que exige | Como o runtime o chama |
34
+ |---|---|---|
35
+ | **CLI de agente** (recomendado) | um agente de codificação já instalado e autenticado: hoje o `claude` no PATH | provider `claude-cli`, por subprocesso em modo print. **Zero configuração**: detectado no PATH |
36
+ | API key | `IZANAGI_ANTHROPIC_API_KEY`, `IZANAGI_OPENAI_API_KEY`, `IZANAGI_GOOGLE_API_KEY`, `IZANAGI_OPENROUTER_API_KEY` | HTTP direto no provider |
37
+ | Modelo local | `IZANAGI_OLLAMA_ENABLED=1` ou `IZANAGI_LMSTUDIO_ENABLED=1` | endpoint OpenAI-compatible em localhost |
38
+
39
+ Sem nenhum dos três, o run continua funcionando em **modo headless**: planeja, roteia e verifica de verdade, mas SIMULA o conteúdo dos nós. É o comportamento antigo, e agora ele é o último recurso, não o default de quem nunca configurou nada.
40
+
41
+ ```bash
42
+ # nada além do Claude Code instalado:
43
+ izanagi run "Escreva a função validarCPF em TypeScript" --output out
44
+ # ✔ Execução real: claude-cli
45
+ # via CLI de agente já autenticado (sem API key)
46
+ # tools do executor: none (--agent-tools read liga leitura do repositório)
47
+ ```
48
+
49
+ ### Os agentes valem em TODO projeto (escopo pessoal)
50
+
51
+ Agente e skill são descobertos **por projeto**: abrir a CLI em outro diretório não encontra nenhum dos 22 agentes nem a biblioteca de skills, e a conclusão natural de quem vê isso é que o framework não funciona. Instale no escopo pessoal uma vez:
52
+
53
+ ```bash
54
+ izanagi export --cli claude --global # ~/.claude/{agents,commands,skills}
55
+ ```
56
+
57
+ Nunca escreve `~/CLAUDE.md`: esse arquivo é a memória global de quem usa, e sobrescrevê-lo injetaria a descrição de um framework em todo repositório aberto. Agentes e skills são aditivos e ficam inertes até serem chamados.
58
+
59
+ ### O orquestrador escolhe o modelo de cada agente
60
+
61
+ O Commander é **determinístico**: classificar, decidir o modo, gerar contratos e estimar custo não gasta um token. O gasto acontece só nos nós, e cada nó recebe o modelo do PAPEL dele, com o agente tendo voz:
62
+
63
+ ```
64
+ izanagi run agent-architect --task "desenhar um agente novo"
65
+
66
+ execute agent-architect commander claude-opus-5 <- o agente declara `opus` no JSON dele
67
+ verify qa specialist claude-sonnet-5 <- papel specialist: tier balanced
68
+ evaluation - worker claude-haiku-4-5 <- tarefa pequena: tier fast
69
+ ```
70
+
71
+ Precedência: `--model` / pin por papel (`IZANAGI_MODEL_SPECIALIST`, config `roles`) > tier declarado pelo agente > default do papel. O hint é um TIER, não um id: `opus` num catálogo sem premium cai para o melhor disponível, e o mesmo agente roda em Anthropic, OpenAI, modelo local ou CLI de agente sem mudar nada.
72
+
73
+ ### Política de tools do executor
74
+
75
+ O subprocesso roda **sem nenhuma tool por padrão** (`--restricted --tools ""`): nada de shell, nada de escrita, nenhum settings do projeto carregado. É o mais barato, o mais determinístico e o mais seguro.
76
+
77
+ ```bash
78
+ izanagi run "..." # tools: none (default)
79
+ izanagi run "..." --agent-tools read # Read/Grep/Glob: o executor LÊ o repositório
80
+ izanagi run "..." --agent-tools write # + Write/Edit: altera arquivos (opt-in explícito)
81
+ ```
82
+
83
+ `write` é o único valor que autoriza alteração de arquivo, e Bash nunca entra em nenhuma das políticas.
84
+
85
+ ### Custo, medido
86
+
87
+ O CLI devolve o custo real de cada chamada (`total_cost_usd`), então neste executor o custo do run **é medido, não estimado** por tabela de preço. Números observados nesta máquina, num nó de specialist com chain de skills:
88
+
89
+ | Política | Tokens do nó | Observação |
90
+ |---|---|---|
91
+ | `none` | ~18.000 | 4.095 deles são o system prompt do próprio CLI, cobrado em toda chamada |
92
+ | `read` | ~68.000 | o agente faz várias voltas de tool antes de responder: ~3,8x |
93
+
94
+ Por isso `--budget` apertado estoura no primeiro nó. Piso recomendado: **30.000** por nó com `none`, **105.000** com `read` (a CLI avisa quando o teto está abaixo disso).
95
+
96
+ Controles: `IZANAGI_AGENT_CLI_DISABLED=1` desliga o executor · `IZANAGI_AGENT_CLI_TIMEOUT_MS` ajusta o timeout (default 300.000) · `IZANAGI_AGENT_CLI_TOOLS=read|write` é o equivalente de `--agent-tools` por ambiente. Dentro de um test runner o executor fica desligado por padrão, para que `npm test` nunca gaste cota real (`IZANAGI_AGENT_CLI_IN_TESTS=1` libera).
97
+
98
+ ---
99
+
23
100
  ## Quick Start
24
101
 
25
102
  ```bash
@@ -28,6 +105,7 @@ izanagi init my-project
28
105
  # ou sem interação: izanagi init my-project --packs core,agents,coding,database
29
106
 
30
107
  # 2. Executa uma tarefa. O modo é decidido pelo Commander, não fixo.
108
+ # Sem API key: basta ter o Claude Code CLI instalado (izanagi doctor confirma).
31
109
  izanagi run "Converta 10 dólares para reais" # modo direct: 1 chamada, sem grafo
32
110
  izanagi run "Criar uma landing page de um SaaS de analytics" # modo composto, com verificação
33
111
  izanagi run "..." --mode autonomous --max-cost 0.50 # teto de custo respeitado no plano
@@ -36,6 +114,7 @@ izanagi run "..." --acceptance "o endpoint aceita ?page e ?limit" # o que o usu
36
114
  izanagi run "..." --output src --verify-tests # a métrica de teste vem do exit code do projeto
37
115
  izanagi run "..." --min-quality 0.3 # a estratégia mais barata que atinge o piso
38
116
  izanagi run "..." --reuse-artifacts # segundo run da mesma pergunta não repaga a chamada
117
+ izanagi run "..." --agent-tools read # o executor lê o repositório antes de responder
39
118
 
40
119
  # 3. Observabilidade, custo e auditoria
41
120
  izanagi trace # spans, healing, graph, avaliação
@@ -169,7 +248,7 @@ CLI legado (`izanagi`, publicada no npm):
169
248
  | Comando | Descrição |
170
249
  |---|---|
171
250
  | `izanagi init [dir] [--packs a,b,c]` | Cria projeto com `.agents/` e seleção de packs de skills. |
172
- | `izanagi run [agent] --task "<task>"` | Commander decide o modo, roteia por papel, executa o grafo, verifica contra os critérios de aceite e persiste trace + telemetria de custo. Flags: `--mode direct\|assisted\|orchestrated\|autonomous`, `--budget N`, `--max-cost N`, `--model <id>`, `--local` (só providers locais, e serializa o pool: GPU única não ganha com paralelismo), `--max-concurrency N` (teto de tarefas em voo), `--cache`, `--output <dir>` (grava a entrega no projeto), `--survey` / `--no-survey` (força ou desliga o levantamento do projeto antes de decidir), `--acceptance "<critério>"` (repetível: o que a ENTREGA precisa cumprir, além do schema), `--verify-tests` (roda o comando de teste do projeto no fim do grafo e a métrica de teste passa a vir do exit code), `--min-quality 0..1` (compara estratégias e escolhe a mais barata que atinge o piso de VERIFICAÇÃO), `--reuse-artifacts` (reaproveita artefato de run anterior com a mesma pergunta), `--allow-tool <id>` (allowlist de tools do run). **Ctrl-C cancela o run** em vez de matar o processo: o batch em voo é abortado, o progresso já gravado fica no checkpoint e `izanagi resume <run-id>` retoma dali, `--no-commander` (planejamento legado por categoria), `--no-judge` (desliga o juiz semantico), `--prompt-only`. |
251
+ | `izanagi run [agent] --task "<task>"` | Commander decide o modo, roteia por papel, executa o grafo, verifica contra os critérios de aceite e persiste trace + telemetria de custo. Flags: `--mode direct\|assisted\|orchestrated\|autonomous`, `--budget N`, `--max-cost N`, `--model <id>`, `--local` (só providers locais, e serializa o pool: GPU única não ganha com paralelismo), `--max-concurrency N` (teto de tarefas em voo), `--cache`, `--output <dir>` (grava a entrega no projeto), `--survey` / `--no-survey` (força ou desliga o levantamento do projeto antes de decidir), `--acceptance "<critério>"` (repetível: o que a ENTREGA precisa cumprir, além do schema), `--verify-tests` (roda o comando de teste do projeto no fim do grafo e a métrica de teste passa a vir do exit code), `--min-quality 0..1` (compara estratégias e escolhe a mais barata que atinge o piso de VERIFICAÇÃO), `--reuse-artifacts` (reaproveita artefato de run anterior com a mesma pergunta), `--allow-tool <id>` (allowlist de tools do run), `--agent-tools none\|read\|write` (política de tools do EXECUTOR de processo, diferente de `--allow-tool`: aqui se decide se o subprocesso do agente lê o repositório ou altera arquivos). **Ctrl-C cancela o run** em vez de matar o processo: o batch em voo é abortado, o progresso já gravado fica no checkpoint e `izanagi resume <run-id>` retoma dali, `--no-commander` (planejamento legado por categoria), `--no-judge` (desliga o juiz semantico), `--prompt-only`. |
173
252
  | `izanagi models [--json]` | Catálogo de modelos, providers configurados e qual modelo cada papel (commander/specialist/worker) receberia agora, com custo por 10k tokens. |
174
253
  | `izanagi budget [run-id] [--json]` | Para onde foi o orçamento daquele run: tokens por fase, custo estimado, cache local e do provider, contexto poupado, escaladas, degradação e verificação por tarefa. |
175
254
  | `izanagi chat` | REPL interativo da CLI. |
package/ROADMAP.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Roadmap
2
2
 
3
- > Versão atual: **3.21.0**. Estado atual e evolução planejada do **Izanagi AI: Adaptive Agent & Skill Runtime**.
3
+ > Versão atual: **3.22.0**. Estado atual e evolução planejada do **Izanagi AI: Adaptive Agent & Skill Runtime**.
4
4
  > Legenda: ✅ Done · 🔧 In progress · 📋 Planned · 💡 Future idea
5
5
  > Histórico linha-a-linha de cada release em `CHANGELOG.md`: este arquivo resume por fase, não duplica o changelog.
6
6
 
@@ -531,6 +531,81 @@ Testes: **838, 837 passando** (74 novos nesta fase; medido no Windows, onde o
531
531
  `project.test` falhavam no Windows, e o motivo virou linha na seção 3 do
532
532
  [`docs/HANDOFF.md`](docs/HANDOFF.md).
533
533
 
534
+ ## Fase 16: O executor que faltava (v3.22.0) ✅
535
+
536
+ O defeito não era de arquitetura: era de **alcance**. O runtime planejava,
537
+ roteava por papel, verificava por evidência, curava e replanejava — e, sem
538
+ API key configurada, executava os nós com `createHeadlessProducer`, que
539
+ SIMULA o artefato. Quem não quisesse colar uma chave nem subir um modelo
540
+ local tinha um planejador, não um runtime. É a diferença entre "o framework
541
+ está completo" e "o framework funciona na máquina de quem instalou".
542
+
543
+ ### O que entrou
544
+
545
+ - **`claude-cli`: agente de codificação já autenticado como executor**
546
+ (`runtime/llm/agent-cli.ts`). `AgentCLIAdapter` implementa `ModelAdapter`,
547
+ entra no `LLMClient` como qualquer provider e atravessa run/SDK/`models`/
548
+ juiz/arena sem que nenhum chamador mude. Não fala HTTP: spawna o `claude`
549
+ em modo print, sem shell, prompt por stdin. **Zero configuração** — o
550
+ binário é detectado no PATH.
551
+ - **As flags do CLI viraram os controles do runtime**: modelo do papel
552
+ (`--model`), teto de custo restante (`--max-budget-usd`), política de tools
553
+ (`--restricted`/`--tools`), escrita em opt-in (`--permission-mode
554
+ acceptEdits`), sem estado residual (`--no-session-persistence`,
555
+ `--strict-mcp-config`) e telemetria (`--output-format json`).
556
+ - **Custo MEDIDO substitui custo estimado.** `total_cost_usd` sobe pelo
557
+ producer até o Budget Controller (`NodeProduction.costUsd`): `--max-cost`
558
+ passa a ser cobrado sobre o gasto real, não sobre a tabela do catálogo.
559
+ - **`--agent-tools none|read|write`**: o executor roda sem tool alguma por
560
+ padrão; `read` dá grounding real no repositório (`Read/Grep/Glob`), `write`
561
+ autoriza alteração de arquivo. `Bash` não entra em nenhuma política. A
562
+ política também entra na chave do cache de resposta (esquema v2).
563
+ - **Dois avisos que faltavam**: `izanagi doctor` passou a ter seção
564
+ "Executor" dizendo quem vai rodar os nós AGORA, e `izanagi run` diz qual
565
+ escolheu antes de começar — antes, "modo headless" era descoberto vendo o
566
+ run simular.
567
+ - **Guarda de recursão e supressão em teste**: o filho recebe
568
+ `IZANAGI_AGENT_CLI_DEPTH+1` e no teto o adapter degrada para headless;
569
+ dentro de test runner o executor fica desligado, para que `npm test` nunca
570
+ gaste cota real de quem rodou.
571
+ - **`izanagi export --cli claude --global`**: escopo pessoal em
572
+ `~/.claude/{agents,commands,skills}`, para que os 22 agentes e a biblioteca
573
+ de skills valem em todo projeto aberto (eram descobertos só por projeto, e
574
+ quem abria a CLI em outro diretório concluía que o framework não funciona).
575
+ Nunca escreve `~/CLAUDE.md`.
576
+ - **O agente do nó opina no modelo**: os 22 core declaravam `model` no JSON e
577
+ o roteamento nunca lia o campo. Agora `agent-architect` sai em opus, um
578
+ specialist em sonnet e a avaliação em haiku, no MESMO grafo, com o Commander
579
+ determinístico decidindo isso sem gastar token.
580
+ - **Higiene de repositório e de disco, tudo achado executando de verdade**: a
581
+ verificação de build escrevia ~700 arquivos na raiz do repo (sandbox que só
582
+ era limpo no caminho de sucesso), o espelho de assets em `.agents/` era
583
+ criado dentro do próprio repo do framework (~700 arquivos duplicando o que o
584
+ repositório já é, e a razão das "duas pastas de agentes"), e 3.517
585
+ diretórios temporários estavam acumulados no TEMP do usuário porque ~40
586
+ suítes criam `mkdtempSync` e nenhuma remove. Novo `npm run clean:temp`,
587
+ varrendo por prefixo conhecido e rodando dentro do `npm test`.
588
+ - **Dois bugs de artefato achados executando de verdade**: o survey do projeto reprovava
589
+ como "stub/lazy-code" qualquer repositório que contivesse a palavra `TODO`
590
+ (o run abortava no PRIMEIRO nó, culpando o runtime pelo vocabulário do
591
+ projeto), e o teste de capacidades cobrava `model`/`evaluation` dos agentes
592
+ de `agents/generated/`, que nascem sem eles.
593
+
594
+ Medições desta fase, no executor sem chave: um nó de specialist custou ~18.000
595
+ tokens com `tools=none` e ~68.000 com `tools=read`; o system prompt do próprio
596
+ CLI cai de 20.848 para 4.095 tokens de entrada com `--restricted --tools ""`
597
+ (US$ 0,042 → US$ 0,005 na mesma pergunta).
598
+
599
+ Limitação nova, e é de QUALIDADE, não de implementação: com `--agent-tools
600
+ read` o executor leu o repositório de verdade (acertou a versão exata do
601
+ `package.json`) e ainda assim reportou 5 providers onde havia 6, citando um
602
+ intervalo de linhas que terminava antes da entrada nova. Grounding real não é
603
+ grounding completo, e é por isso que a Verification Engine e os critérios de
604
+ aceite continuam sendo o que decide se um artefato passa.
605
+
606
+ Testes: **897, 896 passando** (47 novos nesta fase; medido no Windows, onde o
607
+ único vermelho segue sendo `polyglot`).
608
+
534
609
  ## Critérios de aceite das próximas fases
535
610
 
536
611
  Toda mudança no framework deve provar impacto em pelo menos uma dimensão:
package/RULES.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # IZANAGI AI: Operating Rules
2
2
 
3
- > Version 3.21.0
3
+ > Version 3.22.0
4
4
 
5
5
  ---
6
6
 
package/SYSTEM.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # IZANAGI AI: System Foundation
2
2
 
3
- > Version 3.21.0
3
+ > Version 3.22.0
4
4
  > Codename: "The Architect's Mind"
5
5
 
6
6
  ---
@@ -82,7 +82,7 @@ User Input / Comando CLI
82
82
  | **Agent-to-Agent Protocol** (`protocol/messages.ts`) | Mensagens tipadas com referência de artefato em vez de cópia de texto; crítica estruturada com parsing tolerante (saída não parseável vira `needs_revision`, nunca aprovação) e correção mínima só dos bloqueantes. |
83
83
  | **Verification Engine 2.0** (`verification/engine.ts`) | Três camadas: determinística, evidência e semântica. A camada determinística tem nove checks; oito leem o artefato (`artifact-valid`, `min-size`, `contains`, `not-contains`, `matches`, `json-field`, `file-exists`, `references-exist`) e um decide por EXECUÇÃO: `exit-zero`, alimentado pelo nó `verify-tests` (`--verify-tests`), que roda o comando de teste do projeto. Exit code ausente é `unknown`, nunca `pass`: um check de execução que aprova por ausência de evidência seria pior que a métrica derivada de artefato que ele substituiu. O juiz semântico default (`verification/judge.ts`) vem ligado na CLI e no SDK quando há provider, roda no papel `worker` e recebe o artefato resumido; sem juiz (`--no-judge` ou modo headless) o critério fica `UNVERIFIED` e NUNCA conta como aprovação. Juiz que não respondeu é `inconclusive`, nunca reprovação. Só `VERIFIED` encerra uma tarefa. |
84
84
  | **Budget Controller** (`token/execution-budget.ts`) | Custo em USD, tetos de tool call/agente/retry, tempo de parede e escada de degradação (contexto → saída → modelo → paralelismo → tarefas opcionais → aprovação humana). Gasto que estouraria um teto é recusado, e **registrado antes de ser recusado**: gasto recusado por teto ainda aconteceu na fatura. Desde 2026-09-04 `maxRetries` e `maxAgents` de fato BARRAM (antes contavam e o retorno era descartado), e `remainingTokens` alimenta o roteamento por nó. Teto estourado é `non-recoverable` no `Healer`: um teto não se move entre tentativas, então retentar é gastar orçamento numa porta fechada. |
85
- | **Response Cache** (`cache/response-cache.ts`) | Cache local por hash de (provider, modelo, system, mensagens, teto, temperatura), com TTL, eviction e versão de esquema. Opt-in (`--cache` / `IZANAGI_CACHE=1`). |
85
+ | **Response Cache** (`cache/response-cache.ts`) | Cache local por hash de (provider, modelo, system, mensagens, teto, temperatura, política de tools do executor), com TTL, eviction e versão de esquema (v2). A política entra na chave porque muda o que a resposta pôde ver: a mesma pergunta respondida com leitura do repositório não é a mesma resposta, e servir uma pela outra seria um hit que mente sobre a evidência. Opt-in (`--cache` / `IZANAGI_CACHE=1`). |
86
86
  | **SDK** (`src/sdk.ts`) | `izanagi.run({ objective })` e `izanagi.plan({ objective })`: mesma engine da CLI, sem saída no terminal, com eventos do run em tempo real. |
87
87
  | **Evaluation Engine** (`evaluation/`) | Métricas ponderadas (correctness, completeness, security, etc.), veredito derivado, relatório com regressões e recomendações. |
88
88
  | **Artifact Contracts** (`contracts/artifacts.ts`) | 10+ schemas de artefato (requirements, architecture, database-schema, test-plan...) com validação por campos obrigatórios + tamanho mínimo, em PT-BR. |
@@ -289,13 +289,52 @@ Novos agentes e skills são **gerados, não escritos à mão**:
289
289
 
290
290
  ## Model Router
291
291
 
292
- `src/runtime/model/router.ts` mantém um catálogo por provider (OpenAI, Anthropic, Google, OpenRouter, Ollama, LM Studio, custom) extensível via `.izanagi/izanagi.config.json` → `models`. Duas rotas coexistem:
292
+ `src/runtime/model/router.ts` mantém um catálogo por provider (OpenAI, Anthropic, Google, OpenRouter, Ollama, LM Studio, `claude-cli`, custom) extensível via `.izanagi/izanagi.config.json` → `models`. O provider `claude-cli` declara os três ids validados contra o CLI instalado (`claude-haiku-4-5`, `claude-sonnet-5`, `claude-opus-5`) com a tabela de lista da Anthropic, que é a base que o próprio CLI reporta (`costBasis: "list"`): sem entrada no catálogo o roteador nunca teria modelo a escolher e o caminho sem chave não existiria de fato. Duas rotas coexistem:
293
293
 
294
294
  - `route(ctx)`: rota legada, um modelo para o run inteiro, por complexidade/custo/latência/histórico. Preservada sem mudança de assinatura.
295
295
  - `routeForRole(role, ctx)`: rota por PAPEL. Tier preferido por papel (commander→premium, specialist→balanced, worker→fast), com queda explícita para o tier adjacente quando o catálogo disponível não tem aquele tier. Pin por papel via `roles` na config ou `IZANAGI_MODEL_{COMMANDER,SPECIALIST,WORKER}` (env vence config). `escalateRole` sobe worker→specialist→commander e para no topo. `costUsd` e `estimateCostForRole` dão o custo real de catálogo (modelos self-hosted declaram 0, o que é fato, não estimativa).
296
296
 
297
+ - Tier declarado pelo AGENTE do nó: os 22 agentes core declaram `model` no próprio JSON (`sonnet`, `opus`), o `AgentCapabilityRegistry` expõe como `modelHint` e `ModelRouter.tierForHint` o traduz para tier. Precedência: pin do usuário (`--model`, `roles`, `IZANAGI_MODEL_*`) > hint do agente > default do papel. O hint é TIER e não id de modelo, e é isso que o mantém provider-agnostic: `opus` num catálogo sem premium cai pelo `tierFallbackOrder` de sempre. Hint que o roteador não reconhece é ausência de hint, nunca um tier chutado.
298
+
297
299
  `izanagi models` mostra o catálogo, quais providers estão realmente configurados e qual modelo cada papel receberia agora, com custo por 10k tokens.
298
300
 
301
+ Planejar não gasta token: o Commander é determinístico, então a assimetria custa o mínimo por construção. Num grafo real (`izanagi run agent-architect`), o nó do `agent-architect` sai em `claude-opus-5` (o agente pede premium), o `qa` em `claude-sonnet-5` (papel specialist) e a avaliação em `claude-haiku-4-5` (papel worker).
302
+
303
+ ## Executor: quem roda os nós
304
+
305
+ O runtime separa **quem decide** (Commander, determinístico) de **quem executa** (o modelo). A camada de executor tem três caminhos, e o primeiro não pede configuração nenhuma.
306
+
307
+ ### `claude-cli`: agente de codificação como executor (`llm/agent-cli.ts`)
308
+
309
+ `AgentCLIAdapter` implementa `ModelAdapter`, então entra no `LLMClient` como qualquer provider e atravessa run/SDK/`models`/juiz semântico/arena sem que nenhum chamador mude. A diferença é que ele não fala HTTP: **spawna um agente de codificação já instalado e autenticado na máquina**, em modo não interativo.
310
+
311
+ Hoje o spec implementado é o do `claude` (Claude Code CLI). O binário é procurado no PATH sem shell (`findExecutable`, com PATHEXT no Windows), e `configured` é verdadeiro quando ele existe — não há checagem de autenticação, porque não existe checagem barata e offline disso: falha de credencial aparece como erro real do CLI, com o stderr dele, na primeira chamada.
312
+
313
+ O mapeamento entre conceito do runtime e flag do CLI é o que torna esse caminho um executor de verdade, e não um wrapper de prompt:
314
+
315
+ | Conceito do Izanagi | Flag |
316
+ |---|---|
317
+ | modelo do papel (commander/specialist/worker) | `--model` |
318
+ | teto de custo restante do run | `--max-budget-usd` |
319
+ | política de tools | `--restricted` + `--tools` |
320
+ | escrita de arquivo (opt-in) | `--permission-mode acceptEdits` |
321
+ | sem estado residual entre nós | `--no-session-persistence`, `--strict-mcp-config` |
322
+ | telemetria de token e custo | `--output-format json` → `usage` + `total_cost_usd` |
323
+
324
+ Decisões que não são detalhe:
325
+
326
+ - **Prompt por stdin, nunca por argv.** O system prompt de um nó com chain de skills passa de 30KB e o limite de linha de comando do Windows é 32.767 caracteres: por argv, o run quebraria justamente nos nós mais ricos. Vai em blocos delimitados (`<izanagi:instructions>`, `<izanagi:task>`), e `--append-system-prompt` carrega só o contrato curto que diz como tratá-los.
327
+ - **Default sem tool alguma.** `--restricted --tools ""`: sem shell, sem escrita, sem settings do projeto. Medido: derruba o system prompt do próprio CLI de 20.848 para 4.095 tokens de entrada (US$ 0,042 → US$ 0,005 na mesma pergunta). `--agent-tools read` libera `Read/Grep/Glob` (grounding no repositório real); `write` acrescenta `Write/Edit`. `Bash` não entra em nenhuma política.
328
+ - **Custo medido vence custo estimado.** `total_cost_usd` sobe pelo producer até o `Budget Controller` (`NodeProduction.costUsd`), então `--max-cost` passa a ser cobrado sobre o que foi gasto de fato, e não sobre a tabela de preço do catálogo.
329
+ - **Guarda de recursão.** Um `izanagi run` disparado de dentro de uma sessão do agente pode spawnar o agente (profundidade 0 → 1); o filho recebe `IZANAGI_AGENT_CLI_DEPTH+1` e no teto o adapter fica `configured: false`, degradando para headless em vez de estourar no meio do grafo.
330
+ - **Suprimido em test runner.** `NODE_TEST_CONTEXT` presente desliga o executor: sem isso, qualquer teste que chame a CLI em processo passaria a gastar cota real de quem rodou `npm test` (medido: um teste de compatibilidade de flag saiu de milissegundos para 28 segundos de chamada de modelo). `IZANAGI_AGENT_CLI_IN_TESTS=1` libera.
331
+
332
+ Custo por nó, MEDIDO num specialist com chain de skills: ~18.000 tokens com `tools=none` e ~68.000 com `tools=read` (o agente faz várias voltas de tool antes de responder). Daí o piso recomendado de `--budget`: 30.000 e 105.000 respectivamente, avisado pela CLI quando o teto declarado está abaixo.
333
+
334
+ ### Os outros dois caminhos
335
+
336
+ API key por env (`IZANAGI_{ANTHROPIC,OPENAI,GOOGLE,OPENROUTER}_API_KEY`) e modelo local em opt-in (`IZANAGI_OLLAMA_ENABLED=1`, `IZANAGI_LMSTUDIO_ENABLED=1`, `IZANAGI_CUSTOM_BASE_URL`). Sem nenhum dos três, o run segue planejando, roteando e verificando de verdade, e SIMULA o conteúdo dos nós (headless). `izanagi doctor` reporta qual executor está disponível agora, e `izanagi run` diz qual escolheu antes de começar.
337
+
299
338
  ## Tool Registry (Tools/MCP-ready)
300
339
 
301
340
  `src/runtime/tools/registry.ts` expõe tools builtin atrás de um fluxo `discover → permission → policy → validate → execute`: sandbox de zona (bloqueia path traversal via `..`), permissões least-privilege por tool, e schemas prontos para exposição a agentes externos (MCP-ready).
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAKvE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,QAAQ,SAAU,GAAG,OAAO,CA6H/F"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAKvE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,QAAQ,SAAU,GAAG,OAAO,CAkI/F"}
@@ -1,6 +1,7 @@
1
1
  import fs from 'fs';
2
2
  import path from 'path';
3
3
  import { checkMemory, checkTraces, checkBenchmarkSuite, checkSkillSecurityScan, checkSkillManifest, checkSkillLifecycle, checkNestedDuplicate } from '../checks.js';
4
+ import { LLMClient, agentCLIStatus, AGENT_CLI_PROVIDERS } from '../../runtime/llm/client.js';
4
5
  /**
5
6
  * Decide a raiz do framework para auditoria.
6
7
  *
@@ -133,6 +134,10 @@ export function doctorCommand(baseDir, args = [], stateDir = baseDir) {
133
134
  errors++;
134
135
  }
135
136
  }
137
+ // Executor: a pergunta que decide se `izanagi run` faz trabalho de verdade
138
+ // ou simula. Vem antes do resumo de propósito — é o diagnóstico que o
139
+ // usuário mais precisa e o que antes ele só descobria vendo o run simular.
140
+ warnings += reportExecutors();
136
141
  if (deep) {
137
142
  const deepErrors = runDeepChecks(baseDir, stateDir);
138
143
  errors += deepErrors;
@@ -140,6 +145,38 @@ export function doctorCommand(baseDir, args = [], stateDir = baseDir) {
140
145
  console.log(`\n\x1b[1mSummary:\x1b[0m ${errors === 0 ? '\x1b[32mPASSED\x1b[0m' : '\x1b[31mFAILED\x1b[0m'} (${errors} errors, ${warnings} warnings)\n`);
141
146
  return errors === 0;
142
147
  }
148
+ /**
149
+ * Quem vai executar os nós do grafo. Três camadas, na ordem em que o runtime
150
+ * as prefere: API key configurada, modelo local em opt-in, CLI de agente já
151
+ * autenticado na máquina. Nenhuma das três, e o run simula (headless).
152
+ *
153
+ * Devolve o número de avisos (0 quando existe algum executor real).
154
+ */
155
+ function reportExecutors() {
156
+ const client = new LLMClient();
157
+ const providers = client.configuredProviders();
158
+ const agentCli = agentCLIStatus();
159
+ const keyed = providers.filter((p) => !AGENT_CLI_PROVIDERS.includes(p));
160
+ console.log('\n\x1b[1m\x1b[36m-- Executor --\x1b[0m\n');
161
+ for (const status of agentCli) {
162
+ if (status.available) {
163
+ console.log(` \x1b[32m✔\x1b[0m ${status.label} (${status.provider}): ${status.path} \x1b[90m(sem API key)\x1b[0m`);
164
+ }
165
+ else {
166
+ console.log(` \x1b[90m-\x1b[0m ${status.label} (${status.provider}): ${status.reason}`);
167
+ }
168
+ }
169
+ if (keyed.length > 0) {
170
+ console.log(` \x1b[32m✔\x1b[0m Providers por chave/opt-in: ${keyed.join(', ')}`);
171
+ }
172
+ if (providers.length === 0) {
173
+ console.log(' \x1b[33m⚠\x1b[0m Nenhum executor: `izanagi run` vai SIMULAR os nós (modo headless).');
174
+ console.log(' Saída mais curta: instale e autentique o Claude Code CLI (nenhuma API key necessária).');
175
+ return 1;
176
+ }
177
+ console.log(` \x1b[90mexecução real habilitada — providers utilizáveis: ${providers.join(', ')}\x1b[0m`);
178
+ return 0;
179
+ }
143
180
  function runDeepChecks(baseDir, stateDir) {
144
181
  let errors = 0;
145
182
  console.log('\n\x1b[1m\x1b[36m-- Deep checks (runtime) --\x1b[0m\n');
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpK;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,OAAe;IAC7D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,OAAO,CAAC;IACjD,MAAM,aAAa,GAAG,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5F,OAAO,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAC7D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,OAAiB,EAAE,EAAE,QAAQ,GAAG,OAAO;IACpF,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE5D,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAE9E,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,MAAM,WAAW,GAAG,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAErD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,sGAAsG;IACtG,MAAM,eAAe,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAClD,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,qBAAqB,eAAe,CAAC,IAAI,KAAK,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC;QACpF,QAAQ,EAAE,CAAC;IACb,CAAC;IAED,iCAAiC;IACjC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAErD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,MAAM,EAAE,CAAC;IACX,CAAC;IAED,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,MAAM,EAAE,CAAC;IACX,CAAC;IAED,mBAAmB;IACnB,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC;KAC7B,CAAC;IAEF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,SAAS;QACxC,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACxF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,SAAS;YAC1B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACZ,UAAU,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC9E,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;oBACrC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,yCAAyC,CAAC,CAAC;oBACrF,QAAQ,EAAE,CAAC;gBACb,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,EAAE,CAAC,CAAC;gBACnE,MAAM,EAAE,CAAC;YACX,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,2BAA2B,UAAU,yBAAyB,CAAC,CAAC;IAC9E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QAC3D,MAAM,EAAE,CAAC;IACX,CAAC;IAED,2BAA2B;IAC3B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAC3E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAC9D,MAAM,EAAE,CAAC;IACX,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;YACxE,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,IAAI,EAAE,CAAC;YAC3C,IAAI,aAAa,GAAG,CAAC,CAAC;YACtB,IAAI,eAAe,GAAG,CAAC,CAAC;YAExB,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvD,MAAM,KAAK,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;gBACrC,IAAI,KAAK,GAAG,KAAK,CAAC;gBAElB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAiB,CAAC,CAAC;oBACpD,IACE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;wBACvB,EAAE,CAAC,UAAU,CAAC,QAAQ,GAAG,KAAK,CAAC;wBAC/B,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,EAC9C,CAAC;wBACD,KAAK,GAAG,IAAI,CAAC;wBACb,MAAM;oBACR,CAAC;gBACH,CAAC;gBAED,IAAI,KAAK,EAAE,CAAC;oBACV,aAAa,EAAE,CAAC;gBAClB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,8BAA8B,KAAK,oCAAoC,OAAO,EAAE,CAAC,CAAC;oBAC9F,eAAe,EAAE,CAAC;oBAClB,QAAQ,EAAE,CAAC;gBACb,CAAC;YACH,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,qCAAqC,aAAa,mBAAmB,eAAe,YAAY,CAAC,CAAC;QAChH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,0DAA0D,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACrF,MAAM,EAAE,CAAC;QACX,CAAC;IACH,CAAC;IAED,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACpD,MAAM,IAAI,UAAU,CAAC;IACvB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,4BAA4B,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,uBAAuB,KAAK,MAAM,YAAY,QAAQ,cAAc,CAAC,CAAC;IACvJ,OAAO,MAAM,KAAK,CAAC,CAAC;AACtB,CAAC;AAED,SAAS,aAAa,CAAC,OAAe,EAAE,QAAgB;IACtD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;IAErE,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,6BAA6B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAE1D,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,6BAA6B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAE1D,MAAM,UAAU,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,iCAAiC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAElE,MAAM,IAAI,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,iCAAiC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,UAAU,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvG,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,EAAE,CAAC;IACX,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,0CAA0C,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,qCAAqC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACtE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,qCAAqC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,SAAS,GAAG,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,sCAAsC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IAEtE,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/export.ts"],"names":[],"mappings":"AA4EA,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAuClD"}
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/export.ts"],"names":[],"mappings":"AAkHA,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA6ClD"}