"""路径与 Agent 目标定义。""" from __future__ import annotations from pathlib import Path HOME = Path.home() SKILLS_HOME = HOME / ".skills" SKILLS_DIR = SKILLS_HOME / "skills" TEMPLATE_DIR = SKILLS_DIR / "_template" DRAFTS_DIR = SKILLS_HOME / ".drafts" CATALOG_FILE = SKILLS_HOME / "catalog.yaml" LEGACY_REGISTRY_FILE = SKILLS_HOME / "registry.yaml" CATALOG_CACHE_DIR = HOME / ".local" / "share" / "skills" / "externals" CONFIG_FILE = HOME / ".config" / "skiff" / "config.yaml" SOURCES_DIR = HOME / ".local" / "share" / "skiff" / "sources" PROJECT_MANIFEST = ".skills.yaml" AGENT_GLOBAL: dict[str, Path] = { "cursor": HOME / ".cursor" / "skills", "claude": HOME / ".claude" / "skills", "codex": HOME / ".codex" / "skills", # agents 标准目录:OMP 原生 canonical(agents provider),cursor/codex 项目级同路径 "agents": HOME / ".agents" / "skills", } AGENT_PROJECT: dict[str, str] = { "cursor": ".agents/skills", "claude": ".claude/skills", "codex": ".agents/skills", # 与 cursor/codex 共用 .agents/skills;软链幂等,同路径只写一次 "agents": ".agents/skills", } ALL_TARGETS = ("cursor", "claude", "codex", "agents") def resolve_targets(target: str | None) -> list[str]: if target is None or target == "all": return list(ALL_TARGETS) if target not in ALL_TARGETS: raise ValueError(f"未知 target: {target!r},可选: {', '.join(ALL_TARGETS)}, all") return [target] def agent_skill_dir(target: str, *, project_root: Path | None = None) -> Path: if project_root is None: return AGENT_GLOBAL[target] return project_root / AGENT_PROJECT[target] def ensure_skills_home() -> None: if not SKILLS_HOME.is_dir(): raise SystemExit( "~/.skills 不存在。请将 skills 仓库克隆到 ~/.skills" )