diff --git a/CHANGELOG.md b/CHANGELOG.md index 5241f0f..18f4656 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,50 @@ # Changelog +## 0.4.0 — 2026-10-11 + +« Palier 2 » : temps réel et visible dans Gitea — plus une refonte +complète de l'interface. + +### Ajouts +- **Webhooks Gitea + rafraîchissement en direct** : `POST /webhooks/gitea` + (signature HMAC-SHA256 vérifiée quand `KANBANTE_WEBHOOK_SECRET` est + défini) invalide le cache de lecture, applique les fermetures / + réouvertures faites dans Gitea (idempotent : l'écho de nos propres + appels ne double jamais le journal) et pousse un événement SSE sur + `GET /api/stream`. Le navigateur se recharge en douceur quand c'est + sûr (onglet visible, pas de panneau ouvert, pas de saisie en cours, + pas de drag) ; sinon une pastille « Nouvelle activité » propose + l'actualisation. +- **Synchro par étiquettes** : les colonnes intermédiaires sont + reflétées dans Gitea par des étiquettes `kanban:todo`, + `kanban:in_progress`, `kanban:review` (créées au besoin, ajout / + retrait granulaires — les étiquettes de l'utilisateur ne sont jamais + touchées ; backlog et done = aucune étiquette). Désactivable : + `KANBANTE_SYNC_LABELS=0`. +- **Boards par milestone** : `GET /board/{owner}/{repo}?milestone=` + filtre le board, avec bandeau d'échéance et progression + (issues fermées du milestone / total). Sélecteur de milestones + au-dessus du board. + +### Interface (refonte complète) +- Nouveau design system : en-tête vitré sticky avec navigation en + pastilles (état actif), halos d'ambiance, cartes projets qui se + soulèvent au survol, barres de progression, coins plus doux, + anneau de focus visible partout, `prefers-reduced-motion` respecté. +- Dashboard : hero avec tuiles de synthèse (projets actifs, issues + fermées et déplacements sur 30 jours, temps de cycle moyen — depuis + le journal), états vides guidés pour chaque onglet, raccourci `/` + pour la recherche (aussi sur le filtre du board). +- Board : pastille « live » en cas d'activité externe, colonnes à + défilement indépendant, placeholders de colonnes vides, panneau de + notes explicité, drawer animé. +- Cohérence : même navigation sur les 5 pages, responsive retravaillé. + +### Tests +- 13 tests ajoutés (65 au total) : hub SSE et générateur de flux, + webhooks (transition, idempotence, signature, JSON invalide), + synchro d'étiquettes, boards par milestone, marqueurs de la refonte. + ## 0.3.0 — 2026-10-11 « Palier 1 » : voir ce qui se passe sur les boards. diff --git a/README.md b/README.md index 90b124b..82ed4ba 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,8 @@ - 🎯 **Drag & Drop** — glisse les issues entre colonnes ; en cas d'échec, la carte est replacée - 🔗 **Gitea Sync bidirectionnelle** — « Terminé » ferme l'issue dans Gitea, la ressortir la rouvre ; l'état local est réconcilié à chaque chargement - ➕ **Création d'issues** depuis le board, filtres texte + étiquettes, cartes liées à Gitea +- ⚡ **Temps réel** — un webhook Gitea invalide le cache et pousse un événement SSE : le board ouvert se met à jour tout seul (en douceur, sans interrompre une saisie ni un drag) +- 🏷️ **Visible dans Gitea** — les colonnes intermédiaires sont reflétées par des étiquettes `kanban:*` sur les issues, et un board peut se filtrer **par milestone** (échéance + progression façon sprint) - 🗂️ **Panneau détail** — clic sur une carte : corps markdown, commentaires, et réponse postée dans Gitea sans quitter le board - 📰 **Journal d'événements** — chaque mouvement est horodaté : fil d'activité (`/activity`), métriques de débit et de temps de cycle (`/api/metrics`) - ⏳ **Vieillissement + limites WIP** — badge d'ancienneté par colonne et limites souples configurables @@ -97,6 +99,8 @@ sudo systemctl enable --now docker | `KANBANTE_SYNC_GITEA` | `1` | `0` = les déplacements ne ferment/rouvrent plus les issues Gitea | | `KANBANTE_WIP_LIMITS` | *(vide)* | Limites souples par colonne, ex. `in_progress:5,review:3` (affichage `n/limite`, rouge en dépassement, jamais bloquant) | | `KANBANTE_AGING_DAYS` | `7` | Jours dans la même colonne avant le badge « ⏳ » sur une carte (rouge au double) | +| `KANBANTE_WEBHOOK_SECRET` | *(vide)* | Secret partagé du webhook Gitea ; si défini, la signature HMAC `X-Gitea-Signature` est exigée | +| `KANBANTE_SYNC_LABELS` | `1` | `0` = ne plus refléter les colonnes intermédiaires en étiquettes `kanban:*` dans Gitea | ## Sécurité @@ -146,6 +150,23 @@ kanbante/ | POST | `/api/issues/{owner}/{repo}/{n}/comments` | Commenter l'issue dans Gitea | | GET | `/api/events` | Derniers événements du journal (`?repo=`, `?limit=`) | | GET | `/api/metrics` | Débit + temps de cycle moyen (`?repo=`, `?window=`) | +| POST | `/webhooks/gitea` | Réception des webhooks Gitea (HMAC si secret défini) | +| GET | `/api/stream` | Flux SSE des événements Gitea (rafraîchissement live) | +| GET | `/board/{o}/{r}?milestone=` | Board filtré par milestone (titre ou id) | + +## Activer le temps réel (webhook Gitea) + +Dans chaque dépôt (ou au niveau d'une organisation) : **Réglages → +Webhooks → Ajouter un webhook → Gitea**, avec : + +- **URL cible** : `https:///webhooks/gitea` +- **Type de contenu** : `application/json` +- **Secret** : la même valeur que `KANBANTE_WEBHOOK_SECRET` +- **Déclencheur** : « Événements d'issue » (et « Commentaire d'issue » + si vous voulez aussi le rafraîchissement sur commentaires externes) + +Dès lors, fermer ou rouvrir une issue dans Gitea met à jour les boards +Kanbante ouverts, sans rechargement manuel. | POST | `/api/notes` | Sauvegarder des notes | | GET | `/api/stats` | Statistiques JSON | | GET | `/api/projects` | Projets JSON (actifs / inactifs / archivés) | diff --git a/pyproject.toml b/pyproject.toml index 8eab17e..16c2737 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "kanbante" -version = "0.3.0" +version = "0.4.0" description = "Kanban project manager integrated with Gitea" requires-python = ">=3.11" dependencies = [