acmer-coach 1.0.0 → 1.2.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.
@@ -0,0 +1,29 @@
1
+ # 发布走 npm 官方正道 Trusted Publishing(OIDC 信任发布):
2
+ # 不需要 token、不需要 2FA 码 —— GitHub Actions 用工作流身份直接换取发布权限。
3
+ #
4
+ # 前置(一次性):npm 网站 → acmer-coach 包页面 → Settings → Trusted Publisher
5
+ # 绑上这个仓库(Miantiao1231/acmer-coach)+ 本文件名(publish.yml)。
6
+ #
7
+ # 之后发布两条路:
8
+ # · 打 tag 推上来(v*)→ 自动发
9
+ # · 或 Actions 页手动触一次(首次发布用这个)
10
+ name: publish
11
+
12
+ on:
13
+ push:
14
+ tags: ['v*']
15
+ workflow_dispatch:
16
+
17
+ permissions:
18
+ contents: read
19
+ id-token: write # OIDC 必须,别删
20
+
21
+ jobs:
22
+ publish:
23
+ runs-on: ubuntu-latest
24
+ steps:
25
+ - uses: actions/checkout@v4
26
+ - uses: actions/setup-node@v4
27
+ with:
28
+ node-version: '24'
29
+ - run: npm publish --provenance --access public
package/README.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # acmer-coach · 小鲸教练
2
2
 
