tool-cbm-quiet.sh 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #!/bin/bash
  2. # ============================================================
  3. # codebase-memory-mcp 静默安装脚本
  4. # 功能:安装并配置 stderr 重定向,避免日志刷屏
  5. # 用法:curl -fsSL https://raw.githubusercontent.com/.../install.sh | bash
  6. # 然后执行本脚本
  7. # ============================================================
  8. set -e
  9. BIN_DIR="${HOME}/.local/bin"
  10. WRAPPER="${BIN_DIR}/cbm-mcp-wrapper"
  11. REAL_BIN="${BIN_DIR}/codebase-memory-mcp.real"
  12. DEFAULT_BIN="${BIN_DIR}/codebase-memory-mcp"
  13. LOG_FILE="/tmp/cbm-error.log"
  14. GREEN='\033[0;32m'
  15. YELLOW='\033[1;33m'
  16. NC='\033[0m'
  17. info() { echo -e "${GREEN}[cbm]${NC} $1"; }
  18. warn() { echo -e "${YELLOW}[cbm]${NC} $1"; }
  19. # ------------------------------------------
  20. # 1. 安装 codebase-memory-mcp(如未安装)
  21. # ------------------------------------------
  22. if [ ! -f "$DEFAULT_BIN" ] && [ ! -f "$REAL_BIN" ]; then
  23. info "正在安装 codebase-memory-mcp..."
  24. curl -fsSL https://raw.githubusercontent.com/DeusData/codebase-memory-mcp/main/install.sh | bash
  25. echo ""
  26. fi
  27. # ------------------------------------------
  28. # 2. 备份原始二进制
  29. # ------------------------------------------
  30. if [ -f "$DEFAULT_BIN" ] && [ ! -f "$REAL_BIN" ]; then
  31. info "备份原始二进制 -> ${REAL_BIN}"
  32. cp "$DEFAULT_BIN" "$REAL_BIN"
  33. fi
  34. # ------------------------------------------
  35. # 3. 创建独立 wrapper(不会被更新覆盖)
  36. # ------------------------------------------
  37. info "创建 stderr 重定向 wrapper -> ${WRAPPER}"
  38. cat >"$WRAPPER" <<'WRAPPER_EOF'
  39. #!/bin/bash
  40. # codebase-memory-mcp wrapper — redirect stderr to log file
  41. # This file is at a dedicated path and won't be overwritten by reinstall
  42. # NOTE: do NOT use `exec -a "codebase-memory-mcp"` here. Overriding argv[0]
  43. # breaks the codebase-memory-mcp >= 0.11 daemon rendezvous (the daemon is
  44. # started with the wrapper's argv[0], then cannot be reached). Plain exec
  45. # keeps the daemon healthy while still redirecting stderr.
  46. BIN_DIR="$(cd "$(dirname "$0")" && pwd)"
  47. exec "${BIN_DIR}/codebase-memory-mcp.real" 2>/tmp/cbm-error.log
  48. WRAPPER_EOF
  49. chmod +x "$WRAPPER"
  50. # ------------------------------------------
  51. # 4. 恢复原始二进制到默认路径(允许更新覆盖)
  52. # ------------------------------------------
  53. if [ -f "$REAL_BIN" ]; then
  54. info "恢复原始二进制到默认路径"
  55. cp "$REAL_BIN" "$DEFAULT_BIN"
  56. fi
  57. # ------------------------------------------
  58. # 4.5 清理上游 install.sh 生成的 pi 冲突产物
  59. # ------------------------------------------
  60. # 上游 install.sh 会为 pi 生成无 cbm_ 前缀的扩展(extensions/cbmem.ts)、
  61. # 全局 AGENTS.md 与同名 skill。本项目统一走 npm:pi-codebase-memory-mcp
  62. # (cbm_* 前缀,与本仓 agent 白名单/文档一致),故移除这些冲突产物。
  63. # 重复运行本脚本会重新生成,此处每次清理即可;如确需保留上游 pi 集成,
  64. # 可设置 CBM_KEEP_UPSTREAM_PI=1 跳过。
  65. PI_DIR="${HOME}/.pi/agent"
  66. if [ "${CBM_KEEP_UPSTREAM_PI:-0}" = "1" ]; then
  67. warn "CBM_KEEP_UPSTREAM_PI=1,跳过 pi 冲突产物清理"
  68. else
  69. if [ -f "${PI_DIR}/extensions/cbmem.ts" ] && grep -q "codebase-memory-mcp:start" "${PI_DIR}/extensions/cbmem.ts"; then
  70. info "移除上游 pi 扩展: ${PI_DIR}/extensions/cbmem.ts"
  71. rm -f "${PI_DIR}/extensions/cbmem.ts"
  72. rmdir "${PI_DIR}/extensions" 2>/dev/null || true
  73. fi
  74. if [ -f "${PI_DIR}/AGENTS.md" ] && grep -q "codebase-memory-mcp:start" "${PI_DIR}/AGENTS.md"; then
  75. info "移除上游全局 AGENTS.md: ${PI_DIR}/AGENTS.md"
  76. rm -f "${PI_DIR}/AGENTS.md"
  77. fi
  78. if [ -f "${PI_DIR}/skills/codebase-memory/SKILL.md" ] && ! grep -q "cbm_" "${PI_DIR}/skills/codebase-memory/SKILL.md"; then
  79. info "移除上游 pi skill: ${PI_DIR}/skills/codebase-memory"
  80. rm -rf "${PI_DIR}/skills/codebase-memory"
  81. fi
  82. fi
  83. # ------------------------------------------
  84. # 5. 设置 CBM_MCP_BIN 环境变量
  85. # ------------------------------------------
  86. ENV_VAR='CBM_MCP_BIN='"${WRAPPER}"
  87. # 写入 /etc/environment(需 root)
  88. if [ "$(id -u)" = "0" ]; then
  89. if ! grep -q "CBM_MCP_BIN" /etc/environment 2>/dev/null; then
  90. info "写入 /etc/environment(系统级)"
  91. echo "$ENV_VAR" >>/etc/environment
  92. else
  93. warn "/etc/environment 已存在 CBM_MCP_BIN,跳过"
  94. fi
  95. else
  96. warn "非 root 用户,跳过 /etc/environment"
  97. fi
  98. # 写入 ~/.bashrc / ~/.zshrc(用户级,兜底;macOS 默认 zsh)
  99. for RC in "${HOME}/.bashrc" "${HOME}/.zshrc"; do
  100. [ -e "$RC" ] || continue
  101. if ! grep -q "CBM_MCP_BIN" "$RC" 2>/dev/null; then
  102. info "写入 ${RC}"
  103. echo "export ${ENV_VAR}" >>"$RC"
  104. else
  105. warn "${RC} 已存在 CBM_MCP_BIN,跳过"
  106. fi
  107. done
  108. # ------------------------------------------
  109. # 6. 输出结果
  110. # ------------------------------------------
  111. echo ""
  112. echo "======================================"
  113. echo " 安装完成"
  114. echo "======================================"
  115. echo ""
  116. echo " 二进制: ${DEFAULT_BIN}"
  117. echo " 原始备份: ${REAL_BIN}"
  118. echo " Wrapper: ${WRAPPER}"
  119. echo " 日志文件: ${LOG_FILE}"
  120. echo " 环境变量: CBM_MCP_BIN=${WRAPPER}"
  121. echo ""
  122. echo " 使用方式:"
  123. echo " 1. 重启 pi 后自动生效"
  124. echo " 2. 或立即生效: export CBM_MCP_BIN=${WRAPPER}"
  125. echo " 3. 查看日志: tail -f ${LOG_FILE}"
  126. echo ""
  127. echo "======================================"