Skip to content

SKILLS 动态加载的实现示例存在覆盖问题,会导致重复加载名为 SKILL 的 skill #30

@zegging

Description

@zegging

commit: ba68302

s05_skill_loading.py

现在的代码:

    def _load_all(self):
        if not self.skills_dir.exists():
            return
        for f in sorted(self.skills_dir.glob("*.md")):
            name = f.stem
            text = f.read_text()
            meta, body = self._parse_frontmatter(text)
            self.skills[name] = {"meta": meta, "body": body, "path": str(f)}

按照 Anthropic 的事实标准,skills 文件夹中的结构是这样的:

.claude/skills/
└── your-skill-name/          # Skill 的唯一标识目录
    ├── SKILL.md              # 包含元数据和核心指令 (必选)
    ├── scripts/              # 存放辅助自动化脚本 (可选)
    │   └── helper.py
    └── resources/            # 存放文档、规范或模板 (可选)
        ├── templates.json
        └── style-guide.md

按照现有代码就会存在两个问题:

  1. 不会递归搜索子文件夹
  2. 会重复覆盖名为 SKILL 的技能

感觉修改成下面这种形式可能会更好?

    def _load_all(self):
        if not self.skills_dir.exists():
            return
        for f in sorted(self.skills_dir.rglob("*.md")):
            name = f.parent.name
            text = f.read_text()
            meta, body = self._parse_frontmatter(text)
            self.skills[name] = {"meta": meta, "body": body, "path": str(f)}

btw,SKILL 目前也不是一个完全规范的标准(我的个人理解)

The name field becomes the /slash-command, and the description helps Claude decide when to load it automatically

或许还是需要区分 SKILL meta 中的 name 和文件夹名称的实际含义。但这些不是这个项目中的核心要素

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions