- drop unnecessary type assertion in SyncStatusView tab rendering
- use window.setTimeout instead of global setTimeout
- use window instead of globalThis when resolving Electron's require
docs: list supported Git providers at the top of README
Adds end-to-end symlink syncing driven by the "Symbolic links" setting
(real / follow / skip; default real), building on the earlier detection.
- Pull: on desktop with "real", a remote symlink is recreated as a real OS
link via Node fs (utils/symlink.ts, guarded by Platform/FileSystemAdapter);
otherwise the target path is written as content.
- Push: GitHubService.pushSymlink commits a real symlink blob (mode 120000)
through the Git Data API (blob -> tree -> commit -> ref). getFile now
reports isSymlink/symlinkTarget.
- Config 防呆: only GitHub offers "real"; on GitLab/Gitea (no API to create
symlinks) "real" resolves to "skip" via getEffectiveSymlinkHandling.
- Safety: a "follow" push never overwrites a detected remote symlink with a
regular file; it is skipped with a notice.
- Docs: docs/symlink-handling.md plus a README settings note.
Lint is satisfied without disables (Electron global require, minimal Node
type shims). Adds tests for getFile detection, the pushSymlink Git Data
sequence, and the remote-symlink push guard.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DwioG4CNKUBuKiZdowLFWe
Gitea's git/trees endpoint requires a tree or commit SHA, not a branch
name, on instances older than ~1.17. Resolve branch to commit SHA via
/branches/{branch} first, then fetch /git/trees/{commitSha}?recursive=1.
Also updates README with provider compatibility table and SVG icons for
GitHub, GitLab, and Gitea.
https://claude.ai/code/session_019Jbz6HpQvWU1wpm5M6MZpd