Communitygithub.com

Padrões de Codificação C++ (Diretrizes Principais do C++)

Padrões de codificação C++ baseados nas Diretrizes Principais do C++ (isocpp.github.io). Use ao escrever, revisar ou refatorar código C++ para aplicar práticas modernas, seguras e idiomáticas.

O que é Padrões de Codificação C++ (Diretrizes Principais do C++)?

Esta skill fornece um conjunto abrangente de padrões de codificação para C++ moderno (C++17/20/23), derivados das Diretrizes Principais do C++. Seu objetivo é ajudar desenvolvedores a escrever código mais seguro, eficiente e sustentável, aplicando princípios como RAII, imutabilidade, segurança de tipos e clareza de intenção. A skill é útil durante a escrita de novo código, revisão, refatoração ou tomada de decisões arquiteturais em projetos C++. Ela é compatível com agentes de IA como Claude Code, Cursor e Codex, que podem usar estas diretrizes para gerar ou analisar código C++ de acordo com as melhores práticas estabelecidas pela comunidade C++. A skill organiza as regras em seções como Filosofia e Interfaces, Funções, Classes, Gerenciamento de Recursos, Expressões e Tratamento de Erros, oferecendo exemplos de código e anti-padrões para cada tópico.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/everything-claude-code/tree/main/skills/cpp-coding-standards

Perguntar na sua IA favorita

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

Documentação

O que Padrões de Codificação C++ (Diretrizes Principais do C++) faz?

Padrões de codificação abrangentes para C++ moderno (C++17/20/23) derivados das Diretrizes Principais do C++. Aplica segurança de tipos, segurança de recursos, imutabilidade e clareza.

Quando Usar

  • Escrevendo novo código C++ (classes, funções, templates)
  • Revisando ou refatorando código C++ existente
  • Tomando decisões arquiteturais em projetos C++
  • Aplicando estilo consistente em uma base de código C++
  • Escolhendo entre recursos da linguagem (ex.: enum vs enum class, ponteiro bruto vs smart pointer)

Quando NÃO Usar

  • Projetos que não são C++
  • Bases de código C legadas que não podem adotar recursos modernos do C++
  • Contextos embarcados/bare-metal onde diretrizes específicas entram em conflito com restrições de hardware (adapte seletivamente)

Princípios Transversais

Esses temas recorrem em todas as diretrizes e formam a base:

  1. RAII em toda parte (P.8, R.1, E.6, CP.20): Vincule o tempo de vida do recurso ao tempo de vida do objeto
  2. Imutabilidade por padrão (P.10, Con.1-5, ES.25): Comece com const/constexpr; mutabilidade é a exceção
  3. Segurança de tipos (P.4, I.4, ES.46-49, Enum.3): Use o sistema de tipos para prevenir erros em tempo de compilação
  4. Expresse intenção (P.3, F.1, NL.1-2, T.10): Nomes, tipos e conceitos devem comunicar propósito
  5. Minimize complexidade (F.2-3, ES.5, Per.4-5): Código simples é código correto
  6. Semântica de valor sobre semântica de ponteiro (C.10, R.3-5, F.20, CP.31): Prefira retornar por valor e objetos com escopo

Filosofia e Interfaces (P., I.)

Regras Principais

RegraResumo
P.1Expresse ideias diretamente no código
P.3Expresse intenção
P.4Idealmente, um programa deve ser estaticamente tipo seguro
P.5Prefira verificação em tempo de compilação a verificação em tempo de execução
P.8Não vaze nenhum recurso
P.10Prefira dados imutáveis a dados mutáveis
I.1Torne as interfaces explícitas
I.2Evite variáveis globais não-const
I.4Torne as interfaces precisas e fortemente tipadas
I.11Nunca transfira propriedade por um ponteiro bruto ou referência
I.23Mantenha baixo o número de argumentos de função

FAÇA

// P.10 + I.4: Interface imutável e fortemente tipada
struct Temperature {
    double kelvin;
};

Temperature boil(const Temperature& water);

NÃO FAÇA

