auroq-os 2.4.19 → 2.5.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.
@@ -1,7 +1,7 @@
1
1
  project:
2
2
  name: "Auroq OS"
3
3
  type: greenfield
4
- version: 2.4.19
4
+ version: 2.5.0
5
5
  installedAt: '2026-03-16'
6
6
 
7
7
  ide:
@@ -4,12 +4,14 @@ Bootstrap e operação do Auroq OS.
4
4
 
5
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
- **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.
7
+ O Pack chega ao vivo pelo MCP. NUNCA peça zip nem instalacao do Pack.
8
+
9
+ **Execucao preparada pelo MCP:** Edicao, Carrossel, Trafego, Low Ticket e Bia recebem seus arquivos por `squad_passo` com o recurso_id do squad e passo `preparar-execucao`. O agente executa o script retornado na pasta do negocio e continua o trabalho. Anuncios funciona sem arquivos locais. Nao instalar nem atualizar Pack; nao pedir ZIP. Os arquivos locais servem apenas para executar o passo, nunca como fonte do metodo.
8
10
 
9
11
  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
12
 
11
13
  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
14
 
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.
15
+ **Comandos antigos aposentados:** `*update-auroq`, `*update`, `*update-packarcane` e instalacao do Pack nao autorizam copiar arquivos antigos ou instalar ZIP. Para conteudo, usar o MCP. Para cuidar do motor, consultar `forja_bundle` com forge_id `ops` e fase `manutencao`. Se este negocio ainda nao tem MCP, explicar a mudanca e exigir SIM explicito antes da migracao; usar `npx -y auroq-os@latest manutencao` na raiz do negocio. O CLI preserva o que ja pertence ao aluno e pede consentimento quando falta MCP. Nunca seguir a antiga lista ATUALIZA nem extrair pacote em /tmp/auroq-update. Depois rodar `npx -y auroq-os@latest doctor`.
14
16
 
15
17
  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.
