Skip to content

Commit 875ff50

Browse files
FreekHeijtingclaude
andcommitted
feat: add discovery manifests and quality fixes
- Add package.json with agents.skills[] manifest (npm-agentskills standard, 60 skills) - Add agents/openai.yaml for OpenAI Codex discoverability - Add SKILLS_LOG.md to .gitignore - Fix em-dashes in 31 SKILL.md section headings (replaced with colons) - Add GitHub topic agentskills Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent ccadb1b commit 875ff50

34 files changed

Lines changed: 161 additions & 80 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,4 @@ build/
4545

4646
# NOTE: .skill files are NOT ignored - they are our deliverables!
4747
# If you need to ignore local/draft skills, put them in a drafts/ folder
48+
SKILLS_LOG.md

agents/openai.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# OpenAI Codex skill discovery
2+
name: frappe-claude-skill-package
3+
description: >
4+
60 deterministic Claude AI skills for Frappe Framework & ERPNext v14-v16 development and operations
5+
skills_directory: ./skills/source

package.json

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
{
2+
"name": "@openaec/frappe-claude-skill-package",
3+
"version": "1.0.0",
4+
"description": "60 deterministic Claude AI skills for Frappe Framework & ERPNext v14-v16 development and operations",
5+
"license": "MIT",
6+
"repository": {
7+
"type": "git",
8+
"url": "https://github.com/OpenAEC-Foundation/Frappe_Claude_Skill_Package"
9+
},
10+
"keywords": ["agent-skills", "agentskills", "claude-skills", "frappe", "erpnext", "python", "javascript"],
11+
"agents": {
12+
"skills": [
13+
{ "name": "frappe-agent-architect", "path": "./skills/source/agents/frappe-agent-architect" },
14+
{ "name": "frappe-agent-debugger", "path": "./skills/source/agents/frappe-agent-debugger" },
15+
{ "name": "frappe-agent-interpreter", "path": "./skills/source/agents/frappe-agent-interpreter" },
16+
{ "name": "frappe-agent-migrator", "path": "./skills/source/agents/frappe-agent-migrator" },
17+
{ "name": "frappe-agent-validator", "path": "./skills/source/agents/frappe-agent-validator" },
18+
{ "name": "frappe-core-api", "path": "./skills/source/core/frappe-core-api" },
19+
{ "name": "frappe-core-cache", "path": "./skills/source/core/frappe-core-cache" },
20+
{ "name": "frappe-core-database", "path": "./skills/source/core/frappe-core-database" },
21+
{ "name": "frappe-core-files", "path": "./skills/source/core/frappe-core-files" },
22+
{ "name": "frappe-core-logging", "path": "./skills/source/core/frappe-core-logging" },
23+
{ "name": "frappe-core-notifications", "path": "./skills/source/core/frappe-core-notifications" },
24+
{ "name": "frappe-core-permissions", "path": "./skills/source/core/frappe-core-permissions" },
25+
{ "name": "frappe-core-search", "path": "./skills/source/core/frappe-core-search" },
26+
{ "name": "frappe-core-translation", "path": "./skills/source/core/frappe-core-translation" },
27+
{ "name": "frappe-core-utils", "path": "./skills/source/core/frappe-core-utils" },
28+
{ "name": "frappe-core-workflow", "path": "./skills/source/core/frappe-core-workflow" },
29+
{ "name": "frappe-errors-api", "path": "./skills/source/errors/frappe-errors-api" },
30+
{ "name": "frappe-errors-clientscripts", "path": "./skills/source/errors/frappe-errors-clientscripts" },
31+
{ "name": "frappe-errors-controllers", "path": "./skills/source/errors/frappe-errors-controllers" },
32+
{ "name": "frappe-errors-database", "path": "./skills/source/errors/frappe-errors-database" },
33+
{ "name": "frappe-errors-hooks", "path": "./skills/source/errors/frappe-errors-hooks" },
34+
{ "name": "frappe-errors-permissions", "path": "./skills/source/errors/frappe-errors-permissions" },
35+
{ "name": "frappe-errors-serverscripts", "path": "./skills/source/errors/frappe-errors-serverscripts" },
36+
{ "name": "frappe-impl-clientscripts", "path": "./skills/source/impl/frappe-impl-clientscripts" },
37+
{ "name": "frappe-impl-controllers", "path": "./skills/source/impl/frappe-impl-controllers" },
38+
{ "name": "frappe-impl-customapp", "path": "./skills/source/impl/frappe-impl-customapp" },
39+
{ "name": "frappe-impl-hooks", "path": "./skills/source/impl/frappe-impl-hooks" },
40+
{ "name": "frappe-impl-integrations", "path": "./skills/source/impl/frappe-impl-integrations" },
41+
{ "name": "frappe-impl-jinja", "path": "./skills/source/impl/frappe-impl-jinja" },
42+
{ "name": "frappe-impl-reports", "path": "./skills/source/impl/frappe-impl-reports" },
43+
{ "name": "frappe-impl-scheduler", "path": "./skills/source/impl/frappe-impl-scheduler" },
44+
{ "name": "frappe-impl-serverscripts", "path": "./skills/source/impl/frappe-impl-serverscripts" },
45+
{ "name": "frappe-impl-ui-components", "path": "./skills/source/impl/frappe-impl-ui-components" },
46+
{ "name": "frappe-impl-website", "path": "./skills/source/impl/frappe-impl-website" },
47+
{ "name": "frappe-impl-whitelisted", "path": "./skills/source/impl/frappe-impl-whitelisted" },
48+
{ "name": "frappe-impl-workflow", "path": "./skills/source/impl/frappe-impl-workflow" },
49+
{ "name": "frappe-impl-workspace", "path": "./skills/source/impl/frappe-impl-workspace" },
50+
{ "name": "frappe-ops-app-lifecycle", "path": "./skills/source/ops/frappe-ops-app-lifecycle" },
51+
{ "name": "frappe-ops-backup", "path": "./skills/source/ops/frappe-ops-backup" },
52+
{ "name": "frappe-ops-bench", "path": "./skills/source/ops/frappe-ops-bench" },
53+
{ "name": "frappe-ops-cloud", "path": "./skills/source/ops/frappe-ops-cloud" },
54+
{ "name": "frappe-ops-deployment", "path": "./skills/source/ops/frappe-ops-deployment" },
55+
{ "name": "frappe-ops-frontend-build", "path": "./skills/source/ops/frappe-ops-frontend-build" },
56+
{ "name": "frappe-ops-performance", "path": "./skills/source/ops/frappe-ops-performance" },
57+
{ "name": "frappe-ops-upgrades", "path": "./skills/source/ops/frappe-ops-upgrades" },
58+
{ "name": "frappe-syntax-clientscripts", "path": "./skills/source/syntax/frappe-syntax-clientscripts" },
59+
{ "name": "frappe-syntax-controllers", "path": "./skills/source/syntax/frappe-syntax-controllers" },
60+
{ "name": "frappe-syntax-customapp", "path": "./skills/source/syntax/frappe-syntax-customapp" },
61+
{ "name": "frappe-syntax-doctypes", "path": "./skills/source/syntax/frappe-syntax-doctypes" },
62+
{ "name": "frappe-syntax-hooks", "path": "./skills/source/syntax/frappe-syntax-hooks" },
63+
{ "name": "frappe-syntax-hooks-events", "path": "./skills/source/syntax/frappe-syntax-hooks-events" },
64+
{ "name": "frappe-syntax-jinja", "path": "./skills/source/syntax/frappe-syntax-jinja" },
65+
{ "name": "frappe-syntax-print", "path": "./skills/source/syntax/frappe-syntax-print" },
66+
{ "name": "frappe-syntax-query-builder", "path": "./skills/source/syntax/frappe-syntax-query-builder" },
67+
{ "name": "frappe-syntax-reports", "path": "./skills/source/syntax/frappe-syntax-reports" },
68+
{ "name": "frappe-syntax-scheduler", "path": "./skills/source/syntax/frappe-syntax-scheduler" },
69+
{ "name": "frappe-syntax-serverscripts", "path": "./skills/source/syntax/frappe-syntax-serverscripts" },
70+
{ "name": "frappe-syntax-whitelisted", "path": "./skills/source/syntax/frappe-syntax-whitelisted" },
71+
{ "name": "frappe-testing-cicd", "path": "./skills/source/testing/frappe-testing-cicd" },
72+
{ "name": "frappe-testing-unit", "path": "./skills/source/testing/frappe-testing-unit" }
73+
]
74+
}
75+
}

