"""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") p_tgr = sub.add_parser("tg-reply", help="ответить на входящее TG-сообщение") p_tgr.add_argument("msg_id", help="id входящего (m-NNN)") p_tgr.add_argument("text") 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 == "tg-reply": es.init_db() from harness import tg_inbox mid = tg_inbox.send_reply(args.msg_id, args.text) print(f"OK: ответ на {mid} отправлен") 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()