554/better-skill-creator/SKILL.md
Create high-quality skills that reliably trigger, complete workflows cleanly, and work well with other skills. Use when the user asks to build a new capability, integrate a new API, or extend the system with a repeatable workflow. Improvement on the default skill-creator with use-case design, behavioral testing, and success criteria.
npx skillsauth add starchild-ai-agent/community-skills @554/better-skill-creatorInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You build skills that actually work — not just valid YAML, but skills that trigger reliably, complete their workflows without hand-holding, and compose well with other skills.
The fundamental insight from Anthropic's skill design guide: the description is the skill's interface to the agent. A skill that doesn't trigger is a skill that doesn't exist. A skill that triggers for the wrong things causes confusion. Get the description right first — everything else follows.
Before writing a single line of SKILL.md, fill out this canvas. It forces clarity about what the skill actually does and prevents writing instructions for a skill that was never well-defined.
Skill Name: _______________
Use Case 1: _______________
Trigger phrase: "..."
Steps: 1. → 2. → 3.
Expected output: _______________
Use Case 2: _______________
Trigger phrase: "..."
Steps: 1. → 2. → 3.
Expected output: _______________
Dependencies:
- API keys needed: _______________
- Python packages: _______________
- External services: _______________
Success looks like:
- Agent triggers on ___% of relevant queries
- User doesn't need to re-prompt to get _______________
- Works independently when combined with: _______________
If you can't fill in at least 2 use cases with concrete trigger phrases, the skill isn't ready to build yet. Ask the user to clarify.
scripts/ executed via bashpython skills/skill-creator/scripts/init_skill.py my-new-skill --path ./skills
With resource directories:
python skills/skill-creator/scripts/init_skill.py api-helper --path ./skills --resources scripts,references
The description is the only part of your skill that's always in context. It's what the agent reads to decide whether to activate the skill. Two requirements:
Formula: [What it does] + [Use when <specific trigger conditions>]
Examples:
# Too vague — agent won't know when to use this
"Trading utilities and market analysis tools."
# Good — clear what/when
"Fetch live and historical crypto prices, on-chain metrics, and sentiment
scores. Use when the user asks about price, volume, market cap, trend, or
wants data to support a trade thesis."
# Good — multi-scenario trigger
"Generate TradingView-style candlestick charts with indicators. Use when
the user wants a visual chart, price visualization, or technical analysis
plot."
Hard limits:
< > — they break the skill loaderclaude, anthropic, or any Anthropic product nameTrigger failure modes:
---
name: skill-name # lowercase, alphanumeric + hyphens, 2-64 chars
version: 1.0.0 # semver — required for market publishing
description: "..." # trigger text — see formula above
author: your-name # for market publishing
tags: [tag1, tag2] # for discoverability
metadata:
starchild:
emoji: "🔧"
skillKey: skill-name
requires:
env: [API_KEY_NAME] # env vars that must be set
bins: [python3] # binaries that must ALL exist
anyBins: [curl, wget] # binaries where ANY ONE is sufficient
install:
- kind: pip
package: pandas
- kind: apt
package: curl
bins: [curl]
user-invocable: true
---
| Field | Required | Notes |
|-------|----------|-------|
| name | ✅ | lowercase hyphen-case, 2-64 chars |
| version | ✅ for publishing | semver, immutable once published |
| description | ✅ | trigger text — this is the skill's interface |
| author | for publishing | your name |
| tags | for publishing | array of strings |
| emoji | no | display in skill list |
| requires.env | no | fails gracefully if missing |
| requires.bins | no | ALL must exist |
| requires.anyBins | no | ANY ONE must exist |
| user-invocable | no | allow /command style invocation (default: true) |
Match the body structure to the skill's nature. Don't force workflows onto knowledge skills or vice versa.
| Pattern | Best for | Example | |---------|----------|---------| | Workflow-based | Sequential processes | charting: fetch → configure → render → serve | | Task-based | User-driven, multiple entry points | trading: "analyze" / "compare" / "check sentiment" | | Reference/guidelines | Rules, frameworks, decision trees | strategy: core principles, when to do X vs Y | | Capabilities-based | Tool groupings | market-data: price tools / derivatives tools / social tools |
Write for the agent, not the user. Direct voice.
Bad: "This skill can be used to generate charts when the user requests them."
Good: "You generate charts. Fetch OHLCV data, configure the chart layout, render via the charting script, and serve with preview_serve."
What to include:
What to leave out:
If the skill involves any on-chain operations (transactions, approvals, swaps, bridging, signing):
## 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.
Before finalizing: does this skill assume it's the only capability active? It shouldn't.
Define these before testing, not after. Write them into the skill's comments or your notes.
Quantitative (aim for these thresholds):
Qualitative:
python skills/skill-creator/scripts/validate_skill.py ./skills/my-new-skill
This checks: frontmatter structure, required fields, TODO placeholders, body length, field placement.
Run 3+ test cases from your Use-Case Canvas and evaluate against your success criteria:
Test: "[exact user phrase from canvas]"
Expected: skill triggers, completes workflow X
Actual: _______________
Pass/Fail: ___
Common failure modes and fixes:
| Symptom | Likely cause | Fix | |---------|-------------|-----| | Skill never triggers | Description too vague | Add "Use when..." with exact trigger phrases | | Triggers for wrong requests | Description too broad | Narrow trigger conditions, add "NOT for..." | | Workflow stops mid-way | Missing decision branch | Add the missing case to the body | | Works first run, fails second | Session state assumption | Remove stateful assumptions from instructions | | Conflicts with another skill | Overlapping descriptions | Differentiate with specific trigger conditions |
Edge cases to test:
skill_refresh()
Then run one final test from your Use-Case Canvas to confirm the skill loads, triggers, and completes.
my-skill/
├── SKILL.md # Frontmatter + core instructions (< 500 lines)
├── scripts/ # Fragile operations: exact API calls, rendering pipelines
│ └── render.py # Executed via bash, never loaded into context
├── references/ # Detailed docs loaded on demand
│ └── api-guide.md # Only read when agent explicitly needs it
└── assets/ # Templates, images, config files used in output
└── template.json # Never loaded into context
Context budget:
scripts/: executed, not read — no context costreferences/: read on demand — only when explicitly neededassets/: never in context — output artifacts onlyrequires.env and env varsWhen the skill is ready to share, publish it via the skill-installer workflow.
Pre-publish checklist:
name field: lowercase hyphen-case, 2-64 charsversion field: semver (e.g. 1.0.0) — immutable once publisheddescription passes the formula test (what + when)author and tags set[TODO] placeholders in body< > in descriptionPublish:
# 1. Get OIDC token
TOKEN=$(curl -s --unix-socket /.fly/api \
-X POST -H "Content-Type: application/json" \
"http://localhost/v1/tokens/oidc" \
-d '{"aud": "skills-market-gateway"}')
# 2. Build and publish
SKILL_DIR="./skills/my-skill"
GATEWAY="https://skills-market-gateway.fly.dev"
PAYLOAD=$(python3 -c "
import os, json
files = {}
for root, dirs, fnames in os.walk('$SKILL_DIR'):
for f in fnames:
full = os.path.join(root, f)
rel = os.path.relpath(full, '$SKILL_DIR')
with open(full) as fh:
files[rel] = fh.read()
print(json.dumps({'files': files}))
")
curl -s -X POST "$GATEWAY/skills/publish" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "$PAYLOAD" | python3 -m json.tool
Version is immutable after publishing — bump to 1.0.1 before republishing.
development
OpenSea API integration for NFT and token discovery, marketplace intelligence, and order/transaction workflows. Use when working with OpenSea data or trading flows (e.g. collection stats, trending collections/tokens, NFT metadata, listings/offers, swap quotes, transaction receipt polling).
development
Generate a warm, healing parallel-universe fairy tale (~1000 words) plus 3 cohesive storybook illustrations, themed "if this person had never been born, what would the world miss." Output is a polished HTML storybook that can be previewed and published. Use when the user wants a personalized "if I had never been born" / "如果我没出生" tale for a real person — input is a name, age, and 3 key life events. Great for birthdays, memorials, encouragement gifts, or healing keepsakes.
development
Onboard a user to Phala Cloud and deploy a verifiable Starchild TEE agent — a minimal FastAPI runtime running inside an Intel TDX confidential VM, plus a published chat dashboard with attestation verification. Use when the user wants to "try TEE", "run an agent in a confidential VM", "deploy to Phala", or replicate the internal Starchild TEE test setup.
tools
Trade on Polymarket prediction markets (CLOB V2) from a Privy EOA wallet. Search markets, place/cancel orders, manage positions. No private key handling. Use when the user wants to bet on event outcomes (e.g. "buy YES at 0.65 on the ceasefire market", "what are my open positions", "close my Trump bet").