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

207 lines
6.1 KiB
Python
Raw Normal View History

2025-12-13 05:01:28 +08:00
"""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
2025-12-14 05:52:59 +08:00
from aide.env.manager import EnvManager
2025-12-13 05:01:28 +08:00
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")
2025-12-14 05:52:59 +08:00
# aide init
2025-12-13 05:01:28 +08:00
init_parser = subparsers.add_parser("init", help="初始化 .aide 目录与默认配置")
init_parser.set_defaults(func=handle_init)
2025-12-14 05:52:59 +08:00
# aide env
2025-12-13 05:01:28 +08:00
env_parser = subparsers.add_parser("env", help="环境管理")
env_sub = env_parser.add_subparsers(dest="env_command")
2025-12-14 05:52:59 +08:00
# aide env ensure
2025-12-13 05:01:28 +08:00
ensure_parser = env_sub.add_parser("ensure", help="检测并修复运行环境")
2025-12-14 05:52:59 +08:00
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="显示详细配置信息",
)
2025-12-13 05:01:28 +08:00
ensure_parser.set_defaults(func=handle_env_ensure)
2025-12-14 05:52:59 +08:00
# aide env list
list_parser = env_sub.add_parser("list", help="列出所有可用模块")
list_parser.set_defaults(func=handle_env_list)
# aide env set
set_parser = env_sub.add_parser("set", help="设置环境配置(带验证)")
set_parser.add_argument("key", help="配置键modules 或 模块名.配置项")
set_parser.add_argument("value", help="配置值")
set_parser.set_defaults(func=handle_env_set)
2025-12-14 05:52:59 +08:00
# aide env无子命令时等同于 ensure
env_parser.set_defaults(func=handle_env_default)
# aide config
2025-12-13 05:01:28 +08:00
config_parser = subparsers.add_parser("config", help="配置管理")
config_sub = config_parser.add_subparsers(dest="config_command")
2025-12-14 05:52:59 +08:00
2025-12-13 05:01:28 +08:00
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
2025-12-14 05:52:59 +08:00
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
2025-12-13 05:01:28 +08:00
def handle_env_ensure(args: argparse.Namespace) -> bool:
2025-12-14 05:52:59 +08:00
"""aide env ensure 处理。"""
2025-12-13 05:01:28 +08:00
root = Path.cwd()
cfg = ConfigManager(root)
2025-12-14 05:52:59 +08:00
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
2025-12-13 05:01:28 +08:00
def handle_env_set(args: argparse.Namespace) -> bool:
"""aide env set 处理。"""
root = Path.cwd()
cfg = ConfigManager(root)
manager = EnvManager(root, cfg)
key = args.key
value = args.value
if key == "modules":
# 设置启用的模块列表
module_names = [m.strip() for m in value.split(",") if m.strip()]
return manager.set_modules(module_names)
elif "." in key:
# 设置模块配置,如 venv.path
parts = key.split(".", 1)
module_name = parts[0]
config_key = parts[1]
parsed_value = _parse_value(value)
return manager.set_module_config(module_name, config_key, parsed_value)
else:
# 无效的键格式
output.err(f"无效的配置键: {key}")
output.info("用法: aide env set modules <模块列表>")
output.info(" aide env set <模块名>.<配置项> <值>")
return False
2025-12-13 05:01:28 +08:00
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())