From leandrocfe-skills
Provides a shared vocabulary for designing deep modules with small interfaces and rich behavior. Useful when structuring or refactoring code into testable, maintainable seams.
How this skill is triggered — by the user, by Claude, or both
Slash command
/leandrocfe-skills:codebase-designThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Projete **módulos profundos (deep modules)**: muito comportamento atrás de uma interface pequena, posicionado em um seam limpo, testável através dessa interface. Use esta linguagem e estes princípios sempre que código estiver sendo projetado ou reestruturado. O objetivo é *leverage* para quem chama, *locality* para mantenedores e testabilidade para todos.
Projete módulos profundos (deep modules): muito comportamento atrás de uma interface pequena, posicionado em um seam limpo, testável através dessa interface. Use esta linguagem e estes princípios sempre que código estiver sendo projetado ou reestruturado. O objetivo é leverage para quem chama, locality para mantenedores e testabilidade para todos.
Use estes termos exatamente — não substitua por "component", "service", "API" ou "boundary". Linguagem consistente é o objetivo principal.
Module — qualquer coisa que tenha uma interface e uma implementação. Deliberadamente agnóstico em escala: uma função, classe, pacote ou um slice que atravessa camadas. Evite: unit, component, service.
Interface — tudo que um caller precisa saber para usar o módulo corretamente: a assinatura de tipo, mas também invariantes, restrições de ordenação, modos de erro, configuração necessária e características de performance. Evite: API, signature (muito estreito — referem-se apenas à superfície de tipo).
Implementation — o que está dentro do módulo, seu corpo de código. Diferente de Adapter: uma coisa pode ser um adapter pequeno com uma implementation grande (um repositório Postgres) ou um adapter grande com uma implementation pequena (um fake em memória). Use "adapter" quando o seam for o tema; "implementation" caso contrário.
Depth — leverage na interface: a quantidade de comportamento que um caller (ou teste) consegue exercer por unidade de interface que precisa aprender. Um módulo é deep quando uma grande quantidade de comportamento fica atrás de uma interface pequena, shallow quando a interface é quase tão complexa quanto a implementação.
Seam (Michael Feathers) — um lugar onde você pode alterar comportamento sem editar naquele lugar; a localização onde a interface do módulo vive. Onde colocar o seam é uma decisão de design própria, distinta do que fica atrás dele. Evite: boundary (sobrecarregado com bounded context do DDD).
Adapter — uma coisa concreta que satisfaz uma interface em um seam. Descreve papel (qual slot ele preenche), não substância (o que tem dentro).
Leverage — o que os callers ganham com depth: mais capacidade por unidade de interface que aprendem. Uma implementação traz retorno em N pontos de chamada e M testes.
Locality — o que os mantenedores ganham com depth: mudança, bugs, conhecimento e verificação se concentram em um lugar só em vez de se espalharem pelos callers. Conserta uma vez, consertado em todo lugar.
Deep module = interface pequena + muita implementação:
┌─────────────────────┐
│ Small Interface │ ← Poucos métodos, parâmetros simples
├─────────────────────┤
│ │
│ Deep Implementation│ ← Lógica complexa escondida
│ │
└─────────────────────┘
Shallow module = interface grande + pouca implementação (evite):
┌─────────────────────────────────┐
│ Large Interface │ ← Muitos métodos, parâmetros complexos
├─────────────────────────────────┤
│ Thin Implementation │ ← Apenas repassa
└─────────────────────────────────┘
Ao projetar uma interface, pergunte:
Boas interfaces tornam o teste natural:
Aceite dependências, não as crie.
// Testável
function processOrder(order, paymentGateway) {}
// Difícil de testar
function processOrder(order) {
const gateway = new StripeGateway();
}
Retorne resultados, não produza side effects.
// Testável
function calculateDiscount(cart): Discount {}
// Difícil de testar
function applyDiscount(cart): void {
cart.total -= discount;
}
Superfície pequena. Menos métodos = menos testes necessários. Menos parâmetros = setup de teste mais simples.
interface do TypeScript ou métodos públicos de uma classe: muito estreito — interface aqui inclui todo fato que um caller precisa saber.npx claudepluginhub leandrocfe/skillsProvides a shared vocabulary and design principles for creating deep modules with clear interfaces and seams, useful when designing, refactoring, or improving code structure.
Provides a shared vocabulary and principles for designing deep modules—small interfaces with lots of implementation behind clean seams—to increase leverage, locality, and testability.
Provides shared vocabulary and principles for designing deep modules with small interfaces and rich implementations, improving testability and AI-navigability.