"""Команды jira-hub: init (настройки из config.example.json), serve (HTTP), import (CSV-пакет), mcp (stdio), tokens, agent publish (версия агента для самообновления).""" import argparse import json import sys from . import db, importer, paths, settings def main(argv=None) -> int: ap = argparse.ArgumentParser(prog="jira-hub", description="Мост Jira для АРМ КА: хаб") sub = ap.add_subparsers(dest="cmd", required=True) p = sub.add_parser("init", help="перенести настройки проекта из config.example.json, создать токены") p.add_argument("--config", required=True) p.add_argument("--force", action="store_true") p = sub.add_parser("serve", help="запустить HTTP API") p.add_argument("--host", default="0.0.0.0") p.add_argument("--port", type=int) p = sub.add_parser("import", help="импорт CSV-пакета admin/jira-sync в заметки") p.add_argument("folder") sub.add_parser("mcp", help="MCP-сервер по stdio") sub.add_parser("tokens", help="показать токены агента и клиента") p = sub.add_parser("agent", help="версия агента для самообновления") agent_sub = p.add_subparsers(dest="agent_cmd", required=True) p = agent_sub.add_parser("publish", help="опубликовать agent.py (версия только вверх)") p.add_argument("path") args = ap.parse_args(argv) if args.cmd == "agent": from . import release try: m = release.publish(paths.release_dir(), args.path) except release.PublishError as e: print(e, file=sys.stderr) return 1 print(f"опубликована v{m['version']}, sha256 {m['sha256'][:12]}…, {m['size']} байт") return 0 if args.cmd == "serve": from . import api hub = api.Hub(paths.db_path()) conn = hub.conn() port = args.port or int(settings.get(conn, "port") or 8790) conn.close() api.serve(hub, args.host, port) return 0 if args.cmd == "mcp": from . import mcp_server mcp_server.run() return 0 conn = db.connect(paths.db_path()) settings.ensure_defaults(conn) try: if args.cmd == "init": with open(args.config, encoding="utf-8") as f: cfg = json.load(f) try: keys = settings.init_from_config(conn, cfg, force=args.force) except RuntimeError as e: print(e, file=sys.stderr) return 1 print("перенесено: " + ", ".join(keys)) _print_tokens(conn) return 0 if args.cmd == "import": print(json.dumps(importer.import_package(conn, args.folder), ensure_ascii=False, indent=1)) return 0 if args.cmd == "tokens": _print_tokens(conn) return 0 finally: conn.close() return 2 def _print_tokens(conn) -> None: tok = settings.tokens(conn) print(f"агентский токен: {tok['agent']}\nклиентский токен: {tok['client']}\nбаза: {paths.db_path()}") if __name__ == "__main__": sys.exit(main())