avatar

mdo

Hello

  • 首页
  • 知识库
  • 归档
  • 标签
  • 关于
主页 命令行代码助手
文章

命令行代码助手

发表于 2026-08-27 更新于 2026-08- 27
作者 mdo
34~44 分钟 阅读

为你打造一个专属于终端的 命令行代码助手(CLI Code Assistant)。这个工具可以让你在终端里通过一行命令,直接调用前面设计好的 ThinkPHP 6(或其他语言)多智能体专家团队,对本地的代码文件进行一键 Review、找 Bug 或重构。

以下是完整的开发和配置步骤,基于 Python 3.10+ 和 CrewAI 2026 最新标准构建。


第一步:编写助手核心脚本 (code_helper.py)

在你的电脑上创建一个文件夹,并新建一个名为 code_helper.py 的文件。将以下完整代码粘贴进去。

这个脚本具备 自动识别文件后缀、安全读取、多智能体协同诊断、自动生成 Markdown 报告 的全套功能:

python

#!/usr/bin/env python3
import os
import sys
import argparse
from crewai import Agent, Task, Crew, Process, LLM

def main():
    # 1. 命令行参数解析
    parser = argparse.ArgumentParser(description="🚀 命令行 AI 代码助手 - 基于 CrewAI 多智能体架构")
    parser.add_argument("file_path", help="要检查的代码文件路径 (例如: app/controller/User.php)")
    parser.add_argument("--mode", choices=["review", "bug", "optimize"], default="review", 
                        help="模式: review(全面审查), bug(专查漏洞), optimize(专做性能优化)")
    
    args = parser.parse_args()

    # 2. 检查环境变量(必须配置 API 密钥)
    # 如果你使用 Ollama 或是其他模型,可以修改这里的 LLM 配置
    if "OPENAI_API_KEY" not in os.environ and "DEEPSEEK_API_KEY" not in os.environ:
        print("❌ 错误: 未检测到 API 密钥环境变量。")
        print("请在终端运行: export OPENAI_API_KEY='你的密钥' 或 export DEEPSEEK_API_KEY='你的密钥'")
        sys.exit(1)

    # 3. 读取目标代码文件
    if not os.path.exists(args.file_path):
        print(f"❌ 错误: 文件不存在 -> {args.file_path}")
        sys.exit(1)
        
    try:
        with open(args.file_path, "r", encoding="utf-8") as f:
            target_code = f.read()
    except Exception as e:
        print(f"❌ 错误: 无法读取文件: {e}")
        sys.exit(1)

    file_extension = os.path.splitext(args.file_path)[1].lower()
    print(f"🔍 正在读取文件: {args.file_path} (类型: {file_extension})")
    print("🤖 正在唤醒 AI 专家团队,请稍候...\n")

    # 4. 初始化大语言模型 (此处以 OpenAI 为例,可换成 deepseek/deepseek-chat 等)
    # 对于代码审查,我们将 temperature 压得非常低,确保极高准确度
    model_name = "openai/gpt-4o" if "OPENAI_API_KEY" in os.environ else "deepseek/deepseek-chat"
    llm = LLM(model=model_name, temperature=0.1)

    # 5. 定义智能体
    security_agent = Agent(
        role="代码安全与合规专家",
        goal="深度挖掘代码中的安全隐患(如注入、越权、未验证输入)以及代码规范问题",
        backstory="你是一名拥有多年代码审计经验的安全专家,能一眼看出不安全的写法和框架反模式。",
        llm=llm
    )

    perf_agent = Agent(
        role="高性能架构与重构专家",
        goal="分析代码的时空复杂度,消除计算瓶颈(如循环查库、内存溢出),提升执行效率",
        backstory="你是一名高并发系统专家,对冗余代码、低效算法和框架特有的性能坑(如 ThinkPHP N+1 问题)极为敏感。",
        llm=llm
    )

    lead_agent = Agent(
        role="首席代码总监 (Tech Lead)",
        goal="汇总安全与性能专家的报告,输出一份最终重构后的完美代码和精简审查总结",
        backstory="你是团队的最终把关人,善于将零散的建议融合为符合 Clean Code 原则、可以直接线上运行的高质量代码。",
        llm=llm
    )

    # 6. 根据命令行模式动态调整任务
    tasks = []
    
    if args.mode in ["review", "bug"]:
        tasks.append(Task(
            description=f"审查以下代码的安全风险、边界异常及规范违背:\n\n{target_code}",
            expected_output="安全及异常诊断报告清单。",
            agent=security_agent
        ))
        
    if args.mode in ["review", "optimize"]:
        tasks.append(Task(
            description=f"分析以下代码的数据库/算法性能瓶颈及重构空间:\n\n{target_code}",
            expected_output="性能与架构调优建议书。",
            agent=perf_agent
        ))

    # 最终汇总输出任务
    tasks.append(Task(
        description=f"结合前置专家的意见,对位于 {args.file_path} 的源代码进行重写,并输出完整的 Markdown 诊断报告。",
        expected_output="包含以下三部分的 Markdown 文档:\n1. 🚨 核心缺陷清单\n2. 🛠 完美重构后的完整代码(带中文清晰注释)\n3. 💡 修改要点解释",
        agent=lead_agent
    ))

    # 7. 组建团队并执行
    crew = Crew(
        agents=[security_agent, perf_agent, lead_agent],
        tasks=tasks,
        process=Process.sequential,
        verbose=False # 保持命令行干净,不输出中间的思考过程
    )

    result = crew.kickoff()

    # 8. 输出结果并在本地生成一份 Markdown 报告备份
    print("✨ 审查完成!以下为专家团队给出的评审报告:\n")
    print(result.raw)

    output_report_path = f"review_report_{os.path.basename(args.file_path)}.md"
    with open(output_report_path, "w", encoding="utf-8") as f:
        f.write(result.raw)
    print(f"\n💾 完整的 Markdown 报告已自动保存至本地: {output_report_path}")

