| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- #!/bin/bash
- # ============================================================
- # codebase-memory-mcp 静默安装脚本
- # 功能:安装并配置 stderr 重定向,避免日志刷屏
- # 用法:curl -fsSL https://raw.githubusercontent.com/.../install.sh | bash
- # 然后执行本脚本
- # ============================================================
- set -e
- BIN_DIR="${HOME}/.local/bin"
- WRAPPER="${BIN_DIR}/cbm-mcp-wrapper"
- REAL_BIN="${BIN_DIR}/codebase-memory-mcp.real"
- DEFAULT_BIN="${BIN_DIR}/codebase-memory-mcp"
- LOG_FILE="/tmp/cbm-error.log"
- GREEN='\033[0;32m'
- YELLOW='\033[1;33m'
- NC='\033[0m'
- info() { echo -e "${GREEN}[cbm]${NC} $1"; }
- warn() { echo -e "${YELLOW}[cbm]${NC} $1"; }
- # ------------------------------------------
- # 1. 安装 codebase-memory-mcp(如未安装)
- # ------------------------------------------
- if [ ! -f "$DEFAULT_BIN" ] && [ ! -f "$REAL_BIN" ]; then
- info "正在安装 codebase-memory-mcp..."
- curl -fsSL https://raw.githubusercontent.com/DeusData/codebase-memory-mcp/main/install.sh | bash
- echo ""
- fi
- # ------------------------------------------
- # 2. 备份原始二进制
- # ------------------------------------------
- if [ -f "$DEFAULT_BIN" ] && [ ! -f "$REAL_BIN" ]; then
- info "备份原始二进制 -> ${REAL_BIN}"
- cp "$DEFAULT_BIN" "$REAL_BIN"
- fi
- # ------------------------------------------
- # 3. 创建独立 wrapper(不会被更新覆盖)
- # ------------------------------------------
- info "创建 stderr 重定向 wrapper -> ${WRAPPER}"
- cat >"$WRAPPER" <<'WRAPPER_EOF'
- #!/bin/bash
- # codebase-memory-mcp wrapper — redirect stderr to log file
- # This file is at a dedicated path and won't be overwritten by reinstall
- # NOTE: do NOT use `exec -a "codebase-memory-mcp"` here. Overriding argv[0]
- # breaks the codebase-memory-mcp >= 0.11 daemon rendezvous (the daemon is
- # started with the wrapper's argv[0], then cannot be reached). Plain exec
- # keeps the daemon healthy while still redirecting stderr.
- BIN_DIR="$(cd "$(dirname "$0")" && pwd)"
- exec "${BIN_DIR}/codebase-memory-mcp.real" 2>/tmp/cbm-error.log
- WRAPPER_EOF
- chmod +x "$WRAPPER"
- # ------------------------------------------
- # 4. 恢复原始二进制到默认路径(允许更新覆盖)
- # ------------------------------------------
- if [ -f "$REAL_BIN" ]; then
- info "恢复原始二进制到默认路径"
- cp "$REAL_BIN" "$DEFAULT_BIN"
- fi
- # ------------------------------------------
- # 4.5 清理上游 install.sh 生成的 pi 冲突产物
- # ------------------------------------------
- # 上游 install.sh 会为 pi 生成无 cbm_ 前缀的扩展(extensions/cbmem.ts)、
- # 全局 AGENTS.md 与同名 skill。本项目统一走 npm:pi-codebase-memory-mcp
- # (cbm_* 前缀,与本仓 agent 白名单/文档一致),故移除这些冲突产物。
- # 重复运行本脚本会重新生成,此处每次清理即可;如确需保留上游 pi 集成,
- # 可设置 CBM_KEEP_UPSTREAM_PI=1 跳过。
- PI_DIR="${HOME}/.pi/agent"
- if [ "${CBM_KEEP_UPSTREAM_PI:-0}" = "1" ]; then
- warn "CBM_KEEP_UPSTREAM_PI=1,跳过 pi 冲突产物清理"
- else
- if [ -f "${PI_DIR}/extensions/cbmem.ts" ] && grep -q "codebase-memory-mcp:start" "${PI_DIR}/extensions/cbmem.ts"; then
- info "移除上游 pi 扩展: ${PI_DIR}/extensions/cbmem.ts"
- rm -f "${PI_DIR}/extensions/cbmem.ts"
- rmdir "${PI_DIR}/extensions" 2>/dev/null || true
- fi
- if [ -f "${PI_DIR}/AGENTS.md" ] && grep -q "codebase-memory-mcp:start" "${PI_DIR}/AGENTS.md"; then
- info "移除上游全局 AGENTS.md: ${PI_DIR}/AGENTS.md"
- rm -f "${PI_DIR}/AGENTS.md"
- fi
- if [ -f "${PI_DIR}/skills/codebase-memory/SKILL.md" ] && ! grep -q "cbm_" "${PI_DIR}/skills/codebase-memory/SKILL.md"; then
- info "移除上游 pi skill: ${PI_DIR}/skills/codebase-memory"
- rm -rf "${PI_DIR}/skills/codebase-memory"
- fi
- fi
- # ------------------------------------------
- # 5. 设置 CBM_MCP_BIN 环境变量
- # ------------------------------------------
- ENV_VAR='CBM_MCP_BIN='"${WRAPPER}"
- # 写入 /etc/environment(需 root)
- if [ "$(id -u)" = "0" ]; then
- if ! grep -q "CBM_MCP_BIN" /etc/environment 2>/dev/null; then
- info "写入 /etc/environment(系统级)"
- echo "$ENV_VAR" >>/etc/environment
- else
- warn "/etc/environment 已存在 CBM_MCP_BIN,跳过"
- fi
- else
- warn "非 root 用户,跳过 /etc/environment"
- fi
- # 写入 ~/.bashrc / ~/.zshrc(用户级,兜底;macOS 默认 zsh)
- for RC in "${HOME}/.bashrc" "${HOME}/.zshrc"; do
- [ -e "$RC" ] || continue
- if ! grep -q "CBM_MCP_BIN" "$RC" 2>/dev/null; then
- info "写入 ${RC}"
- echo "export ${ENV_VAR}" >>"$RC"
- else
- warn "${RC} 已存在 CBM_MCP_BIN,跳过"
- fi
- done
- # ------------------------------------------
- # 6. 输出结果
- # ------------------------------------------
- echo ""
- echo "======================================"
- echo " 安装完成"
- echo "======================================"
- echo ""
- echo " 二进制: ${DEFAULT_BIN}"
- echo " 原始备份: ${REAL_BIN}"
- echo " Wrapper: ${WRAPPER}"
- echo " 日志文件: ${LOG_FILE}"
- echo " 环境变量: CBM_MCP_BIN=${WRAPPER}"
- echo ""
- echo " 使用方式:"
- echo " 1. 重启 pi 后自动生效"
- echo " 2. 或立即生效: export CBM_MCP_BIN=${WRAPPER}"
- echo " 3. 查看日志: tail -f ${LOG_FILE}"
- echo ""
- echo "======================================"
|