deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
dsh-feedback 是 omp-feedback(Oh My Pi 的 ~/.omp/agent/extensions/feedback 扩展)在
dsh(DeepSeek Harness)插件体系上的移植:一个轻量跨上下文问题记录机制——模型在工作过程中
发现的问题(skill/文档/MCP/工具与实际需要矛盾、用户纠正、约束违反)随时记录,后续任何会话都能
列出并处理,不随上下文窗口丢失。
除了模型工具,本插件还带一个 Web 前端面板:打开会话时,若当前工作区有反馈,右上角会话头部
会出现一个带数量的「反馈」按钮,点击展开浮动窗口——逐条展示、一键复制、就地修改、确认删除
(数据与模型工具共用同一份 work/feedback.json)。
OMP(~/.omp/agent/extensions/feedback) |
dsh 实现(本插件) | 说明 |
|---|---|---|
工具 feedback_add / feedback_list / feedback_delete |
同名三工具(ctx.tools.register + defineTool) |
行为、参数、返回语义逐一对应;dsh 侧用结构化 JSON 规范值 + 纯 render 呈现 |
存储 {cwd}/work/feedback.json |
同一路径,cwd = 调用会话的工作区(exec.agent.session.header.cwd) |
与 dsh 内置 fs 工具(read/write)的 cwd 解析一致;不同 cwd 相互独立 |
通过宿主注入的 ExtensionAPI 直接 readFile/writeFile |
通过 ctx.fs(provider seam)读/写 |
自动走沙箱策略(sandboxPolicy.resolve({ session }))、原子写、UTF-8/二进制拒绝;父目录由 provider 创建 |
最后一条删除后 unlink 文件 + rmdir 空 work/ |
同语义:ctx.fs.processPath → node:fs unlink/rmdir(fs seam 无删除原语);provider 无宿主路径时退化为写 [] |
空 work/ 仍只在目录为空时移除;该文件是过程 scratch 文件而非持久数据 |
配套提示词 skills/feedback/SKILL.md 随扩展提供 |
同名 SKILL.md 随包发布,apply 时解析 frontmatter 并 ctx.skills.register 为 runtime skill |
模型经 skill 工具加载;不依赖全局 AGENTS.md;无 skill 注册表的 profile 下工具仍可用(仅少提示词) |
| JSON 解析失败静默当作空列表 | 解析失败显式报错(不静默清空,防止下一次写入覆盖损坏数据) | 有意收紧:坏文件应被看见并人工处理 |
{ id, summary, detail?, createdAt } 自描述模型 |
完全一致(不设 category/status/severity) | — |
| 无并发控制 | 工具未声明 isConcurrencySafe(默认 exclusive),避免 RMW 竞态 |
— |
feedback-plugin/
├── package.json # ESM 插件包(peerDeps: cordis ^4.0.1, dsh-tools ^0.1.0-rc.6, dsh-host-webserver)+ dsh.client 声明
├── lib/
│ ├── index.js # 插件入口:name / inject / apply,注册 4 个工具 + runtime skill
│ ├── store.js # 存储层:会话 cwd/策略解析、load/save、scratch 清理
│ ├── http.js # 宿主端 HTTP API(/dsh-feedback:list / update / delete),供前端调用
│ └── client.js # 浏览器 bundle:右上角会话头部按钮 + 浮动窗口(手写 __ModuleLoader__ 格式,无需构建)
├── skills/feedback/SKILL.md # 机制说明(frontmatter 单行 name/description/whenToUse 供插件解析)
└── test/smoke.mjs # 存储逻辑 + 工具/路由注册冒烟测试(node test/smoke.mjs)
# 1) 插件目录先装依赖(link: 安装的本地插件必须有本地 node_modules,否则
# ESM realpath 后找不到 @deepseek-ai/dsh-tools)
cd <path/to/feedback-plugin>
npm install
# 2) 装进 profile(dsh plugin = 在 profile 目录里转发 pnpm;workspace 根要 -w)
dsh plugin --profile web add -w <path/to/feedback-plugin>
# 3) 在 ~\.dsh\profiles\web\cordis.patch.yml 追加:
# - insert:
# - id: dsh-feedback
# name: 'dsh-feedback'
验证:
# 离线查看组合树里有没有这个插件(不会启动服务)
dsh --profile web --dump-config
# 存储层冒烟测试
node test/smoke.mjs
注意:新装的 npm 依赖需要重启 web 服务后才会被 Loader 解析;只改 patch 会热重载。
| 工具 | 参数 | 行为 |
|---|---|---|
feedback_add |
summary(必填,自包含一句话)、detail? |
追加一条反馈到 {cwd}/work/feedback.json,返回 { id, summary, total, path } |
feedback_list |
— | 列出全部滞留反馈,返回 { count, path, items }(含 createdAt / updatedAt? / detail) |
feedback_update |
id、summary?、detail? |
按 id 就地修改(至少一个字段);detail 传空串清空该字段,写入 updatedAt,返回 { id, summary, detail?, updatedAt, total } |
feedback_delete |
id |
按 id 硬删除;全部删完时清理 scratch 文件与空的 work/,返回 { id, remaining, fileRemoved } |
打开任一会话时,若该会话工作区(cwd)存在 work/feedback.json 且有内容,右上角会话头部
(conversation.session.header.actions 槽)直接浮着一个常驻面板(默认展开,无需点击):
前端与模型工具共用同一存储:前端通过宿主端 HTTP 路由操作(lib/http.js,前缀 /dsh-feedback,
GET /list?cwd=…、POST /update、POST /delete),读写仍走 ctx.fs provider seam,与工具行为一致。
生效条件:client bundle 在 web 服务启动时扫描进 window.__DSH_BOOT__;运行中的服务对 bundle 与
宿主端插件改动均热重载(dsh 的 client-modules HMR 会重算 rev 并推送新 bundle,宿主端插件热重载),
改完刷新页面即可,无需重启。验证:
# 检查 boot manifest 是否含 dsh-feedback 条目(rev 会随 bundle 更新)
Invoke-WebRequest http://127.0.0.1:3080/ | Select-String '__DSH_BOOT__'
# bundle 可访问
Invoke-WebRequest http://127.0.0.1:3080/plugins/dsh-feedback/client.js
feedback_list。dsh-skillzip 的 skillzip_compress 等)。skills/feedback/SKILL.md(运行时已注册为 feedback skill)。CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。