mcpField
F
frappe-agent-debugger

frappe-agent-debugger

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

关于 frappe-agent-debugger

面向 Frappe/ERPNext 问题排查的调试 Agent 技能,按错误类型和执行机制定位代码,并借助清单与工具指导诊断。

主要功能

  1. 01分类 Python、JS 和数据库错误
  2. 02识别错误涉及的机制
  3. 03按约定路径定位代码
  4. 04提供常见错误诊断清单
  5. 05列出 bench 与浏览器调试工具
  6. 06统一调试报告格式

适用场景

  1. 01排查 traceback 或导入错误
  2. 02诊断表单、钩子或后台任务故障
  3. 03调查数据库或权限错误

安装

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

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

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

包含的文件

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

references/
.gitkeep
advanced-debugging.md
checklists.md
examples.md
workflow.md

详细介绍

Frappe 调试 Agent

通过对错误进行分类、定位相关代码并应用针对性的诊断清单,系统地诊断 Frappe/ERPNext 问题。

目的:消除反复试错式调试——遵循确定性的诊断工作流。

何时使用此 Agent

ERROR ANALYSIS TRIGGER
|
+-- Python traceback or error message
|   "ImportError: cannot import name X from frappe"
|   --> USE THIS AGENT
|
+-- JavaScript console error
|   "Uncaught TypeError: frm.set_value is not a function"
|   --> USE THIS AGENT
|
+-- Silent failure (no error, wrong behavior)
|   "Server Script runs but nothing happens"
|   --> USE THIS AGENT
|
+-- Scheduler/background job failure
|   "Job X failed" in scheduler logs
|   --> USE THIS AGENT
|
+-- Build/asset errors
|   "Module not found" or blank page after build
|   --> USE THIS AGENT

调试工作流

STEP 1: CLASSIFY ERROR TYPE
  Python | JavaScript | Database | Permission | Hook | Scheduler | Build

STEP 2: IDENTIFY THE MECHANISM
  Controller | Server Script | Client Script | Hook | Scheduler | API

STEP 3: LOCATE RELEVANT CODE
  Use Frappe file path conventions to find source

STEP 4: APPLY DIAGNOSIS CHECKLIST
  Run type-specific checklist for the error class

STEP 5: SUGGEST FIX
  Provide corrected code + reference relevant frappe-* skills

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

步骤 1:错误分类

错误类型特征主要工具
Python包含 .py 文件的回溯信息bench console、日志
JavaScript浏览器控制台错误、cur_frm 问题浏览器 DevTools
数据库OperationalError、IntegrityErrorbench mariadb
权限frappe.PermissionError、403 响应权限检查器
Hookbench migrate 后出错、事件异常bench doctor
调度器bench doctor 警告、RQ 失败调度器日志
构建资源缺失、空白页面、模块错误bench build --verbose

步骤 2:确定机制

症状可能的机制
表单保存/提交时出错控制器或 Server Script(validate/on_submit)
页面加载时出错Client Script 或 Web Template
API 调用返回错误消息白名单方法或 REST API 处理程序
后台出错调度器事件或 frappe.enqueue() 作业
bench migrate 后出错Hook 配置或补丁
bench build 后出错前端资源流水线

步骤 3:文件路径约定

始终根据机制检查以下位置:

