spb/company-atlas
Public
Python 66.3%
TypeScript 22.7%
JavaScript 8.6%
HTML 1.4%
CSS 0.7%
1"""Versioned prompt files: `prompts/<task>/v<N>.md` (spec §125 — prompts live in code, versions are recorded on every event/job).23A prompt file is Markdown; everything after the optional front-matter comment is the *system* prompt. The user message is always a4compact JSON context built by the caller, so prompts never interpolate untrusted text into instructions.5"""6from __future__ import annotations78import re9from dataclasses import dataclass10from functools import lru_cache11from pathlib import Path1213from companyatlas.config import settings1415_REPO_ROOT = Path(__file__).resolve().parents[4]16_VERSION_RE = re.compile(r"^v(\d+)\.md$")171819def prompts_dir() -> Path:20 return Path(settings.prompts_dir) if settings.prompts_dir else _REPO_ROOT / "prompts"212223@dataclass(frozen=True, slots=True)24class Prompt:25 task: str26 version: str27 system: str2829 @property30 def ref(self) -> str:31 return f"{self.task}/{self.version}"323334@lru_cache(maxsize=64)35def load_prompt(task: str, version: str | None = None) -> Prompt:36 """Load `prompts/<task>/<version>.md` (latest `vN` when version is None). Raises FileNotFoundError when missing."""37 folder = prompts_dir() / task38 if version is None:39 candidates = sorted(((int(m.group(1)), p) for p in folder.glob("v*.md") if (m := _VERSION_RE.match(p.name))), reverse=True)40 if not candidates:41 raise FileNotFoundError(f"no prompt versions in {folder}")42 path = candidates[0][1]43 version = path.stem44 else:45 path = folder / f"{version}.md"46 text = path.read_text(encoding="utf-8")47 text = re.sub(r"\A<!--.*?-->\s*", "", text, flags=re.DOTALL) # optional front-matter comment48 return Prompt(task=task, version=version, system=text.strip())495051def available_prompts() -> dict[str, list[str]]:52 root = prompts_dir()53 if not root.exists():54 return {}55 return {d.name: sorted(p.stem for p in d.glob("v*.md")) for d in root.iterdir() if d.is_dir()}565758__all__ = ["Prompt", "available_prompts", "load_prompt", "prompts_dir"]59