Files
kanbante/CHANGELOG.md
T
Spark 3cac4fe9c3
CI / test (push) Successful in 1m39s
chore(release): Kanbante 0.3.0
Version, CHANGELOG (palier 1) et README (fonctionnalités,
KANBANTE_WIP_LIMITS / KANBANTE_AGING_DAYS, nouvelles routes).
2026-10-11 10:05:51 -04:00

5.4 KiB

Changelog

0.3.0 — 2026-10-11

« Palier 1 » : voir ce qui se passe sur les boards.

Ajouts

  • Journal d'événements (board_events, append-only) : chaque création, déplacement, fermeture, réouverture et commentaire est horodaté. Il alimente la page /activity (fil tous projets), GET /api/events et GET /api/metrics (débit par type et temps de cycle moyen : entrée en « En cours » → fermeture). Les fermetures détectées lors de la réconciliation avec Gitea sont aussi journalisées (source gitea). Un reclassement dans la même colonne n'écrit pas d'événement.
  • Panneau détail de carte : un clic sur une carte ouvre un panneau latéral avec le corps de l'issue rendu en markdown (marked + DOMPurify, vendorés), ses commentaires, assignés, milestone et échéance ; on peut commenter directement dans Gitea depuis le panneau (GET /api/issues/{owner}/{repo}/{n}, POST .../comments, 404 propre si l'issue n'existe pas).
  • Vieillissement des cartes : badge « ⏳ N j » dès qu'une carte reste dans sa colonne au-delà de KANBANTE_AGING_DAYS (défaut 7, rouge au double). Le temps en colonne vient du journal, avec repli sur board_state.updated_at puis sur la date de création de l'issue.
  • Limites WIP : KANBANTE_WIP_LIMITS="in_progress:5,review:3" — l'en-tête de colonne affiche n/limite, passe en rouge en dépassement et un toast avertit au dépôt. Limites souples : jamais bloquantes.

Tests

  • 16 tests ajoutés (52 au total) : journal et métriques, détail et commentaires, vieillissement, WIP.

0.2.0 — 2026-10-11

Consolidation complète à partir d'un audit du code 0.1.0 (chaque correctif marqué « confirmé » avait été reproduit par un test avant correction).

Critiques corrigés

  • Perte de données en Docker : KANBANTE_DB_PATH est enfin lue par le code — la base SQLite atterrit dans le volume /data comme prévu.
  • Authentification : Basic Auth optionnelle mais recommandée (KANBANTE_AUTH_USER / KANBANTE_AUTH_PASSWORD, KANBANTE_REQUIRE_AUTH=1 pour refuser de servir sans), protection CSRF (double-submit) sur tous les POST, avertissement bruyant au démarrage quand l'auth est absente.
  • Synchro bidirectionnelle : déplacer une carte vers « Terminé » ferme l'issue dans Gitea, la ressortir la rouvre (KANBANTE_SYNC_GITEA=0 pour désactiver). L'état local est réconcilié à chaque chargement de board (fermées → Terminé, supprimées → purgées).

Importants corrigés

  • Classification des projets : fenêtre d'activité glissante configurable (KANBANTE_ACTIVE_WINDOW_DAYS, défaut 365) et vrai drapeau archived de Gitea — fini l'année codée en dur et l'onglet « Archivés » mensonger.
  • Pagination complète des appels Gitea (le plafond serveur de 50 réponses par page ne tronque plus les dépôts ni les issues, en silence).
  • get_board_state ne plante plus sur une colonne inconnue ; migration automatique des bases 0.1.0 (colonne position, notes.updated_at, nettoyage des lignes invalides).
  • Gitea injoignable → page d'erreur 502 propre (JSON pour l'API) au lieu d'un 500 brut ; /api/readiness teste réellement SQLite et Gitea, /api/health reste un liveness sans dépendance.
  • Dockerfile : installation après copie du code (le package installé n'est plus vide), utilisateur non-root, HEALTHCHECK, .dockerignore.

Ajouts

  • Ordre des cartes persisté dans chaque colonne (aller-retour glisser-déposer → rechargement).
  • Création d'issues depuis le board (POST /api/issues).
  • Vue Focus (/focus) : tout ce qui est En cours / En révision, tous projets actifs confondus.
  • Filtres par texte et par étiquette sur le board ; les cartes lient vers l'issue Gitea ; les pull requests ne sont plus affichées comme des issues.
  • Suite de tests pytest (modèles, client Gitea, API, auth/CSRF) et CI Gitea Actions (.gitea/workflows/ci.yml).
  • Fichier LICENSE (MIT, annoncé par le README depuis la 0.1.0).

Détails

  • Client Gitea entièrement asynchrone (les routes ne bloquent plus la boucle d'événements), cache mémoire court des listes, en-tête Authorization seulement si un jeton est configuré, uid résolu via /user (plus de uid=1 ni d'utilisateur codés en dur), .env chargé depuis la racine du projet seulement.
  • Bibliothèques JS (HTMX, Alpine, SortableJS) vendorées dans static/vendor/ : plus aucune dépendance CDN à l'exécution.
  • Glisser-déposer : en cas d'échec serveur, la carte est replacée et le toast d'erreur est rouge ; les déplacements envoient l'ordre complet des colonnes source et destination.
  • API : codes HTTP corrects (400 colonne invalide, 403 CSRF, 413 note trop longue — limite configurable), lifespan FastAPI à la place de on_event déprécié, imports nettoyés.
  • CSS : fond des badges corrigé (color-mix() remplace l'invalide var(--accent)20).
  • Recherche du dashboard : le nom des dépôts passe par un attribut data-search échappé, plus aucune interpolation dans du JS.
  • docker-compose.yml : clé version: obsolète retirée, variables d'auth exposées, healthcheck.

0.1.0 — 2026-07-07

Version initiale : dashboard des projets Gitea, board Kanban 5 colonnes par dépôt (glisser-déposer SortableJS), notes par projet, état local SQLite, thème sombre, Dockerfile + docker-compose.