sauron-cli 1.0.0 → 1.1.3

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.
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": "1.0.0",
3
+ "files": {
4
+ "AGENTS.md": "16636ca1f503c84b91daa406a3cfc581563580f48443e6c082e32c7ea0037920"
5
+ }
6
+ }
package/README.md CHANGED
@@ -14,15 +14,12 @@ O Sauron resolve isso ejetando pastas estruturadas (`.sauron` e `.agents`) no se
14
14
 
15
15
  ## Instalação
16
16
 
17
- ```bash
18
- # Como o pacote ainda não está publicado publicamente no NPM,
19
- # você pode usá-lo localmente (após rodar npm link neste repositório):
17
+ Para inicializar o Sauron CLI no seu projeto, basta rodar o comando abaixo no terminal da raiz do seu projeto (não é necessário instalar nada globalmente):
20
18
 
21
- sauron init
19
+ ```bash
20
+ npx sauron-cli init
22
21
  ```
23
22
 
24
- *Brevemente disponível via `npx sauron-cli init`.*
25
-
26
23
  ## Comandos (MVP)
27
24
 
28
25
  ### `sauron init`
package/dist/index.js CHANGED
@@ -4,46 +4,236 @@
4
4
  import { Command } from "commander";
5
5
 
6
6
  // src/commands/init.ts
7
+ import fs2 from "fs-extra";
8
+ import path2 from "path";
9
+ import pc2 from "picocolors";
10
+ import { fileURLToPath } from "url";
11
+ import * as p2 from "@clack/prompts";
12
+
13
+ // src/engine/manifest.ts
14
+ import crypto from "crypto";
7
15
  import fs from "fs-extra";
8
16
  import path from "path";
17
+ function generateHash(content) {
18
+ return crypto.createHash("sha256").update(content).digest("hex");
19
+ }
20
+ async function getManifest(targetDir) {
21
+ const manifestPath = path.join(targetDir, ".sauron", ".manifest.json");
22
+ if (await fs.pathExists(manifestPath)) {
23
+ try {
24
+ const content = await fs.readJson(manifestPath);
25
+ return content;
26
+ } catch (err) {
27
+ return null;
28
+ }
29
+ }
30
+ return null;
31
+ }
32
+ async function saveManifest(targetDir, manifest) {
33
+ const manifestPath = path.join(targetDir, ".sauron", ".manifest.json");
34
+ await fs.ensureDir(path.dirname(manifestPath));
35
+ await fs.writeJson(manifestPath, manifest, { spaces: 2 });
36
+ }
37
+
38
+ // src/engine/merge.ts
39
+ import * as p from "@clack/prompts";
9
40
  import pc from "picocolors";
10
- import { fileURLToPath } from "url";
11
- var __filename = fileURLToPath(import.meta.url);
12
- var __dirname = path.dirname(__filename);
13
- async function runInit() {
14
- const cwd = process.cwd();
15
- const packageRoot = path.join(__dirname, "..");
16
- const templatesDir = path.join(packageRoot, "templates");
17
- const targetSauronDir = path.join(cwd, ".sauron");
18
- const targetAgentsDir = path.join(cwd, ".agents");
19
- console.log(pc.blue("Inicializando Sauron Memory System..."));
20
- if (await fs.pathExists(targetSauronDir) || await fs.pathExists(targetAgentsDir)) {
21
- console.error(pc.red("Erro: Sauron j\xE1 inicializado neste diret\xF3rio (pasta .sauron ou .agents existente)."));
22
- process.exit(1);
23
- }
24
- try {
25
- const sourceSauronDir = path.join(templatesDir, ".sauron");
26
- const sourceAgentsDir = path.join(templatesDir, ".agents");
27
- if (await fs.pathExists(sourceAgentsDir)) {
28
- await fs.copy(sourceAgentsDir, targetAgentsDir);
29
- } else {
30
- console.warn(pc.yellow(`Aviso: Pasta .agents n\xE3o encontrada nos templates originais (${sourceAgentsDir}).`));
41
+ import * as Diff from "diff";
42
+ async function resolveConflict(filePath, localContent, newContent, manifestHash) {
43
+ const localHash = generateHash(localContent);
44
+ if (manifestHash && localHash === manifestHash) {
45
+ return "theirs";
46
+ }
47
+ if (localContent === newContent) {
48
+ return "ours";
49
+ }
50
+ p.note(`Foi detectada uma muta\xE7\xE3o no arquivo: ${pc.cyan(filePath)}
51
+ O seu agente de IA ou voc\xEA modificou este arquivo desde a \xFAltima instala\xE7\xE3o.`, "\u26A0\uFE0F CONFLITO DETECTADO");
52
+ let resolved = null;
53
+ while (!resolved) {
54
+ const action = await p.select({
55
+ message: `Como deseja proceder com ${pc.cyan(filePath)}?`,
56
+ options: [
57
+ { value: "ours", label: "Preservar Local (Ours)", hint: "Mant\xE9m sua vers\xE3o e ignora o novo template" },
58
+ { value: "theirs", label: "Sobrescrever (Theirs)", hint: "Destr\xF3i a sua vers\xE3o e aplica o template novo" },
59
+ { value: "diff", label: "Auditar Diferen\xE7as (Diff Mode)", hint: "Mostra o que vai mudar visualmente" }
60
+ ]
61
+ });
62
+ if (p.isCancel(action)) {
63
+ p.cancel("Opera\xE7\xE3o cancelada pelo usu\xE1rio durante a resolu\xE7\xE3o de conflito.");
64
+ process.exit(0);
31
65
  }
32
- if (await fs.pathExists(sourceSauronDir)) {
33
- await fs.copy(sourceSauronDir, targetSauronDir);
66
+ if (action === "diff") {
67
+ const diffStr = renderDiff(localContent, newContent, filePath);
68
+ console.log("\n" + diffStr + "\n");
34
69
  } else {
35
- console.warn(pc.yellow(`Aviso: Pasta .sauron n\xE3o encontrada nos templates originais (${sourceSauronDir}).`));
70
+ resolved = action;
36
71
  }
37
- console.log(pc.green(pc.bold("\nSauron Memory System instalado com sucesso! \u{1F441}\uFE0F\n")));
38
- console.log(pc.white("O C\xE9rebro da IA foi ejetado neste diret\xF3rio. A partir de agora, suas IAs documentar\xE3o regras passivamente.\n"));
39
- } catch (error) {
40
- console.error(pc.red("Erro fatal ao ejetar os arquivos do Sauron:"), error);
41
- process.exit(1);
42
72
  }
73
+ return resolved;
74
+ }
75
+ function renderDiff(oldStr, newStr, fileName) {
76
+ const diffs = Diff.diffLines(oldStr, newStr);
77
+ let output = pc.bold(`--- a/${fileName} (Local)
78
+ +++ b/${fileName} (Novo Template)
79
+ `);
80
+ diffs.forEach((part) => {
81
+ const lines = part.value.replace(/\n$/, "").split("\n");
82
+ for (const line of lines) {
83
+ if (part.added) {
84
+ output += pc.green(`+ ${line}
85
+ `);
86
+ } else if (part.removed) {
87
+ output += pc.red(`- ${line}
88
+ `);
89
+ } else {
90
+ output += pc.dim(` ${line}
91
+ `);
92
+ }
93
+ }
94
+ });
95
+ return output;
96
+ }
97
+
98
+ // src/commands/init.ts
99
+ var __filename = fileURLToPath(import.meta.url);
100
+ var __dirname = path2.dirname(__filename);
101
+ async function runInit(options) {
102
+ const cwd = process.cwd();
103
+ const logo = `
104
+ \x1B[38;2;255;106;0m \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\x1B[0m
105
+ \x1B[38;2;255;179;0m\u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588\u2588\u2588 \u2588\u2588\x1B[0m
106
+ \x1B[38;2;255;215;0m\u255A\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588\x1B[0m
107
+ \x1B[38;2;255;140;0m \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588\x1B[0m
108
+ \x1B[38;2;204;51;0m\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588 \u2588\u2588\u2588\u2588\x1B[0m
109
+ `;
110
+ console.log(pc2.bold(logo));
111
+ console.log(pc2.dim(" CLI de Idempot\xEAncia e Mem\xF3ria para IAs\n"));
112
+ p2.intro(pc2.bgRed(pc2.white(" Sauron Memory System - Inicializa\xE7\xE3o ")));
113
+ let aiTargets = ["Cursor", "Windsurf", "Aider", "Antigravity"];
114
+ let severity = "Observacional";
115
+ let projectContext = "Projeto Gen\xE9rico";
116
+ let projectStack = "Node.js, TypeScript";
117
+ if (!options.yes) {
118
+ const config = await p2.group(
119
+ {
120
+ targets: () => p2.multiselect({
121
+ message: "Qual(is) IA(s) voc\xEA usar\xE1 neste projeto?",
122
+ options: [
123
+ { value: "Cursor", label: "Cursor", hint: "Recomendado" },
124
+ { value: "Windsurf", label: "Windsurf" },
125
+ { value: "Aider", label: "Aider" },
126
+ { value: "Antigravity", label: "Antigravity", hint: "Agente nativo" }
127
+ ],
128
+ required: false
129
+ }),
130
+ severity: () => p2.select({
131
+ message: "Qual o n\xEDvel de severidade das regras da IA?",
132
+ options: [
133
+ { value: "Observacional", label: "Observacional (A IA documenta quando julgar necess\xE1rio)" },
134
+ { value: "Estrito", label: "Estrito (Bloqueia altera\xE7\xF5es sem documenta\xE7\xE3o expl\xEDcita)" }
135
+ ]
136
+ }),
137
+ context: () => p2.text({
138
+ message: "Descreva brevemente o contexto do seu projeto:",
139
+ placeholder: "Ex: App de agendamento de pilates",
140
+ defaultValue: "Projeto Gen\xE9rico"
141
+ }),
142
+ stack: () => p2.text({
143
+ message: "Qual a stack tecnol\xF3gica principal do seu projeto?",
144
+ placeholder: "Ex: Next.js 15, Tailwind, Firebase",
145
+ defaultValue: "Node.js, TypeScript"
146
+ })
147
+ },
148
+ {
149
+ onCancel: () => {
150
+ p2.cancel("Inicializa\xE7\xE3o abortada.");
151
+ process.exit(0);
152
+ }
153
+ }
154
+ );
155
+ aiTargets = config.targets;
156
+ severity = config.severity;
157
+ projectContext = config.context;
158
+ projectStack = config.stack;
159
+ }
160
+ const s = p2.spinner();
161
+ s.start("Injetando o C\xE9rebro da IA no reposit\xF3rio...");
162
+ const packageRoot = path2.join(__dirname, "..", "..");
163
+ const templatesDir = path2.join(packageRoot, "templates");
164
+ const manifest = await getManifest(cwd) || { version: "1.0.0", files: {} };
165
+ async function processDirectory(source, target) {
166
+ if (!await fs2.pathExists(source)) return;
167
+ const files = await fs2.readdir(source);
168
+ for (const file of files) {
169
+ const sourcePath = path2.join(source, file);
170
+ const targetPath = path2.join(target, file);
171
+ const stat = await fs2.stat(sourcePath);
172
+ if (stat.isDirectory()) {
173
+ await fs2.ensureDir(targetPath);
174
+ await processDirectory(sourcePath, targetPath);
175
+ } else {
176
+ const content = await fs2.readFile(sourcePath, "utf8");
177
+ const relPath = path2.relative(cwd, targetPath).replace(/\\/g, "/");
178
+ let shouldWrite = true;
179
+ if (await fs2.pathExists(targetPath)) {
180
+ const localContent = await fs2.readFile(targetPath, "utf8");
181
+ s.stop(`Conflito ou atualiza\xE7\xE3o em ${relPath}`);
182
+ const decision = await resolveConflict(relPath, localContent, content, manifest.files[relPath]);
183
+ s.start("Continuando inje\xE7\xE3o...");
184
+ if (decision === "ours") {
185
+ shouldWrite = false;
186
+ }
187
+ } else {
188
+ await fs2.ensureDir(path2.dirname(targetPath));
189
+ }
190
+ if (shouldWrite) {
191
+ await fs2.writeFile(targetPath, content, "utf8");
192
+ }
193
+ manifest.files[relPath] = generateHash(content);
194
+ }
195
+ }
196
+ }
197
+ await processDirectory(path2.join(templatesDir, ".sauron"), path2.join(cwd, ".sauron"));
198
+ await processDirectory(path2.join(templatesDir, ".agents"), path2.join(cwd, ".agents"));
199
+ const agentsMdPath = path2.join(cwd, "AGENTS.md");
200
+ const agentsMdContent = `# Diretrizes Globais de Agentes (Sauron CLI)
201
+
202
+ **Alvos:** ${aiTargets.join(", ")}
203
+ **Severidade:** ${severity}
204
+
205
+ ## Contexto do Projeto
206
+ ${projectContext}
207
+
208
+ ## Stack Tecnol\xF3gica
209
+ ${projectStack}
210
+
211
+ ## Regra de Ouro (Write Obligation)
212
+ Todos os agentes operando neste reposit\xF3rio est\xE3o estritamente obrigados a documentar qualquer altera\xE7\xE3o arquitetural, de regra de neg\xF3cio ou muta\xE7\xE3o de estado nas pastas \`.sauron\` e \`.agents\` correspondentes. A leitura passiva sem documenta\xE7\xE3o \xE9 considerada quebra de compliance.
213
+
214
+ *Gerado automaticamente pelo Sauron CLI.*
215
+ `;
216
+ let shouldWriteAgents = true;
217
+ if (await fs2.pathExists(agentsMdPath)) {
218
+ const localAgents = await fs2.readFile(agentsMdPath, "utf8");
219
+ s.stop(`Conflito em AGENTS.md`);
220
+ const decision = await resolveConflict("AGENTS.md", localAgents, agentsMdContent, manifest.files["AGENTS.md"]);
221
+ s.start("Finalizando...");
222
+ if (decision === "ours") shouldWriteAgents = false;
223
+ }
224
+ if (shouldWriteAgents) {
225
+ await fs2.writeFile(agentsMdPath, agentsMdContent, "utf8");
226
+ }
227
+ manifest.files["AGENTS.md"] = generateHash(agentsMdContent);
228
+ await saveManifest(cwd, manifest);
229
+ s.stop("Inje\xE7\xE3o finalizada.");
230
+ p2.outro(
231
+ pc2.green(pc2.bold("Sauron Memory System instalado com sucesso!\n\n")) + pc2.white("O C\xE9rebro da IA foi injetado e protegido pelo motor de integridade.\n") + pc2.cyan("A\xE7\xF5es Recomendadas:\n") + pc2.dim("Copie o comando abaixo e envie para a sua IA testar a nova arquitetura:\n") + pc2.yellow('"Analise a estrutura .sauron/ e .agents/ rec\xE9m injetada e sugira quais regras cr\xEDticas eu devo documentar agora para nosso projeto."')
232
+ );
43
233
  }
44
234
 
45
235
  // src/index.ts
46
236
  var program = new Command();
47
237
  program.name("sauron").description("Sauron CLI - Framework para resolu\xE7\xE3o de Amn\xE9sia de Contexto em IAs").version("1.0.0");
48
- program.command("init").description("Inicializa o Sauron Memory System no projeto atual").action(runInit);
238
+ program.command("init").description("Inicializa o Sauron Memory System no projeto atual").option("-y, --yes", "Pula os prompts interativos e usa os valores padr\xE3o (N\xE3o-interativo)").action((options) => runInit(options));
49
239
  program.parse();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sauron-cli",
3
- "version": "1.0.0",
3
+ "version": "1.1.3",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -15,11 +15,14 @@
15
15
  "author": "",
16
16
  "license": "ISC",
17
17
  "dependencies": {
18
+ "@clack/prompts": "^1.5.1",
18
19
  "commander": "^15.0.0",
20
+ "diff": "^9.0.0",
19
21
  "fs-extra": "^11.3.5",
20
22
  "picocolors": "^1.1.1"
21
23
  },
22
24
  "devDependencies": {
25
+ "@types/diff": "^7.0.2",
23
26
  "@types/fs-extra": "^11.0.4",
24
27
  "@types/node": "^25.9.2",
25
28
  "tsup": "^8.5.1",
@@ -1,429 +0,0 @@
1
- ### METADADOS
2
-
3
- | Atributo | Detalhe |
4
- | :--- | :--- |
5
- | **Nome do Produto** | Sauron (Sauron CLI & Sauron Cloud) |
6
- | **Versão** | 1.0 (Draft) |
7
- | **Data Atual** | 24 de Maio de 2024 |
8
- | **Status** | Draft |
9
- | **Responsável** | [PENDENTE: Inserir nome do Solo Founder/Product Owner] |
10
- | **Stack Tecnológica Recomendada** | Node.js, TypeScript, NPM, Commander, Tsup (CLI). React/Next.js (Web), React Native/Expo (Mobile), Stripe (Assinaturas). |
11
-
12
- ---
13
-
14
- ### 1. VISÃO GERAL E PROPOSTA DE VALOR
15
-
16
- **Elevator Pitch:**
17
- O Sauron é uma infraestrutura de orquestração de contexto para IAs que atua como o "lobo frontal" de assistentes de código, garantindo que regras de negócio não se percam através de um ecossistema agnóstico de ferramentas de linha de comando, interface web e aprovações mobile.
18
-
19
- **Problema Central:**
20
- Na era do "vibe coding", desenvolvedores dependem crescentemente de agentes de Inteligência Artificial (como Cursor, Windsurf e Aider) para gerar e refatorar bases de código complexas. Contudo, esses agentes sofrem de "Amnésia de Contexto". Eles conseguem ler a sintaxe do código atual, mas desconhecem o histórico e o *porquê* das decisões arquiteturais (regras de negócio). Isso resulta em refatorações destrutivas, perda de tempo com a reescrita de prompts gigantescos diários e um consumo ineficiente da "Context Window" dos modelos (gastando tokens excessivamente e aumentando o tempo de resposta).
21
-
22
- Além disso, a documentação tradicional falha porque é mantida por humanos após o código ser escrito, tornando-se rapidamente obsoleta. Sem um "Single Source of Truth" determinístico, a escalabilidade de projetos guiados por IA torna-se insustentável a médio prazo.
23
-
24
- **Diferencial Competitivo:**
25
- O diferencial intransponível do Sauron em 6 meses reside no conceito nativo de **"Write Obligation" (Obrigação de Escrita)** aliado à agnosia de plataforma. Diferente de concorrentes que apenas leem o repositório, o Sauron obriga a IA a documentar proativamente suas ações e decisões de negócio em um formato Markdown estruturado antes de concluir a tarefa. O Sauron não compete com os agentes (não escreve código); ele os padroniza e governa. Essa infraestrutura passiva é validada localmente via CLI e estendida colaborativamente via interfaces Web e Mobile.
26
-
27
- **Posicionamento de Mercado:**
28
- O Sauron posiciona-se como a "camada de governança e memória" padrão (o equivalente a um "Git para contexto de IA") no desenvolvimento de software. Ele atende desde o Indie Hacker que precisa de controle absoluto do seu projeto solo, até Tech Leads corporativos que demandam monitoramento, sincronização na nuvem e auditoria de agentes de IA através de uma suíte multiplataforma paga (Web/Mobile).
29
-
30
- ---
31
-
32
- ### 2. PROBLEMA E OPORTUNIDADE
33
-
34
- **Descrição Aprofundada da Dor:**
35
- O desenvolvedor contemporâneo passa de "escritor de código" para "revisor de código gerado". A dor crítica ocorre na transição entre sessões de trabalho. Quando a IDE é fechada, a IA esquece os limites estritos do domínio da aplicação. Consequentemente, o usuário precisa gastar de 15 a 30 minutos por dia apenas contextualizando o agente, subindo arquivos `.txt` desorganizados ou copiando regras do Notion para o chat da IA. As alucinações da IA quebram lógicas de pagamento, rotas de autenticação e padrões de arquitetura porque a memória do agente é volátil.
36
-
37
- **Jornada Atual do Usuário (AS-IS):**
38
- 1. O desenvolvedor abre sua IDE (ex: Cursor) em um projeto complexo.
39
- 2. Ele percebe que a IA não entende as regras de faturamento do sistema.
40
- 3. Ele sai da IDE, abre o Notion/Confluence (ou um bloco de notas local) e copia as regras.
41
- 4. Ele cola as regras no prompt principal da IA.
42
- 5. A IA codifica, mas esquece o contexto 10 interações depois devido ao limite da janela de contexto.
43
- 6. A documentação original fica defasada, pois o código mudou e o humano não atualizou o Notion.
44
-
45
- **Oportunidade Quantificada:**
46
- Estima-se que mais de 5 milhões de desenvolvedores já utilizem assistentes de IA avançados. Se cada desenvolvedor perde em média 20 minutos diários gerenciando contexto e corrigindo alucinações decorrentes de amnésia da IA, há uma oportunidade de recuperação de 33 milhões de horas mensais no mercado global de desenvolvimento corporativo e indie. [ESTIMATIVA — validar com o time de pesquisa].
47
-
48
- **Concorrentes Diretos e Indiretos:**
49
- - *Repomix / gpt-repo-to-text (Indiretos):* Agregadores "Read-Only". Copiam todo o repositório, mas não ensinam a IA a manter histórico.
50
- - *Aider / GPT-Pilot (Indiretos):* Agentes de execução direta. Focam no "O quê" e prendem o usuário ao terminal deles.
51
- - *Notion / Confluence (Indiretos):* Plataformas de documentação tradicional. Exigem trabalho manual humano e são isoladas da IDE.
52
-
53
- ---
54
-
55
- ### 3. PÚBLICO-ALVO E PERSONAS
56
-
57
- | Atributo | Persona 1: Alex, o Indie Hacker (Early Adopter) | Persona 2: Sarah, Tech Lead Corporativa (Fase Escala) |
58
- | :--- | :--- | :--- |
59
- | **Nome e Perfil** | Alex (28), Desenvolvedor Full-stack Solo, construtor de micro-SaaS. | Sarah (35), Arquiteta de Software gerenciando 3 squads. |
60
- | **Contexto de Uso** | Usa Cursor para escrever 100% do código (Vibe Coding). Trabalha localmente. | Supervisiona código gerado por IAs operadas por desenvolvedores juniores. |
61
- | **Dor Principal** | A IA quebra lógicas de projetos paralisados há semanas por falta de memória de contexto. | Agentes de IA do time estão alucinando e ignorando padrões arquiteturais e de compliance corporativo. |
62
- | **Job-to-be-done** | Quando volto a um projeto antigo, quero que a IA saiba imediatamente as regras, para continuar desenvolvendo sem atrito. | Quando a IA de um dev altera uma regra core, quero ser notificada no Mobile para aprovar e garantir a governança. |
63
- | **Maior Medo/Risco** | O projeto ficar tão complexo que a IA não consiga mais escalá-lo, travando o produto. | Vazamento de propriedade intelectual ou código deficiente indo para produção por erro não auditado da IA. |
64
- | **Critério de Sucesso** | Rodar `sauron init` e ver a IA documentar e respeitar o histórico automaticamente na próxima hora. | Ter visibilidade completa das regras no Dashboard Web e aprovar integrações via Mobile App. |
65
- | **Maturidade Digital** | 5 (Explorador de bleeding-edge AI) | 4 (Altamente técnica, focada em processos robustos) |
66
-
67
- ---
68
-
69
- ### 4. OBJETIVOS E MÉTRICAS DE SUCESSO
70
-
71
- **North Star Metric:**
72
- *Successful Context Writes (SCW):* Número de arquivos de regras de negócio (Skills/Memories) gerados, atualizados e auditados com sucesso pelas IAs nas bases de código dos usuários.
73
-
74
- **Tabela de KPIs:**
75
-
76
- | Métrica | Baseline Atual | Meta 3 Meses | Meta 6 Meses | Como Medir |
77
- | :--- | :--- | :--- | :--- | :--- |
78
- | Instalações CLI (`npx`) | 0 | 5.000 | 15.000 | NPM Registry Stats |
79
- | Sucesso do `sauron check` | 0% | > 85% | > 95% | Telemetria anônima (CLI) |
80
- | Assinantes Cloud (SaaS) | 0 | 100 | 500 | Stripe Billing (Dashboard) |
81
- | MAU (Web Dashboard) | 0 | 500 | 2.500 | Google Analytics / PostHog |
82
-
83
- **Métricas de Produto:**
84
- - *Engajamento:* Média de comandos `sauron map` executados por usuário/semana.
85
- - *Retenção:* % de repositórios que continuam passando no `sauron check` após 30 dias do `init`.
86
- - *Adoção Multiplataforma:* % de usuários CLI que fazem login no Web Dashboard e baixam o Mobile App.
87
-
88
- **Métricas de Negócio:**
89
- - *Receita Recorrente Mensal (MRR):* Gerada pelas assinaturas premium de sincronização e aprovação Mobile.
90
- - *Churn de Assinatura:* Meta < 5% ao mês.
91
- - *LTV / CAC:* [PENDENTE: Estimar após validação de custos de ads do SaaS na Fase 2].
92
-
93
- ---
94
-
95
- ### 5. ESCOPO — IN & OUT
96
-
97
- **Lista In-Scope:**
98
- - Desenvolvimento da CLI com os comandos `init`, `check` e `map` (Prioridade Máxima: O núcleo que valida a tese de governança local).
99
- - Geração da estrutura de pastas `.sauron/` e `.agents/` e do `summary.json`.
100
- - Web Dashboard para gestão do contexto de times e gerenciamento de assinaturas SaaS (Prioridade Alta: Atende restrição multiplataforma).
101
- - Aplicativo Mobile para aprovações rápidas de mudanças de regras e monitoramento de alertas (Prioridade Média: Atende restrição de governança de squads).
102
- - Módulo de Assinaturas (Stripe) para liberação de acesso aos Adapters Cloud (Prioridade Alta: Sustentação de receita estipulada).
103
-
104
- **Lista Out-of-Scope:**
105
- - Execução direta de código-fonte pelo Sauron (Justificativa: O CLI é passivo; quem altera código é o Cursor/Windsurf).
106
- - Treinamento local de modelos LLM (Justificativa: Fora da proposta de infraestrutura de governança; muito custoso).
107
- - Versionamento de código integrado (O Sauron gerencia memória em Markdown, o Git continuará sendo a ferramenta para código-fonte).
108
-
109
- **Hipóteses Assumidas:**
110
- - Desenvolvedores aceitarão adicionar uma pasta oculta `.sauron` aos seus repositórios.
111
- - Assistentes de IA (LLMs atuais) têm capacidade analítica suficiente para respeitar instruções severas escritas em arquivos Markdown.
112
- - Tech Leads pagarão por um modelo SaaS/Assinatura para ter visibilidade Web e aprovações Mobile.
113
-
114
- **Restrições:**
115
- - *Técnicas:* O desenvolvimento do CLI inicial será feito por 1 Solo Founder usando Vibe Coding em 2 a 3 dias.
116
- - *Multiplataforma:* Web e Mobile exigem construção de API e banco de dados centralizado em nuvem paralela à CLI open-source.
117
-
118
- ---
119
-
120
- ### 6. REQUISITOS FUNCIONAIS
121
-
122
- *(Instrução Crítica seguida: Gherkin completo, mínimo 2 regras de negócio por feature, prioridades MoSCoW).*
123
-
124
- #### ÉPICO 1: Core CLI Tools (Governança Local)
125
-
126
- **Feature 1.1: Ejeção da Estrutura Inicial (`sauron init`)**
127
- - **User Story:** Como Indie Hacker, quero inicializar o Sauron na raiz do meu projeto, para que a IA receba imediatamente a arquitetura de memória e regras de negócio base.
128
- - **Regras de Negócio:**
129
- 1. O comando deve ser bloqueado se executado fora de um diretório válido ou se a pasta `.sauron` já existir.
130
- 2. O comando deve ejetar estritamente o manifesto `summary.json`, a pasta `.agents` e a pasta `.sauron/wiki/`.
131
- - **Critérios de Aceitação (Gherkin):**
132
- - Dado que o usuário está na raiz de um projeto Node sem o Sauron instalado, quando ele executar `npx sauron-cli init`, então o sistema deve criar a estrutura de pastas `.sauron`, e exibir uma mensagem de sucesso no terminal com a cor verde.
133
- - Dado que a pasta `.sauron` já existe no diretório atual, quando o usuário executar `npx sauron-cli init`, então o sistema deve abortar a operação, e exibir o erro "Sauron já inicializado neste diretório".
134
- - **Prioridade:** Must Have
135
- - **Complexidade:** P
136
-
137
- **Feature 1.2: Validação de Integridade (`sauron check`)**
138
- - **User Story:** Como desenvolvedor, quero rodar uma auditoria local nos arquivos Markdown, para que eu tenha certeza que a IA não corrompeu as métricas ou a estrutura exigida pelo framework.
139
- - **Regras de Negócio:**
140
- 1. Todos os arquivos `.md` na pasta `wiki` devem possuir um mapeamento exato no `summary.json` (match de ID, Slug e Type).
141
- 2. Arquivos órfãos (existem fisicamente, mas não no JSON) devem resultar em falha no check (exit code 1).
142
- - **Critérios de Aceitação (Gherkin):**
143
- - Dado que a IA criou um novo arquivo Markdown sem atualizá-lo no `summary.json`, quando o usuário executar `sauron check`, então o CLI deve apontar falha de validação, e listar o nome do arquivo órfão no console.
144
- - Dado que a estrutura Markdown e o `summary.json` estão perfeitamente sincronizados, quando o usuário executar `sauron check`, então o CLI deve retornar exit code 0, e exibir uma mensagem "Auditoria concluída com sucesso".
145
- - **Prioridade:** Must Have
146
- - **Complexidade:** M
147
-
148
- **Feature 1.3: Visualização do Cérebro (`sauron map`)**
149
- - **User Story:** Como desenvolvedor, quero visualizar a árvore de contexto atual, para que eu entenda rapidamente o que a IA já documentou sem precisar abrir os arquivos JSON ou Markdown um a um.
150
- - **Regras de Negócio:**
151
- 1. A exibição deve ser formatada em hierarquia de árvore via terminal utilizando biblioteca visual (ex: `chalk`).
152
- 2. O comando deve agrupar os itens por domínios (`knowledge`, `modules`, `standards`).
153
- - **Critérios de Aceitação (Gherkin):**
154
- - Dado que o manifesto possui 3 domínios registrados, quando o usuário executar `sauron map`, então o sistema deve imprimir uma árvore colorida no terminal ilustrando a relação hierárquica, e agrupar os arquivos em seus respectivos domínios.
155
- - Dado que o `summary.json` está vazio de regras, quando o usuário executar `sauron map`, então o sistema deve exibir um "Empty State" amigável, e sugerir que o usuário interaja com a IA para criar as primeiras regras.
156
- - **Prioridade:** Should Have
157
- - **Complexidade:** M
158
-
159
- #### ÉPICO 2: Ecossistema Multiplataforma & SaaS (Governança Escalonada)
160
-
161
- **Feature 2.1: Criação Completa de Projetos via Web Dashboard**
162
- - **User Story:** Como Tech Lead, quero acessar um dashboard web para visualizar e editar o repositório de memória das IAs dos meus squads de forma centralizada, para que padrões organizacionais sejam cumpridos.
163
- - **Regras de Negócio:**
164
- 1. O usuário Web deve ter nível de permissão "Admin" ou "Editor" vinculado ao plano da assinatura.
165
- 2. Qualquer alteração feita via Web atualizará o banco de dados nuvem e notificará os clientes locais via webhook ou adapter para sincronização posterior.
166
- - **Critérios de Aceitação (Gherkin):**
167
- - Dado que o Tech Lead está autenticado no Web Dashboard com plano ativo, quando ele cria uma nova "Regra de Negócio Padrão" pela interface web, então o sistema deve salvar a regra no banco de dados centralizado, e propagar o status de sincronização pendente para o repositório vinculado.
168
- - Dado que a assinatura do usuário está expirada, quando ele tenta salvar uma regra via Web, então o sistema deve bloquear a ação, e redirecioná-lo para a tela de pagamento.
169
- - **Prioridade:** Should Have (Fase 2)
170
- - **Complexidade:** G
171
-
172
- **Feature 2.2: Mobile App para Aprovações Rápidas (Governança)**
173
- - **User Story:** Como Tech Lead, quero receber notificações push no meu celular quando a IA de um júnior alterar uma regra core do Sauron, para que eu possa revisar e aprovar o contexto rapidamente de qualquer lugar.
174
- - **Regras de Negócio:**
175
- 1. Alterações em arquivos classificados como `type: "core_standard"` acionam uma trava (lock) e exigem aprovação via Mobile ou Web.
176
- 2. O app Mobile operará em modo "Read & Approve", não permitindo edição de blocos extensos de código.
177
- - **Critérios de Aceitação (Gherkin):**
178
- - Dado que uma regra core foi modificada por um agente no CLI e submetida via Nuvem, quando o Tech Lead abrir o app Mobile, então ele deve ver um diff das mudanças, e visualizar os botões de "Aprovar" ou "Rejeitar".
179
- - Dado que o Tech Lead clica em "Aprovar" no Mobile, quando a requisição é concluída, então a trava do arquivo é removida no banco de dados, e o desenvolvedor local recebe permissão para continuar a task.
180
- - **Prioridade:** Could Have (Fase 2)
181
- - **Complexidade:** GG
182
-
183
- **Feature 2.3: Motor de Assinaturas (Monetização Cloud)**
184
- - **User Story:** Como usuário corporativo, quero gerenciar meu plano de assinatura, para que meu time tenha acesso aos recursos de sincronização Cloud, Web e Mobile.
185
- - **Regras de Negócio:**
186
- 1. A cobrança ocorrerá via Stripe (cartão de crédito) em um modelo de assentos (per-seat pricing).
187
- 2. Cancelamento do plano reverte o repositório ao estado Open Source (apenas operação local via CLI, perdendo acesso Web/Mobile).
188
- - **Critérios de Aceitação (Gherkin):**
189
- - Dado que um usuário acessa a aba "Billing" no Web Dashboard, quando ele preenche os dados do cartão via checkout do Stripe e confirma, então a conta é provisionada com status "Premium", e os recursos Mobile e Web são desbloqueados em tempo real.
190
- - Dado que o pagamento mensal falha, quando passam-se 3 dias de retentativa, então a API deve revogar as chaves de sincronização em nuvem, e enviar um e-mail de aviso de downgrade.
191
- - **Prioridade:** Must Have (Fase SaaS)
192
- - **Complexidade:** G
193
-
194
- ---
195
-
196
- ### 7. REQUISITOS NÃO-FUNCIONAIS
197
-
198
- - **Performance:**
199
- - O comando `sauron check` deve varrer até 100 arquivos Markdown e validar o JSON associado em `< 50ms` localmente.
200
- - O tempo de carregamento da "Tree View" no Dashboard Web deve ser `< 1.5s` (LCP).
201
- - **Segurança:**
202
- - Na versão Web/Mobile, todas as chaves de sincronização devem ser protegidas usando criptografia AES-256 no banco de dados.
203
- - A autenticação Cloud deve exigir OAuth 2.0 (GitHub Login obrigatório). JWT tokens de sessão expiram em 24h.
204
- - **Conformidade Legal:**
205
- - Total conformidade com GDPR e LGPD: O sistema (na sua via SaaS) deve permitir a exclusão completa e permanente dos dados da conta do usuário em até 72 horas após o pedido (`Right to be Forgotten`).
206
- - **Escalabilidade:**
207
- - O banco de dados Web/Mobile (PostgreSQL) deve suportar no mínimo 1.000 requisições simultâneas de Webhooks de sincronização de CLI na Fase 2 (SaaS MVP) sem degradação de performance.
208
- - **Disponibilidade:**
209
- - A API do SaaS (Web/Mobile) deve garantir um SLA de 99.9% de uptime. Plano de contingência via fallback para AWS Multi-AZ no banco de dados. (O CLI Open Source possui 100% de disponibilidade por ser offline).
210
- - **Acessibilidade:**
211
- - O Dashboard Web deve atingir nota "AA" nos padrões WCAG 2.1 (contraste de cor, navegação completa por teclado e suporte a leitores de tela como NVDA/VoiceOver).
212
- - **Compatibilidade:**
213
- - CLI: Suporte nativo a Node.js v18+. Sistemas operacionais: Windows (PowerShell/WSL), macOS (Zsh), Linux (Bash).
214
- - Web: Suporte aos navegadores Chrome v100+, Firefox v100+, Safari v15+.
215
- - Mobile: Suporte a iOS 15+ e Android 11+.
216
-
217
- ---
218
-
219
- ### 8. FLUXOS DO USUÁRIO E JORNADA
220
-
221
- **Happy Path (Inicialização e Uso do CLI):**
222
- 1. O usuário abre o terminal em um projeto existente.
223
- 2. Executa o comando `npx sauron-cli init`.
224
- 3. O CLI injeta a pasta `.sauron` e exibe mensagem de sucesso.
225
- 4. O usuário abre sua IDE (Cursor) e inicia o chat com a IA.
226
- 5. O usuário instrui a IA: "Implemente um sistema de login e siga as regras do Sauron".
227
- 6. A IA lê a arquitetura, escreve o código do login e, seguindo o "Write Obligation", cria o arquivo `.sauron/wiki/auth-rules.md`.
228
- 7. A IA atualiza automaticamente o `summary.json` mapeando a nova regra.
229
- 8. O usuário roda `sauron check` e recebe aprovação verde ("Tudo sincronizado").
230
- 9. O usuário roda `sauron map` e visualiza a nova estrutura mapeada no terminal.
231
-
232
- **Fluxo Alternativo (Correção de Erro de IA):**
233
- No passo 7, a IA esquece de atualizar o `summary.json`. No passo 8, o `sauron check` falha e exibe erro vermelho: "Arquivo órfão: auth-rules.md". O desenvolvedor pede para a IA: "Você esqueceu de mapear no JSON, conserte". A IA atualiza o JSON. O usuário roda `check` novamente, agora com sucesso.
234
-
235
- **Tabela de Edge Cases (Casos de Fronteira):**
236
-
237
- | Situação | Comportamento Esperado | Mensagem ao Usuário | Ação do Sistema |
238
- | :--- | :--- | :--- | :--- |
239
- | Rodar `init` em pasta sem permissão de escrita | CLI captura erro do File System. | "Erro: Permissão negada para gravar no diretório." | Aborta processo, Exit Code 1. |
240
- | Rodar `check` e o `summary.json` tem sintaxe inválida (malformado pela IA) | Parser falha de forma controlada, identificando a linha do erro. | "Falha crítica: summary.json possui sintaxe inválida na linha X." | Aborta o check imediatamente. |
241
- | Arquivo `.md` listado no JSON foi deletado fisicamente | Inconsistência apontada no check. | "Erro: Arquivo [nome] listado no JSON não existe." | Marca o check como falho. |
242
- | Tech Lead tenta aprovar regra no Mobile sem internet | App detecta estado offline da rede local. | "Sem conexão. Tente novamente mais tarde." | Salva aprovação pendente no cache local (Queue). |
243
- | Usuário com assinatura bloqueada tenta sincronizar CLI (`sauron push`) | Rejeição no servidor e no CLI local. | "Sincronização falhou. Assinatura Cloud inativa." | Bloqueia webhook HTTP 403 Forbidden. |
244
- | Usuário roda `map` num projeto gigante (+500 regras) | O comando paginará a exibição para não inundar o terminal. | "Mostrando regras 1-50 de 500. Pressione Espaço." | Ativa modo interativo de rolagem no terminal. |
245
-
246
- ---
247
-
248
- ### 9. REGRAS DE NEGÓCIO E LÓGICA
249
-
250
- - **Estados e Transições de Arquivos de Regra (Cloud/Mobile):**
251
- - *Draft Local:* Gerado pela IA, validado pelo CLI, mas não sincronizado.
252
- - *Em Revisão:* Sincronizado para a nuvem, aguardando aprovação do Tech Lead via Mobile.
253
- - *Aprovado (Ativo):* Aprovado via Web/Mobile, serve de "Single Source of Truth" incontestável.
254
- - *Obsoleto:* Substituído por nova versão arquitetural.
255
- - **Validações Críticas (Sauron Check):**
256
- - O campo `id` no JSON deve ser único. Duplicações acionam erro fatal.
257
- - O campo `type` deve pertencer ao enum: `["knowledge", "modules", "standards", "core_standard"]`.
258
- - **Regras de Acesso por Assinatura (Módulo SaaS):**
259
- - *Plano OSS (Free):* Apenas comandos locais. Arquivos guardados na máquina/Git do usuário.
260
- - *Plano Pro (SaaS):* Desbloqueia autenticação via Web, visualização de painéis e uso do Mobile App. Limite de 5 membros.
261
- - **Lógica de Permissões Multiplataforma:**
262
- - `Admin`: Edita assinaturas, aprova regras no app Mobile.
263
- - `Developer`: Roda CLI, sincroniza para revisão, visualiza painéis no Web, mas não aprova Core Standards.
264
-
265
- ---
266
-
267
- ### 10. INTEGRAÇÕES E DEPENDÊNCIAS
268
-
269
- | Serviço | Finalidade | Obrigatório para MVP? | Risco de Dependência | Fallback se indisponível | Versão / Endpoint |
270
- | :--- | :--- | :--- | :--- | :--- | :--- |
271
- | **Node FS API** | Manipulação de arquivos, escrita local do JSON e Markdown | Sim | Baixo (nativo) | N/A (crítico) | Nativo Node 18+ |
272
- | **Agentes de IA (Cursor/Windsurf)** | Execução real do projeto e documentação | Sim (passivo) | Médio (mudanças no prompt engine deles) | Uso de outro LLM via terminal | N/A |
273
- | **Stripe API** | Processamento de pagamento e assinaturas (SaaS) | Não (Apenas V2/SaaS) | Médio | Cobrança manual via invoice | `v1/checkout/sessions` |
274
- | **Expo / React Native** | Build do Mobile App de notificações/aprovações | Não (Apenas V2/SaaS) | Baixo | Acessar Dashboard Responsivo Web | SDK 50+ |
275
- | **GitHub OAuth** | Autenticação para Web Dashboard Cloud | Não (Apenas V2/SaaS) | Baixo | Autenticação por Magic Link (Email) | OAuth 2.0 / Autorize |
276
-
277
- ---
278
-
279
- ### 11. ARQUITETURA DE DADOS (HIGH-LEVEL)
280
-
281
- **Entidades Principais:**
282
- - **Summary (JSON):**
283
- - `version` (String)
284
- - `last_updated` (Timestamp)
285
- - `domains` (Array of Object References)
286
- - **Domain (JSON/Lógico):**
287
- - `id` (UUID)
288
- - `name` (String)
289
- - `files` (Array of Markdown Files)
290
- - **File / Rule (Markdown Físico):**
291
- - `slug` (String, ex: "auth-rules")
292
- - `content` (Text, armazenado localmente e mapeado via nuvem na V2)
293
- - **UserAccount (DB Nuvem):**
294
- - `uuid` (UUID)
295
- - `email` (String, Sensível)
296
- - `plan` (Enum: Free, Pro)
297
- - `role` (Enum: Admin, Developer)
298
-
299
- **Estratégia de Banco de Dados:**
300
- - *CLI (V1):* Totalmente local (Relacional em JSON File System). Nenhuma dependência externa.
301
- - *Web/Mobile (SaaS V2):* PostgreSQL relacional (hospedado na AWS/Supabase) para armazenar usuários, permissões, logs de sincronização e assinaturas. Cache via Redis para listagem rápida de árvores (`sauron map` via Web).
302
-
303
- **Dados Sensíveis e Proteção:**
304
- Os arquivos de código e memória das empresas não devem vazar. No plano Cloud (SaaS), o conteúdo em Markdown enviado pelas APIs de sincronização será encriptado at-rest utilizando chaves KMS geradas por usuário (E2E Encryption Strategy), garantindo soberania dos dados do cliente.
305
-
306
- ---
307
-
308
- ### 12. DIRETRIZES DE UX/UI
309
-
310
- **Princípios de Design:**
311
- 1. *Terminal-First Elegance:* A interface de CLI deve ser limpa, com uso sutil de cores para guiar o usuário sem poluir o log.
312
- 2. *Clareza Determinística:* Se houver erro, a ferramenta deve apontar exatamente a linha e o arquivo (Fail loudly and clearly).
313
- 3. *Single Pane of Glass:* O Dashboard Web deve permitir visualização da topologia do cérebro da aplicação em uma única tela.
314
- 4. *Fricção Intencional:* No Mobile App, aprovações críticas (mudança de regras core) exigem duplo clique ou "swipe-to-approve" para evitar aprovações acidentais.
315
-
316
- **Estados Críticos da UI:**
317
- - *Empty State (CLI):* Ao rodar `map` vazio, terminal retorna em amarelo: `[Sauron] O cérebro está vazio. Peça para a IA criar as primeiras memórias.`
318
- - *Loading (Web):* Skeleton screens reproduzindo a árvore de arquivos enquanto a API Cloud busca o `summary.json` em nuvem.
319
- - *Erro (Mobile):* Modal vermelho se falha a sincronização, com botão de "Retry Network".
320
- - *Sucesso (CLI):* Texto em negrito e verde vivo utilizando `chalk.green.bold()`.
321
-
322
- **Tom de Voz e Microcopy:**
323
- - *Perfil:* Assertivo, cirúrgico, assistente confiável ("Lobo frontal").
324
- - *Exemplo de Erro:* "Erro fatal: Encontramos um arquivo fantasma. `database-rules.md` existe, mas não está no `summary.json`."
325
-
326
- **Distinção de Experiência entre Plataformas:**
327
- - *CLI:* Foco total no desenvolvedor, ações de terminal, respostas textuais.
328
- - *Web:* Foco na topologia e overview gerencial, gráficos de saúde da documentação.
329
- - *Mobile:* Interface simplificada estilo "Tinder de Code Review" — aprova ou rejeita regras alteradas pelas IAs em tempo real.
330
-
331
- ---
332
-
333
- ### 13. RISCOS, PREMISSAS E MITIGAÇÕES
334
-
335
- | Risco | Categoria | Probabilidade | Impacto | Mitigação | Responsável |
336
- | :--- | :--- | :--- | :--- | :--- | :--- |
337
- | **Alucinação da IA corrompendo o JSON** | Técnico | Alta | Alto | O comando `sauron check` fará validação rígida, impedindo sincronizações defeituosas. | [PENDENTE: Eng. Principal] |
338
- | **Adoção pelo Usuário (Baixa adesão à disciplina de Write)** | Negócio | Média | Alto | Criar templates perfeitos (`memory.md`, `skill.md`) injetados via `init` que "forçam" a IA a respeitar a estrutura. | [PENDENTE: PM / UX] |
339
- | **Mudança na Política/API de Terceiros (IDE Agents)** | Técnico | Baixa | Médio | Como a infraestrutura é passiva e baseada em Markdown, o risco é baixo. Arquivos `.md` são padrões universais. | [PENDENTE: Arquiteto] |
340
- | **Resistência ao modelo SaaS Web/Mobile por Tech Leads** | Negócio | Alta | Médio | Focar na fase MVP Open Source para Indie Hackers. Quando a tração orgânica vier, o up-sell para o time corporativo será natural. | [PENDENTE: Growth/Vendas] |
341
- | **Risco Regulatório e Privacidade de Dados (SaaS Cloud)** | Operacional | Baixa | Alto | Adotar estratégia "Bring Your Own Database (Adapters)" ou garantir criptografia E2E na sincronização da Nuvem Oficial. | [PENDENTE: Legal/Security] |
342
- | **Dificuldade na Aprovação App Mobile nas Lojas (Apple/Google)** | Operacional | Baixa | Baixo | Preparar os termos de serviço focados em B2B e prever Web App (PWA) como fallback provisório. | [PENDENTE: Mobile Dev] |
343
-
344
- ---
345
-
346
- ### 14. ROADMAP E FASES DE ENTREGA
347
-
348
- | Feature / Módulo | Tamanho | Prioridade (MoSCoW) | Dependências |
349
- | :--- | :--- | :--- | :--- |
350
- | **Fase 1: MVP CLI (Open Source V1)** |
351
- | Ejeção de Estrutura (`sauron init`) | S | Must Have | Setup inicial do Tsup/Commander |
352
- | Auditoria de Integridade (`sauron check`) | M | Must Have | `init` funcional |
353
- | Visão Hierárquica (`sauron map`) | M | Should Have | `check` e `init` |
354
- | **Fase 2: Expansão Cloud & SaaS (V2)** |
355
- | Web Dashboard (Criação/Monitoramento) | XL | Must Have | Backend / API REST em nuvem |
356
- | Motor de Assinaturas (Stripe) | L | Must Have | Dashboard Web criado |
357
- | API de Adapters / Sincronização Local-Nuvem| L | Should Have | Web Dashboard operante |
358
- | **Fase 3: Mobile & Governança de Squads (V3)**|
359
- | App Mobile Native (Aprovações push) | XL | Could Have | API Cloud / Adapters |
360
- | Lock System de Arquivos (Governança) | L | Must Have | App Mobile operante |
361
-
362
- ---
363
-
364
- ### 15. CRITÉRIOS DE ACEITAÇÃO E DOD
365
-
366
- **Definition of Done (DoD) Geral do Projeto:**
367
- - [ ] O código passou em lint, formatação e verificação de tipagem estática (TypeScript strict mode).
368
- - [ ] Testes unitários (Jest/Vitest) cobrem ao menos 80% dos parsers e validadores do CLI.
369
- - [ ] As 3 features críticas possuem testes de cenário feliz, alternativo e falha documentados.
370
- - [ ] O comando `npx sauron-cli` pode ser executado globalmente sem erros de permissionamento no SO.
371
- - [ ] A interface CLI retorna mensagens claras de sucesso e erro ao usuário.
372
- - [ ] As variáveis de ambiente SaaS (Web/Mobile) estão devidamente encriptadas.
373
- - [ ] Documentação do README do Open Source está revisada, instruindo como instalar.
374
- - [ ] O Release está publicado via pipeline automatizada (GitHub Actions para NPM, Vercel para Web).
375
-
376
- **Cenários de Teste para Feature Crítica (`sauron check`):**
377
- - *Cenário Feliz:* Rode o `check` num projeto perfeito. A validação deve retornar verde e demorar < 50ms.
378
- - *Cenário Alternativo:* Adicione manualmente um novo domínio no JSON com lista vazia de arquivos. O `check` deve alertar "Domínio vazio detectado", mas não deve quebrar/falhar com exit code 1 (warning, not error).
379
- - *Cenário de Erro:* Remova uma aspa dupla do arquivo `summary.json`. O parser JSON nativo lançará erro. O Sauron deve capturá-lo e imprimir de forma elegante no console em vez de vomitar um stack trace ilegível do Node.js.
380
-
381
- ---
382
-
383
- ### 16. PLANO DE LANÇAMENTO
384
-
385
- **Fases de Lançamento:**
386
- 1. **Alpha Fechado (Solo Founder & IAs):** O fundador utilizará a CLI nos seus próprios projetos de laboratório durante 1 semana.
387
- - *Go/No-go:* Se a IA alucinar as regras ou quebrar o JSON mais de 3 vezes por semana, retorna para revisão de prompt.
388
- 2. **Beta Aberto (Comunidade Indie Hacker):** Divulgação no X (Twitter) e Product Hunt do pacote via NPM (`npx sauron-cli`).
389
- - *Critério:* Chegar a 1.000 instalações. Feedback intensivo de dev solos focados no modelo Open Source.
390
- 3. **Lançamento SaaS Phase (Fase 2 - Web Dashboard):** Abertura do modelo de monetização com Early-bird pricing.
391
- - *Onboarding:* E-mails educacionais para a base do pacote NPM mostrando os benefícios do sincronismo em nuvem.
392
- 4. **General Availability (GA Mobile - Fase 3):** App chega às lojas oficiais (App Store / Play Store) direcionando marketing para Tech Leads e empresas B2B.
393
-
394
- **Métricas de Adoção Inicial:**
395
- Monitorar retenção do pacote NPM no primeiro mês de uso (se os usuários continuam rodando `sauron check` semanas após a instalação, provando o valor a longo prazo).
396
-
397
- ---
398
-
399
- ### GLOSSÁRIO
400
-
401
- 1. **Amnésia de Contexto:** Limitação dos agentes de IA em recordar decisões de negócio passadas durante sessões prolongadas de desenvolvimento.
402
- 2. **Context Window:** O limite numérico de tokens (palavras/caracteres) que uma Inteligência Artificial consegue processar em um único prompt.
403
- 3. **Vibe Coding:** Paradigma moderno de desenvolvimento onde o humano apenas escreve prompts e orquestra, enquanto a IA escreve e compila todo o código.
404
- 4. **Write Obligation:** Conceito central do Sauron onde a IA é arquiteturalmente forçada a documentar ativamente regras no projeto (escrever memórias), e não apenas ler repositórios.
405
- 5. **LLM (Large Language Model):** Modelo de linguagem de grande escala (ex: GPT-4, Claude 3) que alimenta os agentes de código.
406
- 6. **Agente Executável:** Ferramentas de IA (como Aider e Devin) que tomam ações ativas no terminal e alteram o código diretamente.
407
- 7. **Lobo Frontal:** Metáfora anatômica utilizada para descrever o Sauron CLI; a área cerebral responsável pela tomada de decisão, comportamento padrão e memória de longo prazo das IAs.
408
- 8. **Single Source of Truth (SSOT):** Prática de estruturar dados/regras de forma que exista um único ponto de referência confiável.
409
- 9. **Sauron Adapters:** Scripts ou conectores open-source que permitirão ligar os dados locais do CLI a bancos de dados externos (SaaS/Cloud).
410
- 10. **MoSCoW:** Técnica de priorização de requisitos (Must, Should, Could, Won't have).
411
-
412
- ---
413
-
414
- ### APÊNDICE
415
-
416
- **Perguntas Abertas para o Time:**
417
- 1. O parser do comando `check` deve usar validações restritas via Zod no TypeScript, ou deixaremos a lógica customizada para garantir performance máxima sem dependências extras?
418
- 2. Para o fluxo do "Sauron Cloud / Web Dashboard", como garantiremos a criptografia ponta a ponta sem onerar a experiência de busca no banco PostgreSQL?
419
- 3. O modelo de assinatura (Stripe) deve cobrar um valor base pelo "Team Workspace" + taxa por usuário adicional, ou ser flat-rate na V1 do SaaS?
420
- 4. A injeção das pastas e templates via `sauron init` sobrescreverá arquivos com nomes similares (risco destrutivo), ou irá dar append seguro? Precisamos decidir o comportamento do Merge.
421
- 5. Como os Agentes vão lidar com limites rigorosos de rate-limiting (tokens) ao ler uma estrutura de "Memórias" que começar a ultrapassar 50+ arquivos Markdown? Teremos um sistema de auto-compressão no roadmap futuro?
422
-
423
- **Referências:**
424
- - Documentação do Commander.js: `https://github.com/tj/commander.js/`
425
- - Arquiteturas de Vibe Coding & Context Management (Pesquisas em IA e Repomix).
426
- - Padrões WCAG 2.1 para o Dashboard Web.
427
-
428
- **Histórico de Versões:**
429
- - *v1.0:* Criação do PRD cobrindo Core CLI, Injeção multiplataforma (Web/Mobile) e Módulo de Monetização. Elaborado pelo Product Manager Senior (IA).
@@ -1,62 +0,0 @@
1
- # Plano de Implementação: Sauron CLI
2
-
3
- Este é o plano detalhado de construção técnica do framework Sauron CLI. Ao iniciar um novo projeto, entregue este plano para o seu agente de IA para que ele possa executar a construção em 5 fases.
4
-
5
- ## Fase 1: Setup do Repositório
6
- **Objetivo:** Inicializar o projeto Node.js e instalar o maquinário do CLI.
7
-
8
- 1. Inicialize um pacote Node.js (`npm init -y`).
9
- 2. Defina o campo `"bin": { "sauron": "./dist/index.js" }` e `"type": "module"` no `package.json`.
10
- 3. Instale as dependências essenciais:
11
- - `npm install commander fs-extra picocolors`
12
- - `npm install -D typescript @types/node @types/fs-extra tsup`
13
- 4. Crie o arquivo `tsconfig.json` básico.
14
- 5. Crie um script no `package.json`: `"build": "tsup src/index.ts --format esm --clean"`.
15
-
16
- ## Fase 2: Construção dos Templates (O Coração)
17
- **Objetivo:** Criar a pasta que armazena as réplicas exatas do sistema Sauron que serão ejetadas nas máquinas dos usuários.
18
-
19
- Crie fisicamente a seguinte estrutura no diretório `templates/`:
20
- ```plaintext
21
- templates/
22
- ├── .agents/
23
- │ ├── rules/
24
- │ │ └── memory.md (Conteúdo que orienta a IA a ler o Sauron)
25
- │ └── skills/
26
- │ └── wiki/
27
- │ └── SKILL.md (Conteúdo da Write Obligation / Regra do Sauron)
28
- └── .sauron/
29
- └── wiki/
30
- ├── summary.json (Arquivo inicial de mapa vazio)
31
- ├── history/
32
- ├── knowledge/
33
- ├── manuals/
34
- ├── modules/
35
- └── standards/
36
- ```
37
-
38
- ## Fase 3: Desenvolvimento do Core CLI (`src/index.ts`)
39
- **Objetivo:** Criar a porta de entrada que escuta o comando do usuário.
40
-
41
- 1. Crie a pasta `src/` e o arquivo `index.ts`.
42
- 2. Adicione a shebang line no topo de `index.ts`: `#!/usr/bin/env node`.
43
- 3. Configure o `commander` para iniciar o programa, declarando nome, versão e descrição.
44
- 4. Registre o comando primário: `program.command('init').description('Inicializa o Sauron Memory System no projeto atual').action(runInit)`.
45
-
46
- ## Fase 4: Lógica do Comando Init (`src/commands/init.ts`)
47
- **Objetivo:** O motor que vai copiar os templates.
48
-
49
- 1. Identifique o diretório de execução do usuário usando `process.cwd()`.
50
- 2. Identifique onde os templates do CLI estão localizados localmente usando `__dirname` e caminhos relativos (cuidado com as diferenças de pathing no momento em que o código vira bundle pelo `tsup`).
51
- 3. Verifique com `fs-extra.pathExists` se `.sauron` ou `.agents` já existem no destino. Se sim, logue um aviso colorido com `picocolors` sugerindo cuidado ou pulando etapas não-destrutivas.
52
- 4. Execute `fs-extra.copy()` para ejetar `templates/.agents/` e `templates/.sauron/` para o `process.cwd()`.
53
- 5. Exiba mensagens visuais de sucesso indicando que a memória da IA está instalada.
54
-
55
- ## Fase 5: Build, Teste e Deploy
56
- **Objetivo:** Empacotar e preparar para NPM.
57
-
58
- 1. Rode `npm run build`. O `tsup` deverá gerar a pasta `dist/` com o binário minificado.
59
- 2. Na raiz do projeto CLI, rode `npm link` para testar o binário globalmente no sistema local.
60
- 3. Crie uma pasta vazia aleatória e rode `sauron init` para atestar que os templates são injetados.
61
- 4. Adicione um arquivo `.npmignore` garantindo que os `templates/` e `dist/` não fiquem de fora da publicação (cuidado, `dist` costuma ficar no `.gitignore`).
62
- 5. (Final) Para a distribuição global, rode `npm login` seguido de `npm publish --access public`.