if __name__ == "__main__":
    main()

请谨慎使用此类代码。


第二步:配置全局命令行快捷键(Linux / macOS / Windows)

为了能像 git 或 php 命令一样,在终端里随时随地使用这个助手,我们需要将其注册为系统全局命令:

💡 在 macOS / Linux 系统下:

  1. 给脚本赋予执行权限:

    bash

    chmod +x code_helper.py
    

    请谨慎使用此类代码。

  2. 打开你的终端配置文件(如 ~/.bashrc 或 ~/.zshrc):

    bash

    nano ~/.zshrc
    

    请谨慎使用此类代码。

  3. 在文件末尾添加一行别名(Alias),将命令缩写为 review(路径请更换为你本地的实际绝对路径):

    bash

    alias review="python3 /path/to/your/code_helper.py"
    

    请谨慎使用此类代码。

  4. 保存退出后,刷新配置:

    bash

    source ~/.zshrc
    

    请谨慎使用此类代码。

💡 在 Windows (PowerShell) 系统下:

  1. 打开 PowerShell 配置文件:

    powershell

    notepad $PROFILE
    

    请谨慎使用此类代码。

  2. 在里面添加一个函数定义:

    powershell

    function review {
        python "C:\path\to\your\code_helper.py" $args
    }
    

    请谨慎使用此类代码。

  3. 保存并重启 PowerShell。


第三步:在终端尽情使用它!

配置完成后,你只需要在你的项目目录下,对着任何写好的代码文件敲下命令。

1. 进行最全面的多智能体 Code Review (默认)

bash

# 导入你的 API 密钥 (首次使用需要)
export OPENAI_API_KEY="sk-..."

# 运行一键审查
review app/controller/UserController.php

请谨慎使用此类代码。

终端会立刻响应,安静地在后台调度 3 个专家智能体,大约 15-30 秒后,直接在终端里打印出排版精美的 Markdown 报告,同时在你的当前目录下生成一份 review_report_UserController.php.md 文件。

2. 只做快速的 Bug 与安全性筛查(速度更快)

bash

review app/model/Order.php --mode bug

