chore: 规范标点

This commit is contained in:
pluv committed 2026-10-03 14:43:43 +08:00
1 parent e54390a9f8
commit 15e79887fa
84 files changed
+5439 -5398

No files matched your search

+28 -28
View File
@@ -1,13 +1,13 @@
#!/usr/bin/env python3
"""shell_screen_check.py - 验证 /shell 记录里对全屏程序的处理
交互式 shell 的原始输出里混着转义序列、重绘空格和全屏程序的整屏画面。
不清洗的话模型看到的就是几百个空格加一串光标定位;清过头又会把命令和
状态行一起吃掉。这里用 printf 造出确定的输入来钉住行为:
交互式 shell 的原始输出里混着转义序列、重绘空格和全屏程序的整屏画面.
不清洗的话模型看到的就是几百个空格加一串光标定位; 清过头又会把命令和
状态行一起吃掉. 这里用 printf 造出确定的输入来钉住行为:
1. 备用屏幕(vim/less/top 走这条路)——画面必须省略,只留首尾标记;
2. 成片空格(nano/top 靠空格重绘)——必须压掉,但短缩进要原样保留;
3. 大输出里夹着的备用屏幕——跨 read 也要能认出来。
1. 备用屏幕 (vim/less/top 走这条路)——画面必须省略, 只留首尾标记;
2. 成片空格 (nano/top 靠空格重绘)——必须压掉, 但短缩进要原样保留;
3. 大输出里夹着的备用屏幕——跨 read 也要能认出来.
用法:
shell_screen_check.py <ligent 二进制> <mock base-url>
@@ -27,18 +27,18 @@ NORMAL_TEXT = "正常输出"
def drive(binary, base, commands, wait=1.6, term="xterm-256color"):
"""在 pty 里跑 ligent,进 /shell 执行 commands,导出后返回记录文本。
"""在 pty 里跑 ligent, 进 /shell 执行 commands, 导出后返回记录文本.
term=None 表示不设 TERM,用来观察退化行为。"""
term=None 表示不设 TERM, 用来观察退化行为. """
saved = os.environ.copy()
os.environ["LIGENT_API_KEY"] = "sk-test"
# 没有 TERM 的话 less/vim 会退回非全屏模式,测不到备用屏幕那条路。
# 没有 TERM 的话 less/vim 会退回非全屏模式, 测不到备用屏幕那条路.
if term is None:
os.environ.pop("TERM", None)
else:
os.environ["TERM"] = term
# 每轮都清空归档:归档名是随机的,按文件名排序取"最后一个"会拿到上一轮。
# 每轮都清空归档:归档名是随机的, 按文件名排序取"最后一个"会拿到上一轮.
bindir = os.path.dirname(os.path.abspath(binary))
shutil.rmtree(os.path.join(bindir, "ligent.archive"), ignore_errors=True)
@@ -47,9 +47,9 @@ def drive(binary, base, commands, wait=1.6, term="xterm-256color"):
os.execv(binary, [binary, "--base-url", base, "--no-confirm", "--auto-save"])
os._exit(127)
# 行编辑器每次回到提示符都会打开括号粘贴 —— 用它当"轮到输入了"的信号。
# 只按"输出安静"等是不行的:等待动画每 250ms 画一帧,pty 永远不会安静
# 超过 idle,于是每次都要白等满整个额度。
# 行编辑器每次回到提示符都会打开括号粘贴 —— 用它当"轮到输入了"的信号.
# 只按"输出安静"等是不行的:等待动画每 250ms 画一帧, pty 永远不会安静
# 超过 idle, 于是每次都要白等满整个额度.
PROMPT_READY = b"\x1b[?2004h"
ready_seen = 0
tail = b""
@@ -104,11 +104,11 @@ def drive(binary, base, commands, wait=1.6, term="xterm-256color"):
return users[-1] if users else ""
def between_markers(rec, start="[全屏程序运行中,画面内容已省略]", end="[全屏程序结束]"):
"""取出"全屏程序"首尾标记之间的内容。
def between_markers(rec, start="[全屏程序运行中, 画面内容已省略]", end="[全屏程序结束]"):
"""取出"全屏程序"首尾标记之间的内容.
命令回显必然把输入里的字面文本也录进去,所以不能直接断言"机密文本不在
记录里"——只能断言它没出现在真正被省略的那段区间内。"""
命令回显必然把输入里的字面文本也录进去, 所以不能直接断言"机密文本不在
记录里"——只能断言它没出现在真正被省略的那段区间内. """
parts = rec.split(start)
if len(parts) < 2:
return None
@@ -135,8 +135,8 @@ def main():
fails += 1
print(" ✗ %s%s" % (name, (" " + detail) if detail else ""))
# ---- 1. 备用屏幕:画面省略,只留首尾标记 ----
print("备用屏幕(vim/less 路径)")
# ---- 1. 备用屏幕:画面省略, 只留首尾标记 ----
print("备用屏幕 (vim/less 路径)")
rec = drive(binary, base, [
r"printf '\033[?1049h" + ALT_TEXT + r"\033[?1049l'",
"echo " + NORMAL_TEXT,
@@ -154,8 +154,8 @@ def main():
check("标记之外的输出还在", NORMAL_TEXT in rec)
check("记录里没有裸转义符", "\x1b" not in rec)
# ---- 2. 成片空格:压掉,但缩进保留 ----
print("成片空格(nano/top 重绘路径)")
# ---- 2. 成片空格:压掉, 但缩进保留 ----
print("成片空格 (nano/top 重绘路径)")
rec = drive(binary, base, [
r"printf 'A'; printf '%0.s ' $(seq 1 200); printf 'B\n'",
r"printf ' 缩进四个空格\n'",
@@ -171,7 +171,7 @@ def main():
check("空白占比低于 40%", blank < 0.40, "实际 %.0f%%" % (100 * blank))
# ---- 3. 大输出里夹着的备用屏幕 ----
print("大输出(跨 read)里的备用屏幕")
print("大输出 (跨 read)里的备用屏幕")
rec = drive(binary, base, [
"head -c 8000 /dev/zero | tr '\\0' 'x'; printf '\\033[?1049h"
+ ALT_TEXT + "\\033[?1049l'",
@@ -185,7 +185,7 @@ def main():
"切断后漏了画面")
check("跨块标记成对出现", body is not None)
# ---- 4. 同一个会话里进两次全屏,标记必须成对 ----
# ---- 4. 同一个会话里进两次全屏, 标记必须成对 ----
print("连续两次进入全屏")
rec = drive(binary, base, [
r"printf '\033[?1049hAAA\033[?1049l'; printf '\033[?1049hBBB\033[?1049l'",
@@ -194,14 +194,14 @@ def main():
check("拿到记录", False, "没有生成归档")
return 1
check("拿到记录", True)
check("两次开始标记", rec.count("[全屏程序运行中,画面内容已省略]") == 2,
"实际 %d 个" % rec.count("[全屏程序运行中,画面内容已省略]"))
check("两次开始标记", rec.count("[全屏程序运行中, 画面内容已省略]") == 2,
"实际 %d 个" % rec.count("[全屏程序运行中, 画面内容已省略]"))
check("两次结束标记", rec.count("[全屏程序结束]") == 2,
"实际 %d 个" % rec.count("[全屏程序结束]"))
# ---- 5. TERM 退化时补一个像样的值 ----
# TERM=dumb 时 nano 会放弃备用屏幕、改成逐行重绘,整段忽略就失效了。
# 而 ligent 自己的 REPL 就在用光标定位,说明终端并非真的 dumb。
# TERM=dumb 时 nano 会放弃备用屏幕、改成逐行重绘, 整段忽略就失效了.
# 而 ligent 自己的 REPL 就在用光标定位, 说明终端并非真的 dumb.
for bad in ("dumb", None):
label = "TERM=%s" % (bad if bad else "(未设置)")
print("退化的 %s" % label)
@@ -213,7 +213,7 @@ def main():
"实际记录:%s" % rec.strip().replace("\n", " | ")[-80:])
shutil.rmtree(archive, ignore_errors=True)
print("\n%d 项检查,%d 项失败" % (total, fails))
print("\n%d 项检查, %d 项失败" % (total, fails))
return 1 if fails else 0