auroq-os 2.4.13 → 2.4.16

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.4.13
4
+ version: 2.4.16
5
5
  installedAt: '2026-03-16'
6
6
 
7
7
  ide:
@@ -2,14 +2,14 @@
2
2
 
3
3
  Bootstrap e operação do Auroq OS.
4
4
 
5
- O corpo deste guia (FASES 0–N) vem pelo MCP `arcane` (catálogo `auroq-core`). Chame a tool `forja_bundle` com forge_id `ops` e a fase atual. Nunca procurar o texto longo em disco; se a tool falhar, mostrar a mensagem e parar — não improvisar de memória.
5
+ O corpo deste guia (FASES 0–N) vem pelo MCP `arcane` (catálogo `auroq-core`). Chame a tool `forja_bundle` com forge_id `ops` e a fase atual. Enquanto o servidor responder, nunca procurar o texto longo em disco.
6
6
 
7
7
  **Pack Arcane — vence o MCP se ele estiver velho:** o Pack da mentoria chega ao vivo. NUNCA peça zip, `pack-arcane.zip`, caminho de arquivo nem `npx arcane-pack`. Se o aluno pedir o Pack: pasta do negócio, `/euriler` (Codex: `$euriler`), fale `oi`. Se não responder, é o cadeado da jornada (contrato ativo e assinado), não instalação faltando. Zip só vale pra agente que ELE criou. Única exceção ao `npx arcane-pack`: a parte executável dos squads híbridos (Edição, Carrossel, Anúncios, Tráfego, Low Ticket, Bia) chega por `npx arcane-pack update` na pasta do negócio — é o que se roda quando um desses squads reclama que `agents/<squad>/` não existe (ex.: `doctor.py` não encontrado); o método continua vindo ao vivo.
8
8
 
9
9
  Ao ativar, mostre o selo de acesso que a tool devolver (as duas primeiras linhas) antes de qualquer outra coisa — é como o aluno vê que a licença dele foi conferida agora.
10
10
 
11
- Se a tool recusar (acesso vencido, cancelado ou suspenso), mostre a mensagem exatamente como veio, com o contato do suporte da Arcane, e pare. Não improvisar, não tentar de novo, não usar memória.
11
+ Se a tool recusar (acesso vencido, cancelado, suspenso ou encerrado) ou falhar: confira se existe `agents/ops/OPS-LOCAL.md` no disco (é o Bootstrap completo que morava no computador do aluno antes da migração; o instalador guarda ele ali). Se existir, avise em UMA linha — "O servidor não liberou o conteúdo ao vivo; seguindo com o Bootstrap que já está no seu computador." — e siga por esse arquivo como fonte da verdade, mostrando a mensagem do servidor junto. Se não existir, mostre a mensagem exatamente como veio, com o contato do suporte da Arcane, e pare. Nunca improvisar de memória, nunca tentar de novo sozinho. O que já estava no computador do aluno antes da migração continua dele.
12
12
 
13
- **Migração (se você chegou aqui pelo `*update-auroq` de uma versão instalada antiga, procurando a lista ATUALIZA):** este arquivo não carrega mais a lista. NÃO chame a tool do MCP (o projeto antigo ainda não tem esse registro). ANTES de qualquer coisa, consentimento explícito — no sistema antigo os agentes moram no disco do expert; depois da migração o conteúdo deles chega ao vivo do servidor e só responde com acesso ativo. Explicar isso em linguagem comum ("seus dados, memórias e squads criados ficam intactos; os agentes da mentoria passam a exigir acesso ativo") e SÓ seguir com um SIM explícito — sem o SIM, parar aqui e nada é alterado. Com o SIM: rodar `node /tmp/auroq-update/package/bin/auroq-os.js init` na raiz do projeto — ele sobrescreve só o framework, preserva os dados do expert e registra o conteúdo ao vivo (`.mcp.json` + `.codex/config.toml`). Depois: `npx auroq-os doctor`, e avise o expert pra FECHAR e abrir o Claude Code/Codex uma vez.
13
+ **Migração (se você chegou aqui pelo `*update-auroq` de uma versão instalada antiga, procurando a lista ATUALIZA):** este arquivo não carrega mais a lista. NÃO chame a tool do MCP (o projeto antigo ainda não tem esse registro). ANTES de qualquer coisa, consentimento explícito — no sistema antigo os agentes moram no disco do expert; depois da migração o conteúdo deles chega ao vivo do servidor e só responde com acesso ativo. Explicar isso em linguagem comum ("seus dados, memórias e squads criados ficam intactos; os agentes da mentoria passam a chegar ao vivo enquanto o acesso estiver ativo e, se o acesso acabar, voltam a rodar do que já está no seu computador") e SÓ seguir com um SIM explícito — sem o SIM, parar aqui e nada é alterado. Com o SIM: rodar `node /tmp/auroq-update/package/bin/auroq-os.js init` na raiz do projeto — ele sobrescreve só o framework, preserva os dados do expert e registra o conteúdo ao vivo (`.mcp.json` + `.codex/config.toml`). Depois: `npx auroq-os doctor`, e avise o expert pra FECHAR e abrir o Claude Code/Codex uma vez.
14
14
 
15
- CRITICAL: Do not treat this file as the Bootstrap. Use the MCP `arcane` tools.
15
+ CRITICAL: Do not treat this file as the Bootstrap. Use the MCP `arcane` tools; fall back to `agents/ops/OPS-LOCAL.md` only after the MCP refused or failed and that file exists.
@@ -2,10 +2,10 @@
2
2
 
