diff --git a/CHANGELOG.md b/CHANGELOG.md
index 64e9310..bef459b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,7 @@
## 2026-06-23
### Modifié
+- **Rework GUI : l'UI édite le plan (branche `bascule-inventaire-genere`).** La vue **Serveurs** devient éditable (fonction / état / placement Proxmox / intégrations `clients_*`, avec VMID/IP/VLAN dérivés en direct), avec « + Serveur », « Sauvegarder les serveurs » (`POST /api/serveurs`) et **« Appliquer le plan → hosts.yml »** (`POST /api/instancier` → `instancier appliquer`). La vue **Inventaire** passe en **lecture seule** : bandeau explicite + l'écriture directe (`POST /api/inventaire`) est refusée (409) puisque `hosts.yml` est désormais généré. Tout passe par le plan (`serveurs.yml` / `applications.yml`) puis « Appliquer ». Garde-fou JS `node --check` exécuté à chaque étape.
- **Bascule méta-classe (branche `bascule-inventaire-genere`).** `make instancier-appliquer` régénère `inventories/production/hosts.yml` **depuis le plan** (refuse si le diff n'est pas vide, sauf `FORCE=1` pour un changement intentionnel ; git sert de filet). Effectuée avec diff vide vérifié : `hosts.yml` est désormais un artefact généré, sémantiquement identique à l'ancien (vérifié par `make inventaire-verifier` complet + chargement GUI). À ce stade le GUI édite encore `hosts.yml` directement (rework à venir) : éditer le **plan** (`serveurs.yml`/`applications.yml`) puis `make instancier-appliquer`.
- **Phase 2 (début) — vue Chaîne holistique.** Dans `make inventaire-ui`, la vue Chaîne montre désormais, pour chaque application d'un hôte, l'ensemble de ses liens : `expose` (FQDN publics), `requiert` (applications dont elle dépend) et ses bases (DSN), plus son port. On voit d'un coup d'œil comment VM, applications, bases et domaines s'articulent.
- **Phase 1b — clarté de nommage.** La clé `domaines:` de `docs/nomenclature.yml` (familles fonctionnelles : `infra-pki`, `web-frontal`…) est renommée **`fonctions:`** pour lever la collision avec les domaines DNS (`docs/domaines.yml`). L'auto-proposition du GUI suit (`fonctionDe` / `infoFonction`, `nomenclature.fonctions`, libellés « Fonction inconnue… », placeholder `fonction-NN`). Aucun rôle ni inventaire impacté : la nomenclature n'est consommée qu'au moment de la planification.
diff --git a/scripts/inventory_gui.py b/scripts/inventory_gui.py
index 573dc5b..cebd259 100644
--- a/scripts/inventory_gui.py
+++ b/scripts/inventory_gui.py
@@ -187,6 +187,7 @@ def serveurs_reconcilies(data: dict) -> list:
"nom": nom, "fonction": srv.get("fonction", ""), "etat": srv.get("etat", ""),
"noeud": srv.get("noeud", ""), "stockage": srv.get("stockage", ""),
"disque": srv.get("disque", ""), "memoire": srv.get("memoire", ""), "coeurs": srv.get("coeurs", ""),
+ "integrations": srv.get("integrations", []),
"vmid": d.get("vmid", ""), "adresse_ip": d.get("adresse_ip", ""), "vlan": d.get("vlan", ""),
"statut": statut, "divergences": rec["divergences"],
})
@@ -652,6 +653,7 @@ HTML = r"""
let applications = [];
let applicationsModifie = false;
let serveurs = [];
+ let serveursModifie = false;
let selection = -1;
let selectionNom = null;
let ongletActif = 'reseau';
@@ -696,7 +698,7 @@ HTML = r"""
chaine = data.chaine || {};
chargerBases(data);
chargerApplications(data);
- serveurs = data.serveurs || [];
+ chargerServeurs(data);
hotes = data.hotes;
estProduction = !!data.production;
modifie = false; verifie = {};
@@ -850,7 +852,8 @@ HTML = r"""
const visibles = hotes.map((h, i) => [h, i]).filter(([h]) => correspond(h));
if (!visibles.length) { cible.innerHTML = '
dérivé → vmid ${echapper(d.vmid)} · ip ${echapper(d.ip)} · vlan ${echapper(d.vlan)}
+
`;
+ }).join('') : '
Aucun serveur. Utilise « + Serveur » ou make serveurs-bootstrap.
';
cible.innerHTML = `
-
Serveurs du plan ${serveurs.length}${nbDiv ? ' · ' + nbDiv + ' non réconcilié(s)' : ' · tous réconciliés'}
+
Serveurs du plan ${serveurs.length}
${lignes}
-
Lecture seule (Phase 2). VMID / IP / VLAN sont dérivés de la fonction via la nomenclature ; « réconcilié » = identique à l'inventaire. La génération de l'inventaire depuis le plan viendra en Phase 3.
+
+
+
+
+
VMID / IP / VLAN sont dérivés de la fonction. « Appliquer le plan » régénère l'inventaire (refuse si conflit ; git est le filet).