gen-types — typed IR for the universal package-manager → build- system engine.
Foundation crate. Every adapter (gen-cargo, gen-npm, gen-bundler, gen-pip, gen-gomod, gen-helm, …) emits this shape; every renderer (gen-nix-incremental, gen-nix-bulk, gen-bazel, …) consumes it; every cache backend (gen-cache-attic, gen-cache-cachix, …) keys on it.
See theory/GEN.md for the full design — why universal lifting,
the 80/20 split, the trait architecture, the milestone plan.
Shape
Manifest (1)
└─ packages: Vec<Package> (one per crate / gem / wheel / etc.)
├─ source: PackageSource (Registry | Git | Path | Local)
├─ dependencies: Vec<Dependency>
│ ├─ constraint: VersionConstraint
│ ├─ kind: DependencyKind (Direct | Build | Dev | Optional | Peer)
│ ├─ features_enabled: Vec<String>
│ └─ target_predicate: Option<TargetPredicate>
├─ features: Vec<Feature>
└─ build_steps: Vec<BuildStep>
└─ lockfile: Option<Lockfile>
Every adapter is a thin Manifest-producer; every renderer is a thin Manifest-to-Derivation translator. The trait surface stays narrow.