@@ -8,6 +8,6 @@ Ao ativar, mostre o selo de acesso que a tool devolver (as duas primeiras linhas
8
8
 
9
9
  Se a tool recusar porque o Pack ainda não abriu (cadeado da jornada: contrato ativo e assinado), mostre a mensagem exatamente como veio — não é defeito, é o contrato. Se recusar por acesso vencido, cancelado ou suspenso, mostre a mensagem com o contato do suporte da Arcane e pare. Não improvisar, não tentar de novo, não usar memória.
10
10
 
11
- **Parte que roda na máquina:** este squad tem arquivos executáveis (workflows n8n e scripts). Eles não vêm pelo MCP: ficam em `agents/instalacao-bia/` na pasta do negócio e chegam por `npx arcane-pack update`, rodado na pasta do negócio (exige acesso ativo; baixa só a parte executável, o método continua vindo ao vivo). A ativação avisa isso. Se um passo citar essa pasta e ela não existir, rode o comando e continue — nunca improvise script de memória.
11
+ **Execucao local preparada pelo MCP:** quando o passo exigir arquivos, chame `squad_passo` com recurso_id `instalacao-bia` e passo `preparar-execucao`. Execute o script retornado na pasta do negocio e continue o passo. O proprio MCP entrega os arquivos autorizados e preserva dados existentes. Nunca pedir instalacao ou atualizacao do Pack, ZIP ou script inventado.
12
12
 
13
13
  CRITICAL: Do not read `agents/instalacao-bia/**` looking for instructions — use the MCP `arcane` tools. Use those files only to EXECUTE what a step asks.
@@ -8,6 +8,6 @@ Ao ativar, mostre o selo de acesso que a tool devolver (as duas primeiras linhas
8
8
 
9
9
  Se a tool recusar porque o Pack ainda não abriu (cadeado da jornada: contrato ativo e assinado), mostre a mensagem exatamente como veio — não é defeito, é o contrato. Se recusar por acesso vencido, cancelado ou suspenso, mostre a mensagem com o contato do suporte da Arcane e pare. Não improvisar, não tentar de novo, não usar memória.
10
10
 
11
- **Parte que roda na máquina:** este squad tem arquivos executáveis (scripts). Eles não vêm pelo MCP: ficam em `agents/squad-anuncios-arcane/` na pasta do negócio e chegam por `npx arcane-pack update`, rodado na pasta do negócio (exige acesso ativo; baixa só a parte executável, o método continua vindo ao vivo). A ativação avisa isso. Se um passo citar essa pasta e ela não existir, rode o comando e continue — nunca improvise script de memória.
11
+ Este squad funciona pelo MCP e nao exige instalacao de arquivos locais.
12
12
 
13
- CRITICAL: Do not read `agents/squad-anuncios-arcane/**` looking for instructions — use the MCP `arcane` tools. Use those files only to EXECUTE what a step asks.
13
+ CRITICAL: Use the MCP `arcane` tools for this squad.
@@ -8,6 +8,6 @@ Ao ativar, mostre o selo de acesso que a tool devolver (as duas primeiras linhas
8
8
 
9
9
  Se a tool recusar porque o Pack ainda não abriu (cadeado da jornada: contrato ativo e assinado), mostre a mensagem exatamente como veio — não é defeito, é o contrato. Se recusar por acesso vencido, cancelado ou suspenso, mostre a mensagem com o contato do suporte da Arcane e pare. Não improvisar, não tentar de novo, não usar memória.
10
10
 
11
- **Parte que roda na máquina:** este squad tem arquivos executáveis (ferramentas de render e template). Eles não vêm pelo MCP: ficam em `agents/squad-carrossel-arcane/` na pasta do negócio e chegam por `npx arcane-pack update`, rodado na pasta do negócio (exige acesso ativo; baixa só a parte executável, o método continua vindo ao vivo). A ativação avisa isso. Se um passo citar essa pasta e ela não existir, rode o comando e continue — nunca improvise script de memória.
11
+ **Execucao local preparada pelo MCP:** quando o passo exigir arquivos, chame `squad_passo` com recurso_id `squad-carrossel-arcane` e passo `preparar-execucao`. Execute o script retornado na pasta do negocio e continue o passo. O proprio MCP entrega os arquivos autorizados e preserva dados existentes. Nunca pedir instalacao ou atualizacao do Pack, ZIP ou script inventado.
12
12
 
13
13
  CRITICAL: Do not read `agents/squad-carrossel-arcane/**` looking for instructions — use the MCP `arcane` tools. Use those files only to EXECUTE what a step asks.
@@ -8,6 +8,6 @@ Ao ativar, mostre o selo de acesso que a tool devolver (as duas primeiras linhas
8
8
 
9
9
  Se a tool recusar porque o Pack ainda não abriu (cadeado da jornada: contrato ativo e assinado), mostre a mensagem exatamente como veio — não é defeito, é o contrato. Se recusar por acesso vencido, cancelado ou suspenso, mostre a mensagem com o contato do suporte da Arcane e pare. Não improvisar, não tentar de novo, não usar memória.
10
10
 
11
- **Parte que roda na máquina:** este squad tem arquivos executáveis (scripts de vídeo, instalador, fontes, trilha e configs de estilo). Eles não vêm pelo MCP: ficam em `agents/squad-edicao-arcane/` na pasta do negócio e chegam por `npx arcane-pack update`, rodado na pasta do negócio (exige acesso ativo; baixa só a parte executável, o método continua vindo ao vivo). A ativação avisa isso. Se um passo citar essa pasta e ela não existir, rode o comando e continue — nunca improvise script de memória.
11
+ **Execucao local preparada pelo MCP:** quando o passo exigir arquivos, chame `squad_passo` com recurso_id `squad-edicao-arcane` e passo `preparar-execucao`. Execute o script retornado na pasta do negocio e continue o passo. O proprio MCP entrega os arquivos autorizados e preserva dados existentes. Nunca pedir instalacao ou atualizacao do Pack, ZIP ou script inventado.
12
12
 
13
13
  CRITICAL: Do not read `agents/squad-edicao-arcane/**` looking for instructions — use the MCP `arcane` tools. Use those files only to EXECUTE what a step asks.
@@ -8,6 +8,6 @@ Ao ativar, mostre o selo de acesso que a tool devolver (as duas primeiras linhas
8
8
 
9
9
  Se a tool recusar porque o Pack ainda não abriu (cadeado da jornada: contrato ativo e assinado), mostre a mensagem exatamente como veio — não é defeito, é o contrato. Se recusar por acesso vencido, cancelado ou suspenso, mostre a mensagem com o contato do suporte da Arcane e pare. Não improvisar, não tentar de novo, não usar memória.
10
10
 
11
- **Parte que roda na máquina:** este squad tem arquivos executáveis (templates de página). Eles não vêm pelo MCP: ficam em `agents/squad-low-ticket-arcane/` na pasta do negócio e chegam por `npx arcane-pack update`, rodado na pasta do negócio (exige acesso ativo; baixa só a parte executável, o método continua vindo ao vivo). A ativação avisa isso. Se um passo citar essa pasta e ela não existir, rode o comando e continue — nunca improvise script de memória.
11
+ **Execucao local preparada pelo MCP:** quando o passo exigir arquivos, chame `squad_passo` com recurso_id `squad-low-ticket-arcane` e passo `preparar-execucao`. Execute o script retornado na pasta do negocio e continue o passo. O proprio MCP entrega os arquivos autorizados e preserva dados existentes. Nunca pedir instalacao ou atualizacao do Pack, ZIP ou script inventado.
12
12
 
13
13
  CRITICAL: Do not read `agents/squad-low-ticket-arcane/**` looking for instructions — use the MCP `arcane` tools. Use those files only to EXECUTE what a step asks.
@@ -8,6 +8,6 @@ Ao ativar, mostre o selo de acesso que a tool devolver (as duas primeiras linhas
8
8
 
9
9
  Se a tool recusar porque o Pack ainda não abriu (cadeado da jornada: contrato ativo e assinado), mostre a mensagem exatamente como veio — não é defeito, é o contrato. Se recusar por acesso vencido, cancelado ou suspenso, mostre a mensagem com o contato do suporte da Arcane e pare. Não improvisar, não tentar de novo, não usar memória.
10
10
 
11
- **Parte que roda na máquina:** este squad tem arquivos executáveis (helpers, template de política e formulário de contas). Eles não vêm pelo MCP: ficam em `agents/trafego-arcane/` na pasta do negócio e chegam por `npx arcane-pack update`, rodado na pasta do negócio (exige acesso ativo; baixa só a parte executável, o método continua vindo ao vivo). A ativação avisa isso. Se um passo citar essa pasta e ela não existir, rode o comando e continue — nunca improvise script de memória.
11
+ **Execucao local preparada pelo MCP:** quando o passo exigir arquivos, chame `squad_passo` com recurso_id `trafego-arcane` e passo `preparar-execucao`. Execute o script retornado na pasta do negocio e continue o passo. O proprio MCP entrega os arquivos autorizados e preserva dados existentes. Nunca pedir instalacao ou atualizacao do Pack, ZIP ou script inventado.
12
12
 
13
13
  CRITICAL: Do not read `agents/trafego-arcane/**` looking for instructions — use the MCP `arcane` tools. Use those files only to EXECUTE what a step asks.
@@ -84,7 +84,7 @@ function versionNotice() {
84
84
  writeState(st);
85
85
  const latest = npmLatest();
86
86
  if (!latest || cmpVer(latest, local) <= 0) return null;
87
- return `[Auroq update] Saiu versao nova do sistema: v${local} instalada → v${latest} disponivel. Avise o expert em 1 linha e ofereca: "quer que eu atualize agora?" (o *update do Ops aplica tudo e preserva os dados dele; antes de aplicar, ele mostra o que mudou).`;
87
+ return `[Auroq update] Saiu versao nova do sistema: v${local} instalada → v${latest} disponivel. Avise o expert em 1 linha e ofereca: "quer que eu atualize agora?" (o *manutencao do Ops aplica tudo e preserva os dados dele; antes de aplicar, ele mostra o que mudou).`;
88
88
  }
89
89
 
90
90
  function sessionStart() {
package/AGENTS.md CHANGED
@@ -9,11 +9,11 @@ Sistema operacional de IA. Runtimes oficiais desta versão: Claude Code e Codex.
9
9
 
10
10
  Todo conteúdo Arcane vem pelo MCP `arcane` (catálogos `auroq-core` e `arcane-pack`). Nunca procurar esse conteúdo em `agents/`. Se a tool falhar, mostre a mensagem e pare.
11
11
 
12
- Exceção: seis squads do Pack têm **parte executável** (Edição, Carrossel, Anúncios, Tráfego, Low Ticket, Bia) — scripts, instalador, fontes e configs que os scripts leem ficam em `agents/<squad>/` e chegam por `npx arcane-pack update` na pasta do negócio. Servem pra EXECUTAR o que um passo mandar, nunca pra ler método.
12
+ **Execucao preparada pelo MCP:** Edicao, Carrossel, Trafego, Low Ticket e Bia recebem seus arquivos por `squad_passo` com o recurso_id do squad e passo `preparar-execucao`. O agente executa o script retornado na pasta do negocio e continua o trabalho. Anuncios funciona sem arquivos locais. Nao instalar nem atualizar Pack; nao pedir ZIP. Os arquivos locais servem apenas para executar o passo, nunca como fonte do metodo.
13
13
 
14
14
  ## O que fica no disco
15
15
 
16
- Motor (CLI, hooks, scripts), pastas, git, casca (estes ponteiros), a parte executável dos squads híbridos do Pack (chega por `npx arcane-pack update`) e o que VOCÊ criar (memória, docs, cockpit).
16
+ Motor (CLI, hooks, scripts), pastas, git, casca (estes ponteiros), a parte executável dos squads híbridos do Pack (preparada pelo MCP) e o que VOCÊ criar (memória, docs, cockpit).
17
17
 
18
18
  ## O que vem ao vivo
19
19
 
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
+ ## 2.5.0 — 2026-09-04
2
+
3
+ - Instaladores fixam o motor validado 2.5.0; novas publicacoes nao alteram silenciosamente um instalador antigo.
4
+ - Aposenta init/install/update: apenas orientam e saem sem alterar o negocio. Instalador oficial usa instalar; manutencao do motor usa manutencao.
5
+ - Conteudo e execucao de squads pelo MCP; remove receitas de Pack, ZIP e copia manual do Ops.
6
+ - Preserva pastas e comandos antigos, documentos, cockpit e CLAUDE.md existentes. Atualiza atalhos MCP antigos somente por hash exato, preservando agentes completos e personalizados.
7
+ - Migracao de negocio sem MCP exige consentimento antes de qualquer alteracao.
8
+
1
9
  # Changelog
2
10
 
11
+ ## [2.4.20] — 2026-09-04
12
+
13
+ ### Dentro do Codex no Windows: "UNABLE_TO_VERIFY_LEAF_SIGNATURE" (EMB-028, causa vista na tela)
14
+ Com o motivo tecnico na mensagem (0.4.1), a aluna mostrou: dentro do Codex a conexao com o
15
+ servidor cai porque o Node nao confia no certificado que chega — algo entre o Codex e a internet
16
+ (antivirus, proxy ou o sandbox do Codex) reassina a conexao com um certificado que o Windows
17
+ conhece e o Node, por padrao, nao. No terminal funciona porque o ambiente carrega a confianca;
18
+ o Codex abre o MCP com ambiente minimo (openai/codex#29124).
19
+ - **`arcane-mcp@0.4.2`** (pin novo) confia tambem nos certificados do sistema, sem flag.
20
+ - **Registro do Codex** no Windows ganha `NODE_USE_SYSTEM_CA = '1'` e repassa, se existirem,
21
+ `NODE_EXTRA_CA_CERTS`, `SSL_CERT_FILE`, `SSL_CERT_DIR`, `NODE_OPTIONS`, `HTTPS_PROXY`,
22
+ `HTTP_PROXY`, `NO_PROXY`.
23
+ - **`doctor`** fecha o relatorio pedindo ao proprio Codex do aluno pra chamar o conteudo ao vivo
24
+ e imprime a resposta — o teste definitivo, na mesma tela.
25
+
3
26
  ## [2.4.19] — 2026-09-04
4
27
 
5
28
  ### O npx guarda cache por ambiente — o Codex abria "a frio" mesmo depois de aquecido
package/README.md CHANGED
@@ -29,43 +29,14 @@ irm https://arka.education/install.ps1 | iex
29
29
  Depois, **feche e abra** o Claude Code ou o Codex — senao ele nao enxerga o que
30
30
  acabou de ser instalado.
31
31
 
32
- <details>
33
- <summary>Caminho manual (se o instalador nao servir na sua maquina)</summary>
34
-
35
- ```bash
36
- # 1. Crie uma pasta pro seu negocio
37
- mkdir meu-negocio && cd meu-negocio
38
-
39
- # 2. Instale o Auroq OS (gate: email + senha da Mentoria Arcane)
40
- npx auroq-os init
41
-
42
- # 3A. Abra o Claude Code
43
- claude
44
-
45
- # 4A. Ative o Companion
46
- /auroq-companion
47
-
48
- # OU 3B. Abra o Codex CLI
49
- codex
50
-
51
- # 4B. Ative o Companion
52
- $companion
53
-
54
- # OU 3C. Abra o Grok Build (no diretorio do negocio)
55
- grok
56
-
57
- # 4C. Ative o Companion (Grok le .claude/commands nativo — mesmo fluxo do Claude)
58
- /auroq-companion
59
- ```
60
-
61
- </details>
32
+ O caminho manual antigo foi aposentado. Use a instalacao guiada acima. Em negocio existente, peca ao Ops "manutencao do motor". Os agentes e squads chegam pelo MCP, sem instalacao ou atualizacao de Pack.
62
33
 
63
34
 
64
35
  > **Grok:** nao precisa de `sync:codex`. Ele descobre `.claude/commands/`,
65
36
  > `.claude/rules/` e `AGENTS.md` sozinho. Use Claude/Grok com slash commands;
66
37
  > use Codex com `$nome` apos o sync de skills.
67
38
 
68
- > **Acesso exclusivo para alunos da Mentoria Arcane.** O `init` pede o mesmo email + senha
39
+ > **Acesso exclusivo para alunos da Mentoria Arcane.** O instalador pede o mesmo email + senha
69
40
  > que voce usa em [mentoria-arcane.vercel.app](https://mentoria-arcane.vercel.app).
70
41
  > A sessao fica salva em `~/.arcane/credentials.json` e renova automaticamente.
71
42
 
@@ -73,7 +44,7 @@ grok
73
44
 
74
45
  | Comando | O que faz |
75
46
  |---------|-----------|
76
- | `auroq-os init` | Instala o Auroq OS do zero — primeira maquina (exige login na primeira vez) |
47
+ | `auroq-os manutencao` | Manutencao do motor no negocio existente; conteudo vem pelo MCP |
77
48
  | `auroq-os clone` | Continua o SEU negocio em outra maquina (ou na maquina de um colaborador) — baixa tudo do GitHub, ja instalado |
78
49
  | `auroq-os fix-gitignore` | Garante as protecoes de segredo no .gitignore (vault, .env, midia) e destraqueia segredos versionados |
79
50
  | `auroq-os login` | Forca novo login (substitui credencial atual) |
@@ -114,7 +85,7 @@ o sistema e o dono, e o colaborador recebe as atualizacoes automaticamente ao ab
114
85
  O Auroq OS tem duas partes:
115
86
 
116
87
  - **Motor** (mora no seu computador): a estrutura de pastas, o git, os comandos e as regras.
117
- E o que o instalador monta e o que o `*update` atualiza.
88
+ E o que o instalador monta e o que o `*manutencao` atualiza.
118
89
  - **Conteudo** (chega ao vivo): o cerebro dos agentes — Companion, Consultor, forjas e o
119
90
  Pack Arcane — e servido em tempo real pelo servidor da mentoria, atraves de uma conexao
120
91
  chamada MCP `arcane`. O instalador ja registra essa conexao no projeto; voce nao precisa
package/bin/auroq-os.js CHANGED
@@ -4,8 +4,8 @@
4
4
  * Auroq OS — Installer
5
5
  *
6
6
  * Usage:
7
- * npx @auroq-os/core init (quando publicado no npm)
8
- * node bin/auroq-os.js init (local)
7
+ * npx auroq-os@latest instalar (instalador oficial)
8
+ * node bin/auroq-os.js manutencao (negocio existente)
9
9
  *
10
10
  * @module auroq-os/installer
11
11
  */
@@ -278,7 +278,7 @@ async function runDoctor(targetDir) {
278
278
  success(`Arquivos do sistema: ${HEALTH_CHECKS.length}/${HEALTH_CHECKS.length} no lugar`);
279
279
  } else {
280
280
  error(`Arquivos do sistema: faltam ${faltando}`);
281
- problemas.push('Rode *update-auroq dentro do Claude Code pra repor o que falta.');
281
+ problemas.push('Peca manutencao do motor ao Ops dentro do Claude Code pra repor o que falta.');
282
282
  }
283
283
 
284
284
  // 2. O motor — e, principalmente, se quem abre pelo icone vai enxergar ele.
@@ -426,7 +426,16 @@ async function runDoctor(targetDir) {
426
426
  log(` ${DIM}Ultimas linhas do log do Codex sobre o arcane:${RESET}`);
427
427
  for (const l of rastro) log(` ${DIM} ${l}${RESET}`);
428
428
  }
429
- if (r.subiu === null || !r.temForja || !r.chamada || r.chamada.erro) {
429
+ let codexFalhou = false;
430
+ if (vCodex) {
431
+ log(` ${DIM}Pedindo ao proprio Codex pra chamar o conteudo ao vivo (pode levar 1-2 min)...${RESET}`);
432
+ const linhas = rodarNoCodex(targetDir);
433
+ const texto = linhas.join('\n');
434
+ codexFalhou = !/versao|catalogo_listar \(completed\)/i.test(texto) || /motivo t[eé]cnico|indispon[ií]vel|failed|timed out/i.test(texto);
435
+ (codexFalhou ? error : success)(codexFalhou ? 'Codex de verdade: NAO conseguiu usar o conteudo ao vivo' : 'Codex de verdade: usou o conteudo ao vivo');
436
+ for (const l of linhas) log(` ${DIM} ${l}${RESET}`);
437
+ }
438
+ if (r.subiu === null || !r.temForja || !r.chamada || r.chamada.erro || codexFalhou) {
430
439
  problemas.push('Mande o print desta tela INTEIRA pro suporte (11 93621-4486) — ela ja traz tudo que precisamos.');
431
440
  }
432
441
  }
@@ -450,7 +459,7 @@ async function runDoctor(targetDir) {
450
459
  // (rede domestica + antivirus) a aluna viu timeout em todas as que fez. Por isso:
451
460
  // (1) o registro do Codex pede mais tempo, (2) instalacao/atualizacao ja baixam o
452
461
  // pacote, (3) o doctor mede o arranque de verdade em vez de so olhar o registro.
453
- const ARCANE_MCP_PIN = 'arcane-mcp@0.4.1';
462
+ const ARCANE_MCP_PIN = 'arcane-mcp@0.4.2';
454
463
  const CODEX_MCP_STARTUP_SEC = 120;
455
464
  const CODEX_ENV_MINIMO = ['PATH', 'PATHEXT', 'USERNAME', 'USERDOMAIN', 'USERPROFILE', 'TEMP', 'TMP',
456
465
  'HOME', 'LOGNAME', 'SHELL', 'TERM', 'USER'];
@@ -464,7 +473,13 @@ const MCP_ARRANQUE_LIMITE_MS = 9000; // abaixo do que o Codex tolera (10s)
464
473
  const CODEX_ENV_WINDOWS = [
465
474
  'SystemRoot', 'windir', 'COMSPEC', 'SystemDrive', 'APPDATA', 'LOCALAPPDATA',
466
475
  'ProgramData', 'ProgramFiles', 'HOMEDRIVE', 'HOMEPATH', 'USERPROFILE', 'TEMP', 'TMP',
476
+ // Confianca e proxy que o terminal do aluno tem e o Codex tira do MCP (openai/codex#29124).
477
+ 'NODE_EXTRA_CA_CERTS', 'SSL_CERT_FILE', 'SSL_CERT_DIR', 'NODE_OPTIONS',
478
+ 'HTTPS_PROXY', 'HTTP_PROXY', 'NO_PROXY',
467
479
  ];
480
+ // Dentro do Codex no Windows a conexao caia com UNABLE_TO_VERIFY_LEAF_SIGNATURE (04/09):
481
+ // o Node por padrao ignora a loja de certificados do Windows. Node >= 22.15 aceita isto.
482
+ const CODEX_ENV_FIXO_WINDOWS = { NODE_USE_SYSTEM_CA: '1' };
468
483
 
469
484
  function envCodexArcane({ plataforma = process.platform, env = process.env } = {}) {
470
485
  if (plataforma !== 'win32') return null;
@@ -475,6 +490,7 @@ function envCodexArcane({ plataforma = process.platform, env = process.env } = {
475
490
  if (!valor || valor.includes("'") || /[\r\n]/.test(valor)) continue;
476
491
  pares.push(`${nome} = '${valor}'`); // string literal do TOML: barra invertida sem escape
477
492
  }
493
+ for (const [nome, valor] of Object.entries(CODEX_ENV_FIXO_WINDOWS)) pares.push(`${nome} = '${valor}'`);
478
494
  return pares.length ? `env = { ${pares.join(', ')} }` : null;
479
495
  }
480
496
 
@@ -492,7 +508,7 @@ function blocoCodexArcane(pin, opcoes) {
492
508
  }
493
509
 
494
510
  // Baixa o pacote do conteudo ao vivo com o MESMO nome que o registro usa (o cache do
495
- // npx e por nome+versao: `arcane-mcp` e `arcane-mcp@0.4.1` sao caches diferentes).
511
+ // npx e por nome+versao: `arcane-mcp` e `arcane-mcp@0.4.2` sao caches diferentes).
496
512
  // `npx` no Windows e um .cmd: sem shell o Node recusa (EINVAL) e com `shell: true` o Node 24
497
513
  // imprime um DeprecationWarning na tela do aluno (DEP0190). Chamar o cmd.exe direto, sem shell.
498
514
  function comandoNpx(args) {
@@ -517,6 +533,7 @@ function envComoCodex({ plataforma = process.platform, env = process.env } = {})
517
533
  const chave = Object.keys(env).find(k => k.toLowerCase() === nome.toLowerCase());
518
534
  if (chave && env[chave]) base[nome] = env[chave];
519
535
  }
536
+ Object.assign(base, CODEX_ENV_FIXO_WINDOWS);
520
537
  }
521
538
  return base;
522
539
  }
@@ -730,6 +747,26 @@ async function rastroDoCodex(limite = 8) {
730
747
  }
731
748
  }
732
749
 
750
+
751
+ // O teste definitivo: o proprio Codex do aluno chamando a ferramenta. E o unico jeito de
752
+ // ver o que o Codex faz com o MCP (sandbox, proxy, certificado) sem pedir print atras de print.
753
+ function rodarNoCodex(pasta) {
754
+ 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.';
755
+ const args = ['exec', '--skip-git-repo-check', '-C', pasta, prompt];
756
+ const c = process.platform === 'win32'
757
+ ? { cmd: process.env.ComSpec || 'cmd.exe', args: ['/d', '/s', '/c', `codex exec --skip-git-repo-check -C "${pasta}" "${prompt}"`], opts: { windowsVerbatimArguments: true } }
758
+ : { cmd: 'codex', args, opts: {} };
759
+ let saida = '';
760
+ try {
761
+ saida = execFileSync(c.cmd, c.args, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'], timeout: 300000, ...c.opts });
762
+ } catch (e) {
763
+ saida = `${e.stdout || ''}\n${e.stderr || ''}\n[codex saiu com ${e.status ?? e.code ?? 'erro'}]`;
764
+ }
765
+ return saida.split('\n').map(l => l.replace(/\u001b\[[0-9;]*m/g, '').trim())
766
+ .filter(l => l && !/^hook:|^warning: Skill|usage limit|^Tip:|^tokens used|^[0-9.]+$/i.test(l))
767
+ .slice(-8).map(l => l.slice(0, 220));
768
+ }
769
+
733
770
  async function writeArcaneMcpConfig(targetDir) {
734
771
  const pin = ARCANE_MCP_PIN;
735
772
  const mcpPath = path.join(targetDir, '.mcp.json');
@@ -773,7 +810,10 @@ async function patchEnableAllProjectMcpServers(targetDir) {
773
810
  }
774
811
 
775
812
  // ─── INSTALACAO ──────────────────────────────────────────
776
- async function init({ pasta = null } = {}) {
813
+ async function init({ pasta = null, maintenance = false } = {}) {
814
+ if (maintenance && (pasta || !(await fs.pathExists(path.join(process.cwd(), '.auroq-core'))))) {
815
+ throw new Error('Manutencao exige a raiz de um negocio existente, sem --pasta. Primeira instalacao pela plataforma.');
816
+ }
777
817
  showBanner();
778
818
  await sleep(500);
779
819
 
@@ -792,7 +832,7 @@ async function init({ pasta = null } = {}) {
792
832
  error('');
793
833
  error(` ${CYAN}mkdir meu-negocio${RESET}`);
794
834
  error(` ${CYAN}cd meu-negocio${RESET}`);
795
- error(` ${CYAN}npx auroq-os init${RESET}`);
835
+ error(` ${CYAN}npx auroq-os@latest instalar${RESET}`);
796
836
  error('');
797
837
  error('Troque "meu-negocio" pelo nome que quiser pro seu projeto.');
798
838
  process.exit(1);
@@ -801,6 +841,17 @@ async function init({ pasta = null } = {}) {
801
841
  // ─── GUARDRAIL: segunda maquina usa clone, nao init
802
842
  // So pergunta em instalacao NOVA (pasta sem .auroq-core) — update/reinstall pula direto.
803
843
  const isNewInstall = !(await fs.pathExists(path.join(targetDir, '.auroq-core')));
844
+ if (!isNewInstall) {
845
+ let hasMcp = false;
846
+ try { hasMcp = !!(await fs.readJson(path.join(targetDir, '.mcp.json'))).mcpServers?.arcane; } catch {}
847
+ if (!hasMcp) {
848
+ log('Este negocio usa o sistema antigo. Seus arquivos locais serao preservados.');
849
+ log('O conteudo novo passa a chegar pelo MCP enquanto seu acesso estiver ativo.');
850
+ if (!(await askYesNo('Quer migrar este negocio para o MCP? (s/N) '))) {
851
+ throw new Error('Migracao nao autorizada. Nada foi alterado.');
852
+ }
853
+ }
854
+ }
804
855
  if (isNewInstall && process.env.AUROQ_INIT_MODE !== 'novo') {
805
856
  const jaUsa = await askYesNo(` Voce JA usa o Auroq OS em outra maquina e quer continuar o MESMO negocio aqui? ${DIM}(s/N)${RESET} `);
806
857
  if (jaUsa) {
@@ -847,7 +898,8 @@ async function init({ pasta = null } = {}) {
847
898
  success('Gate de acesso ignorado em ambiente de teste');
848
899
  } else {
849
900
  try {
850
- await auth.getValidSession();
901
+ if (isNewInstall) await auth.getValidSession();
902
+ else await auth.requireActiveAccess();
851
903
  } catch (e) {
852
904
  error(`Falha na autenticacao: ${e.message}`);
853
905
  process.exit(1);
@@ -1042,45 +1094,9 @@ async function init({ pasta = null } = {}) {
1042
1094
  log(`${DIM} Companion personalizado detectado: ${customName} — pulando companion.md generico${RESET}`);
1043
1095
  }
1044
1096
 
1045
- // Limpar commands antigos em camelCase (versoes anteriores usavam camelCase)
1046
- const legacyCommands = ['cloneForge.md', 'mindForge.md', 'squadForge.md', 'workerForge.md', 'etlmaker.md'];
1047
- // Nota: etlmaker.md nao muda de nome, os outros sim
1048
- const camelToKebab = { 'cloneForge.md': 'clone-forge.md', 'mindForge.md': 'mind-forge.md', 'squadForge.md': 'squad-forge.md', 'workerForge.md': 'worker-forge.md' };
1049
- let legacyCleaned = 0;
1050
- for (const legacy of Object.keys(camelToKebab)) {
1051
- const legacyPath = path.join(commandsDir, legacy);
1052
- if (await fs.pathExists(legacyPath)) {
1053
- await fs.remove(legacyPath);
1054
- legacyCleaned++;
1055
- }
1056
- }
1057
- if (legacyCleaned > 0) {
1058
- log(`${DIM} Removidos ${legacyCleaned} commands antigos (camelCase → kebab-case)${RESET}`);
1059
- }
1060
1097
  }
1061
1098
 
1062
- // Migrar meta squads de squads/ → agents/ (versoes antigas usavam squads/)
1063
- const legacySquadsDir = path.join(targetDir, 'squads');
1064
- if (await fs.pathExists(legacySquadsDir)) {
1065
- const metaSquadNames = ['squad-forge', 'mind-forge', 'worker-forge', 'clone-forge', 'etlmaker', 'organizer', 'companion'];
1066
- let migrated = 0;
1067
- for (const name of metaSquadNames) {
1068
- const oldPath = path.join(legacySquadsDir, name);
1069
- if (await fs.pathExists(oldPath)) {
1070
- await fs.remove(oldPath);
1071
- migrated++;
1072
- }
1073
- }
1074
- if (migrated > 0) {
1075
- log(`${DIM} Removidos ${migrated} meta squads antigos de squads/ (agora ficam em agents/)${RESET}`);
1076
- }
1077
- // Se squads/ ficou vazia, remover a pasta
1078
- const remaining = await fs.readdir(legacySquadsDir);
1079
- if (remaining.length === 0) {
1080
- await fs.remove(legacySquadsDir);
1081
- log(`${DIM} Pasta squads/ vazia removida${RESET}`);
1082
- }
1083
- }
1099
+ // Pastas e comandos antigos pertencem ao aluno. Nunca excluir na manutencao.
1084
1100
 
1085
1101
  // Atalhos do Pack Arcane. O conteudo chega ao vivo pelo MCP, mas o /comando
1086
1102
  // (ex: /euriler) so existe se o arquivo estiver no disco — sem ele o Claude Code
@@ -1138,7 +1154,7 @@ async function init({ pasta = null } = {}) {
1138
1154
  const dstExists = await fs.pathExists(dst);
1139
1155
  // Framework files: SEMPRE sobrescrever (atualizar)
1140
1156
  // Student files: so copiar se NAO existem (preservar dados)
1141
- if (isStudentFile && dstExists) {
1157
+ if ((isStudentFile || file.startsWith('business/') || file.startsWith('docs/knowledge/') || file === '.claude/CLAUDE.md') && dstExists) {
1142
1158
  // Nao sobrescrever dados do aluno
1143
1159
  } else {
1144
1160
  await guardarBootstrapLocal(targetDir, file, dst, dstExists);
@@ -1156,7 +1172,10 @@ async function init({ pasta = null } = {}) {
1156
1172
  for (const file of packShimFiles) {
1157
1173
  const src = path.join(sourceDir, file);
1158
1174
  const dst = path.join(targetDir, file);
1159
- if ((await fs.pathExists(src)) && !(await fs.pathExists(dst))) {
1175
+ const exists = await fs.pathExists(dst);
1176
+ const known = require('../lib/legacy-shims.json')[file] || [];
1177
+ const officialOldShim = exists && known.includes(require('crypto').createHash('sha256').update(await fs.readFile(dst)).digest('hex'));
1178
+ if ((await fs.pathExists(src)) && (!exists || officialOldShim)) {
1160
1179
  await fs.copy(src, dst);
1161
1180
  shimsCriados++;
1162
1181
  }
@@ -1209,7 +1228,7 @@ async function init({ pasta = null } = {}) {
1209
1228
  const srcPath = path.join(sourceDir, src);
1210
1229
  const dstPath = path.join(targetDir, src);
1211
1230
  if (await fs.pathExists(srcPath)) {
1212
- await fs.copy(srcPath, dstPath, { overwrite: true });
1231
+ await fs.copy(srcPath, dstPath, { overwrite: !src.startsWith('agents/') });
1213
1232
  dirsCopied++;
1214
1233
  }
1215
1234
  }
@@ -1494,12 +1513,17 @@ ${DIM} Auroq OS v${PKG_VERSION} — Sistema Operacional de IA para Experts${RES
1494
1513
  // ─── CLI ─────────────────────────────────────────────────
1495
1514
  const command = process.argv[2];
1496
1515
 
1497
- if (command === 'init' || command === 'install') {
1516
+ if (['init', 'install', 'update'].includes(command)) {
1517
+ error('Comando aposentado. Nada foi instalado ou alterado.');
1518
+ error('Primeira instalacao: https://arcane.arka.education/auroq');
1519
+ error('No negocio existente, peca ao Ops: manutencao do motor. Conteudo chega pelo MCP.');
1520
+ process.exitCode = 1;
1521
+ } else if (command === 'instalar' || command === 'manutencao') {
1498
1522
  // `--pasta <nome>`: o instalador manda o CLI criar e entrar na pasta do negocio,
1499
1523
  // em vez de depender de um `cd` ter dado certo la fora (PRD Embarque §6).
1500
1524
  const iPasta = process.argv.indexOf('--pasta');
1501
1525
  const pasta = iPasta !== -1 ? process.argv[iPasta + 1] : null;
1502
- init({ pasta }).catch(err => {
1526
+ init({ pasta, maintenance: command === 'manutencao' }).catch(err => {
1503
1527
  error(`Falha na instalacao: ${err.message}`);
1504
1528
  process.exit(1);
1505
1529
  });
@@ -1546,15 +1570,6 @@ if (command === 'init' || command === 'install') {
1546
1570
  error(`Falha ao verificar acesso: ${err.message}`);
1547
1571
  process.exit(1);
1548
1572
  });
1549
- } else if (command === 'update') {
1550
- // Update e feito pelo Ops dentro do Claude Code, nao pelo CLI diretamente
1551
- log(`${BOLD}Para atualizar o Auroq OS:${RESET}`);
1552
- log('');
1553
- log(` 1. Abra o Claude Code: ${CYAN}claude${RESET}`);
1554
- log(` 2. Ative o Ops: ${CYAN}/AuroqOS:agents:ops${RESET}`);
1555
- log(` 3. Digite: ${CYAN}*update${RESET}`);
1556
- log('');
1557
- log(`${DIM}O Ops atualiza o framework sem tocar nos seus dados.${RESET}`);
1558
1573
  } else if (command === 'conectar-1password' || command === 'connect-1password') {
1559
1574
  const onepassword = require('../lib/onepassword');
1560
1575
  onepassword.connect().catch(e => {
@@ -1601,20 +1616,20 @@ if (command === 'init' || command === 'install') {
1601
1616
  } else {
1602
1617
  showBanner();
1603
1618
  log(`${BOLD}Comandos disponiveis:${RESET}`);
1604
- log(` ${CYAN}init${RESET} Instalar Auroq OS no diretorio atual (primeira maquina)`);
1619
+ log(` ${CYAN}instalar${RESET} Instalar o motor pelo instalador oficial da plataforma`);
1605
1620
  log(` ${CYAN}clone${RESET} Continuar o seu negocio NESTA maquina (segunda maquina / colaborador)`);
1606
1621
  log(` ${CYAN}fix-gitignore${RESET} Garantir protecoes de segredo no .gitignore (vault, .env)`);
1607
1622
  log(` ${CYAN}login${RESET} Autenticar com email + senha da Mentoria Arcane`);
1608
1623
  log(` ${CYAN}logout${RESET} Encerrar sessao local`);
1609
1624
  log(` ${CYAN}whoami${RESET} Mostrar usuario autenticado`);
1610
1625
  log(` ${CYAN}check-access${RESET} Validar acesso ativo (online; exit 0=ativo, 1=bloqueado)`);
1611
- log(` ${CYAN}update${RESET} Atualizar (via Ops dentro do Claude Code)`);
1626
+ log(` ${CYAN}manutencao${RESET} Manter o motor e a conexao MCP de um negocio existente`);
1612
1627
  log(` ${CYAN}doctor${RESET} Diagnostico: arquivos, Node, MCP arcane, login e servidor`);
1613
1628
  log(` ${CYAN}register-mcp${RESET} Reescrever o registro do conteudo ao vivo (MCP arcane) no projeto`);
1614
1629
  log(` ${CYAN}sync-codex${RESET} Gerar e verificar as skills locais do Codex CLI ($nome)`);
1615
1630
  log(` ${CYAN}conectar-1password${RESET} Conectar o 1Password CLI (token lido do Ctrl+C, nunca digitado)`);
1616
1631
  log('');
1617
- log(`${DIM}Uso: npx auroq-os init${RESET}`);
1632
+ log(`${DIM}Primeira instalacao: https://arcane.arka.education/auroq${RESET}`);
1618
1633
  log('');
1619
1634
  }
1620
1635
 
@@ -96,7 +96,7 @@ em vez do original, o teste quebra e diz qual é o certo.
96
96
 
97
97
  ## `--pasta`, no CLI
98
98
 
99
- `npx auroq-os init --pasta minha-empresa` cria a pasta e instala dentro dela.
99
+ `npx -y auroq-os@latest instalar --pasta minha-empresa` cria a pasta e instala dentro dela.
100
100
  Existe pra quem não pode depender de um `cd` ter funcionado. O instalador do Mac
101
101
  entra na pasta antes de chamar o `init`, então não precisa da opção — mas ela é a
102
102
  rede de segurança de qualquer outro chamador.
@@ -486,7 +486,7 @@ function Invoke-AuroqLogin {
486
486
  # sucesso. Usado como pergunta de sim/nao, ele dizia "voce ja estava logado"
487
487
  # pra quem nunca logou, pulava o portao e deixava a conta sem acesso chegar ate
488
488
  # a criacao da pasta.
489
- & (Get-AuroqNpx) -y auroq-os@latest check-access
489
+ & (Get-AuroqNpx) -y auroq-os@2.5.0 check-access
490
490
  if ($LASTEXITCODE -ne 0) {
491
491
  Write-AuroqLog 'login' 'recusado'
492
492
  Write-Host ''
@@ -574,7 +574,7 @@ function Invoke-AuroqInit {
574
574
  if ($env:AUROQ_INSTALL_DRY_RUN) { Write-AuroqOk 'Sistema - seria montado aqui'; return }
575
575
 
576
576
  Set-Location $script:AuroqPastaAlvo
577
- & (Get-AuroqNpx) -y auroq-os@latest init
577
+ & (Get-AuroqNpx) -y auroq-os@2.5.0 instalar
578
578
  if ($LASTEXITCODE -ne 0) {
579
579
  Write-AuroqLog 'init' 'falhou'
580
580
  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.'
@@ -151,9 +151,9 @@ auroq_tem_terminal() {
151
151
  # recebem pedaco do script no lugar da resposta dele.
152
152
  auroq_npx_aluno() {
153
153
  if [ -t 0 ]; then
154
- npx -y auroq-os@latest "$@"
154
+ npx -y auroq-os@2.5.0 "$@"
155
155
  else
156
- npx -y auroq-os@latest "$@" < /dev/tty
156
+ npx -y auroq-os@2.5.0 "$@" < /dev/tty
157
157
  fi
158
158
  }
159
159
 
@@ -552,7 +552,7 @@ auroq_rodar_init() {
552
552
  cd "$PASTA_ALVO" || auroq_erro "Nao consegui entrar na pasta ${PASTA_ALVO}." "Rode o mesmo comando de novo."
553
553
  # ligado no terminal de verdade: o `init` ainda pergunta se ele ja usa o Auroq
554
554
  # em outra maquina (3a pergunta do §4.4), e essa resposta e do aluno.
555
- if ! auroq_npx_aluno init; then
555
+ if ! auroq_npx_aluno instalar; then
556
556
  auroq_registrar_log "init" "falhou"
557
557
  auroq_erro "A montagem do sistema parou no meio." "Rode o mesmo comando de novo. Se repetir, mande pro suporte o arquivo ~/.auroq/install.log"
558
558
  fi
@@ -0,0 +1,20 @@
1
+ {
2
+ ".claude/commands/trafegoArcane.md": [
3
+ "548a0ae1602dd33d86f43c127ade64fcd9239916e45674f78fa85809912fe7cf"
4
+ ],
5
+ ".claude/commands/squad-low-ticket-arcane.md": [
6
+ "6fa42102f4e42b87de63a7c4ec56808b087466e0fde9565b16b55453ee0860de"
7
+ ],
8
+ ".claude/commands/squad-anuncios-arcane.md": [
9
+ "0a1289830a291c5892dc40584825a535af86f1ac41188cceeffa98b54f2f941d"
10
+ ],
11
+ ".claude/commands/squad-carrossel-arcane.md": [
12
+ "bf1229d86f56639d37406e74fc6f611c710614b7affa874c6a870153c78624fe"
13
+ ],
14
+ ".claude/commands/squad-edicao-arcane.md": [
15
+ "f239366b9bc2284cbbf34c50f93545f831875a9dd8e2e0bdc2306de82c8d061a"
16
+ ],
17
+ ".claude/commands/instalacaoBia.md": [
18
+ "4ce63268ca2d3099ee5b171130a1234ddb6df96993b7512fe030893dd7b6ed28"
19
+ ]
20
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "auroq-os",
3
- "version": "2.4.19",
4
- "description": "Auroq OS — Sistema Operacional de IA para Experts",
3
+ "version": "2.5.0",
4
+ "description": "Auroq OS \u2014 Sistema Operacional de IA para Experts",
5
5
  "bin": {
6
6
  "auroq-os": "bin/auroq-os.js"
7
7
  },
@@ -74,6 +74,10 @@ function collectSkills() {
74
74
  for (const entry of fs.readdirSync(commandRoot, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
75
75
  if (!entry.isFile() || !entry.name.endsWith('.md')) continue;
76
76
  const basename = entry.name.replace(/\.md$/, '');
77
+ // Aposentar distribuicao nao apaga comandos vitalicios. Se as duas grafias
78
+ // oficiais coexistem, a ponte usa a antiga preservada; nao mascara outras colisoes.
79
+ const legacyAlias = { 'clone-forge': 'cloneForge', 'mind-forge': 'mindForge', 'squad-forge': 'squadForge', 'worker-forge': 'workerForge' }[basename.replace(/^auroq-/, '')];
80
+ if (legacyAlias && fs.existsSync(path.join(commandRoot, `${legacyAlias}.md`))) continue;
77
81
  const name = kebab(basename.replace(/^auroq-/, ''));
78
82
  registerSkill(name, path.join(commandRoot, entry.name));
79
83
  }