dsh-thesis 1.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/LICENSE +21 -21
  2. package/NOTICE.md +1 -1
  3. package/README.md +48 -204
  4. package/docs/autopilot.md +73 -0
  5. package/docs/config.md +113 -0
  6. package/{DESIGN.md → docs/design.md} +94 -73
  7. package/docs/host-api.md +728 -640
  8. package/docs/release.md +126 -0
  9. package/docs/tools.md +76 -0
  10. package/docs/troubleshooting.md +88 -0
  11. package/docs/usage.md +87 -0
  12. package/lib/autopilot/index.d.ts +38 -0
  13. package/lib/autopilot/index.js +159 -0
  14. package/lib/autopilot/intent.d.ts +40 -0
  15. package/lib/autopilot/intent.js +82 -0
  16. package/lib/autopilot/messages.d.ts +22 -0
  17. package/lib/autopilot/messages.js +35 -0
  18. package/lib/autopilot/types.d.ts +60 -0
  19. package/lib/autopilot/types.js +10 -0
  20. package/lib/codewalk/engine.d.ts +1 -1
  21. package/lib/codewalk/engine.js +1 -1
  22. package/lib/codewalk/gate.d.ts +1 -1
  23. package/lib/codewalk/gate.js +1 -1
  24. package/lib/codewalk/host-types.d.ts +4 -31
  25. package/lib/codewalk/prestep.js +1 -1
  26. package/lib/codewalk/tools.js +2 -2
  27. package/lib/config.d.ts +17 -0
  28. package/lib/config.js +9 -1
  29. package/lib/dedup/index.js +0 -6
  30. package/lib/gates/messages.d.ts +7 -3
  31. package/lib/gates/messages.js +7 -4
  32. package/lib/index.d.ts +3 -1
  33. package/lib/index.js +10 -7
  34. package/lib/ingest/index.d.ts +1 -1
  35. package/lib/ingest/index.js +1 -3
  36. package/lib/intake/gate-rules.d.ts +6 -5
  37. package/lib/intake/gate-rules.js +6 -2
  38. package/lib/intake/index.d.ts +0 -17
  39. package/lib/intake/index.js +0 -51
  40. package/lib/intake/questions.d.ts +1 -1
  41. package/lib/intake/questions.js +1 -1
  42. package/lib/paper/lib/docx.js +70 -70
  43. package/lib/paper/lib/layout.d.ts +1 -1
  44. package/lib/paper/lib/layout.js +372 -372
  45. package/lib/paper/lib/ledger.d.ts +1 -1
  46. package/lib/paper/lib/ledger.js +1 -1
  47. package/lib/paper/lib/lit-cache.js +7 -7
  48. package/lib/paper/register.d.ts +2 -2
  49. package/lib/paper/register.js +2 -8
  50. package/lib/paper/tools/decision.js +5 -5
  51. package/lib/paper/tools/init.d.ts +1 -1
  52. package/lib/paper/tools/init.js +1 -1
  53. package/lib/paper/tools/lit.js +32 -32
  54. package/lib/ppt/index.d.ts +1 -2
  55. package/lib/ppt/index.js +1 -2
  56. package/lib/shared/define-tool.d.ts +1 -1
  57. package/lib/shared/define-tool.js +1 -1
  58. package/package.json +26 -21
  59. package/skills/code-walkthrough/SKILL.md +5 -3
  60. package/skills/thesis-defense/SKILL.md +1 -1
  61. package/skills/thesis-pipeline/SKILL.md +3 -3
  62. package/lib/codewalk/commands.d.ts +0 -23
  63. package/lib/codewalk/commands.js +0 -168
  64. package/lib/commands.d.ts +0 -33
  65. package/lib/commands.js +0 -60
  66. package/lib/dedup/commands.d.ts +0 -21
  67. package/lib/dedup/commands.js +0 -93
  68. package/lib/ingest/commands.d.ts +0 -23
  69. package/lib/ingest/commands.js +0 -74
  70. package/lib/paper/commands.d.ts +0 -13
  71. package/lib/paper/commands.js +0 -84
  72. package/lib/ppt/commands.d.ts +0 -28
  73. package/lib/ppt/commands.js +0 -71
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Paloma966
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 booondenz
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/NOTICE.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # 来源与许可声明(NOTICE)
2
2
 
3
- 本仓库的全部代码与文档均为作者本人(Paloma966)的原创作品,其中一部分由作者此前
3
+ 本仓库的全部代码与文档均为作者本人(booondenz)的原创作品,其中一部分由作者此前
4
4
  在其它宿主环境下的同题材项目整理、合并、重写而来。**没有使用任何第三方代码**,
5
5
  因此这里没有需要致谢的外部贡献者;本文件存在的唯一目的,是如实说明这一点。
6
6
 
package/README.md CHANGED
@@ -2,252 +2,96 @@
2
2
 
3
3
  **把一堆材料变成一篇经得起查重与答辩的论文,和一个讲得清自己系统的你。**
