173 lines
4.9 KiB
Python
173 lines
4.9 KiB
Python
"""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())
|