// Interface fraca: propriedade pouco clara, unidades pouco claras
double boil(double* temp);

// Variável global não-const
int g_counter = 0;  // Violação de I.2

Funções (F.*)

Regras Principais

RegraResumo
F.1Empacote operações significativas como funções cuidadosamente nomeadas
F.2Uma função deve realizar uma única operação lógica
F.3Mantenha funções curtas e simples
F.4Se uma função pode ser avaliada em tempo de compilação, declare-a constexpr
F.6Se sua função não deve lançar exceções, declare-a noexcept
F.8Prefira funções puras
F.16Para parâmetros de "entrada", passe tipos baratos de copiar por valor e outros por const&
F.20Para valores de "saída", prefira valores de retorno a parâmetros de saída
F.21Para retornar múltiplos valores de "saída", prefira retornar um struct
F.43Nunca retorne um ponteiro ou referência a um objeto local

Passagem de Parâmetros

// F.16: Tipos baratos por valor, outros por const&
void print(int x);                           // barato: por valor
void analyze(const std::string& data);       // caro: por const&
void transform(std::string s);               // sink: por valor (irá mover)

// F.20 + F.21: Valores de retorno, não parâmetros de saída
struct ParseResult {
    std::string token;
    int position;
};

ParseResult parse(std::string_view input);   // BOM: retorna struct

// RUIM: parâmetros de saída
void parse(std::string_view input,
           std::string& token, int& pos);    // evite isso

Funções Puras e constexpr

// F.4 + F.8: Pura, constexpr quando possível
constexpr int factorial(int n) noexcept {
    return (n <= 1) ? 1 : n * factorial(n - 1);
}

static_assert(factorial(5) == 120);

Anti-Padrões

  • Retornar T&& de funções (F.45)
  • Usar va_arg / variádicos estilo C (F.55)
  • Capturar por referência em lambdas passadas para outras threads (F.53)
  • Retornar const T que inibe a semântica de movimento (F.49)

Classes e Hierarquias de Classes (C.*)

Regras Principais

RegraResumo
C.2Use class se um invariante existir; struct se os membros de dados variarem independentemente
C.9Minimize a exposição de membros
C.20Se você pode evitar definir operações padrão, faça-o (Regra de Zero)
C.21Se você definir ou =delete qualquer copy/move/destrutor, lide com todos (Regra de Cinco)
C.35Destrutor de classe base: virtual público ou não virtual protegido
C.41Um construtor deve criar um objeto totalmente inicializado
C.46Declare construtores de um único argumento como explicit
C.67Uma classe polimórfica deve suprimir copy/move público
C.128Funções virtuais: especifique exatamente um de virtual, override ou final

Regra de Zero

// C.20: Deixe o compilador gerar membros especiais
struct Employee {
    std::string name;
    std::string department;
    int id;
    // Nenhum destrutor, construtores de copy/move ou operadores de atribuição necessários
};

Regra de Cinco

// C.21: Se você deve gerenciar um recurso, defina todos os cinco
class Buffer {
public:
    explicit Buffer(std::size_t size)
        : data_(std::make_unique<char[]>(size)), size_(size) {}

    ~Buffer() = default;

    Buffer(const Buffer& other)
        : data_(std::make_unique<char[]>(other.size_)), size_(other.size_) {
        std::copy_n(other.data_.get(), size_, data_.get());
    }

    Buffer& operator=(const Buffer& other) {
        if (this != &other) {
            auto new_data = std::make_unique<char[]>(other.size_);
            std::copy_n(other.data_.get(), other.size_, new_data.get());
            data_ = std::move(new_data);
            size_ = other.size_;
        }
        return *this;
    }

    Buffer(Buffer&&) noexcept = default;
    Buffer& operator=(Buffer&&) noexcept = default;

private:
    std::unique_ptr<char[]> data_;
    std::size_t size_;
};

Hierarquia de Classes

// C.35 + C.128: Destrutor virtual, use override
class Shape {
public:
    virtual ~Shape() = default;
    virtual double area() const = 0;  // C.121: interface pura
};

