deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
DSH (DeepSeek Harness) Web 客户端插件:在聊天界面左侧添加一条消息指针导轨,每条用户消息对应一个短横条标记,点击可快速跳转到对应消息位置,鼠标悬停显示消息预览气泡。
A DSH Web client plugin that adds a vertical message pointer rail to the left of the chat area. Each user message gets a clickable dash marker that scrolls to that message; hover shows a preview bubble.
Alt+↑ / Alt+↓ 在用户消息间上下跳转Alt+Shift+↑ / Alt+Shift+↓ 跳到第一条/最后一条消息
在市场里搜索 dsh-nav-pointer 一键安装。与其他插件一致,多数情况刷新页面即生效。
dsh plugin --profile web add dsh-nav-pointer
该命令会安装到 ~/.dsh/profiles/web,并因为本包声明了
dsh.bundle.patch,自动把 dsh-nav-pointer 追加进
dsh.profile.bundles。重启 dsh web 生效。
若 pnpm ≥11 报
minimumReleaseAge(安全等待期),是新发布的包触发的策略,可一次性放行:dsh plugin --profile web add dsh-nav-pointer --config.minimumReleaseAge=0
git clone https://github.com/kongdexu/dsh-nav-pointer
cd ~/.dsh/profiles/web
dsh plugin --profile web add link:/path/to/dsh-nav-pointer
用 --config.minimumReleaseAge=0 同理。
src/
core.ts # 纯逻辑:CSS/常量/几何压缩/高亮推导/预览裁剪/行收集(无 React,可单测)
config.ts # 共享配置类型与默认值(host schema 与 client scope 共用)
client.ts # Client 端入口,挂载 shell.overlay + settings.section 槽位
index.ts # Host 端入口,注册 schemastery 设置命名空间(ctx.settings.installSection)
types/… # 声明文件,构建时拷入 lib/types
lib/ # esbuild 构建产物(client.js / index.js / types),发布与加载用
build.mjs # esbuild 构建(client→iife+模块加载包装,host→esm,设置包 external)
tsconfig.json # tsc 类型检查
vitest.config.ts # vitest(jsdom 行为测试)
test/
*.test.ts # vitest 行为测试
smoke.mjs # 构建产物加载契约(无浏览器)
cordis.patch.yml # Cordis profile patch,把插件插入 bundle 树
package.json # 包元信息,含 dsh.bundle / dsh.client / peerDependencies 字段
shell.overlay(frame-wide 浮层,list 槽位,不替换任何内置 UI)[data-conversation-scroll](DSH 对话区域公开约定的稳定属性)[data-chat-flow-kind="user"]requestAnimationFrame 循环每帧读取 getBoundingClientRect(),签名变化时重算位置MutationObserver 监听消息列表变化,scroll 事件(capture 阶段)更新气泡位置所有偏好都在 设置 → 消息指针 页面实时调整并持久化:
| 配置项 | 默认 | 说明 |
|---|---|---|
| 滚动时长 | 260ms | 点击 / 键盘跳转动画时长(固定时长,范围和 60–2000ms) |
| 显示指针导轨 | 开 | 关闭后不渲染消息指针导轨 |
| 悬停预览气泡 | 开 | 鼠标悬停标记时的消息预览 |
| 键盘跳转 | 开 | Alt+↑/↓ 在用户消息间跳转 |
滚轮滚动、手指触摸、拖拽导轨都会立即打断进行中的跳转动画。当用户消息很多、自然高度超出可用视口时,标记之间的间距会自动压缩到刚好铺满视口(这是固定行为,不可关闭)。
兼容旧用法:仍可通过
window.__DSH_NAV_POINTER_SCROLL_MS__覆盖滚动时长 (优先级高于设置面板,需在插件加载前设置),但推荐改用设置面板。
一键跑完整校验(类型检查 → 构建 → 行为测试 → 加载契约):
npm run check
npm run typecheck:tsc --noEmit 类型检查 src/npm run build:esbuild 产出 lib/(client → iife + window.__ModuleLoader__ 包装,host → esm)npm test:vitest + jsdom,覆盖导轨压缩几何、高亮推导、预览裁剪、行收集与样式注入npm run test:smoke:无浏览器加载构建产物 lib/client.js,用 mock 的
window.__ModuleLoader__ + React + document + settingsScope 断言插件导出
{ name, inject: ["slots", "settingsScope"], apply }、apply() 正确注册
shell.overlay 与 settings.section 槽位,且注入的 CSS 符合当前规格ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION:本包(或 profile 里其他新发布包)在 pnpm 24h 安全等待期内,用上文一次性放行参数重试一次即可。dsh.profile.bundles 里含 dsh-nav-pointer,且当前会话存在用户消息(无用户消息时不渲染);清空聊天后重新发送一条再看。position: fixed 且 width:240px,不受导轨 36px 窄列影响。更多实现细节见 docs/DEVELOPMENT.md,变更记录见 CHANGELOG.md。
MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。