L02 埋过伏笔:运行中的 dsh = 一棵按配置组装出来的插件树。组装分四层:
四层都往同一个空的插件行清单上叠,后到的层胜出。
| 名词 | 是什么 | 在哪声明 | 通俗理解 |
|---|---|---|---|
| profile | 一份命名的插件组合 | 主目录 $DSH_HOME/profiles/<名字>/ 的 package.json 里 dsh.profile | 一份装机单:这台车装哪些选装包、按什么顺序 |
| bundle | 插件+配置的发行层 | 包的 package.json 里 dsh.bundle 指向补丁文件 | 选装包:dsh-base 是"标配包",web-app 是"豪华内饰包" |
| patch | 按行 id 替换/插入插件树的 YAML | cordis.patch.yml | 改装单:把某一行的配置整个换掉,或插入新行 |
| preset | 会话级的能力组合 | preset cordis.yml 文件 | 驾驶模式:同一台车,运动/舒适模式不同调校 |
web(dsh-base + web-app 界面层)和 headless(dsh-base + 一次性执行器)。dsh-base 永远是第一层:模型适配、工具、持久化、沙箱、审批、设置、凭据、遥测——产品的地板。# cordis.patch.yml —— 一个"插入新行"的补丁
- insert:
- id: hello # 行的 id(替换时的定位键)
name: '/绝对路径/scratch-plugin/src/my-plugin.ts' # 挂哪个插件
config: # 给它的配置(可选)
greeting: 'Hi there'
dsh --profile web --dump-config
打印你这台机器真实启动的完整插件树(YAML),每层 bundle 的贡献带注释分节;打印出来的任何一行,都可以被你自己的补丁按 id 替换。"不写代码换实现"的完整工作流:
--dump-config 看清现状;cordis.patch.yml 里按 id 写替换(记得重述全部需要的配置);--patch 挂上验证。# 把一个本地包安装进 demo profile(首次会自动初始化 profile)
dsh plugin --profile demo add ./hello-plugin
# 验证层结构(不启动),然后启动
dsh --profile demo --dump-config
dsh --profile demo
# 移除(依赖和层一起删)
dsh plugin --profile demo remove dsh-hello-plugin
dsh plugin --profile <名> <args> 本质是转发给 profile 目录里的 pnpm,所有 pnpm 动词都能用(add / remove / update……);声明了 dsh.bundle 的包会自动追加进 dsh.profile.bundles 清单。
profile 是整机级组合(boot 时定死);preset 是会话级组合——同一个 dsh 实例里,给个别会话配不同的插件(如"代码审查专用"会话模板:只挂审查相关工具)。来自 packages/preset/,从预设的 cordis.yml 读组合。换能力集用 preset,不必为每种用途单独开 profile。
pnpm dsh web --dump-config,找到 dsh-base 贡献的行,挑一行看看它的 id 和 config。cordis.patch.yml,用 --patch 挂上,再用 --dump-config 对比前后差异(注意:被替换行的 config 是整个换掉的)。pnpm dsh plugin --profile demo add ./某本地包(可先跳过,L18 会正式做),观察 $DSH_HOME/profiles/demo/ 的变化。