class Circle : public Shape {
public:
    explicit Circle(double r) : radius_(r) {}
    double area() const override { return 3.14159 * radius_ * radius_; }

private:
    double radius_;
};

Anti-Padrões

  • Chamar funções virtuais em construtores/destrutores (C.82)
  • Usar memset/memcpy em tipos não triviais (C.90)
  • Fornecer argumentos padrão diferentes para função virtual e sobrecarga (C.140)
  • Tornar membros de dados const ou referências, o que suprime move/copy (C.12)

Gerenciamento de Recursos (R.*)

Regras Principais

RegraResumo
R.1Gerencie recursos automaticamente usando RAII
R.3Um ponteiro bruto (T*) não possui propriedade
R.5Prefira objetos com escopo; não aloque no heap desnecessariamente
R.10Evite malloc()/free()
R.11Evite chamar new e delete explicitamente
R.20Use unique_ptr ou shared_ptr para representar propriedade
R.21Prefira unique_ptr a shared_ptr a menos que seja necessário compartilhar propriedade
R.22Use make_shared() para criar shared_ptrs

Uso de Smart Pointers

// R.11 + R.20 + R.21: RAII com smart pointers
auto widget = std::make_unique<Widget>("config");  // propriedade exclusiva
auto cache  = std::make_shared<Cache>(1024);        // propriedade compartilhada

// R.3: Ponteiro bruto = observador não proprietário
void render(const Widget* w) {  // NÃO possui w
    if (w) w->draw();
}

render(widget.get());

Padrão RAII

// R.1: Aquisição de recurso é inicialização
class FileHandle {
public:
    explicit FileHandle(const std::string& path)
        : handle_(std::fopen(path.c_str(), "r")) {
        if (!handle_) throw std::runtime_error("Falha ao abrir: " + path);
    }

    ~FileHandle() {
        if (handle_) std::fclose(handle_);
    }

    FileHandle(const FileHandle&) = delete;
    FileHandle& operator=(const FileHandle&) = delete;
    FileHandle(FileHandle&& other) noexcept
        : handle_(std::exchange(other.handle_, nullptr)) {}
    FileHandle& operator=(FileHandle&& other) noexcept {
        if (this != &other) {
            if (handle_) std::fclose(handle_);
            handle_ = std::exchange(other.handle_, nullptr);
        }
        return *this;
    }

private:
    std::FILE* handle_;
};

Anti-Padrões

  • new/delete puro (R.11)
  • malloc()/free() em código C++ (R.10)
  • Múltiplas alocações de recursos em uma única expressão (R.13 -- risco de segurança de exceção)
  • shared_ptr onde unique_ptr é suficiente (R.21)

Expressões e Instruções (ES.*)

Regras Principais

RegraResumo
ES.5Mantenha escopos pequenos
ES.20Sempre inicialize um objeto
ES.23Prefira sintaxe de inicialização {}
ES.25Declare objetos como const ou constexpr a menos que a modificação seja pretendida
ES.28Use lambdas para inicialização complexa de variáveis const
ES.45Evite constantes mágicas; use constantes simbólicas
ES.46Evite conversões aritméticas restritivas/perda de dados
ES.47Use nullptr em vez de 0 ou NULL
ES.48Evite casts
ES.50Não remova const com cast

Inicialização

// ES.20 + ES.23 + ES.25: Sempre inicialize, prefira {}, padrão é const
const int max_retries{3};
const std::string name{"widget"};
const std::vector<int> primes{2, 3, 5, 7, 11};

// ES.28: Lambda para inicialização const complexa
const auto config = [&] {
    Config c;
    c.timeout = std::chrono::seconds{30};
    c.retries = max_retries;
    c.verbose = debug_mode;
    return c;
}();

