veza/veza-desktop/AUDIT_REPORT.md

946 lines
28 KiB
Markdown
Raw Normal View History

2025-12-13 02:34:34 +00:00
# 🔍 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**