Pular para o conteúdo

Convenções de Código

Esta página documenta todos os padrões de código adotados na codebase do Juca. Seguir essas convenções garante consistência e torna a codebase previsível tanto para contribuidores humanos quanto para IAs.

ContextoConvençãoExemplo
ComponentesPascalCaseWorkCanvas.tsx, PhaseRail.tsx
HookscamelCase com prefixo useuseFeatureFlag, useSSEStream
Server ActionscamelCaseupdateDiagnosis, evaluatePrecedent
Rotas de APIdiretórios em kebab-casedocument-metadata/, validate-processo/
Tipos de blocosnake_caserisk_balance, exit_card, action_prompt
Feature flagscamelCaseunifiedHome, deepMode
Tokens CSSkebab-case com prefixo ----color-primary, --radius-xl

A codebase usa dois padrões de autenticação. Nunca os misture:

Server Actions — Use requireActionAuth():

src/actions/briefing.ts
'use server';
import { requireActionAuth } from '@/actions/utils';
export async function updateDiagnosis(sessionId: string, fields: object) {
const user = await requireActionAuth(); // lança erro se não autorizado
// ...
}

Rotas de API — Use auth() diretamente:

src/app/api/unified/sessions/route.ts
import { auth } from '@/lib/auth';
export async function GET() {
const session = await auth();
if (!session?.user) return new Response('Unauthorized', { status: 401 });
// ...
}

Sempre use funções factory para criar blocos:

import { createDiagnosisData } from '@/lib/blocks/types';
import { getBlocksDB } from '@/lib/db/sessions';
const blockData = createDiagnosisData(analysis);
await getBlocksDB().addBlock({
sessionId,
type: 'diagnosis',
data: blockData
});

Os parâmetros de rota no Next.js 16 são baseados em Promise:

export async function GET(
request: Request,
{ params }: { params: Promise<{ id: string }> }
) {
const { id } = await params; // Precisa de await!
// ...
}
feat(scope): description # Nova funcionalidade
fix(scope): description # Correção de bug
docs: description # Apenas documentação
chore: description # Manutenção, dependências

Escopos: rewrite, briefing, deploy, lint, test, auth, etc.

Todos os commits incluem um header de co-autor:

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Abordagem CSS-first do Tailwind v4 — tokens em src/app/globals.css:

:root {
--color-primary: #000000;
--color-accent: #fff06d;
--color-bg-primary: #ffffff;
}

Utilitários de animação disponíveis:

ClasseEfeito
animate-fade-in300ms fadeIn (translateY 10px→0, opacity 0→1)
spring-transitioncubic-bezier(0.34, 1.56, 0.64, 1) para sensação de mola
animate-pulsePulse nativo do Tailwind
scroll-smooth-blockComportamento de scroll suave

Para animações escalonadas:

<div style={{
animationDelay: `${index * 100}ms`,
animationFillMode: 'backwards'
}}>

Todos os imports usam o alias @/. Ordem:

// 1. React / Next.js
import React, { useState } from 'react';
import { NextResponse } from 'next/server';
// 2. Bibliotecas externas
import { jsPDF } from 'jspdf';
// 3. Bibliotecas internas
import { auth } from '@/lib/auth';
import { getBlocksDB } from '@/lib/db/sessions';
// 4. Componentes
import { WorkCanvas } from '@/components/canvas/WorkCanvas';
// 5. Tipos
import type { Block, BlockType } from '@/types/blocks';
  • TypeScript em modo estrito — todo o código deve passar no tsc sem erros
  • ESLint com regras do Next.js (configuração flat em eslint.config.mjs)
  • Sem Prettier — o ESLint cuida da formatação
  • Sem console.log em código de produção — use o logger centralizado em src/lib/logger.ts