skills/source/agents/frappe-agent-architect/SKILL.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,15 +84,15 @@ Map each business requirement to Frappe mechanisms:
8484

8585
## Step 2: App Boundary Decision Framework
8686

87-
### Single App Use When
87+
### Single App: Use When
8888

8989
- Total DocTypes < 15
9090
- Single team maintains the code
9191
- All DocTypes share the same business domain
9292
- No plans to distribute/sell components separately
9393
- All DocTypes have tight data dependencies
9494

95-
### Multiple Apps Use When
95+
### Multiple Apps: Use When
9696

9797
- Total DocTypes > 15
9898
- Multiple teams with separate release cycles

skills/source/core/frappe-core-api/SKILL.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ Session cookies expire after ~3 days. NEVER use for long-running integrations.
101101

102102
---
103103

104-
## REST API Resource CRUD
104+
## REST API: Resource CRUD
105105

106106
### Endpoints
107107

@@ -202,7 +202,7 @@ requests.post(f'{base_url}/api/method/upload_file',
202202

203203
---
204204

205-
## RPC API Custom Methods
205+
## RPC API: Custom Methods
206206

207207
### Server-Side Endpoint
208208

skills/source/core/frappe-core-cache/SKILL.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ def get_exchange_rate(from_currency, to_currency):
188188

189189
---
190190

191-
## frappe.local.cache Request-Scoped Cache
191+
## frappe.local.cache: Request-Scoped Cache
192192

193193
`frappe.local.cache` is a plain Python dict that lives for the duration of a single HTTP request. It is NOT stored in Redis.
194194

skills/source/core/frappe-core-database/SKILL.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ What do you need?
7878

7979
---
8080

81-
## ORM Document Operations
81+
## ORM: Document Operations
8282

8383
### Get Document
8484
```python
@@ -145,7 +145,7 @@ doc.insert(
145145
146146
---
147147

148-
## Database API Reading
148+
## Database API: Reading
149149

150150
### get_value
151151
```python
@@ -229,7 +229,7 @@ or_filters = {'priority': 'Urgent', 'status': 'Overdue'}
229229

230230
---
231231

232-
## Database API Writing
232+
## Database API: Writing
233233

234234
### set_value
235235
```python
@@ -262,7 +262,7 @@ frappe.db.bulk_update('Task', {
262262

263263
---
264264

265-
## Raw SQL ALWAYS Parameterized
265+
## Raw SQL: ALWAYS Parameterized
266266

267267
```python
268268
# ✅ CORRECT — parameterized query
@@ -484,7 +484,7 @@ sql = qb_obj.get_sql()
484484

485485
---
486486

487-
## Query Builder Dedicated Skill
487+
## Query Builder: Dedicated Skill
488488

489489
For complex queries (joins, aggregations, subqueries, cross-DB compatibility), see **[frappe-syntax-query-builder](../../syntax/frappe-syntax-query-builder/SKILL.md)**.
490490
- **frappe.db methods** (this skill) — Simple CRUD, get_value, get_list, exists checks

skills/source/core/frappe-core-files/SKILL.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ What file operation do you need?
5757

5858
---
5959

60-
## File DocType Core Fields
60+
## File DocType: Core Fields
6161

6262
| Field | Type | Description |
6363
|-------|------|-------------|

skills/source/core/frappe-core-logging/SKILL.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ Need to log something?
5959

6060
---
6161

62-
## Quick Reference frappe.logger()
62+
## Quick Reference: frappe.logger()
6363

6464
```python
6565
# Get a logger for your module (ALWAYS specify module name)
@@ -100,7 +100,7 @@ frappe.utils.logger.set_log_level("DEBUG")
100100

101101
---
102102

103-
## Quick Reference frappe.log_error()
103+
## Quick Reference: frappe.log_error()
104104

105105
```python
106106
# ALWAYS use keyword arguments (title/message can swap otherwise)

skills/source/core/frappe-core-notifications/SKILL.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ Set **Attach Print** to include a PDF of the document. Select a **Print Format**
134134

135135
---
136136

137-
## frappe.sendmail() Programmatic Email
137+
## frappe.sendmail(): Programmatic Email
138138

139139
```python
140140
frappe.sendmail(
@@ -172,7 +172,7 @@ pending = frappe.get_all("Email Queue", filters={"status": "Not Sent"}, limit=10
172172

173173
---
174174

175-
## frappe.publish_realtime() System Notifications
175+
## frappe.publish_realtime(): System Notifications
176176

177177
```python
178178
frappe.publish_realtime(

0 commit comments

Comments
 (0)