auroq-os 2.6.10 → 2.7.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.
Files changed (40) hide show
  1. package/.auroq-core/como-funciona.md +162 -0
  2. package/.auroq-core/core/synapse/output/formatter.js +22 -2
  3. package/.auroq-core/core-config.yaml +1 -1
  4. package/.claude/CLAUDE.md +12 -4
  5. package/.claude/commands/auroq-companion.md +1 -1
  6. package/.claude/hooks/precompact-session-digest.cjs +165 -29
  7. package/.claude/output-styles/direto.md +8 -3
  8. package/.claude/rules/agent-authority.md +5 -5
  9. package/.claude/rules/dna-operacional.md +1 -1
  10. package/.claude/rules/memoria-inteligente.md +29 -7
  11. package/.claude/rules/natural-language-first.md +3 -3
  12. package/.claude/rules/operacao-autonoma.md +20 -23
  13. package/.claude/rules/puxar-e-entregar.md +7 -7
  14. package/.claude/rules/titulo-da-barra.md +1 -1
  15. package/.claude/settings.local.json +11 -1
  16. package/.synapse/agent-companion +2 -1
  17. package/.synapse/agent-ops +4 -4
  18. package/.synapse/agent-organizer +2 -2
  19. package/.synapse/context +3 -3
  20. package/.synapse/global +1 -0
  21. package/.synapse/squad-clone-forge +1 -1
  22. package/.synapse/squad-etlmaker +2 -2
  23. package/.synapse/squad-squad-forge +1 -1
  24. package/AGENTS.md +138 -12
  25. package/CHANGELOG.md +19 -0
  26. package/README.md +5 -5
  27. package/agents/organizer/agents/organizer.md +8 -8
  28. package/agents/organizer/tasks/start.md +1 -1
  29. package/bin/auroq-os.js +60 -13
  30. package/installer/install.ps1 +2 -2
  31. package/installer/install.sh +2 -2
  32. package/lib/legacy-shims.json +17 -0
  33. package/lib/runtime-integrity.json +11 -11
  34. package/lib/synapse-hashes.json +2 -1
  35. package/package.json +5 -4
  36. package/scripts/runtime-integrity.mjs +1 -1
  37. package/seeds/agents/companion/data/contexto-dinamico.md +1 -1
  38. package/seeds/agents/companion/data/padroes-observados.md +1 -1
  39. package/seeds/business/cockpit.md +2 -2
  40. package/seeds/business/templates/tracker-template.md +1 -1
