向 DSH Hub Workshop 提交插件
DSH Hub Workshop 是插件实体索引,不要求作者把源码搬进本仓库。大多数贡献只需要给 catalog.json 增加一条经过核对的元数据。
第一次开发或接入插件,请先阅读插件开发与市场指南。它说明 Skill、MCP、Cordis/Profile Bundle 的最短开发路径、市场准入标准,以及官方/OMDSH 托管与第三方接入的边界。
快速提交
不熟悉目录结构也可以提交,推荐按经验选择一条路径:
- 作者 Agent 自动投稿(推荐):把标准指令交给能读取作者仓库的 Agent。它会核对公开固定 commit、生成并本地校验
omdsh-workshop-submission/v1,再展示目标、标题和完整正文;作者确认本次 GitHub 写入后,Agent 创建收录 Issue。提交人不需要手填表单,也不需要理解catalog.json、Registry 或生成文件。 - Author Studio(人工兜底):在 Author Studio 选择“创建项目”或“新增 Release”;待审核候选也可从详情继续。页面自动生成清单并带入 Issue,但身份、许可、兼容性、权限和测试仍必须来自作者确认的事实。
- 直接 PR:熟悉本仓库的贡献者可以按下方格式修改源数据、生成产物并提交 PR,适合一次更新多个条目或维护已有条目。
Issue 只是收录申请,不等于已经通过审核,也不代表 DSH Hub Workshop 为第三方代码提供安全背书。自动化只读取固定 commit,不执行投稿代码,并复用一条候选分支和一个 PR。Critical 漏洞会阻止收录;高风险权限、native code、安装脚本、作者身份不一致和可信发布者请求进入 Draft PR 人工审核;扫描完整且没有高风险信号的条目形成普通 PR。扫描或外部漏洞服务不可用时保守地停在审核队列。
requiresFabric、deepHook 和 restartRequired 必须按 Release 如实声明;深层 Hook 必须同时声明 Fabric。它们只影响兼容提示,不授权 DSH Hub Workshop 或 Runtime 调用 Fabric。Release 撤回、Project 归档和所有权转移使用 Governance Issue,不通过普通新增 Release 自动化完成。
普通市场收录只判断项目当前的真实形态,不要求具备事务回滚。项目实际使用官方 Profile Bundle 时,维护者才核对不可变安装 spec 并标记“事务托管”。最小结构只有 package.json#dsh.bundle 和 cordis.patch.yml,不需要第二套 Loader;patch 如果加载 Bundle 自身,还必须提交其运行时入口,因为安装脚本始终保持禁用。示例仓库进入 main 前不会被文档或市场标成可安装模板。
提交前请确保目标 commit 对维护者可读。不要在 Issue、PR、安装命令或示例配置中粘贴 Token、密钥、成员名单、个人路径或私有配置。
收录条件
条目必须满足:
- 有实际代码或静态 Skill/MCP 资产,不是空仓库、概念 README 或候选计划;
- README 写清用途、安装步骤、依赖和已知限制;
- 有固定的 40 位 commit 供审查与追溯;
- 安装命令不包含 token、个人路径或其它敏感数据;
- 插件许可或未声明许可边界有明确说明;
- 类型和状态不夸大实际成熟度;分类只是可选导航标签。
一个仓库包含多个独立可安装包时,请拆成多条;同一实现仅有中英文 README 时,不要重复收录。
候选发现、拆分与去重
组织仓库可以先进入 candidates-v1.json 的“待审核”页,不需要作者先写 Catalog PR。候选只代表固定 commit 上发现了相关仓库或声明,不携带安装命令,也不进入 Runtime Registry。
- 默认一个仓库折叠成一个候选;
package.json数量不会被当成插件数量。 - 只有维护源显式选择
split: declared,且每个子目录都有独立dsh.plugin.json、dsh.bundle、SKILL.md或 MCP 清单时才拆分。 - “发现候选”“静态适配证据”“可事务安装”是三个不同结论。
dsh.plugin.json只证明插件运行清单;.dsh-plugin/package.json当前也只作为配置候选证据,因为公共 Runtime 未提供可核验的对应契约。Profile Bundle 必须有真实 patch,patch 加载自身时还必须有已提交的运行时入口。任何候选在审核与当前基线验证完成前都没有安装按钮。 - 去重键是
repository + source path。正式 Catalog 优先于作者 submission,作者 submission 优先于独立源仓库;合集中的 vendored 副本只引用原 Project,不再生成项目卡。 - fork、移植或替代实现不按名称合并,使用显式关系表达;不同作者的同名项目继续独立展示。
维护者可以用 pnpm candidate:promote -- --id <candidate-id> 查看预填草稿和缺失声明,或用 --batch auto-listed 查看低风险批次。命令默认 dry-run;只有完整 manifest 通过 repository + path + ref 精确匹配并再次扫描后,显式添加 --apply 才会改写 catalog.json。这条路径直接复用普通 Submission 的 schema、扫描器和 Catalog 应用函数,不是第二套审核入口。批量处理应使用一个滚动 PR,而不是为发现列表自动创建大量机器人 PR。
组织维护者使用独立入库流水线:npm run intake:validate -- submission.json 只校验固定 commit 清单,不执行投稿代码;npm run intake:prepare -- submission.json 生成待审核记录;npm run intake:check 以 fail-closed 方式校验 Intake、官方基线、admissions 与 Registry。Topic 仅负责发现;维护者还必须定位真实插件子包,核验清单、声明入口、DSH 专属注册路径、兼容性、权限与供应链。事务安装、配置安装、引导接入是三种接入类型,待审核是独立状态。只有人工审核通过、在当前官方基线完成完整生命周期,并证明一个明确能力已注册、调用和观察的受支持类型才可进入 Registry;仅加载成功不能通过,引导接入始终只有查看说明。完整流程见 Workshop 插件入库与验证流程。
添加条目
在 catalog.json#packages 添加对象。完整约束见 catalog.schema.json。
最小示例:
{
"id": "session-notes",
"name": "Session Notes",
"description": "把会话摘要保存为可检索的项目笔记。",
"kind": "extension",
"tags": ["sessions", "notes"],
"author": {
"name": "your-github-login",
"url": "https://github.com/your-github-login"
},
"repository": "https://github.com/your-github-login/session-notes",
"ref": "0123456789abcdef0123456789abcdef01234567",
"updatedAt": "2026-08-05T03:22:38Z",
"version": "0.1.0",
"license": "BSD-3-Clause",
"status": "beta",
"compatibility": "Marisa/dshx · DSH >=0.0.1",
"install": {
"type": "marisa",
"label": "第三方接入",
"command": "仅记录固定来源与兼容事实;不执行第三方命令。",
"note": "旧 dshx / Marisa 形态不是官方安装后端。"
}
}
枚举值
kind:
skill/mcp:静态或独立能力;extension:DSH/Cordis 运行时插件;channel:聊天与远程入口;ui:TUI/Web 界面扩展;adapter:外部协议或客户端适配;manager:插件生命周期基础设施;toolkit:补丁、移植或辅助工具集合。
category 是可选的 DSH Hub Workshop 导航标签:workflow、developer-tools、channels、interface、platform、safety、memory、infrastructure、fun。它不会进入 Runtime Registry,也不参与收录或信任判断。
status:
verified:声明的分发结构和主要验证证据已核对;beta:可用,但仍跟随公开 DSH 兼容基线快速变化;prototype:验证想法的原型,不应被误解为稳定产品。
install.type:profile-bundle、repository-plugin、marisa、plugin-registry、source、manual、npm、script。后六项只是私有 Catalog 中保留的历史兼容事实,不是官方 Harness 契约;公开页面统一显示为“第三方接入”,Runtime 也不会把它们解析为安装适配器。
registry 由自动化或维护者根据扫描事实填写,作者不应自行声明“低风险”或“可信发布者”。只有真正由官方 Profile 管理、且有精确不可变包版本的条目才可声明:
{
"registry": {
"listing": "reviewed",
"risk": "low",
"vulnerabilityScan": "passed",
"permissions": "reviewed",
"nativeCode": "absent",
"installScripts": "absent",
"trustedPublisher": "unknown",
"profileBundle": {
"packageName": "@example/session-notes",
"spec": "1.2.3"
}
}
}
Registry 不携带 install.command。Harness 只把条目 ID 发给本机 Runtime,由 Runtime 重新解析 packageName 和精确 spec。公开的 index.json / docs/catalog.json 也会把审核源中的历史命令净化为 OMDSH install 或只读 inspect;第三方命令不会成为公开操作入口。
Repository Plugin 配置候选
已有静态目录可以提供固定来源作为未来兼容证据,但当前自动阻断且不产生安装操作:
{
"type": "repository-plugin",
"source": "github:owner/repo#<40位commit>&path:/plugins/example/.dsh-plugin",
"label": "复制配置",
"command": "完整 YAML 配置"
}
如果插件托管在 dsh-hub 自己的 plugins/ 下,CI 还会检查:
.dsh-plugin/package.json#dsh可被静态解析,但不宣称已与当前公共 Schema 对齐;- Skill 根位于包内,
SKILL.mdfrontmatter 合法; - MCP 文档合法且资产不越界;
prepare.js与生命周期声明存在。
本地校验
pnpm install
pnpm build
pnpm catalog:build
pnpm validate
node --check docs/assets/app.js
提交中应同时包含:
catalog.json;- 自动生成的
index.json; - 自动生成的
docs/catalog.json; - 自动生成的
registry-v1.json与docs/registry-v1.json; - 自动生成的
docs/plugins.md。
不要手改生成文件来绕过源数据评审。
评审清单
- 条目 id 唯一,描述可验证,不是营销口号
- 作者和仓库链接正确
-
ref是条目实际核对过的 commit - 安装方式与 README 一致
- 兼容范围、前置服务、凭据要求和补丁基线已说明
- 许可或未声明许可边界明确
-
pnpm validate全绿
Submit a Plugin to DSH Hub Workshop
DSH Hub Workshop indexes installable plugin packages. Authors do not need to move source code into this repository. Most contributions only add one verified metadata entry to catalog.json.
If this is your first extension or submission, start with the Plugin Development and Marketplace Guide. It covers the shortest Skill, MCP, and Cordis/Profile Bundle paths, admission rules, and the boundary between official/OMDSH management and third-party integration.
Quick Submission
You can contribute without learning the catalog schema. Choose the path that fits your experience:
- Author-Agent submission (recommended): give the standard instruction to an Agent that can read the author's repository. It verifies the public pinned commit, generates and locally validates
omdsh-workshop-submission/v1, then shows the target, title, and complete body. After confirmation of that GitHub write, the Agent creates the submission Issue. Authors do not fill a form or learncatalog.json, Registry, or generated files. - Author Studio (manual fallback): use Author Studio to create a Project or add an immutable Release. A Pending Review candidate can continue from its detail page. The page generates the manifest and carries it into an Issue, but identity, license, compatibility, permissions, and test evidence must still be author-confirmed facts.
- Direct PR: contributors familiar with this repository can update the source data and generated artifacts below. This works well for multiple entries or maintenance of an existing entry.
An Issue is only a submission request: it is not acceptance and does not mean DSH Hub Workshop endorses third-party code as safe. Automation reads the fixed commit without executing submitted code and reuses one candidate branch and one PR. Critical vulnerabilities block listing. Elevated permissions, native code, lifecycle scripts, author-identity mismatches, and trusted-publisher requests produce a Draft PR for human review. Complete low-risk facts produce a normal PR. Scanner or external vulnerability-service failures fail closed into review.
Declare requiresFabric, deepHook, and restartRequired per Release; deep hooks require Fabric. These facts affect compatibility messaging only and never authorize DSH Hub Workshop or Runtime to invoke Fabric. Use a Governance Issue for Release removal, Project archival, or ownership transfer rather than the ordinary Release automation.
Ordinary catalog listing reports the project's current form and does not require transactional rollback. Maintainers verify an immutable install spec and label the project transactional only when it actually uses an official Profile Bundle. Its minimum structure is package.json#dsh.bundle and cordis.patch.yml, without a second Loader. If the patch loads the Bundle package itself, its runtime entry must also be committed because install scripts always remain disabled. An example repository is not advertised as installable until that structure reaches its default branch.
Make sure maintainers can read the pinned commit. Never paste tokens, keys, member lists, personal paths, private configuration, or other sensitive data into an Issue, PR, install command, or example configuration.
Entry Requirements
Every entry must:
- Contain working code or static Skill/MCP assets, not an empty repository, concept README, or proposal.
- Document its purpose, installation, dependencies, and known limits in the README.
- Pin a full 40-character commit for review and traceability.
- Keep tokens, personal paths, and other sensitive data out of install commands.
- State its license or explicitly undeclared license boundary clearly.
- Use a type and status that match its actual maturity. Category is only an optional navigation label.
Create separate entries when one repository contains multiple independently installable packages. Do not duplicate an implementation only because it has both Chinese and English READMEs.
Candidate discovery, splitting, and deduplication
Organization repositories may first appear under Pending Review through candidates-v1.json; authors do not need to prepare a Catalog PR just to be discovered. A candidate records evidence at a pinned commit, carries no install command, and never enters Runtime Registry.
- One repository is folded into one candidate by default. A count of
package.jsonfiles is not a plugin count. - Splitting requires an explicit
split: declaredsource policy and an independentdsh.plugin.json,dsh.bundle,SKILL.md, or MCP manifest for every child. - Discovery, static adapter evidence, and transactional installation are separate conclusions.
dsh.plugin.jsonproves only a runtime manifest. A.dsh-plugin/package.jsonis currently configuration-candidate evidence because the public Runtime exposes no verifiable matching contract. A Profile Bundle needs a real patch and, when that patch loads the Bundle itself, a committed runtime entry. No candidate receives an install action before review and current-baseline verification. - The deduplication key is
repository + source path. Formal Catalog wins over author submission, which wins over a canonical source repository; vendored collection copies reference the original Project instead of creating new cards. - Forks, ports, and replacements are never merged by a fuzzy name. Explicit relations describe them, and unrelated same-name projects remain separate.
Maintainers can run pnpm candidate:promote -- --id <candidate-id> to inspect a prefilled draft and its missing attestations, or --batch auto-listed to inspect the low-risk queue. The command is dry-run by default. It writes catalog.json only when a complete manifest matches repository + path + ref, passes a fresh scan, and the operator explicitly adds --apply. This path reuses the ordinary Submission schema, scanner, and Catalog application function; it is not a second review system. Batch maintenance belongs in one rolling PR rather than a flood of automated PRs.
Organization maintainers use the dedicated intake pipeline. npm run intake:validate -- submission.json validates a pinned-commit manifest without executing submitted code; npm run intake:prepare -- submission.json creates a pending-review record; npm run intake:check validates Intake, the official baseline, admissions, and Registry fail-closed. Topic matches are discovery only: maintainers must locate the real plugin package and verify its manifest, declared entry, DSH-specific registration path, compatibility, permissions, and supply chain. Transactional, managed configuration, and guided integration are the three modes; pending review is an independent state. Only a supported mode with explicit approval, a complete current-baseline lifecycle, and a named capability that was registered, invoked, and observed may enter Registry. Load-only evidence is insufficient, and guided entries always remain view-only. See the Workshop intake and verification flow.
Add an Entry
Add an object to catalog.json#packages. See catalog.schema.json for the complete constraints.
Minimal example:
{
"id": "session-notes",
"name": "Session Notes",
"description": "Saves session summaries as searchable project notes.",
"kind": "extension",
"tags": ["sessions", "notes"],
"author": {
"name": "your-github-login",
"url": "https://github.com/your-github-login"
},
"repository": "https://github.com/your-github-login/session-notes",
"ref": "0123456789abcdef0123456789abcdef01234567",
"updatedAt": "2026-08-05T03:22:38Z",
"version": "0.1.0",
"license": "BSD-3-Clause",
"status": "beta",
"compatibility": "Marisa/dshx, DSH >=0.0.1",
"install": {
"type": "marisa",
"label": "Third-party integration",
"command": "Records pinned-source and compatibility facts only; no third-party command is executed.",
"note": "Legacy dshx / Marisa is not an official installation backend."
}
}
Enumerated Values
kind:
skill/mcp: static or standalone capabilities.extension: a DSH/Cordis runtime plugin.channel: a chat or remote entry point.ui: a TUI/Web interface extension.adapter: an external protocol or client adapter.manager: plugin lifecycle infrastructure.toolkit: a patch, port, or support-tool collection.
category is an optional DSH Hub Workshop navigation label: workflow, developer-tools, channels, interface, platform, safety, memory, infrastructure, fun. It is excluded from Runtime Registry and never affects listing or trust.
status:
verified: the declared distribution structure and primary verification evidence have been checked.beta: usable, but still changing with the public DSH compatibility baseline.prototype: validates an idea and should not be treated as stable software.
install.type: profile-bundle, repository-plugin, marisa, plugin-registry, source, manual, npm, script. The last six values are historical compatibility facts retained in the private Catalog, not official Harness contracts. Public pages label all of them as third-party integrations, and Runtime never resolves them as installation adapters.
Automation or maintainers populate registry from scan facts. Authors must not self-assert low risk or trusted-publisher status. A Profile Bundle mapping is allowed only for a package managed by the official Profile tooling with an exact immutable version:
{
"registry": {
"listing": "reviewed",
"risk": "low",
"vulnerabilityScan": "passed",
"permissions": "reviewed",
"nativeCode": "absent",
"installScripts": "absent",
"trustedPublisher": "unknown",
"profileBundle": {
"packageName": "@example/session-notes",
"spec": "1.2.3"
}
}
}
Registry never carries install.command. Harness sends only an entry ID to the local Runtime, which resolves the reviewed packageName and exact spec again. Public index.json / docs/catalog.json also sanitize historical audit commands into OMDSH install or read-only inspect; third-party commands never become public actions.
Repository Plugin configuration candidates
An existing static directory may provide a pinned source as future compatibility evidence. It remains blocked and exposes no install action today:
{
"type": "repository-plugin",
"source": "github:owner/repo#<40-character-commit>&path:/plugins/example/.dsh-plugin",
"label": "Copy configuration",
"command": "Complete YAML configuration"
}
For plugins hosted under this repository's plugins/ directory, CI also checks:
- Statically parse
.dsh-plugin/package.json#dshwithout claiming conformance to a current public schema. - The Skill root and
SKILL.mdfrontmatter. - MCP documentation and asset boundaries.
prepare.jsand lifecycle declarations.
Local Validation
pnpm install
pnpm build
pnpm catalog:build
pnpm validate
node --check docs/assets/app.js
A catalog change must include:
catalog.json.- Generated
index.json. - Generated
docs/catalog.json. - Generated
registry-v1.jsonanddocs/registry-v1.json. - Generated
docs/plugins.md.
Do not edit generated files to bypass source-data review.
Review Checklist
- The entry id is unique, and its description is verifiable.
- Author and repository links are correct.
-
refis the commit that was actually reviewed. - The install method matches the README.
- Compatibility, host services, credential requirements, and patch baselines are documented.
- License or explicitly undeclared license boundaries are clear.
-
pnpm validatepasses.