Anti-Padrões

  • Variáveis não inicializadas (ES.20)
  • Usar 0 ou NULL como ponteiro (ES.47 -- use nullptr)
  • Casts estilo C (ES.48 -- use static_cast, const_cast, etc.)
  • Remover const com cast (ES.50)
  • Números mágicos sem constantes nomeadas (ES.45)
  • Misturar aritmética com sinal e sem sinal (ES.100)
  • Reutilizar nomes em escopos aninhados (ES.12)

Tratamento de Erros (E.*)

Regras Principais

RegraResumo
E.1Desenvolva uma estratégia de tratamento de erros no início do design
E.2Lance uma exceção para sinalizar que uma função não pode realizar sua tarefa atribuída
E.6Use RAII para evitar vazamentos
E.12Use noexcept quando lançar for impossível ou inaceitável
E.14Use tipos definidos pelo usuário projetados especificamente como exceções
E.15Lance por valor, capture por referência
E.16Destrutores, desalocação e swap nunca devem falhar
E.17Não tente capturar toda exceção em toda função

Hierarquia de Exceções

// E.14 + E.15: Tipos de exceção personalizados, lance por valor, capture por referência
class AppError : public std::runtime_error {
public:
    using std::runtime_error::runtime_error;
};

class NetworkError : public AppError {
public:
    NetworkError(const std::string& msg, int code)
        : AppError(msg), status_code(code) {}
    int status_code;
};

void fetch_data(const std::string& url) {
    // E.2: Lance para sinalizar falha
    throw NetworkError("conexão recusada", 503);
}

void run() {
    try {
        fetch_data("https://api.example.com");
    } catch (const NetworkError& e) {
        log_error(e.what(), e.status_code);
    } catch (const AppError& e) {
        log_error(e.what());
    }
    // E.17: Não capturar tudo aqui -- deixe erros inesperados propagarem
}

Anti-Padrões

  • Lançar tipos embutidos como int ou literais de string (E.14)
  • Capturar por valor (risco de slicing) (E.15)
  • Blocos catch vazios que engolem erros silenciosamente
  • Usar exceções para controle de fluxo (E.3)
  • Tratamento de erros baseado em estado global como errno (E.28)

Constantes e Imutabilidade (Con.*)

Todas as Regras

RegraResumo
Con.1Por padrão, torne objetos imutáveis
Con.2Por padrão, torne funções membro const
Con.3Por padrão, passe ponteiros e referências para const
Con.4Use const para valores que não mudam após a construção
Con.5Use constexpr para valores computáveis em tempo de compilação
// Con.1 a Con.5: Imutabilidade por padrão
class Sensor {
public:
    explicit Sensor(std::string id) : id_(std::move(id)) {}

    // Con.2: Funções membro const por padrão
    const std::string& id() const { return id_; }
    double last_reading() const { return reading_; }

    // Apenas não-const quando a mutação é necessária
    void record(double value) { reading_ = value; }

private:
    const std::string id_;  // Con.4: nunca muda após a construção
    double reading_{0.0};
};

// Con.3: Passe por referência const
void display(const Sensor& s) {
    std::cout << s.id() << ": " << s.last_reading() << '\n';
}

// Con.5: Constantes em tempo de compilação
constexpr double PI = 3.14159265358979;
constexpr int MAX_SENSORS = 256;

Concorrência e Paralelismo (CP.*)

Regras Principais

RegraResumo
CP.2Evite corridas de dados
CP.3Minimize o compartilhamento explícito de dados graváveis
CP.4Pense em termos de tarefas, em vez de threads
CP.8Não use volatile para sincronização
CP.20Use RAII, nunca lock()/unlock() puro
CP.21Use std::scoped_lock para adquirir múltiplos mutexes
CP.22Nunca chame código desconhecido enquanto segura um lock
CP.42Não espere sem uma condição
CP.44Lembre-se de nomear seus lock_guards e unique_locks
CP.100Não use programação livre de locks a menos que seja absolutamente necessário

Bloqueio Seguro

// CP.20 + CP.44: Locks RAII, sempre nomeados
class ThreadSafeQueue {
public:
    void push(int value) {
        std::lock_guard<std::mutex> lock(mutex_);  // CP.44: nomeado
        queue_.push(value);
    }

