Commit graph

44 commits

Author SHA1 Message Date
79e33eccc0 fix: capture intended toggle action at click time to avoid stale isConnected in error toast
Store _pendingToggleAction before starting toggleProcess.
Use it in onExited instead of live root.isConnected.
Prevents 'Failed to disconnect' when user actually clicked connect.
Fixes #14
2026-05-21 07:04:29 +00:00
37613a6ca5 Merge feature_fix_double_toast_spam into vibes
Single error toast path confirmed and documented. Fixes #13
2026-05-21 07:04:08 +00:00
5be38df67e chore: confirm single authoritative error path for statusCheck
parseStatusResult safely catches JSON errors (lib.js:68).
onStreamFinished performs no toasts.
All failure toasts centralized in statusCheck.onExited (TailscaleWidget.qml:103).
Eliminates historical double-toast spam described in #13.
Fixes #13
2026-05-21 07:04:06 +00:00
ac1669f990 Merge feature_remove_binaryavailable_guard into vibes
Resolves redundant binaryAvailable guard per issue #11
2026-05-21 07:02:51 +00:00
1afc8a88f1 fix: remove redundant binaryAvailable guard from TailscaleWidget.qml
Removes stale one-way property, guards, and dead UI branch.
Error handling already covered by Process onExited handlers.
Fixes #11
2026-05-21 07:02:48 +00:00
2227cb60fe Merge feature_comprehensive_fixes into vibes 2026-05-21 06:38:23 +00:00
701daa9a39 refactor: replace detectClipboard with try-fallback-cached clipboard strategy
- Remove detectClipboard Process and clipboardCmd property
- Add try-fallback-cached copy logic: attempt cached tool first,
  then cycle through hardcoded safe tools (dms, wl-copy, clipmanctl)
- Add stderr StdioCollector to all Process components for error details
- Update lib.js: replace parseClipboardDetection with validateClipboardTool,
  buildCopyCommand, nextClipboardTool, allClipboardTools
- Update tests to match new lib.js API

