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

数模三人协同 dawn-471/MMCAS

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

数学建模竞赛三人协同系统:三角色 Agent × 任务卡 DAG 调度 × git 同步 × 跨设备控制 |…

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

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

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装;安装清单取自 packages/dsh-panel-mmcas/package.json。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dawn-471/MMCAS
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

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

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

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

未发布到 npm registry,仅可从源码安装;安装清单取自 packages/dsh-panel-mmcas/package.json

展开查看检查明细 ↓

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

✗npm 包@mmcas/dsh-panel(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/11 22:24:37

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 203 处,展示前 97 条)
  • 读取本地文件
    packages/core/profile-patch.mjs:23
    try { return normalizeText(readFileSync(file, 'utf8')); } catch { return fallback; }
  • 写入本地文件
    packages/core/profile-patch.mjs:27
    mkdirSync(path.dirname(file), { recursive: true });
  • 写入本地文件
    packages/core/profile-patch.mjs:28
    writeFileSync(file, normalizeText(text).replace(/ *$/, '\n'), 'utf8');
  • 写入本地文件
    packages/core/profile-patch.mjs:181
    mkdirSync(profileDir, { recursive: true });
  • 读取本地文件
    packages/core/profile-patch.mjs:183
    if (!existsSync(manifestPath)) {
  • 写入本地文件
    packages/core/profile-patch.mjs:190
    writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\n', 'utf8');
  • 读取本地文件
    packages/core/profile-patch.mjs:193
    if (!existsSync(patchPath)) {
  • 读取本地文件
    packages/core/profile-patch.mjs:201
    if (!existsSync(workspacePath)) {
  • 读取本地文件
    packages/core/profile-patch.mjs:205
    if (!existsSync(rootPath)) {
  • 读取本地文件
    packages/core/profile-patch.mjs:214
    try { manifest = JSON.parse(readFileSync(manifestPath, 'utf8')); } catch {}
  • 写入本地文件
    packages/core/profile-patch.mjs:227
    writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\n', 'utf8');
  • 写入本地文件
    packages/core/profile-patch.mjs:242
    mkdirSync(path.dirname(linkPath), { recursive: true });
  • 删除本地文件递归
    packages/core/profile-patch.mjs:247
    rmSync(linkPath, { recursive: true, force: true });
  • 删除本地文件递归
    packages/core/profile-patch.mjs:272
    rmSync(full, { recursive: true, force: true });
  • 读取本地文件
    packages/core/register-workspace.mjs:32
    if (existsSync(regFile)) {
  • 读取本地文件
    packages/core/register-workspace.mjs:33
    reg = JSON.parse(readFileSync(regFile, 'utf8'));
  • 写入本地文件
    packages/core/register-workspace.mjs:35
    mkdirSync(storages, { recursive: true });
  • 写入本地文件
    packages/core/register-workspace.mjs:58
    writeFileSync(regFile, JSON.stringify(reg, null, 2));
  • 读取本地文件
    packages/core/switch-provider.mjs:190
    if (!existsSync(configPath)) {
  • 读取本地文件
    packages/core/switch-provider.mjs:194
    const providers = parseProviders(readFileSync(configPath, 'utf8'));
  • 读取本地文件
    packages/core/switch-provider.mjs:235
    const credText = existsSync(credPath) ? readFileSync(credPath, 'utf8') : 'version: 1\nrefs:\n';
  • 读取本地文件
    packages/core/switch-provider.mjs:235
    const credText = existsSync(credPath) ? readFileSync(credPath, 'utf8') : 'version: 1\nrefs:\n';
  • 读取本地文件
    packages/core/switch-provider.mjs:308
    if (!existsSync(manifestPath)) {
  • 读取本地文件
    packages/core/switch-provider.mjs:324
    const legacyText = existsSync(settingsPath) ? readFileSync(settingsPath, 'utf8') : (explicitSettings ? '' : null);
  • 写入本地文件
    packages/core/switch-provider.mjs:341
    mkdirSync(path.dirname(settingsPath), { recursive: true });
  • 写入本地文件
    packages/core/switch-provider.mjs:342
    writeFileSync(settingsPath, legacyNew);
  • 写入本地文件
    packages/core/switch-provider.mjs:344
    mkdirSync(path.dirname(credPath), { recursive: true });
  • 写入本地文件
    packages/core/switch-provider.mjs:345
    writeFileSync(credPath, newCred);
  • 读取本地文件
    packages/core/test-profile-patch.mjs:28
    const manifest = JSON.parse(readFileSync(path.join(profile, 'package.json'), 'utf8'));
  • 读取本地文件
    packages/core/test-profile-patch.mjs:32
    check('P1 pnpm-workspace/cordis.yml 已生成', existsSync(path.join(profile, 'pnpm-workspace.yaml')) && existsSync(path.join(profile, 'cordis.yml')));
  • 写入本地文件
    packages/core/test-profile-patch.mjs:94
    mkdirSync(target, { recursive: true });
  • 写入本地文件
    packages/core/test-profile-patch.mjs:95
    writeFileSync(path.join(target, 'package.json'), '{"name":"@mmcas/dsh-panel"}\n');
  • 读取本地文件
    packages/core/test-profile-patch.mjs:99
    check('P4 junction 创建', lstatSync(link).isSymbolicLink());
  • 写入本地文件
    packages/core/test-profile-patch.mjs:101
    mkdirSync(brokenTarget, { recursive: true });
  • 写入本地文件
    packages/core/test-profile-patch.mjs:102
    writeFileSync(path.join(brokenTarget, 'package.json'), '{}\n');
  • 删除本地文件递归
    packages/core/test-profile-patch.mjs:104
    rmSync(brokenTarget, { recursive: true, force: true });
  • 读取本地文件
    packages/core/test-profile-patch.mjs:106
    check('P4 失效链接被清理', removed.some((p) => p.includes('dsh-gone')) && !existsSync(path.join(profile, 'node_modules', '@mmcas', 'dsh-gone')));
  • 删除本地文件递归
    packages/core/test-profile-patch.mjs:110
    try { rmSync(ROOT, { recursive: true, force: true }); } catch {}
  • 写入本地文件
    packages/core/test-switch-provider.mjs:13
    mkdirSync(cfgDir);
  • 写入本地文件
    packages/core/test-switch-provider.mjs:15
    writeFileSync(path.join(cfgDir, 'providers.yaml'), `providers:
  • 写入本地文件
    packages/core/test-switch-provider.mjs:31
    writeFileSync(path.join(tmp, 'settings.yaml'), `ui-onboarding:
  • 写入本地文件
    packages/core/test-switch-provider.mjs:38
    writeFileSync(path.join(tmp, '.credentials.yaml'), `version: 1
  • 执行外部命令来自配置/变量
    packages/core/test-switch-provider.mjs:49
    return spawnSync(process.execPath, [SW, ...args], { encoding: 'utf8' });
  • 读取本地文件
    packages/core/test-switch-provider.mjs:62
    const settings = readFileSync(path.join(tmp, 'settings.yaml'), 'utf8');
  • 读取本地文件
    packages/core/test-switch-provider.mjs:63
    const cred = readFileSync(path.join(tmp, '.credentials.yaml'), 'utf8');
  • 读取本地文件
    packages/core/test-switch-provider.mjs:87
    const settings2 = readFileSync(path.join(tmp, 'settings.yaml'), 'utf8');
  • 写入本地文件
    packages/core/test-switch-provider.mjs:93
    writeFileSync(path.join(cfgDir, 'providers2.yaml'), `providers:
  • 写入本地文件
    packages/core/test-switch-provider.mjs:105
    writeFileSync(settings3, `llm-deepseek:
  • 读取本地文件
    packages/core/test-switch-provider.mjs:115
    const s3 = readFileSync(settings3, 'utf8');
  • 读取本地文件
    packages/core/test-switch-provider.mjs:132
    const s4 = readFileSync(settings3, 'utf8');
  • 读取本地文件
    packages/core/test-switch-provider.mjs:151
    const s5 = readFileSync(settings5, 'utf8');
  • 删除本地文件递归
    packages/core/test-switch-provider.mjs:262
    rmSync(tmp, { recursive: true, force: true });
  • 写入本地文件
    packages/core/write-config.mjs:30
    mkdirSync(cfgDir, { recursive: true });
  • 写入本地文件
    packages/core/write-config.mjs:43
    writeFileSync(path.join(cfgDir, 'sync.config.json'), JSON.stringify(syncCfg, null, 2));
  • 读取本地文件
    packages/core/write-config.mjs:48
    if (!existsSync(target)) copyFileSync(example, target);
  • 写入本地文件
    packages/core/write-config.mjs:48
    if (!existsSync(target)) copyFileSync(example, target);
  • 读取本地文件
    packages/core/write-config.mjs:50
    if (existsSync(akFile)) {
  • 读取本地文件
    packages/core/write-config.mjs:51
    const key = readFileSync(akFile, 'utf8').trim();
  • 读取本地文件
    packages/core/write-config.mjs:52
    let y = readFileSync(target, 'utf8');
  • 写入本地文件
    packages/core/write-config.mjs:54
    writeFileSync(target, y);
  • 执行外部命令固定命令
    packages/core/write-config.mjs:137
    const r = spawnSync('tasklist', ['/FI', 'IMAGENAME eq DeepSeek Harness.exe', '/NH'], { encoding: 'utf8', windowsHide: true });
  • 执行外部命令固定命令
    packages/core/write-config.mjs:140
    const r = spawnSync('pgrep', ['-f', 'DeepSeek Harness'], { encoding: 'utf8', windowsHide: true });
  • 读取本地文件
    packages/core/write-config.mjs:145
    if (!existsSync(panelPkg)) return;
  • 读取本地文件
    packages/core/write-config.mjs:180
    if (existsSync(roleFile) && existsSync(panelPkg)) {
  • 执行外部命令来自配置/变量
    packages/core/write-config.mjs:206
    const reg = spawnSync(process.execPath, [
  • 写入本地文件
    packages/core/write-config.mjs:222
    mkdirSync(skillsDst, { recursive: true });
  • 删除本地文件递归
    packages/core/write-config.mjs:226
    rmSync(path.join(skillsDst, entry), { recursive: true, force: true });
  • 写入本地文件
    packages/core/write-config.mjs:239
    mkdirSync(sharedDst, { recursive: true });
  • 删除本地文件递归
    packages/core/write-config.mjs:243
    rmSync(path.join(sharedDst, entry), { recursive: true, force: true });
  • 发起网络请求
    packages/dsh-panel-mmcas/lib/client.js:97
    return fetch(API + path, {
  • 发起网络请求
    packages/dsh-panel-mmcas/lib/client.js:134
    fetch(API + "/api/state").then(function (r) { return r.json(); }).then(function (s) { setState(s); }).catch(function () {});
  • 发起网络请求
    packages/dsh-panel-mmcas/lib/client.js:177
    fetch(API + "/api/poller").then(function (r) { return r.json(); }).then(setPollerState).catch(function () {});
  • 发起网络请求
    packages/dsh-panel-mmcas/lib/client.js:188
    fetch(API + "/api/poller").then(function (r) { return r.json(); })
  • 发起网络请求
    packages/dsh-panel-mmcas/lib/client.js:241
    fetch(API + "/api/notices").then(function (r) { return r.json(); }).then(function (s) { setNotices((s && s.items) || []); }).catch(function () {});
  • 发起网络请求
    packages/dsh-panel-mmcas/lib/client.js:287
    fetch(API + "/api/env-sync").then(function (r) { return r.json(); }).then(setEnvSync).catch(function () {});
  • 执行外部命令来自配置/变量
    packages/dsh-panel-mmcas/lib/index.js:71
    const r = spawnSync(syncCfg.gitBin, args, {
  • 执行外部命令来自配置/变量
    packages/dsh-panel-mmcas/lib/index.js:89
    child = spawn(syncCfg.gitBin, args, {
  • 读取本地文件
    packages/dsh-panel-mmcas/lib/index.js:215
    const text = readFileSync(file, 'utf8');
  • 读取本地文件
    packages/dsh-panel-mmcas/lib/index.js:229
    if (!existsSync(dir)) return [];
  • 读取本地文件
    packages/dsh-panel-mmcas/lib/index.js:230
    return readdirSync(dir).filter((f) => f.endsWith('.md') && f !== 'README.md')
  • 执行外部命令固定命令
    packages/dsh-panel-mmcas/lib/index.js:244
    const r = spawnSync('C:/Program Files/Tailscale/tailscale.exe', ['status', '--json'], { encoding: 'utf8', windowsHide: true });
  • 读取本地文件
    packages/dsh-panel-mmcas/lib/index.js:259
    const dj = JSON.parse(readFileSync(path.join(local, 'devices.json'), 'utf8'));
  • 读取本地文件
    packages/dsh-panel-mmcas/lib/index.js:267
    if (!existsSync(root)) return out;
  • 读取本地文件
    packages/dsh-panel-mmcas/lib/index.js:270
    if (!existsSync(dir)) continue;
  • 写入本地文件
    packages/dsh-panel-mmcas/lib/index.js:418
    mkdirSync(stateDir, { recursive: true });
  • 写入本地文件
    packages/dsh-panel-mmcas/lib/index.js:419
    writeFileSync(pollerLockFile, JSON.stringify(me, null, 2));
  • 删除本地文件
    packages/dsh-panel-mmcas/lib/index.js:431
    if (Number(holder && holder.pid) === process.pid) unlinkSync(pollerLockFile);
  • 写入本地文件
    packages/dsh-panel-mmcas/lib/index.js:439
    mkdirSync(path.dirname(pollerStateFile), { recursive: true });
  • 写入本地文件
    packages/dsh-panel-mmcas/lib/index.js:441
    writeFileSync(pollerStateFile, JSON.stringify(poller, null, 2));
  • 写入本地文件
    packages/dsh-panel-mmcas/lib/index.js:516
    writeFileSync(f, text);
  • 写入本地文件
    packages/dsh-panel-mmcas/lib/index.js:656
    writeFileSync(fp, t);
  • 执行外部命令来自配置/变量
    packages/dsh-panel-mmcas/lib/index.js:815
    const child = spawn(process.execPath, args, { cwd: ws, windowsHide: true });
  • 执行外部命令固定命令
    packages/dsh-panel-mmcas/lib/index.js:995
    const r = spawnSync('ssh', [
  • 执行外部命令固定命令
    packages/dsh-panel-mmcas/lib/index.js:1028
    const r = spawnSync('C:/Program Files/Tailscale/tailscale.exe', ['ip', '-4'], { encoding: 'utf8', windowsHide: true });
  • 删除本地文件递归
    packages/dsh-panel-mmcas/lib/index.js:1075
    if (st.isDirectory() && now - st.mtimeMs > 24 * 3600 * 1000) rmSync(full, { recursive: true, force: true });
  • 发起网络请求
    packages/dsh-panel-mmcas/lib/index.js:1271
    const r = await fetch('http://127.0.0.1:3220/health', { signal: AbortSignal.timeout(3000) });
  • 删除本地文件
    packages/dsh-panel-mmcas/lib/index.js:1429
    unlinkSync(cardFile(b.id));
扫描于 2026/11/2(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

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

功能亮点

  • 三角色Agent分工
  • 任务卡DAG调度
  • git同步与跨设备控制

数学建模竞赛三人协同系统:三角色智能体 × 任务卡 DAG 调度 × git 同步 × 跨设备控制 | 三人数学建模团队的多智能体协同系统

README

由 DeepSeek 最新模型翻译生成
MMCAS · 数学建模竞赛辅助系统 Mathematical Modeling Competition Assistance System —— 让三人数学建模小队像一个人一样协同。 状态:v1.3 已完成 dsh 0.2.1(命令行 + 桌面端)适配与全链路回归(2026-10-29):profile 合并式配置、桌面端一键接入、reviewer.json 迁移、冷会话注入修复 → ROADMAP.md 这是什么 MMCAS 是面向三人数学建模竞赛小队的协同工作系统。每位成员 = 1 个人类 + 1 个 AI 智能体(dsh),人类随时可干预。三个角色各司其职: - 建模手(Master):问题分析、模型选择、任务卡创建与分派、关键结论终审 - 编程手:代码实现、实验与数值计算、结果可复现 - 论文手:论文撰写与排版、图表整合、数字溯源 三条设计原则:人类在环(关键节点可随时卡停/改写)、永不静默丢数据(同步冲突显式上报,人类裁决)、零注册一键安装(成员机不注册任何外部账号)。 最新更新(v1.3) - dsh 0.2.1 全兼容(命令行 + 桌面端):适配 0.2.1-rc.3,支持官方 DeepSeek Harness Desktop;统一修复 profile / preset / 会话注入链路。
展开完整文档(README 剩余 1 节)
MMCAS · 数学建模竞赛辅助系统

Mathematical Modeling Competition Assistance System —— 让三人数学建模小队像一个人一样协同。

状态:v1.3 已完成 dsh 0.2.1(命令行 + 桌面端)适配与全链路回归(2026-10-29):profile 合并式配置、桌面端一键接入、reviewer.json 迁移、冷会话注入修复 → ROADMAP.md

这是什么

MMCAS 是面向三人数学建模竞赛小队的协同工作系统。每位成员 = 1 个人类 + 1 个 AI 智能体(dsh),人类随时可干预。三个角色各司其职:

- 建模手(Master):问题分析、模型选择、任务卡创建与分派、关键结论终审
- 编程手:代码实现、实验与数值计算、结果可复现
- 论文手:论文撰写与排版、图表整合、数字溯源

三条设计原则:人类在环(关键节点可随时卡停/改写)、永不静默丢数据(同步冲突显式上报,人类裁决)、零注册一键安装(成员机不注册任何外部账号)。

最新更新(v1.3)

- dsh 0.2.1 全兼容(命令行 + 桌面端):适配 0.2.1-rc.3,支持官方 DeepSeek Harness Desktop;统一修复 profile / preset / 会话注入链路。
- 桌面端一键接入:新增 MMCAS-Desktop 启动器;使用 MMCAS 独立 DSH_HOME、自动生成 profiles/desktop、面板数据端固定 19398;桌面端运行中安全跳过 profile 更新。
- profile 合并式配置:write-config、switch-provider、install-bridge 改为按条合并 cordis.patch.yml,保留 dsh 设置、已装插件和自定义 panel 端口;重跑 setup 不再清空。
- 0.2.1 standard preset 同步:加入 time-context / tool-schedule,移除已废弃的 backgroundMode、tool-ralph 与旧 subagent 配置行。
- Reviewer 配置迁移:审阅室改用 MMCAS 自有 reviewer.json;旧 settings.yaml 与 .imported 只读兼容,配置不再被 dsh 导入流程丢弃。
- 稳定性修复:冷会话 sessionController.prompt 补 AbortSignal;目标会话按最后事件时间选择;审计报告文件名唯一化;credentials refs 安全写入;New Session 本地化匹配。

功能特性

- 三角色智能体:各角色独立的提示词(persona)、技能与工具边界。
- 任务卡 DAG 调度:三状态(todo/doing/done)+ 依赖门控(deps 全 done 才可开始)+ 优先级 + 原子认领;命令行与面板双通道同护栏;任务轮询器支持智能体自动接取就绪任务。
- 共享工作区同步:git 私有仓为唯一事实源——工作区 / 任务卡 / 记忆文件三端自动同步(守护进程 v0.2.1:自动 commit/push、定时 pull、入库前体检、冲突守卫、过期锁接管)。
- dsh 内嵌面板(命令行 web + 桌面端):总控(成员设备 / 同步水位 / 任务轮询器)、任务看板、共享记忆、审计室;不是独立服务,随 dsh 侧栏运行,自动跟随宿主明暗主题。
- 跨设备控制:Tailscale 组网 + SSH 运维通道;防火墙只放行 Tailscale 网段,Master 不可被反向控制。
- 多 API 来源:官方 API 与中转站多 URL / 多 key,一键切换;内置 codex-bridge 让“仅接受标准 Codex 客户端”的通道也能接入。
- 环境同步:lockfile + 三方同意 + P2P wheelhouse——接收端离线对齐,uv 自动 diff 只装缺失(不碰镜像源)。
- 能力层技能:每角色专属技能集(dsh 原生技能机制,按需加载);蒸馏整合自社区 MIT 建模技能生态(见 docs/capability-design.md)。
- 会话与上下文(v1.2):任务自动接取即开新会话(一卡一会话、打回回原会话续做);上下文压缩三件套(自动压缩 / /compact / 溢出恢复)+ token 水位守门。
- 跨端通道(v1.2):notices 消息层(工作区 git 通道,紧急消息 steer 打断)+ 停止指令 + 回程卡(Slave→Modeler 受限建卡)+ 打回机制(done→todo 必填原因)。
- 独立审计(v1.2):面板「审计室」一键对数学模型 / 代码成品 / 最终论文发起第三方专家审计(经本地 codex-bridge),含预算守门(> ¥30 需确认)与桥健康可见。
- 同步守护看门狗(v1.2):同步心跳显性化(面板心跳行 + 停滞告警);启动器自动确保守护进程在跑。
- 零注册一键安装:每成员一个 zip 包,解压双击 setup.bat 全自动(Tailscale 上线 → SSH → 便携 Git/Node/uv → 克隆工作区 → 安装 dsh → 生成配置 → 自启 + 快捷方式)。

架构

flowchart LR
subgraph 三位成员
M["建模手 Master"]
C["编程手 Coder"]
W["论文手 Writer"]
end
M <-- "git 工作区仓 · 事实源" --> C
C <-- "git 工作区仓 · 事实源" --> W
M -. "Tailscale 组网 + SSH(控制 / 运维)" .-> C M -. "Tailscale 组网 + SSH(控制 / 运维)" .-> W

- 状态同步:git 私有仓(走 ssh.github.com:443,NAT 环境下稳定)
- 控制通道:Tailscale(WireGuard 组网,ACL 即权限)
- 大文件:网盘(可选)
- 桌面端:官方 DeepSeek Harness Desktop + MMCAS 独立 DSH_HOME;通过 MMCAS-Desktop 启动,面板数据端 19398

仓库结构

docs/ 设计文档与凭证暴露面登记(模板) specs/ 任务卡规范 packages/ core/ 共享核心:同步守护、profile 合并、provider 切换、任务卡护栏、记忆、SSH 工具、setup dsh-panel-mmcas/ dsh 内嵌面板插件(CLI web + 桌面端) modeler/ 建模手包(role.md + skills/) coder/ 编程手包(role.md + skills/) writer/ 论文手包(role.md + skills/) common/ 三端共享 skills(写入工作区仓 .dsh/skills/,git 同步) scripts/ 打包 / 离线组件下载 / 资源索引生成 / 调试脚本

快速开始

生成成员包(部署者侧)
node scripts/pack.mjs --role <coder|writer|modeler>

下载离线组件(Node / PortableGit / Tailscale / uv) bash scripts/download-vendor.sh

成员机:解压 zip → 双击 setup.bat(约 9 步全自动,失败自动汇总提示)→ 日常双击桌面 MMCAS-Agent 打开助手页面。

桌面端:如已安装官方 DeepSeek Harness Desktop,setup.bat 会额外生成 MMCAS-Desktop 快捷方式(独立 DSH_HOME + 面板端口 19398);桌面端运行中请先完全退出,再启动/重跑配置。

打包假定部署者已准备本机凭据配置(全部外置、仓库零明文——所有凭证位置与处理方式见 docs/secrets-registry.md 模板;成员机凭据由部署者预生成注入)。

文档

| 文件 | 内容 |
| docs/design.md | 架构与设计决策(唯一事实源,改架构先改文档) |
| docs/capability-design.md | 能力层(skills)设计 |
| specs/task-card.md | 任务卡格式与调度规则 |
| ROADMAP.md | 版本规划(与 Milestones / Issues 同步) |

Roadmap(v1.3 摘要)

- dsh 0.2.1 全兼容:CLI + 桌面端、profile 合并、standard preset 同步
- 桌面端接入:MMCAS-Desktop、独立 DSH_HOME、面板 19398
- 配置迁移:reviewer.json、provider/bridge 直写 profile patch、旧 settings.yaml 兼容
- 稳定性:冷会话注入、目标会话活跃度、审计报告与 credentials 修复
- v1.4 候选:向量化记忆检索、A2A、面板内 Web 终端、更多角色技能与审计维度

详见 ROADMAP.md、Milestones 与 Issues。

隐私与安全

- 仓库零明文:所有凭证外置(.gitignore 覆盖 + *.example 占位);新增凭证渠道须先登记 docs/secrets-registry.md。
- 零注册:成员机不注册任何外部服务,凭据由部署者统一预生成、可单独吊销。
- 合规姿态:系统内不含任何自动 AI 标注/声明功能。

致谢

- DeepSeek Harness (dsh) —— 智能体运行时
- 能力层部分技能蒸馏自社区 MIT 开源项目(明细见 docs/capability-design.md)

License

MIT
预览分享卡片长什么样 ↓dawn-471/MMCAS
分享 · DeepSeek Harness Hub
dawn-471/MMCAS

数学建模竞赛三人协同系统:三角色 Agent × 任务卡 DAG 调度 × git 同步 × 跨设备控制 |…

这是你的仓库?认领条目

回到顶部