auroq-os 2.8.6 → 2.8.8

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.8.6
4
+ version: 2.8.8
5
5
  installedAt: '2026-03-16'
6
6
 
7
7
  ide:
@@ -8,7 +8,8 @@
8
8
  "hooks": [
9
9
  {
10
10
  "type": "command",
11
- "command": "node .claude/hooks/auroq-sync.cjs --session-start",
11
+ "command": "node",
12
+ "args": ["${CLAUDE_PROJECT_DIR}/.claude/hooks/auroq-sync.cjs", "--session-start"],
12
13
  "timeout": 25000
13
14
  }
14
15
  ]
@@ -20,7 +21,8 @@
20
21
  "hooks": [
21
22
  {
22
23
  "type": "command",
23
- "command": "node .claude/hooks/auroq-sync.cjs --remind",
24
+ "command": "node",
25
+ "args": ["${CLAUDE_PROJECT_DIR}/.claude/hooks/auroq-sync.cjs", "--remind"],
24
26
  "timeout": 5000
25
27
  }
26
28
  ]
@@ -31,7 +33,8 @@
31
33
  "hooks": [
32
34
  {
33
35
  "type": "command",
34
- "command": "node .claude/hooks/auroq-ate-o-fim.cjs",
36
+ "command": "node",
37
+ "args": ["${CLAUDE_PROJECT_DIR}/.claude/hooks/auroq-ate-o-fim.cjs"],
35
38
  "timeout": 10
36
39
  }
37
40
  ]
package/CHANGELOG.md CHANGED
@@ -1,5 +1,7 @@
1
1
  ## Unreleased
2
2
 
3
+ - 1Password no Windows: o CLI do 1Password passa pelo PowerShell, como no teste real do Marcos; isso evita a falha de sessão que ocorria quando o Node o iniciava diretamente. `--estado` usa o mesmo caminho para detectar o CLI, e a lista de contas deixa de depender do shell em que o aluno abriu o comando. Os três ganchos do Claude Code usam o caminho do projeto mesmo depois de entrar numa subpasta. A skill do cofre orienta o diagnóstico quando a aprovação se repete. Catálogo `auroq-core` 2.3.55.
4
+
3
5
  - Conteúdo ao vivo (catálogo `auroq-core` 2.3.54, 04/11): a peça do 1Password da skill do cofre avisa o Companion de que, no Windows, o app pode estar instalado só como pacote MSIX (é o que o `winget` instala hoje) e não aparece nas pastas de sempre: antes de dizer "o app não está instalado" (resultado `instalar-app`, ou o aluno dizendo que não acha) ele confere a lista de pacotes do Windows, e, se o app estiver lá, vai direto para entrar na conta e ligar a chave. Também descreve o instalador de reserva com limite de 3 minutos; o mesmo aviso entra no pré-gate da skill `configurar-computador`. Precisa do auroq-os 2.8.6 no npm (a detecção e o limite vivem no comando).
4
6
  - Conteúdo ao vivo (catálogo `auroq-core` 2.3.53, 29/10): **a skill do cofre de senhas foi dividida em seis peças** (entrada, 1Password, Infisical grátis com os resultados à parte, passar do grátis para o 1Password, e uso do dia a dia). Antes era um texto só de 62 mil caracteres, grande demais para o Claude Code ler de uma vez (o Marcos viu isso no teste de 27/10). O Companion continua entrando pelo mesmo gatilho (`conectar-cofre`) e a entrada diz qual peça abrir. O Companion agora pede o OK do aluno em uma frase antes de criar a chave do agente, de instalar o app e de passar as chaves (a proteção do Claude Code barrava esses passos sem aviso), explica a Chave Secreta e o Kit de Emergência do 1Password (guardar o PDF fora do computador e fora do GitHub), ensina a ligar o Windows Hello ou o Touch ID quando a digital não aparece, e não manda mais ligar a chave do app de novo quando ela já está ligada. Precisa do auroq-os 2.8.5 no npm (comando `--instalar-app` e códigos novos).
