For Japanese, see README.ja.md.
skillctl is a CLI that copies and synchronizes agent skills from a global
(canonical) store to user-defined targets.
The default config path is XDG_CONFIG_HOME/skillctl/config.toml.
If XDG_CONFIG_HOME is not set, ~/.config/skillctl/config.toml is used.
If SKILLCTL_CONFIG is set, its path takes precedence.
global_root = "~/skills/global"
[[targets]]
name = "codex"
root = "~/.codex/skills"
[[targets]]
name = "opencode"
root = "~/.opencode/skills"
[hash]
algo = "blake3" # or "sha256"
ignore = [".git/**", "**/.DS_Store", "**/*.tmp"]
[diff]
command = ["git", "diff", "--no-index", "--", "{left}", "{right}"]# Build
cargo build
# Run (cargo run)
cargo run -- status --target codex
# Release build
cargo build --releaseIf you have just installed, you can use these shortcuts:
just fmt
just clippy
just test
just ci
just mutationThe examples below assume global_root = "~/skills/global" and
targets.name = "codex" (root = "~/.codex/skills").
# List targets
skillctl targets
# List skills (global)
skillctl list --global
# List skills (target)
skillctl list --target codex
# Status (single target)
skillctl status --target codex
# Status (all targets)
skillctl status --all
# Doctor (global / target / all)
skillctl doctor --global
skillctl doctor --target codex
skillctl doctor --all
# Sync (global -> target)
skillctl push my-skill --target codex
skillctl push --all --target codex
# Import (target -> global)
skillctl import my-skill --from codex
skillctl import --all --from codex
# diff
skillctl diff my-skill --target codex--dry-run: list planned operations only (no file changes)--prune: include target extras for removal duringpush--overwrite: replace global duringimport--all: use all targets (forstatus/doctor)
SKILLCTL_CONFIG: explicit config path (highest priority)SKILLCTL_LANG: message language (ja/en)- Falls back to
LC_ALL/LC_MESSAGES/LANG - Unsupported values default to
ja
- Falls back to
- Digest is computed from relative path + content (rename or content change is diff)
- Files matching
hash.ignoreare excluded from digest statusreports four states:missing / same / diff / extra--dry-runperforms zero file operations- Skill names must be directory names only (no separators,
.., or absolute paths)
# Check status
skillctl status --target codex
# Inspect planned ops (dry-run)
skillctl push --all --target codex --dry-run
# Execute (install/update)
skillctl push --all --target codex
# If differences remain, use diff
skillctl diff my-skill --target codexConfig file not foundappears- Create
XDG_CONFIG_HOME/skillctl/config.tomlor the path set inSKILLCTL_CONFIG
- Create
Target not foundappears- Run
skillctl targetsto see available target names
- Run
Root does not existappears- Check
global_root/targets[].rootinconfig.toml
- Check
Diff target path does not existappears- Run
push/importbeforediff
- Run
0: success2: invalid CLI arguments3: config errors (missing/invalid config, unknown target, etc.)4: execution errors (copy failure, diff launch failure, etc.)