# 🔍 Audit Technique Exhaustif — Module Veza Desktop **Date**: 2024-12-19 **Module**: `veza-desktop` **Type**: Electron Wrapper Application **Auditeur**: Technical Audit System --- ## 📋 Table des matières 1. [Module Overview](#module-overview) 2. [Runbook Minimal](#runbook-minimal) 3. [Health/Build/Test Status](#healthbuildtest-status) 4. [Security Findings](#security-findings) 5. [Observability & Production Readiness](#observability--production-readiness) 6. [Performance Notes](#performance-notes) 7. [Issue List Priorisée (P0→P3)](#issue-list-priorisée-p0p3) 8. [Execution Plan](#execution-plan) --- ## Module Overview ### But du module **Veza Desktop** est un **wrapper Electron** léger qui charge l'application web Veza (`apps/web`) dans une fenêtre native. Il ne contient **aucune logique UI unique** — c'est un shell natif minimaliste. **Rôle exact** : - Wrapper Electron pour l'app web Veza - Gestion du cycle de vie de l'application (fenêtre, shortcuts, auto-update) - Bridge entre le processus principal et le renderer (via preload) - Distribution multi-plateforme (Windows, macOS, Linux) ### Entrées / Sorties **APIs exposées** : - **Aucune API HTTP/WS/gRPC** (wrapper uniquement) - **IPC Electron** : communication main ↔ renderer via preload (actuellement vide) **Formats** : - Charge l'app web via `loadURL()` (dev) ou `loadFile()` (prod) - Dev : `http://localhost:5173` (configurable via `VITE_DEV_SERVER_URL`) - Prod : `../renderer/index.html` (chemin relatif) ### Dépendances internes - **Aucune dépendance interne** (module isolé) - Attend que `apps/web` soit buildé et accessible ### Dépendances externes - **Electron** `^25.0.0` (vulnérable, voir P0) - **electron-updater** `^6.0.0` (auto-update) - **electron-builder** `^24.0.0` (packaging) - **TypeScript** `^4.9.0` (compilation) - **Node.js** (runtime Electron) ### Exécution **Commandes** : ```bash # Dev npm run dev:main # Compile TS + lance Electron npm run dev # Dev complet (nécessite apps/web en parallèle) # Build npm run build # Compile TypeScript uniquement npm run build:main # Alias de build npm run dist # Package avec electron-builder npm run dist:win|mac|linux # Package spécifique # Production npm start # Lance Electron (après build) ``` **Configuration** : - **Env vars** : `VITE_DEV_SERVER_URL` (optionnel, défaut: `http://localhost:5173`) - **Config build** : `package.json` → `build` (electron-builder) - **TypeScript** : `tsconfig.main.json` - **Icons** : `assets/icon.{ico,icns,png}` (non vérifiés) ### Points d'intégration **Avec `apps/web`** : - **Dev** : Charge `http://localhost:5173` (doit être running) - **Prod** : Charge `../renderer/index.html` (doit être copié dans `dist/renderer/`) - **Contrat** : Aucun contrat explicite — dépendance implicite fragile **Auth** : - Aucune gestion d'auth dans le wrapper - L'app web gère l'auth (JWT probablement) **CORS/CSP** : - Aucune configuration CSP dans Electron - `webSecurity: true` par défaut (OK) - `contextIsolation: true` (OK) - `nodeIntegration: false` (OK) --- ## Runbook Minimal ### Développement ```bash # Terminal 1: Lancer l'app web cd ../apps/web npm run dev # Doit être sur port 5173 # Terminal 2: Lancer le wrapper cd veza-desktop npm install npm run dev:main ``` ### Build Production ```bash # 1. Build l'app web cd ../apps/web npm run build # Vérifier que dist/ existe # 2. Copier dist/ vers veza-desktop/dist/renderer/ (MANUEL actuellement) # OU configurer electron-builder pour le faire automatiquement # 3. Build le wrapper cd veza-desktop npm run build npm run dist ``` ### Troubleshooting - **Erreur "Failed to load local dev server"** : Vérifier que `apps/web` tourne sur port 5173 - **Erreur "Cannot find module"** : `npm install` manquant - **Build échoue** : Vérifier `tsconfig.main.json` (rootDir incorrect) --- ## Health/Build/Test Status ### ❌ Build Status: **BROKEN** **Problèmes critiques** : 1. **TypeScript non installé globalement** : `tsc: command not found` - **Fichier** : `package.json` ligne 11 - **Cause** : TypeScript est en `devDependencies` mais pas accessible dans PATH - **Impact** : Build impossible sans `npm install` préalable 2. **tsconfig.main.json incohérent** : - **Fichier** : `tsconfig.main.json` ligne 9 - **Problème** : `rootDir: "./src"` mais fichiers dans `./electron/` - **Impact** : Compilation peut échouer ou générer mauvais output ### ⚠️ Test Status: **PARTIEL** **Tests E2E présents** : - `tests/e2e/library-enhanced.spec.ts` (9 tests) - `tests/e2e/playlists.spec.ts` (7 tests) - `tests/e2e/settings.spec.ts` (9 tests) - `tests/e2e/transcoding.spec.ts` (8 tests) **Problèmes** : 1. **Aucun script de test dans package.json** - Tests Playwright non exécutables via npm - Pas de `test:e2e`, `test:unit`, `test:ci` 2. **Tests dépendent de l'app web** : - Pointent vers `http://localhost:5173` - Nécessitent l'app web running + auth fonctionnelle - Pas de mocks/stubs 3. **Scripts de test référencés mais inexistants** : - `scripts/production-tests.js` appelle `npm run test:unit`, `test:e2e`, `lighthouse:ci`, `test:perf`, `test:a11y` - **Aucun de ces scripts n'existe dans package.json** 4. **Pas de tests unitaires** : - Aucun test pour `electron/main.ts` - Aucun test pour `electron/preload.ts` - Pas de validation IPC, gestion d'erreurs, etc. ### ⚠️ Linter Status: **NON CONFIGURÉ** - **Aucun linter configuré** (ESLint, TSLint) - **Aucun formatter** (Prettier) - **Aucun pre-commit hook** ### ⚠️ Type Safety: **PARTIEL** - TypeScript configuré avec `strict: true` (OK) - Mais `rootDir` incorrect peut causer des problèmes - Pas de vérification de types dans CI --- ## Security Findings ### 🔴 P0 — Vulnérabilités Critiques #### 1. Electron Version Vulnérable (CVE) **ID**: `MOD-P0-001` **Fichier**: `package.json` ligne 31 **Version actuelle**: `electron@^25.0.0` **Vulnérabilités** : - **GHSA-6r2x-8pq8-9489** : Heap Buffer Overflow in NativeImage (moderate) - **GHSA-vmqv-hx8q-j7mg** : ASAR Integrity Bypass via resource modification (moderate) **Impact** : - RCE potentiel via images malveillantes - Bypass de l'intégrité ASAR (modification de fichiers packagés) **Fix minimal** : ```json "electron": "^28.0.0" // ou dernière LTS ``` **Plan de validation** : ```bash npm audit npm run build npm run dist # Tester sur Windows/macOS/Linux ``` **Effort**: S (1-2h) **Risque régression**: Moyen (changements Electron majeurs possibles) #### 2. glob Package Vulnérable (Command Injection) **ID**: `MOD-P0-002` **Fichier**: `package-lock.json` (dépendance transitive) **Version**: `glob@10.2.0 - 10.4.5` **Vulnérabilité**: **GHSA-5j98-mcp5-4vw2** — Command injection via `-c/--cmd` (high) **Impact** : - RCE si glob est utilisé avec input utilisateur **Fix minimal** : ```bash npm audit fix ``` **Plan de validation** : ```bash npm audit npm run build ``` **Effort**: S (< 1h) **Risque régression**: Faible ### 🟡 P1 — Sécurité Electron #### 3. DevTools Ouvert en Production (Risque) **ID**: `MOD-P1-001` **Fichier**: `electron/main.ts` ligne 41 **Code** : ```typescript if (isDev) { mainWindow.webContents.openDevTools(); } ``` **Impact** : - Si `isDev` est mal détecté, DevTools ouverts en prod - Accès console, injection de code, debug **Fix minimal** : ```typescript if (isDev && process.env.ENABLE_DEVTOOLS === 'true') { mainWindow.webContents.openDevTools(); } ``` **Plan de validation** : - Build prod et vérifier que DevTools ne s'ouvrent pas - Test avec `app.isPackaged === true` **Effort**: S (< 30min) **Risque régression**: Faible #### 4. Pas de Validation d'URL avant loadURL **ID**: `MOD-P1-002` **Fichier**: `electron/main.ts` ligne 35-40 **Code** : ```typescript const WEB_URL = process.env.VITE_DEV_SERVER_URL || 'http://localhost:5173'; mainWindow.loadURL(WEB_URL).catch(e => { console.error('Failed to load local dev server. Is apps/web running?'); console.error(e); }); ``` **Impact** : - Si `VITE_DEV_SERVER_URL` est modifié malicieusement, chargement d'URL arbitraire - SSRF potentiel (moins critique en desktop, mais mauvais pattern) **Fix minimal** : ```typescript const WEB_URL = process.env.VITE_DEV_SERVER_URL || 'http://localhost:5173'; const ALLOWED_ORIGINS = ['http://localhost:5173', 'http://127.0.0.1:5173']; if (!ALLOWED_ORIGINS.some(origin => WEB_URL.startsWith(origin))) { throw new Error(`Invalid dev server URL: ${WEB_URL}`); } mainWindow.loadURL(WEB_URL).catch(e => { // ... }); ``` **Plan de validation** : - Test avec `VITE_DEV_SERVER_URL=http://evil.com` - Vérifier que l'app refuse **Effort**: S (< 1h) **Risque régression**: Faible #### 5. Pas de CSP (Content Security Policy) **ID**: `MOD-P1-003` **Fichier**: `electron/main.ts` **Problème**: Aucune CSP configurée dans `session.defaultSession.webRequest.onHeadersReceived` **Impact** : - Injection de scripts possible depuis l'app web si compromise - XSS non mitigé au niveau Electron **Fix minimal** : ```typescript import { session } from 'electron'; app.on('ready', () => { session.defaultSession.webRequest.onHeadersReceived((details, callback) => { callback({ responseHeaders: { ...details.responseHeaders, 'Content-Security-Policy': [ "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';" ] } }); }); createWindow(); }); ``` **Plan de validation** : - Test avec injection de script dans l'app web - Vérifier que CSP bloque **Effort**: M (2-3h) **Risque régression**: Moyen (peut casser certaines fonctionnalités web) #### 6. Preload Vide (Pas d'API Exposée) **ID**: `MOD-P1-004` **Fichier**: `electron/preload.ts` **Code** : Vide (juste un commentaire) **Impact** : - Pas de bridge sécurisé main ↔ renderer - Si besoin futur, risque d'utiliser `nodeIntegration: true` (dangereux) **Fix minimal** : ```typescript import { contextBridge, ipcRenderer } from 'electron'; contextBridge.exposeInMainWorld('electronAPI', { platform: process.platform, versions: process.versions, // Exposer uniquement les APIs nécessaires }); ``` **Plan de validation** : - Test que `window.electronAPI` est disponible dans renderer - Vérifier que `nodeIntegration: false` est toujours respecté **Effort**: S (< 1h) **Risque régression**: Faible ### 🟢 P2 — Bonnes Pratiques #### 7. Pas de Gestion d'Erreurs Globale **ID**: `MOD-P2-001` **Fichier**: `electron/main.ts` **Problème**: Pas de `process.on('uncaughtException')` ni `process.on('unhandledRejection')` **Impact** : - Crashes silencieux - Pas de logging d'erreurs critiques **Fix minimal** : ```typescript process.on('uncaughtException', (error) => { console.error('Uncaught Exception:', error); // Envoyer à Sentry si configuré }); process.on('unhandledRejection', (reason, promise) => { console.error('Unhandled Rejection:', reason); }); ``` **Effort**: S (< 30min) **Risque régression**: Faible #### 8. Pas de Validation de Fichier en Production **ID**: `MOD-P2-002` **Fichier**: `electron/main.ts` ligne 58 **Code** : ```typescript mainWindow.loadFile(path.join(__dirname, '../renderer/index.html')); ``` **Impact** : - Si fichier manquant, crash silencieux - Pas de fallback **Fix minimal** : ```typescript import fs from 'fs'; const indexPath = path.join(__dirname, '../renderer/index.html'); if (!fs.existsSync(indexPath)) { dialog.showErrorBox( 'Missing Files', 'The application files are missing. Please reinstall the application.' ); app.quit(); return; } mainWindow.loadFile(indexPath); ``` **Effort**: S (< 1h) **Risque régression**: Faible --- ## Observability & Production Readiness ### ❌ Logs: **NON STRUCTURÉS** **Problèmes** : - `console.log`/`console.error` uniquement - Pas de corrélation (request_id, trace_id) - Pas de niveaux log (info/warn/error) - Pas de rotation de logs - Pas d'intégration Sentry/LogRocket **Recommandation** : - Utiliser `electron-log` ou `winston` - Structurer les logs (JSON) - Ajouter context (user_id, session_id) ### ❌ Metrics: **AUCUNE** **Manquant** : - Pas de healthcheck endpoint (normal pour desktop, mais utile pour auto-update) - Pas de métriques de performance (FPS, memory, CPU) - Pas de crash reporting (Sentry) **Recommandation** : - Intégrer Sentry pour crash reporting - Exposer métriques via IPC pour debug ### ⚠️ Healthchecks: **PARTIEL** **Présent** : - Aucun healthcheck explicite **Manquant** : - Vérification que l'app web répond avant de charger - Vérification de connectivité réseau (pour auto-update) ### ⚠️ Auto-Update: **CONFIGURÉ MAIS NON TESTÉ** **Présent** : - `electron-updater` installé - Config GitHub dans `package.json` (ligne 95-98) **Manquant** : - Pas de code d'auto-update dans `main.ts` - Pas de tests d'auto-update - Pas de rollback strategy **Recommandation** : ```typescript import { autoUpdater } from 'electron-updater'; autoUpdater.checkForUpdatesAndNotify(); autoUpdater.on('update-available', () => { // Notifier l'utilisateur }); ``` ### ❌ Error Handling: **FAIBLE** **Problèmes** : - Pas de retry logic - Pas de circuit breaker - Pas de timeout sur loadURL - Erreurs silencieuses (catch sans action) **Exemple** : ```typescript mainWindow.loadURL(WEB_URL).catch(e => { console.error('Failed to load local dev server. Is apps/web running?'); console.error(e); // ❌ Pas de dialog utilisateur, pas de retry }); ``` --- ## Performance Notes ### ⚠️ Bundle Size: **NON OPTIMISÉ** **Problèmes** : - Scripts d'optimisation présents (`scripts/optimize-bundle.js`) mais non utilisés - Pas de code splitting pour Electron (normal, mais à noter) - Pas d'analyse de bundle size **Recommandation** : - Utiliser `webpack-bundle-analyzer` ou équivalent - Vérifier taille du bundle final ### ⚠️ Build Time: **NON MESURÉ** - Pas de métriques de build time - Pas d'optimisation de build (cache, parallélisation) ### ✅ Memory: **OK (Wrapper Léger)** - Wrapper minimal, pas de fuites évidentes - Mais pas de monitoring ### ⚠️ Startup Time: **NON MESURÉ** - Pas de métriques de temps de démarrage - Pas d'optimisation (lazy loading, etc.) --- ## Issue List Priorisée (P0→P3) ### 🔴 P0 — Critiques (Do Immediately) #### MOD-P0-001: Electron Version Vulnérable - **Titre**: Mettre à jour Electron vers version sécurisée - **Impact**: RCE potentiel, bypass ASAR - **Preuve**: `package.json:31`, `npm audit` - **Cause**: Version obsolète - **Fix**: `npm install electron@^28.0.0` - **Validation**: `npm audit`, build, tests E2E - **Effet de bord**: Possible breaking changes Electron - **Effort**: S (1-2h) #### MOD-P0-002: glob Package Vulnérable - **Titre**: Mettre à jour glob (command injection) - **Impact**: RCE si utilisé avec input utilisateur - **Preuve**: `npm audit` (high severity) - **Cause**: Dépendance transitive vulnérable - **Fix**: `npm audit fix` - **Validation**: `npm audit`, build - **Effet de bord**: Faible - **Effort**: S (< 1h) #### MOD-P0-003: Build Cassé (TypeScript) - **Titre**: Build échoue car tsc non trouvé - **Impact**: Impossible de build en production - **Preuve**: `npm run build` → `tsc: command not found` - **Cause**: TypeScript en devDependencies mais pas dans PATH - **Fix**: S'assurer que `npm install` est exécuté, ou utiliser `npx tsc` - **Validation**: `npm run build` doit réussir - **Effet de bord**: Aucun - **Effort**: S (< 30min) #### MOD-P0-004: tsconfig.main.json rootDir Incorrect - **Titre**: rootDir pointe vers `./src` mais fichiers dans `./electron/` - **Impact**: Compilation incorrecte, fichiers non trouvés - **Preuve**: `tsconfig.main.json:9` vs structure réelle - **Cause**: Incohérence de configuration - **Fix**: Changer `rootDir: "./electron"` ou `"./"` - **Validation**: `npm run build`, vérifier output - **Effet de bord**: Possible changement de structure dist/ - **Effort**: S (< 30min) ### 🟡 P1 — Importants (Do This Sprint) #### MOD-P1-001: DevTools Ouvert en Production - **Titre**: Risque d'ouverture DevTools en prod si isDev mal détecté - **Impact**: Debug console accessible, injection de code - **Preuve**: `electron/main.ts:41` - **Cause**: Détection isDev fragile - **Fix**: Ajouter flag explicite `ENABLE_DEVTOOLS` - **Validation**: Build prod, vérifier DevTools fermés - **Effet de bord**: Faible - **Effort**: S (< 30min) #### MOD-P1-002: Pas de Validation d'URL - **Titre**: loadURL accepte n'importe quelle URL depuis env var - **Impact**: SSRF potentiel, chargement d'URL malveillante - **Preuve**: `electron/main.ts:35-40` - **Cause**: Pas de whitelist d'URLs - **Fix**: Whitelist `localhost:5173` uniquement - **Validation**: Test avec URL malveillante - **Effet de bord**: Faible - **Effort**: S (< 1h) #### MOD-P1-003: Pas de CSP - **Titre**: Content Security Policy manquante - **Impact**: XSS non mitigé au niveau Electron - **Preuve**: Aucune CSP dans `main.ts` - **Cause**: Non configuré - **Fix**: Ajouter CSP via `session.webRequest` - **Validation**: Test injection de script - **Effet de bord**: Peut casser certaines fonctionnalités web - **Effort**: M (2-3h) #### MOD-P1-004: Preload Vide - **Titre**: Preload script vide, pas de bridge sécurisé - **Impact**: Risque futur d'utiliser nodeIntegration: true - **Preuve**: `electron/preload.ts` (vide) - **Cause**: Non implémenté - **Fix**: Exposer APIs via contextBridge - **Validation**: Test que window.electronAPI fonctionne - **Effet de bord**: Faible - **Effort**: S (< 1h) #### MOD-P1-005: Scripts de Test Inexistants - **Titre**: Scripts référencés dans `production-tests.js` n'existent pas - **Impact**: Tests de production non exécutables - **Preuve**: `scripts/production-tests.js:18-37` vs `package.json` - **Cause**: Scripts non ajoutés au package.json - **Fix**: Ajouter scripts manquants ou supprimer références - **Validation**: `npm run prod:test` doit fonctionner - **Effet de bord**: Aucun - **Effort**: S (< 1h) #### MOD-P1-006: Pas de Tests Unitaires - **Titre**: Aucun test pour main.ts et preload.ts - **Impact**: Bugs non détectés, régressions possibles - **Preuve**: Aucun fichier de test dans `tests/unit/` - **Cause**: Tests non écrits - **Fix**: Ajouter tests unitaires (Jest/Vitest) - **Validation**: `npm run test:unit` doit passer - **Effet de bord**: Aucun - **Effort**: M (4-6h) #### MOD-P1-007: Auto-Update Non Implémenté - **Titre**: electron-updater installé mais non utilisé - **Impact**: Pas de mise à jour automatique - **Preuve**: `package.json:36` vs `main.ts` (aucun import) - **Cause**: Non implémenté - **Fix**: Implémenter auto-update avec notifications - **Validation**: Test avec serveur de mise à jour - **Effet de bord**: Moyen (nécessite serveur GitHub/autre) - **Effort**: M (4-6h) ### 🟢 P2 — Qualité (Do Next Sprint) #### MOD-P2-001: Pas de Gestion d'Erreurs Globale - **Titre**: Pas de handlers pour uncaughtException/unhandledRejection - **Impact**: Crashes silencieux, pas de logging - **Preuve**: `electron/main.ts` (aucun handler) - **Cause**: Non implémenté - **Fix**: Ajouter handlers + Sentry - **Effort**: S (< 30min) #### MOD-P2-002: Pas de Validation de Fichier en Production - **Titre**: loadFile ne vérifie pas l'existence du fichier - **Impact**: Crash si fichier manquant - **Preuve**: `electron/main.ts:58` - **Cause**: Pas de vérification - **Fix**: Vérifier existence + dialog erreur - **Effort**: S (< 1h) #### MOD-P2-003: Pas de Linter/Formatter - **Titre**: Aucun ESLint/Prettier configuré - **Impact**: Code incohérent, bugs potentiels - **Preuve**: Aucun fichier de config - **Cause**: Non configuré - **Fix**: Ajouter ESLint + Prettier + pre-commit - **Effort**: M (2-3h) #### MOD-P2-004: Logs Non Structurés - **Titre**: console.log uniquement, pas de logs structurés - **Impact**: Debug difficile, pas d'observabilité - **Preuve**: `electron/main.ts` (console.log partout) - **Cause**: Pas de logger configuré - **Fix**: Intégrer electron-log ou winston - **Effort**: M (2-3h) #### MOD-P2-005: Pas de Healthcheck pour App Web - **Titre**: Charge l'app web sans vérifier qu'elle répond - **Impact**: Erreur silencieuse si app web down - **Preuve**: `electron/main.ts:37` (catch sans action) - **Cause**: Pas de vérification - **Fix**: Healthcheck avant loadURL + retry - **Effort**: M (2-3h) #### MOD-P2-006: Scripts de Déploiement Incomplets - **Titre**: `deploy-production.js` référence des commandes inexistantes - **Impact**: Déploiement impossible - **Preuve**: `scripts/deploy-production.js:151,189` (build:optimized, deploy:staging, etc.) - **Cause**: Scripts non ajoutés au package.json - **Fix**: Ajouter scripts ou adapter deploy script - **Effort**: M (2-3h) #### MOD-P2-007: Pas de Documentation de Build - **Titre**: README ne documente pas le processus de build complet - **Impact**: Développeurs perdus, build manuel - **Preuve**: `README.md` (section build incomplète) - **Cause**: Documentation incomplète - **Fix**: Documenter build + copie de fichiers - **Effort**: S (< 1h) #### MOD-P2-008: Pas de CI/CD Config - **Titre**: Aucun fichier GitHub Actions / GitLab CI - **Impact**: Pas de build/test automatique - **Preuve**: Aucun fichier `.github/workflows/` ou `.gitlab-ci.yml` - **Cause**: Non configuré - **Fix**: Ajouter CI/CD (build, test, audit) - **Effort**: M (3-4h) ### 🔵 P3 — Cosmétique (Nice to Have) #### MOD-P3-001: Icons Non Vérifiés - **Titre**: Assets d'icons référencés mais non vérifiés - **Impact**: Build peut échouer si icons manquants - **Preuve**: `package.json:51,63,74` (assets/icon.*) - **Cause**: Non vérifié - **Fix**: Vérifier existence ou générer icons - **Effort**: S (< 1h) #### MOD-P3-002: Pas de Source Maps en Production - **Titre**: Source maps générées mais peut-être non utilisées - **Impact**: Debug production difficile - **Preuve**: `tsconfig.main.json:17` (sourceMap: true) - **Cause**: Non vérifié - **Fix**: Vérifier utilisation ou désactiver - **Effort**: S (< 30min) #### MOD-P3-003: Pas de Métriques de Performance - **Titre**: Pas de monitoring de performance (FPS, memory, CPU) - **Impact**: Pas d'optimisation basée sur données - **Preuve**: Aucun code de monitoring - **Cause**: Non implémenté - **Fix**: Ajouter monitoring (optionnel) - **Effort**: M (4-6h) #### MOD-P3-004: Scripts d'Optimisation Non Utilisés - **Titre**: `optimize-bundle.js` existe mais non intégré - **Impact**: Bundle non optimisé - **Preuve**: `scripts/optimize-bundle.js` (non appelé) - **Cause**: Script standalone - **Fix**: Intégrer dans build ou supprimer - **Effort**: S (< 1h) #### MOD-P3-005: validate-frontend-complete.sh Obsolète - **Titre**: Script référence des fichiers qui n'existent pas dans ce module - **Impact**: Confusion, script inutile - **Preuve**: `validate-frontend-complete.sh` (vérifie src/features/*) - **Cause**: Script copié depuis autre module - **Fix**: Adapter ou supprimer - **Effort**: S (< 30min) --- ## Execution Plan ### Checklist P0 (Ordre Strict) 1. ✅ **MOD-P0-002**: `npm audit fix` (glob) 2. ✅ **MOD-P0-001**: `npm install electron@^28.0.0` + tests 3. ✅ **MOD-P0-004**: Corriger `tsconfig.main.json` rootDir 4. ✅ **MOD-P0-003**: Vérifier build fonctionne (`npm install` + `npm run build`) 5. ✅ **Validation**: `npm audit`, `npm run build`, `npm run dist` (test packaging) **Temps estimé**: 2-3h ### Checklist P1 (Par Lots Cohérents) #### Lot 1: Sécurité Electron (2-3h) 1. **MOD-P1-001**: DevTools conditionnel 2. **MOD-P1-002**: Validation URL 3. **MOD-P1-003**: CSP (optionnel, peut être P2) #### Lot 2: Tests & Qualité (6-8h) 1. **MOD-P1-005**: Ajouter scripts de test manquants 2. **MOD-P1-006**: Tests unitaires (main.ts, preload.ts) 3. **MOD-P2-003**: Linter/Formatter #### Lot 3: Auto-Update & Observabilité (6-8h) 1. **MOD-P1-007**: Implémenter auto-update 2. **MOD-P2-001**: Gestion d'erreurs globale 3. **MOD-P2-004**: Logs structurés #### Lot 4: Robustesse (4-6h) 1. **MOD-P1-004**: Preload avec contextBridge 2. **MOD-P2-002**: Validation fichier production 3. **MOD-P2-005**: Healthcheck app web **Temps estimé total P1**: 18-25h ### Quick Wins (≤ 1h chacun) 1. **MOD-P2-007**: Documenter build process (30min) 2. **MOD-P3-001**: Vérifier icons (30min) 3. **MOD-P3-004**: Intégrer ou supprimer optimize-bundle.js (1h) 4. **MOD-P3-005**: Adapter/supprimer validate-frontend-complete.sh (30min) 5. **MOD-P2-006**: Corriger scripts de déploiement (1h) ### Tests à Ajouter en Priorité 1. **Tests unitaires** (P1): - `electron/main.ts`: createWindow, gestion erreurs - `electron/preload.ts`: contextBridge APIs - Mock Electron APIs (sinon) 2. **Tests E2E** (déjà présents mais à améliorer): - Tester build production - Tester auto-update (mock) - Tester gestion d'erreurs 3. **Tests d'intégration**: - Build + package (Windows/macOS/Linux) - Vérifier que l'app web se charge correctement ### PR Plan #### PR 1: Fix P0 (Sécurité & Build) **Titre**: `fix: Update Electron, fix build, add security validations` **Fichiers**: - `package.json` (Electron update) - `tsconfig.main.json` (rootDir fix) - `electron/main.ts` (URL validation, DevTools fix) - `package-lock.json` (audit fix) **Tests**: Build, audit, dist #### PR 2: Tests & Qualité **Titre**: `feat: Add unit tests, linter, and test scripts` **Fichiers**: - `package.json` (scripts de test) - `tests/unit/main.test.ts` (nouveau) - `tests/unit/preload.test.ts` (nouveau) - `.eslintrc.js` (nouveau) - `.prettierrc` (nouveau) **Tests**: `npm run test:unit`, `npm run lint` #### PR 3: Preload & CSP **Titre**: `feat: Implement preload bridge and CSP` **Fichiers**: - `electron/preload.ts` (contextBridge) - `electron/main.ts` (CSP) **Tests**: E2E, vérifier window.electronAPI #### PR 4: Auto-Update **Titre**: `feat: Implement auto-update with electron-updater` **Fichiers**: - `electron/main.ts` (auto-update logic) - `electron/updater.ts` (nouveau, optionnel) **Tests**: Mock serveur de mise à jour #### PR 5: Observabilité **Titre**: `feat: Add structured logging and error handling` **Fichiers**: - `electron/main.ts` (error handlers) - `electron/logger.ts` (nouveau) - `package.json` (electron-log) **Tests**: Vérifier logs structurés #### PR 6: Robustesse **Titre**: `feat: Add file validation and healthcheck` **Fichiers**: - `electron/main.ts` (file validation, healthcheck) **Tests**: Test avec fichier manquant #### PR 7: CI/CD **Titre**: `ci: Add GitHub Actions workflow` **Fichiers**: - `.github/workflows/ci.yml` (nouveau) **Tests**: Vérifier que CI passe #### PR 8: Documentation & Cleanup **Titre**: `docs: Update README and cleanup scripts` **Fichiers**: - `README.md` (build process) - `scripts/` (cleanup ou intégration) --- ## Résumé Exécutif ### Statut Global: ⚠️ **NON PRODUCTION READY** **Problèmes critiques** : - 🔴 4 P0 (sécurité, build cassé) - 🟡 7 P1 (sécurité Electron, tests, auto-update) - 🟢 8 P2 (qualité, observabilité) - 🔵 5 P3 (cosmétique) ### Actions Immédiates 1. **Mettre à jour Electron** (P0-001) 2. **Fixer le build** (P0-003, P0-004) 3. **Ajouter validation URL** (P1-002) 4. **Ajouter tests unitaires** (P1-006) ### Estimation Totale - **P0**: 2-3h - **P1**: 18-25h - **P2**: 12-18h - **P3**: 4-6h **Total**: ~36-52h de travail ### Risques Majeurs 1. **Sécurité**: Electron vulnérable, pas de CSP, validation URL manquante 2. **Build**: Build cassé, configuration incohérente 3. **Tests**: Pas de tests unitaires, scripts manquants 4. **Production**: Pas d'auto-update, pas d'observabilité, gestion d'erreurs faible --- **Fin du rapport d'audit**