본문으로 건너뛰기
cccskills
무료GitHub에 공개

coding-standards

Padrões de codificação universais, melhores práticas e padrões para desenvolvimento em TypeScript, JavaScript, React e Node.js.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

연동 도구SupabaseRedisOpenAI
설치 방법 보기

포함된 파일(1)

  • SKILL.md11.8 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

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

Padrões de codificação universais aplicáveis a todos os projetos.

Princípios de Qualidade de Código

1. Legibilidade em Primeiro Lugar

  • Código é lido mais do que escrito
  • Nomes de variáveis e funções claros
  • Código auto-documentado preferível a comentários
  • Formatação consistente

2. KISS (Keep It Simple, Stupid)

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

3. DRY (Don't Repeat Yourself)

  • Extraia lógica comum em funções
  • Crie componentes reutilizáveis
  • Compartilhe utilitários entre módulos
  • Evite programação copy-paste

4. YAGNI (You Aren't Gonna Need It)

  • Não construa features antes de serem necessárias
  • Evite generalidade especulativa
  • Adicione complexidade apenas quando necessário
  • Comece simples, refatore quando needed

Padrões TypeScript/JavaScript

Nomenclatura de Variáveis

// ✅ GOOD: Nomes descritivos
const marketSearchQuery = 'election'
const isUserAuthenticated = true
const totalRevenue = 1000

// ❌ BAD: Nomes pouco claros
const q = 'election'
const flag = true
const x = 1000

Nomenclatura de Funções

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

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

Padrão de Imutabilidade (CRÍTICO)

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

const updatedArray = [...items, newItem]

// ❌ NUNCA mutate diretamente
user.name = 'New Name'  // BAD
items.push(newItem)     // BAD

Tratamento de Erros

// ✅ GOOD: 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')
  }
}

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

Melhores Práticas com Async/Await

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

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

Segurança de Tipos

// ✅ GOOD: Tipos apropriados
interface Market {
  id: string
  name: string
  status: 'active' | 'resolved' | 'closed'
  created_at: Date
}

function getMarket(id: string): Promise<Market> {
  // Implementation
}

// ❌ BAD: Usando 'any'
function getMarket(id: any): Promise<any> {
  // Implementation
}

Melhores Práticas React

Estrutura de Componentes

// ✅ GOOD: 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>
  )
}

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

Custom Hooks

// ✅ GOOD: Custom hook 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

// ✅ GOOD: Atualizações de estado apropriadas
const [count, setCount] = useState(0)

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

// ❌ BAD: Referência direta ao estado
setCount(count + 1)  // Pode ser obsoleto em cenários async

Renderização Condicional

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

// ❌ BAD: Inferno de ternários
{isLoading ? <Spinner /> : error ? <ErrorMessage error={error} /> : data ? <DataDisplay data={data} /> : null}

Padrões de Design de API

Convenções REST API

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

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

Formato de Resposta

// ✅ GOOD: 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'

// ✅ GOOD: Validação com schema
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)
    // Prossiga com dados validados
  } catch (error) {
    if (error instanceof z.ZodError) {
      return NextResponse.json({
        success: false,
        error: 'Validation failed',
        details: error.errors
      }, { status: 400 })
    }
  }
}

Organização de Arquivos

Estrutura de Projeto

src/
├── app/                    # Next.js App Router
│   ├── api/               # Rotas de API
│   ├── markets/           # Páginas de markets
│   └── (auth)/           # Páginas de auth (route groups)
├── components/            # Componentes React
│   ├── ui/               # Componentes UI genéricos
│   ├── forms/            # Componentes de form
│   └── layouts/          # Componentes de layout
├── hooks/                # Custom hooks React
├── 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 & Documentação

Quando Comentar

// ✅ GOOD: Explique POR QUÊ, não O QUÊ
// Use exponential backoff para evitar sobrecarregar a API durante outages
const delay = Math.min(1000 * Math.pow(2, retryCount), 30000)

// Intencionalmente usando mutação aqui para performance com grandes arrays
items.push(newItem)

// ❌ BAD: Stating the obvious
// Incrementa contador por 1
count++

// Define nome para nome do usuário
name = user.name

JSDoc para APIs Públicas

