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

配置套装安装器 sergey-akhalkov/dsh-setup

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

一条命令装齐规则、技能与跨模型委派插件

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

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add sergey-akhalkov/dsh-setup
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · market
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
暂无时间戳·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 8 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

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

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

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 119 处,展示前 94 条)
  • 发起网络请求
    packages/plugin-admin-indicator/lib/client.js:223
    fetch(STATUS_PATH, {
  • 执行外部命令固定命令
    packages/plugin-admin-indicator/lib/elevation.js:23
    execFile('whoami.exe', ['/groups'], { encoding: 'utf8', windowsHide: true, timeout: 5_000 }, (error, stdout) => {
  • 执行外部命令来自配置/变量
    packages/plugin-admin-indicator/lib/restart.js:76
    const child = spawn(WINDOWS_POWERSHELL, ['-NoProfile', '-NonInteractive', '-WindowStyle', 'Hidden', '-EncodedCommand', encoded], { detached: true, std
  • 执行外部命令来自配置/变量
    packages/plugin-admin-indicator/lib/shortcut.js:53
    execFile(WINDOWS_POWERSHELL, ['-NoProfile', '-NonInteractive', '-EncodedCommand', encoded], { encoding: 'utf8', windowsHide: true, timeout: 15_000 },
  • 读取本地文件
    packages/plugin-answer-page/lib/index.js:59
    const parsed = JSON.parse(readFileSync(join(directory, 'answer-page.lock.json'), 'utf8'));
  • 读取本地文件
    packages/plugin-answer-page/lib/index.js:186
    const content = await readFile(recordFile(directory, record), { signal: options.signal });
  • 读取本地文件
    packages/plugin-answer-page/lib/index.js:189
    const body = await readFile(skillFile, { encoding: 'utf8', signal: options.signal });
  • 读取本地文件
    packages/plugin-answer-page/lib/index.js:215
    if (!statSync(file, { throwIfNoEntry: false })?.isFile()) {
  • 读取本地文件
    packages/plugin-answer-page/lib/index.js:218
    assertVendoredBytes(record, readFileSync(file));
  • 写入本地文件
    packages/plugin-codex-subagent/lib/index.js:102
    mkdirSync(join(home, "projects", basename(cwd)), {
  • 写入本地文件
    packages/plugin-codex-subagent/lib/index.js:105
    writeFileSync(join(home, SERENA_CONFIG_FILENAME), serenaConfigContent(home), {
  • 删除本地文件
    packages/plugin-codex-subagent/lib/index.js:110
    rmSync(home, {
  • 删除本地文件
    packages/plugin-codex-subagent/lib/index.js:125
    rmSync(home, {
  • 读取本地文件
    packages/plugin-codex-subagent/lib/index.js:149
    const parsed = JSON.parse(readFileSync(reviewThreadStatePath(cwd), "utf8"));
  • 写入本地文件
    packages/plugin-codex-subagent/lib/index.js:189
    mkdirSync(dirname(path), { recursive: true });
  • 写入本地文件
    packages/plugin-codex-subagent/lib/index.js:192
    writeFileSync(temporary, `${JSON.stringify({
  • 写入本地文件
    packages/plugin-codex-subagent/lib/index.js:199
    renameSync(temporary, path);
  • 删除本地文件
    packages/plugin-codex-subagent/lib/index.js:202
    rmSync(temporary, { force: true });
  • 读取本地文件
    packages/plugin-codex-subagent/lib/index.js:254
    return statSync(path).isFile();
  • 读取本地文件
    packages/plugin-codex-subagent/lib/index.js:262
    accessSync(path, fsConstants.X_OK);
  • 读取本地文件
    packages/plugin-codex-subagent/lib/index.js:304
    const version = JSON.parse(readFileSync(manifestPath, "utf8")).version;
  • 写入本地文件
    packages/plugin-codex-subagent/lib/index.js:465
    writeFileSync(wrapper, [
  • 删除本地文件
    packages/plugin-codex-subagent/lib/index.js:474
    rmSync(directory, {
  • 删除本地文件
    packages/plugin-codex-subagent/lib/index.js:484
    rmSync(directory, {
  • 发起网络请求
    packages/plugin-codex-subagent/lib/index.js:978
    object(await this.guarded(this.transport.request("initialize", {
  • 发起网络请求
    packages/plugin-codex-subagent/lib/index.js:1001
    const thread = object(object(await this.guarded(this.transport.request("thread/start", {
  • 发起网络请求
    packages/plugin-codex-subagent/lib/index.js:1023
    const thread = object(object(await this.guarded(this.transport.request("thread/resume", {
  • 发起网络请求
    packages/plugin-codex-subagent/lib/index.js:1048
    const turn = object(object(await this.guarded(this.transport.request("turn/start", {
  • 发起网络请求
    packages/plugin-codex-subagent/lib/index.js:1114
    this.transport.request("turn/interrupt", {
  • 读取本地文件
    packages/plugin-goal-continuity/lib/index.js:542
    return readFileSync(path, 'utf8').slice(0, max);
  • 读取本地文件
    packages/plugin-goal-continuity/lib/index.js:732
    const value = JSON.parse(readFileSync(path, 'utf8'));
  • 读取本地文件
    packages/plugin-goal-continuity/lib/index.js:773
    return (await readdir(attemptsDirectory(workspace, goalId))).length;
  • 写入本地文件
    packages/plugin-goal-continuity/lib/index.js:783
    await mkdir(directory, { recursive: true });
  • 写入本地文件
    packages/plugin-goal-continuity/lib/index.js:784
    await writeFile(join(directory, `${Date.now()}-${randomUUID()}`), '1', 'utf8');
  • 写入本地文件
    packages/plugin-goal-continuity/lib/index.js:793
    await mkdir(dirname(path), { recursive: true });
  • 写入本地文件
    packages/plugin-goal-continuity/lib/index.js:795
    await writeFile(temporary, `${JSON.stringify(record, null, 2)}\n`, 'utf8');
  • 写入本地文件
    packages/plugin-goal-continuity/lib/index.js:796
    await rename(temporary, path);
  • 读取本地文件
    packages/plugin-goal-continuity/lib/index.js:883
    reviewerInstructions = readFileSync(join(assetsDirectory, 'blocker-review.md'), 'utf8').trim();
  • 读取本地文件
    packages/plugin-goal-continuity/lib/index.js:1628
    names = readdirSync(checkpointDirectory(workspace, sessionId));
  • 读取本地文件
    packages/plugin-goal-continuity/lib/index.js:1641
    const value = JSON.parse(readFileSync(checkpointPathFor(workspace, sessionId, turn), 'utf8'));
  • 发起网络请求
    packages/plugin-hindsight/lib/export-client.js:56
    return await this.#fetch(url, {
  • 读取本地文件
    packages/plugin-hindsight/lib/export-config.js:27
    const parsed = JSON.parse(readFileSync(path, 'utf8'));
  • 写入本地文件
    packages/plugin-hindsight/lib/export-git.js:33
    mkdirSync(dir, { recursive: true });
  • 读取本地文件
    packages/plugin-hindsight/lib/export-git.js:35
    if (!existsSync(file)) {
  • 写入本地文件
    packages/plugin-hindsight/lib/export-git.js:36
    writeFileSync(file, ASKPASS_SCRIPT);
  • 写入本地文件
    packages/plugin-hindsight/lib/export-git.js:38
    chmodSync(file, 0o755);
  • 写入本地文件
    packages/plugin-hindsight/lib/export-git.js:44
    mkdirSync(dirname(dir), { recursive: true });
  • 写入本地文件
    packages/plugin-hindsight/lib/export-git.js:46
    writeFileSync(file, ASKPASS_SCRIPT);
  • 写入本地文件
    packages/plugin-hindsight/lib/export-git.js:48
    chmodSync(file, 0o755);
  • 执行外部命令固定命令
    packages/plugin-hindsight/lib/export-git.js:66
    const child = spawn('git', args, {
  • 读取本地文件
    packages/plugin-hindsight/lib/export-git.js:138
    if (!existsSync(join(dir, '.git'))) {
  • 读取本地文件
    packages/plugin-hindsight/lib/export-git.js:140
    if (existsSync(dir) && readdirSync(dir).length > 0) {
  • 读取本地文件
    packages/plugin-hindsight/lib/export-git.js:140
    if (existsSync(dir) && readdirSync(dir).length > 0) {
  • 删除本地文件
    packages/plugin-hindsight/lib/export-git.js:156
    rmSync(temporaryAskpass, { force: true });
  • 读取本地文件
    packages/plugin-hindsight/lib/export-git.js:168
    if (!existsSync(ignoreFile))
  • 读取本地文件
    packages/plugin-hindsight/lib/export-snapshot.js:17
    const parsed = JSON.parse(readFileSync(path, 'utf8'));
  • 写入本地文件
    packages/plugin-hindsight/lib/export-snapshot.js:54
    copyFileSync(candidate, target, constants.COPYFILE_EXCL);
  • 写入本地文件
    packages/plugin-hindsight/lib/export-snapshot.js:77
    mkdirSync(repoDir, { recursive: true });
  • 写入本地文件
    packages/plugin-hindsight/lib/export-snapshot.js:79
    writeFileSync(candidate, JSON.stringify({ owner, created_at: new Date(now()).toISOString() }));
  • 删除本地文件
    packages/plugin-hindsight/lib/export-snapshot.js:87
    rmSync(lockPath, { force: true });
  • 删除本地文件
    packages/plugin-hindsight/lib/export-snapshot.js:107
    rmSync(takeoverPath, { force: true });
  • 删除本地文件
    packages/plugin-hindsight/lib/export-snapshot.js:121
    rmSync(lockPath, { force: true });
  • 删除本地文件
    packages/plugin-hindsight/lib/export-snapshot.js:127
    rmSync(takeoverPath, { force: true });
  • 删除本地文件
    packages/plugin-hindsight/lib/export-snapshot.js:133
    rmSync(candidate, { force: true });
  • 删除本地文件递归
    packages/plugin-hindsight/lib/export-snapshot.js:195
    rmSync(path, { recursive: true, force: true });
  • 读取本地文件
    packages/plugin-hindsight/lib/export-snapshot.js:198
    return readdirSync(repoDir).filter((name) => name.startsWith(`${BANKS_DIR}.old-`));
  • 写入本地文件
    packages/plugin-hindsight/lib/export-snapshot.js:203
    writeFileSync(temporary, JSON.stringify(journal));
  • 写入本地文件
    packages/plugin-hindsight/lib/export-snapshot.js:204
    renameSync(temporary, path);
  • 读取本地文件
    packages/plugin-hindsight/lib/export-snapshot.js:216
    if (!existsSync(pendingFile))
  • 读取本地文件
    packages/plugin-hindsight/lib/export-snapshot.js:221
    const parsed = JSON.parse(readFileSync(pendingFile, 'utf8'));
  • 读取本地文件
    packages/plugin-hindsight/lib/export-snapshot.js:236
    .find((directory) => existsSync(directory));
  • 写入本地文件
    packages/plugin-hindsight/lib/export-snapshot.js:243
    renameSync(existingBackup, banksDir);
  • 读取本地文件
    packages/plugin-hindsight/lib/export-snapshot.js:246
    else if (!existsSync(banksDir)) {
  • 读取本地文件
    packages/plugin-hindsight/lib/index.js:75
    const parsed = JSON.parse(readFileSync(path, 'utf8'));
  • 读取本地文件
    packages/plugin-hindsight/lib/index.js:111
    return existsSync(local) ? local : 'hindsight-embed';
  • 发起网络请求
    packages/plugin-hindsight/lib/index.js:132
    const health = await fetch(new URL('/health', apiUrl), {
  • 读取本地文件
    packages/plugin-hindsight/lib/index.js:143
    if (existsSync(cert)) {
  • 执行外部命令来自配置/变量
    packages/plugin-hindsight/lib/index.js:147
    const child = spawn(embedCommand(), ['daemon', 'start'], {
  • 读取本地文件
    packages/plugin-nuphus-mcp/lib/index.js:56
    const body = await readFile(skillFile, { encoding: 'utf8', signal: options.signal });
  • 写入剪贴板
    packages/plugin-observability/lib/client.js:544
    void clipboard.writeText(text).catch(() => {
  • 发起网络请求
    packages/plugin-observability/lib/client.js:2553
    fetch(reportUrl(range, sessionId, needsHypotheses), {
  • 读取本地文件
    packages/plugin-openspec/lib/index.js:52
    const parsed = JSON.parse(readFileSync(lockFile, 'utf8'));
  • 读取本地文件
    packages/plugin-openspec/lib/index.js:82
    const text = readFileSync(guidanceFile, 'utf8');
  • 读取本地文件
    packages/plugin-openspec/lib/index.js:146
    const raw = await readFile(file, { encoding: 'utf8', signal: options.signal });
  • 读取本地文件
    packages/plugin-ponytail/lib/index.js:48
    const parsed = JSON.parse(readFileSync(lockFile, 'utf8'));
  • 读取本地文件
    packages/plugin-ponytail/lib/index.js:118
    const body = await readFile(skillFile, { encoding: 'utf8', signal: options.signal });
  • 读取本地文件
    packages/plugin-ponytail/lib/index.js:133
    const rules = readFileSync(rulesFile, 'utf8');
  • 读取本地文件
    packages/plugin-rtk/lib/index.js:51
    const content = await readFile(skillFile, { encoding: 'utf8', signal: options.signal });
  • 读取本地文件
    packages/plugin-rtk/lib/index.js:66
    const text = readFileSync(rulesFile, 'utf8');
  • 读取本地文件
    packages/plugin-rust/lib/index.js:54
    const body = await readFile(skillFile, { encoding: 'utf8', signal: options.signal });
  • 读取本地文件
    packages/plugin-serena/lib/index.js:62
    const body = await readFile(skillFile, { encoding: 'utf8', signal: options.signal });
  • 读取本地文件
    packages/plugin-serena/lib/index.js:77
    const text = readFileSync(rulesFile, 'utf8');
  • 读取本地文件
    packages/plugin-working-principles/lib/index.js:96
    const body = await readFile(join(assetsDirectory, skill.directory, 'SKILL.md'), {
  • 读取本地文件
    packages/plugin-working-principles/lib/index.js:114
    const contract = readFileSync(contractFile, 'utf8');
扫描于 2026/11/4(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-plugin-market-index
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

便携的 DeepSeek Harness 配置:九个可安装的智能体插件,覆盖规则、技能、MCP 工具和跨模型委派,另有一条命令安装器和插件市场索引。

README

由 DeepSeek 最新模型翻译生成
dsh-setup 一套可移植、可安装的 DeepSeek Harness(DSH)配置:十一个插件包,覆盖智能体规则、技能、代码导航、流恢复、桌面自动化和跨模型委派,聚合成一个带 owner 默认值的 setup 包,另附静态插件市场索引和一条命令的安装器,能在另一台机器上复现这套配置。 每个插件也能单独安装;对同一个插件,要么用完整 setup,要么用单个插件,二者只能选其一。 安装或更新 从 Discover 安装单个插件 setup 和每个插件都列在已发布的市场索引里: https://sergey-akhalkov.github.io/dsh-setup/index.json 启用 Custom plugin markets(会新增 Discover 标签页),打开 Discover,把该 URL 添加为索引源。索引把每个列出的版本都固定到某个已审核的 commit;对同一个插件,要么装完整 setup,要么装单个插件,二者只能选其一,因为两者挂载的是同一行。完整步骤见手动安装。 从 Discover 安装 dsh-setup 条目,会挂载 setup 及其插件行,但不会启用其他随附的 DSH 包(Agent Teams、tool worktree、Ralph、session search、terminal)。
展开完整文档(README 剩余 1 节)
dsh-setup

一套可移植、可安装的 DeepSeek Harness(DSH)配置:十一个插件包,覆盖智能体规则、技能、代码导航、流恢复、桌面自动化和跨模型委派,聚合成一个带 owner 默认值的 setup 包,另附静态插件市场索引和一条命令的安装器,能在另一台机器上复现这套配置。

每个插件也能单独安装;对同一个插件,要么用完整 setup,要么用单个插件,二者只能选其一。

安装或更新

从 Discover 安装单个插件

setup 和每个插件都列在已发布的市场索引里:

https://sergey-akhalkov.github.io/dsh-setup/index.json

启用 Custom plugin markets(会新增 Discover 标签页),打开 Discover,把该 URL 添加为索引源。索引把每个列出的版本都固定到某个已审核的 commit;对同一个插件,要么装完整 setup,要么装单个插件,二者只能选其一,因为两者挂载的是同一行。完整步骤见手动安装。

从 Discover 安装 dsh-setup 条目,会挂载 setup 及其插件行,但不会启用其他随附的 DSH 包(Agent Teams、tool worktree、Ralph、session search、terminal)。请在 Plugins 里启用它们,或使用下面的完整 setup 命令。见随附的 DSH 包。

用 PowerShell 安装完整 setup

在 Windows 上想一条命令装完整套配置时用这个。请在普通 PowerShell 窗口里运行,不要在 DeepSeek Harness 托管的终端里运行。先启动一次 DeepSeek Harness 再退出,让 desktop 配置档存在。

irm https://raw.githubusercontent.com/sergey-akhalkov/dsh-setup/main/install.ps1 | iex

安装器会打印计划、关闭 DeepSeek Harness、备份配置档清单和补丁、启用随附的 DSH 包、从最新 release 安装或更新 @dsh-setup/setup、校验结果,然后重新启动应用。重跑同一条命令即可更新;最新 release 已安装时,它什么也不改。

要用 -DryRun、换一个配置档或固定版本,请下载脚本再运行文件:

$installer = Join-Path $env:TEMP 'dsh-setup-install.ps1'
Invoke-WebRequest https://raw.githubusercontent.com/sergey-akhalkov/dsh-setup/main/install.ps1 -OutFile $installer
& $installer -DryRun

全部选项、手动安装和更新行为见 docs/install.md。

依赖

缺少可选运行时不会影响启动:受影响的适配器会记录连接失败,技能只在被调用时才失败,委派会报告目标缺失,其余功能照常工作。按需为你要用的插件安装运行时。

| 依赖 | 用途 | 安装 |
| DeepSeek Harness Desktop 0.2.1-rc.3 | 运行任何插件;安装器会拒绝不受支持的版本 | 下载 DeepSeek Harness |
| PowerShell 5.1+(推荐 7) | 一键安装器 | 安装 PowerShell |
| Git | 安装器通过 commit 固定的 git spec 拉取安装脚本 | 下载 Git |
| Node.js 与 npm | 安装下面两个全局命令行前置依赖 | 下载 Node.js |
| uv(含 uvx) | Serena MCP,以及每次 Codex 委派运行都需要的 Serena 服务器 | 安装 uv |
| @nuphus/nuphus-mcp | Nuphus MCP 桌面与浏览器自动化 | npm install -g @nuphus/nuphus-mcp |
| @fission-ai/openspec@1.15.0 | 六个 OpenSpec 技能 | npm install -g @fission-ai/openspec@1.15.0 |
| rtk | RTK 路由规则与技能 | 安装 RTK |
| Codex CLI(随包提供) | Codex 子代理与默认委派目标 | 无需单独安装:安装包自带 @openai/codex 0.164.0;用命令 codex_subagent_status 打印的提示登录一次即可 |

安装器会装什么

十一个插件包全部挂载并默认启用,安装器会应用所有者默认值: deepseek-flash 模型,推理强度设为 high,深色主题,详细转录与用量显示,以及 cordis 智能体预设。配置档自带的 cordis.patch.yml 优先级仍高于这些默认值。

「常驻」贡献是一段系统提示词,每个模型步骤都要付费;按需技能只列在目录里,调用时才加载。

插件包

| 插件 | 启用的贡献 | 提供什么 |
| @dsh-setup/plugin-ponytail | 常驻规则集 + ponytail 技能 | 最小代码纪律:只做最小的完整改动,不加没要求的抽象,回复让忙碌的人读一遍就懂。内置上游提示词(MIT,每步约 0.7k token);alwaysOn: false 保留技能、去掉这段提示词。 |
| @dsh-setup/plugin-working-principles | 常驻工作契约 + working-principles、verify-change 技能 | 与用户对齐范围,主张要有证据,异议要具体,失败时转为恢复而不是重试;verify-change 用原始触发条件证明修复有效。每步约 1.2k token。 |
| @dsh-setup/plugin-rtk | 常驻路由规则 + rtk 技能 | 把体积大的 git、测试、构建、搜索输出交给 RTK 处理,压缩 shell 输出的 token,同时保留错误和退出码;原生命令仍是兜底方案。每步约 0.2k token;需要 rtk 命令行。 |
| @dsh-setup/plugin-serena | Serena MCP 适配器 + 常驻代码表面规则 + serena-discipline 技能(默认关闭) | 按符号导航和编辑,直接定位到确切的调用方,不用整文件通读;规则会先激活会话的项目,让第一次符号调用就成功,不必退回读文件。需要 uvx;启用后每步约 0.4k token。默认关闭:在 dsh-setup-serena 和 dsh-setup-serena-guidance 上设 disabled: false 即可启用。 |
| @dsh-setup/plugin-nuphus-mcp | Nuphus MCP 适配器 + nuphus-discipline 技能 | 面向需要真实界面的任务,提供桌面和浏览器控制:窗口、键盘鼠标、本地 OCR 与视觉、通过 CDP 操作 Chrome。默认情况下,改动机器状态需要你明确确认。需要 nuphus-mcp 二进制文件。 |
| @dsh-setup/plugin-openspec | 六个按需加载的 OpenSpec 技能 | 每个会话都能做规格驱动的变更:提议、探索、应用、更新、同步规格、归档。技能随插件提供;规格存放在各工作区的 openspec/ 里。需要 openspec 命令行。 |
| @dsh-setup/plugin-rust | rust 技能(按需加载) | 按 MSRV 正确使用标准库,给出最窄的 cargo check/test/clippy 命令,并诊断构建慢、测试慢、target 目录膨胀的问题。每步零开销。 |
| @dsh-setup/plugin-delegation-rules | delegate、task_progress、delegation_status 工具,回合停止门禁,技能 | 结构化第二模型评审、调研,以及隔离 worktree 补丁,记录与摘要绑定;严格门禁会中止回合,直到任务完成评审,或有进度说明解释未完成的工作。默认面向 Codex;禁用该行会移除工具和门禁。 |
| @dsh-setup/plugin-loop-guard | 宿主流守卫(不产生每步提示词开销) | 提前截断重复的流式推理,把简单的恢复提示引导进下一步,并通过有界回合重置逐级升级到明确停止;默认启用,子代理除外。见 loop-guard。 |
| @dsh-setup/plugin-codex-subagent | Codex 子代理服务商,内置固定版本的 CLI | 用于评审、阻塞项、调研和 bug 修复补丁的第二模型;运行 @openai/codex 0.164.0,复用你的 ~/.codex 登录,并固定其 Serena MCP 配置。需要登录一次;codex_subagent_status 会报告命令和解析到的 CLI。 |
| @dsh-setup/plugin-admin-indicator | 桌面管理员标签 + 快捷方式 | 在输入框权限控件旁显示可见的 Standard User/Administrator 徽标,表明桌面应用是否已提权;菜单会创建管理员桌面快捷方式,并弹出原生成功提示。重启操作放在默认关闭的 restart 标志后面,等待实机 UAC 验证。 |

@dsh-setup/setup 是元捆绑包:一次安装即可挂载全部十一个插件,并应用所有者默认配置;其可发布文件已随仓库提供,因此 git 安装无需构建步骤。

随附的 DSH 捆绑包

安装器还会启用 setup 所依赖的可选 DSH 捆绑包;setup 捆绑包不会重复它们的行:

- Agent Teams(@deepseek-ai/dsh-experimental-agent-team-profile)—— 持久队友、共享任务板,以及并行工作的隔离写入范围。
- Tool worktree(@deepseek-ai/dsh-experimental-tool-worktree)—— 每个智能体独立的 git worktree,让不同智能体写入时不会碰到同一份检出。
- Ralph(@deepseek-ai/dsh-experimental-ralph-bundle)—— 围绕一个不可变目标进行全新智能体迭代轮次。
- 自定义插件市场(@deepseek-ai/dsh-experimental-plugin-market-bundle)——Discover 标签页和外部市场索引源。
- 会话搜索(@deepseek-ai/dsh-experimental-session-search)——跨历史会话搜索。
- 终端(@deepseek-ai/dsh-experimental-terminal-bundle)——为 REPL 和交互式工作提供持久终端会话。

开发

需要 Node.js >=24.18.0 <25 和固定版本的 pnpm 11.28.5(安装 pnpm)。

pnpm install
pnpm check # typecheck, lint, build, tests
pnpm validate # full local gate, including generated-file and installer checks
pnpm dogfood # Windows: verify install.ps1 against a copy of this machine's profile

生成的文件会提交进仓库:setup 补丁、lib/ 输出和 client.js 打包产物都提前构建好,这样从 git 安装 bundle 时无需在安装阶段再构建。改动组合片段后运行 pnpm gen,改动 TypeScript 源码后运行 pnpm build;如果提交的生成文件与源码不一致,CI 会拒绝该提交。

文档

- 安装、更新、手动安装
- 插件开发
- Setup 组合与生成的 bundle
- 发布、Pages 与市场索引
- 委派规则与 Codex 子代理
- 插件说明:Ponytail、工作原则、 RTK、Rust、Serena、OpenSpec、循环防护
- 仓库操作指南:AGENTS.md

安全

安装 bundle 时,其中的代码会以 Harness 进程的权限运行。市场条目固定到确切的 git commit,因此审查过的源码和实际运行的代码是同一个版本。第三方提示词和技能以 vendored 方式引入,并附带来源锁定文件(ponytail.lock.json、openspec.lock.json),由离线测试校验。安装器在写入配置档时会关闭 DeepSeek Harness,先备份 manifest,并且只改动 bundle 选择和已安装的包——绝不改动配置档自身的补丁。本仓库不包含任何凭据、会话或与特定机器相关的路径。

许可证

MIT,版权 (c) 2026 Sergey Akhalkov。它覆盖本仓库中的原创代码和文档。以 vendored 方式引入的第三方内容保留其上游 MIT 许可证和署名,上游许可证随文件一同分发:packages/plugin-ponytail/assets/ponytail/ 中的 Ponytail 提示词、packages/plugin-openspec/assets/openspec/ 中的 OpenSpec 技能,以及 packages/plugin-codex-subagent/ 中的 Codex 子代理服务商。
预览分享卡片长什么样 ↓sergey-akhalkov/dsh-setup
分享 · DeepSeek Harness Hub
sergey-akhalkov/dsh-setup

一条命令装齐规则、技能与跨模型委派插件

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部