auroq-os 2.4.0 → 2.4.2
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/bin/auroq-os.js +23 -2
- package/installer/install.ps1 +128 -50
- package/installer/install.sh +83 -11
- package/lib/auth.js +1 -1
- package/package.json +1 -1
package/bin/auroq-os.js
CHANGED
|
@@ -59,6 +59,20 @@ function sleep(ms) { return new Promise(r => setTimeout(r, ms)); }
|
|
|
59
59
|
// Pergunta sim/nao no terminal. Funciona em TTY e com stdin encadeado (pipe).
|
|
60
60
|
// Se o stdin estiver fechado (automatos/CI), question() nunca resolve — por isso
|
|
61
61
|
// a corrida com o evento 'close': EOF vira resposta vazia, ou seja, "nao".
|
|
62
|
+
/**
|
|
63
|
+
* Grava no core-config da instalacao a versao que esta sendo instalada agora e
|
|
64
|
+
* o dia de hoje. Sem isso os dois campos ficam congelados no que o arquivo
|
|
65
|
+
* modelo trazia dentro do pacote.
|
|
66
|
+
*/
|
|
67
|
+
async function carimbarVersao(configPath) {
|
|
68
|
+
if (!(await fs.pathExists(configPath))) return;
|
|
69
|
+
let texto = await fs.readFile(configPath, 'utf8');
|
|
70
|
+
const hoje = new Date().toISOString().slice(0, 10);
|
|
71
|
+
texto = texto.replace(/^(\s*version:).*$/m, `$1 ${PKG_VERSION}`);
|
|
72
|
+
texto = texto.replace(/^(\s*installedAt:).*$/m, `$1 '${hoje}'`);
|
|
73
|
+
await fs.writeFile(configPath, texto);
|
|
74
|
+
}
|
|
75
|
+
|
|
62
76
|
async function askYesNo(question) {
|
|
63
77
|
const readline = require('node:readline/promises');
|
|
64
78
|
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
@@ -237,7 +251,7 @@ async function runHealthChecks(targetDir) {
|
|
|
237
251
|
} else {
|
|
238
252
|
error(`${passed}/${HEALTH_CHECKS.length} verificacoes OK — arquivo de autoload faltando:`);
|
|
239
253
|
for (const item of missing) error(` - ${item}`);
|
|
240
|
-
error('Nenhum arquivo de autoload pode faltar em silencio. Contato: 11
|
|
254
|
+
error('Nenhum arquivo de autoload pode faltar em silencio. Contato: 11 93621-4486');
|
|
241
255
|
process.exit(1);
|
|
242
256
|
}
|
|
243
257
|
return { passed, total: HEALTH_CHECKS.length };
|
|
@@ -360,7 +374,7 @@ async function runDoctor(targetDir) {
|
|
|
360
374
|
error(`${problemas.length} coisa(s) pra resolver:`);
|
|
361
375
|
for (const p of problemas) log(` ${DIM}- ${p}${RESET}`);
|
|
362
376
|
log('');
|
|
363
|
-
log(`${DIM}Se travar, chame o suporte: 11
|
|
377
|
+
log(`${DIM}Se travar, chame o suporte: 11 93621-4486${RESET}`);
|
|
364
378
|
return 1;
|
|
365
379
|
}
|
|
366
380
|
|
|
@@ -736,6 +750,13 @@ async function init({ pasta = null } = {}) {
|
|
|
736
750
|
}
|
|
737
751
|
success(`${copied} arquivos instalados`);
|
|
738
752
|
|
|
753
|
+
// O core-config.yaml e copiado cru do pacote. Como ninguem lembra de edita-lo
|
|
754
|
+
// a cada release, toda instalacao nova jurava ser a versao de quando o arquivo
|
|
755
|
+
// foi escrito — 2.2.4 numa maquina rodando 2.4.1, no piloto de 27/08. Quem
|
|
756
|
+
// abre um chamado com esse numero manda o suporte investigar a versao errada.
|
|
757
|
+
// Carimbar aqui e a unica forma de nunca mais divergir.
|
|
758
|
+
await carimbarVersao(path.join(targetDir, '.auroq-core', 'core-config.yaml'));
|
|
759
|
+
|
|
739
760
|
const seedRoot = path.join(sourceDir, 'seeds');
|
|
740
761
|
if (await fs.pathExists(seedRoot)) {
|
|
741
762
|
await fs.copy(seedRoot, targetDir, { overwrite: false });
|
package/installer/install.ps1
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Auroq OS
|
|
1
|
+
# Auroq OS - instalador do Windows.
|
|
2
2
|
#
|
|
3
3
|
# irm https://arka.education/install.ps1 | iex
|
|
4
4
|
#
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
# de execucao nao entra aqui: ela so afeta arquivo .ps1 salvo em disco, e este
|
|
7
7
|
# script roda em memoria. Exigir elevacao era resto da era npm.
|
|
8
8
|
#
|
|
9
|
-
# Ordem obrigatoria (PRD "Embarque em 2 passos"
|
|
9
|
+
# Ordem obrigatoria (PRD "Embarque em 2 passos" sec. 4.2):
|
|
10
10
|
# diagnostico -> Git -> motor -> login da mentoria -> pasta do negocio -> init
|
|
11
11
|
#
|
|
12
12
|
# O `init` e quem escreve o registro do conteudo ao vivo (ADR-7).
|
|
@@ -14,14 +14,27 @@
|
|
|
14
14
|
# Modo biblioteca (usado pelos testes): $env:AUROQ_INSTALL_LIB='1'; . install.ps1
|
|
15
15
|
# Modo ensaio (nao toca em nada): $env:AUROQ_INSTALL_DRY_RUN='1'
|
|
16
16
|
|
|
17
|
-
# TLS 1.2 antes de qualquer download
|
|
17
|
+
# TLS 1.2 antes de qualquer download - sem isto o Windows 10 antigo estoura em SSL.
|
|
18
|
+
# ATENCAO: este arquivo e ASCII PURO de proposito. Nao coloque acento, travessao
|
|
19
|
+
# nem simbolo aqui.
|
|
20
|
+
#
|
|
21
|
+
# O Windows PowerShell 5.1 (o que vem no Windows, e o que o aluno usa) le script
|
|
22
|
+
# sem BOM na codepage do sistema - Windows-1252 no Brasil. Cada caractere UTF-8
|
|
23
|
+
# de dois ou tres bytes vira lixo, e o parser morre com "Missing closing '}'"
|
|
24
|
+
# antes de executar UMA linha. Provado numa maquina Windows real: lido como
|
|
25
|
+
# Windows-1252 => 4 erros de sintaxe; lido como UTF-8 => nenhum.
|
|
26
|
+
#
|
|
27
|
+
# ASCII puro resolve os dois caminhos de uma vez: rodar o arquivo do disco e
|
|
28
|
+
# baixar por `irm ... | iex`, onde a decodificacao depende do que o servidor
|
|
29
|
+
# declara.
|
|
30
|
+
|
|
18
31
|
try {
|
|
19
32
|
[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12
|
|
20
33
|
} catch {
|
|
21
34
|
# PowerShell 7 ja negocia TLS moderno sozinho
|
|
22
35
|
}
|
|
23
36
|
|
|
24
|
-
$AuroqSuporte = '11
|
|
37
|
+
$AuroqSuporte = '11 93621-4486'
|
|
25
38
|
$AuroqNodeMin = 20
|
|
26
39
|
$AuroqBuildMin = 17763 # Windows 10 1809
|
|
27
40
|
$AuroqDiscoMinMb = 2048
|
|
@@ -38,7 +51,7 @@ function Get-AuroqNodeDir {
|
|
|
38
51
|
return (Join-Path $base 'Auroq\node')
|
|
39
52
|
}
|
|
40
53
|
|
|
41
|
-
#
|
|
54
|
+
# --- Fala com o aluno ---------------------------------------------------------
|
|
42
55
|
|
|
43
56
|
function Write-AuroqTitulo { param([string]$Texto) Write-Host ''; Write-Host " $Texto" -ForegroundColor Magenta; Write-Host '' }
|
|
44
57
|
function Write-AuroqPasso { param([string]$Texto) Write-Host ''; Write-Host " > $Texto" -ForegroundColor Cyan }
|
|
@@ -60,7 +73,7 @@ function Write-AuroqErro {
|
|
|
60
73
|
exit 1
|
|
61
74
|
}
|
|
62
75
|
|
|
63
|
-
#
|
|
76
|
+
# --- Registro pro suporte (sec. 5.7) ----------------------------------------------
|
|
64
77
|
# Uma linha por evento. Nunca entra senha, token ou e-mail.
|
|
65
78
|
|
|
66
79
|
function Write-AuroqLog {
|
|
@@ -76,7 +89,7 @@ function Write-AuroqLog {
|
|
|
76
89
|
}
|
|
77
90
|
}
|
|
78
91
|
|
|
79
|
-
#
|
|
92
|
+
# --- Decisoes puras (testadas uma a uma) --------------------------------------
|
|
80
93
|
|
|
81
94
|
# So letras minusculas, numeros e hifen. -cmatch porque o -match do PowerShell
|
|
82
95
|
# ignora maiuscula por padrao e deixaria passar "MinhaEmpresa".
|
|
@@ -104,7 +117,7 @@ function Get-AuroqNodeZip {
|
|
|
104
117
|
return "node-v$Versao-win-$alvo.zip"
|
|
105
118
|
}
|
|
106
119
|
|
|
107
|
-
# nova | vazia | auroq | ocupada
|
|
120
|
+
# nova | vazia | auroq | ocupada - decidido ANTES de escrever qualquer coisa.
|
|
108
121
|
function Get-AuroqEstadoPasta {
|
|
109
122
|
param([string]$Caminho = '')
|
|
110
123
|
if (-not (Test-Path $Caminho)) { return 'nova' }
|
|
@@ -115,9 +128,9 @@ function Get-AuroqEstadoPasta {
|
|
|
115
128
|
return 'ocupada'
|
|
116
129
|
}
|
|
117
130
|
|
|
118
|
-
#
|
|
131
|
+
# --- O motor visivel pra quem abre pelo icone (sec. 5.4) --------------------------
|
|
119
132
|
# No Windows o programa aberto pelo Menu Iniciar herda o ambiente do USUARIO.
|
|
120
|
-
# Gravar no escopo da maquina inteira exigiria elevacao
|
|
133
|
+
# Gravar no escopo da maquina inteira exigiria elevacao - o PRD proibe pedir isso.
|
|
121
134
|
|
|
122
135
|
function Set-AuroqPath {
|
|
123
136
|
param([string]$Bin = '')
|
|
@@ -129,7 +142,45 @@ function Set-AuroqPath {
|
|
|
129
142
|
$env:Path = "$Bin;$env:Path"
|
|
130
143
|
}
|
|
131
144
|
|
|
132
|
-
#
|
|
145
|
+
# --- Como chamar o npx sem esbarrar na politica do Windows ----------------------
|
|
146
|
+
|
|
147
|
+
# O PowerShell resolve `.ps1` antes de `.cmd`. Chamado pelado, `npx` vira
|
|
148
|
+
# `npx.ps1` (um arquivo em disco) e a politica padrao do Windows recusa abrir
|
|
149
|
+
# arquivo de script. Num piloto real a instalacao morreu exatamente ai, com
|
|
150
|
+
# "npx.ps1 cannot be loaded because running scripts is disabled on this system".
|
|
151
|
+
#
|
|
152
|
+
# Mexer na politica resolveria e esta proibido (ADR-3: zero privilegio, e mudar
|
|
153
|
+
# regra de seguranca da maquina do aluno pra instalar um sistema e abuso).
|
|
154
|
+
# O `.cmd` faz o mesmo trabalho e nao passa pelo interpretador de script.
|
|
155
|
+
function Get-AuroqNpx {
|
|
156
|
+
$doMotor = Join-Path (Get-AuroqNodeDir) 'npx.cmd'
|
|
157
|
+
if (Test-Path $doMotor) { return $doMotor }
|
|
158
|
+
|
|
159
|
+
# Quem ja tinha Node nem baixa o motor de bolso: a pasta acima nao existe.
|
|
160
|
+
$noCaminho = Get-Command 'npx.cmd' -ErrorAction SilentlyContinue
|
|
161
|
+
if ($noCaminho) { return $noCaminho.Source }
|
|
162
|
+
|
|
163
|
+
return 'npx.cmd'
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
# --- A ferramenta do aluno, visivel de qualquer janela --------------------------
|
|
167
|
+
|
|
168
|
+
# O Claude Code se instala em %USERPROFILE%\.local\bin e nao publica essa pasta
|
|
169
|
+
# no ambiente do usuario. Resultado do piloto: o aluno terminava a parada 1,
|
|
170
|
+
# digitava `claude`, nao acontecia nada, e concluia que a instalacao falhou.
|
|
171
|
+
function Set-AuroqCaminhoDaFerramenta {
|
|
172
|
+
$bin = Join-Path $env:USERPROFILE '.local\bin'
|
|
173
|
+
if (-not (Test-Path (Join-Path $bin 'claude.exe'))) { return }
|
|
174
|
+
|
|
175
|
+
$atual = [Environment]::GetEnvironmentVariable('Path', 'User')
|
|
176
|
+
if ($atual -and ($atual -split ';' | Where-Object { $_ -eq $bin })) { return }
|
|
177
|
+
|
|
178
|
+
Set-AuroqPath $bin
|
|
179
|
+
Write-AuroqOk 'Deixei o Claude Code visivel em qualquer janela'
|
|
180
|
+
Write-AuroqLog 'ferramenta' 'claude-publicado'
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
# --- Passo 1: diagnostico (sec. 5.1) ----------------------------------------------
|
|
133
184
|
|
|
134
185
|
function Test-AuroqMaquina {
|
|
135
186
|
Write-AuroqPasso 'Vendo o seu computador...'
|
|
@@ -150,7 +201,7 @@ function Test-AuroqMaquina {
|
|
|
150
201
|
|
|
151
202
|
$chip = $env:PROCESSOR_ARCHITECTURE
|
|
152
203
|
if (-not $chip) { $chip = 'AMD64' }
|
|
153
|
-
Write-AuroqOk "Windows 64 bits, compilacao $build
|
|
204
|
+
Write-AuroqOk "Windows 64 bits, compilacao $build - serve"
|
|
154
205
|
|
|
155
206
|
$livreMb = 999999
|
|
156
207
|
if ($env:AUROQ_INSTALL_FAKE_DISCO_MB) {
|
|
@@ -181,7 +232,7 @@ function Test-AuroqMaquina {
|
|
|
181
232
|
Write-AuroqLog 'diagnostico' "build=$build chip=$chip disco_mb=$livreMb"
|
|
182
233
|
}
|
|
183
234
|
|
|
184
|
-
#
|
|
235
|
+
# --- Passo 2: Git (sec. 5.2) ------------------------------------------------------
|
|
185
236
|
|
|
186
237
|
function Test-AuroqGitResponde {
|
|
187
238
|
try {
|
|
@@ -190,10 +241,19 @@ function Test-AuroqGitResponde {
|
|
|
190
241
|
} catch {
|
|
191
242
|
# segue pro caminho padrao
|
|
192
243
|
}
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
244
|
+
# Dois lugares, porque sao duas instalacoes possiveis: com administrador o Git
|
|
245
|
+
# vai pra Program Files; sem administrador ele vai pra pasta do usuario. Olhar
|
|
246
|
+
# so o primeiro fazia o script jurar que o Git nao existe e ficar esperando sem fim.
|
|
247
|
+
$candidatos = @(
|
|
248
|
+
(Join-Path $env:ProgramFiles 'Git\cmd\git.exe'),
|
|
249
|
+
(Join-Path ${env:ProgramFiles(x86)} 'Git\cmd\git.exe'),
|
|
250
|
+
(Join-Path $env:LOCALAPPDATA 'Programs\Git\cmd\git.exe')
|
|
251
|
+
)
|
|
252
|
+
foreach ($padrao in $candidatos) {
|
|
253
|
+
if ($padrao -and (Test-Path $padrao)) {
|
|
254
|
+
$env:Path = "$(Split-Path $padrao);$env:Path"
|
|
255
|
+
return $true
|
|
256
|
+
}
|
|
197
257
|
}
|
|
198
258
|
return $false
|
|
199
259
|
}
|
|
@@ -201,7 +261,7 @@ function Test-AuroqGitResponde {
|
|
|
201
261
|
function Install-AuroqGit {
|
|
202
262
|
Write-AuroqPasso 'Verificando o Git (o programa que guarda as versoes do seu trabalho)...'
|
|
203
263
|
|
|
204
|
-
if ($env:AUROQ_INSTALL_DRY_RUN) { Write-AuroqOk 'Git
|
|
264
|
+
if ($env:AUROQ_INSTALL_DRY_RUN) { Write-AuroqOk 'Git - seria verificado aqui'; return }
|
|
205
265
|
|
|
206
266
|
if (Test-AuroqGitResponde) {
|
|
207
267
|
Write-AuroqOk 'Git ja estava instalado'
|
|
@@ -218,7 +278,10 @@ function Install-AuroqGit {
|
|
|
218
278
|
}
|
|
219
279
|
|
|
220
280
|
if ($temWinget) {
|
|
221
|
-
Write-AuroqAviso 'Falta instalar. Vai aparecer uma janela pedindo permissao
|
|
281
|
+
Write-AuroqAviso 'Falta instalar o Git. Vai aparecer uma janela pedindo permissao.'
|
|
282
|
+
Write-AuroqDiz ' Se ela perguntar so "Sim ou Nao", clique em Sim.'
|
|
283
|
+
Write-AuroqDiz ' Se ela pedir SENHA DE ADMINISTRADOR e voce nao tiver, pode fechar:'
|
|
284
|
+
Write-AuroqDiz ' eu instalo de outro jeito, que nao precisa de administrador.'
|
|
222
285
|
& winget install --id Git.Git -e --source winget --accept-package-agreements --accept-source-agreements | Out-Null
|
|
223
286
|
Start-Sleep -Seconds 3
|
|
224
287
|
if (Test-AuroqGitResponde) {
|
|
@@ -226,19 +289,31 @@ function Install-AuroqGit {
|
|
|
226
289
|
Write-AuroqLog 'git' 'instalado-winget'
|
|
227
290
|
return
|
|
228
291
|
}
|
|
229
|
-
|
|
292
|
+
# Nao morre aqui. Quem nao e administrador NUNCA vai conseguir passar dessa
|
|
293
|
+
# janela, e mandar "rode de novo e clique em Sim" tranca essa pessoa num
|
|
294
|
+
# loop. O caminho de baixo instala sem administrador nenhum.
|
|
295
|
+
Write-AuroqAviso 'A janela de permissao nao passou. Vou pelo caminho que nao precisa de administrador.'
|
|
296
|
+
Write-AuroqLog 'git' 'winget-nao-passou'
|
|
230
297
|
}
|
|
231
298
|
|
|
232
|
-
# Windows 10 antigo
|
|
233
|
-
|
|
299
|
+
# Duas situacoes caem aqui: Windows 10 antigo sem winget, e aluno sem direito
|
|
300
|
+
# de administrador. O instalador oficial do Git resolve as duas: ele declara
|
|
301
|
+
# `PrivilegesRequired=none` e sabe instalar so pro usuario, em %LOCALAPPDATA%.
|
|
302
|
+
Write-AuroqAviso 'Vou abrir a pagina oficial do Git no seu navegador.'
|
|
234
303
|
Write-AuroqDiz ' 1. Baixe o instalador que a pagina oferecer'
|
|
235
304
|
Write-AuroqDiz ' 2. De dois cliques no arquivo baixado'
|
|
236
|
-
Write-AuroqDiz ' 3.
|
|
237
|
-
Write-AuroqDiz '
|
|
305
|
+
Write-AuroqDiz ' 3. Se ele perguntar para quem instalar, escolha a opcao de instalar'
|
|
306
|
+
Write-AuroqDiz ' SO PRA VOCE - ela nao pede senha de administrador'
|
|
307
|
+
Write-AuroqDiz ' 4. Clique em "Next" em todas as telas e depois em "Install"'
|
|
308
|
+
Write-AuroqDiz ' 5. No fim, clique em "Finish" e volte pra ca - eu espero'
|
|
238
309
|
Start-Process 'https://git-scm.com/downloads/win'
|
|
239
310
|
|
|
311
|
+
# 20 minutos de espera pelo aluno. O teto e regulavel so pra maquina limpa do
|
|
312
|
+
# CI nao gastar 20 minutos de runner provando uma mensagem.
|
|
313
|
+
$teto = 1200
|
|
314
|
+
if ($env:AUROQ_INSTALL_ESPERA_GIT) { $teto = [int]$env:AUROQ_INSTALL_ESPERA_GIT }
|
|
240
315
|
$esperou = 0
|
|
241
|
-
while ($esperou -lt
|
|
316
|
+
while ($esperou -lt $teto) {
|
|
242
317
|
if (Test-AuroqGitResponde) {
|
|
243
318
|
Write-AuroqOk 'Git instalado'
|
|
244
319
|
Write-AuroqLog 'git' 'instalado-manual'
|
|
@@ -248,15 +323,15 @@ function Install-AuroqGit {
|
|
|
248
323
|
$esperou = $esperou + 10
|
|
249
324
|
if (($esperou % 120) -eq 0) { Write-AuroqDiz " ainda esperando... ($esperou s)" }
|
|
250
325
|
}
|
|
251
|
-
Write-AuroqErro 'A instalacao do Git nao terminou.' 'Termine a instalacao e rode o mesmo comando de novo
|
|
326
|
+
Write-AuroqErro 'A instalacao do Git nao terminou.' 'Termine a instalacao e rode o mesmo comando de novo - nada do que ja foi feito se perde.'
|
|
252
327
|
}
|
|
253
328
|
|
|
254
|
-
#
|
|
329
|
+
# --- Passo 3: o motor (sec. 5.3) --------------------------------------------------
|
|
255
330
|
|
|
256
331
|
function Install-AuroqNode {
|
|
257
332
|
Write-AuroqPasso 'Verificando o motor do sistema...'
|
|
258
333
|
|
|
259
|
-
if ($env:AUROQ_INSTALL_DRY_RUN) { Write-AuroqOk 'Motor
|
|
334
|
+
if ($env:AUROQ_INSTALL_DRY_RUN) { Write-AuroqOk 'Motor - seria instalado em uma pasta sua, sem senha'; return }
|
|
260
335
|
|
|
261
336
|
$atual = ''
|
|
262
337
|
try {
|
|
@@ -309,7 +384,7 @@ function Install-AuroqNode {
|
|
|
309
384
|
}
|
|
310
385
|
if (-not $esperado -or ($esperado.ToLower() -ne $obtido.ToLower())) {
|
|
311
386
|
Remove-Item $destino -Force -ErrorAction SilentlyContinue
|
|
312
|
-
Write-AuroqErro 'O arquivo do motor baixou com defeito.' 'Rode o mesmo comando de novo
|
|
387
|
+
Write-AuroqErro 'O arquivo do motor baixou com defeito.' 'Rode o mesmo comando de novo - o arquivo estragado ja foi apagado.'
|
|
313
388
|
}
|
|
314
389
|
|
|
315
390
|
# mark-of-the-web: sem desbloquear, o Windows recusa abrir o que veio da internet
|
|
@@ -336,12 +411,12 @@ function Install-AuroqNode {
|
|
|
336
411
|
Write-AuroqLog 'motor' "instalado versao=$versao chip=$chip"
|
|
337
412
|
}
|
|
338
413
|
|
|
339
|
-
#
|
|
414
|
+
# --- Passo 4: login da mentoria (sec. 5.5) ----------------------------------------
|
|
340
415
|
|
|
341
416
|
function Invoke-AuroqLogin {
|
|
342
417
|
Write-AuroqPasso 'Agora entre com o seu acesso da Mentoria Arcane.'
|
|
343
418
|
|
|
344
|
-
if ($env:AUROQ_INSTALL_DRY_RUN) { Write-AuroqOk 'Login
|
|
419
|
+
if ($env:AUROQ_INSTALL_DRY_RUN) { Write-AuroqOk 'Login - seria pedido aqui (e-mail e senha da plataforma)'; return }
|
|
345
420
|
|
|
346
421
|
# `check-access` e a mesma regua do resto do sistema: sai com sucesso so com
|
|
347
422
|
# contrato ativo conferido agora. Sem sessao salva, ele mesmo pede e-mail e
|
|
@@ -351,11 +426,11 @@ function Invoke-AuroqLogin {
|
|
|
351
426
|
# sucesso. Usado como pergunta de sim/nao, ele dizia "voce ja estava logado"
|
|
352
427
|
# pra quem nunca logou, pulava o portao e deixava a conta sem acesso chegar ate
|
|
353
428
|
# a criacao da pasta.
|
|
354
|
-
&
|
|
429
|
+
& (Get-AuroqNpx) -y auroq-os@latest check-access
|
|
355
430
|
if ($LASTEXITCODE -ne 0) {
|
|
356
431
|
Write-AuroqLog 'login' 'recusado'
|
|
357
432
|
Write-Host ''
|
|
358
|
-
Write-Host ' Sem acesso ativo, a instalacao para aqui
|
|
433
|
+
Write-Host ' Sem acesso ativo, a instalacao para aqui - e nada foi criado no seu computador.' -ForegroundColor DarkGray
|
|
359
434
|
Write-Host " O que fazer agora: fale com o suporte $AuroqSuporte" -ForegroundColor DarkGray
|
|
360
435
|
Write-Host ''
|
|
361
436
|
exit 1
|
|
@@ -363,11 +438,11 @@ function Invoke-AuroqLogin {
|
|
|
363
438
|
Write-AuroqLog 'login' 'ok'
|
|
364
439
|
}
|
|
365
440
|
|
|
366
|
-
#
|
|
441
|
+
# --- Passo 5: pasta do negocio (sec. 5.6) -----------------------------------------
|
|
367
442
|
|
|
368
443
|
function Get-AuroqPasta {
|
|
369
444
|
Write-AuroqPasso 'Qual o nome da pasta do seu negocio?'
|
|
370
|
-
Write-AuroqDiz '(so letras minusculas e hifen
|
|
445
|
+
Write-AuroqDiz '(so letras minusculas e hifen - ex: minha-empresa)'
|
|
371
446
|
|
|
372
447
|
$nome = $env:AUROQ_INSTALL_PASTA
|
|
373
448
|
$tentativas = 0
|
|
@@ -380,7 +455,7 @@ function Get-AuroqPasta {
|
|
|
380
455
|
$estado = Get-AuroqEstadoPasta $alvo
|
|
381
456
|
if ($estado -eq 'auroq') {
|
|
382
457
|
Write-Host ''
|
|
383
|
-
Write-AuroqAviso "Ja existe um Auroq em $alvo
|
|
458
|
+
Write-AuroqAviso "Ja existe um Auroq em $alvo - nao vou mexer nele."
|
|
384
459
|
Write-AuroqDiz 'Pra conferir se esta tudo certo la, abra essa pasta e rode:'
|
|
385
460
|
Write-AuroqDiz ' auroq-os doctor'
|
|
386
461
|
Write-AuroqLog 'pasta' 'ja-tinha-auroq'
|
|
@@ -394,7 +469,7 @@ function Get-AuroqPasta {
|
|
|
394
469
|
break
|
|
395
470
|
}
|
|
396
471
|
} elseif ([string]::IsNullOrWhiteSpace($nome)) {
|
|
397
|
-
# Enter vazio so repete a pergunta
|
|
472
|
+
# Enter vazio so repete a pergunta - o aluno ainda nao escreveu nada.
|
|
398
473
|
$nome = ''
|
|
399
474
|
} else {
|
|
400
475
|
Write-AuroqDiz 'Esse nome nao serve: use so letras minusculas, numeros e hifen.'
|
|
@@ -408,7 +483,7 @@ function Get-AuroqPasta {
|
|
|
408
483
|
}
|
|
409
484
|
}
|
|
410
485
|
|
|
411
|
-
if ($env:AUROQ_INSTALL_DRY_RUN) { Write-AuroqOk "Pasta $script:AuroqPastaAlvo
|
|
486
|
+
if ($env:AUROQ_INSTALL_DRY_RUN) { Write-AuroqOk "Pasta $script:AuroqPastaAlvo - seria criada aqui"; return }
|
|
412
487
|
|
|
413
488
|
try {
|
|
414
489
|
if (-not (Test-Path $script:AuroqPastaAlvo)) {
|
|
@@ -420,15 +495,15 @@ function Get-AuroqPasta {
|
|
|
420
495
|
Write-AuroqLog 'pasta' 'criada'
|
|
421
496
|
}
|
|
422
497
|
|
|
423
|
-
#
|
|
498
|
+
# --- Passo 6: montar o Auroq --------------------------------------------------
|
|
424
499
|
|
|
425
500
|
function Invoke-AuroqInit {
|
|
426
501
|
Write-AuroqPasso "Montando o Auroq dentro de $script:AuroqPastaAlvo..."
|
|
427
502
|
|
|
428
|
-
if ($env:AUROQ_INSTALL_DRY_RUN) { Write-AuroqOk 'Sistema
|
|
503
|
+
if ($env:AUROQ_INSTALL_DRY_RUN) { Write-AuroqOk 'Sistema - seria montado aqui'; return }
|
|
429
504
|
|
|
430
505
|
Set-Location $script:AuroqPastaAlvo
|
|
431
|
-
&
|
|
506
|
+
& (Get-AuroqNpx) -y auroq-os@latest init
|
|
432
507
|
if ($LASTEXITCODE -ne 0) {
|
|
433
508
|
Write-AuroqLog 'init' 'falhou'
|
|
434
509
|
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.'
|
|
@@ -436,33 +511,36 @@ function Invoke-AuroqInit {
|
|
|
436
511
|
Write-AuroqLog 'init' 'ok'
|
|
437
512
|
}
|
|
438
513
|
|
|
439
|
-
#
|
|
514
|
+
# --- Passo 7: fecho -----------------------------------------------------------
|
|
440
515
|
|
|
441
516
|
function Write-AuroqFecho {
|
|
442
517
|
$nome = Split-Path $script:AuroqPastaAlvo -Leaf
|
|
443
518
|
Write-Host ''
|
|
444
|
-
Write-Host '
|
|
519
|
+
Write-Host ' ---------------------------------------------' -ForegroundColor Magenta
|
|
445
520
|
Write-Host ''
|
|
446
521
|
Write-AuroqDiz "Pronto. O Auroq esta em $script:AuroqPastaAlvo"
|
|
447
522
|
Write-Host ''
|
|
448
523
|
Write-AuroqDiz 'Falta um detalhe importante:'
|
|
449
524
|
Write-Host ''
|
|
450
|
-
Write-AuroqDiz ' 1. FECHE
|
|
451
|
-
Write-AuroqDiz '
|
|
452
|
-
Write-AuroqDiz
|
|
453
|
-
Write-AuroqDiz
|
|
454
|
-
Write-AuroqDiz '
|
|
525
|
+
Write-AuroqDiz ' 1. FECHE esta janela por completo e abra o PowerShell de novo'
|
|
526
|
+
Write-AuroqDiz ' - sem isso ele nao enxerga o que acabou de ser instalado'
|
|
527
|
+
Write-AuroqDiz ' 2. Entre na pasta do seu negocio. Copie e cole esta linha:'
|
|
528
|
+
Write-AuroqDiz " cd `"$script:AuroqPastaAlvo`""
|
|
529
|
+
Write-AuroqDiz ' 3. Abra a ferramenta escrevendo: claude (no Codex: codex)'
|
|
530
|
+
Write-AuroqDiz ' 4. Chame o Ops: /AuroqOS:agents:ops (no Codex: $ops)'
|
|
531
|
+
Write-AuroqDiz ' 5. Digite: *bootstrap'
|
|
455
532
|
Write-Host ''
|
|
456
533
|
Write-AuroqDiz 'O Ops instala o resto e te guia daqui pra frente.'
|
|
457
534
|
Write-Host ''
|
|
458
535
|
Write-AuroqLog 'fim' "ok pasta=$nome"
|
|
459
536
|
}
|
|
460
537
|
|
|
461
|
-
#
|
|
538
|
+
# --- Fluxo --------------------------------------------------------------------
|
|
462
539
|
|
|
463
540
|
function Invoke-AuroqInstalacao {
|
|
464
|
-
Write-AuroqTitulo 'Auroq OS
|
|
541
|
+
Write-AuroqTitulo 'Auroq OS - instalacao'
|
|
465
542
|
Test-AuroqMaquina
|
|
543
|
+
Set-AuroqCaminhoDaFerramenta
|
|
466
544
|
Install-AuroqGit
|
|
467
545
|
Install-AuroqNode
|
|
468
546
|
Invoke-AuroqLogin
|
package/installer/install.sh
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
set -u
|
|
20
20
|
|
|
21
|
-
SUPORTE="11
|
|
21
|
+
SUPORTE="11 93621-4486"
|
|
22
22
|
NODE_MIN=20
|
|
23
23
|
MACOS_MIN=13
|
|
24
24
|
DISCO_MIN_MB=2048
|
|
@@ -174,12 +174,62 @@ auroq_aplicar_path() {
|
|
|
174
174
|
mv "$tmp" "$arquivo"
|
|
175
175
|
}
|
|
176
176
|
|
|
177
|
+
# O motor precisa aparecer em DOIS lugares diferentes, por motivos diferentes.
|
|
178
|
+
#
|
|
179
|
+
# Os arquivos do zsh sao obrigatorios sempre: e por eles que o Claude Code e o
|
|
180
|
+
# Codex abertos pelo ICONE montam o ambiente. Sem isso o app sobe sem erro
|
|
181
|
+
# nenhum e o Companion "nao sabe de nada" (§5.4 do PRD).
|
|
182
|
+
#
|
|
183
|
+
# Os do shell do aluno sao pra janela que ele digita. O macOS 13+ usa zsh e os
|
|
184
|
+
# dois coincidem — mas quem trocou pra bash instalava com sucesso, nao via erro,
|
|
185
|
+
# e depois nenhum comando era reconhecido. Falha silenciosa e a pior de todas:
|
|
186
|
+
# nao tem o que pesquisar, entao a conclusao vira "esse sistema e ruim".
|
|
177
187
|
auroq_publicar_node_no_path() {
|
|
178
188
|
local bin="${1:-}"
|
|
179
189
|
local arquivo
|
|
190
|
+
|
|
191
|
+
# Sempre: o app aberto pelo icone le daqui.
|
|
180
192
|
for arquivo in "${HOME}/.zshrc" "${HOME}/.zprofile"; do
|
|
181
193
|
auroq_aplicar_path "$arquivo" "$bin"
|
|
182
194
|
done
|
|
195
|
+
|
|
196
|
+
case "${SHELL:-}" in
|
|
197
|
+
*zsh )
|
|
198
|
+
: # ja coberto acima
|
|
199
|
+
;;
|
|
200
|
+
*bash )
|
|
201
|
+
for arquivo in "${HOME}/.bash_profile" "${HOME}/.bashrc"; do
|
|
202
|
+
auroq_aplicar_path "$arquivo" "$bin"
|
|
203
|
+
done
|
|
204
|
+
;;
|
|
205
|
+
'' )
|
|
206
|
+
: # sem SHELL definido (roda dentro de outro programa): o zsh cobre
|
|
207
|
+
;;
|
|
208
|
+
* )
|
|
209
|
+
# Nao invento a sintaxe de um shell que nao sei testar. Melhor o aluno
|
|
210
|
+
# saber agora, com nome e saida, do que descobrir que "nada funciona".
|
|
211
|
+
aviso "O seu terminal (${SHELL##*/}) nao e o padrao do Mac, entao eu nao consigo"
|
|
212
|
+
diz " deixar o sistema pronto nele. Use o app Terminal (que vem no Mac) pra"
|
|
213
|
+
diz " trabalhar com o Auroq, ou chame o suporte ${SUPORTE} pra ajustar o seu."
|
|
214
|
+
auroq_registrar_log "path" "shell-nao-suportado=${SHELL##*/}"
|
|
215
|
+
;;
|
|
216
|
+
esac
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
# A ferramenta do aluno (Claude Code) se instala em ~/.local/bin e nem sempre
|
|
220
|
+
# publica essa pasta. Achado num piloto real no Windows: o aluno terminava a
|
|
221
|
+
# parada 1, escrevia `claude`, nao acontecia nada, e concluia que tinha falhado.
|
|
222
|
+
# O mesmo vale aqui — e o conserto e o mesmo caminho que ja publica o motor.
|
|
223
|
+
auroq_publicar_ferramenta_no_path() {
|
|
224
|
+
local bin="${HOME}/.local/bin"
|
|
225
|
+
[ -x "${bin}/claude" ] || return 0
|
|
226
|
+
case ":${PATH}:" in *":${bin}:"* ) return 0 ;; esac
|
|
227
|
+
|
|
228
|
+
auroq_publicar_node_no_path "$bin"
|
|
229
|
+
PATH="${bin}:${PATH}"
|
|
230
|
+
export PATH
|
|
231
|
+
ok_feito "Deixei o Claude Code visivel em qualquer janela"
|
|
232
|
+
auroq_registrar_log "ferramenta" "claude-publicado"
|
|
183
233
|
}
|
|
184
234
|
|
|
185
235
|
# ─── Passo 1: diagnostico (§5.1) ──────────────────────────────────────────────
|
|
@@ -275,6 +325,30 @@ auroq_garantir_git() {
|
|
|
275
325
|
# Fica numa pasta do proprio aluno. Sem senha, sem sudo, sem tocar no que ele ja
|
|
276
326
|
# tinha instalado: se ja existe um motor bom, usamos o dele.
|
|
277
327
|
|
|
328
|
+
# Abre o pacote do motor direto na pasta final.
|
|
329
|
+
#
|
|
330
|
+
# A versao anterior descompactava ao lado e movia com `mv .../node-v*-darwin-* destino`.
|
|
331
|
+
# O curinga pegava DOIS caminhos — a pasta aberta e o proprio .tar.gz, que mora no
|
|
332
|
+
# mesmo lugar — e `mv` com duas origens exige que o destino ja seja uma pasta. Como
|
|
333
|
+
# o destino tinha acabado de ser renomeado pra `.antigo`, ele nao existia: todo aluno
|
|
334
|
+
# sem motor na maquina batia em "Nao consegui guardar o motor na sua pasta".
|
|
335
|
+
#
|
|
336
|
+
# Aqui nao existe curinga: `--strip-components=1` joga o conteudo direto no destino.
|
|
337
|
+
auroq_desempacotar_node() {
|
|
338
|
+
local pacote="$1" destino="$2"
|
|
339
|
+
|
|
340
|
+
rm -rf "${destino}.antigo" 2>/dev/null || true
|
|
341
|
+
if [ -d "$destino" ]; then
|
|
342
|
+
mv "$destino" "${destino}.antigo" 2>/dev/null || return 1
|
|
343
|
+
fi
|
|
344
|
+
|
|
345
|
+
mkdir -p "$destino" 2>/dev/null || return 1
|
|
346
|
+
tar -xzf "$pacote" -C "$destino" --strip-components=1 2>/dev/null || return 1
|
|
347
|
+
|
|
348
|
+
# So e sucesso se o motor de fato ficou de pe.
|
|
349
|
+
[ -x "${destino}/bin/node" ] || return 1
|
|
350
|
+
}
|
|
351
|
+
|
|
278
352
|
auroq_garantir_node() {
|
|
279
353
|
passo "Verificando o motor do sistema..."
|
|
280
354
|
|
|
@@ -324,12 +398,7 @@ auroq_garantir_node() {
|
|
|
324
398
|
auroq_erro "O arquivo do motor baixou com defeito." "Rode o mesmo comando de novo — o arquivo estragado ja foi apagado."
|
|
325
399
|
fi
|
|
326
400
|
|
|
327
|
-
|
|
328
|
-
tar -xzf "${tmpdir}/${tarball}" -C "$tmpdir" 2>/dev/null \
|
|
329
|
-
|| { rm -rf "$tmpdir"; auroq_erro "Nao consegui abrir o arquivo do motor." "Rode o mesmo comando de novo."; }
|
|
330
|
-
rm -rf "${NODE_DIR}.antigo" 2>/dev/null || true
|
|
331
|
-
[ -d "$NODE_DIR" ] && mv "$NODE_DIR" "${NODE_DIR}.antigo" 2>/dev/null || true
|
|
332
|
-
mv "${tmpdir}/node-v${versao}-darwin-"* "$NODE_DIR" 2>/dev/null \
|
|
401
|
+
auroq_desempacotar_node "${tmpdir}/${tarball}" "$NODE_DIR" \
|
|
333
402
|
|| { rm -rf "$tmpdir"; auroq_erro "Nao consegui guardar o motor na sua pasta." "Rode o mesmo comando de novo."; }
|
|
334
403
|
rm -rf "$tmpdir" "${NODE_DIR}.antigo"
|
|
335
404
|
|
|
@@ -467,11 +536,13 @@ auroq_fecho() {
|
|
|
467
536
|
printf '\n'
|
|
468
537
|
diz "Falta um detalhe importante:"
|
|
469
538
|
printf '\n'
|
|
470
|
-
diz " 1. FECHE
|
|
539
|
+
diz " 1. FECHE esta janela por completo e abra o Terminal de novo"
|
|
471
540
|
diz " ${FRACO}— sem isso ele nao enxerga o que acabou de ser instalado${FIM}"
|
|
472
|
-
diz " 2.
|
|
473
|
-
diz "
|
|
474
|
-
diz "
|
|
541
|
+
diz " 2. Entre na pasta do seu negocio. Copie e cole esta linha:"
|
|
542
|
+
diz " ${CIANO}cd \"${PASTA_ALVO}\"${FIM}"
|
|
543
|
+
diz " 3. Abra a ferramenta escrevendo: ${CIANO}claude${FIM} ${FRACO}(no Codex: codex)${FIM}"
|
|
544
|
+
diz " 4. Chame o Ops: ${CIANO}/AuroqOS:agents:ops${FIM} ${FRACO}(no Codex: \$ops)${FIM}"
|
|
545
|
+
diz " 5. Digite: ${CIANO}*bootstrap${FIM}"
|
|
475
546
|
printf '\n'
|
|
476
547
|
diz "O Ops instala o resto e te guia daqui pra frente."
|
|
477
548
|
printf '\n'
|
|
@@ -483,6 +554,7 @@ auroq_fecho() {
|
|
|
483
554
|
auroq_main() {
|
|
484
555
|
titulo "Auroq OS — instalacao"
|
|
485
556
|
auroq_diagnostico
|
|
557
|
+
auroq_publicar_ferramenta_no_path
|
|
486
558
|
auroq_garantir_git
|
|
487
559
|
auroq_garantir_node
|
|
488
560
|
auroq_login_mentoria
|
package/lib/auth.js
CHANGED
|
@@ -5,7 +5,7 @@ const { createAuthClient } = require('./supabase');
|
|
|
5
5
|
const credentials = require('./credentials');
|
|
6
6
|
|
|
7
7
|
const PLATFORM_URL = 'https://arcane.arka.education';
|
|
8
|
-
const SUPPORT_CONTACT = '11
|
|
8
|
+
const SUPPORT_CONTACT = '11 93621-4486';
|
|
9
9
|
const MAX_LOGIN_ATTEMPTS = 3;
|
|
10
10
|
|
|
11
11
|
const PURPLE = '\x1b[38;2;120;80;200m';
|