$npx -y skills add TestAny-io/testany-agent-skills --skill testany-pipelineTestany pipeline 编排与 CRUD - 基于 automation design 或现有 case keys 创建执行与编排单元
| 1 | # Testany Pipeline |
| 2 | |
| 3 | 本 skill 通过 Testany MCP 工具管理 **Testany 平台上的 pipeline**。 |
| 4 | 所有操作都是对 Testany 平台的远程 API 调用,不涉及本地文件系统。 |
| 5 | |
| 6 | **关键前提**: |
| 7 | - pipeline 是 Testany 的**执行与编排单元** |
| 8 | - Testany **不支持直接执行单条 case** |
| 9 | - trigger 只是 pipeline 的执行入口,不是编排层 |
| 10 | |
| 11 | 用户输入: $ARGUMENTS |
| 12 | |
| 13 | --- |
| 14 | |
| 15 | ## 宿主能力适配 |
| 16 | |
| 17 | - 优先使用宿主提供的结构化提问工具(如 AskUserQuestion)一次性收集缺失信息。 |
| 18 | - 如果宿主不支持该工具,则用一条普通消息集中提问相同问题;低风险字段可给出默认值建议。 |
| 19 | - 如果宿主支持 slash command,可推荐相关 workflow 的命令入口;否则直接在当前线程继续对应 workflow。 |
| 20 | |
| 21 | --- |
| 22 | |
| 23 | ## 先统一心智模型 |
| 24 | |
| 25 | 使用本 skill 前,先按 [automation-model.md](../testany-guide/references/automation-model.md) 理解边界: |
| 26 | |
| 27 | - 上游给出的通常是 **traditional test scenario** |
| 28 | - `testany-case-writing` 负责把它拆成 **platform cases** |
| 29 | - 本 skill 负责把这些 platform cases 编排成 **pipeline** |
| 30 | - `testany-trigger` 负责为 pipeline 配置 `Plan / Manual Trigger / Gatekeeper` |
| 31 | |
| 32 | **重要结论**: |
| 33 | - 本 skill 的主输入不应该是“让我从 case 描述里猜业务流程” |
| 34 | - 本 skill 的主输入应该是上游明确给出的 **automation design / decomposition** |
| 35 | |
| 36 | --- |
| 37 | |
| 38 | ## 上游输入优先级 |
| 39 | |
| 40 | 按以下优先级选择输入模式: |
| 41 | |
| 42 | 1. **Primary:automation design / decomposition** |
| 43 | - 来自 `testany-case-writing` |
| 44 | - 最好是基于 approved Test Spec 的 `Testany Automation Handoff` 生成 |
| 45 | - 已明确 case inventory、依赖关系、relay map、是否有分支 |
| 46 | |
| 47 | 2. **Secondary:用户明确给出的 case keys + 依赖描述** |
| 48 | - 例如“用 A1B2C3D4 先登录,再用 E5F6A7B8 查询” |
| 49 | |
| 50 | 3. **Fallback:从现有 case metadata 反推** |
| 51 | - 只在前两者都没有时使用 |
| 52 | - 必须把结果回显给用户确认 |
| 53 | - 不能把“猜出来的流程”当主路径 |
| 54 | |
| 55 | --- |
| 56 | |
| 57 | ## 操作速查 |
| 58 | |
| 59 | | 用户意图 | 操作类型 | 工具 | |
| 60 | |---------|---------|------| |
| 61 | | 创建新 pipeline | Create | `testany_create_pipeline` | |
| 62 | | 查看 pipeline 详情 | Read | `testany_get_pipeline` | |
| 63 | | 查看 pipeline YAML | Read | `testany_get_pipeline_yaml` | |
| 64 | | 搜索/列出 pipelines(按 workspace) | Read | `testany_list_pipelines` | |
| 65 | | 列出我的 pipelines(按 workspace) | Read | `testany_list_my_pipelines` | |
| 66 | | 修改 pipeline 配置 | Update | `testany_update_pipeline` | |
| 67 | | 删除 pipeline | Delete | `testany_get_pipeline_used_by` → `testany_delete_pipeline` | |
| 68 | | 验证 YAML 语法 | Validate | `testany_verify_pipeline` | |
| 69 | | 检查被引用情况 | Query | `testany_get_pipeline_used_by` | |
| 70 | |
| 71 | --- |
| 72 | |
| 73 | ## Create(创建) |
| 74 | |
| 75 | ### Phase 0: 先判断输入模式 |
| 76 | |
| 77 | #### Primary:已有 automation design / decomposition |
| 78 | |
| 79 | 如果上游已给出以下内容,直接按它编排: |
| 80 | - platform case inventory |
| 81 | - 每个 case 的职责 |
| 82 | - `source_case_ids` / `scenario_group`(若来自 Test Spec handoff) |
| 83 | - dependencies |
| 84 | - relay map |
| 85 | - 是否有 `whenFailed` / `expect: fail` |
| 86 | |
| 87 | #### Secondary:用户已明确给出 case keys 与顺序 |
| 88 | |
| 89 | 如果用户直接给出: |
| 90 | - case keys |
| 91 | - 执行顺序 |
| 92 | - relay 关系 |
| 93 | |
| 94 | 则直接进入 YAML 构建。 |
| 95 | |
| 96 | #### Fallback:只能从现有 cases 反推 |
| 97 | |
| 98 | 仅在没有上游 design 时使用: |
| 99 | - `testany_list_cases` / `testany_get_case` |
| 100 | - 结合 `case_labels`、`description`、`environment_variables[].description` |
| 101 | - 给出候选编排方案 |
| 102 | - **必须让用户确认** |
| 103 | |
| 104 | --- |
| 105 | |
| 106 | ### Phase 1: 准备数据 |
| 107 | |
| 108 | 并行获取: |
| 109 | - `testany_get_my_workspaces` |
| 110 | - `testany_list_cases` 或 `testany_list_my_cases` |
| 111 | |
| 112 | 如果用户还没有把 platform cases 注册到 Testany 平台: |
| 113 | - 停止创建 pipeline |
| 114 | - 提示先走 `testany-case` |
| 115 | |
| 116 | --- |
| 117 | |
| 118 | ### Phase 2: 构建 pipeline 设计 |
| 119 | |
| 120 | 根据输入模式,确定: |
| 121 | - pipeline 名称 |
| 122 | - 所属 workspace |
| 123 | - 包含哪些 case keys |
| 124 | - 顺序与前置依赖 |
| 125 | - relay 变量关系 |
| 126 | - 是否有失败分支 |
| 127 | - 是否存在 `expect: fail` |
| 128 | |
| 129 | #### 何时使用 `case_keys` |
| 130 | |
| 131 | 仅当满足以下条件时,允许直接用 `case_keys` 自动生成简单顺序 pipeline: |
| 132 | - 无条件分支 |
| 133 | - 无 relay |
| 134 | - 无 `expect: fail` |
| 135 | - 用户只要最简单的顺序执行 |
| 136 | |
| 137 | #### 何时必须手写 YAML |
| 138 | |
| 139 | 出现以下任一情况时,必须显式生成 YAML: |
| 140 | - 有 relay |
| 141 | - 有 `whenPassed` / `whenFailed` |
| 142 | - 有 `expect: fail` |
| 143 | - 需要表达分支、前置、清理或失败路径 |
| 144 | |
| 145 | --- |
| 146 | |
| 147 | ### Phase 3: 验证 relay 与依赖 |
| 148 | |
| 149 | 如有 relay,必须: |
| 150 | 1. `testany_get_case` 检查源 case 是否有 `type='output'` 变量 |
| 151 | 2. `testany_get_case` 检查目标 case 是否有 `type='env'` 变量 |
| 152 | 3. 确保源 case 在 rules 中位于目标 case 之前 |
| 153 | 4. 确保 relay 不与 `whenFailed` 组合 |
| 154 | 5. **禁止把 `type='secrets'` 行作为 relay 源或目标**:secrets 的值来自 workspace Credential Safe,不经过 relay 传递;目标端也不能被 relay 覆写。如果 relay 源/目标命中 secrets 行,停下来向用户说明并请求改用 `env` 或 `output` 行 |
| 155 | |
| 156 | --- |
| 157 | |
| 158 | ### Phase 4: 创建 pipeline |
| 159 | |
| 160 | 调用 `testany_create_pipeline`: |
| 161 | |
| 162 | | 参数 | 必填 | 说明 | |
| 163 | |------|-----|------| |
| 164 | | `name` | 是 | pipeline 名称 | |
| 165 | | `workspace` | 是 | 所属工作空间 key | |
| 166 | | `description` | 否 | 描述 | |
| 167 | | `definition` | 否 | Pipeline YAML 配置 | |
| 168 | | `case_keys` | 否 | Case keys 数组(仅简单顺序场景) | |
| 169 | |
| 170 | --- |
| 171 | |
| 172 | ### Phase 5: 验证 |
| 173 | |
| 174 | 调用 `testany_verify_pipeline`: |
| 175 | - 检查 `kind` 是否在支持范围内(`rule/v1.2` 或 `rule/v1.3`) |
| 176 | - 检查 `rules` 结构是否合法 |
| 177 | - 检查 relay 与依赖约束 |
| 178 | |
| 179 | --- |
| 180 | |
| 181 | ## Fallback:从现有 cases 反推(仅兜底) |
| 182 | |
| 183 | 当且仅当前两种输入模式都不存在时,才允许从现有 cases 反推。 |
| 184 | |
| 185 | ### 可用于判断的信息 |
| 186 | |
| 187 | | 字段 | 用途 | 可靠程度 | |
| 188 | |------|------|---------| |
| 189 | | `case_labels` | 按 User Story 编号、功能模块筛选 | 高 | |
| 190 | | `description` | 理解动作、前置条件、验证目标 | 中 | |
| 191 | | `environment_variables[].description` | 理解输入/输出变量语义 | 中 | |
| 192 | | `name` | 辅助判断 | 低 | |
| 193 | |
| 194 | ### 禁止猜测 |
| 195 | |
| 196 | 如果仍然无法确定: |
| 197 | - 哪些 cases 应被包含 |
| 198 | - 顺序如何安排 |
| 199 | - relay 如何配置 |
| 200 | |
| 201 | 必须向用户确认,而不是猜测。 |
| 202 | |
| 203 | --- |
| 204 | |
| 205 | ## Read(查询) |
| 206 | |
| 207 | | 场景 | 工具 | 说明 | |
| 208 | |------|------|------| |
| 209 | | 获取 pipeline 详情 | `testany_get_pipeline` | 传入 pipeline key | |
| 210 | | 获取 YAML 内容 | `testany_get_pipeline_yaml` | 传入 pipeline key | |
| 211 | | 搜索/列出 pipelines(按 workspace) | `testany_list_pipelines` | `workspace` 必填 | |
| 212 | | 仅列出我的 pipelines(按 workspace) | `testany_list_my_pipelines` | `workspace` 必填 | |
| 213 | |
| 214 | --- |
| 215 | |
| 216 | ## Update(更新) |
| 217 | |
| 218 | ### 可更新的字段 |
| 219 | |
| 220 | | 参数 | 说明 | |
| 221 | |------|------| |
| 222 | | `name` | pipeline 名称 | |
| 223 | | `description` | 描述 | |
| 224 | | `definition` | YAML 定义 | |
| 225 | | `case_keys` | 简单顺序执行的 case keys | |
| 226 | | `environments` | 环境标签列表 | |
| 227 | | `owned_by` | 所有者邮箱 | |
| 228 | | `pipeline_labels` | Pipeline 标签列表 | |
| 229 | |
| 230 | ### 更新流程 |