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

角色化协同面板 lumi-lei/interchange-plugin

DeepSeek Harness
lumi-lei72 天前有提交已提供中文文档扫描:含敏感能力

按角色生成信息,人工确认后经钉钉或 Webhook 发送

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

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add lumi-lei/interchange-plugin
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · chat
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 72 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 42 处,展示前 42 条)
  • 发起网络请求
    plugin/client/client.js:25
    const res = await fetch("/interchange-panel/status")
  • 发起网络请求
    plugin/client/client.js:43
    const res = await fetch(route, { method: "POST" })
  • 读取本地文件
    plugin/host/index.js:58
    const raw = await readFile(pidfilePath(), 'utf8')
  • 发起网络请求
    plugin/host/index.js:77
    const res = await fetch(`${config.apiBase}/health`, { signal: AbortSignal.timeout(3000) })
  • 读取本地文件
    plugin/host/index.js:118
    if (existsSync(builtEntry)) {
  • 读取本地文件
    plugin/host/index.js:120
    } else if (existsSync(tsxCli) && existsSync(devEntry)) {
  • 执行外部命令来自配置/变量
    plugin/host/index.js:126
    const child = spawn(process.execPath, commandArgs, {
  • 写入本地文件
    plugin/host/index.js:135
    await mkdir(path.dirname(pidfilePath()), { recursive: true })
  • 写入本地文件
    plugin/host/index.js:136
    await writeFile(pidfilePath(), JSON.stringify({ pid: child.pid, startedAt: Date.now() }))
  • 删除本地文件
    plugin/host/index.js:161
    await rm(pidfilePath(), { force: true })
  • 删除本地文件
    plugin/host/index.js:164
    await rm(pidfilePath(), { force: true })
  • 发起网络请求
    plugin/host/index.js:175
    res = await fetch(config.apiBase + pathname, options)
  • 发起网络请求
    plugin/host/index.js:249
    return s.request(pathname, options)
  • 读取本地文件
    plugin/host/index.js:540
    try { info = await stat(resolved) } catch { throw new Error(`文件不存在:${resolved}`) }
  • 读取本地文件
    plugin/host/index.js:543
    const buffer = await readFile(resolved)
  • 读取密钥环境变量
    server/config.ts:22
    tursoAuthToken: process.env.TURSO_AUTH_TOKEN?.trim() ?? '',
  • 读取密钥环境变量
    server/config.ts:23
    deepseekApiKey: process.env.DEEPSEEK_API_KEY ?? '',
  • 写入本地文件
    server/db.ts:95
    mkdirSync(dirname(config.sqlitePath), { recursive: true })
  • 读取本地文件
    server/dsg/catalog.ts:29
    text = await readFile(filePath, 'utf8');
  • 读取本地文件
    server/dsg/catalog.ts:81
    entries = await readdir(root);
  • 读取本地文件
    server/dsg/catalog.ts:90
    isDir = (await stat(dir)).isDirectory();
  • 读取本地文件
    server/dsg/catalog.ts:98
    if (!(await stat(skillFile)).isFile()) continue;
  • 读取本地文件
    server/dsg/catalog.ts:155
    if ((await stat(dir)).isDirectory()) return dir;
  • 读取本地文件
    server/dsg/catalog.ts:159
    if ((await stat(flat)).isFile()) return flat;
  • 读取本地文件
    server/dsg/generate.ts:27
    const raw = await readFile(path.join(dir, OWNER_FILE), 'utf8');
  • 读取本地文件
    server/dsg/generate.ts:37
    const entries = await readdir(config.agentPresetsDir, { withFileTypes: true });
  • 读取本地文件
    server/dsg/generate.ts:54
    return (await stat(dir)).isDirectory();
  • 读取本地文件
    server/dsg/generate.ts:74
    const info = await stat(source);
  • 删除本地文件递归
    server/dsg/generate.ts:105
    await rm(owned, { recursive: true, force: true });
  • 删除本地文件递归
    server/dsg/generate.ts:108
    await rm(presetDir, { recursive: true, force: true });
  • 写入本地文件
    server/dsg/generate.ts:109
    await mkdir(presetDir, { recursive: true });
  • 写入本地文件
    server/dsg/generate.ts:117
    await writeFile(path.join(presetDir, 'agent.cordis.yml'), renderAgentCordis(selection), 'utf8');
  • 写入本地文件
    server/dsg/generate.ts:118
    await writeFile(path.join(presetDir, 'preset.yml'), renderPresetMeta(role.label, role.dsgSkills.length), 'utf8');
  • 写入本地文件
    server/dsg/generate.ts:119
    await writeFile(path.join(presetDir, OWNER_FILE), JSON.stringify({ roleKey: role.key }), 'utf8');
  • 写入本地文件
    server/dsg/generate.ts:123
    await mkdir(presetSkillsDir, { recursive: true });
  • 删除本地文件递归
    server/dsg/generate.ts:140
    await rm(owned, { recursive: true, force: true });
  • 执行外部命令来自配置/变量
    server/markitdown.ts:48
    execFile(
  • 读取本地文件
    server/markitdown.ts:100
    output = await readFile(outputPath, 'utf8');
  • 写入本地文件
    server/markitdown.ts:117
    await writeFile(inputPath, input.buffer);
  • 删除本地文件递归
    server/markitdown.ts:140
    if (tempDir) await rm(tempDir, { recursive: true, force: true });
  • 发起网络请求
    server/routes.ts:350
    const response = await fetch(delivery.webhookUrl, {
  • 发起网络请求
    src/api.ts:108
    const response = await fetch(url, options);
扫描于 2026/11/3(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 按角色生成信息
  • 人工确认后发送
  • 支持钉钉与Webhook

面向 DeepSeek Harness 的本地优先、基于角色的协作工具,内置面板,交付需人工确认。

README

由 DeepSeek 最新模型翻译生成
interchange-harness 本地优先的角色化信息转化、知识沉淀与协同工具,自包含的独立项目:Interchange 服务端 + Web 应用 + DeepSeek Harness 插件(模型工具 + 面板 + preset 技能)。 一次输入可核实的事实,即可按不同角色的关注点与偏好生成可审阅、可编辑的针对性信息;经人工确认后通过 Webhook/钉钉发送,并把开发变更沉淀为类 OpenSpec 的长期规范。 项目结构 ├── plugin/ # DeepSeek Harness 插件包 interchange-dsh │ ├── host/ # 宿主半区:sidecar 生命周期 + /interchange-panel 桥 + interchange_* 工具 │ └── client/ # 浏览器半区:设置页分区 + 侧栏按钮 + 会话窗口悬浮面板 ├── preset/ # 「Interchange 协同」preset 模板(安装时替换 __WORKSPACE_DIR__) ├── skills/ core/ scripts/ # 7 个 DSH 技能及配套文档/脚本(安装时随 preset 部署) ├── server/ api/ # Express + SQLite 服务端(角色/联系人/解析/生成/发送/记录) ├── src/ # React W
展开完整文档(README 剩余 1 节)
interchange-harness

本地优先的角色化信息转化、知识沉淀与协同工具,自包含的独立项目:Interchange 服务端 + Web 应用 + DeepSeek Harness 插件(模型工具 + 面板 + preset 技能)。

一次输入可核实的事实,即可按不同角色的关注点与偏好生成可审阅、可编辑的针对性信息;经人工确认后通过 Webhook/钉钉发送,并把开发变更沉淀为类 OpenSpec 的长期规范。

项目结构

├── plugin/ # DeepSeek Harness 插件包 interchange-dsh │ ├── host/ # 宿主半区:sidecar 生命周期 + /interchange-panel 桥 + interchange_* 工具 │ └── client/ # 浏览器半区:设置页分区 + 侧栏按钮 + 会话窗口悬浮面板 ├── preset/ # 「Interchange 协同」preset 模板(安装时替换 __WORKSPACE_DIR__) ├── skills/ core/ scripts/ # 7 个 DSH 技能及配套文档/脚本(安装时随 preset 部署) ├── server/ api/ # Express + SQLite 服务端(角色/联系人/解析/生成/发送/记录) ├── src/ # React Web 应用前端 ├── tests/ # Vitest + Supertest 测试 ├── install.ps1 # 一键部署到 DeepSeek Harness(Windows) └── dist/ dist-server/ # 构建产物(npm run build / server:build,不入库)

快速开始(本地服务与 Web 应用)

npm install
copy .env.example .env # 填入 DEEPSEEK_API_KEY
npm run server:build
npm run build
npm start # 127.0.0.1:4120(API + Web 应用)
开发模式:npm run dev(前端 5173,代理 /api 到 4120)

文件解析(PPT/HTML/CSV)需要本机安装 MarkItDown:

python -m venv .venv
.venv\Scripts\pip install "markitdown[all]"
.env: MARKITDOWN_COMMAND=D:\path\to\project\.venv\Scripts\markitdown.exe

docx/pdf/xlsx/截图 OCR 不依赖 MarkItDown。

接入 DeepSeek Harness

前置条件(新设备):

1. 安装 Node.js(≥ 22,建议最新 LTS);
2. 安装并至少启动过一次 DeepSeek Harness(例如 npx @deepseek-ai/dsh web)——插件是 DSH 的扩展,本仓库不含 DSH 本身;
3. 本仓库已 npm install 并完成构建(见上节)。

npm run install:dsh
等价于:powershell -ExecutionPolicy Bypass -File install.ps1

安装器会(幂等,可重复运行):

1. 把 plugin/ 部署到本机所有 DSH 安装位置(profile 与 npx 缓存);
2. 在 %DSH_HOME%\.agent-presets\interchange\ 生成/刷新「Interchange 协同」preset(含技能,自动写入真实工作区路径);
3. 把宿主行写入 %DSH_HOME%\profiles\web\cordis.patch.yml(已存在则跳过;找不到补丁文件时打印片段供手工追加)。

默认工作区 = 本仓库自身目录;若仓库与服务分开部署,可指定:install.ps1 -WorkspaceDir D:\other\path。

然后:重启 DSH → 新建会话选择「Interchange 协同」模式。

使用方式

- 会话内工具(仅 Interchange 模式):interchange_status / _server_start / _server_stop、interchange_roles、interchange_contacts、interchange_parse、interchange_generate、interchange_send(强制 confirmed: true)、interchange_records 等 12 个工具;
- 会话内技能(仅 Interchange 模式):interchange-flow(OpenSpec 类沉淀工作流)、interchange-message-transformer、interchange-coding-context、interchange-human-confirmation 等 7 个技能;
- 面板(任何模式):DSH 左下角侧栏「Interchange」按钮 → 会话窗口悬浮面板;设置页亦有「Interchange」分区。均可一键启停服务并内嵌 Web 应用。

配置

插件行的 config.workspaceDir 指向本项目根目录(安装器自动写入仓库自身路径;若仓库与服务分开部署,用 install.ps1 -WorkspaceDir ... 指定)。未配置时启动/解析操作会给出明确报错。

按角色限定 DSH 技能

DSH 里技能装得太多时,可以让每个 Interchange 角色只启用一组技能,避免误用不想要的技能:

1. 在 Web 应用「角色」页创建/编辑角色,打开「DSH 技能」区,勾选要启用的技能(默认只勾选内置的 7 个 interchange 技能,全局技能按需勾选)。
2. 保存角色后,服务端会自动在 /.agent-presets// 生成同名 DSH 会话预设(默认 ~/.dsh/.agent-presets,可用环境变量 DSH_HOME 或 DSG_PRESETS_DIR 覆盖)。预设固定包含完整工具集。
3. 在 DSH「新建会话」时选择该角色预设,会话就只挂载勾选的技能,并以该角色的名称与关注点作为 persona。
4. 删除角色会同步删除其预设目录;「角色列表」顶部的「重新生成全部预设」可一键重刷所有启用的角色预设。

生成的预设带 interchange-role.json 所有权标记,只会增删自己生成的目录,绝不覆盖或删除其它预设;改名会自动重建到新 id。

安全与数据边界

- 浏览器端不接触模型 API Key;密钥仅存于本项目 .env(已 gitignore)。
- 上传文件默认本地解析;原始附件不会上传给外部模型。
- 生成内容不会自动发送:必须经人工审阅确认(interchange_send 只接受 confirmed: true)。
- SQLite 数据存于 data/interchange.sqlite(gitignore),与 Web 应用共享。

测试

npm test

许可证

本项目尚未声明许可证。公开发布前请补充(例如 MIT),并注意 skills/、core/、scripts/ 内容源自 Interchange 项目的 agent-skills-v2 目录。
预览分享卡片长什么样 ↓lumi-lei/interchange-plugin
分享 · DeepSeek Harness Hub
lumi-lei/interchange-plugin

按角色生成信息,人工确认后经钉钉或 Webhook 发送

这是你的仓库?认领条目

回到顶部