[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6MX8F5H0WD2MMYWFJS8T7WK":3,"skill-same:01M6MX8F5H0WD2MMYWFJS8T7WK":51},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":26,"linkOnly":27,"markdownContent":28,"markdownBody":28,"frontMatter":29,"refName":30,"commitSha":31,"skillDirectory":32,"forksCount":33,"repositoryHtmlUrl":34,"repositoryHomepageUrl":6,"ownerHtmlUrl":35,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":36,"install":37,"resources":50},"01M6MX8F5H0WD2MMYWFJS8T7WK","test-orchestrator",null,"miniidealab\u002Fopenlogos","miniidealab","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F4251156?v=4","01M6MX6BM454XESZCRPBQQHKRT","FredHuang","01M6MX6BR4417H4QA658D4GW9X",581,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fminiidealab\u002Fopenlogos\u002Fblob\u002Fmaster\u002Fexamples\u002Fflowtask\u002Flogos\u002Fskills\u002Ftest-orchestrator\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[23,24,25],"test","orchestrator","test orchestrator","2026-11-10 10:12:30",false,"# Skill: Test Orchestrator\n\n> 基于业务场景和时序图设计 **API 编排测试**用例（Phase 3 Step 3b），覆盖正常\u002F异常\u002F边界场景，自动识别外部依赖并应用测试策略，作为端到端 API 验收标准。**仅适用于涉及 API 的项目。**\n\n## 与 test-writer 的关系\n\n本 Skill 负责测试金字塔的**顶层**——API 编排测试（HTTP 请求级别），执行于 Phase 3 Step 3b。\n\n底层的单元测试和场景测试（函数调用级别）由 `test-writer` Skill 在 Step 3a 完成。Step 3a 是所有项目的必选步骤，Step 3b（本 Skill）仅在项目涉及 API 时执行。\n\n## 触发条件\n\n- 用户要求设计 API 编排测试\n- 用户提到 \"Phase 3 Step 3b\"、\"API 编排\"、\"编排测试\"\n- Step 3a（test-writer）完成后，AI 引导用户继续进入 Step 3b\n- 用户需要验收已部署的 API 代码\n\n## 前置依赖\n\n- `logos\u002Fresources\u002Ftest\u002F` 中包含测试用例规格文档（Step 3a 已完成）\n- `logos\u002Fresources\u002Fprd\u002F3-technical-plan\u002F2-scenario-implementation\u002F` 中包含场景时序图\n- `logos\u002Fresources\u002Fapi\u002F` 中包含 API 规格（OpenAPI YAML）\n- `logos-project.yaml` 中包含 `external_dependencies`（如有）\n\n如果项目不涉及 API（纯 CLI 工具、纯前端等），跳过此 Skill。\n\n## 核心能力\n\n1. 从时序图和 API YAML 设计正常流程编排\n2. 基于异常用例（EX-N.M）设计异常流程编排\n3. 设计边界用例（合法但非主路径的变体）\n4. 定义变量提取和传递机制\n5. **识别外部依赖并应用测试策略**：读取 `logos-project.yaml` 的 `external_dependencies`，在涉及外部服务的步骤中自动插入 `mock` 字段\n6. 执行编排并验证结果\n\n## 执行步骤\n\n### Step 1: 读取场景上下文\n\n读取以下文件建立完整上下文：\n\n- 场景时序图（`logos\u002Fresources\u002Fprd\u002F3-technical-plan\u002F2-scenario-implementation\u002F`）\n- API YAML（`logos\u002Fresources\u002Fapi\u002F`）\n- `logos-project.yaml` —— 重点读取 `external_dependencies` 字段\n\n### Step 2: 识别外部依赖\n\n将 `external_dependencies` 中的 `used_in` 与当前场景编号匹配。如果当前场景涉及外部依赖：\n\n- 记录该依赖的 `test_strategy` 和 `test_config`\n- 如果某个依赖声明了 `used_in` 但缺少 `test_strategy`，**主动询问用户**测试策略\n\n如果 `logos-project.yaml` 中没有 `external_dependencies` 字段，但时序图中存在对外部服务的调用（如发送邮件、请求支付等），也应主动提醒用户补充。\n\n### Step 3: 设计正常流程编排\n\n按时序图的 Step 编号，逐步设计 API 调用链：\n\n- 每步包含 method、url、headers、body、expected_status\n- 涉及外部依赖的步骤，插入 `mock` 字段（见输出规范）\n- 上一步响应中需要传递的变量，使用 `extract` 定义提取规则\n\n### Step 4: 设计异常流程编排\n\n为每个 EX 异常用例设计独立的编排，确保：\n\n- 异常场景也能覆盖外部依赖的失败情况\n- 使用 `mock` 字段模拟外部服务异常（如超时、返回错误等）\n\n### Step 5: 设计边界用例编排\n\n识别合法但非主路径的变体（如密码长度刚好在边界值、空字段等），补充编排。\n\n### Step 6: 输出编排 JSON\n\n按场景输出可执行的编排 JSON 文件。\n\n## 输出规范\n\n- 文件格式：JSON\n- 存放位置：`logos\u002Fresources\u002Fscenario\u002F`\n- 按场景分文件：`user-auth.json`、`payment-flow.json`\n- 编排中的每一步对应时序图的 Step 编号\n\n### mock 字段结构\n\n当某一步涉及外部依赖时，在该 step 中添加 `mock` 字段：\n\n```json\n{\n  \"step\": \"Step 2: 获取邮件验证码\",\n  \"mock\": {\n    \"dependency\": \"邮件服务\",\n    \"strategy\": \"test-api\",\n    \"config\": \"GET \u002Fapi\u002Ftest\u002Flatest-email?to={email}\",\n    \"extract\": { \"code\": \"response.body.code\" }\n  },\n  \"method\": \"GET\",\n  \"url\": \"\u002Fapi\u002Ftest\u002Flatest-email?to={{email}}\",\n  \"expected_status\": 200,\n  \"extract\": {\n    \"verification_code\": \"body.code\"\n  }\n}\n```\n\n`mock` 字段说明：\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| `dependency` | string | 对应 `external_dependencies` 中的 `name` |\n| `strategy` | string | 测试策略（`test-api` \u002F `fixed-value` \u002F `env-disable` \u002F `mock-callback` \u002F `mock-service`） |\n| `config` | string | 测试策略的具体配置，来自 `test_config` |\n| `extract` | object | 从 mock 响应中提取变量（可选） |\n\n不同策略的编排表现：\n\n- **`test-api`**：该步骤的 url 替换为后门 API 地址\n- **`fixed-value`**：该步骤不发起实际请求，直接在 `extract` 中注入固定值\n- **`env-disable`**：该步骤标记为跳过，附带注释说明前提条件\n- **`mock-callback`**：在前一步完成后插入一个额外的 mock 回调请求\n- **`mock-service`**：该步骤的 url 替换为本地 mock 服务地址\n\n## 实践经验\n\n- **正常编排是骨架**：先完成正常流程编排，确保主路径可以跑通\n- **异常编排是保障**：每个外部调用至少 1 个异常编排\n- **变量传递**：前一步的响应中提取变量（如 token、user_id），传给后续步骤\n- **测试数据**：编排开始前准备测试数据，结束后清理，保证幂等性\n- **并发测试**：关键场景需要考虑并发情况（如：两人同时注册同一邮箱）\n- **外部依赖先查清单**：开始设计编排前先读 `logos-project.yaml` 的 `external_dependencies`，没有声明的外部调用要主动提醒用户补充\n- **mock 策略不要自行决定**：测试策略由 S12 技术架构设计（Phase 3 Step 0, architecture-designer）确定，编排测试阶段只负责消费，不要擅自更改\n- **与 `openlogos verify` 的关系**：API 编排测试也可产出与 `spec\u002Ftest-results.md` 相同格式的 JSONL 结果。编排测试运行后，结果同样写入 `logos\u002Fresources\u002Fverify\u002Ftest-results.jsonl`，`openlogos verify` 统一读取并判定验收\n\n## 推荐提示词\n\n以下提示词可以直接复制给 AI 使用：\n\n- `帮我设计编排测试`\n- `基于 API 规格帮我生成 S01 的编排测试`\n- `帮我把所有场景的正常路径编排出来`\n- `帮我给 S02 补充异常路径的编排测试`\n",{},"master","abf55fdedadaeb660f928aa7258b9ec35d4ab003","examples\u002Fflowtask\u002Flogos\u002Fskills\u002Ftest-orchestrator",9,"https:\u002F\u002Fgithub.com\u002Fminiidealab\u002Fopenlogos","https:\u002F\u002Fgithub.com\u002Fminiidealab","2026-10-18 11:36:11",{"source":7,"skillName":5,"commands":38,"prompt":48,"zipAvailable":49},[39,42,45],{"tool":40,"command":41},"npx","npx skills add miniidealab\u002Fopenlogos --skill test-orchestrator",{"tool":43,"command":44},"bunx","bunx skills add miniidealab\u002Fopenlogos --skill test-orchestrator",{"tool":46,"command":47},"pnpm","pnpm dlx skills add miniidealab\u002Fopenlogos --skill test-orchestrator","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fminiidealab\u002Fopenlogos\u002Fblob\u002Fmaster\u002Fexamples\u002Fflowtask\u002Flogos\u002Fskills\u002Ftest-orchestrator\u002FSKILL.md",true,[],[52,96,105,111,119,128],{"skillNo":53,"name":54,"nameZh":6,"description":55,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":56,"categories":57,"keywords":75,"publishedAt":26},"01M6MXX45142DGRFD9ZYPT5YC9","ui-ux-pro-max","UI\u002FUX design intelligence. 67 styles, 96 palettes, 57 font pairings, 25 charts, 13 stacks (React, Next.js, Vue, Svelte, SwiftUI, React Native, Flutter, Tailwind, shadcn\u002Fui). Actions: plan, build, create, design, implement, review, fix, improve, optimize, enhance, refactor, check UI\u002FUX code. Projects: website, landing page, dashboard, admin panel, e-commerce, SaaS, portfolio, blog, mobile app, .html, .tsx, .vue, .svelte. Elements: button, modal, navbar, sidebar, card, table, form, chart. Styles: glassmorphism, claymorphism, minimalism, brutalism, neumorphism, bento grid, dark mode, responsive, skeuomorphism, flat design. Topics: color palette, accessibility, animation, layout, typography, font pairing, spacing, hover, shadow, gradient. Integrations: shadcn\u002Fui MCP for component search and examples.","https:\u002F\u002Fgithub.com\u002Fminiidealab\u002Fopenlogos\u002Fblob\u002Fmaster\u002Fskills\u002Fui-ux-pro-max\u002FSKILL.md",[58,61,64,67,72],{"categoryNo":59,"categoryName":60,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":62,"categoryName":63,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":65,"categoryName":66,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":68,"categoryName":69,"taxonomyType":70,"taxonomyTypeDesc":71},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",{"categoryNo":73,"categoryName":74,"taxonomyType":70,"taxonomyTypeDesc":71},"01JBSEEDCAT000000000000033","数据分析师",[76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95],"ui ux","pro","max","ui ux pro max","ui","ux","projects","mode","card","app","tsx","fix","improve","Tailwind","Charts","Animation","design","actions","MCP","search",{"skillNo":97,"name":98,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":102,"publishedAt":26},"01M6MXWY8HJV93BBR8FPNJXAMV","test-writer","https:\u002F\u002Fgithub.com\u002Fminiidealab\u002Fopenlogos\u002Fblob\u002Fmaster\u002Fskills\u002Ftest-writer\u002FSKILL.md",[101],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[103,104,23],"writer","test writer",{"skillNo":106,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":107,"categories":108,"keywords":110,"publishedAt":26},"01M6MXWSAMN9AD3T8F6N099ZGY","https:\u002F\u002Fgithub.com\u002Fminiidealab\u002Fopenlogos\u002Fblob\u002Fmaster\u002Fskills\u002Ftest-orchestrator\u002FSKILL.md",[109],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[24,25,23],{"skillNo":112,"name":113,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":116,"publishedAt":26},"01M6MXWN29FY7K9ASMFRSPWQCN","slice-planner","https:\u002F\u002Fgithub.com\u002Fminiidealab\u002Fopenlogos\u002Fblob\u002Fmaster\u002Fskills\u002Fslice-planner\u002FSKILL.md",[],[117,118],"slice planner","planner",{"skillNo":120,"name":121,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":124,"publishedAt":26},"01M6MXWFR1C1V66NSRTAM1FZPR","scenario-architect","https:\u002F\u002Fgithub.com\u002Fminiidealab\u002Fopenlogos\u002Fblob\u002Fmaster\u002Fskills\u002Fscenario-architect\u002FSKILL.md",[],[125,126,127],"architect","scenario","scenario architect",{"skillNo":129,"name":130,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":133,"publishedAt":26},"01M6MXWD6ZCGPT4FDT580S8K96","project-init","https:\u002F\u002Fgithub.com\u002Fminiidealab\u002Fopenlogos\u002Fblob\u002Fmaster\u002Fskills\u002Fproject-init\u002FSKILL.md",[],[134,135,136],"project init","init","project"]