请谨慎使用此类代码。

3. 只专注于找出代码性能瓶颈和重构空间

bash

review app/common.php --mode optimize

请谨慎使用此类代码。


为了让这个命令行助手在你的实际工作中更具生产力,你可以告诉我:

  • 你目前开发首选的大模型 API 是哪一家?(例如:DeepSeek 追求极高性价比,OpenAI / Claude 追求最强代码重构能力,我可以帮你针对性优化底层的 LLM 初始化参数)。

  • 你是否希望为这个命令行工具加上自动扫描整个文件夹、或是与 Git 联动(只审查 ^_^git diff 变动的代码)的高级功能?

为了满足你对“深度集成开发工作流”的需求,我为你带来这个工具的终极进化版。

我们将为命令行助手植入两个核心高阶能力:

  1. 自动识别 DeepSeek API(高性价比、极强的代码推理能力)。

  2. 完美联动 Git(支持直接扫描 git diff,只审查你今天刚刚修改、尚未提交的代码,拒绝全量扫描,精准高效)。


第一步:终极版核心脚本 code_helper.py

请用以下代码完全覆盖你之前的 code_helper.py 文件。这里引入了 subprocess 模块,用于自动抓取本地 Git 的代码变动。

python

#!/usr/bin/env python3
import os
import sys
import argparse
import subprocess
from crewai import Agent, Task, Crew, Process, LLM

def get_git_diff():
    """自动化获取本地 Git 当前尚未提交的修改(Staged 和 Unstaged)"""
    try:
        # 1. 获取未暂存(Unstaged)和已暂存(Staged)的所有代码改动
        # 使用 --unified=0 仅提取改动行,不带多余上下文
        result = subprocess.run(
            ["git", "diff", "HEAD", "--unified=0"], 
            capture_output=True, 
            text=True, 
            check=True
        )
        return result.stdout.strip()
    except subprocess.CalledProcessError:
        print("❌ 错误: 无法执行 git diff。请确保当前目录是一个 Git 仓库,且已进行了初始化。")
        sys.exit(1)
    except FileNotFoundError:
        print("❌ 错误: 本地未安装 Git 命令行工具。")
        sys.exit(1)

