把现有工作智能体变成在线分身:可移植的配置模板,外加一个 DeepSeek Harness 初始化器。
32.2/100
综合分
3
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/11/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add oxmumu3/ai-twin-starter该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · tool
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 1 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 61 处,展示前 61 条)
- 读取本地文件src/workspace.mjs:20
const stat = await lstat(current); - 读取本地文件src/workspace.mjs:24
const stat = await lstat(workspace); - 读取本地文件src/workspace.mjs:33
stat = await lstat(directory); - 读取本地文件src/workspace.mjs:59
const stat = await lstat(path); - 读取本地文件src/workspace.mjs:102
name, content: await readFile(new URL(`../templates/${name}`, import.meta.url)), - 写入本地文件src/workspace.mjs:105
await mkdir(target.directory, { mode: 0o700 }); - 读取本地文件src/workspace.mjs:170
return readFile(new URL('../templates/RUNBOOK.md', import.meta.url), 'utf8'); - 读取本地文件src/distill.mjs:22
const stat = await lstat(current); - 写入本地文件src/distill.mjs:31
try { await mkdir(path, { mode: 0o700 }); } catch (error) { if (error.code !== 'EEXIST') throw error; } - 读取本地文件src/distill.mjs:46
try { await lstat(path); return true; } catch (error) { if (error.code === 'ENOENT') return false; throw error; } - 读取本地文件src/distill.mjs:51
const stat = await lstat(path); - 写入本地文件src/distill.mjs:253
try { await mkdir(lock, { mode: 0o700 }); } catch (error) { - 写入本地文件src/distill.mjs:274
await mkdir(directory, { mode: 0o700 }); - 写入本地文件src/distill.mjs:287
await rename(temporary, join(base, 'current.json')); - 删除本地文件src/distill.mjs:288
} finally { if (await exists(temporary)) await unlink(temporary); } - 删除本地文件src/distill.mjs:294
} finally { await rmdir(lock); } - 读取密钥环境变量src/channel.mjs:34
export function createSlackAdapter({ token = process.env.AGENT_TWIN_SLACK_BOT_TOKEN, fetchImpl = globalThis.fetch, signal } = {}) { - 读取本地文件src/channel.mjs:134
const stat = await lstat(current); - 读取本地文件src/channel.mjs:139
const stat = await lstat(directory); - 读取本地文件src/channel.mjs:148
const stat = await lstat(path); - 读取本地文件src/channel.mjs:166
const existing = await lstat(path); - 写入本地文件src/channel.mjs:176
await rename(temporary, path); - 删除本地文件src/channel.mjs:179
await unlink(temporary).catch((error) => { if (error.code !== 'ENOENT') throw error; }); - 删除本地文件src/channel.mjs:445
if (lock) { await lock.close(); await unlink(lockPath); } - 读取本地文件src/materials.mjs:26
const stat = await lstat(current); - 读取本地文件src/materials.mjs:50
try { await lstat(path); return true; } catch (error) { if (error.code === 'ENOENT') return false; throw error; } - 写入本地文件src/materials.mjs:55
try { await mkdir(path, { mode: 0o700 }); } catch (error) { if (error.code !== 'EEXIST') throw error; } - 读取本地文件src/materials.mjs:61
const stat = await lstat(path); - 读取本地文件src/materials.mjs:111
try { stat = await lstat(path); } - 读取本地文件src/materials.mjs:137
const directory = await opendir(path); - 读取本地文件src/materials.mjs:155
const stat = await lstat(absolute); - 写入本地文件src/materials.mjs:262
try { await mkdir(lock, { mode: 0o700 }); } - 写入本地文件src/materials.mjs:270
await mkdir(directory, { mode: 0o700 }); - 写入本地文件src/materials.mjs:285
await rename(temporary, join(base, 'current.json')); - 删除本地文件src/materials.mjs:286
} finally { if (await exists(temporary)) await unlink(temporary); } - 删除本地文件src/materials.mjs:291
} finally { await rmdir(lock); } - 读取本地文件src/native-service.mjs:276
const stat = await lstat(resolve(cwd, ".agent-twin")); - 读取本地文件src/native-service.mjs:1343
if (resolve(cwd) !== (await realpath(cwd))) - 发起网络请求src/native-host.mjs:91
try{return await fetch(request);}catch{return response({error:'未确认完成操作,请刷新后核对。'},400);} - 读取本地文件src/native-store.mjs:20
stat = await lstat(current); - 写入本地文件src/native-store.mjs:23
await mkdir(current, { mode: 0o700 }); - 读取本地文件src/native-store.mjs:24
stat = await lstat(current); - 读取本地文件src/native-store.mjs:39
const stat = await lstat(path); - 读取本地文件src/native-store.mjs:92
const stat = await lstat(path); - 写入本地文件src/native-store.mjs:113
await rename(temporary, path); - 删除本地文件src/native-store.mjs:122
await unlink(temporary).catch((error) => { - 读取本地文件src/native-store.mjs:163
const stat = await lstat(target); - 删除本地文件src/native-store.mjs:193
await unlink(owned.target); - 写入本地文件src/native-store.mjs:206
await chmod(directory, 0o700); - 删除本地文件src/native-store.mjs:258
await unlink(lockPath); - 写入本地文件src/native-store.mjs:282
await chmod(directory, 0o700); - 删除本地文件src/native-workbench.mjs:96
await unlink(temporary).catch(error => { if (error.code !== 'ENOENT') throw error; }); - 读取本地文件src/project-structure.mjs:9
const stat=await lstat(path);if(stat.isSymbolicLink()||!stat.isFile()||stat.size>65536)throw new Error('Unsafe project structure document'); - 写入本地文件src/project-structure.mjs:13
try{await mkdir(path,{mode:0o700});}catch(error){if(error.code!=='EEXIST')throw error;} - 读取本地文件src/project-structure.mjs:14
const stat=await lstat(path);if(stat.isSymbolicLink()||!stat.isDirectory())throw new Error('Unsafe project structure directory or symlink'); - 写入本地文件src/project-structure.mjs:18
try{file=await open(tmp,constants.O_WRONLY|constants.O_CREAT|constants.O_EXCL|constants.O_NOFOLLOW,0o600);await file.writeFile(value);await file.sync( - 删除本地文件src/project-structure.mjs:18
try{file=await open(tmp,constants.O_WRONLY|constants.O_CREAT|constants.O_EXCL|constants.O_NOFOLLOW,0o600);await file.writeFile(value);await file.sync( - 读取本地文件src/project-structure.mjs:23
const state=join(cwd,'.agent-twin');const stat=await lstat(state);if(stat.isSymbolicLink()||!stat.isDirectory())throw new Error('Unsafe project state - 读取本地文件src/material-capture.mjs:11
for(const part of absolute.slice(root.length).split(sep).filter(Boolean)){current=join(current,part);const stat=await lstat(current);if(stat.isSymboli - 写入本地文件src/material-capture.mjs:18
export async function privateDirectory(path){await checkedDirectory(dirname(path));try{await mkdir(path,{mode:0o700});}catch(e){if(e.code!=='EEXIST')t - 读取本地文件src/material-capture.mjs:20
await checkedDirectory(dirname(path));const before=await lstat(path);if(before.isSymbolicLink()||!before.isFile()||before.size>limit)throw new Error('
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-tools@deepseek-ai/schemastery@deepseek-ai/dsh-llm给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
README
由 DeepSeek 最新模型翻译生成Agent Twin · 0.4 预发布
📖 设计思考与生态复盘:《DeepSeek Harness 要走向极客玩具还是大众普惠?》
在 DeepSeek Harness 内搭建并持续管理一个有来源、有权限边界的 AI 分身。原生工作台提供四个常驻模块:「项目沉淀、分身能力、通道连接、身份与规则」。首次搭建完成后,日常管理中可以继续补材料、更新能力、处理审批、检查回执。
原生版面向 DeepSeek Harness Web / Desktop 0.2.1-rc.2、0.2.1-rc.3、0.2.1-rc.4、0.2.1-rc.5 / Node.js 22.13+。Desktop 已验证安装启用、真实模型整理蒸馏、候选试跑与明确采用、日报和材料回流;真实 Slack 收发仍待验收,完整证据见 0.4 发布说明。其他宿主版本需重新验证。模型使用宿主配置,Slack 需要你自己的应用授权。完整路径见 原生运行手册。
用已有工作 Agent,按四步搭分身:准备分身材料 → 蒸馏分身 → 连接通道 → 设定权限。
你只需指定项目范围、补充必要事实,并完成自己的渠道授权。资料盘点、结构化整理、命令和 JSON 提案由当前 Agent 处理;不要求你先把项目整理成一套完美的知识库。
展开完整文档(README 剩余 1 节)
Agent Twin · 0.4 预发布
📖 设计思考与生态复盘:《DeepSeek Harness 要走向极客玩具还是大众普惠?》
在 DeepSeek Harness 内搭建并持续管理一个有来源、有权限边界的 AI 分身。原生工作台提供四个常驻模块:「项目沉淀、分身能力、通道连接、身份与规则」。首次搭建完成后,日常管理中可以继续补材料、更新能力、处理审批、检查回执。
原生版面向 DeepSeek Harness Web / Desktop 0.2.1-rc.2、0.2.1-rc.3、0.2.1-rc.4、0.2.1-rc.5 / Node.js 22.13+。Desktop 已验证安装启用、真实模型整理蒸馏、候选试跑与明确采用、日报和材料回流;真实 Slack 收发仍待验收,完整证据见 0.4 发布说明。其他宿主版本需重新验证。模型使用宿主配置,Slack 需要你自己的应用授权。完整路径见 原生运行手册。
用已有工作 Agent,按四步搭分身:准备分身材料 → 蒸馏分身 → 连接通道 → 设定权限。
你只需指定项目范围、补充必要事实,并完成自己的渠道授权。资料盘点、结构化整理、命令和 JSON 提案由当前 Agent 处理;不要求你先把项目整理成一套完美的知识库。
四步分别做什么
1. 准备分身材料:在选定项目内盘点元数据,明确选材后读取正文,整理背景、知识、判断、工作流、案例、工具和成果;保留出处与缺口。原生版调用宿主模型,通用 CLI 由当前 Agent 组织提案。
2. 蒸馏分身:从所选原始来源提炼知识、判断、工作流和工具卡,校验出处。原生版先生成候选,用具体任务试跑,再明确采用;材料包或候选生成都不等于能力已经验收。
3. 连接通道:用自己的 Slack 授权核对真实身份、允许频道和本人目的地。先做只读核验,原生版另行执行明确的回传测试并保存记录;通用工具路径保持只读。
4. 设定权限:按稳定身份、范围、动作和目的地设置规则。陌生身份拒绝,越权或不明确的请求交本人;原生服务还需本人明确启用,通用 channel-tick 继续只读 dry-run。
代码负责读取边界、来源校验、落盘、通道探测、权限与任务状态。材料可以边工作边积累;安装不会附带作者的业务知识、工具账号或个人记忆。
给 Agent 的一句话
其他 Agent:
请阅读 https://github.com/oxmumu3/ai-twin-starter 的 README 和全部 Releases(含预发布),选择已公开、与当前宿主兼容的版本,核对包及 SHA256SUMS,再按该版本 SETUP.md 带我准备材料、蒸馏分身、连接通道、设定权限。先完成只读验收。
DeepSeek Harness:
请阅读 https://github.com/oxmumu3/ai-twin-starter 的 README 和 https://github.com/oxmumu3/ai-twin-starter/releases (包含预发布),核对当前 Harness 版本,选择已经公开且兼容的安装包,验证 SHA256SUMS 后安装并回读启用状态。按对应版本运行手册带我搭建 AI 分身;若安装 0.4,打开原生「AI 分身」页面,完成首次搭建后继续日常管理。先核验模型、来源和 Slack 权限,再由我明确启用服务。
首次由你选定可读取范围,并完成自己的 Slack 授权和必要的身份/范围设置。不要在对话中粘贴 token。免开发指这些已实现步骤不要求你编写程序;不代表免授权、没有材料也能复制能力,或安装后自动常驻。
从零散项目开始
零散项目示例用独立编写的合成背景、笔记、旧报告和工具说明演示材料准备。待转换的 PDF 留作缺口,被排除的配置不作为知识来源;不要求先有成套规则文件。后续过程是盘点 → 选择与读取来源 → Agent 整理材料/缺口 → 校验落包 → 从原始来源蒸馏。
工作方法示例保留既有的四类蒸馏演示。它们均不包含真实业务资料或作者私有知识包。
Agent 使用的命令
要求 Node.js 22.13+。以下为兼容 0.3 的通用 CLI 路径,语义整理由当前 Agent 完成;0.4 原生工作台则调用宿主已配置的真实模型。下面的命令由 Agent 执行,用户无需手写提案。
git clone https://github.com/oxmumu3/ai-twin-starter.git
cd ai-twin-starter
node bin/agent-twin.mjs init --cwd /absolute/path/to/your/project
node bin/agent-twin.mjs materials-inventory --cwd /absolute/path/to/your/project --root .
node bin/agent-twin.mjs materials-prepare --cwd /absolute/path/to/your/project --entry notes.md --entry reports/previous.md
Agent 用 prepare 返回的真实内容组织 {project, materials, gaps},写本地私有提案,再运行 materials-apply --batch <batchId> --packet <proposal.json>。materials-status 核对材料包;materials-distill 重新读取已选原始来源,进入既有 distill-apply 流程。完整操作见 SETUP.md,卡片结构见 蒸馏说明,授权与只读接口见 通道说明。
本地工作流与材料回流
原生「分身能力」支持严格 CSV 输入的本地日报、正文预览和历史;「项目沉淀」支持材料提交、审阅、明确采纳,再单独纳入来源。这两项都由主人显式发起,远程来信不能触发;材料采纳后仍须重新整理、蒸馏、试跑并采用能力候选。通用命令行继续可用,命令与边界见 SETUP.md。
DSH 与市场
DSH 插件同时提供原生工作台和兼容 0.3 的 agent_twin 工具。后者使用宿主当前项目目录,并尊重只读/工作区权限。安装说明列出宿主版本和操作。
DSH 有官方提供的自定义插件市场功能。本项目提供自托管索引,可以添加到该发现页;这不代表本项目经过官方统一审核或收录。直接安装固定版本 .tgz 不需要先添加市场。
版本与验收边界
- 0.1.0:模板初始化;当时未实现内容蒸馏和通道连接,把它描述成完整搭建入口不准确。
- 0.2.0:增加显式资料蒸馏、来源刷新、Slack 只读探测和代码权限 dry-run,仍默认用户已有可直接选择的材料。
- 0.3.0:补上零散项目的材料盘点、整理、缺口与来源校验,并从已选原始来源衔接蒸馏。
- 0.4.0-preview.3:新增原生日报与材料回流管理,保留 preview.1 的四模块与服务机制。
- 0.4.0-preview.1:新增原生四模块、能力候选试跑与采用、授权知识问答/草稿/Slack 回传、审批、持久任务与恢复。仅作为预发布提供,下载是否可用以 全部 Releases 的实际资产为准;不依赖 /releases/latest 发现预发布。
0.3 通用工具中的正式业务执行、审批消费、对外回复和持续调度仍由原智能体与其授权工具承担,须分别验收。合成示例和测试不能证明真实 Slack 已收发或服务已全天在线;status 不把配置齐全标成已在线。
0.4 原生执行器只使用本次身份获准的来源卡片,完成问答、草稿和消息回传,不开放任意智能体工具调用。工具卡说明不等于已经接通或执行了工具。合成模型和隔离消息适配器的端到端验收及重启恢复已完成;Desktop 的实际安装和本地工作流另有实跑记录。真实 Slack 收发、真实同事体验及长期稳定性仍需验收。GitHub 预发布分发不代表官方市场收录或生产服务验收。
MIT,作者:牛村木木山(oxmumu3)。安装说明、原生运行手册、0.4 发布说明。旧验收记录、架构和通道说明描述通用 0.3 路径;原生版以本次发布说明及运行手册为准。
官方 rc.3 兼容维护
0.4.0-preview.3 保留已安装 0.4.0-preview.2 的全部运行代码,仅更新官方 Harness 0.2.1-rc.3 及其 SDK 兼容声明、版本和安装文案。不含正在开发的 0.5 新功能。现有能力、身份规则、材料及投递记录不迁移、不清除。详见兼容验收。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
oxmumu3/ai-twin-starter
把现有工作智能体变成在线分身:可移植的配置模板,外加一个 DeepSeek Harness 初始化器。
相关插件 · 工具 / 效率
破甲管控台kingcharleslzy-ai/dsh-purge
dsh-purge Community · DeepSeek Harness 社区维护版:宿主兼容、状态诊断、提示词管理、更新与本机备份回滚。基于小杨 / YuJunZhiXue 的 dsh-purge。
★ 4,330已汉化DeepSeek 客户端
74.5
网文长卷lingfengQAQ/webnovel-writer
基于 Claude Code 的长篇网文辅助创作系统,解决 AI 写作中的「遗忘」和「幻觉」问题,支持 200…
★ 7,636已汉化DSH
72.2
多智能体协作HKUDS/AutoSwarm
AutoSwarm: Unify Your Agents. Unify Your Context (Codex · Claude Code · DeepSeek Harness · Muse · Grok · WorkBuddy· nanobot · and more)
★ 2,349已汉化DSH
71.6
Vox 拼贴视频生成Alisa0808/vox-director
🎬 Vox Director拼贴动效导演
★ 2,129已汉化DSH
71.4
Agent 演化引擎Q00/ouroboros
智能体 OS:智能体自己变聪明,我们只守住底线:面试准入、分阶段评估、带预算的进化循环。MCP 服务器,14 种运行时:Claude Code、Codex CLI、Gemini CLI、OpenCode、Copilot、Kiro 等。
★ 6,311已汉化DSH
71.4
智能体运行框架路由HarnessRouter/harnessrouter
智能体 harness 的统一接口。
★ 3,984已汉化DSH
71.3
这是你的仓库?认领条目