DeepSeek Dot:长在微信里的 DeepSeek Harness…
29.6/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/23 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add oxmumu3/dsh-project-companion该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · platform
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 15 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 75 处,展示前 68 条)
- 发起网络请求src/client.js:626
const goalRequest=async(path,body)=>{const abort=new AbortController();goalRequests.add(abort);try{const response=await fetch(path,{method:'POST',cred - 发起网络请求src/client.js:697
const response=await fetch(endpoint,{method:body?'POST':'GET',credentials:'same-origin',redirect:'error',cache:'no-store',signal:AbortSignal.any([cont - 发起网络请求src/client.js:880
try{const response=await fetch(contextEndpoint,{method:body?'POST':'GET',credentials:'same-origin',redirect:'error',cache:'no-store',signal:AbortSigna - 发起网络请求src/client.js:1046
const check=async()=>{signal?.throwIfAborted?.();const response=await fetch(workbenchEndpoint,{method:'GET',credentials:'same-origin',redirect:'error' - 写入剪贴板src/client.js:1059
const copyCachedDraft=async notify=>{const value=workbenchCache.draft;if(!value)return;try{if(typeof navigator==='undefined'||typeof navigator.clipboa - 发起网络请求src/client.js:1134
const request=async(url,body)=>{const controller=new AbortController();controllers.current.add(controller);try{const response=await fetch(url,{method: - 发起网络请求src/wechat-route.js:36
const response=await fetch(new URL('/wechat/api/status',url),{method:'GET',redirect:'error',signal:controller.signal}); - 发起网络请求src/wechat-route.js:66
const response=await fetch(new URL('/wechat/api/status',url),{method:'GET',redirect:'error',signal:controller.signal}); - 读取本地文件src/project-memory.js:64
async function maybeStat(path){try{return await lstat(path);}catch(error){if(error?.code==='ENOENT')return null;throw error;}} - 读取本地文件src/project-memory.js:84
if(!stat&&create){try{await mkdir(cursor,{mode:0o700});}catch(error){if(error?.code!=='EEXIST')throw error;}stat=await lstat(cursor);} - 写入本地文件src/project-memory.js:84
if(!stat&&create){try{await mkdir(cursor,{mode:0o700});}catch(error){if(error?.code!=='EEXIST')throw error;}stat=await lstat(cursor);} - 读取本地文件src/project-memory.js:86
if(stat.isSymbolicLink()||!stat.isDirectory()||await realpath(cursor)!==cursor)throw new Error('Unsafe symlink or non-directory memory ancestor reject - 读取本地文件src/project-memory.js:222
try{current=lstatSync(path);}catch(error){if(suffix&&error?.code==='ENOENT')continue;throw error;} - 读取本地文件src/project-memory.js:224
accessSync(path,constants.R_OK); - 读取本地文件src/project-memory.js:276
accessSync(join(selected,'.dsh','dot-memory'),constants.R_OK|constants.W_OK|constants.X_OK); - 读取本地文件src/project-followup.js:90
let row;try{row=await lstat(path);}catch(error){if(!absent(error))throw error;if(!create)return false;await mkdir(path,{mode:0o700});row=await lstat(p - 写入本地文件src/project-followup.js:90
let row;try{row=await lstat(path);}catch(error){if(!absent(error))throw error;if(!create)return false;await mkdir(path,{mode:0o700});row=await lstat(p - 读取本地文件src/project-followup.js:98
if(await realpath(root)!==root)throw new Error('Expected canonical project root without symlinks'); - 读取本地文件src/project-followup.js:105
try{const stat=await lstat(join(dir,name));if(stat.isSymbolicLink()||!stat.isFile()||stat.nlink>1)throw new Error('Follow-up data file must be an owne - 写入本地文件src/project-followup.js:153
await writeFile(temporary,JSON.stringify(entry.meta)+'\n',{mode:0o600,flag:'wx'}); - 写入本地文件src/project-followup.js:155
await rename(temporary,join(entry.dir,'scope.json'));return true; - 删除本地文件src/project-followup.js:156
}finally{await rm(temporary,{force:true}).catch(()=>{});} - 读取本地文件src/project-followup.js:165
let meta;try{const value=await readFile(join(path.dir,'scope.json'),'utf8');if(value.length>8192)throw new Error('Follow-up ownership metadata exceeds - 读取本地文件src/project-followup.js:166
try{await lstat(join(path.dir,'alarms.json'));throw new Error('Follow-up store has no ownership metadata');}catch(e){if(absent(e))return null;throw e; - 读取本地文件src/project-followup.js:271
let meta;try{const text=await readFile(join(path.dir,'scope.json'),'utf8');if(text.length>8192)throw new Error('One-off metadata exceeds bound');meta= - 发起网络请求src/onboarding.js:205
return connection.fetch.register({path:'/api/project_companion/onboarding',methods:['GET','POST'],requestBody:'buffered',async fetch(request){ - 读取本地文件src/news-feeds.js:9
export const NEWS_FEEDS = Object.freeze(JSON.parse(readFileSync(new URL('../assets/news-feeds.json', import.meta.url), 'utf8')).map(Object.freeze)); - 发起网络请求src/news-feeds.js:168
? options.fetch(url.href, { redirect: 'manual', signal, headers: { 'user-agent': USER_AGENT, 'accept-encoding': 'identity' } }) - 发起网络请求src/personal-review-control.js:23
const off=connection.fetch.register({path:'/api/project_companion/review/attention',methods:['POST'],requestBody:'buffered',async fetch(request){ - 发起网络请求src/context-route.js:158
const stop=connection.fetch.register({path:'/api/project_companion/context',methods:['GET','POST'],requestBody:'buffered',async fetch(request){ - 发起网络请求src/workbench.js:184
const unregister=connection.fetch.register({path:'/api/project_companion/workbench',methods:['GET'],requestBody:'buffered',async fetch(request){ - 发起网络请求src/workbench.js:203
const unregister=connection.fetch.register({path:'/api/project_companion/desktop-conversation',methods:['GET'],requestBody:'buffered',async fetch(requ - 发起网络请求src/workbench-actions.js:188
const unregister=connection.fetch.register({path:'/api/project_companion/workbench/actions',methods:['POST'],requestBody:'buffered',async fetch(reques - 发起网络请求src/project-catalog-route.js:37
const off=connection.fetch.register({path:'/api/project_companion/catalog',methods:['POST'],requestBody:'buffered',async fetch(request){ - 发起网络请求src/workspace-access-route.js:17
const off=connection.fetch.register({path,methods:['POST'],requestBody:'buffered',async fetch(request){ - 读取本地文件src/sources.js:16
const stat = await lstat(cursor); - 读取本地文件src/sources.js:19
if (await realpath(absolute) !== absolute) throw new Error('Project root changed'); - 读取本地文件src/sources.js:33
const stat = await lstat(cursor); - 读取本地文件src/sources.js:37
const stat = await lstat(target); - 读取本地文件src/sources.js:39
if (await realpath(target) !== target) throw new Error('Source escaped project'); - 读取本地文件src/sources.js:45
if (await realpath(target) !== target) throw new Error('Source ancestor changed while reading'); - 读取本地文件vendor/yolo/src/storage/db.js:78
cachedSchema = readFileSync(SCHEMA_PATH, 'utf8') - 读取本地文件vendor/proactive/lib/store.js:222
const raw = await readFile(dataDir + "/" + STORE_FILE, "utf8"); - 读取本地文件vendor/proactive/lib/store.js:259
const rawHost = await readFile(dataDir + "/" + STATE_FILE, "utf8"); - 写入本地文件vendor/proactive/lib/store.js:296
await mkdir(this.dataDir, { recursive: true }); - 写入本地文件vendor/proactive/lib/store.js:299
await writeFile(tmp, JSON.stringify(this.state, null, 2) + "\n", "utf8"); - 写入本地文件vendor/proactive/lib/store.js:300
await rename(tmp, target); - 写入本地文件vendor/proactive/lib/store.js:303
await mkdir(this.dataDir, { recursive: true }); - 写入本地文件vendor/proactive/lib/store.js:304
await appendFile(this.dataDir + "/" + RUNS_FILE, JSON.stringify(record) + "\n", "utf8"); - 写入本地文件vendor/proactive/lib/store.js:340
await mkdir(this.dataDir, { recursive: true }); - 读取本地文件vendor/proactive/lib/store.js:351
const raw = await readFile(this.dataDir + "/" + RUNS_FILE, "utf8"); - 读取本地文件vendor/proactive/lib/config.js:50
const raw = readFileSync(dataDir + "/config.json", "utf8"); - 写入本地文件vendor/proactive/lib/config.js:71
await mkdir(dataDir, { recursive: true }); - 写入本地文件vendor/proactive/lib/config.js:74
await writeFile(tmp, JSON.stringify(merged, null, 2) + "\n", "utf8"); - 写入本地文件vendor/proactive/lib/config.js:75
await rename(tmp, target); - 读取本地文件src/bundled-wechat-storage.js:6
let info;try{info=await lstat(file);}catch(e){if(e.code==='ENOENT')return null;throw fail('storage_unavailable');} - 读取本地文件src/bundled-wechat-storage.js:8
try{return JSON.parse(await readFile(file,'utf8'));}catch{throw fail('storage_unavailable');} - 读取本地文件src/bundled-wechat-storage.js:15
const profileDir=await realpath(profile.dir),dir=join(profileDir,'dot-wechat'); - 写入本地文件src/bundled-wechat-storage.js:18
try{await mkdir(dir,{mode:0o700});created=true;}catch(e){if(e.code!=='EEXIST')throw fail('storage_unavailable');} - 读取本地文件src/bundled-wechat-storage.js:19
const info=await lstat(dir); - 写入本地文件src/bundled-wechat-storage.js:21
if(created)await writeFile(marker,JSON.stringify(owner)+'\n',{flag:'wx',mode:0o600}); - 读取本地文件src/installation.js:18
try{return JSON.parse(await readFile(file,'utf8'));}catch(e){if(e.code==='ENOENT')return null;throw failure('INVALID_LOCAL_METADATA',`无法读取有效安装元数据:${fi - 读取本地文件src/installation.js:62
const dir=await realpath(bundleDir),manifest=await optionalJson(join(dir,'bundle-manifest.json')); - 读取本地文件src/installation.js:69
const file=await realpath(join(dir,p.file));if(dirname(file)!==dir)throw failure('INVALID_MANIFEST','包文件不得通过符号链接指向分发目录之外。'); - 读取本地文件src/installation.js:70
if((await stat(file)).size>MAX_PACKAGE)throw failure('INVALID_PACKAGE','安装包超过本地校验大小限制。'); - 读取本地文件src/installation.js:71
const bytes=await readFile(file); - 执行外部命令来自配置/变量src/installation.js:90
const child=spawn(command,args,{...options,shell:false,stdio:['ignore','pipe','pipe']});let stdout='',stderr='',size=0; - 读取本地文件src/installation.js:122
try{text=await readFile(join(profile,'package.json'),'utf8');}catch(error){
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-system-prompt@deepseek-ai/dsh-storage@deepseek-ai/dsh-storage-json@deepseek-ai/schemastery@deepseek-ai/dsh-tools@deepseek-ai/dsh-commands@deepseek-ai/dsh-storage-domain@deepseek-ai/dsh-session@deepseek-ai/dsh-llm@deepseek-ai/dsh-agent给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
展开完整介绍(80 字)↓
DeepSeek Dot:长在微信里的 DeepSeek Harness 项目助理,项目记忆、只读跟进与明确交办。Community preview, MIT.
README
由 DeepSeek 最新模型翻译生成DeepSeek Dot · DSH 项目助理
长在微信里的 DeepSeek 项目助理:记住正在推进的本地项目,整理有来源的进展,按你的要求跟进,再把交办和执行回复串起来。
作者:牛村木木山。社区开源项目,非 DeepSeek 或 OpenAI 官方产品。当前版本为 0.6.0-preview.1,适合先用一个项目试跑。已验证与待验证的部分见验证记录。
安装
下载 macOS 安装包 · 本版本文件
1. 解压并保留整个目录。已有 Harness 时,先保存工作并正常退出,再双击 Install.command。
2. 没有 Harness 时,按同一入口前往官方 Releases 安装应用,完成后回到入口按回车继续。模型登录与配置由你本人完成。
3. 打开 Harness,确认微信桥接与项目助理均启用;在设置中打开「DeepSeek Dot」。
4. 已有微信连接直接沿用。首次连接时扫码确认,再从微信发一句「你好」建立会话。
5. 选择最多五个关注项目,预览资料,再生成首份简报。以后直接在微信里聊天。
安装包固定使用 dsh-wechat@0.11.0,已有同版本及配对原样保留;遇到其他桥接版本会停止。安装仍可能联网下载依赖。未签名、公证,不提供绕过 macOS 安全检查的步骤。
展开完整文档(README 剩余 1 节)
DeepSeek Dot · DSH 项目助理 长在微信里的 DeepSeek 项目助理:记住正在推进的本地项目,整理有来源的进展,按你的要求跟进,再把交办和执行回复串起来。 作者:牛村木木山。社区开源项目,非 DeepSeek 或 OpenAI 官方产品。当前版本为 0.6.0-preview.1,适合先用一个项目试跑。已验证与待验证的部分见验证记录。 安装 下载 macOS 安装包 · 本版本文件 1. 解压并保留整个目录。已有 Harness 时,先保存工作并正常退出,再双击 Install.command。 2. 没有 Harness 时,按同一入口前往官方 Releases 安装应用,完成后回到入口按回车继续。模型登录与配置由你本人完成。 3. 打开 Harness,确认微信桥接与项目助理均启用;在设置中打开「DeepSeek Dot」。 4. 已有微信连接直接沿用。首次连接时扫码确认,再从微信发一句「你好」建立会话。 5. 选择最多五个关注项目,预览资料,再生成首份简报。以后直接在微信里聊天。 安装包固定使用 dsh-wechat@0.11.0,已有同版本及配对原样保留;遇到其他桥接版本会停止。安装仍可能联网下载依赖。未签名、公证,不提供绕过 macOS 安全检查的步骤。支持的宿主是官方 DSH 0.2.0-rc.2 或 0.2.1-rc.2;Windows 整合安装尚未验证。 已有 Harness 也可以下载 companion tgz,通过官方插件页面添加;微信能力需要另行安装并启用 dsh-wechat@0.11.0。完整步骤见安装说明与首次使用。 能做什么 - 看项目:读取选定项目的固定说明、进度文件和启用后观察到的近期会话,汇报时保留来源、角色与更新时间。 - 记住上下文:保存目标、决策、阻塞和下一步建议;关闭重开后可恢复。它是有限项目笔记,不替代正式待办或验收记录。 - 明确交办:你说清楚要做什么后,把任务交给对应项目的可用会话,区分「已接收」与「执行回复」,并回到原微信对话。 - 提醒与日报:按明确时间设置一次提醒或固定日报,可以暂停、取消。 - 只读跟进:先试一次,或明确设置频率,让它核对项目变化、阻塞与下一步;没有值得告知的新情况时可静默结束。 - AI 资讯日报:从 92 个技术博客 RSS 中筛选 AI 与 Builder 相关内容,最多 3 篇重点+7 篇速览,保留原文链接和读取范围;支持预览、明确时间开启与取消。详见资讯日报。 - 连接个人资料:在原生设置中配置自己的账号,逐项启用 Gmail、Google 日历、Drive、Docs、Sheets、Slides、滴答与 flomo,按明确范围查询、读取或汇总,保留来源、时间和截断提示。当前为连接预览,真实账号仍需本人授权与验收。详见连接说明。 - 公开仓库动态:可选关联公开 GitHub 仓库,读取最新 release。 安装和首次引导都不会默认创建提醒、日报或周期跟进。首份简报及主动检查只允许读取选定项目的记忆和资料,不改文件、不派工。普通会话中,只有你明确交代执行时才派工。 直接这样说 - 「看看我有哪些本地项目。」 - 「看看写作项目今天变了什么,哪些还没验证?」 - 「记住这个项目的目标:先让日报说清变化、阻塞和下一步。」 - 「继续插件项目,先检查 README 里的验收项,不要改文件。」 - 「刚才交办的事怎么样了?」 - 「两分钟后提醒我检查结果。」 - 「每天早上九点发我关注项目的日报。」 - 「一分钟后只检查这个项目一次,告诉我变化、卡点和下一步。」 - 「每两小时看看这个项目,有值得关注的事再告诉我。」 - 「取消每日汇报,其他提醒保留。」 - 「取消这个项目的主动跟进。」 - 「先预览一期 AI 资讯日报,不发微信。」 - 「每天早上八点半给我发 AI 资讯,3 篇重点加 7 篇速览。」 - 「取消 AI 资讯日报,项目提醒保留。」 - 「查看我连接了哪些资料来源。」 - 「在当前对话启用 flomo,搜一下我关于插件生态的笔记。」 - 「看看未来 24 小时的 Google 日历安排。」 - 「列出滴答的项目,再查看我选的项目未完成任务。」 - 「搜索 Drive 中标题包含插件生态的文件。」 - 「读取这份 Google Sheets 的 A1:F30,保留来源,不改表。」 模型负责理解表达并选择项目;项目重名或存在多段工作会话时会澄清。无需记内部编号或复制目录路径。更多示例见快速开始。 与社区项目的关系 微信登录、收发、会话切换和权限问答复用 pan17/dsh-wechat,它仍是独立插件。项目记忆选取 dsh-yolo 的 SQLite 存储库,只读跟进选取 dsh-proactive 的调度与唤醒库;不需要另外启用这两个整包。 本项目把这些能力组合成「了解项目 → 汇报和提醒 → 明确交办 → 执行回复回到原入口」的使用流程,并增加有限来源、项目隔离、只读回合和首次引导。现有社区方案本身已具备多种远程控制、通知与跟进能力;本项目尚未做同任务的体验对照,不宣称唯一或普遍更好用。详见对照与复用。完整版权、固定来源和 MIT 许可证见第三方声明。 使用边界 - 只读取选定项目的有限资料,不扫描整台电脑,也不把全部历史读入内存。助手记录中的「完成」不自动变成测试、部署或交付证明。 - 电脑、Harness 与来源会话需要可用。休眠、退出、网络和通道限制都会影响触发或送达;长期运行与休眠重连仍待实测。 - 首版面向单用户微信部署。发送前核验唯一用户和原会话绑定,但核验与第三方发送不是原子操作,不支持多用户严格路由。 - 微信每个交互窗口最多连续主动推送 10 条;超出后由桥接缓存,用户正常发一条微信消息后恢复。不能保证无人回复时无限主动推送。 - 已排队或投递不确定的结果不自动重发;取消不能撤回已开始的回合或已交给通道的消息。通道报告发送不等于手机收到或已读。 - 固定日报与按变化主动跟进是两种独立计划,同时开启可能分别汇报;只需要一种时请取消另一种。 - 周期跟进频率为 30–1440 分钟,采用电脑时区的 23:00–08:00 免打扰。一次性检查为 30–300 秒、默认 60 秒;这次明确请求可在免打扰时段执行。 - Google、滴答和 flomo 仅通过固定官方 MCP 提供只读入口,默认关闭、不扫描账号。Google 官方 MCP 仍为 Developer Preview,需要自己的 Cloud Desktop OAuth client 与预览资格;flomo 需要 MAX 个人令牌。完成配置、验证接口和实际读到私人资料是不同状态。 - Slack、Notion、云端 iCloud 和 iMessage 尚未接入。本机 iCloud Drive 项目属于本地读取,不代表电脑关机后仍能访问 Apple 云端。 AI 资讯抓取只访问固定公开来源,候选标题、摘要及选中文章有界正文交给你配置的 Harness 模型;使用现有账户额度,通常每期两次模型调用。全文获取失败会标为 RSS 摘要依据,不把摘要当作事实已核实。默认不启用推送。 既有关注、提醒和交办账本保留在本地 DSH profile;项目记忆与跟进数据位于选定项目的 .dsh/dot-memory/、.dsh/dot-followup/ 和 .dsh/dot-checks/。共享项目目录时请排除这些运行数据。工具输入输出也可能进入宿主会话日志,模型使用方式受宿主配置影响。源码、测试和演示只含合成数据。 开发与许可 MIT。默认开发环境为 Node.js 22.13+;测试方法、双 SDK 回归与真实验收边界见验证记录。请通过官方插件管理器安装与启用,不手改 profile 或宿主 bundle 绕过管理器。 后续迭代 资讯日报与个人资料连接已接入当前预览版;持续优化真实使用与授权体验,见路线图。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
oxmumu3/dsh-project-companion
DeepSeek Dot:长在微信里的 DeepSeek Harness…
相关插件 · 平台集成
智能体工程课walkinglabs/learn-harness-engineering
一门项目制课程,教你搭建环境、管理状态、做验证、加控制机制,让 AI 编程智能体稳定干活。
★ 21,155已汉化DSH
71.7
视频翻译配音liuzhao1225/YouDub-webui
开源视频本地化工作台:导入视频,识别、翻译并逐句克隆原声,生成字幕和配音成片。
★ 5,792已汉化Cordis
71.4
失败经验库Ikalus1988/MisakaNet
📚 零依赖、由 git 支撑的微课程库,让 AI 智能体异步分享并检索经过验证的调试经验。| https://misakanet.org
★ 550已汉化DSH
71.2
IM 机器人接入xmanrui/dsh-im
让 DeepSeek Harness 触手可及 Connecting DeepSeek Harness
★ 3,170已汉化DeepSeek 客户端
71
桌面智能体工作区freestylefly/wesight
WeSight 是开源桌面控制台,面向本地 AI 智能体。它帮你安装或复用 Claude…
★ 933已汉化MCP
71
中国平台研究引擎Jesseovo/last30days-skill-cn
给 AI Agent 的中文互联网研究 Skill:检索 8 大平台最近 30…
★ 2,041已汉化DSH
70.7
这是你的仓库?认领条目