auroq-os 2.3.7 → 2.4.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/README.md CHANGED
@@ -14,6 +14,24 @@ Transforma Claude Code, Codex CLI ou Grok Build num centro de comando inteligent
14
14
 
15
15
  ### Setup
16
16
 
17
+ Cole **um endereco** no terminal (o de dentro do Claude Code ou do Codex serve).
18
+ Ele instala o Git, o motor do sistema, faz o login da mentoria, cria a pasta do seu
19
+ negocio e monta tudo — sem senha e sem voce baixar nada na mao:
20
+
21
+ ```bash
22
+ # Mac
23
+ curl -fsSL https://arka.education/install.sh | bash
24
+
25
+ # Windows (PowerShell, sem Administrador)
26
+ irm https://arka.education/install.ps1 | iex
27
+ ```
28
+
29
+ Depois, **feche e abra** o Claude Code ou o Codex — senao ele nao enxerga o que
30
+ acabou de ser instalado.
31
+
32
+ <details>
33
+ <summary>Caminho manual (se o instalador nao servir na sua maquina)</summary>
34
+
17
35
  ```bash
18
36
  # 1. Crie uma pasta pro seu negocio
19
37
  mkdir meu-negocio && cd meu-negocio
@@ -40,6 +58,9 @@ grok
40
58
  /auroq-companion
41
59
  ```
42
60
 
61
+ </details>
62
+
63
+
43
64
  > **Grok:** nao precisa de `sync:codex`. Ele descobre `.claude/commands/`,
44
65
  > `.claude/rules/` e `AGENTS.md` sozinho. Use Claude/Grok com slash commands;
45
66
  > use Codex com `$nome` apos o sync de skills.
@@ -58,6 +79,7 @@ grok
58
79
  | `auroq-os login` | Forca novo login (substitui credencial atual) |
59
80
  | `auroq-os logout` | Encerra sessao local (remove `~/.arcane/credentials.json`) |
60
81
  | `auroq-os whoami` | Mostra usuario autenticado e status de acesso |
82
+ | `auroq-os doctor` | Diagnostico do suporte: arquivos, motor do sistema (e se o programa aberto pelo icone enxerga ele), registro do conteudo ao vivo, login e servidor |
61
83
  | `auroq-os sync-codex` | Regenera e verifica as skills locais do Codex |
62
84
  | `auroq-os conectar-1password` | Conecta o 1Password CLI — le o token de Service Account direto do Ctrl+C (nunca digitado nem exposto), instala o `op` se faltar, valida online e salva permanente (Mac/Windows) |
63
85
 
package/bin/auroq-os.js CHANGED
@@ -16,6 +16,7 @@ const path = require('path');
16
16
  const fs = require('fs-extra');
17
17
  const { execSync, execFileSync } = require('child_process');
18
18
  const auth = require('../lib/auth');
19
+ const diagnostico = require('../lib/diagnostico');
19
20
 
20
21
  const PKG_VERSION = require('../package.json').version;
21
22
 
@@ -162,6 +163,65 @@ const HEALTH_CHECKS = [
162
163
  ['scripts/validate-hybrid.mjs', 'Validador hibrido'],
163
164
  ];
164
165
 
