mcpField
F
frappe-agent-architect

frappe-agent-architect

github.com/impertio-studio开发198122 次安装30 周前更新
代码仓库

关于 frappe-agent-architect

面向 Frappe/ERPNext 项目的架构 Agent,通过分析业务需求来规划应用边界、数据模型与跨应用依赖。内容还涵盖 ERPNext 扩展方式和架构决策,适用于编码前的方案设计。

主要功能

  1. 01将业务需求映射到 Frappe 机制
  2. 02判断单应用或多应用边界
  3. 03规划跨应用依赖与通信
  4. 04设计 DocType 数据关系
  5. 05选择 ERPNext 扩展方式
  6. 06输出架构设计方案

适用场景

  1. 01规划包含多个业务模块的新项目
  2. 02决定扩展 ERPNext 还是新建 DocType
  3. 03设计可独立安装的应用组件
  4. 04梳理应用依赖和数据模型

安装

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

$npx skills add https://github.com/impertio-studio/frappe_claude_skill_package --skill frappe-agent-architect

安装后在 Claude Code 中输入/frappe-agent-architect确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
.gitkeep
decision-tree.md
examples.md
workflow.md

详细介绍

多应用架构 Agent

通过分析业务需求、确定应用边界并生成实施路线图,设计 Frappe/ERPNext 多应用架构。

目的:在编写代码之前做出正确的架构决策,避免日后代价高昂的重构。

何时使用此 Agent

ARCHITECTURE TRIGGER
|
+-- New project with multiple modules
|   "We need CRM, inventory, and custom billing"
|   --> USE THIS AGENT
|
+-- Deciding whether to extend ERPNext or build custom
|   "Should we customize Sales Invoice or create our own DocType?"
|   --> USE THIS AGENT
|
+-- Multiple teams building on same Frappe instance
|   "Team A does HR, Team B does manufacturing"
|   --> USE THIS AGENT
|
+-- Existing monolith needs splitting
|   "Our single custom app has 50 DocTypes"
|   --> USE THIS AGENT
|
+-- Cross-app communication needed
|   "App A needs to react when App B creates a document"
|   --> USE THIS AGENT

架构工作流

STEP 1: ANALYZE REQUIREMENTS
  Business needs → DocTypes, workflows, integrations

STEP 2: DECIDE APP BOUNDARIES
  Single app vs multiple apps decision framework

STEP 3: DESIGN CROSS-APP DEPENDENCIES
  required_apps, shared DocTypes, hook contracts

STEP 4: DESIGN DATA MODEL
  DocTypes, relationships, naming conventions

STEP 5: GENERATE IMPLEMENTATION ROADMAP
  Build order, milestones, team assignments

详细步骤请参阅 references/workflow.md。

第 1 步:需求分析矩阵

将每项业务需求映射到 Frappe 机制:

需求类型Frappe 机制示例
数据存储DocType“跟踪客户合同”
业务规则Controller/Server Script“自动计算总额”
审批流程Workflow“经理必须审批金额 >10k 的订单”
定时任务Scheduler/hooks.py“每日发送报告邮件”
外部同步Integration/API“与 Shopify 同步”
自定义 UIClient Script/Page“仓库仪表板”
报告Script Report/Query Report“按地区统计月度销售额”
权限Role Permission“销售团队只能查看自己的数据”
打印输出Print Format (Jinja)“自定义发票布局”
门户访问Website/Portal“客户可以查看订单”

第 2 步:应用边界决策框架

适用单个应用的情况
  • DocType 总数 < 15
  • 由单个团队维护代码
  • 所有 DocType 属于同一业务领域
  • 不计划单独分发/销售组件
  • 所有 DocType 都有紧密的数据依赖关系
适用多个应用的情况
  • DocType 总数 > 15
  • 多个团队有各自独立的发布周期
  • 存在明确的领域边界(HR、Manufacturing、CRM)
  • 组件可能需要独立安装
  • 某些模块可在多个项目中复用
  • 不同模块有不同的许可需求
决策树
HOW MANY DOCTYPES?
|
+-- < 15 total
|   +-- Single domain? --> SINGLE APP
|   +-- Multiple domains? --> Consider splitting
|
+-- 15-30 total
|   +-- Tight coupling between all? --> SINGLE APP (with modules)
|   +-- Clear domain boundaries? --> 2-3 APPS
|
+-- > 30 total
|   --> ALWAYS SPLIT into multiple apps
|       Group by domain/team/release cycle

完整的决策框架请参阅 references/decision-tree.md。

第 3 步:跨应用依赖模式

required_apps 声明

务必在 hooks.py 中显式声明依赖:

# myapp/hooks.py
required_apps = ["frappe", "erpnext"]  # NEVER omit frappe
依赖规则
  • 绝不创建循环依赖(App A 依赖 App B,而 App B 又依赖 App A)
  • 务必声明所有依赖(直接和间接依赖)
  • 务必将共享/基础应用放在 required_apps 的首位
  • 绝不依赖特定版本,只使用兼容的 API
依赖关系图模式
frappe (base framework)
  └── erpnext (ERP modules)
       ├── custom_manufacturing (extends Manufacturing)
       └── custom_crm (extends CRM)
            └── crm_analytics (extends custom_crm)

RULE: Dependencies flow DOWN only. Never up, never sideways.
跨应用通信模式
模式机制适用场景
钩子事件hooks.py 中的 doc_eventsApp B 对 App A 的文档做出响应
共享 DocType使用 Link 字段关联其他应用的 DocType应用共享参考数据
API 调用通过 frappe.call() 调用白名单方法应用之间需要松耦合
自定义字段使用带有 Custom Field 的 fixtures无需修改 DocType,即可扩展其他应用的 DocType
覆盖extend_doctype_class(v16)或 doc_events修改其他应用的行为
信号frappe.publish_realtime()应用之间发送实时通知

