UNPKG

git-aiflow

Version:

🚀 An AI-powered workflow automation tool for effortless Git-based development, combining smart GitLab/GitHub merge & pull request creation with Conan package management.

765 lines (578 loc) 21.9 kB
# AIFlow 🚀 基于 AI 的智能工作流自动化工具,支持 GitLab 合并请求创建和 Conan 包管理。 📖 **[English](README-EN.md)** | 中文 ## 📋 目录 - [功能特性](#功能特性) - [工具介绍](#工具介绍) - [环境要求](#环境要求) - [安装配置](#安装配置) - [使用方法](#使用方法) - [配置说明](#配置说明) - [工作流程](#工作流程) - [故障排除](#故障排除) - [开发说明](#开发说明) ## ✨ 功能特性 - 🤖 **AI 智能生成**:使用 OpenAI API 自动生成提交信息和分支名称 - 🔄 **自动化工作流**:从代码变更到合并请求一键完成 - 📦 **Conan 包管理**:专门支持 Conan 包版本更新 - 🌐 **多平台 Git 集成**:支持 GitHub、GitLab、Gitee 等多个 Git 托管平台 - 📱 **企业微信通知**:通过 WeCom Webhook 发送通知 - 🎯 **智能分支检测**:自动识别目标分支 - 🔧 **灵活配置**:支持多种配置选项和环境变量 - 📝 **交互式文件选择**:智能文件暂存,支持批量选择和分类显示 - 🎯 **仅提交模式**:支持仅提交代码变更而不创建合并请求 - 👥 **合并请求管理**:支持指派人和审查者自动配置 - 🌍 **多语言支持**:AI 生成内容支持多种语言(中文、英文、日文等) ## 🛠️ 工具介绍 本项目包含两个主要工具: ### 1. AIFlow (`aiflow`) 通用的 Git 自动合并请求工具,适用于任何代码变更。 **使用场景**- 功能开发 - Bug 修复 - 代码重构 - 文档更新 ### 2. AIFlow Conan (`aiflow-conan`) 专门用于 Conan 包版本更新的自动化工具。 **使用场景**- 依赖包版本更新 - 安全补丁应用 - 包配置优化 ## 📋 环境要求 - **Node.js**: >= 22.0.0 - **npm**: >= 11.0.0 - **Git**: 已配置且能访问远程仓库 - **Git 托管平台**: GitHub、GitLab、Gitee 等平台的 Personal Access Token - **OpenAI**: 有效的 API Key(💡 推荐:查看 [免费模型配置指南](docs/free-models.md) 获取免费API) ## 🔧 安装配置 ### 1. 克隆项目 ```bash git clone git@github.com:HeiSir2014/git-aiflow.git cd git-aiflow ``` ### 2. 安装依赖 ```bash npm install ``` ### 3. 构建项目 ```bash npm run build ``` ### 4. 配置 AIFlow 交互式初始化配置: ```bash # 初始化本地配置 aiflow init # 或初始化全局配置 aiflow init --global ``` 您也可以手动创建配置文件或使用环境变量。 **配置优先级**(从高到低): 1. 命令行参数 2. 本地配置文件(`.aiflow/config.yaml`3. 全局配置文件(`~/.config/aiflow/config.yaml``%APPDATA%/aiflow/config.yaml`4. 环境变量(`.env` 文件或系统环境变量) **配置文件示例**```yaml # AIFlow 配置文件 # 配置优先级: 命令行参数 > 本地配置 > 全局配置 > 环境变量 # OpenAI API 配置 - 用于AI驱动的功能 openai: # OpenAI API 密钥 (必需) - 用于生成提交信息和代码分析 key: sk-your-actual-openai-api-key # OpenAI API 基础URL (必需) - API请求的端点地址 baseUrl: https://api.openai.com/v1 # OpenAI 模型名称 (必需) - 指定使用的AI模型,如 gpt-3.5-turbo, gpt-4 # 💡 免费模型推荐:查看 docs/free-models.md 获取免费API配置 model: gpt-3.5-turbo # Git 访问令牌配置 - 支持多个Git托管平台 git_access_tokens: # GitHub 访问令牌 - 格式: ghp_xxxxxxxxxxxxxxxxxxxx github.com: ghp_xxxxxxxxxxxxxxxxxxxxx # GitLab 访问令牌 - 格式: glpat-xxxxxxxxxxxxxxxxxxxx gitlab.example.com: glpat-xxxxxxxxxxxxxxxxxxxxx # Gitee 访问令牌 - 格式: gitee_xxxxxxxxxxxxxxxxxxxx gitee.com: gitee_xxxxxxxxxxxxxxxxxxxxx # 您可以添加更多Git托管平台的令牌 # 格式: 主机名: 访问令牌 # Conan 包管理器配置 - 用于C++包管理和版本更新 conan: # Conan 远程仓库基础URL (Conan操作时必需) - Conan包仓库的API地址 # remoteBaseUrl: https://conan.example.com # Conan 远程仓库名称 (可选) - 默认使用的仓库名称,默认为'repo' remoteRepo: repo # 企业微信通知配置 - 用于发送操作结果通知 wecom: # 启用企业微信通知 (可选) - 是否开启通知功能,默认为false enable: true # 企业微信机器人Webhook地址 (可选) - 用于发送通知消息的机器人地址 webhook: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your-webhook-key # Git 合并请求配置 - 控制MR的默认行为 git: # 压缩提交 (可选) - 合并时是否将多个提交压缩为一个,默认为true squashCommits: true # 删除源分支 (可选) - 合并后是否删除源分支,默认为true removeSourceBranch: true # AI生成语言 (可选) - AI生成commit message和MR描述的语言,默认为en # 支持的语言代码: en, zh-CN, zh-TW, ja, ko, fr, de, es, ru, pt, it generation_lang: en # 合并请求指派配置 - 配置指派人和审查者 merge_request: # 单个指派人用户ID (可选) - 设置为0或留空取消指派 assignee_id: 0 # 指派人用户ID数组 (可选) - 多个指派人,设置为空数组取消所有指派 assignee_ids: [] # 审查者用户ID数组 (可选) - 设置为空数组不添加审查者 reviewer_ids: [] ``` ## 🚀 使用方法 ### AIFlow 工具 用于处理已暂存的 Git 变更: ```bash # 1. 初始化配置(首次使用) aiflow init # 本地配置 aiflow init --global # 全局配置 # 2. 暂存你的变更(或让工具自动选择) git add . # 手动暂存所有变更 # 或者直接运行 aiflow,工具会提供交互式文件选择 # 3. 运行自动 MR 工具 aiflow # 完整工作流:暂存 → 提交 → 创建 MR aiflow --commit-only # 仅提交模式:暂存 → 提交(不创建 MR) aiflow -co # 仅提交模式(短参数) # 4. 使用 CLI 参数覆盖配置 aiflow -ok sk-abc123 -gat github.com=ghp-xyz789 # 5. 查看帮助信息 aiflow --config-help # 查看配置选项帮助 aiflow --help # 查看一般帮助 ``` **交互式文件选择功能**: 当没有暂存文件时,工具会自动提供交互式文件选择界面: ```bash 📁 Detected file changes: ────────────────────────────────────────────────── 📝 Modified files: 1. src/components/UserProfile.tsx 2. src/api/userService.ts ❓ Untracked files: 3. src/types/user.ts 4. README.md 🎯 File selection options: • Enter file numbers (e.g., 1,3,5 or 1-5) • Type "all" to stage all files • Type "modified" to stage only modified files • Type "untracked" to stage only untracked files • Press Enter or type "cancel" to cancel 📋 Select files to stage: 1,3 ``` **工作流程**1. ✅ 检查暂存的变更(如无则提供交互式文件选择) 2. 🎯 自动检测目标分支 3. 🤖 AI 生成提交信息和分支名 4. 📤 创建分支并推送 5. 📋 创建合并请求(支持指派人和审查者) 6. 📱 发送企业微信通知 7. 📋 复制 MR 信息到剪贴板 ### AIFlow Conan 工具 用于更新 Conan 包版本: ```bash # 初始化配置(首次使用) aiflow-conan init # 本地配置 aiflow-conan init --global # 全局配置 # 更新指定包(使用默认仓库) aiflow-conan <package-name> # 更新指定包(指定仓库) aiflow-conan <package-name> <remote-repo> # 示例 aiflow-conan zterm aiflow-conan winusb repo # 使用 CLI 参数覆盖配置 aiflow-conan -ok sk-abc123 -gat gitlab.example.com=glpat-xyz789 zterm # 查看配置帮助 aiflow-conan --config-help # 查看帮助信息 aiflow-conan --help ``` **前置要求**- 当前目录包含 `conandata.yml` - 当前目录包含 `conan.win.lock` **工作流程**1. 📦 从远程获取最新包信息 2. 📝 更新本地配置文件 3. 🎯 检测目标分支 4. 🤖 AI 生成提交信息 5. 📤 创建分支并推送 6. 📋 创建 GitLab 合并请求 7. 📱 发送企业微信通知 ## ⚙️ 配置说明 ### 配置方式 AIFlow 支持多种配置方式,优先级从高到低如下: 1. **命令行参数**(最高优先级) 2. **本地配置文件**`.aiflow/config.yaml`3. **全局配置文件**`~/.config/aiflow/config.yaml``%APPDATA%/aiflow/config.yaml`4. **环境变量**(最低优先级) ### 交互式配置 ```bash # 初始化本地配置 aiflow init # 初始化全局配置 aiflow init --global ``` ### CLI 参数 | 短参数 | 长参数 | 描述 | 必需/可选 | |--------|--------|------|-----------| | `-ok` | `--openai-key` | OpenAI API 密钥 | 必需 | | `-obu` | `--openai-base-url` | OpenAI API 基础 URL | 必需 | | `-om` | `--openai-model` | OpenAI 模型名称 | 必需 | | `-gat` | `--git-access-token` | Git 访问令牌 (格式: 主机名=令牌) | 必需 | | `-crbu` | `--conan-remote-base-url` | Conan 仓库 API URL | Conan操作必需 | | `-crr` | `--conan-remote-repo` | Conan 仓库名称 | 可选 | | `-ww` | `--wecom-webhook` | 企业微信 webhook URL | 可选 | | `-we` | `--wecom-enable` | 启用企业微信通知 | 可选 | | `-sc` | `--squash-commits` | 压缩提交 | 可选 | | `-rsb` | `--remove-source-branch` | 删除源分支 | 可选 | | `-ggl` | `--git-generation-lang` | AI 生成语言 | 可选 | | `-co` | `--commit-only` | 仅提交模式 | 可选 | | `-cmo` | `--commit-only` | 仅提交模式 | 可选 | | `-mrai` | `--merge-request-assignee-id` | 指派人用户ID | 可选 | | `-mrais` | `--merge-request-assignee-ids` | 指派人用户ID列表 | 可选 | | `-mrris` | `--merge-request-reviewer-ids` | 审查者用户ID列表 | 可选 | ### 环境变量(兼容性支持) | 变量名 | 描述 | 默认值 | |--------|------|--------| | `OPENAI_KEY` | OpenAI API 密钥 | - | | `OPENAI_BASE_URL` | OpenAI API 基础 URL | `https://api.openai.com/v1` | | `OPENAI_MODEL` | OpenAI 模型名称 | `gpt-3.5-turbo` | | `GIT_ACCESS_TOKEN_<HOST>` | Git 访问令牌 (如: GIT_ACCESS_TOKEN_GITHUB_COM) | - | | `CONAN_REMOTE_BASE_URL` | Conan 远程服务器 URL | - | | `CONAN_REMOTE_REPO` | Conan 远程仓库名 | `repo` | | `WECOM_WEBHOOK` | 企业微信 Webhook URL | - | | `WECOM_ENABLE` | 启用企业微信通知 | `false` | | `SQUASH_COMMITS` | 是否压缩提交 | `true` | | `REMOVE_SOURCE_BRANCH` | 合并后删除源分支 | `true` | | `GIT_GENERATION_LANG` | AI 生成语言 | `en` | | `MERGE_REQUEST_ASSIGNEE_ID` | 指派人用户ID | - | | `MERGE_REQUEST_ASSIGNEE_IDS` | 指派人用户ID列表 | - | | `MERGE_REQUEST_REVIEWER_IDS` | 审查者用户ID列表 | - | ### Git 平台 Token 权限要求 **GitLab Personal Access Token 权限:** -`api` - 完整 API 访问 -`read_user` - 读取用户信息 -`read_repository` - 读取仓库信息 -`write_repository` - 写入仓库信息 **GitHub Personal Access Token 权限:** -`repo` - 完整仓库访问权限 -`workflow` - 工作流访问权限(如需要) **Gitee Personal Access Token 权限:** -`projects` - 项目权限 -`pull_requests` - 拉取请求权限 ## 🔄 工作流程 ### 自动检测功能 工具会自动检测以下信息: 1. **Git 平台项目信息** -`git remote` URL 解析项目信息 - 支持 HTTP 和 SSH URL 格式 - 自动检测 GitHub、GitLab、Gitee 等平台 - 智能 API 端点探测(支持企业自部署实例) 2. **目标分支检测** - 优先级:`main` > `master` > `develop` - 检查远程分支是否存在 - 如果当前分支是默认分支之一,则使用当前分支 3. **分支命名规则** ``` {git-user}/{ai-branch-name}-{date} ``` - `git-user`: Git 用户名 - `ai-branch-name`: AI 生成并清理的分支名 - `date`: 格式为 YYYYMMDD ### AI 生成规则 工具使用 OpenAI API 分析代码差异,生成: 1. **提交信息** - 遵循 Conventional Commits 规范 - 包含变更摘要和详细描述 - 自动识别变更类型(feat/fix/chore/docs 等) 2. **分支名称** - 简洁明了的英文描述 - 自动清理特殊字符 - 符合 Git 分支命名规范 ## 📚 使用案例 ### 案例 1:日常功能开发 ```bash # 开发新功能 git add src/components/UserProfile.tsx git add src/api/userService.ts # 使用 AIFlow 自动化处理 aiflow # 输出示例: # ✅ 生成提交信息: feat(user): add user profile component with API integration # ✅ 生成分支名称: feat/user-profile-component # 🎉 合并请求创建: https://gitlab.com/project/-/merge_requests/123 ``` ### 案例 2:仅提交模式 ```bash # 仅提交代码变更,不创建 MR aiflow --commit-only # 输出示例: # ✅ 生成提交信息: fix(auth): resolve login validation issue # ✅ 成功提交变更 # 📝 提交信息: fix(auth): resolve login validation issue ``` ### 案例 3:交互式文件选择 ```bash # 直接运行,让工具自动选择文件 aiflow # 工具会显示: # 📁 Detected file changes: # 📝 Modified files: # 1. src/auth.ts # 2. src/types.ts # ❓ Untracked files: # 3. README.md # # 📋 Select files to stage: 1,3 ``` ### 案例 4:C++ 包更新 ```bash # 更新 Conan 包 aiflow-conan zterm # 自动流程: # 📦 检测最新版本: zterm/1.0.0.26 # 📝 更新配置文件 # 🤖 生成提交信息: chore: update zterm package to version 1.0.0.26 # 📋 创建合并请求 # 📱 发送团队通知 ``` ### 案例 5:团队协作配置 ```bash # 配置合并请求指派和审查者 aiflow -mrai 123 -mrris 456,789 # 或使用配置文件 merge_request: assignee_id: 123 reviewer_ids: [456, 789] ``` ## 🎯 最佳实践 ### 1. 配置管理 - **本地项目配置**:项目特定设置放在 `.aiflow/config.yaml` - **全局配置**:通用设置放在全局配置文件 - **敏感信息**:使用环境变量存储 API 密钥 ### 2. 团队协作 - **统一配置**:团队使用相同的 OpenAI 模型配置 - **分支策略**:配置合适的分支保护规则 - **通知设置**:配置企业微信群组通知 ### 3. 安全考虑 - **访问令牌**:定期轮换 Git 平台访问令牌 - **权限控制**:使用最小权限原则配置令牌 - **敏感数据**:不要在配置文件中硬编码密钥 ### 4. 工作流优化 - **提交频率**:建议小批量、频繁提交 - **分支命名**:让 AI 自动生成语义化分支名 - **代码审查**:配置自动指派审查者 ## 🔍 故障排除 ### 常见问题 **1. "No staged changes found"** ```bash # 解决方案:暂存你的变更 git add . ``` **2. "Missing required configuration"** ```bash # 解决方案:初始化配置或检查配置文件 aiflow init # 或检查现有配置 aiflow --config-help ``` **3. "Could not determine target branch"** ```bash # 解决方案:检查远程分支 git branch -r git remote -v ``` **4. "Git API error"** ```bash # 解决方案:验证访问令牌权限 # GitLab: curl -H "PRIVATE-TOKEN: your-token" https://gitlab.com/api/v4/user # GitHub: curl -H "Authorization: Bearer your-token" https://api.github.com/user ``` **5. Conan 包更新失败** ```bash # 检查必需文件 ls -la conandata.yml conan.win.lock # 检查 Conan 服务器连接 curl http://your-conan-server.com/v1/ping ``` **6. 交互式文件选择不工作** ```bash # 确保在 Git 仓库中运行 git status # 检查是否有文件变更 git diff --name-only ``` **7. 合并请求指派失败** ```bash # 检查用户ID是否正确 # GitLab: 在项目设置中查看用户ID # GitHub: 使用用户名而不是ID # 验证访问令牌权限 curl -H "PRIVATE-TOKEN: your-token" https://gitlab.com/api/v4/projects/PROJECT_ID/members ``` **8. Windows PowerShell 执行策略错误** **问题描述**: 在 Windows 系统中运行 `aiflow` 命令时可能出现以下错误: ```powershell aiflow : 无法加载文件 C:\Users\user\AppData\Roaming\npm\aiflow.ps1,因为在此系统上禁止运行脚本。 有关详细信息,请参阅 https://go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。 所在位置 行:1 字符: 1 + aiflow + ~~~~~~ + CategoryInfo : SecurityError: (:) [],PSSecurityException + FullyQualifiedErrorId : UnauthorizedAccess ``` **原因分析**: Windows PowerShell 默认的执行策略限制了脚本的运行,这是一个安全机制,防止恶意脚本执行。 **解决方案**: 方法一:**修改当前用户执行策略(推荐)** ```powershell # 以管理员身份运行 PowerShell,然后执行: Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned -Force ``` 方法二:**临时绕过执行策略** ```powershell # 每次运行时临时绕过(不推荐) PowerShell -ExecutionPolicy Bypass -Command "aiflow" ``` 方法三:**使用 npx 直接运行** ```bash # 如果上述方法都不行,可以使用 npx npx aiflow ``` **验证修复**```powershell # 检查当前执行策略 Get-ExecutionPolicy -List # 应该看到 CurrentUser 的策略为 RemoteSigned ``` **安全说明**- `RemoteSigned` 策略要求从互联网下载的脚本必须由受信任的发布者签名 - 本地创建的脚本可以运行而无需签名 - 这是一个相对安全的设置,比完全开放的 `Unrestricted` 策略更安全 ### 日志系统 AIFlow 使用基于 Winston 的企业级日志系统: **日志位置:** - **Windows**: `%APPDATA%\aiflow\logs\` - **macOS**: `~/Library/Application Support/aiflow/logs/` - **Linux**: `~/.config/aiflow/logs/` **日志文件:** - `aiflow.log` - 所有级别的日志 - `error.log` - 仅错误级别的日志 **日志功能:** - 📁 按文件大小自动滚动(10MB/文件,保留5个文件) - 🕐 包含时间戳、上下文标记和详细元数据 - 📊 结构化 JSON 格式便于分析 - 🏷️ 服务级别的上下文标记(Shell、GitService、HttpClient 等) ### 调试模式 查看实时日志: ```bash # 查看所有日志 tail -f ~/.config/aiflow/logs/aiflow.log # 仅查看错误日志 tail -f ~/.config/aiflow/logs/error.log # Windows 用户 Get-Content -Path "$env:APPDATA\aiflow\logs\aiflow.log" -Wait ``` ### 日志分析 工具会输出详细的执行步骤: ``` 🚀 AIFlow Tool 📁 Working directory: /path/to/project ⏰ Started at: 2024-01-01T12:00:00.000Z ────────────────────────────────────────────────── ✅ Environment validation passed 🎯 Target branch: main 🤖 Generating commit message and branch name... ✅ Generated commit message: feat: add new feature ✅ Generated branch name: username/add-new-feature-20240101 📤 Creating branch and pushing changes... 📋 Creating Merge Request... 🎉 Merge Request created: https://github.com/user/project/pull/123 📢 Sending notification... 📢 Notification sent via WeCom webhook. ✅ AIFlow workflow completed successfully! ``` ## 👨‍💻 开发说明 ### 项目结构 ``` src/ ├── services/ # 核心服务 │ ├── git-service.ts # Git 操作 │ ├── git-platform-service.ts # Git 平台抽象接口 │ ├── gitlab-platform-service.ts # GitLab 平台实现 │ ├── github-platform-service.ts # GitHub 平台实现 │ ├── openai-service.ts # OpenAI API │ ├── conan-service.ts # Conan API │ ├── wecom-notifier.ts # 企业微信通知 │ ├── conandata-service.ts # Conan 数据文件操作 │ ├── conanlock-service.ts # Conan 锁文件操作 │ └── file-updater-service.ts # 文件更新操作 ├── utils/ # 工具函数 │ └── string-util.ts # 字符串处理 ├── http/ # HTTP 客户端 │ └── http-client.ts ├── test/ # 测试文件 ├── config.ts # 配置管理 ├── logger.ts # 日志系统 ├── aiflow-app.ts # 通用 MR 工具 ├── aiflow-conan-app.ts # Conan 更新工具 ├── shell.ts # Shell 命令执行 └── index.ts # 入口文件 ``` ### 开发命令 ```bash # 安装依赖 npm install # 开发模式(监听文件变化) npm run dev # 构建项目 npm run build # 运行测试 npm test # 代码检查 npm run lint # 格式化代码 npm run format ``` ### 添加新功能 1. 在相应的 service 中添加新方法 2. 更新主应用类的逻辑 3. 添加相应的测试 4. 更新文档 ### 测试 ```bash # 运行所有测试 npm test # 运行特定测试 npm test -- --grep "GitService" # 覆盖率报告 npm run test:coverage ``` ## 📄 许可证 本项目采用 MIT 许可证。详见 [LICENSE](LICENSE) 文件。 ## 🤝 贡献 欢迎提交 Issue 和 Pull Request! 1. Fork 本仓库 2. 创建特性分支 (`git checkout -b feature/amazing-feature`) 3. 提交变更 (`git commit -m 'Add amazing feature'`) 4. 推送到分支 (`git push origin feature/amazing-feature`) 5. 创建 Pull Request ## 📚 扩展资源 - 📖 **[免费模型配置指南](docs/free-models.md)** - 使用免费AI模型,降低使用成本 - 🔧 **[配置文件示例](config.example.yaml)** - 完整配置参考 - 📋 **[更新日志](CHANGELOG.md)** - 版本更新记录 ## 📞 支持 如有问题或建议,请: 1. 查看 [故障排除](#故障排除) 部分 2. 搜索已有的 [Issues](../../issues) 3. 创建新的 [Issue](../../issues/new) --- **注意**:使用前请确保已正确配置所有必需的环境变量,并且具有相应服务的访问权限。