skill-builder
npx skills add https://github.com/ncssm-robotics/ftc-claude --skill skill-builder
Agent 安装分布
Skill 文档
FTC Skill Builder
This skill teaches you how to create high-quality skills for the FTC Claude Skills Marketplace. Skills are knowledge packs that help AI coding agents assist FTC teams with specific hardware, libraries, frameworks, or tools.
Quick Reference
| Element | Purpose | Required |
|---|---|---|
name |
Unique identifier (kebab-case) | Yes |
description |
WHAT it does + WHEN to use it | Yes |
license |
Usually MIT for FTC community | Recommended |
compatibility |
Which agents support it | Recommended |
metadata |
Author, version, category | Recommended |
SKILL.md |
Main instructions (<500 lines) | Yes |
| Reference files | Detailed docs (API_REFERENCE.md) | Optional |
scripts/ |
Utility scripts | Optional |
When to Create a Skill vs Other Options
| Need | Solution |
|---|---|
| Domain expertise (hardware, library) | Skill – auto-activates when relevant |
| Explicit user action | Command – /create-skill name |
| Project-wide instructions | CLAUDE.md – always loaded |
| One-off task | Just ask Claude directly |
FTC Skill Categories
| Category | Description | Examples |
|---|---|---|
hardware |
Physical components | Pinpoint, Limelight, REV Hub, Spark Mini |
library |
Software libraries | Pedro Pathing, RoadRunner, FTCLib |
framework |
Code frameworks | NextFTC, command-based patterns |
tools |
Development tools | Panels, MeepMeep, EasyOpenCV |
game |
Season-specific | DECODE 2025-2026, INTO THE DEEP |
Available Commands
| Command | Purpose |
|---|---|
/create-skill <name> [category] |
Create new plugin from template |
/validate-skill <name> |
Validate plugin structure before PR |
Note: Version bumps are automated during the release process. Contributors should add changes to the
## [Unreleased]section ofCHANGELOG.mdinstead. See RELEASES.md for details.
Skill Anatomy
plugins/your-skill-name/
âââ plugin.json # Plugin metadata
âââ CHANGELOG.md # Version history
âââ skills/
âââ your-skill-name/
âââ SKILL.md # Main instructions (required)
âââ API_REFERENCE.md # Detailed API docs (optional)
âââ TROUBLESHOOTING.md # Common issues (optional)
âââ EXAMPLES.md # Extended examples (optional)
âââ scripts/ # Utility scripts (optional)
âââ convert.py
plugin.json Format (IMPORTANT)
Every plugin needs a plugin.json file with the correct schema:
{
"name": "your-skill-name",
"version": "1.0.0",
"description": "Brief description for marketplace listing",
"author": {
"name": "Your Name or Team",
"url": "https://github.com/your-username"
},
"repository": "https://github.com/ncssm-robotics/ftc-claude",
"license": "MIT",
"keywords": ["ftc", "category", "relevant", "keywords"]
}
Required Fields
| Field | Type | Description |
|---|---|---|
name |
string | Must match folder name (kebab-case) |
version |
string | Semantic version (e.g., “1.0.0”) |
description |
string | Brief description for listings |
author |
object | Must be an object, not a string |
Author Object Format
"author": {
"name": "NCSSM Robotics",
"url": "https://github.com/ncssm-robotics"
}
Common Mistake: Using "author": "Name" (string) instead of an object will cause installation to fail.
Optional but Recommended Fields
| Field | Type | Description |
|---|---|---|
repository |
string | GitHub repo URL |
license |
string | License type (MIT recommended) |
keywords |
array | Search keywords (include “ftc”) |
homepage |
string | Documentation URL |
Invalid Fields (Do NOT Use)
These fields are NOT supported and will cause errors:
- â
tags– usekeywordsinstead - â
compatibility– not a valid field - â
authoras string – must be object
marketplace.json Entry
When adding your plugin to the marketplace, add an entry to .claude-plugin/marketplace.json:
{
"name": "your-skill-name",
"description": "Brief description",
"source": "./plugins/your-skill-name",
"skills": ["./skills/your-skill-name"]
}
Marketplace Fields
| Field | Description |
|---|---|
name |
Plugin name (must match folder) |
description |
Brief description |
source |
Path to plugin folder (use ./plugins/name) |
skills |
Array of skill paths within the plugin |
Common Mistake: Using "path" instead of "source" will cause marketplace registration to fail.
Writing the Description (CRITICAL)
The description field determines when your skill activates. It must answer:
- WHAT does this skill do?
- WHEN should Claude use it?
Good Description (Clear WHAT + WHEN)
description: >-
Helps configure and use the GoBilda Pinpoint odometry computer for robot
localization. Use when setting up Pinpoint, configuring pod offsets,
troubleshooting LED status, tuning encoders, or integrating with Pedro Pathing.
Why it works:
- WHAT: Configure GoBilda Pinpoint odometry
- WHEN: Setup, pod offsets, LED status, tuning, Pedro integration
Bad Description (Too Vague)
description: Helps with odometry.
Why it fails:
- No specific hardware mentioned
- No trigger scenarios
- Won’t activate on relevant questions
FTC-Specific Trigger Words
Include these in descriptions where relevant:
- Hardware: “GoBilda”, “REV”, “Limelight”, “Spark Mini”, “encoder”
- Libraries: “Pedro Pathing”, “RoadRunner”, “FTCLib”, “NextFTC”
- Concepts: “autonomous”, “teleop”, “path following”, “PID”, “odometry”
- Actions: “setup”, “configure”, “tune”, “troubleshoot”, “integrate”
Frontmatter Reference
---
name: your-skill-name # Required: kebab-case, max 64 chars
description: >- # Required: max 1024 chars
What this skill does.
Use when [trigger 1], [trigger 2], or [trigger 3].
license: MIT # Recommended for FTC community
compatibility: Claude Code, Codex CLI, VS Code Copilot, Cursor
metadata:
author: your-github-username # Your GitHub username or team number
version: "2.0.0"
category: hardware # hardware | library | framework | tools | game
allowed-tools: Read, Write, Edit # Optional: restrict tool access
---
Tool Restriction Patterns
# Read-only skill (safe, no modifications)
allowed-tools: Read, Grep, Glob
# Can create/edit files
allowed-tools: Read, Write, Edit, Glob, Grep
# Can run specific commands (use uv only when scripts need external deps)
allowed-tools: Read, Write, Edit, Bash(./gradlew:*), Bash(python:*)
# Full access (omit field entirely)
# allowed-tools: (not specified)
Progressive Disclosure
Keep SKILL.md focused (~500 lines max). Link to detailed files that load on-demand.
# My Hardware Skill
## Quick Start
[Essential setup - what 80% of users need]
## Common Patterns
[Frequently used code patterns]
## Detailed Reference
For complete API documentation, see [API_REFERENCE.md](API_REFERENCE.md).
For troubleshooting guides, see [TROUBLESHOOTING.md](TROUBLESHOOTING.md).
## Utilities
Convert coordinates:
\`\`\`bash
uv run scripts/convert.py ftc-to-pedro 0 0 90
\`\`\`
Rule: Link directly from SKILL.md. Avoid AâBâC reference chains.
Content Structure Patterns
DO Patterns Section
## Patterns
- Always call `pinpoint.update()` in your loop
- Set encoder resolution before calling `resetPosAndIMU()`
- Use mm internally, convert to inches for Pedro Pathing
- Check LED status before debugging code issues
DON’T / Anti-Patterns Section
## Anti-Patterns
- â Calling `resetPosAndIMU()` while robot is moving
- â Using I2C port 0 (reserved for internal IMU)
- â Forgetting to call `update()` - position won't refresh
- â Mixing mm and inches without conversion
Examples Section
## Examples
### Good: Proper initialization sequence
\`\`\`java
@Override
public void init() {
pinpoint = hardwareMap.get(GoBildaPinpointDriver.class, "pinpoint");
pinpoint.setEncoderResolution(goBILDA_4_BAR_POD);
pinpoint.setOffsets(forwardOffset_mm, strafeOffset_mm);
pinpoint.resetPosAndIMU(); // Robot must be stationary!
}
\`\`\`
### Bad: Wrong initialization order
\`\`\`java
// â resetPosAndIMU before setEncoderResolution
@Override
public void init() {
pinpoint = hardwareMap.get(GoBildaPinpointDriver.class, "pinpoint");
pinpoint.resetPosAndIMU(); // Wrong! Resolution not set yet
pinpoint.setEncoderResolution(goBILDA_4_BAR_POD);
}
\`\`\`
Scripts in Skills
Scripts execute without loading content into context (zero token cost):
## Utilities
Convert FTC coordinates to Pedro Pathing:
\`\`\`bash
python scripts/convert.py ftc-to-pedro 1.5 2.0 90
\`\`\`
Mirror red alliance pose for blue:
\`\`\`bash
python scripts/convert.py mirror-blue 7 6.75 0
\`\`\`
Choosing Between python and uv run
Use python when:
- Script has NO external dependencies (only uses Python stdlib)
- Maximum accessibility – all systems have Python
- Example: Math conversions, file parsing with
sys/json/math
Use uv run when:
- Script requires external packages (numpy, requests, etc.)
- Need reproducible dependency versions
- Want isolated environment to avoid conflicts
- Example: Data analysis with pandas, API calls with requests
# Simple script with no deps - use `python`
import sys
import math
def convert_coords(x, y):
return x * 25.4, y * 25.4 # inches to mm
# Complex script with deps - use `uv run`
import numpy as np
import requests
def fetch_and_analyze(url):
data = requests.get(url).json()
return np.mean(data['values'])
Make scripts executable:
chmod +x scripts/*.sh scripts/*.py
Complete SKILL.md Template
---
name: your-skill-name
description: >-
[What this skill does - specific capabilities for FTC].
Use when [trigger 1], [trigger 2], or [trigger 3].
license: MIT
compatibility: Claude Code, Codex CLI, VS Code Copilot, Cursor
metadata:
author: your-github-username
version: "2.0.0"
category: hardware | library | framework | tools | game
---
# [Skill Name]
Brief introduction - what this helps FTC teams accomplish.
## Quick Start
### Installation/Setup
[How to add the dependency or configure hardware]
### Basic Usage
\`\`\`java
// Minimal working example
\`\`\`
## Key Concepts
| Term | Description |
|------|-------------|
| **Term 1** | What it means in FTC context |
| **Term 2** | What it means in FTC context |
## Common Patterns
### Pattern 1: [Descriptive Name]
\`\`\`java
// Code example
\`\`\`
### Pattern 2: [Descriptive Name]
\`\`\`java
// Code example
\`\`\`
## Anti-Patterns
- â [Thing to avoid] - [Why it's bad]
- â [Thing to avoid] - [Why it's bad]
## Examples
### Good: [Descriptive title]
\`\`\`java
// Working example with comments
\`\`\`
### Bad: [Descriptive title]
\`\`\`java
// â What not to do
\`\`\`
## Reference Documentation
- [API_REFERENCE.md](API_REFERENCE.md) - Complete API documentation
- [TROUBLESHOOTING.md](TROUBLESHOOTING.md) - Common issues and solutions
## External Resources
- [Official Documentation](https://example.com/docs)
- [GitHub Repository](https://github.com/example/repo)
Skill Creation Checklist
Before submitting your skill:
plugin.json
-
namematches folder name (kebab-case) -
authoris an object withnamefield (NOT a string) -
keywordsarray includes “ftc” (NOTtags) - No invalid fields (
tags,compatibility)
marketplace.json
- Entry added with
sourcefield (NOTpath) -
skillsarray lists skill directories
SKILL.md
-
namein frontmatter matches folder name -
descriptionincludes WHAT and WHEN triggers -
descriptionincludes FTC-specific keywords - Under ~500 lines
- Includes Quick Start section
- Shows Good AND Bad examples
- Anti-patterns marked with â
- Code examples are tested and working
General
- Scripts are executable (
chmod +x) - No sensitive information (API keys, credentials)
Testing Your Skill
-
Install locally:
./install.sh --project your-skill-name -
Start a new conversation and test triggers:
"Help me set up [your hardware/library]" "How do I configure [specific feature]?" "Show me an example of [common task]" -
Claude should ask: “Should I use the [skill-name] skill?”
-
Verify the skill provides accurate, helpful information.
Common Mistakes & Fixes
| Mistake | Fix |
|---|---|
author as string |
Use object: {"name": "...", "url": "..."} |
Using tags field |
Rename to keywords |
Using path in marketplace |
Rename to source |
Using compatibility |
Remove – not a valid field |
| Vague description | Add specific FTC keywords and trigger scenarios |
| SKILL.md too long | Extract to API_REFERENCE.md, TROUBLESHOOTING.md |
| No anti-patterns | Always show what NOT to do |
| Scripts not executable | chmod +x scripts/* |
| Missing Quick Start | Put most common use case first |
| Only Java examples | Include Kotlin if the library supports it |