Feature #46
closedFeature #24: Implémenter un hook pour la création automatique de tickets Redmine depuis les scans Trivy et Semgrep
Domaine & application : SecurityFinding, normalisation Trivy/Semgrep, clé de dédup et format de ticket
0%
Spec = la description + critères d'acceptation de ce ticket (issu de la décomposition de #24, validée PO). Unité hexagonale domaine+application : SecurityFinding, normaliseurs Trivy/Semgrep, clé de dédup, format ticket, use case CreateTicketsFromScan via port abstrait. Aucune dépendance. Prêt pour backend-dev.
Description
Couches domain + application de `api/` : modèle de domaine commun `SecurityFinding` + logique métier indépendante de Redmine et du transport HTTP. Normaliseurs purs `from_trivy(report)` / `from_semgrep(report)` → liste de `SecurityFinding`. Calcul de la clé de dédup : Trivy `CVE-{id}` ou `{paquet}@{version}_CVE-{id}` ; Semgrep `{fichier}:{ligne}_{rule-id}`. Formatage du ticket (titre + description complète : sévérité, extrait code, lien CVE, recommandations). Cas d'usage `CreateTicketsFromScan` orchestrant normalisation → décision dédup vs régression via un **port abstrait** (pas d'impl Redmine ici). TDD.
## Critères d'acceptation
- `SecurityFinding` + normaliseurs couvrent les 2 formats de rapport.
- Clé de dédup correcte (Trivy `CVE-{id}`/`{paquet}@{version}_CVE-{id}` ; Semgrep `{fichier}:{ligne}_{rule-id}`).
- Format de ticket conforme aux exemples (titre + description complète).
- `CreateTicketsFromScan` décide dédup vs régression via un port abstrait.
- Tests unitaires verts (normalisation, clé, format) ; `ruff check .` + `mypy src` passent.
Estimation : M. Dépendances : aucune.
Files