idea135-crisisops-open-crisis/crisisops/cli.py

45 lines
1.6 KiB
Python

"""Minimal CLI to exercise CrisisOps MVP."""
import argparse
import json
from crisisops.planner import ADMMPlanner
from crisisops.core import GraphOfContracts, Object, Morphism
from crisisops.replay import graph_snapshot
def build_sample_goc():
# Simple two-object domains: field resources and shelters
o1 = Object(id="fuel-truck-1", type="vehicle", attributes={"capacity": 1000})
o2 = Object(id="shelter-a", type="facility", attributes={"capacity": 500})
o3 = Object(id="fuel-warehouse", type="resource", attributes={"stock": 2000})
m1 = Morphism(id="m1", source_id=o1.id, target_id=o2.id, type="dispatch", signals={"priority": "high"})
g = GraphOfContracts(objects={o1.id: o1, o2.id: o2, o3.id: o3}, morphisms={m1.id: m1})
return g
def main():
parser = argparse.ArgumentParser()
sub = parser.add_subparsers(dest="cmd")
sub.add_parser("plan", help="Run a toy planning pass on a sample GoC")
sub.add_parser("snapshot", help="Print a deterministic snapshot of the sample GoC")
args = parser.parse_args()
if args.cmd == "plan":
gof = build_sample_goc()
planner = ADMMPlanner()
plan = planner.optimize(gof)
snapshot = graph_snapshot(gof, plan=plan)
print(json.dumps({"plan": plan.actions, "snapshot_hash": snapshot["snapshot_hash"]}, default=str, indent=2))
return 0
if args.cmd == "snapshot":
gof = build_sample_goc()
snapshot = graph_snapshot(gof)
print(json.dumps(snapshot, default=str, indent=2))
return 0
print("No command provided. Use 'plan'.")
return 1
if __name__ == "__main__":
raise SystemExit(main())