5
7
  - Conteúdo ao vivo (catálogo `auroq-core` 2.3.52, 27/10): **documentação revisada para o jeito de hoje.** O guia do sistema que o Companion usa com o aluno, a fundação do Companion e as fichas do Consultor não apresentam mais o Ops como técnico nem o nome personalizado do Companion; ensinam a abrir uma conversa nova dentro do projeto e chamar o Companion (quantas quiser, uma por assunto, nunca um chat por squad) e dizem que, com o app aberto, o salvamento na internet é automático a cada 15 minutos e ao abrir e fechar. A skill `configurar-computador` e o guia longo do Ops dizem que as contas são conectadas pelo Companion na primeira conversa, não na instalação.
@@ -18,6 +20,10 @@
18
20
  - Conteúdo ao vivo (catálogo `auroq-core` 2.3.40, 26/10): **as contas do nível 1 (GitHub, Vercel e Supabase) passam a ser conectadas pelo Companion na primeira conversa.** Decisão do Euriler: conectar na instalação do app não funciona bem para o aluno iniciante. Skill nova `conexoes-essenciais`: o Companion explica cada conta em uma linha, abre as páginas (GitHub primeiro, com a conta criada junto se o aluno não tiver; a Vercel e o Supabase entram com o GitHub), confere e segue; o aluno só cria a conta, entra e autoriza, sem senha nem código na conversa, sempre no plano grátis. Usa o comando `auroq conexoes` do app quando existir; antes disso, a tela Configurações → Conexões. O `*primeiro-uso` ficou: conferência e instalação do que faltar (o aluno nunca baixa nem instala programa), material, perguntas, Mapa, conexões (P6), organizar (P7) e fecho (P8).
19
21
  - Conteúdo ao vivo (catálogo `auroq-core` 2.3.39, 26/10): **o cofre de senhas saiu da primeira conversa.** Decisão do Euriler: é técnico demais para o aluno iniciante e é conexão do nível 2 (com domínio próprio e Google, que o app chama de "conecte quando precisar"). No `*primeiro-uso` o Companion confere só o sistema e as contas do nível 1 (GitHub, Vercel e Supabase, que o app conecta na tela "Conectar suas contas") e vai para a entrevista; o cofre entra quando a primeira tarefa precisar de uma senha, chave ou token (skill `conectar-cofre`).
20
22
  - **Regra de projetos do aluno sem o nome do Euriler.** `project-tracker.md` mandava "avisar o Euriler" quando faltava o acompanhamento de um projeto e dizia que só "o Euriler/Jarvis" mudam objetivo e fases (cópia da regra pessoal dele). Agora o Companion cria o acompanhamento pelo modelo e avisa o aluno em uma linha; quem decide objetivo e fases é o aluno (o Companion propõe). Chega pelo npm.
23
+ ## 2.8.7 — 2026-11-04
24
+
25
+ - **Companion em toda pasta (03/11, pedido do Euriler).** O app Auroq OS passa a pôr no `~/.codex/config.toml` do aluno uma cópia do registro do `arcane` da pasta do negócio, entre as marcas `# >>> Auroq OS: Companion em toda pasta`, para o Companion e a equipe valerem em qualquer pasta. O `doctor` completo (`limparArcaneDoGlobal`) mantém esse bloco e diz "mantido"; um `arcane` do aluno ao lado dele continua saindo (com backup), porque tabela repetida deixa o Codex sem abrir. Na pasta do negócio o Codex junta os dois registros por chave e o da pasta vence (provado no Codex 0.166). Sem esta versão, o `doctor` completo apaga o bloco e o app o põe de volta em até 2 minutos.
26
+
21
27
  ## 2.8.6 — 2026-11-04
22
28
 
23
29
  Correção do re-teste real do Marcos (03/11, Windows 11, auroq-os 2.8.5). O resto da rota A (aprovação, cofre `Claude`, chave do agente, teste e migração) passou liso e não foi mexido. Nenhuma máquina de aluno foi tocada; o que dá para provar sem Windows foi provado com PowerShell, winget e instalador simulados (veja a story `AUROQ-1password-automatico`, seção "Re-teste do Marcos 03/11").
package/README.md CHANGED
@@ -290,13 +290,13 @@ a parte tecnica e com o Companion.
290
290
 
