Quick connect bar in toolbar parses user@host:port format with
auto-protocol detection (port 3389 -> RDP, default SSH:22).
Global keydown listener triggers command palette on Ctrl/Cmd+K.
MainLayout now integrates ThemePicker, ImportDialog, and
CommandPalette overlays.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Three-step import flow: file selection (click or drag-and-drop),
preview showing connection/group/host-key counts, and success
confirmation. Parses .mobaconf files client-side for preview;
actual import will use Wails binding.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ThemePicker modal shows all 7 built-in themes with 16-color ANSI
previews and a live prompt sample. StatusBar theme name is now
clickable to open the picker. Active theme is visually highlighted.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fuzzy-search modal searches across connections (name, hostname, tags)
and app actions (new SSH/RDP, open vault, settings, import). Supports
arrow-key navigation, Enter to execute, Esc to close. Dark themed
with quick fade-in animation.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Implements the plugin.Importer interface to parse MobaXTerm config
exports. Extracts SSH (#109#) and RDP (#91#) sessions from Bookmarks
sections, host keys from SSH_Hostkeys, and terminal colors from the
Colors section. Passwords are intentionally skipped (encrypted).
Tested against the real config export at docs/config-export.mobaconf.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Register RDPService on WraithApp with a mock backend factory and expose
it as a Wails service in main.go so the frontend can call RDP methods
via bindings. The factory will be swapped to a FreeRDP purego backend
when running on Windows.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add RdpView component with HTML canvas rendering via requestAnimationFrame
at ~30fps, mouse event capture (move, click, scroll) mapped to RDP flags,
and keyboard event capture with JS-to-scancode translation. Include toolbar
with keyboard grab toggle, clipboard sync toggle, and fullscreen button.
Add useRdp composable with mock frame generation (gradient + animated shapes)
matching the Go MockBackend pattern. Update SessionContainer to render
RdpView for RDP sessions instead of the Phase 4 placeholder.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add RDPService with session lifecycle management (connect, disconnect,
input forwarding, frame retrieval) using an injected backend factory.
Implement MockBackend that generates animated test frames with a
blue-purple gradient, bouncing color-cycling rectangle, pulsing circle,
and grid overlay for canvas renderer verification on macOS without
FreeRDP. The real FreeRDP purego bindings are deferred to Windows.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Define the RDPBackend interface, RDPConfig, and FrameUpdate types that
abstract FreeRDP behind a pluggable backend. Add PixelBuffer for shared
RGBA frame management with partial-update support and dirty tracking.
Implement full 104-key US keyboard scancode map (JS KeyboardEvent.code
to RDP hardware scancodes) with extended-key detection helpers and
mouse event flag constants matching MS-RDPBCGR.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add EditorWindow component with CodeMirror 6 using one-dark theme.
Detects language from file extension (js/ts/jsx/tsx, json, py, md)
via dynamic imports for code splitting. Features unsaved changes
indicator (yellow dot), Save button (TODO: SFTPService.WriteFile),
and Close button. Renders as an inline panel above the terminal.
File clicks in FileTree open the editor with mock content. Editor
re-creates when file path changes.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add HostKeyDialog modal with two modes: new host (informational with
blue accent) and changed key (warning with red accent). Shows
hostname, key type, and fingerprint in monospace. ConnectionTree
now has @dblclick handler that calls sessionStore.connect(). Session
store gains a connect() method that looks up the connection, checks
for existing sessions, and creates a mock session tab. Pre-loaded
mock sessions removed — sessions start empty and are created on
double-click.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add useSftp composable with mock directory listings, path navigation,
and refresh. FileTree component shows path bar, toolbar (upload,
download, new folder, refresh, delete icons), file entries with
icons, humanized sizes, and dates. TransferProgress component shows
expandable transfer list with progress bars. SidebarToggle now
uses v-model to emit tab changes. MainLayout switches between
ConnectionTree and FileTree based on sidebar tab, and includes
TransferProgress panel. File double-click emits openFile event
for the editor integration.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add useTerminal composable wrapping xterm.js with fit, search, and
web-links addons. TerminalView component mounts into a container div
and auto-fits on resize. SessionContainer now renders TerminalView
for SSH sessions using v-show to keep terminals alive across tab
switches. MobaXTerm Classic-inspired color theme. Data input and
resize events are placeholder TODOs for Wails SSHService bindings.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add SSHService, SFTPService, and CredentialService to the WraithApp
struct. SSH service uses a no-op output handler (Wails event emission
will be wired at runtime). CredentialService is created lazily after
vault unlock. Both SSH and SFTP services are registered with Wails
in main.go.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add Gitea Actions workflow that builds wraith.exe for Windows amd64,
signs it with an Azure Key Vault certificate via jsign, and uploads
the signed binary with a version.json manifest.
Also adds a `version` var to main.go for -ldflags injection at build time.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Three-panel layout with 240px sidebar, tabbed session area, and
status bar. Sidebar has Connections/SFTP toggle, search input, and
collapsible group tree with protocol-colored dots. Tab bar shows
active sessions with color-coded indicators and close buttons.
Status bar displays connection info, theme, encoding, and terminal
size. All backed by connection and session Pinia stores with mock
data until Wails bindings are connected.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add the unlock screen that gates entry to the main app. Includes
app store (unlocked state, firstRun flag), a centered dark-themed
unlock card with WRAITH branding, password validation for first-run
vault creation, and conditional rendering in App.vue.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Create WraithApp struct in internal/app that initializes SQLite,
runs migrations, seeds themes, and exposes vault management methods
(IsFirstRun, CreateVault, Unlock, IsUnlocked) to the frontend.
Register WraithApp, ConnectionService, ThemeService, and SettingsService
as Wails v3 bound services.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Claude Code integration as the first Wraith plugin: terminal I/O, SFTP
file access, CodeMirror handoff, and session context awareness. Proves
the plugin architecture and serves as the reference implementation.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Keyboard events now check if focus is on an input, textarea, select, or
contenteditable element and let the browser handle them normally. Also
fixes connectRdp type (Awaited<>) and async onMounted in RdpCanvas.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Frontend sends verifyId with host-key-accept so backend can correlate the
verification response. Backend tracks pre-ready connections in pendingClients
map, destroys on error/disconnect, and guards against calling verify() after
the connection has already timed out or errored (_destruct crash fix).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
63 tests across 8 spec files, all passing. Removes 2 stale stub files from
backend/test/ that were incompatible with the current async EncryptionService
and 3-argument AuthService constructor. New suite lives in src/ co-located
with source files per NestJS convention.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
28 tests across 4 spec files. Vitest + happy-dom configured with Nuxt auto-import
shims ($$fetch, navigateTo, defineNuxtRouteMiddleware) so stores and composables
resolve cleanly outside the Nuxt runtime.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Default protocol color strips on all host cards (wraith-blue for SSH, purple for RDP)
- Deterministic tag colors from 8-color palette (teal, amber, violet, rose, emerald, sky, orange, indigo)
- Last-connected recency coloring (green=today, amber=this week, gray=older)
- Section header dots (wraith-400 for Recent, gray for All Hosts)
- Active nav link highlighting (wraith-400)
- Group headers get subtle wraith-500 left border accent
- Tree host dots default to protocol color instead of gray
- Fixed rogue modal using hardcoded #1a1a2e/#e94560 — now uses design system
- Fixed sky-600 save buttons → wraith-600 for brand consistency
- Credential type badges: SSH Key=wraith, Password=amber (was purple/blue)
- Colored tags in right sidebar detail panel
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>