#!/usr/bin/env python3 """Parse Imagine prompts and report batch import status.""" from __future__ import annotations import json import re import sys from pathlib import Path ROOT = Path(__file__).resolve().parents[1] sys.path.insert(0, str(ROOT / "src")) from kingdom.core.elements import EXPLORER_Z_MAX, KNOWN_ELEMENT_MAX, get_element PROMPTS_KNOWN = ROOT / "app" / "assets" / "elements" / "imagine_prompts.txt" PROMPTS_SH = ROOT / "app" / "assets" / "elements" / "imagine_prompts_superheavy.txt" INBOX = ROOT / "app" / "assets" / "elements_imagine" SH_INBOX = INBOX / "superheavy" MANIFEST = INBOX / "batch_manifest.json" _LINE = re.compile(r"^Z=(\d+)\s+\((\w+)\):\s*(.+)$", re.MULTILINE) def _parse_prompts(path: Path) -> dict[int, dict]: if not path.is_file(): return {} text = path.read_text(encoding="utf-8") out: dict[int, dict] = {} for z_s, sym, prompt in _LINE.findall(text): z = int(z_s) out[z] = {"symbol": sym, "prompt": prompt.strip()} return out def _inbox_path(z: int, symbol: str) -> Path: el = get_element(z) folder = SH_INBOX if el and el.is_synthetic else INBOX return folder / f"{symbol.lower()}.png" def build_manifest() -> dict: prompts = _parse_prompts(PROMPTS_KNOWN) prompts.update(_parse_prompts(PROMPTS_SH)) entries = [] for z in range(1, EXPLORER_Z_MAX + 1): el = get_element(z) if el is None: continue meta = prompts.get(z, {}) sym = meta.get("symbol", el.symbol) path = _inbox_path(z, sym) imported = (ROOT / "app" / "assets" / "elements" / f"{sym.lower()}.png").is_file() inbox = path.is_file() entries.append( { "z": z, "symbol": sym, "name": el.name, "synthetic": el.is_synthetic, "prompt": meta.get("prompt", ""), "inbox": str(path.relative_to(ROOT)), "inbox_ready": inbox, "imported": imported, } ) ready = sum(1 for e in entries if e["inbox_ready"]) return { "total": len(entries), "inbox_ready": ready, "pending": len(entries) - ready, "entries": entries, } def main() -> None: manifest = build_manifest() MANIFEST.parent.mkdir(parents=True, exist_ok=True) MANIFEST.write_text(json.dumps(manifest, indent=2), encoding="utf-8") print(f"Manifest: {MANIFEST}") print(f"Imagine inbox ready: {manifest['inbox_ready']}/{manifest['total']}") print(f"Pending: {manifest['pending']}") pending = [e for e in manifest["entries"] if not e["inbox_ready"]][:10] if pending: print("Next pending:") for e in pending: print(f" Z={e['z']:3d} {e['symbol']:3s} -> {e['inbox']}") if __name__ == "__main__": main()