dsh-paper
把一堆材料变成一篇能过查重、经得起答辩的论文,和一个讲得清楚的你。
dsh-paper 是 DeepSeek Harness 的单一插件:
给它学校模板、论文要求、实验数据、代码和参考文献,它会先追问、再动手——
把要求问成一份可证伪的《意图规格》,然后按九个阶段推进:选题 → 开题 → 文献 → 设计 → 实现 → 测试 → 论文 → 合规 → 答辩,
全程留痕(台账 + 决定日志 + 检索记录 + 检查报告),每一步都要你拍板。
它由四个插件合并而成(ATTRIBUTION.md):论文流水线(原 dsh-thesis)、
长期记忆(原 dsh-mem)、苏格拉底闸门(原 dsh-socrates)、代码理解训练(原 dsh-ai-learning),
外加四块新能力:Office 材料摄取、材料到手后的逐题追问、本地降重闭环、答辩幻灯生产。
纯 TypeScript,零运行时第三方依赖(唯一的 devDependency 是 TypeScript 本身)。
30 秒上手
npm install && npm run build # 先构建出 lib/(插件必须发布编译后的 JS)
# 安装方式 1(标准路径;dsh 会把安装转发给 pnpm,需要机器上有 pnpm)
dsh plugin --profile web add <本仓库路径>
# 安装方式 2(没有 pnpm 时的兜底:建 profile 联接 + 打印补丁片段,然后重启 dsh)
node scripts/install-into-profile.mjs --profile web
# 2. 重启 dsh,然后在对话里说:
# 「这是我的论文材料」+ 把学校模板/要求文档/实验数据丢进工作区
它会:thesis_ingest 读材料 → thesis_intake 一次问你一个问题 → 写 00-管理/意图规格.md
→ 建工作区(thesis_init)→ 按阶段推进。
没有材料也能用:直接说「我要做毕业设计,还没定题」→ 走选题工作坊。
它到底怎么工作
你的材料(docx / xlsx / pptx / pdf / md / csv / 代码 / 文献)
│
thesis_ingest │ 读成纯文本 + 材料清单
▼
┌──────────────────────────────────────────────────────────┐
│ thesis_intake:苏格拉底式逐题追问(一次只问一个问题) │
│ 每问都带:为什么问 · 影响哪个产出 · 合格答案长什么样 │
│ 材料里已能读出来的一律不问;答不全的显式列为阻塞项 │
└──────────────────────────────────────────────────────────┘
│
00-管理/意图规格.md(唯一真相)
▼
┌────────── 九阶段流水线(G1-G4 人工关卡不可跳) ──────────┐
│ 选题 → 开题 → 文献 → 设计 → 实现 → 测试 → 论文 → 合规 → 答辩 │
│ 零假文献(只认真实检索)· 零假数据(只认真实运行) │
└──────────────────────────────────────────────────────────┘
│
┌──────────────┬──────────┴──────────┬──────────────┐
▼ ▼ ▼ ▼
论文.docx 答辩幻灯 PPT.md 降重报告 + 复测 长期记忆
(内置零依赖 (Marp 兼容,可 (本地度量, (跨会话记住
生成器/pandoc) marp/pandoc → pptx) 不接收费系统) 学校规范与偏好)
为什么先追问:写错方向的代价是整章重写,而问清楚只要十分钟。这是本插件与「AI 直接生成论文」的根本区别。
而且它不靠自觉:说「帮我写第三章」时,如果意图规格还没立全(缺学校模板/字数/查重阈值/时间线),
agent/pre-step 闸门会注入一条指令强制模型先去追问;规格就绪后闸门自动安静;
想跳过就说「直接写」(插件会要求它列出采用的假设)。
工具全集
入口:材料与意图
| 工具 | 作用 |
|---|
thesis_ingest | 摄取材料:.docx/.xlsx/.pptx/.pdf/.md/.txt/.csv/.json/.bib/.ris/.html → 文本摘要;源码目录 → 代码结构摘要(文件/行数/声明/技术栈指纹,不贴源码正文);写 00-管理/材料清单.md 与逐文件摘要。旧格式 .doc/.xls/.ppt 会明确提示另存为新格式 |
thesis_intake | 逐题追问状态机:start/ask/answer/skip/status/spec/done → 落盘 00-管理/意图规格.md(断点续问,永不丢答案) |
流水线
| 工具 | 作用 |
|---|
thesis_init | 建论文工作区:九阶段目录、台账、决定日志、时间线、七章模板、文献库骨架、技能包 → .dsh/skills/,可选 git 首提交 |
thesis_progress | 台账读写 + G1-G4 闸门(report/update/gate):未过 G1 不许推进阶段、未过 G2 不许验收章节 |
thesis_decision | 追加决定日志(内容/理由/备选)——答辩「为什么这么做」的答案库 |
thesis_lit_search | 真实检索:Semantic Scholar → DBLP → arXiv → Crossref 失败降级;结果带真实 DOI/URL 并缓存留痕 |
thesis_lit_save | 把检索到的文献(按缓存 id)收录进 02-文献/refs.bib;DOI 去重;不接受缓存外的 id(零假文献机制) |
thesis_lit_note | 生成文献阅读笔记骨架(五节模板,摘要自动填入) |
thesis_review | 单章确定性评审六项:字数区间、大纲齐全、引用对应、图表编号、未完成标记、G2 清单 |
thesis_check | 全文五项检查:引用双向一致、每章字数、图表编号、术语先定义后使用、学校模板探测 |
thesis_build | 出 论文.docx:优先 pandoc + 学校模板;无 pandoc 用内置零依赖 docx 生成器(自实现 ZIP/CRC32/WordprocessingML) |
thesis_ai_selfcheck | AI 味自查六条启发式(套话/空洞结论/自我暴露/翻译腔/句式单一/无锚点),附行号与改写建议 |
合规与降重
| 工具 | 作用 |
|---|
thesis_dedup | scan 找高风险段落(行号 + 命中来源 + 改写处方)→ 改完 verify 复测降幅 → report 汇总(可回填学校检测结果)。本地确定性估算,不接知网/维普 |
答辩
| 工具 | 作用 |
|---|
thesis_defense_prep | 提取答辩素材 + 六类必问问题库(实现细节/技术选型/需求背景/工作量/数据可信/不足展望),附证据锚点 |
thesis_ppt | outline 生成 10-12 页 Marp 兼容 07-答辩/PPT.md(含讲稿与证据锚点)→ check 六项检查 → convert 用 marp/pandoc 出 pptx;没有转换器就给出可直接复制的命令与兜底方案 |
跨模块能力
| 工具 | 作用 |
|---|
memory_search / memory_remember / memory_context | SQLite 长期记忆(默认 $DSH_HOME/paper-memory.db):记住学校规范、你的写作偏好、导师要求。而且不只被动查询——你说的话与记忆相关时(词面重叠),插件自动把相关条目作为「记忆卡片」放回上下文(最多 4 条/600 字符,记忆没变就不重复注入) |
learn_status / learn_next / learn_update | 代码理解训练:把 AI 写的系统拆成能编译的学习骨架 + 验证门 + 可评分苏格拉底问答,保证「你的系统怎么实现的」这类必问问不倒你 |
斜杠命令
/thesis-status /thesis-decide /thesis-lit /thesis-check /thesis-build
/thesis-ingest /thesis-intake /thesis-dedup /thesis-ppt /learn
技能包(方法论,随插件发布)
| 技能 | 触发时机 |
|---|
thesis-pipeline | 每次会话开始(阶段、关卡、工具地图) |
thesis-opener | 选题、开题报告、G1/G3 |
thesis-literature | 文献检索与综述 |
thesis-eng-design | 需求/设计/实现/测试规范 |
thesis-writing | 写作规范与去 AI 味规则 |
thesis-citation | GB/T 7714-2015 著录 |
thesis-defense | 答辩准备与幻灯链路 |
paper-intake | 材料到手后的追问方法论 |
paper-dedup | 降重的诚实做法(什么能改、什么绝不能改) |
code-learning | 答辩前的代码理解训练 |
socratic | 意图模糊、方案需要对抗式审查时 |
thesis_init 会把整套技能复制进论文仓库 .dsh/skills/(项目级 rank 100,优先级最高),
所以技能随论文一起 git 版本化、换机器不丢。
配置
所有字段都有默认值;在 profile 的 cordis.patch.yml 里覆盖:
- id: paper
name: dsh-paper
config:
memoryPath: /path/to/paper-memory.db # 默认 $DSH_HOME/paper-memory.db
similarity: { shingle: 4, threshold: 0.3, minChars: 30 } # 降重度量参数
ppt: { engine: auto, theme: default, timeoutMs: 120000 } # auto|marp|pandoc|none
intake: { maxQuestions: 12, specRel: '00-管理/意图规格.md' }
ingest: { maxBytes: 33554432, maxChars: 60000 }
learn: { stateDir: '.paper', gates: { go: { build: [go, build, ./...] } }, maxCapturedOutput: 8000 }
recall: { maxEntries: 4, maxChars: 600, minKeywordLength: 2 } # 记忆回灌
# 苏格拉底闸门(原 dsh-socrates)
promptGate: true
destructiveGate: true
maxQuestions: 3
红线(写在护栏里,不是写在文档里)
- 零假文献:正文引用只能来自
thesis_lit_search 的真实检索缓存;thesis_lit_save 拒绝缓存外的 id;thesis_check 复核双向一致。
- 零假数据:实验数据、截图、运行结果必须来自真实运行。工具与技能都不支持伪造,
thesis_dedup 明确禁止为降重改动数据与结论。
- 人是作者:G1-G4 关卡由
thesis_progress 强制,未过闸门不许推进;决定必须由用户拍板。
- 规范以学校文件为准:学校模板缺失时,用内置过渡模板并显式标注"非学校模板",绝不假装合规。
- 降重不是洗稿:本插件不接收费查重系统,报告里的重复率是本地估算,与学校结果不可等同;用户自行送检后可回填对照。
已知边界(诚实清单)
- PDF 抽取是尽力而为:扫描版 PDF(无文本层)、对象流/加密 PDF 可能抽不出文字,工具会明确返回原因而不是编造内容。
- 旧格式不支持:
.doc/.xls/.ppt 请先另存为新格式。
- PPT 不自研生成器:产出 Marp 兼容 Markdown,
.pptx 依赖外部 marp/pandoc;两者都没有时给出可执行命令与兜底路径(幻灯文字已是最终稿,成稿只是排版)。
- 降重不接收费系统:无账号,也不该接入;度量口径与算法参数全部写在报告里,可复现、可质疑。
- 类型来自本地 shim:为了让本仓库零依赖即可
tsc 通过,宿主契约以 src/types/shims.d.ts 声明(宽松签名),真实契约核对记录在 docs/host-api.md;运行时行为由真实磁盘端到端与真实 dsh plugin add 装载验证兜底。
- 学习训练的语言矩阵:验证门表内置 Go/TS/Python/Rust,其余语言需在配置里补
gates。
dsh plugin 需要 pnpm:DSH 的插件安装会转发给 pnpm;机器上只有 Node 时用 node scripts/install-into-profile.mjs --profile <名> 兜底(建 profile 联接 + 打印补丁片段),或先 corepack enable pnpm / npm i -g pnpm。
- 本仓库的宿主类型来自本地 shim:
src/types/shims.d.ts 是刻意的取舍(离线可 tsc、零依赖),真实签名核对记录在 docs/host-api.md;生产环境的运行时行为由 scripts/host-smoke.mjs 在真实宿主依赖树里验证。
开发
npm install # 只装 typescript 与 schemastery
npm run build # tsc → lib/(相对导入 .ts → .js 由 rewriteRelativeImportExtensions 处理)
npm run typecheck # tsc --noEmit
npm test # node --test tests/(Node 24 直接跑 .ts,类型擦除)
# 沙箱/受限环境(禁止子进程管道,node --test 的默认隔离会 EPERM)下用同一进程跑:
npm run test:sandbox
# 真实宿主装配冒烟:把编译产物装进真实 DSH 依赖树(junction 到本机农场),
# 用真实 cordis + dsh-tools 注册并执行工具,并检查卸载时工具被注销。
node scripts/host-smoke.mjs && node .host-smoke/app/run.mjs
# 真实磁盘/真实网络端到端(会建临时目录 / 访问学术 API;需要普通 shell,不能被沙箱限制子进程)
npm run test:e2e
详细设计见 DESIGN.md,来源与合并说明见 ATTRIBUTION.md,宿主契约见 docs/host-api.md。
许可
MIT