Communitygithub.com

normes-de-code

Conventions de codage inter-projets pour la nommage, la lisibilité, l'immuabilité et la revue de qualité. Utilisez les skills frontend ou backend pour les schémas spécifiques aux frameworks.

Qu'est-ce que normes-de-code ?

Ce skill, intitulé *Coding Standards & Best Practices*, établit les conventions de codage fondamentales applicables à tous les projets. Il sert de socle commun et ne remplace pas les guides spécifiques aux frameworks (comme `frontend-patterns` ou `backend-patterns`). Il est activé lors du démarrage de nouveaux projets, de la revue de code, du refactoring, ou pour assurer la cohérence du nommage et de la structure. Les principes clés incluent la lisibilité, les principes KISS, DRY, YAGNI, l'immuabilité (avec une utilisation obligatoire de l'opérateur spread en TypeScript), une gestion robuste des erreurs, et des standards pour le développement React (composants typés, hooks personnalisés, gestion d'état). Il couvre également les conventions API REST, l'organisation des fichiers, les bonnes pratiques de performance (mémoïsation, chargement paresseux), les tests (pattern AAA), et la détection d'odeurs de code (fonctions longues, imbrication profonde, nombres magiques). Ce skill est conçu pour les agents utilisant Claude Code, Cursor, Codex ou des outils similaires, et garantit que tout code produit respecte des standards de qualité élevés et une maintenabilité optimale.

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

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Normes de Codage & Bonnes Pratiques

Conventions de codage de base applicables à tous les projets.

Ce skill constitue le socle commun, et non le guide détaillé pour un framework spécifique.

  • Utilisez frontend-patterns pour React, la gestion d'état, les formulaires, le rendu et l'architecture UI.
  • Utilisez backend-patterns ou api-design pour les couches repository/service, la conception d'endpoints, la validation et les préoccupations propres au serveur.
  • Utilisez rules/common/coding-style.md lorsque vous avez besoin de la couche de règle réutilisable la plus courte plutôt que d'un guide complet.

Quand Activer

  • Démarrer un nouveau projet ou module
  • Réviser le code pour la qualité et la maintenabilité
  • Refactoriser du code existant pour suivre les conventions
  • Appliquer la cohérence du nommage, du formatage ou de la structure
  • Mettre en place des règles de linting, de formatage ou de vérification de types
  • Intégrer de nouveaux contributeurs aux conventions de codage

Limites du Périmètre

Activez ce skill pour :

  • le nommage descriptif
  • les valeurs par défaut d'immuabilité
  • le respect de la lisibilité, KISS, DRY et YAGNI
  • la gestion des erreurs et la revue des odeurs de code

N'utilisez pas ce skill comme source principale pour :

  • la composition React, les hooks ou les schémas de rendu
  • l'architecture backend, la conception d'API ou la stratification de base de données
  • les conseils spécifiques à un domaine framework lorsqu'un skill ECC plus restreint existe déjà

Principes de Qualité du Code

1. La Lisibilité d'Abord

  • Le code est plus souvent lu qu'écrit
  • Noms de variables et fonctions clairs
  • Préférer un code auto-documenté aux commentaires
  • Formatage cohérent

2. KISS (Keep It Simple, Stupid - Restez Simple)

  • La solution la plus simple qui fonctionne
  • Éviter le sur-engineering
  • Pas d'optimisation prématurée
  • Facile à comprendre > code astucieux

3. DRY (Don't Repeat Yourself - Ne vous répétez pas)

  • Extraire la logique commune dans des fonctions
  • Créer des composants réutilisables
  • Partager des utilitaires entre modules
  • Éviter la programmation par copier-coller

4. YAGNI (You Aren't Gonna Need It - Vous n'en aurez pas besoin)

  • Ne construisez pas des fonctionnalités avant qu'elles ne soient nécessaires
  • Évitez la généralisation spéculative
  • N'ajoutez de la complexité que lorsque c'est requis
  • Commencez simple, refactorisez si nécessaire

Normes TypeScript/JavaScript

Nommage des Variables

// RÉUSSI : BON : Noms descriptifs
const marketSearchQuery = 'election'
const isUserAuthenticated = true
const totalRevenue = 1000

// ÉCHEC : MAUVAIS : Noms peu clairs
const q = 'election'
const flag = true
const x = 1000

Nommage des Fonctions

// RÉUSSI : BON : Motif verbe-nom
async function fetchMarketData(marketId: string) { }
function calculateSimilarity(a: number[], b: number[]) { }
function isValidEmail(email: string): boolean { }

// ÉCHEC : MAUVAIS : Peu clair ou nom uniquement
async function market(id: string) { }
function similarity(a, b) { }
function email(e) { }

Motif d'Immuabilité (CRITIQUE)

// RÉUSSI : TOUJOURS utiliser l'opérateur spread
const updatedUser = {
  ...user,
  name: 'New Name'
}

const updatedArray = [...items, newItem]

// ÉCHEC : NE JAMAIS muter directement
user.name = 'New Name'  // MAUVAIS
items.push(newItem)     // MAUVAIS

Gestion des Erreurs

// RÉUSSI : BON : Gestion complète des erreurs
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')
  }
}

