Control UI
openclaw/openclaw
Operate and troubleshoot the OpenClaw Control UI: navigate connected clients, organize sessions, build session dashboards, and handle direct or Tailscale-hosted Gateways.
A skill your agent uses when building Document Controllers in a custom Frappe app: file creation, lifecycle hooks, validation, autoname, submittable workflows, controller override, child table…
$ npx skills add Impertio-Studio/Frappe_Claude_Skill_Package --skill frappe-impl-controllers -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Impertio-Studio/Frappe_Claude_Skill_Package frappe-impl-controllers --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Impertio-Studio/Frappe_Claude_Skill_Package.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/source/impl/frappe-impl-controllers .claude/skills/frappe-impl-controllers && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "frappe-impl-controllers" agent skill from https://github.com/Impertio-Studio/Frappe_Claude_Skill_Package/tree/main/skills/source/impl/frappe-impl-controllers into .claude/skills/frappe-impl-controllers/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "frappe-impl-controllers", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Impertio-Studio/Frappe_Claude_Skill_Package/tree/main/skills/source/impl/frappe-impl-controllersType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Impertio-Studio/Frappe_Claude_Skill_Package --skill frappe-impl-controllers -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Impertio-Studio/Frappe_Claude_Skill_Package frappe-impl-controllers --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Impertio-Studio/Frappe_Claude_Skill_Package.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/source/impl/frappe-impl-controllers .agents/skills/frappe-impl-controllers && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "frappe-impl-controllers" agent skill from https://github.com/Impertio-Studio/Frappe_Claude_Skill_Package/tree/main/skills/source/impl/frappe-impl-controllers into .agents/skills/frappe-impl-controllers/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "frappe-impl-controllers", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Impertio-Studio/Frappe_Claude_Skill_Package --skill frappe-impl-controllers -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Impertio-Studio/Frappe_Claude_Skill_Package frappe-impl-controllers --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Impertio-Studio/Frappe_Claude_Skill_Package.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/source/impl/frappe-impl-controllers .cursor/skills/frappe-impl-controllers && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "frappe-impl-controllers" agent skill from https://github.com/Impertio-Studio/Frappe_Claude_Skill_Package/tree/main/skills/source/impl/frappe-impl-controllers into .cursor/skills/frappe-impl-controllers/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "frappe-impl-controllers", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Impertio-Studio/Frappe_Claude_Skill_Package.git --path skills/source/impl/frappe-impl-controllers--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Impertio-Studio/Frappe_Claude_Skill_Package --skill frappe-impl-controllers -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Impertio-Studio/Frappe_Claude_Skill_Package frappe-impl-controllers --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Impertio-Studio/Frappe_Claude_Skill_Package.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/source/impl/frappe-impl-controllers .gemini/skills/frappe-impl-controllers && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "frappe-impl-controllers" agent skill from https://github.com/Impertio-Studio/Frappe_Claude_Skill_Package/tree/main/skills/source/impl/frappe-impl-controllers into .gemini/skills/frappe-impl-controllers/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "frappe-impl-controllers", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Impertio-Studio/Frappe_Claude_Skill_Package frappe-impl-controllersInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Impertio-Studio/Frappe_Claude_Skill_Package --skill frappe-impl-controllers -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Impertio-Studio/Frappe_Claude_Skill_Package.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/source/impl/frappe-impl-controllers .github/skills/frappe-impl-controllers && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "frappe-impl-controllers" agent skill from https://github.com/Impertio-Studio/Frappe_Claude_Skill_Package/tree/main/skills/source/impl/frappe-impl-controllers into .github/skills/frappe-impl-controllers/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "frappe-impl-controllers", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Impertio-Studio/Frappe_Claude_Skill_Package --skill frappe-impl-controllers -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Impertio-Studio/Frappe_Claude_Skill_Package frappe-impl-controllers --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Impertio-Studio/Frappe_Claude_Skill_Package.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/source/impl/frappe-impl-controllers .opencode/skills/frappe-impl-controllers && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "frappe-impl-controllers" agent skill from https://github.com/Impertio-Studio/Frappe_Claude_Skill_Package/tree/main/skills/source/impl/frappe-impl-controllers into .opencode/skills/frappe-impl-controllers/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "frappe-impl-controllers", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
frappe-impl-controllersA skill your agent uses when building Document Controllers in a custom Frappe app: file creation, lifecycle hooks, validation, autoname, submittable workflows, controller override, child table…
Frappe Impl Controllers is an agent skill from Impertio-Studio/Frappe_Claude_Skill_Package. Use when building Document Controllers in a custom Frappe app: file creation, lifecycle hooks, validation, autoname, submittable workflows, controller override, child table controllers, flags system, migration from hooks.py and Server Scripts. Keywords: how to implement controller, which hook to use, validate vs onupdate, override controller, submittable document, autoname, flags, extenddoctypeclass, controller testing, child table controller, which hook to use, when does validate run, how to override save…
Its SKILL.md is about 2.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 5 other files, including reference files (for example `references/anti-patterns.md`, `references/decision-tree.md` and `references/examples.md`). Compatibility notes: Claude Code, Claude.ai Projects, Claude API. Frappe v14-v16.
The repository describes itself as: 60 deterministic Claude AI skills for Frappe Framework & ERPNext v14-v16 development and operations. The licence is MIT.
Read from SKILL.md and the folder at commit 36cfa80. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are python and javascript).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Claude Code, Claude.ai Projects, Claude API. Frappe v14-v16.
From compatibility in the SKILL.md frontmatter.
Frappe Impl Controllers loads about 2.8k tokens when it runs, and up to ~11k if it reads all its reference files. Until then it costs about 140 tokens; SKILL.md has 358 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from Impertio-Studio/Frappe_Claude_Skill_Package at commit 36cfa80, republished under its MIT licence (© Impertio-Studio). 358 words, ~2,799 tokens.
.claude/skills/frappe-impl-controllers/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.Step-by-step workflows for building server-side DocType logic with full Python power. For exact syntax, see frappe-syntax-controllers.
Version: v14/v15/v16 | v15+: Supports auto-generated type annotations
NEED full Python (imports, classes, generators)? → Controller
NEED external libraries (requests, pandas)? → Controller
NEED try/except with rollback? → Controller
NEED frappe.enqueue() for background jobs? → Controller
NEED to extend standard ERPNext DocType? → Controller
Quick validation without custom app? → Server Script
Simple auto-fill or notification? → Server ScriptRule: ALWAYS use Controllers when you need a custom app. ALWAYS use Server Scripts for no-code prototyping.
Step 1: Create DocType via Frappe UI or bench new-doctype
Step 2: File is auto-generated at:
apps/myapp/myapp/{module}/doctype/{doctype_name}/{doctype_name}.pyStep 3: Implement the controller class:
import frappe
from frappe import _
from frappe.model.document import Document
class MyDocType(Document):
def validate(self):
self.validate_dates()
self.calculate_totals()
def validate_dates(self):
if self.from_date and self.to_date and self.from_date > self.to_date:
frappe.throw(_("From Date cannot be after To Date"))
def calculate_totals(self):
self.total = sum(item.amount for item in self.items)Step 4: Run bench restart (or bench watch for hot-reload in dev)
Naming convention: DocType "Sales Order" → class SalesOrder, file sales_order.py
WHAT DO YOU WANT?
├── Validate data / calculate fields before save?
│ └── validate — changes to self ARE saved
│
├── Action AFTER save (emails, linked docs, logs)?
│ └── on_update — changes to self NOT saved (use db_set)
│
├── Only for NEW documents?
│ └── after_insert
│
├── Before/after SUBMIT?
│ ├── Check before submit → before_submit
│ └── Ledger entries after → on_submit
│
├── Before/after CANCEL?
│ ├── Prevent cancel → before_cancel
│ └── Reverse entries → on_cancel
│
├── Before DELETE?
│ └── on_trash (throw to prevent)
│
├── Custom document naming?
│ └── autoname
│
└── Detect ANY change (including db_set)?
└── on_changeSee references/decision-tree.md for all hooks with execution order.
| Aspect | validate | on_update |
|---|---|---|
| When | Before DB write | After DB write |
self.x = y saved? | YES | NO — use db_set |
| Can abort with throw? | YES | Already saved |
get_doc_before_save() | Available | Available |
| Use for | Validation, calculations | Notifications, linked docs |
# WRONG — changes in on_update are NOT saved
def on_update(self):
self.status = "Completed" # LOST!
# CORRECT — use db_set
def on_update(self):
frappe.db.set_value(self.doctype, self.name, "status", "Completed")def validate(self):
errors = []
if not self.items:
errors.append(_("At least one item is required"))
for item in self.items:
if item.qty <= 0:
errors.append(_("Row {0}: Qty must be positive").format(item.idx))
if self.from_date > self.to_date:
errors.append(_("From Date cannot be after To Date"))
if errors:
frappe.throw("<br>".join(errors))def validate(self):
old = self.get_doc_before_save()
if old and old.status != self.status:
self.flags.status_changed = True
self.status_changed_on = frappe.utils.now()
def on_update(self):
if self.flags.get('status_changed'):
self.notify_status_change()Rule: ALWAYS use self.flags to pass data between hooks. NEVER rely on external state.
from frappe.model.naming import getseries
def autoname(self):
# Format: PRJ-CUST-2025-001
code = (self.customer or "GEN")[:4].upper()
year = frappe.utils.getdate(self.start_date or frappe.utils.today()).year
prefix = f"PRJ-{code}-{year}-"
self.name = getseries(prefix, 3)Alternative — before_naming:
def before_naming(self):
if self.is_priority:
self.naming_series = "PRIORITY-.#####"
else:
self.naming_series = "STD-.#####"DRAFT (docstatus=0) → submit() → SUBMITTED (docstatus=1) → cancel() → CANCELLED (docstatus=2)
submit(): validate → before_submit → [DB: docstatus=1] → on_update → on_submit
cancel(): before_cancel → [DB: docstatus=2] → on_cancelclass PurchaseOrder(Document):
def validate(self):
self.validate_items()
self.calculate_totals()
def before_submit(self):
# ONLY submit-specific checks here
if self.total > 100000 and not self.manager_approval:
frappe.throw(_("Manager approval required for POs over 100,000"))
def on_submit(self):
self.update_ordered_qty()
self.create_purchase_receipt_draft()
def before_cancel(self):
if frappe.db.exists("Purchase Invoice",
{"purchase_order": self.name, "docstatus": 1}):
frappe.throw(_("Cancel linked invoices first"))
def on_cancel(self):
self.reverse_ordered_qty()Rule: NEVER duplicate validation between validate and before_submit. validate ALWAYS runs before before_submit.
# hooks.py
override_doctype_class = {
"Sales Invoice": "myapp.overrides.CustomSalesInvoice"
}
# myapp/overrides.py
from erpnext.accounts.doctype.sales_invoice.sales_invoice import SalesInvoice
class CustomSalesInvoice(SalesInvoice):
def validate(self):
super().validate() # ALWAYS call parent first
self.custom_validation()# hooks.py
doc_events = {
"Sales Invoice": {
"validate": "myapp.events.validate_sales_invoice",
}
}
# myapp/events.py
def validate_sales_invoice(doc, method=None):
if doc.grand_total < 0:
frappe.throw(_("Invalid total"))# hooks.py
extend_doctype_class = {
"Sales Invoice": "myapp.extends.SalesInvoiceExtend"
}
# myapp/extends.py — Only methods to add/override
class SalesInvoiceExtend:
def custom_method(self):
passRule: ALWAYS call super().validate() in override. NEVER skip parent methods — standard ERPNext logic depends on it.
class Quotation(Document):
@frappe.whitelist()
def apply_discount(self, discount_percent):
if discount_percent < 0 or discount_percent > 100:
frappe.throw(_("Discount must be 0-100"))
self.discount_amount = self.total * (discount_percent / 100)
self.grand_total = self.total - self.discount_amount
self.save()
return {"grand_total": self.grand_total}Client-side call:
frm.call('apply_discount', { discount_percent: 10 }).then(r => {
frm.reload_doc();
});# Document-level flags (built-in)
doc.flags.ignore_permissions = True # Bypass permission checks
doc.flags.ignore_validate = True # Skip validate() hook
doc.flags.ignore_mandatory = True # Skip required field check
# Custom flags for inter-hook communication
def validate(self):
if self.is_urgent:
self.flags.needs_notification = True
def on_update(self):
if self.flags.get('needs_notification'):
self.notify_team()# tests/test_my_doctype.py
import frappe
from frappe.tests.utils import FrappeTestCase
class TestMyDocType(FrappeTestCase):
def test_validate_dates(self):
doc = frappe.get_doc({
"doctype": "My DocType",
"from_date": "2025-01-10",
"to_date": "2025-01-01" # Before from_date
})
self.assertRaises(frappe.ValidationError, doc.insert)
def test_calculate_totals(self):
doc = frappe.get_doc({
"doctype": "My DocType",
"items": [
{"item": "A", "qty": 2, "rate": 100},
{"item": "B", "qty": 3, "rate": 50}
]
})
doc.insert()
self.assertEqual(doc.total, 350)Run: bench run-tests --module myapp.module.doctype.my_doctype.test_my_doctype
before_insert → before_naming → autoname → before_validate →
validate → before_save → [DB INSERT] → after_insert →
on_update → on_changebefore_validate → validate → before_save → [DB UPDATE] →
on_update → on_changevalidate → before_submit → [DB: docstatus=1] →
on_update → on_submit → on_change| Do NOT | Do Instead |
|---|---|
self.x = y in on_update | frappe.db.set_value(...) |
self.save() in on_update | Causes infinite loop |
frappe.db.commit() in hooks | Let framework handle |
| Heavy ops in validate | Use frappe.enqueue() in on_update |
Skip super().validate() | ALWAYS call parent first |
frappe.get_doc() in loops | Use frappe.get_cached_doc() |
| Hardcoded thresholds | Use Settings DocType |
See references/anti-patterns.md for complete list.
frappe-syntax-controllers — Exact hook signatures and APIfrappe-errors-controllers — Error handling patternsfrappe-impl-serverscripts — When Server Script sufficesfrappe-syntax-hooks — hooks.py configurationfrappe-core-database — frappe.db.* operationsSee references/decision-tree.md for all hooks. See references/workflows.md for extended patterns. See references/examples.md for complete working examples.
© Impertio-Studio, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 4 other files (references) in skills/source/impl/frappe-impl-controllers of Impertio-Studio/Frappe_Claude_Skill_Package.
Open the folder on GitHubat commit 36cfa80
Frappe Impl Controllers next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Frappe Impl Controllers this skillImpertio-Studio/Frappe_Claude_Skill_Package | 187 | — | ~2.8k | Automated safety check: Pass | MIT | |
| Control UIopenclaw/openclaw | 392k | — | ~1.8k | Automated safety check: Pass | MIT | |
| Control UI E2Eopenclaw/openclaw | 392k | — | ~2.9k | Automated safety check: Pass | MIT | |
| Control D AutomationComposioHQ/awesome-claude-skills | 77k | 3 repos | ~738 | Automated safety check: Pass | None | |
| Controlhashgraph-online/awesome-codex-plugins | 1.2k | — | ~3.4k | Automated safety check: Pass | Apache-2.0 | |
| Data Privacy Controlssickn33/agentic-awesome-skills | 47k | 1 repos | ~3.4k | Automated safety check: Pass | MIT |
openclaw/openclaw
Operate and troubleshoot the OpenClaw Control UI: navigate connected clients, organize sessions, build session dashboards, and handle direct or Tailscale-hosted Gateways.
openclaw/openclaw
A skill your agent uses when designing, testing, fixing, or extending the OpenClaw Control UI GUI, including UI stress-test galleries with feedback inputs, Vitest + Playwright end-to-end checks…
ComposioHQ/awesome-claude-skills
Automate Control D tasks via Rube MCP (Composio). An agent skill from ComposioHQ/awesome-claude-skills.
hashgraph-online/awesome-codex-plugins
Apply the principle of Control — the level of autonomy a system gives the user, and how that level should be matched to the user's expertise and the task's stakes.
sickn33/agentic-awesome-skills
Data privacy control register: data category, lawful basis, retention period, access roles, encryption and consent requirement per module.
affaan-m/ECC
Manage the experimental Nasiko CLI lifecycle through ECC — read-only status checks, consent-gated install of the pinned qualified version with dry-run preview, and ownership-checked uninstall, under…
Impertio-Studio/Frappe_Claude_Skill_Package
A skill your agent uses when receiving vague or unclear ERPNext/Frappe development requests that need interpretation.
Impertio-Studio/Frappe_Claude_Skill_Package
Deploy HTML/CSS websites to ERPNext/Frappe (v15/v16) as Web Pages via the REST API.
Impertio-Studio/Frappe_Claude_Skill_Package
A skill your agent uses when building ERPNext/Frappe API integrations (v14/v15/v16) including REST API, RPC API, authentication, webhooks, and rate limiting.
Impertio-Studio/Frappe_Claude_Skill_Package
A skill your agent uses when debugging or handling API errors in Frappe/ERPNext v14/v15/v16.
Impertio-Studio/Frappe_Claude_Skill_Package
A skill your agent uses when implementing hooks.py configurations in a Frappe custom app.
Impertio-Studio/Frappe_Claude_Skill_Package
A skill your agent uses when building API endpoints with @frappe.whitelist() in Frappe.
A skill your agent uses when building Document Controllers in a custom Frappe app: file creation, lifecycle hooks, validation, autoname, submittable workflows, controller override, child table…. Frappe Impl Controllers is an agent skill from Impertio-Studio/Frappe_Claude_Skill_Package.py and Server Scripts.
Frappe Impl Controllers fits situations like: building Document Controllers in a custom Frappe app: file creation; lifecycle hooks; submittable workflows; controller override.
Run `npx skills add Impertio-Studio/Frappe_Claude_Skill_Package --skill frappe-impl-controllers -a claude-code`. Or copy the skill folder (skills/source/impl/frappe-impl-controllers in Impertio-Studio/Frappe_Claude_Skill_Package) into .claude/skills/frappe-impl-controllers in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Impertio-Studio/Frappe_Claude_Skill_Package --skill frappe-impl-controllers -a codex`. Or copy the skill folder (skills/source/impl/frappe-impl-controllers in Impertio-Studio/Frappe_Claude_Skill_Package) into .agents/skills/frappe-impl-controllers in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Impertio-Studio/Frappe_Claude_Skill_Package --skill frappe-impl-controllers -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/frappe-impl-controllers, .gemini/skills/frappe-impl-controllers, .github/skills/frappe-impl-controllers and .opencode/skills/frappe-impl-controllers in your project.
SKILL.md names no scripts, command-line tools or credentials: Frappe Impl Controllers is instructions for the agent only. Our summary lists: Python 3. Compatibility (from SKILL.md): Claude Code, Claude.ai Projects, Claude API. Frappe v14-v16..
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Frappe Impl Controllers is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.8k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 8k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Frappe Impl Controllers: Control UI (openclaw/openclaw, 392k stars), Control UI E2E (openclaw/openclaw, 392k stars), Control D Automation (ComposioHQ/awesome-claude-skills, 77k stars) and Control (hashgraph-online/awesome-codex-plugins, 1.2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Impertio-Studio (a GitHub organization) maintains it in Impertio-Studio/Frappe_Claude_Skill_Package, which has 187 GitHub stars. The repository holds 61 skills in this directory. The repository was last updated on September 17, 2026.
Source: Impertio-Studio/Frappe_Claude_Skill_Package on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.