Sep 16, 2026

别再把 skill 复制进每个代理了:用 MagicSkills 共享一个技能池

北京大学 Narwhal-Lab 出品的 308 星本地优先技能基础设施层——技能只装一次,按代理组合各自的技能集合,同步进 AGENTS.md 或作为一个工具暴露。

#tutorial#skill-management#python

同一个 SKILL.md 目录被复制进 Claude Code 的文件夹、Cursor 的文件夹、Codex 的文件夹——三周之后,这几份副本已经悄悄分叉了。MagicSkills 是北京大学 Narwhal-Lab 的 308 星项目,用一个共享的本地优先技能池取代了这种复制。

为什么这个 Skill 重要

MagicSkills 把自己描述为「面向多代理项目的本地优先技能基础设施」。你不需要按项目散落技能目录,而是维护一个池子,并从中构建命名的 Skills 集合——每个代理只看到自己需要的那部分子集,并按照该运行时实际消费技能的方式暴露出来。

对象模型分三层:Skill(一个具体的技能目录)、Skills(一个可操作的集合)、REGISTRY(持久层,把命名集合跨运行保存到 ~/.magicskills/collections.json——保存的是路径和描述,不是技能内容的副本)。

覆盖面按运行时拆分。会读 AGENTS.md 的代理应用——README 点名了 Claude Code、Cursor、Windsurf、Aider 和 Codex——通过把集合同步进该文件来使用技能。而通过工具或函数集成的代理框架——AutoGen、CrewAI、LangChain、LangGraph、Haystack、Semantic Kernel、smolagents 和 LlamaIndex——则通过统一的工具接口调用同一个集合。

安装

MagicSkills 已上架 PyPI,需要 Python 3.10 至 3.13,外加 Git(用于从远程仓库安装技能):

pip install MagicSkills
magicskills -h

或从源码安装:

git clone https://github.com/Narwhal-Lab/MagicSkills.git
cd MagicSkills
python -m pip install -e .
magicskills -h

实战流程:一个技能池,按代理同步

面向会读 AGENTS.md 的代理,推荐流程是安装、组合、同步。先把技能装进共享池——来源可以是 GitHub 仓库或本地目录:

# 从远程仓库安装
magicskills install anthropics/skills -t ~/allskills

# 从本地目录安装(本仓库自带的模板技能)
magicskills install skill_template -t ~/allskills

开箱即用支持四个标准位置:当前项目的 ./.claude/skills/、--global 对应的 ~/.claude/skills/、--universal 对应的 ./.agent/skills/,以及 --global --universal 对应的 ~/.agent/skills/——也可以用 -t 指定任意路径。README 推荐使用一个共享根目录(例如 ~/allskills),让所有代理复用同一个池子。

然后为某个代理组合一个命名集合:

magicskills addskills agent1_skills --skill-list pdf docx --agent-md-path /agent_workdir/AGENTS.md

再同步它:

magicskills syncskills agent1_skills

syncskills 有两种模式。none 保留标准的 <usage> + <available_skills> 结构,适合能直接使用 AGENTS.md 中技能信息列表的代理;cli_description 只写入带 CLI 指引的 <usage>,适合必须通过 magicskills skill-tool 使用的代理。如果目标文件已有技能区块会被替换,没有则追加。

实战流程:把同一个集合暴露给框架

对于完全不读 AGENTS.md 的框架,CLI 以工具风格派发 list、read、exec:

magicskills skill-tool listskill --name agent1_skills
magicskills skill-tool readskill --name agent1_skills --arg pdf
magicskills skill-tool execskill --name agent1_skills --arg "echo hello"

在 Python 侧,通过注册表复用 CLI 创建的集合,包成一个 @tool 交给框架:

import json

from langchain_core.tools import tool
from magicskills import REGISTRY

agent1_skills = REGISTRY.get_skills("agent1_skills")

@tool("_skill_tool", description=agent1_skills.tool_description)
def _skill_tool(action: str, arg: str = "") -> str:
    return json.dumps(agent1_skills.skill_tool(action, arg), ensure_ascii=False)

你也可以直接在内存中构建临时的 Skills(...) 对象而不注册它——适合不该被持久化的一次性组合。

使用技巧

  • 两个技能同名时,别再传名字,改传显式路径——magicskills readskill ./skills/demo/SKILL.md。名字图方便,路径消歧义。
  • execskill 在当前进程工作目录中执行命令,而不是在技能目录里——命令依赖位置时就自己 cd。
  • uploadskill 通过自动化的 fork、push 和 PR 流程把本地技能提交到 MagicSkills 仓库,其他人就能用 install 装回去。
  • magicskills -h 加上 doc/cli.md 里的完整命令参考覆盖了其余命令,从 showskill 到 deleteskills。

什么时候不该用它

如果你只在一个项目里跑一个代理,普通的技能目录已经够用——技能池、集合和注册表是为多代理场景准备的架构。整套东西是 Python CLI 加本地文件,完全无法调用 CLI、也读不了同步后的 AGENTS.md 的运行时不适用。远程安装依赖 Git,纯离线环境从 GitHub 拉取也就无从谈起。


查看排行榜了解更多 skill。