79 lines
No EOL
3.3 KiB
Python
79 lines
No EOL
3.3 KiB
Python
"""Simbiot Harness — CLI: таски, статус, ручные тики."""
|
|
import argparse
|
|
import json
|
|
import sys
|
|
import os
|
|
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
|
|
from harness import commands, es
|
|
|
|
|
|
def main():
|
|
ap = argparse.ArgumentParser(prog="simbiot", description="Simbiot Harness CLI")
|
|
sub = ap.add_subparsers(dest="cmd", required=True)
|
|
|
|
p_task = sub.add_parser("task", help="подать задачу")
|
|
p_task.add_argument("title")
|
|
p_task.add_argument("-d", "--details", default="")
|
|
p_task.add_argument("-m", "--minutes", type=int, default=5,
|
|
help="оценка длительности (класс S≤5м M≤60м L≤8ч XL)")
|
|
|
|
p_pol = sub.add_parser("policy", help="задать политику")
|
|
p_pol.add_argument("--identity", default=None)
|
|
p_pol.add_argument("--cpu-threshold", type=int, default=None)
|
|
|
|
p_rq = sub.add_parser("requeue", help="вернуть failed-задачу в очередь")
|
|
p_rq.add_argument("task_id")
|
|
p_rq.add_argument("-r", "--reason", default="manual requeue")
|
|
|
|
p_pr = sub.add_parser("promote", help="промоушен ready-задачи на уровень выше (S→M→L)")
|
|
p_pr.add_argument("task_id")
|
|
p_pr.add_argument("-r", "--reason", default="manual promote")
|
|
|
|
sub.add_parser("status", help="состояние харнеса")
|
|
sub.add_parser("tasks", help="доска задач")
|
|
|
|
p_ev = sub.add_parser("events", help="хвост стора")
|
|
p_ev.add_argument("-n", type=int, default=15)
|
|
p_ev.add_argument("--after", type=int, default=0)
|
|
|
|
p_init = sub.add_parser("init", help="инициализация стора")
|
|
p_init.add_argument("--identity", default="Simbiot Harness — ритмичный агент кооператива")
|
|
|
|
args = ap.parse_args()
|
|
|
|
if args.cmd == "init":
|
|
es.init_db()
|
|
commands.set_policy(identity=args.identity)
|
|
print("OK: стор инициализирован, политика записана")
|
|
elif args.cmd == "task":
|
|
tid, size = commands.submit_task(args.title, args.details, args.minutes)
|
|
print(f"OK: задача {tid} [{size}] подана")
|
|
elif args.cmd == "policy":
|
|
pol = commands.set_policy(identity=args.identity, cpu_alert_threshold=args.cpu_threshold)
|
|
print("OK:", json.dumps(pol, ensure_ascii=False))
|
|
elif args.cmd == "requeue":
|
|
es.init_db()
|
|
tid = commands.requeue_task(args.task_id, args.reason)
|
|
print(f"OK: задача {tid} возвращена в очередь")
|
|
elif args.cmd == "promote":
|
|
es.init_db()
|
|
tid, new_size = commands.promote_task(args.task_id, args.reason)
|
|
print(f"OK: задача {tid} повышена до [{new_size}]")
|
|
elif args.cmd == "status":
|
|
es.init_db()
|
|
print(json.dumps(commands.status(), ensure_ascii=False, indent=1))
|
|
elif args.cmd == "tasks":
|
|
es.init_db()
|
|
for t in commands.list_tasks():
|
|
print(f"{t['id']} [{t['size']:2}] {t['status']:7} {t['title'][:70]}")
|
|
elif args.cmd == "events":
|
|
es.init_db()
|
|
for ev in es.get_events(args.after, args.n):
|
|
d = ev["data"][:110]
|
|
print(f"{ev['id']:4} {ev['timestamp'][11:19]} {ev['aggregate']:8} {ev['event_type']:16} {d}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |