# Guide technique approfondi — Mode Expert

Document pour utilisateurs avancés, techniciens et intégrateurs.

> Index documentation : [README.md](README.md) · Aide utilisateur : [AIDE_EXPERT.md](AIDE_EXPERT.md)

---

## Architecture application

```
PMOptimizerProV1a.py
  └── pmoptimizer.app.bootstrap.main()
        ├── CLI (--schedule-run, --schedule-revert, tâche Windows…)
        └── pmoptimizer.ui.app_launcher.run_gui()
              ├── Fenêtre 1 : choix Débutant / Expert
              ├── Fenêtre 2 : OptimizerApp(experience_mode=beginner)
              └── Fenêtre 3 : OptimizerApp(experience_mode=expert)
```

- **UI** : Tkinter + ttk, thèmes sombre/clair persistés (`ui.theme` dans l’état).
- **Actions** : ~106 entrées `Tweak` (registre, service, tâche, alimentation, Appx, callbacks PowerShell).
- **Couche OS** : `pmoptimizer.windows.ops.WindowsOps` (PowerShell, reg, schtasks, powercfg, Appx).
- **Build** : Nuitka ONEDIR ; ressources via `resource_path()`.

---

## Modèle Tweak

Chaque tweak possède typiquement :

| Champ | Rôle |
|-------|------|
| `id` | Identifiant stable (logs, état `applied`) |
| `category` | Onglet UI |
| `tags` | Profils (STD, GLARY, GAMING_LITE, TECHNICIAN…) |
| `reversible` | Si restauration possible |
| `apply_func` / `revert_func` | Callbacks `(app, tweak) -> (ok, msg)` |
| `os_min` / `os_max` | Compatibilité Win10/11 |

`execute_apply` / `execute_revert` (`core/dry_run.py`) court-circuitent en dry-run sans appeler les callbacks réels.

---

## Baselines et restauration

Avant modification, l’app enregistre dans `uwopt_state.json` :

- **registry** : clé `path|name` → valeur ou absence
- **services** : nom → mode démarrage + état
- **tasks** : chemin+nom → activée ou non
- **power** : schéma alimentation actif
- **appx** : présence pattern package

Restauration partagée GUI/CLI : `pmoptimizer.core.restore_ops`.

**Limites CLI planifié** : `--schedule-revert` ne restaure que les tweaks avec `revert_func` et baselines existantes ; Appx supprimés, nettoyages fichiers et DISM ne sont pas annulés par revert.

---

## Profils (`core/profiles.py`)

Matching par tags sur chaque tweak. Le profil **TECHNICIAN** exclut les actions catégorie Glary de type `action::glary_*` pour un lot « poste propre » orienté SAV.

---

## État détecté (`core/tweak_state.py`)

Détection « déjà appliqué » via registre / service / tâche / scripts de détection custom — évite les réapplications inutiles. Cache session dans l’UI.

---

## Rapports et documents HTML

| Module | Rôle |
|--------|------|
| `core/html_document.py` | Gabarit CSS type Word, conversion Markdown → HTML |
| `core/report_export.py` | Lots : TXT + HTML + PDF optionnel (`fpdf2`) |
| `core/diagnostic_capture.py` | Snapshots avant/après actions (labels `avant_lot`, `avant_carte`, etc.) |
| `core/diagnostic_report.py` | Export HTML historique diagnostic |
| `core/system_scan_report.py` | Export HTML analyse système |
| `ui/help_content.py` | Guides `docs/*.md` → `reports/guides_html/*.html` |

Métadonnées client : `ui.report_client`, `ui.report_machine_note` dans le JSON d’état.

Diagnostic : `StateStore.append_diagnostic_snapshot()` + score via `diagnostic_history.compute_health_score`.

---

## E-mail planifié (`core/report_email.py`)

SMTP stdlib ; mot de passe JSON ou `PMOPT_SMTP_PASSWORD`. Ignoré en dry-run si `only_on_live: true`.

---

## Sécurité et compte

