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.
- package/.auroq-core/core-config.yaml +1 -1
- package/.claude/commands/AuroqOS/agents/ops.md +4 -2
- package/.claude/commands/instalacaoBia.md +1 -1
- package/.claude/commands/squad-anuncios-arcane.md +2 -2
- package/.claude/commands/squad-carrossel-arcane.md +1 -1
- package/.claude/commands/squad-edicao-arcane.md +1 -1
- package/.claude/commands/squad-low-ticket-arcane.md +1 -1
- package/.claude/commands/trafegoArcane.md +1 -1
- package/.claude/hooks/auroq-sync.cjs +1 -1
- package/AGENTS.md +2 -2
- package/CHANGELOG.md +23 -0
- package/README.md +4 -33
- package/bin/auroq-os.js +78 -63
- package/installer/README.md +1 -1
- package/installer/install.ps1 +2 -2
- package/installer/install.sh +3 -3
- package/lib/legacy-shims.json +20 -0
- package/package.json +2 -2
- package/scripts/sync-codex-skills.mjs +4 -0
|
@@ -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
|
-
|
|
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
|
-
**
|
|
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
|
-
**
|
|
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
|
-
|
|
11
|
+
Este squad funciona pelo MCP e nao exige instalacao de arquivos locais.
|
|
12
12
|
|
|
13
|
-
CRITICAL:
|
|
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
|
-
**
|
|
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
|
-
**
|
|
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
|
-
**
|
|
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
|
-
**
|
|
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 *
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
|
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
|
|
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 `*
|
|
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
|
|
8
|
-
* node bin/auroq-os.js
|
|
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('
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
|
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
|
-
//
|
|
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
|
-
|
|
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:
|
|
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 (
|
|
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}
|
|
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}
|
|
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}
|
|
1632
|
+
log(`${DIM}Primeira instalacao: https://arcane.arka.education/auroq${RESET}`);
|
|
1618
1633
|
log('');
|
|
1619
1634
|
}
|
|
1620
1635
|
|
package/installer/README.md
CHANGED
|
@@ -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
|
|
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.
|
package/installer/install.ps1
CHANGED
|
@@ -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@
|
|
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@
|
|
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.'
|
package/installer/install.sh
CHANGED
|
@@ -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@
|
|
154
|
+
npx -y auroq-os@2.5.0 "$@"
|
|
155
155
|
else
|
|
156
|
-
npx -y auroq-os@
|
|
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
|
|
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
|
@@ -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
|
}
|