Files
aios/services/aios-autonomous-control-plane/aios_autonomous_control_plane/cli.py
T

103 lines
4.0 KiB
Python

from __future__ import annotations
import argparse
import json
import os
from pathlib import Path
from .common import HashChainAudit
from .ledger import OperationLedger
from .mirror import ApprovalMirrorWorker
from .policy import DevelopmentPolicy
from .projection import ReleaseObjectProjector, RuntimeSourceProjector
from .renewal import RenewalController
from .writer import CommitRequest, GovernedDevelopmentWriter
def load_json(path: Path) -> dict:
value = json.loads(path.read_text(encoding="utf-8"))
if not isinstance(value, dict):
raise SystemExit("JSON object required")
return value
def build_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser()
commands = parser.add_subparsers(dest="command", required=True)
writer = commands.add_parser("writer-commit")
writer.add_argument("--policy", type=Path, required=True)
writer.add_argument("--request", type=Path, required=True)
writer.add_argument("--worktree", type=Path, required=True)
writer.add_argument("--remote", required=True)
writer.add_argument("--ledger", type=Path, required=True)
writer.add_argument("--audit", type=Path, required=True)
mirror = commands.add_parser("mirror")
mirror.add_argument("--source-git-dir", type=Path, required=True)
mirror.add_argument("--authoritative-git-dir", type=Path, required=True)
mirror.add_argument("--target-oid", required=True)
runtime = commands.add_parser("runtime-project")
runtime.add_argument("--path", action="append", type=Path, required=True)
runtime.add_argument("--output", type=Path, required=True)
runtime.add_argument("--task-id", required=True)
release = commands.add_parser("release-project")
release.add_argument("--source-git-dir", type=Path, required=True)
release.add_argument("--commit-oid", required=True)
release.add_argument("--tree-oid", required=True)
release.add_argument("--output", type=Path, required=True)
release.add_argument("--path", action="append", required=True)
renew = commands.add_parser("renew")
renew.add_argument("--standing-policy", type=Path, required=True)
renew.add_argument("--previous-manifest", type=Path, required=True)
renew.add_argument("--observation", type=Path, required=True)
return parser
def main(argv: list[str] | None = None) -> int:
args = build_parser().parse_args(argv)
os.environ.setdefault("AIOS_GITOPS_WRITES_ENABLED", "false")
if args.command == "writer-commit":
policy = DevelopmentPolicy.from_mapping(load_json(args.policy))
request_value = load_json(args.request)
content_path = Path(request_value.pop("content_path"))
request = CommitRequest(content=content_path.read_bytes(), **request_value)
result = GovernedDevelopmentWriter(
worktree=args.worktree,
remote=args.remote,
policy=policy,
ledger=OperationLedger(args.ledger),
audit=HashChainAudit(args.audit),
).commit_file(request)
elif args.command == "mirror":
result = ApprovalMirrorWorker(
args.source_git_dir, args.authoritative_git_dir
).mirror(expected_target_oid=args.target_oid).__dict__
elif args.command == "runtime-project":
result = RuntimeSourceProjector(args.path).collect(args.output, args.task_id)
elif args.command == "release-project":
result = ReleaseObjectProjector(args.source_git_dir).project(
commit_oid=args.commit_oid,
expected_tree_oid=args.tree_oid,
output_path=args.output,
allowed_paths=args.path,
).__dict__
result["output_path"] = str(result["output_path"])
else:
result = RenewalController().decide(
standing_policy=load_json(args.standing_policy),
previous_manifest=load_json(args.previous_manifest),
observation=load_json(args.observation),
).__dict__
print(json.dumps(result, sort_keys=True, default=str))
return 0
if __name__ == "__main__":
raise SystemExit(main())