diff --git a/CHANGELOG.md b/CHANGELOG.md index 437e0fe..a4a769b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,35 @@ # Changelog +## 0.12.0 — 2026-10-11 + +### Nouveautés +- **Focus du jour** (issue #5) : le rituel des 3 cartes. Table + `today_picks` ; bouton 📌 sur chaque carte du board (et sur les + candidates) ; page `/today` calme — picks du jour avec leur + colonne en direct, candidates de l'encours, **reprises d'hier + non terminées** reproposées, récapitulatif « ça a bougé + aujourd'hui » tiré du journal. Le briefing du matin inclut les + sections « Focus du jour » et « À reprendre d'hier ». + `POST /api/today/pin` (max 3, idempotent) et `/unpin`. +- **Prévisions** (issue #7) : `app/forecast.py` — fermetures par + semaine depuis le journal (8 semaines), débit moy/min/max sur + les 4 dernières semaines complètes, projection en **fourchette** + (jamais un faux chiffre précis) et silence explicite sans + historique. Affichées sur le dashboard (épuisement du backlog), + dans le bandeau milestone (avec alerte si l'ETA dépasse + l'échéance) et sur `/forecast` (sparkline SVG inline, verdict + par milestone). `/api/metrics` expose `weekly_closures` et + `throughput_4w`. +- **Récit de sprint** (issue #4) : `app/sprint.py` + page + `/sprint/{owner}/{repo}?milestone=` — le bilan markdown du + milestone écrit par le journal : livré (avec temps de cycle par + carte), cartes les plus lentes, reporté avec colonnes, chiffres + de la période ; boutons **Copier** et **Télécharger .md**, + endpoint `GET /api/sprint/...` en JSON, lien « 📖 Récit de + sprint » dans le bandeau milestone du board. + +11 tests ajoutés (147 au total). + ## 0.11.0 — 2026-10-11 ### Nouveautés diff --git a/README.md b/README.md index 8083c27..6c62c46 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,9 @@ - ⏳ **Vieillissement + limites WIP** — badge d'ancienneté par colonne et limites souples configurables - 🎯 **Vue Focus** — tout ce qui est En cours / en QA / En révision, tous projets confondus (`/focus`) - 🖥️ **Wallboard** — mode TV plein écran (`/wall`) : rotation automatique entre les projets actifs, cartes en vol et compteurs en très grands caractères, rafraîchi en direct ; `?repo=Proprietaire/depot` fige un seul projet +- 🌅 **Focus du jour** — `/today` : jusqu'à 3 cartes épinglées (bouton 📌 sur les cartes), candidates de l'encours, reprises d'hier non terminées, récapitulatif du soir ; intégrées au briefing +- 🔮 **Prévisions** — débit réel du journal (fermetures/semaine), date d'épuisement du backlog et ETA des milestones en fourchette honnête, sur le dashboard, le bandeau milestone et `/forecast` (sparkline SVG) +- 📖 **Récit de sprint** — le bilan markdown d'un milestone (livré, cycles, plus lentes, reporté) généré depuis le journal, page `/sprint/...` + copie/téléchargement en un clic - 📥 **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 @@ -170,6 +173,10 @@ kanbante/ | GET | `/api/palette` | Données de la palette Ctrl+K (projets + recherche d'issues `?q=`) | | GET | `/api/board/{owner}/{repo}` | Board en JSON + fragments HTML des cartes (base du board dynamique, `?milestone=` accepté) | | GET | `/triage` · `/triage/{owner}/{repo}` | Mode Triage : sélecteur de projet puis session clavier sur le backlog | +| GET | `/today` | Focus du jour : les 3 cartes épinglées, candidates, reprises d'hier | +| 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 | | POST | `/api/issues/{o}/{r}/{n}/assign-self` | S'assigner une issue (utilisateur du jeton) | | GET | `/digest` | Digest hebdo : aperçu, statut des cibles, approbation d'envoi | | POST | `/digest/send` | Livrer le digest (cible `obsigate` ou `webhook`) — approbation explicite | diff --git a/app/config.py b/app/config.py index 22c80aa..933c21a 100644 --- a/app/config.py +++ b/app/config.py @@ -76,7 +76,7 @@ from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent -APP_VERSION = "0.11.0" +APP_VERSION = "0.12.0" def _env_bool(name: str, default: bool) -> bool: diff --git a/app/digest.py b/app/digest.py index 10ff627..aa98523 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.11.0"}, + "clientInfo": {"name": "kanbante", "version": "0.12.0"}, }, req_id=1, ) diff --git a/pyproject.toml b/pyproject.toml index 3473d13..8027b3d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "kanbante" -version = "0.11.0" +version = "0.12.0" description = "Kanban project manager integrated with Gitea" requires-python = ">=3.11" dependencies = [