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.
@@ -1,7 +1,7 @@
1
1
  project:
2
2
  name: "Auroq OS"
3
3
  type: greenfield
4
- version: 2.2.4
4
+ version: 2.4.2
5
5
  installedAt: '2026-03-16'
6
6
 
7
7
  ide:
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 97312-2273');
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 97312-2273${RESET}`);
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 });
@@ -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,45 @@ function Set-AuroqPath {
129
142
  $env:Path = "$Bin;$env:Path"
130
143
  }
131
144
 
132
- # ─── Passo 1: diagnostico (§5.1) ──────────────────────────────────────────────
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 — serve"
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
- # ─── Passo 2: Git (§5.2) ──────────────────────────────────────────────────────
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
- $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
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 — seria verificado aqui'; return }
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 — clique em "Sim".'
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
- 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.'
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 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.'
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. 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'
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 1200) {
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 — nada do que ja foi feito se perde.'
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
- # ─── Passo 3: o motor (§5.3) ──────────────────────────────────────────────────
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 — seria instalado em uma pasta sua, sem senha'; return }
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 — o arquivo estragado ja foi apagado.'
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
- # ─── Passo 4: login da mentoria (§5.5) ────────────────────────────────────────
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 — seria pedido aqui (e-mail e senha da plataforma)'; return }
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
- & npx -y auroq-os@latest check-access
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 — e nada foi criado no seu computador.' -ForegroundColor DarkGray
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
- # ─── Passo 5: pasta do negocio (§5.6) ─────────────────────────────────────────
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 — ex: minha-empresa)'
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 — nao vou mexer nele."
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 — o aluno ainda nao escreveu nada.
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 — seria criada aqui"; return }
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
- # ─── Passo 6: montar o Auroq ──────────────────────────────────────────────────
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 — seria montado aqui'; return }
503
+ if ($env:AUROQ_INSTALL_DRY_RUN) { Write-AuroqOk 'Sistema - seria montado aqui'; return }
429
504
 
430
505
  Set-Location $script:AuroqPastaAlvo
431
- & npx -y auroq-os@latest init
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
- # ─── Passo 7: fecho ───────────────────────────────────────────────────────────
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 ' ─────────────────────────────────────────────' -ForegroundColor Magenta
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 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'
452
- Write-AuroqDiz " 2. Abra a pasta $nome"
453
- Write-AuroqDiz ' 3. Chame o Ops: /AuroqOS:agents:ops (no Codex: $ops)'
454
- Write-AuroqDiz ' 4. Digite: *bootstrap'
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
- # ─── Fluxo ────────────────────────────────────────────────────────────────────
538
+ # --- Fluxo --------------------------------------------------------------------
462
539
 
463
540
  function Invoke-AuroqInstalacao {
464
- Write-AuroqTitulo 'Auroq OS — instalacao'
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
@@ -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,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
- 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 \
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 o Claude Code (ou o Codex) por completo e abra de novo"
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. Abra a pasta ${PASTA_ALVO##*/}"
473
- diz " 3. Chame o Ops: ${CIANO}/AuroqOS:agents:ops${FIM} ${FRACO}(no Codex: \$ops)${FIM}"
474
- diz " 4. Digite: ${CIANO}*bootstrap${FIM}"
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 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.2",
4
4
  "description": "Auroq OS — Sistema Operacional de IA para Experts",
5
5
  "bin": {
6
6
  "auroq-os": "bin/auroq-os.js"