Commit graph

76 commits

Author SHA1 Message Date
25e56c33ea refactor: add getStatusCommand pure helper + test (TDD step 2 — prepares low-duty-cycle status calls) 2026-05-22 10:19:39 +00:00
d6b704b884 refactor: introduce formatError centralizer + remove first batch of historical comments (TDD step 1 of first-principles plan) 2026-05-22 10:19:25 +00:00
0283ce6136 chore: evaluate structured logging per AGENTS.md rule 1 — no addition justified (#47)
- Existing toasts + truncated stderr provide the actionable information for users and errors
- Adding persistent debug logs would introduce state, rotation, and maintenance concerns
- with no demonstrable improvement to UX, decisions, or security for normal operation
- Explicit no-op commit closes the planning issue

Written by AI agent working for @jtmorris. Model: Grok build-0.1.
2026-05-22 06:42:11 +00:00
5219271be3 fix: eliminate toggle decision staleness via poll-then-act (no cached desired state) (#42)
- toggleTailscale() now forces a fresh statusCheck instead of reading possibly-stale root.isConnected
- The actual up/down decision happens in statusCheck.onExited using the just-received value
- _pendingToggle is a transient one-shot flag (reset immediately after use) — not a persistent 'desired state' cache
- Complies with AGENTS.md rule 1 / #11

Written by AI agent working for @jtmorris. Model: Grok build-0.1.
2026-05-22 06:42:11 +00:00
d6938c72ea test: coverage for newly extracted pure helpers; document Process/Widget manual verification boundary (#48)
- The new helpers from #43 are now under test
- Added explicit comment explaining that full lifecycle + timing + QML behavior remains manual verification only (no QML test runner exists)

Written by AI agent working for @jtmorris. Model: Grok build-0.1.
2026-05-22 06:42:11 +00:00
40a408e029 refactor: extract shouldShowClearExitNode and isActiveExitNode to lib.js (TDD) — light progress on #43
- Two small pure UI predicates moved out of QML delegate
- QML now calls TailscaleLib.* (thinner glue)
- New tests + all existing tests pass
- No new state, no architecture change

Written by AI agent working for @jtmorris. Model: Grok build-0.1.
2026-05-22 06:42:11 +00:00
06925ed3fc feat: extract UI strings to lib.js; harden clipboard to direct argv, drop clipmanctl (#34, #49)
- safeClipboardTools now only dms + wl-copy (clipmanctl removed as niche optional history manager)
- buildCopyCommand now returns pure argv arrays (no sh -c, no escaping, eliminates future injection risk)
- Added getStrings() for centralised user-facing strings (prep for real i18n)
- Updated all tests (TDD) and README
- All 29 tests pass

Written by AI agent working for @jtmorris. Model: Grok build-0.1.
2026-05-22 06:42:11 +00:00
5bf8e00cac chore: remaining issues batch progress (#23-#34) 2026-05-22 06:42:11 +00:00
c99dc29aae chore: JS quality batch (#20 for-in guard, #21 add edge tests, #22 dedup errorMessage keys) 2026-05-22 06:42:11 +00:00
bbaf195f5d chore: batch minor layout fixes (#18, #19, #27) - Row anchors, boundsBehavior 2026-05-22 06:42:10 +00:00
a095abb2b4 chore: verify copyProcess already has proper onExited exit-status check + success toast
Toast moved out of copyToClipboard() into onExited (code===0 path).
Fallback clipboard rotation also present.
Issue #17 already addressed by existing implementation.
Fixes #17
2026-05-22 06:42:10 +00:00
202462bf53 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-22 06:42:10 +00:00
a46794b386 Better scoped semicolon coding style. 2026-05-22 06:06:14 +00:00
4350b7b276 Added some opinionated coding style guidelines. 2026-05-22 05:29:42 +00:00
d85c4b914e Merge batch fixes: security, QML Process, Timer, and plugin.json (#38, #40, #41, #44, #46, #50, #51)
- lib.js: hasOwnProperty guards (#40), makeExitNodeCommand empty hostname fix (#41)
- TailscaleWidget.qml: statusCheck parser in onExited (#38), refreshTimer guard (#44),
  remove stale-state workarounds (_pendingToggleAction, running guards),
  remove propagateComposedEvents (#50)
- plugin.json: clean author string (#51), add missing permissions

All tests pass. Written by AI agent working for @jtmorris. Model: Qwen 3.6 27B.
2026-05-22 03:13:41 +00:00
d2e9069ce5 fix: remove binaryAvailable, fix statusCheck parser location, add timer guard
- Revert binaryAvailable property: reintroduced stale-state anti-pattern
  already rejected in #11. All error paths already handled by Process
  onExited handlers.
- Move statusCheck parsing from onStreamFinished to onExited (#38):
  parser now only runs after exit code validation, preventing stale
  data from being applied on failure.
- Add refreshTimer guard (#44): timer no longer spawns new statusCheck
  while one is already running.

Closes #38, #44. Reverts #52 partial fix.
2026-05-22 03:13:33 +00:00
0d381751bf fix: remove propagateComposedEvents and fix plugin author (#50, #51)
- TailscaleWidget.qml: remove propagateComposedEvents from right-click MouseArea
- plugin.json: clean up author string
2026-05-22 03:13:24 +00:00
dca1039c51 fix: lib.js security and correctness fixes (#40, #41)
- parsePeers: add hasOwnProperty guard and filter null entries
- findActiveExitNode: add hasOwnProperty guard to for..in loop
- makeExitNodeCommand: handle empty hostname correctly
2026-05-22 03:13:24 +00:00
978588ecff Added guard against useless state caching anti-pattern AI agents keep insisting on.
Multiple LLMs keep trying to revert issue #11 unless specifically argued against, and keep sneaking it into code. Other, similar examples of this pathological insistence on storing/caching state that offers no tangible benefit warranting the complexity and edge cases have been tried, but headed off by me earlier.
2026-05-21 09:23:07 +00:00
daab2379e4 Merge remaining progress to vibes 2026-05-21 07:05:39 +00:00
779c298fc4 chore: remaining issues batch progress (#23-#34) 2026-05-21 07:05:39 +00:00
2cee873419 Merge JS quality to vibes 2026-05-21 07:05:31 +00:00
c3ebe842ca chore: JS quality batch (#20 for-in guard, #21 add edge tests, #22 dedup errorMessage keys) 2026-05-21 07:05:31 +00:00
07982c28eb Merge layout fixes to vibes 2026-05-21 07:05:23 +00:00
326728c706 chore: batch minor layout fixes (#18, #19, #27) - Row anchors, boundsBehavior 2026-05-21 07:05:23 +00:00
48740715a2 Merge feature_fix_copy_toast into vibes
Copy toast already correct. Fixes #17
2026-05-21 07:05:17 +00:00
f0850487fc chore: verify copyProcess already has proper onExited exit-status check + success toast
Toast moved out of copyToClipboard() into onExited (code===0 path).
Fallback clipboard rotation also present.
Issue #17 already addressed by existing implementation.
Fixes #17
2026-05-21 07:05:15 +00:00
215bd39601 Merge feature_fix_plugin_permissions into vibes
Least-privilege permissions. Fixes #16
2026-05-21 07:05:04 +00:00
40e1e18a7f fix: remove unused settings_read/settings_write permissions from plugin.json
Only process permission is required for tailscale + clipboard commands.
Least-privilege fix. Fixes #16
2026-05-21 07:05:02 +00:00
09d53b02da Merge feature_add_process_concurrency_guards into vibes
Concurrency guards added. Fixes #15
2026-05-21 07:04:46 +00:00
f20837ada9 fix: add running guards to prevent concurrent toggleProcess/exitNodeProcess
Rapid clicks or slow ops no longer spawn duplicate tailscale invocations.
Matches existing pattern used for copyProcess safety.
Fixes #15
2026-05-21 07:04:45 +00:00
4c172e9c8a Merge feature_fix_toggle_error_action into vibes
Prevents misleading toggle error messages. Fixes #14
2026-05-21 07:04:30 +00:00
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