Support minimum : Host, HostName, User, Port, IdentityFile, ProxyJump,
ForwardAgent, ServerAliveInterval, ServerAliveCountMax.
- app/openssh/config.py : load_openssh_hosts() lit ~/.ssh/config via
paramiko.SSHConfig (gere nativement les blocs "Host *" fusionnes, les alias
multiples sur une meme ligne Host, et l'expansion ~ des IdentityFile).
Fichier absent = liste vide, pas une erreur. session_from_openssh_host()
convertit un Host en Session PySSH (groupe "OpenSSH", cle si IdentityFile
presente sinon authentification auto).
- Nouvelle section "Configuration OpenSSH" dans le panneau lateral
(SessionController), sous Sessions SSH : double-clic ou menu contextuel pour
se connecter directement ou importer comme session (editeur pre-rempli,
ajustable avant enregistrement) ; rafraichissement via le menu ⚙ ou le menu
contextuel de l'hote.
- ConnectionController.open_openssh_host() ouvre une connexion directe sans
enregistrer de session, comme une connexion rapide.
Le ProxyJump est detecte, affiche (badge "· via <bastion>", tooltip) et reporte
dans les notes d'une session importee, mais pas encore applique automatiquement
a la connexion : ce sera l'objet de la Phase 3 (Bastion / Jump Host), qui
prendra en charge toutes ses sources (OpenSSH, session PySSH, config manuelle)
via un mecanisme commun.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
main_window.py concentrait la fenetre principale, l'arbre des sessions, les 4
classes d'onglets, la detection de commandes ssh et le multi-send : 983 lignes
et une seule classe qui pilotait toute l'application.
- app/services/ssh_target.py : detection d'une cible ssh dans un terminal (pur,
sans dependance Qt)
- app/ui/tabs.py : BaseTerminalTab / SessionTabWidget / SFTPTabWidget /
LocalTerminalTabWidget (deplaces tels quels)
- app/controllers/session_controller.py : panneau lateral (arbre sessions +
terminaux locaux) et CRUD des sessions
- app/controllers/connection_controller.py : cycle de vie des onglets
(ouverture, connexion rapide, renommage, fermeture)
- app/controllers/broadcast_manager.py : bouton et logique du mode Multi-Send
main_window.py ne fait plus que construire ces composants et les relier par
signaux (983 -> ~200 lignes). Comportement inchange ; MainWindow.tabs et
detect_ssh_target restent importables depuis app.main_window pour la
compatibilite avec les tests existants.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>