跨工作区独立人格、自适应风格与陪伴预设:为项目和对话分别维护人格与确认后的通用偏好,支持任意 DSH…
数据截至 2026/10/31 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
dsh plugin --profile web add ZekaiShi/dsh-evo-subagent状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
安装兼容性检查需源码安装engines.node 要求 >=24.2.0,不满足 Node 22.19.0
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/2 00:31:29
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
查看扫描证据(共 77 处,展示前 59 条)
- 读取本地文件binding.js:41
text = await readFile(filename, 'utf8') - 读取本地文件binding.js:68
const text = await readFile(filename, 'utf8') - 写入本地文件binding.js:83
await writeFile(filename, updated, 'utf8') - 读取本地文件binding.js:102
text = await readFile(filename, 'utf8') - 发起网络请求habits.js:92
async fetch(request) { - 发起网络请求persona.js:246
ctx.inject(['connection'], ({ connection }) => connection.fetch.register({ path: '/api/evo-subagent/persona', methods: ['GET', 'POST'], requestBody: ' - 发起网络请求dsh/client.js:248
var response = await fetch('/api/evo-subagent/persona' + (query ? '?' + query : ''), { method: body ? 'POST' : 'GET', credentials: 'same-origin', cach - 发起网络请求dsh/client.js:340
var response = await fetch('/api/evo-subagent/habits' + (selected ? '?target=' + encodeURIComponent(selected) : ''), { - 发起网络请求dsh/client.js:471
fetch('/evo-subagent/projects') - 发起网络请求dsh/client.js:498
fetch('/evo-subagent/config', { - 发起网络请求dsh/client.js:515
fetch('/evo-subagent/config', { - 发起网络请求dsh/client.js:528
fetch('/evo-subagent/model', { - 读取本地文件plugin.js:26
return JSON.parse(readFileSync(join(evolutionDir, 'config.json'), 'utf8')) ?? {} - 写入本地文件plugin.js:34
mkdirSync(evolutionDir, { recursive: true }) - 写入本地文件plugin.js:35
writeFileSync(join(evolutionDir, 'config.json'), JSON.stringify(config, null, 2), 'utf8') - 写入本地文件plugin.js:295
await mkdir(targetDir, { recursive: true }) - 写入本地文件plugin.js:296
await copyFile(template.filename, target, constants.COPYFILE_EXCL) - 读取本地文件habits-store.js:146
const info = lstatSync(this.filename) - 读取本地文件habits-store.js:148
markdown = readFileSync(this.filename, 'utf8') - 写入本地文件habits-store.js:159
await mkdir(dirname(this.filename), { recursive: true }) - 写入本地文件habits-store.js:186
await rename(temporary, this.filename) - 删除本地文件habits-store.js:190
if (temporary) await unlink(temporary).catch(() => {}) - 删除本地文件habits-store.js:192
await unlink(lockname) - 读取本地文件sharing.js:34
const info = lstatSync(this.filename) - 读取本地文件sharing.js:36
state = JSON.parse(readFileSync(this.filename, 'utf8')) - 写入本地文件sharing.js:55
await mkdir(dirname(this.filename), { recursive: true }) - 写入本地文件sharing.js:76
await rename(temporary, this.filename) - 删除本地文件sharing.js:77
} finally { if (temporary) await unlink(temporary).catch(() => {}); await lock.close(); await unlink(lockPath) } - 读取本地文件sharing.js:174
if (existsSync(join(dir, '.git')) || existsSync(join(dir, 'AGENTS.md'))) return { path: dir, label: basename(dir) } - 读取本地文件persona-store.js:92
const filename = join(this.directory, name), info = lstatSync(filename) - 读取本地文件persona-store.js:94
return readFileSync(filename, 'utf8') - 写入本地文件persona-store.js:118
await mkdir(this.directory, { recursive: true }) - 写入本地文件persona-store.js:149
await rename(temporary[3], join(this.directory, PERSONA_FILES[3])) - 写入本地文件persona-store.js:150
for (let i = 0; i < 3; i++) await rename(temporary[i], join(this.directory, PERSONA_FILES[i])) - 删除本地文件persona-store.js:153
for (const file of temporary) await unlink(file).catch(() => {}) - 删除本地文件persona-store.js:154
await lock.close(); await unlink(lockPath) - 读取本地文件bili-bridge.js:11
const info = lstatSync(path) - 读取本地文件bili-bridge.js:13
return readFileSync(path, 'utf8') - 读取本地文件bili-bridge.js:16
const info = lstatSync(path) - 写入本地文件bili-bridge.js:24
await mkdir(dirname(path), { recursive: true }) - 写入本地文件bili-bridge.js:32
signal?.throwIfAborted(); await rename(temporary, path) - 删除本地文件bili-bridge.js:33
} finally { await file.close().catch(() => {}); await unlink(temporary).catch(() => {}) } - 读取本地文件bili-bridge.js:51
const names = readdirSync(path).filter(name => folder === 'out' ? /^ {4}- {2}- {2} md$/.test(name) : /^BV[0-9A-Za-z]{10}- {4}- {2}- {2} md$/.t - 读取本地文件evolution.js:150
entries = await readdir(agentsDir, { withFileTypes: true }) - 读取本地文件evolution.js:162
const text = await readFile(filename, 'utf8') - 写入本地文件evolution.js:164
await writeFile(filename, addEvolutionReportBlock(text), 'utf8') - 读取本地文件evolution.js:205
available = (await stat(join(root, MAIN_AGENT_FILENAME))).isFile() - 读取本地文件evolution.js:212
const config = JSON.parse(await readFile(join(root, directory, 'config.json'), 'utf8')) - 读取本地文件evolution.js:235
const text = await readFile(previousFile, 'utf8') - 写入本地文件evolution.js:236
await writeFile(previousFile, removeMainAgentBlock(text), 'utf8') - 读取本地文件evolution.js:240
const text = await readFile(target, 'utf8') - 写入本地文件evolution.js:241
await writeFile(target, addMainAgentBlock(text), 'utf8') - 写入本地文件evolution.js:251
await mkdir(configDir, { recursive: true }) - 写入本地文件evolution.js:252
await writeFile(join(configDir, 'config.json'), JSON.stringify({ mainAgentFile: next }, null, 2) + '\n', 'utf8') - 写入本地文件evolution.js:309
await mkdir(dirname(filename), { recursive: true }) - 读取本地文件scope.js:9
return (await stat(dir)).isDirectory() - 读取本地文件scope.js:32
await access(join(dir, marker)) - 读取本地文件scope.js:122
entries = await readdir(dir, { withFileTypes: true }) - 读取本地文件skills.js:16
const text = readFileSync(path, 'utf8')
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
@deepseek-ai/dsh@deepseek-ai/cordis@deepseek-ai/dsh-llm@deepseek-ai/dsh-subagent@deepseek-ai/dsh-tools@deepseek-ai/dsh-working-directory给这个插件打分还没有人投票↓
界面预览
2 张 · 点击查看大图功能亮点
- 按角色路由子代理
- 智能体独立进化
- 命令记忆黑白名单
展开完整介绍(146 字)↓
统一的 DeepSeek Harness 插件:按角色路由子代理 + 每个智能体独立进化(prefercmd/memory 当知识白名单/黑名单),重复任务直接从验证过的命令起步,省 token。统一子代理路由与进化:prefercmd/memory 充当知识白名单/黑名单,省 token。
README
由 DeepSeek 最新模型翻译生成展开完整文档(README 剩余 1 节)
dsh-evo-subagent dsh-evo-subagent — Route. Remember. Evolve. 不同工作区,不同人格;让熟悉的助手逐渐适应你。 工作区独立人格 · 自适应风格 · 由你掌控的偏好记忆 开发项目需要高效搭档,讨论需要独立判断,日常交流需要温和陪伴。可以共享一份熟悉的人格,也可以为每个工作区分别配置,或让某段对话拥有自己的风格。 可以做什么 | 功能 | 用途 | | 工作区人格 | 为不同项目设置人格名称、预设和风格要求。 | | 对话人格 | 跟随工作区,或让当前对话单独维护人格。 | | 自适应风格 | 根据你的明确反馈,逐渐调整语气、详略和互动方式。 | | 陪伴预设 | 温和陪伴、理性沉稳、轻松幽默、直接利落、细致引导。 | | 偏好记忆 | 用一份可编辑摘要保存你确认的通用交流习惯。 | | 角色协作 | 子代理路由到任意已注册模型,积累可复用的项目经验。 | 独立档案中的学习留在本范围内,不回写共享人格。新的长期偏好由你确认。 安装 dsh plugin add dsh-evo-subagent 需要 DeepSeek Harness ^0.2.1-rc.2 和 Node.js >=24.2.0。 如果之前安装的是 evo-subagent,先移除旧包,再安装新名称: dsh plugin remove evo-subagent dsh plugin add dsh-evo-subagent 原有人格、偏好、角色绑定和项目经验会继续复用。 开始使用 打开 DSH 的插件设置,进入 dsh-evo-subagent。 - 陪伴人格: 勾选每个工作区独立,直接列出工作区;展开项目,即可启用该人格、设置名称、预设和风格要求。取消勾选后使用共享人格,原有工作区档案保留。 - 对话人格: 在输入框旁打开人格,选择跟随工作区或仅此对话独立。新建独立对话档案默认暂停后台学习。 - 自适应风格: 选择自主探索并开启逐渐了解我,再用明确反馈给出方向,例如:“写代码时直接一些,聊烦恼时先听我说,再给建议。” - 用户习惯: 用一段简短摘要维护通用偏好。新的建议放在统一样式的折叠面板中,由你修改和确认。 - 子代理管理: 选择工作区,添加内置角色或自己的 agent 文件,再选择已注册模型。支持通过其他 provider 插件接入的 Codex、Claude Code 等模型。 人格设置保存后,后续回复即可采用。通用习惯有自己的共享范围,可以跨项目共享交流偏好,同时让各工作区保持独立人格。 数据与控制 档案保存在本机 DSH 用户目录。开启人格学习后,少量对话摘录会发送给所选模型进行后台整理,并产生额外模型用量。可以随时暂停学习、忘记偏好或恢复上次风格。 1.2 更新了什么 - 包名与 GitHub 仓库正式从 evo-subagent 更名为 dsh-evo-subagent。 - 工作区独立简化为一个勾选项,下方按工作区折叠管理。 - 简化对话人格选择,统一通用偏好更新面板的布局与动画。 完整更新日志 · 版本发布说明 操作演示 子代理管理操作演示 观看子代理管理视频。此录制介绍角色配置;人格设置请参考上方说明。 下载趋势 npm 累积下载量 图表合并统计 evo-subagent 与 dsh-evo-subagent 的 npm 累积下载量,每天更新。下载次数不等于独立用户数。 反馈问题 · MIT 许可证
预览分享卡片长什么样 ↓
跨工作区独立人格、自适应风格与陪伴预设:为项目和对话分别维护人格与确认后的通用偏好,支持任意 DSH…
相关插件 · 工具 / 效率
这是你的仓库?认领条目