test
This commit is contained in:
0
scripts/cli/__init__.py
Normal file
0
scripts/cli/__init__.py
Normal file
@@ -1,8 +1,4 @@
|
||||
"""CLI:argparse 与分发模板。
|
||||
|
||||
只负责参数解析并转交 service;业务内核在 domain / task_service,勿在此按入口复制逻辑。
|
||||
"""
|
||||
|
||||
"""CLI:argparse 解析与分发(业务内核在 service,本层只做参数→service 映射)。"""
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
@@ -10,11 +6,17 @@ import sys
|
||||
from typing import List, Optional
|
||||
|
||||
from service.task_service import (
|
||||
cmd_add,
|
||||
cmd_config_path,
|
||||
cmd_delete,
|
||||
cmd_done,
|
||||
cmd_health,
|
||||
cmd_init_db,
|
||||
cmd_run,
|
||||
cmd_list,
|
||||
cmd_remind,
|
||||
cmd_stats,
|
||||
cmd_version,
|
||||
cmd_run,
|
||||
)
|
||||
from util.config_bootstrap import bootstrap_skill_config
|
||||
from util.argparse_zh import ZhArgumentParser
|
||||
@@ -29,64 +31,89 @@ def _cli_str_or_none(raw: Optional[str]) -> Optional[str]:
|
||||
return v or None
|
||||
|
||||
|
||||
def _handle_run(args: argparse.Namespace) -> int:
|
||||
tail = [str(x).strip() for x in (args.run_tail or []) if str(x).strip()]
|
||||
if len(tail) > 2:
|
||||
print("❌ 参数过多。")
|
||||
print("用法:python main.py run [target [input_id]] | run [-t target] [-i input_id]")
|
||||
return 1
|
||||
|
||||
t_target: Optional[str] = None
|
||||
t_input: Optional[str] = None
|
||||
if len(tail) == 2:
|
||||
t_target, t_input = tail[0], tail[1]
|
||||
elif len(tail) == 1:
|
||||
if tail[0].isdigit():
|
||||
t_input = tail[0]
|
||||
else:
|
||||
t_target = tail[0]
|
||||
|
||||
pick_t = _cli_str_or_none(getattr(args, "target", None))
|
||||
pick_i = _cli_str_or_none(getattr(args, "input_id", None))
|
||||
target = pick_t or t_target
|
||||
input_id = pick_i or t_input
|
||||
return cmd_run(target=target, input_id=input_id)
|
||||
def _parse_ids(raw: str) -> list[int]:
|
||||
"""解析 ``1`` 或 ``1,2,3`` 为 int 列表。"""
|
||||
parts = [p.strip() for p in (raw or "").split(",") if p.strip()]
|
||||
try:
|
||||
return [int(p) for p in parts]
|
||||
except ValueError as exc:
|
||||
raise SystemExit(f"参数错误:ids 必须是数字或逗号分隔的数字列表,收到 {raw!r}\n{exc}")
|
||||
|
||||
|
||||
def _print_full_usage() -> None:
|
||||
print("通用业务技能模板(main.py)可用命令:")
|
||||
print(" python main.py run [target [input_id]] [-t target] [-i input_id]")
|
||||
print(" python main.py health")
|
||||
print(" python main.py config-path")
|
||||
print(" python main.py version")
|
||||
print(" python main.py init-db")
|
||||
print("待办事项 add-todo-all(main.py)可用命令:")
|
||||
print(" python main.py init-db # 初始化数据库与元数据")
|
||||
print(" python main.py run add <title> [-p high|normal|low] [-d <unix秒>")
|
||||
print(" python main.py run list [-s pending|done] [-n <limit>]")
|
||||
print(" python main.py run done <id>")
|
||||
print(" python main.py run delete <id>")
|
||||
print(" python main.py run stats")
|
||||
print(" python main.py remind [-s <秒>]")
|
||||
print(" python main.py health / version / config-path")
|
||||
|
||||
|
||||
def _add_run_subparser(sub) -> None:
|
||||
sp = sub.add_parser("run", help="待办事项操作")
|
||||
todo_sub = sp.add_subparsers(dest="todo_cmd", required=True, parser_class=ZhArgumentParser)
|
||||
|
||||
p = todo_sub.add_parser("add", help="新增一条待办")
|
||||
p.add_argument("title", help="待办标题(必填)")
|
||||
p.add_argument("-p", "--priority", default="normal",
|
||||
choices=["high", "normal", "low"], help="优先级,默认 normal")
|
||||
p.add_argument("-d", "--due-at", type=int, default=None,
|
||||
help="截止时间(Unix 秒,可选)")
|
||||
p.set_defaults(handler=lambda a: cmd_add(
|
||||
title=a.title, priority=a.priority, due_at=a.due_at))
|
||||
|
||||
p = todo_sub.add_parser("list", help="列出待办")
|
||||
p.add_argument("-s", "--status", default=None,
|
||||
choices=["pending", "done"], help="按状态过滤")
|
||||
p.add_argument("-n", "--limit", type=int, default=100, help="返回数量上限")
|
||||
p.set_defaults(handler=lambda a: cmd_list(status=a.status, limit=a.limit))
|
||||
|
||||
p = todo_sub.add_parser("done", help="标记完成(可传逗号分隔的多个 id)")
|
||||
p.add_argument("ids", help="待办 id 或逗号分隔的 id 列表(如 1 或 1,2,3)")
|
||||
p.set_defaults(handler=lambda a: cmd_done(todo_ids=_parse_ids(a.ids)))
|
||||
|
||||
p = todo_sub.add_parser("delete", help="删除(可传逗号分隔的多个 id)")
|
||||
p.add_argument("ids", help="待办 id 或逗号分隔的 id 列表")
|
||||
p.set_defaults(handler=lambda a: cmd_delete(todo_ids=_parse_ids(a.ids)))
|
||||
|
||||
p = todo_sub.add_parser("stats", help="简单统计")
|
||||
p.set_defaults(handler=lambda _a: cmd_stats())
|
||||
|
||||
|
||||
|
||||
def _add_remind_subparser(sub) -> None:
|
||||
sp = sub.add_parser("remind", help="演示 async 提醒任务(job_context/emit/finish)")
|
||||
sp.add_argument("-s", "--seconds", type=int, default=3,
|
||||
help="模拟运行秒数,默认 3")
|
||||
sp.set_defaults(handler=lambda a: cmd_remind(seconds=a.seconds))
|
||||
|
||||
|
||||
def build_parser() -> ZhArgumentParser:
|
||||
p = ZhArgumentParser(
|
||||
prog="main.py",
|
||||
description="通用业务技能模板:任务执行命令骨架、健康检查、版本输出。",
|
||||
description="待办事项",
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||
)
|
||||
sub = p.add_subparsers(dest="cmd", required=True, parser_class=ZhArgumentParser)
|
||||
|
||||
sp = sub.add_parser("run", help="任务执行命令骨架")
|
||||
sp.add_argument("--target", "-t", default=None, metavar="目标")
|
||||
sp.add_argument("--input-id", "-i", default=None, metavar="输入id", dest="input_id")
|
||||
sp.add_argument("run_tail", nargs="*", metavar="位置参数")
|
||||
sp.set_defaults(handler=_handle_run)
|
||||
sp = sub.add_parser("init-db", help="幂等初始化 SQLite 与数据管理元数据")
|
||||
sp.set_defaults(handler=lambda _a: cmd_init_db())
|
||||
|
||||
_add_run_subparser(sub)
|
||||
_add_remind_subparser(sub)
|
||||
|
||||
sp = sub.add_parser("health", help="健康检查")
|
||||
sp.set_defaults(handler=lambda _a: cmd_health())
|
||||
|
||||
sp = sub.add_parser("config-path", help="输出用户 .env 与模板路径")
|
||||
sp.set_defaults(handler=lambda _a: cmd_config_path())
|
||||
|
||||
sp = sub.add_parser("version", help="版本信息(JSON)")
|
||||
sp.set_defaults(handler=lambda _a: cmd_version())
|
||||
|
||||
sp = sub.add_parser("init-db", help="幂等初始化本地数据库与数据管理元数据")
|
||||
sp.set_defaults(handler=lambda _a: cmd_init_db())
|
||||
sp = sub.add_parser("config-path", help="输出 .env 与模板路径")
|
||||
sp.set_defaults(handler=lambda _a: cmd_config_path())
|
||||
|
||||
return p
|
||||
|
||||
|
||||
@@ -98,11 +125,14 @@ def main(argv: Optional[List[str]] = None) -> int:
|
||||
if not argv:
|
||||
_print_full_usage()
|
||||
return 1
|
||||
|
||||
if len(argv) == 2 and argv[0] not in {
|
||||
"run", "health", "config-path", "version", "init-db",
|
||||
"-h", "--help",
|
||||
}:
|
||||
return cmd_run(target=argv[0], input_id=argv[1])
|
||||
|
||||
parser = build_parser()
|
||||
args = parser.parse_args(argv)
|
||||
return int(args.handler(args))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user