"""aide 命令行入口。""" from __future__ import annotations import argparse import sys from pathlib import Path from typing import Any from aide.core import output from aide.core.config import ConfigManager from aide.env.manager import EnvManager def main(argv: list[str] | None = None) -> int: parser = build_parser() args = parser.parse_args(argv) if not hasattr(args, "func"): parser.print_help() return 0 try: result = args.func(args) except KeyboardInterrupt: output.err("操作已取消") return 1 if result is False: return 1 return 0 def build_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser(prog="aide", description="Aide 工作流辅助工具") subparsers = parser.add_subparsers(dest="command") # aide init init_parser = subparsers.add_parser("init", help="初始化 .aide 目录与默认配置") init_parser.set_defaults(func=handle_init) # aide env env_parser = subparsers.add_parser("env", help="环境管理") env_sub = env_parser.add_subparsers(dest="env_command") # aide env ensure ensure_parser = env_sub.add_parser("ensure", help="检测并修复运行环境") ensure_parser.add_argument( "--runtime", action="store_true", help="仅检查 aide 运行时环境(python + uv)", ) ensure_parser.add_argument( "--modules", type=str, help="指定要检测的模块(逗号分隔)", ) ensure_parser.add_argument( "--all", action="store_true", dest="check_all", help="检测所有已启用模块(仅检查不修复)", ) ensure_parser.add_argument( "-v", "--verbose", action="store_true", help="显示详细配置信息", ) ensure_parser.set_defaults(func=handle_env_ensure) # aide env list list_parser = env_sub.add_parser("list", help="列出所有可用模块") list_parser.set_defaults(func=handle_env_list) # aide env(无子命令时等同于 ensure) env_parser.set_defaults(func=handle_env_default) # aide config config_parser = subparsers.add_parser("config", help="配置管理") config_sub = config_parser.add_subparsers(dest="config_command") get_parser = config_sub.add_parser("get", help="读取配置值") get_parser.add_argument("key", help="使用点号分隔的键名,如 task.source") get_parser.set_defaults(func=handle_config_get) set_parser = config_sub.add_parser("set", help="设置配置值") set_parser.add_argument("key", help="使用点号分隔的键名,如 task.source") set_parser.add_argument("value", help="要写入的值,支持 bool/int/float/字符串") set_parser.set_defaults(func=handle_config_set) parser.add_argument("--version", action="version", version="aide dev") return parser def handle_init(args: argparse.Namespace) -> bool: root = Path.cwd() cfg = ConfigManager(root) cfg.ensure_config() cfg.ensure_gitignore() output.ok("初始化完成,.aide/ 与默认配置已准备就绪") return True def handle_env_default(args: argparse.Namespace) -> bool: """aide env(无子命令)等同于 aide env ensure。""" if args.env_command is None: # 无子命令,执行默认的 ensure root = Path.cwd() cfg = ConfigManager(root) manager = EnvManager(root, cfg) return manager.ensure() return True def handle_env_ensure(args: argparse.Namespace) -> bool: """aide env ensure 处理。""" root = Path.cwd() cfg = ConfigManager(root) manager = EnvManager(root, cfg) # 解析 --modules 参数 modules = None if args.modules: modules = [m.strip() for m in args.modules.split(",") if m.strip()] return manager.ensure( runtime_only=args.runtime, modules=modules, check_only=args.check_all, verbose=args.verbose, ) def handle_env_list(args: argparse.Namespace) -> bool: """aide env list 处理。""" root = Path.cwd() cfg = ConfigManager(root) manager = EnvManager(root, cfg) manager.list_modules() return True def handle_config_get(args: argparse.Namespace) -> bool: root = Path.cwd() cfg = ConfigManager(root) value = cfg.get_value(args.key) if value is None: output.warn(f"未找到配置项 {args.key}") return False output.info(f"{args.key} = {value!r}") return True def handle_config_set(args: argparse.Namespace) -> bool: root = Path.cwd() cfg = ConfigManager(root) parsed_value = _parse_value(args.value) cfg.set_value(args.key, parsed_value) return True def _parse_value(raw: str) -> Any: lowered = raw.lower() if lowered in {"true", "false"}: return lowered == "true" try: if "." in raw: return float(raw) return int(raw) except ValueError: return raw if __name__ == "__main__": sys.exit(main())