- **Administrateur** : requis au lancement (UAC) pour HKLM, services, tâches système.
- Tâche planifiée Windows : compte utilisateur courant + `/RL HIGHEST` (scripts `task_installer.py`).
- Ne pas partager `uwopt_state.json` sur partage non sécurisé (baselines + SMTP).

---

## PowerShell

Quasi toutes les opérations sensibles passent par `run_powershell` / `run_cmd`. Absence de PowerShell → blocage au démarrage.

---

## Actions irréversibles (liste non exhaustive)

- `Remove-AppxPackage` / patterns Appx
- Nettoyage temporaires, cleanmgr, DISM component cleanup
- Winget upgrade / uninstall selon cartes
- Tweaks registre sans revert_func explicite

**Recommandation** : onglet dédié + dry-run + point de restauration + export JSON avant lot FULL.

---

## CLI référence rapide

| Commande | Effet |
|----------|--------|
| `--schedule-run [--force] [--live\|--dry-run] [--no-email]` | Applique profil planifié |
| `--schedule-revert [--profile CODE] [--live]` | Restaure réversibles du profil |
| `--install-scheduled-task` | Crée tâche schtasks |
| `--uninstall-scheduled-task` | Supprime la tâche |

Profil et intervalle lus depuis `scheduler` dans `uwopt_state.json`.

---

## Modules nettoyage (sécurisés)

| Module | Rôle | Doc utilisateur |
|--------|------|-----------------|
| `windows/safe_temp_cleanup.py` | Temp Windows + Temp logiciels, listes noires | [NETTOYAGE_TEMP_SECURISE.md](NETTOYAGE_TEMP_SECURISE.md) |
| `windows/browser_cache.py` | Caches navigateurs, fichiers protégés (Login Data…) | [NETTOYAGE_NAVIGATEURS.md](NETTOYAGE_NAVIGATEURS.md) |
| `windows/duplicate_finder.py` | Doublons légers dossiers utilisateur | [DOUBLONS_FICHIERS.md](DOUBLONS_FICHIERS.md) |
| `core/restore_ops.py` | Restauration GUI + CLI planifiée | [PLANIFICATEUR_WINDOWS.md](PLANIFICATEUR_WINDOWS.md) |
| `core/report_email.py` | Rapport SMTP après `--schedule-run` | [PLANIFICATEUR_WINDOWS.md](PLANIFICATEUR_WINDOWS.md) |

---

## Extension du catalogue

Fichiers : `pmoptimizer/tweaks/catalog.py`, `catalog_v3.py`, `catalog_glary_p3.py`, builders dans `builders.py`.

Ajouter un tweak = définir apply/revert/detect + tags + catégorie ; rebuild Nuitka pour distribution exe.

---

## Limites produit (rappel)

- Pas GPO / Active Directory, pas RMM centralisé.
- Pas analyse malware, pas pilotes GPU, pas booster FPS.
- Pas duplicate finder professionnel (outil léger + Stockage Windows seulement).
- UI Tk : pas de service background hors tâche Windows planifiée.

---

## Dépannage technique

| Log / symptôme | Cause probable |
|----------------|----------------|
| `State load failed` | JSON corrompu — repli auto sur `uwopt_state.json.bak` (copie avant chaque save) |
| Restauration registre KO | Baseline absente ou clé déplacée par Windows Update |
| Scheduled « pas encore dû » | Normal sans `--force` |
| Thread Tk après destroy | Ne pas fermer l’app pendant un lot (busy guard) |

Journal : `uwopt_log.txt` à côté de l’exécutable. Plantage : `crash_diagnostics/crash_diag_LAST.txt` → **pascal.mouneyrat@gmail.com** ([RESPONSABILITE_ET_SUPPORT.md](RESPONSABILITE_ET_SUPPORT.md)).

---

*Logiciel gratuit, responsabilité auteur/utilisateur : [RESPONSABILITE_ET_SUPPORT.md](RESPONSABILITE_ET_SUPPORT.md)*