def main():
    parser = argparse.ArgumentParser(description="🚀 终极版 CLI 代码助手 - 支持 Git 增量审查与 DeepSeek 驱动")
    parser.add_argument("file_path", nargs="?", default=None, 
                        help="要检查的代码文件路径。如果留空,将自动进入 Git 增量审查模式")
    parser.add_argument("--mode", choices=["review", "bug", "optimize"], default="review", 
                        help="模式: review(全面审查), bug(专查漏洞), optimize(专做性能优化)")
    
    args = parser.parse_args()

    # 2. 智能大模型选择逻辑(优先适配 2026 年最具性价比的 DeepSeek-V3/R1)
    if "DEEPSEEK_API_KEY" in os.environ:
        print("💡 检测到 DeepSeek 密钥,正在启动 DeepSeek 代码推理模型...")
        # 2026年 CrewAI 标准:使用 deepseek/deepseek-reasoner 或 deepseek-chat
        llm = LLM(
            model="deepseek/deepseek-reasoner", 
            temperature=0.1,
            base_url="https://deepseek.com"
        )
    elif "OPENAI_API_KEY" in os.environ:
        print("💡 检测到 OpenAI 密钥,正在启动 GPT-4o 模型...")
        llm = LLM(model="openai/gpt-4o", temperature=0.1)
    else:
        print("❌ 错误: 未检测到环境变量。请在终端配置密钥:")
        print("👉 DeepSeek: export DEEPSEEK_API_KEY='您的密钥'")
        print("👉 OpenAI:   export OPENAI_API_KEY='您的密钥'")
        sys.exit(1)

    # 3. 确定审查的目标代码
    if args.file_path:
        # 模式 A:指定单文件全量审查
        if not os.path.exists(args.file_path):
            print(f"❌ 错误: 文件不存在 -> {args.file_path}")
            sys.exit(1)
        try:
            with open(args.file_path, "r", encoding="utf-8") as f:
                target_code = f.read()
            context_title = f"文件全量审查: {args.file_path}"
            output_filename = f"review_{os.path.basename(args.file_path)}.md"
        except Exception as e:
            print(f"❌ 错误: 无法读取文件: {e}")
            sys.exit(1)
    else:
        # 模式 B:Git 增量审查模式(核心亮点)
        print("⚡ 未指定文件,自动启动 [Git 增量审查模式]...")
        git_diff = get_git_diff()
        if not git_diff:
            print("✅ 完美!本地没有检测到任何尚未提交的代码改动(Git Diff 为空)。")
            sys.exit(0)
        target_code = git_diff
        context_title = "Git 增量改动 (Code Diff)"
        output_filename = "git_patch_review_report.md"

    print(f"🔍 目标就绪 [{context_title}]。正在调度 CrewAI 专家团队进行诊断...")

    # 4. 构建 ThinkPHP 6 / 通用现代代码专家 Agent 团队
    security_agent = Agent(
        role="安全与合规审计专家",
        goal="发现代码中的注入、鉴权绕过、未验证输入以及违反框架/语言设计规范的问题",
        backstory="你拥有极强的静态代码审计(SAST)能力,擅长发现隐藏的逻辑漏洞及不规范的安全隐患。",
        llm=llm
    )

    perf_agent = Agent(
        role="高性能重构架构师",
        goal="分析代码瓶颈(如循环内查询、高昂开销、内存泄漏),提出优雅的重构与性能劣化防御方案",
        backstory="你对代码性能有极致的追求,不能容忍任何低效的资源浪费和坏味道(Code Smell)。",
        llm=llm
    )

    lead_agent = Agent(
        role="首席代码总监 (Tech Lead)",
        goal="综合安全与性能报告,产出可以直接在生产环境运行的、最干净完美的最终合并重构方案",
        backstory="你是团队的最终守门人,擅长把专家的琐碎建议翻译成符合 Clean Code 和大师级设计模式的最终代码。",
        llm=llm
    )

    # 5. 动态装配任务
    tasks = []
    if args.mode in ["review", "bug"]:
        tasks.append(Task(
            description=f"请审查以下代码中可能存在的 Bug、越权、注入隐患、未捕获异常或不规范写法:\n\n{target_code}",
            expected_output="安全及异常诊断报告,指明具体风险行的行号(如 Diff 中可见)或核心原因。",
            agent=security_agent
        ))
        
    if args.mode in ["review", "optimize"]:
        tasks.append(Task(
            description=f"请分析以下代码在时间和空间复杂度上的缺陷,是否存在框架反模式(如 TP6 的 N+1 次循环查询数据库):\n\n{target_code}",
            expected_output="性能及代码质量重构建议书。",
            agent=perf_agent
        ))

    tasks.append(Task(
        description=f"结合前置评审,对这些改动进行彻底重写或提供修复后的完整代码段。场景上下文:{context_title}",
        expected_output="""一份排版优美的 Markdown 最终评审报告。必须严格包含:
        1. 🚨 核心缺陷清单(只列出最致命的 Bug 或性能瓶颈)
        2. 🛠 修复重构后的【代码片段/完整代码】(带有面向未来的中文注释和类型提示)
        3. 💡 本次改动的技术亮点与优化逻辑说明""",
        agent=lead_agent
    ))

    # 6. 启动团队
    crew = Crew(
        agents=[security_agent, perf_agent, lead_agent],
        tasks=tasks,
        process=Process.sequential,
        verbose=False  # 隐藏中间思考链,保持终端整洁
    )

    result = crew.kickoff()

    # 7. 打印与落地保存
    print("\n" + "="*20 + " 🏆 AI 专家评审报告 🏆 " + "="*20 + "\n")
    print(result.raw)
    print("\n" + "="*60 + "\n")

    with open(output_filename, "w", encoding="utf-8") as f:
        f.write(result.raw)
    print(f"💾 报告已本地归档至: {output_filename}\n")

