{"record":{"id":"07c0132481ae1e9e","repo":"calesthio/OpenMontage","slug":"error-no-demo-prop-files-were-found-in-props-dir","errorCode":null,"errorMessage":"Error: No demo prop files were found in {PROPS_DIR}.","messagePattern":"Error: No demo prop files were found in (.+?)\\.","errorType":"console","errorClass":"SystemExit","httpStatus":null,"severity":"error","filePath":"render_demo.py","lineNumber":121,"sourceCode":"\n    if output_path.exists():\n        size_mb = output_path.stat().st_size / (1024 * 1024)\n        print(f\"Done: {output_path} ({size_mb:.1f} MB)\")\n    else:\n        print(\"Render finished without creating the expected output file.\")\n\n\ndef main(argv: list[str] | None = None) -> int:\n    parser = argparse.ArgumentParser(\n        description=\"Render zero-key OpenMontage demo videos from checked-in Remotion props.\"\n    )\n    parser.add_argument(\"demo\", nargs=\"?\", help=\"Render one named demo instead of all demos.\")\n    parser.add_argument(\"--list\", action=\"store_true\", help=\"List available demo fixtures and exit.\")\n    args = parser.parse_args(argv)\n\n    demos = discover_demos()\n    if not demos:\n        raise SystemExit(f\"Error: No demo prop files were found in {PROPS_DIR}.\")\n\n    if args.list:\n        print(\"Available zero-key demos:\")\n        for name in demos:\n            description = DEMO_DESCRIPTIONS.get(name, \"Checked-in Remotion demo\")\n            print(f\"  {name:20} {description}\")\n        return 0\n\n    if args.demo and args.demo not in demos:\n        available = \", \".join(demos)\n        raise SystemExit(f\"Unknown demo '{args.demo}'. Available demos: {available}\")\n\n    npx_cmd = ensure_demo_environment()\n    selected = {args.demo: demos[args.demo]} if args.demo else demos\n\n    for name, props_path in selected.items():\n        render_demo(name, props_path, npx_cmd)\n","sourceCodeStart":103,"sourceCodeEnd":139,"githubUrl":"https://github.com/calesthio/OpenMontage/blob/95e1c3d0ab93482159818560f6a8c8e866b9139f/render_demo.py#L103-L139","documentation":"Raised by render_demo.py's main() as SystemExit when discover_demos() finds no prop files in PROPS_DIR. Demos are discovered purely by scanning the checked-in props directory; if it's empty (or the files were moved/deleted/not checked out), there is nothing to list or render and the script exits with the directory path in the message.","triggerScenarios":"Running render_demo.py in a checkout where the demo props directory is empty — sparse checkout excluding those files, props moved during a refactor, or running from a working directory/build artifact tree where PROPS_DIR resolves to an empty folder.","commonSituations":"Repo refactor relocating demo fixtures; partial/sparse clone; packaging step (wheel/docker) that omitted the props directory; running the script from a copied tree that dropped data files.","solutions":["Check the path printed in the error and confirm demo props files exist there (they should be checked into the repo).","If the files were moved by a refactor, restore them to PROPS_DIR or update PROPS_DIR in render_demo.py.","Re-clone or fix the sparse-checkout/packaging config so the demo fixtures are present."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"from pathlib import Path\nfrom render_demo import PROPS_DIR\n\ndef demos_present() -> bool:\n    return PROPS_DIR.exists() and any(PROPS_DIR.glob(\"*.json\"))","typeGuard":null,"tryCatchPattern":"try:\n    main()\nexcept SystemExit as e:\n    if \"No demo prop files\" in str(e):\n        print(f\"Demo fixtures missing at {PROPS_DIR} — check your checkout/packaging.\")\n    raise","preventionTips":["Ensure demo fixture files are included in packaging configs (not gitignored, not excluded by sparse checkout).","If demo props move during a refactor, update PROPS_DIR in render_demo.py in the same change.","Run `python render_demo.py --list` as a cheap canary that fixtures are present."],"tags":["demos","file-not-found","packaging","rendering"],"backgroundTag":null,"analyzedSha":"95e1c3d0ab93482159818560f6a8c8e866b9139f","analyzedAt":"2026-08-15T06:31:20.014Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}