Config display modal now dims background content before showing, following the same pattern as delete confirmation modal. This provides visual consistency across all modals and makes it clear to users when a modal is active. Fixes: wg-admin-bfe
61 lines
77 KiB
JSON
61 lines
77 KiB
JSON
{"id":"wg-admin-0va","title":"Add configuration backup and rollback","description":"Create backup functions: backup_config() (creates timestamped backups), restore_config(), auto-backup before destructive operations (add, remove, install). Store backups in /etc/wg-admin/backups/ with retention policy (e.g., keep last 10).","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T16:27:53.161279119+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T16:44:03.357384383+01:00","closed_at":"2026-01-12T16:44:03.357384383+01:00","close_reason":"Implemented configuration backup and rollback functionality: added backup_config() function (creates timestamped backups in /etc/wg-admin/backups/), restore_config() function (interactive restore from backup), apply_retention_policy() (keeps last 10 backups), and auto-backup before destructive operations (install, add, remove commands)."}
|
|
{"id":"wg-admin-0wc","title":"Remove hardcoded sensitive information","description":"Identify and remove all hardcoded sensitive values from wireguard.sh. Replace with config file reads. Remove: SERVER_DOMAIN (velkhana.calmcacil.dev), VPN_IP_RANGES, any other identifiable information. Document config file structure in README.","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T16:27:53.158448895+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T16:43:08.224554317+01:00","closed_at":"2026-01-12T16:43:08.224554317+01:00","close_reason":"Removed all hardcoded sensitive information: SERVER_DOMAIN, VPN_IPV4_RANGE, VPN_IPV6_RANGE, DNS_SERVERS now configurable via /etc/wg-admin/config.conf. Added load_config() function. Created config.example template. Updated README with configuration documentation. All IP ranges in script now reference config variables."}
|
|
{"id":"wg-admin-11o","title":"Implement backup operations","description":"Create backup functionality that saves WireGuard configs, client configs, and metadata to /etc/wg-admin/backups/ with timestamp. Set proper permissions (600 for sensitive files).","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T17:03:30.288606376+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T18:06:07.405162631+01:00","closed_at":"2026-01-12T18:06:07.405162631+01:00","close_reason":"Backup operations implemented in internal/backup/backup.go. CreateBackup with timestamp, retention policy (last 10). ListBackups, RestoreBackup with validation. ReloadWireGuard after restore. Integration with client operations.","dependencies":[{"issue_id":"wg-admin-11o","depends_on_id":"wg-admin-wf1","type":"blocks","created_at":"2026-01-12T17:04:36.19397874+01:00","created_by":"Calmcacil"}]}
|
|
{"id":"wg-admin-1b0","title":"Add loading spinners for async operations (client creation, restore, QR generation)","description":"Add visual loading feedback using bubbles/spinner for long-running operations like client creation, backup restore, and QR code generation. Users cannot tell if application is working or frozen during these operations.","status":"open","priority":0,"issue_type":"feature","owner":"Calmcacil@Raion","created_at":"2026-01-12T21:39:36.103626542+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T21:39:36.103626542+01:00"}
|
|
{"id":"wg-admin-1b9","title":"Update documentation for refactored scripts","description":"Update README.md and all documentation to reflect new architecture. Document: wg-install.sh usage (interactive prompts, WGI_ env vars), wg-client-manager commands (add, remove, list, show, qr), environment variable reference, security hardening features, backup/restore procedures. Update examples with new patterns.","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T16:33:43.749727154+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T17:13:12.828613341+01:00","closed_at":"2026-01-12T17:13:12.828613341+01:00","close_reason":"Documentation updated on main branch. README.md reflects new wg-install.sh and wg-client-manager scripts, WGI_ environment variables, and all usage patterns.","dependencies":[{"issue_id":"wg-admin-1b9","depends_on_id":"wg-admin-slj","type":"blocks","created_at":"2026-01-12T16:33:56.00899014+01:00","created_by":"Calmcacil"}]}
|
|
{"id":"wg-admin-2oj","title":"Add screen transition animations for more polished UX","description":"Add brief fade or slide animations when switching screens for more polished feel. Current screen transitions are instant without feedback. Consider lipgloss positioning and tick-based transitions.","status":"open","priority":3,"issue_type":"feature","owner":"Calmcacil@Raion","created_at":"2026-01-12T21:40:48.821352971+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T21:40:48.821352971+01:00"}
|
|
{"id":"wg-admin-2pl","title":"Improve nftables firewall configuration","description":"Enhance firewall rules based on best practices: add TCP MSS clamping for MTU issues, add connection tracking bypass (notrack) for WireGuard traffic, implement proper rate limiting, ensure ICMPv6 neighbor discovery is allowed, validate rules before applying with nft check.","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T16:27:53.15783619+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T16:37:11.050440729+01:00","closed_at":"2026-01-12T16:37:11.050440729+01:00","close_reason":"Improved nftables firewall configuration with TCP MSS clamping (1360), connection tracking bypass (notrack) for WireGuard UDP traffic, rate limiting for SSH (3/min) and WireGuard (10/s), ensured ICMPv6 neighbor discovery (including nd-router-* messages), and added nft check validation before applying rules."}
|
|
{"id":"wg-admin-33z","title":"Standardize TUI formatting and styling across all windows and popups","description":"# Problem\n\nThe TUI application lacks consistent formatting and styling across all screens and components. Each screen defines its own styles independently, leading to:\n\n1. **Inconsistent color usage** - Different screens use different color codes for similar elements\n2. **Duplicated style definitions** - Common styles (titles, help text, borders) are redefined in each file\n3. **Inconsistent modal dimensions** - Hardcoded widths/heights vary across screens\n4. **Visual inconsistency** - Users experience different UI patterns across screens\n5. **Maintenance difficulty** - Changes require updating multiple files\n\n# Current Issues Found\n\n## Color Inconsistencies\n- **Titles**: Mostly Color(62), but variations exist\n- **Help text**: Color(241), Color(243), Color(63) used interchangeably\n- **Status colors**: Different approaches to styling connected/disconnected states\n- **Success messages**: Color(46) used, but not universally\n- **Error messages**: Color(196) used, but styling varies\n\n## Duplicated Style Definitions\nEach screen file has its own style variables:\n- detailTitleStyle, listTitleStyle, addTitleStyle, restoreTitleStyle, etc.\n- Similar styles for help, error, success messages\n- Border styles repeated across multiple files\n\n## Modal Inconsistencies\n- Confirm modal uses 80x24 dimensions\n- Delete confirm modal uses 80x24 dimensions\n- No centralized modal size configuration\n- Different border styles (RoundedBorder vs NormalBorder)\n\n## Table Styles\n- Table styles defined in both list.go and restore.go\n- Same header/selected styles duplicated\n- Should use shared table styling function\n\n# Proposed Solution\n\n## 1. Create Centralized Styles Package\n\nCreate internal/tui/styles/styles.go with:\n\n### Color Palette (Single Source of Truth)\nPrimary colors:\n- ColorPrimary (62) - Titles, primary actions\n- ColorSecondary (241) - Secondary text, labels\n- ColorAccent (57) - Selected items, highlights\n- ColorSuccess (46) - Success messages\n- ColorError (196) - Error messages\n- ColorWarning (226) - Warning messages\n- ColorInfo (243) - Help text, info\n- ColorKey (63) - Keyboard shortcuts\n- ColorBorder (240) - Borders\n- ColorBackground (235) - Modal backgrounds\n\n### Common Style Functions\nCreate reusable style functions:\n- Title() - For all screen titles\n- Help() - For help text and instructions\n- Error() - For error messages\n- Success() - For success messages\n- Warning() - For warning messages\n- Key() - For keyboard shortcuts\n- Modal(width, height) - Consistent modal styling\n- TableHeader() - Table headers\n- TableSelected() - Selected table rows\n- BorderRounded() - Rounded borders\n- BorderNormal() - Normal borders\n\n### Modal Dimensions\nDefine constants:\n- ModalWidth = 80\n- ModalHeight = 24\n\n## 2. Refactor Each Screen to Use Centralized Styles\n\n### Files to Update\n- internal/tui/screens/list.go - Use shared table styles\n- internal/tui/screens/detail.go - Replace local styles with package imports\n- internal/tui/screens/add.go - Use shared title/help styles\n- internal/tui/screens/help.go - Use shared key/label styles\n- internal/tui/screens/qr.go - Use shared title/help/error styles\n- internal/tui/screens/restore.go - Use shared table/modal styles\n\n### Components to Update\n- internal/tui/components/confirm.go - Use shared modal styles\n- internal/tui/components/delete-confirm.go - Use shared modal styles\n- internal/tui/components/search.go - Use shared color palette\n\n## 3. Implementation Approach\n\n### Phase 1: Create Styles Package\n- Create internal/tui/styles/ directory\n- Implement styles.go with color palette and common functions\n- Add table.go for table-specific styles\n\n### Phase 2: Update Components First\n- Update confirm.go and delete-confirm.go to use shared modal styles\n- Update search.go to use shared color palette\n- Test components work correctly\n\n### Phase 3: Update Screens\n- Refactor each screen to import and use styles package\n- Replace local style variables with calls to styles package\n- Test each screen maintains functionality\n\n### Phase 4: Verification\n- Test navigation across all screens\n- Verify consistent visual appearance\n- Check modal sizes and positioning\n- Verify color usage is consistent\n\n# Success Criteria\n\n1. All screens use consistent color palette from single source\n2. No duplicated style definitions across files\n3. Modals have consistent dimensions and styling\n4. Table styling is shared across list and restore screens\n5. Help text, errors, success messages use consistent styles\n6. All keyboard shortcuts use same styling\n7. Code is more maintainable (style changes in one place)\n\n# Files to Create\n- internal/tui/styles/styles.go\n- internal/tui/styles/table.go (optional, could be in styles.go)\n\n# Files to Modify\n- internal/tui/screens/list.go\n- internal/tui/screens/detail.go\n- internal/tui/screens/add.go\n- internal/tui/screens/help.go\n- internal/tui/screens/qr.go\n- internal/tui/screens/restore.go\n- internal/tui/components/confirm.go\n- internal/tui/components/delete-confirm.go\n- internal/tui/components/search.go\n\n# Dependencies\nNone - this is a refactoring task that improves code organization without adding new functionality.","status":"open","priority":1,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T22:19:57.96243735+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T22:21:53.810905089+01:00"}
|
|
{"id":"wg-admin-37o","title":"Add security hardening","description":"Implement: client name sanitization with regex, pre-shared key (PSK) support option, proper temporary key cleanup with trap handlers, atomic config file operations (write to temp then mv), chmod 0600 for all key files, verify no hardcoded secrets in generated files.","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T16:27:53.148392501+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T16:44:11.582485544+01:00","closed_at":"2026-01-12T16:44:11.582485544+01:00","close_reason":"Implemented all security hardening features: client name sanitization with regex (validate_client_name function), pre-shared key (PSK) support with --psk option, proper temporary key cleanup with trap handlers (cleanup_handler), atomic config file operations (mktemp + mv), chmod 0600 for all key files, and verified no hardcoded secrets (keys generated dynamically or read from files)"}
|
|
{"id":"wg-admin-3d4","title":"Implement configuration loading system","description":"Implement configuration system to load /etc/wg-admin/config.conf using native Go or Viper library. Support environment variable overrides. Validate required config (SERVER_DOMAIN, WG_PORT, VPN_IPV4_RANGE, VPN_IPV6_RANGE, DNS_SERVERS). Provide clear error messages for missing config.","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T17:02:57.198865993+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T17:21:51.863786437+01:00","closed_at":"2026-01-12T17:21:51.863786437+01:00","close_reason":"Configuration system implemented in internal/config/config.go. Loads from /etc/wg-admin/config.conf, supports environment variable overrides with WGI_ prefix, validates required fields (SERVER_DOMAIN, WG_PORT, CIDR formats). Provides helper methods for network extraction.","dependencies":[{"issue_id":"wg-admin-3d4","depends_on_id":"wg-admin-4ji","type":"blocks","created_at":"2026-01-12T17:04:44.279588181+01:00","created_by":"Calmcacil"}]}
|
|
{"id":"wg-admin-4fb","title":"Set up basic TUI skeleton with Bubble Tea","description":"Create main TUI application entry point implementing Bubble Tea's Model-Update-View pattern. Set up root check and logging. Create empty screen types (list, add, detail, qr, help). Implement basic keyboard navigation (q=quit). Add status bar with version and help shortcut (?).","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T17:02:57.195332445+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T17:29:25.376578103+01:00","closed_at":"2026-01-12T17:29:25.376578103+01:00","close_reason":"TUI skeleton implemented with Model-Update-View pattern. Main entry point in cmd/wg-tui/main.go with root check, configuration loading integration, basic keyboard navigation (q quit), status bar with version and help. Creates clean separation between TUI model (internal/tui) and main program. Successfully builds.","dependencies":[{"issue_id":"wg-admin-4fb","depends_on_id":"wg-admin-4ji","type":"blocks","created_at":"2026-01-12T17:04:26.666043249+01:00","created_by":"Calmcacil"},{"issue_id":"wg-admin-4fb","depends_on_id":"wg-admin-3d4","type":"blocks","created_at":"2026-01-12T17:04:26.672887205+01:00","created_by":"Calmcacil"}]}
|
|
{"id":"wg-admin-4ji","title":"Initialize Go module and project structure","description":"Initialize Go project with go mod init. Create directory structure following plan: cmd/, internal/config, internal/wireguard, internal/tui (screens, components, theme), internal/validation, internal/backup. Add README with project setup instructions.","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T17:02:57.197740013+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T17:20:34.471816058+01:00","closed_at":"2026-01-12T17:20:34.471816058+01:00","close_reason":"Go module initialized, directory structure created (cmd/, internal/ subdirectories), dependencies added (bubbletea, lipgloss, bubbles, huh, qrterminal), basic TUI skeleton with Model-Update-View pattern implemented. Root check added. Builds successfully.","dependencies":[{"issue_id":"wg-admin-4ji","depends_on_id":"wg-admin-gp4","type":"blocks","created_at":"2026-01-12T17:04:26.670875524+01:00","created_by":"Calmcacil"}]}
|
|
{"id":"wg-admin-55x","title":"Add connection quality indicators (Excellent/Good/Fair/Poor) based on handshake time","description":"Currently only shows Connected/Disconnected. Add connection quality indicators based on handshake recency: Excellent (\u003c30s), Good (\u003c2m), Fair (\u003c5m), Poor (\u003e5m). This provides more informative feedback about connection health.","status":"open","priority":2,"issue_type":"feature","owner":"Calmcacil@Raion","created_at":"2026-01-12T21:40:23.26708921+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T21:40:23.26708921+01:00"}
|
|
{"id":"wg-admin-69b","title":"Implement WireGuard client parsing","description":"Parse WireGuard client configuration files from /etc/wireguard/conf.d/client-*.conf. Extract client name, IPv4, IPv6, public key, and PSK status. Create Client struct. Handle file read errors and malformed configs. Validate config syntax.","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T17:02:57.199808074+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T17:39:44.913242962+01:00","closed_at":"2026-01-12T17:39:44.913242962+01:00","close_reason":"Client struct created in internal/wireguard/client.go with fields: Name, IPv4, IPv6, PublicKey, HasPSK, ConfigPath. ParseClientConfig() parses [Peer] sections from config files. ListClients() scans /etc/wireguard/conf.d/ for client-*.conf files. Handles errors gracefully.","dependencies":[{"issue_id":"wg-admin-69b","depends_on_id":"wg-admin-4fb","type":"blocks","created_at":"2026-01-12T17:04:44.265421971+01:00","created_by":"Calmcacil"}]}
|
|
{"id":"wg-admin-7ra","title":"Fix help screen documentation - incorrect key binding for viewing details","description":"Help screen shows '[D]' key for viewing client details, but actual access is via 'Enter' key. Update help documentation to show correct keybinding.","status":"open","priority":0,"issue_type":"bug","owner":"Calmcacil@Raion","created_at":"2026-01-12T21:39:36.098716455+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T21:39:36.098716455+01:00"}
|
|
{"id":"wg-admin-abw","title":"Create wg-client-manager script","description":"Create new wg-client-manager script for client operations: add, remove, list, show, qr. Implement proper command parsing, use interactive 'read' with 'WGI_' environment variable overrides, call validation functions, use atomic config updates.","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T16:27:53.150007325+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T16:48:38.86400169+01:00","closed_at":"2026-01-12T16:48:38.86400169+01:00","close_reason":"Created wg-client-manager script with all required commands (add, remove, list, show, qr). Implements interactive prompts with WGI_ environment variable overrides, uses validation functions, and performs atomic config updates.","dependencies":[{"issue_id":"wg-admin-abw","depends_on_id":"wg-admin-cwb","type":"blocks","created_at":"2026-01-12T16:28:20.280054863+01:00","created_by":"Calmcacil"},{"issue_id":"wg-admin-abw","depends_on_id":"wg-admin-37o","type":"blocks","created_at":"2026-01-12T16:28:20.299310073+01:00","created_by":"Calmcacil"},{"issue_id":"wg-admin-abw","depends_on_id":"wg-admin-lzl","type":"blocks","created_at":"2026-01-12T16:28:20.300924186+01:00","created_by":"Calmcacil"},{"issue_id":"wg-admin-abw","depends_on_id":"wg-admin-wsk","type":"blocks","created_at":"2026-01-12T16:28:20.354270061+01:00","created_by":"Calmcacil"},{"issue_id":"wg-admin-abw","depends_on_id":"wg-admin-0va","type":"blocks","created_at":"2026-01-12T16:28:21.926811217+01:00","created_by":"Calmcacil"}]}
|
|
{"id":"wg-admin-az7","title":"Fix client details navigation and improve deletion confirmation UX","description":"\n# Issues to Fix\n\n## 1. Navigation Key Binding Issues\n- **Problem**: 'q' key for going back from client details screen doesn't work properly\n- **Solution**: \n - Change 'q' key to 'b' for back navigation (more intuitive)\n - Add 'esc' key binding for back navigation (in addition to 'b')\n - Update help text to reflect new key bindings\n\n## 2. Deletion Confirmation UX Improvements\n- **Problem**: Current confirmation modal has poor formatting and lacks safety checks\n- **Solution**:\n - **Improve modal formatting**: Better visual styling, clearer layout\n - **Add name verification**: Require user to type the client's name before confirming deletion (prevents accidental deletions)\n - Better visual feedback for selected option (Yes/No)\n\n# Files to Modify\n\n1. **internal/tui/screens/detail.go**\n - Line 124: Change key binding from 'q' to 'b'\n - Line 124: Add 'esc' to back navigation (ensure it works)\n - Line 199: Update help text to show new key bindings\n - Lines 127-134: Replace simple confirm modal with name-verification modal\n\n2. **internal/tui/components/confirm.go** (or create new component)\n - Improve modal styling and formatting\n - Add text input field for client name verification\n - Update key bindings for name input field\n\n# Implementation Notes\n\n- The confirm modal currently uses simple Yes/No with arrow keys\n- New approach: Show \"Type the client name to confirm: [input field]\"\n- Only enable confirm button when input matches client name exactly\n- Case-sensitive name matching for safety\n- Add clear visual feedback (red for danger, green for match)\n","status":"closed","priority":0,"issue_type":"bug","owner":"Calmcacil@Raion","created_at":"2026-01-12T22:13:28.830300356+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T22:16:47.251848171+01:00","closed_at":"2026-01-12T22:16:47.251848171+01:00","close_reason":"Fixed navigation key bindings (changed 'q' to 'b', added 'esc') and created improved deletion confirmation modal with name verification for safety."}
|
|
{"id":"wg-admin-bay","title":"Implement real-time status checking","description":"Implement real-time connection status using 'wg show wg0' command. Check if client public key appears in peers list. Update status in table: Connected (active peer) or Disconnected (not in peers list). Add auto-refresh every 30 seconds using tea.Tick. Manual refresh with 'r' key.","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T17:02:57.643693952+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T17:34:23.96887044+01:00","closed_at":"2026-01-12T17:34:23.96887044+01:00","close_reason":"Implemented real-time status checking functionality: Created status.go with GetClientStatus() and GetAllPeers() functions that parse 'wg show wg0' output to determine connection status. Added PeerStatus struct with PublicKey, Endpoint, AllowedIPs, LatestHandshake, TransferRx, TransferTx, and Status fields. Created tea_messages.go with Tick() command for auto-refresh and ManualRefresh() command for immediate refresh using tea.Tick and custom messages. Status is 'Connected' if handshake is within 3 minutes, otherwise 'Disconnected'.","dependencies":[{"issue_id":"wg-admin-bay","depends_on_id":"wg-admin-xum","type":"blocks","created_at":"2026-01-12T17:04:44.270454474+01:00","created_by":"Calmcacil"}]}
|
|
{"id":"wg-admin-bfe","title":"Fix background dimming on modal overlays","description":"# Fix Background Dimming on Modal Overlays\n\n## Problem\n\nBackground content is not properly dimmed when certain modal windows are displayed. This causes visual inconsistency and makes it unclear that a modal is active.\n\n## Current State\n\n### Working Modals (Background Dimmed)\n\n**Delete Confirmation Modal** (`detail.go` line 144-157):\n```go\nif s.showConfirm \u0026\u0026 s.confirmModal != nil {\n // Render underlying content dimmed\n content := s.renderContent()\n dimmedContent := lipgloss.NewStyle().\n Foreground(lipgloss.Color(\"244\")).\n Render(content)\n\n // Overlay confirmation modal\n return lipgloss.JoinVertical(\n lipgloss.Left,\n dimmedContent,\n s.confirmModal.View(),\n )\n}\n```\n\n**Restore Confirmation Modal** (`restore.go` line 147-160):\n```go\nif s.showConfirm \u0026\u0026 s.confirmModal != nil {\n // Render underlying content dimmed\n content := s.renderContent()\n dimmedContent := lipgloss.NewStyle().\n Foreground(lipgloss.Color(\"244\")).\n Render(content)\n\n // Overlay confirmation modal\n return lipgloss.JoinVertical(\n lipgloss.Left,\n dimmedContent,\n s.confirmModal.View(),\n )\n}\n```\n\n### Broken Modals (Background NOT Dimmed)\n\n**Config Display Modal** (`detail.go` line 139-141):\n```go\n// Handle config display modal\nif s.showConfig \u0026\u0026 s.configDisplay != nil {\n return s.configDisplay.View() // BUG: No background dimming!\n}\n```\n\n**Delete Confirm Modal Component** (`internal/tui/components/delete-confirm.go`):\n- The modal renders directly to screen\n- Does NOT dim background content\n- Assumes parent screen will handle dimming\n\n**Old Confirm Modal Component** (`internal/tui/components/confirm.go`):\n- The modal renders directly to screen\n- Does NOT dim background content\n- Assumes parent screen will handle dimming\n\n## Root Cause\n\n1. **Inconsistent Implementation**: Some screens dim background in their View() method, others don't\n2. **Modal Components Don't Dim**: Modal components (ConfigDisplay, Confirm, DeleteConfirm) don't dim background themselves\n3. **Screens Rely on Parents**: Modal components assume parent screens will handle dimming, but this's inconsistent\n\n## Impact\n\n1. **Visual Inconsistency**: Some modals dim background, others don't\n2. **Poor UX**: Users can't tell if a modal is active or just new content\n3. **Confusion**: It's unclear whether content is part of the modal or background\n4. **Accessibility**: Dimming helps focus attention on the modal; without it, focus is unclear\n\n## Proposed Solution\n\n### Option 1: Modals Dim Their Own Background (Recommended)\n\nEach modal component should be responsible for:\n1. Taking screen width/height as parameters\n2. Rendering full screen content (dimmed background + modal overlay)\n3. This makes modals self-contained and consistent\n\n**Implementation:**\n```go\n// In ConfigDisplayModel View()\nfunc (m *ConfigDisplayModel) View() string {\n if !m.Visible {\n return \"\"\n }\n\n // Dimmed background content would need to be passed in\n // OR modal takes a \"background\" parameter to render\n\n // For now, this approach may not work without refactoring\n // See Option 2 below\n}\n```\n\n### Option 2: Screens Handle Dimming for ALL Modals (Current Pattern)\n\nUpdate screens to dim background for ALL modals consistently:\n\n**detail.go** - Already handles delete confirmation, needs to add for config display:\n```go\nif s.showConfig \u0026\u0026 s.configDisplay != nil {\n // Render underlying content dimmed\n content := s.renderContent()\n dimmedContent := lipgloss.NewStyle().\n Foreground(lipgloss.Color(\"244\")).\n Render(content)\n\n // Overlay config modal\n return lipgloss.JoinVertical(\n lipgloss.Left,\n dimmedContent,\n s.configDisplay.View(),\n )\n}\n```\n\n**This is the easiest fix** - just follow the existing pattern!\n\n## Files to Fix\n\n### High Priority (Fix Background Dimming)\n\n1. **`internal/tui/screens/detail.go`** (line 139-141)\n - Add background dimming for config display modal\n - Follow same pattern as delete confirmation modal\n\n2. **`internal/tui/components/confirm.go`**\n - Note: This component is used by restore screen\n - Restore screen already handles dimming correctly\n - No changes needed\n\n3. **`internal/tui/components/delete-confirm.go`**\n - Note: This component is used by detail screen\n - Detail screen already handles dimming correctly\n - No changes needed\n\n## Implementation Steps\n\n### Step 1: Fix Config Display Modal in detail.go\n\n**Change from:**\n```go\nif s.showConfig \u0026\u0026 s.configDisplay != nil {\n return s.configDisplay.View()\n}\n```\n\n**To:**\n```go\nif s.showConfig \u0026\u0026 s.configDisplay != nil {\n // Render underlying content dimmed\n content := s.renderContent()\n dimmedContent := lipgloss.NewStyle().\n Foreground(lipgloss.Color(\"244\")).\n Render(content)\n\n // Overlay config display modal\n return lipgloss.JoinVertical(\n lipgloss.Left,\n dimmedContent,\n s.configDisplay.View(),\n )\n}\n```\n\n### Step 2: Verify All Modals\n\nCheck that all modals follow consistent pattern:\n1. Delete confirmation modal (detail.go) ✓ Already correct\n2. Config display modal (detail.go) ✗ Needs fix\n3. Restore confirmation modal (restore.go) ✓ Already correct\n\n## Expected Behavior\n\nAfter fix:\n1. Config display modal dims background content (color 244)\n2. Modal is clearly visible on top of dimmed background\n3. User understands they're interacting with a modal\n4. Visual consistency across all modals\n\n## Testing\n\n1. Open client details\n2. Press 'c' to view config\n3. Verify background content is dimmed\n4. Verify modal is clearly visible\n5. Close modal and verify normal view returns\n\n## Dependencies\n\nNone - this is a UI consistency fix\n\n## Priority\n\n**CRITICAL (P0)** - Visual consistency is important for UX","status":"open","priority":0,"issue_type":"bug","owner":"Calmcacil@Raion","created_at":"2026-01-12T22:38:54.028354228+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T22:43:24.402405243+01:00"}
|
|
{"id":"wg-admin-cwb","title":"Implement input validation functions","description":"Create robust validation functions: validate_client_name() (regex check for [a-zA-Z0-9_-]), validate_ip_availability(), validate_dns_servers(), validate_port_range(), validate_config_syntax(). Add validation before client creation and config changes.","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T16:27:53.143579452+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T16:38:18.705584126+01:00","closed_at":"2026-01-12T16:38:18.705584126+01:00","close_reason":"Implemented all validation functions: validate_client_name(), validate_ip_availability(), validate_dns_servers(), validate_port_range(), validate_config_syntax(). Added validation calls in cmd_add and cmd_load_clients."}
|
|
{"id":"wg-admin-dd2","title":"Implement client detail view","description":"Create detailed view for selected client showing name, IPs, public key, connection status, last handshake time, and transfer stats. Include copy to clipboard functionality and delete button with confirmation.","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T17:03:30.290544009+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T17:54:27.63729296+01:00","closed_at":"2026-01-12T17:54:27.63729296+01:00","close_reason":"Implemented client detail view in internal/tui/screens/detail.go with all required features: displays client name, IPs, public key, connection status, handshake time, transfer stats; copy to clipboard (press 'c'), delete with confirmation (press 'd'), navigation back (press 'q' or 'esc'); styling with lipgloss in two-column layout; integrated with wireguard.GetClientStatus() for real-time status.","dependencies":[{"issue_id":"wg-admin-dd2","depends_on_id":"wg-admin-wf1","type":"blocks","created_at":"2026-01-12T17:04:52.968940596+01:00","created_by":"Calmcacil"}]}
|
|
{"id":"wg-admin-ddl","title":"Debug connectivity status showing Disconnected incorrectly","description":"Debug why connectivity status shows 'Disconnected' when client is actually connected. Investigate the finalizePeerStatus logic and the 3-minute threshold for connection status.","status":"closed","priority":1,"issue_type":"bug","owner":"Calmcacil@Raion","created_at":"2026-01-12T19:14:49.564914056+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T19:17:12.292551145+01:00","closed_at":"2026-01-12T19:17:12.292551145+01:00","close_reason":"Fixed q key handling to only quit from list screen, increased connection timeout threshold to 5 minutes"}
|
|
{"id":"wg-admin-dho","title":"Fix 'q' key to go back to list instead of quitting app","description":"Fix key handling in detail screen so 'q' returns to list instead of quitting the entire application. Currently pressing 'q' in detail view closes the app entirely.","status":"closed","priority":1,"issue_type":"bug","owner":"Calmcacil@Raion","created_at":"2026-01-12T19:14:49.562771127+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T19:17:12.284907523+01:00","closed_at":"2026-01-12T19:17:12.284907523+01:00","close_reason":"Fixed q key handling to only quit from list screen, increased connection timeout threshold to 5 minutes"}
|
|
{"id":"wg-admin-e07","title":"Implement Dracula color scheme theme","description":"Add Dracula color scheme to the theme registry. Use the official Dracula color palette: Background #282A36, Primary (purple) #BD93F9, Success (green) #50FA7B, Warning (orange) #FFB86C, Error (red) #FF5555, Muted #6272A4.","status":"closed","priority":1,"issue_type":"feature","owner":"Calmcacil@Raion","created_at":"2026-01-12T19:07:40.305419584+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T19:08:50.621690085+01:00","closed_at":"2026-01-12T19:08:50.621690085+01:00","close_reason":"Implemented Dracula and Everforest color schemes and set Everforest as default theme"}
|
|
{"id":"wg-admin-ee9","title":"Add text selection and copy capability to terminal UI","description":"# Add Text Selection and Copy Capability to Terminal UI\n\n## Problem\n\nUsers need to copy text from the TUI application, but text selection and copying functionality is limited or non-existent. Users cannot control which text gets selected when dragging over it with the mouse.\n\n## Current State\n\n### Terminal Selection Behavior\n- **Mouse selection is terminal-controlled**: The terminal emulator, not the application, controls text selection\n- **No programmatic control**: Applications can't specify which text is selectable\n- **Selection mode varies**: Different terminals have different selection behavior (word, line, block, etc.)\n- **Copy varies**: Copy mechanism depends on terminal/OS combination\n\n### Current Application Support\n- **No clipboard integration**: The app has no clipboard access library\n- **Removed clipboard feature**: We replaced \"Copy Public Key\" with config display modal\n- **Scrollable modals**: Config display and other modals are scrollable but text can still be selected\n\n## Terminal Limitations\n\n### What We CAN'T Control\n\n1. **Selection boundaries**: Can't specify which text is selectable\n2. **Selection mode**: Can't force word/line/block selection\n3. **Copy action**: Can't programmatically trigger copy\n4. **Selection persistence**: Can't control how long selection persists\n5. **Multi-selection**: Can't control multiple selection regions\n\n### What We CAN Control\n\n1. **Text content**: We control what text is displayed\n2. **Visual highlighting**: We can highlight specific text regions\n3. **Copy buttons**: We can add \"copy\" functionality (but requires clipboard API)\n4. **Alternative outputs**: We can export/save content in other ways\n\n## Proposed Solutions\n\n### Option 1: Add Explicit Copy Buttons (Easiest)\n\nAdd copy buttons in modals that use clipboard API:\n\n**For Config Display Modal:**\n- Add \"[C] Copy Full Config\" action\n- Copy entire config to system clipboard\n- Works over SSH with X11 forwarding if available\n\n**Implementation:**\n```go\n// In ConfigDisplayModel Update()\ncase \"c\", \"C\":\n return m, func() tea.Msg {\n return ConfigCopiedMsg{Content: m.config}\n }\n```\n\n**In Detail Screen:**\n```go\ncase ConfigCopiedMsg:\n // Show feedback\n s.configCopied = true\n```\n\n### Option 2: Add Export Feature\n\nAdd ability to export configuration to file:\n\n**For Config Display Modal:**\n- Add \"[S] Save to File\" action\n- Save config to specified path or default location\n- Useful for manual setup and backups\n\n**Implementation:**\n```go\n// In ConfigDisplayModel Update()\ncase \"s\", \"S\":\n return m, func() tea.Msg {\n err := os.WriteFile(s.configPath, m.config, 0644)\n if err != nil {\n return errMsg{err: err}\n }\n return ConfigSavedMsg{Path: s.configPath}\n }\n```\n\n### Option 3: Add Clipboard Library with SSH Support\n\nUse a clipboard library that works over SSH with X11 forwarding:\n\n**Library Option 1: atotto/clipboard**\n```go\nimport \"github.com/atotto/clipboard\"\n\nfunc (m *ConfigDisplayModel) copyToClipboard() {\n err := clipboard.WriteAll(m.config)\n return err\n}\n```\n\n**Works with:**\n- Local sessions (full clipboard access)\n- SSH with X11 forwarding (ssh -X)\n- WSL sessions (Windows Subsystem for Linux)\n\n**Limitations:**\n- Doesn't work over plain SSH\n- Requires X11 or Wayland server access\n\n### Option 4: Improve Documentation on Terminal Selection\n\nAdd help text explaining how to select and copy text:\n\n**Add to Config Display Modal:**\n```\nHelp: ↑/↓ scroll • g/G top/bottom • Esc to close\n\nCopy Instructions:\n• Drag mouse over text to select (depends on terminal)\n• Copy with terminal-specific shortcut (Ctrl+Shift+C or Cmd+C)\n• Or press [C] to copy to clipboard (if available)\n```\n\n**Platform-specific:**\n- **Linux/WSL**: Ctrl+Shift+C (usually)\n- **macOS**: Cmd+C (in Terminal.app)\n- **Windows**: Click right or use terminal copy feature\n- **SSH**: Depends on local terminal, not remote app\n\n### Option 5: Add Highlighted Text Markers (Advanced)\n\nAllow users to mark/select text for copying:\n\n**Features:**\n- Arrow keys move cursor through text\n- Space key marks/unmarks text position\n- Visual indicators show selected region\n- Option to copy marked text\n\n**Complexity:** High - Requires tracking cursor position and selections\n\n## Recommended Approach\n\n**Start with Option 1 (Explicit Copy Button)**\n\n1. Add clipboard library: `github.com/atotto/clipboard`\n2. Add \"Copy to Clipboard\" action in Config Display Modal\n3. Show confirmation when copy succeeds\n4. Handle errors when clipboard unavailable (gracefully degrade)\n5. Document which platforms support clipboard over SSH\n\n**Then consider Option 2 (Export to File)**\n\n1. Add \"Save to File\" action\n2. Use default path or prompt for path\n3. Show success/error feedback\n4. Useful for backups and manual setup\n\n## Implementation Details\n\n### Add Clipboard Library\n\n**Add to go.mod:**\n```bash\ngo get github.com/atotto/clipboard\n```\n\n**Import:**\n```go\nimport \"github.com/atotto/clipboard\"\n```\n\n### Update ConfigDisplay Component\n\n**Add to ConfigDisplayModel:**\n```go\n// Add field for tracking\nclipboardCopied bool\nclipboardTimer int\n```\n\n**Add to Update() method:**\n```go\ncase \"c\", \"C\":\n // Copy full config to clipboard\n err := clipboard.WriteAll(m.config)\n if err != nil {\n return m, func() tea.Msg {\n return errMsg{err: fmt.Errorf(\"clipboard error: %w\", err)}\n }\n }\n m.clipboardCopied = true\n return m, nil\n```\n\n**Add to View() method:**\n```go\n// Show clipboard confirmation\nif m.clipboardCopied {\n helpText += \"\\n\" + successStyle.Render(\"✓ Configuration copied to clipboard!\")\n}\n```\n\n**Add to help text:**\n```\nHelp: ↑/↓ scroll • g/G top/bottom • [C] Copy to Clipboard • Esc close\n```\n\n## Platform Compatibility\n\n### Clipboard Support\n\n| Platform | Library Support | Notes |\n|----------|----------------|-------|\n| Linux (native) | ✓ Works | X11/Wayland required |\n| WSL | ✓ Works | Windows clipboard access |\n| macOS | ✓ Works | Native macOS clipboard |\n| SSH (plain) | ✗ No | X11 forwarding required |\n| SSH (-X flag) | ✓ Works | Uses local clipboard |\n\n### Workarounds for SSH\n\n**If clipboard doesn't work:**\n1. Use terminal selection (mouse drag)\n2. Use terminal copy shortcut\n3. Export to file instead\n4. Use scp/sftp to copy config files directly\n\n## Files to Modify\n\n1. **`go.mod`** - Add clipboard library dependency\n2. **`internal/tui/components/config-display.go`**\n - Add clipboard copy functionality\n - Add visual feedback for copy\n - Update help text\n3. **`internal/tui/screens/detail.go`**\n - Handle clipboard copied messages\n - Show confirmation feedback\n\n## Success Criteria\n\n1. Press 'C' in config modal copies full config to clipboard (when available)\n2. Visual feedback shows \"✓ Configuration copied to clipboard!\"\n3. Graceful degradation when clipboard unavailable\n4. Works on macOS, Linux, WSL\n5. Documented limitations for SSH sessions\n\n## Dependencies\n\n- `github.com/atotto/clipboard` - Cross-platform clipboard access\n\n## Priority\n\n**MEDIUM (P2)** - Improves UX but workarounds exist (terminal selection)","status":"open","priority":2,"issue_type":"feature","owner":"Calmcacil@Raion","created_at":"2026-01-12T22:38:54.083153165+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T22:43:24.556791119+01:00"}
|
|
{"id":"wg-admin-ej7","title":"Implement color themes","description":"Add support for color themes using lipgloss. Create default theme with primary, success, warning, and error colors. Support theme switching through config file or environment variable.","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T17:03:30.290145203+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T17:48:32.299616088+01:00","closed_at":"2026-01-12T17:48:32.299616088+01:00","close_reason":"Color themes implemented with Theme package. Three built-in themes (default, dark, light) with ColorScheme support. THEME config option and environment variable support added to config.go. Lipgloss styles use theme colors.","dependencies":[{"issue_id":"wg-admin-ej7","depends_on_id":"wg-admin-xum","type":"blocks","created_at":"2026-01-12T17:04:53.269323117+01:00","created_by":"Calmcacil"}]}
|
|
{"id":"wg-admin-gp4","title":"Create Go TUI epic","description":"Epic: Convert wg-client-manager bash script to a modern, responsive Go TUI application using Bubble Tea framework. Provides better UX with interactive forms, real-time status updates, and intuitive keyboard navigation.","status":"closed","priority":1,"issue_type":"feature","owner":"Calmcacil@Raion","created_at":"2026-01-12T17:03:30.286393088+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T18:06:58.972856627+01:00","closed_at":"2026-01-12T18:06:58.972856627+01:00","close_reason":"All Go TUI tasks completed across 6 phases:\n\nPhase 1 (Foundation): Project init, config system, TUI skeleton\nPhase 2 (Client List): Parsing, table, real-time status \nPhase 3 (Add Client): Form, key generation, config files\nPhase 4 (Detail/Delete): Detail view, delete functionality, QR codes\nPhase 5 (UX): Search, help screen, color themes\nPhase 6 (Backup/Restore): Backup operations, restore functionality\n\nImplementation details:\n- Total packages added: bubbletea, lipgloss, bubbles, huh, qrterminal\n- Files created: 25+ Go source files\n- All features implemented: CRUD clients, status checking, QR codes, themes, search, backup/restore\n- Build successful with ~6MB binary\n- All tasks closed and synced to remote\n\nApplication ready for testing and deployment."}
|
|
{"id":"wg-admin-gw9","title":"Add search and filter clients","description":"Implement client search functionality with keyboard shortcut (/). Allow filtering by client name, IP address, or status. Highlight matching results in real-time as user types.","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T17:03:30.285733479+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T18:06:07.246176563+01:00","closed_at":"2026-01-12T18:06:07.246176563+01:00","close_reason":"Search component implemented in internal/tui/components/search.go. Real-time filtering by name, IP, or status with '/' activation. Filter types cycle with Tab. Match count display. Integrated with list screen to dynamically update client table.","dependencies":[{"issue_id":"wg-admin-gw9","depends_on_id":"wg-admin-xum","type":"blocks","created_at":"2026-01-12T17:04:36.200521151+01:00","created_by":"Calmcacil"}]}
|
|
{"id":"wg-admin-hd4","title":"Add keyboard shortcuts help","description":"Create help screen displaying all keyboard shortcuts. Show on '?' key press or in status bar. Include shortcuts for navigation (j/k, arrows), actions (a=add, d=delete, q=quit), and help (?).","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T17:03:30.283054325+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T17:48:32.156575557+01:00","closed_at":"2026-01-12T17:48:32.156575557+01:00","close_reason":"Help screen implemented with keyboard shortcuts table organized by category. Shows on ? key or status bar. Navigation, actions, and other shortcuts documented with lipgloss styling.","dependencies":[{"issue_id":"wg-admin-hd4","depends_on_id":"wg-admin-xum","type":"blocks","created_at":"2026-01-12T17:04:53.117669255+01:00","created_by":"Calmcacil"}]}
|
|
{"id":"wg-admin-he6","title":"Reduce status refresh interval from 10 to 3 seconds for better real-time awareness","description":"Currently connection status refreshes every 10 seconds which is too slow for real-time awareness. Reduce interval to 3 seconds and add 'Last updated: X ago' indicator so users know when data was last refreshed.","status":"open","priority":1,"issue_type":"bug","owner":"Calmcacil@Raion","created_at":"2026-01-12T21:40:04.503637878+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T21:40:04.503637878+01:00"}
|
|
{"id":"wg-admin-hln","title":"Improve empty state messages with actionable guidance and call-to-action","description":"When no clients exist or search returns no results, provide clear guidance on next steps. Add tips like 'Press [a] to add your first client', 'Check spelling', 'Try shorter search term'. Make empty states welcoming and helpful.","status":"open","priority":1,"issue_type":"feature","owner":"Calmcacil@Raion","created_at":"2026-01-12T21:40:04.504693809+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T21:40:04.504693809+01:00"}
|
|
{"id":"wg-admin-hzl","title":"Add visual status icons (● Online/● Offline) for better scanning","description":"Connection status is currently just text ('Connected'/'Disconnected'). Add visual indicators with colored circles/icons for faster scanning. Green ● for connected, red ● for disconnected. This improves visual hierarchy and scanability.","status":"open","priority":1,"issue_type":"feature","owner":"Calmcacil@Raion","created_at":"2026-01-12T21:40:04.554974884+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T21:40:04.554974884+01:00"}
|
|
{"id":"wg-admin-iqs","title":"Add navigation breadcrumbs to all screens for context","description":"Currently no breadcrumbs or navigation context in screens. Users can't tell where they are in the navigation hierarchy (list \u003e details, add \u003e form). Add breadcrumb at top of each screen showing navigation path.","status":"open","priority":2,"issue_type":"feature","owner":"Calmcacil@Raion","created_at":"2026-01-12T21:40:23.210874178+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T21:40:23.210874178+01:00"}
|
|
{"id":"wg-admin-jho","title":"Integrate theme system across all screens","description":"The theme system (internal/tui/theme/theme.go) with StylePrimary, StyleSuccess, StyleError is fully implemented but all screens hardcode colors instead. Replace hardcoded colors with theme references for consistency and to enable theme switching functionality.","status":"open","priority":0,"issue_type":"feature","owner":"Calmcacil@Raion","created_at":"2026-01-12T21:39:36.098683097+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T21:39:36.098683097+01:00"}
|
|
{"id":"wg-admin-k3q","title":"Implement Everforest color scheme theme","description":"Add Everforest color scheme to the theme registry. Use the Everforest dark variant: Background #272e33, Primary (blue) #7fbbb3, Success (green) #a7c080, Warning (yellow) #dbbc7f, Error (red) #e67e80, Muted #414b50.","status":"closed","priority":1,"issue_type":"feature","owner":"Calmcacil@Raion","created_at":"2026-01-12T19:07:40.303542104+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T19:08:50.629948797+01:00","closed_at":"2026-01-12T19:08:50.629948797+01:00","close_reason":"Implemented Dracula and Everforest color schemes and set Everforest as default theme"}
|
|
{"id":"wg-admin-ka8","title":"Generate QR codes for clients","description":"Generate ANSI-colored QR codes from client configs using qrterminal library. Support both inline and fullscreen QR display modes. Handle terminal resize events for optimal QR rendering.","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T17:03:30.273562645+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T17:48:32.013388859+01:00","closed_at":"2026-01-12T17:48:32.013388859+01:00","close_reason":"QR code display implemented using qrterminal. Supports inline and fullscreen modes with f toggle. Handles terminal resize events. Returns to list on q/Esc.","dependencies":[{"issue_id":"wg-admin-ka8","depends_on_id":"wg-admin-wf1","type":"blocks","created_at":"2026-01-12T17:04:36.203581002+01:00","created_by":"Calmcacil"}]}
|
|
{"id":"wg-admin-kfs","title":"Create configuration file format for WireGuard settings","description":"Design and implement /etc/wg-admin/config file to replace hardcoded values. Include: SERVER_DOMAIN, WG_PORT, VPN_IPV4_RANGE, VPN_IPV6_RANGE, WG_INTERFACE, DNS_SERVERS, and other configurable parameters. Support both file-based and environment variable override.","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T16:27:53.148859434+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T16:31:29.339557739+01:00","closed_at":"2026-01-12T16:31:29.339557739+01:00","close_reason":"Config file approach replaced with interactive prompts using 'read', with 'WGI_' prefixed environment variable overrides. No persistent config file needed."}
|
|
{"id":"wg-admin-lzl","title":"Add improved error handling and traps","description":"Implement: EXIT trap for cleanup on script interruption, pre-install validation (disk space, port availability, root check), rollback mechanism for failed operations, better error messages with actionable guidance, log all operations with timestamps.","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T16:27:53.154445252+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T16:44:11.575490008+01:00","closed_at":"2026-01-12T16:44:11.575490008+01:00","close_reason":"Implemented all error handling and trap features: EXIT trap for cleanup (cleanup_handler catches EXIT,INT,TERM,HUP), pre-install validation (pre_install_validation checks disk space, port availability, root), rollback mechanism (rollback_installation function with BACKUP_DIR), better error messages with actionable guidance (all errors include specific fix suggestions), and logging with timestamps (log_info, log_error, log_warn functions)"}
|
|
{"id":"wg-admin-nyp","title":"Add keyboard shortcut discoverability hints on each screen","description":"Show available keyboard shortcuts on each screen in footer or help overlay. Users currently must remember or check help. Display context-sensitive shortcuts based on current screen and current state (e.g., when search is active).","status":"open","priority":3,"issue_type":"feature","owner":"Calmcacil@Raion","created_at":"2026-01-12T21:40:48.826752641+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T21:40:48.826752641+01:00"}
|
|
{"id":"wg-admin-o4o","title":"Implement WireGuard key generation","description":"Implement WireGuard key generation using wg genkey and wg pubkey commands. Generate client private key, public key, and optional pre-shared key (PSK). Ensure atomic file writes and proper permissions (0600).","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T17:03:30.283256646+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T17:51:24.471200438+01:00","closed_at":"2026-01-12T17:51:24.471200438+01:00","close_reason":"Implemented WireGuard key generation in internal/wireguard/keys.go with GeneratePrivateKey(), GeneratePublicKey(), GeneratePSK(), GenerateKeyPair(), StoreKey(), LoadKey(), ValidateKey(), and CleanupTempKeys() functions. Uses wg genkey, wg pubkey, and wg genpsk commands with atomic writes (temp file + mv) and 0600 permissions. Includes key validation (44 base64 chars) and temp key tracking for cleanup. Package builds successfully.","dependencies":[{"issue_id":"wg-admin-o4o","depends_on_id":"wg-admin-wod","type":"blocks","created_at":"2026-01-12T17:04:52.815358118+01:00","created_by":"Calmcacil"}]}
|
|
{"id":"wg-admin-onv","title":"Enhance search with match highlighting, count display, Ctrl+U to clear","description":"Improve search component with: highlight matching text in results, show number of matches found, add Ctrl+U shortcut to clear search, Tab to cycle filter types. Better filtering experience with clear exit from search mode.","status":"open","priority":3,"issue_type":"feature","owner":"Calmcacil@Raion","created_at":"2026-01-12T21:40:48.818862183+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T21:40:48.818862183+01:00"}
|
|
{"id":"wg-admin-p3o","title":"Set Everforest as default theme","description":"Change the default theme from 'default' to 'everforest' in the GetTheme function. This will make Everforest the default when no THEME environment variable is set.","status":"closed","priority":1,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T19:07:40.302533502+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T19:08:50.637133192+01:00","closed_at":"2026-01-12T19:08:50.637133192+01:00","close_reason":"Implemented Dracula and Everforest color schemes and set Everforest as default theme"}
|
|
{"id":"wg-admin-p6q","title":"Test theme switching functionality","description":"Test theme switching by setting THEME environment variable to different values (dracula, everforest, default, dark, light) and verify that the TUI renders with correct colors.","status":"closed","priority":1,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T19:07:40.33610722+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T19:10:22.227831273+01:00","closed_at":"2026-01-12T19:10:22.227831273+01:00","close_reason":"Documentation updated with theme options, build successful, theme switching logic verified"}
|
|
{"id":"wg-admin-q0x","title":"Research and document Dracula/Everforest color schemes","description":"Research and document the official color specifications for Dracula and Everforest color schemes. Extract hex values for primary, success, warning, error, and muted colors to use in the TUI theme implementation.","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T19:07:40.305301935+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T19:08:01.204915996+01:00","closed_at":"2026-01-12T19:08:01.204915996+01:00","close_reason":"Research completed - documented Dracula and Everforest color specifications with hex values for implementation"}
|
|
{"id":"wg-admin-qpy","title":"Refactor installation into wg-install.sh","description":"Extract install logic from wireguard.sh into dedicated wg-install.sh script. Handle: dependency checks, package installation, firewall setup (nftables), server key generation, interface initialization, systemd service setup. Use interactive 'read' prompts for settings with 'WGI_' prefixed environment variable overrides.","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T16:27:53.151817177+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T16:50:42.168393277+01:00","closed_at":"2026-01-12T16:50:42.168393277+01:00","close_reason":"Created wg-install.sh script with complete installation logic extracted from wireguard.sh. Script includes dependency checks, package installation, nftables firewall setup, server key generation, interface initialization, and systemd service setup. Uses interactive prompts with WGI_ prefixed environment variable overrides. All validation and error handling maintained with atomic operations and proper cleanup. Test suite (test-wg-install.sh) created with 35 tests all passing.","dependencies":[{"issue_id":"wg-admin-qpy","depends_on_id":"wg-admin-37o","type":"blocks","created_at":"2026-01-12T16:28:20.30398105+01:00","created_by":"Calmcacil"},{"issue_id":"wg-admin-qpy","depends_on_id":"wg-admin-wsk","type":"blocks","created_at":"2026-01-12T16:28:20.305872992+01:00","created_by":"Calmcacil"},{"issue_id":"wg-admin-qpy","depends_on_id":"wg-admin-0wc","type":"blocks","created_at":"2026-01-12T16:28:27.88358441+01:00","created_by":"Calmcacil"},{"issue_id":"wg-admin-qpy","depends_on_id":"wg-admin-cwb","type":"blocks","created_at":"2026-01-12T16:28:27.890595849+01:00","created_by":"Calmcacil"},{"issue_id":"wg-admin-qpy","depends_on_id":"wg-admin-2pl","type":"blocks","created_at":"2026-01-12T16:28:27.948214112+01:00","created_by":"Calmcacil"}]}
|
|
{"id":"wg-admin-qtb","title":"Replace clipboard copy with config display window for SSH sessions","description":"# Replace Clipboard Copy with Configuration Display\n\n## Problem\n\nThe TUI application currently has a \"Copy Public Key\" feature (press 'c' in detail screen) that doesn't work over SSH sessions. When running the application remotely via SSH:\n\n1. **Clipboard access is not available** - SSH sessions don't provide clipboard functionality\n2. **Feature is non-functional** - Users cannot copy public keys or configuration\n3. **Workaround required** - Users must manually locate and read config files\n4. **Poor UX** - No easy way to get client configuration for use\n\n## Current Implementation\n\nThe detail screen has a `copyPublicKey()` function that:\n- Returns `clipboardCopiedMsg` message\n- Shows \"Public key copied to clipboard!\" feedback\n- Uses no actual clipboard library (not implemented)\n- Is completely non-functional over SSH\n\n## Proposed Solution\n\nReplace the clipboard copy feature with a **Configuration Display Modal** that:\n\n### 1. Shows Full Client Configuration\n- Displays complete WireGuard client configuration file\n- Includes all sections: [Interface] and [Peer]\n- Shows keys, IPs, endpoints, and all configuration options\n- Useful for:\n - Copying configuration to other devices\n - Manual configuration setup\n - Troubleshooting and debugging\n - Sharing with other users\n\n### 2. Scrollable Content\n- Uses Bubble Tea viewport component for scrolling\n- Supports keyboard navigation:\n - ↑/k - Line up\n - ↓/j - Line down\n - pgup/b - Page up\n - pgdown/f - Page down\n - g - Go to top\n - G - Go to bottom\n- Handles long configurations gracefully\n\n### 3. SSH-Friendly\n- Modal displays text directly on screen\n- Users can select and copy text with mouse in terminal\n- Works in any terminal emulator over SSH\n- No clipboard API required\n\n### 4. Easy to Close\n- Esc key closes modal\n- q key closes modal\n- Returns to detail screen\n\n## Implementation Details\n\n### New Component: ConfigDisplayModal\n\nCreated `internal/tui/components/config-display.go` with:\n\n**Features:**\n- Displays full client configuration in styled modal\n- Scrollable viewport for long content\n- Rounded border with title \"📋 Client Configuration\"\n- Help text at bottom with navigation instructions\n- Centered on screen with proper positioning\n\n**Key Bindings:**\n```\n↑/j - Scroll down\n↓/k - Scroll up\npgup/b - Page up\npgdn/f - Page down\ng - Go to top\nG - Go to bottom\nEsc/q - Close modal\n```\n\n### Updated Detail Screen\n\nChanged `internal/tui/screens/detail.go`:\n\n**Removed:**\n- `clipboardCopied` field from DetailScreen struct\n- `clipboardTimer` field from DetailScreen struct\n- `copyPublicKey()` function\n- `clipboardCopiedMsg` type\n- Clipboard timeout handling logic\n- \"✓ Public key copied to clipboard!\" display\n\n**Added:**\n- `configDisplay *components.ConfigDisplayModel` field\n- `showConfig bool` field\n- `loadConfig()` function that:\n - Loads client configuration via `wireguard.GetClientConfigContent()`\n - Creates config display modal\n - Shows modal with loaded content\n- Config display modal handling in Update() method\n- Config display modal rendering in View() method\n\n**Changed:**\n- Key handler for 'c': Now calls `loadConfig()` instead of `copyPublicKey()`\n- Help text: Changed from \"[c] Copy Public Key\" to \"[c] View Config\"\n\n## Benefits\n\n1. **Works over SSH** - No clipboard API needed\n2. **More useful** - Shows full configuration, not just public key\n3. **Better UX** - Scrollable, easy to read and select\n4. **Flexible** - Users can copy any part of the configuration\n5. **No external dependencies** - Pure terminal-based solution\n\n## Use Cases\n\n### Scenario 1: User needs config for manual setup\n1. Open client details\n2. Press 'c' to view config\n3. Select and copy full configuration text\n4. Paste into configuration file on target device\n\n### Scenario 2: Troubleshooting\n1. Open client details\n2. Press 'c' to view config\n3. Compare with working configuration\n4. Identify differences or issues\n\n### Scenario 3: Sharing configuration\n1. Open client details\n2. Press 'c' to view config\n3. Select config content\n4. Copy and share with other users/admins\n\n## Files Created\n\n- `internal/tui/components/config-display.go` - Configuration display modal component\n\n## Files Modified\n\n- `internal/tui/screens/detail.go`\n - Updated DetailScreen struct\n - Replaced copyPublicKey with loadConfig\n - Added config display handling\n - Updated help text\n\n## Technical Notes\n\n- Uses Bubble Tea viewport for scrolling\n- Leverages existing `wireguard.GetClientConfigContent()` function\n- Modal styled with lipgloss (rounded border, consistent colors)\n- Viewport dimensions: 76x24 (content area)\n- Modal dimensions: 80x24 (with borders and padding)\n\n## Testing Considerations\n\n- Test with long configuration files (ensure scrolling works)\n- Test with various terminal sizes (ensure modal centers correctly)\n- Test over SSH session (ensure text is selectable/copyable)\n- Test with mouse-enabled terminals (verify selection works)","status":"closed","priority":1,"issue_type":"feature","owner":"Calmcacil@Raion","created_at":"2026-01-12T22:30:26.291472155+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T22:36:25.862565024+01:00","closed_at":"2026-01-12T22:36:25.862565024+01:00","close_reason":"Implemented config display modal to replace non-functional clipboard copy. Users can now view full client configuration in a scrollable window that works over SSH sessions. Press 'c' in detail screen to view config."}
|
|
{"id":"wg-admin-rfo","title":"CRITICAL: Cannot exit client details screen - navigation broken","description":"# CRITICAL BUG - Cannot exit screens\n\n## Problem\n\nUser is unable to navigate back from certain screens in the TUI. When opening client details or restore screens, pressing the back key ('b' or 'esc') does nothing, forcing the user to kill the process from a separate terminal.\n\n## Root Cause\n\nThe screen Update() method returns `(Screen, tea.Cmd)` tuple. When a screen wants to signal \"go back to previous screen\", it should return `(nil, tea.Cmd)` as the first value.\n\nHowever, both `detail.go` and `restore.go` were incorrectly returning `(s, nil)` instead of `(nil, nil)` when the back key was pressed. This caused the main model's navigation logic to never detect the screen change:\n\n```go\n// In main.go line 107:\nif newScreen == nil { // This check fails because newScreen == s, not nil\n // Go back to previous screen\n m.currentScreen = m.previousScreen\n m.previousScreen = nil\n}\n```\n\n## Issues Found\n\n### detail.go (line 116)\n**Before:**\n```go\ncase \"b\", \"esc\":\n // Return to list screen - signal parent to switch screens\n return s, nil // BUG: Returns current screen, not nil\n```\n\n**After:**\n```go\ncase \"b\", \"esc\":\n // Return to list screen - signal parent to switch screens\n return nil, nil // FIXED: Returns nil to signal screen change\n```\n\n### restore.go (line 101)\n**Before:**\n```go\ncase \"q\", \"esc\":\n // Return to list screen - signal parent to switch screens\n return s, nil // BUG: Returns current screen, not nil\n```\n\n**After:**\n```go\ncase \"q\", \"esc\":\n // Return to list screen - signal parent to switch screens\n return nil, nil // FIXED: Returns nil to signal screen change\n```\n\n## Impact\n\n- Users get trapped in detail and restore screens\n- Cannot return to main list screen\n- Must kill process and restart application\n- Critical usability issue\n\n## Fix Applied\n\nChanged both occurrences from `return s, nil` to `return nil, nil` to properly signal the main model to switch back to the previous screen.\n\n## Verification\n\n- Build successful with no errors\n- Navigation logic now correctly detects nil return value\n- Screen switching works as expected\n\n## Files Modified\n\n- `internal/tui/screens/detail.go` - Line 116\n- `internal/tui/screens/restore.go` - Line 101","status":"closed","priority":0,"issue_type":"bug","owner":"Calmcacil@Raion","created_at":"2026-01-12T22:22:51.43957087+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T22:27:03.641284763+01:00","closed_at":"2026-01-12T22:27:03.641284763+01:00","close_reason":"Fixed navigation bug by changing 'return s, nil' to 'return nil, nil' in detail.go and restore.go. Both screens now correctly signal main model to switch back to previous screen when back key is pressed."}
|
|
{"id":"wg-admin-slj","title":"Refactor WireGuard scripts into modular architecture","description":"Refactor monolithic wireguard.sh into two separate scripts: wg-install.sh for initial setup, wg-client-manager for client operations. Use interactive 'read' prompts with 'WGI_' prefixed environment variable overrides. Add validation functions, security hardening, and remove all hardcoded sensitive information from repository.","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T16:27:18.232667092+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T17:11:02.639140093+01:00","closed_at":"2026-01-12T17:11:02.639140093+01:00","close_reason":"Refactoring complete: wg-install.sh (921 lines) and wg-client-manager (545 lines) scripts have been created and are functional. wireguard.sh retained for backwards compatibility.","dependencies":[{"issue_id":"wg-admin-slj","depends_on_id":"wg-admin-abw","type":"blocks","created_at":"2026-01-12T16:28:21.930404739+01:00","created_by":"Calmcacil"},{"issue_id":"wg-admin-slj","depends_on_id":"wg-admin-qpy","type":"blocks","created_at":"2026-01-12T16:28:21.936380993+01:00","created_by":"Calmcacil"},{"issue_id":"wg-admin-slj","depends_on_id":"wg-admin-0wc","type":"blocks","created_at":"2026-01-12T16:28:21.983754904+01:00","created_by":"Calmcacil"}]}
|
|
{"id":"wg-admin-ti0","title":"Investigate q key behavior and parseHandshake bug","description":"Investigate q key behavior causing app to not return properly from client details. parseHandshake fix has been committed separately.","status":"open","priority":1,"issue_type":"bug","owner":"Calmcacil@Raion","created_at":"2026-01-12T19:26:35.435240285+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T19:27:21.412723919+01:00"}
|
|
{"id":"wg-admin-tv6","title":"Add client delete functionality","description":"Implement delete client workflow with confirmation modal. Remove client config from server, delete client files, auto-backup before deletion, and reload WireGuard configuration.","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T17:03:30.281557572+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T17:48:31.867154638+01:00","closed_at":"2026-01-12T17:48:31.867154638+01:00","close_reason":"Delete with confirmation modal implemented. Auto-backup before deletion, removes client configs and peer from WireGuard. Integrated with detail screen.","dependencies":[{"issue_id":"wg-admin-tv6","depends_on_id":"wg-admin-dd2","type":"blocks","created_at":"2026-01-12T17:04:36.207822184+01:00","created_by":"Calmcacil"}]}
|
|
{"id":"wg-admin-u4f","title":"Research handshake timing discrepancy in wg show vs app","description":"Research why wg show wg0 shows different handshake timing than the app. Found that parseHandshake function only parses first time unit (e.g., '14 hours' from '14 hours, 24 minutes, 40 seconds ago'), ignoring subsequent units causing significant time discrepancy.","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T19:14:02.054350138+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T19:14:09.570320895+01:00","closed_at":"2026-01-12T19:14:09.570320895+01:00","close_reason":"Research complete - identified parseHandshake only parsing first time unit in compound expressions"}
|
|
{"id":"wg-admin-v7g","title":"Fix search box functionality on main client list screen","description":"# Fix Search Box Functionality\n\n## Problem\n\nThe search box on the main client list screen is not working properly. Users press '/' to activate search, but the functionality does not work as expected.\n\n## Current Implementation\n\nIn `internal/tui/screens/list.go`:\n\n**Activation (lines 55-59):**\n```go\nif msg.String() == \"/\" \u0026\u0026 !s.search.IsActive() {\n s.search.Activate()\n return s, nil\n}\n```\n\n**Search Active Handling (lines 61-67):**\n```go\nif s.search.IsActive() {\n s.search, cmd = s.search.Update(msg)\n // Apply filter to clients\n s.applyFilter()\n return s, cmd\n}\n```\n\n**View Rendering (line 135):**\n```go\nreturn s.search.View() + \"\\n\" + s.table.View()\n```\n\n## Possible Issues\n\n### 1. Search Not Focusing Input\nThe search component may not be properly setting input focus when activated.\n\n### 2. Table Not Rebuilding After Filter\nThe `applyFilter()` function may not be properly rebuilding the table with filtered results.\n\n### 3. Keyboard Event Handling\nSearch input may not be receiving keyboard events properly when active.\n\n### 4. Search Component Internal Issues\nThe SearchModel component in `internal/tui/components/search.go` may have bugs:\n- Input not updating\n- Filter not applying correctly\n- Active state not being tracked properly\n\n## Investigation Needed\n\n1. **Test search activation**: Verify pressing '/' actually activates search\n2. **Test search input**: Verify typing characters updates search input field\n3. **Test filtering**: Verify filtering actually filters the client list\n4. **Check component**: Review SearchModel implementation for bugs\n5. **Test filter application**: Verify `applyFilter()` correctly rebuilds table\n\n## Expected Behavior\n\n1. User presses '/' to activate search\n2. Search bar appears with focus indicator\n3. User types search query (e.g., \"laptop\")\n4. Table filters to show only matching clients\n5. Matching text is highlighted (if implemented)\n6. User can navigate table results\n7. Press 'Enter' to select filtered result\n8. Press 'Esc' to clear search\n\n## Files to Check\n\n- `internal/tui/screens/list.go` - Main list screen with search\n- `internal/tui/components/search.go` - Search component\n- `internal/tui/screens/detail.go` - Check for comparison (if search works there)\n\n## Dependencies\n\nNone - this is a bug fix\n\n## Priority\n\n**CRITICAL (P0)** - Search is a primary navigation feature and should work reliably","status":"open","priority":0,"issue_type":"bug","owner":"Calmcacil@Raion","created_at":"2026-01-12T22:38:54.032294512+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T22:43:24.23164626+01:00"}
|
|
{"id":"wg-admin-wf1","title":"Create server and client config files","description":"Generate WireGuard configuration files for both server and client. Server config includes PublicKey and AllowedIPs. Client config includes PrivateKey, Address, DNS, Endpoint, and AllowedIPs. Use atomic writes (temp file + mv).","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T17:03:30.273615688+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T17:50:56.576191666+01:00","closed_at":"2026-01-12T17:50:56.576191666+01:00","close_reason":"Implemented WireGuard config file generation with atomic writes. Added GenerateServerConfig and GenerateClientConfig functions in internal/wireguard/config.go. Both functions use temp file + rename pattern for atomicity and set 0600 permissions.","dependencies":[{"issue_id":"wg-admin-wf1","depends_on_id":"wg-admin-o4o","type":"blocks","created_at":"2026-01-12T17:04:44.268995878+01:00","created_by":"Calmcacil"}]}
|
|
{"id":"wg-admin-wjj","title":"Implement restore functionality","description":"Add restore capability to load backups from /etc/wg-admin/backups/. Include backup list view, restore confirmation, and pre-restore safety backup. Handle missing backups gracefully.","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T17:03:30.29166861+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T18:06:07.558190874+01:00","closed_at":"2026-01-12T18:06:07.558190874+01:00","close_reason":"Restore functionality implemented in internal/backup/restore.go. ListBackups, RestoreBackup with validation. Restore screen with selectable table. Pre-restore safety backup. ReloadWireGuard integration. Successfully completes Phase 6.","dependencies":[{"issue_id":"wg-admin-wjj","depends_on_id":"wg-admin-11o","type":"blocks","created_at":"2026-01-12T17:04:36.234546234+01:00","created_by":"Calmcacil"}]}
|
|
{"id":"wg-admin-wmn","title":"Fix parseHandshake to correctly parse compound time expressions","description":"Fix parseHandshake function in status.go to correctly parse compound time expressions like '14 hours, 24 minutes, 40 seconds ago'. Currently only parses first time unit, causing app to show incorrect handshake timing that differs from wg show output.","status":"closed","priority":1,"issue_type":"bug","owner":"Calmcacil@Raion","created_at":"2026-01-12T19:14:02.056632886+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T19:26:35.464413104+01:00","closed_at":"2026-01-12T19:26:35.464413104+01:00","close_reason":"Fixed parseHandshake to correctly parse all time units with number-unit pairing"}
|
|
{"id":"wg-admin-wmo","title":"Create dedicated error screen with user-friendly messages and recovery options","description":"Errors are displayed but lack recovery guidance. Create error screen component that maps technical errors to user-friendly messages and provides actionable next steps. Examples: 'Permission denied' -\u003e 'Run with sudo', 'Client already exists' -\u003e 'Try different name'.","status":"open","priority":2,"issue_type":"feature","owner":"Calmcacil@Raion","created_at":"2026-01-12T21:40:23.214356805+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T21:40:23.214356805+01:00"}
|
|
{"id":"wg-admin-wod","title":"Create add client form with huh","description":"Implement form for adding new WireGuard clients using the huh library. Include fields for client name, DNS servers, and PSK toggle. Add validation for client name format, IP availability, and DNS format.","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T17:03:30.272758265+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T17:56:47.982894819+01:00","closed_at":"2026-01-12T17:56:47.982894819+01:00","close_reason":"Implemented add client form using huh library with validation for client name, DNS servers, and PSK toggle. Added CreateClient function in wireguard package for key generation, IP allocation, config creation, QR code generation, and peer interface management. Updated main.go to handle 'a' key for add screen navigation.","dependencies":[{"issue_id":"wg-admin-wod","depends_on_id":"wg-admin-xum","type":"blocks","created_at":"2026-01-12T17:04:26.667835195+01:00","created_by":"Calmcacil"}]}
|
|
{"id":"wg-admin-wsk","title":"Add configuration validation and syntax checking","description":"Implement validate_config_syntax() to check WireGuard config format before applying: verify [Interface] and [Peer] sections, check key format (44 base64 characters), validate IP addresses and CIDR notation, validate DNS format, ensure no duplicate public keys.","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T16:27:53.159692055+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T16:38:35.611667005+01:00","closed_at":"2026-01-12T16:38:35.611667005+01:00","close_reason":"validate_config_syntax() implemented in previous task with full WireGuard config format validation: [Interface]/[Peer] sections, key format (44 base64 chars), IP/CIDR notation, DNS format, duplicate public key detection. Integrated into cmd_load_clients."}
|
|
{"id":"wg-admin-xni","title":"Update documentation with theme options","description":"Update README.md and documentation to include the new theme options (dracula, everforest) and how to switch themes using the THEME environment variable.","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T19:07:40.300443242+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T19:10:22.220478311+01:00","closed_at":"2026-01-12T19:10:22.220478311+01:00","close_reason":"Documentation updated with theme options, build successful, theme switching logic verified"}
|
|
{"id":"wg-admin-xum","title":"Create client list table with bubble-table","description":"Implement interactive client list table using bubble-table library. Columns: Name, IPv4, IPv6, Status (Connected/Disconnected). Add sorting by column (name or status). Support keyboard navigation (j/k, arrows, Enter to select). Highlight selected row.","status":"closed","priority":2,"issue_type":"task","owner":"Calmcacil@Raion","created_at":"2026-01-12T17:02:57.647838043+01:00","created_by":"Calmcacil","updated_at":"2026-01-12T17:48:31.708679061+01:00","closed_at":"2026-01-12T17:48:31.708679061+01:00","close_reason":"List screen integrated with bubble-table, status checking integrated, keyboard navigation, auto-refresh every 10 seconds. Successfully displays clients with real-time connection status.","dependencies":[{"issue_id":"wg-admin-xum","depends_on_id":"wg-admin-69b","type":"blocks","created_at":"2026-01-12T17:04:26.676478182+01:00","created_by":"Calmcacil"}]}
|