Nutz95/CursorCodingSkills

Diretrizes SOLID C++ / ESP32 para firmware: limites de tamanho de arquivo/classe, sem classes aninhadas, injeção de dependência estrita em raízes de composição, sem UNIT_TEST / ifdefs de teste em cabeçalhos de produção (e evitar em .cpp), sem segredos codificados, um tipo por cabeçalho público, comentários /// na API pública, pinagem de rádio dual-core (PRO_CPU 0 / APP_CPU 1), padrões seguros para FreeRTOS. Use ao editar firmware ESP-IDF, Arduino-ESP32, PlatformIO ou tarefas ESP-NOW / BLE / Wi-Fi.

O que é CursorCodingSkills?

Esta skill fornece um conjunto de guardrails (salvaguardas) para desenvolvimento de firmware ESP32 em C++, com foco nos princípios SOLID, boas práticas de arquitetura e segurança. Ela impõe limites rígidos de tamanho de arquivo (máximo ~400 linhas) e de classe (~30 métodos), além de proibir classes aninhadas para manter a coesão. A injeção de dependência (DI) é promovida estritamente, com a construção de adaptadores concretos ocorrendo apenas na raiz de composição (main.cpp), enquanto o código de domínio depende de interfaces (I*), facilitando testes unitários com fakes em ambiente host. A skill proíbe terminantemente o uso de `#ifdef UNIT_TEST` em cabeçalhos de produção e desaconselha seu uso em arquivos .cpp, recomendando DI como alternativa. Regras de segurança incluem a proibição de senhas e tokens codificados no código-fonte, que devem ser injetados via variáveis de ambiente. Para arquitetura dual-core do ESP32, a skill padroniza a fixação de tarefas de rádio (Wi-Fi, BLE, ESP-NOW) ao PRO_CPU (core 0) e tarefas pesadas de aplicação ao APP_CPU (core 1), usando constantes nomeadas. A skill é especialmente útil para quem desenvolve com ESP-IDF, Arduino-ESP32, PlatformIO e protocolos como ESP-NOW, BLE e Wi-Fi, garantindo código limpo, testável e seguro.

Funciona com~Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/Nutz95/CursorCodingSkills/tree/HEAD/skills/solid-cpp-esp32

Installed? Explore more Produtividade e Colaboração skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

Perguntar na sua IA favorita

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

Documentação

SOLID C++ ESP32

Limites rígidos

  • Prefira arquivos com menos de 400 linhas; divida quando uma unidade de tradução acumular múltiplas responsabilidades
  • Máximo de ~30 métodos por classe
  • Prefira corpos de função com ~60 linhas (extraia helpers)
  • Sem classes aninhadas — mova tipos internos para seu próprio cabeçalho / unidade de tradução
  • Exatamente um tipo primário (class / struct / enum / enum class) por cabeçalho público quando o projeto optar por isso (superfícies restritas / de inicialização)

Linguagem e estilo

  • Código/comentários/documentos commitados em Inglês
  • Sempre use chaves para if / for / while / switch
  • Sem corpos de função de uma linha para lógica não trivial
  • Nomes descritivos (telemetryManager, não mgr / tmp exceto para índices de loop triviais)
  • Prefira um bloco namespace por unidade de tradução
  • Cabeçalhos declaram intenção; arquivos .cpp permaneçam simples e diretos
  • Métodos públicos em interfaces I*.h (e outros cabeçalhos públicos optados) precisam de um comentário de intenção /// em uma linha

Arquitetura (SOLID + DI)

  • Prefira interfaces (I*) nas fronteiras de domínio
  • Dependa de abstrações no código de aplicação / domínio; construa adaptadores concretos apenas em main.cpp ou uma raiz de composição explícita
  • Hardware (BLE, Wi-Fi, display, NVS, barramentos) permanece atrás de interfaces para que testes unitários host usem fakes — não #ifdef cirúrgico
  • Prefira pequenos parsers puros testados unitariamente em builds native / host
  • Prefira composição ao invés de crescer objetos Deus
  • Converta void* do FreeRTOS em um ponteiro tipado nomeado imediatamente
  • Prefira helpers do projeto (ex.: cópia segura de C-string) ao invés de variantes de strncpy

