refactor(literature-search-verify): 草稿输出从 .claude/skills 挪到项目根目录 output/
技能自己的目录里混入运行时草稿数据不太合适——如果以后要把 skill 当独立包 复用/分享,草稿数据会被一起打包进去。改为统一放到 <project-root>/output/ <skill-name>/<topic-slug>/,并按主题分子目录(topic-slug 规则和 references/ 下的归档目录一致),避免不同主题的草稿用无区分度的通用文件名互相覆盖/混堆 (这个问题在旧的 output/ 目录里已经实际发生过)。 同步更新了 SKILL.md、archive_references.py 的示例路径、已归档的 README 里 指向草稿目录的说明,以及 CLAUDE.md 里的目录结构图和相应设计原则。现有的 草稿文件已按此规则搬到 output/literature-search-verify/uav_aeromagnetic_compensation/ 下。.gitignore 里原有的 output 规则本来就不带路径前缀,新位置无需改动即可 继续被正确忽略。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -25,12 +25,31 @@ description: Search academic literature across arXiv, Semantic Scholar, Crossref
|
||||
`scripts/` 目录下已经写好了能直接跑的检索脚本,不依赖任何第三方Python包,也不需要装MCP工具:
|
||||
|
||||
```bash
|
||||
# 始终从项目根目录调用(脚本本身不关心cwd,但--bib-out等输出路径按项目根目录约定拼)。
|
||||
# 一次性搞定:检索 arXiv + Semantic Scholar + Crossref,自动去重、逐条验证,
|
||||
# 并把通过验证的条目写成BibTeX文件——这是应该默认调用的入口
|
||||
python3 scripts/literature_search.py "UAV magnetic compensation Tolles-Lawson" \
|
||||
--max-per-source 8 --bib-out refs.bib
|
||||
mkdir -p output/literature-search-verify/uav_aeromagnetic_compensation
|
||||
python3 .claude/skills/literature-search-verify/scripts/literature_search.py \
|
||||
"UAV magnetic compensation Tolles-Lawson" \
|
||||
--max-per-source 8 \
|
||||
--bib-out output/literature-search-verify/uav_aeromagnetic_compensation/refs.bib
|
||||
```
|
||||
|
||||
草稿路径(检索报告JSON、下载的PDF、中间生成的bib)统一落在项目根目录下的
|
||||
`output/literature-search-verify/`,不要写回技能自己的目录里(`.claude/skills/`
|
||||
应该只放技能代码,不放运行时产生的草稿数据)。如果项目里以后还有别的技能也
|
||||
需要草稿区,各自建 `output/<skill-name>/` 子目录,互不混放。
|
||||
|
||||
**同一个技能内部也要按主题分开,不要所有检索会话都堆在同一层**:开始一个新
|
||||
主题的检索时,先按"和第六步归档时同样的规则"把主题名转成 slug(小写、非
|
||||
字母数字换成下划线,比如"UAV aeromagnetic compensation" → `uav_aeromagnetic_compensation`),
|
||||
建 `output/literature-search-verify/<topic-slug>/` 子目录,这一整个主题下
|
||||
不管跑多少轮检索、多少条不同的query,原始JSON/bib草稿都写进这一个子目录里
|
||||
(文件名可以随意区分轮次,比如`q1.json`/`q2.json`),不要用不带主题区分的
|
||||
通用文件名散落在`output/literature-search-verify/`根下。这样同一个主题的
|
||||
草稿和第六步归档产出的`references/<topic-slug>/`目录能通过同一个slug对上号,
|
||||
之后回来补充检索同一主题时也知道去哪个子目录续。
|
||||
|
||||
正常情况下**只需要跑这一条命令**,它内部会依次调用 `search_arxiv.py`、`search_semantic_scholar.py`、`search_crossref.py` 做检索,再对每条合并后的候选文献跑 `verify_citation.py` 做交叉验证,输出一份JSON报告(每条候选都带`verdict`字段)。如果只是想单独查一个来源,或者针对某一条文献单独复核,再分别调用对应的单个脚本(用法见每个脚本文件开头的docstring)。
|
||||
|
||||
如果这些脚本因为网络原因跑不动(比如内网/代理限制导致连不上 arxiv.org、semanticscholar.org、crossref.org),`literature_search.py` 会把每个来源的报错单独记在`search_errors`里而不是直接崩溃——这时候老实告诉用户"检索脚本连不上网络,以下是报错信息",不要退回去凭记忆编文献。如果用户这边确实连不上这几个学术API域名,才退回到 web_search 工具,并在结果里明确标注"来自通用网络搜索的补充结果,未经过脚本的交叉验证流程,置信度较低"。
|
||||
@@ -66,15 +85,19 @@ MCP 检索工具覆盖的是 arXiv/Semantic Scholar/Crossref 这类有公开 API
|
||||
|
||||
### 第六步:归档
|
||||
|
||||
`output/` 目录只是脚本运行时的草稿区——里面混着每一轮探索性检索的原始JSON(包括被过滤掉的噪声,比如"Tolles""Lawson"被当成人名匹配出的无关文献),不适合作为最终交付物,而且随着会话增多会越堆越乱、也不方便下次会话或用户直接翻阅。
|
||||
`<project-root>/output/literature-search-verify/` 只是脚本运行时的草稿区——里面
|
||||
混着每一轮探索性检索的原始JSON(包括被过滤掉的噪声,比如"Tolles""Lawson"被当成
|
||||
人名匹配出的无关文献),不适合作为最终交付物,而且随着会话增多会越堆越乱、也不
|
||||
方便下次会话或用户直接翻阅。
|
||||
|
||||
所以每次整理出一份**稳定可信的参考文献列表**(不管是第一轮检索还是后续多轮补充检索合并后的结果)之后,调用归档脚本把它固化到项目级目录,而不是留在技能自己的`output/`里:
|
||||
所以每次整理出一份**稳定可信的参考文献列表**(不管是第一轮检索还是后续多轮补充检索合并后的结果)之后,调用归档脚本把它固化到项目级目录,而不是留在草稿区里:
|
||||
|
||||
```bash
|
||||
python3 scripts/archive_references.py "UAV aeromagnetic compensation" \
|
||||
--bib output/uav_aeromagnetic_compensation_final.bib \
|
||||
python3 .claude/skills/literature-search-verify/scripts/archive_references.py \
|
||||
"UAV aeromagnetic compensation" \
|
||||
--bib output/literature-search-verify/uav_aeromagnetic_compensation_final.bib \
|
||||
--project-root . \
|
||||
--pdfs-dir output/pdfs \
|
||||
--pdfs-dir output/literature-search-verify/pdfs \
|
||||
--suspect "某条可疑文献标题|不建议引用的具体原因" \
|
||||
--notes "检索覆盖了哪些方向、哪些方向搜了但没结果、中文文献缺口提醒等"
|
||||
```
|
||||
|
||||
@@ -13,11 +13,14 @@ what's there without re-reading the conversation that produced it.
|
||||
|
||||
No third-party dependencies; uses only the standard library.
|
||||
|
||||
CLI usage:
|
||||
python3 archive_references.py "UAV aeromagnetic compensation" \\
|
||||
--bib output/uav_aeromagnetic_compensation_final.bib \\
|
||||
CLI usage (run from the project root; scratch input lives under
|
||||
output/literature-search-verify/<topic-slug>/, matching the slug this
|
||||
script derives from the topic argument):
|
||||
python3 .claude/skills/literature-search-verify/scripts/archive_references.py \\
|
||||
"UAV aeromagnetic compensation" \\
|
||||
--bib output/literature-search-verify/uav_aeromagnetic_compensation/uav_aeromagnetic_compensation_final.bib \\
|
||||
--project-root . \\
|
||||
--pdfs-dir output/pdfs \\
|
||||
--pdfs-dir output/literature-search-verify/uav_aeromagnetic_compensation/pdfs \\
|
||||
--suspect "Some fabricated-looking title|DOI resolves but venue is topically unrelated" \\
|
||||
--notes "Kalman-filter and GA/PSO angles searched, no on-topic hits found."
|
||||
|
||||
|
||||
Reference in New Issue
Block a user