From 1f3727d4fc91051e1a5e6a802b9df4b21144f315 Mon Sep 17 00:00:00 2001 From: AIOSAI Date: Fri, 12 Jun 2026 09:05:20 -0700 Subject: [PATCH] =?UTF-8?q?fix(backup):=20split=20top-level=20--help=20fro?= =?UTF-8?q?m=20bare=20introspection=20=E2=80=94=20drone=20@backup=20--help?= =?UTF-8?q?=20now=20shows=20a=20curated=20Rich=20command=20reference=20(bo?= =?UTF-8?q?xed=20header=20+=20USAGE=20+=20COMMANDS),=20bare=20drone=20@bac?= =?UTF-8?q?kup=20shows=20the=20discovered-modules=20self-map.=20Previously?= =?UTF-8?q?=20both=20fell=20through=20to=20one=20conflated=20module-list?= =?UTF-8?q?=20block.=20Also=20revives=20the=20dead=20print=5Fintrospection?= =?UTF-8?q?()=20(was=20unused).=20Matches=20the=20commons/skills=20citizen?= =?UTF-8?q?=20pattern.=20ruff=20clean,=20both=20paths=20verified=20live=20?= =?UTF-8?q?(S220)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/aipass/backup/apps/backup.py | 68 ++++++++++++++++++++++++-------- 1 file changed, 52 insertions(+), 16 deletions(-) diff --git a/src/aipass/backup/apps/backup.py b/src/aipass/backup/apps/backup.py index 2526e9c9..a32b30d5 100644 --- a/src/aipass/backup/apps/backup.py +++ b/src/aipass/backup/apps/backup.py @@ -23,18 +23,58 @@ from typing import Any os.environ.setdefault("AIPASS_BRANCH_NAME", "backup") from aipass.prax import logger -from aipass.cli.apps.modules import console +from aipass.cli.apps.modules import console, header VERSION = "1.0.0" MODULE_NAME = "backup" MODULES_DIR = Path(__file__).parent / "modules" -def print_introspection(): - """Display entry point info.""" - console.print(f"[bold cyan]{MODULE_NAME}[/bold cyan] v{VERSION}") - console.print(" Type: entry point (auto-discovery router)") - console.print(f" Modules dir: {MODULES_DIR}") +def print_introspection(modules: list[Any]) -> None: + """Display discovered modules — the bare self-map (run with no args).""" + console.print() + console.print(f"[bold cyan]BACKUP[/bold cyan] v{VERSION} — project backup & drive sync") + console.print() + console.print(f"[yellow]Discovered Modules:[/yellow] {len(modules)}") + console.print() + for module in modules: + name = module.__name__.split(".")[-1] + doc = (module.__doc__ or "").strip().split("\n")[0] + console.print(f" [cyan]-[/cyan] {name:20} [dim]{doc or 'No description'}[/dim]") + console.print() + console.print("[dim]Run 'drone @backup --help' for usage and commands[/dim]") + console.print() + + +def print_help() -> None: + """Display the curated Rich-formatted command reference.""" + console.print() + header("BACKUP — project backup & drive sync") + console.print() + console.print("[dim]Snapshot, version, and sync project backups to a local store or remote drive.[/dim]") + console.print() + console.print("-" * 70) + console.print() + console.print("[bold cyan]USAGE:[/bold cyan]") + console.print() + console.print(" [dim]drone @backup [/dim]") + console.print(" [dim]drone @backup --help[/dim]") + console.print() + console.print("-" * 70) + console.print() + console.print("[bold cyan]COMMANDS:[/bold cyan]") + console.print() + console.print(" [green]snapshot[/green] Full mirror backup of a project") + console.print(" [green]versioned[/green] Incremental timestamped backup") + console.print(" [green]all[/green] Run snapshot then versioned in sequence") + console.print(" [green]register[/green] Register a project + scaffold its .backup_system/") + console.print(" [green]status[/green] Show backup info and recent history") + console.print(" [green]settings[/green] View/edit backup settings") + console.print(" [green]drive_sync[/green] Sync backups to the remote drive") + console.print(" [green]drive_test[/green] Test the remote drive connection") + console.print(" [green]drive_stats[/green] Drive usage statistics") + console.print(" [green]drive_clear[/green] Clear backups from the remote drive") + console.print() def discover_modules() -> list[Any]: @@ -81,16 +121,12 @@ def main(): modules = discover_modules() - if len(args) == 0 or args[0] in ["--help", "-h", "help"]: - console.print(f"[bold]BACKUP[/bold] v{VERSION} — {len(modules)} modules") - console.print("") - for module in modules: - name = module.__name__.split(".")[-1] - doc = (module.__doc__ or "").strip().split("\n")[0] - desc = doc if doc else "No description" - console.print(f" [yellow]{name:20}[/yellow] {desc}") - console.print("") - console.print("[dim]Usage: backup [/dim]") + if len(args) == 0: + print_introspection(modules) + return 0 + + if args[0] in ["--help", "-h", "help"]: + print_help() return 0 command = args[0]