Structured PR Review
基于gh CLI的结构化PR审查与反馈回应,支持多层分析与严重性分级。
从代码、HAR文件或抓包数据生成OpenAPI 3.x规范,支持交互式优化。
openclaw skills install @harrylabsj/openapi-spec-generator命令、参数、文件名以原文为准
将原始的 API 接口信息转换为可直接用于生产的 OpenAPI 3.x 规范。支持从代码仓库、HAR 文件、流量日志或数据包捕获中导入数据,通过交互式调整,最终生成经过验证、可共享的规范文件。
输入:用户选择一个或多个数据源:
输出:确认的输入源及其格式。若选择多个源,则采用合并模式(合并所有接口)。
输入依据源类型:
- Go(Gin):router.GET("/users/:id", ...)
- Java(Spring):@GetMapping("/users/{id}")
- Python(FastAPI):@app.get("/users/{id}")
- Node(Express):app.get('/users/:id', ...)
操作:对相似路径进行聚类以识别路径参数:
GET /users/1
GET /users/2
GET /users/42
→ GET /users/{id}输出:接口列表:方法 + 路径模板 + 数量/置信度
输入:接口列表 + 原始数据
针对代码源:提取请求/响应结构体/类:
json:"name" binding:"required")@RequestBody、@Valid 注解及 DTO 字段注解针对流量源:按接口聚合观测到的请求体与响应体,从样本中推断 JSON Schema:
输出:每个接口的请求模式 + 按状态码划分的响应模式。每项推断字段附带置信度评分。
输入:接口列表 + 模式信息
操作:对参数进行分类:
{id}、{userId} —— 从 URL 模板中提取?page=1&limit=20 —— 来自 HAR 中的查询字符串Authorization、X-Request-ID、Content-Type输出:每个接口的完整参数列表,包含类型、位置、是否必填、描述(自动提取或来自代码注释)
输入:代码注解或捕获的请求头
操作:识别认证模式:
Authorization: Bearer eyJ... 请求头模式X-API-Key: ... 或 ?api_key=... 模式Authorization: Bearer ... + 代码中存在令牌刷新逻辑Authorization: Basic ... 请求头输出:安全方案定义 + 应用到的接口列表
输入:所有分析结果
操作:生成 OpenAPI 3.x YAML(默认)或 JSON 格式:
openapi: 3.0.3
info:
title: {根据项目名称或用户输入推断}
version: 1.0.0
servers:
- url: {根据流量捕获或用户输入推断}
paths:
/users/{id}:
get:
summary: 根据 ID 获取用户
parameters:
- name: id
in: path
required: true
schema:
type: integer
responses:
'200':
description: 成功响应
content:
application/json:
schema:
$ref: '#/components/schemas/User'
components:
schemas:
User:
type: object
properties:
id:
type: integer
name:
type: string
required: [id, name]输出:OpenAPI 规范草稿文件
输入:规范草稿 + 用户反馈
操作:展示规范摘要:
输出:用户可确认、修改或补充内容,系统重新生成并验证,进入下一轮迭代
输出:
技能:OpenAPI 规范生成器
版本:1.0.0
分块:2/3
用户可执行以下操作:
输出:优化后的规范。每次修改后需重新生成并验证。
输入:已优化的 OpenAPI 规范
操作:
# prism-config.yml
mock:
dynamic: true
cors: true输出:已验证的 OpenAPI 规范文件 + 可选的模拟服务器配置
用户:“从这个 Go 项目生成 OpenAPI 文档 [path: ~/projects/user-service/]”
期望输出:
发现 12 个端点,分布在 3 个路由组中:
GET /health
GET /api/v1/users
POST /api/v1/users
GET /api/v1/users/{id}
PUT /api/v1/users/{id}
DELETE /api/v1/users/{id}
...
生成 5 个模式:User、CreateUserRequest、UpdateUserRequest、ErrorResponse、Pagination
认证方式:Bearer JWT(通过中间件检测)
草稿规范已保存:openapi.yaml(12 个端点,5 个模式)
警告:2 个端点缺少响应描述用户:“我从浏览器导出了 HAR 文件,帮我生成 API 文档 [upload: api-capture.har]”
期望输出:
解析 HAR:共 287 个请求,涉及 3 个域名
去重后得到 23 个唯一端点
置信度:高(每个端点有多个样本)
14 个端点有 ≥5 个响应样本(模式推断:高置信度)
9 个端点有 1–4 个样本(模式推断:中等置信度)
草稿规范:openapi.yaml(23 个端点,31 个模式)
⚠️ 5 个端点仅捕获到 200 OK 响应(错误模式可能不完整)用户:“帮我写一个用户管理 API 的 OpenAPI 文档:注册、登录、获取个人信息、更新个人信息、注销账号”
期望输出:包含 5 个端点的完整 OpenAPI 规范,包含 User/AuthRequest/AuthResponse 模式、JWT 认证方案及标准错误响应。提供交互式优化选项。
用户:“分析这个 Charles 抓包日志,生成 API 文档 [upload: charles-session.chls]”
期望输出:解析 Charles Proxy 会话导出 → 提取 HTTP 请求 → 去重 → 推断模式 → 生成规范。注意:二进制或 Protobuf 内容标记为“无法解析”。
用户:“帮我检查这个 OpenAPI 文件有没有问题,并补充缺失的描述 [upload: api-spec.yaml]”
期望输出:验证报告:“3 个响应描述缺失,1 个 $ref 引用损坏,2 个模式缺少 'type' 字段。” 已修复版本:api-spec-v2.yaml。
用户:“基于刚生成的 OpenAPI 文档,生成一个模拟服务器配置”
期望输出:兼容 Prism 的配置文件 + docker-compose 启动片段。说明:“运行 docker-compose up,模拟 API 将在 http://localhost:4010 可访问。”
场景:开发者接手一个五年历史的 Go 微服务,没有任何 API 文档。
输入:“这个老项目没有任何 API 文档,帮我从代码生成 [path: ~/projects/legacy-order-service/]”
步骤:
json:"order_id" binding:"required" → 必填字段// DEPRECATED: use /v2/orders输出:完整的 OpenAPI 规范 + “已弃用端点” 迁移指南
场景:需要对接一个无文档的第三方 API。
输入:“对接第三方 API 没有文档,只有这个 HAR 文件 [upload: partner-api.har]”
步骤:
/orders/1001、/orders/1002 → /orders/{orderId}输出:包含 34 个端点、模式和认证方案的规范。标记:“HMAC 签名算法未知 — 请与合作方确认”
场景:团队希望在 3 个微服务间统一 API 设计规范。
输入:“我们有 3 个服务的 API,帮我生成统一的 OpenAPI 规范,检查不一致的地方”
步骤:
user_id vs userId vs userID)输出:统一规范 + 不一致问题报告 + 迁移计划
openapi-gen.sh scan ~/projects/user-service/ — 发现端点并识别框架openapi-gen.sh infer ~/projects/user-service/ — 审查推断出的请求/响应模式openapi-gen.sh generate ~/projects/user-service/ --output openapi.yaml — 生成已验证的 OpenAPI 3.x 规范| 条件 | 行为 |
|---|---|
| 代码仓库中未检测到任何路由 | 标记:No API routes found. Supported frameworks: Gin, Spring, FastAPI, Express. Check path or specify framework. |
| HAR 文件包含非 HTTP 条目 | 自动过滤;若过滤条目超过 50%,发出警告 |
| PCAP 包含加密的 HTTPS 流量 | 警告:Cannot decrypt HTTPS without session keys. Provide SSLKEYLOGFILE or use browser HAR export instead. |
| 二进制协议(gRPC、Thrift) | 标记为 protobuf detected — OpenAPI spec for gRPC requires .proto files |
| 检测到超过 500 个端点 | 分页输出;按章节生成规范 |
| 存在重复的路径+方法组合 | 合并并提示可能存在覆盖情况 |
| 端点无响应体示例 | 标记为 schema unknown;响应体设为 {} 并附警告 |
| 代码使用自定义或非标准路由 | 回退至基于 AST 的函数分析;置信度降低 |
| 错误码 | 场景 | 处理方式 |
|---|---|---|
| E-NO-ROUTES | 代码中未发现 API 路由 | 请求指定框架;提供手动输入模式选项 |
| E-HAR-PARSE-FAIL | HAR 文件损坏或无效 JSON | 显示解析错误位置;建议从浏览器重新导出 |
| E-PCAP-DECRYPT | PCAP 仅包含加密流量 | 说明 SSLKEYLOGFILE 要求;建议使用 HAR 导出 |
| E-SCHEMA-CONFLICT | 模式推断冲突(同一字段类型不一致) | 标记该字段;展示每种类型的证据;请用户手动解决 |
| E-VALIDATION-FAIL | 生成的规范无法通过 OpenAPI 验证 | 显示具体验证错误及行号;自动修复常见问题 |
| E-OVERSIZED | 生成的规范超出合理大小(>10K 行) | 提供按标签拆分为多个规范文件的选项 |
| E-UNSUPPORTED-FRAMEWORK | 代码库使用无路由扫描器支持的框架 | 提供基于 AST 的扫描选项(置信度较低)或手动输入端点 |
{{YOUR_API_KEY}} 占位符。已收录 14 个 Skill