KeiSeiKit-1.0/_primitives/_rust/kei-hibernate/src/main.rs
Parfii-bot 0be354a920 KeiSeiKit-public — clean state
Single-commit clean baseline after security scrub of niche-tells,
project codenames, internal jargon, and contributor-email leaks.

Contents:
- 100 Rust crates (_primitives/_rust/)
- 37 agent manifests (_manifests/) + generated specs (_generated/)
- 67 user-invocable skills (skills/)
- 33 hooks (hooks/)
- Composition blocks (_blocks/)
- Documentation (docs/, README.md)
- TS adapter packages (_ts_packages/)
- Assembler (_assembler/)
- Roles (_roles/)
- Templates (_templates/)
- Forgejo CI (.forgejo/)

Author: Denis Parfionovich <info@greendragon.info>

License: see LICENSE.
2026-05-01 12:09:03 +08:00

103 lines
2.9 KiB
Rust

//! kei-hibernate CLI.
//!
//! Subcommands: `export`, `import`, `inspect`. Thin dispatcher over
//! the library surface; each arm is <30 LOC.
use clap::{Parser, Subcommand};
use kei_hibernate::{export, import, inspect};
use std::path::PathBuf;
use std::process::ExitCode;
#[derive(Parser)]
#[command(name = "kei-hibernate", version, about = "Whole-brain export/import of KeiSei state")]
struct Cli {
#[command(subcommand)]
cmd: Cmd,
}
#[derive(Subcommand)]
enum Cmd {
/// Bundle kit_root into a tar.zst archive.
Export {
/// Output bundle path (e.g. bundle.tar.zst).
#[arg(long)]
out: PathBuf,
/// Kit root (defaults to current directory).
#[arg(long, default_value = ".")]
kit_root: PathBuf,
},
/// Extract a bundle into kit_root (pass --dry-run to preview).
Import {
bundle: PathBuf,
#[arg(long, default_value = ".")]
kit_root: PathBuf,
#[arg(long)]
dry_run: bool,
},
/// Print manifest contents without extracting.
Inspect { bundle: PathBuf },
}
fn main() -> ExitCode {
let cli = Cli::parse();
match cli.cmd {
Cmd::Export { out, kit_root } => run_export(&kit_root, &out),
Cmd::Import { bundle, kit_root, dry_run } => run_import(&bundle, &kit_root, dry_run),
Cmd::Inspect { bundle } => run_inspect(&bundle),
}
}
fn run_export(kit_root: &std::path::Path, out: &std::path::Path) -> ExitCode {
match export(kit_root, out) {
Ok(meta) => {
println!(
"exported {} files ({} bytes) -> {}",
meta.file_count,
meta.total_bytes,
out.display()
);
ExitCode::SUCCESS
}
Err(e) => fail(&format!("export failed: {e}")),
}
}
fn run_import(bundle: &std::path::Path, kit_root: &std::path::Path, dry_run: bool) -> ExitCode {
match import(bundle, kit_root, dry_run) {
Ok(r) => {
println!(
"{} {} files, {} conflicts, extracted={}",
if r.dry_run { "DRY-RUN:" } else { "imported:" },
r.file_count,
r.conflicts.len(),
r.extracted
);
for c in &r.conflicts {
println!(" conflict: {c}");
}
ExitCode::SUCCESS
}
Err(e) => fail(&format!("import failed: {e}")),
}
}
fn run_inspect(bundle: &std::path::Path) -> ExitCode {
match inspect(bundle) {
Ok(r) => {
println!(
"manifest v{} ts={} host={} files={} bytes={}",
r.version, r.timestamp, r.machine_id, r.file_count, r.total_bytes
);
for p in &r.paths {
println!(" {p}");
}
ExitCode::SUCCESS
}
Err(e) => fail(&format!("inspect failed: {e}")),
}
}
fn fail(msg: &str) -> ExitCode {
eprintln!("{msg}");
ExitCode::FAILURE
}