izanagi-ai 3.7.0 → 3.8.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.
@@ -56,21 +56,18 @@ jobs:
56
56
  # ---------------------------------------------------------------------------
57
57
  # 2) Rust workspace (crates/izanagi_core + crates/izanagi_mcp)
58
58
  #
59
- # DECISOES MEDIDAS LOCALMENTE NESTE REPO (fatos, nao opiniao):
59
+ # HISTORICO DAS DECISOES (medidas localmente, agora RESOLVIDAS):
60
60
  #
61
- # a) SEM passo "cargo fmt --check": o codigo atual FALHA no check com 44
62
- # pontos de diff (ex.: crates/izanagi_mcp/tests/mock_server.rs:145,
63
- # crates/izanagi_core/src/{mask,protocol,rules,functions}.rs).
64
- # Ativa-lo agora quebraria o CI e consertar fontes esta fora do escopo
65
- # desta frente (CI-only). Reativar assim que o repo rodar "cargo fmt".
61
+ # a) "cargo fmt --check" estava desativado porque o codigo falhava o check
62
+ # com ~44 pontos de diff. A frente de endurecimento Rust rodou
63
+ # `cargo fmt` nos dois crates => gate ATIVADO abaixo e bloqueante.
66
64
  #
67
- # b) Clippy NAO-bloqueante (sem "-D warnings"): existem 4 warnings
68
- # pre-existentes (clippy::needless_borrow em izanagi_core, target lib
69
- # test). Com -D warnings o job falharia de imediato. Os warnings seguem
70
- # visiveis no log para triagem; endurecer para -D warnings apos limpeza.
65
+ # b) Clippy estava NAO-bloqueante por 4 warnings pre-existentes
66
+ # (manual_contains, needless_range_loop, collapsible_if, needless_borrow).
67
+ # Todos corrigidos semanticamente (zero #[allow]) => -D warnings ATIVADO.
71
68
  # ---------------------------------------------------------------------------
72
69
  rust:
73
- name: rust (test / clippy-warn / wasm-check)
70
+ name: rust (fmt-check / clippy-D-warnings / test / wasm-check)
74
71
  runs-on: ubuntu-latest
75
72
  timeout-minutes: 20
76
73
  steps:
@@ -81,15 +78,17 @@ jobs:
81
78
  - uses: dtolnay/rust-toolchain@4360b52568e2003a75bf9bc1d59f33a8e3fc893c
82
79
  with:
83
80
  toolchain: stable
84
- components: clippy
81
+ components: clippy, rustfmt
85
82
  # Swatinem/rust-cache@v2 - a workspace Cargo E a raiz do repo.
86
83
  # NOTA: input "workspaces: true" foi REJEITADO de proposito: lendo o
87
84
  # source oficial v2 (src/config.ts), o valor seria tratado como path e
88
85
  # resolvido para "<repo>/true" (inexistente), degradando o cache
89
86
  # silenciosamente. O default ("." = raiz) e o correto aqui.
90
87
  - uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6
91
- - name: 'Clippy (non-blocking: pre-existing warnings)'
92
- run: cargo clippy --workspace --all-targets
88
+ - name: 'Format check (blocking)'
89
+ run: cargo fmt --check
90
+ - name: 'Clippy (blocking: -D warnings)'
91
+ run: cargo clippy --workspace --all-targets -- -D warnings
93
92
  - name: Test
94
93
  run: cargo test --workspace
95
94
  # IMPORTANTE: a forma "cargo check --features wasm" NA RAIZ de workspace
@@ -1,3 +1,39 @@
1
+ # =============================================================================
2
+ # CI & Publish to NPM - workflow legado do framework npm na raiz
3
+ #
4
+ # AUDITORIA 2026-08-23 (frente DevOps/CI) - correções aplicadas:
5
+ #
6
+ # 1) GUARD DE IDEMPOTÊNCIA NO PUBLISH (causa raiz histórica):
7
+ # Este workflow dispara DUAS vezes por release (push da tag v* +
8
+ # evento release published). Sem guard, a segunda tentativa falha com
9
+ # E403 "cannot overwrite pre-existing version". O publish agora roda
10
+ # APENAS se `npm view izanagi-ai@<versão>` confirmar que a versão ainda
11
+ # NÃO existe no registry. Direção de falha segura: erro de rede também
12
+ # resulta em SKIP (nunca republica nem força).
13
+ # Histórico real: em 2026-08-17 o publish nunca chegou a rodar porque o
14
+ # job build-and-verify falhou antes (`node --test` não encontrava os
15
+ # testes da época); desde 2026-08-18 ambos os workflows falham no
16
+ # postinstall (dist/ ausente em checkout limpo) - fix fora do escopo
17
+ # desta frente.
18
+ #
19
+ # 2) SUPPLY CHAIN: actions fixadas por SHA de commit completo (imutável).
20
+ # SHAs conferidos nos logs reais de execução deste repo:
21
+ # - actions/checkout@v4 => 11d5960a326750d5838078e36cf38b85af677262
22
+ # - actions/setup-node@v4 => 49933ea5288caeca8642d1e84afbd3f7d6820020
23
+ # Nunca referenciar tags mutáveis (@v4/@main) diretamente.
24
+ #
25
+ # 3) LEAST PRIVILEGE:
26
+ # - permissions: contents:read global (antes: GITHUB_TOKEN herdava write
27
+ # em TUDO - visível no log do run 31989520688).
28
+ # - NODE_AUTH_TOKEN/registry-url REMOVIDOS do job build-and-verify:
29
+ # pacote público não precisa de credencial para ci/build/verify, e o
30
+ # token ficava exposto ao env de TODOS os steps (incl. scripts de
31
+ # postinstall de dependências). Credencial só no único step que publica.
32
+ #
33
+ # 4) PARIDADE DE RUNTIME: Node 24 (igual dev local e igual Polyglot CI,
34
+ # onde o job legacy-npm validou ci/build/test no 24). O 20.x era drift.
35
+ # =============================================================================
36
+
1
37
  name: CI & Publish to NPM
2
38
 
3
39
  on:
@@ -9,31 +45,64 @@ on:
9
45
  release:
10
46
  types: [published]
11
47
 
48
+ permissions:
49
+ contents: read
50
+
12
51
  jobs:
13
52
  build-and-verify:
14
53
  runs-on: ubuntu-latest
54
+ timeout-minutes: 15
15
55
  steps:
16
- - uses: actions/checkout@v4
17
- - uses: actions/setup-node@v4
56
+ # actions/checkout@v4
57
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262
58
+ # actions/setup-node@v4 - SEM registry-url/token: job não publica nada.
59
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
18
60
  with:
19
- node-version: '20.x'
20
- registry-url: 'https://registry.npmjs.org'
21
- - run: npm ci
22
- - run: npm run build
23
- - run: npm run verify
61
+ node-version: '24'
62
+ cache: npm
63
+ - name: Install (npm ci)
64
+ run: npm ci
65
+ - name: Build
66
+ run: npm run build
67
+ - name: Verify (sandbox install + testes)
68
+ run: npm run verify
24
69
 
