///|
fn usage() -> String {
let text =
#|MoonFlowGraph snapshot audit CLI
#|
#|Usage:
#| moon run cmd/audit -- --json ''
#| moon run cmd/audit -- --help
#|
#|The command parses and audits a run-snapshot-v1 artifact. It validates
#|the graph, serialized plan, trace references, lifecycle events, and task
#|status consistency without executing any workflow task.
#|
text
}
///|
fn parse_input_arg(args : Array[String]) -> Result[String?, String] {
if args.length() <= 1 {
return Err("missing --json input")
}
let first = args[1]
if first == "--help" || first == "-h" {
return Ok(Some("__help__"))
}
if first == "--json" {
if args.length() < 3 {
return Err("missing value after --json")
}
if args.length() > 3 {
return Err("unexpected extra arguments after --json")
}
return Ok(Some(args[2]))
}
Err("unknown argument: \{first}")
}
///|
fn render_audit_report(snapshot : @moonflowgraph.RunSnapshot) -> String {
let graph = snapshot.graph()
let plan = snapshot.plan()
let trace = snapshot.trace()
let out = StringBuilder()
out <+ "# MoonFlowGraph Snapshot Audit\n\n"
out <+ "- Schema version: 1\n"
out <+ "- Tasks: \{graph.task_count()}\n"
out <+ "- Dependencies: \{graph.dependency_count()}\n"
out <+ "- Execution batches: \{plan.batches().length()}\n"
out <+ "- Trace events: \{trace.event_count()}\n"
out <+ "- Audit: valid\n"
out.to_string()
}
///|
fn main {
let input = match parse_input_arg(@env.args()) {
Ok(Some(value)) =>
if value == "__help__" {
println(usage())
return
} else {
value
}
Ok(None) => {
println(usage())
return
}
Err(message) => {
println("argument error: \{message}")
println(usage())
abort("invalid snapshot audit CLI arguments")
}
}
let snapshot = match @moonflowgraph.RunSnapshot::from_json(input) {
Ok(snapshot) => snapshot
Err(err) => {
println("snapshot audit failed: \{err.message()}")
abort("snapshot audit failed")
}
}
println(render_audit_report(snapshot))
}