Détection Contextuelle
Comment le hook post-commit de lore décide quoi faire avec chaque commit.
Vue d'ensemble
Quand le hook se déclenche après un commit, lore évalue une chaîne de règles avant de poser des questions. La première règle qui correspond l'emporte.
Chaîne de Détection
flowchart TD
A["Hook post-commit"] --> A1["Reconnecter stdin (< /dev/tty)"]
A1 --> B{"doc-skip dans le message ?"}
B -->|Oui| C["Ignorer silencieusement"]
B -->|Non| D{"/dev/tty disponible ?<br/>TERM != dumb ?"}
D -->|"Non (CI, pipe, terminal muet)"| E["Différer vers pending"]
D -->|Oui| F{"Rebase en cours ?"}
F -->|Oui| E
F -->|Non| G{"Commit de merge ?"}
G -->|Oui| H["Ignorer — message 1 ligne"]
G -->|Non| I1{"Cherry-pick ?"}
I1 -->|Oui| I2{"Doc existe pour<br/>le commit source ?"}
I2 -->|Oui| C
I2 -->|Non| J1{"Amend ?"}
I1 -->|Non| J1
J1 -->|Oui| J2{"Doc existe pour<br/>le commit pré-amend ?"}
J2 -->|Non| R["Continuer — créer un nouveau doc"]
J2 -->|Oui| K0{"Question 0 :<br/>Documenter ? O/n"}
K0 -->|Non| C
K0 -->|Oui| K["Mettre à jour / Créer / Ignorer"]
J1 -->|Non| L["Scoring Decision Engine"]
L --> M{"Score ?"}
M -->|">=60"| N["Questions complètes"]
M -->|"35-59"| O["Questions réduites"]
M -->|"15-34"| P["Suggérer d'ignorer — confirmer"]
M -->|"<15"| Q["Auto-ignorer silencieusement"]
E --> E2["VS Code IPC<br/>(si GIT_ASKPASS)"]
E2 -.->|fallback| E3["Dialog OS<br/>(osascript / zenity / PowerShell)"]
E3 -.->|fallback| E4["Fichier verrou<br/>(~/.lore/notify.lock)"]
Règles de Détection (Ordre de Priorité)
| # | Règle | Action | Raison |
|---|---|---|---|
| 1 | [doc-skip] dans le message |
Ignorer (silencieux) | Intention explicite du développeur |
| 2 | Non-TTY ou TERM=dumb |
Différer vers pending | CI/pipes ne doivent jamais bloquer |
| 3 | Rebase en cours | Différer vers pending | Éviter les prompts pendant le replay |
| 4 | Commit de merge (2+ parents) | Ignorer (1 ligne msg) | Commits d'infrastructure |
| 5a | Cherry-pick + doc source existe | Ignorer silencieusement | Déjà documenté |
| 5b | Cherry-pick + pas de doc source | Continuer l'évaluation | Source pas dans le corpus — laisser la règle suivante décider |
| 6a | Amend + doc existant | Question 0 → [M]ettre à jour / [C]réer / [I]gnorer |
L'utilisateur édite du travail précédent (configurable : hooks.amend_prompt) |
| 6b | Amend + pas de doc existant | Continuer — créer un nouveau doc | Première documentation d'un commit amendé |
| 7 | Score Decision Engine | Action basée sur le score (complète / réduite / suggérer ignorer / auto-ignorer) | Analyse multi-signaux sur tous les autres commits |
Workflow Amend
Quand git commit --amend est détecté et qu'un document existe pour le commit pré-amend :
- Question 0 : "Amend détecté. Documenter ce changement ? [O/n]" — ignorer pour les corrections de typo
- Choix : "[M]ettre à jour / [C]réer nouveau / [I]gnorer ?"
- Mettre à jour : Pré-remplit Type, What et Why depuis le document existant, puis l'écrase
- Créer : Crée un nouveau document (l'original reste)
- Ignorer : Ne rien faire
Configurer via .lorerc :
hooks:
amend_prompt: true # Mettre à false pour ignorer la Question 0
Comment stdin fonctionne dans les hooks Git
Git redirige stdin vers /dev/null pour les hooks — même quand on commit depuis un terminal interactif. Cela signifie que isatty(stdin) retourne toujours false à l'intérieur d'un hook.
Le hook de lore résout cela en reconnectant stdin depuis le terminal :
exec lore _hook-post-commit < /dev/tty
C'est pourquoi les questions interactives fonctionnent dans les terminaux (iTerm, Terminal.app, terminal intégré VS Code) mais pas dans les environnements où /dev/tty n'est pas disponible (CI, Docker, pipes).
Windows : Git utilise Git Bash (MSYS2) pour les hooks, qui fournit
/dev/tty. Les questions interactives fonctionnent dans Git Bash, Windows Terminal et le terminal intégré VS Code. PowerShell et CMD sans Git Bash différent vers pending.
Détection Non-TTY
Après reconnexion de stdin via /dev/tty, lore vérifie si stdin est un vrai TTY :
| Environnement | /dev/tty |
isatty(stdin) |
Comportement |
|---|---|---|---|
| Terminal (iTerm, Terminal.app) | Disponible | true |
Questions interactives |
| Terminal intégré VS Code | Disponible | true |
Questions interactives |
| CI/CD (GitHub Actions, Docker) | Indisponible | false |
Différé silencieusement |
Pipe (git commit \| ...) |
Indisponible | false |
Différé silencieusement |
| Cron/scripts | Indisponible | false |
Différé silencieusement |
Quand stdin n'est pas un TTY, le commit est différé vers pending. Si un IDE est détecté (via GIT_ASKPASS), lore envoie aussi une notification.
Détection IDE pour les notifications
Après le report, lore détecte l'environnement IDE pour envoyer une notification. VS Code et ses forks sont identifiés via la variable GIT_ASKPASS (contenant "code", "cursor", "windsurf" ou "codium" dans le chemin). Un signal secondaire est VSCODE_GIT_ASKPASS_NODE.
Notifications IDE
Quand un commit est différé et qu'un IDE est détecté, lore envoie une notification :
- VS Code IPC — Notification native de l'extension (multi-instance)
- Dialog OS —
osascript(macOS),zenity/kdialog(Linux), PowerShell (Windows) - Fallback — Notification par fichier lock (
~/.lore/notify.lock)
Patterns de Skip
Skip explicite
Ajoutez [doc-skip] n'importe où dans votre message de commit :
git commit -m "chore: update deps [doc-skip]"
# → lore ignore silencieusement, compte comme "couvert" dans les métriques
Auto-skip du Decision Engine
Certains types de commits sont auto-ignorés par défaut :
# .lorerc
decision:
always_skip: [docs, style, ci, build]
Les commits avec ces types conventionnels sont scorés à 0 et ignorés silencieusement.
Dépannage
"lore affiche un dialog au lieu des questions interactives"
Votre hook est probablement ancien — il manque la redirection < /dev/tty qui reconnecte stdin depuis le terminal. Réinstallez :
lore hook uninstall
lore hook install
Vérifiez :
grep "dev/tty" .git/hooks/post-commit
# Devrait afficher : exec lore _hook-post-commit < /dev/tty
"lore ne se déclenche pas après mon commit"
Vérifiez dans cet ordre :
- Hook installé ?
grep "LORE" .git/hooks/post-commit - Hook exécutable ?
ls -la .git/hooks/post-commit(devrait montrer-rwx) loredans le PATH ?which lore- Score trop bas ?
lore decision --explain HEAD— peut-être auto-skip - Non-TTY ? Vérifiez
lore pending— le commit a peut-être été différé
"lore pose trop de questions pour des commits triviaux"
Ajoutez des overrides dans .lorerc :
decision:
always_skip: [docs, style, ci, build, chore]
threshold_full: 70 # Défaut : 60. Augmenter pour réduire les questions complètes.
Ou utilisez [doc-skip] dans vos messages de commit pour des cas ponctuels.
Tips & Tricks
[doc-skip]pour les commits triviaux — typos, config CI, bump de deps.- Vérifiez le scoring :
lore decision --explain HEADmontre le détail complet. - Personnalisez :
always_asketalways_skipdans.lorercsont vos contrôles les plus puissants. - Après un rebase : Vérifiez
lore pending— les commits rebasés ont été différés. - Ctrl+C est sûr : Les réponses partielles sont sauvées immédiatement dans
.lore/pending/à n'importe quel niveau (sélecteur de type, What, Why, prompts amend).lore pending resolvereprend.
Voir aussi
- lore decision — Inspecter le scoring pour n'importe quel commit
- lore pending — Gérer les commits différés
- Configuration — Ajuster les seuils et overrides