25
70
  publish:
26
71
  if: startsWith(github.ref, 'refs/tags/v') || github.event_name == 'release'
27
72
  needs: build-and-verify
28
73
  runs-on: ubuntu-latest
74
+ timeout-minutes: 10
29
75
  steps:
30
- - uses: actions/checkout@v4
31
- - uses: actions/setup-node@v4
76
+ # actions/checkout@v4
77
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262
78
+ # actions/setup-node@v4 - registry-url apenas aqui: gera o .npmrc com
79
+ # NODE_AUTH_TOKEN injetado pelo setup-node SOMENTE neste job.
80
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
32
81
  with:
33
- node-version: '20.x'
82
+ node-version: '24'
83
+ cache: npm
34
84
  registry-url: 'https://registry.npmjs.org'
35
- - run: npm ci
36
- - run: npm run build
37
- - run: npm publish --access public
85
+ - name: Install (npm ci)
86
+ run: npm ci
87
+ - name: Build
88
+ run: npm run build
89
+ # Guard de idempotência: consulta o registry ANTES de publicar.
90
+ # `npm view <pkg>@<ver>` sai 0 quando a versão existe (=> pula o
91
+ # publish) e não-zero quando não existe (=> publica). Republish da
92
+ # mesma versão deixaria de falhar com E403 cannot overwrite.
93
+ - name: Guard - version must not exist in registry yet
94
+ id: version_guard
95
+ run: |
96
+ PKG_VERSION="$(node -p "require('./package.json').version")"
97
+ if npm view "izanagi-ai@${PKG_VERSION}" version >/dev/null 2>&1; then
98
+ echo "already_published=true" >> "$GITHUB_OUTPUT"
99
+ echo "::notice::izanagi-ai@${PKG_VERSION} já existe no registry - npm publish pulado (idempotente)."
100
+ else
101
+ echo "already_published=false" >> "$GITHUB_OUTPUT"
102
+ echo "izanagi-ai@${PKG_VERSION} ainda não publicada - liberando publish."
103
+ fi
104
+ - name: Publish (only if version is new)
105
+ if: steps.version_guard.outputs.already_published == 'false'
106
+ run: npm publish --access public
38
107
  env:
39
108
  NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
