Smart Skills
Agent skill management tool - manage and sync AI agent instructions for opencode, nvim, Cursor, and Claude Code.
Features
- Validates skills for agent support: Ensures proper format so your agents understand skills
- Built with Rust: Blazing fast - no waiting for npm
- Zero dependencies: Standalone binary - no Node.js, no npm chain
- Open source: Inspect every line yourself
- Your skills, your machine: No marketplace, no third-party auto-sync
- Per-project + global config: Team defaults via global, project overrides locally
- Simple sync:
smart-skills syncto update skills
Installation
No npm/Node.js required!
smart-skills is a standalone binary - no dependencies.
Via Cargo (recommended)
Via Homebrew
Via Install Script
|
From Source
Security
We validate FORMAT. You validate CONTENT.
What we do:
- Check skills have proper format (## headers, bullet points)
- Verify SKILL.md is not empty
- Parse frontmatter for agent compatibility
What YOU must do:
- Manually review every skill before adding
- Use a raw text editor - never trust rendered markdown
- Check for hidden comments, escape sequences, malicious code
Why this matters:
Your AI agent has permissions to:
- Run shell commands
- Access/modify files
- Read environment variables (API keys!)
A malicious skill = instant breach.
Never add a skill you haven't reviewed yourself.
Manual Review Required
Don't trust rendered markdown. Use a real editor.
# Find a skill you want
# REVIEW IT FIRST - use raw editor
# Only if safe, copy to your source
# Now add it
Renderers can hide:
- HTML comments
<!-- malicious --> - Escape sequences
- Code that looks safe but isn't
Your agent runs this. Verify it yourself.
Why not skills.sh?
- npm supply chain attacks
- Marketplace = trusting strangers
- Their "add" command fetches from internet = security risk
- We don't do automatic third-party
Quick Start
# Install (no npm needed!)
# or: brew install smart-skills
# Initialize a project
# Add skills
# Sync to update
For teams:
- Put skills in a shared location
- Run
initwith your team's skill source - Team members run
syncto get latest
Usage
Initialize a project
The init command follows this logic:
1. No arguments provided
| Scenario | Behavior |
|---|---|
| Global config exists | Uses global config as template, resolves source paths to absolute |
| Global config missing but global skills exist | Uses global skills dir as source, prompts for targets (interactive) or defaults to agents (non-interactive) |
| No global config, no global skills | Leaves sources empty, prompts for targets (interactive) or defaults to agents (non-interactive) |
2. With arguments
| Argument | Behavior |
|---|---|
--skills-source <path> |
Use this skill source directory |
--targets a,c |
Use these targets |
| Both provided | Use both specified values |
Path Resolution
Skill source paths are resolved relative to current project directory.
Quick Examples
# Default initialization
# Use custom skill source
# Specify targets explicitly
Targets:
agents- opencode/nvim (.agents/skills/)cursor- Cursor IDE (.cursor/rules/)claude- Claude Code (.claude/rules/)
Add skills
Requires:
smart-skills initto have been run first
Remove skills
Requires:
smart-skills initto have been run first
List skills
Requires:
smart-skills initto have been run first
Sync skills
Requires:
smart-skills initto have been run first
Check status
Requires:
smart-skills initto have been run first
Config management
Requires:
smart-skills initto have been run first
Clear all skills
Requires:
smart-skills initto have been run first
Global Config
Global config allows you to define a standard skill configuration that new projects can inherit.
Location
~/.config/smart-skills/config.json
Example
Benefits
- One-time setup: Configure once, use in all projects
- Team consistency: Share the config file via dotfiles
- Path resolution: Relative paths are automatically resolved when initializing new projects
How it works
- When you run
smart-skills initwithout arguments, it uses global config as a template for your project - Relative paths in global config are resolved to absolute paths (relative to global config directory)
- You can override either source or targets via CLI arguments
Setup Global Config
# Create global config directory
# Create config with your preferred settings
# Now any new project will use this config
Configuration
Project Config (.smart-skills/config.json)
Install Targets:
agents: Enable/disable.agents/skills/installationcursor: Enable/disable.cursor/rules/installationclaude: Enable/disable.claude/rules/installation
Edit this file and run smart-skills sync to apply changes.
Skill Sources
- path: Path to skill directory (relative or absolute)
- priority: Higher priority sources are checked first (10 = highest)
Skill Structure
Skills should be in directories with SKILL.md files:
skills/
├── planning/
│ └── SKILL.md
├── code-review/
│ └── SKILL.md
└── ...
SKILL.md Format
name: planning
description: Plan before coding
* **
The frontmatter is optional but helps agents understand skills better.
Adding Custom Skills
-
Create a skill directory:
-
Add a
SKILL.mdfile:* * -
Add it:
Structure
smart-skills/
├── Cargo.toml
├── src/
│ ├── main.rs
│ ├── cli/
│ │ ├── commands.rs
│ │ ├── init.rs
│ │ ├── colors.rs
│ │ └── mod.rs
│ ├── skills/
│ │ ├── mod.rs
│ │ ├── loader.rs
│ │ └── installer.rs
│ └── config/
│ └── mod.rs
├── tests/
│ ├── init_tests.rs
│ └── ...
└── README.md