Communitygithub.com

padrões-de-codificação

Convenções básicas de codificação entre projetos para nomenclatura, legibilidade, imutabilidade e revisão de qualidade de código. Use habilidades detalhadas de frontend ou backend para padrões específicos de frameworks. Ative ao revisar qualidade de código ou nomenclatura quando nenhuma habilidade específica de framework se aplicar.

O que é padrões-de-codificação?

Esta habilidade estabelece uma base sólida de convenções de código aplicáveis a qualquer projeto, funcionando como um piso compartilhado, não como um manual detalhado de frameworks. Ela é essencial para revisões de código, refatoração, configuração de ferramentas de linting e onboarding de novos contribuidores. A habilidade cobre princípios fundamentais como legibilidade (código autodocumentado), KISS (simplicidade), DRY (evitar repetição) e YAGNI (evitar complexidade desnecessária), além de padrões específicos para TypeScript/JavaScript, React, design de APIs, organização de arquivos e testes. Ela também inclui detecção de code smells (funções longas, aninhamento profundo, números mágicos) e práticas de desempenho como memoização e lazy loading. Importante: ela não substitui habilidades especializadas como frontend-patterns ou backend-patterns; ative-a como base quando não houver uma habilidade mais específica para o contexto.

Funciona com~Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/affaan-m/ECC/tree/main/skills/coding-standards

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Padrões e Melhores Práticas de Codificação

Convenções básicas de codificação aplicáveis entre projetos.

Esta habilidade é o piso compartilhado, não o manual detalhado do framework.

  • Use frontend-patterns para React, estado, formulários, renderização e arquitetura de UI.
  • Use backend-patterns ou api-design para camadas de repositório/serviço, design de endpoints, validação e preocupações específicas do servidor.
  • Use rules/common/coding-style.md quando precisar da camada de regra reutilizável mais curta, em vez de uma descrição completa da habilidade.

Quando Ativar

  • Iniciar um novo projeto ou módulo
  • Revisar código quanto à qualidade e manutenibilidade
  • Refatorar código existente para seguir convenções
  • Aplicar consistência de nomenclatura, formatação ou estrutura
  • Configurar regras de linting, formatação ou verificação de tipos
  • Integrar novos contribuidores às convenções de codificação

Limites de Escopo

Ative esta habilidade para:

  • nomenclatura descritiva
  • padrões de imutabilidade
  • legibilidade, aplicação de KISS, DRY e YAGNI
  • expectativas de tratamento de erros e revisão de code smells

Não use esta habilidade como fonte principal para:

  • composição, hooks ou padrões de renderização do React
  • arquitetura de backend, design de API ou camadas de banco de dados
  • orientação específica de framework quando uma habilidade ECC mais específica já existir

Princípios de Qualidade de Código

1. Legibilidade em Primeiro Lugar

  • O código é mais lido do que escrito
  • Nomes claros de variáveis e funções
  • Código autodocumentado preferido em vez de comentários
  • Formatação consistente

2. KISS (Mantenha Simples, Idiota)

  • Solução mais simples que funciona
  • Evite engenharia excessiva
  • Sem otimização prematura
  • Fácil de entender > código inteligente

3. DRY (Não se Repita)

  • Extraia lógica comum para funções
  • Crie componentes reutilizáveis
  • Compartilhe utilidades entre módulos
  • Evite programação copiar-colar

4. YAGNI (Você Não Vai Precisar Disso)

  • Não crie funcionalidades antes de serem necessárias
  • Evite generalização especulativa
  • Adicione complexidade apenas quando necessário
  • Comece simples, refatore quando precisar

Padrões TypeScript/JavaScript

Nomenclatura de Variáveis

// PASSOU: BOM: Nomes descritivos
const marketSearchQuery = 'election'
const isUserAuthenticated = true
const totalRevenue = 1000

// FALHOU: RUIM: Nomes pouco claros
const q = 'election'
const flag = true
const x = 1000

Nomenclatura de Funções

// PASSOU: BOM: Padrão verbo-substantivo
async function fetchMarketData(marketId: string) { }
function calculateSimilarity(a: number[], b: number[]) { }
function isValidEmail(email: string): boolean { }

// FALHOU: RUIM: Pouco claro ou apenas substantivo
async function market(id: string) { }
function similarity(a, b) { }
function email(e) { }

Padrão de Imutabilidade (CRÍTICO)

