π Estrutura de Pastas Profissional
Neste modulo voce vai aprender a organizar o codigo de uma plataforma de agentes de forma que humanos naveguem com facilidade e IAs gerem codigo melhor. A estrutura de pastas e a primeira coisa que um novo desenvolvedor (ou um LLM) ve quando abre o projeto.
π§ Por que Estrutura Importa
A estrutura de pastas do seu projeto nao e estetica. E uma decisao de engenharia que afeta diretamente tres coisas: o tempo que um humano leva para encontrar algo, o tempo que um novo dev leva para contribuir, e a qualidade do codigo que uma IA gera quando tem acesso ao projeto.
Conceito Principal
Cognitive Load: Carga cognitiva e o esforco mental necessario para entender algo. Quando voce abre um projeto e ve 50 arquivos na raiz sem organizacao, seu cerebro gasta energia tentando classificar mentalmente o que cada arquivo faz. Isso e carga cognitiva desperdicada. Uma estrutura clara reduz essa carga porque a organizacao ja comunica a funcao de cada parte. Voce ve "agents/" e ja sabe onde estao os agentes. Ve "tools/" e sabe onde estao as ferramentas. Zero esforco mental.
Onboarding Time: O tempo que um novo desenvolvedor leva para fazer o primeiro commit produtivo. Em projetos bem estruturados, esse tempo e de horas. Em projetos mal organizados, pode ser dias ou semanas. A estrutura de pastas e o mapa do projeto. Se o mapa e claro, qualquer pessoa encontra o caminho. Se o mapa e confuso, ate gente experiente se perde.
AI Context: Quando voce usa Claude, Copilot ou qualquer LLM para gerar codigo, a IA usa a estrutura do projeto como contexto para suas decisoes. Se ela ve uma pasta agents/ com arquivos bem nomeados (claude.ts, ollama.ts), ela entende o padrao e gera um novo agente seguindo a mesma convencao. Se ela ve um amontoado de arquivos sem padrao, ela gera codigo que reflete essa bagunca. Boa estrutura funciona como um system prompt implicito para qualquer IA que toque o projeto.
O ponto central: a estrutura de pastas nao e sobre onde os arquivos ficam. E sobre como o conhecimento do projeto e comunicado. Para humanos, e legibilidade. Para IAs, e contexto. Para o time, e produtividade.
Dados e Pesquisa
Estudos de produtividade em engenharia de software (Google DORA Report, State of DevOps) mostram que desenvolvedores gastam entre 55% e 65% do tempo lendo e navegando codigo, nao escrevendo. Uma reducao de 20% no tempo de navegacao (alcancavel com boa estrutura) equivale a ganhar aproximadamente 1 hora por dia por desenvolvedor. Em times de 10 pessoas, sao 50 horas por semana de produtividade recuperada. Pesquisas da GitHub sobre AI-assisted coding mostram que ferramentas como Copilot geram codigo 30% mais preciso em repositorios com estrutura consistente comparado a projetos desorganizados.
Dica Pratica
Faca o teste do "5 segundos": mostre a arvore de pastas do seu projeto para alguem que nunca viu o codigo. Se em 5 segundos essa pessoa consegue dizer "e um bot de Telegram com multiplos agentes de IA", a estrutura esta funcionando. Se ela nao consegue, reorganize ate que a estrutura comunique o proposito do projeto sem precisar de explicacao.
Fazer
Definir a estrutura antes de escrever codigo. Usar nomes de pastas que descrevem funcao, nao tipo de arquivo. Manter no maximo 7-10 itens por diretorio (limite cognitivo humano). Documentar a estrutura no README com uma arvore simples.
Evitar
Ter mais de 15 arquivos na raiz do projeto. Criar pastas so porque "pode precisar depois" (YAGNI). Mudar a estrutura toda semana. Usar nomes de pastas diferentes do que a comunidade espera (nao invente "modules/" quando todo mundo usa "src/").
π’ Monorepo vs Multi-repo para IA
A decisao entre manter tudo num unico repositorio ou separar em multiplos repos afeta diretamente como a IA consegue entender e gerar codigo para o projeto. Cada abordagem tem vantagens claras dependendo do contexto.
Conceito Principal
Monorepo e manter todo o codigo num unico repositorio. O bot, o dashboard, os agentes, as ferramentas, os scripts de deploy. Tudo junto. A grande vantagem para plataformas de agentes e o contexto compartilhado. Quando voce pede para a IA "criar um novo agente", ela ve a pasta agents/ com todos os agentes existentes, ve as interfaces, ve como sao chamados pelo router, e gera codigo consistente. Num monorepo, a IA tem visao completa do sistema.
Quando Monorepo Ganha: Projetos com equipe de ate 10-15 pessoas. Componentes fortemente acoplados que mudam juntos (bot + dashboard + agentes). Quando voce quer que a IA tenha contexto total para gerar codigo. Quando mudancas em uma parte exigem mudancas em outra (mudar a interface de um agente requer atualizar o router). Monorepo permite fazer tudo num unico commit atomico.
Multi-repo e separar cada componente em seu proprio repositorio: um repo para o bot, outro para o dashboard, outro para cada agente independente. A vantagem e isolamento total. Cada repo tem seu CI/CD, suas dependencias, seu ciclo de deploy. Um bug no dashboard nao afeta o deploy do bot.
Quando Multi-repo Ganha: Times grandes (20+ pessoas) onde equipes diferentes cuidam de componentes diferentes. Componentes com ciclos de vida independentes (o dashboard muda toda semana, o bot muda todo mes). Quando voce precisa de isolamento forte de dependencias (o bot usa Node 18, o ML pipeline usa Python 3.11). Microsservicos com APIs bem definidas entre si.
Ferramentas de Monorepo: Turborepo (da Vercel, focado em velocidade de build), Nx (da Nrwl, focado em dependencias inteligentes), Lerna (classico, mais simples). Essas ferramentas resolvem o principal problema do monorepo: builds lentos. Elas detectam quais pacotes mudaram e buildam apenas o necessario. Um push que muda so o dashboard nao rebuilda o bot.
Dados e Pesquisa
Google mantem um dos maiores monorepos do mundo: mais de 2 bilhoes de linhas de codigo num unico repositorio. Meta, Microsoft e Uber tambem usam monorepos para seus produtos principais. Por outro lado, Netflix e Amazon preferem multi-repo com microsservicos independentes. Nao existe resposta universal. O Turborepo reporta reducao de 40-70% no tempo de build em monorepos grandes com caching remoto. Para plataformas de agentes em fase inicial (menos de 50k linhas de codigo), monorepo e quase sempre a escolha certa pela simplicidade e pelo contexto unificado que oferece a ferramentas de IA.
Dica Pratica
Comece com monorepo. Sempre. Quando (e se) a complexidade exigir separacao, migre componentes especificos para repos proprios. O custo de juntar repos depois e muito maior do que separar. Num monorepo, use workspaces do npm/pnpm para gerenciar pacotes internos com dependencias independentes. Adicione um turbo.json na raiz para que Turborepo saiba a ordem de build e quais tarefas podem rodar em paralelo.
Fazer
Usar monorepo para projetos novos ate que haja uma razao real para separar. Configurar workspaces (npm/pnpm) para pacotes internos. Adotar Turborepo ou Nx se o build ficar lento. Manter uma pasta packages/ para codigo compartilhado entre componentes.
Evitar
Separar em multi-repo antes de ter um motivo concreto. Ter dependencias circulares entre repos (bot importa do dashboard que importa do bot). Monorepo sem ferramenta de build incremental (build do zero toda vez). Manter repos separados que sempre deployam juntos (se deployam juntos, deviam ser um repo so).
ποΈ Clean Architecture Aplicada
Clean Architecture, proposta por Robert C. Martin (Uncle Bob), define regras claras sobre como as camadas do sistema devem depender umas das outras. Quando aplicada a plataformas de agentes, ela garante que o nucleo do sistema (a logica dos agentes) nunca depende de detalhes de infraestrutura.
Conceito Principal
O principio central da Clean Architecture e a Regra da Dependencia: dependencias de codigo so apontam para dentro, nunca para fora. A camada de dominio (regras de negocio) nao sabe que PostgreSQL existe. Nao sabe que Telegram existe. Nao sabe que OpenAI existe. Ela define interfaces (contratos), e as camadas externas implementam esses contratos.
Domain Layer (centro): Entidades e regras de negocio puras. Para uma plataforma de agentes: a interface Agent (recebe mensagem, retorna resposta), a interface Tool (recebe parametros, executa acao), as regras de roteamento (como decidir qual agente responde). Esse codigo nao importa nenhuma biblioteca externa. E TypeScript puro.
Application Layer: Casos de uso que orquestram o dominio. "Processar mensagem do usuario" e um caso de uso: recebe a mensagem, chama o router (dominio), seleciona o agente (dominio), executa (dominio), salva o historico (interface de persistencia). O caso de uso sabe a ordem das operacoes, mas nao sabe os detalhes de implementacao.
Infrastructure Layer (borda): Implementacoes concretas das interfaces do dominio. O adapter para Telegram que implementa a interface de "canal de entrada". O adapter para PostgreSQL que implementa a interface de "persistencia". O adapter para OpenAI que implementa a interface de "provedor de IA". Se amanha voce trocar PostgreSQL por MongoDB, so muda o adapter. O dominio e os casos de uso nao mudam uma linha.
Dependency Inversion: Em vez de o agente importar diretamente o modulo do OpenAI, o agente depende de uma interface AIProvider. Na inicializacao, voce injeta a implementacao concreta (OpenAIProvider, AnthropicProvider, OllamaProvider). Isso e inversao de dependencia na pratica: o codigo de alto nivel define o contrato, o codigo de baixo nivel implementa.
// domain/interfaces/ai-provider.ts
export interface AIProvider {
name: string;
generate(prompt: string, context: string): Promise<AIResponse>;
}
// domain/interfaces/message-store.ts
export interface MessageStore {
save(chatId: string, message: Message): Promise<void>;
getHistory(chatId: string, limit: number): Promise<Message[]>;
}
// infrastructure/providers/openai-provider.ts
import OpenAI from 'openai';
import { AIProvider, AIResponse } from '../../domain/interfaces/ai-provider';
export class OpenAIProvider implements AIProvider {
name = 'openai';
private client: OpenAI;
constructor(apiKey: string) {
this.client = new OpenAI({ apiKey });
}
async generate(prompt: string, context: string): Promise<AIResponse> {
const response = await this.client.chat.completions.create({
model: 'gpt-4',
messages: [{ role: 'system', content: context }, { role: 'user', content: prompt }],
});
return { text: response.choices[0].message.content, tokens: response.usage };
}
}
Dados e Pesquisa
Clean Architecture e Hexagonal Architecture (Ports and Adapters, de Alistair Cockburn) sao padroes consolidados com mais de 15 anos de uso em producao. A inversao de dependencia e o "D" do SOLID, os cinco principios de design orientado a objetos mais ensinados em engenharia de software. Para plataformas de agentes, a principal vantagem e a testabilidade: quando o dominio nao depende de nenhuma infraestrutura, voce testa toda a logica de roteamento, processamento e formatacao sem precisar de banco de dados, sem precisar de API externa, sem precisar de Telegram. Testes rodam em milissegundos, nao em segundos.
Dica Pratica
Nao precisa implementar Clean Architecture pura no dia um. Mas aplique o principio: se voce pode trocar o provedor de IA mudando uma unica variavel de ambiente e um unico adapter, voce esta no caminho certo. Se trocar o provedor exige mudar 15 arquivos, a arquitetura esta acoplada demais. Comece definindo interfaces para as dependencias externas (provedor de IA, banco de dados, canal de mensagem) e injete implementacoes na inicializacao.
Fazer
Definir interfaces para provedores de IA, persistencia e canais de entrada. Manter o dominio livre de imports de bibliotecas externas. Injetar dependencias na inicializacao do sistema. Testar o dominio isoladamente com mocks simples.
Evitar
Importar diretamente o SDK do OpenAI dentro da logica do agente. Acoplar a logica de negocio ao formato de resposta do Telegram. Criar "God classes" que fazem tudo (recebem mensagem, processam, salvam, enviam). Over-engineering com 15 camadas de abstracao quando 3 resolvem.
π Feature Folders vs Layer Folders
Existem duas filosofias fundamentais para organizar codigo dentro de um projeto. A escolha entre elas define como voce navega, como adiciona features e como o projeto escala conforme cresce. Nenhuma e universalmente melhor. Mas uma tende a funcionar muito melhor para plataformas de agentes.
Conceito Principal
Layer Folders (Organizacao por Tipo): O classico. Uma pasta para controllers, uma para services, uma para models, uma para routes. Cada pasta agrupa arquivos pelo que eles sao, nao pelo que eles fazem.
# Layer Folders (por tipo)
src/
βββ controllers/
β βββ auth.controller.ts
β βββ chat.controller.ts
β βββ billing.controller.ts
βββ services/
β βββ auth.service.ts
β βββ chat.service.ts
β βββ billing.service.ts
βββ models/
β βββ user.model.ts
β βββ conversation.model.ts
β βββ subscription.model.ts
βββ routes/
βββ auth.routes.ts
βββ chat.routes.ts
βββ billing.routes.ts
O problema: para entender tudo sobre "chat", voce precisa abrir 4 pastas diferentes. Para adicionar uma feature nova, precisa criar um arquivo em cada pasta. E cada pasta cresce horizontalmente sem limite (50 controllers numa pasta so).
Feature Folders (Organizacao por Funcionalidade): Agrupa tudo que pertence a uma feature no mesmo lugar. Controller, service, model, routes de "chat" ficam juntos em chat/.
# Feature Folders (por funcionalidade)
src/
βββ auth/
β βββ auth.controller.ts
β βββ auth.service.ts
β βββ auth.model.ts
β βββ auth.routes.ts
β βββ auth.test.ts
βββ chat/
β βββ chat.controller.ts
β βββ chat.service.ts
β βββ chat.model.ts
β βββ chat.routes.ts
β βββ chat.test.ts
βββ billing/
βββ billing.controller.ts
βββ billing.service.ts
βββ billing.model.ts
βββ billing.routes.ts
βββ billing.test.ts
A vantagem: para entender tudo sobre "chat", voce abre uma unica pasta. Para adicionar uma feature nova, cria uma unica pasta. Para deletar uma feature, deleta uma unica pasta. Alta coesao, baixo acoplamento.
Abordagem Hibrida (recomendada): Use feature folders para o codigo de negocio e layer folders para infraestrutura compartilhada. Agents/, tools/, skills/ sao feature folders. Config/, middleware/, lib/ sao layer folders que servem a todas as features.
# Hibrido (recomendado para plataformas de agentes)
src/
βββ agents/ # Feature: cada agente autocontido
β βββ claude/
β βββ ollama/
β βββ openrouter/
βββ tools/ # Feature: cada tool autocontida
β βββ web-search/
β βββ file-read/
βββ channels/ # Feature: cada canal autocontido
β βββ telegram/
β βββ api/
βββ lib/ # Compartilhado: utilidades genericas
β βββ logger.ts
β βββ errors.ts
βββ config/ # Compartilhado: configuracao
β βββ env.ts
βββ middleware/ # Compartilhado: middlewares
βββ auth.ts
βββ rate-limit.ts
Dados e Pesquisa
Angular adotou feature folders como padrao oficial a partir da versao 14. Next.js 13+ usa o App Router com feature folders (cada rota e uma pasta autocontida). O pattern "screaming architecture" (cunhado por Uncle Bob) argumenta que a estrutura de pastas de um projeto deve gritar o que o sistema faz, nao que framework usa. Quando voce ve agents/, tools/, channels/, sabe que e uma plataforma de agentes. Quando ve controllers/, services/, models/, sabe que e... alguma coisa que usa MVC. Feature folders comunicam o dominio. Layer folders comunicam a tecnologia.
Dica Pratica
A regra pratica: se dois arquivos quase sempre mudam juntos, eles devem estar na mesma pasta. Se voce muda o controller de chat, quase sempre muda o service de chat tambem. Entao coloque juntos. Se voce muda o logger, isso nao tem relacao com nenhuma feature especifica. Entao fica em lib/ compartilhado. Essa heuristica simples resolve 90% das decisoes de organizacao.
Fazer
Usar feature folders para codigo de negocio (agentes, ferramentas, canais). Manter codigo compartilhado em pastas de infraestrutura (lib/, config/, middleware/). Colocar testes junto ao codigo que testam. Manter cada feature autocontida o suficiente para ser entendida olhando so sua pasta.
Evitar
Misturar as abordagens sem criterio (algumas features em feature folders, outras espalhadas em layer folders). Criar pastas com um unico arquivo dentro (overhead sem beneficio). Ter features que dependem fortemente dos detalhes internos de outras features (acoplamento entre features).
π¦ Barrel Exports e Convencoes
Convencoes de nomenclatura e padroes de exportacao sao o que transformam uma colecao de arquivos num sistema coeso. Barrel exports controlam o que cada modulo expoe ao mundo. Naming conventions garantem que qualquer pessoa (ou IA) encontre o que procura sem adivinhar.
Conceito Principal
Barrel Exports (index.ts): Um barrel e um arquivo index.ts que re-exporta os itens publicos de uma pasta. Ele funciona como a API publica de um modulo. O resto do sistema importa do barrel, nunca de arquivos internos. Isso cria uma fronteira clara: o que esta no index.ts e publico, o que nao esta e detalhe de implementacao.
// agents/index.ts (barrel export)
export { ClaudeAgent } from './claude';
export { OllamaAgent } from './ollama';
export { OpenRouterAgent } from './openrouter';
export { createAgent } from './factory';
export type { Agent, AgentConfig } from './types';
// Em qualquer outro lugar do sistema:
import { ClaudeAgent, createAgent } from '../agents';
// NUNCA: import { ClaudeAgent } from '../agents/claude/internal-stuff';
Naming Conventions: Nomes previsΓveis eliminam decisoes desnecessarias. Adote um padrao e siga religiosamente:
# Convencao recomendada para plataformas de agentes Arquivos: kebab-case β web-search.ts, claude-agent.ts Classes: PascalCase β WebSearchTool, ClaudeAgent Funcoes: camelCase β createAgent(), processMessage() Constantes: UPPER_SNAKE β MAX_TOKENS, DEFAULT_MODEL Tipos: PascalCase β AgentConfig, ToolResult Pastas: kebab-case β web-search/, rate-limiter/ Env vars: UPPER_SNAKE β OPENAI_API_KEY, TELEGRAM_TOKEN
Path Aliases: Em vez de imports com caminhos relativos longos (import { logger } from '../../../../lib/logger'), configure path aliases no tsconfig.json. Isso torna os imports limpos, legΓveis e independentes da posicao do arquivo no projeto.
// tsconfig.json
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@agents/*": ["src/agents/*"],
"@tools/*": ["src/tools/*"],
"@lib/*": ["src/lib/*"],
"@config/*": ["src/config/*"]
}
}
}
// Agora em qualquer arquivo:
import { ClaudeAgent } from '@agents';
import { logger } from '@lib/logger';
import { env } from '@config/env';
Para Node.js resolver os aliases em runtime, use tsx (que ja resolve automaticamente) ou configure o modulo tsconfig-paths. Para bundlers como esbuild ou webpack, configure os aliases no arquivo de configuracao do bundler tambem.
Dados e Pesquisa
O padrao de barrel exports e o padrao oficial do Angular e e amplamente adotado em projetos TypeScript de grande escala. Path aliases sao suportados nativamente pelo TypeScript desde a versao 2.0 e sao recomendados pela documentacao oficial para projetos com mais de 20 arquivos. Estudos de legibilidade de codigo mostram que imports consistentes e curtos reduzem erros de merge em 25% porque menos caminhos mudam quando arquivos sao movidos. Para IAs, path aliases como @agents/ sao mais informativos que ../../../agents/, ajudando o modelo a entender a estrutura do projeto a partir dos imports.
Dica Pratica
Crie o index.ts de cada pasta no momento em que cria a pasta, nao depois. Se voce cria agents/ e adiciona um agente, o index.ts ja deve existir exportando esse agente. Isso evita o cenario comum de "tenho 30 modulos mas nenhum barrel, agora e tarde demais". Para naming, configure ESLint com a regra @typescript-eslint/naming-convention para enforcar o padrao automaticamente. O CI rejeita codigo que nao segue a convencao.
Fazer
Criar index.ts em cada pasta de feature. Configurar path aliases no tsconfig.json. Adotar uma convencao de nomes e documentar no README. Configurar ESLint para enforcar a convencao. Importar sempre do barrel, nunca de arquivos internos.
Evitar
Misturar kebab-case e camelCase em nomes de arquivos. Ter imports com 5 niveis de ../ (sinal de que faltam path aliases). Exportar tudo no barrel (re-exportar apenas a API publica, nao detalhes internos). Ter funcoes com nomes genericos como "process", "handle", "run" sem contexto.
π οΈ Exercicio: Scaffold do Projeto
Hora de colocar tudo em pratica. Voce vai criar a estrutura completa de pastas da plataforma de agentes, configurar barrel exports, definir path aliases e garantir que o projeto esta pronto para receber codigo de verdade nas proximas trilhas.
Conceito Principal
O exercicio cobre 5 entregas concretas. Ao final, voce tera um projeto esqueleto pronto para desenvolvimento, com convencoes definidas e configuracoes profissionais.
Entrega 1 - Estrutura de Pastas: Crie a arvore completa usando mkdir. Cada diretorio tem uma razao de existir.
# Criar toda a estrutura de uma vez mkdir -p src/agents/claude src/agents/ollama src/agents/openrouter mkdir -p src/tools/web-search src/tools/file-read src/tools/db-query mkdir -p src/channels/telegram src/channels/api mkdir -p src/skills/gmail src/skills/calendar mkdir -p src/memory mkdir -p src/lib mkdir -p src/config mkdir -p src/middleware mkdir -p prompts/agents mkdir -p docs/architecture
Entrega 2 - Index Files (Barrel Exports): Crie um index.ts em cada pasta de feature. Mesmo que vazio por enquanto, o arquivo ja estabelece o padrao de que tudo e acessado pelo barrel.
# Criar todos os index files touch src/agents/index.ts touch src/agents/claude/index.ts touch src/agents/ollama/index.ts touch src/agents/openrouter/index.ts touch src/tools/index.ts touch src/tools/web-search/index.ts touch src/tools/file-read/index.ts touch src/tools/db-query/index.ts touch src/channels/index.ts touch src/channels/telegram/index.ts touch src/channels/api/index.ts touch src/skills/index.ts touch src/memory/index.ts touch src/lib/index.ts touch src/config/index.ts touch src/config/env.ts touch src/middleware/index.ts
Entrega 3 - Path Aliases: Configure o tsconfig.json com aliases para todos os modulos principais.
// tsconfig.json
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"baseUrl": ".",
"paths": {
"@agents/*": ["src/agents/*"],
"@agents": ["src/agents/index.ts"],
"@tools/*": ["src/tools/*"],
"@tools": ["src/tools/index.ts"],
"@channels/*": ["src/channels/*"],
"@skills/*": ["src/skills/*"],
"@memory/*": ["src/memory/*"],
"@lib/*": ["src/lib/*"],
"@config/*": ["src/config/*"],
"@middleware/*": ["src/middleware/*"]
}
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}
Entrega 4 - Arquivos de Configuracao: .env.example, .gitignore, .eslintrc com naming conventions, e package.json com scripts basicos.
# .env.example TELEGRAM_TOKEN=bot-token-here ALLOWED_CHAT_ID=your-chat-id OPENAI_API_KEY=sk-xxx ANTHROPIC_API_KEY=sk-ant-xxx OLLAMA_HOST=http://localhost:11434 PORT=3000 NODE_ENV=development # .gitignore .env node_modules/ dist/ *.pem credentials.json
Entrega 5 - Validacao: Rode a arvore de diretorios e confirme que a estrutura esta completa. Faca o primeiro commit com a mensagem "feat: project scaffold with folder structure, barrel exports, and path aliases".
# Validar a estrutura tree src/ --dirsfirst # Resultado esperado: # src/ # βββ agents/ # β βββ claude/ # β β βββ index.ts # β βββ ollama/ # β β βββ index.ts # β βββ openrouter/ # β β βββ index.ts # β βββ index.ts # βββ channels/ # β βββ api/ # β β βββ index.ts # β βββ telegram/ # β β βββ index.ts # β βββ index.ts # βββ tools/ # β βββ web-search/ # β β βββ index.ts # β βββ file-read/ # β β βββ index.ts # β βββ db-query/ # β β βββ index.ts # β βββ index.ts # ... (remaining folders) # Primeiro commit git add . git commit -m "feat: project scaffold with folder structure, barrel exports, and path aliases"
Dica Pratica
Salve esse scaffold como um template. Da proxima vez que iniciar um projeto de agentes, clone o template em vez de criar do zero. Ferramentas como degit (npx degit usuario/template meu-projeto) permitem criar projetos a partir de templates do GitHub sem o historico de git. Algumas equipes mantem um repositorio "platform-template" que e a base de todo novo projeto. Invista 30 minutos agora criando esse template e economize horas em cada projeto futuro.
Entregavel
Repositorio git com a estrutura completa de pastas (feature folders para agentes, ferramentas e canais; layer folders para lib, config e middleware), barrel exports (index.ts) em cada pasta de feature, tsconfig.json com path aliases configurados, .env.example documentado, .gitignore protegendo secrets, e primeiro commit feito. Esse esqueleto e a base que vai receber toda a implementacao das proximas trilhas.
Resumo Final
✓ Entendeu como a estrutura de pastas impacta cognitive load, onboarding e qualidade do codigo de IA.
✓ Aprendeu quando usar monorepo vs multi-repo e as ferramentas de cada abordagem.
✓ Aplicou principios de Clean Architecture com inversao de dependencia para agentes.
✓ Dominou feature folders vs layer folders e a abordagem hibrida recomendada.
✓ Configurou barrel exports, naming conventions e path aliases profissionais.
✓ Criou o scaffold completo do projeto pronto para receber implementacao.