3
3
  Clona mentes reais em agentes digitais.
4
4
 
5
- Todo conteúdo desta forja vem pelo MCP `arcane` (catálogo `auroq-core`). Chame a tool `forja_bundle` com forge_id `clone-forge` e a fase atual. Nunca procurar arquivo local desta forja; se a tool falhar, mostrar a mensagem e parar — não improvisar de memória.
5
+ Todo conteúdo desta forja vem pelo MCP `arcane` (catálogo `auroq-core`). Chame a tool `forja_bundle` com forge_id `clone-forge` e a fase atual. Enquanto o servidor responder, nunca procurar arquivo local desta forja.
6
6
 
7
7
  Ao ativar, mostre o selo de acesso que a tool devolver (as duas primeiras linhas) antes de qualquer outra coisa — é como o aluno vê que a licença dele foi conferida agora.
8
8
 
9
- Se a tool recusar (acesso vencido, cancelado ou suspenso), mostre a mensagem exatamente como veio, com o contato do suporte da Arcane, e pare. Não improvisar, não tentar de novo, não usar memória.
9
+ Se a tool recusar (acesso vencido, cancelado, suspenso ou encerrado) ou falhar: confira se a pasta `agents/clone-forge/` existe no disco com arquivos. Se existir, avise em UMA linha — "O servidor não liberou o conteúdo ao vivo; seguindo com a versão que já está no seu computador." — e siga com o conteúdo dessa pasta como fonte da verdade, mostrando a mensagem do servidor junto. Se não existir, mostre a mensagem exatamente como veio, com o contato do suporte da Arcane, e pare. Nunca improvisar de memória, nunca tentar de novo sozinho. O que já estava no computador do aluno antes da migração continua dele.
10
10
 
11
- CRITICAL: Do not read `agents/clone-forge/**`. Use the MCP `arcane` tools.
11
+ CRITICAL: While the MCP `arcane` answers, do not read `agents/clone-forge/**`. Read that folder only after the MCP refused or failed and it exists on disk.
@@ -2,10 +2,10 @@
2
2
 
3
3
  Parceiro cognitivo pessoal. Situa, lembra, pensa junto, roteia.
4
4
 
5
- Todo conteúdo deste agente vem pelo MCP `arcane` (catálogo `auroq-core`). Chame a tool `squad_ativar` com recurso_id `companion`. Nunca procurar arquivo local deste agente; se a tool falhar, mostrar a mensagem e parar — não improvisar de memória.
5
+ Todo conteúdo deste agente vem pelo MCP `arcane` (catálogo `auroq-core`). Chame a tool `squad_ativar` com recurso_id `companion`. Enquanto o servidor responder, nunca procurar arquivo local deste agente.
6
6
 
7
7
  Ao ativar, mostre o selo de acesso que a tool devolver (as duas primeiras linhas) antes de qualquer outra coisa — é como o aluno vê que a licença dele foi conferida agora.
8
8
 
9
- Se a tool recusar (acesso vencido, cancelado ou suspenso), mostre a mensagem exatamente como veio, com o contato do suporte da Arcane, e pare. Não improvisar, não tentar de novo, não usar memória.
9
+ Se a tool recusar (acesso vencido, cancelado, suspenso ou encerrado) ou falhar: confira se a pasta `agents/companion/` existe no disco com arquivos. Se existir, avise em UMA linha — "O servidor não liberou o conteúdo ao vivo; seguindo com a versão que já está no seu computador." — e siga com o conteúdo dessa pasta como fonte da verdade, mostrando a mensagem do servidor junto. Se não existir, mostre a mensagem exatamente como veio, com o contato do suporte da Arcane, e pare. Nunca improvisar de memória, nunca tentar de novo sozinho. O que já estava no computador do aluno antes da migração continua dele.
10
10
 
11
- CRITICAL: Do not read `agents/companion/**`. Use the MCP `arcane` tools.
11
+ CRITICAL: While the MCP `arcane` answers, do not read `agents/companion/**`. Read that folder only after the MCP refused or failed and it exists on disk.
@@ -2,10 +2,10 @@
2
2
 
3
3
  Guia vivo do Auroq OS. Tira dúvidas, ensina e destrava o aluno.
4
4
 
5
- Todo conteúdo deste agente vem pelo MCP `arcane` (catálogo `auroq-core`). Chame a tool `squad_ativar` com recurso_id `consultor`. Nunca procurar arquivo local deste agente; se a tool falhar, mostrar a mensagem e parar — não improvisar de memória.
5
+ Todo conteúdo deste agente vem pelo MCP `arcane` (catálogo `auroq-core`). Chame a tool `squad_ativar` com recurso_id `consultor`. Enquanto o servidor responder, nunca procurar arquivo local deste agente.
6
6
 
7
7
  Ao ativar, mostre o selo de acesso que a tool devolver (as duas primeiras linhas) antes de qualquer outra coisa — é como o aluno vê que a licença dele foi conferida agora.
8
8
 
9
- Se a tool recusar (acesso vencido, cancelado ou suspenso), mostre a mensagem exatamente como veio, com o contato do suporte da Arcane, e pare. Não improvisar, não tentar de novo, não usar memória.
9
+ Se a tool recusar (acesso vencido, cancelado, suspenso ou encerrado) ou falhar: confira se a pasta `agents/consultor/` existe no disco com arquivos. Se existir, avise em UMA linha — "O servidor não liberou o conteúdo ao vivo; seguindo com a versão que já está no seu computador." — e siga com o conteúdo dessa pasta como fonte da verdade, mostrando a mensagem do servidor junto. Se não existir, mostre a mensagem exatamente como veio, com o contato do suporte da Arcane, e pare. Nunca improvisar de memória, nunca tentar de novo sozinho. O que já estava no computador do aluno antes da migração continua dele.
10
10
 
