把 Codex 拆成可独立安装的插件,按边界逐项复现行为
28.1/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/9/18 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add songyang0603/dsh-codex该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · market
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 80 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 144 处,展示前 119 条)
- 读取本地文件conformance/apply-patch-engine/compare.mjs:293
return parseJsonl(await readFile(absolute, "utf8"), absolute); - 写入本地文件conformance/apply-patch-engine/run-candidate.mjs:100
await mkdir(path, { recursive: true }); - 写入本地文件conformance/apply-patch-engine/run-candidate.mjs:102
await mkdir(dirname(path), { recursive: true }); - 写入本地文件conformance/apply-patch-engine/run-candidate.mjs:112
await writeFile(path, Buffer.from(bytesHex, "hex")); - 写入本地文件conformance/apply-patch-engine/run-candidate.mjs:122
await mkdir(dirname(path), { recursive: true }); - 写入本地文件conformance/apply-patch-engine/run-candidate.mjs:131
await chmod(path, Number.parseInt(fixture.mode, 8)); - 写入本地文件conformance/apply-patch-engine/run-candidate.mjs:141
mkdir(join(root, path)), - 读取本地文件conformance/apply-patch-engine/run-candidate.mjs:160
const names = await readdir(directory); - 读取本地文件conformance/apply-patch-engine/run-candidate.mjs:164
const stats = await lstat(path); - 读取本地文件conformance/apply-patch-engine/run-candidate.mjs:170
target: await readlink(path), - 读取本地文件conformance/apply-patch-engine/run-candidate.mjs:179
bytesHex: (await readFile(path)).toString("hex"), - 读取本地文件conformance/apply-patch-engine/run-candidate.mjs:262
await readFile(corpusPath, "utf8"), - 删除本地文件递归conformance/apply-patch-engine/run-candidate.mjs:299
roots.map((root) => rm(root, { recursive: true, force: true })), - 删除本地文件conformance/apply-patch-engine/run-candidate.mjs:301
await rm(stagedOutput, { force: true }); - 读取本地文件conformance/approval/compare-adapter-contract.mjs:23
readFile(contractPath, "utf8").then((text) => - 读取本地文件conformance/approval/compare-adapter-contract.mjs:26
readFile(outputPath, "utf8").then((text) => parseJsonl(text, outputPath)), - 读取本地文件conformance/approval/compare.mjs:25
const values = parseJsonl(await readFile(resolved, "utf8"), resolved); - 读取本地文件conformance/approval/compare.mjs:92
readFile(resolve(corpusArg), "utf8").then((text) => - 读取本地文件conformance/approval/lib.mjs:54
return parseJsonl(await readFile(resolved, "utf8"), resolved); - 发起网络请求conformance/approval/run-adapter-contract.mjs:97
const first = runtime.service.request( - 发起网络请求conformance/approval/run-adapter-contract.mjs:100
const second = runtime.service.request( - 发起网络请求conformance/approval/run-adapter-contract.mjs:126
const pending = runtime.service.request( - 发起网络请求conformance/approval/run-adapter-contract.mjs:148
const pending = runtime.service.request(request()); - 发起网络请求conformance/approval/run-adapter-contract.mjs:170
const pending = runtime.service.request(request()); - 发起网络请求conformance/approval/run-adapter-contract.mjs:195
const resolution = await runtime.service.request(request()); - 读取本地文件conformance/approval/run-adapter-contract.mjs:378
const cases = parseJsonl(await readFile(args.corpus, "utf8"), args.corpus); - 写入本地文件conformance/approval/run-adapter-contract.mjs:393
await mkdir(dirname(args.output), { recursive: true }); - 写入本地文件conformance/approval/run-adapter-contract.mjs:394
await writeFile( - 发起网络请求conformance/approval/run-candidate.mjs:210
const resolution = await runtime.service.request({ - 发起网络请求conformance/approval/run-candidate.mjs:282
const resolution = await runtime.service.request({ - 发起网络请求conformance/approval/run-candidate.mjs:352
.request({ - 读取本地文件conformance/approval/run-candidate.mjs:397
.update(await readFile(resolve(packageDir, relativePath))) - 读取本地文件conformance/approval/run-candidate.mjs:404
const corpusText = await readFile(args.corpus, "utf8"); - 写入本地文件conformance/approval/run-candidate.mjs:477
await mkdir(dirname(args.output), { recursive: true }); - 写入本地文件conformance/approval/run-candidate.mjs:478
await writeFile( - 读取本地文件conformance/config-stack/compare.mjs:194
readFile(oraclePath, "utf8").then((text) => parseJsonl(text, oraclePath)), - 读取本地文件conformance/config-stack/compare.mjs:195
readFile(candidatePath, "utf8").then((text) => - 执行外部命令来自配置/变量conformance/config-stack/run-candidate.mjs:286
this.#child = spawn(engine, [], { stdio: ["pipe", "pipe", "pipe"] }); - 发起网络请求conformance/config-stack/run-candidate.mjs:393
const response = await this.request(method, params); - 写入本地文件conformance/config-stack/run-candidate.mjs:480
await mkdir(layerRoot, { recursive: true }); - 写入本地文件conformance/config-stack/run-candidate.mjs:481
await writeFile( - 写入本地文件conformance/config-stack/run-candidate.mjs:488
await mkdir(rulesRoot, { recursive: true }); - 写入本地文件conformance/config-stack/run-candidate.mjs:489
await writeFile(join(rulesRoot, rule.name), rule.source, "utf8"); - 写入本地文件conformance/config-stack/run-candidate.mjs:503
await mkdir(requirementsRoot, { recursive: true }); - 写入本地文件conformance/config-stack/run-candidate.mjs:505
await writeFile(file, layer.toml, "utf8"); - 发起网络请求conformance/config-stack/run-candidate.mjs:538
const loadResponse = await sidecar.request("load_config_stack", params); - 读取本地文件conformance/config-stack/run-candidate.mjs:594
const cases = parseJsonl(await readFile(args.corpus, "utf8"), args.corpus); - 删除本地文件递归conformance/config-stack/run-candidate.mjs:627
await rm(tempRoot, { recursive: true, force: true }); - 读取本地文件conformance/host-config/compare.mjs:196
readFile(oraclePath, "utf8").then((text) => parseJsonl(text, oraclePath)), - 读取本地文件conformance/host-config/compare.mjs:197
readFile(candidatePath, "utf8").then((text) => - 执行外部命令来自配置/变量conformance/host-config/run-candidate.mjs:300
this.#child = spawn(engine, [], { stdio: ["pipe", "pipe", "pipe"], env }); - 发起网络请求conformance/host-config/run-candidate.mjs:406
const response = await this.request(method, params); - 读取本地文件conformance/host-config/run-candidate.mjs:496
const metadata = await lstat(path); - 读取本地文件conformance/host-config/run-candidate.mjs:498
entries.push([relativePath, "symlink", await readlink(path)]); - 读取本地文件conformance/host-config/run-candidate.mjs:503
const children = await readdir(path); - 读取本地文件conformance/host-config/run-candidate.mjs:515
.update(await readFile(path)) - 写入本地文件conformance/host-config/run-candidate.mjs:527
await mkdir(join(caseRoot, "home"), { recursive: true }); - 写入本地文件conformance/host-config/run-candidate.mjs:529
await mkdir(join(caseRoot, directory), { recursive: true }); - 写入本地文件conformance/host-config/run-candidate.mjs:533
await mkdir(dirname(path), { recursive: true }); - 写入本地文件conformance/host-config/run-candidate.mjs:534
await writeFile( - 写入本地文件conformance/host-config/run-candidate.mjs:542
await mkdir(dirname(path), { recursive: true }); - 发起网络请求conformance/host-config/run-candidate.mjs:594
const response = await sidecar.request( - 读取本地文件conformance/host-config/run-candidate.mjs:660
await access(path); - 读取本地文件conformance/host-config/run-candidate.mjs:683
const cases = parseJsonl(await readFile(args.corpus, "utf8"), args.corpus); - 写入本地文件conformance/host-config/run-candidate.mjs:685
await mkdir(dirname(args.output), { recursive: true }); - 执行外部命令来自配置/变量conformance/host-config/run-candidate.mjs:720
const child = spawn( - 删除本地文件递归conformance/host-config/run-candidate.mjs:744
await rm(tempRoot, { recursive: true, force: true }); - 读取本地文件conformance/host-config/validate-output.mjs:125
readFile(resolve(args.corpus), "utf8").then((text) => - 读取本地文件conformance/host-config/validate-output.mjs:128
readFile(resolve(args.output), "utf8").then((text) => - 读取本地文件conformance/host-config/verify-bundled-output.mjs:77
const text = await readFile(path, "utf8"); - 读取本地文件conformance/persistence/lib.mjs:231
const bytes = await readFile(path); - 执行外部命令来自配置/变量conformance/persistence/run-candidate.mjs:41
this.#child = spawn(engine, [], { stdio: ["pipe", "pipe", "pipe"] }); - 发起网络请求conformance/persistence/run-candidate.mjs:168
await this.request("shutdown"); - 读取本地文件conformance/persistence/run-candidate.mjs:239
metadata = await lstat(path); - 读取本地文件conformance/persistence/run-candidate.mjs:248
return { kind: "file", content: await readFile(path, "utf8") }; - 写入本地文件conformance/persistence/run-candidate.mjs:262
if (initial.home === "directory") await mkdir(home, { recursive: true }); - 写入本地文件conformance/persistence/run-candidate.mjs:264
await mkdir(join(home, "rules"), { recursive: true }); - 写入本地文件conformance/persistence/run-candidate.mjs:265
await writeFile( - 写入本地文件conformance/persistence/run-candidate.mjs:272
await writeFile( - 发起网络请求conformance/persistence/run-candidate.mjs:300
client.request("diagnostics"), - 发起网络请求conformance/persistence/run-candidate.mjs:301
client.request("compile_network_domains"), - 发起网络请求conformance/persistence/run-candidate.mjs:369
const hello = await client.request("hello"); - 发起网络请求conformance/persistence/run-candidate.mjs:373
const opened = await client.request( - 发起网络请求conformance/persistence/run-candidate.mjs:397
const appended = await client.request("append_prefix_amendment", { - 写入本地文件conformance/persistence/run-candidate.mjs:431
await mkdir(join(home, "rules"), { recursive: true }); - 写入本地文件conformance/persistence/run-candidate.mjs:432
await writeFile( - 删除本地文件递归conformance/persistence/run-candidate.mjs:449
await rm(home, { recursive: true, force: true }); - 删除本地文件递归conformance/persistence/run-candidate.mjs:453
await rm(join(home, "rules"), { recursive: true, force: true }); - 删除本地文件递归conformance/persistence/run-candidate.mjs:489
rm(root, { recursive: true, force: true }), - 读取本地文件conformance/persistence/run-candidate.mjs:514
.update(await readFile(args.engine)) - 删除本地文件递归conformance/persistence/run-candidate.mjs:547
rm(stagingDir, { recursive: true, force: true }), - 读取本地文件conformance/persistence/validate-output.mjs:242
await readFile(outputPath, "utf8"), - 读取本地文件conformance/upstream-runtime/compare.mjs:82
readFile(oraclePath, "utf8").then((text) => parseJsonl(text, oraclePath)), - 读取本地文件conformance/upstream-runtime/compare.mjs:83
readFile(candidatePath, "utf8").then((text) => - 执行外部命令来自配置/变量conformance/upstream-runtime/run-candidate.mjs:92
this.#child = spawn(engine, [], { stdio: ["pipe", "pipe", "pipe"] }); - 发起网络请求conformance/upstream-runtime/run-candidate.mjs:195
await this.request("shutdown", {}); - 执行外部命令来自配置/变量conformance/upstream-runtime/run-candidate.mjs:288
const child = spawn( - 读取本地文件conformance/upstream-runtime/run-candidate.mjs:336
const cases = parseJsonl(await readFile(args.corpus, "utf8"), args.corpus); - 发起网络请求conformance/upstream-runtime/run-candidate.mjs:340
const hello = await sidecar.request("hello", {}); - 发起网络请求conformance/upstream-runtime/run-candidate.mjs:350
await sidecar.request("load", { - 发起网络请求conformance/upstream-runtime/run-candidate.mjs:358
const result = await sidecar.request( - 写入本地文件conformance/upstream-runtime/run-candidate.mjs:376
await mkdir(dirname(args.output), { recursive: true }); - 写入本地文件conformance/upstream-runtime/run-candidate.mjs:377
await writeFile(args.output, `${output.join("\n")}\n`, "utf8"); - 读取本地文件packages/apply-patch-engine/src/client.ts:193
if (!existsSync(candidate) || !statSync(candidate).isFile()) continue; - 读取本地文件packages/apply-patch-engine/src/client.ts:193
if (!existsSync(candidate) || !statSync(candidate).isFile()) continue; - 读取本地文件packages/apply-patch-engine/src/client.ts:195
const mode = statSync(candidate).mode; - 写入本地文件packages/apply-patch-engine/src/client.ts:196
if ((mode & 0o111) === 0) chmodSync(candidate, mode | 0o100); - 执行外部命令来自配置/变量packages/apply-patch-engine/src/client.ts:270
this.child = spawn(enginePath, [...(options.engineArgs ?? [])], { - 读取本地文件packages/approval/src/client.ts:155
const mode = statSync(enginePath).mode & 0o777; - 写入本地文件packages/approval/src/client.ts:156
if ((mode & 0o100) === 0) chmodSync(enginePath, mode | 0o100); - 读取本地文件packages/approval/src/client.ts:186
const candidate = candidates.find((path) => existsSync(path)); - 执行外部命令来自配置/变量packages/approval/src/client.ts:490
this.child = spawn(enginePath, [...(options.engineArgs ?? [])], { - 发起网络请求packages/approval/src/dsh-compat.ts:44
const outcome: DshOneShotApprovalOutcome = await options.request(prompt); - 发起网络请求packages/approval/src/service.ts:224
return this.request({ - 发起网络请求packages/approval/src/service.ts:522
candidate = await backend.request(record.prompt); - 读取本地文件packages/execpolicy/src/client.ts:278
const mode = statSync(enginePath).mode & 0o777; - 写入本地文件packages/execpolicy/src/client.ts:279
if ((mode & 0o100) === 0) chmodSync(enginePath, mode | 0o100); - 读取本地文件packages/execpolicy/src/client.ts:309
const candidate = candidates.find((path) => existsSync(path)); - 执行外部命令来自配置/变量packages/execpolicy/src/client.ts:385
this.child = spawn(enginePath, [...(options.engineArgs ?? [])], {
扫描于 2026/11/3(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 拆分为可独立安装插件
- 按边界逐项复现行为
- 不调用原二进制
把 OpenAI Codex 重建成精确、可独立安装的 DeepSeek Harness 插件,不调用 Codex 二进制。
README
由 DeepSeek 最新模型翻译生成dsh-codex
把 OpenAI Codex 重建为精确、可独立安装的 DeepSeek Harness 组件。
dsh-codex 将 Codex 拆成职责清晰的 DSH 插件,再把这些插件组合成 coding agent。运行时由 DSH 自己承载:组件不会调用 codex 二进制,也不会把 Codex 当成 subagent 委托任务。
每个已完成组件都复现 OpenAI Codex 固定提交 086396f 中一个定义明确的边界。原则很简单:组件可以小,但声明边界内的行为必须精确。
仓库仍在持续开发。目前有三个基础组件通过验证;只安装它们还不能得到完整 Codex agent。
💡 为什么做 dsh-codex?
DeepSeek Harness 以可组合插件为核心。dsh-codex 利用这种架构,把 Codex 子系统变成拥有明确状态、生命周期、安装方式和 conformance 边界的 DSH 服务。
这样可以:
- 一次安装、验证一个 Codex 能力;
- 在不同 DSH coding-agent profile 中复用同一个组件;
- 替换或组合组件,而不把行为藏进单体 wrapper;
- 把每个已完成边界与固定上游实现逐项比较;
- 最终构建 DSH 原生 coding agent,而不是原生 Codex 二进制的桥接器。
展开完整文档(README 剩余 1 节)
dsh-codex 把 OpenAI Codex 重建为精确、可独立安装的 DeepSeek Harness 组件。 dsh-codex 将 Codex 拆成职责清晰的 DSH 插件,再把这些插件组合成 coding agent。运行时由 DSH 自己承载:组件不会调用 codex 二进制,也不会把 Codex 当成 subagent 委托任务。 每个已完成组件都复现 OpenAI Codex 固定提交 086396f 中一个定义明确的边界。原则很简单:组件可以小,但声明边界内的行为必须精确。 仓库仍在持续开发。目前有三个基础组件通过验证;只安装它们还不能得到完整 Codex agent。 💡 为什么做 dsh-codex? DeepSeek Harness 以可组合插件为核心。dsh-codex 利用这种架构,把 Codex 子系统变成拥有明确状态、生命周期、安装方式和 conformance 边界的 DSH 服务。 这样可以: - 一次安装、验证一个 Codex 能力; - 在不同 DSH coding-agent profile 中复用同一个组件; - 替换或组合组件,而不把行为藏进单体 wrapper; - 把每个已完成边界与固定上游实现逐项比较; - 最终构建 DSH 原生 coding agent,而不是原生 Codex 二进制的桥接器。 🧩 已完成组件 | 组件 | 提供的能力 | 状态 | | @songyang0603/dsh-codex-execpolicy | Codex policy/config 发现、命令分类、approval requirement 推导、迁移与规则持久化 | 0.1.0 · macOS arm64 源码 parity_verified | | @songyang0603/dsh-codex-approval | 无损 rich approval 协议、pending 请求关联、取消和 live-session approval cache | 0.1.0 · macOS arm64 源码 parity_verified | | @songyang0603/dsh-codex-apply-patch-engine | apply-patch 解析、调用识别、校验、本地变更与有序 committed delta | 0.1.0 · macOS arm64 源码 parity_verified | Codex 的完整拆分见组件地图,parity_verified 的完成标准见精确性标准。 🚀 快速开始 需要 Node.js 22.19+、pnpm 10.19、Rust 1.95.0 和 DeepSeek Harness 0.1.0-rc.6。 git clone https://github.com/songyang0603/dsh-codex.git cd dsh-codex pnpm install pnpm native:stage pnpm build 把三个已完成组件安装到同一个本地 DSH profile: dsh plugin --profile codex-dev add ./packages/execpolicy dsh plugin --profile codex-dev add ./packages/approval dsh plugin --profile codex-dev add ./packages/apply-patch-engine dsh --profile codex-dev --dump-config 这些 bundle 会挂载三个 Cordis 服务: ctx.codexExecPolicy ctx.codexApproval ctx.codexApplyPatch native:stage 会编译当前平台的 Rust sidecar,核对协议和固定上游源码身份,再写入包内二进制与 SHA-256 文件。生成的二进制不会提交到 Git。 目前组件只从源码使用;尚未宣称发布 npm 包或 GitHub native binary。 ⚙️ 工作方式 固定 Codex 源码 │ ├── 原生语义引擎(Rust) │ └── 精确上游类型与行为 │ ├── DSH 组件包(TypeScript + Cordis) │ └── 生命周期、IPC、校验与服务所有权 │ ├── canonical composition profile(开发中) │ └── shell、sandbox、network、provider、session 与 UI │ └── 独立 conformance 套件 └── 固定上游 oracle ↔ 生产组件 当 TypeScript 重写容易引入语义漂移时,组件使用 native sidecar。DSH 包负责进程生命周期并暴露类型化 Cordis 服务;approval、sandbox、network 和执行顺序由独立消费者组件拥有,避免双重提示或隐藏 bypass。 每个可安装包都有自己的 dsh.bundle.patch、profile row、编译入口、说明、许可声明和精确 peer。仓库根目录是组件 workspace,不是一个可安装的全家桶 bundle。 ✅ 当前精确性证据 | 边界 | 独立比较 | 包与运行时检查 | | Execpolicy | runtime 68/68;config stack 6/6;host discovery 11/11;migration/persistence 16/16 | 18 个 TypeScript/native/真实 Loader 测试,以及全新 DSH rc.6 归档 smoke test | | Approval | 上游/固定源码 43/43;DSH adapter contract 10/10 | 49 个包测试,以及全新 DSH rc.6 add/activate/remove profile 测试 | | Apply-patch 语义引擎 | 固定上游 96 个测试全部通过;差分 oracle 23/23 | 10 个 native 测试、6 个 TypeScript/native/真实 Loader 测试和全新归档 mutation 测试 | Oracle 由固定上游源码编译,候选输出不会充当自己的 oracle。精确命令、身份、哈希、失败记录和排除范围位于 conformance/*/STATUS.md 与 upstreams.lock.json。 🌍 平台边界 | 平台 | 当前处理 | | macOS arm64 | parity_verified;当前源码与打包目标 | | macOS x64 | planned / unverified;保留兼容性 CI,但不声明 parity | | Linux x64/arm64 | planned / unverified;保留上游源码、corpus 与非阻断 CI,不发布 binary | | Windows x64 | planned / unverified;保留上游 cfg(windows)、PowerShell corpus 与非阻断 CI,不发布 binary | 在 macOS 上运行 Windows/Linux 风格输入,不构成对应操作系统的证据。平台 parity 必须让固定上游 oracle 与 candidate 在同一个真实平台执行。项目保留上游平台分支和 conformance 入口,避免未来重新研究;但不会发布猜测性兼容代码或未经验证的 native binary。 精确策略见平台支持与证据。 📁 仓库内容 crates/ 原生语义引擎 packages// 可独立安装的 DSH 插件 conformance// 独立上游 oracle 与小型 corpus docs/ 架构、包契约与精确性边界 research/ 固定版本的 DSH 生态插件实现研究 scripts/ pin 校验、打包与 native staging upstreams.lock.json 机器可读的 Git/npm 身份 临时 JSONL、Cargo target、包构建产物和 native binary 不会提交。小型 corpus 与只用于测试的上游 instrumentation 会保留,让贡献者能够复现 parity 声明。 🛠️ 开发 pnpm check 重量级 conformance workflow 会单独运行,因为它们需要编译固定的 Codex 上游 crate。每个组件的命令和 API 见: - Execpolicy - Approval - Apply-patch 语义引擎 🤝 参与贡献 欢迎提交 Issue 和 Pull Request。新组件应拥有一个清晰子系统边界,可以独立安装,遵守 DSH 生命周期语义,固定上游身份,并在声明 parity 前提供可复现的 conformance 证据。 建议先阅读组件包契约、组件地图和 DSH 生态兼容性研究。 🔗 上游与独立性 本项目是独立社区项目,与 OpenAI 或 DeepSeek 不存在隶属、背书或赞助关系。 OpenAI Codex 与 DeepSeek Harness 是彼此独立的上游项目。这里使用它们的名称,是为了标识研究和集成对象,并不表示官方身份。 📄 许可 Apache-2.0。参见 LICENSE、NOTICE、THIRD_PARTY_NOTICES.md 与 UPSTREAMS.md。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
songyang0603/dsh-codex
把 Codex 拆成可独立安装的插件,按边界逐项复现行为
相关插件 · 市场 / 管理
插件精选列表awesome-dsh-plugin/awesome-dsh-plugin
DeepSeek Harness(dsh)插件精选列表
★ 22,025未汉化DSH
73.6
新词雷达zhuyansen/new-term-radar
new-term-radar新词雷达
★ 2,049已汉化MCP
72.8
插件生态导航0xsline/awesome-deepseek-harness
安装 贡献指南 DeepSeek Docs 公开插件目录 Issues
★ 1,188已汉化DSH
72.6
技能注册中心iflytek/skillhub
企业级开源智能体技能注册中心——发布、发现并管理组织内可复用的技能包。
★ 5,358已汉化DSH
71.9
插件市场目录imsai-sh/awesome-deepseek-harness-plugins
面向 DeepSeek Harnessdsh生态的社区插件目录,共收录 13938 个插件含 PR 收录与…
★ 350已汉化DSH
71.8
插件精选清单Anil-matcha/awesome-dsh-plugin
DeepSeek Harnessdsh精选指南——DeepSeek…
★ 1,013已汉化DSH
71.7
这是你的仓库?认领条目