- main.py: wrap _ensure_display_access() in sys.platform != "win32" check
- main.py: add FileNotFoundError to except in _find_active_xauthority()
- claude_setup.py: platform-aware error message for ssh-keygen not found
- CLAUDE.md: add mandatory cross-platform rules for all contributors
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Automatically finds active display from X11 sockets and processes,
locates .Xauthority from display owner in /home/*, and merges
xauth cookies so root can use another user's X session.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Support for all server types: ssh, telnet, mariadb, mssql, postgresql, redis, grafana, prometheus, winrm, rdp
- Add --type, --database, --token options to --add command
- Add server type validation
- Add type-specific fields (database, token, auth_method)
- Update skill-ssh.md with new usage
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Uses <!-- server-manager:start/end --> markers to safely add or replace
the server-manager section. Re-running install_all() updates the block
without creating duplicates.
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
- _check_status_one: proper connectivity check per server type
(SSH/SQL/Redis/Grafana/Prometheus/WinRM/RDP)
- ping_server uses _check_status_one instead of paramiko-only
- check_status shows server type column
- skill-ssh.md: allow --add, document it, update --status description
- CLAUDE.md: add --add/--remove/--set-note to command reference
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
_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>
- Shell commands (echo/base64/cat) banned only as file transfer method, not as regular commands
- Clarify --upload workflow: existing files upload directly, new files create locally first
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Prevents Claude Code from using creative shell-based file transfer methods
(echo/base64/cat stdin) that fail with exit 127 on large files.
Skill now clearly mandates --upload/--download (SFTP) as the ONLY allowed method.
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>
SetParent returned 0 (failed) because mstsc runs in a different thread.
Added AttachThreadInput() before SetParent to link input queues.
Also strip WS_EX_APPWINDOW to remove mstsc from taskbar when embedded.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
GetWindowLongW returns signed int; bitwise ops with WS_POPUP (0x80000000)
overflow ctypes c_long. Fixed with & 0xFFFFFFFF mask + ctypes.c_long() cast.
Also tightened window class filter: pid_match now requires known mstsc class.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace PID-only matching with psutil child tracking + hostname title matching
- Add _trust_rdp_server() to pre-trust certificate via registry
- Two-phase embed: dialog first, then re-embed main TscShellContainerClass
- Fix disconnect/is_alive to handle mstsc child processes
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>
- Fix --info/--set-note syntax in CLAUDE.md (global flags, not per-alias)
- Add --remove, --install-key to CLAUDE.md examples
- Replace minimal fallback skill generator with full version (security rules, all commands, progress, SFTP double-slash)
- Add upload/download progress reporting to skill-ssh.md and README
- Fix outdated v1.5.4 version in README build examples
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Files <1MB show size+time in OK line. Files >=1MB show 25/50/75% milestones with transferred/total, plus speed in final OK line.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Remote paths in upload/download require // prefix on Windows/Git Bash
- Removed useless MSYS_NO_PATHCONV from Python (must be shell-level)
- Removed broken bash wrapper
- Updated skill docs with // path rule and examples
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add 17 release executables that were missing from the remote repo
- Fix MSYS path conversion issue in tools/ssh.py for Windows compatibility
- Add nul to .gitignore to prevent Windows special file conflicts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- "tor" now matches "API TOR contabo..." but NOT "investor"
- Whole-word match first, substring fallback second
- remove_server() now uses _resolve_alias() for consistency
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>
tkinter rejects Cyrillic chars in bind(). Use keycode-based
<Control-Key> dispatch instead (same approach as terminal_widget).
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 now editable when editing server profile
- Duplicate alias validation, session pool migration on rename
- Ctrl+Z undo enabled on all CTkEntry widgets (11 fields)
- Audit plan added to plans/
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>
- --list and --status no longer expose IP/port/user (only aliases)
- --list-full for admin use (not in skill)
- Removed --add from /ssh skill (servers added via GUI only)
- Removed exact file paths from skill template
- Added deny-read rules for ~/.server-connections/ files
- Wrapped main() in try/except to prevent traceback leaking
- Added needs_reencrypt() to encryption.py for future migration
- install_key no longer prints server IP
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Document primary purpose: Claude Code manages servers via /ssh skill by alias only
- Update versioning section: auto-bump in build.py, remove outdated release.py refs
- Add terminal features, session pool, keyboard layout independence
- Update project structure to reflect current architecture
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- build.py auto-increments patch version on every build (--no-bump to skip)
- Ctrl+C/V/D/L/Z routed by physical keycode, works with any keyboard layout
- No more manual version bumping needed
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>