// PASSOU: SEMPRE use operador spread
const updatedUser = {
  ...user,
  name: 'New Name'
}

const updatedArray = [...items, newItem]

// FALHOU: NUNCA mutar diretamente
user.name = 'New Name'  // RUIM
items.push(newItem)     // RUIM

Tratamento de Erros

// PASSOU: BOM: Tratamento de erros abrangente
async function fetchData(url: string) {
  try {
    const response = await fetch(url)

    if (!response.ok) {
      throw new Error(`HTTP ${response.status}: ${response.statusText}`)
    }

    return await response.json()
  } catch (error) {
    console.error('Fetch failed:', error)
    throw new Error('Failed to fetch data')
  }
}

// FALHOU: RUIM: Sem tratamento de erros
async function fetchData(url) {
  const response = await fetch(url)
  return response.json()
}

Melhores Práticas com Async/Await

// PASSOU: BOM: Execução paralela quando possível
const [users, markets, stats] = await Promise.all([
  fetchUsers(),
  fetchMarkets(),
  fetchStats()
])

// FALHOU: RUIM: Sequencial quando desnecessário
const users = await fetchUsers()
const markets = await fetchMarkets()
const stats = await fetchStats()

Segurança de Tipos

// PASSOU: BOM: Tipos adequados
interface Market {
  id: string
  name: string
  status: 'active' | 'resolved' | 'closed'
  created_at: Date
}

function getMarket(id: string): Promise<Market> {
  // Implementação
}

// FALHOU: RUIM: Usando 'any'
function getMarket(id: any): Promise<any> {
  // Implementação
}

Melhores Práticas React

Estrutura de Componentes

// PASSOU: BOM: Componente funcional com tipos
interface ButtonProps {
  children: React.ReactNode
  onClick: () => void
  disabled?: boolean
  variant?: 'primary' | 'secondary'
}

export function Button({
  children,
  onClick,
  disabled = false,
  variant = 'primary'
}: ButtonProps) {
  return (
    <button
      onClick={onClick}
      disabled={disabled}
      className={`btn btn-${variant}`}
    >
      {children}
    </button>
  )
}

// FALHOU: RUIM: Sem tipos, estrutura pouco clara
export function Button(props) {
  return <button onClick={props.onClick}>{props.children}</button>
}

Hooks Personalizados

// PASSOU: BOM: Hook personalizado reutilizável
export function useDebounce<T>(value: T, delay: number): T {
  const [debouncedValue, setDebouncedValue] = useState<T>(value)

  useEffect(() => {
    const handler = setTimeout(() => {
      setDebouncedValue(value)
    }, delay)

    return () => clearTimeout(handler)
  }, [value, delay])

  return debouncedValue
}

// Uso
const debouncedQuery = useDebounce(searchQuery, 500)

Gerenciamento de Estado

// PASSOU: BOM: Atualizações de estado adequadas
const [count, setCount] = useState(0)

// Atualização funcional para estado baseado no estado anterior
setCount(prev => prev + 1)

// FALHOU: RUIM: Referência direta ao estado
setCount(count + 1)  // Pode estar desatualizado em cenários assíncronos

Renderização Condicional

// PASSOU: BOM: Renderização condicional clara
{isLoading && <Spinner />}
{error && <ErrorMessage error={error} />}
{data && <DataDisplay data={data} />}

// FALHOU: RUIM: Inferno ternário
{isLoading ? <Spinner /> : error ? <ErrorMessage error={error} /> : data ? <DataDisplay data={data} /> : null}

Padrões de Design de API

Convenções REST

GET    /api/markets              # Listar todos os mercados
GET    /api/markets/:id          # Obter mercado específico
POST   /api/markets              # Criar novo mercado
PUT    /api/markets/:id          # Atualizar mercado (completo)
PATCH  /api/markets/:id          # Atualizar mercado (parcial)
DELETE /api/markets/:id          # Excluir mercado

# Parâmetros de consulta para filtragem
GET /api/markets?status=active&limit=10&offset=0

Formato de Resposta

// PASSOU: BOM: Estrutura de resposta consistente
interface ApiResponse<T> {
  success: boolean
  data?: T
  error?: string
  meta?: {
    total: number
    page: number
    limit: number
  }
}

// Resposta de sucesso
return NextResponse.json({
  success: true,
  data: markets,
  meta: { total: 100, page: 1, limit: 10 }
})

