auroq-os 2.4.0 → 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/bin/auroq-os.js CHANGED
@@ -237,7 +237,7 @@ async function runHealthChecks(targetDir) {
237
237
  } else {
238
238
  error(`${passed}/${HEALTH_CHECKS.length} verificacoes OK — arquivo de autoload faltando:`);
239
239
  for (const item of missing) error(` - ${item}`);
240
- error('Nenhum arquivo de autoload pode faltar em silencio. Contato: 11 97312-2273');
240
+ error('Nenhum arquivo de autoload pode faltar em silencio. Contato: 11 93621-4486');
241
241
  process.exit(1);
242
242
  }
243
243
  return { passed, total: HEALTH_CHECKS.length };
@@ -360,7 +360,7 @@ async function runDoctor(targetDir) {
360
360
  error(`${problemas.length} coisa(s) pra resolver:`);
361
361
  for (const p of problemas) log(` ${DIM}- ${p}${RESET}`);
362
362
  log('');
363
- log(`${DIM}Se travar, chame o suporte: 11 97312-2273${RESET}`);
363
+ log(`${DIM}Se travar, chame o suporte: 11 93621-4486${RESET}`);
364
364
  return 1;
365
365
  }
366
366
 
@@ -1,4 +1,4 @@
1
- # Auroq OS — instalador do Windows.
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" §4.2):
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 — sem isto o Windows 10 antigo estoura em SSL.
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 97312-2273'
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
- # ─── Fala com o aluno ─────────────────────────────────────────────────────────
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
- # ─── Registro pro suporte (§5.7) ──────────────────────────────────────────────
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
- # ─── Decisoes puras (testadas uma a uma) ──────────────────────────────────────
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 — decidido ANTES de escrever qualquer coisa.
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
- # ─── O motor visivel pra quem abre pelo icone (§5.4) ──────────────────────────
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 — o PRD proibe pedir isso.
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,7 @@ function Set-AuroqPath {
129
142
  $env:Path = "$Bin;$env:Path"
130
143
  }
131
144
 
132
- # ─── Passo 1: diagnostico (§5.1) ──────────────────────────────────────────────
145
+ # --- Passo 1: diagnostico (sec. 5.1) ----------------------------------------------
133
146
 