/**
 * Busca markets usando similaridade semântica.
 *
 * @param query - Consulta de busca em linguagem natural
 * @param limit - Número máximo de resultados (padrão: 10)
 * @returns Array de markets ordenados por score de similaridade
 * @throws {Error} Se API OpenAI falhar ou Redis 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[]> {
  // Implementation
}

Melhores Práticas de Performance

Memoização

import { useMemo, useCallback } from 'react'

// ✅ GOOD: Memoize computações caras
const sortedMarkets = useMemo(() => {
  return markets.sort((a, b) => b.volume - a.volume)
}, [markets])

// ✅ GOOD: Memoize callbacks
const handleSearch = useCallback((query: string) => {
  setSearchQuery(query)
}, [])

Lazy Loading

import { lazy, Suspense } from 'react'

// ✅ GOOD: Lazy load componentes pesados
const HeavyChart = lazy(() => import('./HeavyChart'))

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

Queries de Banco de Dados

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

// ❌ BAD: Selecione tudo
const { data } = await supabase
  .from('markets')
  .select('*')

Padrões de Testes

Estrutura de Testes (Padrão AAA)

test('calculates similarity correctly', () => {
  // 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

// ✅ GOOD: Nomes de testes descritivos
test('returns empty array when no markets match query', () => { })
test('throws error when OpenAI API key is missing', () => { })
test('falls back to substring search when Redis unavailable', () => { })

// ❌ BAD: Nomes de testes vagos
test('works', () => { })
test('test search', () => { })

Detecção de Code Smell

Atente-se para estes anti-padrões:

1. Funções Longas

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

// ✅ GOOD: Divida em funções menores
function processMarketData() {
  const validated = validateData()
  const transformed = transformData(validated)
  return saveData(transformed)
}

2. Deep Nesting

// ❌ BAD: 5+ níveis de aninhamento
if (user) {
  if (user.isAdmin) {
    if (market) {
      if (market.isActive) {
        if (hasPermission) {
          // Faça algo
        }
      }
    }
  }
}

// ✅ GOOD: Early returns
if (!user) return
if (!user.isAdmin) return
if (!market) return
if (!market.isActive) return
if (!hasPermission) return

// Faça algo

3. Magic Numbers

// ❌ BAD: Números sem explicação
if (retryCount > 3) { }
setTimeout(callback, 500)

// ✅ GOOD: Constantes nomeadas
const MAX_RETRIES = 3
const DEBOUNCE_DELAY_MS = 500

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

Lembre-se: Qualidade de código não é negociável. Código claro e manutenível permite desenvolvimento rápido e refatoração confiante.

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

Especialista em construir experiências 3D para a web - Three.js, React Three Fiber, Spline, WebGL e cenas 3D interativas. Cobre configuradores de produtos, portfólios 3D, websites imersivos e adição de profundidade às experiências web. Use quando: website 3D, three.js, WebGL, react three fiber, experiência 3D.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

artubss/SKILLS-CLAUDE-CODE112026년 5월 17일 업데이트

Quando o usuário quer planejar, projetar ou implementar um teste A/B ou experimento. Também use quando o usuário menciona "teste A/B", "split test", "experimento", "testar essa mudança", "copy variante", "teste multivariado" ou "hipótese". Para implementação de rastreamento, veja analytics-tracking.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

artubss/SKILLS-CLAUDE-CODE112026년 5월 17일 업데이트

Auditar e melhorar a acessibilidade web seguindo as diretrizes WCAG 2.1. Use quando solicitado para "melhorar acessibilidade", "auditoria a11y", "conformidade WCAG", "suporte a leitor de tela", "navegação por teclado" ou "tornar acessível".

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

artubss/SKILLS-CLAUDE-CODE112026년 5월 17일 업데이트

Testes e benchmarking de agentes LLM incluindo testes comportamentais, avaliação de capacidades, métricas de confiabilidade e monitoramento em produção—onde até os melhores agentes alcançam menos de 50% em benchmarks do mundo real. Use quando: testes de agentes, avaliação de agentes, benchmark de agentes, confiabilidade de agentes, teste de agentes.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

artubss/SKILLS-CLAUDE-CODE112026년 5월 17일 업데이트

Criar, gerenciar e orquestrar agentes de IA usando o CLI AI Maestro. Use quando o usuário pedir para "criar agente", "listar agentes", "deletar agente", "hibernar agente", "despertar agente", "instalar plugin", "mostrar agente", "reiniciar agente" ou qualquer tarefa de gerenciamento do ciclo de vida do agente.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

artubss/SKILLS-CLAUDE-CODE112026년 5월 17일 업데이트

Gerencie múltiplos agentes CLI locais via sessões tmux (iniciar/parar/monitorar/atribuir) com agendamento compatível com cron.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

artubss/SKILLS-CLAUDE-CODE112026년 5월 17일 업데이트

artubss의 스킬 모두 보기

이 스킬의 문제 신고