Store pendingMdToSpSync config in local variable before calling handleMdToSpSync
to prevent race conditions when window gains focus during debounce period.
- Use separate mdToSpDebounceTimer and spToMdDebounceTimer variables
- Prevents SP changes from canceling the 10-second MD to SP debounce
- Add logging to differentiate between sync directions
- Clear timer state when sync completes
This fixes the issue where frequent SP changes were preventing
the 10-second debounce for markdown file changes from working.
- Update package.json with latest dependencies
- Configure build script for plugin packaging
- Archive old implementation in src/background/old/
- Remove obsolete test files and utilities
- Clean up unused replication approach
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
Core sync infrastructure:
- Markdown parser with task ID extraction and parent-child support
- SP to markdown converter with proper task ordering based on project taskIds
- Task operations generator for efficient batch updates
- Sync manager with file watching and intelligent debouncing
- Window focus-aware debouncing (15s when unfocused, 1s when focused)
- Post-sync verification to ensure consistency
Key features:
- Bidirectional sync between markdown files and Super Productivity
- Preserves task hierarchy and subtask ordering
- Handles duplicate ID detection and prevention
- Smart conflict resolution with detailed logging
- Efficient batch operations to minimize API calls
Plugin integration:
- Background script with proper initialization
- UI bridge for configuration management
- Plugin manifest and entry point
- Configuration UI for file path setup
- Replace all `any` usage with proper TypeScript types
- Add BatchUpdateRequest import and type for batchUpdateForProject method
- Create PluginIframeMessageType enum for consistent message type handling
- Fix postMessage calls to use proper type signatures
- Update type assertions with proper casting through unknown
- Improve type safety across plugin bridge communication layer
- Replace _currentPluginId mutable state with bound method factory pattern
- Create PluginBridgeService.createBoundMethods() that returns plugin-specific methods
- Each plugin gets its own bound methods with pluginId pre-applied
- Eliminates race conditions and awkward _setCurrentPlugin pattern
- Plugins can no longer impersonate each other (security improvement)
- Replace all 'any' types with proper TypeScript types
- All tests passing, no code duplication
- Enable 3 tests in sync-race-condition.spec.ts
- Enable 4 tests in sync-race-condition-diagnostic.spec.ts
- Enable 3 tests in sync-fixes.spec.ts
- Enable 5 tests in task-due.effects.spec.ts
- Enable 1 test in task-later-today.selectors.spec.ts
- Uncomment entire plugin.service.spec.ts file (28 tests)
Tests may still need fixes to pass but are no longer disabled
- Update plugin states Map when uploading plugins to enable UI reactivity
- Handle uploaded:// protocol properly in plugin loader by routing to cache
- Add newly uploaded plugins to _pluginStates Map for immediate UI updates
- Fix issue where page refresh was required to see uploaded plugins
The root causes were:
1. Uploaded plugins were added to _loadedPlugins but not _pluginStates Map
2. The plugin loader tried to make HTTP requests for uploaded:// URLs
Now uploaded plugins appear immediately in the UI without page refresh.
* fix/multiple:
feat: improve reliably for repeatable tasks 2
feat: improve reliably for repeatable tasks
fix: avoid mutation
docs: add theme colors overview
fix: date pipe error with indonesian
build: fix docker build
fix: only filter out later today tasks for today list
fix: task detail panel not opening for tasks planned for later