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

微信项目助理 oxmumu3/dsh-project-companion

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

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
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 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 绕过管理器。

后续迭代

资讯日报与个人资料连接已接入当前预览版;持续优化真实使用与授权体验,见路线图。
预览分享卡片长什么样 ↓oxmumu3/dsh-project-companion
分享 · DeepSeek Harness Hub
oxmumu3/dsh-project-companion

DeepSeek Dot:长在微信里的 DeepSeek Harness…

这是你的仓库?认领条目

回到顶部