From 24a1ebb9a6ee7d7128425e5ecab1ea58c42e79e0 Mon Sep 17 00:00:00 2001 From: Spark Date: Sun, 11 Oct 2026 14:49:38 -0400 Subject: [PATCH] =?UTF-8?q?chore(release):=20Kanbante=200.14.0=20=E2=80=94?= =?UTF-8?q?=20branche=20depuis=20la=20carte,=20sant=C3=A9=20du=20flux?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 25 +++++++++++++++++++++++++ README.md | 5 +++++ app/digest.py | 2 +- pyproject.toml | 2 +- 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 201099b..40ffa4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,30 @@ # Changelog +## 0.14.0 — 2026-10-11 + +### Nouveautés +- **Créer la branche depuis la carte** (issue #3) : le panneau + détail propose `issue--` (slug ASCII, 40 car. + max, nom libre accepté après validation git-ref) et la crée + dans Gitea depuis la branche par défaut + (`POST /api/issues/{o}/{r}/{n}/branch`). La carte passe en + « En cours » (journalisé, source `branch`, étiquette synchronisée) + et la branche est aussitôt reconnue par le code lié (#1) et par + l'automatisation de fusion (#2). Réponse idempotente si la + branche existe déjà. +- **Santé du flux** (issue #9) : `app/flow.py` reconstruit les + séjours par colonne depuis le journal (entrée → déplacement / + fermeture) : temps médian et moyen par colonne, colonne la plus + lente (goulot, ≥ 2 séjours). **Cartes zombies** : ouvertes sans + activité (journal ou Gitea) depuis `KANBANTE_ZOMBIE_DAYS` + (défaut 30). Pages `/health` (résumé global) et + `/health/{owner}/{repo}` (détail + actions rapides sur les + zombies : commenter « toujours pertinent ? », remettre au + Backlog, fermer — via les API existantes). + +8 tests ajoutés (165 au total). **La feuille de route +« Différenciation » est complète : 15/15.** + ## 0.13.0 — 2026-10-11 ### Nouveautés diff --git a/README.md b/README.md index 3371ba8..b1d036a 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,8 @@ - 🔀 **PR fusionnée → Terminé** — le webhook `pull_request` retrouve les issues liées (références `#n`, branche `issue-n-*`), les ferme et déplace leurs cartes, journalisé - 🗣️ **Standup automatique** — `/standup` : fermé/déplacé hier, focus du jour, blocages (QA/Révision qui vieillissent), copiable d'un clic ; ajout optionnel au briefing (`KANBANTE_BRIEFING_INCLUDE_STANDUP=1`) - ⚙️ **Règles d'automatisation** — moteur déclaratif `KANBANTE_RULES` (JSON) évalué toutes les 15 min : conditions colonne/âge/étiquette/WIP → étiquette, notification ntfy, tête de colonne ; jamais de fermeture par règle ; page `/rules` +- 🌿 **Branche depuis la carte** — le panneau détail crée `issue--` dans Gitea depuis la branche par défaut, déplace la carte en « En cours » et journalise ; la PR qui en naîtra sera reconnue automatiquement +- 🩺 **Santé du flux** — `/health` : temps médian par colonne (du journal), colonne la plus lente, et cartes zombies (aucune activité depuis `KANBANTE_ZOMBIE_DAYS`) avec actions rapides (commenter, remettre au backlog, fermer) - 📥 **Mode Triage** — `/triage` : le backlog se vide carte par carte, plein cadre, au clavier (`1-5` colonnes, `L` étiquettes, `A` s'assigner, `X` fermer, `Entrée` suivante, `Z` annuler), progression et résumé de session ; décisions via les mêmes API que le board - 🔄 **Board dynamique** — aucun refresh manuel : toute modification (autre session, Gitea, capture) est diffusée en SSE et appliquée **en place** avec animation des cartes (`/api/board/{owner}/{repo}` en JSON + fragments rendus serveur, diff DOM/FLIP) ; repli par sondage de 45 s sans webhooks ; drag local, filtres et panneau détail préservés - ⌨️ **Palette de commandes** — `Ctrl+K` (ou le bouton ⌨️) sur toutes les pages : actions, projets et recherche d'issues globale, 100 % clavier @@ -129,6 +131,7 @@ sudo systemctl enable --now docker | `KANBANTE_CAPTURE_NTFY_TOPIC` | *(vide)* | Topic ntfy écouté : chaque message devient une issue dans `KANBANTE_CAPTURE_REPO` | | `KANBANTE_BRIEFING_INCLUDE_STANDUP` | `0` | `1` = le standup automatique est ajouté au briefing ntfy du matin | | `KANBANTE_RULES` | *(vide)* | Règles d'automatisation en JSON (voir `/rules`) : conditions colonne/âge/étiquette/WIP → add_label / notify / move_top | +| `KANBANTE_ZOMBIE_DAYS` | `30` | Jours sans activité après lesquels une carte ouverte est « zombie » sur `/health` | | `KANBANTE_DIGEST_TIME` / `KANBANTE_DIGEST_WEEKDAY` | *(vide)* / `0` | Composition hebdo du digest (`HH:MM`, 0 = lundi) ; notification ntfy, jamais d'envoi automatique | | `KANBANTE_OBSIGATE_MCP_URL` / `_TOKEN` / `_TOOL` / `_ARGS` | *(vide)* | Serveur MCP d'ObsiGate : URL, jeton optionnel, outil de création de note, gabarit JSON d'arguments (`{title}`, `{content}`) | | `KANBANTE_DIGEST_WEBHOOK_URL` | *(vide)* | Webhook générique recevant le digest en JSON `{title, markdown, week}` | @@ -183,6 +186,8 @@ kanbante/ | GET | `/api/issues/{o}/{r}/{n}/code` | Branches, PRs et commits liés à la carte | | GET | `/standup` · `/api/standup` | Standup automatique (hier / aujourd'hui / blocages) | | GET | `/rules` · POST `/api/rules/run` | Règles d'automatisation : état, dernière évaluation, lancement manuel | +| POST | `/api/issues/{o}/{r}/{n}/branch` | Créer la branche de la carte (`issue--` ou nom libre validé) et la passer en « En cours » | +| GET | `/health` · `/health/{o}/{r}` | Santé du flux : goulots (temps médian par colonne) et cartes zombies, global ou par projet | | POST | `/api/today/pin` · `/api/today/unpin` | Épingler / retirer une carte du Focus du jour (max 3) | | GET | `/forecast` | Prévisions : débit hebdo, ETA backlog et milestones par projet | | GET | `/sprint/{owner}/{repo}` · `/api/sprint/{owner}/{repo}` | Récit de sprint d'un milestone (`?milestone=`), page rendue ou JSON markdown | diff --git a/app/digest.py b/app/digest.py index 6c23dec..ecdd968 100644 --- a/app/digest.py +++ b/app/digest.py @@ -143,7 +143,7 @@ async def _mcp_session(client: httpx.AsyncClient, url: str, token: str) -> None: { "protocolVersion": MCP_PROTOCOL_VERSION, "capabilities": {}, - "clientInfo": {"name": "kanbante", "version": "0.13.0"}, + "clientInfo": {"name": "kanbante", "version": "0.14.0"}, }, req_id=1, ) diff --git a/pyproject.toml b/pyproject.toml index 7a2c369..ac59f2b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "kanbante" -version = "0.13.0" +version = "0.14.0" description = "Kanban project manager integrated with Gitea" requires-python = ">=3.11" dependencies = [