mcpField
I
inspecting-skills

inspecting-skills

github.com/oaustegard开发15745 次安装1 天前更新
代码仓库

关于 inspecting-skills

用于发现并导入 Skill 目录中 Python 代码的工具,可处理目录名中的连字符与 Python 模块名下划线之间的差异,并支持检查、索引和列出可用 Skill。

主要功能

  1. 01发现含 Python 代码的 Skill
  2. 02按连字符或下划线名称导入
  3. 03启用透明导入
  4. 04索引符号并生成注册表

适用场景

  1. 01导入其他 Skill 中的函数
  2. 02查找仓库中的可导入 Skill
  3. 03生成离线查询注册表

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/oaustegard/claude-skills --skill inspecting-skills

安装后在 Claude Code 中输入/inspecting-skills确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

__init__.py
CHANGELOG.md
scripts/
__init__.py
discover.py
index.py
skill_imports.py

详细介绍

检查技能

发现各个技能中的 Python 代码,并启用通用导入。解决技能目录(例如 browsing-bluesky)与 Python 导入名称(例如 browsing_bluesky)之间连字符和下划线不匹配的问题。

安装

import sys
sys.path.insert(0, '/home/user/claude-skills')
from inspecting_skills import setup_skill_path, skill_import

快速开始

导入技能
from inspecting_skills import skill_import

# Import by skill name (dash or underscore form)
bsky = skill_import("browsing-bluesky")
posts = bsky.search_posts("python")

# Import specific functions
search, profile = skill_import("browsing-bluesky", ["search_posts", "get_profile"])
启用透明导入
from inspecting_skills import setup_skill_path

# Configure once at session start
setup_skill_path("/home/user/claude-skills")

# Now import skills directly (underscore form)
from browsing_bluesky import search_posts, get_profile
from remembering import remember, recall
发现可用技能
from inspecting_skills import list_importable_skills

skills = list_importable_skills()
for s in skills:
    print(f"{s['name']} -> import {s['module_name']}")

核心函数

发现
函数用途
discover_skill(path)分析单个技能目录
discover_all_skills(root)查找所有包含 Python 代码的技能
find_skill_by_name(name, root)按名称查找技能(支持两种形式)
skill_name_to_module(name)将 "browsing-bluesky" 转换为 "browsing_bluesky"
索引
函数用途
index_skill(layout)从已发现的技能中提取符号
index_all_skills(root)为仓库中的所有技能创建索引
generate_registry(root, output)创建 registry.json 清单
导入
函数用途
setup_skill_path(root)启用透明的技能导入
skill_import(name, symbols)导入技能或指定符号
register_skill(name, path)在自定义路径注册技能
list_importable_skills()列出所有可导入的技能

技能布局

技能以三种模式组织 Python 代码:

1. Scripts 目录
browsing-bluesky/
  SKILL.md
  __init__.py          # Re-exports from scripts/
  scripts/
    __init__.py
    bsky.py            # Main implementation
2. 根级模块
remembering/
  SKILL.md
  __init__.py          # Re-exports functions
  memory.py            # Core functionality
  boot.py
  config.py
3. 简易包
simple-skill/
  SKILL.md
  __init__.py          # Contains all code

生成注册表

创建 registry.json,以便离线查找符号:

from inspecting_skills import generate_registry
from pathlib import Path

registry = generate_registry(
    Path("/home/user/claude-skills"),
    output_path=Path("registry.json")
)

# Registry structure:
# {
#   "version": "1.0.0",
#   "skills": {
#     "browsing-bluesky": {
#       "module_name": "browsing_bluesky",
#       "exports": ["search_posts", "get_profile", ...],
#       "modules": [...]
#     }
#   }
# }

为单个技能创建索引

from inspecting_skills import discover_skill, index_skill
from pathlib import Path

# Discover the skill layout
layout = discover_skill(Path("/home/user/claude-skills/remembering"))
print(f"Layout: {layout.layout_type}")
print(f"Has __init__.py: {layout.has_init}")
print(f"Python files: {[f.name for f in layout.python_files]}")

# Index symbols
index = index_skill(layout)
for module in index.modules:
    print(f"\n{module.file_path}:")
    for sym in module.symbols:
        print(f"  {sym.kind} {sym.name}{sym.signature or ''}")

与 tree-sitting 集成

此技能与 tree-sitting 互为补充,后者可在运行时提取代码结构:

  • tree-sitting:通过 tree-sitter 提取 AST 结构,支持多种语言
  • inspecting-skills:支持运行时导入,专注于 Python,可动态发现

结合使用:

  1. 使用 tree-sitting 进行导航和代码审查
  2. 使用 inspecting-skills 实际导入和执行代码

故障排除

导入错误
# If skill_import fails, check:

# 1. Skill exists and has __init__.py
from inspecting_skills import discover_skill
layout = discover_skill(Path("/path/to/skill"))
print(layout.has_init)  # Must be True for importing

# 2. Skills root is configured
from inspecting_skills import get_skills_root
print(get_skills_root())

# 3. Symbol is exported in __all__
import ast
init_code = open("/path/to/skill/__init__.py").read()
# Check for __all__ definition
未找到路径
# Manually set skills root
from inspecting_skills import set_skills_root
set_skills_root("/home/user/claude-skills")

API 参考

SkillLayout
@dataclass
class SkillLayout:
    name: str              # "browsing-bluesky"
    path: Path             # Full path to skill directory
    layout_type: str       # "scripts" | "root" | "package" | "none"
    python_files: list[Path]
    has_init: bool         # Can be imported as package
    entry_module: str      # "browsing_bluesky"
SkillIndex
@dataclass
class SkillIndex:
    name: str              # "browsing-bluesky"
    module_name: str       # "browsing_bluesky"
    layout_type: str
    modules: list[ModuleIndex]
    exports: list[str]     # From __all__
Symbol
@dataclass
class Symbol:
    name: str              # Function/class name
    kind: str              # "function" | "class" | "method"
    signature: str | None  # "(self, x: int)"
    line: int | None       # 1-indexed
    docstring: str | None  # First line
    children: list[Symbol] # Methods for classes

评论

支持 Markdown