Source code for ahvn.cli.repo_cli
"""\
Repo management commands for AgentHeaven CLI.
"""
import click
from ahvn.cli.utils import AliasedGroup
[docs]
def register_repo_commands(cli):
"""\
Register all repo management commands to the CLI.
"""
@cli.group("repo", cls=AliasedGroup, help="Manage registered repos.")
def repo():
pass
@repo.command("list", help="List all registered repos.")
def list_repos():
"""\
List all registered repos from global config, prettified.
"""
from ahvn.utils.basic.config_utils import HEAVEN_CM
from ahvn.utils.basic.path_utils import pj
from ahvn.utils.basic.file_utils import exists_dir
from ahvn.utils.basic.color_utils import color_success, color_error, color_warning, color_grey
repos = HEAVEN_CM.get("repos", level="global") or {}
if not repos:
click.echo(color_warning("No repos registered."))
return
click.echo("Registered repos:")
maxlen = max((len(str(name)) for name in repos), default=0)
for name, path in repos.items():
exists = exists_dir(pj(path, ".ahvn", abs=True))
status = color_success("✓") if exists else color_error("✗")
name_str = name.ljust(maxlen)
path_str = color_grey(path)
click.echo(f" {status} {name_str} {path_str}")
@repo.command("remove", help="Remove a registered repo by name.")
@click.argument("name", required=True)
def remove_repo(name):
"""\
Remove a registered repo from global config.
"""
from ahvn.utils.basic.config_utils import HEAVEN_CM
from ahvn.utils.basic.color_utils import color_success, color_error
repos = HEAVEN_CM.get("repos", level="global") or {}
if name not in repos:
click.echo(color_error(f"Repo '{name}' not found in global config."), err=True)
return
del repos[name]
HEAVEN_CM.set("repos", repos, level="global")
click.echo(color_success(f"Removed repo '{name}' from global config."))
@repo.command("rename", help="Rename a registered repo.")
@click.argument("old_name", required=True)
@click.argument("new_name", required=True)
def rename_repo(old_name, new_name):
"""\
Rename a registered repo in global config.
"""
from ahvn.utils.basic.config_utils import HEAVEN_CM
from ahvn.utils.basic.color_utils import color_success, color_error
repos = HEAVEN_CM.get("repos", level="global") or {}
if old_name not in repos:
click.echo(color_error(f"Repo '{old_name}' not found in global config."), err=True)
return
if new_name in repos:
click.echo(color_error(f"Repo '{new_name}' already exists."), err=True)
return
repos[new_name] = repos.pop(old_name)
HEAVEN_CM.set("repos", repos, level="global")
click.echo(color_success(f"Renamed repo '{old_name}' to '{new_name}'."))
@repo.command("info", help="Show details about a registered repo.")
@click.argument("name", required=True)
def repo_info(name):
"""\
Show details about a registered repo.
"""
from ahvn.utils.basic.config_utils import HEAVEN_CM
from ahvn.utils.basic.path_utils import pj
from ahvn.utils.basic.file_utils import exists_dir
from ahvn.utils.basic.color_utils import color_success, color_error
import os
import datetime
repos = HEAVEN_CM.get("repos", level="global") or {}
path = repos.get(name)
if not path:
click.echo(color_error(f"Repo '{name}' not found in global config."), err=True)
return
exists = exists_dir(pj(path, ".ahvn", abs=True))
click.echo(f"Repo: {name}")
click.echo(f" Path: {path}")
click.echo(f" Exists: {color_success('Yes') if exists else color_error('No')}")
if exists:
try:
stat = os.stat(path)
ctime = datetime.datetime.fromtimestamp(stat.st_ctime)
mtime = datetime.datetime.fromtimestamp(stat.st_mtime)
click.echo(f" Created: {ctime.strftime('%Y-%m-%d %H:%M:%S')}")
click.echo(f" Modified: {mtime.strftime('%Y-%m-%d %H:%M:%S')}")
except Exception:
pass
@repo.command("init", help="Initialize repo config in current directory (like git init). Optionally specify a repo name.")
@click.argument("name", required=False)
@click.option("--reset", "-r", is_flag=True, help="Reset local config to default values.")
def repo_init(name, reset):
"""\
Initialize repo config in current directory (like git init). Optionally specify a repo name.
"""
from ahvn.utils.basic.config_utils import HEAVEN_CM
from ahvn.utils.basic.file_utils import get_file_dir
from ahvn.utils.basic.color_utils import color_success
if HEAVEN_CM.init(reset=reset):
click.echo(color_success(f"Heaven repo initialized{' (reset)' if reset else ''}."))
repo_path = get_file_dir(HEAVEN_CM.local)
if name:
repos = HEAVEN_CM.get("repos", level="global") or {}
repos[name] = repo_path
HEAVEN_CM.set("repos", repos, level="global")
click.echo(color_success(f"Repo '{name}' registered in global config."))
else:
click.echo("Unnamed repo initialized (not registered globally).")