291
291
  ## Observabilidade e integridade do motor
292
292
 
293
- Apos publicacao, `npx -y auroq-os@2.8.6 doctor` mostra a fila local segura e os comandos pinados de
294
- manutencao/diagnostico. `npx -y auroq-os@2.8.6 manutencao` preserva o caminho existente
293
+ Apos publicacao, `npx -y auroq-os@2.8.8 doctor` mostra a fila local segura e os comandos pinados de
294
+ manutencao/diagnostico. `npx -y auroq-os@2.8.8 manutencao` preserva o caminho existente
295
295
  de consentimento legado, studentFiles, customizacoes e dados do negocio. Nao ha
296
296
  migracao forcada. O registro MCP aponta para `arcane-mcp@0.7.1` — o pin mora no campo
297
297
  `arcaneMcpPin` do package.json (fonte unica; o servidor le o mesmo campo no npm).
298
298
  `npm run release:verify` recusa publicar com um pin que o npm nao resolva.
299
- Os instaladores do repositorio ficam preparados para 2.8.6; as copias publicas so recebem
299
+ Os instaladores do repositorio ficam preparados para 2.8.8; as copias publicas so recebem
300
300
  a versao apos os gates nativos e a verificacao do tarball publicado.
301
301
  O pacote inclui `lib/runtime-integrity.json`: inventario SHA-256 gerado depois da montagem da casca, verificavel com `npm run integrity:verify` dentro do pacote extraido. Ele comprova consistencia do conteudo; nao e uma assinatura de autoria.
302
302
 
