#!/usr/bin/env python3 # -*- coding: utf-8 -*- import sys import os import argparse import glob from autoterminal.config.loader import ConfigLoader from autoterminal.config.manager import ConfigManager from autoterminal.llm.client import LLMClient from autoterminal.utils.helpers import clean_command from autoterminal.history import HistoryManager def main(): """主程序入口""" # 解析命令行参数 parser = argparse.ArgumentParser(description='AutoTerminal - 智能终端工具') parser.add_argument('user_input', nargs='*', help='用户输入的自然语言命令') parser.add_argument('--api-key', help='API密钥') parser.add_argument('--base-url', help='Base URL') parser.add_argument('--model', help='模型名称') parser.add_argument('--history-count', type=int, help='历史命令数量') args = parser.parse_args() # 合并用户输入 user_input = ' '.join(args.user_input).strip() # 加载配置 config_loader = ConfigLoader() config = config_loader.get_config() # 命令行参数优先级最高 if args.api_key: config['api_key'] = args.api_key if args.base_url: config['base_url'] = args.base_url if args.model: config['model'] = args.model # 获取历史命令数量配置 history_count = args.history_count or config.get('max_history', 10) # 如果配置不完整,使用配置管理器初始化 config_manager = ConfigManager() if not all([config.get('api_key'), config.get('base_url'), config.get('model')]): config = config_manager.get_or_create_config() if not config: print("错误: 缺少必要的配置参数,请通过命令行参数或配置文件提供API密钥、Base URL和模型名称。") return 1 # 如果有命令行参数输入,直接处理 if user_input: # 初始化历史管理器 history_manager = HistoryManager(max_history=history_count) # 获取历史命令 history = history_manager.get_recent_history(history_count) # 获取当前目录内容 try: current_dir_content = glob.glob("*") except Exception as e: print(f"警告: 无法获取当前目录内容: {e}") current_dir_content = [] # 初始化LLM客户端 try: llm_client = LLMClient(config) except Exception as e: print(f"LLM客户端初始化失败: {e}") return 1 # 调用LLM生成命令 try: generated_command = llm_client.generate_command( user_input=user_input, history=history, current_dir_content=current_dir_content ) cleaned_command = clean_command(generated_command) # 优化输出格式 print(f"\033[1;32m$\033[0m {cleaned_command}") print("\033[1;37mPress Enter to execute...\033[0m") # 等待用户回车确认执行 try: input() # 在用户的环境中执行命令 os.system(cleaned_command) # 记录到历史 history_manager.add_command(user_input, cleaned_command) except EOFError: print("\n输入已取消。") return 0 except Exception as exec_e: print(f"命令执行失败: {exec_e}") return 1 except Exception as e: print(f"命令生成失败: {e}") return 1 return 0 else: # 处理空输入情况 - 生成基于上下文的推荐命令 history_manager = HistoryManager(max_history=history_count) history = history_manager.get_recent_history(history_count) try: current_dir_content = glob.glob("*") except Exception as e: print(f"警告: 无法获取当前目录内容: {e}") current_dir_content = [] try: llm_client = LLMClient(config) except Exception as e: print(f"LLM客户端初始化失败: {e}") return 1 # 获取最后执行的命令以避免重复推荐 last_executed_command = history_manager.get_last_executed_command() try: recommendation = llm_client.generate_command( user_input="", history=history, current_dir_content=current_dir_content, last_executed_command=last_executed_command ) cleaned_recommendation = clean_command(recommendation) if cleaned_recommendation.strip(): print(f"\033[1;34m💡 建议命令:\033[0m {cleaned_recommendation}") print("\033[1;37mPress Enter to execute, or Ctrl+C to cancel...\033[0m") try: input() os.system(cleaned_recommendation) history_manager.add_command("自动推荐", cleaned_recommendation) except EOFError: print("\n输入已取消。") return 0 except Exception as exec_e: print(f"命令执行失败: {exec_e}") return 1 else: print("没有找到相关的命令建议。") except Exception as e: print(f"命令推荐生成失败: {e}") return 1 if __name__ == "__main__": sys.exit(main())