Skip to content

dsh-skill-scout

Verified

@agent-stash/dsh-skill-scout · v0.3.1 · Apache-2.0 · Web UI

Turn reusable workflows from finished DeepSeek Harness sessions into Agent Skills after review

Install

dsh plugin add @agent-stash/dsh-skill-scout

Confirm the layer applied with dsh --profile default --dump-config — see the install guide.

Source

Published to npm without a public repository. Inspect the package contents before installing.

Tags

Readme

@agent-stash/dsh-skill-scout

npm DSH Plugin

DeepSeek Harness(DSH)插件:在本机读取已经结束的会话,找出在多个会话里重复成功的流程和经过验证的修复,先由模型写一段摘要:发现了什么、Skill 做什么、打算新建或改进哪个 Skill。你同意摘要后,它才生成 Skill 草稿;你看过证据、预览过草稿之后,它才把 Skill 写进 .agents/skills。

支持 DSH Desktop 0.2.1-rc.3 与 DSH 0.2.2-alpha.2 的 Web 界面。

安装

DSH 桌面版:在「插件」页点「添加插件」,填入 @agent-stash/dsh-skill-scout 后安装。

命令行:

dsh plugin --profile web add @agent-stash/dsh-skill-scout

安装后插件立即开始在本机分析会话。要让模型在后台给候选写摘要,在「插件 → 经验提炼器 → 配置」里打开「后台生成摘要」。写摘要的「发现模型」和写 Skill 的「生成模型」分开设置,不选时都跟随 Agent 的默认模型。

使用

插件有三个入口:

  • 会话里的「经验提炼」Tab,和对话、轨迹并列。顶部一行是本会话的分析状态(已分析、等待静默期、未分析、分析失败),右侧是「立即分析」和「提炼本会话」。左栏按「待你决定」「本地发现」「历史」分组列出引用本会话的建议,下面是本会话的任务;有建议且任务超过 5 个时,任务组默认收起。右栏是选中建议的详情。视图宽度不到 760px 时只显示一栏,详情顶部有返回按钮。
  • 侧栏的「历史回溯提炼」页,分「建议」「搜索」「统计」三栏,见下文。
  • 会话标题栏右侧的 Skill 图标。出现新的摘要或草稿时,图标上显示数量;打开浮层后数量清零,点浮层里的卡片会打开「历史回溯提炼」页并选中这条。没有建议时只有图标,不弹通知。

线索与 idea

规则在会话里找到的一组任务是一条线索。发现模型给线索写摘要,摘要可以给出多个互不重叠的 idea,每个 idea 对应一个要新建或追加内容的 Skill:规则发现的线索最多 3 个,「提炼本会话」和「提炼所选」最多 5 个。列表以 idea 为单位,每个 idea 单独同意、生成、保存或忽略;还没有摘要的线索占一张卡片。不同线索给出同名、还没处理完的 idea 时只显示最早的一张,卡片上注明另有几条同名。

「建议」栏和会话 Tab 的左栏都分三组,每行前的圆点标出状态(等你决定、进行中、失败、完成、未开始):

  • 「待你决定」:等你同意的 idea、草稿正在生成或可以保存的 idea,以及草稿生成失败、方案仍在的 idea。卡片上显示方案里的用途说明。
  • 「本地发现」:规则找到、还没有摘要的线索,包括正在写摘要和摘要失败的。
  • 「历史」:已保存、已忽略的 idea 和摘要判定不值得保存的线索,默认收起。

详情

详情在右栏打开。顶部是标题、来源和用到的模型;同一条线索有多个 idea 时,右上角的「‹ n/m ›」逐个切换,点「n/m」列出全部。标题下的一排步骤是「发现」「摘要」「草稿」「保存」,标出这一条所在的那一步,再下一行写明下一步做什么、交给哪个模型。

