auroq-os 2.7.0 → 2.8.0
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/.auroq-core/core-config.yaml +1 -1
- package/.claude/hooks/auroq-sync.cjs +80 -11
- package/.claude/rules/memoria-inteligente.md +44 -2
- package/AGENTS.md +11 -0
- package/CHANGELOG.md +27 -0
- package/README.md +3 -3
- package/bin/auroq-os.js +16 -6
- package/installer/install.ps1 +2 -2
- package/installer/install.sh +2 -2
- package/lib/runtime-integrity.json +6 -6
- package/package.json +1 -1
- package/scripts/sync-codex-skills.mjs +2 -1
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* Auroq OS — Sync Hook
|
|
5
5
|
*
|
|
6
6
|
* --session-start (SessionStart) checa o GitHub ao abrir; PUXA se for seguro; relata o que chegou
|
|
7
|
-
* --remind (UserPromptSubmit) lembra, com moderacao, de trabalho nao entregue
|
|
7
|
+
* --remind (UserPromptSubmit) lembra, com moderacao, de trabalho nao entregue, e traz da
|
|
8
|
+
* memoria do negocio (app Auroq OS) o que tem a ver com o pedido
|
|
8
9
|
*
|
|
9
10
|
* Regras de ouro:
|
|
10
11
|
* - Nunca bloqueia a sessao (sempre exit 0) e fica em silencio quando nao ha o que dizer.
|
|
@@ -97,8 +98,23 @@ function versionNotice() {
|
|
|
97
98
|
return `[Auroq update] Saiu versao nova do sistema: v${local} instalada → v${latest} disponivel. Na sua primeira resposta, avise o expert em 1 frase simples e pergunte: "Quer que eu atualize agora? Leva uns 5 minutos e voce nao precisa fazer nada." Se ele disser sim: a atualizacao e feita pelo Ops, sem o expert abrir terminal — chame a tool forja_bundle (MCP arcane) com forge_id "ops" e fase "manutencao" e siga aqueles passos a risca (e o mesmo que ele pedir ao Ops "atualiza o sistema"). Se ele disser nao, nao pergunte de novo nesta conversa.`;
|
|
98
99
|
}
|
|
99
100
|
|
|
101
|
+
// ─── Bilhete da memória (app Auroq OS, Fase 1 da memória do aluno) ───────────
|
|
102
|
+
// O app refaz `agents/companion/data/nucleo.md` sozinho depois das conversas (teto de 3.000
|
|
103
|
+
// caracteres). Toda conversa nova comeca com ele, no lugar de ler os arquivos inteiros da memoria.
|
|
104
|
+
const NUCLEO = path.join('agents', 'companion', 'data', 'nucleo.md');
|
|
105
|
+
const NUCLEO_MAX = 3000;
|
|
106
|
+
|
|
107
|
+
function nucleoNotice() {
|
|
108
|
+
let texto;
|
|
109
|
+
try { texto = fs.readFileSync(path.join(CWD, NUCLEO), 'utf8'); } catch { return null; }
|
|
110
|
+
texto = texto.replace(/^\uFEFF/, '').replace(/\r\n/g, '\n').trim();
|
|
111
|
+
if (!texto) return null;
|
|
112
|
+
if (texto.length > NUCLEO_MAX) texto = `${texto.slice(0, NUCLEO_MAX - 1)}…`;
|
|
113
|
+
return `[Memoria do sistema] Bilhete da memoria deste negocio (${NUCLEO}, refeito sozinho pelo app Auroq OS a partir das conversas anteriores; vale para todo agente, squad e skill desta pasta, nao so o Companion). Use para saber quem e o aluno, onde voces pararam, o que ja foi decidido e o que esta pendente; nao leia para o aluno sem ele pedir. Detalhes em agents/companion/data/.\n${texto}`;
|
|
114
|
+
}
|
|
115
|
+
|
|
100
116
|
function sessionStart() {
|
|
101
|
-
const vNotice = versionNotice();
|
|
117
|
+
const vNotice = [nucleoNotice(), versionNotice()].filter(Boolean).join('\n') || null;
|
|
102
118
|
if (!isRepo() || !hasRemote()) { emit('SessionStart', vNotice); return; }
|
|
103
119
|
const up = upstream();
|
|
104
120
|
if (!up) { emit('SessionStart', vNotice); return; }
|
|
@@ -139,8 +155,54 @@ function sessionStart() {
|
|
|
139
155
|
emit('SessionStart', lines.join('\n'));
|
|
140
156
|
}
|
|
141
157
|
|
|
142
|
-
|
|
143
|
-
|
|
158
|
+
// ─── Busca na memória a cada pedido (app Auroq OS, Fase 2 da memória do aluno) ─────
|
|
159
|
+
// O app mantém um índice da memória do negócio; `auroq memoria busca --gancho` devolve até 3 trechos
|
|
160
|
+
// (1.500 caracteres) que passam no filtro de relevância, ou nada. Pedido trivial não busca. Sem o app
|
|
161
|
+
// (comando ausente, app fechado, demorou), segue em silêncio: a conversa nunca espera por isso.
|
|
162
|
+
const MEMORIA = path.join('agents', 'companion', 'data');
|
|
163
|
+
const TEMPO_DA_BUSCA_MS = 3500;
|
|
164
|
+
const TRIVIAL = /^(?:oi|ola|olá|ok|blz|beleza|obrigad[oa]|valeu|sim|n[aã]o|pode|segue|continua|bom dia|boa tarde|boa noite|top|show|perfeito|certo|isso|entendi|bora|go)\b/i;
|
|
165
|
+
|
|
166
|
+
function acharAuroq() {
|
|
167
|
+
const nomes = process.platform === 'win32' ? ['auroq.exe'] : ['auroq'];
|
|
168
|
+
const pastas = String(process.env.PATH || '').split(path.delimiter).filter(Boolean);
|
|
169
|
+
if (process.platform === 'darwin') pastas.push('/Applications/Auroq OS.app/Contents/Resources/bin');
|
|
170
|
+
for (const pasta of pastas) {
|
|
171
|
+
for (const nome of nomes) {
|
|
172
|
+
const alvo = path.join(pasta, nome);
|
|
173
|
+
try { if (fs.statSync(alvo).isFile()) return alvo; } catch { /* segue */ }
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function pedidoDoAluno(entrada) {
|
|
180
|
+
try {
|
|
181
|
+
const dado = JSON.parse(entrada || '{}');
|
|
182
|
+
return typeof dado.prompt === 'string' ? dado.prompt : '';
|
|
183
|
+
} catch {
|
|
184
|
+
return '';
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function buscaNaMemoria(pedido) {
|
|
189
|
+
const texto = String(pedido || '').replace(/\s+/g, ' ').trim();
|
|
190
|
+
if (texto.length < 8 || (texto.length < 30 && TRIVIAL.test(texto))) return null;
|
|
191
|
+
if (!fs.existsSync(path.join(CWD, MEMORIA))) return null;
|
|
192
|
+
const programa = acharAuroq();
|
|
193
|
+
if (!programa) return null;
|
|
194
|
+
try {
|
|
195
|
+
const saida = execFileSync(programa, ['memoria', 'busca', texto.slice(0, 600), '--gancho'], {
|
|
196
|
+
cwd: CWD, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'], timeout: TEMPO_DA_BUSCA_MS, windowsHide: true,
|
|
197
|
+
}).trim();
|
|
198
|
+
return /^\[Memoria do (sistema|Companion)\]/.test(saida) ? saida.slice(0, 2500) : null;
|
|
199
|
+
} catch {
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function lembrete() {
|
|
205
|
+
if (!isRepo()) return null;
|
|
144
206
|
const dirty = dirtyFiles();
|
|
145
207
|
const up = upstream();
|
|
146
208
|
const ahead = up ? countRange(`${up}..HEAD`) : 0;
|
|
@@ -148,30 +210,37 @@ function remind() {
|
|
|
148
210
|
const now = Date.now();
|
|
149
211
|
if (dirty.length === 0 && ahead === 0) {
|
|
150
212
|
if (st.dirtySince) { st.dirtySince = 0; writeState(st); }
|
|
151
|
-
return;
|
|
213
|
+
return null;
|
|
152
214
|
}
|
|
153
|
-
if (!st.dirtySince) { st.dirtySince = now; writeState(st); return; }
|
|
154
|
-
if (now - st.dirtySince < REMIND_AFTER_MS) return;
|
|
155
|
-
if (st.lastRemind && now - st.lastRemind < REMIND_EVERY_MS) return;
|
|
215
|
+
if (!st.dirtySince) { st.dirtySince = now; writeState(st); return null; }
|
|
216
|
+
if (now - st.dirtySince < REMIND_AFTER_MS) return null;
|
|
217
|
+
if (st.lastRemind && now - st.lastRemind < REMIND_EVERY_MS) return null;
|
|
156
218
|
st.lastRemind = now;
|
|
157
219
|
writeState(st);
|
|
158
220
|
const mins = Math.round((now - st.dirtySince) / 60000);
|
|
159
|
-
|
|
221
|
+
return (`[Auroq lembrete] Ha trabalho nao entregue ha ~${mins} min (${dirty.length} arquivo(s) alterado(s)${ahead ? `, ${ahead} commit(s) sem push` : ''}). NAO interrompa o raciocinio atual. Ao fechar o bloco em andamento, ofereca em UMA linha: "quer que eu salve e entregue pro GitHub?". Nunca entregue sem o expert pedir.`);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function remind(entrada) {
|
|
225
|
+
const partes = [buscaNaMemoria(pedidoDoAluno(entrada)), lembrete()].filter(Boolean);
|
|
226
|
+
emit('UserPromptSubmit', partes.join('\n\n') || null);
|
|
160
227
|
}
|
|
161
228
|
|
|
162
229
|
let ran = false;
|
|
230
|
+
let entrada = '';
|
|
163
231
|
function main() {
|
|
164
232
|
if (ran) return;
|
|
165
233
|
ran = true;
|
|
166
|
-
try { if (MODE === '--remind') remind(); else sessionStart(); }
|
|
234
|
+
try { if (MODE === '--remind') remind(entrada); else sessionStart(); }
|
|
167
235
|
catch (e) { console.error(`[auroq-sync] ${e.message}`); }
|
|
168
236
|
process.exit(0);
|
|
169
237
|
}
|
|
170
238
|
|
|
171
239
|
// Consome o JSON que o Claude Code envia no stdin (nao depende dele) e roda no fim;
|
|
172
240
|
// fallback por timer garante execucao mesmo se o stdin nao fechar.
|
|
241
|
+
// O pedido do aluno (UserPromptSubmit) vem nesse JSON e é o que a busca da memória usa.
|
|
173
242
|
process.stdin.resume();
|
|
174
|
-
process.stdin.on('data', () => {});
|
|
243
|
+
process.stdin.on('data', (pedaco) => { if (entrada.length < 200000) entrada += pedaco; });
|
|
175
244
|
process.stdin.on('end', main);
|
|
176
245
|
process.stdin.on('error', main);
|
|
177
246
|
setTimeout(main, 400).unref();
|
|
@@ -4,8 +4,10 @@
|
|
|
4
4
|
|
|
5
5
|
## Regra principal: fim de tarefa, memoria salva
|
|
6
6
|
|
|
7
|
-
No fim de CADA tarefa concluida, o agente ativo (Companion
|
|
8
|
-
pedido, antes da resposta final
|
|
7
|
+
No fim de CADA tarefa concluida, o agente ativo (Companion, Ops, qualquer squad, skill ou a equipe que
|
|
8
|
+
o Companion abre, no Claude ou no Codex) salva sem esperar pedido, antes da resposta final. Com o app
|
|
9
|
+
Auroq OS aberto, a memoria tambem e consolidada sozinha a cada ~30 min e logo que um trabalho termina;
|
|
10
|
+
sem o app (so no terminal), esta regra e o que garante a memoria:
|
|
9
11
|
→ `agents/companion/data/contexto-dinamico.md`: onde paramos (o que ficou pronto, o que segue, o que espera o aluno)
|
|
10
12
|
→ `agents/companion/data/log-decisoes.md`: as decisoes tomadas na tarefa (formato abaixo)
|
|
11
13
|
→ tracker do projeto, se a tarefa e de um projeto do cockpit
|
|
@@ -59,6 +61,42 @@ SE o aluno corrigiu um jeito seu de trabalhar ("nao faz assim", "ja falei", "err
|
|
|
59
61
|
> Salvar estado antes de compactacao de contexto e responsabilidade do
|
|
60
62
|
> `dna-operacional.md` (Session Management) — nao repetir aqui.
|
|
61
63
|
|
|
64
|
+
## Memória automática do app (Auroq OS)
|
|
65
|
+
|
|
66
|
+
Com o app Auroq OS aberto, depois das conversas na pasta do negócio, o app lê o que mudou e, usando a
|
|
67
|
+
própria IA do aluno, atualiza sozinho o "Onde Parou" do `contexto-dinamico.md`, acrescenta decisões em
|
|
68
|
+
`log-decisoes.md`, pendências em `demandas-backlog.md`, regras em `custom-do-aluno.md` e escreve:
|
|
69
|
+
→ `agents/companion/data/diario/AAAA-MM.md`: um resumo por conversa (só acrescenta)
|
|
70
|
+
→ `agents/companion/data/nucleo.md`: o bilhete curto (até 3.000 caracteres) que entra no começo de toda
|
|
71
|
+
conversa
|
|
72
|
+
Isso não tira a regra principal: a IA da conversa continua salvando no fim de cada tarefa (o app é a rede
|
|
73
|
+
de segurança). Não edite `nucleo.md` nem o `diario/` à mão: o app refaz a partir dos outros arquivos.
|
|
74
|
+
|
|
75
|
+
### Buscar na memória (app Auroq OS)
|
|
76
|
+
|
|
77
|
+
O app mantém uma busca de toda a memória do negócio (estes arquivos, o diário, o arquivo da faxina,
|
|
78
|
+
`docs/knowledge/`, `business/processos/`, as conversas antigas desta pasta e o que o Claude e o Codex
|
|
79
|
+
anotaram sozinhos). No Claude Code, a cada pedido do aluno, até 3 trechos que têm a ver chegam sozinhos
|
|
80
|
+
("[Memoria do sistema] Trechos da memoria…"), em toda conversa da pasta, de qualquer agente; use só o
|
|
81
|
+
que ajudar.
|
|
82
|
+
|
|
83
|
+
SE a resposta depende do passado do negócio (preço, decisão, cliente, fornecedor, campanha, "o que a
|
|
84
|
+
gente combinou", "lembra de…") e nem o bilhete nem os trechos que chegaram respondem:
|
|
85
|
+
→ Rode `auroq memoria busca "<palavras do assunto>"` (Windows igual) e responda com o que achar
|
|
86
|
+
→ Trecho do "arquivo da memória" saiu da memória ativa (velho, repetido ou trocado): confira antes de usar
|
|
87
|
+
→ O comando não existe ou falhou (app fechado): procure nos arquivos de `agents/companion/data/` e siga
|
|
88
|
+
→ Pedido novo, que não depende do passado, não precisa de busca
|
|
89
|
+
|
|
90
|
+
### Arrumação diária (app Auroq OS)
|
|
91
|
+
|
|
92
|
+
Uma vez por dia, com o app aberto e sem conversa no meio, a memória se arruma sozinha usando a IA do
|
|
93
|
+
aluno: faz uma prova de lembrança (`agents/companion/data/dreaming/prova.json`, nota em
|
|
94
|
+
`dreaming/historico.md`), tira da memória ativa o que é repetido, trocado, vencido ou pendência feita há
|
|
95
|
+
mais de 30 dias (no máximo 10% por dia; vai para `agents/companion/data/arquivo/AAAA-MM-DD.md` com o
|
|
96
|
+
motivo, nunca é apagado, e volta tudo se a prova piorar) e transforma as correções do dia em regras
|
|
97
|
+
curtas em `custom-do-aluno.md`. Não edite `dreaming/` à mão. Para trazer algo de volta do arquivo,
|
|
98
|
+
copie o trecho para o lugar dele.
|
|
99
|
+
|
|
62
100
|
## Onde Cada Coisa Vai
|
|
63
101
|
|
|
64
102
|
| Tipo de informacao | Destino |
|
|
@@ -72,6 +110,10 @@ SE o aluno corrigiu um jeito seu de trabalhar ("nao faz assim", "ja falei", "err
|
|
|
72
110
|
| Processo documentado | `business/processos/` |
|
|
73
111
|
| Estado de trabalho (pre-autocompact) | Documento de trabalho do projeto |
|
|
74
112
|
| Correcao do aluno (vira regra) | `.claude/rules/custom-do-aluno.md` |
|
|
113
|
+
| Resumo de cada conversa (feito pelo app) | `agents/companion/data/diario/AAAA-MM.md` |
|
|
114
|
+
| Bilhete curto do começo da conversa (feito pelo app) | `agents/companion/data/nucleo.md` |
|
|
115
|
+
| O que a faxina diária tirou da memória ativa (feito pelo app) | `agents/companion/data/arquivo/AAAA-MM-DD.md` |
|
|
116
|
+
| Prova e histórico da arrumação diária (feito pelo app) | `agents/companion/data/dreaming/` |
|
|
75
117
|
|
|
76
118
|
## Regra de Ouro
|
|
77
119
|
|
package/AGENTS.md
CHANGED
|
@@ -106,6 +106,17 @@ mesma resposta que essa parte não foi feita e por quê; nunca pule em silêncio
|
|
|
106
106
|
|
|
107
107
|
## Memória
|
|
108
108
|
|
|
109
|
+
- No começo da conversa, se o bilhete da memória não veio no contexto, leia
|
|
110
|
+
`agents/companion/data/nucleo.md` quando ele existir: quem é o aluno, onde vocês pararam, as últimas
|
|
111
|
+
decisões e as pendências. O app Auroq OS refaz esse bilhete e o diário (`agents/companion/data/diario/`)
|
|
112
|
+
sozinho depois das conversas; não edite os dois à mão.
|
|
113
|
+
- Antes de responder algo que depende do passado do negócio (preço, decisão, cliente, fornecedor,
|
|
114
|
+
campanha, "o que a gente combinou", "lembra de…") e que o bilhete não responde, procure na memória:
|
|
115
|
+
`auroq memoria busca "<palavras do assunto>"` (com o app Auroq OS aberto; no Claude Code os trechos
|
|
116
|
+
que têm a ver já chegam sozinhos a cada pedido). Use o que achar, com a data quando ajudar; trecho do
|
|
117
|
+
"arquivo da memória" saiu da memória ativa por ser velho, repetido ou trocado: confira antes de usar.
|
|
118
|
+
Sem o comando (app fechado), procure em `agents/companion/data/`. Pedido novo que não depende do
|
|
119
|
+
passado não precisa de busca.
|
|
109
120
|
- No fim de cada tarefa concluída, salve sem esperar pedido: onde paramos em
|
|
110
121
|
`agents/companion/data/contexto-dinamico.md` e as decisões tomadas em
|
|
111
122
|
`agents/companion/data/log-decisoes.md`. Avise em uma linha o que anotou. Projeto do cockpit:
|
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,30 @@
|
|
|
1
|
+
## 2.8.0 — 2026-10-22
|
|
2
|
+
|
|
3
|
+
### A memória do sistema procura sozinha, salva no fim do trabalho e se arruma todo dia (com o app Auroq OS)
|
|
4
|
+
|
|
5
|
+
- **Memória do sistema inteiro, não só do Companion.** Vale para todo agente, squad e skill que roda na sua pasta: o Companion, o Ops, os squads do Pack, a equipe que o Companion abre, no Claude e no Codex. O bilhete do começo da conversa e os trechos de cada pedido chegam em toda conversa do Claude Code na pasta (rótulo "[Memoria do sistema]"; o antigo "[Memoria do Companion]" continua aceito).
|
|
6
|
+
- **Salva no fim do trabalho.** Com o app aberto, além da rotina de ~30 min, a memória é consolidada logo que um trabalho termina. Sem o app (só no terminal), a regra `memoria-inteligente.md` manda a IA salvar ao concluir cada tarefa, como antes.
|
|
7
|
+
|
|
8
|
+
- **A cada pedido, a memória traz o que tem a ver.** O app Auroq OS mantém uma busca de toda a memória do seu negócio: o que o Companion anotou, o diário das conversas, o seu conhecimento (`docs/knowledge/`, `business/processos/`), as conversas antigas desta pasta e o que o Claude e o Codex anotaram sozinhos. No Claude Code, o gancho que já roda a cada mensagem (`.claude/hooks/auroq-sync.cjs`) traz até 3 trechos que têm a ver com o seu pedido, só quando passam no filtro de relevância; "oi" e "ok" não buscam. Sem o app aberto, nada muda e a conversa nunca espera.
|
|
9
|
+
- **Busca sob demanda.** A IA pode procurar sozinha com `auroq memoria busca "<assunto>"` (Claude, Codex e Grok). A regra `memoria-inteligente.md` e o `AGENTS.md` dizem quando buscar: quando a resposta depende do passado do negócio e o bilhete não responde.
|
|
10
|
+
- **Arrumação diária.** Uma vez por dia, com o app aberto e sem conversa no meio, a memória faz uma prova de lembrança, guarda no arquivo (`agents/companion/data/arquivo/`) o que ficou repetido, trocado ou vencido (no máximo 10% por dia, nunca apaga e desfaz se a prova piorar) e transforma as suas correções do dia em regras curtas no `custom-do-aluno.md`. A regra da memória explica o arquivo e a pasta `dreaming/`.
|
|
11
|
+
- **Diagnóstico leve.** `doctor --leve` é o diagnóstico que o app roda sozinho na arrumação: o mesmo de sempre sem chamar o Codex de verdade (não gasta o seu plano) e sem mexer na configuração global do Codex. Todo `doctor` agora termina com uma linha `AUROQ_RESULTADO doctor=<ok|pendencias> etiquetas=…` para o app ler.
|
|
12
|
+
- Tudo fica no seu computador e no seu GitHub; nada vai para a Arka. Mantém `arcane-mcp@0.7.0`. Instaladores do repositório preparados para 2.8.0.
|
|
13
|
+
|
|
14
|
+
### Também nesta versão
|
|
15
|
+
|
|
16
|
+
- Conteúdo ao vivo (catálogo `auroq-core` 2.3.26 e 2.3.27, no ar em 21/10): **Companion é Companion.** O aluno não dá mais nome ao Companion (decisão do Euriler: nome dado pelo aluno confunde depois). Saiu o passo do nome do `*primeiro-uso` e a FASE 10 do Bootstrap do Ops, e o guia do sistema não sugere mais pôr um nome no `custom-do-aluno.md` (2.3.27). Quem já tinha dado um nome continua com o atalho que tem (ex.: `/atlas-companion`), e `/auroq-companion` sempre vale.
|
|
17
|
+
- O fim da primeira conversa no app passa a ficar em `.auroq/primeiro-uso.json` (antes o sinal era o atalho com o nome).
|
|
18
|
+
|
|
19
|
+
## 2.7.1 — 2026-10-21
|
|
20
|
+
|
|
21
|
+
### A memória do Companion se atualiza sozinha (com o app Auroq OS)
|
|
22
|
+
|
|
23
|
+
- **Bilhete da memória no começo de toda conversa.** O app Auroq OS passa a refazer sozinho, depois das suas conversas, um bilhete curto (`agents/companion/data/nucleo.md`, até 3.000 caracteres) com quem você é, o seu negócio, onde vocês pararam, as últimas decisões, as pendências abertas e as suas regras. No Claude Code, o gancho que já roda ao abrir a conversa (`.claude/hooks/auroq-sync.cjs`) entrega esse bilhete à IA antes da primeira mensagem; no Codex e no Grok, o `AGENTS.md` manda ler o arquivo. Sem o arquivo (pasta sem o app ou antes da primeira conversa), nada muda.
|
|
24
|
+
- **Diário por conversa.** O app escreve em `agents/companion/data/diario/AAAA-MM.md` um resumo de 3 a 8 tópicos de cada conversa (só acrescenta). A regra `memoria-inteligente.md` e o `AGENTS.md` explicam os dois arquivos novos e pedem para não editá-los à mão.
|
|
25
|
+
- A IA da conversa continua salvando no fim de cada tarefa, como na 2.7.0: o app é a rede de segurança, não a troca. Tudo fica na pasta do negócio e no GitHub do aluno; nada vai para a Arka.
|
|
26
|
+
- Mantém `arcane-mcp@0.7.0`. Instaladores do repositório preparados para 2.7.1.
|
|
27
|
+
|
|
1
28
|
## 2.7.0 — 2026-10-21
|
|
2
29
|
|
|
3
30
|
### Regras de trabalho novas para a IA da sua pasta
|
package/README.md
CHANGED
|
@@ -254,13 +254,13 @@ agents/ → Seu exercito (companion, workers, minds, squads)
|
|
|
254
254
|
|
|
255
255
|
## Observabilidade e integridade do motor
|
|
256
256
|
|
|
257
|
-
Apos publicacao, `npx -y auroq-os@2.
|
|
258
|
-
manutencao/diagnostico. `npx -y auroq-os@2.
|
|
257
|
+
Apos publicacao, `npx -y auroq-os@2.8.0 doctor` mostra a fila local segura e os comandos pinados de
|
|
258
|
+
manutencao/diagnostico. `npx -y auroq-os@2.8.0 manutencao` preserva o caminho existente
|
|
259
259
|
de consentimento legado, studentFiles, customizacoes e dados do negocio. Nao ha
|
|
260
260
|
migracao forcada. O registro MCP aponta para `arcane-mcp@0.7.0` — o pin mora no campo
|
|
261
261
|
`arcaneMcpPin` do package.json (fonte unica; o servidor le o mesmo campo no npm).
|
|
262
262
|
`npm run release:verify` recusa publicar com um pin que o npm nao resolva.
|
|
263
|
-
Os instaladores do repositorio ficam preparados para 2.
|
|
263
|
+
Os instaladores do repositorio ficam preparados para 2.8.0; as copias publicas so recebem
|
|
264
264
|
a versao apos os gates nativos e a verificacao do tarball publicado.
|
|
265
265
|
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.
|
|
266
266
|
|
package/bin/auroq-os.js
CHANGED
|
@@ -427,7 +427,8 @@ const HEALTH_CHECKS = [
|
|
|
427
427
|
];
|
|
428
428
|
|
|
429
429
|
/**
|
|
430
|
-
*
|
|
430
|
+
* Ate 21/10/2026 o aluno dava um nome ao Companion no bootstrap (FASE 10 do Ops, que saiu:
|
|
431
|
+
* "Companion e Companion"), e quem deu continua com ele: `/atlas-companion`. Um
|
|
431
432
|
* comando com esse nome que ainda aponta pro Companion (recurso `companion` do MCP ou a
|
|
432
433
|
* pasta agents/companion/) vale como a casca dele — um clone do negocio que so tem o
|
|
433
434
|
* comando com o nome do aluno nao pode ser acusado de "arquivo faltando". So o Companion
|
|
@@ -575,9 +576,13 @@ async function runHealthChecks(targetDir) {
|
|
|
575
576
|
* a falha do MCP e silenciosa (conteudo simplesmente nao aparece), entao alguem
|
|
576
577
|
* precisa perguntar em voz alta se o caminho inteiro esta de pe.
|
|
577
578
|
*/
|
|
578
|
-
async function runDoctor(targetDir) {
|
|
579
|
+
async function runDoctor(targetDir, { leve = false } = {}) {
|
|
580
|
+
// `--leve` (2.8.0, arrumacao diaria do app Auroq OS): o diagnostico que roda sozinho uma vez por
|
|
581
|
+
// dia. Pula o arranque medido do conteudo ao vivo e todo o relatorio do Codex (que chama o Codex DE
|
|
582
|
+
// VERDADE, gastando o plano do aluno, e limpa o config global em ~/.codex, fora da pasta do
|
|
583
|
+
// negocio) e nao escreve o recibo em ~/.auroq/install.log. O resto e o mesmo doctor.
|
|
579
584
|
showBanner();
|
|
580
|
-
log(`${BOLD}Diagnostico do Auroq${RESET}`);
|
|
585
|
+
log(`${BOLD}Diagnostico do Auroq${leve ? ' (leve)' : ''}${RESET}`);
|
|
581
586
|
log('');
|
|
582
587
|
|
|
583
588
|
const problemas = [];
|
|
@@ -723,7 +728,7 @@ async function runDoctor(targetDir) {
|
|
|
723
728
|
// 6. o conteudo ao vivo SOBE a tempo? (EMB-027: registro certo, servidor no ar, e mesmo
|
|
724
729
|
// assim o Codex/Claude Code desistiam antes do pacote terminar de baixar)
|
|
725
730
|
const semArranque = process.env.NODE_ENV === 'test' && process.env.AUROQ_SKIP_AUTH === '1';
|
|
726
|
-
if (pin && !semArranque) {
|
|
731
|
+
if (pin && !semArranque && !leve) {
|
|
727
732
|
log(` ${DIM}Abrindo o conteudo ao vivo pra medir (na primeira vez pode levar 1-2 min)...${RESET}`);
|
|
728
733
|
aquecerArcaneMcp();
|
|
729
734
|
const ms = await medirArranqueArcaneMcp(pin);
|
|
@@ -739,7 +744,7 @@ async function runDoctor(targetDir) {
|
|
|
739
744
|
}
|
|
740
745
|
|
|
741
746
|
// 7. Codex — relatorio completo numa tela so (EMB-028). Nada de pedir comando por comando.
|
|
742
|
-
if (pin && !semArranque && temToml) {
|
|
747
|
+
if (pin && !semArranque && temToml && !leve) {
|
|
743
748
|
log('');
|
|
744
749
|
log(` ${CYAN}Codex — relatorio pro suporte${RESET}`);
|
|
745
750
|
const vCodex = versaoDoCodex();
|
|
@@ -818,7 +823,10 @@ async function runDoctor(targetDir) {
|
|
|
818
823
|
// Recibo duravel pro suporte, inclusive quando fechou limpo: sem o historico completo o plantao
|
|
819
824
|
// nao sabe se a pendencia de ontem foi resolvida. Conveniencia — nunca pode derrubar o doctor,
|
|
820
825
|
// por isso montar o texto tambem fica DENTRO do try.
|
|
826
|
+
// A ultima linha e para o app ler (vocabulario fechado das etiquetas, nunca o texto da pendencia).
|
|
827
|
+
const resultado = pendencias => console.log(`AUROQ_RESULTADO doctor=${pendencias.length ? 'pendencias' : 'ok'} etiquetas=${[...new Set(pendencias.map(p => rotulo(p)))].join(',')}`);
|
|
821
828
|
const recibo = pendencias => {
|
|
829
|
+
if (leve) return;
|
|
822
830
|
try {
|
|
823
831
|
registrarInstallLog('doctor', pendencias.length ? `pendencias=${pendencias.length} ${pendencias.map(p => rotulo(p)).join(',')}` : 'ok');
|
|
824
832
|
} catch { /* recibo e conveniencia pro suporte */ }
|
|
@@ -826,6 +834,7 @@ async function runDoctor(targetDir) {
|
|
|
826
834
|
if (problemas.length === 0) {
|
|
827
835
|
success('Tudo certo. Pode chamar o Companion.');
|
|
828
836
|
recibo(problemas);
|
|
837
|
+
resultado(problemas);
|
|
829
838
|
return 0;
|
|
830
839
|
}
|
|
831
840
|
error(`${problemas.length} coisa(s) pra resolver:`);
|
|
@@ -833,6 +842,7 @@ async function runDoctor(targetDir) {
|
|
|
833
842
|
recibo(problemas);
|
|
834
843
|
log('');
|
|
835
844
|
log(`${DIM}Se travar, chame o suporte: 11 93621-4486${RESET}`);
|
|
845
|
+
resultado(problemas);
|
|
836
846
|
return 1;
|
|
837
847
|
}
|
|
838
848
|
|
|
@@ -2476,7 +2486,7 @@ if (['init', 'install', 'update'].includes(command)) {
|
|
|
2476
2486
|
});
|
|
2477
2487
|
} else if (command === 'doctor' || command === 'diagnostico') {
|
|
2478
2488
|
// `auth.sair`: o doctor termina logo depois de falar com o servidor (Node 24 no Windows).
|
|
2479
|
-
runDoctor(process.cwd()).then(code => auth.sair(code)).catch(e => {
|
|
2489
|
+
runDoctor(process.cwd(), { leve: process.argv.includes('--leve') }).then(code => auth.sair(code)).catch(e => {
|
|
2480
2490
|
error(`Falha no diagnostico: ${e.message}`);
|
|
2481
2491
|
auth.sair(1);
|
|
2482
2492
|
});
|
package/installer/install.ps1
CHANGED
|
@@ -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.
|
|
592
|
+
& (Get-AuroqNpx) -y auroq-os@2.8.0 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.
|
|
680
|
+
& (Get-AuroqNpx) -y auroq-os@2.8.0 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.'
|
package/installer/install.sh
CHANGED
|
@@ -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.
|
|
222
|
+
npx -y auroq-os@2.8.0 "$@"
|
|
223
223
|
else
|
|
224
|
-
npx -y auroq-os@2.
|
|
224
|
+
npx -y auroq-os@2.8.0 "$@" < /dev/tty
|
|
225
225
|
fi
|
|
226
226
|
}
|
|
227
227
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"schema": 1,
|
|
3
3
|
"algorithm": "sha256",
|
|
4
4
|
"scope": "packaged-runtime-and-cascas",
|
|
5
|
-
"version": "2.
|
|
5
|
+
"version": "2.8.0",
|
|
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": "
|
|
13
|
+
"sha256": "c8b710fb1bfbb19e8710e7294b20b10188a559e09fe0f8c84538601829241375"
|
|
14
14
|
},
|
|
15
15
|
{
|
|
16
16
|
"path": ".auroq-core/core/synapse/context/context-builder.js",
|
|
@@ -190,7 +190,7 @@
|
|
|
190
190
|
},
|
|
191
191
|
{
|
|
192
192
|
"path": ".claude/hooks/auroq-sync.cjs",
|
|
193
|
-
"sha256": "
|
|
193
|
+
"sha256": "f916fbac4b1236dded1f5253807a5147674081e416ebe215bebd6d6f97b1469b"
|
|
194
194
|
},
|
|
195
195
|
{
|
|
196
196
|
"path": ".claude/hooks/precompact-session-digest.cjs",
|
|
@@ -210,7 +210,7 @@
|
|
|
210
210
|
},
|
|
211
211
|
{
|
|
212
212
|
"path": "bin/auroq-os.js",
|
|
213
|
-
"sha256": "
|
|
213
|
+
"sha256": "2f3da035fe9113a0018a1088c9477428ee725da3b4577740a22bb935a550ce5b"
|
|
214
214
|
},
|
|
215
215
|
{
|
|
216
216
|
"path": "lib/ahi/client.mjs",
|
|
@@ -278,7 +278,7 @@
|
|
|
278
278
|
},
|
|
279
279
|
{
|
|
280
280
|
"path": "package.json",
|
|
281
|
-
"sha256": "
|
|
281
|
+
"sha256": "2ee758cce54e8fd912d3191a345dd52c1580fe73369b05074b4d25e2c31e498f"
|
|
282
282
|
},
|
|
283
283
|
{
|
|
284
284
|
"path": "scripts/build-pack.mjs",
|
|
@@ -302,7 +302,7 @@
|
|
|
302
302
|
},
|
|
303
303
|
{
|
|
304
304
|
"path": "scripts/sync-codex-skills.mjs",
|
|
305
|
-
"sha256": "
|
|
305
|
+
"sha256": "830d88b2711e5c0b4ff64d5d03ed677a64ffb1662e290e6196fac721244640bc"
|
|
306
306
|
},
|
|
307
307
|
{
|
|
308
308
|
"path": "scripts/validate-hybrid.mjs",
|
package/package.json
CHANGED
|
@@ -84,7 +84,8 @@ function registerSkill(name, commandFile) {
|
|
|
84
84
|
skills.set(name, commandFile);
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
-
//
|
|
87
|
+
// Ate 21/10/2026 o aluno dava um nome ao Companion no bootstrap (FASE 10 do Ops: /atlas-companion),
|
|
88
|
+
// e quem deu continua com ele.
|
|
88
89
|
// Se o comando base sumiu, $companion continua existindo, apontando pro comando dele.
|
|
89
90
|
function comandoDoCompanion(file) {
|
|
90
91
|
try {
|