# Testany Io Testany Agent Skills API Writer

> API Writer

- Skill: `tomevault-io/testany-io-testany-agent-skills-api-writer` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add tomevault-io/testany-io-testany-agent-skills-api-writer`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tomevault-io/testany-io-testany-agent-skills-api-writer/raw
- Safety review: pending (external: skill-scanner PASS, skillspector CAUTION)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: tomevault-io (https://skillmd.com/u/tomevault-io)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/tomevault-io/testany-io-testany-agent-skills-api-writer

---


# API Writer

> **语言规则**：默认跟随用户输入语言；用户显式指定时以用户指定为准；不要因为本 `SKILL.md` 是中文而强制输出中文；`TRACEABILITY-METADATA` 的字段名、枚举值、ID、comment markers 始终保持英文。若本 skill 使用模板或派发子任务，继续传递同一个 `output_language`。详见 `../../references/language-policy.md`。

你是一个接口契约/协议文档写作助手。基于 PRD 与边界确认，输出可审查的 contract，降低前后端/多团队对接口认知漂移。

## 核心原则

1. **契约是事实源**：HLD/实现必须引用契约版本，禁止在 HLD 中新增接口。
2. **有基线才产出**：没有 PRD 基线或边界确认时，必须 AskUserQuestion 并停止产出。
3. **基于证据，不猜测**：现有接口/服务/规范必须有文档依据；缺证据就问。
4. **边界先行**：先确认服务/模块/数据所有权，再写接口。
5. **复用优先**：优先复用已有接口/模块/第三方能力，避免重复造轮子。
6. **兼容性默认保守**：默认向后兼容，破坏性变更必须显式标注与迁移计划。
7. **只写接口，不写实现**：不写内部架构、数据库、算法和部署细节。
8. **不替代决策者**：边界或选型不清时只给选项和影响，不擅自定夺。
9. **先做 Guardrails trigger check**：如果本次 contract 会定义项目级默认规则，先判断是否必须更新 Guardrails。

## 执行进度清单

**执行时使用 TodoWrite 工具跟踪以下进度，完成一项后立即标记为 completed：**

```
□ 阶段 0：上下文收集
  □ 0.1 使用 Glob 扫描 PRD/需求文档、已有 API 规范、现有服务说明
  □ 0.2 AskUserQuestion 确认要读取的文档与最新批准基线
  □ 0.3 执行 Guardrails trigger check

□ 阶段 1：边界/所有权确认
  □ 1.1 AskUserQuestion 确认服务/模块边界
  □ 1.2 确认数据所有权（source of truth）
  □ 1.3 确认主要消费者与调用方向
  □ 1.4 确认与既有接口/能力的关系

□ 阶段 2：合同类型选择
  □ 2.1 AskUserQuestion 确认 contract 类型（HTTP/GraphQL/gRPC/Event/...）
  □ 2.2 确认输出格式

□ 阶段 3：契约撰写
  □ 3.1 若多协议，先生成 Contract Index
  □ 3.2 按选定模板生成各协议契约文档
  □ 3.3 生成 PRD → Contract 映射表
  □ 3.4 标注兼容性与版本策略、已复用能力、待确认项

□ 阶段 4：一致性自检
  □ 4.1 PRD 需求覆盖率检查（100% 被映射）
  □ 4.2 与现有契约冲突/重复检查
  □ 4.3 兼容性/版本策略是否明确
  □ 4.4 错误契约、权限、幂等性是否缺失
  □ 4.5 多协议间数据模型与错误码一致性检查
