Frise multi-projets : outil de planification macro

Une frise chronologique unique où plusieurs projets s'empilent en couloirs
pliables, pour voir d'un coup d'œil où en est chacun et comment ils se situent
les uns par rapport aux autres. Ce n'est pas un outil de suivi quotidien : une
phase se compte en semaines, et il n'y a ni sous-tâches, ni tickets, ni
dépendances entre phases.

- Manipulation directe des barres (glisser, redimensionner), accrochées au lundi
- Couloirs pliables : plié, un projet devient une barre segmentée par phase
- Planning de référence figeable, avec barre fantôme et calcul de dérive
- En-tête à trois bandes : année, mois, numéro de semaine ISO 8601
- Frise qui s'élargit au défilement, pour planifier dans un futur encore vide
- Micro-serveur Python (bibliothèque standard) exposant GET/PUT sur /api/data,
  avec sauvegarde horodatée avant chaque écriture
- Zéro build : modules ES natifs, aucune dépendance à installer

50 tests unitaires sur la logique métier (node --test, sans dépendance).
Vérifié dans Chromium et Firefox.

Les arbitrages de conception et surtout leurs raisons sont consignés dans
docs/decisions.md — notamment l'abandon des dépendances entre phases, de la
File System Access API, du SVG et des niveaux de zoom.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-31 06:53:57 +02:00
commit 98ae311545
16 changed files with 4766 additions and 0 deletions

155
data/exemple.json Normal file
View File

@@ -0,0 +1,155 @@
{
"version": 2,
"projects": [
{
"id": "site-web",
"name": "Refonte du site web",
"color": "#3b82f6",
"collapsed": false,
"hidden": false,
"baselineDate": "2026-06-12",
"phases": [
{
"id": "cadrage",
"name": "Cadrage",
"start": "2026-06-15",
"end": "2026-07-10",
"status": "done",
"milestone": false,
"notes": "Ateliers avec les trois pôles. Périmètre arrêté le 8 juillet.",
"baseline": { "start": "2026-06-15", "end": "2026-07-03" }
},
{
"id": "maquettes",
"name": "Maquettes",
"start": "2026-07-13",
"end": "2026-08-28",
"status": "doing",
"milestone": false,
"notes": "Deux itérations prévues. La seconde dépend du retour de la direction.",
"baseline": { "start": "2026-07-06", "end": "2026-08-14" }
},
{
"id": "developpement",
"name": "Développement",
"start": "2026-08-31",
"end": "2026-11-13",
"status": "todo",
"milestone": false,
"notes": "",
"baseline": { "start": "2026-08-17", "end": "2026-10-30" }
},
{
"id": "recette",
"name": "Recette",
"start": "2026-11-16",
"end": "2026-12-11",
"status": "todo",
"milestone": false,
"notes": "",
"baseline": { "start": "2026-11-02", "end": "2026-11-27" }
},
{
"id": "mise-en-ligne",
"name": "Mise en ligne",
"start": "2026-12-15",
"end": "2026-12-15",
"status": "todo",
"milestone": true,
"notes": "Date communiquée aux partenaires.",
"baseline": { "start": "2026-12-01", "end": "2026-12-01" }
}
]
},
{
"id": "migration-infra",
"name": "Migration infrastructure",
"color": "#10b981",
"collapsed": false,
"hidden": false,
"phases": [
{
"id": "audit",
"name": "Audit de l'existant",
"start": "2026-05-04",
"end": "2026-06-12",
"status": "done",
"milestone": false,
"notes": "Inventaire complet des services et de leurs dépendances."
},
{
"id": "preparation",
"name": "Préparation des environnements",
"start": "2026-06-15",
"end": "2026-08-07",
"status": "done",
"milestone": false,
"notes": ""
},
{
"id": "bascule-pilote",
"name": "Bascule pilote",
"start": "2026-08-10",
"end": "2026-09-11",
"status": "blocked",
"milestone": false,
"notes": "En attente de la fenêtre de maintenance côté hébergeur."
},
{
"id": "bascule-generale",
"name": "Bascule générale",
"start": "2026-09-14",
"end": "2026-10-23",
"status": "todo",
"milestone": false,
"notes": ""
},
{
"id": "decommissionnement",
"name": "Décommissionnement",
"start": "2026-11-02",
"end": "2026-11-02",
"status": "todo",
"milestone": true,
"notes": "Arrêt définitif des anciens serveurs."
}
]
},
{
"id": "formation-equipe",
"name": "Formation de l'équipe",
"color": "#f59e0b",
"collapsed": true,
"hidden": false,
"phases": [
{
"id": "recensement",
"name": "Recensement des besoins",
"start": "2026-09-01",
"end": "2026-09-25",
"status": "todo",
"milestone": false,
"notes": ""
},
{
"id": "sessions",
"name": "Sessions de formation",
"start": "2026-10-05",
"end": "2026-12-18",
"status": "todo",
"milestone": false,
"notes": "Trois sessions de deux jours, étalées sur le trimestre."
},
{
"id": "bilan",
"name": "Bilan",
"start": "2027-01-15",
"end": "2027-01-15",
"status": "todo",
"milestone": true,
"notes": ""
}
]
}
]
}