内容最多有四页,没有内容的页不显示:

  • 「摘要」:还没有摘要时,列出规则在这组任务里匹配到的步骤。有摘要后列出这个 idea 的方案:发现了什么、Skill 的用途、何时使用、要新建或追加到的 Skill 和步骤提纲、照着做的风险(没有时不显示)、验证方式。
  • 「Skill」:生成模型写的草稿。名称、描述、触发条件和正文都可以直接改;分页条右端是「编辑」和「重新生成」。
  • 「改动」:目标路径和文件 diff。新 Skill 默认写进项目的 .agents/skills/<name>/SKILL.md,也可以选用户级的 ~/.agents/skills。
  • 「证据」:每个来源任务的请求、任务进行中你插入的消息、执行过的命令、退出码、失败时的一行错误,以及判定成功所依据的检查命令。摘要与草稿引用过的步骤有标记,「打开会话」跳回原会话。

详情底部固定,右侧的主操作随阶段变化:

  • 「生成摘要」:把这组任务的证据发给发现模型,只换回方案。上方写明证据会发给哪个模型。
  • 「生成 Skill 草稿」或「生成追加内容」:同意这个 idea,把同样的证据和它的方案发给生成模型。上方写明会发给哪个模型。草稿生成后,「Skill」页的「重新生成」按同一份方案再写一次。
  • 「保存到项目」:写入文件,然后确认 DSH 的 Skill 列表里出现了它;按钮右侧的箭头可以改为保存到用户级目录。保存后可以撤销;文件在保存之后被改过时,撤销会拒绝并说明原因。
  • 「追加到 」:方案认为已有 Skill 覆盖了这个任务、但证据补充了缺失的步骤或注意事项时,只在原文件末尾追加一节,原有内容不变。

左侧的「忽略」把这一条移到历史,可以恢复。旁边的「更多操作」里有「忽略类似建议」:相近的流程以后也不再提示,之后的摘要里与它同名或标题相近的 idea 直接记为已忽略。

进度

摘要与草稿请求按实际阶段显示进度:排队、准备证据、等待模型响应、模型正在思考、正在写(已收到的字数)、正在核对证据,并显示已用时间。占位条按「已收到的字数 / 这类回复通常的字数」逐条点亮,没点亮的继续闪烁;系统设置了减少动态效果时占位条静止。请求结束后结论留在原处,摘要判定不值得保存时写明理由。结束时这一条没有列在打开的会话 Tab、「建议」栏或浮层里,才从标题栏图标下方弹出带「查看」的提示。

搜索与回溯

「搜索」栏在插件保存的脱敏任务记录里查找:用户请求、命令、失败的错误行、改动的文件路径和任务中插入的消息。多个词同时出现才算命中,按命中词数和时间排序,可以按任务结果过滤。完整的工具输出不保存,所以搜不到。

勾选 1 到 12 个任务后点「提炼所选」,这些任务组成一条线索交给发现模型。

默认只索引历史范围内已分析的会话。「回溯 90 天」「回溯全部」在后台逐个读取更早的会话,显示总数、已读和失败数,可以暂停和继续。回溯读入的会话可以搜索和提炼,不参与规则检测,也不随历史范围清理。

统计

「统计」栏从上到下:

  • 四个总数:已分析的会话(占全部会话的比例,范围内与回溯读入的数量在提示里)、近 30 天的任务(通过检查的比例和每天的走势)、待你决定的 idea、已保存的 Skill。
  • 近 30 天每天的任务,按结果堆叠:检查通过、成功、无法核实、用户否定、失败、中断。图例可以隐藏某一类。
  • 线索与 idea 各自的状态占比。
  • 跨会话出现最多的动作(带近 8 周的走势)和在多个会话里出现的同一类错误,点一项会填进搜索。
  • 近 30 天每天的新线索;分析失败的会话和原因,点一条打开会话(没有失败时不显示)。
  • 近 7 天每天的模型用量:输入 token(未命中缓存、缓存读、缓存写分开)、输出 token,以及后台摘要、手动请求和失败的次数。
  • 最近的模型调用表:条目、阶段、模型、耗时、输入、输出、结论和时间,点一行跳到对应的卡片。视图较窄时隐藏阶段、模型和输入列。