package/.manifest CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "izanagi-ai",
3
- "version": "3.7.0",
3
+ "version": "3.8.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-08-23T04:04:04.177Z",
8
+ "generatedAt": "2026-08-23T04:39:47.223Z",
9
9
  "agents": [
10
10
  {
11
11
  "id": "adversarial-critic",
package/AGENTS.md CHANGED
@@ -41,7 +41,8 @@ O framework conta com **22 agentes especializados** em `agents/*.json` + orquest
41
41
  | `/form-engineer` | `agents/form-engineer-agent.json` | Formulários high-craft: validação, wizard, acessibilidade |
42
42
  | `/agent-architect` | `agents/agent-architect-agent.json` | Projeta novos agentes (Genome, guardrails, avaliação) por lacuna real |
43
43
  | `/skill-architect` | `agents/skill-architect-agent.json` | Curadoria de skills: security scan, anti-duplicação, lacunas comprovadas |
44
- | *Dinâmico* | `agents/generated/c-systems-engineer.json` | Engenharia C & Baixo Nível: gestão de memória, ponteiros, GCC/CMake, Valgrind |
44
+
45
+ > **Histórico:** `agents/generated/` não é versionado — agentes gerados pela Agent Factory (`izanagi agent create`) ficam locais por padrão. O antigo exemplo `c-systems-engineer.json` foi removido na v2.13.0 e não deve mais ser listado como agente do framework.
45
46
 
46
47
  ---
47
48
 
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Bootstrap COMMITADO do hook postinstall (fix do bug de CI, 2026-08-23).
4
+ *
5
+ * Problema: o hook era `node dist/scripts/postinstall.js` direto. Em checkout
6
+ * fresco do repo-fonte, `dist/` é gitignored e o npm ci/install executa este
7
+ * hook ANTES de qualquer build → MODULE_NOT_FOUND (o arquivo nem chega a
8
+ * carregar, então nenhum try/catch dentro dele pode salvar). No pacote
9
+ * PUBLICADO funcionava porque o tarball inclui dist/ — usuários finais nunca
10
+ * foram afetados; o alvo aqui é dev/CI do repo-fonte.
11
+ *
12
+ * Contrato:
13
+ * - `dist/scripts/postinstall.js` EXISTE → delega integralmente (mesmo módulo,
14
+ * mesmo comportamento byte-a-byte do caminho feliz de auto-ativação) e NÃO
15
+ * engole erros reais: falha de carga ou exit code não-zero do script delega
16
+ * se propaga (unhandled rejection / exitCode).
17
+ * - `dist/` AUSENTE (dev/CI em checkout fresco) → exit 0 com orientação clara:
18
+ * rode `npm run build`. Nunca quebra `npm install`.
19
+ *
20
+ * Este arquivo é intencionalmente JS puro commitado (não passa pelo build):
21
+ * é justamente o guardião que roda quando o build ainda não existe.
22
+ */
23
+
24
+ import { existsSync } from 'node:fs';
25
+ import { fileURLToPath } from 'node:url';
26
+
27
+ const target = new URL('../dist/scripts/postinstall.js', import.meta.url);
28
+
29
+ if (!existsSync(target)) {
30
+ console.log(
31
+ '[Izanagi AI] dist ausente — rode npm run build antes de usar o CLI/pacote. ' +
32
+ 'Postinstall ignorado (esperado em checkout fresco do repo; instalação via npm traz dist/ no tarball).',
33
+ );
34
+ process.exitCode = 0;
35
+ } else {
36
+ await import(target);
37
+ }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * `izanagi polyglot status` — ponte de diagnóstico entre a CLI legado (TypeScript)
3
+ * e os núcleos poliglotas do monorepo (Rust, Go, Python, packages TS), SEM executá-los
4
+ * pesadamente: no máximo probes baratos (`--version` dos bins com timeout curto e
5
+ * `import ast_analyzer` no venv) + checagens de existência.
6
+ *
7
+ * Contrato:
8
+ * - Exit code 0 SEMPRE em modo normal (status é diagnóstico, não gate).
9
+ * - `--strict` sai 1 se qualquer componente estiver ausente (útil em CI opcional).
10
+ * - `--json` emite array puro de linhas máquina-legíveis (sem ANSI).
11
+ * - Zero dependências novas: apenas node:fs/path/child_process.
12
+ *
13
+ * Ancoragem: os artefatos poliglotas vivem na raiz do MONOREPO (target/, packages/,
14
+ * python-engine/) — que coincide com getPackageDir() no checkout dev. Num consumo via
15
+ * npm (node_modules/izanagi-ai) nada disso existe → tudo "ausente", que é o diagnóstico
16
+ * correto para quem não é desenvolvedor do framework. Testes injetam outra raiz via opts.root.
17
+ */
18
+ export type PolyglotStatus = 'ok' | 'ausente';
19
+ export interface PolyglotRow {
20
+ /** Identificador estável do componente (ex.: 'rust:izanagi-core'). */
21
+ component: string;
22
+ status: PolyglotStatus;
23
+ /** Detalhe curto legível (versão, caminho efetivo ou motivo da ausência). */
24
+ detail: string;
25
+ /** Caminho verificado quando aplicável; null quando nada foi encontrado. */
26
+ path: string | null;
27
+ }
28
+ export interface PolyglotOptions {
29
+ /** Raiz do monorepo onde procurar artefatos poliglotas (default: instalação do pacote). */
30
+ root?: string;
31
+ }
32
+ interface CheckContext {
33
+ root: string;
34
+ }
35
+ /** Ordem fixa e estável — contrato também consumido pelo modo --json. */
36
+ export declare function collectPolyglotRows(ctx: CheckContext): PolyglotRow[];
37
+ /**
38
+ * Handler do comando. Sempre imprime o relatório; exit code só muda com --strict.
39
+ * Síncrono na essência (spawnSync nos probes), assinatura async por uniformidade
40
+ * com o router (todos os comandos são awaited).
41
+ */
42
+ export declare function polyglotCommand(rest: string[], opts?: PolyglotOptions): Promise<void>;
43
+ export {};
44
+ //# sourceMappingURL=polyglot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polyglot.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/polyglot.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,SAAS,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC1B,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC;IACvB,6EAA6E;IAC7E,MAAM,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,2FAA2F;IAC3F,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAcD,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AA8HD,yEAAyE;AACzE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,YAAY,GAAG,WAAW,EAAE,CAUpE;AAmDD;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAc3F"}
@@ -0,0 +1,208 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { spawnSync } from 'node:child_process';
4
+ import { getPackageDir } from '../../installer.js';
5
+ const VERSION_PROBE_TIMEOUT_MS = 1500;
6
+ const PYTHON_IMPORT_TIMEOUT_MS = 5000;
7
+ const MAX_DETAIL_LEN = 120;
8
+ /**
9
+ * Defaults do socket do orquestrador Go. `/tmp/izanagi-swarm.sock` é o default do
10
+ * task-spec; `/tmp/izanagi-orch.sock` é o default real do servidor go-services/
11
+ * swarm_orchestrator (rpc.go). A env IZANAGI_ORCHESTRATOR_SOCK, quando setada,
12
+ * substitui TODOS os defaults (comportamento do SDK/packages).
13
+ */
14
+ const DEFAULT_SOCKET_CANDIDATES = ['/tmp/izanagi-swarm.sock', '/tmp/izanagi-orch.sock'];
15
+ function isFile(p) {
16
+ try {
17
+ return fs.statSync(p).isFile();
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ }
23
+ function truncate(text, max) {
24
+ const clean = text.trim();
25
+ return clean.length <= max ? clean : `${clean.slice(0, max - 1)}…`;
26
+ }
27
+ /**
28
+ * Sonda barata de versão: roda `<bin> --version` com timeout curto. Só aceita resposta
29
+ * quando exit 0 e primeira linha de stdout curta e não-vazia; caso contrário (binário
30
+ * mudo, flag não suportada, hang, crash) devolve null → caller reporta só presença.
31
+ */
32
+ function probeBinaryVersion(binPath) {
33
+ let firstLine = '';
34
+ try {
35
+ const res = spawnSync(binPath, ['--version'], { timeout: VERSION_PROBE_TIMEOUT_MS, encoding: 'utf8' });
36
+ if (res.status !== 0 || res.error !== undefined)
37
+ return null;
38
+ firstLine = (res.stdout ?? '').split('\n')[0]?.trim() ?? '';
39
+ }
40
+ catch {
41
+ return null;
42
+ }
43
+ if (firstLine.length === 0 || firstLine.length > MAX_DETAIL_LEN)
44
+ return null;
45
+ return firstLine;
46
+ }
47
+ function checkRustBin(ctx, binName) {
48
+ const component = `rust:${binName}`;
49
+ // Prefere release (artefato de grau produção); cai para debug (build dev corrente).
50
+ for (const variant of ['release', 'debug']) {
51
+ const binPath = path.join(ctx.root, 'target', variant, binName);
52
+ if (!isFile(binPath))
53
+ continue;
54
+ const version = probeBinaryVersion(binPath);
55
+ const detail = version !== null
56
+ ? `binário ${variant}; versão: ${version}`
57
+ : `binário ${variant} presente (sem --version utilizável)`;
58
+ return { component, status: 'ok', detail, path: binPath };
59
+ }
60
+ return { component, status: 'ausente', detail: 'não encontrado em target/{release,debug}', path: null };
61
+ }
62
+ function socketCandidates() {
63
+ const fromEnv = process.env.IZANAGI_ORCHESTRATOR_SOCK?.trim();
64
+ return fromEnv ? [fromEnv] : [...DEFAULT_SOCKET_CANDIDATES];
65
+ }
66
+ function checkGoOrchestrator() {
67
+ const candidates = socketCandidates();
68
+ for (const sock of candidates) {
69
+ if (fs.existsSync(sock)) {
70
+ return { component: 'go:orchestrator', status: 'ok', detail: `socket em ${sock}`, path: sock };
71
+ }
72
+ }
73
+ const viaEnv = Boolean(process.env.IZANAGI_ORCHESTRATOR_SOCK?.trim());
74
+ const detail = viaEnv
75
+ ? `socket da env IZANAGI_ORCHESTRATOR_SOCK ausente (${candidates.join(', ')})`
76
+ : `nenhum socket (${candidates.join(' ou ')})`;
77
+ return { component: 'go:orchestrator', status: 'ausente', detail, path: null };
78
+ }
79
+ function venvPythonPath(root) {
80
+ return path.join(root, 'python-engine', '.venv', 'bin', 'python');
81
+ }
82
+ function checkPythonVenv(ctx) {
83
+ const pyPath = venvPythonPath(ctx.root);
84
+ if (isFile(pyPath)) {
85
+ return { component: 'python:venv', status: 'ok', detail: 'venv Python presente', path: pyPath };
86
+ }
87
+ return { component: 'python:venv', status: 'ausente', detail: 'venv ausente (python-engine/.venv/bin/python)', path: null };
88
+ }
89
+ function checkAstAnalyzer(ctx) {
90
+ const pyPath = venvPythonPath(ctx.root);
91
+ if (!isFile(pyPath)) {
92
+ return {
93
+ component: 'python:ast-analyzer',
94
+ status: 'ausente',
95
+ detail: 'venv ausente — impossível verificar import',
96
+ path: null,
97
+ };
98
+ }
99
+ let exitStatus = null;
100
+ let lastStderrLine = '';
101
+ try {
102
+ const res = spawnSync(pyPath, ['-c', 'import ast_analyzer'], {
103
+ cwd: path.join(ctx.root, 'python-engine'),
104
+ timeout: PYTHON_IMPORT_TIMEOUT_MS,
105
+ encoding: 'utf8',
106
+ });
107
+ exitStatus = res.status;
108
+ const stderrLines = (res.stderr ?? '').trim().split('\n').filter((line) => line.length > 0);
109
+ lastStderrLine = stderrLines[stderrLines.length - 1] ?? '';
110
+ }
111
+ catch (err) {
112
+ const reason = err instanceof Error ? truncate(err.message, 80) : 'falha desconhecida ao spawnar venv';
113
+ return { component: 'python:ast-analyzer', status: 'ausente', detail: `import falhou: ${reason}`, path: pyPath };
114
+ }
115
+ if (exitStatus === 0) {
116
+ return { component: 'python:ast-analyzer', status: 'ok', detail: 'ast_analyzer importável', path: pyPath };
117
+ }
118
+ const reason = lastStderrLine.length > 0 ? truncate(lastStderrLine, 80) : `exit ${String(exitStatus)}`;
119
+ return { component: 'python:ast-analyzer', status: 'ausente', detail: `import falhou: ${reason}`, path: pyPath };
120
+ }
121
+ function checkTsDist(ctx, pkg) {
122
+ const component = `ts:${pkg}-dist`;
123
+ const distDir = path.join(ctx.root, 'packages', pkg, 'dist');
124
+ let entryCount = 0;
125
+ try {
126
+ if (fs.statSync(distDir).isDirectory())
127
+ entryCount = fs.readdirSync(distDir).length;
128
+ }
129
+ catch {
130
+ entryCount = 0;
131
+ }
132
+ if (entryCount > 0) {
133
+ return { component, status: 'ok', detail: `packages/${pkg}/dist presente`, path: distDir };
134
+ }
135
+ return { component, status: 'ausente', detail: `packages/${pkg}/dist ausente (rode o build do package)`, path: null };
136
+ }
137
+ /** Ordem fixa e estável — contrato também consumido pelo modo --json. */
138
+ export function collectPolyglotRows(ctx) {
139
+ return [
140
+ checkRustBin(ctx, 'izanagi-core'),
141
+ checkRustBin(ctx, 'izanagi-mcp'),
142
+ checkGoOrchestrator(),
143
+ checkPythonVenv(ctx),
144
+ checkAstAnalyzer(ctx),
145
+ checkTsDist(ctx, 'sdk'),
146
+ checkTsDist(ctx, 'cli'),
147
+ ];
148
+ }
149
+ const GREEN = '\x1b[32m';
150
+ const RED = '\x1b[31m';
151
+ const BOLD = '\x1b[1m';
152
+ const RESET = '\x1b[0m';
153
+ function renderTextTable(rows, root) {
154
+ const componentWidth = Math.max(...rows.map((r) => r.component.length), 'component'.length);
155
+ const statusWidth = Math.max(...rows.map((r) => r.status.length), 'status'.length);
156
+ const lines = [];
157
+ lines.push(`${BOLD}Izanagi Polyglot Status${RESET} — raiz: ${root}`);
158
+ lines.push('');
159
+ lines.push(`${'component'.padEnd(componentWidth)} ${'status'.padEnd(statusWidth)} detail`);
160
+ for (const row of rows) {
161
+ const color = row.status === 'ok' ? GREEN : RED;
162
+ lines.push(`${row.component.padEnd(componentWidth)} ${color}${row.status.padEnd(statusWidth)}${RESET} ${row.detail}`);
163
+ }
164
+ return lines.join('\n');
165
+ }
166
+ function usageError() {
167
+ console.error('[polyglot] Uso: izanagi polyglot status [--json] [--strict]');
168
+ process.exit(1);
169
+ }
170
+ function parseArgs(rest) {
171
+ const flags = { json: false, strict: false };
172
+ let sawSubcommand = false;
173
+ for (const arg of rest) {
174
+ if (arg === '--json')
175
+ flags.json = true;
176
+ else if (arg === '--strict')
177
+ flags.strict = true;
178
+ else if (arg === 'status') {
179
+ if (sawSubcommand)
180
+ usageError();
181
+ sawSubcommand = true;
182
+ }
183
+ else {
184
+ usageError();
185
+ }
186
+ }
187
+ return flags;
188
+ }
189
+ /**
190
+ * Handler do comando. Sempre imprime o relatório; exit code só muda com --strict.
191
+ * Síncrono na essência (spawnSync nos probes), assinatura async por uniformidade
192
+ * com o router (todos os comandos são awaited).
193
+ */
194
+ export async function polyglotCommand(rest, opts) {
195
+ const { json, strict } = parseArgs(rest);
196
+ const root = path.resolve(opts?.root ?? getPackageDir());
197
+ const rows = collectPolyglotRows({ root });
198
+ if (json) {
199
+ console.log(JSON.stringify(rows, null, 2));
200
+ }
201
+ else {
202
+ console.log(renderTextTable(rows, root));
203
+ }
204
+ if (strict && rows.some((r) => r.status === 'ausente')) {
205
+ process.exit(1);
206
+ }
207
+ }
208
+ //# sourceMappingURL=polyglot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polyglot.js","sourceRoot":"","sources":["../../../src/cli/commands/polyglot.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AA+CA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4H1D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAgDA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkI1D"}
package/dist/cli/index.js CHANGED
@@ -22,6 +22,7 @@ import { resumeCommand } from './commands/resume.js';
22
22
  import { approveCommand } from './commands/approve.js';
23
23
  import { rejectCommand } from './commands/reject.js';
24
24
  import { explainCommand } from './commands/explain.js';
25
+ import { polyglotCommand } from './commands/polyglot.js';
25
26
  /**
26
27
  * `packageDir` é SEMPRE a instalação do próprio izanagi-ai (node_modules/izanagi-ai ou
27
28
  * o checkout do repo) — só serve pra ler o `package.json` do pacote (versão) e como
@@ -106,6 +107,11 @@ export async function runCLI(args) {
106
107
  case 'explain':
107
108
  explainCommand(baseDir, rest);
108
109
  break;
110
+ // Ponte de diagnóstico com os núcleos poliglotas (Rust/Go/Python/packages TS):
111
+ // só checagens de existência + probes baratos, nunca executa os núcleos.
112
+ case 'polyglot':
113
+ await polyglotCommand(rest);
114
+ break;
109
115
  case 'chat':
110
116
  case 'repl':
111
117
  case 'interactive':
@@ -166,6 +172,7 @@ function showHelp() {
166
172
  \x1b[32mbenchmark list|run|compare\x1b[0m Suíte de benchmarks + regression comparison.
167
173
  \x1b[32mmemory inspect|search <q>\x1b[0m Memória persistente (patterns, learnings, stats).
168
174
  \x1b[32mdiagnose\x1b[0m Diagnóstico profundo do runtime.
175
+ \x1b[32mpolyglot status [--json|--strict]\x1b[0m Saúde dos núcleos poliglotas (Rust, Go, Python, packages TS) — diagnóstico, exit 0; --strict sai 1 se algo ausente.
169
176
  \x1b[32mdashboard [--port N]\x1b[0m Sobe o Dashboard local (Run Explorer, Arena, Memory) em http://localhost.
170
177
  \x1b[32mresume <run-id>\x1b[0m Retoma execução interrompida/pausada a partir do checkpoint.
171
178
  \x1b[32mapprove <run-id> [node-id]\x1b[0m Aprova ação de alto risco pausada (human-in-the-loop) e retoma.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEtE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;AACnC,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAEpD,SAAS,WAAW;IAClB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACxF,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAc;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IAC9B,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3B,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM;YACT,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;YACxB,MAAM;QAER,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACtG,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC7B,MAAM;QACR,CAAC;QAED,KAAK,OAAO;YACV,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC5B,MAAM;QAER,KAAK,OAAO;YACV,MAAM,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAClC,MAAM;QAER,KAAK,UAAU;YACb,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC/B,MAAM;QAER,KAAK,KAAK,CAAC;QACX,KAAK,SAAS;YACZ,MAAM,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAChC,MAAM;QAER,KAAK,OAAO;YACV,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC5B,MAAM;QAER,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU;YACb,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC3B,MAAM;QAER,KAAK,WAAW,CAAC;QACjB,KAAK,OAAO,CAAC;QACb,4EAA4E;QAC5E,sEAAsE;QACtE,wEAAwE;QACxE,8CAA8C;QAC9C,KAAK,OAAO;YACV,MAAM,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACtC,MAAM;QAER,KAAK,QAAQ;YACX,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC7B,MAAM;QAER,KAAK,UAAU;YACb,eAAe,CAAC,OAAO,CAAC,CAAC;YACzB,MAAM;QAER,KAAK,WAAW;YACd,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAChC,MAAM;QAER,KAAK,QAAQ;YACX,MAAM,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACnC,MAAM;QAER,KAAK,SAAS;YACZ,MAAM,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACpC,MAAM;QAER,KAAK,QAAQ;YACX,MAAM,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACnC,MAAM;QAER,KAAK,SAAS;YACZ,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC9B,MAAM;QAER,+EAA+E;QAC/E,yEAAyE;QACzE,KAAK,UAAU;YACb,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;YAC5B,MAAM;QAER,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,aAAa;YAChB,WAAW,CAAC,OAAO,CAAC,CAAC;YACrB,MAAM;QAER,KAAK,QAAQ;YACX,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM;QAER,KAAK,SAAS,CAAC;QACf,KAAK,OAAO;YACV,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM;QAER,KAAK,QAAQ,CAAC;QACd,KAAK,OAAO,CAAC;QACb,KAAK,UAAU;YACb,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC7B,MAAM;QAER,KAAK,QAAQ;YACX,aAAa,CAAC,IAAI,CAAC,CAAC;YACpB,MAAM;QAER,KAAK,SAAS,CAAC;QACf,KAAK,IAAI,CAAC;QACV,KAAK,WAAW;YACd,WAAW,EAAE,CAAC;YACd,MAAM;QAER,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACP,QAAQ,EAAE,CAAC;YACX,MAAM;QAER;YACE,OAAO,CAAC,KAAK,CAAC,kCAAkC,GAAG,IAAI,CAAC,CAAC;YACzD,QAAQ,EAAE,CAAC;YACX,MAAM;IACV,CAAC;AACH,CAAC;AAED,SAAS,QAAQ;IACf,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyDb,CAAC,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=polyglot.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polyglot.test.d.ts","sourceRoot":"","sources":["../../../src/runtime/tests/polyglot.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,330 @@
1
+ import { test } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import fs from 'node:fs';
4
+ import os from 'node:os';
5
+ import path from 'node:path';
6
+ import { runCLI } from '../../cli/index.js';
7
+ import { polyglotCommand } from '../../cli/commands/polyglot.js';
8
+ /**
9
+ * Testes do comando `izanagi polyglot status` — diagnóstico da saúde dos núcleos
10
+ * poliglotas SEM executá-los pesadamente. Fixtures montam sandboxes tmp com os
11
+ * artefatos esperados (bins Rust falsos, socket Go, venv Python fake, dist TS),
12
+ * injetados via opts.root. Nenhuma dependência nova; nenhum stub no código de
13
+ * produção — os fakes vivem apenas aqui, exercendo o contrato real por subprocess.
14
+ */
15
+ const EXPECTED_COMPONENTS = [
16
+ 'rust:izanagi-core',
17
+ 'rust:izanagi-mcp',
18
+ 'go:orchestrator',
19
+ 'python:venv',
20
+ 'python:ast-analyzer',
21
+ 'ts:sdk-dist',
22
+ 'ts:cli-dist',
23
+ ];
24
+ function tmpRoot(prefix) {
25
+ return fs.mkdtempSync(path.join(os.tmpdir(), prefix));
26
+ }
27
+ /** Executa fn com IZANAGI_ORCHESTRATOR_SOCK controlado, restaurando depois. */
28
+ function withSocketEnv(value, fn) {
29
+ const saved = process.env.IZANAGI_ORCHESTRATOR_SOCK;
30
+ try {
31
+ if (value === undefined)
32
+ delete process.env.IZANAGI_ORCHESTRATOR_SOCK;
33
+ else
34
+ process.env.IZANAGI_ORCHESTRATOR_SOCK = value;
35
+ return fn();
36
+ }
37
+ finally {
38
+ if (saved === undefined)
39
+ delete process.env.IZANAGI_ORCHESTRATOR_SOCK;
40
+ else
41
+ process.env.IZANAGI_ORCHESTRATOR_SOCK = saved;
42
+ }
43
+ }
44
+ function writeExec(root, relPath, body) {
45
+ const abs = path.join(root, relPath);
46
+ fs.mkdirSync(path.dirname(abs), { recursive: true });
47
+ fs.writeFileSync(abs, body, 'utf8');
48
+ fs.chmodSync(abs, 0o755);
49
+ return abs;
50
+ }
51
+ /** Bin Rust fake que responde --version com uma linha fixa. */
52
+ function addRustBinWithVersion(root, name, version) {
53
+ writeExec(root, path.join('target', 'debug', name), [
54
+ '#!/usr/bin/env bash',
55
+ 'if [ "$1" = "--version" ]; then',
56
+ ` echo "${name} ${version}"`,
57
+ ' exit 0',
58
+ 'fi',
59
+ 'exit 0',
60
+ ].join('\n'));
61
+ }
62
+ /** Bin Rust fake que ignora argumentos e não expõe versão. */
63
+ function addMuteRustBin(root, name, variant) {
64
+ writeExec(root, path.join('target', variant, name), '#!/usr/bin/env bash\nexit 0\n');
65
+ }
66
+ function addFakeVenv(root, behavior) {
67
+ const body = behavior === 'ok'
68
+ ? '#!/usr/bin/env bash\nexit 0\n'
69
+ : '#!/usr/bin/env bash\necho "Traceback (most recent call last):" >&2\necho \'ModuleNotFoundError: No module named \'"\'"\'ast_analyzer\'"\'"\'\' >&2\nexit 1\n';
70
+ writeExec(root, path.join('python-engine', '.venv', 'bin', 'python'), body);
71
+ }
72
+ function addTsDist(root, pkg) {
73
+ const dir = path.join(root, 'packages', pkg, 'dist');
74
+ fs.mkdirSync(dir, { recursive: true });
75
+ fs.writeFileSync(path.join(dir, 'index.js'), '// build fixture\n', 'utf8');
76
+ }
77
+ async function runPolyglot(args, root) {
78
+ const logs = [];
79
+ const errors = [];
80
+ let exitCode = null;
81
+ const origLog = console.log;
82
+ const origError = console.error;
83
+ const origExit = process.exit;
84
+ console.log = (m) => { logs.push(String(m)); };
85
+ console.error = (m) => { errors.push(String(m)); };
86
+ process.exit = ((code) => {
87
+ exitCode = code ?? 0;
88
+ throw new Error(`PROCESS_EXIT:${exitCode}`);
89
+ });
90
+ try {
91
+ await polyglotCommand(args, root === undefined ? undefined : { root });
92
+ }
93
+ catch (err) {
94
+ if (!(err instanceof Error && err.message.startsWith('PROCESS_EXIT')))
95
+ throw err;
96
+ }
97
+ finally {
98
+ console.log = origLog;
99
+ console.error = origError;
100
+ process.exit = origExit;
101
+ }
102
+ return { logs, errors, exitCode };
103
+ }
104
+ function parseJsonRows(logs) {
105
+ const parsed = JSON.parse(logs.join('\n'));
106
+ assert.ok(Array.isArray(parsed), 'saída --json deve ser um array de linhas');
107
+ return parsed;
108
+ }
109
+ function statusOf(rows, component) {
110
+ const row = rows.find((r) => r.component === component);
111
+ assert.ok(row, `linha ausente para ${component}`);
112
+ return row;
113
+ }
114
+ test('polyglot: bin Rust presente com --version barato reporta a versão', async () => {
115
+ const root = tmpRoot('izanagi-polyglot-ver-');
116
+ try {
117
+ addRustBinWithVersion(root, 'izanagi-core', '0.4.2');
118
+ const out = await runPolyglot(['status'], root);
119
+ assert.equal(out.exitCode, null);
120
+ const text = out.logs.join('\n');
121
+ assert.match(text, /rust:izanagi-core/);
122
+ assert.match(text, /0\.4\.2/);
123
+ assert.match(text, /ok/);
124
+ }
125
+ finally {
126
+ fs.rmSync(root, { recursive: true, force: true });
127
+ }
128
+ });
129
+ test('polyglot: bin Rust sem --version cai para presença (release tem prioridade sobre debug)', async () => {
130
+ const root = tmpRoot('izanagi-polyglot-mute-');
131
+ try {
132
+ addMuteRustBin(root, 'izanagi-mcp', 'release');
133
+ const rows = parseJsonRows((await runPolyglot(['status', '--json'], root)).logs);
134
+ const row = statusOf(rows, 'rust:izanagi-mcp');
135
+ assert.equal(row.status, 'ok');
136
+ assert.match(row.detail, /presen/i);
137
+ assert.match(row.path ?? '', /target[/\\]release[/\\]izanagi-mcp$/);
138
+ }
139
+ finally {
140
+ fs.rmSync(root, { recursive: true, force: true });
141
+ }
142
+ });
143
+ test('polyglot: bins Rust ausentes em raiz vazia', async () => {
144
+ const root = tmpRoot('izanagi-polyglot-empty-');
145
+ try {
146
+ const rows = parseJsonRows((await runPolyglot(['status', '--json'], root)).logs);
147
+ assert.equal(statusOf(rows, 'rust:izanagi-core').status, 'ausente');
148
+ assert.equal(statusOf(rows, 'rust:izanagi-mcp').status, 'ausente');
149
+ assert.equal(statusOf(rows, 'rust:izanagi-core').path, null);
150
+ }
151
+ finally {
152
+ fs.rmSync(root, { recursive: true, force: true });
153
+ }
154
+ });
155
+ test('polyglot: socket do orquestrador Go via env IZANAGI_ORCHESTRATOR_SOCK', () => {
156
+ const root = tmpRoot('izanagi-polyglot-go-');
157
+ try {
158
+ const sock = path.join(root, 'swarm.sock');
159
+ fs.writeFileSync(sock, '', 'utf8');
160
+ withSocketEnv(sock, async () => {
161
+ const rows = parseJsonRows((await runPolyglot(['status', '--json'], root)).logs);
162
+ const row = statusOf(rows, 'go:orchestrator');
163
+ assert.equal(row.status, 'ok');
164
+ assert.equal(row.path, sock);
165
+ });
166
+ }
167
+ finally {
168
+ fs.rmSync(root, { recursive: true, force: true });
169
+ }
170
+ });
171
+ test('polyglot: env apontando para socket inexistente → ausente (sem crash)', () => {
172
+ const root = tmpRoot('izanagi-polyglot-go2-');
173
+ try {
174
+ withSocketEnv(path.join(root, 'nao-existe.sock'), async () => {
175
+ const rows = parseJsonRows((await runPolyglot(['status', '--json'], root)).logs);
176
+ assert.equal(statusOf(rows, 'go:orchestrator').status, 'ausente');
177
+ });
178
+ }
179
+ finally {
180
+ fs.rmSync(root, { recursive: true, force: true });
181
+ }
182
+ });
183
+ test('polyglot: venv Python saudável → venv ok e ast_analyzer importável', () => {
184
+ const root = tmpRoot('izanagi-polyglot-py-');
185
+ try {
186
+ addFakeVenv(root, 'ok');
187
+ withSocketEnv(undefined, async () => {
188
+ const rows = parseJsonRows((await runPolyglot(['status', '--json'], root)).logs);
189
+ assert.equal(statusOf(rows, 'python:venv').status, 'ok');
190
+ const ast = statusOf(rows, 'python:ast-analyzer');
191
+ assert.equal(ast.status, 'ok');
192
+ assert.match(ast.detail, /import/i);
193
+ });
194
+ }
195
+ finally {
196
+ fs.rmSync(root, { recursive: true, force: true });
197
+ }
198
+ });
199
+ test('polyglot: venv presente mas import falha → ast-analyzer ausente com stderr resumido', () => {
200
+ const root = tmpRoot('izanagi-polyglot-py2-');
201
+ try {
202
+ addFakeVenv(root, 'import-fail');
203
+ withSocketEnv(undefined, async () => {
204
+ const rows = parseJsonRows((await runPolyglot(['status', '--json'], root)).logs);
205
+ assert.equal(statusOf(rows, 'python:venv').status, 'ok');
206
+ const ast = statusOf(rows, 'python:ast-analyzer');
207
+ assert.equal(ast.status, 'ausente');
208
+ assert.match(ast.detail, /ModuleNotFoundError/);
209
+ });
210
+ }
211
+ finally {
212
+ fs.rmSync(root, { recursive: true, force: true });
213
+ }
214
+ });
215
+ test('polyglot: venv ausente → ast-analyzer ausente explicando o motivo', () => {
216
+ const root = tmpRoot('izanagi-polyglot-py3-');
217
+ try {
218
+ withSocketEnv(undefined, async () => {
219
+ const rows = parseJsonRows((await runPolyglot(['status', '--json'], root)).logs);
220
+ assert.equal(statusOf(rows, 'python:venv').status, 'ausente');
221
+ const ast = statusOf(rows, 'python:ast-analyzer');
222
+ assert.equal(ast.status, 'ausente');
223
+ assert.match(ast.detail, /venv ausente/);
224
+ });
225
+ }
226
+ finally {
227
+ fs.rmSync(root, { recursive: true, force: true });
228
+ }
229
+ });
230
+ test('polyglot: dist TS de sdk/cli — presente e ausente no mesmo cenário', () => {
231
+ const root = tmpRoot('izanagi-polyglot-ts-');
232
+ try {
233
+ addTsDist(root, 'sdk');
234
+ withSocketEnv(undefined, async () => {
235
+ const rows = parseJsonRows((await runPolyglot(['status', '--json'], root)).logs);
236
+ assert.equal(statusOf(rows, 'ts:sdk-dist').status, 'ok');
237
+ assert.equal(statusOf(rows, 'ts:cli-dist').status, 'ausente');
238
+ });
239
+ }
240
+ finally {
241
+ fs.rmSync(root, { recursive: true, force: true });
242
+ }
243
+ });
244
+ test('polyglot: modo --json cobre exatamente os 7 componentes com schema estável', () => {
245
+ const root = tmpRoot('izanagi-polyglot-json-');
246
+ try {
247
+ addRustBinWithVersion(root, 'izanagi-core', '1.0.0');
248
+ addRustBinWithVersion(root, 'izanagi-mcp', '1.0.0');
249
+ addFakeVenv(root, 'ok');
250
+ addTsDist(root, 'sdk');
251
+ addTsDist(root, 'cli');
252
+ withSocketEnv(undefined, async () => {
253
+ const logs = [];
254
+ const origLog = console.log;
255
+ console.log = (m) => { logs.push(String(m)); };
256
+ try {
257
+ await polyglotCommand(['status', '--json'], { root });
258
+ }
259
+ finally {
260
+ console.log = origLog;
261
+ }
262
+ const rows = parseJsonRows(logs);
263
+ assert.deepEqual(rows.map((r) => r.component), [...EXPECTED_COMPONENTS]);
264
+ for (const r of rows) {
265
+ assert.ok(r.status === 'ok' || r.status === 'ausente', `status inválido: ${r.status}`);
266
+ assert.equal(typeof r.detail, 'string');
267
+ assert.ok(r.path === null || typeof r.path === 'string');
268
+ }
269
+ });
270
+ }
271
+ finally {
272
+ fs.rmSync(root, { recursive: true, force: true });
273
+ }
274
+ });
275
+ test('polyglot: --strict sai 1 quando algo ausente e 0 quando tudo ok', () => {
276
+ const empty = tmpRoot('izanagi-polyglot-s1-');
277
+ const full = tmpRoot('izanagi-polyglot-s2-');
278
+ try {
279
+ // cenário vazio: algo ausente → exit 1
280
+ withSocketEnv(undefined, async () => {
281
+ const outEmpty = await runPolyglot(['status', '--strict'], empty);
282
+ assert.equal(outEmpty.exitCode, 1);
283
+ // cenário completo → exit 0
284
+ addRustBinWithVersion(full, 'izanagi-core', '1.0.0');
285
+ addRustBinWithVersion(full, 'izanagi-mcp', '1.0.0');
286
+ const sock = path.join(full, 'orch.sock');
287
+ fs.writeFileSync(sock, '', 'utf8');
288
+ addFakeVenv(full, 'ok');
289
+ addTsDist(full, 'sdk');
290
+ addTsDist(full, 'cli');
291
+ withSocketEnv(sock, async () => {
292
+ const outFull = await runPolyglot(['status', '--strict'], full);
293
+ assert.equal(outFull.exitCode, null, 'tudo ok nem entra no ramo de exit');
294
+ });
295
+ });
296
+ }
297
+ finally {
298
+ fs.rmSync(empty, { recursive: true, force: true });
299
+ fs.rmSync(full, { recursive: true, force: true });
300
+ }
301
+ });
302
+ test('polyglot: subcomando inválido → erro de uso com exit 1', async () => {
303
+ const out = await runPolyglot(['deploy'], undefined);
304
+ assert.equal(out.exitCode, 1);
305
+ assert.match(out.errors.join('\n'), /uso/i);
306
+ });
307
+ test('polyglot: registrado no router — tabela renderiza e help lista o comando', async () => {
308
+ const logs = [];
309
+ const origLog = console.log;
310
+ console.log = (m) => { logs.push(String(m)); };
311
+ try {
312
+ await runCLI(['polyglot']);
313
+ }
314
+ finally {
315
+ console.log = origLog;
316
+ }
317
+ const text = logs.join('\n');
318
+ assert.match(text, /rust:izanagi-core/);
319
+ assert.match(text, /ts:sdk-dist/);
320
+ const helpLogs = [];
321
+ console.log = (m) => { helpLogs.push(String(m)); };
322
+ try {
323
+ await runCLI(['help']);
324
+ }
325
+ finally {
326
+ console.log = origLog;
327
+ }
328
+ assert.match(helpLogs.join('\n'), /polyglot/);
329
+ });
330
+ //# sourceMappingURL=polyglot.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polyglot.test.js","sourceRoot":"","sources":["../../../src/runtime/tests/polyglot.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=postinstall.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postinstall.test.d.ts","sourceRoot":"","sources":["../../../src/runtime/tests/postinstall.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,116 @@
1
+ import { test } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import fs from 'node:fs';
4
+ import os from 'node:os';
5
+ import path from 'node:path';
6
+ import { fileURLToPath } from 'node:url';
7
+ import { spawnSync } from 'node:child_process';
8
+ /**
9
+ * Contrato do hook postinstall (bug real de CI, corrigido em 2026-08-23):
10
+ *
11
+ * O hook era `node dist/scripts/postinstall.js` direto. Em checkout fresco do
12
+ * repo-fonte, `dist/` é gitignored — o `npm ci`/`npm install` executa o hook
13
+ * ANTES de qualquer build e o Node morre com MODULE_NOT_FOUND (o arquivo nem
14
+ * carrega, então nenhum try/catch interno pode salvar).
15
+ *
16
+ * Solução: bootstrap COMMITADO em `bin/postinstall.js` referenciado pelo hook.
17
+ * Ele delega para `dist/scripts/postinstall.js` quando o build existe (comportamento
18
+ * integral preservado, inclusive propagação de falhas reais) e, quando `dist/`
19
+ * está ausente, termina exit 0 com orientação clara ("rode npm run build").
20
+ *
21
+ * Estratégia dos testes: o postinstall roda sobre o próprio arquivo (import.meta.url),
22
+ * então cada caso monta um sandbox tmp com `bin/postinstall.js` copiado do repo e uma
23
+ * árvore `dist/` real ou sintética, executando o bootstrap como subprocess.
24
+ */
25
+ const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../..');
26
+ const realBootstrap = path.join(repoRoot, 'bin', 'postinstall.js');
27
+ function tmpDir(prefix) {
28
+ return fs.mkdtempSync(path.join(os.tmpdir(), prefix));
29
+ }
30
+ function runBootstrap(sandbox, env) {
31
+ const res = spawnSync(process.execPath, [path.join(sandbox, 'bin', 'postinstall.js')], {
32
+ cwd: sandbox,
33
+ encoding: 'utf8',
34
+ env: env ? { ...process.env, ...env } : undefined,
35
+ });
36
+ return {
37
+ status: res.status,
38
+ stdout: res.stdout ?? '',
39
+ stderr: res.stderr ?? '',
40
+ };
41
+ }
42
+ /** Copia o bootstrap real do repo para <sandbox>/bin/ (unit under test). */
43
+ function prepareSandbox() {
44
+ const sandbox = tmpDir('izanagi-postinstall-');
45
+ fs.mkdirSync(path.join(sandbox, 'bin'), { recursive: true });
46
+ fs.copyFileSync(realBootstrap, path.join(sandbox, 'bin', 'postinstall.js'));
47
+ return sandbox;
48
+ }
49
+ function writeFakeDistPostinstall(sandbox, body) {
50
+ fs.mkdirSync(path.join(sandbox, 'dist', 'scripts'), { recursive: true });
51
+ fs.writeFileSync(path.join(sandbox, 'dist', 'scripts', 'postinstall.js'), body, 'utf8');
52
+ }
53
+ test('postinstall: sem dist/ termina exit 0 com mensagem orientadora (bug de CI em checkout fresco)', () => {
54
+ const sandbox = prepareSandbox();
55
+ try {
56
+ const res = runBootstrap(sandbox);
57
+ assert.equal(res.status, 0, `esperado exit 0 sem dist/, veio ${res.status}; stderr: ${res.stderr}`);
58
+ const output = `${res.stdout}\n${res.stderr}`;
59
+ assert.match(output, /dist ausente/i);
60
+ assert.match(output, /npm run build/i);
61
+ }
62
+ finally {
63
+ fs.rmSync(sandbox, { recursive: true, force: true });
64
+ }
65
+ });
66
+ test('postinstall: COM dist/ delega integralmente (stdout repassado, exit 0)', () => {
67
+ const sandbox = prepareSandbox();
68
+ try {
69
+ writeFakeDistPostinstall(sandbox, [
70
+ `console.log('\\x1b[36m[Izanagi AI]\\x1b[0m Framework ativado automaticamente neste projeto (todas as CLIs). Rode \`izanagi doctor\` para validar.');`,
71
+ `process.exit(0);`,
72
+ ].join('\n'));
73
+ const res = runBootstrap(sandbox);
74
+ assert.equal(res.status, 0, `esperado exit 0 com dist/, veio ${res.status}; stderr: ${res.stderr}`);
75
+ assert.match(res.stdout, /Framework ativado automaticamente/);
76
+ assert.doesNotMatch(res.stdout, /dist ausente/);
77
+ }
78
+ finally {
79
+ fs.rmSync(sandbox, { recursive: true, force: true });
80
+ }
81
+ });
82
+ test('postinstall: falha real do script delegado NÃO é engolida (exit code propagado)', () => {
83
+ const sandbox = prepareSandbox();
84
+ try {
85
+ writeFakeDistPostinstall(sandbox, [`console.log('trabalho parcial feito');`, `process.exit(3);`].join('\n'));
86
+ const res = runBootstrap(sandbox);
87
+ assert.equal(res.status, 3, `exit 3 do script real deve propagar; veio ${res.status}`);
88
+ assert.match(res.stdout, /trabalho parcial feito/);
89
+ }
90
+ finally {
91
+ fs.rmSync(sandbox, { recursive: true, force: true });
92
+ }
93
+ });
94
+ test('postinstall: exceção de CARGA no dist/ existente propaga como falha (MODULE_NOT_FOUND real)', () => {
95
+ const sandbox = prepareSandbox();
96
+ try {
97
+ // dist/ existe mas está corrompido: importa módulo que não existe —
98
+ // deve FALHAR (não pode ser confundido com "dist ausente").
99
+ writeFakeDistPostinstall(sandbox, `import './modulo-inexistente.js';`);
100
+ const res = runBootstrap(sandbox);
101
+ assert.notEqual(res.status, 0, 'erro de carga com dist/ presente NÃO pode virar exit 0');
102
+ assert.doesNotMatch(res.stdout, /dist ausente/);
103
+ }
104
+ finally {
105
+ fs.rmSync(sandbox, { recursive: true, force: true });
106
+ }
107
+ });
108
+ test('postinstall: integração no repo real (com dist/) mantém caminho feliz silencioso do checkout', () => {
109
+ // Dentro do próprio checkout do framework, o postinstall real faz early-return
110
+ // (getPackageDir() não está sob node_modules) — comportamento atual integral:
111
+ // exit 0, sem tentar instalar nada, sem mensagem de ativação.
112
+ const res = spawnSync(process.execPath, [realBootstrap], { cwd: repoRoot, encoding: 'utf8' });
113
+ assert.equal(res.status, 0, `bootstrap no repo deve terminar 0; stderr: ${res.stderr ?? ''}`);
114
+ assert.doesNotMatch(String(res.stdout ?? ''), /dist ausente/);
115
+ });
116
+ //# sourceMappingURL=postinstall.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postinstall.test.js","sourceRoot":"","sources":["../../../src/runtime/tests/postinstall.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "izanagi-ai",
3
- "version": "3.7.0",
3
+ "version": "3.8.0",
4
4
  "description": "Izanagi AI - Modular Skill-Oriented AI Prompt & Agent Framework for Autonomous Software Engineering",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -46,7 +46,7 @@
46
46
  ],
47
47
  "scripts": {
48
48
  "build": "tsc && node dist/scripts/generate-manifest.js",
49
- "postinstall": "node dist/scripts/postinstall.js",
49
+ "postinstall": "node bin/postinstall.js",
50
50
  "build:clean": "node dist/scripts/build-clean.js",
51
51
  "verify": "node dist/scripts/verify-build.js && node --test \"dist/runtime/tests/*.test.js\"",
52
52
  "test": "npm run build && node --test \"dist/runtime/tests/*.test.js\"",