"""Parse FILE_MAPPING.md into file_context.json. FILE_MAPPING.md (teammate-generated) has one "### N. filename" section per source file with bullet fields. We extract per file: content label, inferred role, and detailed summary, keyed by the file's path inside the JSON pack (e.g. "Initial/Gameplay/Adam_s Phone/Messages/General.json"). Usage: python -m pipeline.build_file_context """ import json import re import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).parent.parent)) import config _SECTION_RE = re.compile(r"^### \d+\. `", re.MULTILINE) _FIELD_RES = { "rel_path": re.compile(r"^- Relative path: `(.+?)`", re.MULTILINE), "label": re.compile(r"^- Content label: `(.+?)`", re.MULTILINE), "role": re.compile(r"^- Inferred role: (.+?)$", re.MULTILINE), "summary": re.compile(r"^- Detailed summary: (.+?)$", re.MULTILINE), } def normalize_key(rel_path: str) -> str: """Canonical lookup key: strip stray spaces around each path component.""" return "/".join(part.strip() for part in rel_path.replace("\\", "/").split("/")) def _pack_key(rel_path: str) -> str: """'English/Initial/.../General.docx' -> 'Initial/.../General.json'.""" path = rel_path.replace("\\", "/").removeprefix("English/") return normalize_key(str(Path(path).with_suffix(".json"))) def parse_file_mapping(markdown: str) -> dict[str, dict[str, str]]: context: dict[str, dict[str, str]] = {} for section in _SECTION_RE.split(markdown)[1:]: fields = {} for name, pattern in _FIELD_RES.items(): match = pattern.search(section) fields[name] = match.group(1).strip() if match else "" if not fields["rel_path"]: continue context[_pack_key(fields["rel_path"])] = { "label": fields["label"], "role": fields["role"], "summary": fields["summary"], } return context def main() -> None: markdown = config.FILE_MAPPING_PATH.read_text(encoding="utf-8") context = parse_file_mapping(markdown) config.FILE_CONTEXT_PATH.write_text( json.dumps(context, indent=2, ensure_ascii=False), encoding="utf-8" ) print(f"Wrote context for {len(context)} files to {config.FILE_CONTEXT_PATH.name}") if __name__ == "__main__": main()