69 lines
2.4 KiB
Python
69 lines
2.4 KiB
Python
"""Canonical project paths (repo root, data files, config)."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
|
|
PROJECT_ROOT = Path(__file__).resolve().parent.parent
|
|
DATA_DIR = PROJECT_ROOT / "data"
|
|
VOCAB_PATH = DATA_DIR / "vocab.txt"
|
|
VOCAB_BASE_PATH = DATA_DIR / "vocab_base.txt"
|
|
SKILLS_DIR = DATA_DIR / "skills"
|
|
# Runtime translation system skill (formerly data/prompt.txt).
|
|
PROMPT_PATH = SKILLS_DIR / "system.md"
|
|
LEGACY_PROMPT_PATH = DATA_DIR / "prompt.txt"
|
|
LAST_UPDATE_SHA_PATH = DATA_DIR / "last_update_sha.txt"
|
|
ENV_PATH = PROJECT_ROOT / ".env"
|
|
ICON_PATH = PROJECT_ROOT / "assets" / "icon.png"
|
|
ENGINE_ICONS_DIR = PROJECT_ROOT / "assets" / "engine_icons"
|
|
TRANSLATION_CONTEXTS_PATH = DATA_DIR / "translation_contexts.json"
|
|
# Per-game quirks skill (API overlay). Legacy flat file still migrated on load.
|
|
GAME_QUIRKS_RELATIVE = Path("skills") / "quirks.md"
|
|
LEGACY_QUIRKS_FILENAME = "translation_quirks.txt"
|
|
GAME_SKILL_RELATIVE = Path("skills") / "game.md"
|
|
LEGACY_GAME_SKILL_RELATIVE = Path("skills") / "translation.md"
|
|
# Built-in skill filenames under <game>/skills/ (not user-custom overlays).
|
|
GAME_SKILL_RESERVED_NAMES = frozenset({"quirks.md", "game.md", "translation.md"})
|
|
|
|
_ROOT_DATA_FILES = (
|
|
"vocab.txt",
|
|
"vocab_base.txt",
|
|
"prompt.txt",
|
|
"last_update_sha.txt",
|
|
)
|
|
|
|
|
|
def migrate_root_data_files() -> None:
|
|
"""Move legacy root-level data files into data/ on first run."""
|
|
DATA_DIR.mkdir(parents=True, exist_ok=True)
|
|
for name in _ROOT_DATA_FILES:
|
|
src = PROJECT_ROOT / name
|
|
dst = DATA_DIR / name
|
|
if src.is_file() and not dst.exists():
|
|
src.rename(dst)
|
|
|
|
|
|
def migrate_prompt_to_skills() -> None:
|
|
"""Move legacy ``data/prompt.txt`` to ``data/skills/system.md`` when needed."""
|
|
SKILLS_DIR.mkdir(parents=True, exist_ok=True)
|
|
if PROMPT_PATH.is_file():
|
|
return
|
|
for legacy in (LEGACY_PROMPT_PATH, PROJECT_ROOT / "prompt.txt"):
|
|
if legacy.is_file():
|
|
legacy.rename(PROMPT_PATH)
|
|
return
|
|
|
|
|
|
migrate_root_data_files()
|
|
migrate_prompt_to_skills()
|
|
|
|
|
|
def ensure_vocab_file() -> None:
|
|
"""Create data/vocab.txt from vocab_base.txt when missing."""
|
|
migrate_root_data_files()
|
|
if VOCAB_PATH.is_file():
|
|
return
|
|
if VOCAB_BASE_PATH.is_file():
|
|
VOCAB_PATH.write_text(VOCAB_BASE_PATH.read_text(encoding="utf-8"), encoding="utf-8")
|
|
else:
|
|
VOCAB_PATH.write_text("", encoding="utf-8")
|