一键组队多智能体,可视化交接与审批
34.2/100
综合分
3
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add QIU0826/dsh-pod该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · ui
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 51 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意未发布到 npm registry,仅可从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包dsh-pod(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=22.5.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖要求 >=0.1.0-rc.7 · 最新 0.2.1-rc.2 兼容
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/28 08:37:10
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件写入剪贴板(不计风险)读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 145 处,展示前 120 条)
- 发起网络请求src/a2a-push.ts:80
const res = await fetch(config.url, { method: 'POST', headers, body, signal: AbortSignal.timeout(timeoutMs) }) - 发起网络请求src/core/approvals.ts:86
return this.request( - 写入本地文件src/core/atomic-write.ts:54
writeFileSync(tmpPath, content, 'utf8') - 读取本地文件src/core/atomic-write.ts:57
if (options.backupPath !== undefined && existsSync(filePath)) { - 写入本地文件src/core/atomic-write.ts:58
renameSync(filePath, options.backupPath) - 写入本地文件src/core/atomic-write.ts:60
renameSync(tmpPath, filePath) - 删除本地文件src/core/atomic-write.ts:64
rmSync(tmpPath, { force: true }) - 读取本地文件src/core/atomic-write.ts:99
names = readdirSync(dir) - 删除本地文件src/core/atomic-write.ts:109
rmSync(join(dir, name), { force: true }) - 写入本地文件src/core/backends-lock.ts:39
mkdirSync(dirname(this.filePath), { recursive: true }) - 写入本地文件src/core/backends-lock.ts:40
writeFileSync( - 读取本地文件src/core/backends-lock.ts:59
if (!existsSync(this.filePath)) return { status: 'unlocked', details: 'no lock file (run pin before launch)' } - 读取本地文件src/core/backends-lock.ts:62
locked = JSON.parse(readFileSync(this.filePath, 'utf8')) as { backends: BackendVersionSnapshot } - 读取本地文件src/core/experiments.ts:37
if (!existsSync(this.filePath)) { - 读取本地文件src/core/experiments.ts:42
const parsed: unknown = JSON.parse(readFileSync(this.filePath, 'utf8')) - 写入本地文件src/core/experiments.ts:60
mkdirSync(dirname(this.filePath), { recursive: true }) - 写入本地文件src/core/experiments.ts:61
writeFileSync(this.filePath, JSON.stringify(this.state, null, 2), 'utf8') - 读取本地文件src/core/fs-browse.ts:37
if (existsSync(drive)) drives.push(drive) - 读取本地文件src/core/fs-browse.ts:57
if (!existsSync(path)) throw new Error(`path not found: ${path}`) - 读取本地文件src/core/fs-browse.ts:58
if (!statSync(path).isDirectory()) throw new Error(`not a directory: ${path}`) - 读取本地文件src/core/fs-browse.ts:81
const dirents = readdirSync(path, { withFileTypes: true }) - 写入本地文件src/core/memory.ts:149
mkdirSync(dir, { recursive: true }) - 读取本地文件src/core/memory.ts:163
if (!existsSync(this.filePath)) { - 写入本地文件src/core/memory.ts:175
renameSync(this.filePath, `${this.filePath}.corrupt-${Date.now()}`) - 读取本地文件src/core/memory.ts:184
if (!existsSync(path)) return undefined - 读取本地文件src/core/memory.ts:186
const parsed: unknown = JSON.parse(readFileSync(path, 'utf8')) - 发起网络请求src/core/orchestrator.ts:2182
return this.approvals.request(this.missionId, { - 读取本地文件src/core/pairing.ts:94
if (!existsSync(p)) continue - 读取本地文件src/core/pairing.ts:96
const parsed: unknown = JSON.parse(readFileSync(p, 'utf8')) - 读取本地文件src/core/skills.ts:72
if (existsSync(join(targetDir, 'SKILL.md'))) { - 写入本地文件src/core/skills.ts:75
mkdirSync(targetDir, { recursive: true }) - 写入本地文件src/core/skills.ts:76
writeFileSync(join(targetDir, 'SKILL.md'), options.content, 'utf8') - 写入本地文件src/core/skills.ts:87
writeFileSync(join(targetDir, 'source.md'), sourceDoc, 'utf8') - 读取本地文件src/core/skills.ts:93
if (!existsSync(dir)) return [] - 读取本地文件src/core/skills.ts:94
return readdirSync(dir, { withFileTypes: true }) - 读取本地文件src/core/skills.ts:95
.filter((d) => d.isDirectory() && existsSync(join(dir, d.name, 'SKILL.md'))) - 读取本地文件src/core/skills.ts:103
return readFileSync(join(dir, name, 'SKILL.md'), 'utf8') - 写入本地文件src/core/sqlite-store.ts:65
mkdirSync(this.rootDir, { recursive: true }) - 读取本地文件src/core/sqlite-store.ts:112
if (!existsSync(srcRoot)) return - 写入本地文件src/core/sqlite-store.ts:141
renameSync(srcRoot, join(this.rootDir, 'store.json.migrated')) - 读取本地文件src/core/store-open.ts:93
if (!existsSync(jsonPath)) return - 写入本地文件src/core/store-open.ts:106
renameSync(jsonPath, join(rootDir, 'memory.json.migrated')) - 写入本地文件src/core/store.ts:192
mkdirSync(this.rootDir, { recursive: true }) - 读取本地文件src/core/store.ts:195
if (!existsSync(this.mainPath)) { - 读取本地文件src/core/store.ts:217
throw new StoreCorruptError(this.mainPath, existsSync(this.backupPath) ? this.backupPath : undefined) - 读取本地文件src/core/store.ts:243
if (!existsSync(path)) return undefined - 读取本地文件src/core/store.ts:245
const parsed: unknown = JSON.parse(readFileSync(path, 'utf8')) - 写入本地文件src/core/store.ts:254
renameSync(path, `${path}.corrupt-${this.clock()}`) - 读取本地文件src/core/store.ts:525
if (this.data !== undefined && existsSync(this.mainPath)) { - 读取本地文件src/core/verifier.ts:155
return candidates.some((p) => existsSync(p)) - 读取本地文件src/core/verifier.ts:164
const exists = options.exists ?? ((path) => existsSync(path)) - 读取密钥环境变量src/pod-service.ts:41
const key = process.env.ARK_API_KEY ?? readArkKeyFromClaudeSettings() - 读取本地文件src/pod-service.ts:50
if (!existsSync(settingsPath)) return undefined - 执行外部命令来自配置/变量src/pod-service.ts:51
const raw = execFileSync(process.execPath, ['-e', `const s=JSON.parse(require('fs').readFileSync(process.argv[1],'utf8'));process.stdout.write(String( - 读取密钥环境变量src/pod-service.ts:64
const grokKey = (process.env.XAI_API_KEY ?? '').trim() - 读取密钥环境变量src/pod-service.ts:66
const kimiKey = (process.env.MOONSHOT_API_KEY ?? '').trim() - 读取本地文件src/pod-service.ts:190
binary: codexBinaryCandidates('win32').find((c) => existsSync(c)) ?? 'codex', - 读取本地文件src/pod-service.ts:240
mtime = existsSync(this.cronJobsFile) ? statSync(this.cronJobsFile).mtimeMs : 0 - 读取本地文件src/pod-service.ts:240
mtime = existsSync(this.cronJobsFile) ? statSync(this.cronJobsFile).mtimeMs : 0 - 读取本地文件src/pod-service.ts:246
if (existsSync(this.cronJobsFile)) { - 读取本地文件src/pod-service.ts:248
const parsed = JSON.parse(readFileSync(this.cronJobsFile, 'utf8')) as { jobs?: CronJob[] } - 写入本地文件src/pod-service.ts:298
mkdirSync(this.dataDir, { recursive: true }) - 写入本地文件src/pod-service.ts:305
writeFileSync(this.cronJobsFile, JSON.stringify({ jobs: clean }, null, 2), 'utf8') - 执行外部命令固定命令src/pod-service.ts:362
const inside = execFileSync('git', ['-C', input.cwd, 'rev-parse', '--is-inside-work-tree'], { - 执行外部命令固定命令src/pod-service.ts:375
execFileSync('git', ['-C', input.cwd, 'rev-parse', '--verify', 'HEAD'], { - 执行外部命令固定命令src/pod-service.ts:489
const claude = execFileSync('claude', ['--version'], { encoding: 'utf8', timeout: 5000, windowsHide: true, shell: true }) - 执行外部命令来自配置/变量src/pod-service.ts:496
const codex = execFileSync(codexBin, ['--version'], { encoding: 'utf8', timeout: 5000, windowsHide: true, shell: true }) - 写入本地文件src/pod-service.ts:516
mkdirSync(dir, { recursive: true }) - 写入本地文件src/pod-service.ts:535
writeFileSync(join(dir, 'plan.md'), lines.join('\n'), 'utf8') - 执行外部命令固定命令src/pod-service.ts:666
execFileSync('git', ['-C', repoRoot, 'worktree', 'add', path, '-b', `pod-${slotId}`], { stdio: 'pipe' }) - 删除本地文件递归src/pod-service.ts:1135
rmSync(dir, { recursive: true, force: true }) - 写入本地文件src/pod-service.ts:1422
mkdirSync(dir, { recursive: true }) - 读取本地文件src/routes.ts:393
return lstatSync(abs).isSymbolicLink() - 读取本地文件src/routes.ts:407
return existsSync(abs) - 读取本地文件src/routes.ts:419
const bytes = readFileSync(join(resolution.abs)) - 读取本地文件src/routes.ts:1443
if (!existsSync(p) || !statSync(p).isFile()) { - 读取本地文件src/routes.ts:1443
if (!existsSync(p) || !statSync(p).isFile()) { - 读取本地文件src/routes.ts:1449
res.end(readFileSync(p)) - 执行外部命令来自配置/变量src/standalone/cli.ts:30
const child = spawn(cmd, args, { stdio: 'ignore', detached: true }) - 读取密钥环境变量src/standalone/server.ts:39
const envKey = process.env.ARK_API_KEY - 读取本地文件src/standalone/server.ts:43
if (!existsSync(settingsPath)) return undefined - 执行外部命令来自配置/变量src/standalone/server.ts:44
const raw = execFileSync(process.execPath, ['-e', `const s=JSON.parse(require('fs').readFileSync(process.argv[1],'utf8'));process.stdout.write(String( - 读取密钥环境变量src/standalone/server.ts:54
const grokKey = (process.env.XAI_API_KEY ?? '').trim() - 读取密钥环境变量src/standalone/server.ts:56
const kimiKey = (process.env.MOONSHOT_API_KEY ?? '').trim() - 读取本地文件src/standalone/server.ts:126
if (existsSync(p) && statSync(p).isFile()) { - 读取本地文件src/standalone/server.ts:126
if (existsSync(p) && statSync(p).isFile()) { - 读取本地文件src/standalone/server.ts:129
res.end(readFileSync(p)) - 读取本地文件src/standalone/server.ts:149
if (!existsSync(p)) { - 读取本地文件src/standalone/server.ts:156
res.end(readFileSync(p)) - 写入本地文件src/standalone/server.ts:497
writeFileSync(mcpConfigPath, JSON.stringify(config, null, 2) + '\n') - 发起网络请求src/web/PodPanel.ts:78
void fetch('/api/pair/devices').then((r) => setPairingCapable(r.ok)).catch(() => setPairingCapable(false)) - 发起网络请求src/web/api.ts:116
return readJson<StatusResponse>(await fetch('/api/dsh-pod/status', { cache: 'no-store' })) - 发起网络请求src/web/api.ts:135
const response = await fetch(`/api/dsh-pod/events?${params.toString()}`, { cache: 'no-store' }) - 发起网络请求src/web/api.ts:154
await fetch(`/api/dsh-pod/fs/browse?path=${encodeURIComponent(path)}`, { cache: 'no-store' }), - 发起网络请求src/web/api.ts:164
const res = await fetch(`/api/dsh-pod/assets?path=${encodeURIComponent(path)}`, { cache: 'no-store' }) - 发起网络请求src/web/api.ts:195
await fetch('/api/dsh-pod/missions', { cache: 'no-store' }), - 发起网络请求src/web/api.ts:218
await fetch(`/api/dsh-pod/missions/detail?id=${encodeURIComponent(missionId)}`, { cache: 'no-store' }), - 发起网络请求src/web/event-stream.ts:17
const response = await fetch('/api/dsh-pod/events/stream', { - 写入剪贴板src/web/remote-panel.ts:90
void navigator.clipboard?.writeText(props.text).then(() => setDone(true)).catch(() => setDone(false)) - 写入剪贴板src/web/remote-panel.ts:211
void navigator.clipboard?.writeText(mint.url).then(() => setCopied(true)) - 读取本地文件src/workers/claude-headless.ts:437
if (options.mcpConfigPath !== undefined && options.mcpConfigPath.length > 0 && existsSync(options.mcpConfigPath)) { - 执行外部命令固定命令src/workers/claude-headless.ts:563
const child = spawn('claude', args, { - 执行外部命令来自配置/变量src/workers/codex-headless.ts:227
const child = spawn(this.binary, args, { - 执行外部命令固定命令src/workers/demo-backend.ts:35
return execFileSync( - 读取本地文件src/workers/demo-backend.ts:166
if (!existsSync(target)) writeFileSync(target, `# Demo Repo\n\n目标:${task.mission_id}\n`, 'utf8') - 写入本地文件src/workers/demo-backend.ts:166
if (!existsSync(target)) writeFileSync(target, `# Demo Repo\n\n目标:${task.mission_id}\n`, 'utf8') - 写入本地文件src/workers/demo-backend.ts:167
appendFileSync(target, `\n\n## ${task.title}(${task.id})\n\n- npm install dsh-pod\n- npm run build\n- Node.js >= 20(含 Windows 说明)\n`, 'utf8') - 写入本地文件src/workers/demo-backend.ts:169
mkdirSync(outDir, { recursive: true }) - 写入本地文件src/workers/demo-backend.ts:170
writeFileSync(join(outDir, `${task.id}.log`), `[demo] ${task.id} self-check passed (1/1)\n`, 'utf8') - 执行外部命令固定命令src/workers/kill-tree.ts:16
execFile('taskkill', ['/PID', String(pid), '/T', '/F'], { windowsHide: true }, () => resolve()) - 执行外部命令来自配置/变量src/workers/opencode-headless.ts:188
const child = spawn(this.binary, args, { - 读取本地文件src/workers/preflight.ts:42
const useful = ['node.exe', 'git.exe', 'claude.cmd', 'codex.exe'].some((f) => existsSync(join(dir, f))) - 读取本地文件src/workers/preflight.ts:249
const exists = deps.exists ?? ((path) => existsSync(path)) - 读取本地文件src/workers/preflight.ts:250
const readFile = deps.readFile ?? ((path) => (exists(path) ? readFileSync(path, 'utf8') : undefined)) - 发起网络请求src/workers/remote-backend.ts:40
const res = await fetch(this.base + path, { - 发起网络请求src/workers/remote-backend.ts:102
const raw = (await this.transport.request('GET', '/detect')) as Record<string, unknown> - 发起网络请求src/workers/remote-backend.ts:131
const raw = (await this.transport.request('POST', '/start', { slot, task, worktree })) as { - 发起网络请求src/workers/remote-backend.ts:170
const raw = (await this.transport.request('GET', q)) as RemoteEventBatch & { next?: number } - 发起网络请求src/workers/remote-backend.ts:201
await this.transport.request('POST', '/kill', { session_ref: handle.session_ref }) - 读取密钥环境变量src/workers/remote-backend.ts:214
const token = (process.env.POD_SATELLITE_TOKEN ?? '').trim()
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-host-webserver@deepseek-ai/dsh-settings@deepseek-ai/dsh-system-prompt@deepseek-ai/dsh-tools@deepseek-ai/dsh给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 一键组队多智能体
- 可视化交接
- 可视化审批
Pod 鲸群: 在 DSH Web UI 里一键组队、看得见、管得住的多智能体驾驶舱 (multi-agent cockpit plugin for DSH Web)
README
由 DeepSeek 最新模型翻译生成dsh-pod(Pod 鲸群)
在 DSH Web UI 里一键组队、看得见、管得住的多智能体驾驶舱。
把本机已登录的 DSH / Claude Code / Codex 组成一个团队,各干各擅长的活、互相交接任务,全程可视化,关键动作由人把关。驾驶舱是产品本体;多 agent 是按需启用的引擎。
开工基线:DSH-Pod-项目方案书-v2.0.md(含 CR-01~45 设计变更记录)
当前状态(v0.1.0 MVP 发布候选)
| 切片 | 状态 | 产物 |
| W0 仓库骨架 + 插件注册 + Store 决策(JSON 原子写回退) | ✅ | 本仓库;/api/dsh-pod/ping 健康路由 |
| W1 WorkerBackend 抽象 + codex 验证 + claude 打通 | ✅ 全链路 | src/workers/claude-headless.ts / codex-headless.ts;双后端跨进程会话连续性实证;claude stream-json/报告/故障分类;CR-02 见方案书 |
展开完整文档(README 剩余 1 节)
dsh-pod(Pod 鲸群)
在 DSH Web UI 里一键组队、看得见、管得住的多智能体驾驶舱。
把本机已登录的 DSH / Claude Code / Codex 组成一个团队,各干各擅长的活、互相交接任务,全程可视化,关键动作由人把关。驾驶舱是产品本体;多 agent 是按需启用的引擎。
开工基线:DSH-Pod-项目方案书-v2.0.md(含 CR-01~45 设计变更记录)
当前状态(v0.1.0 MVP 发布候选)
| 切片 | 状态 | 产物 |
| W0 仓库骨架 + 插件注册 + Store 决策(JSON 原子写回退) | ✅ | 本仓库;/api/dsh-pod/ping 健康路由 |
| W1 WorkerBackend 抽象 + codex 验证 + claude 打通 | ✅ 全链路 | src/workers/claude-headless.ts / codex-headless.ts;双后端跨进程会话连续性实证;claude stream-json/报告/故障分类;CR-02 见方案书 |
| opencode adapter(v0.3 Berd-G) | ✅ 代码+fake 测试 | src/workers/opencode-headless.ts:opencode run stdin 注入 + --session 续会话 + 纯文本 extractReport;vendor 枚举全链登记;本机未装 opencode,真机首验清单见 adapter 头注释 |
| W2 交接协议 + 状态机 + Verifier + Commander 编排器 + 最小可演示链 | ✅ | src/core/orchestrator.ts;scripts/demo-chain.mjs 真实跑通「claude 实现 → codex 独立 review → 审批卡」(CR-03-6) |
| W3 Team Builder / W4 Canvas 两栏 / W5 审批+worktree+账本 / W6 Bake-off+DoD | ✅ | Team Builder 预设阵型(DoD-9)+ Mission Canvas 两栏(看板/事件流/steer/审批/手动模式)+ apply_patch 串行合并 + 账本双列 + DoD 1–19 全部达成 |
| Bake-off(DoD-10) | ✅ 已发布 | 10/10 运行留档;汇总报告(9 done + 1 负向样本,含负向结果公开) |
环境注意(CR-02/03):claude 已切至 api.deepseek.com/anthropic + deepseek-v4-pro;本机 codex = ChatGPT 桌面应用内置(模型名留空走默认 gpt-5.6-sol;缺 code-mode host → 审查任务走宿主机 diff 注入)。多模型配置采用 ccswitch 共存方案(进程级 env 覆盖,不改全局 settings.json)。
安装与挂载(沿 dsh-ssh 实证模式,零源码改动)
依赖 DSH rc 线(npm 官方 SDK 包,只走公开扩展点)
npm install && npm run verify
挂载到你的 profile(link 或 npm 包均可)
dsh plugin --profile web add link:<本仓库路径>
独立运行(standalone 控制台,CR-38)
不装 DSH 宿主也能用:本地起一个 Web 服务,浏览器打开即管理全部 harness(对标 block/berd 形态)。
npm run build
node dist/standalone-server.js # 默认 http://127.0.0.1:3930(数据根 ~/.dsh/pod,与插件形态共用磁盘事实源)
node dist/standalone-server.js --port 0 --data-dir <dir> # 随机端口 / 指定数据根
node dist/standalone-server.js --host 0.0.0.0 --token <t> # 非 loopback 监听必须配 Bearer token(CR-29 纪律)
node dist/standalone-server.js --open # 监听就绪后用系统默认浏览器打开控制台
npm run serve # = build + 起服务
- 复用 /api/dsh-pod/ 全部路由(loopback-only 默认,完整清单见下方「HTTP API 面」);Commander 自动编排需 DSH 宿主,独立模式走 HTTP API 手动派发/审批(P2 决策见 docs/STANDALONE-PLAN.md)
- dist/standalone.js 为 UI bundle(react 全量内联),由 server 静态托管;壳页内嵌于 src/web/standalone-shell.ts
HTTP API 面(loopback-only 默认,非 loopback 一律 403)
独立控制台(standalone)与 DSH 插件共用同一路由族。带 body 的写接口强制 application/json (CSRF 防线,P1);所有响应 cache-control: no-store。
会话 / 编排
| 方法与路径 | 说明 |
| GET /api/dsh-pod/ping | 健康检查(版本 + 运行时状态) |
| GET /api/dsh-pod/status | 看板快照:mission / tasks / slots / 审批卡 / 账本双列(tokens + equiv_usd) |
| POST /api/dsh-pod/launch | 启动 mission(name/goal/cwd/slots/budget_usd/budget_tokens/parallel/tenets/plan) |
| POST /api/dsh-pod/steer | 给槽位发指令(slot_id + instruction) |
| POST /api/dsh-pod/abort | 中止 mission(reason) |
| POST /api/dsh-pod/pause / /resume | 暂停 / 恢复 mission(非法状态迁移 → 409) |
| POST /api/dsh-pod/dispatch | 手动模式派单(绕开 LLM 编排) |
| POST /api/dsh-pod/resolve | 人工裁决 escalated 任务(task_id + outcome: done\|blocked) |
| POST /api/dsh-pod/plan | action=list\|add\|replan(任务计划增删 / 重规划) |
审批
| 方法与路径 | 说明 |
| POST /api/dsh-pod/approve | 批准合并(可带 edited 编辑参数、remember_rule 免弹卡规则) |
| POST /api/dsh-pod/deny | 驳回(approval_id + reason) |
| GET /api/dsh-pod/approvals/detail?id= | 审批详情 + 可读 diff(白名单根内) |
事件流
| 方法与路径 | 说明 |
| GET /api/dsh-pod/events | 事件流尾部:after(ts 游标)/ after_id(id 精确游标,同毫秒不丢)+ cursor / has_more 分页续读 |
| GET /api/dsh-pod/events/stream | SSE:先 replay buffered history 再 1s 增量轮询,客户端按 id 去重 |
会话中心(mission 历史 = 会话)
| 方法与路径 | 说明 |
| GET /api/dsh-pod/missions | 会话列表(按创建时间倒序,含状态/预算/token/任务/槽位/最新事件) |
| GET /api/dsh-pod/missions/detail?id= | 单个会话归档快照(对话流/任务/槽位/审批/账本) |
| POST /api/dsh-pod/missions/rename | 重命名会话(id + name) |
| DELETE /api/dsh-pod/missions?id= | 删除会话(仅终态:活跃 → 409 MISSION_ACTIVE,先 abort 再删;级联清空归属数据 + worktree + 数据目录) |
规则(审批「记住规则」)
| 方法与路径 | 说明 |
| GET /api/dsh-pod/rules | 列出规则 |
| POST /api/dsh-pod/rules | 记住规则(tool + decision: allow\|deny\|ask) |
| DELETE /api/dsh-pod/rules?id= | 撤销规则(不存在 → 404) |
任务级操作
| 方法与路径 | 说明 |
| POST /api/dsh-pod/task/pause / /task/resume | 任务级暂停 / 恢复(不消费 attempts) |
| POST /api/dsh-pod/reassign | 任务换人(task_id + to_slot_id + reason,交接四件套落盘) |
记忆(2.8.1)
| 方法与路径 | 说明 |
| GET /api/dsh-pod/memory | 查询记忆(owner/type/tags/importance_min/relation/relates_to/limit) |
| POST /api/dsh-pod/memory | 写入记忆(owner_slot_id + type) |
| POST /api/dsh-pod/memory/correct | 纠正记忆(保留变更历史,不可删除——可审计优先) |
定时任务(Cron)
| 方法与路径 | 说明 |
| GET /api/dsh-pod/cron | 列出 job + 下次触发时间 |
| POST /api/dsh-pod/cron | 保存 jobs(热加载) |
文件系统(只读)
| 方法与路径 | 说明 |
| GET /api/dsh-pod/fs/browse?path= | 只读目录浏览(设置页选仓库) |
| GET /api/dsh-pod/assets?path= | 白名单资产读取(worktree 根集合内,穿越/符号链接逃逸 → 403) |
联邦 / A2A 对外面(v0.3,v1.0 对齐)
| 方法与路径 | 说明 |
| GET /.well-known/agent-card | Agent Card 发现端点(名册即技能表;capabilities.pushNotifications=true + v1.0 signatures: [] 签名扩展位,loopback NoAuth 如实未签名) |
| POST /a2a/sendMessage | 非流式:消息 → mission 受理 → A2A Task 快照;configuration.pushNotificationConfig 可注册终态 webhook 回调 |
| POST /a2a/sendMessageStream | 流式 SSE:快照 + status/artifact 增量至终态;pushNotificationConfig 同样生效(与 SSE 并存) |
| POST /a2a | JSON-RPC(message/send \| message/stream) |
推送通知(v1.0 §4.3):客户端在 configuration.pushNotificationConfig 里给出 { url, token?, authentication? };mission 进入终态时,服务端 POST 一个 StreamResponse,只带 statusUpdate 这一个键(与流帧同构)。鉴权优先用 authentication → Authorization: <scheme> <credentials>,否则用 token → X-A2A-Notification-Token。at-least-once(2 次尝试 / 10s 超时),失败只在 stderr 留痕,不影响编排;mission 一旦被替换即作废。SSRF 面:只放行 http(s) scheme(allowlist 属部署侧)。
状态词汇:task_rejected(能力拒单)与 task_escalated(转人工)显式映射到非终态 input-required(停顿需人工),外部驱动方才能正确处理这两种停顿。
开发
npm test # 全量单测(vitest,无真实 CLI/网络依赖)
npm run test:coverage # 覆盖率门禁(lines/functions/statements 80%,branches 75%)
npm run typecheck # tsc 严格模式
npm run build # tsc(宿主 dist/plugin.js)+ tsdown(浏览器 dist/client.js)
npm run verify # typecheck → coverage → build 一条龙
$env:POD_LIVE_PREFLIGHT='1'; npx vitest run tests/preflight.live.test.ts # 真实 CLI 冒烟(可选)
最小可演示链(demo-chain)
npm run build
node scripts/demo-chain.mjs # 审查者默认 codex(跨厂商异构)
node scripts/demo-chain.mjs --reviewer claude # 同厂商异槽独立 review(DoD-5 仍满足:S-1 ≠ S-2)
node scripts/demo-chain.mjs --repo <dir> # 自定义靶场仓库
⚠️ --reviewer 仅支持 claude|codex,传入其他值会警告并回落为 codex。
真实跑通「实现 → 独立 review → 审批卡」链;合并(apply_patch)属 W5 切片,本演示止于审批卡。
写码型 bake-off(真实 LLM)
node scripts/bakeoff-claude.mjs # claude 实现+测试+commit → claude 独立 review → 审批卡
ARK_API_KEY=<key> node scripts/bakeoff-cross-vendor.mjs # claude 实现 + ark 跨 vendor 审查
产物留档 reports/(不入库);审批卡裁决后合并回主树:
node scripts/approve-merge-verify.mjs <storeDir> <approvalId> <missionId> [note]
v0.3 联邦入口(MCP 双向 / 多机 satellite / 外部通道)
MCP stdio(Claude Code / Codex 反向驱动 Pod)
claude mcp add pod -- node <本仓库路径>/scripts/mcp-bridge.mjs 之后在 Claude Code 里即可调用 pod_launch / pod_status / pod_approve 等 9 个工具
MCP Streamable HTTP(远程访问,CR-29)
本机(loopback,无 token 也可)
node scripts/mcp-http-server.mjs # 127.0.0.1:3947/mcp
远程(必须带 token,否则拒绝启动 fail-closed)
POD_MCP_HOST=0.0.0.0 POD_MCP_TOKEN=<token> node scripts/mcp-http-server.mjs
客户端接入(Claude Code): claude mcp add --transport http pod http://<host>:3947/mcp --header "Authorization: Bearer <token>"
GET /mcp 返回健康检查;POST 走 MCP 协议(tools/list、tools/call)。
多机 satellite(CR-30)
卫星机(跑真实后端的机器):
POD_SATELLITE_PORT=3950 POD_SATELLITE_TOKEN=<共享密钥> node scripts/satellite-worker.mjs
POD_SATELLITE_BACKEND=ark ARK_API_KEY=<key> node scripts/satellite-worker.mjs # 换 ark 后端
本机(Pod 侧):环境变量指向卫星,launch 的 slot vendor 即走远程
POD_SATELLITE_URL=http://<卫星机>:3950 POD_SATELLITE_VENDOR=claude POD_SATELLITE_TOKEN=<共享密钥>
线协议:/detect /start /events /kill /health;本机仍是状态机唯一裁决者(satellite 只执行任务)。
多机真机部署需 worktree 共享(见 docs/satellite.md 边界)。
外部协作通道 webhook(Berd-H,CR-31)
通用通道(裸 {text},loopback 默认可信;本地联调用)
node scripts/channel-http-server.mjs # 默认 127.0.0.1:3960
curl -X POST -H "content-type: application/json" -d '{"text":"看板状态"}' http://127.0.0.1:3960/inbound
Slack / 飞书 webhook(vendor 验签主鉴权 + 挑战握手 + 重放去重;真挂 IM 用这个)
POD_SLACK_SIGNING_SECRET=<secret> node scripts/im-http-server.mjs # Slack HMAC-SHA256 验签
POD_LARK_ENCRYPT_KEY=<key> POD_LARK_VERIFICATION_TOKEN=<token> node scripts/im-http-server.mjs # 飞书加密
POD_LARK_VERIFICATION_TOKEN=<token> node scripts/im-http-server.mjs # 飞书明文(token 为唯一入站鉴权)
webhook URL 填 http://127.0.0.1:3960/webhook/slack 或 /webhook/lark
支持指令:状态/暂停/恢复/中止/批准 A-n/驳回 A-n/给 S-n 指令:…;审批动作仍走 pod_approve 门(不绕过状态机)。
vendor 验签失败/时间窗过期/缺凭据一律 401 fail-closed;非 loopback 且无 POD_IM_TOKEN 拒绝启动。
Cron 定时触发(AgentScope-J,CR-34)
src/core/cron.ts 的 CronScheduler:tick 驱动(与 watchdog 同风格)、节流防抖、默认关闭(Berd-H 显式启用)、gate 守卫、触发历史审计;命令复用同一 pod_ 工具面。宿主接线(maintenanceTick 同源驱动)进行中。
v0.2 切片(灰度项经 ~/.dsh/pod/experiments.json 开关,默认全关;非灰度项默认生效)
| 切片 | 状态 | 说明 |
| 审批模式 2/3 经 experiments 灰度接入(Berd-E) | ✅ | launch approvalMode 校验:模式 2(交接确认,跨 agent 派活前弹卡)/ 模式 3(全自动,质量门通过即 done)需对应 approval-mode-2/approval-mode-3 开关开启;默认模式 1 行为不变;dispatch 卡经 pod_approve 分支裁决 |
| 记忆子系统 2.8.1(CR-07 / NOOA 借鉴) | ✅ | src/core/memory.ts:MemoryStore(~/.dsh/pod/memory.json 原子写)+ 类型化图谱(supports/contradicts/derived-from)+ 三工具 pod_mem_write/query/correct + 后台 reflection(合并/补边/剪枝,接入 maintenanceTick) |
| 记忆运行时注入 top-k(P1-4 深化①,2026-09-01) | ✅ | 派发注入从「importance≥3 硬门 + 标签」升级为 src/core/memory-rank.ts 的 BM25 关键词相关性(ASCII 词 + CJK bigram 分词,候选池内 IDF,tag 命中与 importance 作加权;门槛=查询词重叠 / tag 命中 / importance≥4)。任务文本(title+spec+skill_tags)做查询——低重要度强相关的记忆越过旧硬门入选且排前 |
| feedback 环 v2(Berd-E 灰度 feedback-consult) | ✅ | 语义类拒绝(能力缺口)时真咨询最匹配槽位的 worker 执行侧约束(claude --print 一次性调用,bestConsultSlot + buildConsultPrompt 纯函数;结果裁 500 字符写回 spec),咨询失败/无槽位/未注入回落 v1 名册反馈(事件 feedback_mode: consult|roster)。实测 32.3s 返回高质量建议。开启:~/.dsh/pod/experiments.json 加 "feedback-consult": true |
| P2-4 压缩实验结论(2026-09-01) | ⛔ | 叙事性技术文本平均压缩率仅 9%(保持分 9.0 但远低于 40% 门槛)——已近信息密度上限,不做接入(scripts/compress-eval.mjs 可复现,负向结论完整留存) |
| 记忆收益验收(方案书 258 行) | ✅ | scripts/memory-eval.mjs:同一任务集(项目特定经验)记忆组 vs 基线组 + LLM 自评三维。真实 Ark 运行:三维均值记忆 4.667 vs 基线 4.000(+0.667,准确性 +1.00);负向记录:知识型问题平局(记忆价值在经验复用非百科)。Debrief 见 reports/memory-eval/ |
| Ledger→路由权重(历史成功率,2.7 节) | ✅ | dispatcher.routeTask 增 slotSuccess 因子:能力 > 负载 > 单任务成本 > 历史成功率(降序),无数据视为中性 0.5 不劣化;orchestrator 按槽位统计 done/(done+blocked+escalated) 注入 |
| 并行执行强化(双路+,4.3) | ✅ | LaunchInput.parallel(默认 2,clamp 1-8,pod_launch 可传)+ run() 用 dispatchBatch 每轮填满 maxParallel 而非单路派 1 即等;依赖链仍串行不破坏拓扑;FakeBackend 增 delayMs/并发峰值验证 peakActive |
| 任务中途换人正式化(4.3) | ✅ | reassignTask(kill 旧进程 + 交接四件套落盘 + 事件 task_reassigned 审计 + owner 转移 + 置 ready 由 dispatchBatch 重派);pod_reassign 工具;done 终态/目标槽位不可用拒绝 |
| mission 崩溃恢复 UI 完善(4.3) | ✅ | PodPanel 顶栏加「恢复/需人工动作」横幅:跨重启重建(DoD-11 审批卡)/ 模式 2 派发门待放行 / paused 暂停提示;dist/client.ts 重建 |
| cross-review / bake-off 阵型强化(4.3) | ✅ | PodPanel capabilities 改多能力解析('编码 审查'→['编码','审查'])+ 双实现互审预设(claude/codex 异构、审查者≠实现者,防 R5 假共识);orchestrator 增互审端到端测试(双实现并行 + 交叉审查 + 质量门后进审批) |
| SQLite 迁移(R12/O12,替代 JSON 回退) | ✅ | SqliteStore implements PodStore(~/.dsh/pod/pod.db,WAL+事务,全表 JSON 行);openPodData 默认 sqlite、better-sqlite3 加载失败回退 JSON;存量 store.json/memory.json → pod.db 非破坏迁移(旧文件转 .migrated);MemoryStore 持久化抽 MemoryPersistence 接口(JSON/SQLite 双实现共享算法) |
| 拓扑动画 + 自由画布(4.3,Berd-E 灰度 topology-animation) | ✅ | TopologyCanvas 组件:任务 DAG 分层布局 + SVG 状态着色 + 运行中流动虚线/脉冲光晕动画;自由画布模式可拖拽节点 + 手画 DAG(添加/删除草稿节点);status API 暴露 depends_on 与 experiments.topology_animation;PodPanel 视图切换(看板/拓扑动画/自由画布)。开启:~/.dsh/pod/experiments.json 加 "topology-animation": true |
| Canvas 第三栏·员工详情(W4/Berd-E 灰度 canvas-third-column) | ✅ | 员工状态灯(idle/working/waiting_approval/error/stopped/rate_limited 六色)+ 上下文占用 % + 账本(tokens 实测 + 等效美元 + 无价目标注);status API 暴露 canvas_third_column。开启:~/.dsh/pod/experiments.json 加 "canvas-third-column": true |
| 桌面通知(CR-01-10 Should) | ✅ | src/core/notifier.ts:事件流提取需人工动作信号(审批待批/转人工/预算熔断/mission 暂停)→ 宿主送达;kind+mission 去重窗口(默认 5 分钟)防轮询刷屏;pod-service maintenanceTick 增量游标扫描 + notified 计数 |
| 暂停/恢复正式化(W4,方案书 113 行) | ✅ | pod_pause/pod_resume 工具:orchestrator 透传 mission 状态机(paused ↔ running/awaiting_approval,按 pending 审批卡决定恢复去向);暂停后状态磁盘化,可恢复/复盘。2026-08-29 补 HTTP/UI 接线:POST /api/dsh-pod/pause / /resume(非 POST → 405,非法状态迁移 → 409),控制台快捷操作区按会话状态显示「暂停任务」/「恢复任务」,历史回放时禁用 |
| 账本阶段归因(2026-08-29 新增) | ✅ | Ledger.summary() 增 byStage:按任务类型(plan/implement/review/test/doc/research)聚合 token 与花费。多 agent 写码的成本高度集中(ChatDev 实测 review 单阶段占 59.4%),此前只有总数与按员工/模型维度,看不出钱烧在哪个阶段 |
| 信息增量式止损 early exit(2026-09-01 新增,Berd-E 灰度 early-exit) | ✅ | 现有 watchdog 只按时间触发(空闲/墙钟),补「是否还在产生新信息」维度:连续 2 轮完全同证据的硬失败(同故障+同错误签名,src/core/failure-evidence.ts 归一化指纹)→ 不烧最后一轮全价重试直接转人工(task-machine applyFailure,事件带 early_exit/no_new_evidence)。软失败(429/need_clarify)不参与比较也不清空证据链。默认关(fail-closed)。开启:~/.dsh/pod/experiments.json 加 "early-exit": true |
| 审批卡「记住规则」入口(W4,AgentScope-B 显式化) | ✅ | approvals.decide 增 rememberRule(默认 true);pod_approve 增 remember_rule 参数 + Canvas 审批卡 confirm 勾选;false 时批准不生成同类免弹卡规则(每次仍弹卡) |
| 协议适配器层前置(Berd-G,v0.3 排期) | ✅ | WorkerBackend.protocol 元数据(family/version/capabilities 四能力位);claude/codex/dsh 三后端声明(codex usage_audit=false 诚实化);docs/adapters.md 新后端接入流程 + ACP 预留 |
| 工具级 middleware 审计钩子(AgentScope-E,Should) | ✅ | 每个 pod_* 工具 execute 包审计:调用后 recordToolAudit(pod_tool_called 事件,含 tool/ok/ms/error);wrapTool 纯横切不改变返回值 |
| token 预算上限入口(2.3 节⑤) | ✅ | budget_tokens 全链路打通:pod_launch / routes / postLaunch / PodPanel 表单(留空=仅美元熔断);orchestrator 双熔断(美元 + token)已有测试覆盖 |
v0.3 设计预留(P2 方向性,不实现不改架构——方案书 934 行采纳原则)
| 方向 | 状态 | 设计文档 |
| MCP 双向暴露(方案书 594/797 行,CR-28 + CR-29) | ✅ stdio + Streamable HTTP | src/mcp-server.ts(pod_* 工具面 9 个映射 MCP tools,审批仍走三代码入口);stdio:scripts/mcp-bridge.mjs(claude mcp add pod -- node <path>/scripts/mcp-bridge.mjs);远程:scripts/mcp-http-server.mjs(默认 127.0.0.1:3947,POD_MCP_TOKEN 可选 Bearer,非 loopback 无 token 拒绝启动) |
| 多机 Satellite(方案书 594 行,CR-30) | ✅ 已实现 | src/workers/remote-backend.ts(RemoteBackend,protocol.family='remote')+ src/workers/satellite-server.ts(卫星端点 /detect /start /events /kill /health + StubBackend)+ scripts/satellite-worker.mjs;docs/satellite.md(多机真机部署仍属部署关注) |
| 外部协作通道(Berd-H / AgentScope-J,CR-31) | ✅ 已接线(vendor 验签链路) | src/core/channel.ts(parseInstruction + handleChannelCommand + sanitizeOutboundSignal;审批不绕过门、凭据不出会话)+ src/core/channel-im.ts(Slack / 飞书 vendor adapter:HMAC 验签 + 时间窗防重放 + 飞书明文模式 verification token 鉴权 + 事件 id 重放去重 + 挑战握手 + 出站净化)+ src/im-http.ts(webhook HTTP 交付层:POST /webhook/{slack,lark} 读原始 body 验签,fail-closed;scripts/im-http-server.mjs 装配,POD_SLACK_SIGNING_SECRET/POD_LARK_* 注入凭据)。出站 bot 回帖未接(缺省仅 stderr 打印 + ack) |
| MCP Gateway(AgentScope-J) | ⚠️ 库已备,服务面未接线 | src/core/mcp-gateway.ts——Pod 作为 MCP 客户端聚合多个下游 server(与「Pod 暴露为 server」互补):工具名 serverId__toolName 命名空间隔离(serverId 非法即构造失败)、写类工具过审批门(未接线审批钩子时 gated 工具一律拒绝,fail-closed)、输出截断防灌爆上下文、调用审计;13 例单测。尚未接入 PodService/编排层——接线属后续计划 |
| 任务生命周期状态机(A2A 对齐) | ✅ 已实现 | task-machine.ts:ready→negotiating→accepted→dispatched/running⇄paused→done/blocked/rejected/escalated。协商是真实裁决(vendor 健康探测 + 预算构成接受基础,TTL 缓存;谢绝换人 failover;全员谢绝→rejected 转人工);任务级暂停/恢复不消费 attempts;18 例生命周期单测 |
| A2A 对外协议面 | ✅ 已实现 | GET /.well-known/agent-card(名册即技能表)+ POST /a2a/sendMessage(消息→mission 受理,回 A2A Task 快照)+ POST /a2a/sendMessageStream(SSE:status/artifact 增量至终态)+ JSON-RPC POST /a2a(message/send / message/stream);映射纯函数 src/core/a2a.ts(loopback-only,凭据不出协议面,未知事件不编造);14 例单测 |
核心域层(src/core,全部纯逻辑 + 注入式副作用,可离线测试)
| 模块 | 职责 | 方案书落点 |
| store.ts | JSON + 原子写(tmp→bak→rename)+ 损坏恢复;SQLite 可替换接口 | 3.9/O12 |
| task-machine.ts | Task 状态机 + 故障分类全集 + 重试/退避/转人工;LLM 提议代码裁决 | 3.4 |
| mission.ts | Mission 状态机 + 质量门(独立 review 不可关)+ 跨重启恢复 | 3.4/DoD-5/11 |
| approvals.ts | 审批模式 1 持久化 + 超期 stale(CR-01-7) | 2.6 |
| ledger.ts | tokens 实测 + equiv_usd 标注估算(价目表版本号)+ 双熔断 | 2.7/D7 |
| handoff.ts | 交接四件套 + verify 清单 + 2×3 投递矩阵 | 2.5/3.2 |
| verifier.ts | 产物校验层(commit/parent/白名单/日志/叙事一致性),真实 git 集成测试 | 3.5/CR-01-3 |
| dispatcher.ts | 能力 > 负载 > 成本 路由 | 3.3 |
| session-tiers.ts | 三档会话生命周期 + 70% 重置摘要 | 3.2/CR-01-6 同源 |
| watchdog.ts | commander/任务空闲/墙钟,纯 tick 驱动,审批期挂起(CR-01-4) | 3.3/3.4 |
| experiments.ts | 灰度开关框架(~/.dsh/pod/experiments.json,默认关、fail-closed) | 3.4 Experiment/Berd-E |
| memory.ts | 长期记忆子系统(主动策展 + 图谱 + reflection) | 2.8.1/CR-07 |
src/workers/:preflight 环境探测(附录 D 十项,.cmd 包装器 shell 回退——Windows 专项)+ 进程注册表。
src/charters/:内置角色章程(数据不是代码,可被用户 ~/.dsh/pod/charters/ 覆盖)。
架构不变量(代码强制执行)
1. LLM 提议,代码裁决:状态迁移只走状态机入口,非法迁移抛 INVALID_TRANSITION;
2. 原始事件永不进 commander 上下文:只进磁盘与 Canvas;
3. 审批/收集/合并只走三个代码入口:pod_approve / pod_collect / apply_patch;
4. 员工进程是沙箱边界:charter 约束 + --allowedTools 白名单 + 路径校验 hook,三道防线全开。
插件表面(v0.1 W0)
- 宿主:src/plugin.ts —— PodRuntime(Store/审批/账本)+ 系统提示播报 + /api/dsh-pod/ping;初始化失败只降级(503),绝不拖垮宿主(R6/R10)。
- 浏览器:src/web/client.ts —— locale 注册;Team Builder / Canvas 界面随 W3/W4 切片开放。
- cordis.patch.yml:bundle patch(dsh.bundle.patch manifest),dsh plugin add 一键挂载。
Bake-off(DoD-10:有效性自证)
完整报告:reports/bakeoff/SUMMARY.md(10/10 运行原始数据 + 负向结果公开)运行器:scripts/bakeoff-all.mjs / bakeoff-run.mjs;任务集:tasks/bakeoff-tasks.json
一句话结论:本批 5 任务 × 2 条件的实测数据不支持「多 agent 无条件更强」,支持 cockpit-first 定位——小任务编排开销吞噬收益(成本 +37~95%);medium-1 上 Pod 节省 13% wall-clock(成本 +74%);长任务(long-1)的独立 review 因本机 codex 审查者缺 code-mode host(命令执行不可用)转人工(负向样本,见 NEGATIVE-FINDING-codex-code-mode-host.md)。「何时该用 Pod」的可执行阈值详见报告 §4。
许可证
MIT
实现 README 安装章节(T-1)
- npm install dsh-pod
- npm run build
- Node.js >= 20(含 Windows 说明)
补充环境要求说明(T-2)
- npm install dsh-pod
- npm run build
- Node.js >= 20(含 Windows 说明)预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
QIU0826/dsh-pod
一键组队多智能体,可视化交接与审批
相关插件 · UI / 主题
破甲增强版JeffKeeping/dsh-purge-plus
dsh-purge 的非官方分支fork:适配 DeepSeek Harness 0.2.1-rc.2、破甲内核…
★ 387已汉化DeepSeek 客户端
71.9
无代码业务系统平台nocobase/nocobase
NocoBase 是什么
★ 24,804已汉化DSH
71.8
1Panel 服务器面板1Panel-dev/1Panel
全球 250 万+ 自托管用户共同喜爱。
★ 37,350已汉化DSH
71.5
工作状态行动态ccch1mneyyy/working-activity
作者:chimney@ccch1mneyyy。社区项目,非 DeepSeek 官方项目。
★ 664已汉化DSH
71.2
多模型配置管家farion1231/cc-switch
跨平台桌面一体化助手,支持 Claude Code、Codex、OpenCode、DeepSeek Harness 等工具,唯一官网 ccswitch.io
★ 151,506已汉化DSH
71.1
AI 矢量设计工具ZSeven-W/openpencil
全球首个 AI 原生开源矢量设计工具。
★ 7,027已汉化DSH
71.1
这是你的仓库?认领条目