diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cce662..1bcf830 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,36 @@ # Changelog +## 0.19.0 — 2026-10-12 + +### Performance + navigation « Pilotage » (chantiers A + C, décidés par Bruno) + +- **Parallélisation (A1)** : les pages inter-projets (dashboard, + /health, /forecast, /triage, /wall) attendaient chaque dépôt à + la queue leu leu ; elles utilisent maintenant un `asyncio.gather` + borné (16) — le patron que /focus appliquait déjà. +- **Cache stale-while-revalidate (A2)** : les listes Gitea + (dépôts, issues, jalons, étoiles) sont servies immédiatement + même périmées, et rafraîchies en tâche de fond. Fini le + « mur » de rechargement à chaque expiration du cache (30 s) : + seul le tout premier chargement après un démarrage paie le + coût complet. Les mutations vident le cache et désarment les + rafraîchissements en vol (aucune donnée périmée ressuscitée). +- **Prévisions refondues (C1)** : /forecast devient un tableau de + bord des jalons **tous projets** — une ligne par jalon (projet, + échéance, progression, ETA, **écart**, débit), triée par risque, + filtrable, colonnes triables ; le bloc jalon des cartes du + dashboard y pointe directement (ancres). Le débit par projet + reste en dessous, en tableau compact. +- **Santé refondue (C2)** : /health devient un tableau trié par + sévérité (pastille, ouvertes, zombies, goulot) ; la page santé + d'un projet gagne un **sélecteur de projet** pour basculer sans + repasser par l'index. Le tri des tableaux est mutualisé + (`static/js/tablesort.js`, dashboard inclus). +- Mesuré sur l'instance réelle (depuis le réseau de test) : + pages chaudes 0,04–0,16 s ; le premier chargement à froid + reste de quelques secondes — le chantier B (instantanés + d'arrière-plan) demeure le levier pour le supprimer, si voulu. + ## 0.18.0 — 2026-10-11 ### Nouveautés — vague 2, suite (4 cartes de Bruno) diff --git a/app/config.py b/app/config.py index c0c68ce..f77b1ab 100644 --- a/app/config.py +++ b/app/config.py @@ -89,7 +89,7 @@ from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent -APP_VERSION = "0.18.0" +APP_VERSION = "0.19.0" def _env_bool(name: str, default: bool) -> bool: diff --git a/app/digest.py b/app/digest.py index 1472060..e63d86c 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.18.0"}, + "clientInfo": {"name": "kanbante", "version": "0.19.0"}, }, req_id=1, ) diff --git a/pyproject.toml b/pyproject.toml index 27a46be..29c9478 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "kanbante" -version = "0.18.0" +version = "0.19.0" description = "Kanban project manager integrated with Gitea" requires-python = ">=3.11" dependencies = [