from __future__ import annotations import zipfile from pathlib import Path from xhs_bridge.config import load_config ZIP_NAME = "XHS-Bridge-extension.zip" def extension_source_dir() -> Path: return load_config().skills.extension_dir() def create_extension_zip(dest_path: Path) -> Path: """将 extension 目录打包为 zip,供用户在 Chrome 中「加载已解压的扩展」。""" ext_dir = extension_source_dir() if not ext_dir.is_dir(): raise FileNotFoundError(f"扩展目录不存在:{ext_dir}") dest = dest_path.resolve() if dest.suffix.lower() != ".zip": dest = dest.with_suffix(".zip") dest.parent.mkdir(parents=True, exist_ok=True) with zipfile.ZipFile(dest, "w", zipfile.ZIP_DEFLATED) as zf: for file_path in sorted(ext_dir.rglob("*")): if not file_path.is_file(): continue arcname = file_path.relative_to(ext_dir).as_posix() zf.write(file_path, arcname) if not dest.is_file() or dest.stat().st_size == 0: raise OSError("打包失败:生成的 zip 为空") return dest