mcpField
S
sync-service-docs

sync-service-docs

github.com/yikart开发27.0k48 次安装1 周前更新
代码仓库

关于 sync-service-docs

为指定的 ai 或 server 服务从 OpenAPI 规范和源码生成或更新产品文档,面向维护服务文档的开发者。支持首次建档与基于 Git 差异的定向更新,并要求接口结构和业务流程有明确依据。

主要功能

  1. 01按服务生成模块文档
  2. 02依据 OpenAPI 描述接口结构
  3. 03追踪源码中的业务调用流程
  4. 04根据 Git 差异更新文档
  5. 05输出文档变更摘要

适用场景

  1. 01为 ai 服务建立接口文档
  2. 02为 server 服务同步源码变更
  3. 03按 tag 拆分并维护模块文档

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/yikart/aitoearn --skill sync-service-docs

安装后在 Claude Code 中输入/sync-service-docs确认已加载。

详细介绍

来自项目 README

sync-service-docs

为指定服务生成或同步产品文档。

调用方式

/sync-service-docs [service]

不传 service 时,列出可用服务列表并停止。

服务配置表

ServiceOpenAPI 文件源码路径文档目录
aiopenapi/aitoearn-ai.yamlapps/aitoearn-ai/src/core/docs/ai-service/
serveropenapi/aitoearn-server.yamlapps/aitoearn-server/src/docs/server/

执行流程

Step 1 — 初始化
  1. 校验 service 参数,不在配置表中则报错停止
  2. 获取 git rev-parse --short HEAD → <hash> 和当前日期 → <today>
  3. 检查文档目录是否存在且有 .md 文件:
    • 不存在或为空 → 执行 Step 2(首次建档)
    • 已存在 → 执行 Step 3(差异更新)

Step 2 — 首次建档
2a. 读取 OpenAPI 规范

读取对应 OpenAPI 文件,提取:

  • 所有 paths:path + HTTP method + operationId + summary
  • 按 tags 分组(每个唯一 tag → 一个 .md 文件)
  • 每个接口的 parameters、requestBody schema、responses schema

原则:请求/响应结构必须完全来自 OpenAPI 定义,不得猜测字段。

2b. 阅读源码(完整追踪业务流程)

对每个 tag 对应的模块,沿调用链路完整追踪:

Controller → Service → Helper/Util → Consumer/Processor → Repository
                 ↓
            libs/ 共享库方法(如被调用则跟进阅读)

每个接口都要读完整调用链路中的所有方法,按代码实际执行顺序记录每一步做了什么,包括但不限于:

  • 参数校验、权限检查、资源存在性检查
  • 数据查询、数据构建、数据转换
  • 价格/用量计算与日志记录(如存在)
  • 异步队列投递与消费逻辑
  • 日志记录(AiLog 创建/更新)
  • 外部 API 调用
  • 文件上传/存储操作
  • 每个可能的错误分支及对应错误码

原则:业务流程必须来自源码逐行追踪,任何步骤都不得省略或猜测。

2c. 大代码库分段处理

当模块数量 ≥ 4 或单模块接口数 ≥ 8 时,使用子代理(Agent tool)并行处理:

  • 每个子代理负责 1-2 个 tag/模块:阅读 OpenAPI 对应部分 + 追踪源码 + 生成该模块的 .md 文件内容
  • 子代理 prompt 必须包含:该模块的 OpenAPI paths 列表、源码路径、文档结构规范(从本 skill 复制)、约束条件
  • 主流程负责:初始化、拆分任务、汇总子代理输出、写入文件、生成 README.md

示例拆分方式:

子代理 1: chat 模块(5 个接口)
子代理 2: image 模块(14 个接口)
子代理 3: video + agent 模块(各 5-6 个接口)
2d. 生成文档文件

按 tag 生成对应 .md 文件(格式见"文档结构规范"),同时生成 README.md(模块索引 + 通用约定)。

所有文件标题后紧跟:

> 最后更新时间:<today> &nbsp;|&nbsp; 代码基准:`<hash>`

Step 3 — 差异更新
3a. 读取各文档的代码基准

从每个已有文档的元信息行提取 代码基准:\` 中的 hash 值(<doc_hash>`)。

3b. 检测变更范围

对每个文档,检查 OpenAPI 和源码是否有变更:

git log <doc_hash>..HEAD --oneline -- <openapi_file> <source_path>

无输出则该文档跳过。有输出则继续分析。

3c. 分析差异并更新
git diff <doc_hash>..HEAD -- <openapi_file> <source_path>

根据 diff 内容精准更新对应章节:

