Skill: paul-leo/gitlab-workflow (version 0.1.1)

--- name: gitlab-workflow description: GitLab 工作流助手，严格遵循团队规范。用于 MR 管理、代码审查、CI/CD 状态查询、分支管理和合并操作。通过 MorphixAI 代理安全访问 GitLab API。 metadata: openclaw: emoji: "🦊" requires: env: [MORPHIXAI_API_KEY] --- # GitLab 工作流 通过 `mx_gitlab` 工具管理 GitLab 项目。严格遵守团队规范。 ## 前置条件 1. **安装插件**: `openclaw plugins install openclaw-morphixai` 2. **获取 API Key**: 访问 [morphix.app/api-keys](https://morphix.app/api-keys) 生成 `mk_xxxxxx` 密钥 3. **配置环境变量**: `export MORPHIXAI_API_KEY="mk_your_key_here"` 4. **链接账号**: 访问 [morphix.app/connections](https://morphix.app/connections) 链接 GitLab 账号，或通过 `mx_link` 工具链接（app: `gitlab`） --- ## 参数命名规范（重要） `mx_gitlab` 工具所有 action 的参数命名： | 参数 | 说明 | |------|------| | `project` | 项目 ID（数字字符串）或路径（`group/repo`），**不是** `project_id` | | `mr_iid` | MR 在项目内的序号，**不是** `merge_request_iid` | | `pipeline_id` | Pipeline 的全局 ID | ### description 字段换行格式 > ⚠️ `description` 字段**必须使用真实换行符**，不要使用 `\n` 字面量字符串。 > > 错误示例（在 GitLab 上会显示为 `\n`）： > ``` > description: "改动\n- 修复 bug\n- 新增功能" > ``` > > 正确示例（使用 YAML 多行字符串）： > ```yaml > description: | > ## 改动 > - 修复 bug > - 新增功能 > > ## 测试 > - 单元测试通过 > ``` --- ## 代码审查策略（优先级顺序） **获取 MR 代码变更时，按以下顺序尝试：** ### ✅ 优先：本地 git（推荐） 本地仓库 + git 命令是最可靠的代码审查方式： - 无需额外认证（使用本地已有凭证） - 无响应体大小限制（任意规模的 diff） - 速度快，工具丰富（log、diff、show、blame） **第一步：查找本地仓库路径** ```bash # nodes.run — 在本机执行 find ~/www -maxdepth 4 -type d -name '<仓库名>' # 例：find ~/www -maxdepth 4 -type d -name 'tanka-2b-web' ``` **第二步：fetch 最新数据** ```bash # nodes.run — 工作目录切换到仓库路径 cd ~/www/<项目路径> && git fetch origin ``` **第三步：获取 MR 的 commits（需要知道源分支和目标分支）** ```bash # 查看 MR 分支间的 commit 列表 git log origin/<target-branch>..origin/<source-branch> --oneline # 示例（MR: feat/zoom-v2/main → uat-tanka-oh） git log origin/uat-tanka-oh..origin/feat/zoom-v2/main --oneline ``` **第四步：获取文件变更统计** ```bash git diff --stat origin/<target-branch>...origin/<source-branch> # 示例 git diff --stat origin/uat-tanka-oh...origin/feat/zoom-v2/main ``` **第五步：获取具体文件的 diff** ```bash # 全量 diff（大 MR 慎用，建议指定文件） git diff origin/<target-branch>...origin/<source-branch> # 指定文件 diff（推荐） git diff origin/<target-branch>...origin/<source-branch> -- src/path/to/file.ts # 只看特定目录 git diff origin/<target-branch>...origin/<source-branch> -- src/components/ ``` --- ### ⚠️ 备用：mx_link proxy（本地无仓库时使用） 当本地不存在仓库时，通过 MorphixAI 代理调用 GitLab API。 **注意：大型 MR 的 diff 可能因响应体过大返回 400，此时只能使用本地 git。** ``` mx_link: action: proxy account_id: <gitlab-account-id> method: GET url: https://gitlab.com/api/v4/projects/<project-id>/merge_requests/<mr-iid>/changes ``` 可用的 MR 相关 API： - `GET /api/v4/projects/{id}/merge_requests/{iid}` — MR 详情 - `GET /api/v4/projects/{id}/merge_requests/{iid}/changes` — 文件变更（可能因大小失败） - `GET /api/v4/projects/{id}/merge_requests/{iid}/discussions` — Discussion 线程 - `GET /api/v4/projects/{id}/merge_requests/{iid}/notes` — 评论列表 - `POST /api/v4/projects/{id}/merge_requests/{iid}/notes` — 发表评论 - `GET /api/v4/projects/{id}/merge_requests/{iid}/approvals` — 审批状态 --- ## 分支命名 - `feature/JIRA-{ID}-{简短描述}` — 新功能 - `fix/JIRA-{ID}-{简短描述}` — bug 修复 - `release/v{X.Y.Z}` — 发布分支 - `hotfix/v{X.Y.Z}-{描述}` — 生产热修复 ## Commit Message 格式 `{Scope}: {action} {description}` - Scope：模块名（SDK、CLI、Gateway、Bot 等） - Actions：add / update / fix / remove / refactor - 示例：`SDK: add message retry logic` - 相关改动一个 commit，绝不混杂无关重构 --- ## 核心操作（mx_gitlab） ### 查看当前用户 ``` mx_gitlab: action: get_user ``` ### 列出项目 ``` mx_gitlab: action: list_projects per_page: 10 ``` ### 查看项目详情 ``` mx_gitlab: action: get_project project: "12345" ``` ### MR 操作 **列出 MR：** ``` mx_gitlab: action: list_merge_requests project: "12345" state: "opened" ``` **创建 MR：** ``` mx_gitlab: action: create_merge_request project: "12345" source_branch: "feature/JIRA-123-user-login" target_branch: "main" title: "[JIRA-123] 实现用户登录功能" description: "## 改动\n- 实现 JWT 登录\n\n## 测试\n- 单元测试通过\n\n## 关联\n- JIRA-123" ``` **审批 MR：** ``` mx_gitlab: action: approve_merge_request project: "12345" mr_iid: 42 ``` **查看单条 MR 详情（含合并就绪状态）：** ``` mx_gitlab: action: get_merge_request project: "12345" mr_iid: 42 ``` 返回关键字段： - `detailed_merge_status`: `mergeable`（可合并）/ `preparing`（准备中，需等待）/ `checking`（检查中）/ `ci_must_pass`（CI 未通过）/ `not_approved`（未获批准）/ `discussions_not_resolved`（有未解决讨论） - `has_conflicts`: 是否有冲突 - `blocking_discussions_resolved`: 阻塞性讨论是否已解决 - `pipeline`: 最新 Pipeline 状态 **合并前必须先检查状态（重要）：** > ⚠️ 直接调用 `merge_merge_request` 而不检查状态会导致 500 错误（MR 未就绪时 GitLab 拒绝合并） ``` # 正确流程： 1. mx_gitlab: get_merge_request → 确认 detailed_merge_status === "mergeable" 2. 如果是 "preparing" 或 "checking" → 等待后重试 get_merge_request 3. 如果是 "ci_must_pass" → CI 未通过，不能合并 4. 如果是 "not_approved" → 需要审批，先 approve_merge_request 5. 确认 mergeable 后 → mx_gitlab: merge_merge_request ``` **合并 MR：** ``` mx_gitlab: action: merge_merge_request project: "12345" mr_iid: 42 ``` > ✅ `merge_merge_request` 会自动检查 `detailed_merge_status`，若 MR 未就绪会直接返回错误和原因，无需手动 pre-check。 **更新 MR（设置 Reviewer / Assignee / 标签等）：** ``` # 先搜索 GitLab 用户 ID mx_gitlab: action: search_users search: "username_or_name" # 再设置 reviewer（使用搜索结果中的 id 字段） mx_gitlab: action: update_merge_request project: "12345" mr_iid: 42 reviewer_ids: [12345] ``` ### CI/CD 操作 **查看 Pipeline：** ``` mx_gitlab: action: list_pipelines project: "12345" per_page: 5 ``` **重试失败的 Pipeline：** ``` mx_gitlab: action: retry_pipeline project: "12345" pipeline_id: 67890 ``` ### Issue 操作 **列出 Issue：** ``` mx_gitlab: action: list_issues project: "12345" state: "opened" ``` **创建 Issue：** ``` mx_gitlab: action: create_issue project: "12345" title: "Bug: 登录页面白屏" description: "## 问题\n在 Safari 下登录页面白屏\n\n## 复现\n1. 打开 Safari\n2. 访问 /login" labels: ["bug", "frontend"] ``` ### 分支操作 **列出分支：** ``` mx_gitlab: action: list_branches project: "12345" search: "feature/" ``` --- ## MR 创建规范 标题：`[JIRA-{ID}] {描述}` 描述必须包含： 1. 改了什么，为什么改 2. 如何测试 3. 关联的 Jira Issue 链接 至少指定 1 个 Reviewer。单个 MR 最多 500 行变更。 ## Code Review 检查清单 Review MR 时，按顺序检查所有项目： 1. 分支命名符合规范 2. Commit message 清晰且有 scope 3. 代码符合团队风格指南 4. 有对应的测试用例 5. CI pipeline 全绿 6. 无未解决的 Discussion 7. 无硬编码的 secret 或 token 8. 破坏性变更有文档说明 所有项通过才能 approve。评论具体问题时引用行号。 --- ## 常见工作流 ### 审查指定 MR（完整流程） ``` 1. mx_gitlab: list_merge_requests, project: "<id>", state: "opened" → 获取 MR 信息（source_branch, target_branch, mr_iid） 2. nodes.run: find ~/www -maxdepth 4 -type d -name '<repo>' → 查找本地仓库路径 3. nodes.run: cd <repo-path> && git fetch origin → 更新远端分支数据 4. nodes.run: git log origin/<target>..origin/<source> --oneline → 查看 commit 列表 5. nodes.run: git diff --stat origin/<target>...origin/<source> → 查看文件变更统计 6. nodes.run: git diff origin/<target>...origin/<source> -- <关键文件> → 深入审查关键文件的 diff 7. mx_gitlab: list_pipelines, project: "<id>" → 确认 CI 状态 8. mx_gitlab: approve_merge_request, project: "<id>", mr_iid: <iid>（审查通过后） ``` ### 查看我的待处理 MR ``` 1. mx_gitlab: get_user → 获取用户名 2. mx_gitlab: list_merge_requests, project: "<id>", state: "opened" → 列出 open 状态的 MR 3. mx_gitlab: list_pipelines, project: "<id>" → 检查 CI 状态 ``` ### 创建并合并 Feature MR ``` 1. mx_gitlab: create_merge_request project: "<id>", source_branch: "feature/xxx", target_branch: "main" title: "[JIRA-xxx] desc" 2. mx_gitlab: get_merge_request, project: "<id>", mr_iid: <iid> → 等待 detailed_merge_status 变为 "mergeable" (刚创建后状态为 "preparing"，需要等待 GitLab 完成检查) 3. mx_gitlab: list_pipelines, project: "<id>" → 确认 CI 通过 4. mx_gitlab: merge_merge_request, project: "<id>", mr_iid: <iid> → 合并 ``` ### CI 失败处理 ``` 1. mx_gitlab: list_pipelines, project: "<id>", status: "failed" 2. mx_gitlab: retry_pipeline, project: "<id>", pipeline_id: <id> ``` ### 设置 MR Reviewer（完整流程） ``` 1. mx_gitlab: search_users, search: "reviewer_name" → 从结果中找到目标用户的 id（数字） 2. mx_gitlab: update_merge_request project: "<id>", mr_iid: <iid>, reviewer_ids: [<user_id>] ``` ### Pipeline 监控（等待 Pipeline 完成） > ⚠️ 心跳（HEARTBEAT）默认间隔 30m，Anthropic setup-token 下为 1h，不适合实时监控。 > > 推荐做法：将监控任务写入 `HEARTBEAT.md`，心跳触发时自动检查： > ```md > ## 待监控 > - Pipeline #10164 (project: tanka-electron)：等待完成，完成后通知用户 > ``` > > 或用户要求"立即检查"时，直接调用： > ``` > mx_gitlab: list_pipelines, project: "<id>", per_page: 5 > ``` > 对比 pipeline id 和状态，判断是否完成。 --- ## 注意事项 - `project` 参数：数字 ID（如 `"12345"`）或路径（如 `"my-group/my-project"`），通过 `list_projects` 或 `get_project` 获取 - `mr_iid` 是 MR 在项目内的序号（非全局 ID），从 `list_merge_requests` 或 `create_merge_request` 返回结果中获取 - `account_id` 参数通常省略，工具自动检测已链接的 GitLab 账号 - `mx_link proxy` 获取 MR diff 可能因响应体过大返回 400，优先使用本地 git


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)