3
+ [![npm](https://img.shields.io/npm/v/acmer-coach)](https://www.npmjs.com/package/acmer-coach)
4
+ [![license](https://img.shields.io/badge/license-MIT-blue)](LICENSE)
5
+ [![node](https://img.shields.io/badge/node-%E2%89%A524-brightgreen)](https://nodejs.org)
6
+ [![dsh](https://img.shields.io/badge/dsh-%E2%89%A50.1.1--rc.1-blueviolet)](https://github.com/deepseek-ai/deepseek-harness)
7
+
3
8
  一个给 ACMer 用的算法训练教练插件,跑在 [dsh](https://github.com/deepseek-ai/deepseek-harness) 上。
4
9
 
5
10
  **它解决的问题**:不是「不知道学什么」——那是搜一下就有答案的。
@@ -15,7 +20,7 @@
15
20
 
16
21
  ## 它到底做了什么
17
22
 
18
- 20 个工具,两条轴:
23
+ 21 个工具,两条轴:
19
24
 
20
25
  | 轴 | 含义 |
21
26
  |---|---|
@@ -25,6 +30,8 @@
25
30
  核心闭环:
26
31
 
27
32
  ```
33
+ coach_curriculum assess 查真实记录 → 目标与前置排序 → 建有依据的阶段
34
+ ↓ 缺依据先诊断;保存本周主线;产生新证据并验收后推进
28
35
  coach_setup 首次:体检 → 建目录建库 → 灌题池 → 从 CF 同步数据
29
36
  coach_import 洛谷/牛客的记录从这里进(CF 不用,有公开接口)
30
37
  ↓
@@ -42,6 +49,37 @@ coach_schedule → coach_plan 排课
42
49
 
43
50
  `coach_wiki` 是知识来源:讲任何知识点之前先查本地 OI Wiki,**别凭记忆讲**。
44
51
 
52
+ ### 长期学习路线
53
+
54
+ `coach_curriculum assess` 从已有检测、代码判因、做题记录和日程实际完成中列出
55
+ 可引用的证据;不会把 rating、学习状态或取消的卷子当成短板。每条记录带内容引用
56
+ `id` 和事件身份 `eventId`。训练阶段的每个节点必须有真实记录:`finding=gap`
57
+ 引用失败/超时/依赖提示等短板,`finding=extension` 引用已独立做出或过卷的能力起点。
58
+
59
+ 缺记录时先建 `diagnostic` 阶段,写明要确认的问题与取证方法,不能直接宣布弱项。
60
+ 远期设想用 `provisional` 保留,补足依据前不能执行。每个阶段除能力成果和验收条件外,
61
+ 还要写 `basis`、`goalContribution`、`priorityReason`、`estimatedHours`、`evidenceRefs`、
62
+ `finding`、`kind`、`uncertainty`、`diagnosticMethod`。前置必须来自显式的
63
+ learned/verified 记录,或路线中在此前安排的必验训练,不能从游标位置推定已经学会。
64
+
65
+ `CURRICULUM.yaml` 保存路线与修订历史:`read` 查看,`create` 建立,`revise` 调整,
66
+ `advance` 推进。进入阶段时保存证据事件快照;诊断阶段每个节点需有新的真实观察,
67
+ 训练阶段所有节点必须 verified,且各有新的独立做出或过卷记录。改旧备注、成绩或
68
+ 把同次做题从课表迁入进度,不算新训练。当前诊断也不能通过改种类或删节点逃过验收。
69
+ 写操作带 `expectedRevision` 和理由,避免旧上下文覆盖新计划。
70
+ 路线按剩余 `estimatedHours`、每周预算和目标日期提示容量不足或估算缺失;这只是
71
+ 调整范围的提示,不会把周平均当成精确日程,也不阻止执行。
72
+
73
+ 每轮注入长期目标、当前阶段和未完成单元。`coach_assign` 带课程版本,普通训练
74
+ 限于当前主线;补漏/复习需声明目的和返回依据。完成记录仍归原进度文件,
75
+ 不会因一题 AC 或日历到期自动跳阶段。没有建立课程的用户保持原有工具行为。
76
+
77
+ 本周主线可设置 `focusUntil`,到期先复盘修订。路线不提前占用数月日程,
78
+ `coach_plan` 继续管理近期时间块。旧 v1 路线可读,会标记 `needsReview`;需明确
79
+ 修订当前及后续阶段后迁移 v2,插件不会自动重写。优先级与教学方案仍由模型判断,
80
+ 程序只检查证据、前置和验收边界。本功能没有新增 VP 自动读取或后台周报。
81
+ 详见 [长期课程机制](docs/长期课程机制.md)。
82
+
45
83
  **「学过」和「已验证」是两级,绝不合并。** 自评 ≠ 掌握 ——
46
84
  合成一个「会/不会」就等于退回「从数据推断掌握度」,而数据能说「花了很久」,
47
85
  说不出「卡在哪」。所以 `verified` 手标不了,它只能由检测产生。
@@ -52,12 +90,15 @@ coach_schedule → coach_plan 排课
52
90
  # 1. 装 dsh(需要 Node ≥ 24)
53
91
  npm i -g @deepseek-ai/dsh
54
92
 
55
- # 2. 装插件
56
- dsh plugin --profile web add acmer-coach
93
+ # 2. 装插件(二选一)
94
+ dsh plugin --profile web add acmer-coach # 从 npm(推荐)
95
+ dsh plugin --profile web add github:Miantiao1231/acmer-coach # 或从 GitHub
57
96
 
58
97
  # 3. 重启 dsh,然后跟小鲸说「初始化」
59
98
  ```
60
99
 
100
+ > npm 上搜 `acmer-coach`,或者直接开 <https://www.npmjs.com/package/acmer-coach>。
101
+
61
102
  **初始化流程**(说话就行,不用敲命令):
62
103
 
63
104
  1. `coach_setup { action: "status" }` —— 体检,看缺什么
@@ -119,12 +160,37 @@ dsh plugin --profile web add acmer-coach
119
160
  **用不用你自己判断。** 不想担风险的话:只关注 CF(零风险),
120
161
  或者手动记几道题。详见 `assets/extension/luogu/README.md`。
121
162
 
163
+ ## 可选扩展:接上你的 Obsidian 笔记
164
+
165
+ 如果你用 Obsidian 记竞赛笔记,`assets/extension/notes/` 是一个**可选**的 dsh 插件,
166
+ 把笔记库和教练地图接起来:给一个知识点名,一次拿到「你为它写的笔记正文 +
167
+ 图上的前置 / 后继 + 你的学习进度」。
168
+
169
+ 最直接的收益在讲知识点那一步 —— 教练讲完会附一份板子,**接上笔记后,
170
+ 这份板子能对着你自己的写法来**(宏、命名、大括号、注释密度,照你的笔记全套对齐)。
171
+
172
+ 纯附加,不装不影响任何功能。装法、配置(一个必需的环境变量:你的库路径)、
173
+ 「映射怎么建」的说明都在 [`assets/extension/notes/README.md`](assets/extension/notes/README.md)。
174
+
175
+ ## 给教练接持久记忆(可选)
176
+
177
+ dsh 的会话上下文有限 —— 新开一个会话,教练不记得上次聊到哪。想让它跨会话记住你,
178
+ 可以接一个记忆服务:[**Hindsight**](https://github.com/vectorize-io/hindsight)
179
+ 是一个开源的 agent 记忆系统(MIT 许可,有云版,也可以自己 Docker 部署),
180
+ 挂上去之后每轮自动召回相关记忆、对话结束自动归档。
181
+
182
+ **本项目不带这个插件** —— 自己装 Hindsight,再写一个 dsh 插件做桥
183
+ (进对话时 recall 注入、结束时 retain 归档)即可。
184
+
122
185
  ## 文件
123
186
 
124
187
  | 文件 | 作用 |
125
188
  |---|---|
126
- | `index.js` | 插件本体(host 端,20 个工具 + 规则注入) |
189
+ | `index.js` | 插件本体(host 端,21 个工具 + 规则注入) |
127
190
  | `lib/setup.js` | 环境搭建 + CF 公开数据同步 |
191
+ | `lib/curriculum.js` | 持久课程路线、阶段验收门槛、版本与修订历史 |
192
+ | `lib/curriculum-evidence.js` | 从实际记录派生证据引用与事件身份,去重课表和训练记录 |
193
+ | `lib/curriculum-planning.js` | 阶段编排依据、前置顺序与进入阶段后的新证据检查 |
128
194
  | `lib/client.js` | 浏览器端:会话头部「技能树」按钮 + 弹层 |
129
195
  | `package.json` | 声明 `dsh.bundle.patch` + `dsh.client` |
130
196
  | `cordis.patch.yml` | bundle 层的 insert 行 |
@@ -137,7 +203,7 @@ dsh plugin --profile web add acmer-coach
137
203
  | `assets/knowledge/` | 地图与元数据 |
138
204
  | `assets/oiwiki/` | OI Wiki 本地检索库 |
139
205
  | `assets/pool/` | 随包发的题池(41,518 道,三平台)—— 见该目录下的 LICENSE(有风险说明) |
140
- | `assets/extension/` | 可选的浏览器扩展(洛谷记录导出) |
206
+ | `assets/extension/` | **可选**扩展:洛谷记录导出(浏览器扩展)+ Obsidian 笔记桥(dsh 插件) |
141
207
  | `coach/` | 地图工具链(Python)+ 指标脚本 |
142
208
 
143
209
  ### 三层
@@ -146,7 +212,7 @@ dsh plugin --profile web add acmer-coach
146
212
  |---|---|---|
147
213
  | **规则** | `assets/rules/coach-rules.md` | 插件用 `systemPrompt.section()` 注进 system prompt(和人设同一条路)。**改它要重启 dsh** |
148
214
  | **知识** | 地图 4 份 + OI Wiki 检索库 | `coach_setup init` 铺到数据目录;OI Wiki 直接从包里读 |
149
- | **工具** | 19 个 | 装完就在 |
215
+ | **工具** | 21 个 | 装完就在 |
150
216
 
151
217
  规则进的是 **system prompt,不是消息流**:行为约束每轮都得在场,
152
218
  而消息流会被长对话把尾巴挤掉。文本是**静态**的(只在加载时读一次)——
@@ -161,13 +227,13 @@ dsh plugin --profile web add acmer-coach
161
227
  | `NODE_ENTRY.yaml` | 每个节点的入门段位(题池 p25),机器算 |
162
228
  | `NODE_META.yaml` | `tier` 标注(core / normal / rare / skip),人维护 |
163
229
 
164
- `PROGRESS.yaml` 和 `SCHEDULE.yaml` **不随包发** —— 它们是你的进度和日程,
230
+ `PROGRESS.yaml`、`SCHEDULE.yaml` 和 `CURRICULUM.yaml` **不随包发** —— 它们是你的进度、日程和课程,
165
231
  首次写入时由插件自己生成(带正确的文件头)。发模板等于给文件头造第二份真相。
166
232
 
167
233
  ## 开发回路
168
234
 
169
235
  ```bash
170
- bash dev.sh # 同步副本 + 验收 + 形状扫描 + 比账本指纹
236
+ bash dev.sh # 同步副本 + 验收 + 形状扫描 + 课程/证据测试 + 比账本指纹
171
237
  ```
172
238
 
173
239
  单独跑:
@@ -177,6 +243,8 @@ node verify.mjs && node verify-shape.mjs # 主验收
177
243
  node dev/w1-check.mjs # 解绑 + 闸门 + 规则注入
178
244
  node dev/wiki-check.mjs # OI Wiki 检索
179
245
  node dev/setup-check.mjs # 冷启动(离线)
246
+ node --test dev/curriculum-check.mjs # 长期课程(隔离数据)
247
+ node --test dev/curriculum-evidence-check.mjs # 证据目录、事件身份与重复记录
180
248
  COACH_TEST_NET=1 node dev/setup-check.mjs <handle> # 冷启动(真打 CF)
181
249
  bash dev/trace-scan.sh # 开源前反证:没留私人痕迹
182
250
  ```
@@ -47,7 +47,7 @@
47
47
  3. 浏览器下载一个 `luogu-<uid>-<日期>.json`
48
48
  4. 把文件交给教练,说:
49
49
 
50
- > 导入这个文件:`C:\Users\你\Downloads\luogu-1855438-2026-09-29.json`
50
+ > 导入这个文件:`%USERPROFILE%\Downloads\luogu-123456-2026-01-01.json`
51
51
 
52
52
  或者直接让教练调 `coach_import`,参数 `path` 填那个路径。
53
53
 
@@ -0,0 +1,82 @@
1
+ # whale-notes
2
+
3
+ 把你的 **Obsidian 笔记库** × **教练地图** 接起来。dsh 插件,配合 [acmer-coach](../..) 使用。
4
+
5
+ ## 它解决什么
6
+
7
+ 讲一道题要的上下文散在三个地方:
8
+
9
+ | 在哪 | 是什么 |
10
+ |---|---|
11
+ | `MAP.yaml` | 这个知识点的前置、后继(依赖图) |
12
+ | `PROGRESS.yaml` | 你学到哪了 |
13
+ | 你的笔记 `.md` | 你自己怎么写的、代码长什么样 |
14
+
15
+ 没这个插件,AI 每次要三次读取 + 一次自己的目录遍历,而且**每次拼法可能不一样**。
16
+ 装了它,一次调用全拿到。
17
+
18
+ 顺带一层:教练讲新知识点时会附一份「你的风格」的板子 —— 板子的样例来源就是这里。
19
+
20
+ ## 装
21
+
22
+ 前置:acmer-coach 已经初始化过(数据目录里有 `MAP.yaml`)。
23
+
24
+ ```bash
25
+ # 1. 拿到本仓库(已有就跳过)
26
+ git clone https://github.com/Miantiao1231/acmer-coach
27
+
28
+ # 2. 装笔记插件(spec 用 file: 协议,指向这个目录)
29
+ dsh plugin --profile web add "file:<仓库路径>/assets/extension/notes"
30
+ # Windows 示例:file:C:/Users/you/acmer-coach/assets/extension/notes
31
+
32
+ # 3. 配置你的 Obsidian 库路径(必需,见下)
33
+
34
+ # 4. 重启 dsh
35
+ ```
36
+
37
+ ## 配置
38
+
39
+ | 环境变量 | 必需? | 说明 |
40
+ |---|---|---|
41
+ | `OBSIDIAN_VAULT` | **必需** | 你的 Obsidian 库根目录。**没设时工具会明确报错,不会猜一个路径** |
42
+ | `COACH_DATA_DIR` | 可选 | 教练数据目录。默认 `~/.dsh/knowledge`,跟 acmer-coach 一致 |
43
+
44
+ 设置方式(设完要重启 dsh):
45
+
46
+ ```bash
47
+ # Windows
48
+ setx OBSIDIAN_VAULT "D:\your-vault" # 设完重开终端
49
+ # macOS / Linux(写进 ~/.zshrc 或 ~/.bashrc)
50
+ export OBSIDIAN_VAULT=~/Notes
51
+ ```
52
+
53
+ ## 三个工具
54
+
55
+ | 工具 | 干什么 |
56
+ |---|---|
57
+ | `note_context` | 给知识点名(「区间 DP」)或笔记名/路径 → **笔记正文 + 图上前置和后继 + 你的进度**,一次给全 |
58
+ | `note_map_status` | 映射登记到什么程度了:哪些笔记挂上了、哪些没挂、图上哪些节点还没有笔记 |
59
+ | `note_map_set` | 把「这篇笔记讲的是图上哪些节点」落盘。节点名逐个校验,写错会被拒并给出相近候选 |
60
+
61
+ ## 映射要建,但不用一次建完
62
+
63
+ 不登记也能用 —— 笔记名和节点名对得上时(「区间 DP」 ↔ `5.区间dp.md`),
64
+ 插件自己靠归一化兜底命中。**遇到对不上的再挂**:笔记叫 `Dijkstra 单源最短路`、
65
+ 图上只有「最短路」这种,让 AI 用 `note_map_set` 挂一次,之后一直准。
66
+
67
+ 不知道自己差哪些?`note_map_status` 会报
68
+ (「登记」和「挂上图节点」分开计数 —— 登记了但节点空着的那批也会如实点出来)。
69
+
70
+ ## 只读承诺
71
+
72
+ 这个插件**只读你的笔记,从不写**。唯一会写的文件是数据目录下的
73
+ `NOTE_MAP.yaml`(插件自己的映射账本)。你的原文一个字都不动。
74
+
75
+ ## 验收
76
+
77
+ ```bash
78
+ node verify.mjs
79
+ ```
80
+
81
+ 自造 fixture 跑全链路(不碰你的真数据);如果你配了真实环境,
82
+ 会额外做一次「真账本 + 真笔记前后指纹比对」,证明跑完什么都没动。
@@ -0,0 +1,10 @@
1
+ # whale-notes bundle patch:把笔记库 × 教练地图的桥插件插入 profile 插件清单。
2
+ #
3
+ # 必须用 file: 而非 link: —— link: 的 realpath 在 ~/.dsh/profiles/ 外,
4
+ # 解析不到 profiles/node_modules/@deepseek-ai 下的共享链接。
5
+ #
6
+ # ⚠️ id 必须和 index.js 导出的 `name` 逐字相同,name 必须和**包名**相同 ——
7
+ # 对不上不会报错,工具会**静默不注册**。
8
+ - insert:
9
+ - id: whale-notes
10
+ name: 'whale-notes'