postar-pipe-mcp 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,339 @@
1
+ ---
2
+ name: ci
3
+ description: 自动化 CI 工作流 - 通过创建并合并 MR 将代码从源分支合并到目标分支,支持可选的 CD 部署。支持单环境合并、多环境批量合并、代码 Review 模式、合并后自动部署。当用户输入 ci、合并、 /ci 指令,或需要合并代码到目标环境时使用。
4
+ constraint: strict
5
+ version: 1.0.0
6
+ ---
7
+
8
+ # CI 自动化工作流
9
+
10
+ > ⚠️ **执行约束(CRITICAL)- 必须遵守**
11
+ >
12
+ > 1. **必须完整阅读**:在执行任何操作前,必须完整阅读本 Skill 的所有内容
13
+ > 2. **严格按步骤执行**:必须严格按照下文"执行流程"中的步骤顺序执行,严禁跳过任何步骤
14
+ > 3. **仅执行定义的操作**:只能执行本 Skill 中明确定义的操作,严禁执行其他未指定的操作
15
+ > 4. **验证每一步**:每一步完成后必须验证结果,确认成功后再进行下一步
16
+ > 5. **错误处理**:如遇错误必须立即停止执行并报告,严禁擅自绕过或忽略错误
17
+ > 6. **禁止假设**:不要假设任何配置或状态,必须通过工具调用来确认
18
+ > 7. **顺序执行**:多环境部署时必须按顺序逐个执行,严禁并行处理
19
+
20
+ ## 说明
21
+
22
+ 本指令用于自动化代码合并流程,通过创建并合并 GitLab MR 将代码从源分支合并到目标分支。支持单环境合并、多环境批量合并,并可选择是否启用代码 Review 模式。
23
+
24
+ ## 变量配置
25
+
26
+ | 变量 | 简写 | 默认值 | 说明 |
27
+ |------|------|--------|------|
28
+ | `ENV` | `dev`/`test`/`uat` | `dev` | 目标环境,支持单环境或逗号分隔的多环境,如 `dev,test` |
29
+ | `SOURCE_BRANCH` | `branch:分支名` | 当前分支 | 源分支,使用 `branch:分支名` 格式指定,如 `branch:feature/xxx` |
30
+ | `NEED_REVIEW` | `review` | `false` | 是否需要代码 Review(用户指定 review 时设为 true) |
31
+ | `NEED_DEPLOY` | `/cd`、`发布`、`部署` | `false` | 是否需要部署(命令中包含这些关键词时设为 true) |
32
+
33
+
34
+ > **参数解析规则**:
35
+ > 1. 优先匹配简写:`dev`/`test`/`uat`/`review`
36
+ > 2. 匹配 `branch:` 前缀,提取分支名作为 `SOURCE_BRANCH`
37
+ > 3. 若包含 `=` 则按 `KEY=VALUE` 解析
38
+ > 4. **多环境支持**:环境参数支持逗号分隔,如 `dev,test` 表示依次合并到 dev 和 test 环境
39
+ > 5. **部署关键词检测**:若命令中包含 `/cd`、`发布`、`部署` 关键词,设置 `NEED_DEPLOY=true`
40
+
41
+ ### 环境对应分支
42
+
43
+ 分支配置从项目根目录的 `config.yaml` 中读取,支持以下占位符:
44
+
45
+ | ENV | PERSONAL_BRANCH | TARGET_BRANCH | 说明 |
46
+ |-----|-----------------|---------------|------|
47
+ | `dev` | `{personal_branch_dev}` | `{target_branch_dev}` | 开发环境 |
48
+ | `test` | `{personal_branch_test}` | `{target_branch_test}` | 测试环境 |
49
+ | `uat` | `{personal_branch_uat}` | `{target_branch_uat}` | UAT环境 |
50
+
51
+ > **注意**:如果某环境的 `PERSONAL_BRANCH` 未配置(为空),则跳过步骤 2,直接执行 SOURCE_BRANCH → TARGET_BRANCH 的合并。
52
+
53
+ ## 公共逻辑定义
54
+
55
+ ### 0. 分支存在性检查逻辑
56
+
57
+ 创建 MR 前执行:
58
+ - 调用 `mcp_gitlab_browse_refs` (action=get_branch, branch={目标分支})
59
+ - 如果返回 404 或分支不存在:**立即停止执行**,输出:
60
+ ```
61
+ ❌ 目标分支不存在:{目标分支}
62
+ 请先创建分支 {目标分支} 后重试
63
+ ```
64
+
65
+ ### 1. MR 状态检查逻辑
66
+
67
+ 创建 MR 后执行:
68
+ - 检查 `merge_status` 字段
69
+ - 如果为 `cannot_be_merged`:
70
+ 1. **检查是否为无文件变更的情况**:比较 `diff_refs.base_sha` 和 `diff_refs.head_sha`
71
+ - 如果两者相同(无实际文件变更):
72
+ - 自动关闭 MR:`mcp_gitlab_manage_merge_request` (action=update, state_event=close)
73
+ - 输出提示信息:
74
+ ```
75
+ ℹ️ MR 无文件变更(已合并过),自动关闭
76
+ MR 链接: {web_url}
77
+ ```
78
+ - **继续执行后续步骤**(视为合并成功)
79
+ - 如果两者不同(存在实际冲突):
80
+ - **立即停止执行**,输出:
81
+ ```
82
+ ❌ MR 创建失败:{source_branch} → {target_branch} 存在冲突,无法自动合并
83
+ MR 链接: {web_url}
84
+ 请手动解决冲突后重试
85
+ ```
86
+
87
+ ### 2. Review 检查逻辑
88
+
89
+ 当 `NEED_REVIEW` 为 `true` 或用户明确要求 review 时:
90
+ 1. **以可点击的 Markdown 链接格式输出 MR 链接**:`[点击查看 MR]({web_url})`
91
+ 2. **等待用户确认**:提示用户 "请 Review 代码,确认无误后回复 '继续' 或 '确认合并' 以执行自动合并"
92
+ 3. **停止自动执行**:等待用户回复后再继续
93
+
94
+ ### 3. MR 合并逻辑
95
+
96
+ 执行 `mcp_gitlab_manage_merge_request` (action=merge):
97
+ - `merge_when_pipeline_succeeds: true`
98
+ - 如果失败(如 405 错误):**立即停止执行**,输出:
99
+ ```
100
+ ❌ MR 合并失败:{error_message}
101
+ MR 链接: {web_url}
102
+ 请检查 MR 状态后手动处理
103
+ ```
104
+
105
+ ## 执行流程
106
+
107
+ ### 前置检查: GitLab MCP 可用性验证
108
+
109
+ 在执行任何步骤前,必须先完成以下验证,**验证通过后才能继续,否则立即停止**:
110
+
111
+ 1. 调用只读工具 `mcp_gitlab_browse_projects`(action=list, per_page=1)
112
+ 2. **判断结果**:
113
+ - 如果返回 `tool not found` 或 `not found MCPHost` 或 `50001` 错误码:**立即停止,禁止执行后续任何步骤**,输出:
114
+ ```
115
+ ❌ GitLab MCP 不可用,无法执行自动化 CI 流程
116
+ 请在 MCP 配置中启用 GitLab MCP 后重试:
117
+ 编辑器设置 → MCP → 启用 GitLab
118
+ ```
119
+ - 如果返回其他任何结果(含 404、401、数据等):视为 MCP 可用,继续执行
120
+
121
+ ### 步骤 1: 获取分支信息
122
+
123
+ > **⚠️ 必须每次重新读取 `config.yaml`**:禁止使用上下文缓存,每次执行 `/ci` 时都要重新读取项目根目录的 `config.yaml` 文件,提取所有相关配置(分支映射、MR 标题模板、默认值等)。
124
+
125
+ 1. **解析 SOURCE_BRANCH(源分支)和项目路径**:
126
+ - 若用户传入了 `branch:分支名`,直接使用该分支作为 SOURCE_BRANCH
127
+ - 若 `config.yaml` 中配置了 `projects.url`,从 URL 中解析项目路径
128
+ - **若以上两者都未满足**,合并执行以下命令(一次终端调用获取全部信息):
129
+ 执行 `git branch --show-current && git remote get-url origin`,解析项目路径(如 zhangkr/ai-test)
130
+ - 第一行输出作为 SOURCE_BRANCH
131
+ - 第二行输出解析为项目路径
132
+
133
+ 2. **解析其他配置**:
134
+ - **ENV**:若用户传入了 `dev`、`test` 或 `uat`,则使用传入值;否则默认 `dev`
135
+ - **多环境支持**:支持逗号分隔的多环境,如 `dev,test`、`test,uat` 或 `dev,test,uat`
136
+ - 多环境模式下,按顺序依次执行每个环境的合并流程
137
+ - **PERSONAL_BRANCH / TARGET_BRANCH**:从 `config.yaml` 中根据 ENV 提取对应值
138
+
139
+ ### 步骤 2: 创建并合并 MR {SOURCE_BRANCH} 到 {PERSONAL_BRANCH}
140
+
141
+ > **条件判断**:满足以下任一条件时**跳过本步骤**,直接进入步骤 3:
142
+ > 1. `PERSONAL_BRANCH` 未配置(为空)
143
+ > 2. `SOURCE_BRANCH` 与 `PERSONAL_BRANCH` 相同(当前分支就是中转分支,无需自我合并)
144
+
145
+ 1. **执行【分支存在性检查逻辑】**(目标分支:{PERSONAL_BRANCH})
146
+
147
+ 2. **创建 MR**:`mcp_gitlab_manage_merge_request` (action=create)
148
+ - source_branch: {SOURCE_BRANCH}
149
+ - target_branch: {PERSONAL_BRANCH}
150
+ - title: `{mr_title_template}`(模板变量:{source_branch}, {target_branch})
151
+
152
+ 3. **执行【MR 状态检查逻辑】**
153
+
154
+ 4. **执行【Review 检查逻辑】**(如果启用 Review 模式)
155
+
156
+ 5. **执行【MR 合并逻辑】**
157
+
158
+ ### 步骤 3: 创建并合并 MR 到 {TARGET_BRANCH}
159
+
160
+ > **source_branch 取值**:
161
+ > - 如果步骤 2 已执行(`PERSONAL_BRANCH` 已配置且 `SOURCE_BRANCH ≠ PERSONAL_BRANCH`):使用 `{PERSONAL_BRANCH}`
162
+ > - 如果步骤 2 被跳过(`PERSONAL_BRANCH` 未配置,或 `SOURCE_BRANCH === PERSONAL_BRANCH`):使用 `{SOURCE_BRANCH}`
163
+
164
+ 1. **执行【分支存在性检查逻辑】**(目标分支:{TARGET_BRANCH})
165
+
166
+ 2. **创建 MR**:`mcp_gitlab_manage_merge_request` (action=create)
167
+ - source_branch: 根据上述规则确定
168
+ - target_branch: {TARGET_BRANCH}
169
+ - title: `{mr_title_template}`(模板变量:{source_branch}, {target_branch})
170
+
171
+ 3. **执行【MR 状态检查逻辑】**
172
+
173
+ 4. **执行【Review 检查逻辑】**(如果启用 Review 模式)
174
+
175
+ 5. **执行【MR 合并逻辑】**
176
+
177
+ ### 步骤 4: 验证与完成
178
+
179
+ #### 单环境模式
180
+
181
+ - 如果 `PERSONAL_BRANCH` 已配置:确认两个 MR 状态为 merged
182
+ - 如果 `PERSONAL_BRANCH` 未配置:确认 SOURCE_BRANCH → TARGET_BRANCH 的 MR 状态为 merged
183
+ - 确认 {TARGET_BRANCH} 分支已更新
184
+ - 输出 CI 完成信息:
185
+ ```
186
+ ✅ CI 流程完成
187
+
188
+ 📋 合并汇总:
189
+ 源分支: {SOURCE_BRANCH}
190
+ 目标分支: {TARGET_BRANCH}
191
+ MR 状态: merged
192
+
193
+ 💡 如需部署,请执行:
194
+ /cd {ENV} # 部署当前分支
195
+ /cd {ENV} branch:xxx # 部署指定分支
196
+ ```
197
+
198
+ #### 多环境模式
199
+
200
+ 当指定多个环境(如 `dev,test`)时:
201
+ - 按环境顺序依次执行步骤 2 和步骤 3
202
+ - 每个环境独立执行完整的合并流程
203
+ - 前一个环境合并成功后,继续下一个环境
204
+ - 任一环境合并失败,立即停止执行
205
+
206
+ ### 步骤 5: 执行 CD 部署(可选)
207
+
208
+ > **条件判断**:当 `NEED_DEPLOY=true`(命令中包含 `/cd`、`发布`、`部署` 关键词)时执行此步骤。
209
+
210
+ 1. **读取 CD skill 文件**(跨平台路径查找策略):
211
+ - 首先尝试项目级别路径:`.qoder/skills/cd/SKILL.md`(或编辑器对应的 skills 目录)
212
+ - 如果找不到,则根据操作系统尝试对应的用户级别路径:
213
+
214
+ **macOS/Linux 系统**:
215
+ - 用户级别路径:`$HOME/.qoder/skills/cd/SKILL.md`(或编辑器配置目录)
216
+
217
+ **Windows 系统**:
218
+ - 用户级别路径:`%USERPROFILE%\.qoder\skills\cd\SKILL.md`
219
+
220
+ - 实现方式:
221
+ ```
222
+ # 项目级别(相对路径,通用)
223
+ read_file(".qoder/skills/cd/SKILL.md")
224
+
225
+ # macOS/Linux 用户级别
226
+ read_file("$HOME/.qoder/skills/cd/SKILL.md")
227
+
228
+ # Windows 用户级别
229
+ read_file("%USERPROFILE%\.qoder\skills\cd\SKILL.md")
230
+ ```
231
+
232
+ 2. **按照 CD skill 的规范执行部署流程**:
233
+ - 执行 Jenkins MCP 可用性验证
234
+ - 读取 `config.yaml` 中的 Jenkins 配置
235
+ - 使用 `mcp_jenkins_build_item` 触发构建
236
+ - **⚠️ 关键:`build_type` 必须为 `buildWithParameters`**
237
+
238
+ 3. **多环境部署**:按环境顺序逐个触发,记录每个环境的队列 ID
239
+
240
+ 4. **输出部署结果**(参考 CD skill 的输出格式)
241
+
242
+ ### 步骤 6: 输出最终汇总
243
+
244
+ **仅 CI 模式**(NEED_DEPLOY=false):
245
+ ```
246
+ ✅ CI 流程完成
247
+
248
+ 📋 合并汇总:
249
+ 源分支: {SOURCE_BRANCH}
250
+ 目标分支: {TARGET_BRANCH}
251
+ MR 状态: merged
252
+ MR 链接: ({url})
253
+
254
+ 💡 如需部署,请执行:
255
+ /cd {ENV} # 部署当前分支
256
+ /cd {ENV} branch:xxx # 部署指定分支
257
+ ```
258
+
259
+ **CI+CD 模式**(NEED_DEPLOY=true):
260
+ ```
261
+ ✅ CI/CD 流程完成
262
+
263
+ 📋 合并汇总:
264
+ 源分支: {SOURCE_BRANCH}
265
+ 目标分支: {TARGET_BRANCH}
266
+ MR 状态: merged
267
+ MR 链接: ({url})
268
+
269
+
270
+ 📋 部署汇总:
271
+ 环境: {ENV}
272
+ Jenkins 队列 ID: {queue_id}
273
+ 🔗 [查看构建进度]({url})
274
+ ```
275
+
276
+ ## 使用示例
277
+
278
+ ### 单环境流程(默认)
279
+
280
+ ```
281
+ /ci # 默认 dev 环境,使用当前分支作为 SOURCE_BRANCH
282
+ /ci dev # 指定 dev 环境(简写)
283
+ /ci ENV=dev # 指定 dev 环境(完整写法)
284
+ /ci test review # test 环境 + 需要 Review
285
+ /ci branch:feature/xxx # 指定源分支为 feature/xxx
286
+ /ci test branch:bugfix/123 # test 环境 + 指定源分支
287
+ ```
288
+
289
+ 执行:SOURCE_BRANCH → PERSONAL_BRANCH → TARGET_BRANCH
290
+
291
+ ### CI + CD 一体化流程
292
+
293
+ ```
294
+ /ci dev,test 发布 # 合并到 dev 和 test,并部署
295
+ /ci dev /cd # 合并到 dev,并部署
296
+ /ci dev,test 并且发布到dev和test # 合并到 dev 和 test,并部署
297
+ ```
298
+
299
+ 执行流程:
300
+ 1. CI: SOURCE_BRANCH → dev:TARGET_BRANCH → test:TARGET_BRANCH
301
+ 2. CD: 触发 dev 和 test 环境的 Jenkins 构建
302
+
303
+ ### 多环境批量合并
304
+
305
+ ```
306
+ /ci dev,test # 依次合并到 dev 和 test 环境
307
+ /ci test,uat # 依次合并到 test 和 uat 环境
308
+ /ci dev,test,uat # 依次合并到 dev、test 和 uat 环境
309
+ /ci dev,test review # 多环境合并 + 需要 Review
310
+ /ci dev,test branch:feature/xxx # 多环境合并 + 指定源分支
311
+ ```
312
+
313
+ 执行流程:
314
+ 1. SOURCE_BRANCH → dev:PERSONAL_BRANCH → dev:TARGET_BRANCH
315
+ 2. SOURCE_BRANCH → test:PERSONAL_BRANCH → test:TARGET_BRANCH
316
+
317
+ > **简写规则**:
318
+ > - `dev`/`test`/`uat` 直接指定环境,支持逗号分隔多环境
319
+ > - `review` 等价于 `NEED_REVIEW=true`
320
+ > - `branch:分支名` 指定 `SOURCE_BRANCH`
321
+ > - **多环境顺序**:按参数中指定的顺序依次执行,如 `test,dev` 会先合并到 test 再合并到 dev
322
+
323
+ ## 与 `/cd` 命令的关系
324
+
325
+ | 命令 | 职责 | 使用场景 |
326
+ |------|------|----------|
327
+ | `/ci` | 代码合并(可选部署) | 需要合并代码到目标分支 |
328
+ | `/cd` | 部署触发(Jenkins 构建) | 仅需部署,无需合并 |
329
+ | `/ci ... 发布` | 合并 + 部署一体化 | 合并后立即部署 |
330
+
331
+ **典型工作流**:
332
+ ```bash
333
+ # 方式1:分步执行
334
+ /ci dev # 合并代码
335
+ /cd dev # 部署服务
336
+
337
+ # 方式2:一体化执行
338
+ /ci dev 发布 # 合并 + 部署一步完成
339
+ ```