Review #62 的时候发现的。
现象
search-en 的输出结构会因为加不加 --workspace 而改变,而且和三个浏览器命令不一致:
| 调用 |
输出 |
search-en --query X |
{papers, total, sources} |
search-en --query X --workspace D |
{search: {papers, total, sources}, workspace, papers_added, total_stored} ← 多包了一层 |
search-google --query X --workspace D |
{papers, total, source, workspace, papers_added, total_stored} ← 平铺 |
根源是 scholar-cli/cmd/root.go:123 这一行:
output.Success(map[string]any{
"search": result, // ← 把整个 result 塞进一个 key,多了一层嵌套
"workspace": workspace,
"papers_added": added,
"total_stored": s.Count(),
})
而 #63 之后三个浏览器命令走的是 emitSearch(root.go:56),它是平铺的:
output.Success(map[string]any{
"papers": papers,
"total": len(papers),
"source": source,
"workspace": workspace,
"papers_added": added,
"total_stored": s.Count(),
})
为什么是问题
这个 CLI 的主要消费者是 agent。现在 agent 想拿论文列表,得写成这样:
搜的是 search-en 还是 search-google? → 决定 sources 还是 source
search-en 的话,有没有带 --workspace? → 决定 .papers 还是 .search.papers
一个可选 flag 不应该改变输出的形状——它只该往里加字段。而且 README.md 只写了 search-en 返回 {papers, total, sources},嵌套那一版在任何文档里都没提,等于是个没写下来的隐藏契约。
建议
把 search-en 拉平,和 emitSearch 对齐:
data := map[string]any{
"papers": result.Papers,
"total": result.Total,
"sources": result.Sources,
}
if workspace != "" {
// ... 加 workspace / papers_added / total_stored
}
更好的做法是顺手把 search-en 也收进 emitSearch(多源版本要多带一个 sources 字段),这样四个搜索命令共用一条输出路径,以后不会再各自漂移。
改完记得同步 scholar-cli/README.md 的 Commands 表——--workspace 会多返回哪几个字段,目前一个字都没写。
兼容性
我搜过了,skills/ 和 recipes/ 里没有任何地方消费 .search.*,所以这是个安全的改动,不用担心破坏现有 recipe。
上手提示
- 相关代码全在
scholar-cli/cmd/root.go 一个文件里
- 本地验证:
cd scholar-cli && go build -o scholar-cli . && ./scholar-cli search-en --query "transformer" --limit 3 ,然后加 --workspace /tmp/ws 再跑一次,对比两次的 JSON 结构
search-en 走公开 API,不需要浏览器和 WebBridge,改起来好验证
Review #62 的时候发现的。
现象
search-en的输出结构会因为加不加--workspace而改变,而且和三个浏览器命令不一致:search-en --query X{papers, total, sources}search-en --query X --workspace D{search: {papers, total, sources}, workspace, papers_added, total_stored}← 多包了一层search-google --query X --workspace D{papers, total, source, workspace, papers_added, total_stored}← 平铺根源是
scholar-cli/cmd/root.go:123这一行:而 #63 之后三个浏览器命令走的是
emitSearch(root.go:56),它是平铺的:为什么是问题
这个 CLI 的主要消费者是 agent。现在 agent 想拿论文列表,得写成这样:
一个可选 flag 不应该改变输出的形状——它只该往里加字段。而且
README.md只写了search-en返回{papers, total, sources},嵌套那一版在任何文档里都没提,等于是个没写下来的隐藏契约。建议
把
search-en拉平,和emitSearch对齐:更好的做法是顺手把
search-en也收进emitSearch(多源版本要多带一个sources字段),这样四个搜索命令共用一条输出路径,以后不会再各自漂移。改完记得同步
scholar-cli/README.md的 Commands 表——--workspace会多返回哪几个字段,目前一个字都没写。兼容性
我搜过了,
skills/和recipes/里没有任何地方消费.search.*,所以这是个安全的改动,不用担心破坏现有 recipe。上手提示
scholar-cli/cmd/root.go一个文件里cd scholar-cli && go build -o scholar-cli . && ./scholar-cli search-en --query "transformer" --limit 3,然后加--workspace /tmp/ws再跑一次,对比两次的 JSON 结构search-en走公开 API,不需要浏览器和 WebBridge,改起来好验证