chore(release): Kanbante 0.19.0 — performance et pilotage (A + C)
CI / test (push) Successful in 1m50s
CI / test (push) Successful in 1m50s
This commit is contained in:
@@ -1,5 +1,36 @@
|
|||||||
# Changelog
|
# 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
|
## 0.18.0 — 2026-10-11
|
||||||
|
|
||||||
### Nouveautés — vague 2, suite (4 cartes de Bruno)
|
### Nouveautés — vague 2, suite (4 cartes de Bruno)
|
||||||
|
|||||||
+1
-1
@@ -89,7 +89,7 @@ from pathlib import Path
|
|||||||
|
|
||||||
BASE_DIR = Path(__file__).resolve().parent.parent
|
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:
|
def _env_bool(name: str, default: bool) -> bool:
|
||||||
|
|||||||
+1
-1
@@ -143,7 +143,7 @@ async def _mcp_session(client: httpx.AsyncClient, url: str, token: str) -> None:
|
|||||||
{
|
{
|
||||||
"protocolVersion": MCP_PROTOCOL_VERSION,
|
"protocolVersion": MCP_PROTOCOL_VERSION,
|
||||||
"capabilities": {},
|
"capabilities": {},
|
||||||
"clientInfo": {"name": "kanbante", "version": "0.18.0"},
|
"clientInfo": {"name": "kanbante", "version": "0.19.0"},
|
||||||
},
|
},
|
||||||
req_id=1,
|
req_id=1,
|
||||||
)
|
)
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "kanbante"
|
name = "kanbante"
|
||||||
version = "0.18.0"
|
version = "0.19.0"
|
||||||
description = "Kanban project manager integrated with Gitea"
|
description = "Kanban project manager integrated with Gitea"
|
||||||
requires-python = ">=3.11"
|
requires-python = ">=3.11"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
|||||||
Reference in New Issue
Block a user