- Accueil
- Plugins
- Flux et automatisation
- oh-my-dsh-omo-fork-chs
oh-my-dsh-omo-fork-chs
tacrine/oh-my-dsh-omo-fork-chs
The unofficial Simplified Chinese fork of the tri-agent agent preset (Atlas orchestration plus Prometheus planning), packaged for DeepSeek Harness as a Cordis bundle; the vendored upstream content is licensed under SUL-1.0.
Installer
dsh plugin --profile web add github:tacrine/oh-my-dsh-omo-fork-chsREADME
oh-my-dsh-omo-fork-chs
tri-agent agent preset 的简体中文非官方 fork,面向
DeepSeek Harness 打包为可发布的 Cordis bundle。
preset id 是 omo-fork-chs,order 是 11,与 tri-agent 并存:本包不改默认 preset,也不改
会话选中哪一个。只有 persona 正文被翻译;工具链组成与编排 doctrine 沿用上游设计。
这个 preset 给 agent 一套双身份加完整编码工具链:
- Atlas 是常驻的指挥者。它不亲自实现、验证或审查;它读计划、notepad 与证据,做记录,把每个 工作单元委派给具名子代理。
- Prometheus 是规划 doctrine。会话进入 plan 模式(
/plan)时,身份在整个规划会话期间切换为 Prometheus,结束后切回。插件plan-aware-persona.mjs占用唯一的deployment:persona-prefix槽位,每次装配时读取公开的plansession projection 来选择文本。planModeservice 刻意不 注入:它在isolate: { planMode: true }realm 内部,从外部注入不会解析成功。
除身份之外,preset 还挂载编码工具链:文件系统与 shell 工具、后台任务、skills、goals、plan mode、
compaction、委派与 workflows。patch 共 174 条 - id: 条目,分属 10 个 preset 声明加 1 条根层
(host plane)挂载:主 preset omo-fork-chs 挂 18 个插件条目,另外 9 个子 preset 分别挂 11 到 13
个(视觉类那个挂 4 个),根层再挂 1 条 caveman-autoload。本包附带 11 个 persona 文件;主
preset 的插件自己读取 atlas.md 与 prometheus.md,其余 9 个由对应子 preset 的 dsh-persona
条目读取。
随包内容
| 文件 | 用途 |
|---|---|
cordis.patch.yml | 已发布的 bundle patch:preset 声明(id: preset-omo-fork-chs、config.id: omo-fork-chs、config.name: 'Oh My DSH Chs - OMO Fork'、order: 11)及其 plugins: 列表,末尾另有一条根层 caveman-autoload 挂载。共 950 行,12 处改写。 |
plan-aware-persona.mjs | 包入口,注册 plan-aware persona 前缀与配置的 suffix。以 ./persona 导出。 |
caveman-autoload.mjs | 根层挂载的插件:注册 caveman-ultra skill,并加一条 order 60 的提示段说明本部署的 caveman 规则。以 ./caveman 导出。 |
index.js | 包根。它刻意留空:bundle 的行为在 cordis.patch.yml 与 ./persona 里。 |
personas/ | 11 个 persona 文件,已译为简体中文。 |
skills/ | skill 正文。目前只有 skills/caveman-ultra/ 一个 skill,其 SKILL.md 由 caveman-autoload.mjs 在挂载时读取。 |
baseline/ | 移植前 patch 的冻结快照,外加一份说明它能证明什么、不能证明什么的 sidecar。 |
tools/ | 移植、验证、baseline 与包结构检查的命令行工具。 |
test/ | 零依赖测试套件,用 node --test 运行。 |
LICENSE-MIT.md | 覆盖我们自己作品的 MIT 条款。 |
LICENSE-SUL-1.0.md | 上游 Sustainable Use License 1.0 的逐字副本,覆盖上游衍生内容。 |
NOTICE.md | 修改声明、上游署名,以及机器可读的许可范围映射。 |
该 patch 挂载了下列由 DSH 提供的 peer 包:
@deepseek-ai/dsh-agent-preset、dsh-agent-instructions、dsh-tool-bash、dsh-tool-pwsh、
dsh-tool-fs、dsh-tool-fs-search、dsh-tool-jobs、dsh-skill-filesystem、dsh-tool-skill、
dsh-command-goal、dsh-tool-goal、dsh-plan-mode、dsh-compaction-basic、dsh-command-compact、
dsh-compaction-tool-result-pruner、dsh-tool-subagent-control、dsh-tool-subagent、
dsh-workflow-ptc、dsh-tool-workflow、dsh-tool-ralph、dsh-tool-ask-user、dsh-tool-todo、
dsh-tool-web、dsh-tool-present,外加 @deepseek-ai/cordis。合计 25 条 peer 依赖。
安装
安装分两个显式步骤:第 1 步装依赖,第 2 步告诉 profile 去加载它。两步都必需,且不假设 dsh
在 PATH 上。
第 1 步:把包安装进 profile
把 CLI 指向你的 DSH checkout 的 bin 文件,把安装转发给 profile:
node "<dsh bin>" plugin --profile <profile> add -w @tacrine_f/oh-my-dsh-omo-fork-chs
例如某个 checkout 的 runtime 是 <dsh runtime>,那么 <dsh bin> 就是
<dsh runtime>\@deepseek-ai\dsh\lib\bin.js:
node "<dsh runtime>\@deepseek-ai\dsh\lib\bin.js" plugin --profile web add -w @tacrine_f/oh-my-dsh-omo-fork-chs
它会在 $DSH_HOME\profiles\<profile>\ 内运行 pnpm,因此写入一条 dependencies 记录。它不改动
dsh.profile.bundles。
第 2 步:把包加入 dsh.profile.bundles 并重启
打开 $DSH_HOME\profiles\<profile>\package.json,把包名加入该 profile 的 dsh.profile.bundles
数组:
{
"dsh": {
"profile": {
"bundles": [
// ...你已有的 bundle...
"@tacrine_f/oh-my-dsh-omo-fork-chs"
]
}
}
}
然后重启 Host 并新开一个会话。 运行中的 agent 保留它启动时的 composition,所以已存在的会话 不会加载这个 preset,必须新开。
验证安装已生效
$env:DSH_HOME = "<dsh home>"
node "<dsh bin>" --profile <profile> --dump-config
输出中应当有一条 preset-omo-fork-chs 条目,其 name 为 @deepseek-ai/dsh-agent-preset,
config.id 为 omo-fork-chs,config.name 为 'Oh My DSH Chs - OMO Fork',config.order 为
11,另有九条经由本包解析的 personas 表达式。--dump-config 打印的是原始 !!js 表达式文本,
所以那九条锚点呈现为 resolve('<pkg>/package.json') 形式,而不是解析后的文件系统路径。
安装后你可能需要自己做的改动
已发布的 patch 只包含可移植的 preset 声明。有两样东西属于产出这个 fork 的那台机器,刻意没有 发布,你可能想自己加回去:
-
把
omo-fork-chs设成默认 preset。 已发布的 patch 不设置默认 preset,本包也不会强加 一个。想让它成为默认,就在自己的 profile 或 overlay patch 里设置 registry 条目:- id: agent-preset-registry config: default: omo-fork-chs(
@deepseek-ai/dsh-web-app会插入同一条条目,但default: standard;上面这条替换整个 config,所以只有 default 改变。) -
给
subagent_multimodal_looker一条模型路由。 产出这个 fork 的 bundle 曾为那条条目带一条 机器专属的provider与model路由,那条路由不可移植,所以已发布的 patch 完全不包含agentOptions。没有它时,多模态子代理继承 deployment 的路由。要固定一条,就在自己的 overlay 里给那条条目加一个agentOptions块:- id: tool-subagent-multimodal-looker name: '@deepseek-ai/dsh-tool-subagent' config: # ...已发布的 config... agentOptions: provider: <your provider> model: <your model>
失败模式:刻意 fail loud
plan-aware-persona.mjs 在挂载时从磁盘读取自己的 persona 正文。persona 文件缺失或为空会让挂载
失败,并在错误里点出文件名:
plan-aware-persona: cannot read persona "file:///.../personas/atlas.md"
plan-aware-persona: persona "file:///.../personas/atlas.md" is empty
这是刻意的。空的 persona 前缀会悄悄剥掉 agent 的身份,而一条点出文件名的挂载错误,远比一个安静地 丢掉自己指令的 agent 好处理。
Peer 模型
patch 挂载的每个 @deepseek-ai/* 包都声明为 peerDependency,不是普通 dependency。它们由
DSH 提供,bundle 不得安装自己的副本。peer 范围是
>=0.1.7-rc.2 <0.2.0 || >=0.2.0-0 <0.3.0-0 || >=0.2.1-alpha.1 <0.3.0-0,既保留 0.1.7 线,又加入
0.2 线(@deepseek-ai/cordis 为 ^4.0.1)。本包声明 25 条 peer,没有运行期依赖,也没有
开发依赖,所以测试与检查链中零依赖的那部分不需要安装任何东西。
DSH profile 的 .npmrc 设了 auto-install-peers=false,这些 peer 是纯声明式的:pnpm 不会去
拉取,缺失的 peer 在挂载时表现为解析错误,而不是被悄悄装上。
验证
下面全部在仓库根目录运行,无需安装。只有 check:full 例外,它需要 runtime。
# 1. 测试套件。零依赖。74 个测试。
npm run test
# 2. 检查链。零依赖,不需要 runtime。
npm run check
# 3. 同一条检查,但启用 YAML 深比较。需要 runtime。
npm run setup:verify
$env:DSH_RUNTIME = "<absolute path to a node_modules holding js-yaml and @deepseek-ai/cordis-plugin-include>"
npm run check:full
# 4. 从已发布的 patch 重新推导冻结的 baseline 并检查它。
npm run baseline
npm run baseline -- --check
# 5. 从某个源 patch 目录重新移植已发布的 patch。
npm run port -- --src <dir holding cordis.patch.yml>
每一条各自证明什么:
-
npm run test运行node:test套件,共 74 个测试,不需要安装任何东西。九个测试文件各自覆盖 一件事:三组正向改写、反向改写及其往返、从已发布的 patch 重新推导 baseline、参数解析器、从两侧 检验机器路径模式、零字节守卫、包检查的失败路径、提示变量守卫(prompt-variable-guard),以及 caveman loader 的注册契约(caveman-loader)。另有real-install-verify一个真机安装用例:未设DSH_BIN时它整组 skip,所以干净克隆里看到的skipped就是它。 -
npm run check是node tools/check-package.mjs && node tools/verify-patch.mjs。前者运行一整套结构与许可断言,覆盖:manifest 身份;四个
exports;唯一一条自引用条目;九条 persona 锚点及其文件;files[]覆盖;11 个 persona 的字节数;许可指针;三份许可文档;绝不允许 进入 tarball 的路径;files[]所列每个目录下的未跟踪文件;npm 无视files[]也会自动收录的根目录 文件;提供上游指纹时的比对;修改声明的各项主张;许可范围映射,以及把每个范围块逐条钉到其所声明 内容的锚点;机器路径扫描;约束移植前包名出现位置的类;本仓库向消费者复制的两个模块的 SHA256; 每份带内部锚点的文档中锚点能否解析到标题;patch 的形状。后者证明已发布的 patch 仍等于三项已记录改写从冻结 baseline 算出的结果,并报告
verdict: "IDENTICAL"与 12 处改写点。两者都零依赖,所以在干净克隆里无需安装即可通过。 -
npm run check:full就是单独运行node tools/verify-patch.mjs。当DSH_RUNTIME指向一个包含js-yaml与@deepseek-ai/cordis-plugin-include的绝对node_modules时,校验器会用真正的 entry-list dialect 解析两份文档并做结构化比对,报告yamlCompare: "ok"与sites.length为 12。没有 runtime 时它报告
yamlCompare: "skipped",仍以 0 退出,所以只看退出码不算证据,必须断言 字段。这也是这一步与check分开、以及存在npm run setup:verify的原因:它把 runtime 装进.dsh-verify/,不给本包增加依赖。该工具自己读取DSH_RUNTIME,不接受--runtimeflag,因为 Windows 上 npm 通过cmd.exe运行脚本,而 POSIX shell 会展开变量,同一个脚本字符串在两个平台上 行为不同。 -
npm run baseline对三项改写施加逆变换,从已发布的 patch 重新推导baseline/cordis.patch.yml。-- --check把已提交的 baseline 与一份新推导出的副本比对,打印差异行, 出现漂移时以非零退出。 -
npm run port -- --src <dir>对<dir>里的cordis.patch.yml施加三项改写并写出结果。--src没有默认值,因为唯一诚实的默认值会是一个机器专属目录。错误消息把 baseline 目录作为 替代来源点出来,而npm run port -- --src baseline会逐字节复现已提交的 patch。
npm run check与npm test都必须在 git checkout 内运行。 包检查的三条断言(许可范围映射、 机器路径扫描,以及约束移植前包名出现位置的类)都定义在受版本跟踪的文件集合之上,所以该工具向git ls-files索取这个集合。git 无法回答时,工具以run inside a git checkout失败,而不是悄悄 跳过这三条。npm test出于同样原因也需要检出:它最后一个用例会针对真实目录树运行包检查,所以在 仓库之外解包同样失败。因此在仓库之外解包已发布 tarball 的使用者会看到这个错误,这是刻意的:一条对从未做过的工作报告 成功的映射检查,比没有检查更糟。已发布的包包含这些工具与测试套件,所以这条链可以从克隆里重跑。
真机安装验证(自动化)
test/real-install-verify.test.mjs 把本包真的装进一个一次性的隔离 DSH_HOME,再对装出来的产物
做断言,而不是对仓库里的副本:断言对象是那个被安装、被 compose 的 cordis.patch.yml。
$env:DSH_BIN = "<你已安装的 DSH 版本目录>\node_modules\@deepseek-ai\dsh\lib\bin.js"
npm run test
DSH_BIN指向某个 DSH 版本的node_modules/@deepseek-ai/dsh/lib/bin.js。没有它就没有 DSH 可以用来安装,所以该用例整组skip,理由是DSH_BIN not set。这是唯一诚实的跳过:装上了却断言 不出来算失败,不会被降级成 skip。OMO_VERIFY_SOURCES是逗号分隔的源列表,默认值是file。合法 token 只有五种形态:file(或file:)——从当前工作树安装,不依赖任何发布状态,所以它是默认值;github——裸族名,ref 依次取OMO_VERIFY_REF、OMO_VERIFY_SHA、git rev-parse HEAD;github#<ref>——显式 ref,直接用;npm——裸族名,版本取OMO_VERIFY_VERSION,未设置时取package.json声明的版本;npm@<version>——显式版本。 任何其它 token(包括拼错的)都会硬失败,不会被吞成「0 个用例、退出 0」的假通过。
每个源各跑一遍:建临时 DSH_HOME → dsh plugin --profile verify add -w <源> → 把包名写进该 profile 的
dsh.profile.bundles → --dump-config 自检 → 对安装产物跑断言(提示变量守卫、{{cwd}} 计数为 0、
suffix 行文本)。github 与 npm 两族只有在对应 ref 或版本真的可达时才能通过:发布之前用 commit
sha,发布之后用版本号。
--dump-config 不插值
--dump-config 只合成配置树,不做提示词插值,所以一个把未注册变量写进 persona 段的 preset 同样
能让它以 0 退出、stderr 0 字节。换言之:它通过不代表提示变量合法。
提示变量是否合法由静态守卫 test/prompt-variable-guard.test.mjs 判定:它扫描 cordis.patch.yml 与
baseline/cordis.patch.yml 里出现的每个 {{名字}},要求全部落在运行时注册的 provider / model
之内。两条检查互补,谁也替代不了谁。
手工建一个隔离环境(手工步骤,非自动化)
以下是手工步骤。自动化测试复刻的只是其中的「会话隔离」语义,不是这个界面流程本身:
- 在启动器里新增一个启动项;
- 版本选你已安装的那个 DSH 版本;
- 隔离方式选「会话隔离」,得到一个独立的
DSH_HOME; - 可选「从已有 Profile 复制」,从一个现成 profile 起步;
- 起一个会话,在该 profile 里装包:
dsh plugin --profile <name> add -w <源>; - 把包名加进该 profile 的
dsh.profile.bundles; dsh --profile <name> --dump-config自检;- 开一个新会话,选中本 preset。
自动化复刻的是第 2 步与第 3 步的组合——一个独立的 DSH_HOME 加指定版本的 DSH runtime——然后直接
调用 CLI。它不驱动 GUI:启动器自身的界面行为、启动项持久化、以及第 4 步的复制路径都没有被自动化
覆盖。
caveman 全局加载(包内)
本包随附一个 caveman skill,并在安装后接管本部署的 caveman 规则。下面是它做什么、想达到什么效果; 这是设计描述,不是「已在本机验证生效」的报告——本版没有用真实 provider 跑过行为验证。
随包 skill。 包里带 skills/caveman-ultra/,skill 名 caveman-ultra,默认级别 ultra。正文
与源 caveman 技能同源,差别只在默认级别、描述、触发词与边界段按本部署改写,并且不含本部署不提供的
斜杠命令。
生效方式。 本包在 bundle 根层(host plane) 挂一个模块 caveman-autoload.mjs,它做两件事:
- 注册一条 system prompt section,名为
caveman:loader,order 60(落在 deployment persona 的 0 与 plan policy 的 500 之间); - 在 skill catalog 里 runtime 注册
caveman-ultra,正文读自包内skills/caveman-ultra/SKILL.md。
挂载位置在根层而不是某个 preset 内,所以它覆盖本进程里的每个会话,不只覆盖选中本 preset 的那些。 这一点是结构上的预期(根层即 host plane),本版没有用真实会话确认 catalog 可见性——沙箱里没有 provider 凭据,能验的只是注册调用本身。
旧副本会被取代。 若环境里另有一条名为 caveman 的 skill(例如 $DSH_HOME/skills/caveman,正文
默认 full),loader 文本会把那条标成「本部署已取代的旧副本(默认 full)」,并要求按 caveman-ultra
的规则处理。同名与否两条都会进 catalog,所以这层排除靠的是文本点名,不是覆盖掉那条注册。
切级方式。 两个途径:在请求里直接声明级别,或在部署时设环境变量 OMO_CAVEMAN_LEVEL。合法值
是 lite / full / ultra / wenyan-lite / wenyan-full / wenyan-ultra / off,未设置时取
ultra。切级是 prompt-only:级别只改变提示文本里写明的级别,本版没有对各级别实际的输出行为做
验证。
关闭。 说 stop caveman 或 normal mode。
覆盖缺口是 9/10。 主 preset 加 9 个子 preset,其中 9 个既有 skill provider 也有 skill 工具,能
列出并调用这个 skill;omo-multimodal-looker 两者都没有,它只收到 loader 文本,拿不到 skill 本身。
这是已知取舍,没有为它强行补一条 skill 行。
与 $DSH_HOME/AGENTS.md 的关系。 包内 loader 的文本已覆盖那段装载器的作用范围;若 AGENTS.md
里仍留着旧的 caveman 装载器段,它不再必需——是否移除由使用者按自己的部署自行决定。
没有斜杠命令。 本部署不提供该命令插件,包内也没有 caveman 斜杠命令;切级只走上面那两条路。
许可
本仓库双许可,两个许可不是二选一:每个文件恰好被其中一个覆盖。它不是仅 MIT。
范围映射与 NOTICE.md 中的两个块一致:
LICENSE-SUL-1.0.md覆盖上游衍生内容:personas/、cordis.patch.yml、plan-aware-persona.mjs、index.js与baseline/cordis.patch.yml。LICENSE-MIT.md覆盖我们自己的作品:tools/、test/、.github/、baseline/README.md、package.json、.gitignore、.gitattributes、README.md、CHANGELOG.md与NOTICE.md。NOTICE.md是权威声明:修改声明、上游署名,以及机器可读的许可范围映射,其中包含 决定每个受跟踪路径归哪个块的匹配规则。本 README 与NOTICE.md不一致时,以 NOTICE 为准。
上游条款是 Sustainable Use License 1.0,逐字保存在
LICENSE-SUL-1.0.md 中。SUL-1.0 是 source-available 许可,不是
OSI 批准的开源许可,本仓库也不作此主张。
上游条款只允许你为自己的内部业务目的,或为非商业、个人用途,使用、复制、分发和制作衍生作品;
只允许你在免费且非商业的前提下分发。本包正是按这些条款分发:免费、非商业、不可转售。
上游许可不可再授权,所以覆盖我们自己文件的 MIT 许可无法延伸到上游衍生的文件之上,也所以
LICENSE-SUL-1.0.md 必须随每一份副本一起传播。
MIT 范围上有一条界定:tools/ 与 test/ 下的文件是我们自己的作品、按 MIT 授权,但它们内嵌了上游
bundle patch 表达式的逐字片段,以便生成和校验该 patch。那些片段仍受上游 SUL-1.0 约束,不会因为
周围代码适用 MIT 而被重新授权。同一条界定也写在 NOTICE.md 里,两份文档一致。
本仓库是非官方 fork,未获上游项目及其作者的背书、赞助或关联,这里也没有任何内容暗示存在 关联或背书。上游名称与商标归其所有者所有。
已知问题
-
0.1.0至0.2.2全部带有同一个提示变量 bug,而且现在仍可正常安装**(尚未 deprecate, 因为发布端本机凭据没有写权)。这些版本的cordis.patch.yml在 persona 的suffix:里写了{{cwd}},而运行时只注册provider与model,所以会话在组装提示词时直接失败:unknown prompt variable "{{cwd}}" in section "deployment:persona-suffix"。装包本身会成功, config dump 也会以 0 退出、stderr 0 字节,因为 dump 不插值——故障只在开新会话时出现。0.2.3已修复:suffix 改回纯文本,并加了一条静态守卫。已经装了旧版本、会话报这个错时怎么退回:把本 bundle 从那个 profile 里移除,等修复版本—— 先
dsh plugin --profile <name> remove @tacrine_f/oh-my-dsh-omo-fork-chs,再把包名从该 profile 的package.json中dsh.profile.bundles数组里删掉,然后重启 Host 并新开一个会话。更省事的 做法是直接升级到0.2.3,它就是为这件事发布的。0.0.0-stage没有对应 tag,无法以 tag 树判定 是否受影响,因此不在上述列表里,也不建议安装。 -
本版本要求 DSH ≥ 0.2.2。 0.2.0 patch 用
agentPreset为 9 个子代理各选一个 preset, 而这个字段只有 0.2.2 的dsh-tool-subagent才读取;0.2.2 同时移除了旧行使用的persona与toolFilter字段。在 DSH 0.2.1 及更早版本上,这些行照常挂载,但agentPreset只是被接受、 随后从不被读取(schema 合并未知键,而不是拒绝它),于是子代理既没有 persona,也没有任何工具 限制,直接继承父代理的全部工具集:像 explore 或 oracle 这样的只读子代理会静默获得写文件与派生 子代理的能力。这是静默提权,不是挂载失败。下面声明的 peer 范围仍放行更旧的 0.2.x 构建,所以 这是一条功能性要求,不是 semver 约束。已于0.2.2-alpha.2验证;不要在低于 0.2.2 的 DSH 上运行 本版本。 -
声明的 peer 范围覆盖 0.1.7 线与 0.2 线,但
0.2.1-alpha.1只验证过 0.1.x 的 patch。 24 个@deepseek-ai/dsh-*peer 声明为>=0.1.7-rc.2 <0.2.0 || >=0.2.0-0 <0.3.0-0 || >=0.2.1-alpha.1 <0.3.0-0,既保留本 fork 从上游 继承的范围,又加入 0.2 线。宿主用一条 semver 范围检查判定这些 peer 是否兼容,并把预发布版本纳入 比较,所以该范围接受0.2.0、0.2.1-alpha.1与更晚的0.2.2-beta,拒绝0.3.0-alpha.1。已用实验在
0.2.1-alpha.1(仅 0.1.x 的 patch)与0.2.2-alpha.2(本 patch)上验证。 在 profile 中没有任何豁免的情况下,对本包做 config dump 会以 0 退出、向 stderr 写入 0 字节,dump 中带上该 preset 与全部九条 persona 锚点;其中0.2.2-alpha.2这次运行针对的是把本包注册为 bundle 的 profile。这证明的是挂载与锚点路径,不是 persona 的字节内容,也不是 preset 的行为:本次验证没有 调用任何 agent,一个仍然存在但已被截断的 persona 同样会通过。另外--dump-config只合成配置树、 不做提示词插值,所以它通过也不代表提示变量合法——那一层由静态守卫test/prompt-variable-guard.test.mjs负责。0.3.0-alpha.1是重新触发的条件。 将来的运行时一旦落在该范围内就会再次被拒,stderr 上出现 同样的不兼容警告,退出码同样是 0,所以不看 stderr 就仍是静默失败。在这类版本上,你要么使用落在 声明范围内的 dsh,要么用dsh plugin allow-version "<pkg>@<version>" --dsh-version <version> --accept-risk授予精确版本 豁免。该豁免是宿主自带的逃生舱,带有宿主自己警告过的风险,属于对风险的刻意接受,不是受支持的配置。 本次放宽没有覆盖的情形仍然需要它:npm 上已发布的0.1.0携带旧的、更窄的范围,将来任何 0.3.x 运行时也需要它。@deepseek-ai/cordis同样声明为^4.0.1,但宿主从不检查它:宿主只评估 名为@deepseek-ai/dsh或以@deepseek-ai/dsh-开头的 peer,所以那一条不是宿主会执行的兼容性 约束。 -
baseline/证明可复现,不证明正确。 baseline 是移植前 patch 的冻结快照,提交它是为了让往返 校验在任何地方都能跑。它与源 patch 逐字节一致,而这次推导证明移植是可复现的:已发布的 patch 与 baseline 之间恰好由三项已记录改写相连,别无其他。它不证明内容正确。源 patch 本身有错时,这次 推导会忠实复现那份错误,这里所有检查依然通过。 -
内容正确性的既有证据不随包发布。 那份证据是简体中文移植工作产出的
omo-fork-chs-*证据集, 其中verify-omo-fork-chs-bundle校验器报告FAITHFUL,verify-omo-fork-chs-deport校验器 报告CLEAN。这些校验器依赖机器:它们针对只存在于移植准备机器上的目录运行,刻意不随本包 发布。 -
内嵌的 persona 正文带有机器本地路径。 三份 persona 文档里共十行写出了本地化工作所在机器的 绝对路径。这违反本仓库「任何提交的文件都不得写出机器绝对路径」的规则,之所以容忍,只因为与源 bundle 的字节一致性是更硬的约束。受影响的那些行在
tools/check-package.mjs中逐条列举,扫描只在 这些确切位置接受匹配。NOTICE.md把这件事记为修改条目 8。本文档不复制那些路径,因为它本身也在 该扫描的覆盖范围内。 -
本仓库与英文 fork 并存。
Tacrine/oh-my-dsh-omo-fork是独立仓库,有自己的包、自己的 preset id 和自己的范围映射。两个仓库互不影响:它们共享上游血缘,本包中没有任何内容读取、写入或依赖另一个。 -
0.1.0 是本仓库的首次发布,此前没有任何版本发布过。 本包在 npm 上没有前身,所以没有更早的产物 可供对照,也不存在从旧版本升级的路径。
源流
本包源自那份简体中文 agent-preset bundle。它当时以 link 安装的形态存在:一个接入某台机器 DSH profile 的私有依赖,指向一个本地目录。那种形态无法装到别处,因为它的 patch 写出的是机器本地包名, persona 锚点也相对于 profile 目录解析。
本仓库把那份 bundle 变成可从 npm 安装的形态,靠三项已记录改写完成:包自引用与九条 persona 路径
锚点被重新指向本包自己的名字及其 package.json,头部注释随之更新。结果是一个在任何安装布局下都能
解析的 patch、一份让往返校验不再需要原机器的冻结 baseline,以及一条证明已发布 patch 仍等于其来源的
检查链。
上游项目是 oh-my-openagent,曾以 oh-my-opencode 之名发布
(https://github.com/code-yeongyu/oh-my-openagent)。本仓库内容派生自上游 commit
3c711483856207ef530c09d062fa9077c225debbe,对应上游版本 5.0.1。persona 正文、工具链组成与
插件都沿用上游设计;本 fork 的贡献是简体中文翻译与打包拆分。
Plugins associés
webnovel-writer
lingfengqaq/webnovel-writer
loopx (dsh-loopx-plugin)
loopx-project/loopx
ouroboros (dsh-plugin)
q00/ouroboros
loopx (dsh-loopx-plugin)
huangruiteng/loopx