推送端技能输入补翻页循环:下一页/上一页/第N页/next/last/one page 与拉取端同一条 parse_page_cmd,编号/二次确认/路径直输全保留,26项测试全绿

This commit is contained in:
ypshidifu
2026-09-24 10:18:03 +08:00
parent 8203076851
commit 3e50827c00
+48 -23
View File
@@ -242,8 +242,9 @@ def _pull_one(name: str, src: dict) -> None:
def _flow_push() -> None:
"""推送 / 覆盖更新(宝宝级):选目标终端 -> 打印本机 skill 编号列表 ->
输编号选技能(1 / 1. 二次确认打印名字+简介,confirm 执行 / cancel 回退;
"""推送 / 覆盖更新(宝宝级):选目标终端 -> 打印本机 skill 编号列表(带翻页)->
翻页(下一页/上一页/第N页/next/last,与拉取端同一条 parse_page_cmd)、
输编号选技能(1 / 1. 二次确认打印名字+简介,confirm 执行 / cancel 回列表;
1 -confirm 跳过二次确认)或直接贴路径 / zip / SKILL.md -> 校验规范 -> 探查同名
-> 确有同名才问一次覆盖 -> 写入。
目标没有同名文件夹时直接写(没有目录和内容,覆盖无从谈起,问了也是白问)。
@@ -255,29 +256,53 @@ def _flow_push() -> None:
return
# 选完目标就打本机 skill 列表(带编号)——push 要推的是本机技能
local_names = ocskill.list_skill_names(ocskill.WIN_LOCAL_ROOT)
if local_names:
ocskill.render_page(local_names, 1, ocskill.WIN_LOCAL_ROOT)
print(" 提示:编号 1 / 1. 会打印名字+简介二次确认(confirm 执行 / cancel 回退),"
"1 -confirm 跳过确认;也可以直接贴路径 / zip / SKILL.md")
src = ocskill.clean_input(ask(" 技能输入(编号 / 路径 / zip / SKILL.md,可带引号,回车取消): "))
if not src:
return
# 0) 编号选择本机 skill(协议:1 / 1. 二次确认,1 -confirm 跳过)
sel = ocskill.parse_sel(src)
if sel is not None:
if not local_names:
print(" 本机 skill 目录为空,编号没得选;请直接贴路径 / zip。")
src = None
if not local_names:
# 本机没列表可打:退化成单次输入(没有编号/翻页可言)
src = ocskill.clean_input(ask(" 技能输入(路径 / zip / SKILL.md,可带引号,回车取消): "))
if not src:
return
idx, skip = sel
if not (1 <= idx <= len(local_names)):
print(" 序号超出范围(1-%d)。" % len(local_names))
else:
print(" 提示:编号 1 / 1. 会打印名字+简介二次确认(confirm 执行 / cancel 回列表),"
"1 -confirm 跳过确认;翻页:下一页/上一页/第N页/next/last/one page;"
"也可直接贴路径 / zip / SKILL.md")
page = 1
while True:
# 每次进循环先把当前页(带编号)打出来 —— 含首次进入
page, pages = ocskill.render_page(local_names, page, ocskill.WIN_LOCAL_ROOT)
cmd = ocskill.clean_input(ask(
" 技能输入:翻页(下一页/上一页/第N页/next/last);编号选本机技能;"
"或贴路径 / zip / SKILL.md;q 取消: "))
if not cmd:
print(" 已取消推送(回车=取消;翻页 / 编号 / 路径都能输)。")
return
if _norm(cmd) in ("q", "quit", "退出", "取消", "0", "b", "back", "返回"):
print(" 已取消推送。")
return
# 1) 翻页命令(与拉取端同一条 parse_page_cmd:中英双语全支持)
np = ocskill.parse_page_cmd(cmd, page, pages)
if np is not None:
page = np
continue
# 2) 编号选择本机 skill(协议:1 / 1. 二次确认,1 -confirm 跳过)
sel = ocskill.parse_sel(cmd)
if sel is not None:
idx, skip = sel
if not (1 <= idx <= len(local_names)):
print(" 序号超出范围(1-%d),重输。" % len(local_names))
continue
if not (skip or _confirm_sel(idx, local_names, ocskill.WIN_LOCAL_ROOT,
extra="目标:%s" % tgt["dir"])):
print(" 已回退到列表,未推送。")
continue
src = os.path.join(ocskill.WIN_LOCAL_ROOT, local_names[idx - 1])
print(" 选定:「%s」 -> %s" % (local_names[idx - 1], src))
break
# 3) 其余输入 = 路径 / zip / SKILL.md,交给下面的规范校验去判
src = cmd
break
if not src:
return
if not (skip or _confirm_sel(idx, local_names, ocskill.WIN_LOCAL_ROOT,
extra="目标:%s" % tgt["dir"])):
print(" 已取消推送。")
return
src = os.path.join(ocskill.WIN_LOCAL_ROOT, local_names[idx - 1])
print(" 选定:「%s」 -> %s" % (local_names[idx - 1], src))
# 1) 先过一遍规范校验(只读探查,不写盘)
probe = ocskill.probe_push(src, root=tgt["dir"])
if not probe.get("ok"):