This is the meta-skill that builds other skills. It scaffolds the directory structure (SKILL.md, scripts/, references/, assets/), validates frontmatter, and enforces the progressive disclosure pattern where only relevant parts load into context. The core insight here is treating the context window as a scarce resource: lean activation triggers, body under 500 lines, heavy docs in references/, fragile code in scripts/. It uses skill_manage for creation with auto-validation, and includes degree-of-freedom guidance so you know whether to write natural language instructions or exact executable scripts. If you're extending Claude with new capabilities or API integrations, this is where you start.
npx -y skills add starchild-ai-agent/official-skills --skill skill-creator --agent claude-codeInstalls into .claude/skills of the current project.
Concise is key. The context window is a shared resource between the system prompt, skills, conversation history, and your reasoning. Every line in a SKILL.md competes with everything else. Only add what you don't already know — don't document tool parameters visible in the system prompt, don't prescribe step-by-step workflows for things you can figure out. Focus on domain knowledge, interpretation guides, decision frameworks, and gotchas.
Progressive disclosure. Skills load in three levels:
<available_skills> in every conversation. This is how you decide which skill to activate. The description must be a strong trigger.read_file when you decide the skill is relevant. This is where workflow, guidelines, and decision trees live.This means: keep the SKILL.md body lean (< 500 lines). Put detailed API docs in references/. Put automation in scripts/. The body should be what you need to start working, not an encyclopedia.
Degrees of freedom. Match instruction specificity to task fragility:
scripts/) — When operations are fragile, require exact syntax, or are repetitive boilerplate. Put the code in standalone scripts that get executed, not loaded into context. Example: Chart rendering with exact color codes and API calls.Default assumption: you are already smart. Only add context you don't already have.
my-skill/
├── SKILL.md # Required: Frontmatter + instructions
├── scripts/ # Optional: Executable code (low freedom)
│ └── render.py # Run via bash, not loaded into context
├── references/ # Optional: Docs loaded on demand (medium freedom)
│ └── api-guide.md # Loaded via read_file when needed
└── assets/ # Optional: Templates, images, data files
└── template.json # NOT loaded into context, used in output
When to use each:
| Directory | Loaded into context? | Use for |
|---|---|---|
| SKILL.md body | On activation | Core workflow, decision trees, gotchas |
scripts/ | Never (executed) | Fragile operations, exact syntax, boilerplate |
references/ | On demand | Detailed API docs, long guides, lookup tables |
assets/ | Never | Templates, images, data files used in output |
Before scaffolding, understand what you're building:
Examples:
Use the init script:
python skills/skill-creator/scripts/init_skill.py my-new-skill --path ./workspace/skills
With resource directories:
python skills/skill-creator/scripts/init_skill.py api-helper --path ./workspace/skills --resources scripts,references
With example files:
python skills/skill-creator/scripts/init_skill.py my-skill --path ./workspace/skills --resources scripts --examples
Before writing, decide what goes where:
Plan the content first — frontmatter trigger, body structure, freedom level. Then:
Design patterns for the body:
skill_manageskill_manage is the primary workflow — it validates frontmatter, runs a security scan, and auto-reloads the cache. Do NOT use write_file as the main path.
Creating a new skill:
skill_manage(action="create", name="my-skill", content="---\nname: my-skill\n...")
Patching an existing skill (preferred for targeted changes):
# Always read_file first to get exact whitespace/content
skill_manage(action="patch", name="my-skill", old_string="exact old text", new_string="new text")
Full rewrite of existing skill:
skill_manage(action="edit", name="my-skill", content="---\nname: my-skill\n...")
⚠️ Known gotchas:
create errors if skill already exists → use edit or patch instead.edit/patch errors if skill does NOT exist → use create first.patch requires exact old_string match (whitespace included) → always read_file before patching.execute() must accept **kwargs — if you see unexpected keyword argument 'action', it's a bug in the tool implementation (fix: def execute(self, **kwargs)).Fallback only — if skill_manage is unavailable, use write_file + skill_refresh() manually.
python skills/skill-creator/scripts/validate_skill.py ./workspace/skills/my-new-skill
After skill_manage, validate is optional (auto-reloaded), but run it to catch schema issues early.
The frontmatter uses metadata.starchild for Star Child-specific fields:
---
name: skill-name
version: 1.0.0
description: "What this skill does. Use when [specific trigger scenarios]."
metadata:
starchild:
emoji: "🔧"
skillKey: skill-name
requires:
env: [API_KEY_NAME]
bins: [python]
anyBins: [curl, wget]
install:
- kind: pip
package: pandas
- kind: apt
package: curl
bins: [curl]
user-invocable: true
disable-model-invocation: false
---
Field reference:
| Field | Location | Required | Purpose |
|---|---|---|---|
name | top-level | Yes | Skill identifier (lowercase hyphen-case) |
version | top-level | Yes | Semantic version (e.g. 1.0.0). Required for publishing. Always include. |
description | top-level | Yes | Trigger text — when should the agent use this? |
emoji | metadata.starchild | No | Display emoji |
skillKey | metadata.starchild | No | Dedup key |
requires.env | metadata.starchild | No | Required env vars |
requires.bins | metadata.starchild | No | Required binaries (ALL must exist) |
requires.anyBins | metadata.starchild | No | Required binaries (ANY one) |
install | metadata.starchild | No | How to install deps (pip, apt, npm, etc.) |
user-invocable | top-level | No | Can user trigger via /command (default: true) |
disable-model-invocation | top-level | No | Hide from <available_skills> (default: false) |
If the skill involves any on-chain operations (sending transactions, token approvals, swaps, bridging, signing, deposits, withdrawals, smart contract interactions), add a Prerequisites section near the top of the SKILL.md:
## Prerequisites — Wallet Policy
Before executing any [operation], the wallet policy must be active.
Load the **wallet-policy** skill and propose the standard wildcard
policy (deny key export + allow `*`). This covers all [skill-name]
operations across all chains.
This ensures the agent proposes a wallet policy before attempting any transaction. Without it, the first transaction will fail with a policy violation.
Description is the trigger. This is how the agent decides to activate your skill. Include "Use when..." with specific scenarios. Bad: "Trading utilities." Good: "Test trading strategies against real historical data. Use when a strategy needs validation or before committing to a trade approach."
Write for the agent, not the user. The skill is instructions for the AI. Use direct language: "You generate charts" not "This skill can be used to generate charts."
Scripts execute without loading. Good for large automation. The agent reads the script only when it needs to customize, keeping context clean.
Don't duplicate the system prompt. The agent already sees tool names and descriptions. Focus on knowledge it doesn't have: interpretation guides, decision trees, domain-specific gotchas.
Request credentials last. Design the skill first, then ask the user for API keys.
Always validate before refreshing — run validate_skill.py to catch issues early.
sickn33/antigravity-awesome-skills
moizibnyousaf/ai-agent-skills
github/awesome-copilot