变更类型文档操作
新增 path/method追踪源码,按规范格式新增接口章节
修改 requestBody/parameters/responses更新对应接口的请求/响应部分
源码业务逻辑变化重新追踪该接口调用链路,更新业务流程
删除接口移除对应文档章节,更新接口列表

原则:只更新有实际变化的章节,未变更章节保持原文不动(包括措辞和格式)。

3d. 更新文档元信息

将所有变更文档的日期和 hash 更新为当前值。


Step 4 — 输出摘要

完成后输出变更摘要:

文档动作说明
image.md新建14 个接口
video.md已更新新增 Grok 视频生成章节
chat.md跳过无代码变更

文档结构规范

模块文档(每个 tag 一个 .md 文件)
# <模块名称>

> 最后更新时间:2026-03-12 &nbsp;|&nbsp; 代码基准:`a7d3afb3`

## 概述

<1-2 句功能描述>

**相关源码:** `apps/<service>/src/core/<module>/`

---

## 接口列表

| 方法 | 路径 | 功能 |
|------|------|------|
| POST | `/api/...` | ... |
| GET  | `/api/...` | ... |

---

## 1. <接口功能名>

### `<METHOD> <path>`

<1-2 句说明>

**请求体:**
```json
{ "field": "value" }

响应体:

{
  "code": 0,
  "data": { ... }
}

业务流程:

1. 校验参数/权限
   └── 失败 → ErrorCode

2. 查询资源/计算价格
   └── 不存在 → ResourceNotFound

3. 创建 AiLog(status=generating,记录预估用量/价格)

4. 投入异步队列(QueueName.Xxx)

5. 返回 { logId } 供前端轮询

── 异步阶段(Consumer) ──────────────────

6. 消费任务 → 调用外部 API

7a. 成功:
    - 上传结果到 S3
    - 更新 AiLog(status=success, response=...)

7b. 失败:
    - 更新 AiLog(status=failed, errorMessage=...)

**关于业务流程的说明:**
- 上方模板仅为**异步队列**模式的示例,实际流程根据源码如实描述
- 同步模式:先调用 API → 从响应提取用量 → 写 AiLog
- 纯同步无用量记录:直接描述业务操作
- 流程中的每一步都应来自源码,按实际执行顺序排列
- 错误分支写在对应步骤的 `└──` 子行中,不单独设"错误码"节

### README.md 结构

```markdown
# <Service> 服务产品文档

> 最后更新时间:<date> &nbsp;|&nbsp; 代码基准:`<hash>`

## 模块索引

| 文档 | 功能描述 |
|------|---------|
| [chat.md](./chat.md) | AI 对话、流式输出 |
| ...                   | ... |

## 通用约定

### 认证
- 所有接口需携带 JWT Token(`Authorization: Bearer <token>`)
- `userId` / `userType` 由网关解析后注入

### 响应格式
```json
{ "code": 0, "message": "success", "data": { ... } }

code=0 表示成功,非 0 为业务错误码(定义在 libs/common/src/enums/response-code.enum.ts)。

用量记录

<根据该服务的实际实现描述 AiLog、价格或 token 用量记录;没有则写“无”。>


---

## 约束

### 必须做

1. **请求/响应结构来自 OpenAPI** — 字段名、类型、必填状态以 OpenAPI schema 为准
2. **业务流程来自源码逐行追踪** — 沿 Controller → Service → Helper → Consumer 完整追踪,不省略任何步骤
3. **libs/ 共享库方法也要跟进阅读** — 当 Service 调用了 `libs/` 中的方法(如 queueService),必须读取其实现
4. **通用约定写在 README.md** — 认证、响应格式、用量记录等跨模块通用内容只在 README 中写一次
5. **更新模式先看 git diff** — 只更新有实际代码变化的章节,未变化章节保持原文不动
6. **所有文档统一使用当前 HEAD hash** — 不混用不同 hash
7. **中文描述,代码标识符保持英文** — 如 `AiLog`、`status=generating`
8. **大代码库使用子代理并行处理** — 模块多或代码量大时拆分给子代理,提高效率

### 禁止做

1. **不得生成测试要点** — 这是纯产品文档,不包含测试用例、测试要点、边界条件测试等内容
2. **不得单独设"计费流程"或"错误码"节** — 计费是业务流程的一个步骤,错误码写在流程的失败分支中
3. **不得在模块文档中重复通用约定** — 认证方式、响应格式等不在各模块文档中重复
4. **不得猜测字段或流程** — OpenAPI 中没有的字段不写,源码中没有的步骤不编
5. **不得修改未变更的章节** — 差异更新时,没有代码变化的章节保持原文(包括措辞和格式)
6. **不得遗漏业务步骤** — 源码中的每个操作(校验、查询、转换、计费、日志、上传、队列等)都要在流程中体现

评论

支持 Markdown