dsh-mastery-loop 0.0.0-stage → 0.2.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/CHANGELOG.md +49 -0
- package/LICENSE +21 -0
- package/README.md +81 -2
- package/cordis.patch.yml +10 -0
- package/lib/index.js +9 -0
- package/package.json +47 -4
- package/skills/mastery-loop/SKILL.md +201 -0
- package/skills/mastery-loop/exam-templates.md +102 -0
- package/skills/mastery-loop/scripts/_lib.mjs +408 -0
- package/skills/mastery-loop/scripts/aggregate.mjs +155 -0
- package/skills/mastery-loop/scripts/graph.mjs +448 -0
- package/skills/mastery-loop/scripts/ledger.mjs +223 -0
- package/skills/mastery-loop/scripts/rewrite-links.mjs +81 -0
- package/skills/mastery-loop/scripts/scan.mjs +276 -0
- package/skills/mastery-loop/scripts/validate.mjs +181 -0
- package/skills/mastery-loop/templates.md +255 -0
- package/skills/mastery-loop-setup/SKILL.md +161 -0
- package/skills/mastery-loop-setup/seeds/config.json +39 -0
- package/skills/mastery-loop-setup/seeds/error-taxonomy.json +4 -0
- package/skills/mastery-loop-setup/seeds/errors.jsonl +1 -0
- package/skills/mastery-loop-setup/seeds/graph.json +13 -0
- package/skills/mastery-loop-setup/seeds/ledger.jsonl +2 -0
- package/skills/mastery-loop-setup/seeds/moc.md +15 -0
- package/skills/mastery-loop-setup/seeds/note.md +33 -0
- package/skills/mastery-loop-setup/seeds/paper-format.json +15 -0
- package/skills/mastery-loop-setup/seeds/state.jsonl +2 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
# 契约正文(Contract)
|
|
2
|
+
|
|
3
|
+
> **本文件是这套 skill 的契约正文**:库长什么样、每个文件干什么、什么能脚本化。
|
|
4
|
+
> `SKILL.md`(*复习主流程*)与 `mastery-loop-setup`(*一次性初始化*)都**只链接到这里**,不各写一份。
|
|
5
|
+
> 改契约**只改这个文件**。出题 / 判分 / 考前 list 的模板在 [exam-templates.md](exam-templates.md)。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 一、库的布局
|
|
10
|
+
|
|
11
|
+
工作区根下**两个并列文件夹**:`kb/`(内容区,给人看)与 `sys/`(机器区,给脚本读)。
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
<工作区根>/
|
|
15
|
+
├── kb/
|
|
16
|
+
│ ├── knowledge/ # 知识点笔记,一篇一个知识点
|
|
17
|
+
│ └── MOC/ # 聚合产物:镜像分类层级
|
|
18
|
+
│ ├── 00 总览.md # 全库视图(可选)
|
|
19
|
+
│ └── <类1>/<类2>/… # 每层一份「该层的索引」,叶子层是讲次级 MOC
|
|
20
|
+
└── sys/
|
|
21
|
+
├── config.json # 设定:路径 / 分类 / 语言 / 确认标记
|
|
22
|
+
├── graph.json # 关系图:知识点的前置关系(真值)
|
|
23
|
+
├── ledger.jsonl # 账本:逐知识点的复习统计(真值)
|
|
24
|
+
├── errors.jsonl # 错误原因表
|
|
25
|
+
├── error-taxonomy.json # 失分原因分类(初始为空,agent 维护)
|
|
26
|
+
├── paper-format.json # 卷面参数(每个课程的每场考试一条)
|
|
27
|
+
├── state.jsonl # 状态:内容哈希 / schema 版本 / 检查时间(用于跳过重扫)
|
|
28
|
+
└── changes.jsonl # 变更流水 —— **只在没有 git 且用户不装 git 时启用**
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**文件夹命名**:固定结构文件夹一律**英文、无特殊符号**(`kb` `knowledge` `MOC` `sys`)。
|
|
32
|
+
**类值目录**(`MOC/<类1>/…`)用**用户自己的分类值**(可以是中文);`config.json` 里给每个类值记一个 **ASCII slug** 供外部工具用。
|
|
33
|
+
|
|
34
|
+
**每个文件开头一句「本文件是什么」**:
|
|
35
|
+
|
|
36
|
+
- Markdown:第一行就是这句话;
|
|
37
|
+
- JSON:第一个字段是 `"用途"`;
|
|
38
|
+
- JSONL:第一行是一条 `{"kind":"header","用途":"…"}` 记录(脚本跳过它)。
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 二、知识点契约
|
|
43
|
+
|
|
44
|
+
### frontmatter
|
|
45
|
+
|
|
46
|
+
```yaml
|
|
47
|
+
---
|
|
48
|
+
类型: 知识点
|
|
49
|
+
归属: ["[[Deep Learning/doc/Lecture/W1L1 Introduction to the Unit.pdf|深度学习 L1]]"]
|
|
50
|
+
aliases: ["Backpropagation"]
|
|
51
|
+
标签: [深度学习, 神经网络, 核心]
|
|
52
|
+
---
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
| 字段 | 值 | 说明 |
|
|
56
|
+
| --- | --- | --- |
|
|
57
|
+
| `类型` | `知识点` | 结构化字段,不是标签 |
|
|
58
|
+
| `分类` | **类路径,多值** | **生成这篇知识点时就附上**(哪个类、哪个子类)。一条一个类路径,层级用 `分类.分隔符`(默认 `/`)分隔。脚本**只读这个字段**做聚合,不解析路径 |
|
|
59
|
+
| `归属` | **来源文件,多值,必填** | 这个知识点**出自哪份资料**(PDF / DOCX / 网页快照都算)。元素是带路径的 wikilink + 人类可读别名 |
|
|
60
|
+
| `aliases` | 英文名列表 | Obsidian 原生别名 |
|
|
61
|
+
| `标签` | 既有标签 | 既有标签(用于搜索/标签面板) |
|
|
62
|
+
|
|
63
|
+
**铁律**
|
|
64
|
+
|
|
65
|
+
- **没有 `课程:`、没有 `主题:`、没有 `难度:`** —— 课程与讲次是**从 `归属` 解析出来的**(见第四节),不是存的字段。
|
|
66
|
+
- **`归属` 是「来源」,不是「关系」** —— 前置/后置在 `sys/graph.json` 里。
|
|
67
|
+
- **列表字段不止 `归属`** —— `标签`、`aliases` 同样是列表。
|
|
68
|
+
- frontmatter 里的 **wikilink 必须加引号**(`[` 会被 YAML 当数组开头)。
|
|
69
|
+
- **契约之外的字段原样保留**,不清理。
|
|
70
|
+
|
|
71
|
+
### 正文(固定顺序)
|
|
72
|
+
|
|
73
|
+
```markdown
|
|
74
|
+
# <中文名> <英文名>
|
|
75
|
+
|
|
76
|
+
## 一句话
|
|
77
|
+
## 核心内容
|
|
78
|
+
## 前置知识
|
|
79
|
+
## 后置知识
|
|
80
|
+
## 易错点 / 考点
|
|
81
|
+
## 讲义出处
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
- `## 前置知识` = **逻辑判定**,唯一判据:**删掉它,本篇的核心内容就解释不通**(只收**直接**前置)。
|
|
85
|
+
- `## 后置知识` = **由图反算,绝不手写**(脚本渲染)。
|
|
86
|
+
- 每条前置后面带 `—— <理由>`,与 `graph.json` 里该边的 `reason` **逐字一致**。
|
|
87
|
+
- **没有 `## 平行关联`**。
|
|
88
|
+
|
|
89
|
+
### 链接写法
|
|
90
|
+
|
|
91
|
+
- **一律带路径**,**相对工作区根**(= Obsidian vault 根),**带后缀**,**带人类可读别名**:
|
|
92
|
+
`[[kb/knowledge/梯度.md|梯度]]` · `[[Deep Learning/doc/Lecture/W1L1 ….pdf|深度学习 L1]]`
|
|
93
|
+
- 代价:改名 / 搬目录会断链 —— 由 `scan.mjs`(*扫库脚本*)发现、`rewrite-links.mjs`(*重写链接脚本*)修。
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## 三、关系图 `sys/graph.json`
|
|
98
|
+
|
|
99
|
+
```json
|
|
100
|
+
{
|
|
101
|
+
"用途": "本文件是知识点关系图:只存边(from 是 to 的前置),节点就是 knowledge/ 里的笔记本身。",
|
|
102
|
+
"规则": "判据:删掉 from,to 的核心内容就解释不通。只收直接前置;同一篇的前置集合内两两不可比。",
|
|
103
|
+
"导出": "后置 = 本表的反向(脚本算);没有「平行」段。",
|
|
104
|
+
"version": 1,
|
|
105
|
+
"updatedAt": "2026-10-14 20:30",
|
|
106
|
+
"coverage": { "深度学习": { "done": ["L1"], "todo": ["L2"] } },
|
|
107
|
+
"edges": [
|
|
108
|
+
{ "from": "梯度", "to": "最速下降与参数空间", "reason": "没有梯度就没有下降方向" }
|
|
109
|
+
]
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
- **边不带课程** —— 课程归属由知识点的 `归属`/标签解析,边只是纯逻辑。
|
|
114
|
+
- `reason` **≤30 字**,指出 `to` 依赖 `from` 的**那一步**。
|
|
115
|
+
- `coverage`:**按分类层级**记「哪些做完了、哪些没做」。
|
|
116
|
+
- 图**允许分批**:`coverage` 里没做的部分,校验不报错。
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## 四、分类与范围
|
|
121
|
+
|
|
122
|
+
**分类是全库级定义**(层级与类值记在 `sys/config.json`),但**每篇知识点属于哪个类,是在生成这篇知识点的时候就附在它身上的** —— 存在 frontmatter 的 `分类` 字段里。**脚本只读这个字段做聚合**,不解析路径、不猜、不写正则。
|
|
123
|
+
|
|
124
|
+
```yaml
|
|
125
|
+
分类: ["深度学习/L3", "机器学习/L5"] # 一条一个类路径;层级用 `分类.分隔符`(默认 /)分隔
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
`config.json` 里记:
|
|
129
|
+
|
|
130
|
+
```json
|
|
131
|
+
"分类": {
|
|
132
|
+
"层级": ["课程", "讲次"],
|
|
133
|
+
"字段": "分类",
|
|
134
|
+
"分隔符": "/",
|
|
135
|
+
"类值": {
|
|
136
|
+
"课程": [ { "值": "深度学习", "slug": "dl" } ],
|
|
137
|
+
"讲次": [ { "值": "L3", "slug": "l3" } ]
|
|
138
|
+
},
|
|
139
|
+
"确认": "(用户于 <YYYY-MM-DD HH:MM> 确认)"
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
- **一篇可以属于多个类**(`归属` 是多值的,类也跟着多值);
|
|
144
|
+
- **归类在生成知识点时定**,不由后面的脚本推;规则怎么算、按什么分,由 agent 在 setup 时**看这个库**再和用户确认(**不预设形状**:课程 / 章 / 模块 / 主题都行);
|
|
145
|
+
- **范围 = 分类里的一个或多个类路径**(例:`深度学习/L3`),脚本按它筛。
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 五、聚合与两区
|
|
150
|
+
|
|
151
|
+
`kb/MOC/` 下的一切都是**从 `归属` + 图聚合出来的**,不是手写枚举。每份 MOC / 索引里分两区:
|
|
152
|
+
|
|
153
|
+
```markdown
|
|
154
|
+
<!-- AUTO:BEGIN -->
|
|
155
|
+
- [[kb/knowledge/梯度.md|梯度]] —— ∇J 是代价函数对全部参数的一阶偏导向量
|
|
156
|
+
<!-- AUTO:END -->
|
|
157
|
+
|
|
158
|
+
## 主线(手写区)
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
- **机器区**:`aggregate.mjs`(*聚合脚本*)生成与覆盖(按分类层级列 `- [[链接]] —— 一句话`、覆盖进度)。
|
|
162
|
+
- **手写区**:agent / 人写,**脚本永不碰**(主线、脉络、指定阅读、考点提示)。
|
|
163
|
+
- 聚合脚本**只做聚合**:不写待办、不打印摘要 —— **要说话的是 `scan.mjs`**。
|
|
164
|
+
- 「分组」不是独立概念:**分类有几层就分几层**;只有两层时 MOC 内部不再分组。
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## 六、脚本边界
|
|
169
|
+
|
|
170
|
+
**脚本只做重复性、机械性、不需要变通的事。** 要理解内容、要随机应变、要交互的**留给 agent**。
|
|
171
|
+
|
|
172
|
+
| 脚本 | 干什么 | 谁触发 |
|
|
173
|
+
| --- | --- | --- |
|
|
174
|
+
| `graph.mjs` | 读写 `sys/graph.json`;六项校验;由图渲染两段 | agent |
|
|
175
|
+
| `aggregate.mjs` | 从 `归属` + 图聚合 MOC / 索引的**机器区** | agent |
|
|
176
|
+
| `scan.mjs` | 扫库五项(见第七节);读 `state.jsonl` **按哈希跳过没变的**;发现坏链接就提示跑 `rewrite-links.mjs` | agent |
|
|
177
|
+
| `rewrite-links.mjs` | 改名 / 搬目录后重写所有带路径链接 | agent(由 scan 触发) |
|
|
178
|
+
| `ledger.mjs` | 按 60/30/10 筛清单、算达标、**批改写回** | agent |
|
|
179
|
+
| `validate.mjs` | 查 `kb/` 与 `sys/` 的结构是否齐 | agent / setup |
|
|
180
|
+
|
|
181
|
+
**不能脚本化**(明确留 agent):判断谁是谁的前置、写 `reason`、出题、批改、**错误原因去重**(脚本会把「把 A1 和 B 弄混」和「把 A2 和 B 弄混」误判成重复)、frontmatter 规范化、分类协商。
|
|
182
|
+
|
|
183
|
+
**脚本纪律**:Node(零依赖,`node xxx.mjs`);**不拼 shell**(路径含中文 / 空格);只读写自己那类文件。
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## 七、校验
|
|
188
|
+
|
|
189
|
+
### 图(`graph.mjs check`,六项)
|
|
190
|
+
|
|
191
|
+
| # | 名称 | 判据 |
|
|
192
|
+
| --- | --- | --- |
|
|
193
|
+
| 1 | 双向自洽 | 边 `from→to` ⟺ `to` 的前置里有 `from` 且 `from` 的后置里有 `to`;正文里出现的关系必须在图里有边 |
|
|
194
|
+
| 2 | 无自链 | 没有 `from == to` |
|
|
195
|
+
| 3 | 无悬空 | `from` / `to` 都能找到对应笔记 |
|
|
196
|
+
| 4 | 同段无重复 | 同一小节里同一目标只出现一次 |
|
|
197
|
+
| 5 | 前后置互斥 | 同一篇的前置集合 ∩ 后置集合 = ∅ |
|
|
198
|
+
| 6 | 前置两两不可比 | 同一篇的前置里,任两条不可互为前置/后置(只收直接前置) |
|
|
199
|
+
|
|
200
|
+
### 扫库(`scan.mjs`,五项)
|
|
201
|
+
|
|
202
|
+
① 悬空链接 ② 带路径链接与当前目录结构不符 ③ `config.json` 的分类 / 版本与现状不符 ④ 图与笔记两段不一致(= 图校验)⑤ 账本 / 错误原因里引用的知识点是否还存在。
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## 八、排序(可选,不是契约)
|
|
207
|
+
|
|
208
|
+
本机**若装了 Miyo**,可以在**已按知识深度排好之后**,对「深度上并列、拿不准先后」的条目问一次相关度作参考:
|
|
209
|
+
`POST http://127.0.0.1:8742/v0/search/related`,body `{"file_path":"<已注册 folder 名>/<库内相对路径>","limit":N}`。
|
|
210
|
+
|
|
211
|
+
- **知识深度是定序者**,Miyo 只作参考;分数**不写进** frontmatter / 图;
|
|
212
|
+
- **没装就跳过**:不报错、不检查、不阻塞 —— 发布版**不依赖** Miyo;
|
|
213
|
+
- 实测提醒:`file_path` 三种分隔符都能用;真正 404 的是「缺已注册 folder 前缀 / 绝对路径 / 不带 `.md` / 路径不在索引里」。
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## 九、git 与历史
|
|
218
|
+
|
|
219
|
+
**能用 git 就用 git** —— 这条管两件事,都优先走 git:
|
|
220
|
+
|
|
221
|
+
| 要回答的问题 | 有 git | 没有 git(且用户不装) |
|
|
222
|
+
| --- | --- | --- |
|
|
223
|
+
| **哪些文件变过**(决定要不要重看) | `git status` + 上次检查的提交号之后 `git diff` | `sys/state.jsonl` 里逐文件的内容哈希 |
|
|
224
|
+
| **发生过什么**(决定怎么追溯) | git 历史(skill **不自动 `commit`、绝不 `push`**,只提示) | `sys/changes.jsonl`(*变更流水*):一行一条,只追加不改 |
|
|
225
|
+
|
|
226
|
+
```json
|
|
227
|
+
{"at":"2026-10-14 20:30","by":"user","what":"config:分类","from":"","to":"课程 × 讲次","why":"用户确认"}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
- `sys/state.jsonl` 在 git 模式下**只有一行**(`{"mode":"git","last":"<commit>",…}`);没有 git 时才逐文件记哈希;
|
|
231
|
+
- 管「要不要重看」的是它,管「发生过什么」的是 git(或 `changes.jsonl`)—— **两者不是一回事**;
|
|
232
|
+
- 沙箱里抓子进程输出会被拒(EPERM),所以脚本调 git 时把输出**重定向到文件描述符**再读回来,而不是用管道。
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## 十、用户确认标记
|
|
237
|
+
|
|
238
|
+
**问出来的信息**(分类、路径、语言、范围、融合决定)后面跟一个括号:
|
|
239
|
+
|
|
240
|
+
```
|
|
241
|
+
(用户于 2026-10-14 20:30 确认)
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
- **精确到分钟**;**只标问出来的**(agent 自己推的不标);
|
|
245
|
+
- **就地只留最新一条**;历史翻 git(无 git 时翻 `changes.jsonl`);
|
|
246
|
+
- 适用范围:**发布出去的库同样适用**(不是开发者专用)。
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## 十一、复习循环里用到的量
|
|
251
|
+
|
|
252
|
+
- **配比**(按本次范围题池统算):60% 熟练度最低 · 30% `是否学习过 = 否` · 10% `最后复习日期` 最久远。
|
|
253
|
+
- **达标**(逐点):`总共出过 ≥ 5` **且** `熟练程度 ≥ 本次目标正确率`;`总共出过 < 5` 标「样本不足」。
|
|
254
|
+
- **账本字段**:`知识点 / 是否学习过 / 做对 / 总共出过 / 熟练程度 / 最后复习日期`。
|
|
255
|
+
- **做对** = 思维链对 **且** 答案对(蒙对不算)。
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mastery-loop-setup
|
|
3
|
+
description: >-
|
|
4
|
+
一次性初始化或迁移 mastery-loop 的知识库:探测材料与既有笔记,问清「按什么分类」「范围」「素材」「语言」「卷面格式」,把 kb/(内容区)与 sys/(机器区)建起来,或把已有库按契约重建结构(内容原样保留),最后跑校验。首次使用 mastery-loop 之前跑一次。
|
|
5
|
+
/ One-time setup or migration for mastery-loop: explore materials and existing notes, ask about classification, scope, sources, language and exam format, then scaffold kb/ + sys/ (or rebuild an existing library's structure without touching its content) and verify it.
|
|
6
|
+
disable-model-invocation: true
|
|
7
|
+
user-invocable: true
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# mastery-loop 初始化
|
|
11
|
+
|
|
12
|
+
> **本文件是初始化 / 迁移流程。** 契约正文(*库长什么样、每个文件干什么*)在
|
|
13
|
+
> [`../mastery-loop/templates.md`](../mastery-loop/templates.md) —— **它是权威,改契约只改那里**,本文件只讲「怎么建」。
|
|
14
|
+
|
|
15
|
+
**产出:两个并列文件夹**
|
|
16
|
+
|
|
17
|
+
| 路径 | 是什么 |
|
|
18
|
+
| --- | --- |
|
|
19
|
+
| `kb/knowledge/` | 知识点笔记(一篇一个知识点) |
|
|
20
|
+
| `kb/MOC/` | 聚合产物,镜像分类层级(每层一份索引 + 叶子层讲次 MOC) |
|
|
21
|
+
| `sys/config.json` | 设定:路径 / 分类 / 语言 / 确认标记 |
|
|
22
|
+
| `sys/graph.json` | 关系图(前置关系的真值) |
|
|
23
|
+
| `sys/ledger.jsonl` | 账本(逐知识点复习统计,真值) |
|
|
24
|
+
| `sys/errors.jsonl` | 错误原因表 |
|
|
25
|
+
| `sys/error-taxonomy.json` | 失分原因分类(初始为空,agent 维护) |
|
|
26
|
+
| `sys/paper-format.json` | 卷面参数 |
|
|
27
|
+
| `sys/state.jsonl` | 状态(哈希 / schema 版本 / 检查时间) |
|
|
28
|
+
| `sys/changes.jsonl` | 变更流水 —— **只在没有 git 且用户不装 git 时才建** |
|
|
29
|
+
|
|
30
|
+
> 这是 **prompt-driven skill,不是确定性脚本**。探索、把发现摆出来、问、确认,然后才写。
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 0 · 硬规矩
|
|
35
|
+
|
|
36
|
+
- **材料目录只读。** 不改、不移、不改名用户给的任何课程材料。
|
|
37
|
+
- **结构可重建,内容原样搬运。** 重建的只是 frontmatter 字段集、正文固定小节、链接写法、MOC / 索引;**内容是用户的**(一句话 / 核心内容 / 易错点 / 讲义出处),一个字节不动。
|
|
38
|
+
- **改什么先给清单。** 动手前先把「哪篇要动、动什么」摆给用户过目。
|
|
39
|
+
- **幂等。** 第二次跑必须零改动 —— 合规的文件**不重写**。
|
|
40
|
+
- **问出来的信息要留痕**:`(用户于 <YYYY-MM-DD HH:MM> 确认)`,就地只留最新一条。
|
|
41
|
+
- **不含任何真实路径进 skill 包** —— 真实路径只写进用户的 `sys/config.json`。
|
|
42
|
+
- **不自动 `commit`、绝不 `push`。**
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 1 · Explore(先看,别假设)
|
|
47
|
+
|
|
48
|
+
- **材料**:先列用户给的目录里**实际有什么**,不套固定清单(各课结构不同,有的课压根没有往年卷)。
|
|
49
|
+
- **既有笔记库**:有没有已经成形的知识库?知识点在哪个目录?frontmatter 有哪些字段?正文有哪些小节?
|
|
50
|
+
- **是否已经初始化过**:`sys/` 在不在?**在就先停下问用户**「要重新初始化,还是只补缺的」。
|
|
51
|
+
- **git**:工作区是不是 git 仓库?(决定用 git 还是回退到 `sys/changes.jsonl` 记历史)
|
|
52
|
+
|
|
53
|
+
### 1.1 合规扫描(**agent 做,不能脚本化** —— 初见的库状态无法预料)
|
|
54
|
+
|
|
55
|
+
逐篇看三件事,产出清单:
|
|
56
|
+
|
|
57
|
+
| 看什么 | 合规 |
|
|
58
|
+
| --- | --- |
|
|
59
|
+
| frontmatter 字段集 | `类型` / `归属`(来源文件,多值)/ `aliases` / `标签`;**没有** `课程:` / `主题:` / `难度:` |
|
|
60
|
+
| 正文小节 | `一句话 / 核心内容 / 前置知识 / 后置知识 / 易错点 / 考点 / 讲义出处`;**没有 `## 平行关联`** |
|
|
61
|
+
| 链接写法 | 带路径、相对工作区根、带后缀、带别名 |
|
|
62
|
+
|
|
63
|
+
**合规的 → 一行不动**;不合规的 → 只改结构、内容原样搬。清单交给用户确认后再动(§6)。
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 2 · 分类与范围(**必问,不默认推荐**)
|
|
68
|
+
|
|
69
|
+
**分类是全库级定义**,层数和每层有几个类都不固定。
|
|
70
|
+
|
|
71
|
+
1. **先扫一遍材料**,给出一版候选建议(例如「你这里看起来是按『课程 → 讲次』分的」);
|
|
72
|
+
2. **问用户「按什么分类」** —— 用户可能不是按上课学的(比如「书 → 章」),**不要预设课程**;
|
|
73
|
+
3. **问用户「每一层具体怎么认」** —— 得到**解析规则**(例:课程 = 来源路径第一层文件夹名;讲次 = 文件名里的 `W1L3`);
|
|
74
|
+
4. 用户校正后,把**层级 + 每条解析规则 + 每层类值(+ ASCII slug)**写进 `sys/config.json`,并带确认标记;
|
|
75
|
+
5. **范围**:用户说「整理某部分」时,**从分类里选**(一个或多个类值)。不同范围**共用同一套分类**。
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 3 · 素材:两个类别
|
|
80
|
+
|
|
81
|
+
**必需的只有两个类别**,不是两个确定的文件:
|
|
82
|
+
|
|
83
|
+
| 类别 | 用来 | **默认成员** | 类里其他合格成员 |
|
|
84
|
+
| --- | --- | --- | --- |
|
|
85
|
+
| **建库参考** | 建知识库 | **讲义** | 教学大纲 / exam_topics / 课件 / 教科书章节 |
|
|
86
|
+
| **出题参考** | 出题与判分 | **往年试卷** | 往年卷答案 / Lab sheet / Worksheet / Assessment 结构 |
|
|
87
|
+
|
|
88
|
+
**判定分两级**:① **某一类整类为空** → 真缺,告诉用户缺什么、去哪找;② **类里有内容但没默认成员** → **不算缺**,问一句「用类里另一样顶吗」。
|
|
89
|
+
|
|
90
|
+
**换成员必须问**,定了记进 `sys/config.json`(带确认标记),之后不再问。同时问一句:**「有没有你不想让我读的?」**
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 4 · 语言标准
|
|
95
|
+
|
|
96
|
+
**按 6 个产物类别分别问**(用户可以用自然语言回答,如「全都中英双语对照」):① 知识点笔记(正文 / 标题 / `aliases` / MOC)② 出的题 ③ 批改与解析 ④ 记录性文件 ⑤ 产出(复习清单 / 考前 list)⑥ 机制层(字段名 / config)。
|
|
97
|
+
|
|
98
|
+
> ⚠️ **`sys/errors.jsonl` 里的错误原因默认用英文** —— 它要套 ASD-STE100 的规则,不跟别的类别走。
|
|
99
|
+
> 📌 **不要预设双语。**
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## 5 · 卷面格式
|
|
104
|
+
|
|
105
|
+
**每个课程的每场考试各一条**(期中 / 期末 / in-class / coursework 形状不同,必须分开),落进 `sys/paper-format.json`:时间 / 总分 / 题数 / 题型 / 分值分布,并**记住来源**(抄自哪份文件)。
|
|
106
|
+
|
|
107
|
+
**没有往年卷时**:先问用户;用户没更好的主意 → 用**默认出卷法 = 判断题 + 每题说明理由**,并在该条写明。
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## 6 · 重建(合规检查 → 清单 → 动手)
|
|
112
|
+
|
|
113
|
+
1. **先按 §1.1 逐篇判定**,把清单摆给用户(哪篇要动、动什么、为什么);
|
|
114
|
+
2. 用户点头后,**按分类分层一块一块做**(例:先 DL L1,做完跑校验,再下一块);
|
|
115
|
+
3. **安全网**:有 git → 提示用户先 commit;没有 git → 先把 `kb/` + `sys/` 复制一份到工作区外的备份目录再动手;
|
|
116
|
+
4. 重建内容:frontmatter 字段集 · 正文小节顺序 · 链接改写 · MOC / 索引;
|
|
117
|
+
5. **`## 平行关联` 里的链接不要丢** —— 转成 `sys/graph.json` 里的边(判据仍按契约第二节)。
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 7 · 落盘
|
|
122
|
+
|
|
123
|
+
写进**工作区根**,按契约第一节的布局。**顺序写死,不许反向**:
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
① kb/knowledge/(知识点) + sys/graph.json(关系图)
|
|
127
|
+
② kb/MOC/ 的机器区(由 aggregate.mjs 从「归属 + 图」聚合)
|
|
128
|
+
③ kb/MOC/ 的手写区(agent / 人写:主线、脉络、考点提示)
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
种子模板(`seeds/`)→ 填好草稿、给用户过目、再写:
|
|
132
|
+
|
|
133
|
+
| 种子 | 填什么 |
|
|
134
|
+
| --- | --- |
|
|
135
|
+
| `seeds/config.json` | 路径、分类(层级 / 解析规则 / 类值 / slug)、语言、git |
|
|
136
|
+
| `seeds/graph.json` | `用途` / `规则` / `coverage` / `edges` |
|
|
137
|
+
| `seeds/ledger.jsonl` | 先铺**本次范围内全部知识点**,`是否学习过 = 否`、`做对/总共出过 = 0`、`熟练程度 = null` |
|
|
138
|
+
| `seeds/errors.jsonl` | 只有头部说明行,**初始没有条目** |
|
|
139
|
+
| `seeds/error-taxonomy.json` | **保持为空** |
|
|
140
|
+
| `seeds/paper-format.json` | §5 收来的每条考试一格 |
|
|
141
|
+
| `seeds/state.jsonl` | 只有头部说明行 |
|
|
142
|
+
| `seeds/note.md` | 单篇知识点的骨架(frontmatter + 固定小节) |
|
|
143
|
+
| `seeds/moc.md` | 一份 MOC 的骨架(机器区标记 + 手写区) |
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## 8 · 校验
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
node <skill>/scripts/validate.mjs <工作区根> # 结构齐不齐
|
|
151
|
+
node <skill>/scripts/graph.mjs check <工作区根> # 六项图校验
|
|
152
|
+
node <skill>/scripts/scan.mjs <工作区根> # 五项扫库
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
**结构齐 + 图六项全过 = 初始化完成。** 缺哪个补哪个,别靠感觉。
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## 9 · Done
|
|
160
|
+
|
|
161
|
+
告诉用户:初始化完了,`mastery-loop` 之后会读这些文件;想改直接编 `sys/config.json`;**只有要换素材来源、改分类、或从头再来时才需要重跑本 skill**。
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"用途": "本文件是这套知识库的设定:路径、分类(层级与解析规则)、语言标准、git。凡「问用户才得到」的值后面跟确认标记。",
|
|
3
|
+
"schema_version": "0.2.0",
|
|
4
|
+
"路径": {
|
|
5
|
+
"工作区根": ".",
|
|
6
|
+
"材料": ["<相对工作区根的目录,例:Deep Learning/doc>"],
|
|
7
|
+
"知识库": "kb",
|
|
8
|
+
"机器区": "sys"
|
|
9
|
+
},
|
|
10
|
+
"分类": {
|
|
11
|
+
"层级": ["<第 1 层,例:课程>", "<第 2 层,例:讲次>"],
|
|
12
|
+
"字段": "分类",
|
|
13
|
+
"分隔符": "/",
|
|
14
|
+
"说明": "每篇知识点在生成时就带上 分类 字段(一条一个类路径,用分隔符拼层级);脚本只读它,不解析路径。怎么算是哪个类,由 agent 看这个库后和用户确认,不预设形状。",
|
|
15
|
+
"类值": {
|
|
16
|
+
"<第 1 层>": [
|
|
17
|
+
{ "值": "<类值,例:深度学习>", "slug": "<ASCII,例:dl>" }
|
|
18
|
+
],
|
|
19
|
+
"<第 2 层>": []
|
|
20
|
+
},
|
|
21
|
+
"确认": "(用户于 <YYYY-MM-DD HH:MM> 确认)"
|
|
22
|
+
},
|
|
23
|
+
"范围": [
|
|
24
|
+
{ "名称": "<范围名>", "值": ["<分类里的一个或多个类值>"], "确认": "(用户于 <YYYY-MM-DD HH:MM> 确认)" }
|
|
25
|
+
],
|
|
26
|
+
"语言": {
|
|
27
|
+
"知识点笔记": "<正文 / 标题 / aliases / MOC 用什么语言>",
|
|
28
|
+
"出的题": "",
|
|
29
|
+
"批改与解析": "",
|
|
30
|
+
"记录性文件": "",
|
|
31
|
+
"产出": "",
|
|
32
|
+
"机制层": ""
|
|
33
|
+
},
|
|
34
|
+
"git": {
|
|
35
|
+
"使用": true,
|
|
36
|
+
"说明": "有 git 就用 git 承担历史(skill 不自动 commit、绝不 push);没有且用户不装 → 启用 sys/changes.jsonl"
|
|
37
|
+
},
|
|
38
|
+
"排除": ["<用户说不想让我读的>"]
|
|
39
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"kind":"header","用途":"本文件是错误原因表:逐知识点登记用户实际犯过的错,供复习时逐字复用。初始没有条目。"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"用途": "本文件是知识点关系图:只存边(from 是 to 的前置),节点就是 kb/knowledge/ 里的笔记本身。",
|
|
3
|
+
"规则": "判据:删掉 from,to 的核心内容就解释不通。只收直接前置;同一篇的前置集合内两两不可比。顺序按知识深度,不是资料时间。",
|
|
4
|
+
"导出": "后置 = 本表的反向(脚本算);没有「平行」段。",
|
|
5
|
+
"version": 1,
|
|
6
|
+
"updatedAt": "<YYYY-MM-DD HH:MM>",
|
|
7
|
+
"coverage": {
|
|
8
|
+
"<第 1 层类值,例:深度学习>": { "done": [], "todo": ["<例:L1>", "<例:L2>"] }
|
|
9
|
+
},
|
|
10
|
+
"edges": [
|
|
11
|
+
{ "from": "<前置知识点名>", "to": "<后置知识点名>", "reason": "<≤30 字:to 依赖 from 的那一步>" }
|
|
12
|
+
]
|
|
13
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# <类值> <下一层类值>(MOC)
|
|
2
|
+
|
|
3
|
+
> 本文件是聚合产物:机器区由 `aggregate.mjs` 从「知识点的 `归属` + `sys/graph.json`」生成并覆盖;手写区脚本永不碰。
|
|
4
|
+
|
|
5
|
+
<!-- AUTO:BEGIN -->
|
|
6
|
+
- [[<相对工作区根的知识点路径>.md|<知识点>]] —— <一句话,抄自该篇的 `## 一句话`>
|
|
7
|
+
<!-- AUTO:END -->
|
|
8
|
+
|
|
9
|
+
## 主线(手写区)
|
|
10
|
+
|
|
11
|
+
<这一讲的主线 / 脉络,agent 或人写>
|
|
12
|
+
|
|
13
|
+
## 脉络图(手写区)
|
|
14
|
+
|
|
15
|
+
<可选>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
类型: 知识点
|
|
3
|
+
分类: ["<类路径 1>/<类路径 2>"]
|
|
4
|
+
归属: ["[[<相对工作区根的来源文件路径>|<人类可读别名>]]"]
|
|
5
|
+
aliases: ["<英文名>"]
|
|
6
|
+
标签: [<标签>, <标签>]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# <中文名> <英文名>
|
|
10
|
+
|
|
11
|
+
## 一句话
|
|
12
|
+
|
|
13
|
+
<一句话说清它是什么>
|
|
14
|
+
|
|
15
|
+
## 核心内容
|
|
16
|
+
|
|
17
|
+
<正文>
|
|
18
|
+
|
|
19
|
+
## 前置知识
|
|
20
|
+
|
|
21
|
+
- [[<相对工作区根的知识点路径>.md|<前置知识点>]] —— <≤30 字理由,与 sys/graph.json 的 reason 逐字一致>
|
|
22
|
+
|
|
23
|
+
## 后置知识
|
|
24
|
+
|
|
25
|
+
_(由图反算,不手写)_
|
|
26
|
+
|
|
27
|
+
## 易错点 / 考点
|
|
28
|
+
|
|
29
|
+
- <易错点>
|
|
30
|
+
|
|
31
|
+
## 讲义出处
|
|
32
|
+
|
|
33
|
+
<哪份材料、第几页 / 第几张 slide>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"用途": "本文件是卷面参数表:每个课程的每场考试各一条(期中 / 期末 / in-class / coursework 形状不同,必须分开),出题时从这里抄。",
|
|
3
|
+
"考试": [
|
|
4
|
+
{
|
|
5
|
+
"课程": "<课程名>",
|
|
6
|
+
"考试": "<例:期中 / 期末 / in-class>",
|
|
7
|
+
"时长": "<抄自材料>",
|
|
8
|
+
"总分": "<抄自材料>",
|
|
9
|
+
"题数": "<抄自材料>",
|
|
10
|
+
"题型与分值分布": "<抄自材料>",
|
|
11
|
+
"来源": "<抄自哪份文件>"
|
|
12
|
+
}
|
|
13
|
+
],
|
|
14
|
+
"备注": "没有往年卷时用默认出卷法(判断题 + 每题说明理由),并在该条写明。"
|
|
15
|
+
}
|