// ÉCHEC : MAUVAIS : Aucune gestion d'erreur
async function fetchData(url) {
  const response = await fetch(url)
  return response.json()
}

Bonnes Pratiques Async/Await

// RÉUSSI : BON : Exécution parallèle quand c'est possible
const [users, markets, stats] = await Promise.all([
  fetchUsers(),
  fetchMarkets(),
  fetchStats()
])

// ÉCHEC : MAUVAIS : Séquentiel quand ce n'est pas nécessaire
const users = await fetchUsers()
const markets = await fetchMarkets()
const stats = await fetchStats()

Sécurité des Types

// RÉUSSI : BON : Types appropriés
interface Market {
  id: string
  name: string
  status: 'active' | 'resolved' | 'closed'
  created_at: Date
}

function getMarket(id: string): Promise<Market> {
  // Implémentation
}

// ÉCHEC : MAUVAIS : Utilisation de 'any'
function getMarket(id: any): Promise<any> {
  // Implémentation
}

Bonnes Pratiques React

Structure des Composants

// RÉUSSI : BON : Composant fonctionnel avec types
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>
  )
}

// ÉCHEC : MAUVAIS : Pas de types, structure peu claire
export function Button(props) {
  return <button onClick={props.onClick}>{props.children}</button>
}

Hooks Personnalisés

// RÉUSSI : BON : Hook personnalisé réutilisable
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
}

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

Gestion d'État

// RÉUSSI : BON : Mises à jour correctes de l'état
const [count, setCount] = useState(0)

// Mise à jour fonctionnelle pour un état basé sur l'état précédent
setCount(prev => prev + 1)

// ÉCHEC : MAUVAIS : Référence directe à l'état
setCount(count + 1)  // Peut être obsolète dans des scénarios asynchrones

Rendu Conditionnel

// RÉUSSI : BON : Rendu conditionnel clair
{isLoading && <Spinner />}
{error && <ErrorMessage error={error} />}
{data && <DataDisplay data={data} />}

// ÉCHEC : MAUVAIS : Enfer ternaire
{isLoading ? <Spinner /> : error ? <ErrorMessage error={error} /> : data ? <DataDisplay data={data} /> : null}

Normes de Conception d'API

Conventions REST API

GET    /api/markets              # Lister tous les marchés
GET    /api/markets/:id          # Obtenir un marché spécifique
POST   /api/markets              # Créer un nouveau marché
PUT    /api/markets/:id          # Mettre à jour un marché (complet)
PATCH  /api/markets/:id          # Mettre à jour un marché (partiel)
DELETE /api/markets/:id          # Supprimer un marché

# Paramètres de requête pour le filtrage
GET /api/markets?status=active&limit=10&offset=0

Format de Réponse

// RÉUSSI : BON : Structure de réponse cohérente
interface ApiResponse<T> {
  success: boolean
  data?: T
  error?: string
  meta?: {
    total: number
    page: number
    limit: number
  }
}

// Réponse de succès
return NextResponse.json({
  success: true,
  data: markets,
  meta: { total: 100, page: 1, limit: 10 }
})

// Réponse d'erreur
return NextResponse.json({
  success: false,
  error: 'Invalid request'
}, { status: 400 })

Validation des Entrées

import { z } from 'zod'

// RÉUSSI : BON : Validation par schéma
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)
    // Continuer avec les données validées
  } catch (error) {
    if (error instanceof z.ZodError) {
      return NextResponse.json({
        success: false,
        error: 'Validation failed',
        details: error.issues
      }, { status: 400 })
    }
  }
}

Organisation des Fichiers

Structure du Projet

src/
├── app/                    # Router d'application Next.js
│   ├── api/               # Routes API
│   ├── markets/           # Pages des marchés
│   └── (auth)/           # Pages d'authentification (groupes de routes)
├── components/            # Composants React
│   ├── ui/               # Composants UI génériques
│   ├── forms/            # Composants de formulaire
│   └── layouts/          # Composants de mise en page
├── hooks/                # Hooks React personnalisés
├── lib/                  # Utilitaires et configurations
│   ├── api/             # Clients API
│   ├── utils/           # Fonctions d'aide
│   └── constants/       # Constantes
├── types/                # Types TypeScript
└── styles/              # Styles globaux

