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.
- package/.manifest +2 -2
- package/AGENTS.md +1 -1
- package/CHANGELOG.md +51 -0
- package/README.md +81 -2
- package/ROADMAP.md +76 -1
- package/RULES.md +1 -1
- package/SYSTEM.md +42 -3
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +37 -0
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/export.d.ts.map +1 -1
- package/dist/cli/commands/export.js +55 -24
- package/dist/cli/commands/export.js.map +1 -1
- package/dist/cli/commands/models.d.ts.map +1 -1
- package/dist/cli/commands/models.js +13 -1
- package/dist/cli/commands/models.js.map +1 -1
- package/dist/cli/commands/run.d.ts +14 -0
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +47 -6
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/exporters.d.ts +27 -1
- package/dist/exporters.d.ts.map +1 -1
- package/dist/exporters.js +495 -492
- package/dist/exporters.js.map +1 -1
- package/dist/installer.d.ts +0 -3
- package/dist/installer.d.ts.map +1 -1
- package/dist/installer.js +31 -15
- package/dist/installer.js.map +1 -1
- package/dist/runtime/cache/response-cache.d.ts +7 -0
- package/dist/runtime/cache/response-cache.d.ts.map +1 -1
- package/dist/runtime/cache/response-cache.js +5 -1
- package/dist/runtime/cache/response-cache.js.map +1 -1
- package/dist/runtime/contracts/artifacts.d.ts.map +1 -1
- package/dist/runtime/contracts/artifacts.js +10 -0
- package/dist/runtime/contracts/artifacts.js.map +1 -1
- package/dist/runtime/execute.d.ts +21 -1
- package/dist/runtime/execute.d.ts.map +1 -1
- package/dist/runtime/execute.js +31 -4
- package/dist/runtime/execute.js.map +1 -1
- package/dist/runtime/llm/agent-cli.d.ts +274 -0
- package/dist/runtime/llm/agent-cli.d.ts.map +1 -0
- package/dist/runtime/llm/agent-cli.js +515 -0
- package/dist/runtime/llm/agent-cli.js.map +1 -0
- package/dist/runtime/llm/client.d.ts +35 -2
- package/dist/runtime/llm/client.d.ts.map +1 -1
- package/dist/runtime/llm/client.js +25 -2
- package/dist/runtime/llm/client.js.map +1 -1
- package/dist/runtime/model/router.d.ts +22 -1
- package/dist/runtime/model/router.d.ts.map +1 -1
- package/dist/runtime/model/router.js +63 -3
- package/dist/runtime/model/router.js.map +1 -1
- package/dist/runtime/orchestrator.d.ts +16 -11
- package/dist/runtime/orchestrator.d.ts.map +1 -1
- package/dist/runtime/orchestrator.js +4 -1
- package/dist/runtime/orchestrator.js.map +1 -1
- package/dist/runtime/tests/agent-cli.test.d.ts +2 -0
- package/dist/runtime/tests/agent-cli.test.d.ts.map +1 -0
- package/dist/runtime/tests/agent-cli.test.js +484 -0
- package/dist/runtime/tests/agent-cli.test.js.map +1 -0
- package/dist/runtime/tests/capability-fields.test.js +16 -2
- package/dist/runtime/tests/capability-fields.test.js.map +1 -1
- package/dist/runtime/tests/clean-temp.test.d.ts +2 -0
- package/dist/runtime/tests/clean-temp.test.d.ts.map +1 -0
- package/dist/runtime/tests/clean-temp.test.js +83 -0
- package/dist/runtime/tests/clean-temp.test.js.map +1 -0
- package/dist/runtime/tests/export-global.test.d.ts +2 -0
- package/dist/runtime/tests/export-global.test.d.ts.map +1 -0
- package/dist/runtime/tests/export-global.test.js +46 -0
- package/dist/runtime/tests/export-global.test.js.map +1 -0
- package/dist/runtime/tests/model.test.js +5 -2
- package/dist/runtime/tests/model.test.js.map +1 -1
- package/dist/runtime/token/execution-budget.d.ts +8 -0
- package/dist/runtime/token/execution-budget.d.ts.map +1 -1
- package/dist/runtime/token/execution-budget.js +12 -0
- package/dist/runtime/token/execution-budget.js.map +1 -1
- package/dist/scripts/clean-temp.d.ts +56 -0
- package/dist/scripts/clean-temp.d.ts.map +1 -0
- package/dist/scripts/clean-temp.js +141 -0
- package/dist/scripts/clean-temp.js.map +1 -0
- package/dist/scripts/verify-build.js +27 -13
- package/dist/scripts/verify-build.js.map +1 -1
- package/dist/sdk.d.ts +6 -0
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +1 -0
- package/dist/sdk.js.map +1 -1
- package/package.json +101 -100
package/.manifest
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "izanagi-ai",
|
|
3
|
-
"version": "3.
|
|
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-
|
|
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.
|
|
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.
|
|
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.
|
|
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
package/SYSTEM.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# IZANAGI AI: System Foundation
|
|
2
2
|
|
|
3
|
-
> Version 3.
|
|
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":"
|
|
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;
|
|
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":"
|
|
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"}
|