@yonathan124/zentry 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTRIBUTING.md +38 -0
- package/LICENSE +21 -0
- package/README.md +68 -0
- package/package.json +62 -0
- package/src/cli/server.js +170 -0
- package/src/cli/zentry-cli.js +263 -0
- package/src/components/ZentryDashboard.jsx +908 -0
- package/src/config/constants.js +1232 -0
- package/src/core/ai.js +328 -0
- package/src/core/profiler.js +144 -0
- package/src/core/scanner.js +323 -0
- package/src/core/utils.js +3 -0
- package/src/index.js +7 -0
|
@@ -0,0 +1,1232 @@
|
|
|
1
|
+
export const STACKS={
|
|
2
|
+
"njs-supa":{label:"Next.js + Supabase",tag:"Next·Supabase",db:"Supabase (PostgreSQL+RLS)",auth:"Supabase Auth",adapt:null,
|
|
3
|
+
sec:["RLS activé sur toutes les tables (auth.uid()=user_id)","SERVICE_ROLE_KEY : serveur uniquement","Politiques SELECT/INSERT/UPDATE/DELETE séparées","NEXT_PUBLIC_ sans données sensibles"],
|
|
4
|
+
perf:["Server Components pour les données statiques","Supabase realtime : désabonner dans useEffect cleanup","Edge Functions pour la logique proche des données","select() avec colonnes explicites, jamais *"],
|
|
5
|
+
rules:"## SUPABASE\n- SERVICE_ROLE_KEY : serveur UNIQUEMENT\n- auth.uid() dans TOUTES les politiques RLS\n- rpc() pour transactions multi-tables\n- .single() au lieu de .limit(1) pour assertions"},
|
|
6
|
+
"njs-prisma":{label:"Next.js + Prisma",tag:"Next·Prisma",db:"PostgreSQL via Prisma",auth:"NextAuth.js / Lucia",
|
|
7
|
+
adapt:"• RLS → where:{userId:session.user.id} sur chaque requête\n• auth.uid() → session.user.id (getServerSession)\n• rawQuery interdit avec variables interpolées\n• findUnique au lieu de findFirst pour les assertions",
|
|
8
|
+
sec:["Chaque requête filtrée par userId de session","findMany({}) interdit sans filtre","rawQuery interdit avec interpolation","select explicite, no include profond"],
|
|
9
|
+
perf:["Prisma.$transaction pour opérations multiples","select:{} pour limiter les colonnes retournées","Pagination obligatoire avec take+skip ou cursor","Index dans schema.prisma sur colonnes filtrées"],
|
|
10
|
+
rules:"## PRISMA\n- TOUJOURS : where:{userId:session.user.id}\n- select:{} explicite sur chaque query\n- $transaction pour les opérations atomiques"},
|
|
11
|
+
"node-express":{label:"Node.js / Express",tag:"Node·Express",db:"PostgreSQL (pg/knex)",auth:"JWT / Passport.js",
|
|
12
|
+
adapt:"• helmet→cors→rateLimit→authJwt→routes (ordre obligatoire)\n• req.user.id depuis JWT vérifié, jamais req.body\n• SQL : paramètres positionnels $1,$2 uniquement",
|
|
13
|
+
sec:["Ordre middleware : helmet→cors→rateLimit→authJwt→routes","JWT_SECRET en env, longueur ≥ 32 chars","SQL $1,$2 positionnels","res.json(error) interdit"],
|
|
14
|
+
perf:["Connection pooling pg.Pool avec max adapté","Async/await partout, pas de callbacks","Compression middleware pour les réponses > 1kb","Cache Redis pour les données fréquentes"],
|
|
15
|
+
rules:"## NODE/EXPRESS\n- Ordre : helmet→cors→rateLimit→verifyJWT→routes\n- Connection pool configuré\n- Jamais de blocking I/O dans le thread principal"},
|
|
16
|
+
"django":{label:"Django + PostgreSQL",tag:"Django·DRF",db:"PostgreSQL via Django ORM",auth:"Django Auth/DRF",
|
|
17
|
+
adapt:"• queryset.filter(user=request.user) sur tout\n• CSRF middleware actif partout\n• raw() interdit avec variables\n• select_related/prefetch_related pour éviter N+1",
|
|
18
|
+
sec:["queryset.filter(user=request.user) partout","CSRF actif","ORM uniquement","SECRET_KEY en env"],
|
|
19
|
+
perf:["select_related() pour FK, prefetch_related() pour M2M","only()/defer() pour limiter les colonnes","Cache avec django.core.cache","Pagination avec DRF PageNumberPagination"],
|
|
20
|
+
rules:"## DJANGO\n- TOUJOURS : queryset.filter(user=request.user)\n- select_related/prefetch_related pour éviter N+1\n- only() pour limiter les colonnes retournées"},
|
|
21
|
+
"fastapi":{label:"FastAPI + PostgreSQL",tag:"FastAPI·SQLAlchemy",db:"PostgreSQL via SQLAlchemy",auth:"JWT/OAuth2",
|
|
22
|
+
adapt:"• Depends(get_current_user) EN PREMIER sur toutes routes\n• Pydantic BaseModel strict sur tous inputs\n• CORS origins explicites, jamais wildcard *\n• async def sur toutes les routes I/O-bound",
|
|
23
|
+
sec:["Depends(get_current_user) en premier","Pydantic strict","CORS origins explicites","SQL paramètres SQLAlchemy"],
|
|
24
|
+
perf:["async def sur routes I/O-bound","Connection pool asyncpg avec pool_size adapté","Pydantic response_model pour filtrer les champs","Background tasks pour opérations longues"],
|
|
25
|
+
rules:"## FASTAPI\n- Toute route protégée : Depends(get_current_user) EN PREMIER\n- async def sur toutes les routes qui font I/O\n- response_model sur chaque endpoint"},
|
|
26
|
+
"react-native":{label:"React Native + Expo",tag:"RN·Expo",db:"Supabase/Firebase",auth:"Supabase Auth",
|
|
27
|
+
adapt:"• localStorage → Expo SecureStore uniquement\n• AsyncStorage pour tokens = INTERDIT\n• Certificate pinning sur endpoints critiques\n• Code push : valider côté serveur les versions autorisées",
|
|
28
|
+
sec:["Expo SecureStore pour tokens","Clés API hors bundle","Security Rules testées","Certificate pinning"],
|
|
29
|
+
perf:["FlatList avec getItemLayout pour les grandes listes","React.memo sur les composants de liste","Hermes engine activé","expo-image au lieu de Image pour le cache"],
|
|
30
|
+
rules:"## REACT NATIVE\n- Expo SecureStore UNIQUEMENT pour tokens\n- FlatList obligatoire pour listes > 20 items\n- Hermes activé en production"},
|
|
31
|
+
"laravel":{label:"Laravel + MySQL/PG",tag:"Laravel·Eloquent",db:"MySQL/PostgreSQL Eloquent",auth:"Sanctum/Passport",
|
|
32
|
+
adapt:"• Policy Laravel + where('user_id',auth()->id())\n• $fillable explicite sur chaque Model\n• CSRF sur routes POST web\n• Eager loading with() pour éviter N+1",
|
|
33
|
+
sec:["authorize() en premier","where('user_id',auth()->id())","$fillable explicite","CSRF sur POST/PUT/DELETE"],
|
|
34
|
+
perf:["with() pour eager loading","chunk() pour traitement de grands datasets","Cache::remember pour données fréquentes","DB::listen pour détecter les N+1 en dev"],
|
|
35
|
+
rules:"## LARAVEL\n- authorize() EN PREMIER dans chaque action\n- with() pour eager loading\n- chunk() pour > 1000 records"},
|
|
36
|
+
"nuxt":{label:"Nuxt + Supabase",tag:"Nuxt·Supabase",db:"Supabase (PostgreSQL+RLS)",auth:"nuxt-auth-utils",adapt:null,
|
|
37
|
+
sec:["RLS Supabase activé","event.context.user vérifié en premier","Composables client-only","NUXT_PUBLIC_ sans données sensibles"],
|
|
38
|
+
perf:["useFetch avec lazy:true pour non-critique","useAsyncData avec transform pour minimiser les données","Nitro prerender pour pages statiques","Composants Suspense pour SSR partiel"],
|
|
39
|
+
rules:"## NUXT\n- Server routes : event.context.user AVANT toute logique\n- useFetch avec getCachedData pour déduplication\n- RLS Supabase requis même avec auth Nuxt"},
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
// ─── PHASE GROUPS ──────────────────────────────────────────────
|
|
43
|
+
export const GROUPS=[
|
|
44
|
+
{id:"discovery",label:"Découverte",color:"#6B5CF6",phases:["p0","p05"]},
|
|
45
|
+
{id:"security", label:"Sécurité", color:"#E5534B",phases:["p1","p2","p_cfg"]},
|
|
46
|
+
{id:"quality", label:"Qualité", color:"#1E7FD8",phases:["p3","p4","p5","p6"]},
|
|
47
|
+
{id:"advanced", label:"Avancé", color:"#0D9373",phases:["p_tests","p_deps","p_obs","p_a11y","p_integ","p_biz"]},
|
|
48
|
+
{id:"data", label:"Données", color:"#C47D0E",phases:["p7","p8","p85"]},
|
|
49
|
+
{id:"redteam", label:"Red Team", color:"#E5534B",phases:["p9a","p9b","p9c"]},
|
|
50
|
+
{id:"dast", label:"DAST & Fuzz", color:"#9333EA",phases:["p_dast_infra","p_dast_api"]},
|
|
51
|
+
{id:"closure", label:"Clôture", color:"#1A7F4B",phases:["p10","p11"]},
|
|
52
|
+
];
|
|
53
|
+
|
|
54
|
+
// ─── PHASES (22) ──────────────────────────────────────────────
|
|
55
|
+
export const PHASES=[
|
|
56
|
+
// ── DISCOVERY ───────────────────────────────────────────────
|
|
57
|
+
{id:"p0",n:"0",icon:"🗺",label:"Découverte & Contexte Métier",color:"#6B5CF6",tag:"DISCOVERY",group:"discovery",
|
|
58
|
+
deps:[],
|
|
59
|
+
what:"Cartographie complète : stack, données sensibles, rôles, flux critiques, métriques de charge. Ce contexte enrichit automatiquement toutes les phases suivantes.",
|
|
60
|
+
how:"Copie le prompt → colle dans Antigravity avec le contexte du projet → récupère le tableau de blocs + contexte métier complet → reviens remplir et cocher.",
|
|
61
|
+
prompt:`Tu es un Lead Security Architect & Solutions Expert. Cartographie ce projet AVANT tout audit.
|
|
62
|
+
|
|
63
|
+
SECTION A — TECHNIQUE
|
|
64
|
+
1. Stack complète (framework+version, BDD+ORM, auth, payment, storage, CDN, cache)
|
|
65
|
+
2. Architecture globale (monolithe / microservices / serverless / hybride ?)
|
|
66
|
+
3. Environnements (dev/staging/prod) et différences entre eux
|
|
67
|
+
4. Points d'intégration externes (APIs tierces, webhooks, OAuth providers, messaging)
|
|
68
|
+
|
|
69
|
+
SECTION B — LOGIQUE MÉTIER (CRITIQUE — enrichit toutes les phases)
|
|
70
|
+
1. Acteurs : qui utilise le système ? (rôles, permissions, types d'utilisateurs)
|
|
71
|
+
2. Flux critiques : inscription, paiement, traitement de données, envoi de communication
|
|
72
|
+
3. Données sensibles : PII, financières, audio, médicales, contrats — où stockées, comment protégées
|
|
73
|
+
4. Règles métier INVARIANTES (celles qui ne doivent JAMAIS être violées, même en cas d'erreur)
|
|
74
|
+
5. Métriques de charge : utilisateurs actifs quotidiens, pics simultanés, SLA cible, géographie
|
|
75
|
+
|
|
76
|
+
SECTION C — CONFORMITÉS À DÉDUIRE
|
|
77
|
+
RGPD si données EU/Afrique · PCI-DSS si paiement carte · HIPAA si médical · SOC2 si SaaS B2B
|
|
78
|
+
|
|
79
|
+
SECTION D — PLAN D'AUDIT (sortie obligatoire)
|
|
80
|
+
Tableau Markdown :
|
|
81
|
+
| Bloc | Fichiers (max 5) | Criticité | Phase principale | Règles métier concernées | Dépendances |
|
|
82
|
+
|
|
83
|
+
RÈGLE : Aucun audit maintenant. Signal GO BLOC [N] pour démarrer.`,
|
|
84
|
+
checks:["Stack technique complète identifiée","Rôles et flux critiques documentés","Données sensibles listées et classifiées","Règles métier invariantes notées","Métriques de charge documentées","Conformités déduites automatiquement","Blocs d'audit créés (max 5 fichiers/bloc)"]},
|
|
85
|
+
|
|
86
|
+
{id:"p05",n:"0.5",icon:"📁",label:"Génération des Sessions d'Audit",color:"#6B5CF6",tag:"GENERATION",group:"discovery",
|
|
87
|
+
deps:["p0"],
|
|
88
|
+
what:"L'IA crée audit-sessions/ avec un .md prêt par bloc, contexte métier injecté, et les dépendances entre blocs documentées.",
|
|
89
|
+
how:"Copie le prompt → colle dans Antigravity → l'IA crée les fichiers → vérifie audit-sessions/README.md → cocher.",
|
|
90
|
+
prompt:`La cartographie et le contexte métier sont dans AUDIT_MASTER_TRACKER.md. Génère les sessions.
|
|
91
|
+
|
|
92
|
+
1. Crée audit-sessions/ à la racine
|
|
93
|
+
2. Pour chaque bloc du tracker, crée bloc-XX.md :
|
|
94
|
+
- En-tête : nom, criticité, phase, fichiers exacts, règles métier pertinentes
|
|
95
|
+
- Contexte métier injecté : flux critiques, rôles, données sensibles du bloc
|
|
96
|
+
- Prompt d'audit COMPLET avec fichiers déjà insérés et contexte préfixé
|
|
97
|
+
- Règles anti-faux-positifs : "Signale UNIQUEMENT ce que tu as VU dans le code"
|
|
98
|
+
- Format obligatoire (✅/🟡/🔴 avec ligne + correctif)
|
|
99
|
+
- Dépendances : "Lire d'abord bloc-XX.md si applicable"
|
|
100
|
+
- Instruction finale : "Après audit → mets à jour AUDIT_MASTER_TRACKER.md"
|
|
101
|
+
3. Crée audit-sessions/README.md :
|
|
102
|
+
- Ordre d'exécution recommandé avec justification
|
|
103
|
+
- Carte des dépendances entre blocs
|
|
104
|
+
- Estimation de durée totale
|
|
105
|
+
4. Crée audit-sessions/FINDINGS_REGISTER.md :
|
|
106
|
+
- Template pour centraliser tous les findings cross-phases
|
|
107
|
+
5. Mets à jour AUDIT_MASTER_TRACKER.md : "Prompt généré" + "Contexte métier injecté"
|
|
108
|
+
|
|
109
|
+
N'exécute pas les audits. Crée les fichiers.`,
|
|
110
|
+
checks:["audit-sessions/ créé","Un bloc-XX.md par bloc avec prompt + contexte métier","Dépendances entre blocs documentées","README.md avec ordre + durée estimée","FINDINGS_REGISTER.md créé","Tracker mis à jour"]},
|
|
111
|
+
|
|
112
|
+
// ── SECURITY ────────────────────────────────────────────────
|
|
113
|
+
{id:"p1",n:"1",icon:"🔐",label:"Sécurité & Authentification",color:"#E5534B",tag:"SECURITY",group:"security",
|
|
114
|
+
deps:["p0"],
|
|
115
|
+
what:"Audit exhaustif des secrets, contrôle d'accès BDD, validation des inputs, authentification et autorisation. Module par module, zéro tolérance pour les faux positifs.",
|
|
116
|
+
how:"Remplis Bloc + Fichiers → le prompt inclut automatiquement les règles métier de Phase 0 → Copie → colle dans Antigravity.",
|
|
117
|
+
prompt:`Tu es un Expert Cybersécurité Senior spécialisé sur cette stack. BLOC [N].
|
|
118
|
+
|
|
119
|
+
PÉRIMÈTRE : [colle ici les 3-5 fichiers]
|
|
120
|
+
|
|
121
|
+
PROTOCOLE — DANS CET ORDRE STRICT :
|
|
122
|
+
|
|
123
|
+
1. SECRETS & ENVIRONMENT
|
|
124
|
+
Cherche : strings ressemblant à tokens (sk-, pk-, AIza, ghp_, ey...), clés AWS/GCP/Azure, JWT_SECRET hardcodé
|
|
125
|
+
Cherche : .env dans .gitignore ? .env.local dans le repo ? Variables d'env dans le code client ?
|
|
126
|
+
→ COMMANDE DE VÉRIFICATION : git log --all -S "sk-ant\|pk_live\|AIza" --source (à suggérer à l'utilisateur)
|
|
127
|
+
|
|
128
|
+
2. CONTRÔLE D'ACCÈS AUX DONNÉES
|
|
129
|
+
Pour chaque requête BDD identifiée : l'identifiant utilisateur est-il filtré (WHERE user_id = session.user.id) ?
|
|
130
|
+
Peut-on changer un ID dans la requête et accéder aux données d'un autre ? (IDOR)
|
|
131
|
+
Les 4 opérations CRUD sont-elles toutes protégées, pas seulement READ ?
|
|
132
|
+
Les ressources de niveau admin sont-elles vérifiées avec role === 'admin' côté serveur ?
|
|
133
|
+
|
|
134
|
+
3. VALIDATION DES INPUTS
|
|
135
|
+
Chaque champ de formulaire a-t-il un schéma Zod/Yup/Pydantic en amont de la BDD ?
|
|
136
|
+
Les IDs dans les requêtes viennent-ils de la SESSION ou du body/params ?
|
|
137
|
+
Les types sont-ils validés (nombre négatif possible pour un prix ? email malformé accepté ?)
|
|
138
|
+
.strict() sur les schémas Zod pour rejeter les champs inconnus ?
|
|
139
|
+
|
|
140
|
+
4. AUTHENTIFICATION & AUTORISATION
|
|
141
|
+
Ordre dans chaque handler : session vérifiée → rôle vérifié → logique → réponse ?
|
|
142
|
+
Middleware auth actif sur 100% des routes privées (pas seulement les routes listées) ?
|
|
143
|
+
Les tokens JWT sont-ils vérifiés avec la bonne clé et l'algorithme HS256/RS256 explicitement ?
|
|
144
|
+
Les sessions expirent-elles ? Révocation de session possible ?
|
|
145
|
+
|
|
146
|
+
5. INJECTIONS & XSS
|
|
147
|
+
Concaténation de string dans des requêtes SQL/NoSQL (même partielle) ?
|
|
148
|
+
dangerouslySetInnerHTML / v-html / innerHTML sans DOMPurify ?
|
|
149
|
+
eval(), new Function(), setTimeout(string) avec données utilisateur ?
|
|
150
|
+
Path traversal possible (../../etc/passwd via des chemins de fichiers) ?
|
|
151
|
+
|
|
152
|
+
FORMAT : ✅ [fichier] — SÉCURISÉ : [ce qui a été vérifié]
|
|
153
|
+
🔴 [fichier] — [CRITIQUE|HAUTE|MOYENNE|BASSE] : [ligne précise + impact + correctif immédiat]
|
|
154
|
+
RÈGLE ABSOLUE : Ne signale que ce VU dans le code. Incertain → "À VÉRIFIER MANUELLEMENT : [raison]"`,
|
|
155
|
+
checks:["Aucun secret hardcodé (clé, token, password, private key)","IDOR impossible : données filtrées par session sur les 4 opérations CRUD","Schéma de validation sur chaque input externe","Session vérifiée EN PREMIER dans chaque handler","100% des routes privées protégées côté serveur","Pas d'injection SQL/XSS/eval identifiée","JWT vérifié avec algorithme explicite"]},
|
|
156
|
+
|
|
157
|
+
{id:"p2",n:"2",icon:"🔌",label:"API & Backend Logic",color:"#E5534B",tag:"API",group:"security",
|
|
158
|
+
deps:["p1"],
|
|
159
|
+
what:"Audit des endpoints, flux de données bout-en-bout, idempotence, logique métier et gestion d'erreurs. Trace chaque requête de l'entrée à la BDD.",
|
|
160
|
+
how:"Remplis Bloc + Fichiers → Copie → colle dans Antigravity. Contexte des findings p1 injecté automatiquement.",
|
|
161
|
+
prompt:`Tu es un Expert Backend & API Security. BLOC [N].
|
|
162
|
+
|
|
163
|
+
PÉRIMÈTRE : [colle ici les 3-5 fichiers]
|
|
164
|
+
|
|
165
|
+
PROTOCOLE — TRACE CHAQUE FLUX BOUT EN BOUT :
|
|
166
|
+
|
|
167
|
+
1. ORDRE DE TRAITEMENT (obligatoire dans cet ordre)
|
|
168
|
+
auth vérifiée → schéma validé → autorisations → logique métier → BDD → réponse
|
|
169
|
+
Toute déviation de cet ordre est une vulnérabilité architecturale.
|
|
170
|
+
|
|
171
|
+
2. TRACE DU FLUX DONNÉES
|
|
172
|
+
Pour chaque endpoint : Input → [validation] → [transformation] → [BDD] → [filtrage] → Output
|
|
173
|
+
Les champs retournés au client sont-ils le minimum nécessaire ? (pas de password_hash, pas de token interne)
|
|
174
|
+
Les objets imbriqués ne révèlent-ils pas des données d'autres utilisateurs ?
|
|
175
|
+
|
|
176
|
+
3. IDEMPOTENCE & LOGIQUE MÉTIER
|
|
177
|
+
Paiements : nonce/idempotency key pour prévenir la double facturation ?
|
|
178
|
+
Webhooks : signature vérifiée (Stripe-Signature, X-Hub-Signature) AVANT tout traitement ?
|
|
179
|
+
Suppressions : vérifie-t-on que l'utilisateur est bien propriétaire avant DELETE ?
|
|
180
|
+
Actions critiques (envoi email, SMS, notification) : une seule exécution garantie ?
|
|
181
|
+
Les règles métier invariantes (Phase 0) sont-elles respectées dans tous les cas d'erreur ?
|
|
182
|
+
|
|
183
|
+
4. RATE LIMITING & PROTECTION
|
|
184
|
+
Rate limiting sur les routes sensibles (login, password reset, envoi de message) ?
|
|
185
|
+
CORS configuré avec une liste blanche d'origines (pas * en production) ?
|
|
186
|
+
Request body size limité (pas de 1GB payload possible) ?
|
|
187
|
+
|
|
188
|
+
5. GESTION DES ERREURS
|
|
189
|
+
try/catch sur CHAQUE opération I/O (BDD, API externe, file system) ?
|
|
190
|
+
Les stack traces et noms de tables BDD ne remontent-ils jamais au client ?
|
|
191
|
+
Les erreurs sont-elles loggées côté serveur avec un identifiant de corrélation ?
|
|
192
|
+
Les codes d'erreur HTTP sont-ils sémantiquement corrects (401 vs 403, 404 vs 403) ?
|
|
193
|
+
|
|
194
|
+
FORMAT : ✅ [endpoint] — OK : [flux vérifié]
|
|
195
|
+
🔴 [endpoint] — [niveau] : [ligne + impact + correctif]`,
|
|
196
|
+
checks:["Ordre auth→validation→logique respecté dans chaque handler","Flux client→BDD tracé : données minimales retournées","Webhooks vérifient signature avant traitement","Paiements/actions critiques idempotentes","Rate limiting sur routes sensibles","CORS avec liste blanche","Erreurs sanitisées (pas d'info système au client)","Règles métier invariantes respectées y compris sur les erreurs"]},
|
|
197
|
+
|
|
198
|
+
{id:"p_cfg",n:"2.5",icon:"⚙",label:"Configuration & Hardening",color:"#E5534B",tag:"CONFIG",group:"security",
|
|
199
|
+
deps:["p1"],
|
|
200
|
+
what:"Audit profond de la configuration : headers HTTP, CORS, CSP, cookies, CSRF, session management et configuration des bibliothèques tierces.",
|
|
201
|
+
how:"Remplis Bloc + Fichiers (next.config.js, middleware, headers, cookie config) → Copie → colle dans Antigravity.",
|
|
202
|
+
prompt:`Tu es un Expert en Configuration Sécurité. BLOC [N].
|
|
203
|
+
|
|
204
|
+
PÉRIMÈTRE : [colle ici les fichiers de configuration : next.config.js, middleware.ts, server config, nginx/caddy config, cookie settings]
|
|
205
|
+
|
|
206
|
+
PROTOCOLE CONFIGURATION & HARDENING :
|
|
207
|
+
|
|
208
|
+
1. HEADERS HTTP DE SÉCURITÉ (chacun a un rôle précis)
|
|
209
|
+
Content-Security-Policy : présente et efficace (pas default-src *) ?
|
|
210
|
+
→ Valide que script-src ne contient pas unsafe-inline ou unsafe-eval
|
|
211
|
+
→ Valide que connect-src liste explicitement les domaines externes
|
|
212
|
+
Strict-Transport-Security : max-age ≥ 31536000, includeSubDomains, preload ?
|
|
213
|
+
X-Frame-Options : DENY ou SAMEORIGIN ?
|
|
214
|
+
X-Content-Type-Options : nosniff présent ?
|
|
215
|
+
Referrer-Policy : no-referrer-out-downgrade-when-cross-origin ou plus strict ?
|
|
216
|
+
Permissions-Policy : caméra/micro/géolocalisation restreints si non utilisés ?
|
|
217
|
+
|
|
218
|
+
2. GESTION DES COOKIES
|
|
219
|
+
Session cookie : HttpOnly=true, Secure=true, SameSite=Strict ou Lax ?
|
|
220
|
+
Les cookies tiers sont-ils limités au nécessaire ?
|
|
221
|
+
Domain et Path explicites pour éviter la propagation ?
|
|
222
|
+
Expiration raisonnable (pas de session permanente sur des données sensibles) ?
|
|
223
|
+
|
|
224
|
+
3. PROTECTION CSRF
|
|
225
|
+
Tokens CSRF sur toutes les mutations (POST/PUT/DELETE) ?
|
|
226
|
+
SameSite=Strict sur le cookie de session ?
|
|
227
|
+
Origin header validé côté serveur ?
|
|
228
|
+
|
|
229
|
+
4. SESSION MANAGEMENT
|
|
230
|
+
Sessions expirées après inactivité (idle timeout) ?
|
|
231
|
+
Session ID régénéré après authentification (session fixation) ?
|
|
232
|
+
Invalidation de session possible côté serveur (pas seulement supprimer le cookie côté client) ?
|
|
233
|
+
Limite du nombre de sessions actives par utilisateur ?
|
|
234
|
+
|
|
235
|
+
5. CONFIGURATION DES DÉPENDANCES
|
|
236
|
+
TLS/SSL : version minimale TLS 1.2, ciphers forts uniquement ?
|
|
237
|
+
CORS : origines explicites, methods explicites, credentials:true seulement si nécessaire ?
|
|
238
|
+
Les bibliothèques d'auth sont-elles correctement configurées (pas de modes débug en prod) ?
|
|
239
|
+
|
|
240
|
+
FORMAT : ✅ [config] — DURCIE : [résumé]
|
|
241
|
+
🔴 [config] — [CRITIQUE|HAUTE|MOYENNE] : [paramètre + valeur actuelle + valeur correcte + impact]`,
|
|
242
|
+
checks:["CSP présente et restrictive (pas de unsafe-inline/eval)","HSTS max-age ≥ 31536000 avec preload","Cookies : HttpOnly + Secure + SameSite=Strict","CSRF protection sur toutes les mutations","Sessions : expiration + idle timeout + invalidation serveur","TLS 1.2+ uniquement","CORS : origines et méthodes explicites"]},
|
|
243
|
+
|
|
244
|
+
// ── QUALITY ─────────────────────────────────────────────────
|
|
245
|
+
{id:"p3",n:"3",icon:"🖥",label:"Frontend & Accessibilité",color:"#1E7FD8",tag:"FRONTEND",group:"quality",
|
|
246
|
+
deps:["p1"],
|
|
247
|
+
what:"Audit des composants, états async, hydratation SSR, accessibilité WCAG 2.2 et performances UI (Core Web Vitals).",
|
|
248
|
+
how:"Remplis Bloc + Fichiers → Copie → colle dans Antigravity.",
|
|
249
|
+
prompt:`Tu es un Expert Frontend Senior & Accessibility Specialist. BLOC [N].
|
|
250
|
+
|
|
251
|
+
PÉRIMÈTRE : [colle ici les 3-5 fichiers]
|
|
252
|
+
|
|
253
|
+
PROTOCOLE FRONTEND COMPLET :
|
|
254
|
+
|
|
255
|
+
1. SÉCURITÉ CÔTÉ CLIENT
|
|
256
|
+
Tokens, clés, données de session dans localStorage/sessionStorage ? (HttpOnly cookies uniquement)
|
|
257
|
+
dangerouslySetInnerHTML / v-html / innerHTML sans sanitisation DOMPurify explicite ?
|
|
258
|
+
Les données d'un utilisateur n'affichent-elles pas des infos d'un autre par erreur ?
|
|
259
|
+
XSS via les paramètres URL affichés directement dans le DOM ?
|
|
260
|
+
|
|
261
|
+
2. ÉTATS ASYNC & ROBUSTESSE UX
|
|
262
|
+
Chaque fetch/mutation a-t-il : état loading visible + état d'erreur clair + état vide géré ?
|
|
263
|
+
Formulaires désactivés (disabled) pendant la soumission ? (pas de double-envoi)
|
|
264
|
+
Retry automatique avec backoff exponentiel sur les erreurs réseau transitoires ?
|
|
265
|
+
Optimistic updates avec rollback en cas d'erreur serveur ?
|
|
266
|
+
Skeleton screens plutôt que spinners pour le contenu prévisible ?
|
|
267
|
+
|
|
268
|
+
3. RENDU & HYDRATATION
|
|
269
|
+
Hydration Mismatches (différences server/client au premier rendu) ?
|
|
270
|
+
'use client' au niveau le plus bas possible dans l'arbre de composants ?
|
|
271
|
+
Dynamic import() sur les composants > 30kb ou chargés conditionnellement ?
|
|
272
|
+
Les données sensibles ne sont-elles pas exposées dans le HTML SSR (window.__INITIAL_DATA__) ?
|
|
273
|
+
Streaming Suspense pour les données lentes ?
|
|
274
|
+
|
|
275
|
+
4. ACCESSIBILITÉ WCAG 2.2
|
|
276
|
+
Images : alt pertinent (pas "image" ou vide — décrire le CONTENU et le CONTEXTE) ?
|
|
277
|
+
Formulaires : labels explicitement associés (htmlFor, aria-labelledby, aria-label) ?
|
|
278
|
+
Navigation clavier : focus visible et logique, piège modal géré (FocusTrap) ?
|
|
279
|
+
Contraste : texte normal ≥ 4.5:1, texte large ≥ 3:1 (vérifier les couleurs exactes) ?
|
|
280
|
+
ARIA roles corrects (pas aria-label sur un div générique sans role) ?
|
|
281
|
+
Annonces aux screen readers pour les états dynamiques (aria-live) ?
|
|
282
|
+
Cibles de touch ≥ 44×44px sur mobile ?
|
|
283
|
+
|
|
284
|
+
5. PERFORMANCES UI (Core Web Vitals)
|
|
285
|
+
Images avec width+height explicites pour éviter le CLS ?
|
|
286
|
+
Image LCP avec fetchpriority="high" et preload link ?
|
|
287
|
+
Polices : font-display: swap, preconnect sur le provider ?
|
|
288
|
+
Handlers d'événements coûteux debounced/throttled ?
|
|
289
|
+
Pas de layout thrashing (lecture+écriture DOM alternés dans une boucle) ?
|
|
290
|
+
|
|
291
|
+
FORMAT : ✅ [composant] — VALIDÉ : [résumé]
|
|
292
|
+
🟡 [composant] — [HAUTE|MOYENNE|BASSE] : [description + solution]
|
|
293
|
+
🔴 [composant] — CRITIQUE : [description + correctif]`,
|
|
294
|
+
checks:["Aucun token/secret en localStorage","Loading + error + empty state sur chaque opération async","Formulaires désactivés pendant soumission","Pas de Hydration Mismatch","dynamic import sur composants > 30kb","Alt text pertinent et contextuel sur toutes les images","Labels associés sur tous les champs de formulaire","Contraste ≥ 4.5:1 sur le texte normal","Focus visible et navigation clavier fonctionnelle","Images LCP avec fetchpriority=high"]},
|
|
295
|
+
|
|
296
|
+
{id:"p4",n:"4",icon:"⚡",label:"Performance & Scalabilité",color:"#1E7FD8",tag:"PERFORMANCE",group:"quality",
|
|
297
|
+
deps:["p0"],hasPerf:true,
|
|
298
|
+
what:"Audit adapté aux métriques métier réelles. Quantifie l'impact à la charge cible, pas des généralités.",
|
|
299
|
+
how:"Remplis les métriques métier + Bloc + Fichiers → le prompt adapte les seuils à ta charge cible → Copie → colle dans Antigravity.",
|
|
300
|
+
prompt:`Tu es un Expert Performance & Scalabilité. BLOC [N].
|
|
301
|
+
|
|
302
|
+
MÉTRIQUES MÉTIER [auto-injectées depuis les champs] :
|
|
303
|
+
Utilisateurs actifs : [UAD] · Pics simultanés : [PEAK] · SLA : [SLA] · Géographie : [GEO]
|
|
304
|
+
|
|
305
|
+
PÉRIMÈTRE : [colle ici les 3-5 fichiers]
|
|
306
|
+
|
|
307
|
+
PROTOCOLE PERFORMANCE — QUANTIFIE PAR RAPPORT À LA CHARGE RÉELLE :
|
|
308
|
+
|
|
309
|
+
1. REQUÊTES BDD (impact critique à l'échelle)
|
|
310
|
+
Requête dans une boucle (N+1) ? → À [PEAK] utilisateurs simultanés, combien de requêtes/seconde ?
|
|
311
|
+
SELECT * alors que 2-3 colonnes suffisent ? → Impact mémoire à [UAD] requêtes/jour ?
|
|
312
|
+
Index manquants sur colonnes filtrées ? → Vérifier avec EXPLAIN ANALYZE sur les requêtes fréquentes
|
|
313
|
+
Pagination sur toutes les listes ? → Sans pagination, quelle est la taille maximale du jeu de données ?
|
|
314
|
+
Jointures non optimisées ? → Suggérer les index composites manquants
|
|
315
|
+
Transactions trop longues qui bloquent la BDD ?
|
|
316
|
+
|
|
317
|
+
2. BUNDLE & IMPORTS
|
|
318
|
+
Import de bibliothèque entière pour une fonction ? (lodash, moment, etc.)
|
|
319
|
+
→ Calculer la taille ajoutée : lodash = +70kb gzippé
|
|
320
|
+
Bibliothèques non tree-shakeable importées entièrement ?
|
|
321
|
+
Polyfills inutiles pour les navigateurs cibles ?
|
|
322
|
+
Code mort inclus dans le bundle ?
|
|
323
|
+
→ Recommander bundle-analyzer : npx @next/bundle-analyzer
|
|
324
|
+
|
|
325
|
+
3. STRATÉGIE DE CACHE (critique pour SLA [SLA])
|
|
326
|
+
Données statiques sans cache ? → TTL recommandé selon la fréquence de mise à jour
|
|
327
|
+
Cache invalidé trop souvent (every request) ?
|
|
328
|
+
CDN configuré pour les assets statiques ?
|
|
329
|
+
Calculs coûteux répétés sans memoization ?
|
|
330
|
+
Rate limits des APIs tierces pris en compte dans la stratégie de cache ?
|
|
331
|
+
|
|
332
|
+
4. RENDERING & CORE WEB VITALS
|
|
333
|
+
LCP : élément principal avec priority/fetchpriority="high" ?
|
|
334
|
+
CLS : dimensions réservées pour images et éléments dynamiques ?
|
|
335
|
+
INP : handlers d'événements synchrones sur le thread principal > 50ms ?
|
|
336
|
+
Stratégie ISR/SSG/SSR adaptée à la fréquence de mise à jour des données ?
|
|
337
|
+
Streaming pour les sections lentes ?
|
|
338
|
+
|
|
339
|
+
5. SCALABILITÉ SOUS [PEAK] UTILISATEURS SIMULTANÉS
|
|
340
|
+
Connection pool BDD : max_connections adapté au nombre d'instances ?
|
|
341
|
+
Opérations longues bloquantes ? (déplacer en background job)
|
|
342
|
+
State applicatif partagé entre instances ? (Redis/Upstash au lieu de mémoire locale)
|
|
343
|
+
Goulots d'étranglement évidents dans l'architecture ? (single point of failure)
|
|
344
|
+
|
|
345
|
+
FORMAT : ✅ [module] — OPTIMISÉ : [résumé + contexte de charge]
|
|
346
|
+
🟡 [module] — OPTIMISATION [impact estimé à [PEAK] simultanés] : [description + solution]
|
|
347
|
+
🔴 [module] — BLOQUANT À SCALE : [impact à [UAD] req/jour + correctif]`,
|
|
348
|
+
checks:["Pas de N+1 (requête en boucle)","SELECT avec colonnes explicites","Index BDD sur colonnes filtrées (EXPLAIN ANALYZE suggéré)","Pagination sur toutes les listes","Connection pool configuré","Pas d'import de bibliothèque entière inutile","Cache configuré sur données statiques","Stratégie rendering adaptée","Images LCP prioritaires","Pas de blocking I/O sur le thread principal"]},
|
|
349
|
+
|
|
350
|
+
{id:"p5",n:"5",icon:"🧩",label:"Architecture & Modularité",color:"#1E7FD8",tag:"ARCHITECTURE",group:"quality",
|
|
351
|
+
deps:["p0"],
|
|
352
|
+
what:"Audit de la séparation des responsabilités, typage TypeScript, réutilisabilité, dette technique et testabilité du code.",
|
|
353
|
+
how:"Remplis Bloc + Fichiers → Copie → colle dans Antigravity.",
|
|
354
|
+
prompt:`Tu es un Expert Architecture Logicielle & Clean Code. BLOC [N].
|
|
355
|
+
|
|
356
|
+
PÉRIMÈTRE : [colle ici les 3-5 fichiers]
|
|
357
|
+
|
|
358
|
+
PROTOCOLE ARCHITECTURE :
|
|
359
|
+
|
|
360
|
+
1. SÉPARATION DES RESPONSABILITÉS (SRP)
|
|
361
|
+
Chaque fichier/module fait-il UNE seule chose ? (ex: un component qui fetch ET affiche ET gère le formulaire = trop)
|
|
362
|
+
La logique métier est-elle dans des services/hooks séparés du rendu ?
|
|
363
|
+
Les règles métier invariantes (Phase 0) sont-elles dans une couche dédiée et testée séparément ?
|
|
364
|
+
Les dépendances vont-elles dans la bonne direction ? (UI → business logic → data access)
|
|
365
|
+
|
|
366
|
+
2. TYPAGE TYPESCRIPT (lance mentalement tsc --noEmit)
|
|
367
|
+
any non justifié par un commentaire "// RAISON : ..." ?
|
|
368
|
+
Types qui reflètent les règles métier ? (ex: type Price = number & {readonly __brand: 'Price'} pour les prix)
|
|
369
|
+
Interfaces vs types : cohérence dans le projet ?
|
|
370
|
+
Les types génériques sont-ils contraints (T extends ...) quand nécessaire ?
|
|
371
|
+
as casting non justifié (contourne le compilateur) ?
|
|
372
|
+
unknown au lieu de any quand le type n'est pas connu ?
|
|
373
|
+
|
|
374
|
+
3. RÉUTILISABILITÉ & DRY
|
|
375
|
+
Logique identique dans ≥ 2 endroits → candidat à l'extraction ?
|
|
376
|
+
Composants UI qui pourraient être paramétrables plutôt que dupliqués ?
|
|
377
|
+
Les constantes métier (statuts, codes d'erreur, limites) sont-elles centralisées ?
|
|
378
|
+
Les utilitaires purs (formatage, calculs) sont-ils dans des fichiers dédiés et testables ?
|
|
379
|
+
|
|
380
|
+
4. DETTE TECHNIQUE QUANTIFIÉE
|
|
381
|
+
TODO sans date + issue tracker → risque de ne jamais être traité
|
|
382
|
+
Fonctions > 50 lignes → identifier et proposer le découpage
|
|
383
|
+
Dépendances obsolètes → npm outdated (suggérer la commande)
|
|
384
|
+
Code commenté ou mort → le signaler pour suppression
|
|
385
|
+
Couplage fort (import circulaire, God Object) ?
|
|
386
|
+
|
|
387
|
+
5. TESTABILITÉ
|
|
388
|
+
La logique métier est-elle isolable ? (pas de fetch dans les business rules)
|
|
389
|
+
Les effets de bord sont-ils explicites et injectables ?
|
|
390
|
+
Les fonctions pures sont-elles identifiables (même input → même output) ?
|
|
391
|
+
Les dépendances externes sont-elles mockables ?
|
|
392
|
+
|
|
393
|
+
FORMAT : ✅ [module] — PROPRE : [résumé]
|
|
394
|
+
🟡 [module] — DETTE [HAUTE|MOYENNE|BASSE] : [description + refactoring suggéré]
|
|
395
|
+
🔴 [module] — CRITIQUE : [description + impact maintenabilité + correctif]`,
|
|
396
|
+
checks:["SRP : chaque module fait une chose","Logique métier dans une couche séparée","tsc --noEmit sans erreur","Pas de any non justifié","Constantes métier centralisées","Pas de code mort","Fonctions > 50 lignes identifiées et découpées","Logique métier isolable pour les tests"]},
|
|
397
|
+
|
|
398
|
+
{id:"p6",n:"6",icon:"🎯",label:"Edge Cases & Résilience",color:"#1E7FD8",tag:"EDGE CASES",group:"quality",
|
|
399
|
+
deps:["p2","p5"],
|
|
400
|
+
what:"Audit systématique des cas limites, valeurs extrêmes, pannes réseau et comportements imprévus. 90% des bugs en production viennent d'ici.",
|
|
401
|
+
how:"Remplis Bloc + Fichiers → Copie → colle dans Antigravity.",
|
|
402
|
+
prompt:`Tu es un Expert en Qualité Logicielle et Test de Résilience. BLOC [N].
|
|
403
|
+
|
|
404
|
+
PÉRIMÈTRE : [colle ici les 3-5 fichiers]
|
|
405
|
+
|
|
406
|
+
PROTOCOLE EDGE CASES — PENSE COMME UN UTILISATEUR MALCHANCEUX ET UN ATTACKER CRÉATIF :
|
|
407
|
+
|
|
408
|
+
1. NULL, UNDEFINED & ÉTATS VIDES
|
|
409
|
+
Optional chaining utilisé systématiquement sur les objets optionnels ?
|
|
410
|
+
array.map(), .filter(), .reduce() sur un tableau potentiellement vide ?
|
|
411
|
+
Valeur par défaut sur tous les paramètres optionnels ?
|
|
412
|
+
Accès à des propriétés imbriquées sans vérification (obj.a.b.c) ?
|
|
413
|
+
JSON.parse() sans try/catch sur des données externes ?
|
|
414
|
+
|
|
415
|
+
2. VALEURS LIMITES (BOUNDARY CONDITIONS)
|
|
416
|
+
Nombre : 0, négatif, Infinity, NaN, très grand (overflow int64 ?)
|
|
417
|
+
String : vide "", 1 caractère, 10 000 caractères, caractères spéciaux (<>"'&), emojis 🎉, RTL (عربي)
|
|
418
|
+
Date : passé lointain (1900), futur lointain (2099), timezone différent de l'utilisateur, DST changements
|
|
419
|
+
Fichier : taille 0 octets, taille maximale dépassée, mauvais MIME type, nom avec espaces/accents/../
|
|
420
|
+
URL : query params encodés, fragments (#), URLs très longues, Unicode dans les paths
|
|
421
|
+
|
|
422
|
+
3. CONCURRENCE & RACE CONDITIONS
|
|
423
|
+
Deux requêtes en parallèle sur la même ressource (ex: double-clic sur "Confirmer") ?
|
|
424
|
+
Mutation puis lecture immédiate avant que la BDD ne soit à jour ?
|
|
425
|
+
Cache qui retourne une valeur obsolète pendant une opération critique ?
|
|
426
|
+
Expiration de session EN COURS d'une opération longue (> 30 secondes) ?
|
|
427
|
+
Optimistic update qui entre en conflit avec une modification serveur concurrente ?
|
|
428
|
+
|
|
429
|
+
4. PANNES RÉSEAU & SERVICES TIERS
|
|
430
|
+
API externe indisponible : timeout défini ? Message d'erreur utilisateur clair ?
|
|
431
|
+
Retry exponentiel avec jitter (pas de retry storm) ?
|
|
432
|
+
Circuit breaker pour les services tiers critiques ?
|
|
433
|
+
Que se passe-t-il si Stripe/PayPal est down pendant un paiement en cours ?
|
|
434
|
+
Webhook non livré : idempotence du traitement si relivré ?
|
|
435
|
+
Mobile Afrique : que se passe-t-il avec une connexion 2G/coupée en milieu d'opération ?
|
|
436
|
+
|
|
437
|
+
5. DONNÉES CORROMPUES & SCHÉMA INATTENDU
|
|
438
|
+
Que se passe-t-il si la BDD retourne null sur un champ NON_NULL attendu ?
|
|
439
|
+
Si un webhook externe change son format de payload ?
|
|
440
|
+
Si un fichier importé (CSV, Excel) a des colonnes inversées ou manquantes ?
|
|
441
|
+
Si un utilisateur contourne le front-end et envoie directement des payloads malformés ?
|
|
442
|
+
|
|
443
|
+
6. RÈGLES MÉTIER AUX FRONTIÈRES (basé sur Phase 0)
|
|
444
|
+
Les invariants métier tiennent-ils pour les valeurs limites ?
|
|
445
|
+
(0 agents, 0 appels, paiement de 0€, fichier audio de 0 secondes, etc.)
|
|
446
|
+
|
|
447
|
+
FORMAT : ✅ [module] — RÉSILIENT : [cas testés]
|
|
448
|
+
🟡 [module] — CAS LIMITE NON GÉRÉ [HAUTE|MOYENNE] : [scénario précis → impact → solution]
|
|
449
|
+
🔴 [module] — CRASH EN PRODUCTION : [scénario → impact métier → correctif immédiat]`,
|
|
450
|
+
checks:["null/undefined géré sur tous les champs critiques","Tableaux vides gérés (affichage + calculs)","Valeurs limites : 0, négatif, très grand, chaîne vide","Race conditions protégées sur actions critiques","Timeout défini sur tous les appels d'API externe","Retry avec backoff exponentiel + jitter","Règles métier invariantes respectées aux valeurs limites","Session expirée gérée en cours d'opération longue"]},
|
|
451
|
+
|
|
452
|
+
// ── ADVANCED ────────────────────────────────────────────────
|
|
453
|
+
{id:"p_tests",n:"7",icon:"🧪",label:"Tests & Couverture",color:"#0D9373",tag:"TESTS",group:"advanced",
|
|
454
|
+
deps:["p5","p6"],
|
|
455
|
+
what:"Audit de la stratégie de tests existante et génération des tests manquants pour la logique métier critique. Un projet sans tests est un projet qui régresse.",
|
|
456
|
+
how:"Remplis Bloc + Fichiers (tests existants + code source) → Copie → colle dans Antigravity.",
|
|
457
|
+
prompt:`Tu es un Expert en Test Engineering & Quality Assurance. BLOC [N].
|
|
458
|
+
|
|
459
|
+
PÉRIMÈTRE : [colle ici les fichiers de test ET le code source correspondant]
|
|
460
|
+
|
|
461
|
+
PROTOCOLE AUDIT TESTS — IDENTIFIER CE QUI MANQUE ET GÉNÉRER :
|
|
462
|
+
|
|
463
|
+
1. INVENTAIRE DES TESTS EXISTANTS
|
|
464
|
+
Tests unitaires : couverture des fonctions de logique métier ?
|
|
465
|
+
Tests d'intégration : les flux API critiques sont-ils testés end-to-end ?
|
|
466
|
+
Tests E2E : les parcours utilisateur critiques (inscription, paiement, flux principal) ?
|
|
467
|
+
Tests de performance : seuils de charge validés ?
|
|
468
|
+
Calcule une couverture approximative (% de la logique métier critique couverte)
|
|
469
|
+
|
|
470
|
+
2. TESTS CRITIQUES MANQUANTS (GÉNÈRE-LES)
|
|
471
|
+
Pour chaque fonction de logique métier non testée, génère le test :
|
|
472
|
+
\`\`\`typescript
|
|
473
|
+
describe('[nomFonction]', () => {
|
|
474
|
+
it('should [comportement attendu] when [condition]', () => {
|
|
475
|
+
// Arrange
|
|
476
|
+
const input = [valeur représentative];
|
|
477
|
+
// Act
|
|
478
|
+
const result = maFonction(input);
|
|
479
|
+
// Assert
|
|
480
|
+
expect(result).toEqual([valeur attendue]);
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
it('should handle [edge case]', () => {
|
|
484
|
+
expect(() => maFonction(null)).toThrow('[message d erreur attendu]');
|
|
485
|
+
});
|
|
486
|
+
});
|
|
487
|
+
\`\`\`
|
|
488
|
+
|
|
489
|
+
3. TESTS DES RÈGLES MÉTIER INVARIANTES (basé sur Phase 0)
|
|
490
|
+
Pour chaque règle métier qui ne doit JAMAIS être violée, génère un test qui valide cette invariante.
|
|
491
|
+
Ces tests doivent être dans un fichier séparé business-rules.test.ts
|
|
492
|
+
|
|
493
|
+
4. MOCKING & ISOLATION
|
|
494
|
+
Les appels BDD sont-ils mockés dans les tests unitaires (sinon ce sont des tests d'intégration) ?
|
|
495
|
+
Les services externes (email, SMS, paiement) sont-ils mockés ?
|
|
496
|
+
Les tests sont-ils déterministes (pas de Date.now() ou Math.random() sans mock) ?
|
|
497
|
+
|
|
498
|
+
5. TESTS DE RÉGRESSION
|
|
499
|
+
Pour chaque bug critique corrigé, y a-t-il un test de non-régression ?
|
|
500
|
+
Les tests couvrent-ils les edge cases identifiés en Phase 6 ?
|
|
501
|
+
|
|
502
|
+
FORMAT : ✅ [module] — BIEN TESTÉ : [couverture résumée]
|
|
503
|
+
🟡 [module] — TESTS MANQUANTS [impact] : [liste + tests générés]
|
|
504
|
+
🔴 [module] — LOGIQUE MÉTIER NON TESTÉE : [tests critiques générés]`,
|
|
505
|
+
checks:["Logique métier critique couverte par des tests unitaires","Flux API critiques couverts par des tests d'intégration","Règles métier invariantes testées dans un fichier dédié","Edge cases Phase 6 couverts par des tests","Tests déterministes (mocks sur Date/Random/API)","Tests de non-régression sur les bugs passés","Couverture ≥ 80% sur la logique métier (pas le boilerplate)"]},
|
|
506
|
+
|
|
507
|
+
{id:"p_deps",n:"8",icon:"📦",label:"Dépendances & Supply Chain",color:"#0D9373",tag:"DEPS",group:"advanced",
|
|
508
|
+
deps:["p8"],
|
|
509
|
+
what:"Audit complet des dépendances : vulnérabilités CVE, licences incompatibles, alternatives légères, risque d'abandon et sécurité de la supply chain.",
|
|
510
|
+
how:"Remplis Bloc + Fichiers (package.json, yarn.lock, Gemfile, requirements.txt) → Copie → colle dans Antigravity.",
|
|
511
|
+
prompt:`Tu es un Expert en Supply Chain Security & Dependency Management. BLOC [N].
|
|
512
|
+
|
|
513
|
+
PÉRIMÈTRE : [colle ici package.json, lockfile (package-lock.json ou yarn.lock), et tout fichier de dépendances]
|
|
514
|
+
|
|
515
|
+
PROTOCOLE AUDIT DÉPENDANCES :
|
|
516
|
+
|
|
517
|
+
1. SÉCURITÉ (CVE)
|
|
518
|
+
npm audit --json → lister les CVE critiques et hautes avec leur impact réel
|
|
519
|
+
Pour chaque CVE critique : est-il réellement exploitable dans ce contexte ? (CVSS contextuel)
|
|
520
|
+
Dépendances transitives avec CVE connues ?
|
|
521
|
+
→ Commandes à suggérer : npm audit fix --force (avec précautions)
|
|
522
|
+
|
|
523
|
+
2. LICENCES (risque légal)
|
|
524
|
+
Licences incompatibles avec le modèle commercial ?
|
|
525
|
+
GPL/AGPL dans un projet commercial non open-source → risque légal
|
|
526
|
+
→ Licence requise pour chaque dépendance critique (MIT, Apache 2.0, BSD = safe ; GPL = attention)
|
|
527
|
+
|
|
528
|
+
3. TAILLE & ALTERNATIVES LÉGÈRES
|
|
529
|
+
Dépendances > 50kb gzippé qui pourraient être remplacées ?
|
|
530
|
+
moment.js (67kb) → dayjs (7kb) ou date-fns (tree-shakeable)
|
|
531
|
+
lodash (entire) → lodash-es (tree-shakeable) ou fonctions natives
|
|
532
|
+
axios → fetch natif si pas de besoin spécifique d'axios
|
|
533
|
+
left-pad ou tiny-utility-packages pouvant être réécrites en 5 lignes ?
|
|
534
|
+
|
|
535
|
+
4. RISQUE D'ABANDON
|
|
536
|
+
Dépendances sans release depuis > 2 ans ?
|
|
537
|
+
Mainteneurs uniques (bus factor = 1) ?
|
|
538
|
+
Issues critiques ouvertes sans réponse depuis > 6 mois ?
|
|
539
|
+
Forks populaires qui ont remplacé le package original ?
|
|
540
|
+
|
|
541
|
+
5. SÉCURITÉ SUPPLY CHAIN
|
|
542
|
+
Typosquatting : des dépendances avec des noms proches de packages populaires ?
|
|
543
|
+
Scripts postinstall qui exécutent du code (potentiel malware) ?
|
|
544
|
+
Lockfile versionné ? (sans lockfile, npm install peut installer des versions différentes)
|
|
545
|
+
Dépendances qui ont accès aux variables d'env au build time ?
|
|
546
|
+
|
|
547
|
+
FORMAT : ✅ [dépendance] — SÛRE : [version + licence + statut maintenance]
|
|
548
|
+
🟡 [dépendance] — ATTENTION [CVE|LICENCE|TAILLE|ABANDON] : [détail + alternative recommandée]
|
|
549
|
+
🔴 [dépendance] — CRITIQUE : [CVE exploitable ou licence incompatible + action immédiate]`,
|
|
550
|
+
checks:["npm audit : pas de CVE critique non justifié","Licences compatibles avec le modèle commercial","Pas de dépendance > 100kb sans alternative légère étudiée","Dépendances maintenues activement (< 2 ans sans release)","Lockfile versionné (yarn.lock ou package-lock.json)","Pas de typosquatting détecté","Scripts postinstall identifiés et audités"]},
|
|
551
|
+
|
|
552
|
+
{id:"p_obs",n:"9",icon:"📊",label:"Observabilité & Monitoring",color:"#0D9373",tag:"OBSERVABILITY",group:"advanced",
|
|
553
|
+
deps:["p8"],
|
|
554
|
+
what:"Audit de la visibilité en production : logs structurés, métriques, alertes, tracing et gestion des incidents. Un bug qu'on ne voit pas en production est pire qu'un bug connu.",
|
|
555
|
+
how:"Remplis Bloc + Fichiers (Sentry config, logger, monitoring config, dashboards) → Copie → colle dans Antigravity.",
|
|
556
|
+
prompt:`Tu es un Expert en Observabilité & Site Reliability Engineering. BLOC [N].
|
|
557
|
+
|
|
558
|
+
PÉRIMÈTRE : [colle ici les fichiers de config monitoring, logger, Sentry/Datadog/etc., alerting rules]
|
|
559
|
+
|
|
560
|
+
PROTOCOLE OBSERVABILITÉ :
|
|
561
|
+
|
|
562
|
+
1. LOGS STRUCTURÉS
|
|
563
|
+
Les logs sont-ils structurés (JSON) avec des champs standardisés (level, timestamp, requestId, userId) ?
|
|
564
|
+
Les logs contiennent-ils des données sensibles ? (passwords, tokens, PII dans les logs = violation RGPD)
|
|
565
|
+
Un requestId unique tracé à travers toute la requête (headers → BDD → réponse) ?
|
|
566
|
+
Les niveaux de log sont-ils corrects ? (debug en dev, warn/error en prod)
|
|
567
|
+
Les erreurs non capturées (unhandledRejection, uncaughtException) sont-elles loggées ?
|
|
568
|
+
Volumétrie : les logs ne vont-ils pas saturer le stockage à [UAD] req/jour ?
|
|
569
|
+
|
|
570
|
+
2. MÉTRIQUES BUSINESS & TECHNIQUES
|
|
571
|
+
Les métriques clés du domaine métier sont-elles trackées ? (ex: appels audités/jour, taux de succès)
|
|
572
|
+
Métriques techniques : p95/p99 latence, taux d'erreur 4xx/5xx, connexions BDD actives ?
|
|
573
|
+
Golden signals : Latency, Traffic, Errors, Saturation (RED/USE) ?
|
|
574
|
+
Les SLA définis en Phase 0 sont-ils mesurés automatiquement ?
|
|
575
|
+
|
|
576
|
+
3. ALERTES (ne pas subir, anticiper)
|
|
577
|
+
Alerte sur erreur rate > seuil (ex: > 1% de 5xx) ?
|
|
578
|
+
Alerte sur latence p95 > SLA cible ?
|
|
579
|
+
Alerte sur saturation BDD (connexions, disk, CPU) ?
|
|
580
|
+
Dead Man's Switch : alerte si le système est SILENCIEUX (pas de requêtes = problème) ?
|
|
581
|
+
Les alertes sont-elles actionnables ? (pas d'alert fatigue avec des faux positifs)
|
|
582
|
+
Rotation d'astreinte définie pour les alertes critiques ?
|
|
583
|
+
|
|
584
|
+
4. ERROR TRACKING
|
|
585
|
+
Erreurs capturées avec contexte (user, stack trace, breadcrumbs) ?
|
|
586
|
+
Taux d'erreur par endpoint trackés séparément ?
|
|
587
|
+
Erreurs groupées intelligemment (pas un ticket par occurrence) ?
|
|
588
|
+
Release tracking pour corréler erreurs et déploiements ?
|
|
589
|
+
|
|
590
|
+
5. TRACING DISTRIBUÉ (si microservices ou services multiples)
|
|
591
|
+
Trace ID propagé entre services ?
|
|
592
|
+
Temps passé dans chaque service visible ?
|
|
593
|
+
Goulots d'étranglement identifiables par trace ?
|
|
594
|
+
|
|
595
|
+
FORMAT : ✅ [composant] — OBSERVABLE : [résumé]
|
|
596
|
+
🟡 [composant] — ANGLE MORT [impact] : [ce qui manque + solution]
|
|
597
|
+
🔴 [composant] — NON OBSERVABLE EN PRODUCTION : [risque + mise en place urgente]`,
|
|
598
|
+
checks:["Logs structurés (JSON) sans données sensibles","RequestId tracé bout-en-bout","Métriques métier clés trackées","Alertes sur : error rate, latence p95, saturation BDD","Dead Man's Switch configuré","Error tracking avec contexte (user + stack)","SLA définis en Phase 0 mesurés automatiquement","Rotation d'astreinte définie pour les alertes critiques"]},
|
|
599
|
+
|
|
600
|
+
{id:"p_a11y",n:"9.5",icon:"♿",label:"Accessibilité Avancée",color:"#0D9373",tag:"A11Y",group:"advanced",
|
|
601
|
+
deps:["p3"],
|
|
602
|
+
what:"Audit d'accessibilité WCAG 2.2 complet avec tests concrets pour les technologies d'assistance. L'accessibilité est un droit, pas une option.",
|
|
603
|
+
how:"Remplis Bloc + Fichiers (composants, pages, styles) → Copie → colle dans Antigravity. Idéalement : coller aussi les résultats d'axe-core ou Lighthouse.",
|
|
604
|
+
prompt:`Tu es un Expert en Accessibilité Web (WCAG 2.2, ARIA, AT). BLOC [N].
|
|
605
|
+
|
|
606
|
+
PÉRIMÈTRE : [colle ici les fichiers de composants et pages, et idéalement les résultats de : npx axe-core-cli http://localhost:3000 ou Lighthouse accessibility report]
|
|
607
|
+
|
|
608
|
+
PROTOCOLE ACCESSIBILITÉ WCAG 2.2 COMPLET :
|
|
609
|
+
|
|
610
|
+
1. STRUCTURE SÉMANTIQUE (WCAG 1.3)
|
|
611
|
+
Hiérarchie des titres : h1 unique par page, h2-h6 logiquement imbriqués (pas de saut) ?
|
|
612
|
+
Landmarks ARIA : main, nav, header, footer, aside, section avec aria-label ?
|
|
613
|
+
Listes sémantiques : les menus de navigation sont-ils des <ul>/<ol> ?
|
|
614
|
+
Les tableaux ont-ils des <caption>, <th scope="col/row"> ?
|
|
615
|
+
Les boutons sont-ils des <button> ou des <a href> avec le rôle approprié ?
|
|
616
|
+
Les icônes purement décoratives ont-elles aria-hidden="true" ?
|
|
617
|
+
|
|
618
|
+
2. ALTERNATIVES TEXTUELLES (WCAG 1.1)
|
|
619
|
+
Images informatives : alt décrivant le contenu ET le contexte ?
|
|
620
|
+
Images complexes (graphiques, diagrammes) : description longue (longdesc ou aria-describedby) ?
|
|
621
|
+
Icônes de boutons sans texte : aria-label descriptif ?
|
|
622
|
+
PDF, vidéos, audio : alternatives textuelles ou transcriptions ?
|
|
623
|
+
|
|
624
|
+
3. NAVIGATION AU CLAVIER (WCAG 2.1)
|
|
625
|
+
Tous les éléments interactifs atteignables via Tab ?
|
|
626
|
+
Ordre de focus logique (suit l'ordre visuel) ?
|
|
627
|
+
Focus visible : outline visible avec ratio de contraste ≥ 3:1 ?
|
|
628
|
+
Modales : focus piégé dans la modale, retour au déclencheur à la fermeture ?
|
|
629
|
+
Menus déroulants : navigables aux flèches ?
|
|
630
|
+
Drag & drop : alternative au clavier ?
|
|
631
|
+
Raccourcis clavier documentés et sans conflits (Escape, Entrée, Espace) ?
|
|
632
|
+
|
|
633
|
+
4. CONTRASTE & COULEURS (WCAG 1.4)
|
|
634
|
+
Texte normal (< 18pt) : ratio ≥ 4.5:1 ?
|
|
635
|
+
Texte large (≥ 18pt ou ≥ 14pt gras) : ratio ≥ 3:1 ?
|
|
636
|
+
Composants UI (bordures de champ, icônes actives) : ratio ≥ 3:1 ?
|
|
637
|
+
L'information n'est pas transmise UNIQUEMENT par la couleur (erreurs rouges avec icône ?) ?
|
|
638
|
+
|
|
639
|
+
5. FORMULAIRES & ERREURS (WCAG 3.3)
|
|
640
|
+
Chaque champ a un label associé (pas juste un placeholder) ?
|
|
641
|
+
Les messages d'erreur identifient le champ concerné et expliquent le problème ?
|
|
642
|
+
Les champs obligatoires sont marqués (aria-required="true") ?
|
|
643
|
+
Validation : les erreurs sont-elles annoncées aux screen readers (aria-live="assertive") ?
|
|
644
|
+
|
|
645
|
+
6. CONTENU DYNAMIQUE (WCAG 4.1)
|
|
646
|
+
Les mises à jour dynamiques sont-elles annoncées via aria-live ?
|
|
647
|
+
Les chargements sont-ils indiqués (aria-busy="true") ?
|
|
648
|
+
Les composants personnalisés ont-ils le bon rôle ARIA et les bons états (aria-expanded, aria-checked) ?
|
|
649
|
+
|
|
650
|
+
FORMAT : ✅ [composant] — ACCESSIBLE : [résumé]
|
|
651
|
+
🟡 [composant] — WCAG [critère] — [HAUTE|MOYENNE] : [description + solution concrète]
|
|
652
|
+
🔴 [composant] — BARRIÈRE D'ACCÈS CRITIQUE : [description + correctif]`,
|
|
653
|
+
checks:["Hiérarchie h1-h6 logique et unique","Landmarks ARIA sur toutes les sections","Alt text pertinent sur toutes les images non-décoratives","Navigation clavier complète sur tous les éléments interactifs","Focus visible avec contraste ≥ 3:1","Contraste texte ≥ 4.5:1 (normal) / 3:1 (large)","Modales avec FocusTrap et retour au déclencheur","Erreurs formulaire avec aria-live=assertive","Pas d'info transmise par couleur seule","Composants ARIA avec états corrects (expanded, checked)"]},
|
|
654
|
+
|
|
655
|
+
{id:"p_integ",n:"10",icon:"🔗",label:"Intégrations Tierces",color:"#0D9373",tag:"INTEGRATIONS",group:"advanced",
|
|
656
|
+
deps:["p2","p_cfg"],
|
|
657
|
+
what:"Audit des intégrations externes : APIs tierces, OAuth/SSO, webhooks entrants/sortants, services email/SMS, stockage cloud. Chaque intégration est une surface d'attaque.",
|
|
658
|
+
how:"Remplis Bloc + Fichiers (code d'intégration, config OAuth, webhook handlers) → Copie → colle dans Antigravity.",
|
|
659
|
+
prompt:`Tu es un Expert en Sécurité des Intégrations & API Tierce. BLOC [N].
|
|
660
|
+
|
|
661
|
+
PÉRIMÈTRE : [colle ici les fichiers d'intégration : handlers OAuth, webhook receivers, API clients, email/SMS service config]
|
|
662
|
+
|
|
663
|
+
PROTOCOLE INTÉGRATIONS TIERCES :
|
|
664
|
+
|
|
665
|
+
1. OAUTH & SSO
|
|
666
|
+
State parameter présent et validé (prévient CSRF sur le flow OAuth) ?
|
|
667
|
+
PKCE implémenté pour les flows publics (SPA, mobile) ?
|
|
668
|
+
Tokens stockés côté serveur (HttpOnly cookie) et non dans localStorage ?
|
|
669
|
+
Scopes demandés : minimum nécessaire (principle of least privilege) ?
|
|
670
|
+
Token refresh sécurisé et rotation du refresh token ?
|
|
671
|
+
Validation de l'audience (aud claim) dans les tokens JWT reçus ?
|
|
672
|
+
|
|
673
|
+
2. WEBHOOKS ENTRANTS (Stripe, GitHub, Twilio, etc.)
|
|
674
|
+
Signature vérifiée AVANT tout traitement ?
|
|
675
|
+
Idempotence : deux livraisons du même webhook ne créent pas de doublon ?
|
|
676
|
+
Queue/buffer pour les pics de webhooks (pas de traitement synchrone bloquant) ?
|
|
677
|
+
Réponse 200 rapide + traitement asynchrone pour les webhooks longs ?
|
|
678
|
+
Replay d'attaque prévenu (timestamp vérifié, tolérance ≤ 5 minutes) ?
|
|
679
|
+
|
|
680
|
+
3. APIs EXTERNES CONSOMMÉES
|
|
681
|
+
Clés API en variables d'env (jamais hardcodées) ?
|
|
682
|
+
Timeout défini sur chaque appel externe (pas de hang infini) ?
|
|
683
|
+
Circuit breaker : que se passe-t-il si l'API externe est down > 5 minutes ?
|
|
684
|
+
Gestion des rate limits de l'API tierce (retry avec backoff, file d'attente) ?
|
|
685
|
+
Données sensibles loggées dans les logs d'API tiers (attention aux SDK qui loggent tout) ?
|
|
686
|
+
|
|
687
|
+
4. EMAIL & SMS
|
|
688
|
+
Templates email : injection possible dans les champs utilisateur ?
|
|
689
|
+
Rate limiting sur l'envoi (pas de spam bombing via l'API email) ?
|
|
690
|
+
Bounces et unsubscribes traités (impact délivrabilité) ?
|
|
691
|
+
SPF, DKIM, DMARC configurés pour le domaine d'envoi ?
|
|
692
|
+
SMS : vérification du numéro avant envoi, pas de SMS bombing ?
|
|
693
|
+
|
|
694
|
+
5. STOCKAGE CLOUD (S3, GCS, Azure Blob)
|
|
695
|
+
Buckets privés par défaut (pas de public read) ?
|
|
696
|
+
URLs signées avec expiration courte pour les fichiers sensibles ?
|
|
697
|
+
ACL par objet ou politique de bucket (pas d'accès croisé entre utilisateurs) ?
|
|
698
|
+
Upload direct : validation du type MIME côté serveur (pas seulement l'extension) ?
|
|
699
|
+
Scan antivirus sur les fichiers uploadés ?
|
|
700
|
+
|
|
701
|
+
FORMAT : ✅ [intégration] — SÉCURISÉE : [résumé]
|
|
702
|
+
🔴 [intégration] — [CRITIQUE|HAUTE|MOYENNE] : [description + vecteur d'attaque + correctif]`,
|
|
703
|
+
checks:["OAuth : state + PKCE + scopes minimum","Webhooks : signature vérifiée avant traitement","Webhooks : idempotents","APIs tierces : timeout + circuit breaker définis","Clés API tierces en variables d'env","Templates email : pas d'injection possible","SPF/DKIM/DMARC configurés","Buckets cloud privés avec URLs signées","Upload : type MIME validé côté serveur"]},
|
|
704
|
+
|
|
705
|
+
{id:"p_biz",n:"10.5",icon:"📋",label:"Tests Logique Métier",color:"#0D9373",tag:"BUSINESS LOGIC",group:"advanced",
|
|
706
|
+
deps:["p0","p2","p6"],
|
|
707
|
+
what:"Audit des invariants métier et des workflows complexes. Vérifie que le code reflète fidèlement les règles du domaine, même dans les cas extrêmes.",
|
|
708
|
+
how:"Copie le prompt → colle dans Antigravity avec le code des domaines métier → valide chaque règle avec l'IA.",
|
|
709
|
+
prompt:`Tu es un Expert en Domain-Driven Design et Logique Métier. BLOC [N].
|
|
710
|
+
|
|
711
|
+
CONTEXTE MÉTIER COMPLET (issu de Phase 0) : [règles métier invariantes]
|
|
712
|
+
PÉRIMÈTRE : [colle ici les fichiers de logique métier, services, domain models]
|
|
713
|
+
|
|
714
|
+
PROTOCOLE TESTS LOGIQUE MÉTIER — VALIDE CHAQUE RÈGLE DU DOMAINE :
|
|
715
|
+
|
|
716
|
+
1. INVARIANTS MÉTIER (règles qui ne doivent JAMAIS être violées)
|
|
717
|
+
Pour chaque règle invariante identifiée en Phase 0, valide qu'elle est :
|
|
718
|
+
a. Implémentée dans le code (pas seulement dans l'UI)
|
|
719
|
+
b. Protégée même si l'UI est contournée (appel API direct)
|
|
720
|
+
c. Testée unitairement dans un fichier de tests dédié
|
|
721
|
+
d. Documentée dans le code avec un commentaire expliquant POURQUOI
|
|
722
|
+
|
|
723
|
+
2. TRANSITIONS D'ÉTAT (State Machine)
|
|
724
|
+
Les objets du domaine ont-ils des états définis ?
|
|
725
|
+
Les transitions d'état sont-elles explicites et validées ?
|
|
726
|
+
(ex: un appel peut passer de EN_COURS → TERMINÉ mais pas de TERMINÉ → EN_COURS)
|
|
727
|
+
Un état invalide est-il impossible à atteindre (type safety + validation) ?
|
|
728
|
+
|
|
729
|
+
3. RÈGLES DE GESTION COMPLEXES
|
|
730
|
+
Les calculs critiques (prix, commissions, scores, quotas) sont-ils corrects ?
|
|
731
|
+
Vérifie les calculs avec des exemples concrets tirés des cas d'usage métier
|
|
732
|
+
Les arrondis sont-ils gérés correctement ? (bancaire : half-even, pas half-up)
|
|
733
|
+
Les devises multiples sont-elles gérées sans erreur de conversion ?
|
|
734
|
+
|
|
735
|
+
4. WORKFLOWS & SAGA
|
|
736
|
+
Les processus multi-étapes (ex: audit complet) sont-ils résilients ?
|
|
737
|
+
Que se passe-t-il si l'étape 3 échoue après que les étapes 1 et 2 ont réussi ?
|
|
738
|
+
Compensation transactions pour les workflows distribués ?
|
|
739
|
+
Les deadlines métier (ex: "audit doit être terminé en X jours") sont-elles trackées ?
|
|
740
|
+
|
|
741
|
+
5. COHÉRENCE DES DONNÉES MÉTIER
|
|
742
|
+
Les données de référence (statuts, types, catégories) sont-elles cohérentes entre les modules ?
|
|
743
|
+
Les totaux et agrégats sont-ils recalculés ou maintenus à jour ?
|
|
744
|
+
Les données sont-elles cohérentes entre le cache et la BDD ?
|
|
745
|
+
|
|
746
|
+
FORMAT : ✅ [règle métier] — RESPECTÉE : [comment elle est implémentée + testée]
|
|
747
|
+
🟡 [règle métier] — PARTIELLEMENT IMPLÉMENTÉE : [ce qui manque + risque métier]
|
|
748
|
+
🔴 [règle métier] — VIOLÉE OU NON IMPLÉMENTÉE : [impact métier + correctif]`,
|
|
749
|
+
checks:["Toutes les règles invariantes Phase 0 implémentées côté serveur","Machine à états explicite pour les objets du domaine","Calculs critiques vérifiés avec des exemples concrets","Arrondis et devises gérés correctement","Workflows résilients (compensation en cas d'échec partiel)","Règles métier testées unitairement dans un fichier dédié","Transitions d'état invalides impossibles par construction"]},
|
|
750
|
+
|
|
751
|
+
// ── DATA ─────────────────────────────────────────────────────
|
|
752
|
+
{id:"p7",n:"11",icon:"🗄",label:"Données & Migrations",color:"#C47D0E",tag:"DATA",group:"data",
|
|
753
|
+
deps:["p0","p1"],
|
|
754
|
+
what:"Audit du schéma BDD, migrations, intégrité des données, PII et stratégie de disaster recovery.",
|
|
755
|
+
how:"Remplis Bloc + Fichiers (migrations, schema, models) → Copie → colle dans Antigravity.",
|
|
756
|
+
prompt:`Tu es un Expert en Conception de Base de Données & Data Engineering. BLOC [N].
|
|
757
|
+
|
|
758
|
+
PÉRIMÈTRE : [colle ici les fichiers de migration, schéma (schema.sql, prisma.schema, models.py, migrations/), seeds]
|
|
759
|
+
|
|
760
|
+
PROTOCOLE DONNÉES :
|
|
761
|
+
|
|
762
|
+
1. INTÉGRITÉ DU SCHÉMA
|
|
763
|
+
FK : ON DELETE approprié selon le domaine métier ?
|
|
764
|
+
CASCADE : utilise-t-on vraiment la suppression en cascade ? (souvent trop agressif)
|
|
765
|
+
SET NULL : la colonne est-elle nullable ? (cohérence)
|
|
766
|
+
RESTRICT : comportement voulu si une référence existe encore ?
|
|
767
|
+
NOT NULL : les colonnes critiques pour la logique métier sont-elles contraintes ?
|
|
768
|
+
UNIQUE : les identifiants métier (email, référence commande) sont-ils uniques ?
|
|
769
|
+
CHECK constraints : les valeurs sont-elles contraintes au niveau BDD ? (prix ≥ 0, statut IN (...))
|
|
770
|
+
Types corrects : DECIMAL pour les montants (pas FLOAT), TIMESTAMPTZ pour les dates (pas TIMESTAMP)
|
|
771
|
+
Index : colonnes utilisées dans WHERE, ORDER BY, JOIN — index manquants identifiés ?
|
|
772
|
+
Index composites : ordre des colonnes optimisé pour les requêtes fréquentes ?
|
|
773
|
+
|
|
774
|
+
2. MIGRATIONS
|
|
775
|
+
Chaque migration a-t-elle une down migration testée ?
|
|
776
|
+
Les migrations sur grandes tables utilisent-elles des techniques non-bloquantes ?
|
|
777
|
+
(ADD COLUMN DEFAULT NULL → backfill séparé → ADD NOT NULL)
|
|
778
|
+
L'ordre des migrations est-il idempotent ? (peut-on rejouer depuis zéro ?)
|
|
779
|
+
Les migrations destructives (DROP) ont-elles un plan de rollback ?
|
|
780
|
+
|
|
781
|
+
3. DONNÉES SENSIBLES & RGPD
|
|
782
|
+
Mots de passe : bcrypt avec cost ≥ 12 ou argon2id ?
|
|
783
|
+
PII : chiffrées au repos si nécessaire (numéros de téléphone, données médicales) ?
|
|
784
|
+
Droit à l'oubli : mécanisme de suppression/anonymisation implémenté ?
|
|
785
|
+
Rétention des données : les données sont-elles supprimées après la période légale ?
|
|
786
|
+
Logs BDD ne contiennent pas de PII (pg_audit, slow query logs) ?
|
|
787
|
+
|
|
788
|
+
4. DISASTER RECOVERY
|
|
789
|
+
RPO (Recovery Point Objective) : fréquence des backups adaptée ? (toutes les heures pour des données critiques)
|
|
790
|
+
RTO (Recovery Time Objective) : procédure de restauration testée et chronométrée ?
|
|
791
|
+
Backups : stockés dans une région géographique différente ?
|
|
792
|
+
Point-in-time recovery disponible ?
|
|
793
|
+
Test de restauration effectué dans les 90 derniers jours ?
|
|
794
|
+
|
|
795
|
+
FORMAT : ✅ CONFORME : [résumé]
|
|
796
|
+
🟡 AMÉLIORATION : [description + impact + solution]
|
|
797
|
+
🔴 RISQUE INTÉGRITÉ : [description + impact métier + correctif obligatoire]`,
|
|
798
|
+
checks:["FK avec ON DELETE adapté au domaine métier","NOT NULL et CHECK constraints sur colonnes critiques","Types corrects (DECIMAL pour montants, TIMESTAMPTZ pour dates)","Index sur colonnes filtrées/triées (EXPLAIN ANALYZE suggéré)","Migrations réversibles et non-bloquantes sur grandes tables","Mots de passe : bcrypt cost ≥ 12 ou argon2id","PII chiffrées au repos selon conformités","Mécanisme de droit à l'oubli RGPD implémenté","RPO/RTO définis et testés"]},
|
|
799
|
+
|
|
800
|
+
{id:"p8",n:"12",icon:"🖥️",label:"Infra, CI/CD & DevSecOps",color:"#C47D0E",tag:"INFRA",group:"data",
|
|
801
|
+
deps:["p_cfg"],
|
|
802
|
+
what:"Audit de l'infrastructure, pipeline CI/CD, variables d'env, headers HTTP et pratiques DevSecOps.",
|
|
803
|
+
how:"Remplis Bloc + Fichiers (.env.example, Dockerfile, workflows/, nginx config) → Copie → colle dans Antigravity.",
|
|
804
|
+
prompt:`Tu es un Expert DevSecOps & Infrastructure Security. BLOC [N].
|
|
805
|
+
|
|
806
|
+
PÉRIMÈTRE : [colle ici .env.example, Dockerfile, .github/workflows/*.yml, docker-compose.yml, nginx.conf, package.json]
|
|
807
|
+
|
|
808
|
+
PROTOCOLE DEVSECOPS :
|
|
809
|
+
|
|
810
|
+
1. VARIABLES D'ENVIRONNEMENT
|
|
811
|
+
.env.example à jour avec TOUTES les variables + description de chacune ?
|
|
812
|
+
Différenciation obligatoire dev/staging/prod (jamais les mêmes secrets) ?
|
|
813
|
+
Secrets dans les variables d'env du pipeline (GitHub Secrets) — pas dans les YAML ?
|
|
814
|
+
Rotation des secrets planifiée (pas les mêmes depuis > 1 an) ?
|
|
815
|
+
Variables non utilisées à nettoyer ?
|
|
816
|
+
|
|
817
|
+
2. PIPELINE CI/CD (Shift Left Security)
|
|
818
|
+
SAST (analyse statique) avant merge ? (Semgrep, CodeQL)
|
|
819
|
+
DAST (analyse dynamique) sur staging avant prod ? (OWASP ZAP)
|
|
820
|
+
Scan de secrets dans le code (Gitleaks) en pre-commit et CI ?
|
|
821
|
+
Tests de sécurité automatisés (npm audit, snyk) bloquants si CVE critique ?
|
|
822
|
+
Image Docker scannée (Trivy, Snyk Container) avant déploiement ?
|
|
823
|
+
Branche production protégée : PR obligatoire + review + tests verts ?
|
|
824
|
+
Déploiement bleu/vert ou canary pour les réductions de risque ?
|
|
825
|
+
|
|
826
|
+
3. DOCKERFILE & IMAGES
|
|
827
|
+
Image de base officielle et version fixée (pas :latest) ?
|
|
828
|
+
Utilisateur non-root dans le container (USER appuser) ?
|
|
829
|
+
Image multi-stage pour réduire la surface d'attaque ?
|
|
830
|
+
Variables sensibles non incluses dans le Dockerfile (ARG vs ENV) ?
|
|
831
|
+
.dockerignore présent et complet (pas de node_modules, .env, .git dans l'image) ?
|
|
832
|
+
|
|
833
|
+
4. HEADERS HTTP (rappel du p_cfg + vérification finale)
|
|
834
|
+
Content-Security-Policy effectivement délivrée en production ?
|
|
835
|
+
HSTS avec preload soumis à la preload list des navigateurs ?
|
|
836
|
+
Tous les headers vérifiés avec securityheaders.com ?
|
|
837
|
+
|
|
838
|
+
5. MONITORING & INCIDENT RESPONSE
|
|
839
|
+
Runbook pour les incidents critiques (procédure step-by-step) ?
|
|
840
|
+
Post-mortem template défini ?
|
|
841
|
+
Canaux d'alerte testés régulièrement (PagerDuty, Slack, email) ?
|
|
842
|
+
SLA de réponse aux incidents défini (P1 < 15min, P2 < 1h) ?
|
|
843
|
+
|
|
844
|
+
FORMAT : ✅ CONFORME : [résumé]
|
|
845
|
+
🟡 AMÉLIORATION : [description + risque + solution]
|
|
846
|
+
🔴 CRITIQUE : [description + impact + correctif]`,
|
|
847
|
+
checks:["Toutes variables d'env dans .env.example avec description","Secrets dans pipeline secrets (jamais dans les YAML)","Scan de secrets (Gitleaks) en pre-commit et CI","Tests de sécurité bloquants si CVE critique","Image Docker : non-root + version fixée + multi-stage","Branche production protégée (PR + review + tests)","Headers HTTP vérifiés avec securityheaders.com","Runbook incidents et SLA de réponse définis"]},
|
|
848
|
+
|
|
849
|
+
{id:"p85",n:"12.5",icon:"📚",label:"Documentation Profonde",color:"#C47D0E",tag:"DOCS",group:"data",
|
|
850
|
+
deps:["p5"],
|
|
851
|
+
what:"Audit de la documentation + génération des JSDoc/docstrings manquants pour chaque fonction. L'IA génère la documentation réelle, pas juste les recommandations.",
|
|
852
|
+
how:"Remplis Bloc + Fichiers (code source + docs existantes) → Copie → colle dans Antigravity → récupère la documentation générée.",
|
|
853
|
+
prompt:`Tu es un Expert en Documentation Technique & Knowledge Engineering. BLOC [N].
|
|
854
|
+
|
|
855
|
+
PÉRIMÈTRE : [colle ici le code source + README.md + tout fichier de documentation existant]
|
|
856
|
+
|
|
857
|
+
PROTOCOLE DOCUMENTATION EN DEUX NIVEAUX :
|
|
858
|
+
|
|
859
|
+
NIVEAU 1 — DOCUMENTATION PROJET
|
|
860
|
+
1. README FONCTIONNEL (test du "30 minutes rule")
|
|
861
|
+
Un développeur junior peut-il lancer le projet en < 30 minutes sans aide ?
|
|
862
|
+
Prérequis : versions exactes (Node 20.x, Python 3.11, Postgres 15) ?
|
|
863
|
+
Commandes step-by-step : clone → install → env → seed → run → test ?
|
|
864
|
+
Dépannage : erreurs communes et solutions ?
|
|
865
|
+
|
|
866
|
+
2. ARCHITECTURE DECISION RECORDS (ADR)
|
|
867
|
+
Les choix techniques importants sont-ils documentés avec le CONTEXTE et le RAISONNEMENT ?
|
|
868
|
+
(ex: "Pourquoi Supabase et pas Firebase ?" → les ADR documentent la décision)
|
|
869
|
+
|
|
870
|
+
NIVEAU 2 — DOCUMENTATION DU CODE (GÉNÈRE LA DOCUMENTATION MANQUANTE)
|
|
871
|
+
Pour chaque fonction/module sans documentation complète, génère :
|
|
872
|
+
|
|
873
|
+
\`\`\`typescript
|
|
874
|
+
/**
|
|
875
|
+
* [Ce que fait la fonction en 1 phrase active : "Calcule", "Vérifie", "Transforme"...]
|
|
876
|
+
*
|
|
877
|
+
* Contexte métier : [Dans quel flux cette fonction s'insère, pourquoi elle existe,
|
|
878
|
+
* quelles règles métier elle implémente — critique pour comprendre le code dans 6 mois]
|
|
879
|
+
*
|
|
880
|
+
* @param {Type} nomParam - [Description précise + unité si applicable + valeurs invalides]
|
|
881
|
+
* @param {Type} [optionnel] - [Description + valeur par défaut + quand l'omettre]
|
|
882
|
+
*
|
|
883
|
+
* @returns {Type} [Description de ce qui est retourné + cas null/undefined]
|
|
884
|
+
*
|
|
885
|
+
* @throws {ErrorType} [Dans quelles conditions + message d'erreur attendu]
|
|
886
|
+
*
|
|
887
|
+
* @example
|
|
888
|
+
* // [Exemple concret avec vraies valeurs métier — pas de "foo" ou "bar"]
|
|
889
|
+
* const score = calculateAuditScore({ phases: completedPhases, findings: criticalFindings });
|
|
890
|
+
* // → { score: 87, grade: 'B', recommendation: 'Corriger 2 findings critiques' }
|
|
891
|
+
*
|
|
892
|
+
* @see [Lien vers la règle métier, le ticket, ou le document de spec si disponible]
|
|
893
|
+
*/
|
|
894
|
+
\`\`\`
|
|
895
|
+
|
|
896
|
+
Pour chaque fichier/module sans commentaire d'en-tête :
|
|
897
|
+
\`\`\`typescript
|
|
898
|
+
/**
|
|
899
|
+
* [Nom du Module] — [Responsabilité en 1 ligne]
|
|
900
|
+
*
|
|
901
|
+
* Ce module [fait X] et [ne fait PAS Y].
|
|
902
|
+
* Point d'entrée : [fonction principale]
|
|
903
|
+
* Dépendances clés : [autres modules dont il dépend + pourquoi]
|
|
904
|
+
*
|
|
905
|
+
* ⚠️ Points d'attention :
|
|
906
|
+
* - [Piège ou contrainte importante à connaître]
|
|
907
|
+
* - [Comportement non intuitif à documenter]
|
|
908
|
+
*
|
|
909
|
+
* @module [NomModule]
|
|
910
|
+
*/
|
|
911
|
+
\`\`\`
|
|
912
|
+
|
|
913
|
+
FORMAT : ✅ [fichier] — DOCUMENTÉ : [résumé]
|
|
914
|
+
🟡 [fichier] — DOCUMENTATION MANQUANTE : [liste des fonctions + documentation générée ci-dessous]
|
|
915
|
+
🔴 [fichier] — CRITIQUE NON DOCUMENTÉ : [logique complexe sans doc = bombe à retardement]`,
|
|
916
|
+
checks:["README : lancement en < 30min sans aide","ADR pour les choix techniques majeurs","Chaque fonction complexe a un JSDoc avec contexte métier","Chaque module a un commentaire d'en-tête avec responsabilité","Paramètres optionnels documentés avec valeur par défaut","Exemples concrets avec vraies valeurs métier","Points d'attention documentés (pièges, comportements non intuitifs)"]},
|
|
917
|
+
|
|
918
|
+
// ── RED TEAM ─────────────────────────────────────────────────
|
|
919
|
+
{id:"p9a",n:"13",icon:"👁",label:"Red Team — Reconnaissance",color:"#E5534B",tag:"RED·RECON",group:"redteam",
|
|
920
|
+
deps:["p1","p2","p_cfg"],
|
|
921
|
+
what:"Phase 1/3 du Red Team. Cartographie exhaustive de la surface d'attaque SANS exploitation. Le résultat alimente directement Phase 9b.",
|
|
922
|
+
how:"Copie le prompt → colle dans Antigravity avec maximum de contexte → récupère le plan d'attaque → commence p9b.",
|
|
923
|
+
prompt:`Tu changes de posture. Tu es un Hacker Éthique Senior (OSCP + Bug Bounty Top 5%). Phase RECONNAISSANCE.
|
|
924
|
+
|
|
925
|
+
CONTEXTE DISPONIBLE (issu des phases précédentes) :
|
|
926
|
+
- Findings sécurité (p1/p2/p_cfg) : [auto-injecté]
|
|
927
|
+
- Architecture (p5) : [auto-injecté]
|
|
928
|
+
- Données sensibles (p0) : [auto-injecté]
|
|
929
|
+
|
|
930
|
+
PHASE RECONNAISSANCE — CARTOGRAPHIE SANS EXPLOITATION :
|
|
931
|
+
|
|
932
|
+
1. SURFACE D'ATTAQUE EXTERNE (sans auth)
|
|
933
|
+
Quels endpoints répondent sans token ?
|
|
934
|
+
Les messages d'erreur révèlent-ils des versions, noms de technos, structure BDD ?
|
|
935
|
+
Les headers de réponse exposent-ils des infos (X-Powered-By, Server, X-Framework) ?
|
|
936
|
+
Les endpoints sont-ils enumérables ? (robots.txt, sitemap.xml, /.well-known/)
|
|
937
|
+
Les assets JS/CSS du bundle contiennent-ils des endpoints hardcodés ?
|
|
938
|
+
Les paramètres GET sont-ils dans les logs serveur (potentiel leak de tokens) ?
|
|
939
|
+
|
|
940
|
+
2. SURFACE D'ATTAQUE AUTHENTIFIÉE
|
|
941
|
+
Avec un compte user standard, quels endpoints admin répondent en 403 vs 404 ?
|
|
942
|
+
(La différence révèle l'existence d'endpoints admin)
|
|
943
|
+
Les IDs de ressources sont-ils séquentiels (prévisibles) ou UUIDs ?
|
|
944
|
+
Les paramètres de pagination (page=1&limit=100) ont-ils des limites ?
|
|
945
|
+
Les filtres de recherche permettent-ils un bruteforce des données ?
|
|
946
|
+
|
|
947
|
+
3. VECTEURS D'ATTAQUE IDENTIFIÉS (pas exploités, juste cartographiés)
|
|
948
|
+
Pour chaque vecteur, évalue : Exploitabilité × Impact × Probabilité de détection
|
|
949
|
+
🔴 HAUTE PROBABILITÉ (exploitable avec compétences basiques) :
|
|
950
|
+
🟡 PROBABILITÉ MODÉRÉE (nécessite des conditions spécifiques) :
|
|
951
|
+
⚪ FAIBLE PROBABILITÉ (très difficile ou impact limité) :
|
|
952
|
+
|
|
953
|
+
4. PLAN D'ATTAQUE POUR p9b (priorité décroissante)
|
|
954
|
+
Établis l'ordre des blocs à attaquer avec la justification :
|
|
955
|
+
| Priorité | Bloc | Vecteur principal | Raison |
|
|
956
|
+
|
|
957
|
+
FORMAT FINAL :
|
|
958
|
+
📊 SURFACE D'ATTAQUE
|
|
959
|
+
Endpoints publics : [N] | Paramètres prévisibles : [liste] | Infos exposées : [liste]
|
|
960
|
+
🎯 PLAN D'ATTAQUE p9b (ordre prioritaire) :
|
|
961
|
+
1. [bloc+vecteur le plus prometteur]
|
|
962
|
+
2. ...`,
|
|
963
|
+
checks:["Endpoints publics exhaustivement cartographiés","Headers de réponse révélateurs identifiés","Différence 403/404 sur endpoints admin notée","Prévisibilité des IDs analysée","Vecteurs listés par exploitabilité × impact","Plan d'attaque p9b établi avec priorités"]},
|
|
964
|
+
|
|
965
|
+
{id:"p9b",n:"14",icon:"⚔️",label:"Red Team — Attaque par Module",color:"#E5534B",tag:"RED·ATTACK",group:"redteam",
|
|
966
|
+
deps:["p9a"],
|
|
967
|
+
what:"Phase 2/3 du Red Team. Exploitation module par module avec le même système de blocs. Chaque tentative est documentée honnêtement (protégé ou exploitable).",
|
|
968
|
+
how:"Utilise le plan de p9a → Remplis Bloc + Fichiers → Copie → colle dans Antigravity. Répète pour chaque bloc identifié.",
|
|
969
|
+
prompt:`EXPLOITATION MODULE PAR MODULE — BLOC [N] (issu du plan p9a)
|
|
970
|
+
|
|
971
|
+
Tu es un Hacker Éthique Senior. Tu exploites le BLOC [N] identifié lors de la reconnaissance.
|
|
972
|
+
|
|
973
|
+
CONTEXTE D'ATTAQUE :
|
|
974
|
+
- Vecteurs identifiés en p9a pour ce bloc : [colle les vecteurs correspondants]
|
|
975
|
+
- Findings de sécurité (p1) pour ce bloc : [colle si disponibles]
|
|
976
|
+
PÉRIMÈTRE : [colle ici les 3-5 fichiers du bloc]
|
|
977
|
+
|
|
978
|
+
OBJECTIFS D'ATTAQUE (ordre de valeur décroissant) :
|
|
979
|
+
1. BOLA/IDOR : accéder aux données d'autres utilisateurs en changeant un ID
|
|
980
|
+
2. Privilege Escalation : user → admin → super-admin
|
|
981
|
+
3. CSRF / Session Fixation : agir en tant qu'un autre utilisateur
|
|
982
|
+
4. Exfiltration : récupérer des données en masse (BDD dump, fichiers sensibles)
|
|
983
|
+
5. Business Logic Bypass : contourner les règles métier (paiement 0€, quota illimité)
|
|
984
|
+
6. DoS ciblé : planter ce module spécifiquement
|
|
985
|
+
|
|
986
|
+
POUR CHAQUE TEST, DOCUMENTE HONNÊTEMENT :
|
|
987
|
+
|
|
988
|
+
🔴 TEST [N] — [Nom de l'attaque]
|
|
989
|
+
Fichier ciblé : [fichier:ligne ou endpoint]
|
|
990
|
+
Payload : [exactement ce que tu enverrais — curl, JSON body, modifié dans l'URL]
|
|
991
|
+
|
|
992
|
+
SI EXPLOITABLE :
|
|
993
|
+
→ Impact réel : [ce que l'attaquant obtient concrètement]
|
|
994
|
+
→ Preuve d'exploitation : [comment démontrer sans ambiguïté]
|
|
995
|
+
→ Criticité : CRITIQUE / HAUTE
|
|
996
|
+
|
|
997
|
+
SI PROTÉGÉ :
|
|
998
|
+
→ Défense en place : [ce qui bloque précisément]
|
|
999
|
+
→ Conclusion : PROTÉGÉ ✅
|
|
1000
|
+
|
|
1001
|
+
TESTS OBLIGATOIRES :
|
|
1002
|
+
□ IDOR : [GET/PUT/DELETE] /api/resource/{ID_AUTRE_USER} → données d'un autre ?
|
|
1003
|
+
□ Mass Assignment : { "role": "admin", "isAdmin": true } dans le body → accepté ?
|
|
1004
|
+
□ Paramètre pollution : dupliquer des paramètres GET (?user_id=1&user_id=2) → lequel gagne ?
|
|
1005
|
+
□ JWT : modifier le payload sans resigner → accepté ?
|
|
1006
|
+
□ Path traversal : ../../../etc/passwd dans un champ fichier → réponse ?
|
|
1007
|
+
□ Méthodes HTTP non autorisées : PUT/DELETE sur des endpoints GET-only → réponse ?
|
|
1008
|
+
□ Business logic : valeur négative, 0, très grande → comportement ?
|
|
1009
|
+
|
|
1010
|
+
RÈGLE D'OR : Honnêteté absolue. "Protégé" honnête > faux positif.`,
|
|
1011
|
+
checks:["IDOR testé sur toutes les ressources du bloc","Mass Assignment testé avec champs privilégiés","JWT manipulation tentée","Path traversal tenté","Méthodes HTTP inattendues testées","Business logic bypass tenté avec valeurs limites","Chaque tentative documentée avec payload concrète","'Protégé' justifié techniquement (pas juste 'semble OK')"]},
|
|
1012
|
+
|
|
1013
|
+
{id:"p9c",n:"15",icon:"💥",label:"Red Team — Attaques Chaînées & Verdict",color:"#E5534B",tag:"RED·CHAIN",group:"redteam",
|
|
1014
|
+
deps:["p9a","p9b"],
|
|
1015
|
+
what:"Phase 3/3 du Red Team. Combine les findings de tous les blocs pour des attaques multi-étapes, puis donne un verdict global honnête.",
|
|
1016
|
+
how:"Copie le prompt → colle dans Antigravity avec tous les findings p9a et p9b → récupère le verdict de posture sécurité.",
|
|
1017
|
+
prompt:`PHASE FINALE RED TEAM — ATTAQUES CHAÎNÉES & VERDICT POSTURE GLOBALE
|
|
1018
|
+
|
|
1019
|
+
Tu as terminé la reconnaissance (p9a) et l'exploitation par module (p9b).
|
|
1020
|
+
|
|
1021
|
+
DONNÉES DISPONIBLES :
|
|
1022
|
+
- Findings p9a : [colle ici]
|
|
1023
|
+
- Findings p9b (tous blocs) : [colle ici]
|
|
1024
|
+
|
|
1025
|
+
SECTION 1 — ATTAQUES CHAÎNÉES
|
|
1026
|
+
Combine les findings pour des attaques multi-étapes plus sophistiquées :
|
|
1027
|
+
|
|
1028
|
+
Pour chaque chaîne possible :
|
|
1029
|
+
🔗 CHAÎNE [N] : [Nom de l'attaque composée]
|
|
1030
|
+
Étape 1 : [Exploiter finding A → obtenir X]
|
|
1031
|
+
Étape 2 : [Utiliser X pour exploiter finding B → obtenir Y]
|
|
1032
|
+
Étape 3 : [Résultat final de la chaîne]
|
|
1033
|
+
Impact total : [Ce que l'attaquant détient au bout de la chaîne]
|
|
1034
|
+
Difficulté : BASIQUE / INTERMÉDIAIRE / AVANCÉ
|
|
1035
|
+
Criticité : CRITIQUE / HAUTE
|
|
1036
|
+
|
|
1037
|
+
Si aucune chaîne n'est possible : explique pourquoi (défense en profondeur réelle).
|
|
1038
|
+
|
|
1039
|
+
SECTION 2 — POST-EXPLOITATION (compte lambda)
|
|
1040
|
+
Avec le plus haut niveau d'accès obtenu :
|
|
1041
|
+
- Quel est le rayon de blast maximal ?
|
|
1042
|
+
- Y a-t-il des informations permettant un pivot (social engineering, credential stuffing) ?
|
|
1043
|
+
- Les données visibles permettent-elles d'attaquer d'autres utilisateurs ?
|
|
1044
|
+
|
|
1045
|
+
SECTION 3 — VERDICT POSTURE SÉCURITÉ GLOBALE
|
|
1046
|
+
Choisis exactement un des quatre niveaux :
|
|
1047
|
+
|
|
1048
|
+
🔴 NIVEAU CRITIQUE — NE PAS DÉPLOYER :
|
|
1049
|
+
[Findings exploitables + plan de remédiation prioritisé]
|
|
1050
|
+
|
|
1051
|
+
🟠 NIVEAU ÉLEVÉ — DÉPLOIEMENT RISQUÉ :
|
|
1052
|
+
[Findings à corriger avant toute mise en production]
|
|
1053
|
+
|
|
1054
|
+
🟡 NIVEAU MODÉRÉ — DÉPLOIEMENT AVEC SURVEILLANCE :
|
|
1055
|
+
[Findings à corriger dans les 30 jours + mesures compensatoires]
|
|
1056
|
+
|
|
1057
|
+
🟢 POSTURE SÉCURISÉE :
|
|
1058
|
+
[Justification technique que chaque vecteur principal a été testé et résisté]
|
|
1059
|
+
[Liste des protections qui ont fonctionné]
|
|
1060
|
+
|
|
1061
|
+
HONNÊTETÉ ABSOLUE : "Tout sécurisé" honnête + justifications = meilleur résultat.`,
|
|
1062
|
+
checks:["Toutes les combinaisons de findings analysées pour chaînes","Post-exploitation avec compte lambda évalué","Chaque vecteur p9a confirmé testé ou justifié non-applicable","Verdict global en 4 niveaux (pas de zone grise)","Plan de remédiation prioritisé si failles","Protections qui ont fonctionné documentées"]},
|
|
1063
|
+
// ── DAST & FUZZING ──────────────────────────────────────────
|
|
1064
|
+
{id:"p_dast_infra",n:"15.1",icon:"🌩",label:"DAST — Infra & Load Test",color:"#9333EA",tag:"DAST·INFRA",group:"dast",
|
|
1065
|
+
deps:["p_cfg","p8"],
|
|
1066
|
+
what:"Tests de pénétration dynamiques sur l'infrastructure : Rate Limiting réel, Slowloris, stress tests et scan de ports.",
|
|
1067
|
+
how:"Utilise le Fuzzer intégré ou un outil externe (Artillery/k6). Copie les résultats ici.",
|
|
1068
|
+
prompt:`Tu es un Ingénieur Sécurité DAST (Dynamic Application Security Testing). BLOC [N].
|
|
1069
|
+
|
|
1070
|
+
OBJECTIF : Analyser les résultats d'un test de charge / fuzzing infrastructure.
|
|
1071
|
+
|
|
1072
|
+
RÉSULTATS DE TEST À ANALYSER :
|
|
1073
|
+
[Colle ici les résultats de l'API /api/zentry/fuzz type rate_limit ou d'un outil comme k6/Artillery]
|
|
1074
|
+
|
|
1075
|
+
PROTOCOLE DAST INFRASTRUCTURE :
|
|
1076
|
+
|
|
1077
|
+
1. RATE LIMITING & THROTTLING
|
|
1078
|
+
Le Rate Limiter bloque-t-il vraiment au seuil défini ?
|
|
1079
|
+
Le code HTTP 429 est-il retourné correctement ?
|
|
1080
|
+
Les headers Retry-After sont-ils présents ?
|
|
1081
|
+
|
|
1082
|
+
2. STRESS TEST & RÉSILIENCE
|
|
1083
|
+
Comportement sous forte charge : l'application crash-t-elle ?
|
|
1084
|
+
La base de données gère-t-elle le pool de connexions (pas d'erreur "Too many connections") ?
|
|
1085
|
+
La latence p99 reste-t-elle acceptable ?
|
|
1086
|
+
|
|
1087
|
+
3. ATTAQUES VOLUMÉTRIQUES
|
|
1088
|
+
Résistance aux attaques Slowloris (timeout configuré sur le reverse proxy) ?
|
|
1089
|
+
Payload massif rejeté (Payload Too Large 413) ?
|
|
1090
|
+
|
|
1091
|
+
FORMAT FINAL :
|
|
1092
|
+
✅ RÉSILIENCE CONFIRMÉE : [Explications]
|
|
1093
|
+
🟡 VULNÉRABILITÉ INFRA [Critère] : [Détail et correctif - ex: Configurer un reverse proxy]
|
|
1094
|
+
🔴 CRASH DÉTECTÉ : [Action corrective urgente]`,
|
|
1095
|
+
checks:["Rate Limit bloque à 429","Payload massif bloqué à 413","Pas de crash serveur sous forte charge","Pas de crash BDD lié aux pools de connexion","Résistance confirmée aux requêtes lentes"]},
|
|
1096
|
+
|
|
1097
|
+
{id:"p_dast_api",n:"15.2",icon:"🕷",label:"DAST — Fuzzing API",color:"#9333EA",tag:"DAST·API",group:"dast",
|
|
1098
|
+
deps:["p2","p6"],
|
|
1099
|
+
what:"Fuzzing dynamique des endpoints API pour découvrir des failles imprévues, des crashs liés aux inputs inattendus, et vérifier le comportement d'erreur.",
|
|
1100
|
+
how:"Exécute le Fuzzer sur l'API cible. Copie les résultats ici.",
|
|
1101
|
+
prompt:`Tu es un Ingénieur Sécurité DAST (Dynamic Application Security Testing). BLOC [N].
|
|
1102
|
+
|
|
1103
|
+
OBJECTIF : Analyser les résultats du Fuzzing sur les endpoints API.
|
|
1104
|
+
|
|
1105
|
+
RÉSULTATS DU FUZZER À ANALYSER :
|
|
1106
|
+
[Colle ici les résultats de l'API /api/zentry/fuzz type fuzzing sur un endpoint spécifique]
|
|
1107
|
+
|
|
1108
|
+
PROTOCOLE DAST API :
|
|
1109
|
+
|
|
1110
|
+
1. GESTION DES INPUTS INATTENDUS (FUZZING)
|
|
1111
|
+
Des payloads SQLi/XSS basiques ont-ils causé une erreur 500 au lieu de 400 ?
|
|
1112
|
+
Des types de données erronés ont-ils planté le parseur (ex: array au lieu de string) ?
|
|
1113
|
+
Des payloads vides ont-ils été rejetés proprement ?
|
|
1114
|
+
|
|
1115
|
+
2. FUITE D'INFORMATIONS
|
|
1116
|
+
Les erreurs 500 renvoient-elles des stack traces (ex: lignes de code, requêtes SQL) ?
|
|
1117
|
+
Les erreurs de validation renvoient-elles trop d'informations sur la structure interne ?
|
|
1118
|
+
|
|
1119
|
+
3. ROBUSTESSE DES ENDPOINTS
|
|
1120
|
+
Y a-t-il eu un contournement inattendu d'authentification ?
|
|
1121
|
+
Un endpoint public a-t-il été découvert par bruteforce de paramètres ?
|
|
1122
|
+
|
|
1123
|
+
FORMAT FINAL :
|
|
1124
|
+
✅ API ROBUSTE : [Explications]
|
|
1125
|
+
🟡 COMPORTEMENT INATTENDU [Critère] : [Détail et correctif]
|
|
1126
|
+
🔴 VULNÉRABILITÉ DAST CONFIRMÉE : [Action corrective urgente, ex: Injection réussie ou Crash 500]`,
|
|
1127
|
+
checks:["Aucune erreur 500 sur inputs malformés (attendu 400)","Aucune stack trace leakée","Payloads injectés rejetés proprement","Validation stricte des types de données confirmée"]},
|
|
1128
|
+
|
|
1129
|
+
// ── CLOSURE ─────────────────────────────────────────────────
|
|
1130
|
+
{id:"p10",n:"16",icon:"✅",label:"Validation Finale",color:"#1A7F4B",tag:"FINAL",group:"closure",
|
|
1131
|
+
deps:["p9c","p_tests"],
|
|
1132
|
+
what:"L'Auditeur Principal certifie que tout est correct et corrigé. Verdict impitoyablement honnête en 3 niveaux.",
|
|
1133
|
+
how:"Copie le prompt → colle dans Antigravity avec les rapports de toutes les phases → récupère le verdict final.",
|
|
1134
|
+
prompt:`Tu es l'Auditeur Principal chargé de la VALIDATION FINALE avant déploiement en production.
|
|
1135
|
+
|
|
1136
|
+
MISSION : Certifier que le travail est complet, honnête et que TOUTES les corrections ont été appliquées.
|
|
1137
|
+
|
|
1138
|
+
COLLE ICI les résultats des phases précédentes pour l'analyse :
|
|
1139
|
+
|
|
1140
|
+
CHECKLIST DE COMPLÉTUDE (répondre : VÉRIFIÉ / NON APPLICABLE [raison] / MANQUANT) :
|
|
1141
|
+
□ Secrets : aucune clé en clair dans le code ou l'historique Git
|
|
1142
|
+
□ IDOR : impossible d'accéder aux données d'un autre utilisateur
|
|
1143
|
+
□ Auth : session vérifiée EN PREMIER dans CHAQUE handler serveur
|
|
1144
|
+
□ Inputs : TOUS les inputs validés par schéma
|
|
1145
|
+
□ Config : headers HTTP durcis (CSP, HSTS, SameSite)
|
|
1146
|
+
□ Edge cases : null/undefined gérés sur les champs critiques
|
|
1147
|
+
□ Tests : logique métier critique testée unitairement
|
|
1148
|
+
□ Red Team : verdict p9c = MODÉRÉ ou SÉCURISÉ (pas CRITIQUE/ÉLEVÉ)
|
|
1149
|
+
□ Dépendances : pas de CVE critique non résolu
|
|
1150
|
+
□ Bundle : pas de dépendance inutile > 100kb
|
|
1151
|
+
□ TypeScript : tsc --noEmit sans erreur
|
|
1152
|
+
□ Env : toutes variables dans .env.example avec description
|
|
1153
|
+
□ Docs : fonctions complexes documentées avec contexte métier
|
|
1154
|
+
□ Migrations : toutes réversibles + types corrects (DECIMAL, TIMESTAMPTZ)
|
|
1155
|
+
□ Monitoring : erreurs trackées avec contexte, alertes configurées
|
|
1156
|
+
|
|
1157
|
+
VÉRIFICATION DES CORRECTIONS
|
|
1158
|
+
Pour chaque finding CRITIQUE et HAUTE signalé toutes phases confondues :
|
|
1159
|
+
- Correction appliquée ? [VÉRIFIÉ / NON CORRIGÉ]
|
|
1160
|
+
- Correction sans nouveau problème introduit ? [OUI / NON]
|
|
1161
|
+
|
|
1162
|
+
VERDICT FINAL — IMPITOYABLEMENT HONNÊTE — exactement l'un des trois :
|
|
1163
|
+
|
|
1164
|
+
🟢 PRÊT POUR LA PRODUCTION
|
|
1165
|
+
[Checklist complète → tous VÉRIFIÉ ou N/A justifié]
|
|
1166
|
+
[Red Team = SÉCURISÉ]
|
|
1167
|
+
[Points forts à conserver]
|
|
1168
|
+
|
|
1169
|
+
🟡 PRÊT AVEC RÉSERVES — ACTIONS DANS LES 7 JOURS
|
|
1170
|
+
[Liste précise de ce qui manque + responsable + date limite]
|
|
1171
|
+
[Mesures compensatoires pendant la période de correction]
|
|
1172
|
+
|
|
1173
|
+
🔴 NON PRÊT — BLOQUANT
|
|
1174
|
+
[Liste des correctifs obligatoires avec ordre de priorité]
|
|
1175
|
+
[Estimation du temps de correction]
|
|
1176
|
+
[Prochaine revue prévue]
|
|
1177
|
+
|
|
1178
|
+
INTERDIT ABSOLU : "Il serait judicieux de surveiller" si le code est correct.
|
|
1179
|
+
INTERDIT ABSOLU : Verdict vert si un item est "MANQUANT" ou "NON CORRIGÉ".`,
|
|
1180
|
+
checks:["Checklist complète remplie (VÉRIFIÉ ou N/A justifié)","Aucun finding CRITIQUE ou HAUTE non corrigé","Red Team : verdict MODÉRÉ ou SÉCURISÉ","TypeScript : tsc --noEmit sans erreur","Monitoring : alertes configurées et testées","Verdict final tranché (3 niveaux, pas de zone grise)","Plan de remédiation si réserves"]},
|
|
1181
|
+
|
|
1182
|
+
{id:"p11",n:"17",icon:"🤖",label:"Automatisation & Pérennité",color:"#1A7F4B",tag:"AUTOMATION",group:"closure",
|
|
1183
|
+
deps:["p10"],
|
|
1184
|
+
what:"Met en place les gardes permanents : hooks Git, règles IA, pipeline CI/CD complet et watch mode adaptatif. Ce que tu fais ici protège tous tes futurs commits.",
|
|
1185
|
+
how:"Copie le prompt → colle dans Antigravity → l'IA crée tous les fichiers de config → vérifie et commite → cocher.",
|
|
1186
|
+
prompt:`Tu es un Expert DevSecOps & Developer Experience. Automatise la sécurité pour les futures modifications.
|
|
1187
|
+
|
|
1188
|
+
CONTEXTE : Stack ${"{sp.label}"}, ${"{project.name}"}, IDE : ${"{project.ide}"}
|
|
1189
|
+
|
|
1190
|
+
LIVRAISONS ATTENDUES (crée ces fichiers) :
|
|
1191
|
+
|
|
1192
|
+
1. FICHIER DE RÈGLES IA PERMANENTES (${"{ideFilename}"}) :
|
|
1193
|
+
Inclure obligatoirement :
|
|
1194
|
+
- Auth vérifiée EN PREMIER dans chaque handler serveur
|
|
1195
|
+
- Edge cases vérifiés (null, vide, valeur limite) sur toute nouvelle fonction
|
|
1196
|
+
- Schéma de validation sur chaque input externe
|
|
1197
|
+
- Clés API jamais hardcodées, jamais dans les logs
|
|
1198
|
+
- "AUDIT BLOC XX" → lire audit-sessions/bloc-XX.md et exécuter
|
|
1199
|
+
- "INCREMENTAL AUDIT" → git diff --name-only main..HEAD puis auditer
|
|
1200
|
+
- "RED TEAM BLOC XX" → exécuter le prompt p9b sur ce bloc
|
|
1201
|
+
- "EDGE CASES [fonction]" → générer les tests edge cases pour cette fonction
|
|
1202
|
+
- Alerter si une feature viole une règle métier invariante
|
|
1203
|
+
- JSDoc généré automatiquement si fonction > 10 lignes sans documentation
|
|
1204
|
+
|
|
1205
|
+
2. .githooks/pre-commit :
|
|
1206
|
+
#!/bin/sh
|
|
1207
|
+
gitleaks protect --staged && npx tsc --noEmit --silent
|
|
1208
|
+
|
|
1209
|
+
3. .githooks/pre-push :
|
|
1210
|
+
#!/bin/sh
|
|
1211
|
+
npm test -- --passWithNoTests && npm run lint
|
|
1212
|
+
|
|
1213
|
+
4. COMMANDE D'INSTALLATION DES HOOKS :
|
|
1214
|
+
git config core.hooksPath .githooks
|
|
1215
|
+
|
|
1216
|
+
5. .github/workflows/zentry.yml :
|
|
1217
|
+
- Triggers : PR vers main/master/production
|
|
1218
|
+
- Jobs : lint → typecheck → test → snyk → semgrep → gitleaks → zentry-gate → deploy
|
|
1219
|
+
- zentry-gate : node -e "const r=require('./audit.json');if(r.cicdStatus==='FAIL')process.exit(1)"
|
|
1220
|
+
- PR comment automatique avec le score et les findings
|
|
1221
|
+
|
|
1222
|
+
6. PROCÉDURE D'AUDIT INCRÉMENTAL (INCREMENTAL_AUDIT.md) :
|
|
1223
|
+
Avant chaque PR :
|
|
1224
|
+
a. git diff --name-only main..HEAD > changed_files.txt
|
|
1225
|
+
b. Pour chaque fichier → "AUDIT BLOC XX" dans l'IDE
|
|
1226
|
+
c. Si nouveau fichier → créer bloc-XX.md dans audit-sessions/
|
|
1227
|
+
d. Mettre à jour AUDIT_MASTER_TRACKER.md
|
|
1228
|
+
e. Exporter audit.json et commiter avant de merger
|
|
1229
|
+
|
|
1230
|
+
Génère tous ces fichiers avec le contenu complet.`,
|
|
1231
|
+
checks:["Fichier de règles IA créé avec tous les protocoles","Hooks pre-commit (gitleaks + tsc) installés","Hooks pre-push (test + lint) installés","GitHub Action complète (lint→typecheck→test→security→gate→deploy)","Gate CI/CD bloquant si cicdStatus=FAIL","PR comment automatique configuré","INCREMENTAL_AUDIT.md créé et validé"]},
|
|
1232
|
+
];
|