Skill: API Designer
SkillMediaDesign OpenAPI specifications derived from scenario sequence diagrams. Use when scenarios exist in 2-scenario-implementation/ but logos/resources/api/ is empty. All description and summary values in YAML must be double-quoted.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Skill: API Designer skill
What this skill tells your AI
The instructions your AI receives, as published by miniidealab/openlogos in skills/api-designer/SKILL.md and read by ahel’s review.
基于时序图设计 OpenAPI 3.0+ YAML 规格,让 API 从场景中自然浮现而非凭空定义。每个端点可追溯到时序图的 Step 编号,确保"无场景不设计 API"。
触发条件
- 用户要求设计 API 或编写 API 文档
- 用户提到 "Phase 3 Step 2"、"API 设计"
- 已有场景时序图,需要细化 API 规格
- 用户提供了一个 API 端点需要详细设计
前置依赖
logos/resources/prd/3-technical-plan/2-scenario-implementation/中包含场景时序图logos/resources/prd/3-technical-plan/1-architecture/中包含架构概要(确认前后端分离方式、认证方案等)logos-project.yaml的tech_stack已填写
如果时序图目录为空,提示用户先完成 Phase 3 Step 1(scenario-architect)。
核心能力
- 从时序图中提取所有跨系统边界的 API 调用
- 去重、合并、按领域分组,形成端点清单
- 设计 OpenAPI 3.0+ YAML 规格(路径、参数、请求体、响应结构)
- 定义统一的错误响应格式和错误码体系
- 设计认证方案(Bearer Token / API Key / Cookie)
- 设计分页、排序、过滤的标准化参数
执行步骤
Step 1: 读取场景上下文
读取以下文件建立完整上下文:
- 场景时序图(
logos/resources/prd/3-technical-plan/2-scenario-implementation/):提取所有跨系统边界的箭头 - 架构概要(
logos/resources/prd/3-technical-plan/1-architecture/):确认认证方案、前后端分离方式、API 网关等 logos-project.yaml:读取tech_stack确认后端框架和部署方式
Step 2: 提取端点清单
遍历所有场景时序图,收集每个跨系统边界的调用箭头:
- 识别"跨系统边界"的箭头——客户端到服务端、服务端到外部服务、服务间调用
- 为每个箭头提取:HTTP 方法、路径、所属场景编号和 Step 编号
- 去重合并——同一个端点可能在多个场景中出现(如
POST /api/auth/login可能在 S02 和 S03 都有) - 输出端点清单摘要供用户确认:
从时序图中识别到 N 个 API 端点:
| # | 方法 | 路径 | 来源场景 | 领域 |
|---|------|------|---------|------|
| 1 | POST | /api/auth/register | S01 Step 2 | auth |
| 2 | POST | /api/auth/login | S02 Step 1 | auth |
| 3 | GET | /api/projects | S04 Step 1 | projects |
Step 3: 按领域分组
将端点按业务领域分组,每组对应一个 YAML 文件:
auth.yaml— 认证相关(注册、登录、登出、重置密码)projects.yaml— 核心业务对象的 CRUDbilling.yaml— 支付和订阅
分组原则:
- 同一数据实体的操作放在一起
- 认证/授权独立分组
- 第三方服务回调(如支付回调)放在对应业务领域
Step 4: 设计统一约定
在生成具体端点前,先确定全局约定:
认证方案(从架构概要中读取):
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
统一错误响应:
components:
schemas:
ErrorResponse:
type: object
required: [code, message]
properties:
code:
type: string
description: 机器可读的错误码(如 EMAIL_EXISTS)
message:
type: string
description: 人类可读的错误描述
details:
type: object
description: 附加错误信息(如字段级校验错误)
分页参数(适用于列表端点):
parameters:
- name: page
in: query
schema: { type: integer, minimum: 1, default: 1 }
- name: per_page
in: query
schema: { type: integer, minimum: 1, maximum: 100, default: 20 }
Step 5: 逐端点设计详细规格
为每个端点设计完整的 OpenAPI 规格,逐领域输出,每完成一个领域暂停让用户 review:
每个端点必须包含:
operationId:唯一标识符,用于代码生成summary:一句话描述description:标注来源时序图步骤(如来源:S01 Step 2 → Step 3)requestBody:包含所有字段的 schema(含 required、类型、校验规则如 minLength/format)responses:覆盖正常响应 + 所有已知异常(从时序图的 EX 用例中提取)
示例:
paths:
/api/auth/register:
post:
operationId: register
summary: 用户注册
description: "来源:S01 Step 2 → Step 3"
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [email, password]
properties:
email: { type: string, format: email }
password: { type: string, minLength: 8 }
responses:
'201':
description: 注册成功,发送验证邮件
content:
application/json:
schema:
type: object
properties:
userId: { type: string, format: uuid }
message: { type: string }
'409':
description: "邮箱已被注册(EX-2.1)"
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'422':
description: 请求参数校验失败
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
Step 6: 验证追溯完整性
输出完成后,做一次追溯检查:
- 正向检查:每个时序图中的跨系统箭头都有对应的 API 端点
- 反向检查:每个 API 端点的
description都标注了来源 Step - 异常覆盖:时序图中的每个 EX 用例都有对应的 HTTP 错误响应
如果发现遗漏,补充后再输出最终版本。
输出规范
- 文件格式:OpenAPI 3.1 YAML
- 存放位置:
logos/resources/api/ - 按领域分文件:
auth.yaml、projects.yaml、billing.yaml - 每个文件包含完整的
openapi、info、paths、components段 - 错误响应统一引用
$ref: '#/components/schemas/ErrorResponse' - 每个端点的
description必须标注来源时序图步骤
YAML 格式规则(必须遵守)
YAML 对空白和特殊字符敏感。AI 生成的 YAML 经常因为特殊字符未加引号而导致解析失败。必须严格遵守以下规则:
description和summary的值必须用双引号包裹 — 任何包含:、→、#、&、*、!、>、|、%、@、`、{、}、[、]的字符串都必须用"..."包裹。# ❌ 错误 — 冒号和箭头导致 YAML 解析失败 description: 来源:S05 Step 1 → Step 4. # ✅ 正确 description: "来源:S05 Step 1 → Step 4."- 响应状态码 key 必须加引号 — 使用
'201'而非201,防止 YAML 将其解析为整数。 - 生成后自检 — 每生成一个 YAML 文件后,重新审视是否存在未加引号的特殊字符。尤其注意引用场景步骤的
description字段(它们总是包含:)。 - 拿不准就加引号 — 给安全字符串加引号无害,但漏掉危险字符串的引号会导致整个文件解析失败。
实践经验
- API 从时序图浮现:如果一个 API 在时序图中找不到出处,它大概率不应该存在。先画时序图再设计 API,而非反过来
- 路径命名:RESTful 风格,使用复数名词,
/api/{resource} - 版本前缀:初期不加版本前缀(
/api/auth/register),需要版本管理时再加/api/v2/ - 状态码语义:严格遵循 HTTP 状态码语义——200 成功、201 创建、400 参数错误、401 未认证、403 无权限、404 不存在、409 冲突、422 校验失败、500 服务错误
- 幂等设计:PUT/DELETE 操作必须幂等
- 敏感数据:响应中不包含密码、token 等敏感信息的明文
- 逐领域输出:不要一次输出所有端点——按领域分批输出,每批让用户 review 后再继续
- 字段命名一致:API 中的字段名要与后续 DB 设计中的列名保持一致(或有明确的映射规则),避免代码层出现不必要的字段转换
推荐提示词
以下提示词可以直接复制给 AI 使用:
帮我设计 API基于时序图帮我生成 OpenAPI YAML帮我设计 S01 相关的 API 规格帮我把所有时序图中的跨系统调用提取为 API
⚠️ 收尾步骤(强制):更新 resource_index
完成本 Skill 的所有 OpenAPI YAML 产出后,必须将新生成的文件追加写入 logos/logos-project.yaml 的 resource_index 字段:
resource_index:
# ...已有条目...
- path: logos/resources/api/<文件名>.yaml
desc: <领域名称> API 规格(OpenAPI 3.x)。涉及 <相关端点> 的请求/响应结构、状态码、认证方式时必读。
不执行此步骤将导致后续 test-writer/code-implementor 无法感知 API 规格文件,AI 将无法基于正确的接口定义编写测试和代码。
S39 delta 模式:从 effective sequence 生成唯一 API delta
激活与前置
仅当 on-touch-v1 闭包矩阵判定 API/interface 适用时启用。必须先存在 effective scenario sequence;若没有时序来源,返回 AMBIGUOUS/前置缺失,禁止直接从用户一句话猜 OpenAPI。
当前 change-writer 拥有最终文件写入权;本 Skill 返回 API 内容、验证结论与 orchestration 影响,不得创建第二份“API 基线 delta”。
适用性
以下任一成立则 API 适用:HTTP、RPC、GraphQL、稳定 CLI/进程协议、消息 topic/event、webhook 或其它跨边界公开契约。纯进程内调用且无稳定外部协议可证据化 SKIP。
adopted 历史 skip_phases: [api] 不是永久禁用;与时序冲突时必须让 plan 暴露冲突。
MODIFY
- 读取主 API + 当前同目标 delta 的 effective view;
- 对已有 endpoint/schema 做兼容修改,对新 endpoint/schema 在同一文件增加;
- 保留未变更 endpoint/schema/operationId 与稳定 ID,遵守守恒/兼容策略;
- 多场景共享一个 OpenAPI 文件时聚合为一份最终态 delta。
- 对
.yaml|.yml|.json目标,输出必须是整文件最终态而非片段,首行为## MODIFIED — <canonical target>(整文件替换);其后 payload 是完整 OpenAPI。change-writer 不得再包一层 Markdown marker。
CREATE
目标缺失时返回完整可校验接口文档,至少含:
- OpenAPI/协议版本与 info;
- servers/channels(适用时);
- paths/operations 或消息 channel;
- 唯一 operationId/message name;
- request/response/schema 与必填/约束;
- error/状态码;
- auth/permission;
- 幂等、分页、并发或重试中适用项;
- 版本兼容/弃用策略;
- 从 scenario 步骤到 operation 的追溯。
Markdown 外的 YAML/JSON delta 在剥离首行控制 marker 后必须是有效 OpenAPI;含冒号等特殊字符的文本按项目规范引用。禁止 TODO/空 paths/只有示例无 schema。
对 non-Markdown API target,完整输出格式固定:
## ADDED — logos/resources/api/<file>.yaml(新文件,整文件)
openapi: 3.1.0
...
- 首行声明 target 必须与 delta 路径映射结果一致;CREATE 只能用 ADDED,目标必须缺失。
- marker 不是 YAML 内容;merge/lint 在 parse 前剥离且仅剥离首行,最终 API 文件不得含 marker。
.yaml/.yml必须 duplicate-key fail-closed 解析,.json必须 duplicate-key-aware 解析,并通过 OpenAPI 3.x schema/ref/operationId 校验与 CREATE 完整度检查。- marker/路径/mode/存在性/语法/引用任一失败时返回
non_markdown_delta_invalid或create_target_incomplete,整批零落盘。协议权威定义见 merge-executor 的 non-Markdown 整文件章节。
输出给下游
同时返回:
- 受影响 operation 与 schema 清单;
- 每个 operation 对应的 scenario step;
- 需要 test-orchestrator 覆盖的主/异常链;
- 兼容/迁移风险。
API 适用即编排测试适用;change-writer 必须规划对应唯一 orchestration target,除非已有目标 MODIFY。
完成检查
- 全部 API 可追溯到 effective sequence;
- 目标模式与磁盘事实一致;
- 同 canonical target 只有一个输出;
- 语法验证与最低完整度均通过;
- 不读 seed staging,不写 verified/确认字段,不新增 JIT 流程。
Signals
- GitHub stars
- 72
- Forks
- 6
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
api-designer-miniidealab- Source
- github.com/miniidealab/openlogos