klr-pattern/pydantic-resolve/skill
Claude Code and agent skill by klr-pattern/pydantic-resolve
- community
Checking that the SKILL.md file is still in the repository.
基于 pydantic-resolve 的三阶段开发模式,用于构建从建模讨论到生产部署的完整项目。适用于需要使用 ER Diagram + ORM + DefineSubset 渐进式开发的场景。
Install
npx vskill@latest install klr-pattern/pydantic-resolve/skillSKILL.md
pydantic-resolve 三阶段开发模式
基于 pydantic-resolve 的渐进式开发方法论。项目在一个 src/ 目录下逐步演进,每个阶段在上一阶段基础上新增代码。
| Phase | 职责 | 产出 | |
|---|---|---|---|
| Phase 0 | 需求确认 | 实体 + 关系 + 聚合根 + 用例方法(与用户反复确认) | |
| Phase 1 | Schema + ER Diagram + mock seed | ORM models + Entity DTOs + build_relationship + Voyager | |
| Phase 2 | 方法实现 + GraphQL | service/<domain>/methods.py + QueryConfig/MutationConfig + GraphQL | |
| Phase 3 | UseCase 响应组装 + MCP + REST | DefineSubset + AutoLoad + UseCaseService + REST + MCP |
核心原则
- 需求确认是 Phase 0,必须反复与用户确认后才能进入 Phase 1(详见下方「Phase 0: 需求确认」)
- 非功能模块与业务模块解耦,业务概念不侵入基础设施层
- 每个 Phase 采用 V 型验收:先定义验收标准(V 降),再实现,最后回查验收(V 升)
- 每个 Phase 实现完成后必须暂停,展示验收结果,等用户确认后再进入下一阶段
- Phase 间递进:同一项目目录下逐步丰富,只新增不修改已有代码
V 型验收模型(贯穿所有 Phase)
每个 Phase 的结构统一为三段:
验收标准必须是可观察、可操作的——不写"代码健壮",写"GraphiQL 中执行 X query 返回 Y"。
Phase 0: 需求确认(必做)
在写任何代码之前,必须与用户逐项确认以下内容。每一项都需要用户明确认可后才算完成。
Step 0-1: 术语与实体定义
逐一列出所有业务实体,每个实体说明:
- 业务含义(一句话,团队无歧义)
- 核心字段(名称 + 类型 + 语义说明,不需要穷举,但关键属性不能遗漏)
- 字段约束(唯一、非空、枚举值、联合唯一等)
用表格形式呈现,方便用户逐行确认。
Step 0-2: 实体关系
用文本 ER 图展示实体间关系,每条关系标明:
- 方向(1:N / N:1 / M:N)
- 业务含义(如「Sprint 包含多条 Task」)
- 是否需要中间实体
必须与用户确认关系方向和基数是否正确。
Step 0-3: 聚合根
明确哪个(或哪些)实体是聚合根。聚合根决定:
- 主要的业务入口(从哪个实体开始查询)
- @query / @mutation 挂在哪些实体上
- Phase 3 的 service 划分依据
Step 0-4: 业务域划分 + 用例方法
⚠️ 禁止自行决定 Service 切分方案。必须提出候选方案与用户讨论,由用户最终确认。
Step 0-4a: 提出 Service 切分候选方案
业务域(Service)按功能边界划分,不按实体划分。Service 切分直接影响:
- 目录结构(
service/<domain>/) - Phase 2 的 methods.py 粒度
- Phase 3 的 UseCaseService 类划分
- MCP 和 REST 的入口组织
必须向用户提出至少一种候选方案,说明每种方案的切分依据和优劣,由用户选择或修正。
常见的切分策略参考:
| 策略 | 示例 | 适用场景 | |
|---|---|---|---|
| 按业务功能域 | auth / chat / order | 业务边界清晰,领域间耦合低 | |
| 按聚合根 | user / conversation / message | 实体独立性强,CRUD 为主 | |
| 混合(功能域 + 独立聚合) | auth / chat(含 conversation+message) | 部分域跨实体协作 |
Step 0-4b: 按确认的 Service 划分列出用例方法
用户确认 Service 切分后,按每个业务域列出用例方法。每个方法说明:
- 方法名(动词开头,如
list_sprints、create_task) - 业务意图(一句话)
- 关键参数(列出参数名和含义)
示例格式:
| 业务域 | 方法名 | 业务意图 | 关键参数 | |
|---|---|---|---|---|
| sprint | list_sprints | 获取所有 Sprint | - | |
| sprint | get_sprint | 获取单个 Sprint | sprint_id | |
| task | list_tasks | 获取所有任务 | - | |
| task | get_tasks_by_sprint | 按 Sprint 查任务 | sprint_id | |
| task | create_task | 创建任务 | title, sprint_id, owner_id |
Step 0-5: GraphQL 定位
GraphQL 是辅助开发测试和 AI 测试的接口,不是正式 API。
业务方法的定义和挂载关系:
- Phase 2:方法体在
service/<domain>/methods.py中实现,通过QueryConfig/MutationConfig绑定到 ErDiagram 的 Entity - Phase 3:同一个方法在 UseCaseService 中调用(REST/MCP 使用),DTO 转换在 Service 层完成
Step 0-6: 第三方库确认
列出项目中涉及的非业务功能领域,对每个领域:
- 说明候选方案
- 给出推荐理由
- 必须调查用户提到的第三方库的当前维护状态
| 功能领域 | 推荐方案 | 理由 | 备注 | |
|---|---|---|---|---|
| ORM | SQLAlchemy 2.0 async | 成熟、pydantic-resolve 原生支持 build_relationship | - | |
| 可视化 | fastapi-voyager | ER diagram 可视化 | pip install fastapi-voyager | |
| MCP | fastmcp>=3.2.4 | pydantic-resolve 原生支持 | - |
对于 pydantic-resolve 已覆盖的领域(ORM 集成、GraphQL、MCP),不再重复讨论。
Step 0-7: 检查清单
全部确认后,向用户展示汇总:
- [ ] 所有实体和字段是否完整,约束是否清晰?
- [ ] 实体关系方向和基数是否正确?
- [ ] 聚合根是否明确?
- [ ] Service 切分方案是否由用户确认?
- [ ] 核心用例是否覆盖主要业务场景?
- [ ] 第三方库选型是否确认?
- [ ] 是否有明显的遗漏或边界情况?
全部确认后才能进入 Phase 1。
参考实现
读取本 skill 目录下 template/ 中的代码作为生成参考。严格遵守 template 中的文件结构、import 风格和命名约定。
项目结构
单项目渐进演进,每个 Phase 在上一阶段基础上新增文件:
三阶段定义
Phase 1: Schema + ER Diagram + mock seed
目标: 定义 ORM models + Pydantic Entity DTOs + build_relationship() + mock seed data,用 Voyager 可视化供团队讨论。不含任何业务方法。
新增/修改文件:
db.py— aiosqlite engine + session_factory(不导入 models,避免循环依赖)models.py— SQLAlchemy ORM models(纯字段 + relationship,加lazy="noload")entities.py— Pydantic Entity DTOs (from_attributes=True) +build_relationship()+ ErDiagram +config_resolver()database.py— mock seed data(从db.py导入 engine/session,从models.py导入实体)main.py— FastAPI + Voyager(ER diagram 可视化)
关键模式:
- ORM Model 和 Entity DTO 分离:ORM Model 是 SQLAlchemy
DeclarativeBase子类,Entity DTO 是 PydanticBaseModel子类(加model_config = ConfigDict(from_attributes=True)) build_relationship(mappings=[Mapping(entity=..., orm=...)], session_factory=...)从 ORM 元数据自动生成所有 DataLoaderErDiagram(entities=[]).add_relationship(entities)创建空 ErDiagram 后追加自动生成的关系config_resolver("MyResolver", er_diagram=diagram)创建与 ErDiagram 绑定的 Resolver class- ORM Model 的 relationship 全部加
lazy="noload",不依赖 ORM 懒加载 - Voyager 使用
fastapi-voyager的create_voyager(app, er_diagram=diagram) - Phase 1 无 GraphiQL(无方法可查询),GraphQL 在 Phase 2 后可用
V 降 — 定义验收标准: 进入 Phase 1 实现之前,在 spec/phase1.md 中记录验收标准:
| # | 验收项 | 验证方式 | |
|---|---|---|---|
| 1 | 每个 Entity 在 Voyager ER 图中正确显示,关系线方向正确 | 浏览器打开 Voyager | |
| 2 | models.py 中每个 ORM Model 只包含字段 + relationship,无业务方法 | 检查代码结构 | |
| 3 | entities.py 中每个 Entity DTO 有 from_attributes=True | 检查代码 | |
| 4 | mock seed 数据样本展示合理的数量、关联关系 | 编写简单查询验证 |
V 升 — 逐条回查验收:
- [ ] 1. Voyager ER 图:实体节点、关系线
- [ ] 2. ORM Model 纯字段:无业务方法
- [ ] 3. Entity DTO from_attributes=True
- [ ] 4. mock seed:数据量合理、关联关系正确
Phase 2: 方法实现 + Entity 挂载
目标: 按业务域实现独立方法,通过 QueryConfig/MutationConfig 绑定到 Entity,GraphQL 可查询。
新增/修改文件:
service/<domain>/methods.py— 独立业务方法实现(直接操作 session + ORM model)entities.py— 新增QueryConfig/MutationConfig绑定
关键模式:
- 业务方法在 `service/<domain>/methods.py` 中定义,为普通 async 函数(直接操作 SQLAlchemy session + ORM model,不含
cls参数) - 通过 `QueryConfig`/`MutationConfig` 在 ErDiagram 层面绑定到 Entity(不需要
mount_method()+_mount()桥接模式) QueryConfig(method=list_sprints, name="sprints")中 method 是独立函数,name 是 GraphQL 查询名- GraphQLHandler 接收 `er_diagram=diagram`(不是 base + session_factory)
- config_resolver 必须在 build_relationship 之后调用
- GraphQLHandler 必须在 ErDiagram 完整配置(含 QueryConfig/MutationConfig)之后创建
V 降 — 定义验收标准: 进入 Phase 2 编码之前,先与用户确认测试验收集并写入 spec/phase2.md:
| # | 方法 | 测试场景 | 预期结果 | 验证方式 | |
|---|---|---|---|---|---|
| 1 | list_sprints | 查询所有 | 返回 seed 数据 | GraphiQL query | |
| 2 | create_sprint | 创建新 Sprint | 返回新 Sprint | GraphiQL mutation | |
| 3 | tasks_by_sprint | 按 sprint 查任务 | 返回正确过滤结果 | GraphiQL query | |
| ... | ... | ... | ... | ... |
验收标准要求:
- 每个 query/mutation 至少覆盖:一个正常场景
- 验证方式统一通过 GraphQL query/mutation 在 GraphiQL 中执行
V 升 — 逐条回查验收: 启动服务,在 GraphiQL 中逐一执行验收表:
- [ ] 1. list_sprints → 返回 seed 数据
- [ ] 2. create_sprint → 返回新 Sprint 对象
- [ ] 3. tasks_by_sprint → 返回过滤后的任务列表
- [ ] ...(每条对标验收表)
- [ ] 确认 seed 数据仍可查询,Loader 行为符合预期
Phase 3: UseCase 响应组装 + MCP + REST
目标: 按 API 用例组装响应结构。DefineSubset 隐藏内部字段,AutoLoad 自动加载关系,UseCaseService 统一业务入口,REST 端点对外暴露。
新增/修改文件:
service/<domain>/spec.md— 服务目的、用途、需求、变更记录service/<domain>/dtos.py— DefineSubset DTOs + AutoLoad + post_*service/<domain>/service.py— UseCaseServicerouter/api.py— 手写 REST 路由main.py— 新增 REST + MCP
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskill/SKILL.md
Popularity
- Repository stars
- 326
- Repository forks
- 12
- 7-day trend score
- 29
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/klr-pattern/pydantic-resolve/skill)