Isolamento de domínio / camada

  • Mantenha stacks exclusivas do hub (web, auth, OTA, API HTTP) fora dos alvos bridge / leaf
  • Não faça #include de cabeçalhos de adaptadores concretos da camada errada; se uma salvaguarda listar nomes de adaptadores, obedeça-a

Sem instrumentação de teste em APIs de produção

O código de produção não deve ser moldado por flags de build de teste.

  • Proibido em cabeçalhos e .cpp: UNIT_TEST, #ifdef UNIT_TEST, #ifndef UNIT_TEST, #if defined(UNIT_TEST), ou qualquer gate equivalente apenas para teste (esp_cpp_guardrails falha por padrão)
  • Prefira DI: extraia uma interface, injete um fake em testes host, ou exclua TUs de adaptadores de dispositivo do native / host build_src_filter — nunca faça stub com ifdef em fontes de produção
  • Detecção de plataforma (__has_include(<esp_random.h>), ESP_PLATFORM) é aceitável; flags de build de teste que remodelam lógica de produção não são
  • Mantenha tipos portáveis em cabeçalhos (std::mutex, etc.) ou includes incondicionais de dispositivo em TUs exclusivas de dispositivo

Cheiro → correção:

CheiroCorreção
#ifndef UNIT_TEST em torno de chamadas Wi-Fi / BLE em um serviçoInjete IWifiConnector / IBleClient; use fake em testes host
Cabeçalho que muda de tipo quando UNIT_TESTTipo portável sempre, ou divida adaptador de dispositivo
Classe Deus precisa de ifdefs para compilar no hostDivida responsabilidades; raiz de composição conecta adaptadores

Segredos

  • Nunca codifique senhas Wi-Fi, senhas OTA / web, segredos de dispositivo, PMKs, tokens ou credenciais LAN no código-fonte
  • Injete segredos via variáveis de ambiente / flags de build consumidas pelo PlatformIO (ou equivalente) — nunca faça commit de .env com segredos reais

FreeRTOS dual-core (ESP32)

O ESP32 clássico tem dois núcleos:

NúcleoIDUso típico
PRO_CPU0Trabalho adjacente a Wi-Fi / BT / rádio (loops de TX/RX ESP-NOW, tarefas de rádio BLE/SPP)
APP_CPU1Trabalho pesado de aplicação: UI de display, HTTP/web, rajadas de parsing, SD, loops não relacionados a rádio

Padrões (substitua apenas com um caso especial documentado):

  • Fixe tarefas sensíveis a rádio / pilha com xTaskCreatePinnedToCore(..., kRadioCoreId) onde kRadioCoreId = 0
  • Fixe tarefas de UI / não rádio pesadas para kAppCoreId = 1
  • Evite trabalho bloqueante longo no core 0; ele sufoca a pilha de rádio
  • Prefira constantes nomeadas (kRadioCoreId / kAppCoreId) ao invés de números mágicos 0 / 1

Validação

  • Execute o script de salvaguardas do projeto (ou tools/esp_cpp_guardrails) após mudanças estruturais
  • Adicione a menor verificação host/unit que falhe se nova lógica quebrar
  • Compile após mudanças em interfaces
  • Atualize o README quando comportamento, scripts, suposições de hardware ou arquitetura mudarem
  • Prefira uma revisão de qualidade de código bloqueadora antes do merge quando o projeto exigir

Lista de verificação

  • Chaves em toda parte; identificadores/comentários em Inglês
  • Abaixo de ~400 linhas / ~30 métodos; sem classe aninhada
  • Adaptadores concretos apenas na raiz de composição; domínio depende de I*
  • Sem UNIT_TEST / ifdefs de teste em cabeçalhos; evite-os em .cpp
  • Sem segredos codificados
  • /// em novos métodos de interface pública
  • Tarefas de rádio no core 0; trabalho pesado de aplicação no core 1 (a menos que exceção documentada)
  • Salvaguardas / testes verdes

Individual skills in this repo

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

Habilidades Relacionadas