auroq-os 2.5.6 → 2.5.7

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.
@@ -1,7 +1,7 @@
1
1
  project:
2
2
  name: "Auroq OS"
3
3
  type: greenfield
4
- version: 2.5.6
4
+ version: 2.5.7
5
5
  installedAt: '2026-03-16'
6
6
 
7
7
  ide:
package/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## 2.5.7 — 2026-09-14
2
+
3
+ ### Doctor do Codex sem falso negativo
4
+
5
+ - O smoke do Codex usa `codex exec --json --ephemeral`, chama a ferramenta canonica e so aceita o evento estruturado `mcp_tool_call` de `arcane/catalogo_listar` concluido.
6
+ - Registro do servidor e aprovacao da unica ferramenta de leitura sao limitados ao processo efemero; nenhuma configuracao do aluno e alterada e nenhum comando tecnico e pedido.
7
+ - Se o Codex inventar a grafia antiga e a sondagem direta estiver verde, o doctor informa em linguagem leiga que a conexao esta saudavel.
8
+
1
9
  ## 2.5.6 — 2026-09-14
2
10
 
3
11
  ### Hotfix: restaura o MCP publicado
package/README.md CHANGED
@@ -168,12 +168,12 @@ agents/ → Seu exercito (companion, workers, minds, squads)
168
168
 
169
169
  ## Observabilidade do motor (candidato 2.5.2)
170
170
 
171
- Apos publicacao, `npx -y auroq-os@2.5.6 doctor` mostra a fila local segura e os comandos pinados de
172
- manutencao/diagnostico. `npx -y auroq-os@2.5.6 manutencao` preserva o caminho existente
171
+ Apos publicacao, `npx -y auroq-os@2.5.7 doctor` mostra a fila local segura e os comandos pinados de
172
+ manutencao/diagnostico. `npx -y auroq-os@2.5.7 manutencao` preserva o caminho existente
173
173
  de consentimento legado, studentFiles, customizacoes e dados do negocio. Nao ha
174
174
  migracao forcada. O registro MCP aponta para `arcane-mcp@0.5.0`, publicado e validado.
175
- O hotfix 2.5.6 restaura a conexao enquanto o candidato 0.6.0 passa por validacao separada.
176
- Os instaladores oficiais devem fixar 2.5.6 depois da publicacao e da verificacao do tarball.
175
+ O hotfix 2.5.7 restaura a conexao enquanto o candidato 0.6.0 passa por validacao separada.
176
+ Os instaladores oficiais devem fixar 2.5.7 depois da publicacao e da verificacao do tarball.
177
177
 
178
178
  O CLI inicia captura antes das dependencias pesadas e registra resultado ao sair.
179
179
  Eventos com identidade ja existente podem seguir pela rota autenticada na proxima
package/bin/auroq-os.js CHANGED
@@ -28,7 +28,7 @@ async function observedMain() {
28
28
  telemetry.runtimeReady=()=>{importing=false;};
29
29
  runRuntime(telemetry);
30
30
  } catch {
31
- console.error('[auroq-os] '+(importing?'BOOTSTRAP_IMPORT':'RUNTIME_FAILURE')+'. Rode: npx -y auroq-os@2.5.6 doctor');
31
+ console.error('[auroq-os] '+(importing?'BOOTSTRAP_IMPORT':'RUNTIME_FAILURE')+'. Rode: npx -y auroq-os@2.5.7 doctor');
32
32
  process.exitCode=1;
33
33
  }
34
34
  }
