frappe-agent-architect
Use when designing multi-app Frappe architectures, deciding whether to split functionality into separate apps, or implementing cross-app communication…
Use when building Frappe custom apps from scratch. Covers app structure, pyproject.toml configuration, module creation, patches, and fixtures for v14/v15/v16. Prevents common mistakes with app scaffolding and module organization. Keywords: custom app, bench new-app,
$ npx -y skills add Impertio-Studio/Frappe_Claude_Skill_Package --skill frappe-syntax-customapp --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/frappe-syntax-customappContext preview
The summary Claude sees to decide when to auto-load this skill.
Use when building Frappe custom apps from scratch. Covers app structure, pyproject.toml configuration, module creation, patches, and fixtures for v14/v15/v16. Prevents common mistakes with app scaffolding and module organization. Keywords: custom app, bench new-app,
name: frappe-syntax-customapp description: > Use when building Frappe custom apps from scratch. Covers app structure, pyproject.toml configuration, module creation, patches, and fixtures for v14/v15/v16. Prevents common mistakes with app scaffolding and module organization. Keywords: custom app, bench new-app, pyproject.toml, patches, fixtures, modules, app structure, app boilerplate, bench new-app example, module setup, patch example. license: MIT compatibility: "Claude Code, Claude.ai Projects, Claude API. Frappe v14-v16." metadata: author: OpenAEC-Foundation version: "2.0"
Deterministic syntax reference for building Frappe custom apps — scaffolding, configuration, modules, patches, and fixtures.
What do you need? ├─ Brand new app from scratch → bench new-app ├─ Extend existing ERPNext behavior → bench new-app + required_apps = ["frappe", "erpnext"] ├─ Install existing app from Git → bench get-app <url> └─ Add functionality to an installed app ├─ New data model → Add module to modules.txt + create DocType ├─ New fields on existing DocType → Fixtures (Custom Field) ├─ Modify field properties → Fixtures (Property Setter) └─ Data migration → Patch in patches.txt New app vs extend existing? ├─ Independent functionality → New app ├─ Tightly coupled to one app → New app with required_apps dependency └─ Small customization (fields, properties) → Extend via fixtures in existing custom app
# Create new app (interactive prompts for title, description, publisher, etc.) bench new-app my_custom_app # Install on site bench --site mysite install-app my_custom_app # Get existing app from Git bench get-app https://github.com/org/my_custom_app # Build frontend assets bench build --app my_custom_app # Run migrations (patches + fixtures + schema sync) bench --site mysite migrate
apps/my_custom_app/ ├── pyproject.toml # Build configuration (flit) ├── README.md ├── my_custom_app/ # Inner Python package │ ├── __init__.py # MUST contain __version__ │ ├── hooks.py # Frappe integration hooks │ ├── modules.txt # Module registration │ ├── patches.txt # Migration scripts │ ├── patches/ # Patch files │ │ └── __init__.py │ ├── my_custom_app/ # Default module (same name as app) │ │ ├── __init__.py │ │ └── doctype/ │ ├── public/ # Static assets → /assets/my_custom_app/ │ │ ├── css/ │ │ └── js/ │ ├── templates/ # Jinja templates │ │ └── includes/ │ └── www/ # Portal pages (URL = directory path) └── .git/
apps/my_custom_app/ ├── setup.py # Build configuration (setuptools) ├── MANIFEST.in ├── requirements.txt # Python dependencies ├── dev-requirements.txt # Dev dependencies (developer_mode only) ├── package.json # Node dependencies ├── my_custom_app/ │ ├── __init__.py │ ├── hooks.py │ ├── modules.txt │ ├── patches.txt │ └── [same inner structure as v15] └── .git/
# my_custom_app/__init__.py __version__ = "0.0.1"
**CRITICAL**: Without `__version__`, the flit build FAILS and the app CANNOT be installed.
[build-system]
requires = ["flit_core >=3.4,<4"]
build-backend = "flit_core.buildapi"
[project]
name = "my_custom_app"
authors = [
{ name = "Your Company", email = "dev@example.com" }
]
description = "Description of your app"
requires-python = ">=3.10"
readme = "README.md"
dynamic = ["version"]
dependencies = [] # Python packages ONLY — NEVER Frappe/ERPNext
[tool.bench.frappe-dependencies]
frappe = ">=15.0.0,<16.0.0"
erpnext = ">=15.0.0,<16.0.0" # Only if app extends ERPNext**CRITICAL rules for pyproject.toml**:
from setuptools import setup, find_packages
setup(
name="my_custom_app",
version="0.0.1",
description="Description of your app",
author="Your Company",
author_email="dev@example.com",
packages=find_packages(),
zip_safe=False,
include_package_data=True,
install_requires=[],
)app_name = "my_custom_app"
app_title = "My Custom App"
app_publisher = "Your Company"
app_description = "Description"
app_email = "dev@example.com"
app_license = "MIT"
required_apps = ["frappe"] # Or ["frappe", "erpnext"] if extending ERPNext
fixtures = [
{"dt": "Custom Field", "filters": [["module", "=", "My Custom App"]]},
{"dt": "Property Setter", "filters": [["module", "=", "My Custom App"]]},
]My Custom App Integrations Settings Reports
**Rules**:
my_custom_app/ ├── my_custom_app/ # "My Custom App" module │ ├── __init__.py │ └── doctype/ ├── integrations/ # "Integrations" module │ ├── __init__.py │ └── doctype/ ├── settings/ # "Settings" module │ ├── __init__.py │ └── doctype/ └── reports/ # "Reports" module
60 deterministic Claude AI skills for Frappe Framework & ERPNext v14-v16 development and operations
Repo: Impertio-Studio/Frappe_Claude_Skill_Package
Use when designing multi-app Frappe architectures, deciding whether to split functionality into separate apps, or implementing cross-app communication…
Use when debugging Frappe errors, using bench console for live inspection, analyzing tracebacks, or reading Frappe log files. Prevents wasted debugging time…
Use when receiving vague or unclear ERPNext/Frappe development requests that need interpretation. Transforms requirements like 'make invoice auto-calculate' or…
Use when migrating a Frappe app between major versions, detecting breaking API changes, or resolving post-migration errors. Prevents failed migrations from…
Use when reviewing or validating Frappe/ERPNext code against best practices and common pitfalls. Checks generated code before deployment, validates against all…
Use when building ERPNext/Frappe API integrations (v14/v15/v16) including REST API, RPC API, authentication, webhooks, and rate limiting. Covers external API…