diff --git a/src/aipass/backup/.aipass/aipass_local_prompt.md b/src/aipass/backup/.aipass/aipass_local_prompt.md index 9ee7aa42..e7cd8959 100644 --- a/src/aipass/backup/.aipass/aipass_local_prompt.md +++ b/src/aipass/backup/.aipass/aipass_local_prompt.md @@ -63,8 +63,8 @@ apps/ ## Working Habits - Project-owned design: .backup_system/ and .backupignore live in the TARGET project, not centrally -- Standalone sys.path: uses `from apps.modules.*` / `from apps.handlers.*`, NOT `from aipass.backup.*` -- Entry point sets PROJECT_ROOT on sys.path and AIPASS_BRANCH_NAME env var for Prax +- Normal citizen namespace: uses `from aipass.backup.apps.modules.*` / `from aipass.backup.apps.handlers.*` +- Entry point sets AIPASS_BRANCH_NAME env var for Prax - BUILTIN_IGNORES in patterns.py is the single source for default ignore patterns ## Known Gotchas diff --git a/src/aipass/backup/__init__.py b/src/aipass/backup/__init__.py new file mode 100644 index 00000000..36133937 --- /dev/null +++ b/src/aipass/backup/__init__.py @@ -0,0 +1,12 @@ +# =================== AIPass ==================== +# Name: __init__.py - Backup package root +# Date: 2026-04-16 +# Version: 1.0.0 +# Category: backup +# +# CHANGELOG (Max 5 entries): +# - v1.0.0 (2026-04-16): Initial implementation +# +# CODE STANDARDS: +# - Package root for the Backup system +# ============================================= diff --git a/src/aipass/backup/apps/backup.py b/src/aipass/backup/apps/backup.py index 916a481a..2526e9c9 100644 --- a/src/aipass/backup/apps/backup.py +++ b/src/aipass/backup/apps/backup.py @@ -20,10 +20,6 @@ import sys from pathlib import Path from typing import Any -PROJECT_ROOT = str(Path(__file__).resolve().parent.parent) -if PROJECT_ROOT not in sys.path: - sys.path.insert(0, PROJECT_ROOT) - os.environ.setdefault("AIPASS_BRANCH_NAME", "backup") from aipass.prax import logger @@ -52,7 +48,7 @@ def discover_modules() -> list[Any]: if file_path.name.startswith("_"): continue - module_name = f"apps.modules.{file_path.stem}" + module_name = f"aipass.backup.apps.modules.{file_path.stem}" try: module = importlib.import_module(module_name) @@ -100,7 +96,7 @@ def main(): command = args[0] if command == "backup" and len(args) > 1: - from apps.modules.register import resolve_project + from aipass.backup.apps.modules.register import resolve_project target = args[1] project_root = resolve_project(target) @@ -124,7 +120,7 @@ def main(): remaining = args[1:] if len(args) > 1 else [] if remaining and remaining[0].startswith("@"): - from apps.modules.register import resolve_project + from aipass.backup.apps.modules.register import resolve_project resolved = resolve_project(remaining[0]) if resolved is None: diff --git a/src/aipass/backup/apps/modules/all.py b/src/aipass/backup/apps/modules/all.py index c6842fd2..7141fd1f 100644 --- a/src/aipass/backup/apps/modules/all.py +++ b/src/aipass/backup/apps/modules/all.py @@ -13,10 +13,10 @@ import sys from aipass.prax import logger from aipass.cli.apps.modules import console -from apps.handlers.json import json_handler -from apps.handlers.report.formatter import format_result -from apps.modules.snapshot import run_snapshot -from apps.modules.versioned import run_versioned +from aipass.backup.apps.handlers.json import json_handler +from aipass.backup.apps.handlers.report.formatter import format_result +from aipass.backup.apps.modules.snapshot import run_snapshot +from aipass.backup.apps.modules.versioned import run_versioned MODULE_NAME = "all" PRIMARY_COMMAND = "all" diff --git a/src/aipass/backup/apps/modules/drive_clear.py b/src/aipass/backup/apps/modules/drive_clear.py index b4d45074..4ef1c153 100644 --- a/src/aipass/backup/apps/modules/drive_clear.py +++ b/src/aipass/backup/apps/modules/drive_clear.py @@ -15,7 +15,7 @@ import sys from aipass.prax import logger from aipass.cli.apps.modules import console -from apps.handlers.json import json_handler +from aipass.backup.apps.handlers.json import json_handler MODULE_NAME = "drive_clear" diff --git a/src/aipass/backup/apps/modules/drive_stats.py b/src/aipass/backup/apps/modules/drive_stats.py index 48354e7e..8fd3a054 100644 --- a/src/aipass/backup/apps/modules/drive_stats.py +++ b/src/aipass/backup/apps/modules/drive_stats.py @@ -15,7 +15,7 @@ import sys from aipass.prax import logger from aipass.cli.apps.modules import console -from apps.handlers.json import json_handler +from aipass.backup.apps.handlers.json import json_handler MODULE_NAME = "drive_stats" diff --git a/src/aipass/backup/apps/modules/drive_sync.py b/src/aipass/backup/apps/modules/drive_sync.py index 0302e58c..ad59c6d4 100644 --- a/src/aipass/backup/apps/modules/drive_sync.py +++ b/src/aipass/backup/apps/modules/drive_sync.py @@ -15,7 +15,7 @@ import sys from aipass.prax import logger from aipass.cli.apps.modules import console -from apps.handlers.json import json_handler +from aipass.backup.apps.handlers.json import json_handler MODULE_NAME = "drive_sync" diff --git a/src/aipass/backup/apps/modules/drive_test.py b/src/aipass/backup/apps/modules/drive_test.py index ba47734a..a808c2fb 100644 --- a/src/aipass/backup/apps/modules/drive_test.py +++ b/src/aipass/backup/apps/modules/drive_test.py @@ -15,7 +15,7 @@ import sys from aipass.prax import logger from aipass.cli.apps.modules import console -from apps.handlers.json import json_handler +from aipass.backup.apps.handlers.json import json_handler MODULE_NAME = "drive_test" diff --git a/src/aipass/backup/apps/modules/register.py b/src/aipass/backup/apps/modules/register.py index 928ae893..9717a0d8 100644 --- a/src/aipass/backup/apps/modules/register.py +++ b/src/aipass/backup/apps/modules/register.py @@ -14,10 +14,10 @@ from pathlib import Path from aipass.prax import logger from aipass.cli.apps.modules import console -from apps.handlers.json import json_handler -from apps.handlers.project.registry import lookup_project as _lookup_project -from apps.handlers.project.registry import register_project -from apps.handlers.project.setup import create_backup_dir +from aipass.backup.apps.handlers.json import json_handler +from aipass.backup.apps.handlers.project.registry import lookup_project as _lookup_project +from aipass.backup.apps.handlers.project.registry import register_project +from aipass.backup.apps.handlers.project.setup import create_backup_dir def resolve_project(target: str) -> str | None: diff --git a/src/aipass/backup/apps/modules/settings.py b/src/aipass/backup/apps/modules/settings.py index 4d2277df..0c17dfaf 100644 --- a/src/aipass/backup/apps/modules/settings.py +++ b/src/aipass/backup/apps/modules/settings.py @@ -15,7 +15,7 @@ import sys from aipass.prax import logger from aipass.cli.apps.modules import console -from apps.handlers.json import json_handler +from aipass.backup.apps.handlers.json import json_handler MODULE_NAME = "settings" diff --git a/src/aipass/backup/apps/modules/snapshot.py b/src/aipass/backup/apps/modules/snapshot.py index 4fdc7e2d..2d0149a5 100644 --- a/src/aipass/backup/apps/modules/snapshot.py +++ b/src/aipass/backup/apps/modules/snapshot.py @@ -15,20 +15,20 @@ import time from aipass.prax import logger from aipass.cli.apps.modules import console -from apps.handlers.copy.snapshot import copy_snapshot -from apps.handlers.ignore.patterns import load_patterns -from apps.handlers.ignore.whitelist import load_whitelist -from apps.handlers.json import json_handler -from apps.handlers.path.builder import build_snapshot_path -from apps.handlers.project.config import load_project_config -from apps.handlers.project.setup import create_backup_dir -from apps.handlers.report.formatter import format_result -from apps.handlers.report.result import BackupResult -from apps.handlers.scan.filter import filter_paths -from apps.handlers.scan.walk import walk_project -from apps.handlers.state.changelog import append_changelog -from apps.handlers.state.metadata import build_metadata -from apps.handlers.state.timestamps import save_timestamps +from aipass.backup.apps.handlers.copy.snapshot import copy_snapshot +from aipass.backup.apps.handlers.ignore.patterns import load_patterns +from aipass.backup.apps.handlers.ignore.whitelist import load_whitelist +from aipass.backup.apps.handlers.json import json_handler +from aipass.backup.apps.handlers.path.builder import build_snapshot_path +from aipass.backup.apps.handlers.project.config import load_project_config +from aipass.backup.apps.handlers.project.setup import create_backup_dir +from aipass.backup.apps.handlers.report.formatter import format_result +from aipass.backup.apps.handlers.report.result import BackupResult +from aipass.backup.apps.handlers.scan.filter import filter_paths +from aipass.backup.apps.handlers.scan.walk import walk_project +from aipass.backup.apps.handlers.state.changelog import append_changelog +from aipass.backup.apps.handlers.state.metadata import build_metadata +from aipass.backup.apps.handlers.state.timestamps import save_timestamps MODULE_NAME = "snapshot" PRIMARY_COMMAND = "snapshot" diff --git a/src/aipass/backup/apps/modules/status.py b/src/aipass/backup/apps/modules/status.py index f3ac8b38..2461ad87 100644 --- a/src/aipass/backup/apps/modules/status.py +++ b/src/aipass/backup/apps/modules/status.py @@ -14,10 +14,10 @@ from pathlib import Path from aipass.prax import logger from aipass.cli.apps.modules import console -from apps.handlers.json import json_handler -from apps.handlers.path.builder import backup_root -from apps.handlers.project.config import load_project_config -from apps.handlers.state.changelog import load_changelog +from aipass.backup.apps.handlers.json import json_handler +from aipass.backup.apps.handlers.path.builder import backup_root +from aipass.backup.apps.handlers.project.config import load_project_config +from aipass.backup.apps.handlers.state.changelog import load_changelog MODULE_NAME = "status" PRIMARY_COMMAND = "status" diff --git a/src/aipass/backup/apps/modules/versioned.py b/src/aipass/backup/apps/modules/versioned.py index 662ff3e4..3ea78c2b 100644 --- a/src/aipass/backup/apps/modules/versioned.py +++ b/src/aipass/backup/apps/modules/versioned.py @@ -17,20 +17,20 @@ from datetime import datetime, timezone from aipass.prax import logger from aipass.cli.apps.modules import console -from apps.handlers.copy.versioned import copy_versioned -from apps.handlers.ignore.patterns import load_patterns -from apps.handlers.ignore.whitelist import load_whitelist -from apps.handlers.json import json_handler -from apps.handlers.path.builder import build_versioned_path -from apps.handlers.project.config import load_project_config -from apps.handlers.project.setup import create_backup_dir -from apps.handlers.report.formatter import format_result -from apps.handlers.report.result import BackupResult -from apps.handlers.scan.filter import filter_paths -from apps.handlers.scan.walk import walk_project -from apps.handlers.state.changelog import append_changelog -from apps.handlers.state.metadata import build_metadata -from apps.handlers.state.timestamps import load_timestamps, save_timestamps +from aipass.backup.apps.handlers.copy.versioned import copy_versioned +from aipass.backup.apps.handlers.ignore.patterns import load_patterns +from aipass.backup.apps.handlers.ignore.whitelist import load_whitelist +from aipass.backup.apps.handlers.json import json_handler +from aipass.backup.apps.handlers.path.builder import build_versioned_path +from aipass.backup.apps.handlers.project.config import load_project_config +from aipass.backup.apps.handlers.project.setup import create_backup_dir +from aipass.backup.apps.handlers.report.formatter import format_result +from aipass.backup.apps.handlers.report.result import BackupResult +from aipass.backup.apps.handlers.scan.filter import filter_paths +from aipass.backup.apps.handlers.scan.walk import walk_project +from aipass.backup.apps.handlers.state.changelog import append_changelog +from aipass.backup.apps.handlers.state.metadata import build_metadata +from aipass.backup.apps.handlers.state.timestamps import load_timestamps, save_timestamps MODULE_NAME = "versioned" PRIMARY_COMMAND = "versioned"