11
- CRITICAL: Do not read `agents/consultor/**`. Use the MCP `arcane` tools.
11
+ CRITICAL: While the MCP `arcane` answers, do not read `agents/consultor/**`. Read that folder only after the MCP refused or failed and it exists on disk.
@@ -2,10 +2,10 @@
2
2
 
3
3
  Extrai conhecimento de fontes brutas e estrutura em knowledge bases.
4
4
 
5
- Todo conteúdo desta forja vem pelo MCP `arcane` (catálogo `auroq-core`). Chame a tool `forja_bundle` com forge_id `etlmaker` e a fase atual. Nunca procurar arquivo local desta forja; se a tool falhar, mostrar a mensagem e parar — não improvisar de memória.
5
+ Todo conteúdo desta forja vem pelo MCP `arcane` (catálogo `auroq-core`). Chame a tool `forja_bundle` com forge_id `etlmaker` e a fase atual. Enquanto o servidor responder, nunca procurar arquivo local desta forja.
6
6
 
7
7
  Ao ativar, mostre o selo de acesso que a tool devolver (as duas primeiras linhas) antes de qualquer outra coisa — é como o aluno vê que a licença dele foi conferida agora.
8
8
 
9
- Se a tool recusar (acesso vencido, cancelado ou suspenso), mostre a mensagem exatamente como veio, com o contato do suporte da Arcane, e pare. Não improvisar, não tentar de novo, não usar memória.
9
+ Se a tool recusar (acesso vencido, cancelado, suspenso ou encerrado) ou falhar: confira se a pasta `agents/etlmaker/` existe no disco com arquivos. Se existir, avise em UMA linha — "O servidor não liberou o conteúdo ao vivo; seguindo com a versão que já está no seu computador." — e siga com o conteúdo dessa pasta como fonte da verdade, mostrando a mensagem do servidor junto. Se não existir, mostre a mensagem exatamente como veio, com o contato do suporte da Arcane, e pare. Nunca improvisar de memória, nunca tentar de novo sozinho. O que já estava no computador do aluno antes da migração continua dele.
10
10
 
11
- CRITICAL: Do not read `agents/etlmaker/**`. Use the MCP `arcane` tools.
11
+ CRITICAL: While the MCP `arcane` answers, do not read `agents/etlmaker/**`. Read that folder only after the MCP refused or failed and it exists on disk.
@@ -2,10 +2,10 @@
2
2
 
3
3
  Fábrica de mentes sintéticas e consultores.
4
4
 
5
- Todo conteúdo desta forja vem pelo MCP `arcane` (catálogo `auroq-core`). Chame a tool `forja_bundle` com forge_id `mind-forge` e a fase atual. Nunca procurar arquivo local desta forja; se a tool falhar, mostrar a mensagem e parar — não improvisar de memória.
5
+ Todo conteúdo desta forja vem pelo MCP `arcane` (catálogo `auroq-core`). Chame a tool `forja_bundle` com forge_id `mind-forge` e a fase atual. Enquanto o servidor responder, nunca procurar arquivo local desta forja.
6
6
 
7
7
  Ao ativar, mostre o selo de acesso que a tool devolver (as duas primeiras linhas) antes de qualquer outra coisa — é como o aluno vê que a licença dele foi conferida agora.
8
8
 
9
- Se a tool recusar (acesso vencido, cancelado ou suspenso), mostre a mensagem exatamente como veio, com o contato do suporte da Arcane, e pare. Não improvisar, não tentar de novo, não usar memória.
9
+ Se a tool recusar (acesso vencido, cancelado, suspenso ou encerrado) ou falhar: confira se a pasta `agents/mind-forge/` existe no disco com arquivos. Se existir, avise em UMA linha — "O servidor não liberou o conteúdo ao vivo; seguindo com a versão que já está no seu computador." — e siga com o conteúdo dessa pasta como fonte da verdade, mostrando a mensagem do servidor junto. Se não existir, mostre a mensagem exatamente como veio, com o contato do suporte da Arcane, e pare. Nunca improvisar de memória, nunca tentar de novo sozinho. O que já estava no computador do aluno antes da migração continua dele.
10
10
 
11
- CRITICAL: Do not read `agents/mind-forge/**`. Use the MCP `arcane` tools.
11
+ CRITICAL: While the MCP `arcane` answers, do not read `agents/mind-forge/**`. Read that folder only after the MCP refused or failed and it exists on disk.
@@ -2,10 +2,10 @@
2
2
 
3
3
  Cria squads multi-agente a partir dos seus processos.
4
4
 
5
- Todo conteúdo desta forja vem pelo MCP `arcane` (catálogo `auroq-core`). Chame a tool `forja_bundle` com forge_id `squad-forge` e a fase atual. Nunca procurar arquivo local desta forja; se a tool falhar, mostrar a mensagem e parar — não improvisar de memória.
5
+ Todo conteúdo desta forja vem pelo MCP `arcane` (catálogo `auroq-core`). Chame a tool `forja_bundle` com forge_id `squad-forge` e a fase atual. Enquanto o servidor responder, nunca procurar arquivo local desta forja.
6
6
 
