- Compare Path objects instead of strings in test_project_sync_success
- Fixes Windows test failure where paths use backslashes
- Ensures test passes on Windows, Linux, and macOS
Signed-off-by: Claude <noreply@anthropic.com>
Signed-off-by: phernandez <paul@basicmachines.co>
- Use .as_posix() for path comparison (Windows uses backslashes)
- Use Path.is_absolute() instead of checking for '/' prefix
- Ensures tests pass on Windows, Linux, and macOS
Signed-off-by: Claude <noreply@anthropic.com>
Signed-off-by: phernandez <paul@basicmachines.co>
**Problem:** Cloud projects that exist only in the database (not in
config.json) couldn't be removed. The error "Project 'name' not found"
occurred because config validation failed before database deletion.
**Root cause:**
- In cloud mode, projects can exist in database without config entries
- ProjectService.remove_project() called config_manager.remove_project()
first, which raised ValueError if project wasn't in config
- This prevented removal of cloud-only projects
**Solution:**
1. Check database first for project existence (source of truth)
2. Validate default project status from both database and config
3. Try to remove from config, but catch ValueError if not found
4. Always remove from database if project exists there
**Additional fix:**
- Project list Default column now shows in local mode (always) and in
cloud mode only if default_project_mode is enabled
- This fixes integration tests that expect to see default marker
Fixes cloud-only project deletion bug.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: phernandez <paul@basicmachines.co>
Update test expectations to match new path normalization behavior:
- API returns normalized paths (without /app/data/ prefix)
- get_project_remote() strips /app/data/ if present
- Remote paths are now basic-memory-cloud:bucket/research
instead of basic-memory-cloud:bucket/app/data/research
This reflects the fix for path doubling bug where files were
syncing to /app/data/app/data/project/.
All 22 rclone tests passing.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: phernandez <paul@basicmachines.co>
Complete rewrite to reflect SPEC-20 architecture:
- Removed outdated mount/bisync workflow confusion
- Added clear problem/solution explanations
- Documented project-scoped sync model
- Explained what happens under the covers for each command
- Added use case examples with concrete scenarios
- Updated all commands to project-scoped approach
- Removed references to deprecated features
- Added troubleshooting with explanations
Documentation now ready for user testing.
Signed-off-by: phernandez <paul@basicmachines.co>
All Phase 4 CLI integration tasks are complete:
- Added --local-path flag to project add command
- Added sync-setup, sync, bisync, check, ls commands
- Integrated with rclone_commands module
- All commands working with proper error handling
Optional tasks deferred for now:
- Update project list to show sync status
- Simplify cloud setup command
- Integration tests
Ready for Phase 5 cleanup.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: phernandez <paul@basicmachines.co>
Updated bisync_commands.py and core_commands.py to use simplified
configure_rclone_remote() function instead of deprecated
add_tenant_to_rclone_config(). Removed MOUNT_PROFILES import and
replaced dynamic help text with static string.
mount_commands.py still has errors but will be removed entirely in Phase 5.
Related to SPEC-20 Phase 2 cleanup.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: phernandez <paul@basicmachines.co>
Remove deprecated tenant-specific and mount-related functions:
- Removed add_tenant_to_rclone_config() (replaced by configure_rclone_remote)
- Removed remove_tenant_from_rclone_config()
- Removed all mount-related functions:
- RcloneMountProfile class
- MOUNT_PROFILES dict
- get_default_mount_path()
- build_mount_command()
- is_path_mounted()
- get_rclone_processes()
- kill_rclone_process()
- unmount_path()
- cleanup_orphaned_rclone_processes()
Simplified module to only include:
- configure_rclone_remote() for single remote setup
- Core config management (load, save, backup)
Note: mount_commands.py still depends on removed code and will fail to import.
This will be fully resolved in Phase 5 when mount_commands.py is removed entirely.
Part of SPEC-20 Phase 5 (early cleanup).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: phernandez <paul@basicmachines.co>
Add new configure_rclone_remote() that uses single remote name:
- Single remote: "basic-memory-cloud" (not tenant-specific)
- Simplifies from per-tenant remotes to one credential set per user
- Maintains backup_rclone_config() for safety
- Add comprehensive functional tests for rclone config
- Test remote configuration, updates, save/load operations
Old add_tenant_to_rclone_config() kept for backward compatibility
but will be removed in Phase 5.
Part of SPEC-20 Simplified Project-Scoped Rclone Sync.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: phernandez <paul@basicmachines.co>
Add CloudProjectConfig model and cloud_projects dict to BasicMemoryConfig:
- CloudProjectConfig tracks local_path, last_sync, bisync_initialized
- cloud_projects: dict[str, CloudProjectConfig] in config
- Fix datetime serialization with mode='json' in model_dump()
- Add comprehensive tests for cloud_projects functionality
- Backward compatible: old configs without cloud_projects load correctly
This enables project-scoped sync configuration tracked in config file
rather than filesystem discovery, preventing phantom projects.
Part of SPEC-20 Simplified Project-Scoped Rclone Sync.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: phernandez <paul@basicmachines.co>
Added a section announcing the launch of Basic Memory Cloud with details on cross-device support and early supporter pricing.
Signed-off-by: Paul Hernandez <60959+phernandez@users.noreply.github.com>
- Moved config evaluation from module load time to runtime
- Unified add_project command to handle both cloud and local modes
- Commands (default, sync-config, move) now check cloud_mode at runtime
- Fixes test failures where monkeypatch wasn't applied before command registration
The /proxy/projects/projects POST endpoint returns a ProjectStatusResponse
with fields: message, status, default, old_project, new_project.
Updated CloudProjectCreateResponse schema to match this format instead of
expecting name, path, message fields.
Also updated all related tests to use the correct response format:
- tests/cli/test_cloud_utils.py (3 tests)
- tests/cli/test_bisync_commands.py (1 test)
Fixes the validation error when creating cloud projects via upload command:
"bm cloud upload --project test --create-project specs"
Signed-off-by: Pablo Hernandez <pablo@basicmachines.co>
Signed-off-by: phernandez <paul@basicmachines.co>