++
This commit is contained in:
+159
@@ -0,0 +1,159 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user