_sql_val and _php_val were @staticmethod but called via self —
caused "takes 1 positional argument but 2 were given" error.
Converted to regular methods. All 16 formats tested OK.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Measure column widths from header and data (sample up to 100 rows)
- Clamp width: min 60px, max 400px per column
- Set stretch=False so columns don't compress to fit viewport
- Horizontal scrollbar now works when total column width exceeds view
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add HeidiSQL-style database tree panel (Databases → Tables → Columns)
- Lazy loading with ttk.Treeview, context menus, double-click SELECT TOP 1000
- Fix pymysql thread safety: serialize all DB ops with threading.Lock
- Use lock.acquire(timeout=10) to prevent deadlocks between tree and query threads
- Always reset _executing flag in finally block to prevent stuck queries
- Add _ensure_connected() auto-reconnect on broken connections
- Add sql_client check_connection() null safety
- Add 12 tree-related i18n keys (EN/RU/ZH)
- Clean up old releases
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add core/icons.py — centralized icon text helper with emoji/symbol support
- Add Windows SSH command sanitization in ssh.py (Linux→Windows auto-translation)
- Improve embedded RDP: launch tab connect/disconnect, fullscreen toggle
- Refactor sidebar: cleaner server type badges
- Update server_dialog: adaptive fields per server type
- Add setup_openssh.bat tool
- Update skill-ssh.md and CLAUDE.md docs for Windows SSH support
- Cleanup old releases, add v1.8.48-v1.8.52
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- try_reembed() now handles same-HWND reparent scenario (mstsc reconnect resets parent)
- is_embedded() checks GetParent(hwnd) == parent_hwnd every 500ms
- _monitor_tick() two-stage: is_alive() for process death, is_embedded() for window loss
- build.py auto-cleans old releases (keep first + last 5)
- Cleaned old releases from git
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Full implementation of multi-type server management across GUI and CLI:
New clients: SQLClient (MariaDB/MSSQL/PostgreSQL), RedisClient, GrafanaClient,
PrometheusClient, TelnetSession, WinRMClient, RemoteDesktopLauncher.
New GUI tabs: QueryTab (SQL editor + Treeview), RedisTab (console + history),
GrafanaTab (dashboards + alerts), PrometheusTab (PromQL + targets),
PowershellTab (PS/CMD), LaunchTab (RDP/VNC external client).
Infrastructure: TAB_REGISTRY for conditional tabs per server type,
adaptive server_dialog fields, colored type badges in sidebar,
status checker for all types (SSH/TCP/SQL/Redis/HTTP), 100+ i18n keys.
CLI: ssh.py extended with --sql, --redis, --grafana-*, --prom-*, --ps, --cmd.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Global keycode-based handler for Ctrl shortcuts (works with Russian, Chinese, any layout)
- Tkinter maps <<Paste>> to <Control-v> by keysym which fails on non-Latin layouts
- New handler intercepts <Control-Key> at 'all' level, checks keycodes and generates correct virtual events
- Added Undo/Redo support for Entry widgets (tk.Entry has no built-in undo)
- Tab switch focus management: terminal releases focus when switching away
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fully reverted sidebar, files_tab, totp_tab, server_dialog to v1.8.10
base. Removed all entry_undo bindings that broke Ctrl+V paste globally.
Only alias editing feature preserved (editable alias + rename support).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
tk.Entry has no built-in undo (unlike tk.Text), so _entry.config(undo=True)
crashed. Replaced with custom entry_undo.py that tracks history manually
and binds Ctrl+Z/Ctrl+Y (+ Russian layout support).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Alias field no longer disabled when editing server profile
- Duplicate alias check on rename, session pool migration
- Enable undo (Ctrl+Z) on all CTkEntry widgets across the project
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Strip ANSI escapes before sudo prompt detection
- Normalize \r\n/\r line endings for reliable matching
- 300ms delay before sending password (PTY settle time)
- Status bar feedback: "sudo: password sent automatically"
- Encode password explicitly as UTF-8
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Strip ANSI escape sequences before matching sudo prompt
- Normalize \r\n and \r to \n for reliable line splitting
- Add 200ms delay before sending password (let PTY settle)
- Increase buffer to 500 bytes for longer prompts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Tighten sudo auto-password to only match "[sudo] password for" in last line (fixes journalctl hang)
- Remove state="disabled" from terminal widget (fixes copy/paste on Windows)
- Copy: Ctrl+C (with selection), Ctrl+Shift+C, right-click menu
- Paste: Ctrl+V, Ctrl+Shift+V, right-click menu
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Terminal:
- Auto-detect [sudo] password prompts in interactive shell output
- Auto-send server password when sudo prompt detected
- Reset detection flag on new command (Enter key)
SSH client (SFTPSession):
- Fix exec_command() sudo password timing (0.1s delay for prompt)
- Fix listdir_attr_sudo() ls output parsing with proper maxsplit
- Handle filenames with spaces, symlinks, and varied ls formats
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Clear remote panel immediately when switching servers
- Add race condition guards in async SFTP connect/refresh
- Validate alias at each async callback to prevent stale UI updates
- Add switching_servers/disconnected/sftp_server_not_found i18n keys
- Properly handle connection results arriving after server switch
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Save complete pyte screen state (characters, colors, attributes,
cursor position, modes) via pickle serialization instead of just
plain text. Restore via direct buffer manipulation + full redraw.
Fixes broken/garbled layout when switching between servers.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Instead of unconditionally resetting the terminal, reused sessions
now restore the saved screen content from the session pool.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- SessionPool: LRU cache for SSH/SFTP sessions across server switches
- Sidebar: green dot indicators for servers with active sessions
- Sidebar: active sessions count label
- Terminal: buffer preservation on server switch via get_current_buffer()
- FilesTab/TerminalTab: pool integration for session reuse
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix infinite reconnect loop in terminal (_send_to_shell guard)
- Safe language switch: disconnect + reconnect instead of object transplant
- Improved SFTP reconnect flow with proper validation
- Add log.debug to all silent exception handlers in ssh_client
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add transport.set_keepalive(30) to all SSH connections
- Add SFTPSession.reconnect() method
- Auto-reconnect in _refresh_remote with retry on failure
- Auto-reconnect before upload/download operations
- Guard all remote navigation methods with connection checks
- ShellSession.connected wrapped in try/except
- Terminal: reset reconnect counter on send failure, increase max to 5
- Terminal: trigger reconnect on send to dead session
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- SFTP cleanup on app close and language switch
- Windows drive selector in local panel
- Browse and Refresh buttons for local panel
- Recursive upload/download/delete of folders
- Drag-and-drop between local and remote panels
- Sudo mode toggle for privileged file operations
- New i18n keys for EN/RU/ZH
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Content was clipped when window height was insufficient.
Now all sections are accessible via scroll.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Ctrl+wheel/Ctrl±/Ctrl+0 font zoom (6-28), persisted in settings.json
- Font fallback: Cascadia Mono → Consolas → Courier New (per platform)
- Visual "Copied!" flash in status bar on copy
- Closes audit items #27 (copy feedback) and #29 (font fallback)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- mc/vim/htop enable Application Cursor Mode (DECCKM ?1h) which
requires arrow keys to send \eOA..D instead of \e[A..D
- Detect DECCKM in pyte screen mode and send correct sequences
- Fix thread-safety: use queue.Queue for SSH→main thread data transfer
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Remove LNM mode that corrupted cursor positioning for TUI programs
- Add render debouncing (~60fps) to prevent UI thread blocking
- Add data batching in terminal tab to reduce render calls
- Increase SSH recv buffer from 4KB to 64KB
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add network interface selection per server (VPN/multi-NIC support)
- Fix "Install Everything" button hanging on error
- Add interactive SSH terminal with PTY (pyte + xterm-256color)
- Add release.py for automated versioning and changelog generation
- Add CLAUDE.md with project instructions
- Add screenshots and release binaries for v1.1–v1.4
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Click anywhere on the code area copies to clipboard
- Visual feedback: green flash + checkmark for 400ms
- Hand cursor on code frame, label, and timer
- Copy button still works as before
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
v1.2.0:
- GUI localization (EN/RU/ZH) with language switcher and persistent selection
- About dialog (ⓘ) with app info, features, quick start guide
- core/i18n.py — internationalization module with t() function
- All GUI components translated via t() keys
v1.3.0:
- TOTP/2FA tab — Google Authenticator compatible codes with live 30s countdown,
one-click copy, per-server secret management
- core/totp.py — TOTP module (pyotp, RFC 6238)
- core/logger.py — rotating file logger (5MB, 3 backups)
- Stronger Fernet encryption key with automatic migration from old key
- Thread-safe server store with locks, atomic writes, auto-restore on corruption
- Parallel status checks via ThreadPoolExecutor (up to 10 concurrent)
- SSH client: explicit channel cleanup, Unix key permissions
- Server dialog: port validation (1-65535), TOTP secret field
- Language change preserves active tab and server selection
- pyotp dependency added
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Shared servers.json at ~/.server-connections/ (GUI + Claude Code)
- Setup tab: one-click install of ssh.py, /ssh skill, SSH key
- Duplicate checks — safe to run multiple times
- tools/ssh.py + tools/skill-ssh.md bundled
- Updated README with integration docs (EN/RU/ZH)
- Deploy guide for new machines
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
CustomTkinter desktop app for managing remote servers.
Features: SSH terminal, SFTP file transfer, key management,
background status monitoring, server CRUD with dark theme.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>