// Resposta de erro
return NextResponse.json({
  success: false,
  error: 'Invalid request'
}, { status: 400 })

Validação de Entrada

import { z } from 'zod'

// PASSOU: BOM: Validação de esquema
const CreateMarketSchema = z.object({
  name: z.string().min(1).max(200),
  description: z.string().min(1).max(2000),
  endDate: z.string().datetime(),
  categories: z.array(z.string()).min(1)
})

export async function POST(request: Request) {
  const body = await request.json()

  try {
    const validated = CreateMarketSchema.parse(body)
    // Prosseguir com dados validados
  } catch (error) {
    if (error instanceof z.ZodError) {
      return NextResponse.json({
        success: false,
        error: 'Validation failed',
        details: error.issues
      }, { status: 400 })
    }
  }
}

Organização de Arquivos

Estrutura do Projeto

src/
├── app/                    # Next.js App Router
│   ├── api/               # Rotas de API
│   ├── markets/           # Páginas de mercados
│   └── (auth)/           # Páginas de autenticação (grupos de rotas)
├── components/            # Componentes React
│   ├── ui/               # Componentes de UI genéricos
│   ├── forms/            # Componentes de formulário
│   └── layouts/          # Componentes de layout
├── hooks/                # Hooks React personalizados
├── lib/                  # Utilitários e configurações
│   ├── api/             # Clientes de API
│   ├── utils/           # Funções auxiliares
│   └── constants/       # Constantes
├── types/                # Tipos TypeScript
└── styles/              # Estilos globais

Nomenclatura de Arquivos

components/Button.tsx          # PascalCase para componentes
hooks/useAuth.ts              # camelCase com prefixo 'use'
lib/formatDate.ts             # camelCase para utilitários
types/market.types.ts         # camelCase com sufixo .types

Comentários e Documentação

Quando Comentar

// PASSOU: BOM: Explique o PORQUÊ, não o O QUÊ
// Usar backoff exponencial para evitar sobrecarregar a API durante interrupções
const delay = Math.min(1000 * Math.pow(2, retryCount), 30000)

// Mutação intencional aqui por desempenho com arrays grandes
items.push(newItem)

// FALHOU: RUIM: Afirmando o óbvio
// Incrementar contador em 1
count++

// Definir nome como nome do usuário
name = user.name

JSDoc para APIs Públicas

/**
 * Pesquisa mercados usando similaridade semântica.
 *
 * @param query - Consulta de pesquisa em linguagem natural
 * @param limit - Número máximo de resultados (padrão: 10)
 * @returns Array de mercados ordenados por pontuação de similaridade
 * @throws {Error} Se a API OpenAI falhar ou Redis estiver indisponível
 *
 * @example
 * ```typescript
 * const results = await searchMarkets('election', 5)
 * console.log(results[0].name) // "Trump vs Biden"
 * ```
 */
export async function searchMarkets(
  query: string,
  limit: number = 10
): Promise<Market[]> {
  // Implementação
}

Melhores Práticas de Desempenho

Memoização

import { useMemo, useCallback } from 'react'

// PASSOU: BOM: Memoizar cálculos caros
// Copiar antes de ordenar - Array.prototype.sort muta o array original
const sortedMarkets = useMemo(() => {
  return [...markets].sort((a, b) => b.volume - a.volume)
}, [markets])

// PASSOU: BOM: Memoizar callbacks
const handleSearch = useCallback((query: string) => {
  setSearchQuery(query)
}, [])

Carregamento Preguiçoso

import { lazy, Suspense } from 'react'

// PASSOU: BOM: Carregar componentes pesados de forma preguiçosa
const HeavyChart = lazy(() => import('./HeavyChart'))

export function Dashboard() {
  return (
    <Suspense fallback={<Spinner />}>
      <HeavyChart />
    </Suspense>
  )
}

Consultas ao Banco de Dados

// PASSOU: BOM: Selecionar apenas colunas necessárias
const { data } = await supabase
  .from('markets')
  .select('id, name, status')
  .limit(10)

// FALHOU: RUIM: Selecionar tudo
const { data } = await supabase
  .from('markets')
  .select('*')

Padrões de Teste

Estrutura de Teste (Padrão AAA)

test('calcula similaridade corretamente', () => {
  // Arrange
  const vector1 = [1, 0, 0]
  const vector2 = [0, 1, 0]

  // Act
  const similarity = calculateCosineSimilarity(vector1, vector2)

  // Assert
  expect(similarity).toBe(0)
})

