auroq-os 2.4.3 → 2.4.4

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.
@@ -49,13 +49,52 @@ function describeCommits(range, limit) {
49
49
  return out.split('\n').filter(Boolean).map(l => { const i = l.indexOf('|'); return `- ${l.slice(0, i)}: ${l.slice(i + 1)}`; });
50
50
  }
51
51
 
52
+ // ─── Aviso de versao nova (1x por dia) ───────────────────
53
+ const VERSION_CHECK_EVERY_MS = 24 * 60 * 60 * 1000;
54
+
55
+ function localVersion() {
56
+ try {
57
+ const y = fs.readFileSync(path.join(CWD, '.auroq-core', 'core-config.yaml'), 'utf8');
58
+ const m = y.match(/^\s*version:\s*["']?(\d+\.\d+\.\d+)/m);
59
+ return m ? m[1] : null;
60
+ } catch { return null; }
61
+ }
62
+ function npmLatest() {
63
+ try {
64
+ const out = execFileSync('npm', ['view', 'auroq-os', 'version'], {
65
+ encoding: 'utf8', timeout: 8000, stdio: ['ignore', 'pipe', 'ignore'],
66
+ shell: process.platform === 'win32',
67
+ });
68
+ const v = String(out).trim();
69
+ return /^\d+\.\d+\.\d+$/.test(v) ? v : null;
70
+ } catch { return null; }
71
+ }
72
+ function cmpVer(a, b) {
73
+ const pa = a.split('.').map(Number), pb = b.split('.').map(Number);
74
+ for (let i = 0; i < 3; i++) { if ((pa[i] || 0) !== (pb[i] || 0)) return (pa[i] || 0) - (pb[i] || 0); }
75
+ return 0;
76
+ }
77
+ function versionNotice() {
78
+ const local = localVersion();
79
+ if (!local) return null; // pasta sem Auroq OS instalado
80
+ const st = readState();
81
+ const now = Date.now();
82
+ if (st.lastVersionCheck && now - st.lastVersionCheck < VERSION_CHECK_EVERY_MS) return null;
83
+ st.lastVersionCheck = now; // marca ANTES da consulta — offline nao vira insistencia
84
+ writeState(st);
85
+ const latest = npmLatest();
86
+ if (!latest || cmpVer(latest, local) <= 0) return null;
87
+ return `[Auroq update] Saiu versao nova do sistema: v${local} instalada → v${latest} disponivel. Avise o expert em 1 linha e ofereca: "quer que eu atualize agora?" (o *update do Ops aplica tudo e preserva os dados dele; antes de aplicar, ele mostra o que mudou).`;
88
+ }
89
+
52
90
  function sessionStart() {
53
- if (!isRepo() || !hasRemote()) return;
91
+ const vNotice = versionNotice();
92
+ if (!isRepo() || !hasRemote()) { emit('SessionStart', vNotice); return; }
54
93
  const up = upstream();
55
- if (!up) return;
94
+ if (!up) { emit('SessionStart', vNotice); return; }
56
95
  const dirty = dirtyFiles();
57
96
  if (tryGit(['fetch', '--quiet'], 8000) === null) {
58
- emit('SessionStart', '[Auroq sync] Nao consegui checar o GitHub agora (sem conexao?). O trabalho local esta intacto. So mencione se o expert perguntar de sincronizacao.');
97
+ emit('SessionStart', [vNotice, '[Auroq sync] Nao consegui checar o GitHub agora (sem conexao?). O trabalho local esta intacto. So mencione se o expert perguntar de sincronizacao.'].filter(Boolean).join('\n'));
59
98
  return;
60
99
  }
61
100
  const behind = countRange(`HEAD..${up}`);
@@ -86,6 +125,7 @@ function sessionStart() {
86
125
  st.dirtySince = dirty.length ? (st.dirtySince || Date.now()) : 0;
87
126
  st.lastRemind = 0;
88
127
  writeState(st);
128
+ if (vNotice) lines.unshift(vNotice);
89
129
  emit('SessionStart', lines.join('\n'));
90
130
  }
91
131
 
package/README.md CHANGED
@@ -80,6 +80,7 @@ grok
80
80
  | `auroq-os logout` | Encerra sessao local (remove `~/.arcane/credentials.json`) |
81
81
  | `auroq-os whoami` | Mostra usuario autenticado e status de acesso |
82
82
  | `auroq-os doctor` | Diagnostico do suporte: arquivos, motor do sistema (e se o programa aberto pelo icone enxerga ele), registro do conteudo ao vivo, login e servidor |
83
+ | `auroq-os register-mcp` | Reescreve o registro do conteudo ao vivo no projeto (use se o `doctor` apontar que ele falta) |
83
84
  | `auroq-os sync-codex` | Regenera e verifica as skills locais do Codex |
84
85
  | `auroq-os conectar-1password` | Conecta o 1Password CLI — le o token de Service Account direto do Ctrl+C (nunca digitado nem exposto), instala o `op` se faltar, valida online e salva permanente (Mac/Windows) |
85
86
 
@@ -108,6 +109,42 @@ cofre 1Password com escopo) — nunca a senha do dono. **Colaborador nao precisa
108
109
  aluno**: o acesso dele e o convite do GitHub (o `clone` nao pede login); quem atualiza
109
110
  o sistema e o dono, e o colaborador recebe as atualizacoes automaticamente ao abrir o `claude`.
110
111
 
112
+ ## Conteudo ao vivo
113
+
114
+ O Auroq OS tem duas partes:
115
+
116
+ - **Motor** (mora no seu computador): a estrutura de pastas, o git, os comandos e as regras.
117
+ E o que o instalador monta e o que o `*update` atualiza.
118
+ - **Conteudo** (chega ao vivo): o cerebro dos agentes — Companion, Consultor, forjas e o
119
+ Pack Arcane — e servido em tempo real pelo servidor da mentoria, atraves de uma conexao
120
+ chamada MCP `arcane`. O instalador ja registra essa conexao no projeto; voce nao precisa
121
+ configurar nada.
122
+
123
+ Na pratica: melhorias de conteudo chegam pra voce **sozinhas**, sem atualizar nada.
124
+ So e preciso estar logado (mesmo email e senha da plataforma) e com o contrato ativo.
125
+ Se um agente nao responder, rode `npx auroq-os doctor` — ele confere a conexao, o login
126
+ e o servidor, e diz exatamente o que fazer.
127
+
128
+ ## Atualizar o sistema
129
+
130
+ De tempos em tempos sai versao nova do **motor** (novos comandos, correcoes do instalador).
131
+ Voce nao precisa vigiar nada: ao abrir o Claude Code no seu projeto, o sistema avisa
132
+ sozinho quando existe versao nova (confere no maximo 1x por dia).
133
+
134
+ Pra atualizar, e uma frase — dentro do Claude Code, com o Ops ativo (`/AuroqOS:agents:ops`):
135
+
136
+ ```
137
+ atualiza o sistema
138
+ ```
139
+
140
+ O Ops confere seu acesso, mostra o que mudou, salva um ponto de restauracao (commit),
141
+ aplica a versao nova e roda o diagnostico no final. **Seus dados nunca sao tocados**:
142
+ memoria do Companion, documentos, cockpit, campanhas, squads que voce criou e
143
+ personalizacoes ficam exatamente como estavam. O que se atualiza e so o framework.
144
+
145
+ O historico do que mudou em cada versao fica no arquivo `CHANGELOG.md`, dentro do
146
+ proprio pacote — o Ops resume pra voce antes de aplicar.
147
+
111
148
  ## Estrutura
112
149
 
113
150
  ```
@@ -155,4 +192,4 @@ agents/ → Seu exercito (companion, workers, minds, squads)
155
192
 
156
193
  ---
157
194
 
158
- *Auroq OS v2.2.4 — by Euriler Jube / Arka*
195
+ *Auroq OS — by Euriler Jube / Arka*
package/bin/auroq-os.js CHANGED
@@ -329,7 +329,7 @@ async function runDoctor(targetDir) {
329
329
  success(`MCP arcane registrado no Claude Code (${pin})`);
330
330
  } else {
331
331
  error('MCP arcane nao registrado em .mcp.json');
332
- problemas.push('Rode *update-auroq — ele reescreve o registro do MCP.');
332
+ problemas.push('Rode: npx auroq-os register-mcp (reescreve o registro). Depois feche e abra o Claude Code.');
333
333
  }
334
334
  const tomlPath = path.join(targetDir, '.codex', 'config.toml');
335
335
  const temToml = (await fs.pathExists(tomlPath)) &&
@@ -412,6 +412,7 @@ async function patchEnableAllProjectMcpServers(targetDir) {
412
412
  }
413
413
  if (json.enableAllProjectMcpServers === true) return;
414
414
  json.enableAllProjectMcpServers = true;
415
+ await fs.ensureDir(path.dirname(settingsPath));
415
416
  await fs.writeJSON(settingsPath, json, { spaces: 2 });
416
417
  }
417
418
 
@@ -1143,6 +1144,25 @@ if (command === 'init' || command === 'install') {
1143
1144
  error(`Falha no diagnostico: ${e.message}`);
1144
1145
  process.exit(1);
1145
1146
  });
1147
+ } else if (command === 'register-mcp') {
1148
+ // Reescreve o registro do conteudo ao vivo (MCP arcane) nos dois runtimes.
1149
+ // Usado pelo Ops no *update-auroq em projeto que veio de versao sem MCP.
1150
+ (async () => {
1151
+ const targetDir = process.cwd();
1152
+ if (!(await fs.pathExists(path.join(targetDir, '.auroq-core')))) {
1153
+ error('Esta pasta nao tem um Auroq OS instalado (.auroq-core ausente).');
1154
+ error('Rode este comando na raiz do seu negocio.');
1155
+ process.exit(1);
1156
+ }
1157
+ await patchEnableAllProjectMcpServers(targetDir);
1158
+ await writeArcaneMcpConfig(targetDir);
1159
+ success('Conteudo ao vivo registrado (.mcp.json e .codex/config.toml).');
1160
+ log(`${DIM}Feche e abra o Claude Code ou o Codex pra ele enxergar o registro.${RESET}`);
1161
+ process.exit(0);
1162
+ })().catch(err => {
1163
+ error(`Falha ao registrar o MCP: ${err.message}`);
1164
+ process.exit(1);
1165
+ });
1146
1166
  } else if (command === 'sync-codex') {
1147
1167
  // Regenera as skills do Codex CLI a partir dos comandos atuais do projeto.
1148
1168
  try {
@@ -1165,6 +1185,7 @@ if (command === 'init' || command === 'install') {
1165
1185
  log(` ${CYAN}check-access${RESET} Validar acesso ativo (online; exit 0=ativo, 1=bloqueado)`);
1166
1186
  log(` ${CYAN}update${RESET} Atualizar (via Ops dentro do Claude Code)`);
1167
1187
  log(` ${CYAN}doctor${RESET} Diagnostico: arquivos, Node, MCP arcane, login e servidor`);
1188
+ log(` ${CYAN}register-mcp${RESET} Reescrever o registro do conteudo ao vivo (MCP arcane) no projeto`);
1168
1189
  log(` ${CYAN}sync-codex${RESET} Gerar e verificar as skills locais do Codex CLI ($nome)`);
1169
1190
  log(` ${CYAN}conectar-1password${RESET} Conectar o 1Password CLI (token lido do Ctrl+C, nunca digitado)`);
1170
1191
  log('');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "auroq-os",
3
- "version": "2.4.3",
3
+ "version": "2.4.4",
4
4
  "description": "Auroq OS — Sistema Operacional de IA para Experts",
5
5
  "bin": {
6
6
  "auroq-os": "bin/auroq-os.js"