4
4
 
5
- `dsh-thesis` 是 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 的单一插件。
6
- 给它学校模板、论文要求、实验数据、代码和参考文献,它会**先追问、再动手**——
7
- 把要求问成一份可证伪的《意图规格》,然后按九个阶段推进:
5
+ [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 的单一插件。给它学校模板、
6
+ 论文要求、实验数据、代码和参考文献,它先追问、再动手,按九个阶段推进:
8
7
 
9
8
  **选题 → 开题 → 文献 → 设计 → 实现 → 测试 → 论文 → 合规 → 答辩**
10
9
 
11
- 全程留痕(进度台账 + 决定日志 + 检索记录 + 检查报告),每一步都要你拍板。
10
+ **没有斜杠命令。** 在论文工作区里开口说话,插件问一道选择题确认意图,然后自己一轮轮跑下去,
11
+ 只在 G1-G4 人工关卡停下来让你拍板。全程留痕(台账 / 决定日志 / 检索记录 / 检查报告)。
12
12
 
13
- 纯 TypeScript,零运行时第三方依赖(唯一的 devDependency 是 TypeScript 本身)。
14
-
15
- > **立场**:插件对外只呈现**一个领域模型——大学生写论文**。
16
- > 学生的工具清单里只有两个命名空间:`thesis_*`(操作论文工作区里的东西)与
17
- > `fact_*`(跨会话仍然成立的事实:学校规范、导师要求、你的写作偏好)。
18
- > 答辩层的代码演练用 `defense_code_*`。没有第四套命名。
19
-
20
- ---
13
+ 纯 TypeScript,零运行时第三方依赖。对外只有三个命名空间:`thesis_*`、`fact_*`、`defense_code_*`。
21
14
 
22
15
  ## 安装
23
16
 
24
- ```bash
25
- # 从 npm 安装(DSH 的插件安装会转发给 pnpm,机器上需要 pnpm)
26
- dsh plugin --profile web add dsh-thesis
27
-
28
- # 重启 dsh 后确认装上了 —— 应能看到 thesis_* / fact_* / defense_code_* 三个命名空间的工具
29
- ```
17
+ 在 DSH 的**插件管理器里搜索 `dsh-thesis`** 装上,重启 dsh。
30
18
 
31
- **从源码安装**(想改代码、或本机没有 pnpm):
19
+ 从源码装(想改代码,或本机没有 pnpm):
32
20
 
33
21
  ```bash
34
- git clone https://github.com/Paloma966/dsh-thesis.git && cd dsh-thesis
35
- npm install && npm run build # 插件必须发布编译后的 JS,DSH 没有 TS 加载器
36
- dsh plugin --profile web add "$PWD" # 需要 pnpm
37
-
38
- # 没有 pnpm 时的兜底:建 profile 联接 + 打印要粘贴的补丁片段,然后重启 dsh
39
- node scripts/install-into-profile.mjs --profile web
22
+ git clone https://github.com/booondenz/dsh-thesis.git && cd dsh-thesis
23
+ npm install && npm run build # DSH 没有 TS 加载器,必须先编译
24
+ dsh plugin --profile web add "$PWD" # 需要 pnpm
25
+ node scripts/install-into-profile.ts --profile web # 没有 pnpm 时的兜底
40
26
  ```
41
27
 
42
- 卸载:`dsh plugin --profile web remove dsh-thesis`(兜底方式安装的用 `install-into-profile.mjs --remove`)。
43
-
44
- ---
28
+ 卸载:插件管理器里移除,或 `dsh plugin --profile web remove dsh-thesis`。
45
29
 
46
- ## 30 秒上手
30
+ ## 第一次用
47
31
 
48
- 装好并重启 dsh 后,在对话里说:
32
+ 把材料放进论文目录(或告诉它绝对路径),在**该目录下**开会话说:
49
33
 
50
34
  ```
51
35
  这是我的论文材料,帮我做毕业设计
52
36
  ```
53
37
 
54
- 然后把学校模板、要求文档、实验数据、代码、参考文献丢进工作区(或告诉它绝对路径)。
55
- 它会:`thesis_ingest` 读材料 → `thesis_intake` **一次问你一个问题** → 写 `00-管理/意图规格.md`
56
- → 建工作区(`thesis_init`)→ 按阶段推进。
57
-
58
- 没有材料也能用:直接说「我要做毕业设计,还没定题」→ 走选题工作坊。
59
-
60
- > **注意工作区位置**:多数工具从会话的工作目录向上探测 `00-管理/进度台账.md` 来定位论文工作区。
61
- > 所以**把会话开在论文目录里**最省事;也可以用配置显式指定:
62
- > `config: { workspace: /path/to/你的论文 }`(路径写错会直接报错,不会写到别处)。
63
-
64
- ---
65
-
66
- ## 它怎么工作
67
-
68
- ```
69
- 你的材料(docx / xlsx / pptx / pdf / md / csv / 代码 / 文献)
70
- │
71
- thesis_ingest │ 读成纯文本 + 材料清单
72
- ▼
73
- ┌──────────────────────────────────────────────────────────┐
74
- │ thesis_intake:逐题追问(一次只问一个问题) │
75
- │ 每问都带:为什么问 · 影响哪个产出 · 合格答案长什么样 │
76
- │ 材料里已能读出来的一律不问;答不全的显式列为阻塞项 │
77
- └──────────────────────────────────────────────────────────┘
78
- │
79
- 00-管理/意图规格.md(唯一真相)
80
- ▼
81
- ┌────────── 九阶段流水线(G1-G4 人工关卡不可跳) ──────────┐
82
- │ 选题 → 开题 → 文献 → 设计 → 实现 → 测试 → 论文 → 合规 → 答辩 │
83
- │ 零假文献(只认真实检索)· 零假数据(只认真实运行) │
84
- └──────────────────────────────────────────────────────────┘
85
- │
86
- ┌──────────────┬──────────┴──────────┬──────────────┐
87
- ▼ ▼ ▼ ▼
88
- 论文.docx 答辩幻灯 PPT.md 原创性报告 + 复测 跨会话事实
89
- (内置零依赖 (Marp 兼容,可 (本地度量, (换个会话不用
90
- 生成器/pandoc) marp/pandoc → pptx) 不接收费系统) 重讲学校规范)
91
- ```
92
-
93
- **为什么先追问**:写错方向的代价是整章重写,而问清楚只要十分钟。这是本插件与「AI 直接生成论文」的根本区别。
94
-
95
- **而且它不靠自觉**:说「帮我写第三章」时,如果意图规格还没立全(缺学校模板/字数/查重阈值/时间线),
96
- `agent/pre-step` 的写作意图闸门会注入一条指令**强制模型先去追问**;规格就绪后闸门自动安静;
97
- 想跳过就说「直接写」(插件会要求它列出采用的假设)。
98
-
99
- ---
100
-
101
- ## 工具全集(21 个)
102
-
103
- ### 论文工作区(`thesis_*`)
104
-
105
- | 工具 | 作用 |
106
- |---|---|
107
- | `thesis_ingest` | 摄取材料:`.docx`/`.xlsx`/`.pptx`/`.pdf`/`.md`/`.csv`/`.bib`/`.html` → 文本摘要;**源码目录 → 代码结构摘要**(文件/行数/声明/技术栈指纹,不贴源码正文);写 `00-管理/材料清单.md` 与逐文件摘要。旧格式 `.doc/.xls/.ppt` 会明确提示另存为新格式 |
108
- | `thesis_intake` | 逐题追问状态机:`start`/`ask`/`answer`/`skip`/`status`/`spec`/`done` → 落盘 `00-管理/意图规格.md`(断点续问,永不丢答案) |
109
- | `thesis_init` | 建论文工作区:九阶段目录、台账、决定日志、时间线、七章模板、文献库骨架、技能包 → `.dsh/skills/`,可选 git 首提交 |
110
- | `thesis_progress` | 台账读写 + **G1-G4 闸门**(`report`/`update`/`gate`):未过 G1 不许推进阶段、未过 G2 不许验收章节 |
111
- | `thesis_decide` | 追加决定日志(内容/理由/备选)——答辩「为什么这么做」的答案库 |
112
- | `thesis_lit_search` | 真实检索:Semantic Scholar → DBLP → arXiv → Crossref 失败降级;结果带真实 DOI/URL 并缓存留痕 |
113
- | `thesis_lit_save` | 把检索到的文献(按缓存 id)收录进 `02-文献/refs.bib`;DOI 去重;**不接受缓存外的 id**(零假文献机制) |
114
- | `thesis_lit_note` | 生成文献阅读笔记骨架(五节模板,摘要自动填入) |
115
- | `thesis_review` | 单章确定性评审六项:字数区间、大纲齐全、引用对应、图表编号、未完成标记、G2 清单 |
116
- | `thesis_check` | 全文五项检查:引用双向一致、每章字数、图表编号、术语先定义后使用、学校模板探测 |
117
- | `thesis_build` | 出 `论文.docx`:优先 pandoc + 学校模板;无 pandoc 用**内置零依赖** docx 生成器(自实现 ZIP/CRC32/WordprocessingML) |
118
- | `thesis_stylecheck` | 写作风格自查六条启发式(套话/空洞结论/自我暴露/翻译腔/句式单一/无锚点),附行号与改写建议 |
119
-
120
- ### 合规(原创性)
121
-
122
- | 工具 | 作用 |
123
- |---|---|
124
- | `thesis_originality` | `scan` 找高风险段落(行号 + 命中来源 + 改写处方)→ 改完 `verify` 复测降幅 → `report` 汇总(可回填学校检测结果)。**本地确定性估算,不接知网/维普** |
125
-
126
- ### 答辩
127
-
128
- | 工具 | 作用 |
129
- |---|---|
130
- | `thesis_defense` | 提取答辩素材 + 六类必问问题库(实现细节/技术选型/需求背景/工作量/数据可信/不足展望),附证据锚点 |
131
- | `thesis_slides` | `outline` 生成 10-12 页 Marp 兼容 `07-答辩/PPT.md`(含讲稿与证据锚点)→ `check` 六项检查 → `convert` 用 marp/pandoc 出 pptx;没有转换器就给出可直接复制的命令与兜底方案 |
132
- | `defense_code_status` / `defense_code_next` / `defense_code_update` | **代码演练**:把(常常是 AI 写的)系统拆成讲得清的模块,用真实验证门逐个走通,并用可评分的追问确认你在答辩席上讲得出实现细节与取舍 |
133
-
134
- ### 跨会话事实(`fact_*`)
135
-
136
- | 工具 | 作用 |
137
- |---|---|
138
- | `fact_search` / `fact_remember` / `fact_context` | SQLite 事实库(默认 `$DSH_HOME/paper-memory.db`):记住学校规范、导师要求、你的写作偏好。**而且不只被动查询**——你说的话与已确认事实相关时(词面重叠),插件自动把相关条目作为卡片放回上下文(最多 4 条/600 字符,事实没变就不重复注入) |
139
-
140
- ### 斜杠命令(9 个)
141
-
142
- `/thesis-status` `/thesis-decide` `/thesis-lit` `/thesis-check` `/thesis-build`
143
- `/thesis-ingest` `/thesis-intake` `/thesis-originality` `/thesis-defense`
144
-
145
- ---
146
-
147
- ## 技能包(方法论,随插件发布)
148
-
149
- | 技能 | 触发时机 |
150
- |---|---|
151
- | `thesis-pipeline` | 每次会话开始(阶段、关卡、工具地图) |
152
- | `thesis-opener` | 选题、开题报告、G1/G3 |
153
- | `thesis-literature` | 文献检索与综述 |
154
- | `thesis-eng-design` | 需求/设计/实现/测试规范 |
155
- | `thesis-writing` | 写作规范与去 AI 味规则 |
156
- | `thesis-citation` | GB/T 7714-2015 著录 |
157
- | `thesis-defense` | 答辩准备与幻灯链路 |
158
- | `code-walkthrough` | 答辩前把系统讲清(代码演练) |
159
- | `paper-intake` | 材料到手后的追问方法论 |
160
- | `paper-dedup` | 原创性自查的诚实做法(什么能改、什么绝不能改) |
161
- | `thesis-inquiry` | 写作要求/导师口径模糊时的对抗式追问 |
162
-
163
- `thesis_init` 会把整套技能复制进论文仓库 `.dsh/skills/`(项目级 rank 100,优先级最高),
164
- 所以技能随论文一起 git 版本化、换机器不丢。
165
-
166
- ---
38
+ 它会弹一道选择题(从零走到答辩 / 只补合规与答辩 / 只做答辩准备 / 先别自动跑),
39
+ 选完就自动推进;撞上 G1-G4 关卡时在审批界面点「允许」或「拒绝」。
40
+ 没有材料也能用:「我要做毕业设计,还没定题」。
167
41
 
168
42
  ## 配置
169
43
 
170
- 所有字段都有默认值;在 profile 的 `cordis.patch.yml` 里覆盖:
44
+ 默认值都在,通常不用写。需要时在 profile 的 `cordis.patch.yml` 那一行里覆盖:
171
45
 
172
46
  ```yaml
173
47
  - id: paper
174
48
  name: dsh-thesis
175
49
  config:
176
- workspace: /path/to/thesis # 缺省从会话 cwd 向上探测 00-管理/进度台账.md
177
- memoryPath: /path/to/paper-memory.db # 缺省 $DSH_HOME/paper-memory.db
178
- ingest: { maxBytes: 33554432, maxChars: 60000 }
179
- intake: { maxQuestions: 12, specRel: '00-管理/意图规格.md' }
180
- similarity: { shingle: 4, threshold: 0.3, minChars: 30 } # 原创性自查度量
181
- stylecheck: { reportRel: '08-合规/AI味自查报告.md', maxParagraphChars: 260 }
182
- ppt: { engine: auto, theme: default, timeoutMs: 120000 } # auto|marp|pandoc|none
183
- defense: { materialsRel: '07-答辩/答辩素材.md', defaultPages: 11 }
184
- codeWalkthrough: { stateDir: '.paper', gates: { go: { build: [go, build, ./...] } } }
185
- recall: { maxEntries: 4, maxChars: 600, minKeywordLength: 2 }
186
- # 闸门
187
- writingGate: true # 要求没立稳时拦截「开始写」
188
- destructiveGate: true # 不可逆命令前提请拍板
189
- maxQuestions: 3
50
+ workspace: D:/毕业论文/我的论文 # 缺省从会话 cwd 向上探测 00-管理/进度台账.md
51
+ autopilot: { maxGoalRounds: 20 } # 自动续跑的轮数上限(默认 40)
190
52
  ```
191
53
 
192
- `workspace` **真的生效**:配置了就只认它,且台账不存在时会明确报错——绝不悄悄退回到 cwd 探测去写到别的目录。
193
-
194
- ---
54
+ 完整字段见 [docs/config.md](./docs/config.md)。
195
55
 
196
56
  ## 红线(写在护栏里,不是写在文档里)
197
57
 
198
- 1. **零假文献**:正文引用只能来自 `thesis_lit_search` 的真实检索缓存;`thesis_lit_save` 拒绝缓存外的 id;`thesis_check` 复核双向一致。
199
- 2. **零假数据**:实验数据、截图、运行结果必须来自真实运行。工具与技能都不支持伪造,`thesis_originality` 明确禁止为降重改动数据与结论。
200
- 3. **人是作者**:G1-G4 关卡由 `thesis_progress` 强制,未过闸门不许推进;决定必须由用户拍板。
201
- 4. **规范以学校文件为准**:学校模板缺失时,用内置过渡模板并**显式标注"非学校模板"**,绝不假装合规。
202
- 5. **降重不是洗稿**:本插件不接收费查重系统,报告里的重复率是**本地估算**,与学校结果不可等同;用户自行送检后可回填对照。
203
- 6. **不静默销毁数据**:读不出来 ≠ 不存在。工作区里的追问答案、进度台账、文献库、检索记录都是你的资产——
204
- 读取失败时工具**抛错并保持原文件不动**,绝不"用默认值覆盖"。
58
+ 1. **零假文献**:引用只能来自真实检索缓存,`thesis_lit_save` 拒绝缓存外的 id。
59
+ 2. **零假数据**:数据与结果必须来自真实运行;降重不许改数据与结论。
60
+ 3. **人是作者**:G1-G4 关卡由工具强制,决定必须由你拍板。
61
+ 4. **规范以学校文件为准**:没有模板时用内置过渡模板并**显式标注「非学校模板」**。
62
+ 5. **降重不是洗稿**:不接收费查重,报告里是本地估算,与学校结果不可等同(可回填对照)。
63
+ 6. **不静默销毁数据**:读不出来 ≠ 不存在;读失败就抛错,绝不用默认值覆盖。
205
64
 
206
- ---
65
+ ## 文档
207
66
 
208
- ## 已知边界(诚实清单)
209
-
210
- - **PDF 抽取是尽力而为**:扫描版 PDF(无文本层)、对象流/加密 PDF 可能抽不出文字,工具会明确返回原因而不是编造内容。
211
- - **旧格式不支持**:`.doc`/`.xls`/`.ppt` 请先另存为新格式。
212
- - **幻灯不自研生成器**:产出 Marp 兼容 Markdown,`.pptx` 依赖外部 marp/pandoc;两者都没有时给出可执行命令与兜底路径(幻灯文字已是最终稿,成稿只是排版)。
213
- - **原创性自查不接收费系统**:无账号,也不该接入;度量口径与算法参数全部写在报告里,可复现、可质疑。
214
- - **子进程无取消能力**:pandoc/marp/git 走 `spawnSync`,目前**不能中途取消**(有超时上限,但没有信号传递;`exec.signal` 不进入子进程)。
215
- - **受限环境下管道 stdio 被拒**:某些沙箱里 `stdio: 'pipe'` 会 `EPERM`,插件因此默认用 `stdio: 'ignore'`(见 `src/shared/spawn.ts`)。
216
- - **类型来自本地 shim**:为了让本仓库零依赖即可 `tsc` 通过,宿主契约以 `src/types/shims.d.ts` 声明(宽松签名),真实签名核对记录在 [docs/host-api.md](./docs/host-api.md)。
217
- - **代码演练的语言矩阵**:验证门表内置 Go/TS/Python/Rust,其余语言需在配置里补 `gates`。
218
- - **`dsh plugin` 需要 pnpm**:DSH 的插件安装会转发给 pnpm;机器上只有 Node 时用 `node scripts/install-into-profile.mjs --profile <名>` 兜底。
219
-
220
- ---
67
+ | 文档 | 内容 |
68
+ |---|---|
69
+ | [docs/usage.md](./docs/usage.md) | 使用手册:第一次会话、九阶段、常见动作、产出物、中断续跑 |
70
+ | [docs/autopilot.md](./docs/autopilot.md) | 自动驾驶:四档意图、关卡拍板、何时不介入、降级与关闭 |
71
+ | [docs/tools.md](./docs/tools.md) | 21 个工具 + 11 个技能一览(名字即契约) |
72
+ | [docs/config.md](./docs/config.md) | 全部配置字段、默认值与约束 |
73
+ | [docs/troubleshooting.md](./docs/troubleshooting.md) | 装了没反应、没弹选择题、PDF/pptx 失败等 |
74
+ | [docs/design.md](./docs/design.md) | 设计文档与 ADR(架构、分层、质量策略、已知边界) |
75
+ | [docs/host-api.md](./docs/host-api.md) | 宿主契约:用到的 DSH 接口与实测行为 |
76
+ | [docs/release.md](./docs/release.md) | 发版:tag → GitHub Actions → npm(含 provenance)|
221
77
 
222
78
  ## 开发
223
79
 
224
80
  ```bash
225
- npm install # 只装 typescript 与 schemastery
226
- npm run build # tsc → lib/(相对导入 .ts → .js 由 rewriteRelativeImportExtensions 处理)
227
- npm run typecheck # tsc --noEmit
228
- npm test # node --test tests/(Node 24 直接跑 .ts,类型擦除)
229
-
230
- # 沙箱/受限环境(禁止子进程管道,node --test 的默认隔离会 EPERM)下用同一进程跑:
231
- npm run test:sandbox
232
-
233
- # 完整验收:build + typecheck + 全部单测 + 全量端到端断言
234
- npm run verify
81
+ npm install && npm run build # tsc → lib/
82
+ npm test # node --test(Node 24 直接跑 .ts)
83
+ npm run verify # build + 两个 typecheck + 全部单测 + 审计 + 端到端
235
84
  ```
236
85
 
237
- ### 证据分层(本仓库的质量标准)
86
+ 仓库里**没有 JS 源文件**:`src/`、`scripts/`、`tests/` 全是 `.ts`,直接由 Node 执行(需要 Node ≥ 22.18);
87
+ `lib/` 只是 `tsc` 产物(已 gitignore,发布时作为编译后的 JS 提供)。
238
88
 
239
- | 层 | 命令 | 内容 |
240
- |---|---|---|
241
- | 单元 / 契约 | `npm run test:sandbox` | 纯逻辑、装配契约(21 工具 / 9 命令 / 2 服务 / 4 类闸门监听)、数据安全与负路径 |
242
- | **真实场景端到端** | `npm run test:e2e` | `tests/e2e/paper-full-flow.mjs`:内置虚构学校材料夹具,离线跑完 材料→追问→建库→七章→评审→闸门→检查→docx→幻灯→原创性→答辩,逐环校验产物(含独立 ZIP 解压读回 `document.xml`) |
243
- | **真实宿主** | `npm run test:host` | 真实 cordis + dsh-tools 装配并执行工具、真实 `agent/pre-step` 闸门注入、验证卸载注销 |
244
- | **真实引擎装载** | `npm run test:host-load` | 真实 `dsh` 引擎解析并校验本插件。⚠️ 引擎需要写 `$DSH_HOME/profiles/<name>/cordis.yml`,在受限沙箱下需放宽文件权限 |
245
- | 对外表面审计 | `npm run audit` | `scripts/audit-surface.mjs`:工具/命令/技能契约一致 + 宿主解析的文件无 BOM |
246
- | 真实网络(可选) | `npm run test:net` | 真实学术 API 检索 → 收录 → 笔记 |
89
+ 质量分层:单测/契约、真实场景端到端、真实 cordis 装配、真实 dsh 引擎装载、对外表面审计
90
+ (见 [docs/design.md](./docs/design.md) §9)。
247
91
 
248
- 详细设计见 [DESIGN.md](./DESIGN.md),宿主契约见 [docs/host-api.md](./docs/host-api.md),
249
- 来源声明见 [NOTICE.md](./NOTICE.md)。
92
+ **发版**:打 tag 即发布,由 GitHub Actions 跑构建、校验与 `npm publish --provenance`,
93
+ 见 [docs/release.md](./docs/release.md)。
250
94
 
251
95
  ## 许可
252
96
 
253
- MIT
97
+ MIT。来源声明见 [NOTICE.md](./NOTICE.md)。
@@ -0,0 +1,73 @@
1
+ # 自动驾驶
2
+
3
+ 插件不提供任何斜杠命令。它在论文工作区里**自己把流程推起来**,只在两处需要你:
4
+ **开头选一次意图**、**过关卡时拍一次板**。
5
+
6
+ ## 一次完整流程
7
+
8
+ ```
9
+ 你说一句话
10
+ ↓
11
+ [agent/pre-step] 查出「论文工作区 + 主 agent + 还没有意图规格」
12
+ ↓ ctx.userQuestions.ask ← 一道选择题(只有一次)
13
+ 你选:从零走到答辩 / 只补合规与答辩 / 只做答辩准备 / 先别自动跑
14
+ ↓
15
+ 写进 00-管理/决定日志.md    (答辩时这就是「为什么这么推进」的证据)
16
+ ↓
17
+ ctx.goals.create(...)      → 宿主的 goal-round-driver 接手,一轮轮自动续跑
18
+ ↓
19
+ 注入 operating contract    (怎么推进、哪些活扇给子 agent、产出必须落盘、不许编数据)
20
+ ↓
21
+ ┌── 模型干活(可以开子 agent 并行) ──┐
22
+ │ 过 G1-G4? │
23
+ │ [tools/pre-execute] 拦成 ask ──────┼──→ 你在审批界面点「允许 / 拒绝」
24
+ └─────────────────────────────────────┘
25
+ ↓
26
+ update_goal complete → 给一页「做了什么 / 待你确认」
27
+ ```
28
+
29
+ ## 四档意图
30
+
31
+ | 选项 | 目标 |
32
+ |---|---|
33
+ | 从零走到答辩(九阶段全跑) | 材料 → 追问 → 文献 → 设计 → 实现 → 测试 → 论文 → 合规 → 答辩 |
34
+ | 已有材料/初稿,补齐合规与答辩 | 不重写正文,只补检查、降重自查、答辩材料 |
35
+ | 只做答辩准备 | 素材 + 问题库 + 幻灯 + 代码演练 |
36
+ | 先别自动跑,我自己来 | 不建目标、不注入指令,照常一问一答 |
37
+
38
+ ## 它什么时候**不**介入
39
+
40
+ 这四条都写成了测试,不靠自觉:
41
+
42
+ - **不是论文工作区**:`findThesisRoot` 找不到 `00-管理/进度台账.md`,完全安静(别的项目里装了也不打扰)。
43
+ - **子 agent**:委派深度 > 0 一律跳过,否则每开一个子 agent 又问一遍。
44
+ - **已经有意图规格**:`00-管理/意图规格.md` 存在的会话只记一条日志,不重复问。
45
+ - **同一个 agent 只问一次**:第二轮起不再打扰。
46
+
47
+ ## 降级路径(宿主缺服务时)
48
+
49
+ | 缺什么 | 结果 |
50
+ |---|---|
51
+ | 没有 `userQuestions` 服务 / 选择题没渲染出来 | 不问,也不注入指令,本轮就是普通对话(日志会写原因)|
52
+ | 没有 `goals` 服务 | 只推进当前一轮,不会自动续轮 |
53
+ | 没有 `commands` 服务 | 无影响:本插件从来不用命令面 |
54
+
55
+ ## 关掉它
56
+
57
+ ```yaml
58
+ - id: paper
59
+ name: dsh-thesis
60
+ config:
61
+ autopilot:
62
+ enabled: false # 退回「纯工具 + 技能」模式
63
+ gateApproval: true # false = 仍然自动跑,但关卡不再拦人
64
+ maxGoalRounds: 40 # 调小,防跑飞
65
+ ```
66
+
67
+ ## 排查
68
+
69
+ - 说了话但**没弹选择题**:看会话日志里有没有 `dsh-thesis: 意图选择题没有拿到答案` 或
70
+ `宿主没有 userQuestions 服务`。这两种情况下插件有意不猜你的意图。
71
+ - 跑了**一轮就停**:日志里找 `宿主没有 goals 服务`——说明这套组合不支持自动续轮。
72
+ - **关卡没问就过了**:检查配置里 `autopilot.gateApproval` 是否为 `false`。
73
+ - 想重新选一次意图:删掉 `00-管理/意图规格.md`(或新开一个尚无规格的工作区会话)。
package/docs/config.md ADDED
@@ -0,0 +1,113 @@
1
+ # 配置
2
+
3
+ 所有字段都有出厂默认值,通常不用写任何配置。`PAPER_DEFAULTS`([src/config.ts](../src/config.ts))
4
+ 是 schema `.default()` 与代码侧回退的**单一来源**:缺配置绝不会退化成「静默关闸门」。
5
+
6
+ ## 写在哪
7
+
8
+ profile 的 `cordis.patch.yml` 里,那一行插件的 `config:` 下面:
9
+
10
+ ```yaml
11
+ - id: paper
12
+ name: dsh-thesis
13
+ config:
14
+ workspace: D:/毕业论文/我的论文
15
+ autopilot: { maxGoalRounds: 20 }
16
+ ```
17
+
18
+ 只想改少数几项时,只写那几项即可(其余补默认值)。嵌套块写法:
19
+
20
+ ```yaml
21
+ similarity: { shingle: 4, threshold: 0.3 }
22
+ ```
23
+
24
+ ## 全部字段
25
+
26
+ ### 工作区与记忆
27
+
28
+ | 字段 | 默认 | 说明 |
29
+ |---|---|---|
30
+ | `workspace` | 无 | 论文工作区根。缺省从会话 cwd 向上探测 `00-管理/进度台账.md`;**配了就只认它**,路径写错直接报错 |
31
+ | `memoryPath` | `$DSH_HOME/dsh-thesis-memory.db` | 跨会话事实库(SQLite)|
32
+
33
+ ### 材料与追问
34
+
35
+ | 字段 | 默认 | 说明 |
36
+ |---|---|---|
37
+ | `ingest.maxBytes` | `33554432`(32 MiB)| 单个文件读取上限,超过则拒绝并说明 |
38
+ | `ingest.maxChars` | `60000` | 单次摄取写回模型的最大字符数,超出截断并标注 |
39
+ | `intake.maxQuestions` | `12` | 一道选择题之外,追问环节最多问几个问题 |
40
+ | `intake.specRel` | `00-管理/意图规格.md` | 意图规格落盘位置(相对工作区根)|
41
+
42
+ ### 原创性自查
43
+
44
+ | 字段 | 默认 | 说明 |
45
+ |---|---|---|
46
+ | `similarity.shingle` | `4` | 指纹窗口(中文字符数;英文按 4 字符近似词)|
47
+ | `similarity.threshold` | `0.3` | 判定高风险的包含率阈值(0..1,越大越宽松)|
48
+ | `similarity.minChars` | `30` | 参与比对的最短段落长度,更短的不判重(标题、公式行)|
49
+
50
+ ### 写作风格自查
51
+
52
+ | 字段 | 默认 | 说明 |
53
+ |---|---|---|
54
+ | `stylecheck.reportRel` | `08-合规/AI味自查报告.md` | 报告落盘位置 |
55
+ | `stylecheck.maxParagraphChars` | `260` | 触发「长段落无锚点」判断的最短长度 |
56
+
57
+ ### 答辩
58
+
59
+ | 字段 | 默认 | 说明 |
60
+ |---|---|---|
61
+ | `ppt.engine` | `auto` | `auto` / `marp` / `pandoc` / `none`;auto 探测不到就只产出 Markdown |
62
+ | `ppt.theme` | `default` | 写进 Marp frontmatter 的 `theme` |
63
+ | `ppt.timeoutMs` | `120000` | 单次外部转换超时 |
64
+ | `defense.materialsRel` | `07-答辩/答辩素材.md` | 答辩素材位置 |
65
+ | `defense.questionsRel` | `07-答辩/预答辩问题库.md` | 问题库位置 |
66
+ | `defense.defaultPages` | `11` | 幻灯默认页数(规范 10-12)|
67
+
68
+ ### 代码演练
69
+
70
+ | 字段 | 默认 | 说明 |
71
+ |---|---|---|
72
+ | `codeWalkthrough.stateDir` | `.paper` | 演练状态目录(相对会话 cwd)|
73
+ | `codeWalkthrough.gates` | Go / TS / Python / Rust | 语言 → 编译验证门命令,例如 `go: { build: ['go', 'build', './...'] }` |
74
+ | `codeWalkthrough.maxCapturedOutput` | `8000` | 每条门命令输出保留的字符数 |
75
+
76
+ ### 自动驾驶
77
+
78
+ | 字段 | 默认 | 说明 |
79
+ |---|---|---|
80
+ | `autopilot.enabled` | `true` | 总开关;`false` 退回「纯工具 + 技能」|
81
+ | `autopilot.maxGoalRounds` | `40` | 目标最多自动跑多少轮(防跑飞)|
82
+ | `autopilot.gateApproval` | `true` | 过 G1-G4 是否必须由人在审批界面拍板 |
83
+
84
+ ### 事实回灌
85
+
86
+ | 字段 | 默认 | 说明 |
87
+ |---|---|---|
88
+ | `recall.maxEntries` | `4` | 一次最多回灌几条事实 |
89
+ | `recall.maxChars` | `600` | 回灌卡片的最大字符数 |
90
+ | `recall.minKeywordLength` | `2` | 多短的关键词不参与匹配 |
91
+
92
+ ### 闸门
93
+
94
+ | 字段 | 默认 | 说明 |
95
+ |---|---|---|
96
+ | `writingGate` | `true` | 要开写但要求没谈清时,注入指令强制先追问 |
97
+ | `writingIntentPatterns` | 内置 | 判定「要开写」的正则列表 |
98
+ | `criteriaMarkers` | 内置 | 命中即视为已带验收标准、不再拦截的正则 |
99
+ | `bypassMarkers` | 内置 | 用户显式授权「直接写」的短语 |
100
+ | `maxQuestions` | `3` | 注入指令允许模型一次提出的最大问题数 |
101
+ | `destructiveGate` | `true` | 不可逆命令执行前提请拍板 |
102
+ | `destructiveToolNames` | `['bash']` | 参与高危检测的工具名 |
103
+ | `destructiveRules` | 内置 | 高危规则(标签 + 正则)|
104
+
105
+ > 在本仓库的开发环境里,命令走 `pwsh` 而不是 `bash`:想覆盖 PowerShell 命令,
106
+ > 把 `destructiveToolNames` 改成 `['bash', 'pwsh']`,或直接用默认规则集的等价正则。
107
+
108
+ ## 校验与默认值的保证
109
+
110
+ - 配置 schema 由 schemastery 编译,宿主启动前校验;写错类型会在**装载时**报错,不会带病运行。
111
+ - 新增字段必须同时进 `Config`、`PAPER_DEFAULTS`、`resolveConfig` 三处;缺一处会被
112
+ `npm run test:sandbox` 的「默认值来源一致」用例抓住。
113
+ - 开关默认值必须是**开**:缺配置不等于关闸门。