# HOOKS-README Contient tous les détails, scripts et instructions pour les hooks Codex CLI. ## Vue d'ensemble des événements hook Codex CLI fournit **8 hooks** via `hooks.json` : | # | Hook | Type d'événement | Fichier de config | Description | |:-:|------|------------------|-------------------|-------------| | 1 | `SessionStart` | `SessionStart` | `hooks.json` | S'exécute une fois au démarrage de session — injecte du contexte + joue un son | | 2 | `PreToolUse` | `PreToolUse` | `hooks.json` | S'exécute avant l'exécution d'un outil — joue un son | | 3 | `PermissionRequest` | `PermissionRequest` | `hooks.json` | S'exécute quand Codex demande une approbation pour une opération sensible — joue un son | | 4 | `PostToolUse` | `PostToolUse` | `hooks.json` | S'exécute après la fin d'un outil — joue un son | | 5 | `Stop` | `stop` | `hooks.json` | S'exécute quand la session se termine — joue un son | | 6 | `UserPromptSubmit` | `UserPromptSubmit` | `hooks.json` | S'exécute quand l'utilisateur soumet un prompt — joue un son | | 7 | `PreCompact` | `PreCompact` | `hooks.json` | S'exécute avant la compaction du contexte — joue un son | | 8 | `PostCompact` | `PostCompact` | `hooks.json` | S'exécute après la compaction du contexte — joue un son | ### Comment les hooks sont appelés Tous les hooks (`hooks.json`) sont appelés avec le flag `--hook` : ``` python3 .codex/hooks/scripts/hooks.py --hook SessionStart python3 .codex/hooks/scripts/hooks.py --hook PreToolUse python3 .codex/hooks/scripts/hooks.py --hook PermissionRequest python3 .codex/hooks/scripts/hooks.py --hook PostToolUse python3 .codex/hooks/scripts/hooks.py --hook Stop python3 .codex/hooks/scripts/hooks.py --hook UserPromptSubmit python3 .codex/hooks/scripts/hooks.py --hook PreCompact python3 .codex/hooks/scripts/hooks.py --hook PostCompact ``` ### Injection de contexte SessionStart Le hook SessionStart écrit du contexte sur **stdout**, qui alimente directement la fenêtre de contexte du modèle. Cela inclut : - Date/heure courante - Nom de branche Git - Statut du working tree (propre ou changements non commités) - Chemin du répertoire de travail ## Prérequis Avant d'utiliser les hooks, assure-toi d'avoir **Python 3** installé sur ton système. ### Logiciels requis #### Toutes plateformes (Windows, macOS, Linux) - **Python 3** : requis pour lancer le script hook - Vérifier l'installation : `python3 --version` **Instructions d'installation :** - **Windows** : télécharger depuis [python.org](https://www.python.org/downloads/) ou installer via `winget install Python.Python.3` - **macOS** : installer via `brew install python3` (requiert [Homebrew](https://brew.sh/)) - **Linux** : installer via `sudo apt install python3` (Ubuntu/Debian) ou `sudo yum install python3` (RHEL/CentOS) ### Lecteurs audio (détectés automatiquement) Le script hook détecte et utilise automatiquement le lecteur audio approprié pour ta plateforme : - **macOS** : utilise `afplay` (intégré, aucune installation nécessaire) - **Linux** : utilise `paplay` depuis `pulseaudio-utils` — installer via `sudo apt install pulseaudio-utils` - **Windows** : utilise le module intégré `winsound` (inclus avec Python) ### Fichiers de configuration Il y a **deux** fichiers de configuration : 1. **`.codex/hooks.json`** — enregistre les hooks `SessionStart`, `PreToolUse`, `PermissionRequest`, `PostToolUse`, `Stop`, `UserPromptSubmit`, `PreCompact` et `PostCompact` 2. **`.codex/hooks/config/hooks-config.json`** — active/désactive les hooks individuels et le logging #### hooks.json ```json { "hooks": { "SessionStart": [ { "type": "shell", "command": "python3 .codex/hooks/scripts/hooks.py --hook SessionStart", "statusMessage": "Initializing session hooks...", "timeout": 10 } ], "PreToolUse": [ { "type": "shell", "command": "python3 .codex/hooks/scripts/hooks.py --hook PreToolUse", "statusMessage": "Running pre-tool-use hook...", "timeout": 10 } ], "PermissionRequest": [ { "type": "shell", "command": "python3 .codex/hooks/scripts/hooks.py --hook PermissionRequest", "statusMessage": "Running permission request hook...", "timeout": 10 } ], "PostToolUse": [ { "type": "shell", "command": "python3 .codex/hooks/scripts/hooks.py --hook PostToolUse", "statusMessage": "Running post-tool-use hook...", "timeout": 10 } ], "Stop": [ { "type": "shell", "command": "python3 .codex/hooks/scripts/hooks.py --hook Stop", "statusMessage": "Running session stop hook...", "timeout": 10 } ], "UserPromptSubmit": [ { "type": "shell", "command": "python3 .codex/hooks/scripts/hooks.py --hook UserPromptSubmit", "statusMessage": "Running user prompt submit hook...", "timeout": 10 } ], "PreCompact": [ { "type": "shell", "command": "python3 .codex/hooks/scripts/hooks.py --hook PreCompact", "statusMessage": "Running pre-compact hook...", "timeout": 10 } ], "PostCompact": [ { "type": "shell", "command": "python3 .codex/hooks/scripts/hooks.py --hook PostCompact", "statusMessage": "Running post-compact hook...", "timeout": 10 } ] } } ``` ## Configurer les hooks (activer/désactiver) ### Désactiver des hooks individuels Édite `.codex/hooks/config/hooks-config.json` : ```json { "disableSessionStartHook": false, "disablePreToolUseHook": false, "disablePermissionRequestHook": false, "disablePostToolUseHook": false, "disableStopHook": false, "disableUserPromptSubmitHook": false, "disablePreCompactHook": false, "disablePostCompactHook": false, "disableLogging": true } ``` **Options de configuration :** - `disableSessionStartHook` : mettre `true` pour désactiver l'injection de contexte et le son au démarrage de session - `disablePreToolUseHook` : mettre `true` pour désactiver le son pre-tool-use - `disablePermissionRequestHook` : mettre `true` pour désactiver le son de demande de permission - `disablePostToolUseHook` : mettre `true` pour désactiver le son post-tool-use - `disableStopHook` : mettre `true` pour désactiver le son d'arrêt de session - `disableUserPromptSubmitHook` : mettre `true` pour désactiver le son de soumission de prompt utilisateur - `disablePreCompactHook` : mettre `true` pour désactiver le son pre-compact - `disablePostCompactHook` : mettre `true` pour désactiver le son post-compact - `disableLogging` : mettre `true` pour désactiver le logging des événements hook vers `.codex/hooks/logs/hooks-log.jsonl` ### Fallback de configuration Il y a deux fichiers de configuration : 1. **`.codex/hooks/config/hooks-config.json`** - configuration partagée/par défaut commitée dans git 2. **`.codex/hooks/config/hooks-config.local.json`** - tes overrides personnels (ignorés par git) Le fichier de config local (`.local.json`) prend le dessus sur la config partagée, ce qui permet à chaque développeur de personnaliser le comportement des hooks sans affecter l'équipe. #### Configuration locale (overrides personnels) Crée ou édite `.codex/hooks/config/hooks-config.local.json` pour tes préférences personnelles : ```json { "disableSessionStartHook": false, "disablePreToolUseHook": false, "disablePermissionRequestHook": false, "disablePostToolUseHook": false, "disableStopHook": true, "disableUserPromptSubmitHook": false, "disablePreCompactHook": false, "disablePostCompactHook": false, "disableLogging": true } ``` ### Logging Quand le logging est activé (`"disableLogging": false`), les événements hook sont écrits dans `.codex/hooks/logs/hooks-log.jsonl` au format JSON Lines. Chaque entrée contient le payload JSON complet reçu depuis Codex CLI. ## Tests Lancer la suite de tests : ```bash python3 -m unittest tests.test_hooks -v ``` ## Voix site utilisé pour générer les sons : https://elevenlabs.io/ voix utilisée : Adam - American, Dark and Tough ## Extensibilité future Ce projet peut être étendu en : 1. Ajoutant de nouvelles entrées à `HOOK_SOUND_MAP` dans `hooks.py` 2. Ajoutant les fichiers son correspondants dans `.codex/hooks/sounds/` 3. Ajoutant des clés de toggle dans `hooks-config.json` 4. Ajoutant de nouvelles entrées hook dans `hooks.json`