sauron-cli 1.4.0 → 1.4.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.
- package/dist/index.js +51 -7
- package/package.json +5 -1
- package/.agents/rules/memory.md +0 -156
- package/.agents/skills/wiki/SKILL.md +0 -172
- package/.aider.instructions.md +0 -152
- package/.cursor/rules/sauron-memory.mdc +0 -157
- package/.genesis/prompts/prompt-onboarding-inteligente.md +0 -45
- package/.genesis/prompts/prompt-sauron-vs-openspec-arquitetura.md +0 -106
- package/.github/workflows/ci.yml +0 -27
- package/.sauron/.manifest.json +0 -7
- package/.sauron/wiki/history/implementacao-scanner-inteligente.md +0 -29
- package/.sauron/wiki/history/reestruturacao-arquitetural-core.md +0 -29
- package/.sauron/wiki/history/resiliencia-caminho-templates.md +0 -29
- package/.sauron/wiki/standards/typescript.rules.md +0 -21
- package/.sauron/wiki/summary.json +0 -81
- package/.windsurfrules +0 -160
- package/Evolu/303/247/303/243o Arquitetural do Sauron CLI.md" +0 -97
package/dist/index.js
CHANGED
|
@@ -10,10 +10,6 @@ import pc2 from "picocolors";
|
|
|
10
10
|
import { fileURLToPath } from "url";
|
|
11
11
|
import * as p2 from "@clack/prompts";
|
|
12
12
|
|
|
13
|
-
// src/features/init/init.service.ts
|
|
14
|
-
import fs8 from "fs-extra";
|
|
15
|
-
import path8 from "path";
|
|
16
|
-
|
|
17
13
|
// src/core/manifest.service.ts
|
|
18
14
|
import crypto from "crypto";
|
|
19
15
|
import fs from "fs-extra";
|
|
@@ -39,6 +35,10 @@ async function saveManifest(targetDir, manifest) {
|
|
|
39
35
|
await fs.writeJson(manifestPath, manifest, { spaces: 2 });
|
|
40
36
|
}
|
|
41
37
|
|
|
38
|
+
// src/features/init/init.service.ts
|
|
39
|
+
import fs8 from "fs-extra";
|
|
40
|
+
import path8 from "path";
|
|
41
|
+
|
|
42
42
|
// src/core/merge.service.ts
|
|
43
43
|
function checkConflict(localContent, newContent, manifestHash) {
|
|
44
44
|
const localHash = generateHash(localContent);
|
|
@@ -410,6 +410,10 @@ var InitService = class {
|
|
|
410
410
|
const targetPath = path8.join(target, file);
|
|
411
411
|
const stat = await fs8.stat(sourcePath);
|
|
412
412
|
if (stat.isDirectory()) {
|
|
413
|
+
const relativeToTarget = path8.relative(cwd, targetPath).replace(/\\/g, "/");
|
|
414
|
+
if (relativeToTarget === ".sauron/wiki" && await fs8.pathExists(targetPath)) {
|
|
415
|
+
continue;
|
|
416
|
+
}
|
|
413
417
|
await fs8.ensureDir(targetPath);
|
|
414
418
|
await processDirectory(sourcePath, targetPath);
|
|
415
419
|
} else {
|
|
@@ -464,6 +468,12 @@ var InitService = class {
|
|
|
464
468
|
modifiedFiles.push("AGENTS.md");
|
|
465
469
|
}
|
|
466
470
|
manifest.files["AGENTS.md"] = generateHash(agentsMdContent);
|
|
471
|
+
manifest.config = {
|
|
472
|
+
aiTargets: options.aiTargets,
|
|
473
|
+
severity: options.severity,
|
|
474
|
+
projectContext: options.projectContext,
|
|
475
|
+
projectStack: options.projectStack
|
|
476
|
+
};
|
|
467
477
|
await saveManifest(cwd, manifest);
|
|
468
478
|
modifiedFiles.push(".sauron/.manifest.json");
|
|
469
479
|
const memoryFilePath = path8.join(cwd, ".agents", "rules", "memory.md");
|
|
@@ -929,7 +939,41 @@ async function runInitCommand(options) {
|
|
|
929
939
|
...scannedContext.styling
|
|
930
940
|
].filter(Boolean).join(", ");
|
|
931
941
|
let projectStack = inferredStackString || "Node.js, TypeScript";
|
|
932
|
-
|
|
942
|
+
let bypassOnboarding = false;
|
|
943
|
+
const manifestData = await getManifest(cwd);
|
|
944
|
+
if (manifestData) {
|
|
945
|
+
if (manifestData.config) {
|
|
946
|
+
aiTargets = manifestData.config.aiTargets;
|
|
947
|
+
severity = manifestData.config.severity;
|
|
948
|
+
projectContext = manifestData.config.projectContext;
|
|
949
|
+
projectStack = manifestData.config.projectStack;
|
|
950
|
+
} else {
|
|
951
|
+
const agentsMdPath = path10.join(cwd, "AGENTS.md");
|
|
952
|
+
if (await fs10.pathExists(agentsMdPath)) {
|
|
953
|
+
const content = await fs10.readFile(agentsMdPath, "utf8");
|
|
954
|
+
const targetsMatch = content.match(/\*\*Targets:\*\* (.*)/);
|
|
955
|
+
if (targetsMatch) aiTargets = targetsMatch[1].split(",").map((s) => s.trim());
|
|
956
|
+
const severityMatch = content.match(/\*\*Severity:\*\* (.*)/);
|
|
957
|
+
if (severityMatch) severity = severityMatch[1].trim();
|
|
958
|
+
const contextMatch = content.match(/## Project Context\n([\s\S]*?)\n## Tech Stack/);
|
|
959
|
+
if (contextMatch) projectContext = contextMatch[1].trim();
|
|
960
|
+
const stackMatch = content.match(/## Tech Stack\n([\s\S]*?)\n## Golden Rule/);
|
|
961
|
+
if (stackMatch) projectStack = stackMatch[1].trim();
|
|
962
|
+
}
|
|
963
|
+
}
|
|
964
|
+
if (session.interactive) {
|
|
965
|
+
const bypass = await p2.confirm({
|
|
966
|
+
message: "Detectamos uma instala\xE7\xE3o anterior. Deseja manter as configura\xE7\xF5es atuais e pular o onboarding?",
|
|
967
|
+
initialValue: true
|
|
968
|
+
});
|
|
969
|
+
if (p2.isCancel(bypass)) {
|
|
970
|
+
p2.cancel("Inicializa\xE7\xE3o abortada.");
|
|
971
|
+
process.exit(0);
|
|
972
|
+
}
|
|
973
|
+
bypassOnboarding = bypass;
|
|
974
|
+
}
|
|
975
|
+
}
|
|
976
|
+
if (session.interactive && !bypassOnboarding) {
|
|
933
977
|
try {
|
|
934
978
|
const config = await p2.group(
|
|
935
979
|
{
|
|
@@ -1282,10 +1326,10 @@ async function runUninstallCommand(options) {
|
|
|
1282
1326
|
p4.intro(pc4.bgRed(pc4.white(" Sauron Memory System - Desinstala\xE7\xE3o ")));
|
|
1283
1327
|
}
|
|
1284
1328
|
if (session.interactive) {
|
|
1285
|
-
const
|
|
1329
|
+
const confirm3 = await p4.confirm({
|
|
1286
1330
|
message: options.purge ? pc4.red("Tem certeza que deseja desinstalar o Sauron e PURGAR toda a wiki de documenta\xE7\xE3o f\xEDsica?") : "Tem certeza que deseja desinstalar o Sauron deste projeto (a wiki/ de documenta\xE7\xE3o ser\xE1 preservada)?"
|
|
1287
1331
|
});
|
|
1288
|
-
if (p4.isCancel(
|
|
1332
|
+
if (p4.isCancel(confirm3) || !confirm3) {
|
|
1289
1333
|
p4.cancel("Desinstala\xE7\xE3o abortada.");
|
|
1290
1334
|
process.exit(0);
|
|
1291
1335
|
}
|
package/package.json
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sauron-cli",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.2",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"sauron": "./dist/index.js"
|
|
8
8
|
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"templates"
|
|
12
|
+
],
|
|
9
13
|
"type": "module",
|
|
10
14
|
"scripts": {
|
|
11
15
|
"build": "tsup src/index.ts --format esm --clean",
|
package/.agents/rules/memory.md
DELETED
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
trigger: always_on
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# SAURON START
|
|
6
|
-
---
|
|
7
|
-
trigger: always_on
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# SAURON START
|
|
11
|
-
---
|
|
12
|
-
trigger: always_on
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
# SAURON START
|
|
16
|
-
---
|
|
17
|
-
trigger: always_on
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
# SAURON START
|
|
21
|
-
---
|
|
22
|
-
trigger: always_on
|
|
23
|
-
---
|
|
24
|
-
|
|
25
|
-
# Regra de Memória do Projeto (OBRIGATÓRIA)
|
|
26
|
-
|
|
27
|
-
> Esta regra garante que o Wiki (`.sauron/wiki/`) é a fonte da verdade absoluta do projeto.
|
|
28
|
-
> Violá-la significa perder informação crítica entre sessões.
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## 1. LEITURA — Antes de Agir
|
|
33
|
-
|
|
34
|
-
Sempre que algo for perguntado ou uma tarefa for iniciada:
|
|
35
|
-
|
|
36
|
-
1. Leia `.sauron/wiki/summary.json` (o arquivo de roteamento base) primeiro. Este arquivo segue um **padrão rígido** e é a única fonte confiável de metadados.
|
|
37
|
-
2. Navegue pelas sub-páginas relevantes usando as informações de nome original e tipo (file/folder) contidas no JSON.
|
|
38
|
-
3. Só recorra à exploração do sistema de arquivos se a informação **não existir** no sumário (e atualize o sumário se necessário seguindo o schema da Seção 6).
|
|
39
|
-
|
|
40
|
-
---
|
|
41
|
-
|
|
42
|
-
## 2. PROTOCOLO DE SINCRONIZAÇÃO (NUVEM)
|
|
43
|
-
|
|
44
|
-
O fluxo de documentação segue um ciclo de três etapas para garantir a persistência:
|
|
45
|
-
|
|
46
|
-
1. **PULL (Manual)**: Antes de iniciar a tarefa, o usuário executa `sauron pull` para atualizar os documentos locais com a versão mais recente da nuvem.
|
|
47
|
-
2. **EXECUÇÃO (IA)**: Durante o desenvolvimento, o Agente atualiza/cria os documentos em `.sauron/wiki/` em tempo real.
|
|
48
|
-
3. **PUSH (Manual)**: Ao finalizar a tarefa, o usuário executa `sauron push` para enviar as atualizações locais para a nuvem.
|
|
49
|
-
|
|
50
|
-
> [!IMPORTANT]
|
|
51
|
-
> O Agente deve assumir que o diretório `.sauron/wiki/` é o destino final e atualizá-lo diligentemente, permitindo que o usuário sincronize as mudanças posteriormente.
|
|
52
|
-
|
|
53
|
-
---
|
|
54
|
-
|
|
55
|
-
## 3. ESCRITA — Depois de Entregar (CRÍTICO)
|
|
56
|
-
|
|
57
|
-
**Após QUALQUER entrega funcional, a wiki DEVE ser atualizada NO MESEMO TURNO de resposta.**
|
|
58
|
-
|
|
59
|
-
### Gatilhos Obrigatórios de Escrita
|
|
60
|
-
|
|
61
|
-
| Evento | Ação no Wiki |
|
|
62
|
-
|--------|-------------|
|
|
63
|
-
| **Integração de API externa** | Criar/atualizar página documentando URL, autenticação, payload, resposta e tratamento de erros. |
|
|
64
|
-
| **Nova página/rota criada** | Registrar em `summary.json` (seguindo o **padrão rígido** da Seção 6) + criar arquivo `.md`. |
|
|
65
|
-
| **Fluxo de autenticação alterado** | Atualizar a página de auth com o fluxo completo, incluindo cookies, tokens e middleware. |
|
|
66
|
-
| **Novo componente de UI funcional** | Registrar na página do módulo correspondente com props, comportamento e dependências. |
|
|
67
|
-
| **Decisão arquitetural tomada** | Documentar usando o formato "Decisão Arquitetural" (Problema → Opções → Escolha → Justificativa). |
|
|
68
|
-
| **Variável de ambiente adicionada/alterada** | Registrar na página de infraestrutura com nome, propósito e exemplo. |
|
|
69
|
-
| **Schema de banco alterado** | Atualizar `module-data-schema.md` com a mudança. |
|
|
70
|
-
| **Bug crítico resolvido** | Registrar causa raiz e solução na página do módulo afetado. |
|
|
71
|
-
|
|
72
|
-
### Regra de Ouro
|
|
73
|
-
|
|
74
|
-
```
|
|
75
|
-
❌ ERRADO: Entregar código → Responder ao usuário → Esquecer o wiki
|
|
76
|
-
✅ CORRETO: Entregar código → Atualizar wiki → Responder ao usuário
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
A atualização do wiki é **parte da entrega**, não um passo opcional posterior.
|
|
80
|
-
|
|
81
|
-
---
|
|
82
|
-
|
|
83
|
-
## 4. FORMATO — O que Escrever
|
|
84
|
-
|
|
85
|
-
Cada registro deve conter no mínimo:
|
|
86
|
-
- **O que foi feito** (descrição objetiva)
|
|
87
|
-
- **Por que foi feito** (contexto e motivação)
|
|
88
|
-
- **Como funciona** (detalhes técnicos: endpoints, payloads, fluxos)
|
|
89
|
-
- **Arquivos afetados** (lista de caminhos)
|
|
90
|
-
- **Data** (timestamp da alteração)
|
|
91
|
-
|
|
92
|
-
---
|
|
93
|
-
|
|
94
|
-
## 6. ESTRUTURA RÍGIDA DO SUMMARY.JSON
|
|
95
|
-
|
|
96
|
-
O arquivo `.sauron/wiki/summary.json` é o mapa de metadados que vincula os arquivos locais ao servidor. O CLI exige um padrão estrito para o comando `sauron push` funcionar corretamente.
|
|
97
|
-
|
|
98
|
-
### Regras de Ouro do Summary
|
|
99
|
-
- **NUNCA altere IDs**: Os campos `id`, `domainId` e `orgId` são cruciais. Removê-los ou alterá-los causará a criação de documentos duplicados no servidor em vez de atualizar os existentes.
|
|
100
|
-
- **Mantenha o Mapeamento**: O campo `name` deve ser o título original (com espaços e acentos). O `slug` e o `path` devem ser gerados seguindo a lógica de normalização (lowercase, sem acentos, espaços viram hífens).
|
|
101
|
-
- **Otimização**: Os campos `contentLength` e `contentHash` (SHA256) permitem que o CLI pule arquivos não alterados. Se você editar um arquivo manualmente, o `push` detectará a mudança mesmo se você não atualizar o hash (ele recalcula o hash local), mas o `summary.json` deve ser mantido atualizado para consistência.
|
|
102
|
-
- **Acoplamento Físico**: O Sauron CLI mapeia domínios do banco de dados na nuvem com base na subpasta física no disco local (usando o diretório pai do arquivo). Arquivos na raiz do wiki sempre pertencerão ao domínio genérico `.`. É obrigatória a organização física em pastas para manter a separação lógica na nuvem.
|
|
103
|
-
- **Ignorar summary.md**: O arquivo `summary.md` é uma página especial/reservada. Nunca adicione o `summary.md` como uma entrada do tipo `"file"` dentro do `summary.json`, caso contrário o CLI tentará excluí-lo e falhará com erro 422.
|
|
104
|
-
|
|
105
|
-
### Schema Obrigatório
|
|
106
|
-
|
|
107
|
-
O JSON deve ser um **array de objetos** seguindo rigorosamente estes formatos:
|
|
108
|
-
|
|
109
|
-
#### Entrada de Pasta (Domínio)
|
|
110
|
-
```json
|
|
111
|
-
{
|
|
112
|
-
"type": "folder",
|
|
113
|
-
"name": "Título Original",
|
|
114
|
-
"slug": "titulo-original",
|
|
115
|
-
"path": "titulo-original",
|
|
116
|
-
"id": "id-do-dominio"
|
|
117
|
-
}
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
#### Entrada de Arquivo (Documento)
|
|
121
|
-
```json
|
|
122
|
-
{
|
|
123
|
-
"type": "file",
|
|
124
|
-
"name": "Título Original do Documento",
|
|
125
|
-
"slug": "titulo-original-do-documento",
|
|
126
|
-
"path": "slug-do-dominio/titulo-original-do-documento.md",
|
|
127
|
-
"id": "id-do-kb",
|
|
128
|
-
"domainId": "id-do-dominio-pai",
|
|
129
|
-
"orgId": "id-da-organizacao",
|
|
130
|
-
"contentLength": 1234,
|
|
131
|
-
"contentHash": "sha256-checksum"
|
|
132
|
-
}
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
---
|
|
136
|
-
|
|
137
|
-
## 7. VALIDAÇÃO — Checklist Mental
|
|
138
|
-
|
|
139
|
-
Antes de finalizar qualquer resposta que envolva código, pergunte-se:
|
|
140
|
-
|
|
141
|
-
- [ ] Criei ou modifiquei um arquivo? → Wiki precisa saber.
|
|
142
|
-
- [ ] Conectei a uma API externa? → Wiki precisa documentar.
|
|
143
|
-
- [ ] Alterei fluxo de login/sessão? → Wiki MUST refletir.
|
|
144
|
-
- [ ] Criei uma nova página/rota? → `summary.json` precisa do registro de roteamento seguindo o **padrão rígido**.
|
|
145
|
-
- [ ] Tomei uma decisão técnica (lib X vs Y, abordagem A vs B)? → Wiki precisa da justificativa.
|
|
146
|
-
- [ ] Adicionei/alterei uma variável de ambiente? → Wiki precisa do registro.
|
|
147
|
-
|
|
148
|
-
Se qualquer checkbox for `true` e o wiki não foi atualizado, **a tarefa NÃO está completa**.
|
|
149
|
-
|
|
150
|
-
# SAURON END
|
|
151
|
-
|
|
152
|
-
# SAURON END
|
|
153
|
-
|
|
154
|
-
# SAURON END
|
|
155
|
-
|
|
156
|
-
# SAURON END
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: wiki
|
|
3
|
-
description: Project Memory and Documentation System - ensures every action, decision, and evolution is recorded, explained, and traceable.
|
|
4
|
-
allowed-tools: Read, Write, Edit, list_dir
|
|
5
|
-
version: 3.0
|
|
6
|
-
priority: MANDATORY
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# 🧠 Wiki & Project Memory System
|
|
10
|
-
|
|
11
|
-
> **MANDATORY SKILL** - Build a living knowledge system. Nothing exists unless it is documented.
|
|
12
|
-
> **WRITE OBLIGATION** - Every functional delivery MUST include wiki updates in the SAME response turn.
|
|
13
|
-
> **SYNC PROTOCOL** - The IA updates local `.sauron/wiki/` files; `sauron pull/push` are manual user commands.
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
## 1. Core Principles
|
|
18
|
-
|
|
19
|
-
| Principle | Rule |
|
|
20
|
-
|-----------|------|
|
|
21
|
-
| **Source of Truth** | If it's not documented, it doesn't exist. All changes must be recorded before completion. |
|
|
22
|
-
| **Decision > Impl** | Documentation is about **WHY**, not just **WHAT**. Explain context and alternatives. |
|
|
23
|
-
| **Smart Granularity** | Divide documentation into sub-pages based on modules, domains, or critical components. |
|
|
24
|
-
| **Continuous Evolution** | Pages are living organisms. They must contain current state, history, and future direction. |
|
|
25
|
-
| **Write-on-Deliver** | Wiki update is part of the delivery, not a follow-up task. Code without docs = incomplete work. |
|
|
26
|
-
|
|
27
|
-
---
|
|
28
|
-
|
|
29
|
-
## 2. Structure & Naming Conventions
|
|
30
|
-
|
|
31
|
-
| Property | Requirement |
|
|
32
|
-
|----------|-------------|
|
|
33
|
-
| **Base Directory** | `/.sauron/wiki/` |
|
|
34
|
-
| **Root Routing File** | `summary.json` (dentro de `/.sauron/wiki/`) |
|
|
35
|
-
| **Subdirectories** | `knowledge/`, `modules/`, `manuals/`, `standards/`, `history/` (pastas físicas obrigatórias para os domínios no Sauron) |
|
|
36
|
-
| **Naming Pattern** | `{name}.md` (sem prefixos se já estiverem dentro das subpastas físicas de domínio) |
|
|
37
|
-
| **Examples** | `knowledge/architecture.md`, `modules/checkout.md`, `manuals/upholstery.md` |
|
|
38
|
-
|
|
39
|
-
---
|
|
40
|
-
|
|
41
|
-
## 3. Reference Templates
|
|
42
|
-
|
|
43
|
-
### 3.1 Root Routing File (`summary.json`)
|
|
44
|
-
O arquivo `summary.json` é o mapa de metadados que vincula os arquivos locais ao servidor. Ele segue um **padrão rígido** (ver Seção 6 da `memory.md`).
|
|
45
|
-
|
|
46
|
-
```json
|
|
47
|
-
[
|
|
48
|
-
{
|
|
49
|
-
"type": "folder",
|
|
50
|
-
"name": "Título Original",
|
|
51
|
-
"slug": "titulo-original",
|
|
52
|
-
"path": "titulo-original",
|
|
53
|
-
"id": "UUID-ou-ID"
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
"type": "file",
|
|
57
|
-
"name": "Título Original",
|
|
58
|
-
"slug": "titulo-original",
|
|
59
|
-
"path": "slug-do-dominio/titulo-original.md",
|
|
60
|
-
"id": "UUID-ou-ID",
|
|
61
|
-
"domainId": "ID-do-pai",
|
|
62
|
-
"orgId": "ID-da-organizacao",
|
|
63
|
-
"contentLength": 1234,
|
|
64
|
-
"contentHash": "sha256-checksum"
|
|
65
|
-
}
|
|
66
|
-
]
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
### 3.2 Sub-pages (`{name}.md`)
|
|
70
|
-
```markdown
|
|
71
|
-
# [Module / Page Name]
|
|
72
|
-
|
|
73
|
-
## 1. Context
|
|
74
|
-
Clear description of what this part of the system is.
|
|
75
|
-
|
|
76
|
-
## 2. Responsibility
|
|
77
|
-
What this part does and what it DOES NOT do.
|
|
78
|
-
|
|
79
|
-
## 3. Architectural Decisions
|
|
80
|
-
### Decision 1
|
|
81
|
-
- **Problem**:
|
|
82
|
-
- **Options Considered**:
|
|
83
|
-
- Option A
|
|
84
|
-
- Option B
|
|
85
|
-
- **Choice**:
|
|
86
|
-
- **Justification**:
|
|
87
|
-
- **Trade-offs**:
|
|
88
|
-
|
|
89
|
-
(repeat as necessary)
|
|
90
|
-
|
|
91
|
-
## 4. Change History
|
|
92
|
-
### [Date] - [Change Title]
|
|
93
|
-
- **What was done**:
|
|
94
|
-
- **Why it was done**:
|
|
95
|
-
- **Impact on the system**:
|
|
96
|
-
- **Files affected**:
|
|
97
|
-
|
|
98
|
-
## 5. Current State
|
|
99
|
-
Objective technical description of the implementation as it stands today.
|
|
100
|
-
|
|
101
|
-
## 6. Next Steps (Optional)
|
|
102
|
-
Possible future evolutions.
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
---
|
|
106
|
-
|
|
107
|
-
## 4. Update Protocol (MANDATORY)
|
|
108
|
-
|
|
109
|
-
Whenever a relevant action is performed, the AI **MUST**:
|
|
110
|
-
|
|
111
|
-
1. **Identify Scope**: Determine which page in `/.sauron/wiki/` is affected.
|
|
112
|
-
2. **Register Change**: Add a specific entry to the **Change History** of the corresponding page.
|
|
113
|
-
3. **Update Current State**: Ensure the technical description reflects reality after the modification.
|
|
114
|
-
4. **Register Decisions**: Document technical or strategic choices using the **Architectural Decisions** format.
|
|
115
|
-
5. **Update Routing**: If a new page was created, register it in `summary.json` with its metadata immediately.
|
|
116
|
-
|
|
117
|
-
---
|
|
118
|
-
|
|
119
|
-
## 5. Mandatory Write Triggers
|
|
120
|
-
|
|
121
|
-
> 🔴 These events ALWAYS require a wiki update in the SAME response turn as the code delivery.
|
|
122
|
-
|
|
123
|
-
| Trigger Event | Wiki Action Required |
|
|
124
|
-
|---------------|---------------------|
|
|
125
|
-
| **External API integrated** | Create `{name}.md` under the corresponding folder (e.g. `integrations/` or `modules/`) with: URL, auth method, request/response shapes, error handling, env vars. |
|
|
126
|
-
| **New route/page created** | Register in `summary.json` System Map + create `{name}.md` under the corresponding folder with layout, components, and behavior. |
|
|
127
|
-
| **Authentication flow changed** | Update auth-related page with full flow: credentials, tokens, cookies, middleware, session lifecycle. |
|
|
128
|
-
| **New UI component delivered** | Register in the parent module page with: props, behavior, dependencies, visual state. |
|
|
129
|
-
| **Architectural decision made** | Document in the relevant page using the Decision template (Problem → Options → Choice → Justification). |
|
|
130
|
-
| **Environment variable added/changed** | Register in relevant infrastructure/config page with: name, purpose, example value. |
|
|
131
|
-
| **Database schema changed** | Update `module-data-schema.md` with the change, including SQL and reasoning. |
|
|
132
|
-
| **Critical bug resolved** | Register root cause and solution in the affected module page. |
|
|
133
|
-
| **Middleware/security layer added** | Document the protection boundary, what it intercepts, and its redirect logic. |
|
|
134
|
-
| **Configuration/settings page created** | Document available options, their purpose, and current state (even if mocked). |
|
|
135
|
-
|
|
136
|
-
### Self-Check Before Responding
|
|
137
|
-
|
|
138
|
-
```
|
|
139
|
-
Before writing your response to the user, ask yourself:
|
|
140
|
-
|
|
141
|
-
1. Did I create or modify any file? → Wiki needs to know.
|
|
142
|
-
2. Did I connect to an external API? → Wiki needs full documentation.
|
|
143
|
-
3. Did I change login/session flow? → Wiki MUST reflect this.
|
|
144
|
-
4. Did I create a new page/route? → summary.json needs the registration.
|
|
145
|
-
5. Did I make a technical decision? → Wiki needs the justification.
|
|
146
|
-
6. Did I add/change an env variable? → Wiki needs the record.
|
|
147
|
-
|
|
148
|
-
If ANY answer is YES and the wiki was NOT updated → THE TASK IS NOT COMPLETE.
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
---
|
|
152
|
-
|
|
153
|
-
## 6. AI Behavior & Constraints
|
|
154
|
-
|
|
155
|
-
| Rule | Action |
|
|
156
|
-
|------|--------|
|
|
157
|
-
| **Never skip** | Do not modify the system without documenting. |
|
|
158
|
-
| **Never omit** | Always justify decisions; no change can be implicit. |
|
|
159
|
-
| **Never overwrite** | History must never be deleted; append only. |
|
|
160
|
-
| **Never assume** | Do not use context that isn't documented. |
|
|
161
|
-
| **Never defer** | Wiki updates happen NOW, not "later" or "next turn". |
|
|
162
|
-
| **Clarity > Brevity** | Prioritize deep understanding over short summaries. |
|
|
163
|
-
|
|
164
|
-
---
|
|
165
|
-
|
|
166
|
-
## 7. Vision/Goal
|
|
167
|
-
|
|
168
|
-
Transform the project into a system where:
|
|
169
|
-
- Code is **Executable**.
|
|
170
|
-
- Documentation is **Explainable**.
|
|
171
|
-
- Decision History is **Auditable**.
|
|
172
|
-
- No session knowledge is **Lost**.
|
package/.aider.instructions.md
DELETED
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
# SAURON START
|
|
2
|
-
---
|
|
3
|
-
trigger: always_on
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# SAURON START
|
|
7
|
-
---
|
|
8
|
-
trigger: always_on
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
# SAURON START
|
|
12
|
-
---
|
|
13
|
-
trigger: always_on
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
# SAURON START
|
|
17
|
-
---
|
|
18
|
-
trigger: always_on
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
# Regra de Memória do Projeto (OBRIGATÓRIA)
|
|
22
|
-
|
|
23
|
-
> Esta regra garante que o Wiki (`.sauron/wiki/`) é a fonte da verdade absoluta do projeto.
|
|
24
|
-
> Violá-la significa perder informação crítica entre sessões.
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
## 1. LEITURA — Antes de Agir
|
|
29
|
-
|
|
30
|
-
Sempre que algo for perguntado ou uma tarefa for iniciada:
|
|
31
|
-
|
|
32
|
-
1. Leia `.sauron/wiki/summary.json` (o arquivo de roteamento base) primeiro. Este arquivo segue um **padrão rígido** e é a única fonte confiável de metadados.
|
|
33
|
-
2. Navegue pelas sub-páginas relevantes usando as informações de nome original e tipo (file/folder) contidas no JSON.
|
|
34
|
-
3. Só recorra à exploração do sistema de arquivos se a informação **não existir** no sumário (e atualize o sumário se necessário seguindo o schema da Seção 6).
|
|
35
|
-
|
|
36
|
-
---
|
|
37
|
-
|
|
38
|
-
## 2. PROTOCOLO DE SINCRONIZAÇÃO (NUVEM)
|
|
39
|
-
|
|
40
|
-
O fluxo de documentação segue um ciclo de três etapas para garantir a persistência:
|
|
41
|
-
|
|
42
|
-
1. **PULL (Manual)**: Antes de iniciar a tarefa, o usuário executa `sauron pull` para atualizar os documentos locais com a versão mais recente da nuvem.
|
|
43
|
-
2. **EXECUÇÃO (IA)**: Durante o desenvolvimento, o Agente atualiza/cria os documentos em `.sauron/wiki/` em tempo real.
|
|
44
|
-
3. **PUSH (Manual)**: Ao finalizar a tarefa, o usuário executa `sauron push` para enviar as atualizações locais para a nuvem.
|
|
45
|
-
|
|
46
|
-
> [!IMPORTANT]
|
|
47
|
-
> O Agente deve assumir que o diretório `.sauron/wiki/` é o destino final e atualizá-lo diligentemente, permitindo que o usuário sincronize as mudanças posteriormente.
|
|
48
|
-
|
|
49
|
-
---
|
|
50
|
-
|
|
51
|
-
## 3. ESCRITA — Depois de Entregar (CRÍTICO)
|
|
52
|
-
|
|
53
|
-
**Após QUALQUER entrega funcional, a wiki DEVE ser atualizada NO MESEMO TURNO de resposta.**
|
|
54
|
-
|
|
55
|
-
### Gatilhos Obrigatórios de Escrita
|
|
56
|
-
|
|
57
|
-
| Evento | Ação no Wiki |
|
|
58
|
-
|--------|-------------|
|
|
59
|
-
| **Integração de API externa** | Criar/atualizar página documentando URL, autenticação, payload, resposta e tratamento de erros. |
|
|
60
|
-
| **Nova página/rota criada** | Registrar em `summary.json` (seguindo o **padrão rígido** da Seção 6) + criar arquivo `.md`. |
|
|
61
|
-
| **Fluxo de autenticação alterado** | Atualizar a página de auth com o fluxo completo, incluindo cookies, tokens e middleware. |
|
|
62
|
-
| **Novo componente de UI funcional** | Registrar na página do módulo correspondente com props, comportamento e dependências. |
|
|
63
|
-
| **Decisão arquitetural tomada** | Documentar usando o formato "Decisão Arquitetural" (Problema → Opções → Escolha → Justificativa). |
|
|
64
|
-
| **Variável de ambiente adicionada/alterada** | Registrar na página de infraestrutura com nome, propósito e exemplo. |
|
|
65
|
-
| **Schema de banco alterado** | Atualizar `module-data-schema.md` com a mudança. |
|
|
66
|
-
| **Bug crítico resolvido** | Registrar causa raiz e solução na página do módulo afetado. |
|
|
67
|
-
|
|
68
|
-
### Regra de Ouro
|
|
69
|
-
|
|
70
|
-
```
|
|
71
|
-
❌ ERRADO: Entregar código → Responder ao usuário → Esquecer o wiki
|
|
72
|
-
✅ CORRETO: Entregar código → Atualizar wiki → Responder ao usuário
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
A atualização do wiki é **parte da entrega**, não um passo opcional posterior.
|
|
76
|
-
|
|
77
|
-
---
|
|
78
|
-
|
|
79
|
-
## 4. FORMATO — O que Escrever
|
|
80
|
-
|
|
81
|
-
Cada registro deve conter no mínimo:
|
|
82
|
-
- **O que foi feito** (descrição objetiva)
|
|
83
|
-
- **Por que foi feito** (contexto e motivação)
|
|
84
|
-
- **Como funciona** (detalhes técnicos: endpoints, payloads, fluxos)
|
|
85
|
-
- **Arquivos afetados** (lista de caminhos)
|
|
86
|
-
- **Data** (timestamp da alteração)
|
|
87
|
-
|
|
88
|
-
---
|
|
89
|
-
|
|
90
|
-
## 6. ESTRUTURA RÍGIDA DO SUMMARY.JSON
|
|
91
|
-
|
|
92
|
-
O arquivo `.sauron/wiki/summary.json` é o mapa de metadados que vincula os arquivos locais ao servidor. O CLI exige um padrão estrito para o comando `sauron push` funcionar corretamente.
|
|
93
|
-
|
|
94
|
-
### Regras de Ouro do Summary
|
|
95
|
-
- **NUNCA altere IDs**: Os campos `id`, `domainId` e `orgId` são cruciais. Removê-los ou alterá-los causará a criação de documentos duplicados no servidor em vez de atualizar os existentes.
|
|
96
|
-
- **Mantenha o Mapeamento**: O campo `name` deve ser o título original (com espaços e acentos). O `slug` e o `path` devem ser gerados seguindo a lógica de normalização (lowercase, sem acentos, espaços viram hífens).
|
|
97
|
-
- **Otimização**: Os campos `contentLength` e `contentHash` (SHA256) permitem que o CLI pule arquivos não alterados. Se você editar um arquivo manualmente, o `push` detectará a mudança mesmo se você não atualizar o hash (ele recalcula o hash local), mas o `summary.json` deve ser mantido atualizado para consistência.
|
|
98
|
-
- **Acoplamento Físico**: O Sauron CLI mapeia domínios do banco de dados na nuvem com base na subpasta física no disco local (usando o diretório pai do arquivo). Arquivos na raiz do wiki sempre pertencerão ao domínio genérico `.`. É obrigatória a organização física em pastas para manter a separação lógica na nuvem.
|
|
99
|
-
- **Ignorar summary.md**: O arquivo `summary.md` é uma página especial/reservada. Nunca adicione o `summary.md` como uma entrada do tipo `"file"` dentro do `summary.json`, caso contrário o CLI tentará excluí-lo e falhará com erro 422.
|
|
100
|
-
|
|
101
|
-
### Schema Obrigatório
|
|
102
|
-
|
|
103
|
-
O JSON deve ser um **array de objetos** seguindo rigorosamente estes formatos:
|
|
104
|
-
|
|
105
|
-
#### Entrada de Pasta (Domínio)
|
|
106
|
-
```json
|
|
107
|
-
{
|
|
108
|
-
"type": "folder",
|
|
109
|
-
"name": "Título Original",
|
|
110
|
-
"slug": "titulo-original",
|
|
111
|
-
"path": "titulo-original",
|
|
112
|
-
"id": "id-do-dominio"
|
|
113
|
-
}
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
#### Entrada de Arquivo (Documento)
|
|
117
|
-
```json
|
|
118
|
-
{
|
|
119
|
-
"type": "file",
|
|
120
|
-
"name": "Título Original do Documento",
|
|
121
|
-
"slug": "titulo-original-do-documento",
|
|
122
|
-
"path": "slug-do-dominio/titulo-original-do-documento.md",
|
|
123
|
-
"id": "id-do-kb",
|
|
124
|
-
"domainId": "id-do-dominio-pai",
|
|
125
|
-
"orgId": "id-da-organizacao",
|
|
126
|
-
"contentLength": 1234,
|
|
127
|
-
"contentHash": "sha256-checksum"
|
|
128
|
-
}
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
---
|
|
132
|
-
|
|
133
|
-
## 7. VALIDAÇÃO — Checklist Mental
|
|
134
|
-
|
|
135
|
-
Antes de finalizar qualquer resposta que envolva código, pergunte-se:
|
|
136
|
-
|
|
137
|
-
- [ ] Criei ou modifiquei um arquivo? → Wiki precisa saber.
|
|
138
|
-
- [ ] Conectei a uma API externa? → Wiki precisa documentar.
|
|
139
|
-
- [ ] Alterei fluxo de login/sessão? → Wiki MUST refletir.
|
|
140
|
-
- [ ] Criei uma nova página/rota? → `summary.json` precisa do registro de roteamento seguindo o **padrão rígido**.
|
|
141
|
-
- [ ] Tomei uma decisão técnica (lib X vs Y, abordagem A vs B)? → Wiki precisa da justificativa.
|
|
142
|
-
- [ ] Adicionei/alterei uma variável de ambiente? → Wiki precisa do registro.
|
|
143
|
-
|
|
144
|
-
Se qualquer checkbox for `true` e o wiki não foi atualizado, **a tarefa NÃO está completa**.
|
|
145
|
-
|
|
146
|
-
# SAURON END
|
|
147
|
-
|
|
148
|
-
# SAURON END
|
|
149
|
-
|
|
150
|
-
# SAURON END
|
|
151
|
-
|
|
152
|
-
# SAURON END
|