    std::optional<int> pop() {
        std::lock_guard<std::mutex> lock(mutex_);
        if (queue_.empty()) return std::nullopt;
        int value = queue_.front();
        queue_.pop();
        return value;
    }

private:
    std::queue<int> queue_;
    mutable std::mutex mutex_;
};

// CP.21: Bloqueio de múltiplos mutexes com scoped_lock
void transfer(Account& from, Account& to, double amount) {
    std::scoped_lock locks(from.mutex, to.mutex);  // deadlock-safe
    from.balance -= amount;
    to.balance += amount;
}

Anti-Padrões

  • Chamar lock() sem unlock() correspondente (CP.20)
  • Usar volatile para sincronização entre threads (CP.8)
  • Espera ocupada sem condição (CP.42)
  • Não nomear instâncias de lock (CP.44)
  • Programação livre de locks desnecessária (CP.100)

Templates e Programação Genérica (T.*)

Regras Principais

RegraResumo
T.1Use templates para aumentar a abstração
T.10Especifique conceitos para todos os argumentos de template
T.20Evite dependências desnecessárias no contexto
T.41Requer apenas propriedades essenciais em parâmetros de template, não desnecessariamente completas
T.46Requer que os argumentos de template sejam tipos completos
T.47Evite parâmetros de template não tipados de alto nível
T.80Não use enable_if desnecessariamente

Uso de Conceitos

// T.10: Conceitos para restringir parâmetros de template
template<typename T>
concept Hashable = requires(T a) {
    { std::hash<T>{}(a) } -> std::convertible_to<std::size_t>;
};

template<Hashable T>
void use_as_key(const T& value) {
    auto hash = std::hash<T>{}(value);
    // ...
}

Anti-Padrões

  • Usar templates quando funções sobrecarregadas seriam suficientes (T.1)
  • Não usar conceitos em código C++20 (T.10)
  • Usar restrições complexas de enable_if quando conceitos são mais claros (T.80)

Perfil de Segurança de Tipos (Type)

Regras

RegraResumo
Type.1Evite casts
Type.2Use dynamic_cast apenas para navegar em hierarquias de herança
Type.3Use static_cast para conversões downcast que podem falhar
Type.4Use reinterpret_cast apenas em código de baixo nível próximo ao hardware
Type.5Use std::bit_cast para reinterpretar bits sem invocar UB
// Type.1: Prefira conversões seguras
int x = 42;
double y = static_cast<double>(x);  // OK: conversão numérica explícita

// Type.2 + Type.3: dynamic_cast navegação segura
if (auto* derived = dynamic_cast<Derived*>(base_ptr)) {
    derived->specific_method();
}

// Type.5: bit_cast para reinterpretação segura de bits
float f = 3.14f;
auto bits = std::bit_cast<std::uint32_t>(f);

Anti-Padrões

  • Casts estilo C (Type.1)
  • reinterpret_cast em código de alto nível (Type.4)

Perfil de Segurança de Limites (Bounds)

Regras

RegraResumo
Bounds.1Não acessar arrays além dos seus limites
Bounds.2Use contêineres da biblioteca padrão (como std::vector, std::array) para acionar verificações de limites
Bounds.3Use std::span e std::string_view para evitar ponteiros decaídos
// Bounds.2: std::vector com at() para verificação de limites
std::vector<int> vec = {1, 2, 3};
int val = vec.at(2);  // OK: lança std::out_of_range se fora dos limites

// Bounds.3: std::span para evitar decaimento de ponteiro
void process(std::span<int> data) {
    for (int& d : data) {
        d = d * 2;
    }
}

std::array<int, 5> arr = {1, 2, 3, 4, 5};
process(arr);  // OK: não decai para ponteiro

Anti-Padrões

  • Acessar arrays estilo C com índice não verificado (Bounds.1)
  • Passar std::vector como ponteiro decaído + tamanho (Bounds.3)

Perfil de Segurança de Ciclo de Vida (Lifetime)

Regras

