When a user adds a subtask by editing the markdown file directly, the
MD→SP sync creates the task which triggers SP hooks, which trigger
SP→MD sync, which writes the file, which the file watcher detects,
creating a rapid sync oscillation loop that crashes the app.
Three-layer fix:
1. Stop file watcher for the entire MD→SP sync duration and cancel
pending SP→MD debounce timers
2. Add a cooldown after MD→SP sync (set before and after in finally
block) to suppress SP hooks that fire as side-effects
3. Simplify lazySetInterval with async/await and a stopped flag to
prevent zombie rescheduling when cancelled during async callbacks
Also fixes a file watcher race condition where polling could start
before initial mtime was resolved.
Fixes#6021
Tests:
- Markdown parser tests with edge cases and error handling
- Task operations generator tests for create/update/delete/reorder
- SP to markdown conversion tests with ordering validation
- Sync state verification tests
- Integration tests for full sync workflows
- File utilities tests
Configuration:
- Jest setup for plugin testing
- ESLint and Prettier configuration
- Test utilities and mocks