Skill flagged — suspicious patterns detected

ClawHub Security flagged this skill as suspicious. Review the scan results before using.

openclaw-skill-manager

v3.1.3

管理 OpenClaw 技能安装、查询、更新和自定义空间。支持多空间架构,使用 CLI 查看技能。触发词:管理技能、安装skill、查询skill、更新skill、移动skill、添加skill空间、/skill

0· 122· 5 versions· 0 current· 0 all-time· Updated 1w ago· MIT-0
bychang@liberalchang

Skill Manager

管理 OpenClaw 技能的多空间安装、查询、更新和自定义空间配置。

架构说明

技能空间层级

技能空间层级:
├── 系统内置: <openclaw>/skills              (bundled)
├── 全局:     ~/.openclaw/skills             (managed)
├── 主脑:     ~/.openclaw/workspace/skills   (workspace)
├── 专才:     ~/.openclaw/workspace-shared/skills (extra)
└── 自定义:   用户配置的路径                 (extra)

Source 分类映射

Source分类路径
openclaw-bundled系统内置~/openclaw/skills
openclaw-managed全局~/.openclaw/skills
openclaw-workspace主脑~/.openclaw/workspace/skills
openclaw-extra扩展专才 + 自定义空间

命令工作流

Phase 1: 添加自定义技能空间

输入: 用户请求添加新的技能空间 输出: 配置更新结果

Step 1: 获取当前 Agent 配置

openclaw agents list

解析 Workspace 路径:

openclaw agents list | grep -A1 "Workspace:" | grep "Workspace:" | sed 's/.*Workspace: //' | sort | uniq

向用户展示可选空间:

检测到以下 Agent 工作空间:
1. 主脑空间: ~/.openclaw/workspace
2. 专才空间: ~/.openclaw/workspace-shared (code_expert, content_expert, stock_expert)

请输入要添加的技能空间路径:
(可直接输入序号 1/2,或输入自定义绝对路径)

Step 2: 用户输入处理

  • 输入 1 → 路径=~/.openclaw/workspace/skills
  • 输入 2 → 路径=~/.openclaw/workspace-shared/skills
  • 输入其他路径 → 验证后添加
  • 输入已存在路径 → 提示已存在,跳过

Step 3: 验证路径

# 检查路径是否存在
if [ ! -d "<用户输入路径>" ]; then
  echo "路径不存在,是否创建?(yes/no)"
  # 用户确认后创建
  mkdir -p "<用户输入路径>"
fi

# 检查是否已在配置中
openclaw config get skills.load.extraDirs | grep -q "<用户输入路径>" && echo "已存在,跳过"

Step 4: 用户确认

📝 即将添加技能空间:
   路径: /new/custom/path
   父目录: /new/custom

⚠️  确认添加?(yes/no):

Step 5: 更新配置

修改 ~/.openclaw/openclaw.json

{
  "skills": {
    "load": {
      "extraDirs": [
        "/existing/path",
        "/new/custom/path"
      ],
      "watch": true,
      "watchDebounceMs": 250
    }
  }
}

Step 6: 重启 Gateway

openclaw gateway restart

Step 7: 验证

openclaw config get skills.load.extraDirs
openclaw skills list | grep -c "openclaw-extra"

Step 8: 返回结果

✅ 已添加自定义技能空间: /new/custom/path
🔄 Gateway 已重启
📦 该路径下的技能现在可通过 `openclaw skills list` 查看

Phase 2: 安装技能

输入: 技能名称或地址、目标空间 输出: 安装结果报告

Step 1: 获取可用安装空间

openclaw config get skills.load.extraDirs

分类显示:

可用的安装目标空间:

[1] 全局空间      ~/.openclaw/skills
[2] 主脑空间      ~/.openclaw/workspace/skills      (main)
[3] 专才空间      ~/.openclaw/workspace-shared/skills (code_expert, content_expert, stock_expert)
[4] 自定义空间    /Users/liber/custom-skills

请选择安装目标 (输入序号 1-4):

Step 2: 用户输入技能名称

请输入要安装的技能名称:
(或输入 URL/本地路径进行手动安装)

