CZ-Stack 的 API 文档必须与 contract-package 同源生成,而不是维护第二份手写规范。
当前仓库已经落地 @cz-stack/contract 与 @cz-stack/api:
@cz-stack/contract维护 OpenAPI 文档、Zod schema 与共享 client。@cz-stack/api提供/openapi.json作为 JSON 导出入口,不再内置/docs展示页面。
因此,本文说明的是当前基线如何维护 API 文档事实源与导出入口,以及为什么仓库不再内置 docs 项目或文档站点构建流程。
modules/contract/openapi/openapi.yaml是仓库内唯一可手工维护的 OpenAPI 事实源。api-service直接消费这份 contract,保证运行实现与文档描述不漂移。- 若部署后对外提供
/openapi.yaml,它只是事实源文件的发布地址。 /openapi.json是从同一份 contract 导出的消费格式,不是事实源。- SDK 生成若后续接入,也只能围绕 contract 扩展,不能另起一份 API 描述。
@cz-stack/api在应用入口对全部 API 路由统一启用全局 CORS,并固定返回Access-Control-Allow-Origin: *。- 浏览器对 API 路由发起
OPTIONS预检时,由同一套全局中间件处理,不要求每个路由单独声明OPTIONS处理器。 - 这一策略只解决浏览器跨域兼容性,不承担后端访问控制职责。
- 如果后端需要限制访问,必须依赖独立的鉴权或网络层机制,而不是把 CORS 当成权限边界。
modules/contract/openapi/openapi.yaml
-> publish as /openapi.yaml (optional deployment form)
-> derive/export JSON as /openapi.json when needed
-> downstream tools or external docs readers consume one of those outputs
- OpenAPI 事实源:
modules/contract/openapi/openapi.yaml - contract 导出入口:
modules/contract/src/openapi.ts - API 文档 JSON:
modules/api启动后访问/openapi.json - API 文档展示:仓库内不再内置;如需展示层,应由仓库外或未来独立入口消费事实源/导出结果
- 仓库导航入口:
../../README.md与../architecture/validation.md
如果需要本地检查当前 API 侧 JSON 导出,可先运行 PORT=3100 pnpm --filter ./modules/api run dev,再访问 http://localhost:3100/openapi.json。
- 手写规范容易与服务实现、类型定义和测试输入输出产生漂移。
- contract 同源生成可以让 Web、API、CLI 与任何外部文档展示入口共享同一套协议定义。
- 未来若接入 SDK 生成,也应继续围绕 contract 扩展,而不是新增独立文档事实源。
- 在 contract 模块中保留
modules/contract/openapi/openapi.yaml与对应导出入口。 - 若对外发布 YAML,发布地址应直接映射这份事实源,而不是再手工复制一份文档文件。
- API 运行时可以继续暴露
/openapi.json,但所有文档说明都必须强调它只是导出格式。 - README 与架构文档只说明入口与生成方式,不复制手写接口细节。
pnpm openapi:check应持续通过,确保 contract 导出的 OpenAPI 文档与 API 暴露入口没有脱节。
- 不在仓库文档中复制一份手写 endpoint 说明。
- 不要求首版必须生成独立 SDK 包。
- 不在仓库内再维护一个 docs 项目或文档站点构建流程。
- 不把任何展示入口或
/openapi.json视为协议事实源;真实事实源始终是modules/contract/openapi/openapi.yaml。