dsh-thesis 2.0.2 → 2.1.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/README.md +5 -4
- package/docs/config.md +12 -0
- package/docs/design.md +95 -2
- package/docs/release.md +94 -85
- package/docs/tools.md +8 -5
- package/docs/troubleshooting.md +18 -0
- package/docs/usage.md +4 -1
- package/lib/config.d.ts +13 -0
- package/lib/config.js +8 -1
- package/lib/figure/actions.d.ts +83 -0
- package/lib/figure/actions.js +439 -0
- package/lib/figure/index.d.ts +24 -0
- package/lib/figure/index.js +40 -0
- package/lib/figure/lib/check.d.ts +83 -0
- package/lib/figure/lib/check.js +214 -0
- package/lib/figure/lib/drawio.d.ts +123 -0
- package/lib/figure/lib/drawio.js +156 -0
- package/lib/figure/lib/export.d.ts +120 -0
- package/lib/figure/lib/export.js +308 -0
- package/lib/figure/lib/layout.d.ts +78 -0
- package/lib/figure/lib/layout.js +496 -0
- package/lib/figure/lib/spec.d.ts +114 -0
- package/lib/figure/lib/spec.js +290 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +5 -1
- package/lib/paper/lib/check.d.ts +5 -0
- package/lib/paper/lib/check.js +21 -0
- package/lib/paper/lib/docx.d.ts +26 -0
- package/lib/paper/lib/docx.js +190 -27
- package/lib/paper/lib/image.d.ts +19 -0
- package/lib/paper/lib/image.js +82 -0
- package/lib/paper/lib/layout.js +26 -1
- package/lib/paper/lib/lit-refs.d.ts +30 -0
- package/lib/paper/lib/lit-refs.js +394 -0
- package/lib/paper/lib/lit-verify.d.ts +79 -0
- package/lib/paper/lib/lit-verify.js +556 -0
- package/lib/paper/register.d.ts +1 -1
- package/lib/paper/register.js +37 -1
- package/lib/paper/tools/build.d.ts +4 -0
- package/lib/paper/tools/build.js +79 -4
- package/lib/paper/tools/lit-verify.d.ts +35 -0
- package/lib/paper/tools/lit-verify.js +193 -0
- package/lib/ppt/check.js +5 -0
- package/lib/ppt/design.d.ts +86 -0
- package/lib/ppt/design.js +218 -0
- package/package.json +4 -1
- package/skills/thesis-defense/SKILL.md +25 -1
- package/skills/thesis-eng-design/SKILL.md +40 -20
- package/skills/thesis-literature/SKILL.md +28 -5
- package/skills/thesis-opener/SKILL.md +1 -1
- package/skills/thesis-pipeline/SKILL.md +4 -3
- package/skills/thesis-writing/SKILL.md +4 -1
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 答辩幻灯的版面设计系统(借鉴「歸藏设计」瑞士风的核心,重新实现,不引其代码)。
|
|
3
|
+
*
|
|
4
|
+
* 为什么放进插件:幻灯丑几乎从不是"配色没调好",而是**版面单调 + 层级缺失**——
|
|
5
|
+
* 11 页里 9 页都是「标题 + ▪ 列表」,观众看不到任何视觉锚点。这类问题可以确定性地
|
|
6
|
+
* 检查出来,不该靠每次重新叮嘱。
|
|
7
|
+
*
|
|
8
|
+
* 本模块只做三件事:
|
|
9
|
+
* 1. `DESIGN`:把版心、字号、色彩写成常量(生成器与检查器共用同一套口径);
|
|
10
|
+
* 2. `parseDeckPages`:从 Markdown 里读出每页的版面类型(`<!-- _class: xxx -->`);
|
|
11
|
+
* 3. `designIssues`:确定性规则——版面单调、要点过多、连续无图、缺封面/结尾页。
|
|
12
|
+
*/
|
|
13
|
+
/** 16:9 画布与版心(英寸)。生成脚本与检查器都以这里为准。 */
|
|
14
|
+
export const DESIGN = {
|
|
15
|
+
canvas: { width: 13.333, height: 7.5 },
|
|
16
|
+
margin: { left: 0.95, right: 0.95, top: 0.34, bottom: 0.55 },
|
|
17
|
+
/** 字号(pt):kicker / 标题 / 正文 / 数字。层级只有四档,不许逐页乱调。 */
|
|
18
|
+
type: { kicker: 10.5, title: 32, lead: 21, body: 15, small: 15, tiny: 11.5, stat: 54 },
|
|
19
|
+
/** 纸色 + 墨色 + 单一强调色(克莱因蓝)。不用纯白纯黑。 */
|
|
20
|
+
color: { paper: '#FAFAF8', ink: '#141414', ink2: '#5A5A56', hairline: '#D9D6CC', card: '#F0EEE8', accent: '#002FA7' },
|
|
21
|
+
/** 一页最多几条要点;再多就不是幻灯而是说明书。 */
|
|
22
|
+
rules: { maxBullets: 4, maxBulletChars: 30, maxTitleChars: 20, minVisualPages: 2, maxSameLayoutRatio: 0.6 },
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* 版面类型。名字即契约:`<!-- _class: compare -->` 会渲染成左右对照版,
|
|
26
|
+
* 而不是又一段项目符号。
|
|
27
|
+
*/
|
|
28
|
+
export const DECK_LAYOUTS = [
|
|
29
|
+
'cover', // 封面:题目 + 副题 + 学号/导师/日期
|
|
30
|
+
'agenda', // 目录:四条路线,大号数字
|
|
31
|
+
'compare', // 对照:现状 vs 本方案,一灰一亮两块
|
|
32
|
+
'rows', // 逐条陈述:左标签 + 右说明 + 一句引文
|
|
33
|
+
'steps', // 路线:四列,大号序号
|
|
34
|
+
'cards', // 四象限卡片:关键路径/机制
|
|
35
|
+
'figure', // 大图 + 右侧要点
|
|
36
|
+
'columns', // 双栏/三栏并列
|
|
37
|
+
'stats', // 数据页:四个大数字
|
|
38
|
+
'closing', // 结尾:致谢 + 材料索引
|
|
39
|
+
];
|
|
40
|
+
const CLASS_PATTERN = /<!--\s*_class:\s*([\w-]+)\s*-->/;
|
|
41
|
+
/** 把 Marp Markdown 切成页,读出每页的版面类型与要点数。 */
|
|
42
|
+
export function parseDeckPages(markdown) {
|
|
43
|
+
const body = markdown.startsWith('---') ? markdown.slice(markdown.indexOf('\n---', 3) + 4) : markdown;
|
|
44
|
+
const pages = [];
|
|
45
|
+
for (const chunk of body.split(/^---\s*$/m)) {
|
|
46
|
+
const lines = chunk.split(/\r?\n/);
|
|
47
|
+
let layout = 'bullets';
|
|
48
|
+
let title = '';
|
|
49
|
+
let hasNotes = false;
|
|
50
|
+
let panels = 0;
|
|
51
|
+
const bullets = [];
|
|
52
|
+
for (const raw of lines) {
|
|
53
|
+
const line = raw.trim();
|
|
54
|
+
const cls = CLASS_PATTERN.exec(line);
|
|
55
|
+
if (cls !== null) {
|
|
56
|
+
const name = cls[1];
|
|
57
|
+
if (DECK_LAYOUTS.includes(name))
|
|
58
|
+
layout = name;
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
if (/^<!--/.test(line)) {
|
|
62
|
+
hasNotes = hasNotes || /讲稿|notes?/i.test(line);
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (line.startsWith('# ')) {
|
|
66
|
+
title = line.slice(2).trim();
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (/^\[panel\]/.test(line)) {
|
|
70
|
+
panels += 1;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (line.startsWith('## ') && title === '') {
|
|
74
|
+
title = line.slice(3).trim();
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (line.startsWith('- '))
|
|
78
|
+
bullets.push(line.slice(2).replace(/<!--.*?-->/g, '').trim());
|
|
79
|
+
}
|
|
80
|
+
if (title === '' && bullets.length === 0)
|
|
81
|
+
continue;
|
|
82
|
+
pages.push({ index: pages.length + 1, layout, title, bullets, panels, hasNotes });
|
|
83
|
+
}
|
|
84
|
+
return pages;
|
|
85
|
+
}
|
|
86
|
+
/** 视觉页:有大图或大数字的页,观众记得住的那种。 */
|
|
87
|
+
function isVisual(page) {
|
|
88
|
+
return page.layout === 'figure' || page.layout === 'stats';
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* 确定性版式检查。返回空数组表示"版面不单调、每页都讲得清"。
|
|
92
|
+
*
|
|
93
|
+
* 刻意只查**可机器判定**的事:版面分布、要点数量、连续无图、封面结尾。
|
|
94
|
+
* 配色好不好看、话术顺不顺,仍然要人看。
|
|
95
|
+
*/
|
|
96
|
+
export function designIssues(pages) {
|
|
97
|
+
const issues = [];
|
|
98
|
+
if (pages.length === 0)
|
|
99
|
+
return issues;
|
|
100
|
+
const { rules } = DESIGN;
|
|
101
|
+
// 1. 封面 / 结尾
|
|
102
|
+
if (pages[0].layout !== 'cover') {
|
|
103
|
+
issues.push({
|
|
104
|
+
code: 'design-no-cover',
|
|
105
|
+
level: 'warn',
|
|
106
|
+
where: '第 1 页',
|
|
107
|
+
message: '第一页不是封面版(`<!-- _class: cover -->`):答辩开场需要题目、姓名、学号、导师、日期一屏交代清楚。',
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
if (pages[pages.length - 1].layout !== 'closing') {
|
|
111
|
+
issues.push({
|
|
112
|
+
code: 'design-no-closing',
|
|
113
|
+
level: 'warn',
|
|
114
|
+
where: `第 ${pages.length} 页`,
|
|
115
|
+
message: '最后一页不是结尾版(`<!-- _class: closing -->`):留一页写「谢谢,请提问」与代码/数据/论文位置。',
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
// 2. 版面单调:默认要点页占比过高
|
|
119
|
+
const defaultPages = pages.filter(p => p.layout === 'bullets');
|
|
120
|
+
if (pages.length >= 5 && defaultPages.length / pages.length > rules.maxSameLayoutRatio) {
|
|
121
|
+
issues.push({
|
|
122
|
+
code: 'design-bullet-wall',
|
|
123
|
+
level: 'warn',
|
|
124
|
+
where: `${defaultPages.map(p => `第 ${p.index} 页`).slice(0, 6).join('、')}${defaultPages.length > 6 ? ' 等' : ''}`,
|
|
125
|
+
message: `${defaultPages.length}/${pages.length} 页是「标题 + 要点」的同一种版式。版面单一是幻灯"看起来糙"的首要原因:` +
|
|
126
|
+
`对照用 compare、路线用 steps、机制用 cards、数据用 stats、架构图用 figure。`,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
// 3. 同一种非默认版面用过头
|
|
130
|
+
const byLayout = new Map();
|
|
131
|
+
for (const page of pages) {
|
|
132
|
+
if (page.layout === 'bullets')
|
|
133
|
+
continue;
|
|
134
|
+
byLayout.set(page.layout, [...(byLayout.get(page.layout) ?? []), page]);
|
|
135
|
+
}
|
|
136
|
+
for (const [layout, group] of byLayout) {
|
|
137
|
+
if (pages.length >= 8 && group.length / pages.length > rules.maxSameLayoutRatio) {
|
|
138
|
+
issues.push({
|
|
139
|
+
code: 'design-layout-monotone',
|
|
140
|
+
level: 'warn',
|
|
141
|
+
where: group.map(p => `第 ${p.index} 页`).join('、'),
|
|
142
|
+
message: `「${layout}」版式占 ${group.length}/${pages.length} 页,观众会觉得都是同一页在翻。换一两页别的版面。`,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// 4. 每页要点数与长度
|
|
147
|
+
for (const page of pages) {
|
|
148
|
+
if (page.layout === 'cover' || page.layout === 'closing' || page.layout === 'agenda')
|
|
149
|
+
continue;
|
|
150
|
+
// 分栏版式按"每栏"计要点:compare/columns 一页 6–9 条,摊到 2–3 栏是正常的。
|
|
151
|
+
const perColumn = page.panels >= 2 ? page.bullets.length / page.panels : page.bullets.length;
|
|
152
|
+
if (perColumn > rules.maxBullets) {
|
|
153
|
+
issues.push({
|
|
154
|
+
code: 'design-too-many-bullets',
|
|
155
|
+
level: 'warn',
|
|
156
|
+
where: `第 ${page.index} 页`,
|
|
157
|
+
message: `${page.bullets.length} 条要点${page.panels >= 2 ? `(${page.panels} 栏,每栏约 ${Math.round(perColumn)} 条)` : ''}(每页建议 ≤${rules.maxBullets}):` +
|
|
158
|
+
'讲的时候只会念,观众也读不完。合并同类项或拆页。',
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
for (const bullet of page.bullets) {
|
|
162
|
+
if (cjkLen(bullet) > rules.maxBulletChars) {
|
|
163
|
+
issues.push({
|
|
164
|
+
code: 'design-bullet-too-long',
|
|
165
|
+
level: 'warn',
|
|
166
|
+
where: `第 ${page.index} 页`,
|
|
167
|
+
message: `要点 ${cjkLen(bullet)} 字(≤${rules.maxBulletChars}):「${bullet.slice(0, 18)}…」改成结论句,细节留在讲稿里。`,
|
|
168
|
+
});
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
if (page.title !== '' && cjkLen(page.title) > rules.maxTitleChars) {
|
|
173
|
+
issues.push({
|
|
174
|
+
code: 'design-title-too-long',
|
|
175
|
+
level: 'warn',
|
|
176
|
+
where: `第 ${page.index} 页`,
|
|
177
|
+
message: `标题 ${cjkLen(page.title)} 字(≤${rules.maxTitleChars}):标题写主张,不写范围。`,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// 5. 视觉锚点:全文要有图或数据,且不能连续太多页没有
|
|
182
|
+
const visuals = pages.filter(isVisual);
|
|
183
|
+
if (visuals.length < rules.minVisualPages) {
|
|
184
|
+
issues.push({
|
|
185
|
+
code: 'design-no-visual',
|
|
186
|
+
level: 'warn',
|
|
187
|
+
where: '全文',
|
|
188
|
+
message: `没有架构图也没有数据页(建议 ≥${rules.minVisualPages} 页):答辩评委记的是图和数字,不是要点。` +
|
|
189
|
+
`架构用 figure + 06-论文/assets/图/ 里的 PNG,结果用 stats。`,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
let run = 0;
|
|
193
|
+
for (const page of pages) {
|
|
194
|
+
if (page.layout === 'cover' || page.layout === 'closing' || page.layout === 'agenda')
|
|
195
|
+
continue;
|
|
196
|
+
if (isVisual(page)) {
|
|
197
|
+
run = 0;
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
run += 1;
|
|
201
|
+
if (run === 4) {
|
|
202
|
+
issues.push({
|
|
203
|
+
code: 'design-no-visual-run',
|
|
204
|
+
level: 'warn',
|
|
205
|
+
where: `第 ${page.index - 3}–${page.index} 页`,
|
|
206
|
+
message: '连续 4 页只有文字:中间插一页图或数据,给观众一个喘气的锚点。',
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return issues;
|
|
211
|
+
}
|
|
212
|
+
/** 中文按字计、西文按 0.5 字计——幻灯上的长度用"视觉字数"衡量才准。 */
|
|
213
|
+
export function cjkLen(text) {
|
|
214
|
+
let total = 0;
|
|
215
|
+
for (const ch of text)
|
|
216
|
+
total += /[\u3400-\u9fff\u3000-\u303f\uff00-\uffef]/.test(ch) ? 1 : 0.5;
|
|
217
|
+
return Math.round(total);
|
|
218
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-thesis",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.1",
|
|
4
4
|
"description": "论文与答辩全流程助手(DeepSeek Harness 插件):材料摄取 → 逐题追问 → 文献检索 → 逐章写作与评审 → 原创性自查与合规 → Word/答辩幻灯生产,全流程留痕,并跨会话记住学校规范与导师要求。",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -60,6 +60,9 @@
|
|
|
60
60
|
"test:host": "node scripts/host-smoke.ts && node .host-smoke/app/run.ts",
|
|
61
61
|
"test:host-load": "node scripts/host-verify.ts",
|
|
62
62
|
"audit": "node scripts/audit-surface.ts",
|
|
63
|
+
"release:patch": "node scripts/release.ts patch",
|
|
64
|
+
"release:minor": "node scripts/release.ts minor",
|
|
65
|
+
"release:major": "node scripts/release.ts major",
|
|
63
66
|
"verify": "npm run build && npm run typecheck && npm run typecheck:scripts && npm run test:sandbox && npm run audit && npm run test:e2e",
|
|
64
67
|
"prepublishOnly": "node scripts/prepublish-guard.ts"
|
|
65
68
|
},
|
|
@@ -19,12 +19,36 @@ description: 答辩准备方法论。用于阶段 9:答辩 PPT 大纲(10-12
|
|
|
19
19
|
| 3 | 背景与意义 | 1 页讲清痛点,用图/数据 |
|
|
20
20
|
| 4 | 国内外现状 | 一图带过,落点是"现有不足 → 本课题" |
|
|
21
21
|
| 5 | 需求分析 | 功能点列表/用例图 |
|
|
22
|
-
| 6 | 系统总体设计 |
|
|
22
|
+
| 6 | 系统总体设计 | 架构图(直接复用 `06-论文/assets/图/arch.png`,与论文同一张 .drawio 导出,别另画一张) |
|
|
23
23
|
| 7-9 | 关键实现 | 每页一个模块:截图/核心代码/设计取舍;**这是老师最细看的部分** |
|
|
24
24
|
| 10 | 测试 | 真实数据图 + 结论 |
|
|
25
25
|
| 11 | 总结与展望 | 已完成 + 不足(诚实) |
|
|
26
26
|
| 12 | 问答页 | "谢谢,请各位老师指正" |
|
|
27
27
|
|
|
28
|
+
## 1.5 版面:不要"标题 + ▪ 列表"从头贯到尾
|
|
29
|
+
|
|
30
|
+
答辩幻灯"看起来糙",九成不是配色问题,是**整本只有一种版式**。写 PPT.md 时给每页标版面
|
|
31
|
+
(`<!-- _class: xxx -->`),让观众每翻一页都能看出"这页在说什么":
|
|
32
|
+
|
|
33
|
+
| 版面 | 用在哪 | 长什么样 |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| `cover` | 第 1 页 | 题目 + 副题 + 学生/学号/学院/导师/日期,一屏交代 |
|
|
36
|
+
| `agenda` | 第 2 页 | 四条路线,大号 01–04 |
|
|
37
|
+
| `compare` | 背景/取舍 | 左右两块:现状(灰)vs 本方案(强调色),各 3 条,底下写"代价" |
|
|
38
|
+
| `rows` | 研究现状 | 左标签 + 右说明逐条排,最后一句引文 |
|
|
39
|
+
| `steps` | 技术路线/流程 | 四列,大号序号 + 一句话 |
|
|
40
|
+
| `cards` | 关键实现 | 2×2 卡片,每格一条机制 |
|
|
41
|
+
| `figure` | 架构/截图 | 大图占 2/3,右侧 3 条要点;图题必须有 |
|
|
42
|
+
| `columns` | 对比/三元并列 | 2–3 栏,栏顶一条短强调线 |
|
|
43
|
+
| `stats` | 测试结果 | 四个大数字(值 + 单位 + 一句话),关键指标用强调色 |
|
|
44
|
+
| `closing` | 最后一页 | "谢谢,请提问" + 代码/数据/论文位置 |
|
|
45
|
+
|
|
46
|
+
四条硬规则(`thesis_slides check` 会查):
|
|
47
|
+
1. 一页只讲一个主张,**要点 ≤4 条**(分栏按每栏计),每条 ≤30 字;细节放讲稿。
|
|
48
|
+
2. **不许连续 4 页都是文字**:中间插一页图或数据。
|
|
49
|
+
3. 全文至少 2 页视觉锚点(`figure` / `stats`)——评委记住的是图和数字。
|
|
50
|
+
4. 一个强调色(其余纸色/灰阶),标题贴左、页脚只留页码;不用边框线分隔,用留白和色块。
|
|
51
|
+
|
|
28
52
|
## 2. 预答辩问题库(结合你的材料生成)
|
|
29
53
|
|
|
30
54
|
每类问题对应准备材料,逐一准备:
|
|
@@ -16,32 +16,52 @@ description: 计算机类毕业设计的工程规范。用于阶段 4-6:需求
|
|
|
16
16
|
|
|
17
17
|
## 2. 系统设计(产出:03-设计/系统设计.md)
|
|
18
18
|
|
|
19
|
-
-
|
|
19
|
+
- **总体架构**:分层或模块图(`thesis_figure kind=architecture`),每层职责一句话。
|
|
20
20
|
- **模块划分**:模块 | 职责 | 对外接口。模块间低耦合;每个模块能在代码里找到对应目录/文件。
|
|
21
21
|
- **数据库设计**:ER 图 + 关键表结构(字段、类型、约束、索引依据)。
|
|
22
22
|
- **接口设计**:API 表:路径 | 方法 | 参数 | 返回。前后端分离的必须有;单体应用写关键路由。
|
|
23
23
|
|
|
24
|
-
### 2.1
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
JWT[JWT 认证] -.-> API
|
|
24
|
+
### 2.1 图直接生成:draw.io 源文件 + 高清 PNG
|
|
25
|
+
|
|
26
|
+
论文插图**不用 Mermaid**:自动布局会把 5 个以上节点排成一团,pandoc 也不认 Mermaid 代码块。
|
|
27
|
+
用 `thesis_figure`:你只描述「有什么」,坐标由工具的确定性版面算法排。
|
|
28
|
+
|
|
29
|
+
| 要画的 | kind | spec 关键字段 |
|
|
30
|
+
|---|---|---|
|
|
31
|
+
| 系统总体架构(分层) | `architecture` | `layers[].name`、`layers[].modules`(字符串或 `{text,note,accent}`)、可选 `edges[]` |
|
|
32
|
+
| 业务流程 / 操作流程 | `flow` | `nodes[]`(`kind` = start/process/decision/end)、`edges[]`(可带 `label`) |
|
|
33
|
+
| 数据库 E-R | `er` | `entities[].name/fields[]`(`key:true` 标主键)、`relations[]`(`cardinality` 写 1:N 之类) |
|
|
34
|
+
| 接口时序 | `sequence` | `participants[]`、`messages[]`(`kind` = call/return) |
|
|
35
|
+
| 其它(UML、部署拓扑…) | `custom` | `xml`:draw.io 里「文件 → 另存为」出来的全文 |
|
|
36
|
+
|
|
37
|
+
```text
|
|
38
|
+
thesis_figure action=create kind=architecture chapter=04-系统设计 title=系统总体架构图
|
|
39
|
+
spec={"layers":[{"name":"表现层","modules":["Vue 页面","路由与状态"]},
|
|
40
|
+
{"name":"业务层","modules":["任务服务","用户服务","鉴权"]},
|
|
41
|
+
{"name":"数据层","modules":["MySQL","Redis"]}]}
|
|
43
42
|
```
|
|
44
43
|
|
|
44
|
+
一次调用产出三样:`06-论文/assets/图/<名字>.drawio`(源文件,可继续在 draw.io 里改)、
|
|
45
|
+
同名 3× PNG(约 370dpi)、以及按本章已有图号自动编号的图题与可直接粘贴的 Markdown。
|
|
46
|
+
|
|
47
|
+
四条硬规则:
|
|
48
|
+
|
|
49
|
+
- **一张图只讲一件事**:总体架构图只放层与模块,字段留给 ER 图。
|
|
50
|
+
- **模块名用名词,动词留给箭头**:方框写「任务服务」,箭头标「HTTP/JSON」。
|
|
51
|
+
- **改图先改 `.drawio` 再导出**(`thesis_figure action=export`),不要直接改 PNG。
|
|
52
|
+
- 每写完一张跑一次 `thesis_figure action=check`:断链、旧导出、图号跳号都会被列出来。
|
|
53
|
+
|
|
54
|
+
#### 插图风格(借用科研示意图的通行规则)
|
|
55
|
+
|
|
56
|
+
- **白底、一个强调色**:强调色只标「本文新增/最关键的那一块」(如共享日志、调度循环),
|
|
57
|
+
其余用低饱和灰蓝;外部系统(浏览器、第三方服务)白底灰框。黑白打印仍要分得清。
|
|
58
|
+
- **连线正交、有向必有箭头**:实线表示始终发生的数据/控制流;虚线在整张图里只表示一种含义
|
|
59
|
+
(例如节点间复制),不要又表示分组又表示反馈。
|
|
60
|
+
- **嵌套不超过三层**:集群 → 节点 → 模块;再深就拆图。层名放容器顶部留白里,不压第一个方框。
|
|
61
|
+
- **文字用正文里的原词**,字号按最终印刷尺寸不小于 10pt;放不下就合并模块或拆图,不要缩字号。
|
|
62
|
+
- **导出后自己看一眼**:图题在图下方、正文先引用;文字出框、箭头穿字、连线交叉都是返工信号。
|
|
63
|
+
|
|
64
|
+
|
|
45
65
|
设计时说明:每层的职责边界(API 层只做参数校验与路由,业务逻辑在服务层——答辩高频追问点)、认证方案(JWT/Session 的选择与理由)、数据一致性策略。
|
|
46
66
|
|
|
47
67
|
## 3. 技术选型论证(产出:03-设计/技术选型论证.md)
|
|
@@ -11,21 +11,44 @@ description: 文献调研方法论。用于文献检索、笔记与文献综述
|
|
|
11
11
|
## 1. 检索策略
|
|
12
12
|
|
|
13
13
|
1. **构造关键词**:中英文各一套;从课题拆出 2-3 个核心概念,组合检索;用同义词扩展(如"推荐系统" ↔ recommendation system / recommender)。
|
|
14
|
-
2.
|
|
14
|
+
2. **主路径 thesis_lit_search**(禁止凭记忆写文献;也可以用 Undermind / Elicit / Consensus 发现后走 §2 核验入库):
|
|
15
15
|
- `query` 必填;`year_from` 限年份;`source` 可指定 semantic-scholar / dblp / arxiv / crossref,缺省 auto(Semantic Scholar → DBLP → arXiv → Crossref 失败降级)。
|
|
16
16
|
- 结果写入检索缓存(02-文献/.lit-cache.json)与审计记录(02-文献/检索记录.md);每条记录带真实 DOI/URL 与缓存 id。
|
|
17
17
|
3. **筛选标准**:优先近 5 年;优先顶会/顶刊/高被引;与课题**直接相关**(能支撑你的方法、场景或对比)。
|
|
18
18
|
4. **滚雪球**:好文献的参考文献与引证文献里继续挖(同样走检索,不是记忆)。
|
|
19
19
|
5. **数量目标**:开题 10-20 篇;最终论文 15-30 篇。
|
|
20
20
|
|
|
21
|
-
## 2.
|
|
21
|
+
## 2. 发现工具可以借力,但"正确性"只认核验
|
|
22
|
+
|
|
23
|
+
**分工**:Undermind / Elicit / Consensus / Google Scholar 这类工具负责**发现**(大规模筛、按结论句追问),
|
|
24
|
+
Crossref / OpenAlex / DataCite / PubMed 负责**作证**。发现工具的输出是"候选",不是"证据"。
|
|
25
|
+
|
|
26
|
+
1. 在发现工具里检索 → 导出 `.bib` / `.ris` / `.csv`(不要手抄)→ 存进论文仓库(如 `02-文献/导出/undermind.bib`)。
|
|
27
|
+
2. 调 `thesis_lit_import`(path 指向导出文件):逐条拿权威库对账,**只有 verified 的进 refs.bib**;其余写进 `08-合规/文献核验报告.md`。
|
|
28
|
+
3. 只想看看某条真假:`thesis_lit_verify`(给 title/doi 单条,或给 path 批量),只出结论不改文献库。
|
|
29
|
+
4. 结论怎么处理:
|
|
30
|
+
|
|
31
|
+
| 结论 | 含义 | 你要做的 |
|
|
32
|
+
|---|---|---|
|
|
33
|
+
| `verified` | 权威库确认,题名/作者/年份对得上 | 可以引用 |
|
|
34
|
+
| `mismatch` | 库里有这条,但字段冲突(常见:DOI 张冠李戴) | 打开原文核对,按**权威记录**改,或换一篇 |
|
|
35
|
+
| `not-found` | 各库均查无此文 | 视为疑似编造,**禁止入库**,换文献 |
|
|
36
|
+
| `unchecked` | 网络/限流导致没核成 | 联网后重跑;没核过就不许写进论文 |
|
|
37
|
+
|
|
38
|
+
5. 先查 DOI 再查题名:DOI 精确查只要一次请求就能分出「不存在」和「DOI 指到别的论文」,这是最便宜的一刀。
|
|
39
|
+
6. 导出很大时用 `limit` 分片(每次 10-15 条),避免被免费库限流。
|
|
40
|
+
7. 已知覆盖盲区:中文期刊在 Crossref 覆盖不全,且 DBLP 近年有反爬——这类文献请到 CNKI/万方/IEEE Xplore 打开原文核对,
|
|
41
|
+
把真实 DOI 补进 refs.bib,并在核验报告的备注里写清「已人工核对原文」。
|
|
42
|
+
8. **绝对禁止**:把 `not-found` 的条目改改年份/题名再试、或手工拼一条"看起来对"的 BibTeX。那不是排版问题,是学术不端。
|
|
43
|
+
|
|
44
|
+
## 3. 收录与留痕(审计证据)
|
|
22
45
|
|
|
23
46
|
- 选定文献后调 `thesis_lit_save`(参数是检索返回的**缓存 id 列表**)→ 写入 02-文献/refs.bib(自动去重、key 冲突自动加后缀)并追加收录审计行。
|
|
24
47
|
- **save 只接受缓存 id**:这是零假文献的机制保证——模型无法向文献库塞入"编造"的元数据。
|
|
25
48
|
- 每次检索/收录都自动留痕在 02-文献/检索记录.md(日期/库/关键词/命中/收录)。
|
|
26
49
|
- **没有检索记录就没有引用资格**——写综述时只允许引用 refs.bib 里的条目。
|
|
27
50
|
|
|
28
|
-
##
|
|
51
|
+
## 4. 文献笔记模板(02-文献/笔记/<bibkey>.md)
|
|
29
52
|
|
|
30
53
|
先用 `thesis_lit_note`(参数:缓存 id 或 bib key)生成骨架(元数据 + 原始摘要 + 五节模板),读原文后补全:
|
|
31
54
|
|
|
@@ -41,7 +64,7 @@ description: 文献调研方法论。用于文献检索、笔记与文献综述
|
|
|
41
64
|
|
|
42
65
|
要点:笔记用自己的话写(防"洗稿式抄袭"),"可用引用句"标注归属(如"绪论-研究现状-主题2")。
|
|
43
66
|
|
|
44
|
-
##
|
|
67
|
+
## 5. 文献综述写法(主题式,不是流水账)
|
|
45
68
|
|
|
46
69
|
1. 把文献按**主题/方法/视角**分组(如"基于协同过滤的方法""基于深度学习的方法")。
|
|
47
70
|
2. 每组:概述该类方法思路 → 代表文献(2-4 篇)→ 该类方法的局限。
|
|
@@ -49,7 +72,7 @@ description: 文献调研方法论。用于文献检索、笔记与文献综述
|
|
|
49
72
|
4. 最后一段:指出现有工作的不足(针对你的场景),自然引出本课题——这是综述的落点。
|
|
50
73
|
5. 每条引用在文中标注序号 [1],文末按 GB/T 7714 著录(见 thesis-citation 技能)。
|
|
51
74
|
|
|
52
|
-
##
|
|
75
|
+
## 6. 常见坑
|
|
53
76
|
|
|
54
77
|
- 综述变"文献堆砌":每段必须有"该类方法的局限"这一句。
|
|
55
78
|
- 引用陈旧:核心论断配近 5 年文献。
|
|
@@ -55,7 +55,7 @@ description: 毕业设计选题与开题方法论。用于阶段 1-2:选题工
|
|
|
55
55
|
| 1 课题背景与意义 | 领域背景→现实问题→本课题意义,三段式;意义要具体(解决谁的什么问题) | 600-800 |
|
|
56
56
|
| 2 国内外研究现状 | **按主题组织**(不是逐篇罗列);每主题 2-4 篇真实文献;最后一段指出**现有工作的不足**——这是本课题的立足点 | 800-1200 |
|
|
57
57
|
| 3 研究内容与目标 | 3-5 条,每条 = 动词 + 对象 + 验收效果(如"设计并实现一个支持全文检索的 X 系统") | 400-600 |
|
|
58
|
-
| 4 技术路线与方案 |
|
|
58
|
+
| 4 技术路线与方案 | 总体方案图(`thesis_figure` 生成的架构/流程图)+ 分步说明 + 关键技术点及选型理由 | 600-800 |
|
|
59
59
|
| 5 进度安排 | 与 00-管理/时间线.md 一致的表格式安排 | — |
|
|
60
60
|
| 6 参考文献 | 全部来自 02-文献/refs.bib,GB/T 7714 格式(见 thesis-citation 技能) | 10-20 条 |
|
|
61
61
|
|
|
@@ -77,7 +77,7 @@ description: 计算机类本科毕业设计全流程总纲。任何涉及论文
|
|
|
77
77
|
- 答辩前要讲清自己的系统:加载 `code-walkthrough`
|
|
78
78
|
- 写作要求被质疑、导师口径模糊:加载 `thesis-inquiry`
|
|
79
79
|
|
|
80
|
-
## 插件工具地图(dsh-thesis 全集:
|
|
80
|
+
## 插件工具地图(dsh-thesis 全集:24 个工具 / 0 条命令)
|
|
81
81
|
|
|
82
82
|
命名空间规则:`thesis_*` 操作论文工作区里的东西;`fact_*` 操作跨会话的稳定事实;
|
|
83
83
|
`defense_code_*` 是答辩层的代码演练。
|
|
@@ -87,8 +87,9 @@ description: 计算机类本科毕业设计全流程总纲。任何涉及论文
|
|
|
87
87
|
| 入口 | `thesis_ingest` | 摄取材料(docx/xlsx/pptx/pdf/md/csv/代码)→ 文本 + `00-管理/材料清单.md` |
|
|
88
88
|
| 入口 | `thesis_intake` | **逐题追问**,把材料问成 `00-管理/意图规格.md`(一次一问) |
|
|
89
89
|
| 流程 | `thesis_init` / `thesis_progress` / `thesis_decide` | 建工作区 / 台账与 G1-G4 闸门 / 决定留痕 |
|
|
90
|
-
| 文献 | `thesis_lit_search` / `thesis_lit_save` / `thesis_lit_note` | 真实检索(零假文献)→ refs.bib →
|
|
91
|
-
| 写作 | `thesis_review` / `thesis_check` / `thesis_build` | 逐章评审 → 全文一致性检查 → Word
|
|
90
|
+
| 文献 | `thesis_lit_search` / `thesis_lit_save` / `thesis_lit_note` / `thesis_lit_verify` / `thesis_lit_import` | 真实检索(零假文献)→ refs.bib → 阅读笔记;外部导出先核验再入库 |
|
|
91
|
+
| 写作 | `thesis_review` / `thesis_check` / `thesis_build` | 逐章评审 → 全文一致性检查 → Word 构建(含插图嵌入) |
|
|
92
|
+
| 插图 | `thesis_figure` | draw.io 源文件 + 3× PNG(架构/流程/ER/时序);导出与图表体检 |
|
|
92
93
|
| 合规 | `thesis_stylecheck` / `thesis_originality` | 写作风格自查(AI 味)/ 原创性本地度量与复测 |
|
|
93
94
|
| 答辩 | `thesis_defense` / `thesis_slides` | 答辩素材与问题库 / 幻灯 Markdown 与 pptx 转换 |
|
|
94
95
|
| 答辩 | `defense_code_status` / `defense_code_next` / `defense_code_update` | 代码演练:把系统拆成讲得清的模块 |
|
|
@@ -80,7 +80,10 @@ description: 中文学术论文写作规范。用于阶段 7:七章结构与
|
|
|
80
80
|
## 9. 图表与公式格式细则
|
|
81
81
|
|
|
82
82
|
- **图**:图题在图**下方**,格式"图 3-1 系统总体架构图";正文必须先引用后出现("如图 3-1 所示")。
|
|
83
|
+
图片写成独占一行的 ``:alt 就是图题,构建时进 Word。
|
|
83
84
|
- **表**:表题在表**上方**;高校常用**三线表**(顶线、栏目线、底线,无竖线);表内数据右对齐、表头居中。
|
|
84
85
|
- 图/表编号按章从 1 连续(thesis_review 机器校验);跨章引用要写"见 4.3 节",不直接写"图 4-1"。
|
|
85
|
-
-
|
|
86
|
+
- **图用 draw.io 画,不用 Mermaid**:`thesis_figure action=create` 生成可编辑的 `.drawio` 与 3× PNG
|
|
87
|
+
(源文件与导出件都放在 `06-论文/assets/图/`,随论文 git 版本化);改了图重跑 `action=export`。
|
|
88
|
+
- 截图必须来自真实运行(红线),分辨率足够印刷清晰;导出件低于 1200px 宽时 `thesis_figure action=check` 会提示重导。
|
|
86
89
|
- **公式**:独立成行的公式居中、按章编号(式 3-1);行内公式直接写;符号首次出现说明含义与单位。
|