This commit is contained in:
@@ -1,5 +1,51 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 0.22.0 — 2026-10-14
|
||||||
|
|
||||||
|
### Écran de connexion (demande de Bruno)
|
||||||
|
|
||||||
|
- Fini la fenêtre Basic Auth du navigateur : page **/login**
|
||||||
|
professionnelle (carte centrée, marque dégradée, erreur
|
||||||
|
claire, retour à la page demandée après connexion).
|
||||||
|
- Session par **cookie signé HMAC** (7 jours, HttpOnly,
|
||||||
|
SameSite=Lax) ; clé `KANBANTE_SESSION_SECRET` ou dérivée des
|
||||||
|
identifiants — changer le mot de passe invalide les sessions.
|
||||||
|
- L'en-tête **Basic reste accepté** pour les scripts ; les API
|
||||||
|
reçoivent 401, seuls les navigateurs sont redirigés. Lien
|
||||||
|
**⏻ Sortir** dans le pied de la barre latérale, `/logout`
|
||||||
|
réel. Protection CSRF sur le formulaire, redirection `next`
|
||||||
|
limitée aux chemins locaux.
|
||||||
|
|
||||||
|
### Barre latérale (demandes de Bruno)
|
||||||
|
|
||||||
|
- Le bouton **Replier** quitte le bas de la barre : c'est une
|
||||||
|
**icône seule, en haut, à droite du bouton recherche**.
|
||||||
|
- **Accordéon exclusif** : ouvrir une section ferme les
|
||||||
|
autres — une seule ouverte à la fois (état mémorisé dans
|
||||||
|
`kanbante-nav-open` ; la section de la page courante prime).
|
||||||
|
|
||||||
|
### Chantier B — instantanés d'arrière-plan (validé par Bruno)
|
||||||
|
|
||||||
|
- Un **rafraîchisseur** recalcule périodiquement les listes
|
||||||
|
coûteuses (index des dépôts, étoiles, issues `all` **et**
|
||||||
|
`open`, jalons — pour chaque projet actif) et les persiste
|
||||||
|
dans SQLite (table `snapshots`, écriture à chaque réponse du
|
||||||
|
client). `KANBANTE_SNAPSHOT_INTERVAL` (défaut 120 s, 0 = off).
|
||||||
|
- Au démarrage, le cache du client est **hydraté** depuis les
|
||||||
|
instantanés (servis périmés + rafraîchis en tâche de fond,
|
||||||
|
mécanique SWR) : la première page après un redémarrage ou un
|
||||||
|
redéploiement ne paie plus Gitea.
|
||||||
|
- Un **webhook Gitea** rafraîchit immédiatement les
|
||||||
|
instantanés du dépôt touché. La fraîcheur est affichée dans
|
||||||
|
le pied de la barre (« 🕐 à l'instant / il y a N min ») :
|
||||||
|
les données Gitea peuvent dater d'un intervalle au plus,
|
||||||
|
le journal local reste instantané.
|
||||||
|
- **Mesuré sur l'instance réelle** (via le proxy de Spark,
|
||||||
|
latences gonflées) : premier chargement à froid 9,4 s sans
|
||||||
|
instantanés → après redémarrage avec instantanés : Projets
|
||||||
|
0,31 s, Focus 0,16 s, Triage 0,07 s, Santé 0,22 s,
|
||||||
|
Prévisions 0,08 s.
|
||||||
|
|
||||||
## 0.21.0 — 2026-10-12
|
## 0.21.0 — 2026-10-12
|
||||||
|
|
||||||
### Sélecteur de dépôt intelligent (Capture éclair, demande de Bruno)
|
### Sélecteur de dépôt intelligent (Capture éclair, demande de Bruno)
|
||||||
|
|||||||
+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.21.0"},
|
"clientInfo": {"name": "kanbante", "version": "0.22.0"},
|
||||||
},
|
},
|
||||||
req_id=1,
|
req_id=1,
|
||||||
)
|
)
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "kanbante"
|
name = "kanbante"
|
||||||
version = "0.21.0"
|
version = "0.22.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