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

高级设置管理 oneinitAI/dsh-settings-plus

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

集中浏览编辑所有插件配置,支持表单与文件两种方式

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · other
装得上吗
实装验证未通过(unknown),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 79 天前
档位由哪些信号合成

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

验证判据与等级说明 →
⚠︎ 实装验证未通过(unknown · 2026/10/12) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件
查看扫描证据(共 36 处,展示前 30 条)
  • 删除本地文件递归
    scripts/prepare.mjs:19
    rmSync(join(root, 'lib'), { recursive: true, force: true })
  • 读取本地文件
    scripts/prepare.mjs:22
    if (!existsSync(entry)) {
  • 执行外部命令来自配置/变量
    scripts/prepare.mjs:26
    const result = spawnSync(process.execPath, [entry, ...args], { cwd: root, stdio: 'inherit' })
  • 读取本地文件
    lib/types/file-browser.js:47
    return statSync(path).isFile();
  • 读取本地文件
    lib/types/file-browser.js:56
    return statSync(path).isDirectory();
  • 读取本地文件
    lib/types/file-browser.js:88
    raw = readFileSync(join(profileDir, 'package.json'), 'utf8');
  • 读取本地文件
    lib/types/file-browser.js:133
    rootFiles = readdirSync(dshHome);
  • 读取本地文件
    lib/types/file-browser.js:154
    profileNames = readdirSync(join(dshHome, 'profiles'));
  • 读取本地文件
    lib/types/file-browser.js:165
    files = readdirSync(profileDir);
  • 执行外部命令固定命令
    scripts/extract-patch.mjs:40
    return execFileSync('git', ['-C', harness, ...args], { cwd, encoding: 'utf8' })
  • 读取本地文件
    scripts/extract-patch.mjs:61
    const config = existsSync(args.config)
  • 读取本地文件
    scripts/extract-patch.mjs:62
    ? JSON.parse(await readFile(args.config, 'utf8'))
  • 读取本地文件
    scripts/extract-patch.mjs:71
    if (!existsSync(args.config)) {
  • 读取本地文件
    scripts/extract-patch.mjs:103
    const content = await readFile(path, 'utf8')
  • 写入本地文件
    scripts/extract-patch.mjs:107
    await writeFile(path, content.replace(seam.old, seam.new))
  • 写入本地文件
    scripts/extract-patch.mjs:115
    await writeFile(out, patch)
  • 执行外部命令固定命令
    scripts/extract-patch.mjs:116
    execFileSync('git', ['-C', baselineTree, 'apply', '--check', out], { encoding: 'utf8' })
  • 执行外部命令固定命令
    scripts/extract-patch.mjs:117
    execFileSync('git', ['-C', trimmed, 'apply', '--check', '-R', out], { encoding: 'utf8' })
  • 读取本地文件
    scripts/verify-self-contained.mjs:18
    for (const entry of readdirSync(directory, { withFileTypes: true })) {
  • 读取本地文件
    scripts/verify-self-contained.mjs:43
    const source = readFileSync(filePath, 'utf8').replace(/ /g, '\n')
  • 读取本地文件
    scripts/verify-self-contained.mjs:60
    } else if (!existsSync(targetPath)) {
  • 读取本地文件
    scripts/verify-self-contained.mjs:89
    if (!existsSync(join(root, requiredPath))) failures.push(`missing repository-layout contract ${requiredPath}`)
  • 读取本地文件
    scripts/verify-self-contained.mjs:92
    const packageJson = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8'))
  • 读取本地文件
    scripts/verify-self-contained.mjs:101
    const lockfileSource = readFileSync(join(root, 'pnpm-lock.yaml'), 'utf8')
  • 读取本地文件
    src/file-browser.ts:80
    return statSync(path).isFile()
  • 读取本地文件
    src/file-browser.ts:89
    return statSync(path).isDirectory()
  • 读取本地文件
    src/file-browser.ts:129
    raw = readFileSync(join(profileDir, 'package.json'), 'utf8')
  • 读取本地文件
    src/file-browser.ts:170
    rootFiles = readdirSync(dshHome)
  • 读取本地文件
    src/file-browser.ts:188
    profileNames = readdirSync(join(dshHome, 'profiles'))
  • 读取本地文件
    src/file-browser.ts:197
    files = readdirSync(profileDir)
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh@deepseek-ai/dsh-api-remotes@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
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 集中浏览编辑插件配置
  • 表单方式配置
  • 文件方式配置

README

由 DeepSeek 最新模型翻译生成
DSH 高级设置(Settings Plus) English · 中文 ██████╗ ███████╗ ██╗ ██╗ ██╔══██╗ ██╔════╝ ██║ ██║ ██║ ██║ ███████╗ ███████║ ██║ ██║ ╚════██║ ██╔══██║ ██████╔╝ ███████║ ██║ ██║ ╚═════╝ ╚══════╝ ╚═╝ ╚═╝ ┌─────────────────────────────────────────────────────────────┐ │ dsh-settings-plus │ │ DeepSeek Harness 官方设置的 plus │ │ 表单级 + 文件级配置管理 │ │ + 面向所有插件的开放注册 SDK │ │ │ │ 175 个测试 | MIT | TypeScript ESM | Cordis v4 │ └─────────────────────────────────────────────────────────────┘ dsh-settings-plus 是 DeepSeek Harness 官方设置的 plus。
展开完整文档(README 剩余 1 节)
DSH 高级设置(Settings Plus)

English · 中文

██████╗ ███████╗ ██╗ ██╗
██╔══██╗ ██╔════╝ ██║ ██║
██║ ██║ ███████╗ ███████║
██║ ██║ ╚════██║ ██╔══██║
██████╔╝ ███████║ ██║ ██║
╚═════╝ ╚══════╝ ╚═╝ ╚═╝

┌─────────────────────────────────────────────────────────────┐
│ dsh-settings-plus │
│ DeepSeek Harness 官方设置的 plus │ │ 表单级 + 文件级配置管理 │ │ + 面向所有插件的开放注册 SDK │ │ │ │ 175 个测试 | MIT | TypeScript ESM | Cordis v4 │ └─────────────────────────────────────────────────────────────┘

dsh-settings-plus 是 DeepSeek Harness 官方设置的 plus。官方入口是单个设置表单;本插件提供的是设置管理面:所有已注册的 settings namespace 与所有已挂载插件的组合配置,既可以表单方式浏览编辑,也可以文件方式浏览编辑。任何插件都能通过薄 SDK 注册自己的设置 namespace。

本仓库是自包含的独立 ESM Cordis 插件仓库。DSH 宿主是成品包的运行时消费者,不是源码或构建输入。

已发布至 dsh-plugin topic,PR 进入 awesome-DSH-plugin,dsh-market 跟随。

架构

flowchart LR
subgraph HOST["DSH 宿主(运行时)"]
REG["cordis registry:settings namespace + 组合行"]
GW["gateway:exposed-namespaces 白名单"]
FS["ctx.fs 形态通道"]
end

subgraph PLUS["dsh-settings-plus(本仓库)"]
C1["C1 宿主爬取"]
C2["C2 表单级编辑(浏览器半)"]
C3["C3 文件级编辑"]
C4["C4 插件 SDK"]
CLIENT["lib/client.js"]
end

C4 -->|注册用户 namespace| C1
C1 -->|枚举,secret 脱敏| REG
C1 -->|经 settings seam + 版本守卫写入| REG
C1 -.->|Fabric 加宽,可选| GW
C3 -->|原子读写 + expected-version 守卫| FS
C2 -->|打包为| CLIENT
C2 -->|经 catalog source seam 读取,wire 待落地| C1

四大能力

🔭 C1 · 宿主爬取

(src/crawler.ts、src/service.ts、src/fabric.ts)

只读 crawler 枚举所有已注册的 settings namespace(ctx.settings.describe + secret 脱敏)与所有已挂载插件的组合配置(schemastery Config + 行 id,来自 cordis 运行时 registry)。bundle 以 ctx.dshSettingsPlus 宿主服务发布:listNamespaces、listCompositionConfigs、updateComposition、removeComposition。写操作经宿主 settings seam + 乐观并发版本守卫。普通 cordis.yml 组合行不可经服务写入(请用文件编辑面或 cordis.patch.yml)。Fabric 绑定在加载时加宽 gateway 的 exposed-namespaces 白名单:可选挂载,缺失时安全 no-op。

🎛️ C2 · 表单级编辑

(src/client/)

浏览器半注册 settings.section 贡献:始终存在的 高级设置 入口(order 30)、catalog 无数据时的 loading/empty/error 三态状态行、每 catalog 条目一个分区,按签名差分(${key}\u0000${label})reconcile。通用 schema 表单渲染器(src/client/schema-form.tsx)渲染白名单控件:string/number/boolean 原生、const-only union 下拉、嵌套对象分组、其余 JSON textarea 兜底。secret 占位协议保证占位永不回传、留空保持原值、显式输入才提交。逐字段 reset 用 unset 操作,绝不写值。revision 冲突给出重载提示,restart 提示说明宿主何时需要重启。渲染器已完整实现并通过测试;接入数据分区随宿主 wire 面落地(见"已知限制")。

🗂️ C3 · 文件级编辑

(src/file-browser.ts、src/file-store.ts、src/yaml-editor.ts、src/patch-validator.ts、src/hmr-aware.ts)

封闭配置清单(可写的 $DSH_HOME 根 YAML 文件 + 每 profile 的 cordis.yml,bundle 层只读展示)经 realpath 越界校验。读写经注入的 ctx.fs 形态通道原子进行,带字节上限与 expected-version 写守卫。YAML round-trip 保留注释。语义校验拒绝会破坏文档的补丁编辑。HMR 说明诚实:插件不拥有 watcher,宿主已热重载 cordis.patch.yml 与 settings.yaml,保存策略只保证原子写。

🧩 C4 · 开放注册 SDK

(src/sdk.ts、docs/sdk-contract.md)

其他插件通过 registerUserSettings(实注册 + 显式移除 disposer)、defineSettingsSection(声明式,无副作用)、settingsNamespace(命名品牌,^[a-z][a-z0-9-]$)在宿主上注册自己的 settings namespace。注册随调用方 fiber 回收,secret 语义归宿主 seam,重复注册在宿主响亮报错。

官方设置 vs dsh-settings-plus

| 领域 | 官方设置入口 | dsh-settings-plus |
| 编辑形态 | 单个设置表单 | 表单级编辑,外加文件级编辑面 |
| 可浏览范围 | 宿主设置表单 | 所有已注册 settings namespace 与所有已挂载插件的组合配置,secret 脱敏 |
| 文件写入 | 不在范围内 | 封闭可写清单,原子写 + 版本守卫 |
| 插件自定义设置 | 仅宿主管理 | 任何插件经 SDK 注册自己的 namespace |

来自真实 DSH profile 的实机截图——左为官方设置入口,右为 SDK 注册 namespace 渲染出的插件设置页:

设计原则

- 默认只读。 crawler 从不写入;文件浏览器只枚举与校验。
- secret 归宿主 seam。 占位永不回传,脱敏在 schema 遍历中完成。
- 写入有守卫。 每条写路径都有 expected-version 守卫、字节上限与 realpath 越界校验。
- 不自建 watcher。 插件从不擅自重启你,只如实说明宿主已经热重载什么。
- 响亮失败,安全降级。 畸形 Fabric facade 响亮报错;缺失 facade 是安全 no-op。

快速开始

1. 安装 到 DSH profile(对本仓库做 file: 安装):

dsh plugin --profile <name> add file:/<repo-dir>/dsh-settings-plus

2. 启动 profile。 包 manifest 声明 dsh.bundle.patch(cordis.patch.yml),在所选 profile 的运行时上组合三行:dsh-settings-plus、dsh-settings-plus-invariant companion、以及一个禁用状态的 cordis-fabric 桩(加载时加宽 gateway 的 exposed-namespaces 白名单,运行时绑定在 src/fabric.ts)。补丁只组合插件;不改宿主源码、编译器设置或构建脚本。profile 的 node_modules 提供裸名 peer 依赖。

3. 打开设置导航。 高级设置 入口出现,带 loading/empty/error 三态状态行。每条目数据分区随宿主 wire 面落地后渲染(见"已知限制")。

插件作者的 SDK 用法

在插件 apply 内注册一个 namespace,随调用方 fiber 回收:

import { Context } from 'cordis'
import z from 'schemastery'
import { registerUserSettings } from '@oneinitai/dsh-settings-plus/sdk'

export const name = 'my-plugin'
export const inject = ['settings']

const MySection = z.object({
host: z.string().default('localhost'),
token: z.string().role('secret'),
})

export function apply(ctx: Context) {
ctx.effect(() => registerUserSettings(ctx, 'my-plugin', MySection, { applies: 'live' }))
}

注册后 namespace 立即进入宿主设置面:crawler 的 ctx.dshSettingsPlus.listNamespaces() 会包含它,配置 UI 自动渲染其 schema。完整契约(命名、secret、生命周期、去重语义)见 docs/sdk-contract.md。

浏览器半

src/client/ 是 Web bundle,以 lib/client.js 提供(exports map ./client)。它注册 settings.section 贡献与 dsh-settings-plus locale namespace(src/client/locales.ts 中 zh/en 双字典;中文是产品文案,英文镜像,en satisfies Record<keyof typeof zh, string> 保证对齐)。catalog 通过可注入的 settingsPlusCatalog source seam 读取。生产默认是诚实的本地空源(宿主 wire 面落地前),因此设置导航显示状态行的 empty 阶段,尚无数据分区。

已知限制

如实陈述:

- defer 到 v2(计划约定):聚合配置页、per-namespace 拒绝名单、导出/导入、required secret 保存修复。
- 宿主 wire 面处于诚实降级状态:T16 分发冒烟验证了插件安装/加载与服务挂载;宿主 wire 面(浏览器 catalog 数据通道、真实 ctx.fs 适配器、Fabric patch 端到端)待宿主升级后补验证。当前为诚实降级状态:catalog 空源、Fabric no-op、文件写走本地 FsLike 通道。
- Fabric 依赖姿态:cordis-fabric 在绑定时从宿主上下文可选加载。未挂载 facade → 安全 no-op(桩行保持禁用,gateway 保持默认白名单);facade 挂载但畸形 → 响亮报错。
- updateComposition 的写范围:只有已注册 settings namespace 的 id 可经服务写入;普通 cordis.yml 组合行响亮失败,须经文件编辑面或 cordis.patch.yml 修改。

后续计划(Roadmap)

- L2 浏览器 RPC 接入:把客户端 catalog 从空本地源接到真实宿主数据通道。
- L3 外部 HTTP API:按需将 settings 服务暴露为外部 HTTP 接口。
- 宿主版本兼容范围锁定:维持宿主版本范围锁定(见 peerDependencies),宿主升级后补验证 wire 面。

独立开发

所有命令都在本目录运行:

pnpm install
pnpm run verify:self-contained
pnpm run typecheck
pnpm test
pnpm run build
pnpm run prepare

verify:self-contained 拒绝文件系统依赖 spec、离开仓库的编译器路径、外部或损坏的 Markdown 链接、绝对工作站路径和格式错误的 bundle skill 元数据。typecheck 同时检查声明工程与源码平面测试。build 是开发/CI 类型安全门禁;prepare 产出消费者侧产物(含 lib/),供 Git 与 tarball 安装。

仓库布局

.
├── .agents/skills/ # 仓库本地插件开发工作流 ├── docs/ │ ├── dsh-plugin-contracts.md # 所有插件 skill 共享的本地契约 │ └── sdk-contract.md # 注册 SDK 契约(C4) ├── patches/ # 依赖补丁与 DSH host patch 契约 ├── scripts/ # prepare、verify-self-contained、补丁辅助 ├── src/ │ ├── index.ts # Loader 面向的函数插件命名空间 │ ├── config.ts # 可序列化 schema 与解析后的默认值 │ ├── runtime.ts # Cordis 激活与宿主边界接线 │ ├── invariant.ts # 包自有的 invariant companion │ ├── crawler.ts # 只读设置/组合枚举(C1) │ ├── service.ts # ctx.dshSettingsPlus 服务面(C1) │ ├── fabric.ts # 可选 gateway 白名单加宽(C1) │ ├── sdk.ts # 开放注册 SDK(C4) │ ├── file-browser.ts # 封闭配置清单 + 越界校验(C3) │ ├── file-store.ts # 原子读写 + 版本守卫(C3) │ ├── yaml-editor.ts # 保留注释的 YAML round-trip(C3) │ ├── patch-validator.ts # 语义补丁校验 + 自保护(C3) │ ├── hmr-aware.ts # 保存的 HMR 说明(C3) │ └── client/ # 浏览器半,以 lib/client.js 提供(C2) │ ├── index.ts # settings.section 注册 + 状态行 │ ├── catalog.ts # 可观察 catalog store + 可注入 source seam │ ├── component.tsx # 入口 / 状态行 / 数据分区组件 │ ├── schema-form.tsx # 通用 schema 表单渲染器 │ ├── form-logic.ts # 表单逻辑 + secret/reset/冲突协议 │ └── locales.ts # zh/en locale 字典 ├── tests/ # 宿主 spec(node)与客户端 spec(jsdom) ├── AGENTS.md # 仓库本地贡献契约 ├── LICENSE # MIT ├── README.md / README.zh.md # 仓库与使用契约 ├── cordis.patch.yml # profile bundle 贡献 └── package.json # 导出、peers、dsh.bundle.patch

许可证

MIT,Copyright (c) 2026 oneinitAI。贡献规则见 AGENTS.md。
预览分享卡片长什么样 ↓oneinitAI/dsh-settings-plus
分享 · DeepSeek Harness Hub
oneinitAI/dsh-settings-plus

集中浏览编辑所有插件配置,支持表单与文件两种方式

这是你的仓库?认领条目

回到顶部