fix(cli): 程序名只替换模板占位符,不再改写用户数据(M82 r2 复审 P2)

r1 把 `rename` 套在**插值后的整条文本**上,于是用户数据被改坏:账户名恰好是 `ull` 会变成
`unlucky-launcher`,路径 `D:/tmp/ull/.ULL/...` 会变成 `D:/tmp/unlucky-launcher/.ULL/...`,
回显的子命令 `ull` 也会被改名。

改成模板占位符:文案里写 `%prog%`,**只在渲染时**(print_report / print_error / 帮助)替换成
argv[0] 的 basename。占位符只存在于静态模板里,插值进来的账户名 / 路径 / 子命令碰不到它。
用 `%prog%` 而不是 `{prog}`:这些模板要活在 `format!` 里,`{prog}` 会被 format! 当成参数名
编译失败。

同时补上 r1 漏的反方向:**stdout 的正常输出**(Report.human 与 warnings)现在也做替换,
以前只有 stderr 的错误做了,两边不一致。

回归测试:`user_data_that_says_ull_is_never_rewritten` 断言「账户名 `ull`」「路径 `\ull\`」
「未知命令 `ull`」在 fill 之后逐字不变。

占位符替换覆盖 21 个文件的 63 处文案;测试夹具里形如 `ull-mcp-diagnose-<pid>` 的临时目录名
已回滚为字面量(那不是文案)。
This commit is contained in:
AskaEth committed 2026-11-02 08:08:13 +08:00
1 parent c9e6236a87
commit 2f8bbd1746
20 files changed
+99 -105

No files matched your search

+2 -2
View File
@@ -52,7 +52,7 @@ pub fn welcome() -> Report {
#[must_use]
pub fn help(topic: Option<&str>) -> Report {
let text = match topic.and_then(help::topic) {
Some(text) => program::rename(text, &program::name()),
Some(text) => program::fill(text),
None => general_help(),
};
let data = json!({
@@ -64,5 +64,5 @@ pub fn help(topic: Option<&str>) -> Report {
/// 总帮助,按被调用的二进制名自述(`ull` 自己跑时逐字不变)。
fn general_help() -> String {
program::rename(help::general(), &program::name())
program::fill(help::general())
}