Files
agent-aide/aide-program/aide/main.py

173 lines
4.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""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())