auroq-os 2.8.0 → 2.8.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.
@@ -68,7 +68,7 @@ business/
68
68
  campanhas/ ← Campanhas ativas + _template
69
69
  processos/ ← SOPs documentados
70
70
  agente/ ← Agentes autonomos (Bia, etc.)
71
- vault/ ← Chaves e acessos (NUNCA mexer sem permissao)
71
+ vault/ ← So status e referencias op:// do cofre (1Password ou Infisical) (NUNCA guardar valor; NUNCA mexer sem permissao)
72
72
  cockpit.md ← Fonte unica de verdade dos projetos
73
73
  templates/ ← Moldes reutilizaveis
74
74
  docs/knowledge/
@@ -103,7 +103,7 @@ docs/diagrams/ ← Visualizacoes
103
103
  | Processo documentado (SOP) | `business/processos/` | Feito, funcionou, documentou |
104
104
  | Campanha ativa | `business/campanhas/{slug}/` | Com tracker + arsenal |
105
105
  | Template reutilizavel | `business/templates/` ou `business/campanhas/_template/` | Molde, nao instancia |
106
- | Chave/acesso/login | `business/vault/` | Protegido, .gitignored |
106
+ | Chave/acesso/login | Cofre do aluno (1Password ou Infisical; via Companion/Ops) | `business/vault/` guarda so status e referencia `op://...`, nunca o valor |
107
107
  | Agente/squad/worker | `agents/{slug}/` | Todo agente vive aqui |
108
108
  | Diagrama/visualizacao | `docs/diagrams/` | HTML, imagens conceituais |
109
109
  | Lixo/temporario | DELETAR | Nao acumular |
@@ -216,7 +216,7 @@ Ativado por: `*store`, "guarda isso", "salva esse documento", "armazena", "coloc
216
216
  - NUNCA salvar sem confirmar o destino com o aluno (se houver duvida)
217
217
  - NUNCA sobrescrever arquivo existente sem aprovacao
218
218
  - SE o aluno cola texto bruto longo: organizar minimamente (titulo, secoes) antes de salvar
219
- - SE o aluno manda algo que nao e documento de negocio (chave, login, senha): redirecionar pro vault
219
+ - SE o aluno manda algo que nao e documento de negocio (chave, login, senha): NAO salvar em arquivo nenhum e redirecionar pro cofre do aluno (1Password ou Infisical; via Companion/Ops); `business/vault/` so guarda status e referencia `op://...`, nunca o valor
220
220
 
221
221
  ### Modo 6: LIMPAR (*clean)
222
222
 
@@ -239,7 +239,7 @@ Ativado por: `*clean`, "limpa", "remove lixo", "tira o que nao precisa"
239
239
 
240
240
  Ativado por: `*backup`, "faz backup", "espelha no drive"
241
241
 
242
- **Pre-requisito:** rclone configurado com Google Drive (verificar no vault)
242
+ **Pre-requisito:** rclone configurado com Google Drive (verificar no status em `business/vault/`; a chave em si fica no cofre do aluno)
243
243
 
244
244
  **Protocolo:**
245
245
  1. Verificar rclone configurado: `rclone listremotes`
package/bin/auroq-os.js CHANGED
@@ -39,6 +39,9 @@ runRuntime(telemetry);
39
39
  }
40
40
  }
41
41
  if(process.env.AUROQ_EXPORTA_INTERNOS==='1')runRuntime({runtimeReady(){}});
42
+ // `segredo ler|gravar|listar|apagar|qual`: os agentes chamam isso a cada credencial. Caminho leve de proposito:
43
+ // sem telemetria, sem flush e sem banner (cada leitura que falha, como "nao encontrado", sairia como erro de instalacao).
44
+ else if(process.argv[2]==='segredo')require('../lib/cofre').segredoCli(process.argv.slice(3)).then(code=>{process.exitCode=code;}).catch(()=>{console.error('AUROQ_ERRO codigo=falha mensagem="Falha inesperada ao falar com o cofre."');process.exitCode=1;});
42
45
  else observedMain().catch(()=>{console.error('[auroq-os] BOOTSTRAP_IMPORT');process.exitCode=1;});
43
46
 
