Write AI agent skills in one canonical format → export to Claude Code, Cursor, and OpenCode with a single command.
npm install -g skillsmith → skillsmith init my-skill → skillsmith export . --all → done.
AI agents are only as good as the skills you give them. But every framework has its own format:
- Claude Code uses
[Name]metadata blocks in markdown - Cursor uses YAML frontmatter in
.mdcfiles - OpenCode uses YAML frontmatter in
.mdfiles
The result? You write the same skill 3 times. Or you pick one framework and pray it works everywhere. Or worse — you don't write skills at all because the friction is too high.
Every time a new framework comes out, skill authors scramble to rewrite their entire collection. With skillsmith, you write once and ship everywhere.
# Create a skill in 1 second
skillsmith init my-skill
# Validate and test it
skillsmith test ./my-skill
# Export to every framework at once
skillsmith export ./my-skill --allskillsmith — Testing my-skill v0.1.0
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✔ SKILL.md format valid
✔ skillsmith.json valid
✔ Framework compatibility: claude ✅ cursor ✅ opencode ✅
✔ Prompt simulation: 4/4 passed
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
All checks passed.
One skill file. Three frameworks. Zero manual copying. ✅
| Feature | skillsmith | Raw SKILL.md (Manual) | Bash Scripts | Copied Templates |
|---|---|---|---|---|
| Multi-framework export | ✅ Claude, Cursor, OpenCode | ❌ One format only | ❌ One at a time | ❌ One at a time |
| Skill validation | ✅ Structure + frontmatter + files | ❌ None | ❌ None | ❌ None |
| Built-in testing | ✅ Prompt simulation without LLM | ❌ | ❌ | ❌ |
| Scaffolding | ✅ skillsmith init |
❌ mkdir + touch | ❌ | ❌ |
| Versioning | ✅ skillsmith.json + semver | ❌ git only | ❌ git only | ❌ git only |
| Registry | ✅ GitHub-based (free) | ❌ | ❌ | ❌ |
| Install | ✅ npm i -g skillsmith |
❌ git clone | ❌ curl | bash | ❌ git clone |
| Dependency-free runtime | ✅ Node.js built-ins only | ✅ | ❌ | ✅ |
| CI/CD ready | ✅ Exit codes, JSON validation | ❌ | ❌ | ❌ |
| Open source | ✅ MIT, free forever | ✅ | ✅ | ❌ varies |
The bottom line: If you write AI agent skills for more than one framework — or even if you just want structure and validation — skillsmith saves you an hour per skill. Zero config. Zero lock-in.
# Install
npm install -g skillsmith
# Create your first skill
skillsmith init my-skill
cd my-skillmy-skill/
├── SKILL.md # ← Your skill (canonical format)
├── skillsmith.json # ← Metadata
├── prompts/
│ ├── example.md # ← Example prompts
│ └── test-cases.md # ← Test cases
└── README.md
---
name: my-skill
version: 0.1.0
description: "Expert TypeScript review skill"
frameworks: [claude, cursor, opencode]
---
# Instruction
You are an expert TypeScript reviewer.
# Behaviors
- Check for proper type annotations
- Identify unused imports
- Suggest generic constraints
# Constraints
- Do not suggest `any` types
- Keep feedback under 200 wordsskillsmith test . --prompt "Review this TypeScript function"# All frameworks at once
skillsmith export . --all
# Or one at a time
skillsmith export . --framework claude
skillsmith export . --framework cursor
skillsmith export . --framework opencode| Framework | Output | Generated File |
|---|---|---|
| Claude Code | [Name] + markdown |
.claude/skills/my-skill.md |
| Cursor | YAML frontmatter .mdc |
.cursor/rules/my-skill.mdc |
| OpenCode | YAML frontmatter .md |
.opencode/skills/my-skill.md |
skillsmith publish .npm install -g skillsmithnpx skillsmith --help- Node.js 18+ — any modern version works
- Your AI agent of choice — OpenCode, Claude Code, or Cursor
- Zero API keys, zero accounts, zero config
Scaffold a new skill project.
| Option | Description |
|---|---|
--template <framework> |
Use specific framework as default (claude, cursor, opencode) |
Validate skill structure and run prompt simulations.
| Option | Description |
|---|---|
--prompt <text> |
Test with a custom prompt instead of prompt files |
Export skill to framework-specific formats.
| Option | Description |
|---|---|
--framework <name> |
Target framework (claude, cursor, opencode) |
--all |
Export to all supported frameworks at once |
Validate skill and show step-by-step instructions for publishing to GitHub.
List skills installed in ~/.skillsmith/.
| Option | Description |
|---|---|
--remote |
List available skills from the GitHub registry |
📝 SKILL.md — the single source of truth (click to expand)
---
name: my-skill
version: 0.1.0
description: "What this skill does"
author: "Your Name"
frameworks: [claude, cursor, opencode]
---
# Instruction
[Natural language instructions for the AI agent]
# Behaviors
- [Specific behavior 1]
- [Specific behavior 2]
# Constraints
- [Constraint 1]
- [Constraint 2]📋 skillsmith.json — metadata and versioning (click to expand)
{
"name": "my-skill",
"version": "0.1.0",
"description": "What this skill does",
"author": "",
"license": "MIT",
"frameworks": ["claude", "cursor", "opencode"],
"keywords": ["ai-agent", "skill"],
"repository": {
"type": "github",
"url": "https://github.com/FMATheNomad/my-skill"
}
}📁 Framework Export Formats (click to expand)
| Framework | File | Format |
|---|---|---|
| Claude Code | .claude/skills/<name>.md |
[Name] + [Description] + free-form markdown |
| Cursor | .cursor/rules/<name>.mdc |
YAML frontmatter (description, globs) + markdown body |
| OpenCode | .opencode/skills/<name>.md |
YAML frontmatter (name, description) + markdown body |
# .github/workflows/skillsmith.yml
name: Validate Skills
on: [push, pull_request]
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm install -g skillsmith
- run: skillsmith test ./my-skill#!/bin/sh
# .git/hooks/pre-commit
SKILL_DIRS=$(git diff --cached --name-only --diff-filter=ACM | grep -oP '.*(?=/SKILL\.md)' | sort -u)
for dir in $SKILL_DIRS; do
skillsmith test "$dir" || exit 1
done{
"scripts": {
"validate-skills": "skillsmith test ./skills/my-skill"
}
}skillsmith is zero-config by design. Everything works out of the box.
But you can customize via ~/.skillsmith/config.json:
{
"author": "FMATheNomad",
"license": "MIT",
"defaultFramework": "opencode"
}| Setting | Default | Description |
|---|---|---|
author |
"" |
Default author for new skills |
license |
"MIT" |
Default license for new skills |
defaultFramework |
"opencode" |
Default framework template |
registryUrl |
"https://raw.githubusercontent.com/skillsmith-skills/index/main" |
Registry URL |
graph LR
A[SKILL.md] --> B{skillsmith}
B --> C[Validate]
B --> D[Test]
B --> E[Export]
B --> F[Publish]
C --> G[Structure + Frontmatter]
D --> H[Prompt Simulation]
E --> I[Claude Code .md]
E --> J[Cursor .mdc]
E --> K[OpenCode .md]
F --> L[GitHub Registry]
- Cursor glob patterns — file-type-specific rules per skill
-
skillsmith install— one-command install from registry - Human-readable docs — generate markdown docs from SKILL.md
- Skill composition — import behaviors from other skills
- Template marketplace — community templates for common patterns
- VS Code extension — visual skill editor
- Registry search —
skillsmith search <keyword>
git clone https://github.com/FMATheNomad/skillsmith
cd skillsmith
npm install
npm run build
npm testsrc/
├── cli.ts # Entry point (Commander)
├── commands/ # CLI commands
│ ├── init.ts # skillsmith init
│ ├── test.ts # skillsmith test
│ ├── export.ts # skillsmith export
│ ├── publish.ts # skillsmith publish
│ └── list.ts # skillsmith list
├── formats/ # Framework format converters
│ ├── base.ts # SkillDefinition interface
│ ├── claude.ts # Claude Code ↔ canonical
│ ├── cursor.ts # Cursor ↔ canonical
│ └── opencode.ts # OpenCode ↔ canonical
├── engine/ # Core engine
│ ├── validator.ts # Structure validation
│ ├── sandbox.ts # Prompt simulation
│ └── tester.ts # Full test suite runner
├── registry/ # Registry client
│ └── github.ts # GitHub-based registry
└── utils/ # Shared utilities
- Create a format file in
src/formats/implementingSkillFormat - Export
parse()(framework → canonical) andgenerate()(canonical → framework) - Register in
src/formats/base.ts - Add export case in
src/commands/export.ts - Add tests in
tests/formats/
MIT © FMA Software Labs
If this tool saves you time, please ⭐ star it.
FMA Software Labs · @fmathenomad · GitHub