| name | code-documentation-pro |
| description | Documentation de code avec commentaires, docstrings et annotations de qualité. Se déclenche avec "documenter mon code", "commentaires", "docstring", "JSDoc", "XML doc", "annotations", "code comments", "autodoc". Also triggers on "document this code", "write docstrings", "add code comments". |
Code Documentation Pro
Philosophie : commenter le POURQUOI, pas le QUOI
Le code bien écrit s'auto-documente (noms clairs, fonctions courtes, types expressifs).
Un commentaire qui répète le code est du bruit. Un commentaire qui explique une décision non-évidente est de la valeur.
i += 1
i += 1
Workflow en étapes
1. Choisir le format adapté au langage
| Langage | Format | Outils de génération |
|---|
| Python | Google style / NumPy style | Sphinx + autodoc, pdoc |
| TypeScript / JavaScript | JSDoc (/** */) | TypeDoc |
| C# | XML doc (///) | DocFX, Sandcastle |
| Java | Javadoc (/** */) | Javadoc CLI, Dokka |
| Go | GoDoc (commentaire au-dessus du symbole) | go doc, pkg.go.dev |
| C++ | Doxygen | Doxygen |
2. Structurer chaque docstring publique
Ordre canonique : description courte → paramètres → retour → exceptions → exemple.
Python (Google style) :
def charge_payment(amount: Decimal, currency: str, idempotency_key: str) -> PaymentResult:
"""Débite le montant depuis la passerelle configurée.
N'effectue aucune opération si la clé d'idempotence est déjà connue (replay safe).
Args:
amount: Montant en unité principale (ex: 10.50 pour 10,50 TND).
currency: Code ISO 4217 en majuscules (ex: "TND").
idempotency_key: UUID v4 unique par tentative, persisté avant l'appel.
Returns:
PaymentResult avec status, transaction_id et timestamp.
Raises:
InsufficientFundsError: Si le solde est insuffisant.
GatewayTimeoutError: Si la passerelle ne répond pas en < 10 s.
Examples:
>>> result = charge_payment(Decimal("50.00"), "TND", str(uuid4()))
>>> assert result.status == "SUCCESS"
"""
TypeScript (JSDoc) :
export function generateJwt(payload: JwtPayload, ttlSeconds = 3600): string { ... }
C# (XML doc) :
public static long ComputeNetCommission(long grossAmount, decimal feeRate) { ... }
3. Commenter les cas non-évidents dans le corps
for (const batch of batches) {
await processBatch(batch);
}
ts = datetime.fromtimestamp(raw["created_at"] / 1000, tz=timezone.utc)
4. Utiliser les types comme documentation exécutable
Préférer des types expressifs aux primitives nues :
function transfer(from: string, to: string, amount: number): boolean
function transfer(from: AccountId, to: AccountId, amount: MoneyMillimes): TransferResult
En Python, utiliser TypeAlias et NewType :
from typing import NewType
UserId = NewType("UserId", str)
AmountMillimes = NewType("AmountMillimes", int)
5. Documenter les TODO/FIXME avec contexte
Format recommandé :
6. Configurer la génération automatique
Python (Sphinx + autodoc) :
pip install sphinx sphinx-autodoc-typehints
sphinx-quickstart docs/
extensions = ["sphinx.ext.autodoc", "sphinx_autodoc_typehints"]
make -C docs html
TypeScript (TypeDoc) :
npx typedoc --entryPointStrategy expand src --out docs/api
CI GitHub Actions :
- name: Generate docs
run: npx typedoc --out docs/api
- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v4
with:
publish_dir: docs/api
7. Linter la documentation
pip install pydocstyle
pydocstyle --convention=google src/
npm install eslint-plugin-jsdoc
npx eslint src/ --rule 'jsdoc/require-jsdoc: warn'
8. Documenter l'architecture au niveau module
Chaque package/module expose un README.md minimal :
- Rôle du module (1-2 phrases)
- Dépendances directes et leurs raisons
- Patterns utilisés (ex: Repository, CQRS)
- Invariants et contraintes (ex: "toutes les mutations passent par le CommandBus")
Critères de décision
| Situation | Action |
|---|
| Fonction publique d'une librairie/API | Docstring complète obligatoire |
| Fonction privée triviale (< 5 lignes, nom explicite) | Pas de docstring nécessaire |
| Algorithme complexe ou optimisation non-évidente | Commentaire + référence (article, issue, ADR) |
| Workaround ou hack temporaire | Commentaire avec auteur, date, lien ticket |
| Code de sécurité / paiement | Documenter les invariants, pré/post-conditions |
| Module public stable | README + génération auto dans CI |
Anti-patterns et pièges
- Commentaire qui ment : un commentaire obsolète est pire qu'aucun commentaire. Revoir en même temps que le code qu'il décrit.
- Sur-documentation du code trivial :
// retourne true si actif au-dessus de return this.isActive — inutile.
- Docstring sans exemple pour les cas complexes : les exemples réduisent les allers-retours des consommateurs de l'API.
- TODO sans propriétaire ni date : devient un commentaire fantôme jamais traité.
- Documentation séparée du code : le code change, le doc Word ne suit pas. Seul autodoc est fiable.
- Traduire le type dans le texte :
@param amount {number} en JSDoc quand TypeScript infère déjà le type — redondant, peut diverger.
- Oublier les exceptions : la moitié des bugs consommateur vient d'une exception non-documentée.
Bonnes pratiques 2026
- Activer
strict TypeScript + py.typed marker pour que l'IDE affiche les docstrings inline.
- Utiliser des LLM pour générer un premier jet de docstring, puis relire / corriger la sémantique métier.
- Intégrer un diff de documentation dans les PR reviews (TypeDoc, Sphinx supportent les outputs comparables).
- Préférer les tests nommés explicitement comme complément de documentation (
should_reject_payment_when_wallet_frozen) — ils ne se désynchronisent jamais.
- Pour les APIs REST, garder OpenAPI comme source de vérité et générer le client + la doc depuis le contrat (contract-first).