RegraResumo
Lifetime.1Não retornar referências a objetos locais
Lifetime.2Não retornar ponteiros para objetos que já foram destruídos
Lifetime.3Não delegar de um ponteiro bruto para um smart pointer, a menos que a propriedade seja transferida
// Lifetime.1: Retornar por valor em vez de referência
std::string get_name() { return "example"; }  // OK

// RUIM: referência a objeto local
const std::string& get_name_bad() {
    std::string name = "example";
    return name;  // referência pendente!
}

// Lifetime.3: Propriedade clara com smart pointers
std::unique_ptr<Widget> create_widget() {
    return std::make_unique<Widget>();  // OK: propriedade transferida
}

void use_widget(Widget* w) {
    if (w) w->do_something();  // OK: observador não proprietário
}

Anti-Padrões

  • Retornar referências a objetos locais (Lifetime.1)
  • Transferir propriedade via ponteiro bruto (Lifetime.3)

Convenções de Nomenclatura e Estilo (NL.*)

Regras Principais

RegraResumo
NL.1Nomes devem comunicar intenção
NL.2Nomes devem ser legíveis e consistentes
NL.5Evite abreviações e siglas enigmáticas
NL.9Use capitalização consistente entre nomes
NL.10Use _ para separar palavras em nomes de funções e variáveis (snake_case)
NL.15Use nomes curtos para escopos pequenos, nomes longos para escopos grandes
NL.25Não use using namespace em escopo global em arquivos de cabeçalho

Convenções Recomendadas

ElementoConvençãoExemplo
Tipos (classes, structs, enums)PascalCaseclass WidgetRenderer
Funções e variáveissnake_casevoid render_widget();
Constantes e macrosUPPER_SNAKE_CASEconst int MAX_SIZE = 100;
Parâmetros de templatePascalCasetemplate<typename T>
Membros privadossnake_case com _ sufixoint value_;

Anti-Padrões

  • Abreviações como cnt, idx, tmp (NL.5)
  • Prefixos de tipo como m_, pWidget (exceto membros privados com _)
  • using namespace std; em cabeçalhos (NL.25)

Comentários e Documentação

Regras

RegraResumo
NL.1Comentários devem explicar "por que", não "como"
NL.2Comentários devem ser concisos e manter-se atualizados
NL.3Use documentação em linha quando útil
NL.4Use blocos de documentação para APIs públicas
NL.5Evite comentários óbvios que repetem o código

Exemplos

// BOM: Explica intenção e raciocínio
// Usa o algoritmo de Fisher-Yates para garantir shuffle uniforme
auto shuffled = fisher_yates_shuffle(data);

// RUIM: Comentário que apenas repete o código
// Incrementa o contador em 1
counter++;

Organização de Arquivos

Regras

RegraResumo
SF.1Use um sufixo para arquivos de implementação (.cpp) e cabeçalhos (.h ou .hpp)
SF.2Um arquivo .h não deve conter implementações de objeto ou funções não inline
SF.3Use #include com nomes de arquivo, não caminhos absolutos
SF.4Inclua o cabeçalho correspondente primeiro no arquivo .cpp
SF.5Um arquivo .cpp deve incluir o(s) cabeçalho(s) que define(m) sua interface
SF.6Use #pragma once ou guards de inclusão tradicionais para evitar inclusões múltiplas
SF.7Evite dependências de compilação desnecessárias entre cabeçalhos

Exemplo

// widget.h
#pragma once

#include <string>

class Widget {
public:
    explicit Widget(std::string name);
    std::string name() const;

private:
    std::string name_;
};

// widget.cpp
#include "widget.h"  // SF.4: cabeçalho correspondente primeiro

#include <iostream>

Widget::Widget(std::string name) : name_(std::move(name)) {}
std::string Widget::name() const { return name_; }

Anti-Padrões

  • Incluir arquivos .cpp diretamente (SF.2)
  • Misturar declaração e implementação em cabeçalhos para funções não inline (SF.2)
  • Usar #include com caminhos absolutos ou relativos complexos (SF.3)

Integração com C (CPL.*)

