auroq-os 2.3.7 → 2.4.1
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 +22 -0
- package/bin/auroq-os.js +106 -11
- package/installer/README.md +102 -0
- package/installer/install.ps1 +515 -0
- package/installer/install.sh +553 -0
- package/lib/auth.js +14 -2
- package/lib/diagnostico.js +125 -0
- package/package.json +3 -2
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 = [];
|
|
@@ -177,7 +237,7 @@ async function runHealthChecks(targetDir) {
|
|
|
177
237
|
} else {
|
|
178
238
|
error(`${passed}/${HEALTH_CHECKS.length} verificacoes OK — arquivo de autoload faltando:`);
|
|
179
239
|
for (const item of missing) error(` - ${item}`);
|
|
180
|
-
error('Nenhum arquivo de autoload pode faltar em silencio. Contato: 11
|
|
240
|
+
error('Nenhum arquivo de autoload pode faltar em silencio. Contato: 11 93621-4486');
|
|
181
241
|
process.exit(1);
|
|
182
242
|
}
|
|
183
243
|
return { passed, total: HEALTH_CHECKS.length };
|
|
@@ -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.
|
|
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
|
-
|
|
213
|
-
success(`Node/npx no caminho: npx ${v}`);
|
|
285
|
+
versaoMotor = execSync('node --version', { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
|
|
214
286
|
} catch {
|
|
215
|
-
|
|
216
|
-
|
|
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
|
|
@@ -274,7 +360,7 @@ async function runDoctor(targetDir) {
|
|
|
274
360
|
error(`${problemas.length} coisa(s) pra resolver:`);
|
|
275
361
|
for (const p of problemas) log(` ${DIM}- ${p}${RESET}`);
|
|
276
362
|
log('');
|
|
277
|
-
log(`${DIM}Se travar, chame o suporte: 11
|
|
363
|
+
log(`${DIM}Se travar, chame o suporte: 11 93621-4486${RESET}`);
|
|
278
364
|
return 1;
|
|
279
365
|
}
|
|
280
366
|
|
|
@@ -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
|
-
|
|
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.
|