diff --git a/CHANGELOG.md b/CHANGELOG.md index 18f4656..6d8a0f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,48 @@ # Changelog +## 0.5.0 — 2026-10-11 + +« Palier 3 » (points 7 à 9) + board enrichi. + +### Ajouts +- **Recherche globale** (`/search`) : recherche d'issues dans tous les + projets via l'API Gitea, résultats groupés par projet avec la colonne + Kanban de chaque issue. **Mes issues** (`/my`) : les issues ouvertes + assignées à l'utilisateur du jeton, tous projets confondus. +- **Briefing quotidien** : page `/briefing` (encours, activité 24 h, + cartes vieillissantes, milestones proches), `GET /api/briefing`, et + envoi **ntfy** manuel (`POST /api/briefing/send`) ou automatique à + `KANBANTE_BRIEFING_TIME` via un planificateur interne (mémoire + d'envoi en base, aucun doublon après redémarrage). +- **Serveur MCP** (lecture seule) : JSON-RPC 2.0 sur `POST /mcp` + (initialize, tools/list, tools/call, ping) avec 7 outils — + `list_projects`, `get_board`, `get_issue`, `get_focus`, + `search_issues`, `get_activity`, `get_metrics`. Aucune écriture, + conformément au principe « lectures d'abord ». `GET /mcp` décrit le + serveur. +- **Gestion des étiquettes sur le board** : modale de gestion + (lister / créer avec palette de couleurs / supprimer les étiquettes + du dépôt dans Gitea) et, dans le panneau détail, ajout / retrait + d'étiquettes sur l'issue en un clic, avec mise à jour immédiate de + la carte. API : `GET|POST /api/repos/{o}/{r}/labels`, + `DELETE /api/repos/{o}/{r}/labels/{id}`, + `POST /api/issues/{o}/{r}/{n}/labels`. + +### Améliorations +- **Panneau Notes du projet** : repliable (bouton ⤢, état mémorisé par + projet), **largeur ajustable** par glisser (mémorisée), et + **sauvegarde automatique** après 1,2 s sans frappe avec indicateur + d'état (le bouton manuel reste). Le formulaire quitte HTMX pour le + même `board.js` que le reste du board. +- Navigation unifiée enrichie sur toutes les pages : Mes issues, + Briefing, Recherche. + +### Tests +- 19 tests ajoutés (84 au total) : recherche et mes issues, briefing + (page, API, envoi ntfy, format), protocole MCP, API étiquettes, + marqueurs du board. Un doublon de déclaration JS attrapé par + `node --check` avant livraison. + ## 0.4.0 — 2026-10-11 « Palier 2 » : temps réel et visible dans Gitea — plus une refonte diff --git a/README.md b/README.md index 82ed4ba..033b488 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,11 @@ - 📰 **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 - 🎯 **Vue Focus** — tout ce qui est En cours / En révision, tous projets confondus (`/focus`) +- 🔍 **Recherche globale + Mes issues** — chercher dans toutes les issues de tous les projets (`/search`), et voir ce qui vous est assigné (`/my`) +- 📊 **Briefing quotidien** — encours, vieillissement, milestones proches : page `/briefing` et envoi **ntfy** planifié +- 🤖 **Serveur MCP** — 7 outils en lecture seule (boards, focus, recherche, métriques) exposés en JSON-RPC sur `/mcp` pour vos agents +- 🏷️ **Étiquettes gérables depuis le board** — créer / supprimer les étiquettes du dépôt, les appliquer aux issues depuis le panneau détail +- 📝 **Notes de projet** — panneau repliable, largeur ajustable, sauvegarde automatique - 📝 **Notes** — bloc-notes par projet - 🔐 **Authentification** Basic Auth intégrée + protection CSRF (voir Sécurité) - 🌙 **Dark theme** — conçu pour les longues sessions @@ -101,6 +106,10 @@ sudo systemctl enable --now docker | `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 | +| `KANBANTE_NTFY_URL` | *(vide)* | Base du serveur ntfy (ex. `https://ntfy.sh` ou auto-hébergé) pour le briefing | +| `KANBANTE_NTFY_TOPIC` | *(vide)* | Topic ntfy du briefing (URL + topic requis pour activer l'envoi) | +| `KANBANTE_NTFY_TOKEN` | *(vide)* | Jeton Bearer optionnel pour un topic protégé | +| `KANBANTE_BRIEFING_TIME` | *(vide)* | Heure d'envoi quotidien du briefing, `HH:MM` heure du serveur ; vide = pas d'envoi automatique | ## Sécurité @@ -153,6 +162,35 @@ kanbante/ | 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) | +| GET | `/search?q=` | Recherche globale d'issues (tous projets, tous états) | +| GET | `/my` | Issues ouvertes assignées à l'utilisateur du jeton | +| GET | `/briefing` | Briefing quotidien (page lisible + statut ntfy) | +| GET | `/api/briefing` | Briefing en JSON + texte formaté | +| POST | `/api/briefing/send` | Envoyer le briefing sur ntfy maintenant | +| GET/POST | `/mcp` | Serveur MCP lecture seule (JSON-RPC 2.0) | +| GET/POST | `/api/repos/{o}/{r}/labels` | Lister / créer les étiquettes du dépôt | +| DELETE | `/api/repos/{o}/{r}/labels/{id}` | Supprimer une étiquette du dépôt | +| POST | `/api/issues/{o}/{r}/{n}/labels` | Ajouter / retirer une étiquette sur une issue | + +## Brancher un client MCP + +Kanbante expose un serveur MCP **en lecture seule** (aucune écriture : +les lectures d'abord). Configuration type (transport HTTP) : + +```json +{ + "mcpServers": { + "kanbante": { + "url": "https:///mcp" + } + } +} +``` + +Outils : `list_projects`, `get_board`, `get_issue`, `get_focus`, +`search_issues`, `get_activity`, `get_metrics`. Si la Basic Auth +Kanbante est active, le client doit envoyer l'en-tête +`Authorization` correspondant. ## Activer le temps réel (webhook Gitea) diff --git a/pyproject.toml b/pyproject.toml index 16c2737..d022949 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "kanbante" -version = "0.4.0" +version = "0.5.0" description = "Kanban project manager integrated with Gitea" requires-python = ">=3.11" dependencies = [