7
7
  Ao ativar, mostre o selo de acesso que a tool devolver (as duas primeiras linhas) antes de qualquer outra coisa — é como o aluno vê que a licença dele foi conferida agora.
8
8
 
9
- Se a tool recusar (acesso vencido, cancelado ou suspenso), mostre a mensagem exatamente como veio, com o contato do suporte da Arcane, e pare. Não improvisar, não tentar de novo, não usar memória.
9
+ Se a tool recusar (acesso vencido, cancelado, suspenso ou encerrado) ou falhar: confira se a pasta `agents/squad-forge/` existe no disco com arquivos. Se existir, avise em UMA linha — "O servidor não liberou o conteúdo ao vivo; seguindo com a versão que já está no seu computador." — e siga com o conteúdo dessa pasta como fonte da verdade, mostrando a mensagem do servidor junto. Se não existir, mostre a mensagem exatamente como veio, com o contato do suporte da Arcane, e pare. Nunca improvisar de memória, nunca tentar de novo sozinho. O que já estava no computador do aluno antes da migração continua dele.
10
10
 
11
- CRITICAL: Do not read `agents/squad-forge/**`. Use the MCP `arcane` tools.
11
+ CRITICAL: While the MCP `arcane` answers, do not read `agents/squad-forge/**`. Read that folder only after the MCP refused or failed and it exists on disk.
@@ -2,10 +2,10 @@
2
2
 
3
3
  Cria workers especializados para automação e operações.
4
4
 
5
- Todo conteúdo desta forja vem pelo MCP `arcane` (catálogo `auroq-core`). Chame a tool `forja_bundle` com forge_id `worker-forge` e a fase atual. Nunca procurar arquivo local desta forja; se a tool falhar, mostrar a mensagem e parar — não improvisar de memória.
5
+ Todo conteúdo desta forja vem pelo MCP `arcane` (catálogo `auroq-core`). Chame a tool `forja_bundle` com forge_id `worker-forge` e a fase atual. Enquanto o servidor responder, nunca procurar arquivo local desta forja.
6
6
 
7
7
  Ao ativar, mostre o selo de acesso que a tool devolver (as duas primeiras linhas) antes de qualquer outra coisa — é como o aluno vê que a licença dele foi conferida agora.
8
8
 
9
- Se a tool recusar (acesso vencido, cancelado ou suspenso), mostre a mensagem exatamente como veio, com o contato do suporte da Arcane, e pare. Não improvisar, não tentar de novo, não usar memória.
9
+ Se a tool recusar (acesso vencido, cancelado, suspenso ou encerrado) ou falhar: confira se a pasta `agents/worker-forge/` existe no disco com arquivos. Se existir, avise em UMA linha — "O servidor não liberou o conteúdo ao vivo; seguindo com a versão que já está no seu computador." — e siga com o conteúdo dessa pasta como fonte da verdade, mostrando a mensagem do servidor junto. Se não existir, mostre a mensagem exatamente como veio, com o contato do suporte da Arcane, e pare. Nunca improvisar de memória, nunca tentar de novo sozinho. O que já estava no computador do aluno antes da migração continua dele.
10
10
 
11
- CRITICAL: Do not read `agents/worker-forge/**`. Use the MCP `arcane` tools.
11
+ CRITICAL: While the MCP `arcane` answers, do not read `agents/worker-forge/**`. Read that folder only after the MCP refused or failed and it exists on disk.
@@ -1,6 +1,6 @@
1
1
  # MCP Usage — Auroq OS
2
2
 
3
- > Carve-out Arcane: conteúdo licenciado (Companion interno, Consultor, forjas, Pack) vem **sempre** pelo MCP `arcane`, nunca do disco. Esta regra vence a preferência genérica por ferramentas nativas **só nesse conteúdo**.
3
+ > Carve-out Arcane: conteúdo licenciado (Companion interno, Consultor, forjas, Pack) vem pelo MCP `arcane` **enquanto o servidor responder**. Esta regra vence a preferência genérica por ferramentas nativas **só nesse conteúdo**. Única exceção: o servidor recusou (acesso vencido, cancelado, suspenso, encerrado) ou falhou **e** a pasta do agente existe em `agents/` — aí o conteúdo local vale, com aviso de uma linha ao aluno. O que já estava no computador dele antes da migração continua dele.
4
4
 
5
5
  ## Prioridade de Ferramentas
6
6
 
@@ -8,7 +8,7 @@ SEMPRE preferir ferramentas nativas do Claude Code sobre MCP, **exceto** conteú
8
8
 
9
9
  | Task | USAR | NAO USAR |
10
10
  |------|------|----------|
11
- | Conteúdo Arcane (persona, KB, forja, Pack) | MCP `arcane` | Read/Grep em `agents/` |
11
+ | Conteúdo Arcane (persona, KB, forja, Pack) | MCP `arcane` (servidor negou/falhou e `agents/<x>/` existe → disco, avisando) | Read/Grep em `agents/` enquanto o MCP responde |
12
12
  | Ler arquivos do ALUNO (memória, docs, cockpit) | `Read` tool | MCP servers |
13
13
  | Escrever arquivos | `Write` / `Edit` tools | MCP servers |
14
14
  | Rodar comandos | `Bash` tool | MCP servers |
@@ -27,4 +27,4 @@ Outros agentes sao **consumidores** de MCP, nao administradores. Se precisar de
27
27
  3. Playwright nos cenarios tecnicos
28
28
  4. Ferramentas externas sem equivalente nativo
29
29
 