发现规则

  • 什么算成功:只看工具结果。最后一次修改之后,每条命令的最后一次运行都成功;其中跑过测试、检查或构建的,记为「检查通过」。Agent 在回复里说「完成了」不算;用户下一条消息表示结果不对时,这次任务不再算成功。
  • 命令按动作比较,写法不同的同一个动作算同一步:
    • 包管理器:pnpm build、npm run build、yarn build、bun run build 是同一步;npm i、npm ci、pnpm install、yarn 是同一步;npm install zod 与 pnpm add zod 是同一步。任务运行器的任务按脚本算:turbo run build、turbo build、lerna run build 与 pnpm build 是同一步。
    • 包里的命令行工具:vitest、npx vitest、pnpm vitest、pnpm exec vitest、bunx vitest 是同一步;pytest、python -m pytest、uv run pytest 是同一步。
    • 脚本:./scripts/release.sh、bash scripts/release.sh、sh ./scripts/release.sh 是同一步;tsx scripts/seed.ts、npx tsx scripts/seed.ts、ts-node scripts/seed.ts 是同一步,tsx scripts/seed-dev.ts 是另一步。bash -lc "…" 里的命令按里面的命令算。多行脚本按行拆成命令;here-document 的正文是交给程序的数据,不算命令;for、if、while 这类 shell 关键字跳过,set、export、source 等只改变 shell 状态的内建命令不算步骤。
    • 其他:git checkout -b 与 git switch -c、docker-compose 与 docker compose、pip3 与 pip、cargo b 与 cargo build 各是同一步。
    • 不同的动作不合并:pnpm build 与 pnpm test、pnpm install 与 pnpm add、git push 与 git pull、npm publish 与 npm version、vitest 与 jest 都是不同的步骤。
    • 内联代码(python -c、node -e)、HTTP 请求(curl、wget、http、xh)、远程登录(ssh、scp)和 open 从动作上看不出做了什么。它们在流程比较里和日常步骤一样权重低,不算有区分度的步骤,也不计入复杂流程的命令数。
  • 工具调用按名字归类,去掉 MCP 前缀后比较:bash、run_terminal_cmd、mcp__*__execute_command 算执行命令;edit、MultiEdit、apply_patch、mcp__*__write_file 算改文件;读取、搜索类工具只计数;其他工具按工具名算一步。改 package.json、CHANGELOG.md、*.config.ts、.github/workflows/*.yml 这类有固定角色的文件也算流程里的一步。
  • 重复流程:至少 2 个独立会话(可调)里,流程相近并且都成功。两个任务至少要共有一个有区分度的步骤;提交、推送、安装依赖、删除或移动文件这类每个任务都有的步骤权重低,跑测试、检查、构建权重居中,改普通源码文件不算步骤。build 与 build:web 这类同一前缀的脚本算部分相同。共有的步骤在两个任务里的先后顺序要大体一致。请求描述相近时,流程有四成相近即可;请求描述不相近(例如一个用中文、一个用英文)时,要共有两个以上有区分度的步骤,流程六成以上相同。从别的会话 fork 出来的会话只计入新增的部分;同一会话里的反复重试不算重复。
  • 失败恢复:命令失败,接着安装依赖、改配置,或者改了这条命令的选项或环境变量(pnpm test 改成 pnpm test --runInBand),然后同一个动作成功,并有后续检查。失败与成功的写法可以不同,例如 npm test 失败、装好依赖后 pnpm test 通过。只换了文件、参数或选项的值不算修复,换一段内联代码、换一个 URL 也不算;中间用内联代码或 HTTP 请求查看情况不算修复动作。只改业务代码的修复,要在多个会话里遇到同一个错误才提示。跨会话比较错误时,路径、URL、版本号、行列号和平台名(darwin-arm64、linux-x64-gnu)先换成占位符;同一个错误出现在同一类命令的不同写法上(pnpm build 与 npx vite build)时,错误文本要几乎相同才算同一个问题。
  • 复杂流程:一次经过验证、用到至少 5 个不同的非日常命令、跨 3 类以上命令的长任务,只作为摘要候选,摘要默认判为一次性工作。
  • 已有 Skill:写摘要时附上最相关的已有 Skill,模型可以判为重复,或者建议追加内容。已保存的建议和「忽略类似」覆盖的流程不再提示;摘要判定不值得保存后,证据增加到两倍才重新摘要。

摘要与草稿

模型分两步参与,两步用的模型分开设置:

  1. 摘要(发现模型):判断这组任务值不值得保存。值得时给出一到几个互不重叠的 idea(规则线索最多 3 个,「提炼本会话」与「提炼所选」最多 5 个),每个 idea 只有方案:标题、发现了什么、Skill 的用途、何时使用、Skill 名称、最多 8 条步骤提纲、最多 3 条风险和验证方式,不写 Skill 本身。判断前先核对你的纠正、命令失败的原因和工具结果验证过的步骤,你否掉的步骤和没成功过的步骤不进提纲。后台摘要默认关闭;打开后按每日次数和最小间隔排队,超时后放弃,失败后分别在 10 分钟、1 小时、6 小时后自动重试,之后只能手动重试。你在详情里点的「生成摘要」、「提炼本会话」与「提炼所选」不计入每日次数。后台摘要只处理规则发现的线索。关闭后台摘要或关闭会话分析后,插件不再发出后台模型请求。重新摘要只在这条线索的 idea 都还没有草稿、没有保存、没有「忽略类似」时可以发起,结果替换原来的全部 idea。
  2. 草稿(生成模型):只在你点「生成 Skill 草稿」或「生成追加内容」之后请求,只写这个 idea 指定的那个 Skill,按方案里的何时使用、提纲和验证方式写,方案里的风险写成前置条件或限制,不扩大范围。你在任务中的纠正和命令失败的原因写成前置条件、注意事项或限制。后台从不生成草稿,失败也不自动重试。重新生成摘要会让旧草稿失效。

两步收到的证据包都已脱敏(「提炼本会话」与「提炼所选」最多带 12 个任务,超时是摘要超时的两倍):规则匹配到的步骤、用户请求、任务进行中你插入的消息(每个任务最后 3 条)、你的下一条消息、命令行、退出码、每次失败的一行错误、最多 3 个最相关的已有 Skill 的名称与描述(最相关的一个带正文摘录),摘要请求还带上证据会话能看到的全部 Skill 名称(最多 200 个),这些名称不能用于新建的 Skill。草稿请求另外带上你同意的那个 idea 的方案;追加内容时附上要改进的 Skill 全文。证据会话能看到名为 skill-creator 的 Skill 时,草稿请求还带上它的 SKILL.md(脱敏后取前 20000 字符)作为写 Skill 的指南,按 DSH 加载技能的格式(<skill_content>,带技能目录)附在提示词里,模型只采用其中写 SKILL.md 的部分;摘要请求不带。完整的工具输出、文件内容和 Agent 的思考过程不会发送。请求不带任何工具,也不在任何会话里运行。

摘要要通过这些检查:

  • 符合插件定义的 JSON 结构,idea 数不超过上限,同一份摘要里的 Skill 名称各不相同,每个 idea 的提纲不超过 8 条、风险不超过 3 条。
  • 引用的证据编号都存在;每个 idea 至少引用一处证据。任何一个 idea 不合格,整份摘要不采用。
  • 新 Skill 的名称没有被证据会话可用的 Skill 占用;要改进的 Skill 存在。
  • 没有凭据形态的文本和提示注入的痕迹。

草稿要通过这些检查:

  • 符合插件定义的 JSON 结构,引用的证据编号都存在。
  • 带命令的步骤要引用证据,命令链的每一段都和它引用的某次运行里的一段是同一个动作,写法可以不同(pnpm bundle 与 npm run bundle),而且这个动作在证据里成功过;复现失败的步骤可以引用那次失败。含命令替换时,替换部分与记录原样一致。不带命令的步骤可以不引用证据。
  • 没有凭据形态的文本、提示注入的痕迹,也没有下载后直接交给 shell 执行的命令。
  • 强制推送、递归删除、sudo 这类命令作为提醒显示在「Skill」页。

设置

分组 设置 默认
发现 分析已结束的会话 开
发现 历史范围(天) 30
发现 启动时扫描的会话数 200
发现 静默期(会话空闲多少分钟后分析) 2
发现 重复次数(独立会话数) 2
摘要 后台生成摘要 关
摘要 发现模型与推理强度 跟随 Agent 默认模型
摘要 超时(秒) 60
摘要 摘要要求(替换内置判断标准,回复格式始终保留) 空
生成 Skill 生成模型与推理强度 跟随 Agent 默认模型
生成 Skill 超时(秒) 180
限额 每日后台摘要次数 6
限额 后台摘要间隔(分钟) 10
限额 证据上限(字符) 24000
隐私 包含错误行 开
隐私 追加脱敏规则(每行一个正则) 空
收件箱 标题栏角标:显示数量或只显示图标 显示数量
收件箱 新 Skill 保存到:项目或用户 项目

数据与安全

  • 分析在 DSH Host 进程里进行,只读取 DSH 已经保存的会话日志。
  • 会话文本在存储、发送和显示之前先在本机脱敏:常见的 API Key、token、私钥、Authorization 与 Cookie 头、password= 一类赋值、--password 一类参数、user:pass 形式的账号密码、URL 里的账号密码和邮箱地址都替换为占位符,用户主目录换成 ~。命令签名也从脱敏后的命令解析。设置里可以追加自己的规则。
  • 插件只存 Episode 记录、线索(含摘要、各 idea 的草稿与写入记录)、最近 8 天的模型用量和最近 100 次模型调用的记录,放在 DSH storage domain skill_scout 里,不另起数据库或后台进程。超出历史范围的会话记录会被删除,仍待处理的线索引用的和回溯读入的除外。
  • 分析出错的会话记下原因,在统计里列出;日志没有变长就不再重试。
  • 多个 DSH 实例同时运行时,只有拿到 $DSH_HOME/skill-scout/worker.lock 的那个分析会话与后台摘要,其他实例只显示收件箱。
  • 写入只发生在你点保存之后,目标只能是项目或用户的 .agents/skills、.dsh/skills 下的 <name>/SKILL.md。已有同名文件时拒绝写入;改进已有 Skill 时,预览之后文件被改过也会拒绝。
  • 摘要与草稿请求不创建会话,不会被再次分析;子代理会话也不分析。

性能

  • Agent 运行时插件不做分析:一个会话的回合结束后,等它空闲一段时间(默认 2 分钟)才读取这个会话。
  • 读取与提取在 Host 进程里逐个会话进行,会话之间让出事件循环;回溯也是逐个读取,可以暂停。
  • 在一台开发机的真实数据上测得:829 个会话日志(其中 525 个是子代理会话,不分析),压缩后 585 MB、解压后 2.2 GB。直接解压并解析全部日志约 15 秒,从 304 个会话里提取出 719 个任务约 2 秒,跨会话检测约 1.3 秒。这些任务存成 Episode 记录约 13 MB。
  • 搜索不读原始日志,只查内存里的倒排索引:上面 719 个任务建索引约 25 ms,单次查询不超过 0.1 ms。Episode 记录变化后,下一次搜索时重建索引。
  • 每次摘要或草稿请求发送的证据不超过设置里的字符上限,默认 24000。

已知限制

  • 会话 Tab、「历史回溯提炼」页、收件箱和设置页只在 DSH Web 与桌面版里提供。
  • 搜索只覆盖插件保存的脱敏记录:请求、命令、错误行、文件路径和任务中插入的消息;完整的工具输出和 Agent 的回复正文搜不到。
  • 请求相似度按词重合计算。用不同语言描述的同一任务,要共有两个以上有区分度的步骤才会归为一组。
  • 动作归并覆盖 npm、pnpm、yarn、bun、turbo、lerna、脚本解释器与 TypeScript 运行器、git、gh、docker、cargo、uv、pip 与 Python 模块入口;其他程序按程序名加子命令比较,同一工具的别名写法不会合并。
  • 主要由内联代码或 HTTP 请求组成的流程(例如用 curl 调接口完成的部署)不算有区分度,不会单独构成重复流程。
  • 失败恢复要求修复后重新运行同一个动作;换了另一个工具完成的修复(例如 jest 失败后改用 vitest)不会被识别。
  • 改进已有 Skill 只追加一节,不改写原有段落。
  • 退出码从 bash 与 PowerShell 的结果里读取,包括 run_code 里发起的命令;其他工具只看它是否报错。
  • 脱敏按已知的写法匹配,格式不常见的凭据可能漏掉;可以在设置里追加正则。

开发

pnpm install
pnpm --filter @agent-stash/dsh-skill-scout run bundle   # 构建 dist/index.js(Host)与 dist/client.js(浏览器)
pnpm exec vitest run packages/dsh-skill-scout

dist/ 随仓库提交。设计取舍与数据流见 architecture.md,界面的呈现规则见 design.md。

许可证

Apache-2.0,见 LICENSE。