[3.5.3] - 2026-04-16
Continuous Sync, MCP Integration & CLI Expansion
Added
- CLI
sync --watch: continuous sync with native filesystem watcher (inotify/FSEvents/ReadDirectoryChangesW). Watches a local directory for changes and re-syncs automatically in a foreground loop, stopped with Ctrl+C. Six new flags:--watch(enable),--watch-mode auto|native|poll(backend selection),--watch-debounce-ms(event batching, default 1500),--watch-cooldown(min seconds between syncs, default 15),--watch-rescan(full reconciliation interval, default 300s),--watch-no-initial(skip startup sync). Anti-loop protection: events suppressed during active syncs and within cooldown window, editor temp files filtered (.swp,.tmp,~,.aerotmp,.DS_Store). Incremental local scan on watcher triggers (skips full walkdir, merges changed paths with snapshot). Full rescan on timer for remote change detection. Text output:[HH:MM:SS] Sync #N (trigger) -- X up, Y down, Z del (Xs). JSON output: NDJSON with cycle/trigger/uploaded/downloaded/deleted/skipped/errors/elapsed_secs/timestamp per cycle. Works with all sync features (bisync, conflict resolution,--delete,--track-renames,--max-delete,--backup-dir). First CLI file transfer tool with native continuous bidirectional sync - rclone does not offer this - CLI
SyncCycleStats:cmd_syncnow returns a structured stats object (uploaded/downloaded/deleted/skipped/error_count) instead of a bare exit code. Watch mode uses these stats for enriched per-cycle output. Non-watch callers unaffected (extract.exit_code) - MCP Server dialog: new informational modal (Help > MCP Server...) with VS Code extension install command, Command Palette shortcut, manual JSON configuration, and config file paths for Claude Code, Claude Desktop, Cursor, and Windsurf
- MCP VS Code extension: published axpdev-lab.aeroftp-mcp on the VS Code Marketplace. One-click MCP server registration with multi-target support, status bar indicator, and 4-step diagnostics
- MCP documentation: new docs.aeroftp.app/mcp/overview page with setup guide, tool reference, rate limits, security model, and troubleshooting
- CLI
--files-from: transfer only files listed in an external file (one path per line,#comments). Works with get -r, put -r, and sync.--files-from-rawvariant preserves whitespace and empty lines - CLI
--immutable: never overwrite existing files on destination. Applies to get -r (skip if local exists) and sync (skip uploads/downloads that would overwrite) - CLI
--no-check-dest: skip remote directory listing during sync, assuming destination is empty. Accelerates initial uploads to known-empty targets - CLI
--max-depth: global flag to limit recursion depth on get -r, put -r, sync, and find (default: 100) - CLI bisync
--conflict-mode rename: new conflict resolution mode that keeps both versions during bidirectional sync. The remote version stays as-is, the local version is uploaded with a.conflict-{timestamp}suffix. Also addsnewest/oldestas aliases fornewer/older, andlargest/smallestas aliases forlarger/smaller - CLI dedupe 7 new modes:
newest(keep most recent),oldest(keep oldest),largest(keep biggest),smallest(keep smallest),rename(rename duplicates with numeric suffix),interactive(prompt per group, TTY-only with skip fallback),list(list duplicates without action). All modes display mtime alongside size in output - CLI
--suffix-keep-extension: when using--backup-dirwith--suffix, places the suffix before the file extension (file.bak.txtinstead offile.txt.bak) - CLI
--default-time: configurable fallback mtime when backend returns None. Accepts ISO 8601 ornow. Applied in sync comparisons to avoid false-positive mismatches - CLI
--inplace: skip.aerotmptemp file pattern and write downloads directly to the final path. Faster on network filesystems but interrupted downloads produce corrupt files - CLI
cleanupcommand: scan remote directory for orphaned.aerotmpfiles from interrupted downloads. Dry-run by default,--forceto delete. JSON output with bytes freed - CLI
--compare-dest/--copy-dest: skip sync uploads when file exists in a local reference directory with matching size and mtime.--copy-destcopies from reference instead of downloading, saving bandwidth - CLI
--fast-list(S3 only): recursive listing via single ListObjectsV2 call without Delimiter. Reduces API calls from O(directories) to O(files/1000) for large S3 buckets. Falls back to BFS for non-S3 providers - Azure Blob directory markers:
mkdirnow creates zero-byte marker blobs with trailing/, matching S3 behavior. Preserves empty directories on Azure - 11 unit tests:
should_exclude_watch_path(5 tests covering OS metadata, VCS dirs, temp extensions, temp patterns, normal files),incremental_local_scan(4 tests: new file, deleted file, snapshot preservation, exclude patterns),SyncCycleStats(2 tests: From trait, Default) - 8 i18n keys: MCP dialog and menu label translated in all 47 languages
Fixed
- FTP listing path construction (critical):
parse_unix_listing()andparse_dos_listing()used the FTP CWD (/) to buildentry.pathinstead of the directory being listed. Causedrmdir_recursive,cleanup --force, and any recursive operation to target wrong paths on non-MLSD FTP servers (vsftpd, older servers). Fixed to use the actual listed directory path viajoin_remote_path(base_path, name). MLSD servers were unaffected (already correct). Full audit of all 26 providers confirmed the bug was isolated to FTP and WebDAV - WebDAV listing path construction: same bug class as FTP.
parse_propfind_response()usedself.current_pathinstead of thebase_pathparameter. Causedcleanup --forceandrmdir_recursiveto fail on WebDAV subdirectories - CLI
--immutablecoverage gap:put -r(recursive upload) did not check--immutable, allowing overwrites of existing remote files. Addedstat()pre-check inupload_transfer_task()covering all upload code paths. Reports"skipped": Nin JSON output - CLI
--default-timeRFC 3339 rejection:resolve_default_time()only accepted naive ISO 8601 (YYYY-MM-DDTHH:MM:SS), rejecting valid timezone forms like2026-04-16T12:30:00Zand2026-04-16T12:30:00+02:00. Now parses RFC 3339 first and normalizes to UTC - CLI skip message mismatch: shared
--no-clobber || --immutablecode path always printed--no-clobberin the skip message. Now displays the actual flag that triggered the skip - Bisync rename order (preserve-first): conflict rename now preserves the local variant before downloading the remote version. Prevents data loss when both sides are modified
- Extreme mode theme leak: AeroAgent Extreme mode now resets to Normal automatically when leaving Cyber theme, preventing unintended auto-approval in non-Cyber themes
- Extreme mode menu visibility: the Extreme option in the AeroAgent mode dropdown is only shown when Cyber theme is active, instead of appearing grayed out in all themes
- Google Drive OAuth setup: clarified that Desktop app type is recommended over Web for OAuth client configuration
Changed
- IntroHub S3 filter: Azure Blob now included in the "S3/Object Storage" filter chip
- Connection form layout: FileLu, Drime Cloud, and Jottacloud now use 2-column form layout for better field organization
Downloads:
- Windows:
.msiinstaller,.exe, or.zipportable (no installation required) - macOS:
.dmgdisk image - Linux:
.deb,.rpm,.snap, or.AppImage