🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

工具集 yiiilin/dsh-plugins

DeepSeek Harnessv0.1.3
yiiilin24 天前有提交已提供中文文档扫描:含敏感能力

一次装齐认证网关、Git 图谱与工作日志等八个模块

30.6/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/12 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查未通过:要求 dsh >=0.2.0-rc.2 <0.2.1,而最新版为 0.2.1-rc.2。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add yiiilin/dsh-plugins
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · market
装得上吗
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 24 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

要求 dsh >=0.2.0-rc.2 <0.2.1,而最新版为 0.2.1-rc.2

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包@yiln-dsh/dsh-plugins @ 0.1.3
✓Node 引擎要求 >=22 · 基线 Node 22.19 满足
✗dsh CLI 依赖要求 >=0.2.0-rc.2 <0.2.1 · 最新 0.2.1-rc.2 不兼容
✓入口文件main/exports/bin 已声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/20 02:49:33

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 67 处,展示前 66 条)
  • 读取本地文件
    pkgs/browser-vnc/browser.js:126
    return existsSync(socket) || existsSync(lock)
  • 写入本地文件
    pkgs/browser-vnc/browser.js:204
    writeFileSync(path, record, { mode: 0o600 })
  • 写入本地文件
    pkgs/browser-vnc/browser.js:205
    chmodSync(path, 0o600)
  • 删除本地文件递归
    pkgs/browser-vnc/browser.js:341
    return rm(dir, { recursive: true, force: true })
  • 写入本地文件
    pkgs/browser-vnc/browser.js:798
    mkdirSync(instanceDir, { recursive: true, mode: 0o700 })
  • 删除本地文件
    pkgs/browser-vnc/browser.js:898
    await rm(path, { force: true })
  • 写入剪贴板
    pkgs/browser-vnc/client.js:1191
    function writeClipboard(text) {
  • 写入剪贴板
    pkgs/browser-vnc/client.js:1193
    return navigator.clipboard.writeText(text).then(() => true, () => legacyWriteClipboard(text))
  • 写入剪贴板
    pkgs/browser-vnc/client.js:1510
    void Promise.resolve(writeClipboard(text)).catch(() => undefined)
  • 读取剪贴板
    pkgs/browser-vnc/client.js:1645
    text = await navigator.clipboard.readText()
  • 读取本地文件
    pkgs/browser-vnc/index.js:671
    body = readFileSync(path)
  • 删除本地文件递归
    pkgs/browser-vnc/instance-dirs.js:150
    remove = async (path) => rm(path, { recursive: true, force: true }),
  • 读取本地文件
    pkgs/browser-vnc/instance-dirs.js:157
    const list = typeof scan === 'function' ? scan : async () => readdir(base, { withFileTypes: true })
  • 发起网络请求
    pkgs/delegate-mode/runtime.js:201
    async fetch(request) {
  • 读取本地文件
    pkgs/delegate-mode/store.js:22
    try { return validatePolicy(JSON.parse(await readFile(pathFor(id), 'utf8')), id) }
  • 写入本地文件
    pkgs/delegate-mode/store.js:29
    await mkdir(directory, { recursive: true, mode: 0o700 })
  • 读取本地文件
    pkgs/delete-session/index.js:266
    const info = await stat(location.path);
  • 读取本地文件
    pkgs/delete-session/index.js:275
    const info = await stat(location.sessionDir);
  • 删除本地文件递归
    pkgs/delete-session/index.js:281
    await rm(location.sessionDir, { recursive: true, force: true });
  • 发起网络请求
    pkgs/gateway/client.js:380
    const response = await fetch(new URL(path.replace(/^ /u, ''), document.baseURI), {
  • 执行外部命令来自配置/变量
    pkgs/gateway/index.js:116
    const spawnChild = (spec) => spawn(spec.command, spec.args, {
  • 发起网络请求
    pkgs/gateway/index.js:392
    const answer = await fetch(tokenized, { redirect: 'manual' })
  • 读取本地文件
    pkgs/gateway/index.js:429
    readFile: (path) => readFile(path, 'utf8'),
  • 发起网络请求
    pkgs/gateway/index.js:457
    const answer = await fetch(ready.url, { redirect: 'manual' })
  • 读取本地文件
    pkgs/gateway/index.js:538
    patch = await readFile(patchPath, 'utf8')
  • 读取本地文件
    pkgs/gateway/index.js:548
    const readModelRows = async () => extractModelRows(await readFile(patchPath, 'utf8'))
  • 读取本地文件
    pkgs/gateway/index.js:559
    const patch = await readFile(patchPath, 'utf8')
  • 写入本地文件
    pkgs/gateway/index.js:561
    await writeFile(backup, patch, { mode: 0o600 })
  • 写入本地文件
    pkgs/gateway/index.js:562
    await writeFile(patchPath, replaceModelRows(patch, rows), { mode: 0o600 })
  • 读取本地文件
    pkgs/gateway/index.js:697
    const text = await readFile(credentialsPath, 'utf8')
  • 读取本地文件
    pkgs/gateway/index.js:718
    const text = await readFile(path, 'utf8')
  • 写入本地文件
    pkgs/gateway/index.js:727
    await mkdir(dirname(path), { recursive: true })
  • 写入本地文件
    pkgs/gateway/index.js:730
    await writeFile(temporary, serializeRegistry(environments), { mode: 0o600 })
  • 写入本地文件
    pkgs/gateway/index.js:731
    await rename(temporary, path)
  • 发起网络请求
    pkgs/gateway/lib/admin.js:454
    const sent = hub.request(envId, {
  • 读取本地文件
    pkgs/gateway/lib/inventory.js:40
    const manifest = JSON.parse(await readFile(join(profileDir, 'package.json'), 'utf8'))
  • 读取本地文件
    pkgs/gateway/lib/inventory.js:53
    const manifest = JSON.parse(await readFile(join(profileDir, 'package.json'), 'utf8'))
  • 读取本地文件
    pkgs/gateway/lib/inventory.js:70
    entries = await readdir(skillsRoot, { withFileTypes: true })
  • 读取本地文件
    pkgs/gateway/lib/inventory.js:80
    const body = await readFile(join(dir, 'SKILL.md'), 'utf8')
  • 读取本地文件
    pkgs/gateway/lib/inventory.js:106
    return (await stat(path)).isDirectory()
  • 读取本地文件
    pkgs/gateway/lib/systemd.js:122
    if (existsSync('/run/systemd/system') === false) {
  • 读取本地文件
    pkgs/gateway/lib/systemd.js:131
    const previous = await readFile(path, 'utf8').catch(() => undefined)
  • 写入本地文件
    pkgs/gateway/lib/systemd.js:139
    await writeFile(temporary, text, { mode: 0o644 })
  • 写入本地文件
    pkgs/gateway/lib/systemd.js:140
    await writeFile(path, text, { mode: 0o644 })
  • 删除本地文件
    pkgs/gateway/lib/systemd.js:141
    await rm(temporary, { force: true })
  • 删除本地文件
    pkgs/gateway/lib/systemd.js:158
    await rm(path, { force: true })
  • 执行外部命令固定命令
    pkgs/gateway/lib/systemd.js:170
    execFile('systemctl', finalArgs, { timeout: 20_000 }, (error, stdout, stderr) => {
  • 发起网络请求
    pkgs/git-graph/client.js:1025
    const response = await fetch(new URL(`_dsh/git-graph/${method}`, document.baseURI), options);
  • 读取本地文件
    pkgs/supervisor/index.js:374
    const raw = await readFile(path, "utf8");
  • 读取本地文件
    pkgs/supervisor/index.js:476
    readFile(`/proc/${pid}/stat`, "utf8"),
  • 读取本地文件
    pkgs/supervisor/index.js:477
    readFile("/proc/sys/kernel/random/boot_id", "utf8"),
  • 写入本地文件
    pkgs/supervisor/index.js:494
    await mkdirAsync(directory, { recursive: true, mode: 0o700 });
  • 读取本地文件
    pkgs/supervisor/index.js:516
    owner = JSON.parse(await readFile(lockPath, "utf8"));
  • 读取本地文件
    pkgs/supervisor/index.js:521
    info = await statAsync(lockPath);
  • 删除本地文件
    pkgs/supervisor/index.js:528
    await unlinkAsync(lockPath);
  • 删除本地文件
    pkgs/supervisor/index.js:543
    await unlinkAsync(lockPath);
  • 删除本地文件
    pkgs/supervisor/index.js:550
    await unlinkAsync(temporary);
  • 删除本地文件
    pkgs/supervisor/index.js:554
    await unlinkAsync(temporary).catch(() => {});
  • 读取本地文件
    pkgs/supervisor/index.js:562
    const owner = JSON.parse(await readFile(lease.path, "utf8"));
  • 删除本地文件
    pkgs/supervisor/index.js:568
    await unlinkAsync(lease.path);
  • 写入本地文件
    pkgs/supervisor/index.js:602
    await mkdirAsync(dirname(target), { recursive: true, mode: 0o700 });
  • 写入本地文件
    pkgs/supervisor/index.js:604
    await renameAsync(temporary, target);
  • 删除本地文件
    pkgs/supervisor/index.js:606
    await unlinkAsync(temporary).catch(() => {});
  • 写入本地文件
    pkgs/supervisor/index.js:680
    await mkdirAsync(directory, { recursive: true, mode: 0o700 });
  • 写入本地文件
    pkgs/supervisor/index.js:689
    await renameAsync(temporary, path);
  • 发起网络请求
    pkgs/supervisor/lib/client.js:275
    const response = await fetch(new URL(path.replace(/^ /u, ""), document.baseURI), options);
扫描于 2026/11/4(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/schemastery@deepseek-ai/dsh@deepseek-ai/dsh-agent@deepseek-ai/dsh-agent-loop@deepseek-ai/dsh-agent-preset-registry@deepseek-ai/dsh-api-remotes@deepseek-ai/dsh-api-session-controller@deepseek-ai/dsh-atomic-write@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-ui-conversation
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 集成认证网关
  • Git图谱
  • 工作日志

README

由 DeepSeek 最新模型翻译生成
@yiln-dsh/dsh-plugins 一个 DSH Web 插件包,内含八个内部功能模块。这个工作区就是项目根目录;依赖、版本、构建、测试和发布都在这里管理,不在各个功能目录里。 当前版本:0.1.2(已作为 public 发布到 npm)。已验证目标:DSH 0.2.0-rc.2。 功能 | 模块 | Loader row ID | 用途 | | Auth Webserver | webserver-auth | 带认证的局域网网关,TOTP/Passkeys,PWA,移动端布局和配置编辑器。 | | Delete Session | dsh-delete-session | 带确认的单条/批量删除,级联删除子代理,并保护持久化路径。 | | Git Graph | dsh-git-graph | 右侧栏显示 Git 历史、工作区改动和文件 diff。 | | Mentor | dsh-mentor | 隔离的无工具咨询,每会话串行队列,可持久重放,全局设置。 | | Session List Cache | session-list-cache | 合并并缓存并发的会话枚举。 | | Web Daemon | web-daemon | Systemd 管理、服务器指标和中断会话恢复。
展开完整文档(README 剩余 1 节)
@yiln-dsh/dsh-plugins

一个 DSH Web 插件包,内含八个内部功能模块。这个工作区就是项目根目录;依赖、版本、构建、测试和发布都在这里管理,不在各个功能目录里。

当前版本:0.1.2(已作为 public 发布到 npm)。已验证目标:DSH 0.2.0-rc.2。

功能

| 模块 | Loader row ID | 用途 |
| Auth Webserver | webserver-auth | 带认证的局域网网关,TOTP/Passkeys,PWA,移动端布局和配置编辑器。 |
| Delete Session | dsh-delete-session | 带确认的单条/批量删除,级联删除子代理,并保护持久化路径。 |
| Git Graph | dsh-git-graph | 右侧栏显示 Git 历史、工作区改动和文件 diff。 |
| Mentor | dsh-mentor | 隔离的无工具咨询,每会话串行队列,可持久重放,全局设置。 |
| Session List Cache | session-list-cache | 合并并缓存并发的会话枚举。 |
| Web Daemon | web-daemon | Systemd 管理、服务器指标和中断会话恢复。 |
| Session Mode | session-mode | 每会话的 normal / delegate-writes 权限:受限主智能体拿到裁剪过的工具目录外加执行守卫,并配独立的系统提示词。 |
| Work Journal | dsh-work-journal | 按日/周/月生成本 harness 的用途报告,从持久会话存储投影而来:一个 work_journal 工具、一条 /journal 命令,以及右侧栏面板。 |

安装后由单个 bundle 拥有这些模块。它们各自的 Cordis row 保留独立的 Config schema 和现有设置命名空间。Auth 会话、Passkeys、Mentor 日志、恢复记录、HTTP 路由和 Git 标签页标识都沿用原来的名称和位置。

安装

安装已发布的包:

dsh plugin --profile web add @yiln-dsh/dsh-plugins@0.1.2

或者安装当前工作区构建:

npm install
npm run build
dsh plugin --profile web add file:/path/to/dsh-plugin

源码改动后,刷新本地 file: 安装。Host 改动要重启 daemon,Client 改动要刷新浏览器;不要以为运行中的进程会自动加载复制过来的文件。

file: 目录依赖从 lockfile 解析,所以即使包里新增了文件,pnpm 也可能报 Already up to date,什么都不投影。重新添加前先删掉已投影的包,否则新模块不会出现在组合后的配置档里:

rm -rf "$DSH_HOME/profiles/web/node_modules/@yiln-dsh/dsh-plugins"
dsh plugin --profile web add file:/path/to/dsh-plugin

重启前先确认组合后的树里带有该 row:

dsh --profile web --dump-config | grep -c session-mode

从六个包迁移

不要把这套套件和六个旧 bundle 同时启用:它们的 row ID、路由和注册会重叠。先备份 Web 配置档和插件状态,从独立进程停掉 worker,移除旧的六个包,安装套件,并迁移用户补丁里显式写死的旧 name 覆盖项。保留所有 Config 值、行 ID 和状态目录。重启并刷新 GUI。

迁移辅助脚本默认是 dry-run,通过显式模式切换:

node scripts/migrate-profile.mjs --check /absolute/profile/cordis.patch.yml
node scripts/migrate-profile.mjs --write /absolute/profile/cordis.patch.yml

它只改动已知的 Loader 模块地址,保留注释和 !!js,绝不求值表达式,并校验其他配置值保持不变。它不会卸载或安装包,也不会删除持久化状态。

会话模式

用 composer 工具栏里权限控件右侧的开关,或者 /agent-mode on 和 /agent-mode off。打开委托写入后,主智能体变为只读,由 worker 执行编辑和命令执行:未经审计的工具会从主智能体面向模型的目录中移除,即使仍有调用进来,单调守卫也会拒绝。Agent Teams 协调工具对负责协调的主智能体保持可用。开关标签和两个状态词都通过 Client locale 字典本地化。两种模式各有独立的 normalPrompt 和 delegateWritesPrompt Config 字段。选择在重启后保留;worker 的权限和提示词使用创建时捕获的模式。
配置和边界见 Session Mode。

工作日志

直接问 harness 你做过什么,不用提前准备任何东西。日志读取的就是对话回放所用的同一批会话日志,所以它覆盖安装之前的历史,也不会和实际发生的事对不上。

- 在对话里:问「我昨天做了什么」/「总结一下这周」,智能体会调用 work_journal。
- 不用模型:/journal week、/journal 2026-09-13、/journal status、/journal rebuild。
- 在 GUI 里:右侧 Sidebar 的「工作日志」标签页,带范围切换、项目筛选和复制 Markdown 操作。

重启后的第一次查询会构建整个索引;之后的遍历只读变化的部分。如果报告无法从整个存储构建,它会明说,而不是悄悄少算。报告统计你自己的提示词、工具调用、写入的文件、运行的命令、每日活跃窗口和按项目汇总。投影规则、增量索引和配置见 Work Journal。

开发

npm run build
npm run check
npm test
DSH_EDITOR_QA_URL=http://isolated-test-host:3095/ npm run test:editor
DSH_MODE_QA_URL=http://127.0.0.1:<isolated-port>/ npm run test:modes:browser
npm pack

浏览器测试使用 Auth 模块里的合成 fixture,并拒绝生产端口。不要把会改数据的测试流程指向生产环境。

目录结构

- package.json:唯一的插件包清单和版本。
- cordis.patch.yml:根发现锚点和八行功能声明。
- index.js:空操作的 Host 发现锚点。
- src/<feature>/:内部 Host/Client 实现和功能测试。
- src/features.js:用于组合与迁移检查的规范标识。
- client.js:生成的单一 Client 入口;请改功能源码,不要改这里。
- scripts/:客户端生成、校验和配置档迁移。
- test/:根包契约和迁移契约。
- docs/:功能说明、兼容性调研和验证证据。
- skills/:仓库技能素材,不是第二个插件包。

文档驱动开发源码 用一套小而统一的文档布局,保存人类可读的领域/模块契约。它的模块示例 展示了公开入口、状态归属和限定范围的文档维护。运行 node skills/doc-driven-development/scripts/check.mjs 可执行该技能的隔离包回归测试;这些素材不会被插件构建安装或发布,现有项目文档也不会自动迁移。

发布

提升根版本号,同时更新本 README 和兼容性说明。运行构建、语法检查、测试,再做一次打包安装冒烟测试。只在收到请求时才提交和推送;只在明确要求发布后,才用 npm publish --access public 发布。内部模块没有独立版本号。
预览分享卡片长什么样 ↓yiiilin/dsh-plugins
分享 · DeepSeek Harness Hub
yiiilin/dsh-plugins

一次装齐认证网关、Git 图谱与工作日志等八个模块

这是你的仓库?认领条目

回到顶部