Fusion et dédoublonnage de l'ancienne
fork/ROADMAP-GCM-v1.3.md(issues GitHub #74–#116, « Décisions de suivi » du 2026-08-05, TODO upstream d'origine) avec l'état réel du code — d'où les numéros d'issue#NNsur une partie des lignes ci-dessous.Importé depuis
../CLAUDE.md(@docs/features-backlog.md) : ce fichier fait donc partie de ce qui est chargé à chaque démarrage. Pour le détail d'implémentation d'un item « fait » (raisonnement, tests, code touché), voir le fichier de session pointé dansdocs/sessions/. Pour la stratégie de migration GTK4, voirgtk4-migration.md. Pour l'état détaillé du code (statuts par module, écarts doc/code), voirarchitecture.md.
Pas de session associée — c'était déjà l'état du dépôt à la première prise en main.
| Fonctionnalité | Détail |
|---|---|
| Architecture plugins (#107) | refactor Host générique — architecture.md §2.4 |
| Gestion des clés SSH intégrée (#108) | portage de SSH-Studio — architecture.md §2.5 |
| Import/export CSV, JSON (#74 partiel) | CSV/JSON faits ; import PuTTY fait depuis, voir plus bas |
| Support VNC et SPICE (#102) | widgets natifs GtkVnc/SpiceClientGtk — architecture.md §2.1 |
| Docstrings Google (#110) | 188 fonctions à l'origine, depuis durci en règles ruff D1xx/D417 |
| Tests unitaires pytest (#111) | 379 tests à l'origine ; le nombre réel actuel est incertain, voir architecture.md §2.8 |
| Traductions manquantes (#76), ukrainien (#100) | 29 langues au total, largement au-delà des 16 annoncées par le README d'origine |
| Connexion VMs libvirt/QEMU (#101) | import 2 phases, détection heuristique Windows |
| Import Proxmox/VirtualBox/oVirt | au-delà de la demande initiale — architecture.md §2.2/§2.3 |
| Push config masse Netmiko/SNMP | non demandé tel quel dans les issues d'origine — architecture.md §2.2 |
| IPMI SOL, Web (BMC HTML5) | non demandé tel quel — architecture.md §2.1 |
| Bugs upstream #81/#82/#87/#88/#89/#64/#67/#66 | tous corrigés — architecture.md §2.9 |
| Fonctionnalité | Détail |
|---|---|
| Zoom terminal Ctrl+/Ctrl-/Ctrl+0 (#79) | docs/sessions/session-01.md |
Compiler lang/bn_BD en .mo |
docs/sessions/session-02.md |
Option CLI --config PATH (#80) |
docs/sessions/session-03.md |
snmp_bulk_core_easysnmp.py — bug push Huawei VRP |
docs/sessions/session-04.md |
Séparation cœur métier / cœur GTK4 (gcm4_core.py) |
docs/sessions/session-05.md |
Masquer les mots de passe dans les commandes cluster (#P=) |
docs/sessions/session-06.md |
| Renommer un groupe | trouvé déjà fait à l'audit — docs/sessions/session-07.md |
| Navigation entre onglets (Ctrl+Tab / Alt+1..9) | trouvé déjà fait à l'audit — docs/sessions/session-07.md |
| Drag'n'drop d'hôtes/dossiers entre groupes | trouvé déjà fait à l'audit — docs/sessions/session-07.md |
| Fermeture automatique d'onglet (#77) | réglage global trouvé déjà fait — session-07.md ; surcharge par hôte ajoutée — session-09.md |
| Désactiver les raccourcis clavier (préférence) | docs/sessions/session-08.md |
| Recherche dans les onglets ouverts (#114) | trouvé déjà fait — docs/sessions/session-10.md |
| Notifications desktop (#109) — volet déconnexion | docs/sessions/session-11.md (volet erreurs de connexion : voir « pas encore fait » ci-dessous) |
| Cluster : historique de commandes | trouvé déjà fait — docs/sessions/session-12.md |
Proxy SSH générique — ProxyCommand arbitraire |
docs/sessions/session-13.md |
| Espace de travail (« workspace ») | docs/sessions/session-14.md |
| Sauvegarde/restauration des onglets ouverts | docs/sessions/session-16.md |
| Documentation utilisateur — README.md | docs/sessions/session-17.md |
| Couleurs par groupe (comme PuTTY) | docs/sessions/session-18.md |
| Scripting avant connexion (#116) — volet « avant » | docs/sessions/session-19.md |
| Mode sombre dédié (#113) | trouvé déjà largement fait, audit + correctif — docs/sessions/session-20.md |
| Scripting après connexion (#116) — volet « après » | docs/sessions/session-21.md |
| Documentation utilisateur — CHANGELOG.md | docs/sessions/session-22.md |
Dernier vestige SSH codé en dur dans le cœur (patch_edit_host_dialog) — hook générique ConnectionPlugin.patch_edit_host_dialog |
docs/sessions/session-23.md |
Mise à jour documentation utilisateur (Documentation-fr.md) |
docs/sessions/session-24.md |
Migration GTK4 — premier pas concret : lever le verrou GTK3 de plugin_base.py |
docs/sessions/session-25.md ; reste du chantier non chiffrable en sessions à ce stade, voir gtk4-migration.md §3.6 |
Migration GTK4 — plugin pilote SSH, extraction de plugins/ssh/core.py (logique métier, zéro GTK) |
docs/sessions/session-26.md ; plugins/ssh/gtk4.py (widgets réels) reste une session séparée, voir gtk4-migration.md §3.6 point 3 |
Master password au démarrage — logique de protection/déverrouillage (master_password_core.py) |
docs/sessions/session-27.md ; câblage dans gcm4_core.py + prompt GTK au démarrage reste à faire, voir « Pas encore fait » |
Migration GTK4 — audit des points de rupture du cœur : Gtk.Dialog.run() et GtkMenuBar/GtkMenu (menu principal) trouvés déjà résolus (non documenté), Gtk.Widget.reparent() trouvé en code mort et retiré, Gtk.STOCK_* résiduels corrigés dans plugin_spice.py |
docs/sessions/session-28.md ; détail gtk4-migration.md §3.6-bis. Reste des menus contextuels (Gtk.Menu classique) nouvellement isolé comme point de rupture propre, non traité |
Migration GTK4 — audit approfondi des menus contextuels (inventaire des 4 menus applicatifs + 1 cas Gtk.Entry, 6 Gtk.Menu(), 48 items, 6 sites .popup() legacy, 2 difficultés structurelles identifiées : items à état coché, contenu dynamique) |
docs/sessions/session-29.md ; détail gtk4-migration.md §3.6-ter. Audit et plan seulement, portage non commencé — ordre à confirmer avec l'auteure (voir « Pas encore fait ») |
Renommage GCM → gcm4 — audit exhaustif (12 sites d'import réel, 29 occurrences i18n, .desktop, packaging, config utilisateur) + mécanisme générique testé gcm4_core.migrate_legacy_config_dir() ; bonus : make validate/make check réparé (référence .glade supprimée depuis la session-08) |
docs/sessions/session-30.md ; détail docs/gcm4-rename.md. Audit et mécanisme seulement, renommage réel non exécuté — six choix de noms à confirmer avec l'auteure (voir « Pas encore fait ») |
Migration GTK4 — portage effectif de popupMenuTab (menu contextuel des onglets, le plus simple des quatre menus audités) vers Gio.Menu/Gio.SimpleActionGroup/Gtk.Popover (widgets.TabContextMenu), logique de disposition extraite en fonction pure testable (tab_context_menu_core.py) |
docs/sessions/session-31.md ; détail gtk4-migration.md §3.6-quater. Premier des quatre menus contextuels réellement porté ; déclenchement (Gtk.GestureClick) et les trois autres menus restent à faire — voir « Pas encore fait » |
Migration GTK4 — portage effectif de popupMenuFolder (menu contextuel du panneau de serveurs) vers Gio.Menu/Gio.SimpleActionGroup/Gtk.Popover (widgets.FolderContextMenu), logique de disposition extraite en fonction pure testable (folder_context_menu_core.py), items spécifiques à un protocole gardés dynamiques via un protocol_items_provider |
docs/sessions/session-32.md ; détail gtk4-migration.md §3.6-quinquies. Deuxième des quatre menus contextuels réellement porté ; popupMenu (seul restant), déclenchement (Gtk.GestureClick) et le cas Gtk.Entry/populate-popup restent à faire — voir « Pas encore fait » |
Migration GTK4 — portage effectif de popupMenu (menu contextuel du terminal, sous-menu dynamique « Custom commands » compris) vers Gio.Menu/Gio.SimpleActionGroup/Gtk.Popover (widgets.PopupMenu), logique de disposition extraite en fonction pure testable (popup_menu_core.py) ; pont « Custom commands » du menu hamburger mis à jour (PopupMenu.popup_commands_at()) |
docs/sessions/session-33.md ; détail gtk4-migration.md §3.6-sexies. Troisième et dernier des quatre menus contextuels applicatifs réellement porté — déclenchement (Gtk.GestureClick), le cas Gtk.Entry/populate-popup, plugins/ssh/gtk4.py et RDP restent à faire — voir « Pas encore fait » |
ssh_config_editor.py — câblage confirmé, documentation corrigée (trouvé déjà fait à l'audit, jamais documenté) |
docs/sessions/session-34.md |
Correction des erreurs ruff — pyproject.toml élargi pour exclure les répertoires vendorisés SSH-Studio//gtk-frdp/ du lint (196 lignes qui ne concernaient pas ce dépôt) ; 73 erreurs réelles corrigées à la main sur 17 fichiers (models.py, netmiko_bulk_core.py, plugins/plugin_base.py et 8 autres plugins, utils.py, widgets.py — docstrings manquantes/obsolètes, expressions mortes, variable de boucle inutilisée) ; make lint élargi à tout le dépôt (ruff check . au lieu de 3 chemins) |
docs/sessions/session-35.md — tests/test_gcm.py (423 erreurs D102/D101 pré-existantes, documentées depuis la session-30) volontairement non touché, cf. « Pas encore fait » |
Gestion des dépendances Poetry → uv ; correction de la totalité des erreurs ruff check . restantes (423 de tests/test_gcm.py, comblées par docstrings générées mécaniquement à partir du nom de chaque test) — ruff check . passe désormais sans aucune erreur ; bug latent découvert et corrigé au passage (.venv non exclu du lint/format une fois créé, [tool.ruff] exclude personnalisé remplaçant la liste par défaut de ruff) ; .gitignore ajouté (absent du dépôt) ; audit du nombre de tests réel demandé par claude.md (732 au total, 506/58 classes dans test_gcm.py contre 492/56 documentés le 2026-08-30 ; 226 tests répartis sur 15 fichiers hors test_gcm.py, dont tests/test_uv_migration.py, nouveau, verrouillant la migration uv et la config flake8) ; tests orphelins _vm_name_split/_rdp_socket_available reconfirmés toujours orphelins ; README/CHANGELOG (« 491 tests ») corrigés |
docs/sessions/session-36.md |
Migration GTK4 — audit du déclenchement Gtk.GestureClick (point 3, commun aux quatre menus contextuels désormais tous portés) : inventaire exhaustif des 3 familles de sites réels (on_terminal_click × 2, on_tvServers_button_press_event, NotebookTabLabel.popupmenu), 4 sites voisins hors périmètre écartés ; vérification auprès de la documentation GTK officielle que GtkGestureMultiPress (GTK3) et GtkGestureClick (GTK4) partagent le même signal pressed() (renommage + perte de area, pas une API nouvelle) ; difficulté identifiée (bouton/modificateurs/Gdk.Event absents du signal pressed, nécessitant get_current_event_state()/get_current_event()) ; proposition d'ordre non tranchée (treeServers en premier) |
docs/sessions/session-38.md ; détail gtk4-migration.md §3.6-septies. Audit et plan seulement, portage non commencé |
Migration GTK4 — portage effectif du déclenchement pour treeServers/popupMenuFolder (premier des trois sites du point 3, le plus simple) vers Gtk.GestureMultiPress (Wmain.on_tvServers_pressed), logique de classification du clic extraite en fonction pure testable (nouveau module gesture_trigger_core.py, destiné aussi aux deux sites restants) ; FolderContextMenu.popup_at() adapté (x/y au lieu d'un Gdk.EventButton) ; correction apportée à l'audit session-38 : get_current_event()/get_current_event_state() n'existent pas en GTK3 sur Gtk.EventController (ajouts GTK4 uniquement) — Gtk.Gesture.get_last_event(None) à utiliser à la place pour les deux sites restants |
docs/sessions/session-39.md ; détail gtk4-migration.md §3.6-octies. Premier des trois sites réellement porté ; interaction Gtk.EventSequenceState.CLAIMED/comportement par défaut de Gtk.TreeView non vérifiable empiriquement ici — à confirmer manuellement avant mise en production |
Migration GTK4 — portage effectif du déclenchement pour on_terminal_click (deuxième des trois sites du point 3, 2 sites d'appel identiques) vers Gtk.GestureMultiPress (Wmain.on_terminal_pressed), attaché via une nouvelle méthode partagée Wmain.attach_terminal_click_gesture() (référence du geste conservée sur le widget terminal lui-même, créé dynamiquement, plutôt que sur self) ; nouvelle fonction gesture_trigger_core.classify_terminal_click() (8 tests) avec un paramètre ctrl_pressed supplémentaire pour la branche Ctrl+clic (détection d'URL), et sans issue "swallow" pour ne pas casser la sélection native de VTE au double/triple-clic ; widgets.PopupMenu.popup_at() adapté (x/y au lieu d'un Gdk.EventButton), correction session-39 (get_last_event(None)) appliquée dès la conception |
docs/sessions/session-40.md ; détail gtk4-migration.md §3.6-nonies. Deuxième des trois sites réellement porté ; interaction Gtk.PropagationPhase.TARGET/sélection de texte native de Vte.Terminal non vérifiable empiriquement ici — à confirmer manuellement avant mise en production |
Migration GTK4 — portage effectif du déclenchement pour l'étiquette d'onglet (troisième et dernier des trois sites du point 3) vers Gtk.GestureMultiPress (NotebookTabLabel.on_label_pressed), geste construit directement dans NotebookTabLabel.__init__ (référence conservée sur self, pas de méthode d'attache partagée nécessaire) ; nouvelle fonction gesture_trigger_core.classify_tab_label_click() (6 tests), sans branche modificateur clavier (comme treeServers) ni issue "swallow" (comme le terminal) ; une même issue "open-menu" recouvre deux menus distincts (bureau distant RDP/VNC/SPICE en Gtk.Menu legacy, ou TabContextMenu), choix laissé à l'appelant ; .popup() du menu distant adapté avec gesture.get_current_button() + Gtk.get_current_event_time() ; asymétrie de Gtk.EventSequenceState.CLAIMED de l'ancien code reproduite fidèlement (revendiquée sur clic droit et clic milieu annulé, pas sur fermeture réussie) ; widgets.TabContextMenu.popup_at() adapté (x/y) |
docs/sessions/session-41.md ; détail gtk4-migration.md §3.6-decies. Les trois sites du point 3 (audit session-38) sont désormais tous portés ; non vérifié empiriquement ici (GTK3 absent) — à confirmer manuellement avant mise en production |
| Migration GTK4 — audit du point 4 (éditeur inline CellTextView, appelé partout jusqu'ici « le cas Gtk.Entry/populate-popup ») : terminologie corrigée (le widget est une sous-classe de Gtk.TextView, pas Gtk.Entry), périmètre réel plus large que documenté (4 signaux GTK3-only à porter — focus-out-event, key-press-event, populate-popup, button-press-event — 3 mécanismes de remplacement GTK4 distincts, pas 1) | docs/sessions/session-42.md ; détail gtk4-migration.md §3.6-undecies. Audit et plan seulement, aucun portage de code : le cas populate-popup dépend d'un comportement d'exécution GTK4 (le menu natif vole-t-il le focus du widget ?) invérifiable empiriquement dans cet environnement de travail — ordre de portage des 4 signaux à confirmer avec l'auteure. Nouveau verrou tests/test_gtk4_inline_editor_baseline.py |
| Migration GTK4 — portage effectif de key-press-event (premier des quatre signaux du point 4, proposition d'ordre posée cette session) vers Gtk.EventControllerKey/key-pressed — même classe en GTK3 (≥ 3.24) et en GTK4, seule la construction diffère (.new(widget) en GTK3, .new() + widget.add_controller() en GTK4, à ajuster au futur passage réel) ; logique de classification extraite en fonction pure testable (nouveau module inline_editor_core.py) ; comportement inchangé (l'ancien gestionnaire ne retournait jamais True) ; référence du contrôleur gardée sur l'éditeur, même précaution que pour les Gtk.Gesture* des sessions 39-41 | docs/sessions/session-43.md ; détail gtk4-migration.md §3.6-duodecies. tests/test_gtk4_inline_editor_baseline.py mis à jour (verrou positif sur le nouveau câblage, verrou négatif sur l'ancien signal). Reste : button-press-event et le couple focus-out-event/populate-popup — ordre entre les deux toujours à confirmer avec l'auteure |
| Migration GTK4 — portage effectif de button-press-event (deuxième des quatre signaux du point 4, proposition d'ordre de la session-43) vers Gtk.GestureMultiPress/pressed (même classe que les trois sites du point 3, set_button(0) — tous boutons, comme l'ancien signal) ; nouvelle fonction inline_editor_core.classify_editor_button_press(), qui ne branche sur aucun paramètre (l'ancien gestionnaire retournait inconditionnellement True, contournement d'un bug GTK3 précis) et renvoie donc toujours "claim", revendiqué via gesture.set_state(Gtk.EventSequenceState.CLAIMED) ; référence du geste gardée sur l'éditeur (editor._button_gesture) | docs/sessions/session-44.md ; détail gtk4-migration.md §3.6-terdecies. tests/test_gtk4_inline_editor_baseline.py et tests/test_gtk4_context_menus_baseline.py mis à jour (décoy _on_editor_pressed tombé à zéro). focus-out-event/populate-popup (le plus risqué des quatre), plugins/ssh/gtk4.py, et RDP — ordre toujours à confirmer avec l'auteure |
| Migration GTK4 — audit de plugins/ssh/gtk4.py (jamais détaillé au-delà de sa mention en §3.0-bis) : inventaire des trois fichiers GTK3 à fusionner (ssh_config_editor.py, ssh_key_manager_dialog.py, key_picker_dialog.py, 4435 lignes au total, aucune encore portée) ; confirmation que le point de rupture Gtk.Dialog.run() y est déjà résolu (tous les appelants passent par run_dialog_sync()) ; six ruptures d'API distinctes recensées et vérifiées auprès de sources officielles (show_all(), set_border_width(), Gtk.Clipboard.get(), dlg.get_filename(), set_current_folder(str(...)), Gtk.FileChooserDialog(...)) ; question d'architecture identifiée sur le trio FileChooserDialog (adapter a minima vs. réécrire vers Gtk.FileDialog, asynchrone) | docs/sessions/session-45.md ; détail gtk4-migration.md §3.7. Audit et inventaire seulement, portage non commencé — ordre entre ce chantier, le couple focus-out-event/populate-popup, et RDP toujours à confirmer avec l'auteure (voir « Pas encore fait »). Nouveau verrou tests/test_ssh_gtk4_baseline.py |
| Migration GTK4 — audit du chantier RDP (dernier des trois chantiers restants encore non audité) : corrige §3.4 (2026-08-29) — le repli Gtk.Socket/XEmbed qui y était décrit comme actif à côté de GtkFrdp.Display a en réalité disparu du code réellement chargé (plugins/plugin_rdp.py, gnome_connection_manager.py), ne laissant que des tests orphelins déjà notés en session-36 (_rdp_socket_available en était le détecteur X11) ; inspection de la bibliothèque C vendorisée gtk-frdp/ : GtkFrdp.Display est une sous-classe GtkDrawingArea sans aucune API X11, mais son meson.build épingle encore gtk+-3.0 ; recherche web (2026-09-19) sur la migration GTK4/libadwaita de GNOME Boxes (même mainteneur que gtk-frdp) : remplace son widget SPICE par Libmks, ne mentionne jamais RDP/gtk-frdp — statut GTK4 amont de gtk-frdp toujours non confirmé ; découverte annexe : widgets.build_remote_desktop_context_menu() (RDP/VNC/SPICE) n'a en réalité jamais été porté, contrairement au résumé session-33 (« les quatre menus... tous portés ») | docs/sessions/session-46.md ; détail gtk4-migration.md §3.8. Audit et inventaire seulement, aucun portage de code — les trois chantiers (couple focus-out-event/populate-popup, plugins/ssh/gtk4.py, RDP) sont désormais tous audités, leur ordre de traitement reste à confirmer avec l'auteure. Nouveau verrou tests/test_gtk4_rdp_baseline.py |
(Comparaison à PATTERNS-COMPARISON.md, docs/sessions/session-15.md : pas
une tâche de ce backlog, demande ponctuelle.)
Légende urgence :
| Évolution | Pourquoi |
|---|---|
| Migration GTK4 | Chantier prioritaire demandé — voir gtk4-migration.md pour la stratégie et les points de rupture identifiés. Premier pas concret fait le 2026-09-10 (session-25.md, verrou GTK3 de plugin_base.py levé) ; points ouverts du §9 validés le même jour (gtk4-migration.md §3.0-bis) ; plugin pilote SSH réorganisé en plugins/ssh/core.py (session-26.md) ; audit des points de rupture du cœur (session-28.md, gtk4-migration.md §3.6-bis) : Gtk.Dialog.run() et GtkMenuBar/GtkMenu (menu principal) trouvés déjà résolus, reparent() trouvé en code mort ; audit approfondi des menus contextuels (session-29.md, gtk4-migration.md §3.6-ter) : chantier plus large que prévu (4 menus applicatifs + 1 cas Gtk.Entry, items à état coché sans équivalent direct Gio.Menu, contenu dynamique par plugin) — proposition de cette session-là : popupMenuTab seul en premier (le plus simple des quatre menus). Précision de l'auteure (session-30, 2026-09-10) : RDP restera dans un plugin — son portage se fera en plugins/rdp/{core.py,gtk4.py} comme le pilote SSH, pas comme un traitement spécial du cœur (gtk4-migration.md §3.4). popupMenuTab effectivement porté le 2026-09-11 (session-31.md, gtk4-migration.md §3.6-quater) vers Gio.Menu/Gio.SimpleActionGroup/Gtk.Popover (widgets.TabContextMenu). popupMenuFolder effectivement porté le 2026-09-11 (session-32.md, gtk4-migration.md §3.6-quinquies) vers le même trio (widgets.FolderContextMenu). popupMenu effectivement porté le 2026-09-11 (session-33.md, gtk4-migration.md §3.6-sexies) vers le même trio (widgets.PopupMenu), sous-menu dynamique "Custom commands" et pont du menu hamburger (popup_commands_at()) compris — les 4 menus contextuels applicatifs de l'audit session-29 sont désormais tous portés. Audit du déclenchement Gtk.GestureClick fait le 2026-09-16 (session-38.md, gtk4-migration.md §3.6-septies) : 3 familles de sites réels recensées (on_terminal_click × 2, on_tvServers_button_press_event, NotebookTabLabel.popupmenu), confirmation que GtkGestureMultiPress(GTK3)/GtkGestureClick(GTK4) ne diffèrent que par leur nom (et la propriété area, inutilisée ici), mais que le signal pressed() ne transmet ni bouton ni modificateurs ni Gdk.Event (contrairement à button-press-event) — portage non trivial malgré le nom quasi identique. Proposition d'ordre posée sans la trancher : treeServers/popupMenuFolder en premier (seul sans branche modificateur clavier), on_terminal_click ensuite, l'étiquette d'onglet en dernier (seule à alimenter aussi le menu RDP/VNC/SPICE encore non porté). treeServers/popupMenuFolder effectivement porté le 2026-09-17 (session-39.md, gtk4-migration.md §3.6-octies) vers Gtk.GestureMultiPress (Wmain.on_tvServers_pressed), logique de clic extraite en fonction pure testable (gesture_trigger_core.py) ; correction apportée à l'audit session-38 en le faisant : get_current_event()/get_current_event_state() n'existent pas en GTK3 (ajouts GTK4), utiliser Gtk.Gesture.get_last_event(None) pour les deux sites restants ; Gtk.EventSequenceState.CLAIMED/comportement par défaut de Gtk.TreeView non vérifiable empiriquement dans cet environnement de travail, à confirmer manuellement. on_terminal_click effectivement porté le 2026-09-17 (session-40.md, gtk4-migration.md §3.6-nonies) vers Gtk.GestureMultiPress (Wmain.on_terminal_pressed, attaché via Wmain.attach_terminal_click_gesture() pour les 2 sites d'appel identiques), nouvelle fonction gesture_trigger_core.classify_terminal_click() (paramètre ctrl_pressed supplémentaire pour la branche Ctrl+clic, sans issue "swallow" pour préserver la sélection native de VTE), widgets.PopupMenu.popup_at() adapté (x/y), correction session-39 appliquée dès la conception ; Gtk.PropagationPhase.TARGET/sélection de texte native de Vte.Terminal non vérifiable empiriquement dans cet environnement de travail, à confirmer manuellement. L'étiquette d'onglet effectivement portée le 2026-09-17 (session-41.md, gtk4-migration.md §3.6-decies) vers Gtk.GestureMultiPress (NotebookTabLabel.on_label_pressed, geste construit directement dans __init__), nouvelle fonction gesture_trigger_core.classify_tab_label_click() (sans branche modificateur clavier ni issue "swallow", une même issue "open-menu" recouvrant deux menus distincts — bureau distant legacy ou TabContextMenu, choix laissé à l'appelant), widgets.TabContextMenu.popup_at() adapté (x/y), asymétrie Gtk.EventSequenceState.CLAIMED de l'ancien code reproduite fidèlement ; session-42.md, gtk4-migration.md §3.6-undecies) : terminologie corrigée (le widget est CellTextView/Gtk.TextView, pas Gtk.Entry — l'appellation « le cas Gtk.Entry/populate-popup » utilisée jusqu'ici dans ce document est donc inexacte), périmètre réel élargi de 1 à 4 signaux GTK3-only à porter (focus-out-event, key-press-event, populate-popup, button-press-event) ; aucun portage de code cette session-là, le cas populate-popup dépendant d'un comportement d'exécution GTK4 invérifiable empiriquement dans cet environnement de travail. key-press-event (premier des quatre signaux) effectivement porté le 2026-09-18 (session-43.md, gtk4-migration.md §3.6-duodecies) vers Gtk.EventControllerKey/key-pressed — même classe en GTK3 (≥ 3.24)/GTK4, seule la construction diffère ; logique extraite en fonction pure testable (inline_editor_core.py, 9 tests) ; nuance ajoutée à la proposition d'ordre : button-press-event (mécaniquement simple) et le couple focus-out-event/populate-popup (le plus risqué) ne se valent pas en risque, distinction absente de l'audit initial de la session-42. button-press-event (deuxième des quatre signaux) effectivement porté le 2026-09-18 (session-44.md, gtk4-migration.md §3.6-terdecies) vers Gtk.GestureMultiPress/pressed ; nouvelle fonction inline_editor_core.classify_editor_button_press(), qui ne branche sur aucun paramètre (l'ancien gestionnaire retournait inconditionnellement True) et renvoie toujours "claim" ; focus-out-event/populate-popup du point 4 (le plus risqué), plugins/ssh/gtk4.py, et RDP — plugins/ssh/gtk4.py fait le 2026-09-18 (session-45.md, gtk4-migration.md §3.7) : périmètre chiffré (3 fichiers GTK3, 4435 lignes, aucune encore portée), point Gtk.Dialog.run() déjà résolu ici aussi, six ruptures d'API distinctes recensées et vérifiées (show_all(), set_border_width(), Gtk.Clipboard, get_filename(), set_current_folder(), FileChooserDialog) — pas de portage cette session, plus une question d'architecture propre à ce chantier non tranchée (FileChooserDialog adapté vs. réécriture FileDialog) qui s'ajoute à l'ordre des trois chantiers toujours à confirmer avec l'auteure. Audit RDP fait le 2026-09-19 (session-46.md, gtk4-migration.md §3.8) : corrige §3.4 — plus de repli Gtk.Socket/XEmbed dans le code réellement chargé (disparu avec l'ancienne classe RdpEmbeddedTab, expliquant l'orphelin _rdp_socket_available noté en session-36) ; GtkFrdp.Display (widget natif GtkDrawingArea, aucune API X11 dans sa source) reste dépendant de GTK3 côté bibliothèque vendorisée (gtk-frdp/src/meson.build), statut GTK4 en amont toujours non confirmé malgré la migration GTK4/libadwaita tout juste terminée de GNOME Boxes (même mainteneur que gtk-frdp, mais qui ne documente que le remplacement de son widget SPICE par Libmks, jamais RDP) ; build_remote_desktop_context_menu() (RDP/VNC/SPICE) confirmé jamais porté, contrairement au résumé de session-33 ci-dessus. Les trois chantiers restants (couple focus-out-event/populate-popup, plugins/ssh/gtk4.py, RDP) sont désormais tous audités — |
Décider du sort de snmp_push_core.py |
Module complet (SFTP+FTP/TFTP, asyncio) mais non importé nulle part — plugin_snmp_push.py utilise snmp_bulk_core.py à la place ; deux implémentations parallèles de la même fonctionnalité coexistent — architecture.md §2.2-bis |
| Master password au démarrage | Chiffrement du trousseau local — sécurité. Logique de chiffrement faite (master_password_core.py, session-27, testée en isolation) ; reste à câbler dans gcm4_core.load_encryption_key()/initialise_encyption_key() et à écrire le prompt GTK au démarrage — nécessite une décision produit non tranchable seul : que faire en cas de mot de passe maître oublié (aucun mécanisme de recouvrement identifié, les mots de passe stockés deviennent alors définitivement inaccessibles) ? proposer la protection à l'activation seulement, ou la forcer ? — à confirmer avec l'auteure avant le câblage |
| SFTP (navigateur de fichiers, paramiko) | Aucune trace dans le code actuel, fonctionnalité de base attendue d'un gestionnaire de connexions |
| Renommage GCM → gcm4 (exécution réelle) | Décision de renommer actée (gtk4-migration.md §3.0) ; audit exhaustif + mécanisme générique de migration de config livrés et testés (session-30, docs/gcm4-rename.md) : 12 sites d'import réel du module principal, 29 occurrences du domaine i18n, .desktop, packaging (PKG_NAME), et gcm4_core.migrate_legacy_config_dir() (copie non destructrice, idempotente). Reste bloqué sur six choix de noms non tranchés (module, dossier de config, fichier de conf/clé, domaine i18n, id .desktop, PKG_NAME — tableau docs/gcm4-rename.md §6) plus la numérotation de version déjà connue comme ouverte — à confirmer avec l'auteure avant l'exécution réelle |
🟠 Urgence moyenne
| Évolution | Pourquoi |
|---|---|
| Terminal web xterm.js (#103) | Remplacement de VTE — dépend aussi des conclusions du portage GTK4 (gtk4-migration.md §3.2, VTE-GTK4) |
| Wayland natif (#104) | Recoupe directement gtk4-migration.md §3.4/§3.8 (RDP embarqué) — à traiter dans le même chantier que la migration GTK4 |
| API REST de contrôle GCM (#106) | Lancer des connexions / consulter l'état via HTTP |
🟢 Urgence faible
| Évolution | Pourquoi |
|---|---|
| Refactor MVC (#112) | Non commencé ; à envisager conjointement avec la migration GTK4 (gtk4-migration.md §3.3, stratégie B) plutôt que deux fois |
| Notifications desktop (#109) — volet restant : erreurs de connexion | Le volet « déconnexion » est fait (session-11.md) ; il reste à notifier les échecs de connexion (ex. authentification refusée, hôte injoignable), pas seulement leur fin normale. Pour les protocoles VTE (SSH/telnet/local/serial), un échec se termine aussi par child-exited (potentiellement déjà couvert, à vérifier au cas par cas selon le code de sortie) ; pour RDP/VNC/SPICE et les autres protocoles non-VTE, la fin de connexion ne passe pas par ce signal et n'a aujourd'hui aucun point d'accroche commun identifié — probablement un hook par plugin plutôt qu'un point central unique |
| Application mobile Android/iOS (#105) | Portage large, interface adaptée SSH/RDP/VNC — exploratoire |
| Partage de session multi-utilisateurs (#115) | Exploratoire |
| Multi-sélection et édition multiple d'hôtes | Modifier port/groupe en lot — vérifié (session-07.md) : treeServers n'utilise que get_selection().get_selected() (sélection simple) partout dans le code, aucun Gtk.SelectionMode.MULTIPLE ; item confirmé toujours ouvert |
| Icône system tray | Gtk.StatusIcon/libappindicator |
| Cluster : liste déroulante | Le masquage (#P=) et l'historique de commandes sont faits (session-06.md/session-12.md). Reste ouvert : une « liste déroulante » à côté de la zone de commandes cluster. widget.history) sous forme de menu déroulant plutôt que de défilement CTRL+haut/CTRL+bas. Deviner reviendrait à décider seul d'un choix de produit |
| Charset dynamique en console (par host) | — |
| Aide contextuelle | Tooltip / page d'aide intégrée |
Retirer/rendre optionnels les accélérateurs du .glade |
Obsolète (vérifié session-08.md) : il n'y a plus aucun fichier .glade/.ui dans le dépôt et aucun Gtk.AccelGroup/add_accelerator() nulle part dans le code. Tous les raccourcis passent par [shortcuts] dans gcm.ini, remappable, et désactivables en bloc (session-08.md) — l'item d'origine ne correspond plus à rien dans le code actuel |