package/bin/auroq-os.js CHANGED
@@ -240,7 +240,8 @@ const HOOK_DO_FRAMEWORK = /(?:^|[\s"'\\/])(?:auroq-sync|auroq-ate-o-fim|synapse-
240
240
  // Gancho de IA do sistema (type "prompt", sem `command`): o texto comeca com uma marca `[auroq-...]`.
241
241
  // Sem ela, a manutencao o tomava por gancho do aluno e o duplicava a cada versao.
242
242
  const MARCA_DO_FRAMEWORK = /^\s*\[auroq-[a-z-]+\]/;
243
- const ehHookDoFramework = h => HOOK_DO_FRAMEWORK.test(String(h?.command || '')) || MARCA_DO_FRAMEWORK.test(String(h?.prompt || ''));
243
+ const textoDoHook = h => [h?.command, ...(Array.isArray(h?.args) ? h.args : [])].join(' ');
244
+ const ehHookDoFramework = h => HOOK_DO_FRAMEWORK.test(textoDoHook(h)) || MARCA_DO_FRAMEWORK.test(String(h?.prompt || ''));
244
245
  const CHAVES_DO_ALUNO = ['permissions', 'statusLine', 'env'];
245
246
  const temChave = (obj, chave) => Object.prototype.hasOwnProperty.call(obj, chave);
246
247
 
@@ -763,6 +764,7 @@ async function runDoctor(targetDir, { leve = false } = {}) {
763
764
  if (g.existia) {
764
765
  log(` ${DIM}Config global do Codex: ${g.servidores.length} servidor(es)${g.servidores.length ? ` (${g.servidores.join(', ')})` : ''}${RESET}`);
765
766
  if (g.removido) success(`Registro duplicado do arcane no global: removido (backup em ${path.basename(g.backup)})`);
767
+ if (g.mantidoDoApp) success('Registro do arcane do app Auroq OS no global (Companion em toda pasta): mantido');
766
768
  }
767
769
 
768
770
  const bloco = lerBlocoArcane(tomlTexto);
@@ -1160,16 +1162,25 @@ function abrirComoCodex(pin, envBloco, limiteMs = 120000) {
1160
1162
 
1161
1163
  // Registro do arcane no config GLOBAL do Codex (~/.codex/config.toml) briga com o da
1162
1164
  // pasta. Sai de la, com backup; o da pasta e o que vale.
1165
+ // Excecao (03/11/2026, Companion em toda pasta): o app Auroq OS poe no global uma COPIA do
1166
+ // registro da pasta do negocio, entre as marcas abaixo, para o Companion valer em qualquer pasta.
1167
+ // Na pasta do negocio o Codex junta os dois por chave e o da pasta vence (provado no Codex 0.166),
1168
+ // entao esse bloco fica; quem poe e tira e o app.
1169
+ const MARCA_DO_APP_NO_CODEX = /^# >>> Auroq OS: Companion em toda pasta\b[^\n]*\n[\s\S]*?^# <<< Auroq OS: Companion em toda pasta <<<[^\n]*(?:\n|$(?![\s\S]))/m;
1163
1170
  async function limparArcaneDoGlobal(caminho) {
1164
1171
  if (!(await fs.pathExists(caminho))) return { existia: false, servidores: [], removido: false };
1165
1172
  const toml = await fs.readFile(caminho, 'utf8');
1166
1173
  const servidores = [...new Set([...toml.matchAll(/^\[mcp_servers\.([^\].]+)/gm)].map(m => m[1]))];
1167
- if (!/^\[mcp_servers\.arcane(\.|\])/m.test(toml)) return { existia: true, servidores, removido: false };
1174
+ const doApp = toml.match(MARCA_DO_APP_NO_CODEX)?.[0] || '';
1175
+ const semOApp = doApp ? toml.replace(doApp, '') : toml;
1176
+ const mantido = doApp ? { mantidoDoApp: true } : {};
1177
+ if (!/^\[mcp_servers\.arcane(\.|\])/m.test(semOApp)) return { existia: true, servidores, removido: false, ...mantido };
1168
1178
  const backup = `${caminho}.bak-${new Date().toISOString().slice(0, 19).replace(/[:T]/g, '-')}`;
1169
1179
  await fs.writeFile(backup, toml);
1170
- const novo = toml.replace(/\n*\[mcp_servers\.arcane(\.[^\]]+)?\][\s\S]*?(?=\n\[|$(?![\s\S]))/g, '');
1171
- await fs.writeFile(caminho, `${novo.trimEnd()}\n`);
1172
- return { existia: true, servidores, removido: true, backup };
1180
+ // Um arcane do aluno junto do bloco do app seria tabela repetida: sai o do aluno, fica o do app.
1181
+ const novo = semOApp.replace(/\n*\[mcp_servers\.arcane(\.[^\]]+)?\][\s\S]*?(?=\n\[|$(?![\s\S]))/g, '');
1182
+ await fs.writeFile(caminho, `${novo.trimEnd()}\n${doApp ? `\n${doApp}` : ''}`);
1183
+ return { existia: true, servidores, removido: true, backup, ...mantido };
1173
1184
  }
1174
1185
 
1175
1186
  function versaoDoCodex() {
@@ -589,7 +589,7 @@ function Invoke-AuroqLogin {
589
589
  # sucesso. Usado como pergunta de sim/nao, ele dizia "voce ja estava logado"
590
590
  # pra quem nunca logou, pulava o portao e deixava a conta sem acesso chegar ate
591
591
  # a criacao da pasta.
592
- & (Get-AuroqNpx) -y auroq-os@2.8.6 check-access
592
+ & (Get-AuroqNpx) -y auroq-os@2.8.8 check-access
593
593
  if ($LASTEXITCODE -ne 0) {
594
594
  Write-AuroqLog 'login' 'recusado'
595
595
  Write-Host ''
@@ -677,7 +677,7 @@ function Invoke-AuroqInit {
677
677
  if ($env:AUROQ_INSTALL_DRY_RUN) { Write-AuroqOk 'Sistema - seria montado aqui'; return }
678
678
 
679
679
  Set-Location $script:AuroqPastaAlvo
680
- & (Get-AuroqNpx) -y auroq-os@2.8.6 instalar
680
+ & (Get-AuroqNpx) -y auroq-os@2.8.8 instalar
681
681
  if ($LASTEXITCODE -ne 0) {
682
682
  Write-AuroqLog 'init' 'falhou'
683
683
  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.'
@@ -219,9 +219,9 @@ auroq_tem_terminal() {
219
219
  # recebem pedaco do script no lugar da resposta dele.
220
220
  auroq_npx_aluno() {
221
221
  if [ -t 0 ]; then
222
- npx -y auroq-os@2.8.6 "$@"
222
+ npx -y auroq-os@2.8.8 "$@"
223
223
  else
224
- npx -y auroq-os@2.8.6 "$@" < /dev/tty
224
+ npx -y auroq-os@2.8.8 "$@" < /dev/tty
225
225
  fi
226
226
  }
227
227
 
@@ -80,11 +80,8 @@ function hasCommand(cmd) {
80
80
  }
81
81
 
82
82
  function opVersion() {
83
- try {
84
- return execSync('op --version', { stdio: 'pipe', encoding: 'utf8' }).trim();
85
- } catch {
86
- return null;
87
- }
83
+ const r = runOp(['--version'], { noStdin: true, timeoutMs: 10000 });
84
+ return r.ok ? r.stdout.trim() : null;
88
85
  }
89
86
 
90
87
  function installOp({ upgrade = false } = {}) {
@@ -708,9 +705,21 @@ function runOp(args, { env, input, timeoutMs = 120000, noStdin = false } = {}) {
708
705
  // `noStdin`: o `op` recusa `--template` se o stdin for um pipe, ate vazio ("You can't use both piping and the
709
706
  // --template flag"; o `input: ''` do Node vira pipe), entao esse comando roda com o stdin desligado (NUL/dev/null).
710
707
  const useTerminal = input === undefined && !noStdin && Boolean(process.stdin.isTTY);
711
- const r = spawnSync('op', args, {
708
+ const viaPowerShell = process.platform === 'win32';
709
+ // No Windows, o op 2.41.1 lancado diretamente pelo Node falha antes de pedir sessao ao app.
710
+ // Node -> PowerShell -> op foi conferido no computador do aluno; JSON evita quoting de shell.
711
+ const psScript = '$OutputEncoding=New-Object System.Text.UTF8Encoding $false; [Console]::OutputEncoding=$OutputEncoding; '
712
+ + '$a=@($env:AUROQ_OP_ARGS | ConvertFrom-Json); '
713
+ + "if ($env:AUROQ_OP_STDIN -eq '1') { $s=[Console]::In.ReadToEnd(); $s | & op @a } else { & op @a }; exit $LASTEXITCODE";
714
+ const childEnv = env || opEnv();
715
+ const r = spawnSync(viaPowerShell ? 'powershell.exe' : 'op',
716
+ viaPowerShell ? ['-NoProfile', '-NonInteractive', '-Command', psScript] : args, {
712
717
  encoding: 'utf8',
713
- env: env || opEnv(),
718
+ env: viaPowerShell ? {
719
+ ...childEnv,
720
+ AUROQ_OP_ARGS: JSON.stringify(args),
721
+ AUROQ_OP_STDIN: input !== undefined && input !== '' ? '1' : '0',
722
+ } : childEnv,
714
723
  ...(noStdin ? { stdio: ['ignore', 'pipe', 'pipe'] } : useTerminal ? { stdio: ['inherit', 'pipe', 'pipe'] } : { input: input === undefined ? '' : input }),
715
724
  timeout: timeoutMs,
716
725
  maxBuffer: 16 * 1024 * 1024,
@@ -2013,6 +2022,7 @@ module.exports = {
2013
2022
  sweepStaleAppDirs,
2014
2023
  checkInstallerSignature,
2015
2024
  writeTemplateFile,
2025
+ runOp,
2016
2026
  APP_INSTALLER_URL,
2017
2027
  ETAPAS,
2018
2028
  makeLock,
@@ -2,7 +2,7 @@
2
2
  "schema": 1,
3
3
  "algorithm": "sha256",
4
4
  "scope": "packaged-runtime-and-cascas",
5
- "version": "2.8.6",
5
+ "version": "2.8.8",
6
6
  "files": [
7
7
  {
8
8
  "path": ".auroq-core/constitution.md",
@@ -10,7 +10,7 @@
10
10
  },
11
11
  {
12
12
  "path": ".auroq-core/core-config.yaml",
13
- "sha256": "51edca56ab55af77a40dc2fa1290022ee3d608916994a518da779f2e138284da"
13
+ "sha256": "f8d396a2a696af94b4a96822d5eec348510fa1e0e0fb6f71107118dd15e2adc1"
14
14
  },
15
15
  {
16
16
  "path": ".auroq-core/core/synapse/context/context-builder.js",
@@ -206,7 +206,7 @@
206
206
  },
207
207
  {
208
208
  "path": ".claude/settings.json",
209
- "sha256": "a059b6e15cfe6822f00d1a39c563d6335839c8ac63a5763f6a4cf1af204df284"
209
+ "sha256": "57c338e326586805e605229f7bcec699a52b99a113b153d06a209084e0c0fa4c"
210
210
  },
211
211
  {
212
212
  "path": ".claude/settings.local.json",
@@ -214,7 +214,7 @@
214
214
  },
215
215
  {
216
216
  "path": "bin/auroq-os.js",
217
- "sha256": "937e6e3b748e05f324b196891ea46663b950aa12e1ca20c9aa9dacf6d2bd8962"
217
+ "sha256": "4d3bd746dc2eb4c0e0a3cce30f2bed16d41af4230645fb0f7ef4f3ae6f5b485a"
218
218
  },
219
219
  {
220
220
  "path": "lib/ahi/client.mjs",
@@ -282,7 +282,7 @@
282
282
  },
283
283
  {
284
284
  "path": "lib/onepassword.js",
285
- "sha256": "64d449d0d8f7fdc30d912dd7163d44ab235e83d495e0ad9573addf574f010ec4"
285
+ "sha256": "d1bf61b459f81dfb7e13e2c694c1ead1d3146ba8057ff74fcf5d46beb6558cdf"
286
286
  },
287
287
  {
288
288
  "path": "lib/supabase.js",
@@ -298,7 +298,7 @@
298
298
  },
299
299
  {
300
300
  "path": "package.json",
301
- "sha256": "5d4c499b938bf1426747f0f7f5b3c7f760a5b1cbbf926f0523d00bdb34fbca91"
301
+ "sha256": "e8a718a7f9f7345742d5cf7a894deeee0cf9308bfaf49dc3635c530ff0e4a3bd"
302
302
  },
303
303
  {
304
304
  "path": "scripts/build-pack.mjs",
@@ -318,7 +318,7 @@
318
318
  },
319
319
  {
320
320
  "path": "scripts/runtime-integrity.mjs",
321
- "sha256": "e185ab4937628ac1be733f087638a4121b3c16e0c2a3ea76fd5c68cae571f802"
321
+ "sha256": "7d7ed4a01df802f5421efff0444b4c399f1408c380c7084114987d4c75e313a5"
322
322
  },
323
323
  {
324
324
  "path": "scripts/sync-codex-skills.mjs",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "auroq-os",
3
- "version": "2.8.6",
3
+ "version": "2.8.8",
4
4
  "arcaneMcpPin": "0.7.1",
5
5
  "description": "Auroq OS — Sistema Operacional de IA para o negócio do aluno da Arcane",
6
6
  "bin": {
@@ -109,8 +109,10 @@ function verifyReferences(root, paths) {
109
109
  const settings = JSON.parse(fs.readFileSync(checkedFile(root, source), 'utf8'));
110
110
  for (const groups of Object.values(settings.hooks || {})) {
111
111
  for (const group of groups) for (const hook of group.hooks || []) {
112
- const match = typeof hook.command === 'string' && hook.command.match(/^node\s+(\.claude\/hooks\/[^\s]+)(?:\s|$)/);
113
- if (match) checkedFile(root, match[1]);
112
+ const shellPath = typeof hook.command === 'string' && hook.command.match(/^node\s+(\.claude\/hooks\/[^\s]+)(?:\s|$)/)?.[1];
113
+ const execPath = hook.command === 'node' && Array.isArray(hook.args)
114
+ && hook.args[0]?.match(/^\$\{CLAUDE_PROJECT_DIR\}\/(\.claude\/hooks\/[^\s]+)$/)?.[1];
115
+ if (shellPath || execPath) checkedFile(root, shellPath || execPath);
114
116
  }
115
117
  }
116
118
  }