f61fc5c61f
- Clean README.md with installation, usage, CLI, examples - Move data formats to docs/data-formats/ (map.md, monster.md, pc-sheets.md, index.md) - Move architecture to docs/architecture/ (index.md, technical-architecture.md, phase-2-llm-architecture.md) - Add contributing guidelines in docs/contributing.md - Clean README.md: install, usage, CLI, data-formats/rules/architecture links, contributing link
4.5 KiB
4.5 KiB
Guidelines de contribution
Merci de votre intérêt pour contribuer à pf1e-simulator !
Standards de code
Langage & outils
- Python ≥ 3.12 — typage strict, pas de
Any, pas de# type: ignore - uv pour la gestion de l'environnement (
uv sync --dev) - Ruff :
select = ["ALL"], longueur de ligne 100 - Basedpyright : mode strict sur
srcettests - Pytest : tests déterministes, transcripts épinglés
Conventions Python
- Dataclasses frozen par défaut (
@dataclass(frozen=True)) - Types explicites — pas d'inférence ambiguë
- Docstrings sur les API publiques (modules, classes, fonctions publiques)
- EM101/EM102 : messages d'erreur explicites (
msg = ...; raise X(msg)) - Pas de
type: ignore/cast()/Any— le typage strict est la norme
Architecture
- Modules petits (< 250 lignes) — séparation des responsabilités
- Pas de cycles d'import — dépendances unidirectionnelles
- Interfaces explicites —
Protocolou classes abstraites pour l'injection - Tests purs — pas de réseau, pas d'état global,
FakeLLMClientpour LLM
Processus de développement
1. Branche & commits
git checkout -b feat/ma-fonctionnalité
# Travail...
git add -A
git commit -m "feat(scope): description courte
Description plus longue si nécessaire, wrapping à 72 caractères.
Refs: #issue-number"
Style de commit : Conventional Commits
feat(scope): ...— nouvelle fonctionnalitéfix(scope): ...— correction de bugdocs(scope): ...— documentationrefactor(scope): ...— refactoring sans changement fonctionneltest(scope): ...— ajout/modification de testschore: ...— maintenance (deps, config, etc.)
2. Gate de validation (obligatoire avant PR)
uv run pytest -q
uv run ruff check src tests
uv run basedpyright src
Tous doivent passer — pas d'exceptions.
3. Tests
- Couverture : nouvelles fonctionnalités = nouveaux tests
- Determinisme :
ScriptedRng/FakeLLMClientpour tests LLM - Transcripts épinglés : combats 1v1/2v2 scriptés
- Assertions statistiques : forme fermée (bande 3σ sur matchup symétrique)
- Noms de tests :
test_<fonctionnalité>_<scénario>_<résultat_attendu>
4. Documentation
- API publiques : docstrings complètes
- Architecture : mises à jour dans
docs/architecture/ - Règles : conformité SRD dans
docs/rules/conformance-srd.md - Formats : exemples dans
docs/data-formats/
Types de contributions
Bug fixes
- Ouvrir une issue (template bug) avec reproduction minimale
- Écrire un test qui échoue (reproduction)
- Corriger le code
- Vérifier gate complète
Nouvelles fonctionnalités
- Ouvrir une issue (template feature) avec design/discussion
- Découper en tranches atomiques testables (cf.
docs/architecture/phase-2-llm-architecture.md) - Implémenter tranche par tranche, gate à chaque étape
- Doc + tests + architecture doc mise à jour
Refactoring
- Gate complète avant et après
- Pas de changement fonctionnel
- Commits
refactor(scope): ...
Documentation
- Corrections typo/clarification : commits
docs: ... - Nouvelles sections : suivi structure
docs/
Configuration locale recommandée
# Pre-commit (optionnel mais recommandé)
uv pip install pre-commit
pre-commit install
# Éditeur : config basedpyright + ruff
# VS Code : extensions Python, Ruff, Basedpyright
Code review
Ce qu'on regarde
- ✅ Gate complète passe
- ✅ Tests pertinents + passants
- ✅ Typage strict (pas de
Any,ignore,cast) - ✅ Architecture respectée (modules, dépendances)
- ✅ Docstrings sur API publiques
- ✅ Messages d'erreur explicites (EM101/EM102)
- ✅ Pas de code mort / code commenté
- ✅ Commits atomiques, messages clairs
Red flags (rejettent la PR)
- ❌ Gate qui ne passe pas
- ❌
type: ignore/# type: ignore/cast() - ❌ Tests supprimés sans remplacement
- ❌ Code non testé (nouvelle logique sans test)
- ❌ Dépendances circulaires
- ❌ Code mort /
pass/TODOsans issue
Signalement de sécurité
Pour les vulnérabilités potentielles : ne pas ouvrir d'issue publique.
Envoyer un email à l'équipe de maintenance (voir SECURITY.md ou AUTHORS).
Licence
En contribuant, vous acceptez que votre contribution soit sous la même licence que le projet (voir LICENSE).
Questions ?
Ouvrez une discussion GitHub ou consultez docs/architecture/ pour l'architecture technique.