@@ -0,0 +1,162 @@
1
+ # Como o Auroq OS funciona por dentro
2
+
3
+ > Arquivo de consulta. Não carrega em toda conversa: leia quando o aluno perguntar "como funciona",
4
+ > quando for explicar o sistema ou quando a tarefa precisar desse mapa. As regras de trabalho estão
5
+ > no `AGENTS.md` da raiz da pasta e em `.claude/rules/`; em conflito, elas valem sobre este texto.
6
+ > Este arquivo é do sistema: a atualização troca.
7
+
8
+ ## A ideia
9
+
10
+ O Auroq OS transforma o Claude Code (ou o Codex) num centro de comando do negócio do aluno.
11
+
12
+ - **Pensar com IA:** decisões, planos e estratégia, com a IA como parceira.
13
+ - **Fazer com IA:** o aluno pede, a equipe de IA executa, o aluno confere e aprova.
14
+ - **Lembrar com IA:** o que foi decidido e aprendido fica salvo na pasta e cresce com o uso.
15
+
16
+ Fórmula: repertório + IA = resultado. O aluno domina o **o quê** (o que fazer e se ficou bom);
17
+ a IA domina o **como**.
18
+
19
+ ## Quem é quem na equipe
20
+
21
+ | Tipo | O que é | Exemplo |
22
+ |------|---------|---------|
23
+ | **Companion** | Chefe da equipe e parceiro do aluno. Situa, lembra, pensa junto e chama quem faz | `/auroq-companion` |
24
+ | **Mentes** | Pensam e julgam: consultam, mentoram, avaliam | Clone, mente sintética, consultor |
25
+ | **Workers** | Executam uma função (um cargo) | um worker de atendimento |
26
+ | **Squads** | Vários agentes com etapas e conferência de qualidade | Squad de conteúdo, de anúncios |
27
+ | **Ops** | O técnico: instala, atualiza, conserta, conecta | `/AuroqOS:agents:ops` |
28
+ | **Forjas** | Criam agentes novos para o negócio do aluno | Squad Forge, Mind Forge, Worker Forge, Clone Forge, ETLmaker |
29
+
30
+ Subtipos de mente: **Clone** (replica uma pessoa real), **Mente sintética** (junta vários
31
+ especialistas num agente só) e **Consultor** (empacota o conhecimento de um assunto).
32
+
33
+ Cada agente pode servir de **mentor** ("o que eu faço?"), **juiz** ("tá bom?") ou **executor** ("faz").
34
+ Num squad os papéis ficam separados: quem coordena não executa, quem executa não aprova o próprio
35
+ trabalho, quem julga não cria.
36
+
37
+ **Como isso aparece para o aluno:** ele só fala com o Companion. O Companion escolhe e aciona o
38
+ squad, a skill ou o agente certo sozinho, confere e entrega. O aluno não precisa saber o nome de ninguém.
39
+
40
+ ## Onde mora cada coisa
41
+
42
+ ```
43
+ pasta-do-negocio/
44
+ ├── AGENTS.md # regras de base (Claude, Codex, Grok) — do sistema
45
+ ├── .claude/
46
+ │ ├── CLAUDE.md # porta de entrada do Claude Code (importa o AGENTS.md)
47
+ │ ├── rules/ # regras do sistema + custom-do-aluno.md (do aluno)
48
+ │ ├── commands/ # atalhos dos agentes (/auroq-companion, /AuroqOS:agents:ops...)
49
+ │ ├── output-styles/ # estilo de resposta Direto
50
+ │ └── hooks/ # automações (Synapse, sincronização, histórico)
51
+ ├── .auroq-core/ # núcleo do sistema (constitution, configuração) — não mexer
52
+ ├── .synapse/ # lembretes curtos que o sistema injeta em cada conversa
53
+ ├── agents/companion/data/ # memória: onde paramos, decisões, padrões, pendências
54
+ ├── business/ # o negócio: cockpit, campanhas, processos, vault (fora do git)
55
+ └── docs/knowledge/ # conhecimento do aluno
56
+ ├── expert-mind/ # quem o aluno é: propósito, identidade, valores, tom de voz, história
57
+ └── expert-business/ # o que ele faz: posicionamento, público, método, produtos
58
+ ```
59
+
60
+ Os nomes `expert-mind/` e `expert-business/` ficaram assim por compatibilidade; o conteúdo é do aluno.
61
+ A equipe da Arcane (Companion interno, Consultor, forjas, Pack) não fica no disco: chega ao vivo pelo
62
+ MCP `arcane`.
63
+
64
+ ## Constitution (resumo)
65
+
66
+ Texto completo em `.auroq-core/constitution.md`.
67
+
68
+ | Artigo | Princípio |
69
+ |--------|-----------|
70
+ | I | O terminal é o centro de comando: o negócio passa pela pasta, ferramentas externas são braços |
71
+ | II | Cada um faz o seu: o técnico (push forçado, MCP, infraestrutura, atualização) é do Ops |
72
+ | III | Documentar é investir: o que não está escrito se perde |
73
+ | IV | Não inventar: fato, número e prova precisam de fonte |
74
+ | V | Qualidade com julgamento: o aluno aprova as entregas importantes |
75
+ | VI | Evolução incremental: reusar antes de adaptar, adaptar antes de criar |
76
+
77
+ ## Jeito de trabalhar de todo agente
78
+
79
+ - **Plano antes de execução** em trabalho grande: o plano é a coleira.
80
+ - **Documento de trabalho atualizado** a cada etapa: sobrevive à compactação da conversa e serve
81
+ de passagem de bastão para qualquer agente.
82
+ - **Sem viagem:** faz o pedido, não inventa melhoria; mudança de rumo só com o aluno.
83
+ - **Sem bagunça:** tarefas com entrada e saída claras, documentos valem mais que conversa,
84
+ conferência antes de aceitar a entrega.
85
+
86
+ Premissas: faça primeiro e documente depois; ninguém cuida do negócio como o dono; resolva a dor de
87
+ agora; a certeza vem do uso; nada volta para o zero.
88
+
89
+ ## Ciclos
90
+
91
+ **Dia a dia:** situar ("onde estou?") → priorizar ("o que dói mais?") → executar → documentar →
92
+ refinar (melhorar agentes e processos). Cada volta deixa o sistema mais forte.
93
+
94
+ **Conversa:** o Companion carrega onde paramos, mostra o que importa, o aluno escolhe o foco, a
95
+ equipe trabalha, no fim de cada tarefa a memória é salva e, quando o aluno pede, o trabalho é salvo
96
+ e entregue no GitHub.
97
+
98
+ **Semana:** sem revisão há 7 dias ou mais, o Companion propõe uma revisão de 20 minutos (cockpit,
99
+ trackers, pendências, padrões).
100
+
101
+ **Projeto:** nasce no cockpit com tracker e fases → os agentes trabalham e atualizam o tracker →
102
+ termina com uma retrospectiva de 3 perguntas e vai para o arquivo, abrindo vaga para o próximo.
103
+
104
+ ## Níveis de uso de IA
105
+
106
+ | Nível | Como é |
107
+ |-------|--------|
108
+ | N0 | Sem IA, na força bruta |
109
+ | N1 | IA crua: cada conversa começa do zero |
110
+ | N2 | IA com repertório: skills, mentes e contexto que fica |
111
+ | N3 | Sistema operacional de IA: equipe coordenada, memória e Companion |
112
+
113
+ O Auroq OS leva o aluno ao N3.
114
+
115
+ ## Conhecimento, skills e agentes
116
+
117
+ - **Base de conhecimento:** conhecimento bruto tratado (extraído, limpo, organizado). É o ingrediente.
118
+ - **Skill:** IA + base de conhecimento + persona + regras. É o prato.
119
+ - Caminho: conhecimento bruto → tratamento (o ETLmaker faz) → base pronta → skill → agente.
120
+ Conhecimento primeiro, execução depois.
121
+
122
+ Três camadas de contexto que a equipe usa:
123
+
124
+ | Pergunta | De onde vem |
125
+ |----------|-------------|
126
+ | Para quem trabalho? | `docs/knowledge/expert-mind/` |
127
+ | O que sei fazer? | `docs/knowledge/expert-business/` e o conhecimento que o aluno tratou |
128
+ | O que está rolando agora? | `business/campanhas/` e o cockpit |
129
+
130
+ Tipos de skill: de **identidade** (do aluno, únicas), **técnicas** (copy, tráfego, lançamento) e de
131
+ **projeto** (de uma campanha, temporárias).
132
+
133
+ ## Memória
134
+
135
+ | Camada | Onde | Dura |
136
+ |--------|------|------|
137
+ | Conversa | o chat | até a compactação |
138
+ | Operacional | `agents/companion/data/` | entre conversas |
139
+ | Permanente | `docs/knowledge/` e `business/` | para sempre |
140
+
141
+ Quando salvar: decisão tomada, projeto avançou, conhecimento criado, padrão percebido, tarefa
142
+ concluída e conversa encerrando. Regra completa: `.claude/rules/memoria-inteligente.md`.
143
+
144
+ ## Projetos
145
+
146
+ - Ideias soltas viram pendência; o que vai ser feito entra no **cockpit** (`business/cockpit.md`),
147
+ com no máximo 3 projetos ativos, cada um com a próxima ação definida.
148
+ - Receitas que se repetem viram **processos** em `business/processos/`.
149
+ - Cada projeto tem um **tracker** (`business/campanhas/{projeto}/tracker.md`): todo agente lê antes de
150
+ trabalhar e atualiza depois (`.claude/rules/project-tracker.md`).
151
+
152
+ ## Salvar é o botão do negócio
153
+
154
+ Commit aqui não é coisa de programador: é o ponto de restauração do negócio. A mensagem conta o que
155
+ aconteceu (`progresso:`, `decisao:`, `processo:`, `agente:`, `conhecimento:`, `campanha:`, `fix:`,
156
+ `setup:`), não o que mudou nos arquivos. Entregar (push) manda a cópia para o GitHub privado do aluno.
157
+ Ritual em `.claude/rules/puxar-e-entregar.md`.
158
+
159
+ ## Volante
160
+
161
+ Conhecimento cresce → agentes melhoram → o negócio do aluno anda → o aluno aprende mais → o
162
+ conhecimento cresce de novo. Cada uso acelera o próximo.
@@ -23,6 +23,18 @@ const { estimateTokens } = require('../utils/tokens');
23
23
  * Truncation removes from the END of this array first (SUMMARY, then
24
24
  * KEYWORD, then SQUAD, etc.) to preserve highest-priority sections.