if __name__ == "__main__":
    main()

请谨慎使用此类代码。


第二步:配置终端“降本增效”体验

  1. 打开终端,配置你的快捷别名(Alias):

    • macOS/Linux: 在 ~/.zshrc 或 ~/.bashrc 中加入:

      bash

      alias review="python3 /你的实际绝对路径/code_helper.py"
      

      请谨慎使用此类代码。

    • 执行 source ~/.zshrc 刷新。

  2. 注入你的 DeepSeek API Key(当前 2026 年开发首选,代码能力媲美 top 闭源,且成本极低):

    bash

    export DEEPSEEK_API_KEY="sk-xxxxxxxxxxxxxxxxxxxxxxxx"
    

    请谨慎使用此类代码。


第三步:日常开发怎么用?(两个超爽的实战场景)

🚀 场景一:每天下班前,做“增量代码”自我审计(最常用)

你今天在 ThinkPHP 6 项目里改动了 3 个文件、加了 50 行代码。在提交 git commit 或推送到远程触发 CI/CD 之前,你只需要在项目根目录下输入:

bash

review

请谨慎使用此类代码。

  • AI 做了什么:命令发现你没传文件路径,自动执行了 git diff,精准抓取了你今天修改的那 50 行代码送给 DeepSeek 专家组。

  • 效果:不需要通篇扫描几万行的老项目,只对你今天的新代码做 Review,速度极快(通常 15 秒内响应完成),直接把可能的 Bug 扼杀在本地。

📝 场景二:拿到同事写的一块很烂的文件,全量重构

bash

review app/controller/OrderController.php --mode optimize

请谨慎使用此类代码。

  • AI 做了什么:不管 Git,全量读取这个控制器文件,启动高性能专家,专门寻找循环查库、大对象未释放等瓶颈,并在本地生成一份 review_OrderController.php.md 的重构方案。


为了让这个终端工具有更好的体验,我们可以做进一步优化:

  • 你是否希望把它集成进 Git Hooks?(例如:在执行 git commit 时强制自动触发审查,如果 AI 发现严重 Bug,直接阻止提交?)

  • 你当前的团队中是否有更细粒度的代码规范?(例如:必须遵守 PSR-12 规范、或者必须使用统一的 API 状态码返回类?我可以把这些规则作为背景故事硬编码塞给 Agent)。

技术
许可协议:  CC BY 4.0
分享

相关文章

10月 2, 2026

iOS 侧载(Sideloading)工具

AltStore 和 Sideloadly 都是目前最流行的 iOS 侧载(Sideloading)工具。 简单来说,它们的作用就是让你绕过苹果的官方 App Store,直接把第三方的 IPA 安装包(也就是 iOS 的应用安装文件)安装到你的 iPhone 或 iPad 上。 通过这两个工具,你

9月 28, 2026

注册 Chat Participant

将当前服务接入 VS Code 的 AI 聊天窗口是完全可行的。VS Code 在近期的版本中正式推出了 Chat Extensions API(github.copilot.chat),允许第三方扩展将自定义的 LLM 服务或工具注册到 Copilot Chat 面板中。 结合当前 code_ge

9月 23, 2026

php intelephense 设置 if 空格

在 VS Code 中,如果你使用的是 PHP Intelephense 插件,控制 if 关键字后面是否加空格的设置是由其内置的格式化引擎(基于 PSR-12 标准)决定的。 你可以通过修改 VS Code 的 settings.json 来配置这个行为: 1. 开启 if 后面的空格(默认/推荐

下一篇

可视化的 UI 控制台页面

上一篇

OpenRouter 免费通道

最近更新

  • 比尔盖茨的智慧:想多赚钱,就每天循环做这3件事
  • iOS 侧载(Sideloading)工具
  • 程序员越想创业,越不要急着动手
  • 注册 Chat Participant
  • 中秋给在外游子的一封信

热门标签

API CodeGeex Coding Cursor DeepSeek Docker Gitkraken Harness Laravel Management

目录

©2026 mdo. 保留部分权利。