#!/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 "======================================"