25
25
  */
26
+ /**
27
+ * Regras que mais escapam em conversa longa (2.7.0). O resto já está no AGENTS.md e nas rules;
28
+ * aqui fica só o que costuma sumir depois de muitas mensagens.
29
+ */
30
+ const LEMBRETE_CONVERSA_LONGA = [
31
+ '[LEMBRETE: CONVERSA LONGA]',
32
+ ' 1. Resposta que fez trabalho fecha com **Resumo:** e **Onde parou:**.',
33
+ ' 2. Travas do AGENTS.md (dinheiro, mensagem ou post para outra pessoa, apagar, force push, senha): só com ordem do aluno para aquela ação.',
34
+ ' 3. Tarefa concluída: salve onde parou e as decisões na memória (rule memoria-inteligente) antes de seguir.',
35
+ ' 4. Companion aciona sozinho squads, skills e agentes, revisa e entrega; não manda o aluno chamar ninguém.',
36
+ ].join('\n');
37
+
26
38
  const SECTION_ORDER = [
27
39
  'CONTEXT_BRACKET',
28
40
  'CONSTITUTION',
@@ -400,7 +412,7 @@ function enforceTokenBudget(sections, sectionIds, tokenBudget) {
400
412
  }
401
413
 
402
414
  // Sections that should never be removed
403
- const PROTECTED = new Set(['CONTEXT_BRACKET', 'CONSTITUTION', 'AGENT']);
415
+ const PROTECTED = new Set(['CONTEXT_BRACKET', 'CONSTITUTION', 'AGENT', 'CONVERSA_LONGA']);
404
416
 
405
417
  // Truncation priority: remove from end first
406
418
  const TRUNCATION_ORDER = [
@@ -531,9 +543,16 @@ function formatSynapseRules(results, bracket, contextPercent, session, devmode,
531
543
  }
532
544
  }
533
545
 
546
+ // Conversa longa (2.7.0): do MODERATE em diante, as regras que mais escapam quando a conversa
547
+ // enche voltam a cada mensagem. Acréscimo: nada do que já era injetado sai.
548
+ if (bracket && bracket !== 'FRESH') {
549
+ sections.push(LEMBRETE_CONVERSA_LONGA);
550
+ sectionIds.push('CONVERSA_LONGA');
551
+ }
552
+
534
553
  // Handoff warning (CRITICAL bracket)
535
554
  if (showHandoffWarning) {
536
- sections.push('[HANDOFF WARNING]\n Context is nearly exhausted. Consider starting a new session to preserve quality.');
555
+ sections.push('[HANDOFF WARNING]\n A conversa está quase cheia. Termine o passo atual, salve a memória e sugira ao aluno abrir uma conversa nova (ou /compact).');
537
556
  sectionIds.push('HANDOFF_WARNING');
538
557
  }
539
558
 
@@ -563,4 +582,5 @@ module.exports = {
563
582
  estimateTokens,
564
583
  SECTION_ORDER,
565
584
  LAYER_TO_SECTION,
585
+ LEMBRETE_CONVERSA_LONGA,
566
586
  };
@@ -1,7 +1,7 @@
1
1
  project:
2
2
  name: "Auroq OS"
3
3
  type: greenfield
4
- version: 2.6.10
4
+ version: 2.7.0
5
5
  installedAt: '2026-03-16'
6
6
 
7
7
  ide:
package/.claude/CLAUDE.md CHANGED
@@ -1,9 +1,17 @@
1
1
  # Auroq OS
2
2
 
3
- Sistema operacional de IA para o negócio. Você manda e julga; a IA executa.
3
+ Sistema operacional de IA para o negócio do aluno. Ele pede, confere e aprova; a IA executa.
4
4
 
5
- Ative um agente pelo comando (`/companion`, `$companion`, `@companion`). Todo conteúdo Arcane (Companion interno, Consultor, forjas, Pack) vem pelo MCP `arcane` — nunca procurar em `agents/`.
5
+ As regras de base de toda conversa estão no `AGENTS.md` da raiz da pasta, o mesmo arquivo que o Codex
6
+ e o Grok leem. Ele entra aqui pela linha abaixo:
6
7
 
7
- Sua memória e seus documentos ficam na sua máquina e no seu GitHub privado (senhas e `business/vault/` ficam fora). O histórico das sessões com os squads está previsto nos Termos de Uso: vem ligado para quem aceita os termos na plataforma (quem já tinha dito "não" continua sem gravar) e você desliga quando quiser em Minha Conta, "Guardar minhas conversas". Se a pasta do seu negócio tem dados de clientes, desligue. Além disso, a Arka registra qual conteúdo licenciado foi entregue, quando e pra qual conta — igual a uma nota de entrega.
8
+ @../AGENTS.md
8
9
 
9
- Rules em `.claude/rules/`. Constitution em `.auroq-core/constitution.md`.
10
+ ## Só no Claude Code
11
+
12
+ - As regras de `.claude/rules/` carregam sozinhas. `.claude/rules/custom-do-aluno.md` vale acima de todas.
13
+ - O estilo de resposta é o Direto (`.claude/output-styles/direto.md`).
14
+ - Agentes pelo comando: `/auroq-companion` (ou o nome que o aluno deu ao Companion, como
15
+ `/atlas-companion`), `/AuroqOS:agents:ops`, `/auroq-consultor` e as forjas `/auroq-squad-forge`,
16
+ `/auroq-mind-forge`, `/auroq-worker-forge`, `/auroq-clone-forge`, `/auroq-etlmaker`. O aluno não
17
+ precisa usar nenhum: falar o que quer basta.
@@ -1,6 +1,6 @@
1
1
  # companion
2
2
 
3
- Parceiro cognitivo pessoal. Situa, lembra, pensa junto, roteia.
3
+ Parceiro cognitivo pessoal. Situa, lembra, pensa junto e aciona a equipe sozinho.
4
4
 
5
5
  Todo conteúdo deste agente vem pelo MCP `arcane` (catálogo `auroq-core`). Chame a tool `squad_ativar` com recurso_id `companion`. Enquanto o servidor responder, nunca procurar arquivo local deste agente.
6
6
 
@@ -1,46 +1,182 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * Claude Code Hook: PreCompact Session Digest
3
+ * Gancho da compactação do Claude Code (2.7.0).
4
4
  *
5
- * This hook is registered with Claude Code to trigger before context compact.
6
- * It delegates to the unified hook runner in auroq-core.
5
+ * Quando a conversa enche, o Claude Code resume e "compacta" o histórico. O resumo perde detalhe e a
6
+ * IA costuma esquecer o que estava fazendo e as regras de fechamento. Este gancho roda em dois momentos:
7
7
  *
8
- * Installation:
9
- * - Claude Code automatically discovers hooks in .claude/hooks/
10
- * - Hook naming: {event}-{name}.js (e.g., precompact-session-digest.js)
8
+ * - PreCompact: lê o fim da conversa (arquivo `transcript_path` que o Claude Code entrega) e grava em
9
+ * `.auroq/compactacao/ultima.md` os últimos pedidos do aluno, os arquivos mexidos e a última resposta.
10
+ * Fica só no computador do aluno (`.auroq/` não vai para o GitHub) e passa pelo mesmo filtro de
11
+ * senhas e chaves do registro de conversas.
12
+ * - SessionStart com origem "compact" (logo depois do resumo): devolve à IA um lembrete curto com esse
13
+ * retrato e as regras que mais escapam em conversa longa.
11
14
  *
12
- * @see .auroq-core/hooks/unified/runners/precompact-runner.js
13
- * @see Story MIS-3 - Session Digest (PreCompact Hook)
15
+ * Nunca bloqueia a compactação nem a conversa: qualquer falha sai em silêncio com código 0.
16
+ * Até a 2.6.10 este arquivo carregava um executor de `.auroq-core/hooks/unified/` que não
17
+ * existe no pacote, e só exportava uma função que ninguém chamava: não salvava nada.
14
18
  */
15
19
 
16
20
  'use strict';
17
21
 
18
- const path = require('path');
22
+ const fs = require('node:fs');
23
+ const path = require('node:path');
19
24
 
20
- // Resolve path to the unified hook runner
21
- const PROJECT_ROOT = path.resolve(__dirname, '..', '..');
22
- const runnerPath = path.join(
23
- PROJECT_ROOT,
24
- '.auroq-core',
25
- 'hooks',
26
- 'unified',
27
- 'runners',
28
- 'precompact-runner.js',
29
- );
25
+ const RAIZ = path.resolve(__dirname, '..', '..');
26
+ const PASTA = path.join(RAIZ, '.auroq', 'compactacao');
27
+ const ARQUIVO = path.join(PASTA, 'ultima.md');
28
+ const LER_DO_FIM = 4 * 1024 * 1024; // conversa grande: só o fim interessa
29
+ const VALE_POR_MS = 2 * 60 * 60 * 1000; // retrato com mais de 2 h não volta para a conversa
30
+ const MAX_PEDIDOS = 6;
31
+ const MAX_ARQUIVOS = 15;
30
32
 
31
- // Load and execute the hook runner
33
+ let limpar = s => String(s);
32
34
  try {
33
- const { onPreCompact } = require(runnerPath);
35
+ const { scrub } = require('./ahi/security.cjs');
36
+ limpar = s => String(scrub(String(s)).value);
37
+ } catch { /* sem o filtro do registro de conversas: o texto passa pelo corte abaixo */ }
34
38
 
35
- // Export the hook handler for Claude Code
36
- module.exports = async (context) => {
37
- return await onPreCompact(context);
39
+ function cortar(texto, max) {
40
+ const t = String(texto || '').replace(/\s+/g, ' ').trim();
41
+ return t.length > max ? `${t.slice(0, max - 1)}…` : t;
42
+ }
43
+
44
+ function lerEntrada() {
45
+ try {
46
+ const bruto = fs.readFileSync(0, 'utf8');
47
+ const dados = JSON.parse(bruto.replace(/^/, ''));
48
+ return dados && typeof dados === 'object' ? dados : {};
49
+ } catch { return {}; }
50
+ }
51
+
52
+ function fimDoArquivo(arquivo) {
53
+ const fd = fs.openSync(arquivo, 'r');
54
+ try {
55
+ const { size } = fs.fstatSync(fd);
56
+ const inicio = Math.max(0, size - LER_DO_FIM);
57
+ const buf = Buffer.alloc(size - inicio);
58
+ fs.readSync(fd, buf, 0, buf.length, inicio);
59
+ const linhas = buf.toString('utf8').split('\n');
60
+ if (inicio > 0) linhas.shift(); // primeira linha pode ter vindo cortada
61
+ return linhas;
62
+ } finally { fs.closeSync(fd); }
63
+ }
64
+
65
+ const textoDe = conteudo => (typeof conteudo === 'string'
66
+ ? conteudo
67
+ : (Array.isArray(conteudo) ? conteudo.filter(p => p && p.type === 'text').map(p => p.text || '').join('\n') : ''));
68
+
69
+ // /tmp e /private/tmp (Mac), atalhos e letras de unidade: compara o caminho de verdade dos dois lados.
70
+ // Arquivo que já não existe: resolve a pasta mais próxima que existe e junta o resto.
71
+ function real(p) {
72
+ let base = path.resolve(p);
73
+ const resto = [];
74
+ for (;;) {
75
+ try { return path.join(fs.realpathSync.native(base), ...resto); } catch { /* sobe uma pasta */ }
76
+ const acima = path.dirname(base);
77
+ if (acima === base) return path.resolve(p);
78
+ resto.unshift(path.basename(base));
79
+ base = acima;
80
+ }
81
+ }
82
+
83
+ function relativo(arquivo) {
84
+ const abs = real(path.resolve(RAIZ, String(arquivo)));
85
+ const rel = path.relative(real(RAIZ), abs);
86
+ return (rel && !rel.startsWith('..') && !path.isAbsolute(rel) ? rel : abs).split(path.sep).join('/');
87
+ }
88
+
89
+ function retrato(transcript) {
90
+ const pedidos = [];
91
+ const arquivos = [];
92
+ let ultimaResposta = '';
93
+ for (const linha of fimDoArquivo(transcript)) {
94
+ if (!linha.trim()) continue;
95
+ let ev;
96
+ try { ev = JSON.parse(linha); } catch { continue; }
97
+ const msg = ev && ev.message;
98
+ if (!msg || ev.isMeta || ev.isSidechain) continue;
99
+ if (ev.type === 'user' && msg.role === 'user') {
100
+ const texto = textoDe(msg.content).trim();
101
+ // Resultado de ferramenta, lembrete do sistema e comando com marcação não são pedido do aluno.
102
+ if (texto && !texto.startsWith('<')) pedidos.push(texto);
103
+ } else if (ev.type === 'assistant' && Array.isArray(msg.content)) {
104
+ for (const parte of msg.content) {
105
+ if (parte && parte.type === 'text' && String(parte.text || '').trim()) ultimaResposta = parte.text;
106
+ const alvo = parte && parte.type === 'tool_use' && parte.input && (parte.input.file_path || parte.input.notebook_path);
107
+ if (alvo && /^(Edit|MultiEdit|Write|NotebookEdit)$/.test(String(parte.name))) {
108
+ const rel = relativo(alvo);
109
+ const i = arquivos.indexOf(rel);
110
+ if (i >= 0) arquivos.splice(i, 1);
111
+ arquivos.push(rel);
112
+ }
113
+ }
114
+ }
115
+ }
116
+ return {
117
+ pedidos: pedidos.slice(-MAX_PEDIDOS).map(p => cortar(limpar(p), 400)),
118
+ arquivos: arquivos.slice(-MAX_ARQUIVOS).map(a => cortar(a, 200)), // caminho não passa no filtro: ele apaga nome longo
119
+ ultimaResposta: cortar(limpar(ultimaResposta), 700),
38
120
  };
39
- } catch (error) {
40
- console.error('[PreCompact Hook] Failed to load hook runner:', error.message);
121
+ }
122
+
123
+ function antesDeCompactar(entrada) {
124
+ const transcript = entrada.transcript_path;
125
+ if (!transcript || !fs.existsSync(transcript)) return;
126
+ const r = retrato(transcript);
127
+ const quando = new Date().toISOString();
128
+ const md = [
129
+ '# Antes da última compactação',
130
+ '',
131
+ `- Quando: ${quando}`,
132
+ `- Conversa: ${cortar(entrada.session_id || '?', 80)} (${entrada.trigger === 'manual' ? 'compactação pedida' : 'compactação automática'})`,
133
+ '',
134
+ '## Últimos pedidos do aluno (do mais antigo ao mais novo)',
135
+ '',
136
+ ...(r.pedidos.length ? r.pedidos.map(p => `- ${p}`) : ['- (nenhum pedido em texto no fim da conversa)']),
137
+ '',
138
+ '## Arquivos mexidos',
139
+ '',
140
+ ...(r.arquivos.length ? r.arquivos.map(a => `- \`${a}\``) : ['- (nenhum)']),
141
+ '',
142
+ '## Última resposta da IA',
143
+ '',
144
+ r.ultimaResposta || '(sem texto)',
145
+ '',
146
+ ].join('\n');
147
+ fs.mkdirSync(PASTA, { recursive: true });
148
+ const tmp = `${ARQUIVO}.${process.pid}.tmp`;
149
+ fs.writeFileSync(tmp, md, { mode: 0o600 });
150
+ fs.renameSync(tmp, ARQUIVO);
151
+ }
41
152
 
42
- // Graceful degradation - export no-op function
43
- module.exports = async () => {
44
- console.log('[PreCompact Hook] Hook runner not available, skipping');
153
+ function depoisDeCompactar() {
154
+ let st;
155
+ try { st = fs.statSync(ARQUIVO); } catch { return; }
156
+ if (Date.now() - st.mtimeMs > VALE_POR_MS) return;
157
+ const md = fs.readFileSync(ARQUIVO, 'utf8');
158
+ const secao = nome => {
159
+ const m = md.split(`## ${nome}`)[1];
160
+ return m ? m.split('\n## ')[0].trim() : '';
45
161
  };
162
+ const ultimoPedido = (secao('Últimos pedidos do aluno (do mais antigo ao mais novo)').split('\n').filter(l => l.startsWith('- ')).pop() || '').slice(2);
163
+ const arquivos = secao('Arquivos mexidos').split('\n').filter(l => l.startsWith('- `')).map(l => l.slice(2)).slice(-8);
164
+ const contexto = [
165
+ 'A conversa acabou de ser compactada. O retrato de antes do resumo está em `.auroq/compactacao/ultima.md` (leia se precisar do detalhe).',
166
+ ultimoPedido ? `Último pedido do aluno: ${ultimoPedido}` : '',
167
+ arquivos.length ? `Arquivos mexidos: ${arquivos.join(', ')}` : '',
168
+ 'Antes de seguir: se uma tarefa já terminou e a memória não foi salva (`agents/companion/data/contexto-dinamico.md` e `log-decisoes.md`), salve agora.',
169
+ 'Continua valendo: fechar a resposta que fez trabalho com **Resumo:** e **Onde parou:**; as travas do AGENTS.md (dinheiro, mensagem ou post para outra pessoa, apagar, force push, senha) só com ordem do aluno para aquela ação.',
170
+ ].filter(Boolean).join('\n');
171
+ process.stdout.write(JSON.stringify({ hookSpecificOutput: { hookEventName: 'SessionStart', additionalContext: contexto } }));
172
+ }
173
+
174
+ function principal() {
175
+ const entrada = lerEntrada();
176
+ const evento = String(entrada.hook_event_name || '');
177
+ if (evento === 'PreCompact') antesDeCompactar(entrada);
178
+ else if (evento === 'SessionStart' && entrada.source === 'compact') depoisDeCompactar();
46
179
  }
180
+
181
+ try { principal(); } catch { /* nunca atrapalha a conversa */ }
182
+ process.exitCode = 0;
@@ -8,12 +8,17 @@ keep-coding-instructions: true
8
8
 
9
9
  Comece pelo resultado. Pergunta simples recebe resposta simples; entrega ou
10
10
  analise costuma caber em um paragrafo de 3 a 5 frases com: o que aconteceu, o
11
- contexto minimo, o que muda para o expert e a decisao necessaria.
11
+ contexto minimo, o que muda para o aluno e a decisao necessaria.
12
12
 
13
- - Use **Na sua mao:** somente quando houver uma decisao ou acao real do expert.
13
+ - Use **Na sua mao:** somente quando houver uma decisao ou acao real do aluno.
14
14
  - Use **Risco:** somente para risco material que muda a decisao.
15
+ - Decisao so quando nenhuma ferramenta resolve, assim: **Decide: A ou B?** A → o que acontece. B → o que acontece.
15
16
  - Preserve ressalva importante, teste que falhou, erro corrigido e atalho tomado.
16
17
  - Explique primeiro o efeito em linguagem comum; detalhe tecnico so quando ajuda a decidir.
17
18
  - Sem preambulo, repeticao, validacao vazia, emoji ou tabela quando uma frase resolve.
18
- - Nao termine oferecendo aprofundamento. Se o expert pedir "aprofunda X", entregue apenas o detalhe daquele ponto.
19
+ - Nao termine oferecendo aprofundamento. Se o aluno pedir "aprofunda X", entregue apenas o detalhe daquele ponto.
19
20
  - O tamanho acompanha o pedido. Concisao corta enfeite, nunca fato que muda a decisao.
21
+ - Resposta que fez trabalho termina com duas linhas curtas, em linguagem simples: **Resumo:** do
22
+ que se trata a conversa e o que ja ficou feito; **Onde parou:** o que ja funciona, o que segue
23
+ rodando e o que espera pelo aluno (ou "fechado, nada pendente"). Pergunta simples respondida em
24
+ uma frase dispensa.
@@ -6,30 +6,30 @@
6
6
  environment bootstrap · `*update`. Nenhum outro agente executa isso — delegar pro Ops.
7
7
 
8
8
  **Salvar, entregar e puxar NAO sao exclusivos.** O Ops e o dono do ritual, mas qualquer
9
- agente ativo o executa quando o expert pede, sem troca de agente (`rules/puxar-e-entregar.md`).
9
+ agente ativo o executa quando o aluno pede, sem troca de agente (`rules/puxar-e-entregar.md`).
10
10
 
11
11
  ## Quem faz o que
12
12
 
13
13
  | Agente | Escopo proprio |
14
14
  |--------|----------------|
15
15
  | **Companion** | Situacao diaria, memoria (contexto, decisoes, padroes), projetos e trackers, weekly review, roteamento, criacao de projetos |
16
- | **Organizer** | Diagnostico de organizacao, mover/renomear pra organizar, limpeza de duplicados e temporarios, backup espelhado, nomenclatura (mudanca em disco sempre com aprovacao do expert) |
16
+ | **Organizer** | Diagnostico de organizacao, mover/renomear pra organizar, limpeza de duplicados e temporarios, backup espelhado, nomenclatura (mudanca em disco sempre com aprovacao do aluno) |
17
17
  | **Workers** | Executar tasks operacionais e atualizar documentos de trabalho |
18
18
  | **Squads** | Rodar pipeline completo com quality gates, produzir outputs, atualizar KBs e skills |
19
19
 
20
20
  Workers e squads nao criam agentes (isso e dos Meta Squads) nem tomam decisao
21
- estrategica (isso e do expert).
21
+ estrategica (isso e do aluno).
22
22
 
23
23
  ## Meta Squads — criacao de agentes
24
24
 
25
25
  `/squad-forge` squads multi-agente · `/mind-forge` mentes sinteticas e consultores ·
26
26
  `/worker-forge` workers · `/clone-forge` clones de mentes reais · `/etlmaker` KBs.
27
27
 
28
- Fluxo: expert pede → Meta Squad adequado cria → expert valida.
28
+ Fluxo: aluno pede → Meta Squad adequado cria → aluno valida.
29
29
 
30
30
  ## Escalation
31
31
 
32
- 1. Agente nao consegue completar a task → informar o expert com contexto
32
+ 1. Agente nao consegue completar a task → informar o aluno com contexto
33
33
  2. Quality gate falha → volta pro executor com feedback especifico
34
34
  3. Violacao constitucional → BLOCK, corrigir antes de prosseguir
35
35
  4. Conflito de fronteira → Constitution Art. II resolve (cada um faz o seu)
@@ -22,7 +22,7 @@ SEMPRE que for executar:
22
22
 
23
23
  1. Verificar se existe plano/briefing aprovado para o trabalho
24
24
  2. Executar DENTRO do escopo planejado
25
- 3. Se perceber necessidade de mudar escopo: **PARAR e perguntar ao expert**
25
+ 3. Se perceber necessidade de mudar escopo: **PARAR e perguntar ao aluno**
26
26
  4. Nao adicionar features, melhorias ou conteudo nao solicitado
27
27
  5. Nao gerar dados, numeros ou fatos sem fonte verificada
28
28
 
@@ -2,12 +2,23 @@
2
2
 
3
3
  > Todo agente no Auroq OS segue este protocolo de memoria. Nao e opcional.
4
4
 
5
- ## 5 Triggers — Quando Salvar
5
+ ## Regra principal: fim de tarefa, memoria salva
6
+
7
+ No fim de CADA tarefa concluida, o agente ativo (Companion ou qualquer outro) salva sem esperar
8
+ pedido, antes da resposta final:
9
+ → `agents/companion/data/contexto-dinamico.md`: onde paramos (o que ficou pronto, o que segue, o que espera o aluno)
10
+ → `agents/companion/data/log-decisoes.md`: as decisoes tomadas na tarefa (formato abaixo)
11
+ → tracker do projeto, se a tarefa e de um projeto do cockpit
12
+ → Avisar em uma linha o que anotou ("Anotei: ..."). Se o aluno pedir para nao guardar algo, nao guarde.
13
+
14
+ Os gatilhos abaixo completam essa regra no meio do trabalho.
15
+
16
+ ## 7 Gatilhos — Quando Salvar
6
17
 
7
18
  ### 1. Decisao Tomada
8
- SE o expert decidiu algo significativo (estrategia, preco, foco, prioridade, cancelamento):
9
- → Perguntar: "Registro essa decisao no log?"
10
- → SE sim: salvar em `agents/companion/data/log-decisoes.md` no formato:
19
+ SE o aluno decidiu algo significativo (estrategia, preco, foco, prioridade, cancelamento):
20
+ → Registrar em `agents/companion/data/log-decisoes.md` (no maximo no fim da tarefa) e avisar em uma linha
21
+ → Formato:
11
22
  ```
12
23
  ## [DATA] — [TITULO]
13
24
  **Contexto:** [situacao]
@@ -23,7 +34,7 @@ SE completou tarefa de projeto ou avancou fase:
23
34
 
24
35
  ### 3. Conhecimento Criado
25
36
  SE produziu documento, framework, analise, ou processo novo que tem valor permanente:
26
- → Perguntar: "Salvo na biblioteca? Onde faz mais sentido?"
37
+ → Perguntar: "Guardo no seu conhecimento? Onde faz mais sentido?"
27
38
  → Salvar em `docs/knowledge/` (subpasta adequada) ou `business/processos/`
28
39
 
29
40
  ### 4. Padrao Detectado
@@ -31,10 +42,20 @@ SE o Companion percebe comportamento recorrente (so Companion faz isso):
31
42
  → Registrar silenciosamente em `agents/companion/data/padroes-observados.md`
32
43
 
33
44
  ### 5. Sessao Encerrando
34
- SE expert indica que vai fechar ou pede commit final:
45
+ SE o aluno indica que vai fechar ou pede commit final:
35
46
  → Ops verifica no ritual de commit: contexto e trackers atualizados?
36
47
  → Atualizar `agents/companion/data/contexto-dinamico.md` com onde paramos
37
48
 
49
+ ### 6. Tarefa Concluida
50
+ SE terminou uma tarefa (entregou o que foi pedido, mesmo que pequena):
51
+ → Aplicar a regra principal acima: contexto-dinamico + log de decisoes + tracker, e avisar em uma linha
52
+
53
+ ### 7. Correcao Recebida
54
+ SE o aluno corrigiu um jeito seu de trabalhar ("nao faz assim", "ja falei", "errou de novo"):
55
+ → Conferir se a regra ja existe em `.claude/rules/custom-do-aluno.md`; se existe, nao repetir
56
+ → Se nao existe: escrever em "Suas regras" uma linha imperativa com o porque, sem contar o caso
57
+ → Avisar em uma linha: "Anotei nas suas regras: ..."
58
+
38
59
  > Salvar estado antes de compactacao de contexto e responsabilidade do
39
60
  > `dna-operacional.md` (Session Management) — nao repetir aqui.
40
61
 
@@ -50,10 +71,11 @@ SE expert indica que vai fechar ou pede commit final:
50
71
  | Conhecimento permanente | `docs/knowledge/{subpasta}/` |
51
72
  | Processo documentado | `business/processos/` |
52
73
  | Estado de trabalho (pre-autocompact) | Documento de trabalho do projeto |
74
+ | Correcao do aluno (vira regra) | `.claude/rules/custom-do-aluno.md` |
53
75
 
54
76
  ## Regra de Ouro
55
77
 
56
- **Na duvida, salva.** E mais barato salvar informacao que nao vai usar do que perder informacao que precisava.
78
+ **Tarefa concluida = memoria salva.** Fora isso, **na duvida, salva.** E mais barato salvar informacao que nao vai usar do que perder informacao que precisava.
57
79
 
58
80
  ## O que NAO salvar
59
81
 
@@ -2,13 +2,13 @@
2
2
 
3
3
  ## Principio
4
4
 
5
- Todo agente no Auroq OS opera por linguagem natural. O expert descreve o que quer com as palavras dele e o agente entende, classifica e executa. O expert NUNCA precisa saber nomes de comandos, sintaxe ou atalhos.
5
+ Todo agente no Auroq OS opera por linguagem natural. O aluno descreve o que quer com as palavras dele e o agente entende, classifica e executa. O aluno NUNCA precisa saber nomes de comandos, sintaxe ou atalhos.
6
6
 
7
7
  Ele fala ("guarda esse documento", "instala esses squads que recebi", "ta uma bagunca aqui"), o agente mapeia pro modo certo internamente e executa — sem pedir pra reformular.
8
8
 
9
9
  ## Greetings
10
10
 
11
- O greeting diz quem o agente e e o que ele PODE FAZER, nunca como o expert deve DIGITAR.
11
+ O greeting diz quem o agente e e o que ele PODE FAZER, nunca como o aluno deve DIGITAR.
12
12
  Estrutura obrigatoria:
13
13
 
14
14
  1. Banner com nome do agente
@@ -27,7 +27,7 @@ Estrutura obrigatoria:
27
27
  ## Comandos (`*comando`)
28
28
 
29
29
  - Existem como atalho pra quem ja conhece o sistema.
30
- - NUNCA sao mencionados proativamente (excecao: `*help`, quando o expert pede).
30
+ - NUNCA sao mencionados proativamente (excecao: `*help`, quando o aluno pede).
31
31
  - NUNCA sao exigidos. Tudo que um comando faz, a linguagem natural tambem faz.
32
32
 
33
33
  ## Applies To