Replace the hardcoded TEMPLATES dict and the ksflatten-relative wrapper
with a single data-driven pipeline:
- recipe_templates.yaml becomes the single source of truth with three
sections: base (always included), choices (exactly-one per category,
the invariant pykickstart cannot check) and features (additive flags
or one-of values)
- generate_recipe.py is a pure YAML consumer: it resolves ingredients,
renders dishes via pykickstart in-process (no ksflatten binary, no
%include path munging), lints the invariants pykickstart cannot check
(exactly-one per choice category, known keys, existing fragments,
unique filenames) and validates every generated dish
- dish names are derived by a generic rule with canonical category order
from the templates, independent of YAML key order; no committed
generated files means no name burn-in
- recipes/ and dishes/ become gitignored build products; the 68 tracked
generated files (already out of sync with the manifest) are removed
- delete dead ingredients (section-data/, validation/, initial-setup/
desktop/, live/hypervisor.ks, rpmfusion-nonfree.ks), the stale
all-ingredients.cfg (replaced by 'make inventory') and the
bin/generate-recipe and bin/ksflatten-relative wrappers
- Makefile: single 'make all' step plus lint, validate, inventory, test
- add 16 pytest tests covering expansion, selection, naming, lint and
flatten/validate round-trips
- Move recipe-generator/ to cook/ for cleaner structure
- Fix ksflatten-relative path conversion to handle all %include paths
- Fix validation exit code to only fail on actual errors
- All recipes now generate and flatten successfully via make all