第 4 步:数据模型设计

DocType 关系类型
关系实现方式示例
一对多子表 DocTypeInvoice → Invoice Items
多对一Link 字段Invoice → Customer
多对多Link DocType(中间表)Student → Course(通过 Enrollment)
一对一Link 字段 + 唯一性验证Employee → User
自引用链接到同一 DocTypeEmployee → Reports To(Employee)
命名约定
元素约定示例
应用名称小写、使用下划线custom_manufacturing
DocType 名称标题式大小写,单词间用空格Production Order
字段名称小写、使用下划线production_date
Controller使用 snake_case 文件名production_order.py
模块标题式大小写Manufacturing
数据模型规则
  • 绝不重复其他 DocType 中已有的数据——使用 Link 字段
  • 始终为每个 DocType 定义 autoname/naming_series
  • 始终确保 created_by 和 modified_by 可用(内置)
  • 绝不使用 Data 字段进行引用——使用 Link 字段
  • 始终设置必填字段以确保数据完整性
  • 始终在 DocType 级别定义权限

应用组合模式

模式 1:基础 + 垂直领域
base_app (shared DocTypes, utilities)
├── vertical_retail (retail-specific DocTypes)
├── vertical_manufacturing (manufacturing-specific DocTypes)
└── vertical_services (services-specific DocTypes)

适用场景:在共享基础上构建行业专用解决方案。

模式 2:核心 + 扩展
erpnext (standard ERP)
├── custom_fields_app (Custom Fields only, no DocTypes)
├── custom_reports_app (Script Reports and dashboards)
└── custom_workflows_app (Workflows and automation)

适用场景:在不修改核心的情况下扩展 ERPNext,确保升级顺畅。

模式 3:共享实用工具
frappe_utils (shared library: PDF generation, email templates, etc.)
├── app_crm (uses frappe_utils)
├── app_hr (uses frappe_utils)
└── app_projects (uses frappe_utils)

适用场景:多个应用需要相同的实用函数。

模式 4:市场应用
standalone_app (zero dependencies beyond frappe)
├── Works on any Frappe site
├── Self-contained DocTypes and logic
└── Optional ERPNext integration via hooks

适用场景:为 Frappe 市场构建用于分发/销售的应用。

ERPNext 扩展模式

自定义字段、自定义 DocType 与覆盖
方法适用场景优点缺点
自定义字段向现有 DocType 添加 1-10 个字段升级后仍保留,无需代码逻辑有限,界面杂乱
自定义 DocTypeERPNext 中不存在的新业务实体完全控制,设计简洁没有内置的 ERPNext 逻辑
控制器覆盖修改现有 ERPNext 行为可完全访问 Python升级时容易出问题
服务器脚本简单验证/自动化无需自定义应用沙盒限制
客户端脚本界面自定义无需自定义应用仅支持 JS,无服务器逻辑
扩展决策规则
  • 对于少于 10 个新增字段,始终优先使用自定义字段
  • 对于简单验证,始终优先使用服务器脚本
  • 除非绝对必要,否则绝不覆盖 ERPNext 控制器
  • 覆盖时始终优先使用 extend_doctype_class (v16),而非 doc_events
  • 绝不直接修改 ERPNext 源文件——始终使用 hooks 或扩展

常见架构错误

错误失败原因正确做法
应用之间存在循环依赖安装/更新失败重构依赖树
一个包含 50 多个 DocType 的巨型应用难以维护,测试缓慢按领域拆分为 3-5 个应用
重复 ERPNext DocType数据不一致,维护工作重复使用自定义字段和 hooks 扩展
未声明 required_apps全新安装时静默失败始终声明所有依赖项
多个应用共用数据库表耦合紧密,迁移冲突使用 Link 字段和 API 调用
修改 ERPNext 源文件每次升级都会丢失使用 hooks、自定义字段和扩展
应用内未组织模块文件分散,难以查找将 DocType 分组到模块中
硬编码站点/公司名称在多站点/多公司环境中出错使用 frappe.defaults 和筛选器

Agent 输出格式

始终按以下格式生成架构输出:

## Architecture Design

### Requirements Summary
| # | Requirement | DocTypes | Mechanism |
|---|------------|----------|-----------|

### App Structure
[Diagram showing apps and dependencies]

### App Inventory
| App | Module(s) | DocTypes | Dependencies |
|-----|-----------|----------|-------------|

### Data Model
| DocType | App | Key Fields | Relationships |
|---------|-----|------------|---------------|

### Cross-App Communication
| Source App | Target App | Mechanism | Trigger |
|-----------|-----------|-----------|---------|

### ERPNext Extensions
| Extension Type | Target DocType | Purpose |
|---------------|---------------|---------|

### Implementation Roadmap
| Phase | App(s) | Deliverables | Dependencies |
|-------|--------|-------------|-------------|

### Risk Assessment
| Risk | Mitigation |
|------|-----------|

### Referenced Skills
- `frappe-syntax-customapp`: App structure
- `frappe-syntax-hooks`: Hook configuration
- `frappe-syntax-doctypes`: DocType definition
- `frappe-impl-customapp`: App development workflow

完整的决策框架请参阅 references/decision-tree.md。 架构设计示例请参阅 references/examples.md。

评论

支持 Markdown