#!/usr/bin/env bash # install-hermes.sh · v3.6.1 # # UZI-Skill 一键 Hermes 安装脚本(绕过 Skills Guard 假阳性) # # 背景:Hermes Skills Guard 是模式匹配扫描器(issue #1006 已知 bug)· # 会把 os.environ.get(...) 当作"exfiltration" · subprocess.run([...]) 当作"execution" · # 即使是 cloudflared 这类用户 opt-in 的合法功能也会被判 DANGEROUS · --force 也覆盖不了. # # 本脚本绕过 Hub 的 quarantine 扫描 · 直接 clone + symlink 到 ~/.hermes/skills/ · # 不经过 `hermes skills install` · 但完全等价 (Hermes 跑时只看目录 layout). # # 用法: # curl -fsSL https://raw.githubusercontent.com/wbh604/UZI-Skill/main/install-hermes.sh | bash # # 或下载后跑: # bash install-hermes.sh # 默认装到 ~/UZI-Skill # bash install-hermes.sh /opt/uzi-skill # 自定义 clone 路径 # set -euo pipefail REPO_URL="${UZI_REPO_URL:-https://github.com/wbh604/UZI-Skill.git}" CLONE_DIR="${1:-$HOME/UZI-Skill}" HERMES_HOME="${HERMES_HOME:-$HOME/.hermes}" HERMES_SKILLS_DIR="$HERMES_HOME/skills" SKILLS=(deep-analysis investor-panel lhb-analyzer trap-detector) echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "🛠 UZI-Skill · Hermes 一键安装(绕过 Skills Guard)" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo " Repo: $REPO_URL" echo " Clone → $CLONE_DIR" echo " Hermes: $HERMES_HOME" echo " Skills: ${SKILLS[*]}" echo "" # v3.6.2 · issue #69 · 启动先做 Python 版本预检 + pip 探测 # 缺 pip 不该静默失败 · 提前断言给清晰指引 echo "🐍 检查 Python 环境..." PY_BIN="" for cand in python3 python; do if command -v "$cand" >/dev/null 2>&1; then PY_BIN="$cand" break fi done if [ -z "$PY_BIN" ]; then echo "❌ 未检测到 python3 / python · 请先装 Python ≥3.10" echo " Ubuntu/Debian: sudo apt install python3 python3-pip python3-venv" echo " CentOS/RHEL: sudo yum install python3 python3-pip" echo " macOS: brew install python@3.12" exit 3 fi PY_VER=$("$PY_BIN" -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")') echo " Python: $PY_BIN ($PY_VER)" # akshare ≥1.14 要 Python ≥3.10 · 3.9 之前的版本会报 invalid syntax (PEP 604 联合类型) if "$PY_BIN" -c 'import sys; sys.exit(0 if sys.version_info >= (3, 10) else 1)'; then : # OK else echo "⚠️ Python $PY_VER 偏低 · 建议 ≥3.10(akshare ≥1.14 / 我们的代码用了 PEP 604 联合类型)" echo " 继续装的话 akshare / 部分 fetcher 可能不工作" fi # 1) 先检查 Hermes 装了没 if [ ! -d "$HERMES_HOME" ]; then echo "❌ 未检测到 Hermes 安装目录 $HERMES_HOME" echo " 请先装 Hermes: https://hermes-agent.nousresearch.com/docs/quickstart" exit 2 fi # 2) clone 或 pull if [ -d "$CLONE_DIR/.git" ]; then echo "♻️ $CLONE_DIR 已存在 · pull 更新到最新" git -C "$CLONE_DIR" fetch --all --quiet git -C "$CLONE_DIR" pull --ff-only --quiet else echo "📥 git clone $REPO_URL → $CLONE_DIR" git clone --depth 1 "$REPO_URL" "$CLONE_DIR" fi # 3) 卸载旧 Hub 版本(如果之前用 hermes skills install 装过) mkdir -p "$HERMES_SKILLS_DIR" echo "" echo "🧹 清理旧版(如有)..." for s in "${SKILLS[@]}"; do target="$HERMES_SKILLS_DIR/$s" if [ -L "$target" ] || [ -e "$target" ]; then rm -rf "$target" echo " ✗ 删除 $target" fi done # 4) symlink echo "" echo "🔗 创建 symlink..." for s in "${SKILLS[@]}"; do src="$CLONE_DIR/skills/$s" target="$HERMES_SKILLS_DIR/$s" if [ ! -d "$src" ]; then echo " ⚠️ $src 不存在 · 跳过" continue fi ln -sfn "$src" "$target" echo " ✓ $target → $src" done # 5) 装 Python 依赖到 Hermes venv # v3.6.2 · issue #69 · pip 探测级联 (venv → pip → pip3 → python -m pip) · # 缺 plain pip 的 Linux (常见!) 现在也能装 echo "" echo "📦 安装 Python 依赖..." REQ_FILE="$CLONE_DIR/requirements.txt" # 5a) 优先 Hermes venv pip(隔离 · 干净) PIP_CMD="" for cand in "$HERMES_HOME/venv/bin/pip" "$HERMES_HOME/.venv/bin/pip"; do if [ -x "$cand" ]; then PIP_CMD="$cand" break fi done # 5b) 没有 venv pip · 回退到系统 pip / pip3 / python -m pip 级联 if [ -z "$PIP_CMD" ]; then echo " ⚠️ 未找到 Hermes venv pip · 探测系统 pip..." for cand in pip pip3; do if command -v "$cand" >/dev/null 2>&1; then PIP_CMD="$cand" echo " ✓ 找到 $cand" break fi done fi # 5c) 还没有 · 走 python -m pip (Linux 上最稳的兜底) if [ -z "$PIP_CMD" ]; then if "$PY_BIN" -m pip --version >/dev/null 2>&1; then PIP_CMD="$PY_BIN -m pip" echo " ✓ 用 $PY_BIN -m pip (兜底)" fi fi # 5d) 全部探测失败 · 提示用户先装 pip · 不静默 failure if [ -z "$PIP_CMD" ]; then echo " ❌ 完全找不到 pip · 请先装 pip 再重跑此脚本" echo " Ubuntu/Debian: sudo apt install python3-pip" echo " CentOS/RHEL: sudo yum install python3-pip" echo " macOS: python3 -m ensurepip --upgrade" echo " 或全局装: curl https://bootstrap.pypa.io/get-pip.py | $PY_BIN" exit 4 fi echo " pip = $PIP_CMD" # 不加 --quiet · 让用户看到进度(akshare 装包慢 · 静默会显得卡死) if ! $PIP_CMD install -r "$REQ_FILE"; then echo "" echo " ❌ pip install 失败 · 可能原因:" echo " 1. Python 版本太低(需 ≥3.10 · 当前 $PY_VER)" echo " 2. 网络受限 · 试加镜像源:" echo " $PIP_CMD install -r $REQ_FILE -i https://pypi.tuna.tsinghua.edu.cn/simple" echo " 3. 系统 pip 太老 · 升级一下:" echo " $PIP_CMD install --upgrade pip" exit 5 fi # 6) 验证 echo "" echo "🔍 验证..." for s in "${SKILLS[@]}"; do if [ -f "$HERMES_SKILLS_DIR/$s/SKILL.md" ]; then ver=$(grep -m1 '^version:' "$HERMES_SKILLS_DIR/$s/SKILL.md" | awk '{print $2}') echo " ✓ $s · v$ver" else echo " ✗ $s · SKILL.md 缺失" fi done echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "✅ 安装完成!" echo "" echo "下一步:" echo " 1. 启动 Hermes: hermes" echo " 2. 列出 skills: /skills (应见 4 个 UZI skill)" echo " 3. 触发分析: 直接用自然语言说「分析 600519.SH」或「深度分析 贵州茅台」" echo " → 自动触发 deep-analysis skill" echo "" echo " ⚠️ 注意:/analyze-stock 是 Claude Code 的 slash 命令 · Hermes 不支持" echo " (Hermes 只认 SKILL.md skill · 靠自然语言描述触发 · 不是 /命令)" echo "" echo "如有问题:https://github.com/wbh604/UZI-Skill/issues" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"