46 lines
1.6 KiB
Python
46 lines
1.6 KiB
Python
#!/usr/bin/env python3
|
|
"""CLI wrapper for the Org OS minimum-sufficient role planner."""
|
|
import json
|
|
import os
|
|
import sys
|
|
|
|
import yaml
|
|
|
|
HERE = os.path.dirname(os.path.abspath(__file__))
|
|
sys.path.insert(0, HERE)
|
|
from orgos.planning.role_selector import resolve_family, select_minimum_sufficient_roles # noqa: E402
|
|
|
|
|
|
def _arg(args, name, default=None):
|
|
return args[args.index(name) + 1] if name in args and args.index(name) + 1 < len(args) else default
|
|
|
|
|
|
def main():
|
|
args = sys.argv[1:]
|
|
if not args:
|
|
sys.stderr.write("usage: role_selector.py plan --profile workload.yaml | resolve-family --family FAM-ID [--signals a,b] [--tier T]\n")
|
|
return 2
|
|
if args[0] == "resolve-family":
|
|
family = _arg(args, "--family")
|
|
signals = [item.strip() for item in str(_arg(args, "--signals", "")).split(",") if item.strip()]
|
|
result = resolve_family(family, signals, _arg(args, "--tier", "standard")) if family else None
|
|
elif args[0] == "plan":
|
|
path = _arg(args, "--profile")
|
|
if path:
|
|
profile = yaml.safe_load(open(path, encoding="utf-8")) or {}
|
|
else:
|
|
profile = yaml.safe_load(sys.stdin.read()) or {}
|
|
result = select_minimum_sufficient_roles(profile)
|
|
else:
|
|
result = None
|
|
if not result:
|
|
sys.stderr.write("role selection failed: unknown family/profile or no concrete coverage\n")
|
|
return 2
|
|
print(yaml.safe_dump(result, sort_keys=False, allow_unicode=True).rstrip())
|
|
plan = result.get("selection-plan") or result.get("selection-plan", {})
|
|
return 0 if not plan or plan.get("status") != "blocked" else 2
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|