机制文件路径模式
控制器apps/{app}/{app}/{module}/{doctype}/{doctype}.py
Server ScriptDesk > Server Script 列表(存储在数据库中)
Client ScriptDesk > Client Script 列表(存储在数据库中)
hooks.pyapps/{app}/{app}/hooks.py
调度器apps/{app}/{app}/tasks.py 或 hooks.py 中的 scheduler_events
白名单方法apps/{app}/{app}/{module}/*.py(搜索 @frappe.whitelist)
Jinjaapps/{app}/{app}/templates/
补丁apps/{app}/{app}/patches/

步骤 4:诊断清单(快速参考)

Python 错误
错误模式可能原因修复方法
AttributeError: 'NoneType'frappe.get_doc() 返回了 None先检查文档是否存在
ValidationErrorvalidate 中的 frappe.throw()阅读错误消息——它就是诊断结果
ImportError导入路径错误,或 Server Script 使用了导入Server Script 无法导入
LinkValidationError引用的文档不存在确认 Link 字段的目标存在
TimestampMismatchError并发编辑冲突保存前重新加载文档
DuplicateEntryException违反唯一约束检查命名序列或唯一字段
MandatoryError必填字段为空保存/提交前设置字段值
InvalidStatusErrordocstatus 状态转换错误按照 0→1→2 的顺序操作
CircularLinkingError父子项相互引用修正文档层级关系
JavaScript 错误
错误模式可能原因修复方法
frm.X is not a functionAPI 错误或代码过时清除缓存,检查 API 名称
cur_frm is undefined代码在表单上下文之外运行使用处理程序参数中的 frm
Uncaught Promisefrappe.call 缺少 async/await添加回调或使用 await
frm.doc 中的 field undefinedDocType 上不存在该字段检查 fieldname 拼写
表单未刷新缺少 frm.refresh_fields()set_value 后添加刷新操作
数据库错误
错误模式可能原因修复方法
OperationalError: 1054列不存在运行 bench migrate
OperationalError: 1146表不存在运行 bench migrate
IntegrityError: 1062主键重复检查命名/autoname
IntegrityError: 1452外键冲突缺少关联文档
OperationalError: 1213死锁缩小事务范围
InternalError: 1366字符集不支持该字符检查输入编码
权限错误
错误模式可能原因修复方法
frappe.PermissionError用户缺少角色权限检查 Role Permission Manager
API 调用返回 403缺少 frappe.has_permission() 或 @frappe.whitelist(allow_guest=True) 配置错误添加权限检查或访客标志
列表视图为空用户权限筛选检查该用户的 User Permission
无法提交角色没有 Submit 权限在 DocType 中添加 Submit 权限

调试工具

bench console(Python REPL)
bench --site {site} console
# Then:
frappe.get_doc("Sales Invoice", "SINV-00001")  # Inspect document
frappe.db.sql("SELECT name FROM `tabSales Invoice` LIMIT 5")  # Raw SQL
frappe.get_hooks("doc_events")  # Inspect active hooks
frappe.get_all("Server Script", filters={"disabled": 0}, fields=["name", "script_type"])
bench mariadb(SQL shell)
bench --site {site} mariadb
-- Then:
SHOW CREATE TABLE `tabSales Invoice`;
SELECT * FROM `tabError Log` ORDER BY creation DESC LIMIT 10;
bench doctor
bench doctor  # Check scheduler, workers, background jobs
frappe.logger()
logger = frappe.logger("my_debug", allow_site=True)
logger.info(f"Variable value: {my_var}")
# Logs to: sites/{site}/logs/my_debug.log
浏览器开发者工具
Console tab  → JavaScript errors
Network tab  → Failed API calls (check response body for traceback)
Application tab → Session/cookie issues

日志文件位置

日志路径内容
Frappe Websites/{site}/logs/frappe.logWeb 请求错误
Workersites/{site}/logs/worker.log后台任务错误
Schedulersites/{site}/logs/scheduler.log定时任务输出
自定义日志记录器sites/{site}/logs/{name}.logfrappe.logger("{name}") 输出
Bench~/.bench/logs/bench.logBench 命令输出
Error Log DocTypeDesk > Error Log可通过 UI 访问的错误记录
Supervisor/var/log/supervisor/进程管理器日志
nginx/var/log/nginx/HTTP 请求/代理错误

常见错误模式表

错误消息可能原因修复方法相关技能
Import not allowed in Server Scripts在 Server Script 中使用 import使用 frappe.utils.* 或移至 Controllerfrappe-errors-serverscripts
Cannot read properties of undefinedJS 在表单加载前访问字段添加 frm.doc.field 空值检查frappe-errors-clientscripts
DocType X not found未安装应用或未执行迁移运行 bench migrate 或 bench install-appfrappe-ops-bench
Scheduler is not runningWorker 已停止运行 bench doctor,重启 Workerfrappe-ops-bench
BrokenPipeError长时间操作导致 gunicorn 超时对长时间运行的任务使用 frappe.enqueue()frappe-impl-scheduler
ModuleNotFoundError未安装 Python 软件包运行 bench pip install {pkg}frappe-ops-bench
Duplicate name命名序列中的名称冲突检查 autoname 或 naming_seriesfrappe-syntax-doctypes
Insufficient Permission操作缺少相应角色检查 Role Permissionsfrappe-core-permissions
Cannot edit submitted document修改 docstatus=1 的文档使用 amend_doc() 或先取消提交frappe-errors-controllers
Invalid column架构未同步运行 bench migratefrappe-errors-database

Agent 输出格式

始终按以下格式生成调试输出:

## Debug Report

### Error Classification
**Type**: [Python/JS/Database/Permission/Hook/Scheduler/Build]
**Mechanism**: [Controller/Server Script/Client Script/Hook/etc.]

### Root Cause
[One-sentence diagnosis]

### Evidence
- [What log/traceback line confirms this]
- [What code path is involved]

### Fix
[Corrected code or configuration change]

### Verification Steps
1. [How to confirm the fix works]
2. [What to check in logs/UI]

### Referenced Skills
- `frappe-*`: [what was consulted]

调试决策树

ERROR RECEIVED
|
+-- Has traceback?
|   +-- YES: Read LAST line first (actual error)
|   |   +-- Contains ".py" --> Python error (Step 4: Python checklist)
|   |   +-- Contains "SQL" --> Database error (Step 4: Database checklist)
|   +-- NO: Check browser console
|       +-- Has JS error --> JavaScript error (Step 4: JS checklist)
|       +-- No error visible --> Silent failure
|           +-- Check Error Log DocType
|           +-- Check frappe.log
|           +-- Add frappe.logger() statements
|
+-- Error after bench command?
|   +-- After migrate --> Hook/schema issue
|   +-- After build --> Frontend asset issue
|   +-- After update --> Version compatibility issue
|
+-- Intermittent error?
    +-- Check scheduler logs
    +-- Check worker logs
    +-- Check for race conditions (TimestampMismatchError)

完整的诊断检查清单请参阅 references/checklists.md。 调试流程示例请参阅 references/examples.md。 VS Code DAP 设置、bench console 模式、mariadb 诊断和性能分析工具请参阅 references/advanced-debugging.md。

评论

支持 Markdown