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
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Diagnostico do motor — as perguntas que o `doctor` faz em voz alta.
|
|
3
|
+
*
|
|
4
|
+
* Existe por causa de uma falha que nao aparece na tela: o programa aberto pelo
|
|
5
|
+
* icone (Dock no Mac, Menu Iniciar no Windows) monta o ambiente lendo o perfil do
|
|
6
|
+
* usuario, nao a janela do terminal onde a instalacao rodou. Se o motor ficou so
|
|
7
|
+
* na sessao, tudo funciona no terminal e nada funciona no app — e o aluno conclui
|
|
8
|
+
* que o Companion "nao sabe de nada".
|
|
9
|
+
*
|
|
10
|
+
* PRD "Embarque em 2 passos" §5.4.
|
|
11
|
+
*/
|
|
12
|
+
const fs = require('fs');
|
|
13
|
+
const path = require('path');
|
|
14
|
+
|
|
15
|
+
const INICIO = '# >>> auroq >>>';
|
|
16
|
+
const FIM = '# <<< auroq <<<';
|
|
17
|
+
const PERFIS = ['.zshrc', '.zprofile'];
|
|
18
|
+
const NODE_MIN = 20;
|
|
19
|
+
|
|
20
|
+
/** Devolve o caminho que o bloco do instalador publica, ou null. */
|
|
21
|
+
function lerBlocoAuroq(conteudo) {
|
|
22
|
+
if (!conteudo || typeof conteudo !== 'string') return null;
|
|
23
|
+
const i = conteudo.indexOf(INICIO);
|
|
24
|
+
if (i === -1) return null;
|
|
25
|
+
const f = conteudo.indexOf(FIM, i);
|
|
26
|
+
const trecho = f === -1 ? conteudo.slice(i) : conteudo.slice(i, f);
|
|
27
|
+
const m = trecho.match(/export PATH="([^":]+):\$PATH"/);
|
|
28
|
+
return m ? m[1] : null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* O programa aberto pelo icone vai enxergar o motor?
|
|
33
|
+
*
|
|
34
|
+
* No Mac a resposta mora nos perfis do usuario. No Windows o ambiente do usuario
|
|
35
|
+
* ja e herdado pelo processo grafico, entao a pergunta se resolve no proprio PATH.
|
|
36
|
+
*/
|
|
37
|
+
function appEnxergaMotor({ homeDir, pathAtual = '', caminhoMotor = '', plataforma = process.platform } = {}) {
|
|
38
|
+
const partes = String(pathAtual).split(plataforma === 'win32' ? ';' : ':').filter(Boolean);
|
|
39
|
+
|
|
40
|
+
if (plataforma === 'win32') {
|
|
41
|
+
const temAuroq = partes.some((p) => /auroq/i.test(p));
|
|
42
|
+
return {
|
|
43
|
+
visivel: partes.length > 0,
|
|
44
|
+
perfisSemBloco: [],
|
|
45
|
+
motivo: temAuroq ? '' : 'O motor esta valendo nesta janela.',
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const perfisSemBloco = [];
|
|
50
|
+
const conteudos = [];
|
|
51
|
+
let declarado = null;
|
|
52
|
+
for (const nome of PERFIS) {
|
|
53
|
+
let conteudo = null;
|
|
54
|
+
try {
|
|
55
|
+
conteudo = fs.readFileSync(path.join(homeDir, nome), 'utf8');
|
|
56
|
+
} catch {
|
|
57
|
+
conteudo = null;
|
|
58
|
+
}
|
|
59
|
+
conteudos.push(conteudo || '');
|
|
60
|
+
const bin = lerBlocoAuroq(conteudo);
|
|
61
|
+
if (bin) declarado = declarado || bin;
|
|
62
|
+
else perfisSemBloco.push(nome);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// A pergunta e "o app aberto pelo icone vai achar UM motor?", nao "o instalador
|
|
66
|
+
// passou por aqui?". Quem ja tinha Homebrew ou nvm declarado no perfil esta
|
|
67
|
+
// servido — acusar essa gente encheria o suporte de chamado sem defeito.
|
|
68
|
+
if (!declarado && caminhoMotor) {
|
|
69
|
+
const dir = path.dirname(String(caminhoMotor));
|
|
70
|
+
// /usr/bin e /bin ja estao no caminho padrao de qualquer programa do sistema
|
|
71
|
+
if (dir === '/usr/bin' || dir === '/bin') {
|
|
72
|
+
return { visivel: true, perfisSemBloco: [], motivo: '' };
|
|
73
|
+
}
|
|
74
|
+
const juntos = conteudos.join('\n');
|
|
75
|
+
const raiz = dir.replace(/\/(bin|sbin)$/, '');
|
|
76
|
+
if (juntos.includes(dir) || (raiz && raiz !== dir && juntos.includes(raiz))) {
|
|
77
|
+
return { visivel: true, perfisSemBloco: [], motivo: '' };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (!declarado) {
|
|
82
|
+
return {
|
|
83
|
+
visivel: false,
|
|
84
|
+
perfisSemBloco,
|
|
85
|
+
motivo: 'O motor nao esta no seu perfil: quem abre o programa pelo icone (Dock) pode nao enxergar ele.',
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
if (perfisSemBloco.length > 0) {
|
|
89
|
+
return {
|
|
90
|
+
visivel: false,
|
|
91
|
+
perfisSemBloco,
|
|
92
|
+
motivo: `Falta o motor em ${perfisSemBloco.join(' e ')} — dependendo de como voce abre o programa, ele nao aparece.`,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
const noPathAgora = partes.some((p) => p === declarado || p.startsWith(declarado));
|
|
96
|
+
return {
|
|
97
|
+
visivel: true,
|
|
98
|
+
perfisSemBloco: [],
|
|
99
|
+
motivo: noPathAgora ? '' : 'Esta no seu perfil. Feche e abra o programa pra ele passar a enxergar.',
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** De onde veio o motor que esta rodando — importa quando ha mais de um. */
|
|
104
|
+
function origemDoMotor(caminho) {
|
|
105
|
+
if (!caminho || typeof caminho !== 'string') return 'desconhecida';
|
|
106
|
+
if (caminho.includes('/.auroq/') || /\\Auroq\\/i.test(caminho)) return 'Auroq';
|
|
107
|
+
if (caminho.includes('/.nvm/') || caminho.includes('/.fnm/')) return 'nvm';
|
|
108
|
+
if (caminho.startsWith('/opt/homebrew/') || caminho.startsWith('/usr/local/')) return 'Homebrew';
|
|
109
|
+
if (caminho.startsWith('/usr/')) return 'sistema';
|
|
110
|
+
return 'desconhecida';
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Uma frase que o aluno entende, sem jargao. */
|
|
114
|
+
function resumoDoMotor({ versao = '', caminho = '' } = {}) {
|
|
115
|
+
const limpa = String(versao).replace(/^v/, '');
|
|
116
|
+
const maior = parseInt(limpa.split('.')[0], 10);
|
|
117
|
+
const origem = origemDoMotor(caminho);
|
|
118
|
+
const base = `Motor do sistema: ${limpa || 'nao encontrado'} (instalado por: ${origem})`;
|
|
119
|
+
if (Number.isFinite(maior) && maior < NODE_MIN) {
|
|
120
|
+
return `${base} — esse motor e antigo demais pro sistema; rode o instalador de novo.`;
|
|
121
|
+
}
|
|
122
|
+
return base;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
module.exports = { lerBlocoAuroq, appEnxergaMotor, origemDoMotor, resumoDoMotor, PERFIS };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "auroq-os",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.1",
|
|
4
4
|
"description": "Auroq OS — Sistema Operacional de IA para Experts",
|
|
5
5
|
"bin": {
|
|
6
6
|
"auroq-os": "bin/auroq-os.js"
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"auroq:sync:codex:check": "npm run sync:codex:check",
|
|
19
19
|
"auroq:validate": "npm run validate:hybrid",
|
|
20
20
|
"validate:hybrid": "node scripts/validate-hybrid.mjs",
|
|
21
|
-
"lint": "node --check bin/auroq-os.js && node --check lib/auth.js && node --check lib/credentials.js && node --check lib/onepassword.js && node --check lib/supabase.js && node --check scripts/sync-codex-skills.mjs && node --check scripts/validate-hybrid.mjs && node --check scripts/prepack-casca.mjs && node --check scripts/postpack-casca.mjs",
|
|
21
|
+
"lint": "node --check bin/auroq-os.js && node --check lib/auth.js && node --check lib/diagnostico.js && node --check lib/credentials.js && node --check lib/onepassword.js && node --check lib/supabase.js && node --check scripts/sync-codex-skills.mjs && node --check scripts/validate-hybrid.mjs && node --check scripts/prepack-casca.mjs && node --check scripts/postpack-casca.mjs",
|
|
22
22
|
"typecheck": "npm run validate:hybrid",
|
|
23
23
|
"test": "node --test tests/*.test.mjs",
|
|
24
24
|
"prepack": "node scripts/prepack-casca.mjs",
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
"bin/",
|
|
30
30
|
"lib/",
|
|
31
31
|
"scripts/",
|
|
32
|
+
"installer/",
|
|
32
33
|
"seeds/",
|
|
33
34
|
".auroq-core/core/",
|
|
34
35
|
".auroq-core/core-config.yaml",
|