dsh-nerd-mode 0.2.1 → 0.4.0
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 +215 -163
- package/README.zh.md +217 -163
- package/assets/calibration.svg +69 -0
- package/assets/choose-a-mode.svg +48 -0
- package/assets/nerd.svg +22 -0
- package/assets/two-paths.svg +93 -0
- package/client.js +1375 -161
- package/cordis.patch.yml +28 -19
- package/lib/index.js +121 -1
- package/package.json +15 -3
- package/skills/study/SKILL.md +78 -86
- package/skills/study-plus/SKILL.md +239 -185
- package/skills/study-plus/scripts/book-client.js +286 -0
- package/skills/study-plus/scripts/book-data.mjs +289 -0
- package/skills/study-plus/scripts/build-book.mjs +149 -0
- package/skills/writing-beats/agents/openai.yaml +1 -1
- package/assets/icon-dark.svg +0 -5
- package/assets/icon-light.svg +0 -5
package/README.zh.md
CHANGED
|
@@ -1,163 +1,217 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/nerd.svg" width="280" alt="手绘的书呆子,粗框眼镜,两颗门牙">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h1 align="center">Nerd Mode:dsh 学习开关</h1>
|
|
6
|
+
|
|
7
|
+
<hr>
|
|
8
|
+
|
|
9
|
+
<p align="center"><em>一次一个概念,聊天结束后记录还在。</em></p>
|
|
10
|
+
|
|
11
|
+
<p align="center">
|
|
12
|
+
<a href="./README.md"><img src="https://img.shields.io/badge/English-switch-d0d7de" alt="English"></a>
|
|
13
|
+
</p>
|
|
14
|
+
|
|
15
|
+
聊天里的学习通常在答案到达时就结束了。没人检验你有没有弄懂,关掉窗口也什么都不剩。Nerd Mode 让 dsh 一步步地教,在换个选择就会改变结果的地方停下来,遇到值得跟的主题就留下带日期的记录。这样一个主题能撑过几周,而不只是一次对话。
|
|
16
|
+
|
|
17
|
+
## 主要功能
|
|
18
|
+
|
|
19
|
+
- 一个开关管整个会话。`/nerd-mode on` 之后,所有学习类请求都按教学方式回答,写代码、搜索和命令照常执行。
|
|
20
|
+
- 两条学习路径。`/study` 在对话里讲一个概念或做一件事,不留下记录;`/study-plus` 把一个主题跟上几周,留下带日期的记录。
|
|
21
|
+
- 先有图,再上课。概念按先修顺序排好,分进 Book、Chapter、Section,等你批准之后才写文件。
|
|
22
|
+
- 每个主题只问一轮开课校准。问你想用这个主题做什么、以前接触过什么、哪些概念可以跳过,据此定出教学深度,之后每份讲义都按它写。
|
|
23
|
+
- 讲到岔口就停。讲义一步一步地讲,在换个选择就会改变结果的地方停下来问你,不会直接把成品答案端上来。
|
|
24
|
+
- 认证据,不认印象。没见过的题加上要评分的复述,评分标准在出题之前就写好。只有你自己答出来的内容才会改写记录。
|
|
25
|
+
- 记录比对话活得久。概念图、状态和带日期的记录能跨重启保留,讲义一有变化,HTML 版的书就重建,并且支持全文搜索。
|
|
26
|
+
- 讲义找得回来。Lectures 卡片按主题列出这个工作区里保存过的每一份讲义。
|
|
27
|
+
|
|
28
|
+
## 运行环境
|
|
29
|
+
|
|
30
|
+
- 装有 profile 的 DeepSeek Harness。
|
|
31
|
+
- Node.js 22.19 或更新。
|
|
32
|
+
- Windows、macOS 或 Linux。
|
|
33
|
+
|
|
34
|
+
## 安装
|
|
35
|
+
|
|
36
|
+
从 npm:
|
|
37
|
+
|
|
38
|
+
```powershell
|
|
39
|
+
dsh plugin --profile <profile> add dsh-nerd-mode
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
从 GitHub:
|
|
43
|
+
|
|
44
|
+
```powershell
|
|
45
|
+
dsh plugin --profile <profile> add github:bocchii-the-code/dsh-nerd-mode
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
从本地目录或压缩包:
|
|
49
|
+
|
|
50
|
+
```powershell
|
|
51
|
+
dsh plugin --profile <profile> add C:\path\to\dsh-nerd-mode
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
重启 dsh。每个模式都会多出 `/nerd-mode` 命令,输入框工具栏多一个 `Nerd Mode` 胶囊。模式选择器不会多出新条目,因为插件挂在 profile 层,不是预设。
|
|
55
|
+
|
|
56
|
+
## 使用方法
|
|
57
|
+
|
|
58
|
+
问一个问题,Nerd Mode 会走两条路中的一条。两条都分步骤讲,都会在分叉点停下来问一次。区别在于它们留下什么。
|
|
59
|
+
|
|
60
|
+
<p align="center">
|
|
61
|
+
<img src="assets/two-paths.svg" width="720" alt="左右两栏对照。左边 /study 只处理一个问题和一个答案,讲完就结束。右边 /study-plus 先建概念图,再分 Book、Chapter、Section,每个概念一份讲义,并跨周记录每节课。">
|
|
62
|
+
</p>
|
|
63
|
+
|
|
64
|
+
### 快速课程:`/study`
|
|
65
|
+
|
|
66
|
+
把一个概念或一个任务从第一步走到最后一步,只在分叉点停一次。概念按层次讲,先直觉,再术语,最后形式细节。任务直接产出成品,每一步旁边写一行理由。它不打分,也不保存学习者记录。只在你指定路径时保存讲稿或成品,需要图时会画一张 SVG。`/study-plus` 写讲义时遵循的写作规则,也只有这一份。
|
|
67
|
+
|
|
68
|
+
适合现在就想弄懂、之后大概不会再回来的问题。
|
|
69
|
+
|
|
70
|
+
- 读论文卡在一个术语上。
|
|
71
|
+
- 今晚必须交的一道作业。
|
|
72
|
+
- 改代码之前,要先把这段逻辑理顺。
|
|
73
|
+
- 一个不大的选择,想先看清取舍再决定。
|
|
74
|
+
|
|
75
|
+
```text
|
|
76
|
+
/study 为什么 Adam 要除以 1 - β^t
|
|
77
|
+
/study 帮我把这个文件里的预条件子讲清楚 # 带代码
|
|
78
|
+
/study 帮我把第三题做完,每一步都说原因 # 带作业
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
敲命令,或者打开开关直接问。开关打开时,学习类的请求默认就是这个形状。
|
|
82
|
+
|
|
83
|
+
显式输入 `/study-plus` 会直接进入带记录的会话,即使请求里有多个概念。显式输入 `/study`,或者打开 Nerd Mode 后直接提问,如果请求里有多个互相独立的概念,会先问一次:要在聊天里一次性给出书式的完整讲解,还是走带记录的 `/study-plus`。前者用普通 Markdown,一级标题是书名或题目,二级标题是章,三级标题是节。
|
|
84
|
+
|
|
85
|
+
你会拿到:标题、中心思想、编号步骤,每个公式上方一行符号说明。四个以上符号被多个公式反复用到时,开头再加一张速查表。然后是一个具体例子、常见错误,以及在分叉处停的那一次。任务是另外给你做完的东西和每一步的理由。
|
|
86
|
+
|
|
87
|
+
它不打分,不保存记录,也不能跨会话接着教同一个主题。讲稿或其他成品只在你要求时才保存,存到你指定的路径。
|
|
88
|
+
|
|
89
|
+
### 长课程:`/study-plus`
|
|
90
|
+
|
|
91
|
+
把一个主题组织成一本 Book,下面分 Chapter,每个 Chapter 下分 Section。每个 Section 只放一个概念。它按先修顺序建概念图,把概念分进各章,每次只教一个概念,也只考这个概念的掌握情况。概念图里同时带 Chapter 和 Section 两列,所以一张图里既有阅读顺序,也有先修顺序。它维护三个记录文件,并为每个概念保存一份 Markdown 文件,放在 `study/<slug>/lectures/`。你批准概念图后,它会为每个概念先写好一份完整讲稿,开讲不用等准备。它用已保存的材料生成一个 HTML 书页,材料有变化就自动刷新。
|
|
92
|
+
|
|
93
|
+
适合下个月你还在学的东西。
|
|
94
|
+
|
|
95
|
+
- 认真读一本教材、一门课或一篇论文。
|
|
96
|
+
- 想让教材的章节目录成为之后复习的骨架。
|
|
97
|
+
- 需要知道下一步该学什么,而不只是现在该问什么。
|
|
98
|
+
- 想要进度的证据,而不是感觉。
|
|
99
|
+
- 你总在反复查同一批东西,查完就忘。
|
|
100
|
+
|
|
101
|
+
显式输入 `/study-plus` 会直接开始带记录的会话,即使主题里有多个概念,也不会再问一次性讲解还是带记录讲解。
|
|
102
|
+
|
|
103
|
+
```text
|
|
104
|
+
/study-plus 洗发水与 Adam 优化器 # 第一次建图
|
|
105
|
+
/study-plus # 之后继续同一话题
|
|
106
|
+
/study-plus 第 2 章 # 按书中顺序读这一章
|
|
107
|
+
/study-plus 矩阵平方根 # 直接跳到某个概念
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
第一次会话按固定顺序走。
|
|
111
|
+
|
|
112
|
+
```text
|
|
113
|
+
/study-plus <主题>
|
|
114
|
+
按先修顺序给出 15 到 30 个概念,分进各章
|
|
115
|
+
章节列表和概念表一起给你看,然后等你确认
|
|
116
|
+
你批准、修改或重建概念图
|
|
117
|
+
你回答一轮开课校准:目标、背景,以及哪些概念可以跳过
|
|
118
|
+
为每个概念写一份完整讲稿,跳过的也写
|
|
119
|
+
逐个概念教:课前回忆(可选)→ 讲义 → 设置数量的没见过的题 → 复述 → 带日期的记录
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
批准概念图后先问一轮开课校准:这个主题你想学到能做什么,以前接触过什么,概念图里哪些概念可以直接跳过。答案决定 `graph.md` 里的 `Teaching level` 一行,`Goal` 和 `Background` 也一并写入,之后每份讲义都按这个教学深度来写。深度只管讲义,不管题目、复述和记录。中途改的深度只对这次会话有效,说「以后都这样」才会改写那一行。
|
|
123
|
+
|
|
124
|
+
<p align="center">
|
|
125
|
+
<img src="assets/calibration.svg" width="720" alt="开课校准流程:你批准按章节分组的 15 到 30 个概念,再回答一轮提问,说明你想用这个主题做什么、以前读过或用过什么、哪些概念可以直接跳过。答案定出 graph.md 里的教学深度,之后每份讲义都按它来写。beginner 的讲义分成编号步骤,解释每个术语,每一步配一个例子。standard 先讲直觉,再讲形式细节,需要时给例子。advanced 一遍讲完,不编号,从形式陈述开始,每个想法最多一个例子。">
|
|
126
|
+
</p>
|
|
127
|
+
|
|
128
|
+
讲稿只是准备,不算学过。每份讲义都按 `/study` 的写作规则写,并且先保存再显示。
|
|
129
|
+
|
|
130
|
+
概念图删掉的概念,它的讲义文件会移到 `lectures/archive/`,不会被删除。
|
|
131
|
+
|
|
132
|
+
之后的会话先读记录文件。你挑一章或一个概念,它用一句说明这个概念的现状和它先修概念的现状。先修不会强制你按顺序走。
|
|
133
|
+
|
|
134
|
+
Profile 默认值在 设置 -> Nerd Mode。它管的是记录型会话:每次开讲前是否先来一次课前回忆,一节课后问几道没见过的题,题型是简答、四选一还是混合。保存从下一节课开始生效;取消只丢草稿;恢复默认回到关闭、3 题、简答。在一次 `/study-plus` 请求里明确说出的偏好,只对那一次会话生效。
|
|
135
|
+
|
|
136
|
+
你会拿到:一套阅读顺序和一套先修顺序、你想学的任何一个概念、只针对这个概念的批改、一份保存下来的讲义,以及重启也还在的记录。HTML 书页会在每次批量写稿和每节课后刷新,每节一页,按原来的节顺序排列,支持全文搜索,还没讲过的内容标成草稿。
|
|
137
|
+
|
|
138
|
+
HTML 书页保留每个 Section 在概念图里的原编号,也就是教材里的节号,即使前面的讲义文件还没保存。每个 Chapter 的计数只算实际收进书里的 Section。
|
|
139
|
+
|
|
140
|
+
它不排复习时间表,也不猜你会什么。只有你自己做出来的答案才能改变记录。先修没学也不会拦住你想学的概念。它会讲清或建议先修,选哪个仍然由你决定。
|
|
141
|
+
|
|
142
|
+
### 两者会留下什么
|
|
143
|
+
|
|
144
|
+
| | `/study` 快速课程 | `/study-plus` 长课程 |
|
|
145
|
+
|---|---|---|
|
|
146
|
+
| 写文件 | 只在你指定路径时保存讲稿或成品,需要图时会画 SVG | `study/<主题>/` 下的概念图、状态、日志,每个概念一份文件,`book.html` 自动刷新 |
|
|
147
|
+
| 读文件 | 默认不读,但会读写你指定的成品路径 | 开口前先读那三个 |
|
|
148
|
+
| 下次还记得 | 不记得 | 记得,带日期 |
|
|
149
|
+
| 批改 | 不批 | 按概念批,先写评分标准 |
|
|
150
|
+
| 组织方式 | 一个概念、一个任务,或一次性的书式讲解 | Book、Chapter、Section |
|
|
151
|
+
| 典型长度 | 一次坐完,一个概念 | 15 到 30 个概念,跨几周 |
|
|
152
|
+
|
|
153
|
+
`/study` 自己不会建 `study/` 文件夹。讲稿和成品只会存到你指定的路径,包括 `study/<主题>/lectures/` 下的普通文件。图默认放在 `diagrams/<topic>/`,除非你另指路径。它不得读写 `graph.md`、`state.md`、`log.md` 或 `plan.md`。
|
|
154
|
+
|
|
155
|
+
### 怎么选
|
|
156
|
+
|
|
157
|
+
<p align="center">
|
|
158
|
+
<img src="assets/choose-a-mode.svg" width="720" alt="一个问题,这个主题你还会再回来吗,分成是和否两支。否走 /study,一次坐完,不留记录。是走 /study-plus,连着几周上课,留下带日期的记录。一条标着「还会回来」的弧线箭头从 /study 指向 /study-plus。">
|
|
159
|
+
</p>
|
|
160
|
+
|
|
161
|
+
- 问完就不会再回来的问题,用 `/study`。
|
|
162
|
+
- 要连着几周的东西,用 `/study-plus`。
|
|
163
|
+
- 想让教材的章节目录成为复习骨架,用 `/study-plus`,它会把教材的章映射成 Chapter。
|
|
164
|
+
- 先用 `/study`,发现自己一直在回来,就用 `/study-plus` 建一次概念图,之前聊过的内容照样用得上。
|
|
165
|
+
|
|
166
|
+
举个例子。你在读 Shampoo 那篇论文,卡在预条件子上。`/study Shampoo 的预条件子到底在做什么`,一次坐完。如果你决定认真读完这篇论文,就开 `/study-plus 洗发水与 Adam 优化器`,让它先把顺序排出来。
|
|
167
|
+
|
|
168
|
+
### 命令
|
|
169
|
+
|
|
170
|
+
```text
|
|
171
|
+
/nerd-mode on 这次对话进入教学姿势
|
|
172
|
+
/nerd-mode off
|
|
173
|
+
/study <概念或任务>
|
|
174
|
+
/study-plus <主题> 带三个记录文件的记录型会话
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
书页不是命令。`/study-plus` 每次批量写稿和每节课后自动刷新,上一版会留成 `book.html.bak`。
|
|
178
|
+
|
|
179
|
+
输入框工具栏里的胶囊发的就是 `/nerd-mode`。它排在 Full Throttle 左边,一直显示,关闭时变暗。
|
|
180
|
+
|
|
181
|
+
## 开关做了什么
|
|
182
|
+
|
|
183
|
+
- 它改的是文字,不是工具。工具目录和提示缓存都不变。
|
|
184
|
+
- 只对学习类请求生效:讲清概念、辅导作业、讲解代码、准备考试。写功能、查资料、改配置、跑命令照常。
|
|
185
|
+
- 开关只作用于这一次会话。状态存在会话日志里,压缩上下文、恢复会话都不丢。
|
|
186
|
+
- 命令执行失败时,窗口顶部会弹一条说明原因的提示,胶囊保持原状态。
|
|
187
|
+
- 子代理各自跑自己的会话,所以默认都是关闭的。
|
|
188
|
+
- 它删不掉基础模式的人格文字,只能声明自己的规则优先。
|
|
189
|
+
|
|
190
|
+
## 内置技能
|
|
191
|
+
|
|
192
|
+
- `study`:不打分的引导式讲解,也是讲义的写作标准。按需存文件,需要图时会画。
|
|
193
|
+
- `study-plus`:记录型会话。Book、Chapter、Section,每个概念一份讲义,按概念批改。
|
|
194
|
+
- `diagram`:一个概念一张 SVG 图。为本包编写。
|
|
195
|
+
- `answer-me-with-html`:一页式 HTML 图解,作者 QingYunA。
|
|
196
|
+
- `teach`:带日期的教学工作区,作者 Matt Pocock。
|
|
197
|
+
- `writing-beats`:逐拍结构的文章写法,作者 Matt Pocock。
|
|
198
|
+
- `humanizer`:把 AI 味的文字改回人话,作者 Siqi Chen。
|
|
199
|
+
- `convert-documents-to-markdown`:Word、PDF、电子书转换,作者 firecrawl。
|
|
200
|
+
|
|
201
|
+
## 说明
|
|
202
|
+
|
|
203
|
+
- 插件用 `!!js` 表达式从 `cordis.patch.yml` 加载自己的 `skills/` 目录。补丁是宿主进程代码,改之前先读。
|
|
204
|
+
- 如果你改了包名,记得同步 `cordis.patch.yml` 里的 `resolve('dsh-nerd-mode/package.json')`。
|
|
205
|
+
- 随包的第三方技能各自保留许可,见 [NOTICE.md](./NOTICE.md)。
|
|
206
|
+
- 设计记录:[SPEC v3](./docs/specs/2026-10-28-study-plus-v3.md)、[v2,历史版本](./docs/specs/2026-10-27-study-plus-v2.md)、[会话默认值](./docs/specs/2026-10-28-nerd-mode-settings.md)、[GLOSSARY.md](./GLOSSARY.md)、`docs/adr/`。文档结构见 [docs/README.md](./docs/README.md)。
|
|
207
|
+
- 在 `@deepseek-ai/dsh` 0.2.1-rc.3 和 Node 22 上测过。
|
|
208
|
+
|
|
209
|
+
## 卸载
|
|
210
|
+
|
|
211
|
+
```powershell
|
|
212
|
+
dsh plugin --profile <profile> remove dsh-nerd-mode
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## 许可
|
|
216
|
+
|
|
217
|
+
MIT。随包的第三方技能各自保留许可,见 [NOTICE.md](./NOTICE.md)。
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 640" role="img" aria-labelledby="title desc">
|
|
2
|
+
<title id="title">Calibration sets one teaching level for every lecture</title>
|
|
3
|
+
<desc id="desc">You approve the concept graph, then answer one question round, once per topic: what you want to do with it, what you have read or used, and which concepts you can skip. The answers fan out to three teaching levels. Beginner uses numbered steps, explains every term, and shows an example per step. Standard gives intuition first, then the formal detail, with examples where useful. Advanced takes one pass with no steps, gives the formal statement first, and uses at most one example. The level is written to graph.md, and every lecture follows it. The questions, the teach-back, and the record stay the same.</desc>
|
|
4
|
+
|
|
5
|
+
<rect x="8" y="8" width="944" height="624" rx="20" fill="#FFFFFF" stroke="#D8D2C6" stroke-width="2"/>
|
|
6
|
+
|
|
7
|
+
<g font-family="system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif" fill="#141414">
|
|
8
|
+
<text x="480" y="62" text-anchor="middle" font-size="26" font-weight="600">One-time, before the first lecture</text>
|
|
9
|
+
</g>
|
|
10
|
+
|
|
11
|
+
<g fill="#FFFFFF" stroke="#141414" stroke-width="3.4" stroke-linejoin="round">
|
|
12
|
+
<path d="M81 231 C 138 229, 206 234, 249 230 C 255 230, 265 235, 264 242 L264 341 C 264 347, 260 351, 253 350 C 192 352, 132 348, 81 351 C 74 351, 71 347, 72 340 L72 241 C 71 235, 75 231, 81 231 Z"/>
|
|
13
|
+
<path d="M309 197 C 372 195, 462 200, 547 196 C 554 196, 559 201, 558 209 L558 373 C 558 380, 554 385, 546 384 C 484 386, 394 382, 309 385 C 301 385, 297 380, 298 372 L298 209 C 297 202, 301 197, 309 197 Z"/>
|
|
14
|
+
<path d="M603 84 C 664 82, 794 86, 859 83 C 866 83, 871 88, 870 95 L870 196 C 870 202, 866 206, 859 205 C 794 207, 664 203, 603 206 C 596 206, 591 202, 592 195 L592 94 C 591 88, 595 84, 603 84 Z"/>
|
|
15
|
+
<path d="M603 230 C 669 228, 789 232, 859 229 C 866 229, 871 234, 870 241 L870 342 C 870 348, 866 352, 859 351 C 794 353, 664 349, 603 352 C 596 352, 591 348, 592 341 L592 240 C 591 234, 595 230, 603 230 Z"/>
|
|
16
|
+
<path d="M603 376 C 664 374, 794 378, 859 375 C 866 375, 871 380, 870 387 L870 488 C 870 494, 866 498, 859 497 C 794 499, 664 495, 603 498 C 596 498, 591 494, 592 487 L592 386 C 591 380, 595 376, 603 376 Z"/>
|
|
17
|
+
</g>
|
|
18
|
+
|
|
19
|
+
<g fill="none" stroke="#141414" stroke-linecap="round" stroke-linejoin="round">
|
|
20
|
+
<path d="M265 291 C 274 290, 284 292, 292 291" stroke-width="2.6"/>
|
|
21
|
+
<path d="M297 291 L288 286 M297 291 L288 296" stroke-width="2.4"/>
|
|
22
|
+
|
|
23
|
+
<path d="M559 291 C 565 290, 570 292, 575 291" stroke-width="2.6"/>
|
|
24
|
+
<path d="M575 145 C 574 220, 576 370, 575 437" stroke-width="2.6"/>
|
|
25
|
+
<path d="M575 145 C 581 144, 585 146, 591 145" stroke-width="2.6"/>
|
|
26
|
+
<path d="M575 291 C 581 290, 585 292, 591 291" stroke-width="2.6"/>
|
|
27
|
+
<path d="M575 437 C 581 436, 585 438, 591 437" stroke-width="2.6"/>
|
|
28
|
+
<path d="M591 145 L582 140 M591 145 L582 150" stroke-width="2.4"/>
|
|
29
|
+
<path d="M591 291 L582 286 M591 291 L582 296" stroke-width="2.4"/>
|
|
30
|
+
<path d="M591 437 L582 432 M591 437 L582 442" stroke-width="2.4"/>
|
|
31
|
+
</g>
|
|
32
|
+
<circle cx="575" cy="291" r="3" fill="#141414"/>
|
|
33
|
+
|
|
34
|
+
<g font-family="system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif" text-anchor="middle" fill="#141414">
|
|
35
|
+
<text x="168" y="277" font-size="21" font-weight="700" letter-spacing="0.2">You approve</text>
|
|
36
|
+
<text x="168" y="301" font-size="18">15-30 concepts</text>
|
|
37
|
+
<text x="168" y="322" font-size="18">grouped by chapter</text>
|
|
38
|
+
|
|
39
|
+
<text x="428" y="244" font-size="21" font-weight="700" letter-spacing="0.2">One question round</text>
|
|
40
|
+
<text x="428" y="266" font-size="17">once per topic</text>
|
|
41
|
+
<text x="428" y="296" font-size="18">what you want to do with it</text>
|
|
42
|
+
<text x="428" y="326" font-size="18">what you have read or used</text>
|
|
43
|
+
<text x="428" y="356" font-size="18">which concepts you can skip</text>
|
|
44
|
+
|
|
45
|
+
<text x="731" y="119" font-size="21" font-weight="700" letter-spacing="0.2">beginner</text>
|
|
46
|
+
<text x="731" y="143" font-size="18">numbered steps</text>
|
|
47
|
+
<text x="731" y="166" font-size="18">every term explained</text>
|
|
48
|
+
<text x="731" y="189" font-size="18">an example per step</text>
|
|
49
|
+
|
|
50
|
+
<text x="731" y="265" font-size="21" font-weight="700" letter-spacing="0.2">standard</text>
|
|
51
|
+
<text x="731" y="289" font-size="18">intuition first</text>
|
|
52
|
+
<text x="731" y="312" font-size="18">then the formal detail</text>
|
|
53
|
+
<text x="731" y="335" font-size="18">examples where useful</text>
|
|
54
|
+
|
|
55
|
+
<text x="731" y="411" font-size="21" font-weight="700" letter-spacing="0.2">advanced</text>
|
|
56
|
+
<text x="731" y="435" font-size="18">one pass, no steps</text>
|
|
57
|
+
<text x="731" y="458" font-size="18">formal statement first</text>
|
|
58
|
+
<text x="731" y="481" font-size="18">at most one example</text>
|
|
59
|
+
</g>
|
|
60
|
+
|
|
61
|
+
<path d="M644 530 C 704 528, 764 532, 818 529" fill="none" stroke="#D8D2C6" stroke-width="2" stroke-linecap="round"/>
|
|
62
|
+
|
|
63
|
+
<g font-family="system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif" text-anchor="middle" fill="#141414">
|
|
64
|
+
<text x="731" y="554" font-size="18">Written to <tspan font-weight="600">graph.md</tspan>.</text>
|
|
65
|
+
<text x="731" y="576" font-size="18">Every lecture follows it.</text>
|
|
66
|
+
|
|
67
|
+
<text x="480" y="604" font-size="18">The questions, the teach-back, and the record stay the same.</text>
|
|
68
|
+
</g>
|
|
69
|
+
</svg>
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 420" role="img" aria-labelledby="title desc">
|
|
2
|
+
<title id="title">Choose a mode: /study or /study-plus</title>
|
|
3
|
+
<desc id="desc">A question, "Will you come back to this subject?", forks into No and Yes. No leads to /study, with one sitting and no record kept. Yes leads to /study-plus, with weeks of lessons and a dated record. A curved arrow labelled "still coming back?" shows the upgrade path from /study to /study-plus.</desc>
|
|
4
|
+
|
|
5
|
+
<rect x="8" y="8" width="944" height="404" rx="20" fill="#FFFFFF" stroke="#D8D2C6" stroke-width="2"/>
|
|
6
|
+
|
|
7
|
+
<g fill="none" stroke="#141414" stroke-linecap="round" stroke-linejoin="round">
|
|
8
|
+
<path d="M224 102 C 292 98, 386 105, 480 101 C 566 98, 650 104, 736 100" stroke-width="2.5"/>
|
|
9
|
+
<path d="M480 106 C 482 118, 478 132, 480 146" stroke-width="2.8"/>
|
|
10
|
+
<path d="M250 148 C 320 144, 400 151, 470 147 C 540 144, 640 151, 710 148" stroke-width="2.8"/>
|
|
11
|
+
<path d="M250 147 C 249 164, 251 182, 250 204" stroke-width="2.8"/>
|
|
12
|
+
<path d="M710 148 C 711 165, 709 182, 710 204" stroke-width="2.8"/>
|
|
13
|
+
</g>
|
|
14
|
+
<circle cx="480" cy="148" r="3" fill="#141414"/>
|
|
15
|
+
|
|
16
|
+
<g transform="rotate(-2 350 148)">
|
|
17
|
+
<path d="M315 149 C 313 135, 329 126, 349 127 C 368 126, 386 134, 385 147 C 386 161, 370 170, 349 169 C 330 169, 315 162, 315 149 Z" fill="#FFFFFF" stroke="#141414" stroke-width="2.2" stroke-linejoin="round"/>
|
|
18
|
+
<text x="350" y="156" text-anchor="middle" font-family="system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif" font-size="22" font-weight="700" letter-spacing="0.4" fill="#141414">No</text>
|
|
19
|
+
</g>
|
|
20
|
+
<g transform="rotate(1.5 610 148)">
|
|
21
|
+
<path d="M575 147 C 574 133, 590 126, 610 127 C 630 126, 647 134, 646 148 C 647 162, 631 170, 610 169 C 590 169, 575 161, 575 147 Z" fill="#FFFFFF" stroke="#141414" stroke-width="2.2" stroke-linejoin="round"/>
|
|
22
|
+
<text x="610" y="156" text-anchor="middle" font-family="system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif" font-size="22" font-weight="700" letter-spacing="0.4" fill="#141414">Yes</text>
|
|
23
|
+
</g>
|
|
24
|
+
|
|
25
|
+
<g fill="#FFFFFF" stroke="#141414" stroke-width="3.4" stroke-linejoin="round">
|
|
26
|
+
<path d="M143 200 C 210 196, 300 203, 356 199 C 368 198, 376 207, 374 218 C 376 238, 372 252, 374 267 C 375 278, 368 285, 357 283 C 300 287, 230 281, 180 285 C 150 287, 128 285, 127 276 C 125 264, 128 250, 126 238 C 124 224, 127 212, 126 207 C 125 200, 133 201, 143 200 Z"/>
|
|
27
|
+
<path d="M601 201 C 668 197, 758 204, 814 200 C 826 199, 834 207, 832 218 C 834 238, 830 252, 832 267 C 833 278, 826 285, 815 283 C 758 287, 688 281, 638 285 C 608 287, 586 285, 585 276 C 583 264, 586 250, 584 238 C 582 224, 585 212, 584 207 C 583 200, 591 202, 601 201 Z"/>
|
|
28
|
+
</g>
|
|
29
|
+
|
|
30
|
+
<g fill="none" stroke="#141414" stroke-linecap="round">
|
|
31
|
+
<path d="M375 242 C 408 280, 440 297, 480 298 C 520 299, 552 282, 582 244" stroke-width="2.5"/>
|
|
32
|
+
<path d="M582 244 L579 259 M582 244 L568 250" stroke-width="2.5"/>
|
|
33
|
+
</g>
|
|
34
|
+
|
|
35
|
+
<g font-family="system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif" fill="#141414">
|
|
36
|
+
<text x="480" y="84" text-anchor="middle" font-size="27" font-weight="600">Will you come back to this subject?</text>
|
|
37
|
+
|
|
38
|
+
<g text-anchor="middle">
|
|
39
|
+
<text x="250" y="254" font-size="34" font-weight="700" letter-spacing="0.2">/study</text>
|
|
40
|
+
<text x="710" y="254" font-size="34" font-weight="700" letter-spacing="0.2">/study-plus</text>
|
|
41
|
+
<text x="250" y="318" font-size="20">one sitting</text>
|
|
42
|
+
<text x="250" y="344" font-size="20">no record kept</text>
|
|
43
|
+
<text x="710" y="318" font-size="20">weeks of lessons</text>
|
|
44
|
+
<text x="710" y="344" font-size="20">dated record</text>
|
|
45
|
+
<text x="480" y="234" font-size="20">still coming back?</text>
|
|
46
|
+
</g>
|
|
47
|
+
</g>
|
|
48
|
+
</svg>
|
package/assets/nerd.svg
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 480 600" role="img" aria-labelledby="title">
|
|
2
|
+
<title id="title">Rough ink nerd portrait with a strong turn and raised chin</title>
|
|
3
|
+
<path fill="#FFFFFF" stroke="#FFFFFF" stroke-width="20" stroke-linecap="round" stroke-linejoin="round" d="M96 198 C84 180 91 158 105 145 C97 124 109 102 133 94 C135 72 159 57 184 65 C202 42 230 47 245 69 C266 44 296 51 311 74 C335 61 359 75 364 99 C386 106 393 129 382 149 C391 168 381 189 366 204 C380 222 388 241 397 258 C407 269 426 269 433 279 C436 288 420 295 406 297 C414 307 408 318 396 325 C391 354 380 379 364 401 C342 429 310 448 273 452 C237 454 204 441 178 418 C153 396 138 368 127 339 C119 322 113 308 111 294 C101 284 100 273 106 262 C98 244 94 219 96 198 Z"/>
|
|
4
|
+
<path fill="#141414" d="M96 198 C84 180 91 158 105 145 C97 124 109 102 133 94 C135 72 159 57 184 65 C202 42 230 47 245 69 C266 44 296 51 311 74 C335 61 359 75 364 99 C386 106 393 129 382 149 C391 168 381 189 366 204 C380 222 388 241 397 258 C407 269 426 269 433 279 C436 288 420 295 406 297 C414 307 408 318 396 325 C391 354 380 379 364 401 C342 429 310 448 273 452 C237 454 204 441 178 418 C153 396 138 368 127 339 C119 322 113 308 111 294 C101 284 100 273 106 262 C98 244 94 219 96 198 Z"/>
|
|
5
|
+
<path fill="#FFFFFF" d="M119 192 C111 218 111 243 118 266 C110 277 113 289 124 299 C130 329 142 357 161 383 C183 411 213 432 249 438 C282 442 311 430 336 408 C359 388 376 359 383 328 C392 316 391 307 384 299 C391 289 382 281 393 278 C386 271 378 266 370 262 C362 240 356 216 345 198 C335 182 320 176 306 175 C290 184 273 179 258 170 C239 185 220 178 205 169 C185 183 165 178 149 170 C136 179 126 184 119 192 Z"/>
|
|
6
|
+
<path fill="#141414" d="M94 199 C88 180 99 156 121 139 C113 117 135 99 164 99 C176 66 214 64 240 92 C260 61 299 66 316 98 C339 82 364 98 362 124 C380 143 370 172 347 188 L334 199 C318 205 302 195 288 181 C272 198 253 191 237 176 C219 193 199 185 182 170 C165 188 145 181 130 167 C115 185 104 194 94 199 Z"/>
|
|
7
|
+
<path fill="#141414" d="M204 171 C229 170 255 182 278 202 C256 197 237 188 222 183 C213 181 207 178 201 176 Z"/>
|
|
8
|
+
<path fill="#141414" fill-rule="evenodd" transform="translate(0 3)" d="M113 219 C133 206 162 202 192 207 C206 209 212 217 209 231 L204 265 C201 279 192 285 176 286 C153 288 134 280 126 271 C120 263 115 239 113 219 Z M130 232 C148 224 172 223 188 227 C194 229 196 233 195 240 L190 264 C188 271 182 275 174 276 C158 277 143 271 137 265 C133 259 130 242 130 232 Z"/>
|
|
9
|
+
<path fill="#141414" fill-rule="evenodd" d="M225 211 C252 198 294 196 330 204 C344 207 350 215 347 229 L340 264 C337 279 327 285 310 284 C282 282 256 270 242 259 C231 250 225 231 223 218 Z M242 224 C263 213 296 212 324 218 C331 219 334 223 332 231 L326 260 C324 268 317 272 307 271 C285 269 263 258 252 250 C244 244 240 230 239 226 Z"/>
|
|
10
|
+
<path fill="#141414" d="M201 215 C213 210 228 211 241 218 L247 231 C232 224 218 224 204 230 Z"/>
|
|
11
|
+
<path fill="#141414" transform="translate(0 3)" d="M145 243 C155 238 171 238 181 241 L180 247 C170 250 156 249 146 247 Z"/>
|
|
12
|
+
<path fill="#141414" d="M267 237 C278 232 294 232 303 235 L302 241 C292 244 278 243 268 241 Z"/>
|
|
13
|
+
<path fill="#141414" d="M331 254 C349 265 368 276 389 282 C398 284 403 286 408 289 C397 294 382 291 368 287 C352 283 339 276 326 269 Z"/>
|
|
14
|
+
<path fill="#141414" d="M185 351 C208 356 231 358 254 353 C282 347 308 330 331 316 C329 330 320 342 307 350 C284 365 257 372 233 369 C212 367 197 361 185 351 Z"/>
|
|
15
|
+
<path fill="#FFFFFF" stroke="#141414" stroke-width="3" stroke-linejoin="round" d="M224 354 L249 354 L249 382 L224 382 Z"/>
|
|
16
|
+
<path fill="#FFFFFF" stroke="#141414" stroke-width="3" stroke-linejoin="round" d="M254 352 L282 349 L282 381 L254 384 Z"/>
|
|
17
|
+
<path fill="#FFFFFF" stroke="#FFFFFF" stroke-width="20" stroke-linejoin="round" d="M207 429 C183 438 157 448 132 463 C100 480 73 502 53 529 C44 542 46 553 55 560 C111 569 175 572 242 570 C310 573 380 567 435 555 C442 552 444 548 439 539 C426 517 407 496 382 480 C356 462 329 448 300 438 L267 424 Z"/>
|
|
18
|
+
<path fill="#141414" d="M207 429 C183 438 157 448 132 463 C100 480 73 502 53 529 C44 542 46 553 55 560 C111 569 175 572 242 570 C310 573 380 567 435 555 C442 552 444 548 439 539 C426 517 407 496 382 480 C356 462 329 448 300 438 L267 424 Z"/>
|
|
19
|
+
<path fill="#FFFFFF" d="M204 447 C183 455 160 466 139 477 C110 493 85 513 67 535 C63 541 65 547 73 551 C120 558 178 560 242 558 C308 561 372 555 422 544 C412 526 395 508 374 492 C351 475 327 461 297 450 L269 440 Z"/>
|
|
20
|
+
<path fill="#141414" d="M186 445 C208 457 229 476 254 497 L225 525 C207 503 193 477 181 453 Z M318 444 C295 456 275 476 252 498 L280 525 C301 503 314 477 326 455 Z"/>
|
|
21
|
+
<path fill="#FFFFFF" d="M224 479 L253 502 L282 479 L254 518 Z"/>
|
|
22
|
+
</svg>
|