Nomenclatura de Testes

// PASSOU: BOM: Nomes de teste descritivos
test('retorna array vazio quando nenhum mercado corresponde à consulta', () => { })
test('lança erro quando a chave da API OpenAI está faltando', () => { })
test('usa pesquisa por substring como fallback quando Redis está indisponível', () => { })

// FALHOU: RUIM: Nomes de teste vagos
test('funciona', () => { })
test('testar pesquisa', () => { })

Detecção de Code Smells

Fique atento a esses antipadrões:

1. Funções Longas

// FALHOU: RUIM: Função > 50 linhas
function processMarketData() {
  // 100 linhas de código
}

// PASSOU: BOM: Dividir em funções menores
function processMarketData() {
  const validated = validateData()
  const transformed = transformData(validated)
  return saveData(transformed)
}

2. Aninhamento Profundo

// FALHOU: RUIM: 5+ níveis de aninhamento
if (user) {
  if (user.isAdmin) {
    if (market) {
      if (market.isActive) {
        if (hasPermission) {
          // Fazer algo
        }
      }
    }
  }
}

// PASSOU: BOM: Retornos antecipados
if (!user) return
if (!user.isAdmin) return
if (!market) return
if (!market.isActive) return
if (!hasPermission) return

// Fazer algo

3. Números Mágicos

// FALHOU: RUIM: Números não explicados
if (retryCount > 3) { }
setTimeout(callback, 500)

// PASSOU: BOM: Constantes nomeadas
const MAX_RETRIES = 3
const DEBOUNCE_DELAY_MS = 500

if (retryCount > MAX_RETRIES) { }
setTimeout(callback, DEBOUNCE_DELAY_MS)

Lembre-se: A qualidade do código não é negociável. Código claro e sustentável permite desenvolvimento rápido e refatoração confiante.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/content-engine

Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.

affaan-m/ECC

Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.

affaan-m/fal-ai-media

Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-image (Nano Banana), text/image-to-video (Seedance, Kling, Veo 3), text-to-speech (CSM-1B), and video-to-audio (ThinkSound). Use when the user wants to generate images, videos, or audio with AI.

affaan-m/manim-video

日本語翻訳:このファイルは manim-video 用の日本語翻訳が必要です

affaan-m/remotion-video-creation

Remotion のベストプラクティス - React で動画を作成する。3D、アニメーション、音声、字幕、チャート、トランジションなどをカバーするドメイン固有の29のルール。

affaan-m/video-editing

AI-assisted video editing workflows for cutting, structuring, and augmenting real footage. Covers the full pipeline from raw capture through FFmpeg, Remotion, ElevenLabs, fal.ai, and final polish in Descript or CapCut. Use when the user wants to edit video, cut footage, create vlogs, or build video content.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

agent-self-evaluation

Use after completing any non-trivial task. The agent self-rates its output on 5 axes — accuracy, completeness, clarity, actionability, conciseness — with concrete evidence per criterion. Produces a structured 1-5 scorecard with specific improvement suggestions.

agent-sort

Build an evidence-backed ECC install plan for a specific repo by sorting skills, commands, rules, hooks, and extras into DAILY vs LIBRARY buckets using parallel repo-aware review passes. Use when ECC should be trimmed to what a project actually needs instead of loading the full bundle.

ai-first-engineering

Engineering operating model for teams where AI agents generate a large share of implementation output. Use when setting team process, review gates, or ownership rules for a codebase largely written by agents.

ai-regression-testing

Regression testing strategies for AI-assisted development. Sandbox-mode API testing without database dependencies, automated bug-check workflows, and patterns to catch AI blind spots where the same model writes and reviews code. Use when adding regression coverage to AI-assisted code, or when the same model both wrote and reviewed a change.

android-clean-architecture

Clean Architecture patterns for Android and Kotlin Multiplatform projects — module structure, dependency rules, UseCases, Repositories, and data layer patterns. Use when structuring modules, layers, or data flow in an Android or KMP project.

angular-developer

Generates Angular code and provides architectural guidance. Trigger when creating projects, components, or services, or for best practices on reactivity (signals, linkedSignal, resource), forms, dependency injection, routing, SSR, accessibility (ARIA), animations, styling (component styles, Tailwind CSS), testing, or CLI tooling.

Habilidades Relacionadas