Nommage des Fichiers

components/Button.tsx          # PascalCase pour les composants
hooks/useAuth.ts              # camelCase avec le préfixe 'use'
lib/formatDate.ts             # camelCase pour les utilitaires
types/market.types.ts         # camelCase avec le suffixe .types

Commentaires & Documentation

Quand Commenter

// RÉUSSI : BON : Expliquer POURQUOI, pas QUOI
// Utiliser un backoff exponentiel pour éviter de submerger l'API pendant les pannes
const delay = Math.min(1000 * Math.pow(2, retryCount), 30000)

// Utilisation délibérée de la mutation ici pour les performances avec de grands tableaux
items.push(newItem)

// ÉCHEC : MAUVAIS : Énoncer l'évidence
// Incrémenter le compteur de 1
count++

// Définir le nom sur le nom de l'utilisateur
name = user.name

JSDoc pour les API Publiques

/**
 * Recherche des marchés par similarité sémantique.
 *
 * @param query - Requête de recherche en langage naturel
 * @param limit - Nombre maximum de résultats (défaut : 10)
 * @returns Tableau de marchés triés par score de similarité
 * @throws {Error} Si l'API OpenAI échoue ou si Redis est indisponible
 *
 * @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[]> {
  // Implémentation
}

Bonnes Pratiques de Performance

Mémoïsation

import { useMemo, useCallback } from 'react'

// RÉUSSI : BON : Mémoïser les calculs coûteux
// Copier avant de trier - Array.prototype.sort mute le tableau original
const sortedMarkets = useMemo(() => {
  return [...markets].sort((a, b) => b.volume - a.volume)
}, [markets])

// RÉUSSI : BON : Mémoïser les callbacks
const handleSearch = useCallback((query: string) => {
  setSearchQuery(query)
}, [])

Chargement Paresseux (Lazy Loading)

import { lazy, Suspense } from 'react'

// RÉUSSI : BON : Chargement paresseux des composants lourds
const HeavyChart = lazy(() => import('./HeavyChart'))

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

Requêtes Base de Données

// RÉUSSI : BON : Sélectionner uniquement les colonnes nécessaires
const { data } = await supabase
  .from('markets')
  .select('id, name, status')
  .limit(10)

// ÉCHEC : MAUVAIS : Tout sélectionner
const { data } = await supabase
  .from('markets')
  .select('*')

Normes de Test

Structure de Test (Motif AAA)

test('calcule correctement la similarité', () => {
  // Arrange
  const vector1 = [1, 0, 0]
  const vector2 = [0, 1, 0]

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

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

Nommage des Tests

// RÉUSSI : BON : Noms de tests descriptifs
test('retourne un tableau vide quand aucun marché ne correspond à la requête', () => { })
test('lève une erreur quand la clé API OpenAI est manquante', () => { })
test('utilise la recherche par sous-chaîne comme solution de repli quand Redis est indisponible', () => { })

// ÉCHEC : MAUVAIS : Noms de tests vagues
test('fonctionne', () => { })
test('test recherche', () => { })

Détection d'Odeurs de Code

Surveillez ces anti-patrons :

1. Fonctions Longues

// ÉCHEC : MAUVAIS : Fonction > 50 lignes
function processMarketData() {
  // 100 lignes de code
}

// RÉUSSI : BON : Diviser en fonctions plus petites
function processMarketData() {
  const validated = validateData()
  const transformed = transformData(validated)
  return saveData(transformed)
}

2. Imbrication Profonde

// ÉCHEC : MAUVAIS : 5+ niveaux d'imbrication
if (user) {
  if (user.isAdmin) {
    if (market) {
      if (market.isActive) {
        if (hasPermission) {
          // Faire quelque chose
        }
      }
    }
  }
}

// RÉUSSI : BON : Retours anticipés
if (!user) return
if (!user.isAdmin) return
if (!market) return
if (!market.isActive) return
if (!hasPermission) return

// Faire quelque chose

3. Nombres Magiques

// ÉCHEC : MAUVAIS : Nombres non expliqués
if (retryCount > 3) { }
setTimeout(callback, 500)

// RÉUSSI : BON : Constantes nommées
const MAX_RETRIES = 3
const DEBOUNCE_DELAY_MS = 500

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

Rappel : La qualité du code n'est pas négociable. Un code clair et maintenable permet un développement rapide et un refactoring en toute confiance.

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.

Skills associés