dsh-thesis 1.0.0 → 1.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.
- package/DESIGN.md +27 -1
- package/LICENSE +21 -21
- package/README.md +64 -185
- package/docs/host-api.md +692 -640
- package/lib/codewalk/host-types.d.ts +4 -2
- package/lib/gates/messages.d.ts +7 -3
- package/lib/gates/messages.js +7 -4
- package/lib/intake/gate-rules.d.ts +6 -5
- package/lib/intake/gate-rules.js +6 -2
- package/lib/paper/lib/docx.js +70 -70
- package/lib/paper/lib/layout.js +371 -371
- package/lib/paper/lib/lit-cache.js +7 -7
- package/lib/paper/tools/decision.js +5 -5
- package/lib/paper/tools/lit.js +32 -32
- package/package.json +10 -5
package/DESIGN.md
CHANGED
|
@@ -265,6 +265,32 @@ export type IntakeAffect =
|
|
|
265
265
|
(某些受限环境里管道 stdio 直接被拒),需要输出时才 `capture`。
|
|
266
266
|
统一实现在 `src/shared/spawn.ts`,并给 pandoc 之类的调用配了超时。
|
|
267
267
|
|
|
268
|
+
### ADR-13 宿主 peer range 是**声明**,必须与实测运行期一致
|
|
269
|
+
|
|
270
|
+
DSH 的 profile 预检(`dsh-app-boot` 的 `evaluatePluginCompatibility`,在
|
|
271
|
+
`prepareProfileEntries` 里逐行执行)只认一件事:插件 `package.json` 里
|
|
272
|
+
`@deepseek-ai/dsh` / `@deepseek-ai/dsh-*` 的 `peerDependencies` 是否被当前运行期版本
|
|
273
|
+
满足(SemVer,`includePrerelease: true`)。不满足 → 该行 `disabled` + stderr 警告,
|
|
274
|
+
**表现是「装了但没反应」**,而不是任何一条插件自己的报错。`engines.dsh` 当前不强制,
|
|
275
|
+
`peerDependenciesMeta.optional` 也不豁免这条规则。
|
|
276
|
+
|
|
277
|
+
本仓库实际踩过:声明 `@deepseek-ai/dsh-tools: ^0.1.0`(对着 0.1.5-rc.1 写的),
|
|
278
|
+
在 dsh 0.2.0-rc.2 上整个插件被静默停用。当时运行期 import 只有
|
|
279
|
+
`@deepseek-ai/dsh-tools` 的 `defineTool` 与 `schemastery`(ADR-5),
|
|
280
|
+
两者的契约在 0.2.0-rc.2 上逐字未变——**唯一的问题就是这行声明**。
|
|
281
|
+
|
|
282
|
+
处理方式(避免下次再靠人肉记):
|
|
283
|
+
|
|
284
|
+
1. 声明写成**有下界的 range**:`>=<实测版本> <下一小版本>-0`。
|
|
285
|
+
末尾的 `-0` 不是装饰:`<0.3.0` 在 `includePrerelease: true` 下会把 `0.3.0-rc.1`
|
|
286
|
+
也算进去,`<0.3.0-0` 才是真正的「不跨小版本」。
|
|
287
|
+
2. 判据不自己实现:`scripts/lib/host-compat.mjs` 直接 import 已安装的
|
|
288
|
+
`dsh-app-boot`,用宿主自己的函数判断宿主自己的规则(同源,不会漂移)。
|
|
289
|
+
3. 两处强制执行:`npm run test:host-load`(本仓库 manifest **与已安装副本**两份都查,
|
|
290
|
+
因为 preflight 读的是后者)与 `prepublishOnly` 的 `scripts/prepublish-guard.mjs`
|
|
291
|
+
(跨小版本后忘了改声明就发不出去)。
|
|
292
|
+
4. 跨小版本时先跑 `npm run test:host` + `npm run test:host-load`,再改 range 的下界。
|
|
293
|
+
|
|
268
294
|
---
|
|
269
295
|
|
|
270
296
|
## 7. 数据与产物
|
|
@@ -313,7 +339,7 @@ export type IntakeAffect =
|
|
|
313
339
|
| 纯逻辑与契约 | `npm run test:sandbox` | 430 条:相似度、归一化、处方、问题排序、状态机、幻灯渲染、OOXML/PDF 解析、记忆 SQL、代码结构摘要;装配契约(21 工具 / 9 命令 / 2 服务 / 4 类监听);`definePaperTool` 的 DSL→JSON Schema 编译 |
|
|
314
340
|
| **真实场景端到端** | `npm run test:e2e` | 65 条断言,见 §9.1 |
|
|
315
341
|
| **真实宿主** | `npm run test:host` | 24 项:真实 cordis + dsh-tools 装配、工具 schema 被真实注册表接受、真实执行工具、宿主拒绝缺参、**闸门在真实 waterfall 上真的注入**、卸载后工具注销 |
|
|
316
|
-
| **真实引擎装载** | `npm run test:host-load` |
|
|
342
|
+
| **真实引擎装载** | `npm run test:host-load` | 13 项:用宿主自己的预检函数判 manifest(本仓库 + 已安装副本)会不会被停用,再用真实 `dsh` 引擎 `--dump-config` 组合 profile 并校验 `Config`;`DSH_HOME` 指向工作区内临时目录,无需放宽权限 |
|
|
317
343
|
| 对外表面审计 | `npm run audit` | 工具/命令/技能契约一致 + 技能命名/BOM 检查,见 §9.3 |
|
|
318
344
|
| 真实网络(可选) | `npm run test:net` | 真实学术 API 检索 → 收录 → 笔记 |
|
|
319
345
|
|
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 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.
|
package/README.md
CHANGED
|
@@ -2,251 +2,130 @@
|
|
|
2
2
|
|
|
3
3
|
**把一堆材料变成一篇经得起查重与答辩的论文,和一个讲得清自己系统的你。**
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
把要求问成一份可证伪的《意图规格》,然后按九个阶段推进:
|
|
5
|
+
[DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 的单一插件。给它学校模板、论文要求、
|
|
6
|
+
实验数据、代码和参考文献,它会**先追问、再动手**——把要求问成一份可证伪的《意图规格》,再按九个阶段推进:
|
|
8
7
|
|
|
9
8
|
**选题 → 开题 → 文献 → 设计 → 实现 → 测试 → 论文 → 合规 → 答辩**
|
|
10
9
|
|
|
11
|
-
全程留痕(进度台账 + 决定日志 + 检索记录 +
|
|
12
|
-
|
|
13
|
-
纯 TypeScript
|
|
14
|
-
|
|
15
|
-
> **立场**:插件对外只呈现**一个领域模型——大学生写论文**。
|
|
16
|
-
> 学生的工具清单里只有两个命名空间:`thesis_*`(操作论文工作区里的东西)与
|
|
17
|
-
> `fact_*`(跨会话仍然成立的事实:学校规范、导师要求、你的写作偏好)。
|
|
18
|
-
> 答辩层的代码演练用 `defense_code_*`。没有第四套命名。
|
|
10
|
+
全程留痕(进度台账 + 决定日志 + 检索记录 + 检查报告),每一步都要你拍板。对外只呈现一个领域模型:
|
|
11
|
+
`thesis_*`(论文工作区)、`fact_*`(跨会话事实)、`defense_code_*`(答辩层代码演练),没有第四套命名。
|
|
12
|
+
纯 TypeScript,零运行时第三方依赖。
|
|
19
13
|
|
|
20
14
|
---
|
|
21
15
|
|
|
22
16
|
## 安装
|
|
23
17
|
|
|
24
|
-
|
|
25
|
-
# 从 npm 安装(DSH 的插件安装会转发给 pnpm,机器上需要 pnpm)
|
|
26
|
-
dsh plugin --profile web add dsh-thesis
|
|
27
|
-
|
|
28
|
-
# 重启 dsh 后确认装上了 —— 应能看到 thesis_* / fact_* / defense_code_* 三个命名空间的工具
|
|
29
|
-
```
|
|
18
|
+
在 DSH 的**插件管理器里搜索 `dsh-thesis`** 装上,重启 dsh 即可(装好应能看到上面三个命名空间的工具)。
|
|
30
19
|
|
|
31
|
-
|
|
20
|
+
从源码安装(想改代码,或本机没有 pnpm):
|
|
32
21
|
|
|
33
22
|
```bash
|
|
34
23
|
git clone https://github.com/Paloma966/dsh-thesis.git && cd dsh-thesis
|
|
35
|
-
npm install && npm run build
|
|
36
|
-
dsh plugin --profile web add "$PWD"
|
|
37
|
-
|
|
38
|
-
# 没有 pnpm 时的兜底:建 profile 联接 + 打印要粘贴的补丁片段,然后重启 dsh
|
|
39
|
-
node scripts/install-into-profile.mjs --profile web
|
|
24
|
+
npm install && npm run build # DSH 没有 TS 加载器,必须发布编译后的 JS
|
|
25
|
+
dsh plugin --profile web add "$PWD" # 需要 pnpm
|
|
26
|
+
node scripts/install-into-profile.mjs --profile web # 没有 pnpm 时的兜底
|
|
40
27
|
```
|
|
41
28
|
|
|
42
|
-
|
|
29
|
+
卸载:插件管理器里移除,或 `dsh plugin --profile web remove dsh-thesis`(兜底安装用 `install-into-profile.mjs --remove`)。
|
|
30
|
+
|
|
31
|
+
**升级 DSH 后「装了但没反应」**:宿主会在装载前校验 `package.json` 里 `@deepseek-ai/dsh*` 的
|
|
32
|
+
`peerDependencies`,不满足就把该行静默 `disabled`(stderr 打印 `disabling profile plugin row`)。
|
|
33
|
+
本插件声明 `>=0.2.0-rc.2 <0.3.0-0`;跨小版本时先跑 `npm run test:host-load`(用宿主自己的预检函数判定)
|
|
34
|
+
与 `npm run test:host`(真实 cordis 装配),再把 range 改成实测过的版本。
|
|
43
35
|
|
|
44
36
|
---
|
|
45
37
|
|
|
46
38
|
## 30 秒上手
|
|
47
39
|
|
|
48
|
-
|
|
40
|
+
装好并重启后,把材料丢进工作区(或告诉它绝对路径),在对话里说:
|
|
49
41
|
|
|
50
42
|
```
|
|
51
43
|
这是我的论文材料,帮我做毕业设计
|
|
52
44
|
```
|
|
53
45
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
→ 建工作区(`thesis_init`)→ 按阶段推进。
|
|
46
|
+
它会 `thesis_ingest` 读材料 → `thesis_intake` **一次问你一个问题** → 落盘 `00-管理/意图规格.md`
|
|
47
|
+
→ `thesis_init` 建工作区 → 按阶段推进。没有材料也能用(「我要做毕业设计,还没定题」→ 选题工作坊)。
|
|
57
48
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
> **注意工作区位置**:多数工具从会话的工作目录向上探测 `00-管理/进度台账.md` 来定位论文工作区。
|
|
61
|
-
> 所以**把会话开在论文目录里**最省事;也可以用配置显式指定:
|
|
62
|
-
> `config: { workspace: /path/to/你的论文 }`(路径写错会直接报错,不会写到别处)。
|
|
49
|
+
> **把会话开在论文目录里**最省事:多数工具从会话 cwd 向上探测 `00-管理/进度台账.md` 来定位工作区。
|
|
50
|
+
> 也可以用 `config: { workspace: /path/to/你的论文 }` 显式指定(路径写错会直接报错,绝不写到别处)。
|
|
63
51
|
|
|
64
52
|
---
|
|
65
53
|
|
|
66
|
-
##
|
|
54
|
+
## 能力一览
|
|
67
55
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
```
|
|
56
|
+
| 环节 | 工具 | 要点 |
|
|
57
|
+
|---|---|---|
|
|
58
|
+
| 材料与要求 | `thesis_ingest` `thesis_intake` | docx/xlsx/pptx/pdf/md/csv/代码 → 文本与**代码结构**摘要;再逐题追问成意图规格,断点续问 |
|
|
59
|
+
| 工作区与关卡 | `thesis_init` `thesis_progress` `thesis_decide` | 九阶段目录 + 台账 + 决定日志;**G1-G4 关卡未过不许推进** |
|
|
60
|
+
| 文献 | `thesis_lit_search` `thesis_lit_save` `thesis_lit_note` | Semantic Scholar → DBLP → arXiv → Crossref 降级检索;**只认真实检索缓存,零假文献** |
|
|
61
|
+
| 写作与合规 | `thesis_review` `thesis_check` `thesis_stylecheck` `thesis_build` `thesis_originality` | 逐章评审 / 全文五项检查 / 去 AI 味自查 / 出 `论文.docx`(优先 pandoc,否则内置零依赖生成器)/ 本地降重度量 + 复测 |
|
|
62
|
+
| 答辩 | `thesis_defense` `thesis_slides` `defense_code_*` | 素材 + 六类问题库;Marp 兼容幻灯(含讲稿与证据锚点);代码演练把系统拆成讲得清的模块 |
|
|
63
|
+
| 跨会话事实 | `fact_search` `fact_remember` `fact_context` | SQLite 记住学校规范、导师要求、写作偏好;相关时自动放回上下文 |
|
|
92
64
|
|
|
93
|
-
|
|
65
|
+
斜杠命令 9 个:`/thesis-status` `/thesis-decide` `/thesis-lit` `/thesis-check` `/thesis-build`
|
|
66
|
+
`/thesis-ingest` `/thesis-intake` `/thesis-originality` `/thesis-defense`。
|
|
94
67
|
|
|
95
|
-
|
|
96
|
-
`
|
|
97
|
-
|
|
68
|
+
技能包 11 个(随插件发布,`thesis_init` 复制进论文仓库 `.dsh/skills/` 与论文一起 git 版本化):
|
|
69
|
+
`thesis-pipeline` `thesis-opener` `thesis-literature` `thesis-eng-design` `thesis-writing` `thesis-citation`
|
|
70
|
+
`thesis-defense` `code-walkthrough` `paper-intake` `paper-dedup` `thesis-inquiry`。
|
|
98
71
|
|
|
99
72
|
---
|
|
100
73
|
|
|
101
|
-
##
|
|
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 个)
|
|
74
|
+
## 红线(写在护栏里,不是写在文档里)
|
|
141
75
|
|
|
142
|
-
|
|
143
|
-
|
|
76
|
+
1. **零假文献**:引用只能来自真实检索缓存,`thesis_lit_save` 拒绝缓存外的 id,`thesis_check` 复核双向一致。
|
|
77
|
+
2. **零假数据**:实验数据与运行结果必须来自真实运行;`thesis_originality` 明确禁止为降重改动数据与结论。
|
|
78
|
+
3. **人是作者**:G1-G4 关卡由工具强制;决定必须由你拍板。
|
|
79
|
+
4. **规范以学校文件为准**:模板缺失时用内置过渡模板并**显式标注「非学校模板」**,绝不假装合规。
|
|
80
|
+
5. **降重不是洗稿**:不接收费查重系统,报告里的重复率是**本地估算**,与学校结果不可等同(可回填对照)。
|
|
81
|
+
6. **不静默销毁数据**:读不出来 ≠ 不存在。读取失败时工具抛错并保持原文件不动,绝不用默认值覆盖。
|
|
144
82
|
|
|
145
83
|
---
|
|
146
84
|
|
|
147
|
-
##
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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 版本化、换机器不丢。
|
|
85
|
+
## 已知边界
|
|
86
|
+
|
|
87
|
+
- **PDF 是尽力而为**:扫描版(无文本层)、对象流/加密 PDF 可能抽不出文字,会明确报原因而不是编造内容。
|
|
88
|
+
- **旧格式不支持**:`.doc`/`.xls`/`.ppt` 请先另存为新格式。
|
|
89
|
+
- **幻灯不自研生成器**:只产出 Marp 兼容 Markdown,`.pptx` 依赖外部 marp/pandoc;两者都缺时给出可执行命令与兜底路径。
|
|
90
|
+
- **子进程不可取消**:pandoc/marp/git 走 `spawnSync`,有超时但没有信号传递。
|
|
91
|
+
- **类型来自本地 shim**:为让仓库零依赖即可 `tsc` 通过,宿主契约声明在 `src/types/shims.d.ts`,真实签名核对见 [docs/host-api.md](./docs/host-api.md)。
|
|
92
|
+
- **代码演练语言矩阵**:内置 Go/TS/Python/Rust,其余语言需在配置里补 `gates`。
|
|
165
93
|
|
|
166
94
|
---
|
|
167
95
|
|
|
168
96
|
## 配置
|
|
169
97
|
|
|
170
|
-
|
|
98
|
+
所有字段都有默认值,需要时在 profile 的 `cordis.patch.yml` 覆盖:
|
|
171
99
|
|
|
172
100
|
```yaml
|
|
173
101
|
- id: paper
|
|
174
102
|
name: dsh-thesis
|
|
175
103
|
config:
|
|
176
|
-
workspace: /path/to/thesis # 缺省从会话 cwd 向上探测 00-管理/进度台账.md
|
|
104
|
+
workspace: /path/to/thesis # 缺省从会话 cwd 向上探测 00-管理/进度台账.md(配了就只认它)
|
|
177
105
|
memoryPath: /path/to/paper-memory.db # 缺省 $DSH_HOME/paper-memory.db
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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
|
|
106
|
+
similarity: { shingle: 4, threshold: 0.3 } # 原创性自查度量
|
|
107
|
+
ppt: { engine: auto } # auto | marp | pandoc | none
|
|
108
|
+
writingGate: true # 要求没立稳时拦下「开始写」
|
|
109
|
+
destructiveGate: true # 不可逆命令前提请拍板
|
|
190
110
|
```
|
|
191
111
|
|
|
192
|
-
`
|
|
193
|
-
|
|
194
|
-
---
|
|
195
|
-
|
|
196
|
-
## 红线(写在护栏里,不是写在文档里)
|
|
197
|
-
|
|
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
|
-
读取失败时工具**抛错并保持原文件不动**,绝不"用默认值覆盖"。
|
|
205
|
-
|
|
206
|
-
---
|
|
207
|
-
|
|
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 <名>` 兜底。
|
|
112
|
+
其余字段(`ingest` / `intake` / `stylecheck` / `defense` / `codeWalkthrough` / `recall`)见
|
|
113
|
+
[DESIGN.md](./DESIGN.md) §4 配置契约,默认值见 [src/config.ts](./src/config.ts)。
|
|
219
114
|
|
|
220
115
|
---
|
|
221
116
|
|
|
222
117
|
## 开发
|
|
223
118
|
|
|
224
119
|
```bash
|
|
225
|
-
npm install
|
|
226
|
-
npm
|
|
227
|
-
npm run
|
|
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
|
|
120
|
+
npm install && npm run build # tsc → lib/
|
|
121
|
+
npm test # node --test tests/(Node 24 直接跑 .ts)
|
|
122
|
+
npm run verify # 完整验收:build + typecheck + 全部单测 + 审计 + 端到端
|
|
235
123
|
```
|
|
236
124
|
|
|
237
|
-
|
|
125
|
+
质量分层:`test:sandbox`(430 单测/契约)、`test:e2e`(65 条真实场景端到端)、`test:host`(真实 cordis 装配与闸门)、
|
|
126
|
+
`test:host-load`(真实 dsh 引擎装载与 peer 预检)、`audit`(对外表面契约一致)、`test:net`(可选,真实学术 API)。
|
|
238
127
|
|
|
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 检索 → 收录 → 笔记 |
|
|
247
|
-
|
|
248
|
-
详细设计见 [DESIGN.md](./DESIGN.md),宿主契约见 [docs/host-api.md](./docs/host-api.md),
|
|
249
|
-
来源声明见 [NOTICE.md](./NOTICE.md)。
|
|
128
|
+
详细设计见 [DESIGN.md](./DESIGN.md),宿主契约见 [docs/host-api.md](./docs/host-api.md),来源声明见 [NOTICE.md](./NOTICE.md)。
|
|
250
129
|
|
|
251
130
|
## 许可
|
|
252
131
|
|