Regras

RegraResumo
CPL.1Prefira C++ a C a menos que a interoperabilidade seja obrigatória
CPL.2Se você deve usar C, use a intersecção comum de C e C++
CPL.3Use extern "C" para interfaces que precisam ser chamadas de C
// CPL.3: Interface que pode ser chamada de C
extern "C" {
    void c_interface_function(int x);
    double compute_value(double a, double b);
}

Anti-Padrões

  • Usar malloc/free em vez de new/delete ou smart pointers (CPL.1)
  • Usar casts estilo C extensivamente (CPL.2)

Ferramentas de Apoio

Uso com Linters e Analisadores

  • CLang-Tidy: Suporta a maioria das regras das Diretrizes Principais do C++
    clang-tidy --checks="cppcoreguidelines-*" source.cpp
    
  • CLang-Tidy com configuração personalizada: Use .clang-tidy para ajustar regras
    Checks: 'cppcoreguidelines-*,modernize-*'
    WarningsAsErrors: '*'
    HeaderFilterRegex: '.*'
    CheckOptions:
      cppcoreguidelines-avoid-magic-numbers: 'false'
    
  • VS Code com extensão C++: Configurar C_Cpp.codeAnalysis.clangTidy.enabled e adicionar "cppcoreguidelines-*" às verificações
  • Visual Studio: Habilitar "Code Analysis" com regras de Diretrizes Principais do C++
  • CMake com suporte a clang-tidy:
    set(CMAKE_CXX_CLANG_TIDY "clang-tidy")
    

Integração Contínua

Para garantir a aplicação das diretrizes, adicione verificações de linting ao pipeline de CI:

# Exemplo de workflow GitHub Actions para verificação de padrões de codificação C++
jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Install clang-tidy
        run: sudo apt-get install -y clang-tidy
      - name: Run clang-tidy
        run: |
          find . -name '*.cpp' -o -name '*.h' | xargs clang-tidy \
            --checks="cppcoreguidelines-*,modernize-*" \
            --warnings-as-errors="*"

Recursos Online

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/claude-api

Anthropic Claude API patterns for Python and TypeScript. Covers Messages API, streaming, tool use, vision, extended thinking, batches, prompt caching, and Claude Agent SDK. Use when building applications with the Claude API or Anthropic SDKs.

affaan-m/everything-claude-code

End-to-end marketing campaign planning and execution. Covers audience research, positioning, campaign angle definition, landing page copy, email sequences, social posts, ad copy, short-form video scripts, and content calendars. Use as the orchestration layer for multi-channel product launches. Use when planning or executing a multi-channel product launch, or producing landing page, email, social, or ad copy.

affaan-m/everything-claude-code

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/everything-claude-code-conventions

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/frontend-design

Create distinctive, production-grade frontend interfaces with high design quality. Use when the user asks to build web components, pages, or applications and the visual direction matters as much as the code quality.

affaan-m/gget

gget CLI and Python workflow for quick genomic database queries, sequence lookup, BLAST-style searches, enrichment checks, and reproducible bioinformatics evidence logs.

affaan-m/literature-review

Systematic literature-review workflow for academic, biomedical, technical, and scientific topics, including search planning, source screening, synthesis, citation checks, and evidence logging.

affaan-m/motion-ui

Production-ready UI motion system for React/Next.js. Use when implementing animations, transitions, or motion patterns.

affaan-m/project-guidelines-example

Example project-specific skill template based on a real production application.

affaan-m/pubmed-database

Direct PubMed and NCBI E-utilities search workflows for biomedical literature, MeSH queries, PMID lookup, citation retrieval, and API-backed literature monitoring.

affaan-m/scholar-evaluation

Structured scholarly-work evaluation for papers, proposals, literature reviews, methods sections, evidence quality, citation support, and research-writing feedback.

affaan-m/uspto-database

USPTO patent and trademark data workflow for official record lookup, PatentSearch queries, TSDR checks, assignment data, and reproducible IP research logs.

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.

Habilidades Relacionadas