|
|
import os
|
|
|
import shutil
|
|
|
import sys
|
|
|
import subprocess
|
|
|
from pathlib import Path
|
|
|
import importlib.util
|
|
|
|
|
|
def install_package():
|
|
|
print("正在安装/更新 cnhkmcp 包...")
|
|
|
try:
|
|
|
subprocess.check_call([sys.executable, "-m", "pip", "install", "-U", "cnhkmcp"])
|
|
|
except subprocess.CalledProcessError as e:
|
|
|
print(f"安装失败: {e}")
|
|
|
sys.exit(1)
|
|
|
|
|
|
def get_package_path(package_name):
|
|
|
# 重新加载 finder 以防刚安装完
|
|
|
importlib.invalidate_caches()
|
|
|
spec = importlib.util.find_spec(package_name)
|
|
|
if spec and spec.origin:
|
|
|
return Path(spec.origin).parent
|
|
|
return None
|
|
|
|
|
|
def main():
|
|
|
# 1. Install CNHKMCP
|
|
|
install_package()
|
|
|
|
|
|
# 2. Locate the package
|
|
|
pkg_path = get_package_path("cnhkmcp")
|
|
|
if not pkg_path:
|
|
|
# Fallback: try site-packages directly if spec fails
|
|
|
import site
|
|
|
for site_pkg in site.getsitepackages():
|
|
|
potential_path = Path(site_pkg) / "cnhkmcp"
|
|
|
if potential_path.exists():
|
|
|
pkg_path = potential_path
|
|
|
break
|
|
|
|
|
|
if not pkg_path:
|
|
|
print("错误: 无法找到 cnhkmcp 包安装路径。")
|
|
|
sys.exit(1)
|
|
|
|
|
|
print(f"cnhkmcp 安装位置: {pkg_path}")
|
|
|
|
|
|
# 3. Locate 'untracked' folder
|
|
|
untracked_dir = pkg_path / "untracked"
|
|
|
if not untracked_dir.exists():
|
|
|
print(f"错误: 在 {pkg_path} 中未找到 'untracked' 文件夹")
|
|
|
sys.exit(1)
|
|
|
|
|
|
# 4. Copy Files
|
|
|
files_to_copy = [
|
|
|
"forum_functions.py",
|
|
|
"platform_functions.py",
|
|
|
"配置前运行我_安装必要依赖包.py",
|
|
|
"brain-consultant.md"
|
|
|
]
|
|
|
|
|
|
# Copy to current directory
|
|
|
target_dir = Path.cwd()
|
|
|
print(f"正在将文件复制到: {target_dir}")
|
|
|
|
|
|
for filename in files_to_copy:
|
|
|
src = untracked_dir / filename
|
|
|
dst = target_dir / filename
|
|
|
|
|
|
if src.exists():
|
|
|
shutil.copy2(src, dst)
|
|
|
print(f"✅ 已复制: {filename}")
|
|
|
else:
|
|
|
print(f"⚠️ 警告: 源文件未找到: {filename}")
|
|
|
|
|
|
# 4.1 Copy entire 'untracked' folder to current directory for reference
|
|
|
target_untracked_dir = target_dir / "untracked"
|
|
|
print(f"\n正在将整个 untracked 文件夹复制到: {target_untracked_dir}")
|
|
|
try:
|
|
|
shutil.copytree(untracked_dir, target_untracked_dir, dirs_exist_ok=True)
|
|
|
print(f"✅ untracked 文件夹已完整复制到当前目录!")
|
|
|
except Exception as e:
|
|
|
print(f"❌ 复制 untracked 文件夹失败: {e}")
|
|
|
|
|
|
# 4.5 Copy 'skills' folder to user home .claude dir
|
|
|
src_skills = untracked_dir / "skills"
|
|
|
# Destination: ~/.claude/skills
|
|
|
dst_skills = Path.home() / ".claude" / "skills"
|
|
|
|
|
|
if src_skills.exists() and src_skills.is_dir():
|
|
|
print(f"\n正在将 skills 文件夹复制到: {dst_skills}")
|
|
|
try:
|
|
|
# Ensure parent .claude dir exists
|
|
|
if not dst_skills.parent.exists():
|
|
|
dst_skills.parent.mkdir(parents=True, exist_ok=True)
|
|
|
|
|
|
# Copy recursively
|
|
|
shutil.copytree(src_skills, dst_skills, dirs_exist_ok=True)
|
|
|
print(f"✅ Skills 文件夹已同步成功!")
|
|
|
except Exception as e:
|
|
|
print(f"❌ 复制 Skills 文件夹失败: {e}")
|
|
|
else:
|
|
|
print(f"\n(未在源包中找到 'skills' 文件夹,本次跳过复制)")
|
|
|
|
|
|
# 4.6 Move 'settings.json' to .claude folder (Config for Claude Code)
|
|
|
settings_file = target_dir / "settings.json"
|
|
|
dst_claude_dir = Path.home() / ".claude"
|
|
|
dst_settings = dst_claude_dir / "settings.json"
|
|
|
|
|
|
if settings_file.exists():
|
|
|
print(f"\n正在将 settings.json 移动(剪切)到: {dst_claude_dir}")
|
|
|
try:
|
|
|
if not dst_claude_dir.exists():
|
|
|
dst_claude_dir.mkdir(parents=True, exist_ok=True)
|
|
|
|
|
|
if dst_settings.exists():
|
|
|
print(f"⚠️ 目标路径已存在同名文件,将被覆盖: {dst_settings}")
|
|
|
dst_settings.unlink()
|
|
|
|
|
|
shutil.move(str(settings_file), str(dst_settings))
|
|
|
print(f"✅ settings.json 已成功移动到 .claude 目录")
|
|
|
except Exception as e:
|
|
|
print(f"❌ 移动 settings.json 失败: {e}")
|
|
|
|
|
|
# 4.7 Move 'hooks' folder to .claude folder
|
|
|
hooks_src = target_dir / "hooks"
|
|
|
dst_hooks = dst_claude_dir / "hooks"
|
|
|
|
|
|
if hooks_src.exists() and hooks_src.is_dir():
|
|
|
print(f"\n正在将 hooks 文件夹移动(剪切)到: {dst_claude_dir}")
|
|
|
try:
|
|
|
if not dst_claude_dir.exists():
|
|
|
dst_claude_dir.mkdir(parents=True, exist_ok=True)
|
|
|
|
|
|
if dst_hooks.exists():
|
|
|
print(f"⚠️ 目标路径已存在 hooks 文件夹,将被移除以进行覆盖...")
|
|
|
shutil.rmtree(dst_hooks)
|
|
|
|
|
|
shutil.move(str(hooks_src), str(dst_hooks))
|
|
|
print(f"✅ hooks 文件夹已成功移动到 .claude 目录")
|
|
|
except Exception as e:
|
|
|
print(f"❌ 移动 hooks 文件夹失败: {e}")
|
|
|
|
|
|
print("\n所有文件更新完成!")
|
|
|
|
|
|
# 5. Execute the dependency installer script
|
|
|
installer_script = "配置前运行我_安装必要依赖包.py"
|
|
|
if (target_dir / installer_script).exists():
|
|
|
print(f"\n正在运行依赖安装脚本: {installer_script} ...")
|
|
|
sys.stdout.flush()
|
|
|
try:
|
|
|
# Use same python executable to run the installer script
|
|
|
subprocess.check_call([sys.executable, str(target_dir / installer_script)])
|
|
|
print("✅ 依赖安装脚本执行成功!")
|
|
|
except subprocess.CalledProcessError as e:
|
|
|
print(f"❌ 依赖安装脚本执行失败: {e}")
|
|
|
sys.exit(1)
|
|
|
else:
|
|
|
print(f"⚠️ 未找到 {installer_script},跳过依赖安装。")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
main()
|
|
|
|