共读讲义插件:把 Markdown / 文本 / PDF 讲义接进 DeepSeek Harness…
31.5/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/8 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add James-Yao-xj/dsh-plugin-handout该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
dsh 原生插件 · tool
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 24 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(unknown · 2026/10/30) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意未发布到 npm registry,仅可从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包dsh-plugin-handout(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/14 10:15:49
安全扫描自动 · 静态分析源码v2.7.0🟢 扫描:未发现敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。
扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-tools@deepseek-ai/schemastery@deepseek-ai/cordis给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 接入Markdown讲义
- 接入文本与PDF讲义
- 按节按页取文
展开完整介绍(72 字)↓
共读讲义插件:把 Markdown / 文本 / PDF 讲义接进 DeepSeek Harness 会话,按节按页取文、同步阅读位置、随时提问
README
由 DeepSeek 最新模型翻译生成description: "共读讲义:Markdown / 文本 / PDF 讲义接进会话,按节按页取文、随时提问,并按讲师提示词讲解" kind: "package-bundle"
dsh-plugin-handout
把一份讲义接进 DSH 会话,让模型和你一起读:按节 / 按页取原文、全文检索、同步阅读位置、记批注,并按你写的讲师提示词讲解。
核心不是「渲染文档」——右侧栏的内置预览已经能显示 Markdown 和 PDF。这个插件补的是另外三件事:
1. 模型看不见你在读哪里。 你滚到 3.2 节时,模型的上下文里没有任何一行提到这件事。
2. 一份讲义塞不进上下文。 讲义动辄几万字,整份读进来既贵又会被压缩掉细节。
3. 「讲什么」有了,「怎么讲」还没有。 讲义决定内容,但讲解方式(先直觉还是先定义、一次讲多少、不确定时怎么说)默认由模型的通用风格决定。所以这里留了一份可维护的讲师提示词。
所以它的设计重心是 「共享阅读位置」+「按需取文」+「可调的教学法」:状态里只存大纲(每节一行),正文永远按需读取,讲解风格由一份 Markdown 决定。设计取舍与实现细节见 docs/DESIGN.zh.md。
展开完整文档(README 剩余 1 节)
description: "共读讲义:Markdown / 文本 / PDF 讲义接进会话,按节按页取文、随时提问,并按讲师提示词讲解" kind: "package-bundle"
dsh-plugin-handout
把一份讲义接进 DSH 会话,让模型和你一起读:按节 / 按页取原文、全文检索、同步阅读位置、记批注,并按你写的讲师提示词讲解。
核心不是「渲染文档」——右侧栏的内置预览已经能显示 Markdown 和 PDF。这个插件补的是另外三件事:
1. 模型看不见你在读哪里。 你滚到 3.2 节时,模型的上下文里没有任何一行提到这件事。
2. 一份讲义塞不进上下文。 讲义动辄几万字,整份读进来既贵又会被压缩掉细节。
3. 「讲什么」有了,「怎么讲」还没有。 讲义决定内容,但讲解方式(先直觉还是先定义、一次讲多少、不确定时怎么说)默认由模型的通用风格决定。所以这里留了一份可维护的讲师提示词。
所以它的设计重心是 「共享阅读位置」+「按需取文」+「可调的教学法」:状态里只存大纲(每节一行),正文永远按需读取,讲解风格由一份 Markdown 决定。设计取舍与实现细节见 docs/DESIGN.zh.md。
Summary
注册五个模型工具、一条会话投影、一段动态系统提示、一段静态系统提示(讲师提示词)和一条斜杠命令:
| 工具 | 作用 |
| handout_open | 打开讲义,返回目录大纲,并把它设为本次共读的讲义 |
| handout_read | 读一节(Markdown,含子节)或一页(PDF),也支持任意行区间 |
| handout_search | 全文检索,返回命中位置与上下文 |
| handout_goto | 记录用户当前读到哪一节 / 哪一页 |
| handout_note | 把疑问或批注挂在某一节 / 哪一页上 |
支持三种来源:
- Markdown —— 按标题分节;编号优先采用讲义自己的数字(3.2、「第三讲」→3),取不到才回退层级编号;
- 纯文本 —— 没有标题时按 60 行一块兜底;
- PDF —— 按页寻址(P12,也接受 12 / p12),逐页抽取文字层,并读出自带的书签目录作辅助;页眉、页码、纯符号行会被自动跳过,小标题取每页第一行真内容。
讲义正文不进会话日志;PDF 抽取结果按文件指纹(dev:ino:size:mtimeNs:ctimeNs)缓存,文件一改立刻失效。没有文字层的扫描件会明确报错并提示 OCR,而不是悄悄打开一份空讲义。
Use this package
安装
需要 DeepSeek Harness(本插件在 0.2.0-rc.2 上开发验证)。三种装法:
① 从本地源码目录(开发期推荐:pnpm 会建软链,改代码立刻生效)
cd ~/.dsh/profiles/desktop
pnpm add /绝对路径/dsh-plugin-handout
② 从 git 仓库
cd ~/.dsh/profiles/desktop
pnpm add github:James-Yao-xj/dsh-plugin-handout
③ 界面:Web 侧栏 → Plugins → 用绝对路径或 git 地址安装 → 启用
装完后把包名加进 ~/.dsh/profiles/desktop/package.json 的 dsh.profile.bundles(走界面安装时插件管理器会自动做这一步),然后重启或刷新。
源码改动默认不会热重载:base 层给 hmr 的默认配置是 root: [],只监听配置。要打开源码热重载,在 profile 的 cordis.patch.yml 里覆盖这一行(详见 docs/DESIGN.zh.md §5):
- id: hmr
config:
base: /绝对路径 # 插件源码的父目录
root: ["dsh-plugin-handout"]
使用方法
整条流程只有两步是「必须做对」的:让模型打开讲义,然后告诉它你在哪。其余都是自然语言。
1. 准备讲义
把讲义放进工作区最省事(路径就是 handouts/xxx.pdf),也可以是任意可读位置。路径按会话的工作目录解析相对路径,不确定就写绝对路径。
| 格式 | 怎么寻址 | 编号举例 |
| Markdown(含子节) | 按标题分节,编号优先用讲义自己的数字 | 3.2、「第三讲」→ 3 |
| 纯文本 | 没有标题时按 60 行一块兜底 | 层级编号 |
| PDF | 按页,一页就是一个坐标 | P12,也可以直接写 12 |
PDF 需要有文字层。扫描件(图片型 PDF)会明确报错并要求先 OCR——不会悄悄打开一份空讲义。
2. 让模型打开它
打开 handouts/gradient-descent.pdf
模型调用 handout_open,拿到一份大纲(PDF 还会带上自带的书签目录),并把这份讲义设为本次共读的对象。没有这一步,handout_read 和 handout_search 都会直接报「还没有打开的讲义」。 一次会话里只有一份当前讲义;换讲义就是再打开一份,位置和批注会跟着一起清空。
3. 开始读
之后想说就说:
| 你说 | 插件做什么 |
| 「读一下 3.2 节」/「翻到第 2 页」 | handout_read 取那一节 / 那一页的原文 |
| 「我在看第 2 页」 | handout_goto 记住位置,之后每轮请求都自动带上它 |
| 「讲义里哪提到 oscillate」 | handout_search 定位,返回命中页与上下文 |
| 「记一下:这里没懂」 | handout_note 记批注,后续每轮提示都带着 |
一次完整的共读大概长这样(用的是仓库里的样例讲义,真机跑过):
你: 打开 handouts/gradient-descent.pdf 模型:(handout_open)4 页,按页寻址,section_id 形如 "P12"…… ← 大纲 + 每页首行小标题你: 第 2 页讲了什么?
模型:(handout_read P2)……(引用第 2 页原文)你: 我在看第 3 页模型:(handout_goto 3)好,之后我就当你在第 3 页你: 记一下:这里没懂收敛率怎么来的模型:(handout_note)已记在 §P3 你: 讲义里哪提到 oscillate?
模型:(handout_search)命中 1 处,在第 2 页,上下文是……
4. 位置靠你说,批注靠你记
右侧栏的「共读」面板还没做,插件看不见你滚到哪里——「我在看第 3 页」这句话就是全部的同步机制。说过一次之后,模型的每轮上下文都带着它,不用反复提醒。
位置和批注随会话走,跨会话不共享:重开一个会话要重新打开讲义、重新指位置。
也可以直接说「把这段记在 3.2 节上」,让批注挂到你指定的节/页,而不是当前位置。
5. 斜杠命令
不经过模型,直接改状态:
/handout where 查看当前讲义、当前位置、书签与批注数量 /handout goto 3.2 跳到某一节(PDF 用页码,如 /handout goto 2) /handout teacher 查看讲师提示词的加载状态、生效范围与预览 /handout teacher reload 改了提示词文件后强制重读一次
6. 出问题的时候
| 现象 | 怎么办 |
| 「找不到讲义」 | 路径按会话工作目录解析,改用绝对路径 |
| 「有 N 页但没有可抽取的文字层」 | 扫描件,先 OCR 再打开 |
| 「讲义里没有编号为 X 的节」 | 编号要和 handout_open 给的大纲对得上:PDF 用页码 12 / P12,Markdown 用 3.2 |
| 一次没读全 | 单次返回有字符上限(默认 12000),结果里会附「本节还有 N 个字符」,让它按 from_line/to_line 接着读 |
| 批注挂错了地方 | 没有先指位置时,handout_note 会兜底挂到大纲第一节;先「我在看第 3 页」,或直接说「记在 3.2 节上」 |
| 模型讲得太啰嗦、爱打比方 | 改讲师提示词,见下一节,不用动代码 |
| 讲义改了 | 正文每次按需重读,改完直接生效;PDF 的抽取结果按文件指纹缓存,文件一改也立刻失效 |
讲师提示词:让模型讲得更像老师
讲义决定「讲什么」,讲师提示词决定「怎么讲」——先给直觉还是先给定义、一次讲多少、拿不准时怎么说、要不要留自测题。它不是代码里的硬编码,而是一份 Markdown,你可以一直改:
prompts/teacher.md # 随包发布,直接改这一份
随包发布的那份是可用默认值:面向本科在读学生,语言简朴、简洁,禁止比喻句与类比,讲义原文要标坐标,不确定就说不确定。它不绑定任何学科,按你自己的课改就是了。
内容会原样作为一段系统提示注入(位置在部署级 persona 之后、计划 / 工具策略之前),默认只在打开讲义后生效(teacherAlways: true 可以对所有对话生效)。三条约定值得先知道:
- HTML 注释不会进提示词(),可以在文件里放心留写作笔记;
- 不做模板变量替换,所以正文里写 {{...}} 也是安全的;
- 改完存盘,下一轮对话就是新内容:每次调用共读工具都会顺手核对文件的版本,不用重启 DSH,也不用重开讲义。想立刻确认就 /handout teacher。
路径怎么解析:相对路径按插件包根目录(不是会话 cwd——这是部署级配置),也接受绝对路径与 ~/;写成空串就关掉这个功能。超过 teacherPromptMaxChars 会拒绝加载并在 /handout teacher 里报错——提示词每轮都进上下文,失控的文件必须有闸门。
配置
在 profile 的 cordis.patch.yml 里按 id 覆盖(整块 config 替换):
| 字段 | 默认 | 含义 |
| maxSectionChars | 12000 | 单次 handout_read 返回的字符上限 |
| maxOutlineEntries | 300 | 大纲最多返回多少节 / 页 |
| maxSearchHits | 20 | 单次检索的命中上限 |
| searchContextLines | 3 | 每条命中附带的前后文行数 |
| maxPdfBytes | 67108864 | 允许读取的 PDF 字节上限 |
| maxPdfPages | 600 | 最多抽取多少页 |
| pdfCacheEntries | 4 | 缓存几份已抽取的 PDF |
| teacherPromptPath | prompts/teacher.md | 讲师提示词文件;相对包根目录,支持绝对路径与 ~/,空串关闭 |
| teacherPromptMaxChars | 24000 | 讲师提示词字符上限,超过则拒绝本次加载 |
| teacherOrder | 100 | 讲师提示词在系统提示里的排序位置 |
| teacherAlways | false | 没有打开讲义时也注入讲师提示词 |
界面上的标题与图标
插件卡片、bundle 详情和「内置插件」清单里的标题与描述,读的是 locale/<语言>.json 里 meta 下面的字段,图标是 package.json 顶层的 icon:
{ "meta": { "title": "共读讲义", "description": "把一份讲义(Markdown / 文本 / PDF)接进会话一起读……" } }
三处缺一不可,缺了都不报错,只是卡片退回显示包名 dsh-plugin-handout 和默认图标:显示文本必须在 meta 下(顶层 title 会被静默忽略)、exports 里必须导出 ./package.json 与 ./locale/.json(读取方是通过 ESM 解析器拿这两个资源的)、icon 必须是包内的 SVG / PNG / JPEG / WebP 且不超过 256 KiB。同一个文件里那些扁平键(empty / outline / notes …)是右侧栏面板要用的文案,与上面这套互不干扰;test/locale.test.js 把两条契约都挡住了。
Model Experience
模型侧新增五个工具、一段动态上下文与一段静态提示(讲师提示词)。动态上下文只在有讲义打开时出现,内容是讲义路径、节数 / 页数、用户当前所在位置与已记批注,以及 PDF 的书签目录(最多 40 条);正文永远需要显式调用 handout_read 才会进入上下文。提示里还写了四条行为约束:先取原文再断言、引用要标坐标(§3.2 / p12)、可以补充自己的知识但要明确区分讲义内容与补充。
讲师提示词是静态文本(走 systemPrompt.section,interpolate: false),默认只在共读进行中出现,内容完全由部署方的 Markdown 决定;去掉 HTML 注释后为空就等于不注入。
KV Cache effect
讲义路径、当前位置、批注数量在会话中变化时,动态上下文前缀会改变,可能使该轮之后的 KV 缓存失效;没有打开讲义时该插件不产生任何提示文本(零开销)。讲师提示词只在文件真的改动(文件版本变化)时才换文本,平时是稳定的前缀,不额外破坏缓存。
Known Limitations and Deferred Work
- 没有图形界面。 右侧栏「共读」面板(阶段 4)尚未实现,因此阅读位置目前靠用户口述,而不是滚动自动同步。
- PDF 只支持有文字层的文档,扫描件需要先 OCR;DOCX / PPTX / 图片讲义不支持。
- 阅读状态存在会话日志里,跨会话不共享。
- 检索是大小写不敏感的字面匹配,没有分词、模糊匹配或语义检索。
- 一次抽取整份 PDF,超大文档靠 maxPdfPages 截断。
- 讲师提示词是每份提示词一份文件、全 profile 共用一个:没有按讲义 / 按会话切换提示词的能力,也没有「A/B 两份提示词比效果」的机制。
Dev Note
lib/handout.js(文本解析)、lib/pdf.js(PDF 抽取)与 lib/teacher.js(讲师提示词加载)是零宿主依赖的纯函数,可以直接测;lib/index.js 才是 Cordis 插件。test/plugin.test.js 用假 ctx 把 apply() 真跑起来,覆盖工具注册、执行、投影、动态提示、讲师提示词与命令,不需要启动 DSH。test/locale.test.js 不测代码,测清单与 harness 读取方之间的契约:meta 包装、icon 规则、读取方要解析的两个 exports。
pnpm install
node --test test/.test.js # 72 个测试(文本 11 + PDF 16 + 插件集成 29 + 讲师提示词 9 + 清单与显示元数据 7)
node test/fixtures/make-pdf.mjs /tmp/sample.pdf # 生成一份样例 PDF
测试夹具 PDF 是用 30 行代码手写生成的(test/fixtures/make-pdf.mjs),不是二进制入库——夹具因此可读、可改、可复查。
License
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
James-Yao-xj/dsh-plugin-handout
共读讲义插件:把 Markdown / 文本 / PDF 讲义接进 DeepSeek Harness…
相关插件 · 工具 / 效率
破甲管控台kingcharleslzy-ai/dsh-purge
dsh-purge Community · DeepSeek Harness 社区维护版:宿主兼容、状态诊断、提示词管理、更新与本机备份回滚。基于小杨 / YuJunZhiXue 的 dsh-purge。
★ 3,801已汉化DeepSeek 客户端
74.5
网文长卷lingfengQAQ/webnovel-writer
基于 Claude Code 的长篇网文辅助创作系统,解决 AI 写作中的「遗忘」和「幻觉」问题,支持 200…
★ 7,636已汉化DSH
72.2
多智能体协作HKUDS/AutoSwarm
AutoSwarm: Unify Your Agents. Unify Your Context (Codex · Claude Code · DeepSeek Harness · Muse · Grok · WorkBuddy· nanobot · and more)
★ 2,082已汉化DSH
71.7
Vox 拼贴视频生成Alisa0808/vox-director
🎬 Vox Director拼贴动效导演
★ 2,129已汉化DSH
71.4
Agent 演化引擎Q00/ouroboros
智能体 OS:智能体自己变聪明,我们只守住底线:面试准入、分阶段评估、带预算的进化循环。MCP 服务器,14 种运行时:Claude Code、Codex CLI、Gemini CLI、OpenCode、Copilot、Kiro 等。
★ 6,292已汉化DSH
71.3
智能体运行框架路由HarnessRouter/harnessrouter
智能体运行框架的统一接口。
★ 3,800已汉化DSH
71.2