feat(backup): namespace migration standalone -> aipass.backup.* citizen — convert 47 internal imports across 11 files (apps.* -> aipass.backup.apps.*), fix importlib discovery string, drop sys.path/PROJECT_ROOT hack, add root __init__.py package marker. Diagnostics 0%->100%, Imports 99%->100%, overall 92%->95% (S220). Verified-by-artifact: all 10 drone cmds live, register+status e2e clean, ruff clean, zero standalone imports. Test_Quality (no suite) stays separate build (td-018)

This commit is contained in:
AIOSAI
2026-06-12 07:33:20 -07:00
parent dea91bc613
commit bbe3f43835
13 changed files with 62 additions and 54 deletions
@@ -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
+12
View File
@@ -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
# =============================================
+3 -7
View File
@@ -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:
+4 -4
View File
@@ -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"
@@ -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"
@@ -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"
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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"
+4 -4
View File
@@ -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:
+1 -1
View File
@@ -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"
+14 -14
View File
@@ -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"
+4 -4
View File
@@ -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"
+14 -14
View File
@@ -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"