feat: add Windows platform support#5
Conversation
- WinGet package manager with cross-platform mapping - Task Scheduler daemon with restart-on-failure - Symlink fallback to copy without Developer Mode - Windows file permissions via icacls - Cross-platform path normalization - CI matrix and release pipeline for Windows
- Force-kill detached processes directly (no graceful WM_CLOSE attempt) - Shorten daemon stop wait on Windows (already force-killed) - Fix is_process_running to check ESRCH instead of ErrorKind::NotFound - Strip all ACEs before granting current user in icacls - Handle copy-mode files in ensure_symlink on Windows - Add winget interactivity flags for gh install - Use platform-generic upgrade message in format_version check
NamedTempFile holds exclusive lock; use into_temp_path() to release before schtasks reads. Also fix platform-specific "launchd" help text.
winget emits \r-based progress spinners that end up on the same line as the header. This shifts column offsets, causing empty parse results. Strip content before the last \r on each line before parsing.
Dashboard (ratatui TUI), releases v1.6.2–v1.9.1, and team project filtering from main merged into windows-support. Fixed dashboard libc usage to use centralized daemon::pid module.
|
/songify |
7 similar comments
|
/songify |
|
/songify |
|
/songify |
|
/songify |
|
/songify |
|
/songify |
|
/songify |
|
🎵 DiffBeats just dropped a track for this PR! "feat: add Windows platform support" Lyrics |
|
/songify |
|
🎵 You've hit your song limit for this month! Upgrade to keep riffing → |
|
/songify |
|
🎵 You've hit your song limit for this month! Upgrade to keep riffing → |
|
/songify |
|
🎵 DiffBeats just dropped a track for this PR! "feat: add Windows platform support" Lyrics |
|
/songify |
|
🎵 DiffBeats just dropped a track for this PR! "feat: add Windows platform support" Lyrics |
|
/songify /picify |
|
🖼️ DiffBeats couldn't generate a diagram for this PR. Try again later! |
|
🎵 DiffBeats just dropped a track for this PR! "feat: add Windows platform support" Lyrics |
|
/picify |
…indows Single-instance guard in run_daemon() ensures scheduled task and manual start can't spawn duplicates. Skip second taskkill /F on Windows since terminate_process already force-kills.
diff_package_lists used linear scan per element; restore HashSet lookup. ensure_symlink deleted and re-copied identical content on Windows copy-mode when checkout was newer — skip the cycle since atomic_write already synced canonical.
…t parser - Use whoami /user SID instead of spoofable USERNAME env var for icacls - Write sensitive files to temp, restrict ACLs, then rename into place - Derive winget column positions from separator+header layout instead of hardcoded English column names
…port - Use well-known SID *S-1-5-32-544 instead of localized BUILTIN\Administrators group name in icacls - sync_all() before persist() in write_file_secure for crash durability - Allow copy-mode files to upgrade to symlinks when Developer Mode is enabled later (symlinks_available probe)
OnceLock avoids repeated temp file create/delete per sync cycle. PID suffix prevents races between concurrent tether processes.
terminate_process already uses taskkill /F; the force_kill path is unix-only so the Windows impl was unreachable.
|
/songify |
|
🎵 DiffBeats just dropped a track for this PR! "feat: add Windows platform support" Lyrics |
|
/songify |
|
🎵 DiffBeats just dropped a track for this PR! "feat: add Windows platform support" Lyrics |
|
/songify |
|
🎵 DiffBeats just dropped a track for this PR! "feat: add Windows platform support" Lyrics |
- team cleanup removes copied files, not just symlinks - write_decrypted restricts ACLs on Windows (was default perms) - cache current_user_sid in OnceLock (was shelling out every call) - extract winget_cmd() builder to deduplicate Command construction - extract generate_schtasks_xml() with tests for XML escaping - add tests for write_file_secure, restrict_file_permissions, copy_dir_recursive - allow clippy::too_many_arguments on status::render
Review fixesRan an architecture review on the Windows support code. Found and fixed: Security
Correctness
Code quality
Tests (+6)
|


Summary
Test plan
cargo testpasses on all 3 CI platformstether daemon install/start/stop/uninstallon Windows (Task Scheduler)tether syncon Windows with encrypted dotfilestether packageswith winget