tower-rules 0.8.20

TowerRule schema — predicate + trigger + federation types for yah-tower. Zero deps on tower runtime; consumed by the rule engine, desktop UI, tower.simulate, and tests.
Documentation
/// Export all tower-rules TypeScript bindings to the UI gen directory.
///
/// Usage: `cargo run -p tower-rules --bin tower-rules-export-ts [OUTPUT_DIR]`
///
/// Default output: `packages/yah/ui/src/gen/` relative to workspace root.
fn main() {
    let out_dir = std::env::args().nth(1).unwrap_or_else(|| {
        let manifest_dir = env!("CARGO_MANIFEST_DIR");
        // Cargo.toml lives at crates/yah/tower-rules/; go up 3 levels to workspace root
        format!("{manifest_dir}/../../../packages/yah/ui/src/gen")
    });

    std::fs::create_dir_all(&out_dir)
        .unwrap_or_else(|e| panic!("failed to create output dir {out_dir}: {e}"));

    tower_rules::export_ts(&out_dir)
        .unwrap_or_else(|e| panic!("failed to export TypeScript bindings: {e}"));

    println!("tower-rules: TypeScript bindings written to {out_dir}");
}