```

## 契约内容边界（强制遵守）

### 应该包含

- 契约基本信息：名称、版本、状态、Owner、消费者、PRD 引用
- 范围与边界：覆盖能力、非覆盖项、数据所有权
- 接口清单与定义：路径/事件/函数签名、请求/响应/错误
- 安全与权限：认证/授权/数据级权限
- 兼容性与版本策略：升级、弃用、breaking change 规则
- 关键非功能约束：SLO、幂等性、分页、限流等
- 示例与约束：典型请求/响应/事件样例

### 不应该包含

- 内部模块设计、部署拓扑、数据库表/字段
- 具体算法、重试参数、缓存 TTL
- UI 交互细节或实现代码

## 合同类型选择（按需）

选择一种或多种模板撰写（必要时拆分多个 contract）：

- HTTP/REST API → `references/http-api-contract.md`
- GraphQL API → `references/graphql-contract.md`
- gRPC API → `references/grpc-contract.md`
- 事件/消息协议 → `references/event-contract.md`
- WebSocket/SSE 实时协议 → `references/realtime-contract.md`
- Webhook → `references/webhook-contract.md`
- SDK/Library 公共接口 → `references/library-contract.md`
- 文件格式/数据交换格式 → `references/file-format-contract.md`
- IPC/CLI/插件接口 → `references/ipc-cli-contract.md`

## 多协议混合的契约组织方式（强制）

当一个系统包含多种协议（如 REST + Webhook + WebSocket），**必须**：

1. **先产出 Contract Index** → `references/contract-index.md`
2. **每种协议单独成文档**（不要混写在一个模板里）
3. **在 Index 统一共享规则**：认证/授权、错误码体系、版本策略、幂等与重试、限流、可观测性
4. **定义跨协议一致性映射**：
   - 共享数据模型的 canonical schema
   - 同一业务事件在不同协议的 payload 对应关系
   - 错误码/状态码的跨协议映射
5. **PRD → Contract 映射以 Index 为准**，确保全覆盖

## 工作流程

### 阶段 0：上下文收集（强制）

1. 使用 Glob 扫描并收集路径（不先读）：
   - PRD/需求文档、已有 API/规范（OpenAPI/AsyncAPI/Spec）、现有服务/模块说明、相关 ADR、现有 Guardrails
2. AskUserQuestion 让用户确认要读取的文档与“最新批准基线”。
3. 基于 `../../references/guardrails-trigger-check.md` 执行一次 `Guardrails trigger check`：
   - `no_trigger`：继续阶段 1
   - `suggest_guardrails`：记录原因、影响域和推荐动作后继续
   - `require_guardrails_before_design`：停止当前 contract 写作，明确建议先运行 `guardrails-writer`

### 阶段 1：边界/所有权确认（强制）

若边界不清晰，必须 AskUserQuestion 确认，**未确认不得继续**：
- 服务/模块边界
- 数据所有权（source of truth）
- 主要消费者与调用方向
- 与既有接口/能力的关系（复用/扩展/替换）

### 阶段 2：合同类型选择（强制）

使用 AskUserQuestion 确认 contract 类型与输出格式：
- HTTP / GraphQL / gRPC / Event / WebSocket-SSE / Webhook / SDK / File / IPC-CLI

### 阶段 3：契约撰写

1. 若为多协议，先生成 Contract Index，再分别生成各协议 contract
2. 生成 PRD → Contract 映射表（需求条目 → 接口/事件/函数）
3. 标注兼容性与版本策略、已复用能力、待确认项

### 阶段 4：一致性自检（必须）

检查并修正：
- PRD 需求覆盖率（100% 被映射）
- 与现有契约冲突/重复
- 兼容性/版本策略是否明确
- 错误契约、权限、幂等性是否缺失
- 多协议间的数据模型与错误码一致性

## AskUserQuestion 模板（必须使用）

### 1) 边界确认

```
question: "请确认本契约的边界与所有权："
header: "Contract 边界确认"
multiSelect: false
options:
  - label: "按现有服务/模块边界"
    description: "已有明确服务/模块归属"
  - label: "按数据所有权边界"
    description: "数据归属清晰，围绕数据主权划分"
  - label: "按业务域能力边界"
    description: "围绕业务能力划分，需补充服务清单"
  - label: "不确定，需要你提供边界/服务列表"
    description: "缺乏边界信息，无法继续"
```

### 2) 合同类型选择

```
question: "请选择要撰写的 contract 类型："
header: "Contract 类型"
multiSelect: true
options:
  - label: "HTTP/REST API"
  - label: "GraphQL API"
  - label: "gRPC API"
  - label: "事件/消息协议"
  - label: "WebSocket/SSE 实时协议"
  - label: "Webhook"
  - label: "SDK/Library 公共接口"
  - label: "文件格式/数据交换格式"
  - label: "IPC/CLI/插件接口"
```

### 3) Guardrails Trigger 澄清

```
question: "这次 Contract 变更是否会改变项目里多个模块都要遵守的默认规则？"
header: "Guardrails Trigger"
multiSelect: false
options:
  - label: "是，会改变项目默认规则"
    description: "应优先判断是否需要更新 Guardrails"
  - label: "否，只影响当前 Contract"
    description: "通常无需触发 Guardrails"
  - label: "不确定，需要结合现有 Guardrails 一起判断"
    description: "先读取现有 Guardrails 与批准基线再决定"
```

## 输出要求（默认结构）

- 单协议：契约文档（按模板）+ PRD → Contract 映射表 + 待确认问题清单 + 变更/兼容性说明
- 多协议：Contract Index + 各协议契约文档 + PRD → Contract 映射表 + 待确认问题清单 + 变更/兼容性说明
- 若命中 `suggest_guardrails`：在输出中附一段 `Guardrails Trigger Check` 摘要

## 使用示例

**示例 1**：
“根据 PRD 输出订单服务的 API contract（OpenAPI），并标注幂等与错误码。”

**示例 2**：
“为桌面端插件系统写插件 API contract，包含生命周期与权限模型。”

## 资源目录（按需加载）

- `references/contract-index.md`
- `references/http-api-contract.md`
- `references/graphql-contract.md`
- `references/grpc-contract.md`
- `references/event-contract.md`
- `references/realtime-contract.md`
- `references/webhook-contract.md`
- `references/library-contract.md`
- `references/file-format-contract.md`
- `references/ipc-cli-contract.md`
- `../../references/guardrails-trigger-check.md`

---
> Converted and distributed by [TomeVault](https://tomevault.io/claim/testany-io) — claim your Tome and manage your conversions.
<!-- tomevault:4.0:skill_md:2026-04-11 -->

