""" JIANGCHANG_* 数据根与用户目录:解析规则 + 可选本地 CLI 默认值。 模板复制后通常无需大改;如组织环境不同,再按项目实际调整。 """ from __future__ import annotations import os import sys CLI_LOCAL_DEV_ENABLED = True DEFAULT_LOCAL_USER_ID = "10032" WIN_DEFAULT_DATA_ROOT = r"D:\jiangchang-data" WIN_DEFAULT_JIANGCHANG_APP_ROOT = r"D:\AI\jiangchang" def platform_default_data_root() -> str: if sys.platform == "win32": return WIN_DEFAULT_DATA_ROOT return os.path.join(os.path.expanduser("~"), ".jiangchang-data") def get_data_root() -> str: env = ( os.getenv("CLAW_DATA_ROOT") or os.getenv("JIANGCHANG_DATA_ROOT") or "" ).strip() if env: return env return platform_default_data_root() def get_user_id() -> str: return ( os.getenv("CLAW_USER_ID") or os.getenv("JIANGCHANG_USER_ID") or "" ).strip() or "_anon" def _looks_like_skills_root(path: str) -> bool: if not path or not os.path.isdir(path): return False for marker in ( "llm-manager", "content-manager", "account-manager", "sohu-publisher", "toutiao-publisher", "gongzhonghao-publisher", "weibo-publisher", "skill-template", ): if os.path.isdir(os.path.join(path, marker)): return True return False def get_skills_root() -> str: for key in ("JIANGCHANG_SKILLS_ROOT", "CLAW_SKILLS_ROOT"): v = (os.getenv(key) or "").strip() if v: return os.path.normpath(v) app = (os.getenv("JIANGCHANG_APP_ROOT") or "").strip() if sys.platform == "win32" and not app: app = WIN_DEFAULT_JIANGCHANG_APP_ROOT if app: nested = os.path.join(app, "skills") if _looks_like_skills_root(nested): return os.path.normpath(nested) if _looks_like_skills_root(app): return os.path.normpath(app) if sys.platform == "win32": nested = os.path.join(WIN_DEFAULT_JIANGCHANG_APP_ROOT, "skills") if _looks_like_skills_root(nested): return os.path.normpath(nested) if _looks_like_skills_root(WIN_DEFAULT_JIANGCHANG_APP_ROOT): return os.path.normpath(WIN_DEFAULT_JIANGCHANG_APP_ROOT) return os.path.normpath(os.path.join(os.path.expanduser("~"), ".openclaw", "skills")) def get_sibling_skills_root(skill_scripts_dir: str | None = None) -> str: if skill_scripts_dir: scripts = os.path.abspath(skill_scripts_dir) skill_root = os.path.dirname(scripts) inferred = os.path.dirname(skill_root) if _looks_like_skills_root(inferred): return os.path.normpath(inferred) for key in ("JIANGCHANG_SKILLS_ROOT", "CLAW_SKILLS_ROOT"): v = (os.getenv(key) or "").strip() if v: return os.path.normpath(v) return get_skills_root() def apply_cli_local_defaults() -> None: enabled = CLI_LOCAL_DEV_ENABLED if not enabled: v = (os.getenv("JIANGCHANG_CLI_LOCAL_DEV") or "").strip().lower() enabled = v in ("1", "true", "yes", "on") if not enabled: return if not (os.getenv("CLAW_DATA_ROOT") or os.getenv("JIANGCHANG_DATA_ROOT") or "").strip(): os.environ["JIANGCHANG_DATA_ROOT"] = platform_default_data_root() if not (os.getenv("CLAW_USER_ID") or os.getenv("JIANGCHANG_USER_ID") or "").strip(): os.environ["JIANGCHANG_USER_ID"] = DEFAULT_LOCAL_USER_ID.strip()