@@ -476,11 +476,15 @@ async function runDoctor(targetDir) {
476
476
  let codexFalhou = false;
477
477
  if (vCodex) {
478
478
  log(` ${DIM}Pedindo ao proprio Codex pra chamar o conteudo ao vivo (pode levar 1-2 min)...${RESET}`);
479
- const linhas = rodarNoCodex(targetDir);
480
- const texto = linhas.join('\n');
481
- codexFalhou = !/versao|catalogo_listar \(completed\)/i.test(texto) || /motivo t[eé]cnico|indispon[ií]vel|failed|timed out/i.test(texto);
482
- (codexFalhou ? error : success)(codexFalhou ? 'Codex de verdade: NAO conseguiu usar o conteudo ao vivo' : 'Codex de verdade: usou o conteudo ao vivo');
483
- for (const l of linhas) log(` ${DIM} ${l}${RESET}`);
479
+ const smoke = rodarNoCodex(targetDir);
480
+ const diretoSaudavel = Boolean(r.temForja && r.chamada && !r.chamada.erro);
481
+ codexFalhou = !smoke.sucesso && !diretoSaudavel;
482
+ if (!smoke.sucesso && diretoSaudavel) {
483
+ warn('A conexao esta funcionando, mas o teste automatico do Codex nao concluiu. Feche e abra uma sessao nova do Codex.');
484
+ } else {
485
+ (codexFalhou ? error : success)(codexFalhou ? 'Codex de verdade: NAO conseguiu usar o conteudo ao vivo' : 'Codex de verdade: usou o conteudo ao vivo');
486
+ }
487
+ for (const l of smoke.linhas) log(` ${DIM} ${l}${RESET}`);
484
488
  }
485
489
  if (r.subiu === null || !r.temForja || !r.chamada || r.chamada.erro || codexFalhou) {
486
490
  problemas.push('Mande o print desta tela INTEIRA pro suporte (11 93621-4486) — ela ja traz tudo que precisamos.');
@@ -799,23 +803,50 @@ async function rastroDoCodex(limite = 8) {
799
803
  }
800
804
 
801
805
 
802
- // O teste definitivo: o proprio Codex do aluno chamando a ferramenta. E o unico jeito de
803
- // ver o que o Codex faz com o MCP (sandbox, proxy, certificado) sem pedir print atras de print.
806
+ // O smoke usa JSONL estruturado: texto humano ou a palavra "versao" nunca provam que a
807
+ // ferramenta foi chamada. As opcoes -c valem so para este processo ephemeral; nao editam a
808
+ // configuracao do aluno. A unica aprovacao automatica e a leitura catalogo_listar deste servidor.
809
+ function argumentosCodexSmoke() {
810
+ const prompt = 'Chame agora a ferramenta MCP catalogo_listar do servidor arcane. Se o runtime usar JavaScript, execute exatamente tools.mcp__arcane__catalogo_listar({}); nunca use tools.mcp_arcane_catalogo_listar. Responda somente com a primeira linha do resultado.';
811
+ return ['exec', '--json', '--ephemeral', '--skip-git-repo-check', '-C', '.',
812
+ '-c', 'mcp_servers.arcane.command="npx"',
813
+ '-c', `mcp_servers.arcane.args=["-y",${JSON.stringify(ARCANE_MCP_PIN)}]`,
814
+ '-c', `mcp_servers.arcane.startup_timeout_sec=${CODEX_MCP_STARTUP_SEC}`,
815
+ '-c', 'mcp_servers.arcane.enabled_tools=["catalogo_listar"]',
816
+ '-c', 'mcp_servers.arcane.tools.catalogo_listar.approval_mode="approve"',
817
+ '-c', `mcp_servers.arcane.env_vars=${JSON.stringify([...CODEX_ENV_MINIMO, ...CODEX_ENV_WINDOWS])}`,
818
+ prompt];
819
+ }
820
+
821
+ function avaliarEventosCodex(saida) {
822
+ let concluiu = false;
823
+ let falhou = false;
824
+ for (const linha of String(saida || '').split('\n')) {
825
+ if (!linha.trim()) continue;
826
+ let evento;
827
+ try { evento = JSON.parse(linha); } catch { continue; }
828
+ const item = evento?.item;
829
+ if (evento?.type !== 'item.completed' || item?.type !== 'mcp_tool_call' || item.server !== 'arcane' || item.tool !== 'catalogo_listar') continue;
830
+ if (item.status === 'completed' && item.error === null) concluiu = true;
831
+ else falhou = true;
832
+ }
833
+ return { sucesso: Boolean(concluiu && !falhou), erro: falhou ? 'SMOKE_TOOL_FAILED' : null };
834
+ }
835
+
804
836
  function rodarNoCodex(pasta) {
805
- const prompt = 'Chame a ferramenta MCP catalogo_listar do servidor arcane e responda SOMENTE com a primeira linha do resultado, ou com a mensagem de erro exata que a ferramenta devolveu.';
806
- const args = ['exec', '--skip-git-repo-check', '-C', pasta, prompt];
837
+ const args = argumentosCodexSmoke();
807
838
  const c = process.platform === 'win32'
808
- ? { cmd: process.env.ComSpec || 'cmd.exe', args: ['/d', '/s', '/c', `codex exec --skip-git-repo-check -C "${pasta}" "${prompt}"`], opts: { windowsVerbatimArguments: true } }
839
+ ? { cmd: process.env.ComSpec || 'cmd.exe', args: ['/d', '/s', '/c', `codex ${args.map(a => `"${String(a).replace(/"/g, '""')}"`).join(' ')}`], opts: { windowsVerbatimArguments: true } }
809
840
  : { cmd: 'codex', args, opts: {} };
810
841
  let saida = '';
811
842
  try {
812
- saida = execFileSync(c.cmd, c.args, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'], timeout: 300000, ...c.opts });
843
+ const env = process.platform === 'win32' ? { ...process.env, ...CODEX_ENV_FIXO_WINDOWS } : process.env;
844
+ saida = execFileSync(c.cmd, c.args, { cwd: pasta, env, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'], timeout: 300000, ...c.opts });
813
845
  } catch (e) {
814
846
  saida = `${e.stdout || ''}\n${e.stderr || ''}\n[codex saiu com ${e.status ?? e.code ?? 'erro'}]`;
815
847
  }
816
- return saida.split('\n').map(l => l.replace(/\u001b\[[0-9;]*m/g, '').trim())
817
- .filter(l => l && !/^hook:|^warning: Skill|usage limit|^Tip:|^tokens used|^[0-9.]+$/i.test(l))
818
- .slice(-8).map(l => l.slice(0, 220));
848
+ const avaliacao = avaliarEventosCodex(saida);
849
+ return { ...avaliacao, linhas: [avaliacao.sucesso ? 'Teste automatico concluido.' : 'O teste automatico nao concluiu.'] };
819
850
  }
820
851
 
821
852
  async function writeArcaneMcpConfig(targetDir) {
@@ -1734,8 +1765,7 @@ ${DIM} Auroq OS v${PKG_VERSION} — Sistema Operacional de IA para Experts${RES
1734
1765
 
1735
1766
  telemetry.runtimeReady();
1736
1767
  if (['doctor','diagnostico'].includes(process.argv[2])) {
1737
- console.log('Observabilidade local:',JSON.stringify(telemetry.diagnostics()));
1738
- console.log('Manutencao: npx -y auroq-os@2.5.6 manutencao; MCP: npx -y arcane-mcp@0.5.0 doctor');
1768
+ console.log('Diagnostico local carregado.');
1739
1769
  }
1740
1770
  // ─── CLI ─────────────────────────────────────────────────
1741
1771
  const command = process.argv[2];
@@ -1744,7 +1774,7 @@ if (['init', 'install', 'update'].includes(command)) {
1744
1774
  error('Comando aposentado. Nada foi instalado ou alterado.');
1745
1775
  error('Primeira instalacao: https://arcane.arka.education/auroq');
1746
1776
  error('No negocio existente, peca ao Ops: manutencao do motor. Conteudo chega pelo MCP.');
1747
- error('Diagnostico: npx -y auroq-os@2.5.6 doctor. Manutencao: npx -y auroq-os@2.5.6 manutencao.');
1777
+ error('Diagnostico: npx -y auroq-os@2.5.7 doctor. Manutencao: npx -y auroq-os@2.5.7 manutencao.');
1748
1778
  process.exitCode = 1;
1749
1779
  } else if (command === 'instalar' || command === 'manutencao') {
1750
1780
  // `--pasta <nome>`: o instalador manda o CLI criar e entrar na pasta do negocio,
@@ -1871,6 +1901,6 @@ if (['init', 'install', 'update'].includes(command)) {
1871
1901
  log('');
1872
1902
  }
1873
1903
 
1874
- if (process.env.AUROQ_EXPORTA_INTERNOS === '1') module.exports = { blocoCodexArcane, envCodexArcane, lerBlocoArcane, lerEnvDoBloco, limparArcaneDoGlobal, envComoCodex };
1904
+ if (process.env.AUROQ_EXPORTA_INTERNOS === '1') module.exports = { blocoCodexArcane, envCodexArcane, lerBlocoArcane, lerEnvDoBloco, limparArcaneDoGlobal, envComoCodex, argumentosCodexSmoke, avaliarEventosCodex };
1875
1905
 
1876
1906
  }
@@ -114,7 +114,7 @@ Limites: 200 slots por formato, sem captura antes
114
114
  do download do proprio script, sem garantia de reconexao/adocao. Fonte oficial segue
115
115
  neste diretorio; `plataforma-arcane/npm run sync:installer` sincroniza as duas copias.
116
116
 
117
- Pins oficiais usam `auroq-os@2.5.6`, hotfix que registra a versao publicada
117
+ Pins oficiais usam `auroq-os@2.5.7`, hotfix que registra a versao publicada
118
118
  `arcane-mcp@0.5.0`.
119
119
  Candidato cliente 0.6.0 segue separado ate concluir os gates. O runtime Windows
120
120
  faz fail-closed ate dispor de ACL/no-follow seguros; spool PowerShell permanece local.
@@ -589,7 +589,7 @@ function Invoke-AuroqLogin {
589
589
  # sucesso. Usado como pergunta de sim/nao, ele dizia "voce ja estava logado"
590
590
  # pra quem nunca logou, pulava o portao e deixava a conta sem acesso chegar ate
591
591
  # a criacao da pasta.
592
- & (Get-AuroqNpx) -y auroq-os@2.5.6 check-access
592
+ & (Get-AuroqNpx) -y auroq-os@2.5.7 check-access
593
593
  if ($LASTEXITCODE -ne 0) {
594
594
  Write-AuroqLog 'login' 'recusado'
595
595
  Write-Host ''
@@ -677,7 +677,7 @@ function Invoke-AuroqInit {
677
677
  if ($env:AUROQ_INSTALL_DRY_RUN) { Write-AuroqOk 'Sistema - seria montado aqui'; return }
678
678
 
679
679
  Set-Location $script:AuroqPastaAlvo
680
- & (Get-AuroqNpx) -y auroq-os@2.5.6 instalar
680
+ & (Get-AuroqNpx) -y auroq-os@2.5.7 instalar
681
681
  if ($LASTEXITCODE -ne 0) {
682
682
  Write-AuroqLog 'init' 'falhou'
683
683
  Write-AuroqErro 'A montagem do sistema parou no meio.' 'Rode o mesmo comando de novo. Se repetir, mande pro suporte o arquivo install.log da pasta .auroq.'
@@ -219,9 +219,9 @@ auroq_tem_terminal() {
219
219
  # recebem pedaco do script no lugar da resposta dele.
220
220
  auroq_npx_aluno() {
221
221
  if [ -t 0 ]; then
222
- npx -y auroq-os@2.5.6 "$@"
222
+ npx -y auroq-os@2.5.7 "$@"
223
223
  else
224
- npx -y auroq-os@2.5.6 "$@" < /dev/tty
224
+ npx -y auroq-os@2.5.7 "$@" < /dev/tty
225
225
  fi
226
226
  }
227
227
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "auroq-os",
3
- "version": "2.5.6",
3
+ "version": "2.5.7",
4
4
  "description": "Auroq OS — Sistema Operacional de IA para Experts",
5
5
  "bin": {
6
6
  "auroq-os": "bin/auroq-os.js"