services/openclaw/skills.md

OpenClaw Skills

๐Ÿ“ Skill Storage Locations

Skills load from several roots (run openclaw skills check to see what's actually live):

1. Bundled skills (ship with OpenClaw, read-only)

~/.nvm/versions/node/v26.5.0/lib/node_modules/openclaw/skills/

The prefix follows the active Node version โ€” npm root -g gives the real path.

2. Managed custom skills (add new ones here)

~/.openclaw/skills/

Real but currently empty, reserved for OpenClaw-specific skills. Drop a directory containing a SKILL.md here and OpenClaw picks it up.

3. Personal skills โ€” canonical (shared with pi)

~/.agents/skills/

A real directory since 2026-09-25. Most entries are real folders; twelve are symlinks into ~/Work/llm/dom-agent-skills/skills.

4. Plugin-managed skills (symlinks, don't touch)

~/.openclaw/plugin-skills/

5. Extra dirs (external skill packs โ€” lowest precedence) Configured via skills.load.extraDirs in openclaw.json; skills.load is now empty {}. The two keys it used to hold were removed 2026-09-25, once the layout fix made them unnecessary.

๐Ÿ˜ˆ Skillfish โ€” cross-tool skill installation

Skillfish installs skills across multiple AI coding tools. Each tool keeps skills in its own directory:

Tool Skills directory
Claude Code ~/.claude/skills/
Cursor ~/.cursor/skills/
Codex ~/.codex/skills/
GitHub Copilot ~/.github/skills/
Gemini CLI ~/.gemini/skills/
OpenClaw ~/.agents/skills/ (shared with pi)

To add a custom skill manually:

mkdir -p ~/.agents/skills/my-skill/          # canonical
mkdir -p ~/.openclaw/skills/my-skill/        # OpenClaw-only

Then create a SKILL.md in that directory with YAML frontmatter (name, description) and markdown body. Format follows the brave-search skill pattern. The skill-creator skill can also scaffold these.

For loading skills from another location, configure skills.load.extraDirs in openclaw.json.

Correction, later the same evening (2026-09-25): the cause was the root symlink itself, not the nested ones. Both ~/.agents/skills and ~/.openclaw/skills were symlinks to ~/Work/llm/skills, so OpenClaw's ancestry check ran against the wrong base. Making ~/.agents/skills a real directory fixed it outright, with no config workaround. Full write-up in ai/skills.md. Everything below is kept as history.

The shared skill pack lives outside the skills root at ~/Work/llm/dom-agent-skills/skills. Point OpenClaw at it with skills.load.extraDirs โ€” that scans another directory as an extra (lowest-precedence) skill root, so nothing needs copying and no symlinks are required.

Symptom. At startup (and in openclaw doctor) each affected skill logs:

[skills] Skipping invalid skill: file=~/.openclaw/skills/asana/SKILL.md
        error=symlink prefix resolves outside the root ancestry

Cause. Those entries are symlinked folders pointing into the shared pack. OpenClaw's path-containment check requires a skill root's resolved realpath to stay inside its configured root, so the symlinks get skipped.

Didn't work: skills.load.allowSymlinkTargets: ["/Users/dominick/Work/llm/dom-agent-skills/skills"]. It's documented ("trusted real target roots that skill symlinks may resolve into") and looks like the right lever, but the 2026.9.5 loader still skipped the symlinks โ€” even after a full Gateway restart. Don't reach for it first.

Works: add the target as an extra dir in ~/.openclaw/openclaw.json:

"skills": {
  "load": {
    "extraDirs": ["/Users/dominick/Work/llm/dom-agent-skills/skills"]
  }
}

Extra dirs sit at precedence level 7 (lowest) โ€” a bundled, managed, agent, or workspace skill with the same name still wins. Takes effect after a Gateway restart; the openclaw CLI picks it up immediately.

Affected (13): asana, diagrams, git-commit, git-squash, granola, mongo-atlas, notion, plan-to-feature-doc, posthog, pr-review, validate-implementation, vercel โ€” symlinked in both ~/.openclaw/skills/ and ~/.agents/skills/. (rubrics is symlinked too but has no SKILL.md, so it's ignored rather than flagged.)

Verify:

openclaw skills list --json | grep -o '"name"[^,]*' | grep -i asana
openclaw doctor --non-interactive 2>&1 | grep "Skipping invalid skill" || echo clean

The old symlinks are harmless once extraDirs covers the target root โ€” they can stay.

๐Ÿงฉ Skills (81 eligible)

Live list: openclaw skills list ยท readiness: openclaw skills check ยท details: openclaw skills info <name>

Eligible as of 2026-09-25 (81). Symlink / external-root loading is covered under ๐Ÿ“ Skill Storage Locations above:

1password, add-model-provider, apple-notes, apple-reminders, asana,
bear-notes, blogwatcher, blucli, browser-automation, camsnap, canvas,
clawhub, cloud-image-bake, coding-agent, configure-channel, control-ui,
convert-md-to-pdf, create-planning-doc, create-pr, diagnose-gateway,
diagram-maker, diagrams, eightctl, gemini, gh-issues, gifgrep, git-commit,
git-squash, github, gog, goplaces, granola, healthcheck, himalaya,
mcp-server-registration, mcporter, meme-maker, model-usage, mongo-atlas,
nano-pdf, nextjs-developer, node-connect, node-inspect-debugger, notion,
obsidian, openai-whisper, openai-whisper-api, openclaw-claude-subscription,
openclaw-lost-context, openhue, oracle, ordercli, pdf-to-markdown, peekaboo,
personal-notes, personal-todos, plan-to-feature-doc, posthog, pr-review,
python-debugpy, sag, sherpa-onnx-tts, skill-creator, songsee, sonoscli,
spike, spotify-player, summarize, taskflow, taskflow-inbox-triage, tavily,
telegram, things-mac, tmux, trello, validate-implementation, vercel,
vietnamese-mom-translator, visualize, weather, xurl

Handy ones: gog (Google Workspace), personal-notes, personal-todos, telegram, asana, notion, granola, posthog, pr-review, validate-implementation, git-commit, git-squash, create-pr, vercel.

Apple Notes (memo CLI)

Uses memo CLI to read/write Apple Notes via the apple-notes skill.

Setup: brew install antoniorodr/memo/memo Full docs: See documents/dev/memo.md in personal notes.