Benefits:
- No startup delay from clipboard detection process
- Robust fallback if clipboard tool becomes unavailable
- Better error messages with stderr details from failed commands
2026-05-21 06:37:14 +00:00
cac0ae6bde Merge branch 'feature_sanitize_shell_commands' into vibes 2026-05-21 05:11:17 +00:00
4fbc4e1594 Merge pull request 'Add conduct rules for agents.' (#36) from perf_agent_improvement into master
Reviewed-on: #36
2026-05-21 04:54:10 +00:00
bb50912bb3 Add conduct rules for agents.
Agent frequently ignored `docs/agents/git-workflow.md` instructions. Reiterated critical rules and added a few others to maintain clarity, traceability, and obedience of agents.
2026-05-21 04:54:10 +00:00
f87ade7a67 Merge branch 'feature_sanitize_shell_commands'
Sanitize shell command construction by delegating to lib.js functions:
- validateClipboardCmd: whitelist-based input validation
- buildCopyCommand: safe clipboard command construction
- parseClipboardDetection: safe stdout parsing with fallback
- buildToggleCommand: pure toggle command builder
- parseStatusResult: safe JSON parsing with try/catch
- QML refactor: delegates all shell command building to lib.js
- Expanded clipboard detection to xclip and xsel
- Fixed clipboard detection script to use if/elif/else
2026-05-21 03:57:15 +00:00
2ece3cc103 fix: use if/elif/else in clipboard detection script
The previous &&/|| chain evaluated all commands, producing multi-line
output when multiple tools were installed. parseClipboardDetection
correctly rejected this as invalid, falling back to 'none'. The
if/elif/else structure ensures only the first match is echoed.
2026-05-21 02:36:40 +00:00
6ef933211c fix: expand clipboard detection to xclip and xsel
Add xclip and xsel to the whitelist and detection script so users
on systems without wl-copy or clipmanctl can still copy peer info.
2026-05-21 02:29:13 +00:00
93b257ba5d refactor: delegate shell command construction to lib.js functions
Replace inline shell command building in QML with calls to
parseClipboardDetection, parseStatusResult, buildToggleCommand, and
buildCopyCommand. This centralizes sanitization logic and removes
duplicated try/catch and ternary blocks from the UI layer.
2026-05-20 19:37:08 +00:00
b521af3364 feat: add parseStatusResult for safe JSON parsing of tailscale status
Wraps JSON.parse in try/catch, returns safe defaults on failure,
and delegates to existing findActiveExitNode and parsePeers.
2026-05-20 19:29:02 +00:00
ce8707c618 feat: add buildToggleCommand for safe toggle command construction
Replaces inline ternary in QML with a pure function that returns
the correct tailscale up/down command based on connection state.
2026-05-20 19:21:17 +00:00
dddd9218f6 feat: add parseClipboardDetection for safe clipboard tool parsing
Trims output and validates against whitelist, falling back to 'none'
for empty, multi-line, or unexpected values.
2026-05-20 10:16:02 +00:00
3c31209ff1 feat: add buildCopyCommand for safe clipboard command construction
Uses validateClipboardCmd to reject untrusted input and properly escapes
single quotes in text to prevent shell injection.
2026-05-20 10:11:57 +00:00
a86d5e279d feat: add validateClipboardCmd with whitelist-based input validation
Prevents shell injection by only allowing known-safe clipboard commands
(dms cl copy, wl-copy, clipmanctl copy, none).
2026-05-20 10:08:59 +00:00
7c12793b98 docs: add git workflow rules and update AGENTS.md
Add branching strategy with 4-tier hierarchy (feature_* -> vibes ->
testing -> master), agent guardrails, commit discipline, conventional
commits, rebasing rules, and branch management guidelines.
2026-05-20 08:57:45 +00:00
0083fe7dc2 docs: document intentional propagateComposedEvents: true on right-click MouseArea 2026-05-19 04:40:49 +00:00
1b7d3a3b7e chore: remove stale PRD document (product has been implemented) 2026-05-19 04:33:28 +00:00
5ee129abe5 docs: add screenshot to README 2026-05-19 00:20:09 +00:00
54c64f6d5e Added screenshot. Added ignore for working files not appropriate for the repo. 2026-05-18 17:16:31 -07:00
bd9df03b5b fix: find active exit node from Peer map instead of CurrentExitNode 2026-05-18 22:10:37 +00:00
303256d646 Write README with install instructions and update author 2026-05-18 21:17:54 +00:00
6129b09943 feat: add error handling and toast notifications (#8)
- Add errorMessage() utility for user-friendly toast messages
- Show toast on tailscale up/down/set/status failures
- Detect missing tailscale binary (exit code 127)
- Guard toggleTailscale and setExitNode when binary unavailable
- Show 'Tailscale not available' in popout when binary missing
2026-05-18 20:53:32 +00:00
c9d1baf7c4 fix: remove ESM export from lib.js for QML compatibility
QML's JS engine does not support ES module export/import syntax.
Replace bare export with a CommonJS guard that only runs under Node.js,
so the plugin loads in QML while tests still work.
2026-05-18 18:39:39 +00:00
0c2376b3bb feat: add exit node selection to Tailscale widget
- Extract peer parsing and exit-node command logic into lib.js
- Add ↗ button on peers that are ExitNodeOption candidates
- Highlight active exit node in primary color
- Add clear (×) button next to current exit node label
- Add unit tests for parsePeers and makeExitNodeCommand
2026-05-18 18:27:41 +00:00
2d438415ee fix: use single-arg ToastService.showInfo for copy toast 2026-05-18 05:33:42 +00:00
d8bd3c6c30 feat: auto-detect clipboard tool at startup (#6)\n\n- Priority: dms cl copy → wl-copy → clipmanctl copy → none\n- Show error toast if no clipboard tool is found\n- statusCheck runs after clipboard detection completes 2026-05-18 05:08:15 +00:00
2c29fcc0b6 feat: add click-to-copy for peer hostname and IP (#6)\n\n- Use Process (copyProcess) instead of unimported Quickshell.execDetached\n- MouseArea on hostname and IP in peer list delegate\n- Toast confirmation on copy 2026-05-17 23:00:22 +00:00
3a8fa8abd1 fix: parse Peer (singular) key, remove clipboard for now 2026-05-17 22:36:10 +00:00
0d3f500a2c feat: add peer list with click-to-copy (#6)
- Parse Peers from tailscale status --json into a model
- Add ListView with hostname/IP rows below status row
- Click hostname or IP to copy via wl-copy + toast confirmation
- Increase popout height to 400 to accommodate peer list
- Online peers shown in primary color, offline in surfaceVariantText
2026-05-17 21:59:59 +00:00
f980f4da21 fix(tailscalectl): apply all three click/layout fixes from working config 2026-05-17 21:32:46 +00:00
0743f5450e fix(tailscalectl): remove MouseArea from pills, add root-level right-click handler 2026-05-17 21:23:01 +00:00
821ede2bea fix(tailscalectl): let PluginComponent handle left-click for popout 2026-05-17 21:18:02 +00:00
c3f63873ac feat(tailscalectl): add popout skeleton with header row 2026-05-17 21:11:14 +00:00
77430ec0d4 fix(tailscalectl): propagate left-click through MouseArea to open popout
Add propagateComposedEvents and left-button handling to both
horizontal and vertical MouseArea blocks. Left-click is forwarded
to PluginComponent (mouse.accepted = false) so it opens popoutContent.
Right-click still toggles Tailscale connection.

Closes #10
2026-05-15 19:28:37 -07:00
8dd7562d35 feat(tailscalectl): add periodic status polling and reactive state
Add Timer (5s interval) that runs tailscale status --json, parsing
BackendState, Self.TailscaleIPs[0], and CurrentExitNode.HostName into
isConnected, tailscaleIP, and currentExitNode properties. Parse errors
surface via ToastService.showError. Initial check runs on load.

Closes #4
2026-05-15 19:19:01 -07:00
9c691ccc64 feat(tailscalectl): add bar pill with icon and right-click toggle
Implement connected/disconnected icon (vpn_key/vpn_key_off) in
both horizontal and vertical bar orientations. Right-click triggers
tailscale up / tailscale down via Process. Icon color follows
DMS theme (primary when connected, surfaceText when disconnected).

Closes #3
2026-05-15 19:14:49 -07:00
778f1969e0 feat(tailscalectl): add initial DMS widget plugin scaffolding
Minimal loadable DMS widget skeleton with plugin.json manifest
and TailscaleWidget.qml component. Symlinked, enabled, and loaded
cleanly in Dank Material Shell.

References #1, #2
2026-05-15 19:10:50 -07:00
db08aa1ff7 fix(initialize-project): make AGENTS.md agent-agnostic, add remote prompt, show full drafts 2026-05-15 17:00:46 -07:00
a12c7732e6 chore: add MIT license, README, and agent scaffolding 2026-05-15 16:47:02 -07:00