44
47
  function runRuntime(telemetry) {
@@ -234,6 +237,10 @@ function mudouAlgoDeAbertura(antes, depois) {
234
237
  // controla vem do modelo; permissions/statusLine/env do aluno ficam; chave que o modelo nao tem
235
238
  // fica; hooks do aluno ficam e os do framework sao trocados pelos do modelo, sem duplicar.
236
239
  const HOOK_DO_FRAMEWORK = /(?:^|[\s"'\\/])(?:auroq-sync|synapse-engine|ahi-capture|precompact-session-digest)\.cjs\b/;
240
+ // Gancho de IA do sistema (type "prompt", sem `command`): o texto comeca com uma marca `[auroq-...]`.
241
+ // Sem ela, a manutencao o tomava por gancho do aluno e o duplicava a cada versao.
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 || ''));
237
244
  const CHAVES_DO_ALUNO = ['permissions', 'statusLine', 'env'];
238
245
  const temChave = (obj, chave) => Object.prototype.hasOwnProperty.call(obj, chave);
239
246
 
@@ -243,7 +250,7 @@ function mesclarHooksDoProjeto(doModelo, doAluno) {
243
250
  for (const evento of new Set([...Object.keys(doModelo), ...Object.keys(aluno)])) {
244
251
  const proprios = (Array.isArray(aluno[evento]) ? aluno[evento] : [])
245
252
  .map(g => (ehObjeto(g) && Array.isArray(g.hooks)
246
- ? { ...g, hooks: g.hooks.filter(h => !HOOK_DO_FRAMEWORK.test(String(h?.command || ''))) }
253
+ ? { ...g, hooks: g.hooks.filter(h => !ehHookDoFramework(h)) }
247
254
  : g))
248
255
  .filter(g => !(ehObjeto(g) && Array.isArray(g.hooks) && g.hooks.length === 0));
249
256
  const grupos = [...(Array.isArray(doModelo[evento]) ? doModelo[evento] : []), ...proprios];
@@ -1693,7 +1700,7 @@ async function init({ pasta = null, maintenance = false, modoAgente = false, mig
1693
1700
  log(`Rode: ${CYAN}npx auroq-os clone${RESET}`);
1694
1701
  log('');
1695
1702
  log(`${DIM}Ele baixa o seu negocio inteiro do GitHub — sistema, memoria e documentos —${RESET}`);
1696
- log(`${DIM}e deixa tudo pronto. Depois e so reconectar o cofre com *conectar-1password.${RESET}`);
1703
+ log(`${DIM}e deixa tudo pronto. Depois e so reconectar o cofre com *conectar-cofre.${RESET}`);
1697
1704
  log('');
1698
1705
  process.exit(0);
1699
1706
  }
@@ -2385,7 +2392,7 @@ ${DIM} Uma vez so, nesta maquina:${RESET}
2385
2392
  ${CYAN}cd ${destName}${RESET}
2386
2393
  ${CYAN}claude${RESET} ${DIM}ou${RESET} ${CYAN}codex${RESET}
2387
2394
  ${CYAN}/AuroqOS:agents:ops${RESET}
2388
- ${CYAN}*conectar-1password${RESET} ${DIM}— reconectar o cofre de senhas${RESET}
2395
+ ${CYAN}*conectar-cofre${RESET} ${DIM}— reconectar o cofre de senhas (1Password ou Infisical gratis; ele pergunta qual)${RESET}
2389
2396
  ${DIM}(dono do negocio: se o sistema pedir login em algum momento, ${RESET}${CYAN}npx auroq-os login${RESET}${DIM})${RESET}
2390
2397
 
2391
2398
  ${DIM} Ritual de todo dia, em toda maquina:${RESET}
@@ -2480,10 +2487,29 @@ if (['init', 'install', 'update'].includes(command)) {
2480
2487
  });
2481
2488
  } else if (command === 'conectar-1password' || command === 'connect-1password') {
2482
2489
  const onepassword = require('../lib/onepassword');
2483
- onepassword.connect().catch(e => {
2490
+ // Padrao: cria o cofre Claude e a chave do agente sozinho (o aluno aprova uma vez no app).
2491
+ // `--agente` imprime a linha AUROQ_RESULTADO que o Ops le; `--manual` e o plano B escondido.
2492
+ onepassword.connect({ argv: process.argv.slice(3) }).then(r => {
2493
+ // Erro que o aluno ou o plano dele resolve (sem internet, conta de empresa, dois cofres Claude...) nao e
2494
+ // instalacao quebrada: mesmo desfecho "etapa do fluxo" da manutencao (chega como null, sem alarme).
2495
+ if (r && r.status === 'erro' && onepassword.isStudentActionable(r.codigo)) telemetry.codigoDoDesfecho = 'UPDATE_NEEDS_STUDENT';
2496
+ // Cofre ativo do aluno: o comando comum `segredo` precisa saber que e o 1Password (nunca falha a conexao).
2497
+ // Quem ja usa o Infisical (pronto) continua nele ate a migracao; o modo --manual termina ok sem devolver resultado.
2498
+ return require('../lib/cofre').registrarSeOk(r, '1password', {}, process.argv.slice(3));
2499
+ }).catch(e => {
2484
2500
  error(`Falha ao conectar 1Password: ${e.message}`);
2485
2501
  process.exit(1);
2486
2502
  });
2503
+ } else if (command === 'conectar-cofre' || command === 'connect-vault') {
2504
+ // Escolha do cofre: 1Password (pago, recomendado) ou Infisical (gratis). Sem --cofre e sem cofre em andamento,
2505
+ // devolve a pergunta ao Ops/Companion (AUROQ_RESULTADO cofre=aguardando codigo=escolher-cofre).
2506
+ const cofre = require('../lib/cofre');
2507
+ cofre.conectarCofre(process.argv.slice(3)).then(r => {
2508
+ if (r && r.status === 'erro' && cofre.isStudentActionable(r)) telemetry.codigoDoDesfecho = 'UPDATE_NEEDS_STUDENT';
2509
+ }).catch(e => {
2510
+ error(`Falha ao conectar o cofre: ${e.message}`);
2511
+ process.exit(1);
2512
+ });
2487
2513
  } else if (command === 'doctor' || command === 'diagnostico') {
2488
2514
  // `auth.sair`: o doctor termina logo depois de falar com o servidor (Node 24 no Windows).
2489
2515
  runDoctor(process.cwd(), { leve: process.argv.includes('--leve') }).then(code => auth.sair(code)).catch(e => {
@@ -2546,7 +2572,9 @@ if (['init', 'install', 'update'].includes(command)) {
2546
2572
  log(` ${CYAN}register-mcp${RESET} Reescrever o registro do conteudo ao vivo (MCP arcane) no projeto`);
2547
2573
  log(` ${CYAN}sync-codex${RESET} Gerar e verificar as skills locais do Codex CLI ($nome)`);
2548
2574
  log(` ${CYAN}historico${RESET} Estado da captura do trabalho (prevista nos Termos de Uso; desliga em Minha Conta)`);
2549
- log(` ${CYAN}conectar-1password${RESET} Conectar o 1Password CLI (token lido do Ctrl+C, nunca digitado)`);
2575
+ log(` ${CYAN}conectar-cofre${RESET} Escolher e conectar o cofre de senhas: 1Password (pago, recomendado) ou Infisical (gratis)`);
2576
+ log(` ${CYAN}conectar-1password${RESET} Conectar o 1Password (cria o cofre e a chave sozinho; voce so aprova uma vez no app)`);
2577
+ log(` ${CYAN}segredo${RESET} Ler, gravar, listar ou apagar uma credencial no cofre do aluno (vale para 1Password e Infisical)`);
2550
2578
  log('');
2551
2579
  log(`${DIM}Primeira instalacao: https://arcane.arka.education/auroq${RESET}`);
2552
2580
  log('');
@@ -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.0 check-access
592
+ & (Get-AuroqNpx) -y auroq-os@2.8.2 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.0 instalar
680
+ & (Get-AuroqNpx) -y auroq-os@2.8.2 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.0 "$@"
222
+ npx -y auroq-os@2.8.2 "$@"
223
223
  else
224
- npx -y auroq-os@2.8.0 "$@" < /dev/tty
224
+ npx -y auroq-os@2.8.2 "$@" < /dev/tty
225
225
  fi
226
226
  }
227
227