Step 3: 解析安装源类型

  • 纯名称 (如 stock-market-pro) → clawhub 安装
  • URL (如 https://...) → 手动安装
  • 本地路径 (如 /path/to/skill) → 手动安装

Step 4: 用户确认

📝 即将安装技能:
   名称: stock-market-pro
   方式: clawhub 安装
   目标: 专才空间 (~/.openclaw/workspace-shared/skills)

⚠️  确认安装?(yes/no):

Step 5: 执行安装

方式 A - clawhub:

clawhub install <skill-name> --dir <parent-dir-of-skills>

方式 B - 手动:

# 下载/复制到目标路径
if [[ "<source>" =~ ^https?:// ]]; then
  curl -L "<source>" | tar -xz -C "<target-skills-dir>/"
else
  cp -r "<source>" "<target-skills-dir>/<skill-name>"
fi

# 标记为手动安装
touch "<target-skills-dir>/<skill-name>/.manual-install"

Step 6: 验证安装

# 检查技能是否出现在列表中
openclaw skills list | grep "<skill-name>"

# 检查 SKILL.md 完整性
cat "<target-skills-dir>/<skill-name>/SKILL.md" | grep -E "^(name|description):"

Step 7: 返回结果

成功:

✅ 技能 <skill-name> 已安装到 <space> 空间
📦 来源: clawhub / 手动安装
📍 路径: <full-path>

失败:

❌ 安装失败: <错误信息>
🔧 可能原因:
   1. 网络连接问题
   2. 技能名称拼写错误
   3. 目录权限不足
💡 尝试: clawhub search <keyword> 确认技能名称

Phase 3: 查询技能列表

输入: 查询参数(可选过滤) 输出: 格式化的技能清单

Step 1: 获取 CLI 输出

openclaw skills list 2>&1

CLI 失败时的 fallback:

# 如果 CLI 失败,使用备用方法
if ! openclaw skills list >/dev/null 2>&1; then
  echo "⚠️ CLI 不可用,使用备用扫描..."
  # 扫描配置中的 extraDirs
  for dir in $(openclaw config get skills.load.extraDirs | jq -r '.[]'); do
    ls -1 "$dir" 2>/dev/null
  done
fi

Step 2: 解析 CLI 输出

提取技能信息:

# 提取技能名称、状态、描述、来源
openclaw skills list 2>&1 | awk -F'│' '
NR > 3 && NF >= 5 {
  status = $2
  name = $3
  desc = $4
  source = $5
  
  # 清理空格
  gsub(/^[[:space:]]+|[[:space:]]+$/, "", status)
  gsub(/^[[:space:]]+|[[:space:]]+$/, "", name)
  gsub(/^[[:space:]]+|[[:space:]]+$/, "", desc)
  gsub(/^[[:space:]]+|[[:space:]]+$/, "", source)
  
  # 提取状态
  if (status ~ /✓/) state = "ready"
  else if (status ~ /△/) state = "needs_setup"
  else state = "unknown"
  
  # 提取来源分类
  if (source ~ /bundled/) category = "系统内置"
  else if (source ~ /managed/) category = "全局"
  else if (source ~ /workspace/) category = "主脑"
  else if (source ~ /extra/) category = "扩展"
  else category = "其他"
  
  # 提取描述前50字符
  desc_short = substr(desc, 1, 50)
  if (length(desc) > 50) desc_short = desc_short "..."
  
  print category "|" name "|" state "|" desc_short "|" source
}'

Step 3: 按分类统计

# 统计各分类数量
openclaw skills list 2>&1 | awk -F'│' '
NR > 3 && $5 ~ /bundled/ {bundled++}
NR > 3 && $5 ~ /managed/ {managed++}
NR > 3 && $5 ~ /workspace/ {workspace++}
NR > 3 && $5 ~ /extra/ {extra++}
END {
  print "系统内置:", bundled
  print "全局:", managed
  print "主脑:", workspace
  print "扩展:", extra
}'

Step 4: 格式化输出

完整列表格式:

## 技能清单

### 系统内置技能 (X个)

| 技能 | 状态 | 用途 |
|------|------|------|
| 🔐 1password | ✅ ready | 1Password CLI 设置使用 |
| 📝 apple-notes | ✅ ready | Apple Notes 管理 |
| ... | ... | ... |

### 全局技能 (X个)

| 技能 | 状态 | 用途 |
|------|------|------|
| 📦 ragflow | ✅ ready | RAG 操作客户端 |
| ... | ... | ... |

### 主脑技能 (X个) - main

| 技能 | 状态 | 用途 |
|------|------|------|
| 📦 darwin-skill | ✅ ready | Skill 自动优化 |
| ... | ... | ... |

### 扩展技能 (X个)

| 技能 | 状态 | 来源 | 用途 |
|------|------|------|------|
| 📦 stock-market-pro | ✅ ready | workspace-shared | 股票市场分析 |
| ... | ... | ... | ... |

**总计:X 个技能(Y 个就绪可用)**

中文用途提取规则:

  1. 从 CLI 输出的 Description 列提取
  2. 截取前 50 个字符或第一个句号/逗号前的内容
  3. 转换为简洁中文描述(不超过 10 字)

Phase 4: 更新技能

输入: 技能名称 或 --all 标志 输出: 更新结果报告

Step 1: 定位技能

openclaw skills list | grep "<skill-name>"

Step 2: 检查安装类型

# 查找技能路径
skill_path=$(openclaw skills list 2>&1 | awk -F'│' -v name="<skill-name>" '
$3 ~ name {print $5}' | head -1)

# 检查是否为手动安装
if [ -f "$skill_path/<skill-name>/.manual-install" ]; then
  echo "手动安装"
else
  echo "clawhub 安装"
fi

Step 3: 用户确认

📝 即将更新技能:
   名称: <skill-name>
   当前版本: <version>
   来源: clawhub / 手动安装

⚠️  确认更新?(yes/no):

Step 4: 执行更新

clawhub:

# 备份当前版本
cp -r "<skill-path>" "<skill-path>.backup.$(date +%Y%m%d%H%M%S)"

# 执行更新
clawhub update <skill-name> --dir <parent-dir-of-skill>

手动安装:

⚠️ 技能 <skill-name> 为手动安装,无法自动更新
💡 更新选项:
   1. 使用 `/skill update <name> --force` 强制重新下载
   2. 使用 `/skill install <new-url> --manual` 重新安装
   3. 手动删除后重新安装

Step 5: 返回结果

✅ 技能 <name> 已更新至最新版本
📦 来源: clawhub
📍 路径: <full-path>

Phase 5: 移动技能

输入: 技能名称、目标空间 输出: 移动确认和结果

Step 1: 定位技能

# 获取技能当前路径
source_path=$(openclaw skills list 2>&1 | awk -F'│' -v name="<skill-name>" '
$3 ~ name {
  gsub(/^[[:space:]]+|[[:space:]]+$/, "", $5)
  print $5
}' | head -1)

Step 2: 验证目标空间

# 检查目标空间是否在配置中
openclaw config get skills.load.extraDirs | grep -q "<target-path>" || echo "❌ 目标空间未配置"

# 检查是否有同名技能
ls "<target-path>/<skill-name>" 2>/dev/null && echo "⚠️  目标空间已存在同名技能"

Step 3: 用户确认

📝 即将移动技能:
   技能: <skill-name>
   从: <source-path>
   到: <target-path>

⚠️  移动后原位置将备份,确认移动?(yes/no):

Step 4: 执行移动

# 备份原位置
mv "<source-path>" "<source-path>.backup.$(date +%Y%m%d%H%M%S)"

# 复制到新位置
cp -r "<source-path>.backup.*" "<target-path>/<skill-name>"

# 验证
ls "<target-path>/<skill-name>/SKILL.md"

Step 5: 返回结果

✅ 技能 <name> 已移动到 <space> 空间
📍 新路径: <target-path>
🗂️  备份: <source-path>.backup.<timestamp>

安装路径映射

空间类型配置路径安装命令
全局~/.openclaw/skillsclawhub install X --dir ~/.openclaw/skills
主脑~/.openclaw/workspace/skillsclawhub install X --dir ~/.openclaw/workspace/skills
专才~/.openclaw/workspace-shared/skillsclawhub install X --dir ~/.openclaw/workspace-shared/skills
自定义用户配置的路径clawhub install X --dir <parent-dir-of-skills>

异常处理

CLI 命令失败

触发: openclaw skills list 执行失败或超时 检测: 命令返回非零退出码 处理:

# Fallback 到配置扫描
for dir in $(openclaw config get skills.load.extraDirs 2>/dev/null | jq -r '.[]' 2>/dev/null); do
  if [ -d "$dir" ]; then
    ls -1 "$dir" 2>/dev/null | while read skill; do
      echo "│ unknown │ $skill │ (fallback scan) │ openclaw-extra │"
    done
  fi
done

空间未配置

触发: 用户尝试安装到未配置的空间 处理:

❌ 空间 <path> 未在配置中
💡 请先添加该空间:/skill add-space
   或选择已配置的空间安装

手动安装技能更新

触发: 用户尝试更新手动安装的技能 处理:

⚠️ 技能 <name> 为手动安装,无法自动更新
📦 原始来源: <url-or-path>
💡 更新选项:
   1. 使用 `/skill update <name> --force` 强制重新下载
   2. 使用 `/skill install <new-url> --manual` 重新安装
   3. 手动删除后重新安装

路径不存在

触发: 添加空间时路径不存在 处理:

⚠️ 路径 <path> 不存在
💡 是否创建该目录?(yes/no)

注意事项

  • 添加自定义空间后需要重启 Gateway 生效
  • 手动安装的技能不会自动更新(创建 .manual-install 标记)
  • 移动技能前会自动备份原位置
  • 关键操作前均有用户确认提示
  • CLI 失败时有 fallback 扫描机制

测试验证

测试 Prompt 1: 添加自定义空间

添加一个新的技能空间 /Users/liber/custom-skills

期望: 提示确认 → 更新配置 → 重启 Gateway → 验证

测试 Prompt 2: 安装技能到指定空间

安装 stock-market-pro 到专才空间

期望: 显示可用空间 → 用户选择 → 确认 → clawhub 安装 → 验证

测试 Prompt 3: 查看技能列表

/skill list

期望: 按分类显示所有技能,包含状态、来源、用途

测试 Prompt 4: CLI 失败 fallback

当 openclaw skills list 失败时,使用备用扫描

期望: 检测到 CLI 失败 → 扫描 extraDirs → 显示结果

Version tags

latestvk9719ec2pmt1af1jt0s31fq5px851ksm