packages/dsh-task-board
zhu1090093659/dsh-web侧边栏多列任务看板:卡片交给真实 DSH 智能体会话执行,支持 cron 定时(Host 侧到点执行,关浏览器也生效)。
DSH 右侧栏本地 TXT 小说阅读器:书架三种导入、章节目录跳转、点击翻页与上下滚动、重启后进度恢复、字体/行距/背景/夜间阅读主题。
在 DeepSeek Harness(DSH)右侧栏阅读本地 TXT 小说:书架、章节目录、分页翻页、阅读进度记忆与阅读主题设置。只读本机文件,不联网、不内置任何内容源。
dsh plugin --profile <profile> add LaoganR/dsh-novel-readerdsh plugin --profile <profile> add link:E:/dsh-booktool,并把包名加入该 profile 的 dsh.profile.bundles~/.dsh/novel-reader/(可用 dataDir 改写)TextDecoder('gbk'),零额外依赖);超限(>100MB)明确拒绝第X章/回/节 + 序章/楔子/引子/尾声/后记/终章/大结局/番外 规则切章;无命中降级为单章「全文」,首章前的引言自动归入「开篇」伪章sendBeacon 兜底localStorage,随书签隔离插件装进哪个 profile,就在那个 profile 里生效。
# GitHub(公开仓库,CI 收录后可直接用)
dsh plugin --profile <profile> add LaoganR/dsh-novel-reader
# 源码目录(开发期,link: 只建链接、不触碰对端,也不会替你构建)
dsh plugin --profile <profile> add link:E:/path/to/dsh-novel-reader
然后把 "dsh-novel-reader" 加进该 profile package.json 的 dsh.profile.bundles 数组,重启宿主。
从 GitHub 源码安装时 prepare 脚本会自动构建 lib/;pnpm ≥10 可能拦下构建脚本(依赖装了但 lib/ 没生成,宿主会以 ERR_MODULE_NOT_FOUND 拒绝挂载),先在 profile 目录执行 pnpm approve-builds --all 再重跑。
sidebar://dsh-novel-reader.txt):
File.path)自动改走字节上传:宿主把内容按 SHA-256 哈希存到插件数据目录 imported/(同内容重复导入幂等、不会存两份);能拿到路径则仍为零复制E:\books\novel.txt)→「导入」
三种都会自动识别编码(UTF-8/GBK)并切章入架。翻页与点击区约定:点击视口左侧 40% 上一页、右侧 60% 下一页;←/PageUp/↑ 上一页,→/PageDown/↓/空格 下一页;点击翻页模式下滚轮也翻页(带惯性冷却),上下滚动模式下滚轮原生滚动;本章尽头自动进下一章,反向翻页回到上一章末页。
插件配置位于 cordis 插件行的 config 字段(schemastery 校验,全部可选):
| 键 | 缺省 | 说明 |
|---|---|---|
dataDir | $DSH_HOME/novel-reader/ | 书架数据目录($DSH_HOME 缺省 ~/.dsh) |
所有路由以 /novel-reader-api 为前缀(本机 loopback),响应为统一信封 {ok:true, value} / {ok:false, error:{code,message}},错误码 BAD_REQUEST|NOT_FOUND|NOT_TXT|TOO_LARGE|IO_ERROR|INTERNAL。契约定义在 src/shared/wire.ts(双端共用)。
| 方法 | 路由 | 用途 |
|---|---|---|
| GET | /ping | 健康检查 |
| GET | /list | 书架(含进度) |
| POST | /import | {path} 导入 txt(绝对路径 + .txt 校验、编码探测、切章) |
| POST | /import-upload?name= | 直选文件导入(raw body = 文件字节):文件名消毒 → SHA-256 前 16 位落 dataDir/imported/<hash>-<name>.txt(原子写、同内容幂等)→ 同编码/切章管线 |
| GET | /scan?path= | 浏览导航:列目录的子文件夹(≤200)+ .txt 文件(≤500、按名排序、带 size);path 缺省 → 用户主目录。平台目录服务只列子目录不列文件,故文件枚举由本插件宿主自扫 |
| POST | /remove | {id} 移出书架(不删源文件) |
| GET | /chapters?id= | 章节目录 |
| GET | /chapter?id=&index= | 章正文(UTF-8) |
| POST | /progress | {id,chapterIndex,pageIndex,pages,percent} 存进度 |
~/.dsh/novel-reader/
├── state.json # 书架与阅读进度(原子写:tmp + rename;损坏时转存 .bak 并让装载响亮失败)
└── imported/ # 仅「选择文件」且拿不到文件路径时的副本(内容哈希命名,同内容只存一份;移出书架时清理)
经路径/目录导入的书籍本体不复制,书架只记路径与元数据;文件被移动或修改后,下次打开会重新探测编码并重扫章节。
pnpm install # 装依赖(prepare 自动双端构建 lib/)
pnpm build # 重建 lib/(host ESM + client CJS)
pnpm typecheck # tsc --noEmit
node scripts/smoke.mjs # 双端产物冒烟:function-plugin 四元组 / ModuleLoader 外壳 / id 纪律
src/host/:HTTP 路由、编码探测、切章、原子存储src/client/:右栏注册(tab 类型 + keyed slot)、书架、阅读页、分页 hook、主题src/shared/wire.ts:双端共用的 API 契约(唯一主人)lib/client.js 变更)会接手市场条目为 awesome-dsh-plugin 仓库的 data/plugins/<owner>__<repo>.yml 单文件 PR(格式见 docs/_awesome-contributing.md),仓库侧需要 dsh.bundle manifest(package.json ✓)、cordis.patch.yml(✓)、dsh-plugin topic 与 screenshots.json(声明于本仓根目录,图片入库后生效)。