166
+ /**
167
+ * Registro pro suporte (PRD "Embarque em 2 passos" §5.7).
168
+ *
169
+ * Uma linha por evento em ~/.auroq/install.log. Nunca entra e-mail, senha nem
170
+ * token: o suporte precisa saber o que aconteceu na maquina, nao quem e a pessoa.
171
+ * Falhar aqui nunca pode derrubar a instalacao — e conveniencia, nao requisito.
172
+ */
173
+ function registrarInstallLog(evento, detalhe = '') {
174
+ try {
175
+ const dir = path.join(require('os').homedir(), '.auroq');
176
+ fs.ensureDirSync(dir);
177
+ const quando = new Date().toISOString().replace(/\.\d+Z$/, 'Z');
178
+ const limpo = String(detalhe).replace(/[^\w .:=+/\\-]/g, '');
179
+ fs.appendFileSync(path.join(dir, 'install.log'), `${quando}\t${evento}\t${limpo}\n`);
180
+ } catch {
181
+ /* registro e conveniencia pro suporte */
182
+ }
183
+ }
184
+
185
+ /**
186
+ * Identificador curto e nao reversivel da maquina — so pro suporte casar dois
187
+ * registros do mesmo computador. Nao sai da maquina e nao contem nome nem e-mail.
188
+ */
189
+ function idDaMaquina() {
190
+ try {
191
+ const os = require('os');
192
+ const cru = `${os.hostname()}|${os.userInfo().username}|${os.platform()}|${os.arch()}`;
193
+ return require('crypto').createHash('sha256').update(cru).digest('hex').slice(0, 12);
194
+ } catch {
195
+ return 'desconhecida';
196
+ }
197
+ }
198
+
199
+ /**
200
+ * `--pasta <nome>`: o instalador pede pro CLI criar e entrar na pasta, em vez de
201
+ * depender de um `cd` ter funcionado la fora. Mesma regra de nome do instalador —
202
+ * so minusculas, numeros e hifen, sem escapar da pasta de cima.
203
+ */
204
+ function resolverPastaAlvo(nome, baseDir) {
205
+ if (!/^[a-z0-9][a-z0-9-]*$/.test(String(nome || ''))) {
206
+ error('');
207
+ error(`${GOLD}Esse nome de pasta nao serve: "${nome}"${RESET}`);
208
+ error('Use so letras minusculas, numeros e hifen. Exemplo: minha-empresa');
209
+ error('');
210
+ process.exit(1);
211
+ }
212
+ const alvo = path.join(baseDir, nome);
213
+ try {
214
+ fs.ensureDirSync(alvo);
215
+ } catch (e) {
216
+ error('');
217
+ error(`${GOLD}Nao consegui criar a pasta ${alvo}.${RESET}`);
218
+ error(`O que fazer agora: confira se voce tem permissao de escrita ai e rode de novo. (${e.message})`);
219
+ error('');
220
+ process.exit(1);
221
+ }
222
+ return alvo;
223
+ }
224
+
165
225
  async function runHealthChecks(targetDir) {
166
226
  let passed = 0;
167
227
  const missing = [];
@@ -207,13 +267,39 @@ async function runDoctor(targetDir) {
207
267
  problemas.push('Rode *update-auroq dentro do Claude Code pra repor o que falta.');
208
268
  }
209
269
 
210
- // 2. Node visivel pra quem abre pelo icone (NFR-06 — o caso real de falha)
270
+ // 2. O motor — e, principalmente, se quem abre pelo icone vai enxergar ele.
271
+ // Esta e a falha silenciosa do §5.4: no terminal funciona, no app nao, e
272
+ // ninguem ve erro nenhum — so um Companion que "nao sabe de nada".
273
+ const homeDir = require('os').homedir();
274
+ let caminhoMotor = '';
275
+ try {
276
+ caminhoMotor = execSync('command -v node', {
277
+ encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'], shell: '/bin/bash',
278
+ }).trim();
279
+ } catch {
280
+ caminhoMotor = process.execPath || '';
281
+ }
282
+
283
+ let versaoMotor = '';
211
284
  try {
212
- const v = execSync('npx --version', { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
213
- success(`Node/npx no caminho: npx ${v}`);
285
+ versaoMotor = execSync('node --version', { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
214
286
  } catch {
215
- error('Node/npx nao encontrado no caminho deste programa');
216
- problemas.push('O app do Claude aberto pelo icone nao enxerga o Node. Abra o Ops e peca o *bootstrap, ou abra o Claude pelo Terminal.');
287
+ versaoMotor = '';
288
+ }
289
+
290
+ if (versaoMotor) {
291
+ success(diagnostico.resumoDoMotor({ versao: versaoMotor, caminho: caminhoMotor }));
292
+ } else {
293
+ error('Nao encontrei o motor do sistema nesta janela');
294
+ problemas.push('Rode o instalador de novo: arka.education/install.sh (no Windows, install.ps1).');
295
+ }
296
+
297
+ const visao = diagnostico.appEnxergaMotor({ homeDir, pathAtual: process.env.PATH || '', caminhoMotor });
298
+ if (visao.visivel && !visao.motivo) {
299
+ success('O programa aberto pelo icone tambem enxerga o motor');
300
+ } else {
301
+ error(visao.motivo || 'O programa aberto pelo icone pode nao enxergar o motor');
302
+ problemas.push('Rode o instalador de novo (arka.education/install.sh) e, depois, FECHE e abra o Claude Code ou o Codex.');
217
303
  }
218
304
 
219
305
  // 3. registro do MCP nos dois runtimes
@@ -316,11 +402,12 @@ async function patchEnableAllProjectMcpServers(targetDir) {
316
402
  }
317
403
 
318
404
  // ─── INSTALACAO ──────────────────────────────────────────
319
- async function init() {
405
+ async function init({ pasta = null } = {}) {
320
406
  showBanner();
321
407
  await sleep(500);
322
408
 
323
- const targetDir = process.cwd();
409
+ const targetDir = pasta ? resolverPastaAlvo(pasta, process.cwd()) : process.cwd();
410
+ if (pasta) process.chdir(targetDir);
324
411
  const sourceDir = path.resolve(__dirname, '..');
325
412
  const homeDir = require('os').homedir();
326
413
 
@@ -758,6 +845,8 @@ async function init() {
758
845
  step('Verificando integridade...');
759
846
  await runHealthChecks(targetDir);
760
847
 
848
+ registrarInstallLog('init', `ok versao=${PKG_VERSION} maquina=${idDaMaquina()}`);
849
+
761
850
  // ─── Resultado final
762
851
  console.log(`
763
852
  ${PURPLE}${BOLD} ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}
@@ -964,7 +1053,11 @@ ${DIM} Auroq OS v${PKG_VERSION} — Sistema Operacional de IA para Experts${RES
964
1053
  const command = process.argv[2];
965
1054
 
966
1055
  if (command === 'init' || command === 'install') {
967
- init().catch(err => {
1056
+ // `--pasta <nome>`: o instalador manda o CLI criar e entrar na pasta do negocio,
1057
+ // em vez de depender de um `cd` ter dado certo la fora (PRD Embarque §6).
1058
+ const iPasta = process.argv.indexOf('--pasta');
1059
+ const pasta = iPasta !== -1 ? process.argv[iPasta + 1] : null;
1060
+ init({ pasta }).catch(err => {
968
1061
  error(`Falha na instalacao: ${err.message}`);
969
1062
  process.exit(1);
970
1063
  });
@@ -992,8 +1085,10 @@ if (command === 'init' || command === 'install') {
992
1085
  process.exit(1);
993
1086
  });
994
1087
  } else if (command === 'whoami') {
1088
+ // Codigo de saida honesto: 0 so com sessao salva e ultimo status 'ativo'.
1089
+ // Quem precisa do portao de verdade (online) usa `check-access`.
995
1090
  try {
996
- auth.whoami();
1091
+ process.exit(auth.whoami() ? 0 : 1);
997
1092
  } catch (err) {
998
1093
  error(`Falha: ${err.message}`);
999
1094
  process.exit(1);
@@ -0,0 +1,102 @@
1
+ # Instalador do Auroq OS
2
+
3
+ Os dois scripts desta pasta são a **porta de entrada do aluno**. Depois de baixar
4
+ o Claude Code ou o Codex, ele cola **um endereço** e o resto acontece sozinho:
5
+
6
+ ```
7
+ Mac: curl -fsSL https://arka.education/install.sh | bash
8
+ Windows: irm https://arka.education/install.ps1 | iex
9
+ ```
10
+
11
+ Contrato completo: `arka1/docs/prd/prd-embarque-2-passos.md`.
12
+
13
+ ## O que eles fazem, nesta ordem
14
+
15
+ 1. **Diagnóstico** — sistema, versão mínima, espaço em disco, internet
16
+ 2. **Git** — Mac: abre a janela das ferramentas da Apple e espera; Windows: winget, com o instalador oficial como reserva
17
+ 3. **Motor** — reaproveita o que já existe se servir; senão baixa o oficial pra uma pasta do próprio usuário, confere a soma SHA256 e publica no ambiente dele
18
+ 4. **Login da mentoria** — mesma checagem do resto do sistema; só contrato `ativo` instala
19
+ 5. **Pasta do negócio** — pergunta o nome, valida e cria
20
+ 6. **Montagem** — chama o `init`, que é quem registra o conteúdo ao vivo (ADR-7)
21
+ 7. **Fecho** — diz pra fechar e abrir o programa, e como chamar o Ops
22
+
23
+ ## Regras que não se negociam
24
+
25
+ - **Sem `sudo`, sem Administrador.** No Mac a única janela é a da Apple; no Windows, a de permissão do winget.
26
+ - **Bash 3.2 e PowerShell 5.1.** É o que vem de fábrica nas máquinas dos alunos. Nada de `declare -A`, `${var,,}`, `mapfile` ou `&&`.
27
+ - **Toda falha diz três coisas:** o que aconteceu, o que fazer agora e o contato do suporte. Um instalador que trava calado é pior que o passo a passo manual.
28
+ - **O aluno não lê jargão.** Nada de `npm`, `npx`, `PATH`, "binário", "runtime" na tela. O motor é "o motor do sistema".
29
+ - **O instalador não escreve o registro do conteúdo ao vivo.** Quem faz isso é o `init` — um dono só pra esse arquivo.
30
+ - **Nada é apagado.** Node, Homebrew e nvm que o aluno já tinha ficam onde estão.
31
+
32
+ ## A falha que mais importa
33
+
34
+ O programa aberto pelo ícone (Dock no Mac, Menu Iniciar no Windows) monta o
35
+ ambiente lendo o **perfil do usuário**, não a janela onde a instalação rodou. Se o
36
+ motor ficar só na sessão, tudo funciona no terminal, nada funciona no app — e
37
+ **não aparece erro nenhum**. O aluno só vê um Companion que não sabe de nada.
38
+
39
+ Por isso o instalador escreve nos dois arquivos de perfil (`~/.zshrc` e
40
+ `~/.zprofile`) e o `auroq-os doctor` compara o que o perfil declara com o que está
41
+ valendo agora. Se você mexer nessa parte, rode `tests/diagnostico.test.mjs`.
42
+
43
+ ## Testar sem instalar nada
44
+
45
+ Os dois scripts têm modo ensaio e modo biblioteca.
46
+
47
+ ```bash
48
+ # ensaio: mostra o plano inteiro e não toca na máquina
49
+ AUROQ_INSTALL_DRY_RUN=1 AUROQ_INSTALL_PASTA=minha-empresa bash installer/install.sh
50
+
51
+ # simular máquina velha, disco cheio, sem internet
52
+ AUROQ_INSTALL_DRY_RUN=1 AUROQ_INSTALL_FAKE_MACOS=12.6 bash installer/install.sh
53
+ AUROQ_INSTALL_DRY_RUN=1 AUROQ_INSTALL_FAKE_DISCO_MB=300 bash installer/install.sh
54
+ AUROQ_INSTALL_DRY_RUN=1 AUROQ_INSTALL_FAKE_SEM_INTERNET=1 bash installer/install.sh
55
+
56
+ # biblioteca: carrega só as funções, pra testar decisão por decisão
57
+ AUROQ_INSTALL_LIB=1 . installer/install.sh && auroq_validar_pasta "minha-empresa"
58
+ ```
59
+
60
+ No PowerShell é a mesma ideia:
61
+
62
+ ```powershell
63
+ $env:AUROQ_INSTALL_LIB='1'; . ./installer/install.ps1; Test-AuroqPasta 'minha-empresa'
64
+ $env:AUROQ_INSTALL_DRY_RUN='1'; ./installer/install.ps1
65
+ ```
66
+
67
+ | Variável | Pra que serve |
68
+ |---|---|
69
+ | `AUROQ_INSTALL_LIB` | carrega só as funções (testes) |
70
+ | `AUROQ_INSTALL_DRY_RUN` | mostra o plano, não escreve nada |
71
+ | `AUROQ_INSTALL_PASTA` | responde a pergunta do nome da pasta |
72
+ | `AUROQ_INSTALL_HOME` | troca a pasta pessoal (só testes) |
73
+ | `AUROQ_INSTALL_FAKE_MACOS` · `FAKE_BUILD` | finge a versão do sistema |
74
+ | `AUROQ_INSTALL_FAKE_DISCO_MB` | finge o espaço livre |
75
+ | `AUROQ_INSTALL_FAKE_SEM_INTERNET` | finge queda de rede |
76
+
77
+ Suíte: `npm test` (`tests/installer-sh.test.mjs`, `tests/installer-ps1.test.mjs`,
78
+ `tests/diagnostico.test.mjs`, `tests/cli-embarque.test.mjs`).
79
+
80
+ Os testes do PowerShell rodam de verdade quando existe um `pwsh` na máquina —
81
+ inclusive um portátil, apontado por `AUROQ_PWSH=/caminho/pwsh`. Sem ele, sobra a
82
+ checagem estrutural, que já pega as pegadinhas clássicas do 5.1.
83
+
84
+ ## Publicar
85
+
86
+ A fonte da verdade é **esta pasta**. A plataforma serve uma cópia; quem copia é o
87
+ script, nunca a mão:
88
+
89
+ ```bash
90
+ cd ../plataforma-arcane && npm run sync:installer # copia
91
+ cd ../plataforma-arcane && npm run sync:installer:check # confere se está igual
92
+ ```
93
+
94
+ O `sync:installer:check` roda no `pretest` da plataforma: se alguém editar a cópia
95
+ em vez do original, o teste quebra e diz qual é o certo.
96
+
97
+ ## `--pasta`, no CLI
98
+
99
+ `npx auroq-os init --pasta minha-empresa` cria a pasta e instala dentro dela.
100
+ Existe pra quem não pode depender de um `cd` ter funcionado. O instalador do Mac
101
+ entra na pasta antes de chamar o `init`, então não precisa da opção — mas ela é a
102
+ rede de segurança de qualquer outro chamador.