sauron-cli 1.4.1 → 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.
@@ -1,45 +0,0 @@
1
- # Prompt: Evolução do Onboarding e Scanner de Projeto no Sauron CLI
2
-
3
- ```
4
- Estou desenvolvendo o Sauron CLI, um framework de persistência de contexto e governança de memória de IA no repositório. O fluxo atual de inicialização ('sauron init') depende de um onboarding interativo que faz quatro perguntas manuais de texto ao desenvolvedor: qual(is) IA(s) usará, severidade das regras, contexto do projeto e stack tecnológica.
5
-
6
- Quero evoluir esse onboarding para um modelo de "Smart Onboarding e Project Scanner". Em vez de forçar o usuário a digitar tudo manualmente, a CLI deve escanear a estrutura física do repositório antes de exibir os prompts interativos, sugerindo automaticamente as tecnologias detectadas e gerando as primeiras documentações contextuais da wiki baseadas nessa detecção.
7
-
8
- Stack Técnica:
9
- - Node.js (ESM)
10
- - TypeScript 5
11
- - @clack/prompts para UI interativa
12
- - fs-extra para leitura e varredura do disco
13
-
14
- Atualmente, o onboarding coleta dados de forma totalmente manual no arquivo de entrypoint:
15
-
16
- ```typescript
17
- // src/features/init/init.command.ts
18
- let aiTargets = ['Cursor', 'Windsurf', 'Aider', 'Antigravity'];
19
- let severity = 'Observacional';
20
- let projectContext = 'Projeto Genérico';
21
- let projectStack = 'Node.js, TypeScript';
22
-
23
- if (session.interactive) {
24
- const config = await p.group({
25
- targets: () => p.multiselect({ message: 'Qual(is) IA(s)...', options: [...] }),
26
- severity: () => p.select({ message: 'Qual o nível...', options: [...] }),
27
- context: () => p.text({ message: 'Descreva brevemente o contexto...', defaultValue: 'Projeto Genérico' }),
28
- stack: () => p.text({ message: 'Qual a stack tecnológica...', defaultValue: 'Node.js, TypeScript' }),
29
- });
30
- aiTargets = config.targets;
31
- severity = config.severity;
32
- projectContext = config.context;
33
- projectStack = config.stack;
34
- }
35
- ```
36
-
37
- Quero ideias, arquitetura e soluções técnicas para os seguintes desafios:
38
-
39
- 1. **Varredura e Mapeamento de Dependências (Scanner)**: Como estruturar de forma performática a leitura e análise de arquivos comuns de configuração (como package.json, tsconfig.json, next.config.js, compose.yml, requirements.txt, gemini.config, etc.) para inferir a linguagem principal, frameworks frontend/backend, bancos de dados, estilizações e provedores de nuvem?
40
- 2. **Design de UI Sem Fricção**: Como pré-modular e apresentar as informações encontradas pelo scanner nos prompts do @clack/prompts, de forma que o usuário apenas confirme ou ajuste as tecnologias inferidas em vez de digitá-las do zero?
41
- 3. **Bootstrapping Inteligente de Wiki**: Como a CLI pode utilizar as informações detectadas da stack para gerar dinamicamente arquivos iniciais de diretrizes na wiki (.sauron/wiki/standards/ e .sauron/wiki/modules/) adaptados àquela stack específica (ex: injetar um modelo de manual técnico do Firebase se detectar o Firebase, ou guias de estilo de Tailwind se encontrar o Tailwind)?
42
- 4. **Resiliência e Execução Rápida**: Qual a melhor estratégia arquitetural para o scanner operar sem degradar o tempo de inicialização da CLI, lidando graciosamente com repositórios gigantescos ou com dependências desatualizadas?
43
-
44
- Desenhe a arquitetura técnica dessa camada de escaneamento, especifique os algoritmos de detecção baseados no sistema de arquivos e forneça exemplos de código do serviço do Scanner adaptados para TypeScript.
45
- ```
@@ -1,20 +0,0 @@
1
- # Prompt: Inteligência de Atualização e Proteção de Memória no Sauron CLI
2
-
3
- ```markdown
4
- Estamos desenvolvendo o Sauron CLI, uma ferramenta de CLI em Node.js (TypeScript) que injeta regras de governança e memória arquitetural em repositórios para otimizar o uso de IAs (Cursor, Windsurf, Aider).
5
-
6
- Stack: Node.js, TypeScript, commander, @clack/prompts.
7
-
8
- Atualmente, temos o comando `sauron init`, que executa um onboarding interativo com o usuário (perguntando as IAs que serão usadas, severidade das regras, contexto do projeto e stack tecnológica). Após coletar essas respostas, ele gera os arquivos de manifesto (`AGENTS.md`, `.sauron/.manifest.json` e a pasta `.agents/`).
9
-
10
- O problema atual:
11
- Quando o usuário roda `npx sauron-cli@latest init` para **atualizar** o Sauron em um projeto existente, a CLI refaz todas as perguntas do onboarding inicial do zero, ignorando as configurações que o usuário já respondeu na primeira instalação.
12
-
13
- O que precisamos:
14
- 1. **Detecção de Instalação Existente**: Antes de iniciar o onboarding do `@clack/prompts`, a CLI deve verificar se o `.sauron/.manifest.json` (ou `AGENTS.md`) já existe.
15
- 2. **Reaproveitamento de Respostas**: Se existir, extrair os dados antigos (aiTargets, severity, projectContext, projectStack) e usá-los como `initialValue` nas perguntas do clack.
16
- 3. **Opção de Bypass (Fast-track)**: Melhor ainda seria perguntar "Detectamos uma instalação anterior. Deseja manter as configurações atuais e pular o onboarding? (y/n)". Se 'y', pular as perguntas e apenas re-injetar os arquivos principais atualizados.
17
- 4. **Proteção Rigorosa da Memória**: Garantir que a lógica de atualização **nunca** apague, sobrescreva ou modifique arquivos de documentação criados pelo usuário/IA dentro das subpastas de `.sauron/wiki/` (ex: `knowledge/`, `history/`, `modules/`). A atualização só pode atuar sobre a pasta `.agents/`, `AGENTS.md` e os arquivos base de configuração que vêm nos templates.
18
-
19
- Como podemos implementar essa inteligência no nosso comando de init (provavelmente refatorando o `init.command.ts` e o fluxo do `init.service.ts`) de forma elegante, garantindo a idempotência e segurança absoluta dos dados da Wiki?
20
- ```
@@ -1,106 +0,0 @@
1
- # Prompt: Evolução Arquitetural do Sauron CLI inspirada no OpenSpec
2
-
3
- ```
4
- Estou desenvolvendo o Sauron CLI, um framework de governança e persistência de memória para assistentes de IA (Cursor, Windsurf, Aider, Antigravity) rodando localmente no repositório. O Sauron ejeta regras (.agents/rules/memory.md) e templates de documentação (.sauron/wiki/) e força a IA a documentar continuamente decisões arquiteturais e mudanças de negócio (Write Obligation).
5
-
6
- Quero evoluir a arquitetura do Sauron CLI e torná-lo mais resiliente, sólido e profissional. Para isso, estou analisando a estrutura do OpenSpec (uma ferramenta de especificação iterativa e ágil). O OpenSpec possui um ciclo de vida robusto de workspaces (comandos como setup, link, relink, doctor, update, open) que interagem com diretórios globais de configuração e suportam fluxos interativos e não interativos (--json, --no-interactive).
7
-
8
- Stack Técnica:
9
- - Node.js (ESM)
10
- - TypeScript 5+
11
- - Commander.js para rotas CLI
12
- - Tsup para bundler
13
- - fs-extra e picocolors
14
- - @clack/prompts para fluxos interativos
15
- - diff para motor de merge de conflitos
16
-
17
- Atualmente, o Sauron CLI possui apenas o comando 'sauron init' estruturado da seguinte forma:
18
-
19
- ```typescript
20
- // src/index.ts
21
- #!/usr/bin/env node
22
- import { Command } from 'commander';
23
- import { runInitCommand } from './features/init/init.command.js';
24
-
25
- const program = new Command();
26
- program
27
- .name('sauron')
28
- .description('Sauron CLI - Framework para resolução de Amnésia de Contexto em IAs')
29
- .version('1.0.0');
30
-
31
- program
32
- .command('init')
33
- .description('Inicializa o Sauron Memory System no projeto atual')
34
- .option('-y, --yes', 'Pula os prompts interativos e usa os valores padrão (Não-interativo)')
35
- .action((options) => runInitCommand(options));
36
-
37
- program.parse();
38
- ```
39
-
40
- E no serviço de injeção ('init.service.ts'):
41
-
42
- ```typescript
43
- // src/features/init/init.service.ts
44
- import fs from 'fs-extra';
45
- import path from 'path';
46
- import { getManifest, saveManifest, generateHash } from '../../core/manifest.service.js';
47
- import { checkConflict } from '../../core/merge.service.js';
48
- import { generateAgentsMarkdown } from './templates.js';
49
-
50
- export class InitService {
51
- async execute(options: any, onConflict: any) {
52
- const { cwd, templatesDir } = options;
53
- const manifest = (await getManifest(cwd)) || { version: '1.0.0', files: {} };
54
-
55
- async function processDirectory(source: string, target: string) {
56
- if (!(await fs.pathExists(source))) return;
57
- const files = await fs.readdir(source);
58
- for (const file of files) {
59
- const sourcePath = path.join(source, file);
60
- const targetPath = path.join(target, file);
61
- const stat = await fs.stat(sourcePath);
62
-
63
- if (stat.isDirectory()) {
64
- await fs.ensureDir(targetPath);
65
- await processDirectory(sourcePath, targetPath);
66
- } else {
67
- const content = await fs.readFile(sourcePath, 'utf8');
68
- const relPath = path.relative(cwd, targetPath).replace(/\\/g, '/');
69
- let shouldWrite = true;
70
-
71
- if (await fs.pathExists(targetPath)) {
72
- const localContent = await fs.readFile(targetPath, 'utf8');
73
- const hasConflict = checkConflict(localContent, content, manifest.files[relPath]);
74
-
75
- if (hasConflict) {
76
- const decision = await onConflict(relPath, localContent, content);
77
- if (decision === 'ours') shouldWrite = false;
78
- }
79
- } else {
80
- await fs.ensureDir(path.dirname(targetPath));
81
- }
82
-
83
- if (shouldWrite) {
84
- await fs.writeFile(targetPath, content, 'utf8');
85
- }
86
- manifest.files[relPath] = generateHash(content);
87
- }
88
- }
89
- }
90
-
91
- await processDirectory(path.join(templatesDir, '.sauron'), path.join(cwd, '.sauron'));
92
- await processDirectory(path.join(templatesDir, '.agents'), path.join(cwd, '.agents'));
93
- // ... gera AGENTS.md e salva manifesto
94
- }
95
- }
96
- ```
97
-
98
- Comparando nosso design simplista de injeção direta local com a solidez do OpenSpec (que possui gerenciamento de múltiplos workspaces locais e links vinculados, auditoria automática de inconsistências via 'doctor' e atualização seletiva de ferramentas/skills instaladas):
99
-
100
- 1. Quais são as principais falhas ou limitações estruturais e de design do Sauron CLI em comparação com as práticas adotadas pelo OpenSpec?
101
- 2. Como podemos estender o Sauron CLI com comandos equivalentes a 'doctor' (para auditar a integridade das pastas .sauron/ e .agents/ e o summary.json) e 'uninstall' (para remoção limpa do Sauron preservando a wiki)?
102
- 3. Como reestruturar o core do Sauron CLI para dar suporte a modos programáticos (--json, --no-interactive) em todos os comandos futuros, facilitando o uso por scripts externos?
103
- 4. Que novas funcionalidades de integração com o ecossistema local do desenvolvedor (ex: escolher qual IDE/agente de IA deve consumir as regras) podemos herdar ou nos inspirar do OpenSpec para fortalecer o Sauron?
104
-
105
- Forneça uma análise arquitetural profunda, desenhe a nova estrutura de pastas sugerida para o projeto CLI, e proponha os schemas técnicos/exemplos de implementação dos novos comandos.
106
- ```
@@ -1,27 +0,0 @@
1
- name: CI
2
-
3
- on:
4
- push:
5
- branches: [ main ]
6
- pull_request:
7
- branches: [ main ]
8
-
9
- jobs:
10
- build-and-test:
11
- runs-on: ubuntu-latest
12
-
13
- steps:
14
- - name: Checkout repository
15
- uses: actions/checkout@v4
16
-
17
- - name: Setup Node.js
18
- uses: actions/setup-node@v4
19
- with:
20
- node-version: 20
21
- cache: 'npm'
22
-
23
- - name: Install dependencies
24
- run: npm ci
25
-
26
- - name: Run Build
27
- run: npm run build
@@ -1,7 +0,0 @@
1
- {
2
- "version": "1.0.0",
3
- "files": {
4
- ".agents/skills/wiki/SKILL.md": "8ce35d3ee8294f0883bb54e81d12948f6a4adc9fbde87c92cec91e58e9dd9a73",
5
- "AGENTS.md": "c9a63ca8bdd74bf396ad713d79fc21ab075d0c7051ec51ffdcc0cfd9a85777ee"
6
- }
7
- }
@@ -1,29 +0,0 @@
1
- # Implementação do Scanner Inteligente de Projetos e Receitas de Wiki
2
-
3
- ## O que foi feito
4
- - **Scanner Heurístico Superficial (`ProjectScanner`)**: Varredura assíncrona não bloqueante de nível superior na raiz do repositório (O(1)) filtrando cirurgicamente pastas gigantes (`node_modules`, `.git`) para extrair a stack de desenvolvimento, bancos de dados, IAs configuradas (Cursor, Windsurf, Aider, Antigravity) e gerenciadores de pacotes.
5
- - **Dicionário de Assinaturas Tecnológicas (`signatures.ts`)**: Mapeamento estruturado de tecnologias como TypeScript, Next.js, React, NestJS, Express, Prisma, PostgreSQL e Redis com base em dependências declaradas e arquivos marcadores físicos (ex. `compose.yml`).
6
- - **Geração Condicional de Documentação (`WikiBootstrapper`)**: Injeção automática e não destrutiva de guias e regras de estilo baseadas em prompts de IA para cada tecnologia identificada, armazenados na pasta de templates `templates/wiki-recipes/`.
7
- - **Governança Dinâmica da Wiki (`summary.json`)**: Registro automático das receitas injetadas com geração idempotente de UUIDs de KB, slugs, cálculo de tamanho em bytes (`contentLength`) e hash SHA-256 (`contentHash`).
8
- - **Polimento UX e Labor Illusion**: Delay artificial de 800ms em execução interativa que informa visualmente a varredura e pré-popula de forma inteligente os inputs de onboarding do `@clack/prompts`.
9
- - **Proteção a Arquivos Mutáveis**: Correção na governança do `.manifest.json` da CLI para excluir arquivos de evolução contínua (`.sauron/wiki/summary.json` e `.agents/rules/memory.md`), garantindo que o comando `sauron doctor` não reporte falsos alertas de modificação manual.
10
-
11
- ## Por que foi feito
12
- O onboarding inicial dependia de digitação manual cega por parte do desenvolvedor, gerando fricção. Além disso, a estrutura de wiki anterior injetava apenas estruturas vazias sem o know-how de desenvolvimento das ferramentas específicas do repositório, deixando o "Cérebro da IA" sem contexto especializado de melhores práticas sobre as tecnologias de eleição.
13
-
14
- ## Como funciona
15
- 1. **Varredura**: O `ProjectScanner` usa `fs.readdir` com `withFileTypes: true` para identificar arquivos marcadores (como `tsconfig.json`) e lê o `package.json` para testar assinaturas. Também analisa docker compose em busca de imagens de banco de dados.
16
- 2. **Onboarding**: No modo interativo, o spinner exibe a análise por 800ms, em seguida alimenta os inputs interativos usando as propriedades `initialValue`/`initialValues`.
17
- 3. **Injeção de Receitas**: O `WikiBootstrapper` copia as receitas de `templates/wiki-recipes/` aplicáveis para `.sauron/wiki/standards/` se o arquivo destino não existir, registrando a entrada correspondente no `summary.json`.
18
- 4. **Higiene do Doctor**: A CLI não inclui mais arquivos sob `.sauron/wiki/` ou `.agents/rules/memory.md` no `.manifest.json` para que edições orgânicas da equipe de desenvolvimento transcorram sem acionar alarmes de violação de integridade.
19
-
20
- ## Arquivos afetados
21
- - [src/core/scanner/signatures.ts](file:///F:/Projetos/sauron-cli/src/core/scanner/signatures.ts)
22
- - [src/core/scanner/project-scanner.ts](file:///F:/Projetos/sauron-cli/src/core/scanner/project-scanner.ts)
23
- - [src/core/wiki/wiki-bootstrapper.ts](file:///F:/Projetos/sauron-cli/src/core/wiki/wiki-bootstrapper.ts)
24
- - [src/features/init/init.command.ts](file:///F:/Projetos/sauron-cli/src/features/init/init.command.ts)
25
- - [src/features/init/init.service.ts](file:///F:/Projetos/sauron-cli/src/features/init/init.service.ts)
26
- - [templates/wiki-recipes/](file:///F:/Projetos/sauron-cli/templates/wiki-recipes/) (diretório de regras Markdown)
27
-
28
- ## Data
29
- 2026-06-06T20:56:00-03:00
@@ -1,29 +0,0 @@
1
- # Reestruturação Arquitetural do Core: De Monolito a Framework Desacoplado
2
-
3
- ## O que foi feito
4
- - Implementação de um fluxo de controle de E/S e visualização desacoplado utilizando o padrão de projeto Strategy.
5
- - Criação dos novos comandos de ciclo de vida do Sauron CLI:
6
- - `sauron doctor`: Inspeciona a integridade criptográfica SHA-256 e de conformidade do projeto.
7
- - `sauron uninstall`: Desvincula as configurações do Sauron, com remoção cirúrgica de regras injetadas e degradação graciosa da wiki (preservada por padrão).
8
- - Implementação de um Registro Global Central (`~/.sauron/registry.json`) para rastreabilidade de múltiplos projetos sob a jurisdição do Sauron.
9
- - Desenvolvimento de adaptadores específicos de IAs (`CursorAdapter`, `WindsurfAdapter`, `AiderAdapter`, `AntigravityAdapter`) para injeção e higiene nativas dos arquivos das IDEs (.mdc, .windsurfrules, etc.).
10
- - Suporte nativo a modos programáticos (`--json`, `--no-interactive`) em todos os comandos, evitando travamentos em pipelines.
11
-
12
- ## Por que foi feito
13
- A versão anterior possuía um acoplamento rígido de entrada e saída com a lógica central de injeção, impedindo a sua automação por agentes autônomos ou processos de CI/CD (pois os prompts interativos causavam travamentos perpétuos se conflitos surgissem). Além disso, a injeção estática e agnóstica não atendia aos formatos de configuração específicos de cada IDE/IA moderna.
14
-
15
- ## Como funciona
16
- 1. **Contexto de Sessão e PresentationDriver**: O roteador decide qual driver (Terminal ou JSON) instanciar baseado nas flags globais da CLI. Se o modo for não-interativo e surgir um conflito de arquivos, o driver resolve o conflito com a estratégia fornecida via `--conflict <ours|theirs>` ou gera um erro imediato.
17
- 2. **Padrão Adaptador**: Cada IA alvo possui um adaptador concreto. Para o Cursor, injeta regras em `.cursor/rules/sauron-memory.mdc` com frontmatter YAML. Para o Windsurf, manipula cirurgicamente o arquivo compartilhado `.windsurfrules` isolando o bloco do Sauron com marcadores de âncora `# SAURON START` e `# SAURON END`, removidos no `uninstall`.
18
- 3. **Registry Central**: Armazena metadados essenciais de todos os projetos na máquina local.
19
-
20
- ## Arquivos afetados
21
- - Praticamente todo o código da CLI foi modularizado sob os novos diretórios:
22
- - [src/domain/](file:///F:/Projetos/sauron-cli/src/domain/) (entidades de sessão e interfaces de adaptador)
23
- - [src/presentation/](file:///F:/Projetos/sauron-cli/src/presentation/) (drivers concretos e roteamento)
24
- - [src/core/](file:///F:/Projetos/sauron-cli/src/core/) (registry global e adaptadores de agentes)
25
- - [src/features/](file:///F:/Projetos/sauron-cli/src/features/) (handlers dos comandos init, doctor e uninstall)
26
- - [src/index.ts](file:///F:/Projetos/sauron-cli/src/index.ts) (registro dos comandos commander)
27
-
28
- ## Data
29
- 2026-06-06T20:20:00-03:00
@@ -1,29 +0,0 @@
1
- # Resiliência no Caminho de Templates (Correção de Bug e Onboarding)
2
-
3
- ## O que foi feito
4
- - Análise de viabilidade e onboarding detalhado da arquitetura da Sauron CLI.
5
- - Correção de um bug na resolução do diretório de templates (`templatesDir`) em `src/features/init/init.command.ts`.
6
- - Inicialização do Sauron Memory System no próprio projeto `sauron-cli`.
7
-
8
- ## Por que foi feito
9
- Anteriormente, o comando `sauron init` assumia que o arquivo compilado estaria no mesmo nível relativo de diretórios do ambiente de desenvolvimento (dentro de `dist/features/init/init.command.js`). No entanto, o empacotamento com o `tsup` condensa toda a saída em um único bundle em `dist/index.js`, fazendo com que `__dirname` em tempo de execução aponte diretamente para `dist/`. Isso causava um retorno silencioso no processo de cópia de templates, deixando a pasta `.agents` e a wiki em `.sauron` inexistentes no diretório de destino do usuário.
10
-
11
- ## Como funciona
12
- A localização do diretório `templates` foi reformulada para ser resiliente e buscar em múltiplos níveis de diretório relativos a `__dirname`:
13
- 1. Verifica se `templates` existe um nível acima de `__dirname` (padrão de build em `dist/index.js`).
14
- 2. Se não existir, retrocede três níveis (padrão em ambiente de desenvolvimento rodando a partir de `src/features/init/init.command.ts`).
15
-
16
- ```typescript
17
- // src/features/init/init.command.ts
18
- let templatesDir = path.join(__dirname, '..', 'templates');
19
- if (!fs.existsSync(templatesDir)) {
20
- templatesDir = path.join(__dirname, '..', '..', '..', 'templates');
21
- }
22
- ```
23
-
24
- ## Arquivos afetados
25
- - [init.command.ts](file:///F:/Projetos/sauron-cli/src/features/init/init.command.ts)
26
- - [dist/index.js](file:///F:/Projetos/sauron-cli/dist/index.js) (Regerado pós-build)
27
-
28
- ## Data
29
- 2026-06-06T19:40:00-03:00
@@ -1,21 +0,0 @@
1
- # TypeScript - Diretrizes de Qualidade e Tipagem Estrita
2
-
3
- Este documento normatiza os padrões de tipagem e compilação para o uso do TypeScript no projeto.
4
-
5
- ## 🎯 Regras Obrigatórias para a IA
6
-
7
- 1. **Tipagem Estrita (Strict Mode)**:
8
- - Nunca utilizar `any` de forma deliberada. Se a tipagem for dinâmica ou desconhecida, prefira `unknown` e realize Type Guarding (assercões de tipo seguras).
9
- - Ative e respeite `noImplicitAny`, `strictNullChecks` e `noUnusedLocals`.
10
-
11
- 2. **Tipos vs Interfaces**:
12
- - Utilize `interface` para declarar contratos de objetos públicos, classes, e componentes expostos.
13
- - Utilize `type` para uniões (`|`), interseções (`&`), tuplas, tipos utilitários ou definições primitivas de alias.
14
-
15
- 3. **Importações Explicitas**:
16
- - Utilize imports com a extensão `.js` ao compilar para ECMAScript Modules (ESM) nativo no Node.js.
17
- - Prefira importações nomeadas em vez de imports coringa (`* as module`).
18
-
19
- ## 🚫 Práticas Banidas
20
- - Desativar checagens com comentários `// @ts-ignore` (use `// @ts-expect-error` apenas com justificativa explícita e em testes).
21
- - Asserções de tipo coercitivas (`as any` ou `as unknown as Type`).
@@ -1,81 +0,0 @@
1
- [
2
- {
3
- "type": "folder",
4
- "name": "History",
5
- "slug": "history",
6
- "path": "history",
7
- "id": "domain-history"
8
- },
9
- {
10
- "type": "file",
11
- "name": "Resiliência no Caminho de Templates",
12
- "slug": "resiliencia-no-caminho-de-templates",
13
- "path": "history/resiliencia-caminho-templates.md",
14
- "id": "kb-history-resilience-templates",
15
- "domainId": "domain-history",
16
- "orgId": "org-sauron-cli",
17
- "contentLength": 1815,
18
- "contentHash": "e5f4da0442923d13b2de447dcaff137de34f8b6f533dd3b95d5423b316a79313"
19
- },
20
- {
21
- "type": "file",
22
- "name": "Reestruturação Arquitetural do Core",
23
- "slug": "reestruturacao-arquitetural-do-core",
24
- "path": "history/reestruturacao-arquitetural-core.md",
25
- "id": "kb-history-rearchitecture-core",
26
- "domainId": "domain-history",
27
- "orgId": "org-sauron-cli",
28
- "contentLength": 2908,
29
- "contentHash": "6f2373af88c7347d556cbf747ca814397105336c3c434b7037d7aaa28163bb16"
30
- },
31
- {
32
- "type": "file",
33
- "name": "Scanner Inteligente e Receitas de Wiki",
34
- "slug": "implementacao-scanner-inteligente",
35
- "path": "history/implementacao-scanner-inteligente.md",
36
- "id": "kb-history-scanner-intel",
37
- "domainId": "domain-history",
38
- "orgId": "org-sauron-cli",
39
- "contentLength": 3712,
40
- "contentHash": "a73ef1a09456ad5a03fd3a41438ea8fc4850b8b6703e8b579c899777a073d692"
41
- },
42
- {
43
- "type": "folder",
44
- "name": "Knowledge",
45
- "slug": "knowledge",
46
- "path": "knowledge",
47
- "id": "domain-knowledge"
48
- },
49
- {
50
- "type": "folder",
51
- "name": "Manuals",
52
- "slug": "manuals",
53
- "path": "manuals",
54
- "id": "domain-manuals"
55
- },
56
- {
57
- "type": "folder",
58
- "name": "Modules",
59
- "slug": "modules",
60
- "path": "modules",
61
- "id": "domain-modules"
62
- },
63
- {
64
- "type": "folder",
65
- "name": "Standards",
66
- "slug": "standards",
67
- "path": "standards",
68
- "id": "domain-standards"
69
- },
70
- {
71
- "type": "file",
72
- "name": "TypeScript Guidelines",
73
- "slug": "typescript-rules",
74
- "path": "standards/typescript.rules.md",
75
- "id": "kb-standards-typescript",
76
- "domainId": "domain-standards",
77
- "orgId": "org-sauron-cli",
78
- "contentLength": 1182,
79
- "contentHash": "a52a45607902b2173261fcbeb18277d91211f8e4a9867762ac9a2477edec1021"
80
- }
81
- ]
package/.windsurfrules DELETED
@@ -1,160 +0,0 @@
1
- # SAURON END
2
-
3
-
4
-
5
- # SAURON END
6
-
7
- # SAURON END
8
-
9
- # SAURON START
10
- ---
11
- trigger: always_on
12
- ---
13
-
14
- # SAURON START
15
- ---
16
- trigger: always_on
17
- ---
18
-
19
- # SAURON START
20
- ---
21
- trigger: always_on
22
- ---
23
-
24
- # SAURON START
25
- ---
26
- trigger: always_on
27
- ---
28
-
29
- # Regra de Memória do Projeto (OBRIGATÓRIA)
30
-
31
- > Esta regra garante que o Wiki (`.sauron/wiki/`) é a fonte da verdade absoluta do projeto.
32
- > Violá-la significa perder informação crítica entre sessões.
33
-
34
- ---
35
-
36
- ## 1. LEITURA — Antes de Agir
37
-
38
- Sempre que algo for perguntado ou uma tarefa for iniciada:
39
-
40
- 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.
41
- 2. Navegue pelas sub-páginas relevantes usando as informações de nome original e tipo (file/folder) contidas no JSON.
42
- 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).
43
-
44
- ---
45
-
46
- ## 2. PROTOCOLO DE SINCRONIZAÇÃO (NUVEM)
47
-
48
- O fluxo de documentação segue um ciclo de três etapas para garantir a persistência:
49
-
50
- 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.
51
- 2. **EXECUÇÃO (IA)**: Durante o desenvolvimento, o Agente atualiza/cria os documentos em `.sauron/wiki/` em tempo real.
52
- 3. **PUSH (Manual)**: Ao finalizar a tarefa, o usuário executa `sauron push` para enviar as atualizações locais para a nuvem.
53
-
54
- > [!IMPORTANT]
55
- > 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.
56
-
57
- ---
58
-
59
- ## 3. ESCRITA — Depois de Entregar (CRÍTICO)
60
-
61
- **Após QUALQUER entrega funcional, a wiki DEVE ser atualizada NO MESEMO TURNO de resposta.**
62
-
63
- ### Gatilhos Obrigatórios de Escrita
64
-
65
- | Evento | Ação no Wiki |
66
- |--------|-------------|
67
- | **Integração de API externa** | Criar/atualizar página documentando URL, autenticação, payload, resposta e tratamento de erros. |
68
- | **Nova página/rota criada** | Registrar em `summary.json` (seguindo o **padrão rígido** da Seção 6) + criar arquivo `.md`. |
69
- | **Fluxo de autenticação alterado** | Atualizar a página de auth com o fluxo completo, incluindo cookies, tokens e middleware. |
70
- | **Novo componente de UI funcional** | Registrar na página do módulo correspondente com props, comportamento e dependências. |
71
- | **Decisão arquitetural tomada** | Documentar usando o formato "Decisão Arquitetural" (Problema → Opções → Escolha → Justificativa). |
72
- | **Variável de ambiente adicionada/alterada** | Registrar na página de infraestrutura com nome, propósito e exemplo. |
73
- | **Schema de banco alterado** | Atualizar `module-data-schema.md` com a mudança. |
74
- | **Bug crítico resolvido** | Registrar causa raiz e solução na página do módulo afetado. |
75
-
76
- ### Regra de Ouro
77
-
78
- ```
79
- ❌ ERRADO: Entregar código → Responder ao usuário → Esquecer o wiki
80
- ✅ CORRETO: Entregar código → Atualizar wiki → Responder ao usuário
81
- ```
82
-
83
- A atualização do wiki é **parte da entrega**, não um passo opcional posterior.
84
-
85
- ---
86
-
87
- ## 4. FORMATO — O que Escrever
88
-
89
- Cada registro deve conter no mínimo:
90
- - **O que foi feito** (descrição objetiva)
91
- - **Por que foi feito** (contexto e motivação)
92
- - **Como funciona** (detalhes técnicos: endpoints, payloads, fluxos)
93
- - **Arquivos afetados** (lista de caminhos)
94
- - **Data** (timestamp da alteração)
95
-
96
- ---
97
-
98
- ## 6. ESTRUTURA RÍGIDA DO SUMMARY.JSON
99
-
100
- 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.
101
-
102
- ### Regras de Ouro do Summary
103
- - **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.
104
- - **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).
105
- - **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.
106
- - **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.
107
- - **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.
108
-
109
- ### Schema Obrigatório
110
-
111
- O JSON deve ser um **array de objetos** seguindo rigorosamente estes formatos:
112
-
113
- #### Entrada de Pasta (Domínio)
114
- ```json
115
- {
116
- "type": "folder",
117
- "name": "Título Original",
118
- "slug": "titulo-original",
119
- "path": "titulo-original",
120
- "id": "id-do-dominio"
121
- }
122
- ```
123
-
124
- #### Entrada de Arquivo (Documento)
125
- ```json
126
- {
127
- "type": "file",
128
- "name": "Título Original do Documento",
129
- "slug": "titulo-original-do-documento",
130
- "path": "slug-do-dominio/titulo-original-do-documento.md",
131
- "id": "id-do-kb",
132
- "domainId": "id-do-dominio-pai",
133
- "orgId": "id-da-organizacao",
134
- "contentLength": 1234,
135
- "contentHash": "sha256-checksum"
136
- }
137
- ```
138
-
139
- ---
140
-
141
- ## 7. VALIDAÇÃO — Checklist Mental
142
-
143
- Antes de finalizar qualquer resposta que envolva código, pergunte-se:
144
-
145
- - [ ] Criei ou modifiquei um arquivo? → Wiki precisa saber.
146
- - [ ] Conectei a uma API externa? → Wiki precisa documentar.
147
- - [ ] Alterei fluxo de login/sessão? → Wiki MUST refletir.
148
- - [ ] Criei uma nova página/rota? → `summary.json` precisa do registro de roteamento seguindo o **padrão rígido**.
149
- - [ ] Tomei uma decisão técnica (lib X vs Y, abordagem A vs B)? → Wiki precisa da justificativa.
150
- - [ ] Adicionei/alterei uma variável de ambiente? → Wiki precisa do registro.
151
-
152
- Se qualquer checkbox for `true` e o wiki não foi atualizado, **a tarefa NÃO está completa**.
153
-
154
- # SAURON END
155
-
156
- # SAURON END
157
-
158
- # SAURON END
159
-
160
- # SAURON END