30
- Se a tool `arcane` falhar: mostrar a mensagem e parar. Nao improvisar de memoria.
30
+ Se a tool `arcane` recusar ou falhar: a pasta do agente existe em `agents/`? Sim → avisar em uma linha e seguir pelo disco. Não → mostrar a mensagem e parar. Nunca improvisar de memoria.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,61 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.4.16] — 2026-09-04
4
+
5
+ ### Codex no Windows: conteudo ao vivo abria, mas "Sem conexao com o servidor da Arcane" (EMB-028)
6
+ Aluna no Windows, depois do 2.4.15, entrou no Codex sem timeout — e ao chamar o Ops leu "Sem
7
+ conexao com o servidor da Arcane" com internet normal. Causa: o Codex abre o MCP com um ambiente
8
+ minimo (so PATH, PATHEXT, USERNAME, USERDOMAIN, USERPROFILE, TEMP, TMP) e deixa de fora
9
+ `SystemRoot`, `APPDATA`, `COMSPEC`... Sem `SystemRoot` o Node no Windows pode nao resolver DNS
10
+ (openai/codex#4180, #3311). Hipotese: o runner do CI nao reproduziu a falha. Por isso o pacote
11
+ tambem passa a MOSTRAR o motivo tecnico — e o que fecha o diagnostico.
12
+
13
+ - **Registro do Codex** passa os valores reais da maquina (`SystemRoot`, `windir`, `COMSPEC`,
14
+ `APPDATA`, `LOCALAPPDATA`, `ProgramData`, `ProgramFiles`, `HOMEDRIVE`, `HOMEPATH`,
15
+ `USERPROFILE`, `TEMP`, `TMP`) no bloco `[mcp_servers.arcane]`; so no Windows.
16
+ - **`arcane-mcp@0.4.1`** (pin novo): a falha de rede diz o motivo tecnico (ex.: `EAI_FAIL`) e
17
+ ganhou `npx -y arcane-mcp@0.4.1 verify`, que prova a conexao a partir do mesmo programa que o
18
+ Codex abre.
19
+ - Quem ja instalou: "atualiza o sistema" pelo Ops, ou `npx auroq-os@latest register-mcp` na pasta,
20
+ e FECHAR e abrir o Codex.
21
+
22
+ ## [2.4.15] — 2026-09-03
23
+
24
+ ### Aluno antigo migrado cai pro disco quando o servidor recusa (EMB-019, conserto)
25
+ Aluno antigo com contrato ativo leu no proprio Claude que "uma vez que nao esteja ativo, nao
26
+ vai mais usar os squads que ja tinha" — porque as cascas mandavam parar em qualquer recusa e
27
+ proibiam ler `agents/`. Contradizia a regra do Euriler (29/08): o que ja estava no computador
28
+ do aluno continua dele.
29
+
30
+ - **Cascas** (Companion, Consultor, 5 forjas, Ops) e a rule `mcp-usage.md`: enquanto o
31
+ servidor responder, nada muda. Se recusar ou falhar **e** a pasta do agente existir em
32
+ `agents/`, o atalho avisa em uma linha e segue pelo disco. Sem pasta, mostra a mensagem e para.
33
+ - **Migracao guarda o Bootstrap antigo:** antes de trocar o `ops.md` completo pela casca, o
34
+ `init` copia o original pra `agents/ops/OPS-LOCAL.md` (nunca sobrescreve um que ja exista). E
35
+ esse arquivo que o `/ops` usa quando o servidor recusa.
36
+ - **Consentimento da migracao** (casca e Ops servido) passa a dizer que, se o acesso acabar, os
37
+ agentes voltam a rodar do computador — nada e apagado.
38
+ - Do lado do Pack: `arcane-pack@1.4.2` gera os atalhos dos squads com a mesma queda pro disco;
39
+ a mensagem de recusa do servidor avisa que a versao local continua valendo.
40
+
41
+ ## [2.4.14] — 2026-09-03
42
+
43
+ ### Conteudo ao vivo dava "timeout" toda vez que o Codex abria (Windows)
44
+ Aluna com acesso ativo, `doctor` limpo, MCP registrado e servidor respondendo — e mesmo assim o
45
+ Codex desistia do MCP arcane em toda abertura. Medido num Windows limpo: a PRIMEIRA abertura do
46
+ `npx -y arcane-mcp@0.4.0` leva 48-59s (download + antivirus), as seguintes ~2s. O Codex espera 10s
47
+ (o Claude Code, 30s) e mata o processo antes de terminar. O `doctor` nao via nada porque so
48
+ conferia o registro, e o `npx arcane-mcp whoami` que a aluna rodava aquecia OUTRO cache (sem a
49
+ versao fixa). Com a correcao, medido no mesmo Windows: 1,4-2,2s.
50
+
51
+ - **Registro do Codex** ganha `startup_timeout_sec = 120`; `register-mcp` e `update` reescrevem o
52
+ bloco antigo (o resto do `config.toml` fica como estava).
53
+ - **`init`, `update` e `register-mcp`** baixam o pacote uma vez, com o mesmo nome do registro, antes
54
+ do aluno abrir o Codex ou o Claude Code.
55
+ - **`doctor`** abre o conteudo ao vivo de verdade e mede: acima de 9s, aponta o `register-mcp`;
56
+ registro do Codex sem o tempo de espera vira problema listado.
57
+ - Quem ja instalou: "atualiza o sistema" pelo Ops resolve; ou `npx auroq-os register-mcp` na pasta.
58
+
3
59
  ## [2.4.13] — 2026-09-03
4
60
 
5
61
  ### Squad Edicao ativava, mas nao tinha script nenhum no computador
package/bin/auroq-os.js CHANGED
@@ -332,10 +332,16 @@ async function runDoctor(targetDir) {
332
332
  problemas.push('Rode: npx auroq-os register-mcp (reescreve o registro). Depois feche e abra o Claude Code.');
333
333
  }
334
334
  const tomlPath = path.join(targetDir, '.codex', 'config.toml');
335
- const temToml = (await fs.pathExists(tomlPath)) &&
336
- (await fs.readFile(tomlPath, 'utf8')).includes('[mcp_servers.arcane]');
337
- if (temToml) success('MCP arcane registrado no Codex');
338
- else log(` ${DIM}MCP arcane ainda nao registrado no Codex (so importa se voce usa o Codex)${RESET}`);
335
+ const tomlTexto = (await fs.pathExists(tomlPath)) ? await fs.readFile(tomlPath, 'utf8') : '';
336
+ const temToml = tomlTexto.includes('[mcp_servers.arcane]');
337
+ if (temToml && tomlTexto.includes('startup_timeout_sec')) {
338
+ success('MCP arcane registrado no Codex');
339
+ } else if (temToml) {
340
+ error('O registro do Codex esta sem o tempo de espera — a primeira abertura pode cair');
341
+ problemas.push('Rode: npx auroq-os register-mcp (reescreve o registro com o tempo certo). Depois feche e abra o Codex.');
342
+ } else {
343
+ log(` ${DIM}MCP arcane ainda nao registrado no Codex (so importa se voce usa o Codex)${RESET}`);
344
+ }
339
345
 
340
346
  // 4. login e licenca — o unico jeito de saber se o conteudo vai chegar
341
347
  const credPath = path.join(require('os').homedir(), '.arcane', 'credentials.json');
@@ -366,6 +372,24 @@ async function runDoctor(targetDir) {
366
372
  problemas.push('Confira sua internet. Sem servidor, o conteudo ao vivo nao chega — o resto do Auroq continua.');
367
373
  }
368
374
 
375
+ // 6. o conteudo ao vivo SOBE a tempo? (EMB-027: registro certo, servidor no ar, e mesmo
376
+ // assim o Codex/Claude Code desistiam antes do pacote terminar de baixar)
377
+ const semArranque = process.env.NODE_ENV === 'test' && process.env.AUROQ_SKIP_AUTH === '1';
378
+ if (pin && !semArranque) {
379
+ log(` ${DIM}Abrindo o conteudo ao vivo pra medir (na primeira vez pode levar 1-2 min)...${RESET}`);
380
+ aquecerArcaneMcp();
381
+ const ms = await medirArranqueArcaneMcp(pin);
382
+ if (ms === null) {
383
+ error('O conteudo ao vivo nao abriu nesta janela');
384
+ problemas.push(`Rode: npx -y ${pin} whoami — se der erro, mande o print pro suporte.`);
385
+ } else if (ms > MCP_ARRANQUE_LIMITE_MS) {
386
+ error(`O conteudo ao vivo levou ${(ms / 1000).toFixed(0)}s pra abrir; o Codex espera 10s`);
387
+ problemas.push('Rode: npx auroq-os register-mcp (da mais tempo ao Codex). Depois feche e abra o Codex.');
388
+ } else {
389
+ success(`Conteudo ao vivo abre em ${(ms / 1000).toFixed(1)}s`);
390
+ }
391
+ }
392
+
369
393
  log('');
370
394
  if (problemas.length === 0) {
371
395
  success('Tudo certo. Pode chamar o Companion.');
@@ -378,8 +402,128 @@ async function runDoctor(targetDir) {
378
402
  return 1;
379
403
  }
380
404
 
405
+ // Conteudo ao vivo (MCP arcane). O pacote e baixado pelo npx na PRIMEIRA abertura:
406
+ // medido num Windows limpo em 03/09/2026, 52s a frio e 2s a quente. O Codex espera
407
+ // 10s e o Claude Code 30s antes de matar o processo (EMB-027). Num Windows limpo com
408
+ // internet rapida, tentativas mortas aos 10s ainda somam progresso; na maquina do aluno
409
+ // (rede domestica + antivirus) a aluna viu timeout em todas as que fez. Por isso:
410
+ // (1) o registro do Codex pede mais tempo, (2) instalacao/atualizacao ja baixam o
411
+ // pacote, (3) o doctor mede o arranque de verdade em vez de so olhar o registro.
412
+ const ARCANE_MCP_PIN = 'arcane-mcp@0.4.1';
413
+ const CODEX_MCP_STARTUP_SEC = 120;
414
+ const MCP_ARRANQUE_LIMITE_MS = 9000; // abaixo do que o Codex tolera (10s)
415
+
416
+ // No Windows o Codex abre o MCP com um ambiente minimo (PATH, USERNAME, USERPROFILE,
417
+ // TEMP...) e deixa de fora SystemRoot, APPDATA, COMSPEC etc. Sem SystemRoot o Node nao
418
+ // resolve DNS (EAI_FAIL) e o aluno le "Sem conexao com o servidor da Arcane" mesmo com
419
+ // internet — openai/codex#4180 e #3311. Passamos os valores reais da maquina no registro.
420
+ const CODEX_ENV_WINDOWS = [
421
+ 'SystemRoot', 'windir', 'COMSPEC', 'SystemDrive', 'APPDATA', 'LOCALAPPDATA',
422
+ 'ProgramData', 'ProgramFiles', 'HOMEDRIVE', 'HOMEPATH', 'USERPROFILE', 'TEMP', 'TMP',
423
+ ];
424
+
425
+ function envCodexArcane({ plataforma = process.platform, env = process.env } = {}) {
426
+ if (plataforma !== 'win32') return null;
427
+ const pares = [];
428
+ for (const nome of CODEX_ENV_WINDOWS) {
429
+ const chave = Object.keys(env).find(k => k.toLowerCase() === nome.toLowerCase());
430
+ const valor = chave ? env[chave] : '';
431
+ if (!valor || valor.includes("'") || /[\r\n]/.test(valor)) continue;
432
+ pares.push(`${nome} = '${valor}'`); // string literal do TOML: barra invertida sem escape
433
+ }
434
+ return pares.length ? `env = { ${pares.join(', ')} }` : null;
435
+ }
436
+
437
+ function blocoCodexArcane(pin, opcoes) {
438
+ const env = envCodexArcane(opcoes);
439
+ return [
440
+ '[mcp_servers.arcane]',
441
+ 'command = "npx"',
442
+ `args = ["-y", "${pin}"]`,
443
+ '# Primeira abertura baixa o pacote (ate 1-2 min no Windows); o padrao do Codex sao 10s.',
444
+ `startup_timeout_sec = ${CODEX_MCP_STARTUP_SEC}`,
445
+ ...(env ? ['# Codex no Windows abre o MCP sem as variaveis basicas do sistema; sem elas nao ha DNS.', env] : []),
446
+ '',
447
+ ].join('\n');
448
+ }
449
+
450
+ // Baixa o pacote do conteudo ao vivo com o MESMO nome que o registro usa (o cache do
451
+ // npx e por nome+versao: `arcane-mcp` e `arcane-mcp@0.4.1` sao caches diferentes).
452
+ function aquecerArcaneMcp() {
453
+ if (process.env.NODE_ENV === 'test' && process.env.AUROQ_SKIP_AUTH === '1') return true;
454
+ try {
455
+ execFileSync('npx', ['-y', ARCANE_MCP_PIN, 'whoami'], {
456
+ stdio: 'pipe', timeout: 240000, shell: process.platform === 'win32',
457
+ });
458
+ return true;
459
+ } catch {
460
+ return false;
461
+ }
462
+ }
463
+
464
+ // Abre o conteudo ao vivo do jeito que o Codex/Claude Code abrem e mede quanto tempo
465
+ // ele leva pra responder ao aperto de mao. Devolve ms, ou null se nao respondeu.
466
+ function medirArranqueArcaneMcp(pin, limiteMs = 180000) {
467
+ return new Promise((resolve) => {
468
+ const { spawn } = require('child_process');
469
+ const t0 = Date.now();
470
+ let saida = '';
471
+ let fim = false;
472
+ let processo;
473
+ const fecha = (ms) => {
474
+ if (fim) return;
475
+ fim = true;
476
+ clearTimeout(timer);
477
+ try { processo.kill(); } catch { /* ja morreu */ }
478
+ resolve(ms);
479
+ };
480
+ const timer = setTimeout(() => fecha(null), limiteMs);
481
+ try {
482
+ processo = spawn('npx', ['-y', pin], {
483
+ stdio: ['pipe', 'pipe', 'pipe'], shell: process.platform === 'win32',
484
+ });
485
+ } catch {
486
+ clearTimeout(timer);
487
+ resolve(null);
488
+ return;
489
+ }
490
+ processo.stdout.on('data', (d) => {
491
+ saida += d.toString();
492
+ if (saida.includes('"serverInfo"')) fecha(Date.now() - t0);
493
+ });
494
+ processo.stderr.on('data', () => {});
495
+ processo.on('exit', () => fecha(null));
496
+ processo.on('error', () => fecha(null));
497
+ const pedido = {
498
+ jsonrpc: '2.0', id: 1, method: 'initialize',
499
+ params: { protocolVersion: '2024-11-05', capabilities: {}, clientInfo: { name: 'auroq-doctor', version: '0' } },
500
+ };
501
+ try { processo.stdin.write(`${JSON.stringify(pedido)}\n`); } catch { fecha(null); }
502
+ });
503
+ }
504
+
505
+ // Aluno antigo tem o Bootstrap completo em `.claude/commands/AuroqOS/agents/ops.md`.
506
+ // A migracao troca esse arquivo pela casca (ponteiro pro MCP). Sem guardar o original,
507
+ // o Ops dele morre junto com o acesso — e a regra do Euriler (29/08) e que o que ja
508
+ // estava no computador continua dele. A casca do Ops cai pra este arquivo quando o
509
+ // servidor recusa (EMB-019). Nunca sobrescreve um OPS-LOCAL.md que ja exista.
510
+ async function guardarBootstrapLocal(targetDir, file, dst, dstExists) {
511
+ if (file !== '.claude/commands/AuroqOS/agents/ops.md' || !dstExists) return false;
512
+ let atual = '';
513
+ try { atual = await fs.readFile(dst, 'utf8'); } catch { return false; }
514
+ const eCasca = atual.includes('vem pelo MCP') || atual.length < 8000;
515
+ if (eCasca) return false;
516
+ const alvo = path.join(targetDir, 'agents', 'ops', 'OPS-LOCAL.md');
517
+ if (await fs.pathExists(alvo)) return false;
518
+ await fs.ensureDir(path.dirname(alvo));
519
+ const cabecalho = '<!-- Bootstrap completo que morava neste computador antes da migracao pro conteudo ao vivo. O atalho /ops usa este arquivo quando o servidor recusa o acesso. -->\n\n';
520
+ await fs.writeFile(alvo, cabecalho + atual);
521
+ success('Bootstrap antigo guardado em agents/ops/OPS-LOCAL.md (usado se o acesso acabar)');
522
+ return true;
523
+ }
524
+
381
525
  async function writeArcaneMcpConfig(targetDir) {
382
- const pin = 'arcane-mcp@0.4.0';
526
+ const pin = ARCANE_MCP_PIN;
383
527
  const mcpPath = path.join(targetDir, '.mcp.json');
384
528
  let json = { mcpServers: {} };
385
529
  if (await fs.pathExists(mcpPath)) {
@@ -391,10 +535,14 @@ async function writeArcaneMcpConfig(targetDir) {
391
535
 
392
536
  const tomlPath = path.join(targetDir, '.codex', 'config.toml');
393
537
  await fs.ensureDir(path.dirname(tomlPath));
394
- const block = `[mcp_servers.arcane]\ncommand = "npx"\nargs = ["-y", "${pin}"]\n`;
538
+ const block = blocoCodexArcane(pin);
395
539
  let toml = '';
396
540
  if (await fs.pathExists(tomlPath)) toml = await fs.readFile(tomlPath, 'utf8');
397
- if (!toml.includes('[mcp_servers.arcane]')) {
541
+ if (toml.includes('[mcp_servers.arcane]')) {
542
+ // Reescreve o bloco (registro antigo nao tinha o tempo de espera); o resto do arquivo fica.
543
+ const semBloco = toml.replace(/\[mcp_servers\.arcane\][\s\S]*?(?=\n\[|$(?![\s\S]))/, block.trimEnd());
544
+ if (semBloco !== toml) await fs.writeFile(tomlPath, semBloco.endsWith('\n') ? semBloco : `${semBloco}\n`);
545
+ } else {
398
546
  const next = (toml.trimEnd() ? `${toml.trimEnd()}\n\n` : '') + block;
399
547
  await fs.writeFile(tomlPath, next);
400
548
  }
@@ -785,6 +933,7 @@ async function init({ pasta = null } = {}) {
785
933
  if (isStudentFile && dstExists) {
786
934
  // Nao sobrescrever dados do aluno
787
935
  } else {
936
+ await guardarBootstrapLocal(targetDir, file, dst, dstExists);
788
937
  await fs.copy(src, dst, { overwrite: true });
789
938
  }
790
939
  copied++;
@@ -822,6 +971,9 @@ async function init({ pasta = null } = {}) {
822
971
  }
823
972
  await patchEnableAllProjectMcpServers(targetDir);
824
973
  await writeArcaneMcpConfig(targetDir);
974
+ step('Preparando o conteudo ao vivo (baixa uma vez; pode levar 1-2 min)...');
975
+ if (aquecerArcaneMcp()) success('Conteudo ao vivo pronto pra abrir rapido');
976
+ else warn('Nao consegui baixar o conteudo ao vivo agora — a primeira abertura vai demorar mais');
825
977
 
826
978
  // ─── Fase 4: Copiar Synapse Engine
827
979
  step('Instalando Synapse Engine...');
@@ -1097,6 +1249,9 @@ async function clone(repoArg) {
1097
1249
  }
1098
1250
 
1099
1251
  await writeArcaneMcpConfig(destDir);
1252
+ step('Preparando o conteudo ao vivo (baixa uma vez; pode levar 1-2 min)...');
1253
+ if (aquecerArcaneMcp()) success('Conteudo ao vivo pronto pra abrir rapido');
1254
+ else warn('Nao consegui baixar o conteudo ao vivo agora — a primeira abertura vai demorar mais');
1100
1255
 
1101
1256
  // ─── Fase 8: Health check
1102
1257
  step('Verificando integridade...');
@@ -1216,6 +1371,9 @@ if (command === 'init' || command === 'install') {
1216
1371
  await patchEnableAllProjectMcpServers(targetDir);
1217
1372
  await writeArcaneMcpConfig(targetDir);
1218
1373
  success('Conteudo ao vivo registrado (.mcp.json e .codex/config.toml).');
1374
+ log(`${DIM}Baixando o conteudo ao vivo uma vez (pode levar 1-2 min)...${RESET}`);
1375
+ if (aquecerArcaneMcp()) success('Conteudo ao vivo pronto pra abrir rapido');
1376
+ else warn('Nao consegui baixar o conteudo ao vivo agora — a primeira abertura vai demorar mais');
1219
1377
  log(`${DIM}Feche e abra o Claude Code ou o Codex pra ele enxergar o registro.${RESET}`);
1220
1378
  process.exit(0);
1221
1379
  })().catch(err => {
@@ -1251,3 +1409,5 @@ if (command === 'init' || command === 'install') {
1251
1409
  log(`${DIM}Uso: npx auroq-os init${RESET}`);
1252
1410
  log('');
1253
1411
  }
1412
+
1413
+ if (process.env.AUROQ_EXPORTA_INTERNOS === '1') module.exports = { blocoCodexArcane, envCodexArcane };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "auroq-os",
3
- "version": "2.4.13",
3
+ "version": "2.4.16",
4
4
  "description": "Auroq OS — Sistema Operacional de IA para Experts",
5
5
  "bin": {
6
6
  "auroq-os": "bin/auroq-os.js"