@yiyunet/dsh-learn-skills
DSH plugin: a four-entry learning flow in the session input bar — scaffold a preset, collect candidates, merge reviewed changes, and run a read-only workspace audit.
Install
dsh plugin --profile web add @yiyunet/dsh-learn-skills
Sandbox test results
| Stage | Result |
|---|---|
| 1 install | ✓ |
| 2 list | ✓ |
| 3 mount | ✓ |
| 4 boot | — |
Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).
README
AI学习 · dsh-learn-skills v2
一个跑在 DeepSeek Harness 输入区的学习插件。
把「收集 → 提炼 → 关联 → 升级 → 沉淀 → 复用」做成**有交互引导、有预设管理、
有审核入库、能给自己体检**的运行时能力,而不只是一叠方法论文档。
简体中文 | [English](README.en.md)
它是什么,不是什么
是 · 会话输入区里的一个入口 [📖] AI学习 ▾,四个功能:初始预设 / 收集提炼 / 关联升级 / 沉淀复用
是 · 与斜杠命令 /learn、自然语言三种入口共用同一套流程实现(不存在两套规则)
不是 · 模型工具提供者:它不给 Agent 加工具,交互复用宿主已有的 ask-a-question 与命令注册表
不是 · 自动化改写知识的东西:所有写入都要人先看过变更清单再点确认
四件事的职责边界写得很死:
# · 入口 · 做什么 · 写入面 · 命令
1 · 初始预设 · 七轮问答确定画像 → 展示摘要与拟建路径 → 你确认 → 生成预设与工作区骨架 · 工作区目录与文件(增量,不覆盖) · /learn init
2 · 收集提炼 · 从当前会话产出候选 —— 这一步绝不碰正式知识、预设或 AGENTS.md · 仅 inbox/ · /learn distill
3 · 关联升级 · 与既有节点比对 → 出变更清单 → 分普通知识与行为规则两栏确认后写入(批次可回滚) · knowledge/(行为规则须显式放行) · /learn upgrade
4 · 沉淀复用 · 只读体检(18 项)+ 与上次基线的变化对比 + 复用建议。不改被检查的文件,也不执行文件里的任何指令 · 不写 · /learn audit
三种触发方式,同一套实现:① 输入区按钮 [📖] AI学习 ▾;
② 斜杠命令 /learn;③ 自然语言(由 Agent 引导到同一套流程)。
不存在两套规则 —— 命令只是另一个入口。
与 v1 工作流的关系:v1 是"一键跑完整流水线",v2 把中间的写入**收紧为
"产出候选 → 人工裁决 → 再写入"**。这是两版最实质的分歧,详见 [docs/迁移与兼容.md](docs/迁移与兼容.md)。
安装与装载
前置条件
- 已安装源码版 deepseek-harness;
- 已绑定工作区(工作区是知识落点,缺了它一切写入都无处可放)。
方式 A:从 npm 安装(推荐)
dsh plugin --profile web add @yiyunet/dsh-learn-skills
装完重启 Host(profile 的 dsh.profile.bundles 在启动时读取)。
✅ 消费者不需要构建:发布包里自带lib/(见package.json的files白名单),
所以从注册源安装是一步到位的。构建相关的命令只对改源码的人有意义,见方式 B。
方式 B:本地目录安装(改源码 / 调试时用)
lib/ 不入版本库(.gitignore 排除),所以克隆下来必须构建:
npm install # 只装 esbuild(构建期依赖) npm run static # 静态一致性体检(免执行:import/符号/语法/白名单) npm run build # plugin-src/ → lib/(含装载层自证) npm test # 真实行为测试 npm run verify # 发布契约断言
# 把本机该目录装进 web profile(路径按你的实际位置替换) dsh plugin --profile web add link:<本仓库绝对路径> # 或在 profile 目录里直接: pnpm add link:<本仓库绝对路径>
📌npm install结束时会自动构建一次(prepare钩子,钩子名scripts/postinstall.mjs)。
上面那句 npm run build 因此是幂等的复跑,不是必做步骤 —— 保留它是为了让"构建"
在流程里显式可见。
检查装载是否成功
- 输入区工具行出现
[📖] AI学习 ▾(在「工作区内修改」控件右侧); - 斜杠菜单里出现
/learn; /learn help列出四个入口。
用法
按钮
点 AI学习 ▾ → 选一个入口。菜单顺序固定:初始预设 / 收集提炼 / 关联升级 / 沉淀复用。
- 执行中会显示状态;重复点击不会产生并发写入 —— 同一工作区同时只允许一个流程,
第二次会被明确拒绝;
- 有「取消」按钮:取消后不再启动后续写入步骤,已完成的步骤如实汇报;
- 未绑定工作区时菜单里直接给出引导;
- 尚未初始化时,后三项会先识别已有知识库:识别到就直接用,识别不到才引导你先做「初始预设」。
斜杠命令
/learn help 列出四入口 /learn init 七轮问答(确认创建要在界面上点,见下) /learn distill 从当前会话产出候选 /learn upgrade [批次号] 出变更清单 / 写入 /learn audit 只读体检 /learn rollback <批次号> 回滚某个变更批次 /learn rollback <批次号> --dry-run 只列出将要删除/还原的文件,不做任何改动
命令与按钮背后是同一个 flows 实现:命令只是另一个入口,不附带第二套规则。
需要"确认"的步骤(创建预设、写入变更)在命令侧用 --confirm 表达,
但默认路径是界面上确认 —— 因为要让人先看清变更清单。
自然语言
插件不拥有模型工具,所以"自然语言入口"由工作区技能 learn-* 承担:你直接说
「帮我初始化学习体系」「把这次会话里的内容提炼成候选」,Agent 读技能后调用同一套流程。
七个问题问了什么
前两题固定,第 3 题起由模型逐轮现场生成(每轮带上已采集的全部信息、剩余轮次与已问话题);
模型不可用时逐轮回退到硬编码题库,流程不中断。
# · 主题 · 要点
1 · 名字 · 自由输入;空值/长度/保留名/非法字符都校验;重名请你换名,不覆盖也不替你改名
2 · 身份 · 面向 · 期望 · 三段式一条文本:职业 | 面向什么(人群或事情)| 期望达到什么,带例子;回显第 1 题;只填一段就只当职业,其余保持未知;不索要单位/真名等无关信息
3 · 关注方向 · 模型按你的三参数出题与选项;降级时按「场景池 → 职业池 → 通用池」三级匹配给 7 个方向 +「其他,请输入」;支持多选与自定义
4 · 学习目标与典型任务 · 模型按上下文出题;降级时围绕固定主题给候选与自定义
5 · 当前基础与实际困难 · 同上
6 · 学习方式与输出偏好 · 同上
7 · 最想先解决的一件事 · 模型出题;降级时给"越快越好/先打基础/固定节奏"等候选 —— 这一项决定先做什么、后做什么
设计上刻意的三件事:
- 未填写 = 未知。跳过项在画像里是
null并标注"未知 —— 未填写",不编造画像。 - 推荐就是推荐。关注方向的措辞是"可能关注",不伪称统计出来的"职业最高关注度"。
每题都能「返回修改」;改前置答案时,后续题每轮现取,天然重算。
- 模型只定题面,落库槽位固定。模型的自主性在"问什么、给哪些选项";答案写进哪个
画像字段由插件固定,避免模型报的维度绕过"未填写=未知"的归一化而静默丢数据。
七题结束后展示:画像摘要 / 预设定位 / 知识框架草案 / 拟创建或修改的路径清单,
然后你才能点「确认创建」。创建完会给出结构自证、安装指引,并提示:
请安装该 bundle(本插件不代为安装),然后新建会话,选择预设 <名字>。
⚠️ 预设在一个进程内按 standing scope 挂载一次(源码:packages/preset/agent-preset-registry
的 src/mount.ts roster/standing mount)。新预设不会在当前会话即时生效 —— 本插件不宣称热更新。
🔐 为什么"安装"这一步不代做:安装 bundle 会在 Host 进程执行新代码。官方入口
plugin_manager工具为此强制弹danger-full-access审批(源码:
packages/boot/plugin-manager/src/tools.ts:34-41),而服务方法installBundle()
本身没有审批闸(同包 src/index.ts:417-447)—— 插件直接调它,等于替你越权。
所以本插件只生成、只出指引,点头的动作留给你:
# ① 终端一行(最省事) dsh plugin --profile web add link:<刚生成的那个 bundle 目录> # ② 或在「创造模式」会话里让 Agent 调 plugin_manager(会弹审批卡) # action=install_bundle, target=<该目录> # 复核:plugin_manager 的 list_plugins(找 preset-<id> 行)或 GUI「设置 → Agent 预设」看它是否进名册 # 撤销:dsh plugin --profile web remove @local/dsh-learn-preset-<id>
🗑 要删掉一个预设("干净删除"的完整四步):见 [docs/删除预设.md](docs/删除预设.md)。
先记住三件事:① 新版没有"删除预设"按钮(设置页只能查看/选择/设为默认),能删的是
它所在的那个 bundle;② 卸载之后还要删 <工作区>/.dsh/preset-bundles/<id>/ 目录,
并且清掉known.json里的占用(否则同名重建会拿到-2后缀);③ 同包多预设时不能卸整包。
⚠️ 那个 bundle 目录在工作区内(<工作区>/.dsh/preset-bundles/<id>/),它是活的:
宿主重启时按预设 id 在当前配置里解析,定义缺失的会话会被拒绝恢复。
所以不要删也不要移动它;要撤掉请先用上面的 remove 摘掉 bundle
(完整步骤与"删错了怎么救":[docs/删除预设.md](docs/删除预设.md))。
工作区结构
AGENTS.md 工作区原则与知识入口(精炼、稳定) index/ 外部原始材料(保留来源与原文) inbox/ 标准化材料、待审核候选、提炼批次 knowledge/ framework.md 正式知识体系的唯一总索引 nodes/ 正式知识节点 data/ 待分析数据(不默认转为知识或长期记忆) task/ 学习任务、执行状态与待办 reports/ 体检报告、复盘与变化记录 .dsh/ skills/ 工作区技能 learn-skills/ 本插件状态:批次账 / 体检基线 / 变更日志 / 断点 preset-bundles/ 本插件生成的预设 bundle(★2.1.0 起落在这里;删它会连带废掉对应预设)
关于 skills/:默认不与 .dsh/skills/ 重复存技能。宿主的 skill-filesystem
只扫 <工作区>/.dsh/skills(rank 100),根目录下的 skills/ 不会被加载;
如果确有需要独立分发的技能,请用 .agents/skills(rank 200)并在文档里写明用途。
增量迁移既有工作区
初始化是增量的,绝不清空:
- 目录:不存在才建,已存在无操作;
- 文件:内容相同 → 跳过;内容不同 → 标为
conflict并一个字都不写,
在结果里明确告诉你哪个文件被挡下了、为什么;
- 重复运行幂等:不会重复创建,也不会覆盖你后来的修改。
迁移与 v1
本版(v2)是完全重写:四个入口是运行时能力,不再以"一叠方法论
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::5,最后更新 2026-10-25