feat: add runtime diagnostics and path management

This commit is contained in:
2026-04-15 16:55:45 +08:00
parent 7586685d5f
commit 6eefabb9ff
14 changed files with 304 additions and 85 deletions

View File

@@ -1,23 +1,35 @@
"""CoinHunter unified CLI entrypoint."""
from __future__ import annotations
import argparse
import importlib
import sys
from . import __version__
MODULE_MAP = {
"smart-executor": "smart_executor",
"auto-trader": "auto_trader",
"precheck": "precheck",
"check-api": "check_api",
"doctor": "doctor",
"external-gate": "external_gate",
"init": "init_user_state",
"market-probe": "market_probe",
"paths": "paths",
"precheck": "precheck",
"review-context": "review_context",
"review-engine": "review_engine",
"market-probe": "market_probe",
"check-api": "check_api",
"rotate-external-gate-log": "rotate_external_gate_log",
"init": "init_user_state",
"smart-executor": "smart_executor",
"auto-trader": "auto_trader",
}
class VersionAction(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
print(__version__)
raise SystemExit(0)
def build_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(
prog="coinhunter",
@@ -25,7 +37,10 @@ def build_parser() -> argparse.ArgumentParser:
formatter_class=argparse.RawTextHelpFormatter,
epilog=(
"Examples:\n"
" coinhunter doctor\n"
" coinhunter paths\n"
" coinhunter check-api\n"
" coinhunter smart-executor balances\n"
" coinhunter smart-executor hold\n"
" coinhunter smart-executor --analysis '...' --reasoning '...' buy ENJUSDT 50\n"
" coinhunter precheck\n"
@@ -36,7 +51,8 @@ def build_parser() -> argparse.ArgumentParser:
" coinhunter init\n"
),
)
parser.add_argument("command", choices=sorted(MODULE_MAP.keys()))
parser.add_argument("--version", nargs=0, action=VersionAction, help="Print installed version and exit")
parser.add_argument("command", nargs="?", choices=sorted(MODULE_MAP.keys()), help="CoinHunter command to run")
parser.add_argument("args", nargs=argparse.REMAINDER)
return parser
@@ -59,6 +75,9 @@ def run_python_module(module_name: str, argv: list[str]) -> int:
def main() -> int:
parser = build_parser()
parsed = parser.parse_args()
if not parsed.command:
parser.print_help()
return 0
module_name = MODULE_MAP[parsed.command]
argv = list(parsed.args)
if argv and argv[0] == "--":