134
147
  function Test-AuroqMaquina {
135
148
  Write-AuroqPasso 'Vendo o seu computador...'
@@ -150,7 +163,7 @@ function Test-AuroqMaquina {
150
163
 
151
164
  $chip = $env:PROCESSOR_ARCHITECTURE
152
165
  if (-not $chip) { $chip = 'AMD64' }
153
- Write-AuroqOk "Windows 64 bits, compilacao $build — serve"
166
+ Write-AuroqOk "Windows 64 bits, compilacao $build - serve"
154
167
 
155
168
  $livreMb = 999999
156
169
  if ($env:AUROQ_INSTALL_FAKE_DISCO_MB) {
@@ -181,7 +194,7 @@ function Test-AuroqMaquina {
181
194
  Write-AuroqLog 'diagnostico' "build=$build chip=$chip disco_mb=$livreMb"
182
195
  }
183
196
 
184
- # ─── Passo 2: Git (§5.2) ──────────────────────────────────────────────────────
197
+ # --- Passo 2: Git (sec. 5.2) ------------------------------------------------------
185
198
 
186
199
  function Test-AuroqGitResponde {
187
200
  try {
@@ -190,10 +203,19 @@ function Test-AuroqGitResponde {
190
203
  } catch {
191
204
  # segue pro caminho padrao
192
205
  }
193
- $padrao = Join-Path $env:ProgramFiles 'Git\cmd\git.exe'
194
- if (Test-Path $padrao) {
195
- $env:Path = "$(Split-Path $padrao);$env:Path"
196
- return $true
206
+ # Dois lugares, porque sao duas instalacoes possiveis: com administrador o Git
207
+ # vai pra Program Files; sem administrador ele vai pra pasta do usuario. Olhar
208
+ # so o primeiro fazia o script jurar que o Git nao existe e ficar esperando sem fim.
209
+ $candidatos = @(
210
+ (Join-Path $env:ProgramFiles 'Git\cmd\git.exe'),
211
+ (Join-Path ${env:ProgramFiles(x86)} 'Git\cmd\git.exe'),
212
+ (Join-Path $env:LOCALAPPDATA 'Programs\Git\cmd\git.exe')
213
+ )
214
+ foreach ($padrao in $candidatos) {
215
+ if ($padrao -and (Test-Path $padrao)) {
216
+ $env:Path = "$(Split-Path $padrao);$env:Path"
217
+ return $true
218
+ }
197
219
  }
198
220
  return $false
199
221
  }
@@ -201,7 +223,7 @@ function Test-AuroqGitResponde {
201
223
  function Install-AuroqGit {
202
224
  Write-AuroqPasso 'Verificando o Git (o programa que guarda as versoes do seu trabalho)...'
203
225
 
204
- if ($env:AUROQ_INSTALL_DRY_RUN) { Write-AuroqOk 'Git — seria verificado aqui'; return }
226
+ if ($env:AUROQ_INSTALL_DRY_RUN) { Write-AuroqOk 'Git - seria verificado aqui'; return }
205
227
 
206
228
  if (Test-AuroqGitResponde) {
207
229
  Write-AuroqOk 'Git ja estava instalado'
@@ -218,7 +240,10 @@ function Install-AuroqGit {
218
240
  }
219
241
 
220
242
  if ($temWinget) {
221
- Write-AuroqAviso 'Falta instalar. Vai aparecer uma janela pedindo permissao — clique em "Sim".'
243
+ Write-AuroqAviso 'Falta instalar o Git. Vai aparecer uma janela pedindo permissao.'
244
+ Write-AuroqDiz ' Se ela perguntar so "Sim ou Nao", clique em Sim.'
245
+ Write-AuroqDiz ' Se ela pedir SENHA DE ADMINISTRADOR e voce nao tiver, pode fechar:'
246
+ Write-AuroqDiz ' eu instalo de outro jeito, que nao precisa de administrador.'
222
247
  & winget install --id Git.Git -e --source winget --accept-package-agreements --accept-source-agreements | Out-Null
223
248
  Start-Sleep -Seconds 3
224
249
  if (Test-AuroqGitResponde) {
@@ -226,19 +251,31 @@ function Install-AuroqGit {
226
251
  Write-AuroqLog 'git' 'instalado-winget'
227
252
  return
228
253
  }
229
- Write-AuroqErro 'A instalacao do Git nao terminou (a permissao pode ter sido recusada).' 'Rode o mesmo comando de novo e clique em "Sim" na janela de permissao.'
254
+ # Nao morre aqui. Quem nao e administrador NUNCA vai conseguir passar dessa
255
+ # janela, e mandar "rode de novo e clique em Sim" tranca essa pessoa num
256
+ # loop. O caminho de baixo instala sem administrador nenhum.
257
+ Write-AuroqAviso 'A janela de permissao nao passou. Vou pelo caminho que nao precisa de administrador.'
258
+ Write-AuroqLog 'git' 'winget-nao-passou'
230
259
  }
231
260
 
232
- # Windows 10 antigo nao tem winget: abre o instalador oficial e espera o aluno.
233
- Write-AuroqAviso 'Falta instalar o Git. Vou abrir a pagina oficial no seu navegador.'
261
+ # Duas situacoes caem aqui: Windows 10 antigo sem winget, e aluno sem direito
262
+ # de administrador. O instalador oficial do Git resolve as duas: ele declara
263
+ # `PrivilegesRequired=none` e sabe instalar so pro usuario, em %LOCALAPPDATA%.
264
+ Write-AuroqAviso 'Vou abrir a pagina oficial do Git no seu navegador.'
234
265
  Write-AuroqDiz ' 1. Baixe o instalador que a pagina oferecer'
235
266
  Write-AuroqDiz ' 2. De dois cliques no arquivo baixado'
236
- Write-AuroqDiz ' 3. Clique em "Next" em todas as telas e depois em "Install"'
237
- Write-AuroqDiz ' 4. No fim, clique em "Finish" e volte pra ca — eu espero'
267
+ Write-AuroqDiz ' 3. Se ele perguntar para quem instalar, escolha a opcao de instalar'
268
+ Write-AuroqDiz ' SO PRA VOCE - ela nao pede senha de administrador'
269
+ Write-AuroqDiz ' 4. Clique em "Next" em todas as telas e depois em "Install"'
270
+ Write-AuroqDiz ' 5. No fim, clique em "Finish" e volte pra ca - eu espero'
238
271
  Start-Process 'https://git-scm.com/downloads/win'
239
272
 
273
+ # 20 minutos de espera pelo aluno. O teto e regulavel so pra maquina limpa do
274
+ # CI nao gastar 20 minutos de runner provando uma mensagem.
275
+ $teto = 1200
276
+ if ($env:AUROQ_INSTALL_ESPERA_GIT) { $teto = [int]$env:AUROQ_INSTALL_ESPERA_GIT }
240
277
  $esperou = 0
241
- while ($esperou -lt 1200) {
278
+ while ($esperou -lt $teto) {
242
279
  if (Test-AuroqGitResponde) {
243
280
  Write-AuroqOk 'Git instalado'
244
281
  Write-AuroqLog 'git' 'instalado-manual'
@@ -248,15 +285,15 @@ function Install-AuroqGit {
248
285
  $esperou = $esperou + 10
249
286
  if (($esperou % 120) -eq 0) { Write-AuroqDiz " ainda esperando... ($esperou s)" }
250
287
  }
251
- 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.'
288
+ 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
289
  }
253
290
 
254
- # ─── Passo 3: o motor (§5.3) ──────────────────────────────────────────────────
291
+ # --- Passo 3: o motor (sec. 5.3) --------------------------------------------------
255
292
 
256
293
  function Install-AuroqNode {
257
294
  Write-AuroqPasso 'Verificando o motor do sistema...'
258
295
 
259
- if ($env:AUROQ_INSTALL_DRY_RUN) { Write-AuroqOk 'Motor — seria instalado em uma pasta sua, sem senha'; return }
296
+ if ($env:AUROQ_INSTALL_DRY_RUN) { Write-AuroqOk 'Motor - seria instalado em uma pasta sua, sem senha'; return }
260
297
 
261
298
  $atual = ''
262
299
  try {
@@ -309,7 +346,7 @@ function Install-AuroqNode {
309
346
  }
310
347
  if (-not $esperado -or ($esperado.ToLower() -ne $obtido.ToLower())) {
311
348
  Remove-Item $destino -Force -ErrorAction SilentlyContinue
312
- Write-AuroqErro 'O arquivo do motor baixou com defeito.' 'Rode o mesmo comando de novo — o arquivo estragado ja foi apagado.'
349
+ Write-AuroqErro 'O arquivo do motor baixou com defeito.' 'Rode o mesmo comando de novo - o arquivo estragado ja foi apagado.'
313
350
  }
314
351
 
315
352
  # mark-of-the-web: sem desbloquear, o Windows recusa abrir o que veio da internet
@@ -336,12 +373,12 @@ function Install-AuroqNode {
336
373
  Write-AuroqLog 'motor' "instalado versao=$versao chip=$chip"
337
374
  }
338
375
 
339
- # ─── Passo 4: login da mentoria (§5.5) ────────────────────────────────────────
376
+ # --- Passo 4: login da mentoria (sec. 5.5) ----------------------------------------
340
377
 
341
378
  function Invoke-AuroqLogin {
342
379
  Write-AuroqPasso 'Agora entre com o seu acesso da Mentoria Arcane.'
343
380
 
344
- if ($env:AUROQ_INSTALL_DRY_RUN) { Write-AuroqOk 'Login — seria pedido aqui (e-mail e senha da plataforma)'; return }
381
+ if ($env:AUROQ_INSTALL_DRY_RUN) { Write-AuroqOk 'Login - seria pedido aqui (e-mail e senha da plataforma)'; return }
345
382
 
346
383
  # `check-access` e a mesma regua do resto do sistema: sai com sucesso so com
347
384
  # contrato ativo conferido agora. Sem sessao salva, ele mesmo pede e-mail e
@@ -355,7 +392,7 @@ function Invoke-AuroqLogin {
355
392
  if ($LASTEXITCODE -ne 0) {
356
393
  Write-AuroqLog 'login' 'recusado'
357
394
  Write-Host ''
358
- Write-Host ' Sem acesso ativo, a instalacao para aqui — e nada foi criado no seu computador.' -ForegroundColor DarkGray
395
+ Write-Host ' Sem acesso ativo, a instalacao para aqui - e nada foi criado no seu computador.' -ForegroundColor DarkGray
359
396
  Write-Host " O que fazer agora: fale com o suporte $AuroqSuporte" -ForegroundColor DarkGray
360
397
  Write-Host ''
361
398
  exit 1
@@ -363,11 +400,11 @@ function Invoke-AuroqLogin {
363
400
  Write-AuroqLog 'login' 'ok'
364
401
  }
365
402
 
366
- # ─── Passo 5: pasta do negocio (§5.6) ─────────────────────────────────────────
403
+ # --- Passo 5: pasta do negocio (sec. 5.6) -----------------------------------------
367
404
 
368
405
  function Get-AuroqPasta {
369
406
  Write-AuroqPasso 'Qual o nome da pasta do seu negocio?'
370
- Write-AuroqDiz '(so letras minusculas e hifen — ex: minha-empresa)'
407
+ Write-AuroqDiz '(so letras minusculas e hifen - ex: minha-empresa)'
371
408
 
372
409
  $nome = $env:AUROQ_INSTALL_PASTA
373
410
  $tentativas = 0
@@ -380,7 +417,7 @@ function Get-AuroqPasta {
380
417
  $estado = Get-AuroqEstadoPasta $alvo
381
418
  if ($estado -eq 'auroq') {
382
419
  Write-Host ''
383
- Write-AuroqAviso "Ja existe um Auroq em $alvo — nao vou mexer nele."
420
+ Write-AuroqAviso "Ja existe um Auroq em $alvo - nao vou mexer nele."
384
421
  Write-AuroqDiz 'Pra conferir se esta tudo certo la, abra essa pasta e rode:'
385
422
  Write-AuroqDiz ' auroq-os doctor'
386
423
  Write-AuroqLog 'pasta' 'ja-tinha-auroq'
@@ -394,7 +431,7 @@ function Get-AuroqPasta {
394
431
  break
395
432
  }
396
433
  } elseif ([string]::IsNullOrWhiteSpace($nome)) {
397
- # Enter vazio so repete a pergunta — o aluno ainda nao escreveu nada.
434
+ # Enter vazio so repete a pergunta - o aluno ainda nao escreveu nada.
398
435
  $nome = ''
399
436
  } else {
400
437
  Write-AuroqDiz 'Esse nome nao serve: use so letras minusculas, numeros e hifen.'
@@ -408,7 +445,7 @@ function Get-AuroqPasta {
408
445
  }
409
446
  }
410
447
 
411
- if ($env:AUROQ_INSTALL_DRY_RUN) { Write-AuroqOk "Pasta $script:AuroqPastaAlvo — seria criada aqui"; return }
448
+ if ($env:AUROQ_INSTALL_DRY_RUN) { Write-AuroqOk "Pasta $script:AuroqPastaAlvo - seria criada aqui"; return }
412
449
 
413
450
  try {
414
451
  if (-not (Test-Path $script:AuroqPastaAlvo)) {
@@ -420,12 +457,12 @@ function Get-AuroqPasta {
420
457
  Write-AuroqLog 'pasta' 'criada'
421
458
  }
422
459
 
423
- # ─── Passo 6: montar o Auroq ──────────────────────────────────────────────────
460
+ # --- Passo 6: montar o Auroq --------------------------------------------------
424
461
 
425
462
  function Invoke-AuroqInit {
426
463
  Write-AuroqPasso "Montando o Auroq dentro de $script:AuroqPastaAlvo..."
427
464
 
428
- if ($env:AUROQ_INSTALL_DRY_RUN) { Write-AuroqOk 'Sistema — seria montado aqui'; return }
465
+ if ($env:AUROQ_INSTALL_DRY_RUN) { Write-AuroqOk 'Sistema - seria montado aqui'; return }
429
466
 
430
467
  Set-Location $script:AuroqPastaAlvo
431
468
  & npx -y auroq-os@latest init
@@ -436,19 +473,19 @@ function Invoke-AuroqInit {
436
473
  Write-AuroqLog 'init' 'ok'
437
474
  }
438
475
 
439
- # ─── Passo 7: fecho ───────────────────────────────────────────────────────────
476
+ # --- Passo 7: fecho -----------------------------------------------------------
440
477
 
441
478
  function Write-AuroqFecho {
442
479
  $nome = Split-Path $script:AuroqPastaAlvo -Leaf
443
480
  Write-Host ''
444
- Write-Host ' ─────────────────────────────────────────────' -ForegroundColor Magenta
481
+ Write-Host ' ---------------------------------------------' -ForegroundColor Magenta
445
482
  Write-Host ''
446
483
  Write-AuroqDiz "Pronto. O Auroq esta em $script:AuroqPastaAlvo"
447
484
  Write-Host ''
448
485
  Write-AuroqDiz 'Falta um detalhe importante:'
449
486
  Write-Host ''
450
487
  Write-AuroqDiz ' 1. FECHE o Claude Code (ou o Codex) por completo e abra de novo'
451
- Write-AuroqDiz ' — sem isso ele nao enxerga o que acabou de ser instalado'
488
+ Write-AuroqDiz ' - sem isso ele nao enxerga o que acabou de ser instalado'
452
489
  Write-AuroqDiz " 2. Abra a pasta $nome"
453
490
  Write-AuroqDiz ' 3. Chame o Ops: /AuroqOS:agents:ops (no Codex: $ops)'
454
491
  Write-AuroqDiz ' 4. Digite: *bootstrap'
@@ -458,10 +495,10 @@ function Write-AuroqFecho {
458
495
  Write-AuroqLog 'fim' "ok pasta=$nome"
459
496
  }
460
497
 
461
- # ─── Fluxo ────────────────────────────────────────────────────────────────────
498
+ # --- Fluxo --------------------------------------------------------------------
462
499
 
463
500
  function Invoke-AuroqInstalacao {
464
- Write-AuroqTitulo 'Auroq OS — instalacao'
501
+ Write-AuroqTitulo 'Auroq OS - instalacao'
465
502
  Test-AuroqMaquina
466
503
  Install-AuroqGit
467
504
  Install-AuroqNode
@@ -18,7 +18,7 @@
18
18
 
19
19
  set -u
20
20
 
21
- SUPORTE="11 97312-2273"
21
+ SUPORTE="11 93621-4486"
22
22
  NODE_MIN=20
23
23
  MACOS_MIN=13
24
24
  DISCO_MIN_MB=2048
@@ -174,12 +174,46 @@ 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
183
217
  }
184
218
 
185
219
  # ─── Passo 1: diagnostico (§5.1) ──────────────────────────────────────────────
@@ -275,6 +309,30 @@ auroq_garantir_git() {
275
309
  # Fica numa pasta do proprio aluno. Sem senha, sem sudo, sem tocar no que ele ja
276
310
  # tinha instalado: se ja existe um motor bom, usamos o dele.
277
311
 
312
+ # Abre o pacote do motor direto na pasta final.
313
+ #
314
+ # A versao anterior descompactava ao lado e movia com `mv .../node-v*-darwin-* destino`.
315
+ # O curinga pegava DOIS caminhos — a pasta aberta e o proprio .tar.gz, que mora no
316
+ # mesmo lugar — e `mv` com duas origens exige que o destino ja seja uma pasta. Como
317
+ # o destino tinha acabado de ser renomeado pra `.antigo`, ele nao existia: todo aluno
318
+ # sem motor na maquina batia em "Nao consegui guardar o motor na sua pasta".
319
+ #
320
+ # Aqui nao existe curinga: `--strip-components=1` joga o conteudo direto no destino.
321
+ auroq_desempacotar_node() {
322
+ local pacote="$1" destino="$2"
323
+
324
+ rm -rf "${destino}.antigo" 2>/dev/null || true
325
+ if [ -d "$destino" ]; then
326
+ mv "$destino" "${destino}.antigo" 2>/dev/null || return 1
327
+ fi
328
+
329
+ mkdir -p "$destino" 2>/dev/null || return 1
330
+ tar -xzf "$pacote" -C "$destino" --strip-components=1 2>/dev/null || return 1
331
+
332
+ # So e sucesso se o motor de fato ficou de pe.
333
+ [ -x "${destino}/bin/node" ] || return 1
334
+ }
335
+
278
336
  auroq_garantir_node() {
279
337
  passo "Verificando o motor do sistema..."
280
338
 
@@ -324,12 +382,7 @@ auroq_garantir_node() {
324
382
  auroq_erro "O arquivo do motor baixou com defeito." "Rode o mesmo comando de novo — o arquivo estragado ja foi apagado."
325
383
  fi
326
384
 
327
- mkdir -p "$NODE_DIR" 2>/dev/null || auroq_erro "Nao consegui criar a pasta ${NODE_DIR}." "Confira se voce tem permissao de escrita na sua pasta pessoal e rode de novo."
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 \
385
+ auroq_desempacotar_node "${tmpdir}/${tarball}" "$NODE_DIR" \
333
386
  || { rm -rf "$tmpdir"; auroq_erro "Nao consegui guardar o motor na sua pasta." "Rode o mesmo comando de novo."; }
334
387
  rm -rf "$tmpdir" "${NODE_DIR}.antigo"
335
388
 
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 97312-2273';
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';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "auroq-os",
3
- "version": "2.4.0",
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"