技能管理 CLI
用于管理 oh-my-claudecode 技能的元技能,通过 CLI 式命令进行操作。
子命令
/skill list
显示所有可用技能,按范围分类。
行为:
- 扫描插件
skills/目录中内置的技能(只读) - 扫描
${CLAUDE_CONFIG_DIR:-~/.claude}/skills/omc-learned/下的用户技能 - 扫描
.omc/skills/下的项目技能 - 解析 YAML 前置元数据
- 以表格形式显示:
内置技能(与 oh-my-claudecode 捆绑):
| 名称 | 描述 | 范围 |
|-------------------|------------------------------|----------|
| visual-verdict | 结构化视觉问答判决 | 内置 |
| ralph | 持久化循环 | 内置 |
用户技能 (~/.claude/skills/omc-learned/):
| 名称 | 触发器 | 质量 | 使用次数 | 范围 |
|-------------------|------------------|------|---------|------|
| error-handler | fix, error | 95% | 42 | 用户 |
| api-builder | api, endpoint | 88% | 23 | 用户 |
项目技能 (.omc/skills/):
| 名称 | 触发器 | 质量 | 使用次数 | 范围 |
|-------------------|------------------|------|---------|--------|
| test-runner | test, run | 92% | 15 | 项目 |
降级: 如果质量/使用数据不可用,显示“N/A”
内置技能说明: 内置技能与 oh-my-claudecode 捆绑,可发现和读取,但不能通过 /skill remove 或 /skill edit 删除或编辑。
/skill add [name]
用于创建新技能的交互式向导。
行为:
- 询问技能名称(如果命令中未提供)
- 验证:小写字母、仅连字符、无空格
- 询问描述
- 简洁、清晰的一句话
- 询问触发器(逗号分隔的关键词)
- 示例:“error, fix, debug”
- 询问参数提示(可选)
- 示例:“ [options]”
- 询问范围:
user→${CLAUDE_CONFIG_DIR:-~/.claude}/skills/omc-learned/<name>/SKILL.mdproject→.omc/skills/<name>/SKILL.md
- 创建技能文件,使用模板:
---
name: <name>
description: <description>
triggers:
- <trigger1>
- <trigger2>
argument-hint: "<args>"
---
# <Name> 技能
## 目的
[描述此技能的功能]
## 何时激活
[描述触发条件和场景]
## 工作流
1. [步骤 1]
2. [步骤 2]
3. [步骤 3]
## 示例
/oh-my-claudecode: example-arg
## 备注
[附加上下文、边缘情况、注意事项]
- 报告成功,并显示文件路径
- 建议: “使用
/skill edit <name>编辑自定义内容”
示例:
用户:/skill add custom-logger
助手:正在创建新技能 'custom-logger'...
描述:增强日志记录,支持结构化输出
触发器(逗号分隔):log, logger, logging
参数提示(可选):<level> [message]
范围(user/project):user
✓ 已在 ~/.claude/skills/omc-learned/custom-logger/SKILL.md 创建技能
→ 编辑:/skill edit custom-logger
/skill remove
按名称删除技能。
行为:
- 在两个范围中搜索技能:
${CLAUDE_CONFIG_DIR:-~/.claude}/skills/omc-learned/<name>/SKILL.md.omc/skills/<name>/SKILL.md
- 如果找到:
- 显示技能信息(名称、描述、范围)
- 请求确认: “删除 '' 技能(来自 )?(yes/no)”
- 如果确认:
- 删除整个技能目录(例如
${CLAUDE_CONFIG_DIR:-~/.claude}/skills/omc-learned/<name>/) - 报告:"✓ 已从 中移除技能 ''"
- 删除整个技能目录(例如
- 如果未找到:
- 报告:"✗ 未在用户或项目范围中找到技能 ''"
安全: 未经用户明确确认绝不删除。
示例:
用户:/skill remove old-logger
助手:在用户范围内找到技能 'old-logger':
描述:旧版日志工具
范围:用户 (~/.claude/skills/omc-learned/)
是否删除 'old-logger' 技能?(yes/no)
用户:yes
助手:✓ 已从用户范围中移除技能 'old-logger'
/skill edit
交互式编辑现有技能。
行为:
- 按名称查找技能(搜索两个范围)
- 通过 Read 工具读取当前内容
- 显示当前值:
当前技能 'custom-logger': - 描述:增强日志记录,支持结构化输出 - 触发器:log, logger, logging - 参数提示:<level> [message] - 范围:用户 - 询问要更改的内容:
description- 更新描述triggers- 更新触发器关键词argument-hint- 更新参数提示content- 编辑完整的 Markdown 内容rename- 重命名技能(移动文件)cancel- 退出而不修改
- 对于所选字段:
- 显示当前值
- 询问新值
- 更新 YAML 前置元数据或内容
- 写回文件
- 报告成功,并显示更改摘要
示例:
用户:/skill edit custom-logger
助手:当前技能 'custom-logger':
- 描述:增强日志记录,支持结构化输出
- 触发器:log, logger, logging
- 参数提示:<level> [message]
您想要编辑什么?(description/triggers/argument-hint/content/rename/cancel)
用户:triggers
助手:当前触发器:log, logger, logging
新触发器(逗号分隔):log, logger, logging, trace
✓ 已更新 'custom-logger' 的触发器
/skill search
按内容、触发器、名称或描述搜索技能。
行为:
- 扫描所有技能(两个范围)
- 匹配查询(不区分大小写)对:
- 技能名称
- 描述
- 触发器
- 完整的 Markdown 内容
- 显示匹配结果及上下文:
找到 3 个技能匹配“typescript error”:
1. typescript-fixer(用户)
描述:修复常见 TypeScript 错误
匹配:“typescript error handling patterns”
2. error-handler(用户)
描述:通用错误处理工具
匹配:“Supports TypeScript and JavaScript errors”
3. lint-fix(项目)
描述:自动修复 lint 错误
匹配:“TypeScript ESLint error resolution”
排名: 优先匹配名称/触发器,其次是内容匹配
示例:
用户:/skill search api endpoint
助手:找到 2 个技能匹配“api endpoint”:
1. api-builder(用户)
描述:生成 REST API 端点
触发器:api, endpoint, rest
2. backend-scaffold(项目)
描述:搭建后端服务
匹配:"Creates API endpoint boilerplate"
/skill info
显示技能的详细信息。
行为:
- 按名称查找技能(搜索两个范围)
- 解析 YAML 前置元数据和内容
- 显示完整详情:
技能:custom-logger
范围:用户 (~/.claude/skills/omc-learned/custom-logger/)
描述:增强日志记录,支持结构化输出
触发器:log, logger, logging
参数提示:<level> [message]
质量:95%(如果可用)
使用次数:42 次(如果可用)
文件路径:/home/user/.claude/skills/omc-learned/custom-logger/SKILL.md
--- 完整内容 ---
[整个 Markdown 内容]
如果未找到: 报告错误并建议使用 /skill search
示例:
用户:/skill info custom-logger
助手:技能:custom-logger
范围:用户
描述:增强日志记录,支持结构化输出
触发器:log, logger, logging
文件:~/.claude/skills/omc-learned/custom-logger/SKILL.md
--- 内容 ---
# Custom Logger 技能
## 目的
增强日志记录,支持结构化 JSON 输出...
[其余内容]
/skill sync
在用户范围和项目范围之间同步技能。
行为:
- 扫描两个范围:
- 用户技能:
${CLAUDE_CONFIG_DIR:-~/.claude}/skills/omc-learned/ - 项目技能:
.omc/skills/
- 用户技能:
- 比较并分类:
- 仅在用户中的技能(不在项目中)
- 仅在项目中的技能(不在用户中)
- 共有的技能(两者都有)
- 显示同步机会:
同步报告:
仅在用户中的技能(5 个):
- error-handler
- api-builder
- custom-logger
- test-generator
- deploy-helper
仅在项目中的技能(2 个):
- test-runner
- backend-scaffold
共有技能(3 个):
- frontend-ui-ux
- git-master
- planner
选项:
[1] 将用户技能复制到项目
[2] 将项目技能复制到用户
[3] 查看差异
[4] 取消
- 处理用户选择:
- 选项 1:选择要复制到项目的技能
- 选项 2:选择要复制到用户的技能
- 选项 3:显示共有技能的并排差异
- 选项 4:退出
安全: 未经确认绝不覆盖
示例:
用户:/skill sync
助手:找到 5 个仅在用户中的技能和 2 个仅在项目中的技能。
将 'error-handler' 从用户复制到项目?(yes/no/skip)
用户:yes
助手:✓ 已将 'error-handler' 复制到 .omc/skills/
将 'api-builder' 从用户复制到项目?(yes/no/skip)
用户:skip
...
/skill setup
用于设置和管理本地技能的交互式向导(原 local-skills-setup)。
行为:
步骤 1:目录检查与设置
首先,检查技能目录是否存在,必要时创建它们:
# 检查并创建用户级技能目录
USER_SKILLS_DIR="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/skills/omc-learned"
if [ -d "$USER_SKILLS_DIR" ]; then
echo "用户技能目录已存在:$USER_SKILLS_DIR"
else
mkdir -p "$USER_SKILLS_DIR"
echo "已创建用户技能目录:$USER_SKILLS_DIR"
fi
# 检查并创建项目级技能目录
PROJECT_SKILLS_DIR=".omc/skills"
if [ -d "$PROJECT_SKILLS_DIR" ]; then
echo "项目技能目录已存在:$PROJECT_SKILLS_DIR"
else
mkdir -p "$PROJECT_SKILLS_DIR"
echo "已创建项目技能目录:$PROJECT_SKILLS_DIR"
fi
步骤 2:技能扫描与清单
扫描两个目录并显示全面的清单:
# 扫描用户级技能
echo "=== 用户级技能 (~/.claude/skills/omc-learned/) ==="
if [ -d "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/skills/omc-learned" ]; then
USER_COUNT=$(find "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/skills/omc-learned" -name "*.md" 2>/dev/null | wc -l)
echo "技能总数:$USER_COUNT"
if [ $USER_COUNT -gt 0 ]; then
echo ""
echo "找到的技能:"
find "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/skills/omc-learned" -name "*.md" -type f -exec sh -c '
FILE="$1"
NAME=$(grep -m1 "^name:" "$FILE" 2>/dev/null | sed "s/name: //")
DESC=$(grep -m1 "^description:" "$FILE" 2>/dev/null | sed "s/description: //")
MODIFIED=$(stat -c "%y" "$FILE" 2>/dev/null || stat -f "%Sm" "$FILE" 2>/dev/null)
echo " - $NAME"
[ -n "$DESC" ] && echo " 描述:$DESC"
echo " 修改时间:$MODIFIED"
echo ""
' sh {} \;
fi
else
echo "目录未找到"
fi
echo ""
echo "=== 项目级技能 (.omc/skills/) ==="
if [ -d ".omc/skills" ]; then
PROJECT_COUNT=$(find ".omc/skills" -name "*.md" 2>/dev/null | wc -l)
echo "技能总数:$PROJECT_COUNT"
if [ $PROJECT_COUNT -gt 0 ]; then
echo ""
echo "找到的技能:"
find ".omc/skills" -name "*.md" -type f -exec sh -c '
FILE="$1"
NAME=$(grep -m1 "^name:" "$FILE" 2>/dev/null | sed "s/name: //")
DESC=$(grep -m1 "^description:" "$FILE" 2>/dev/null | sed "s/description: //")
MODIFIED=$(stat -c "%y" "$FILE" 2>/dev/null || stat -f "%Sm" "$FILE" 2>/dev/null)
echo " - $NAME"
[ -n "$DESC" ] && echo " 描述:$DESC"
echo " 修改时间:$MODIFIED"
echo ""
' sh {} \;
fi
else
echo "目录未找到"
fi
# 汇总
TOTAL=$((USER_COUNT + PROJECT_COUNT))
echo "=== 汇总 ==="
echo "所有目录中的技能总数:$TOTAL"
步骤 3:快速操作菜单
扫描后,使用 AskUserQuestion 工具提供以下选项:
问题:“您想对本地技能做什么?”
选项:
- 添加新技能 - 启动技能创建向导(调用
/skill add) - 列出所有技能及详情 - 显示全面的技能清单(调用
/skill list) - 扫描对话中的模式 - 分析当前对话中值得提取为技能的模式
- 导入技能 - 从 URL 或粘贴内容导入技能
- 完成 - 退出向导
选项 3:扫描对话中的模式
分析当前对话上下文,识别可能值得提取为技能的模式。查找:
- 最近的调试会话,包含非显而易见的解决方案
- 需要调查的棘手错误
- 代码库特定的解决方法
- 需要时间解决的错误模式
报告发现结果,并询问用户是否要将任何内容提取为技能(调用 /skillify;/learner 已弃用但保持兼容)。
选项 4:导入技能
要求用户提供:
- URL:从 URL 下载技能(例如 GitHub gist)
- 粘贴内容:直接粘贴技能 Markdown 内容
然后询问范围:
- 用户级 (~/.claude/skills/omc-learned/) - 所有项目可用
- 项目级 (.omc/skills/) - 仅当前项目
验证技能格式并保存到所选位置。
/skill scan
快速扫描两个技能目录的命令(/skill setup 的子集)。
行为:
仅运行 /skill setup 中步骤 2 的扫描,不包含交互式向导。
技能模板
在通过 /skill add 或 /skill setup 创建技能时,提供常见技能类型的快速模板:
错误解决方案模板
---
id: error-[唯一标识]
name: [错误名称]
description: [特定上下文中特定错误的解决方案]
source: conversation
triggers: ["错误消息片段", "文件路径", "症状"]
quality: high
---
# [错误名称]
## 洞察
此错误的根本原因是什么?您发现了什么原理?
## 为什么重要
如果您不知道这一点,会出什么问题?什么症状导致了这里?
## 识别模式
您如何知道何时适用?有哪些迹象?
- 错误消息:"[确切错误]"
- 文件:[特定文件路径]
- 上下文:[何时发生]
## 解决方案
...
(已截断以进行翻译)