dsh-trellis
Verifieddsh-trellis · v0.1.13 · MIT · Web UI
Trellis workflow integration for DeepSeek Harness: per-turn workflow-state breadcrumbs, utility commands, and native session identity.
Install
dsh plugin add dsh-trellis Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
dsh-trellis
DeepSeek Harness (dsh) host 插件:把 Trellis 工作流带进 dsh,并尽量沿用 DSH 原生能力补齐 Codex / Claude Code 级体验:
- 每轮 workflow-state 面包屑注入 — 在每个
agent/pre-step,解析项目.trellis/workflow.md的[workflow-state:*]块 + 活跃任务状态(no_task / task_error / planning / in_progress),把对应面包屑注入会话(与dsh-agent-instructions的注入管道相同)。未变化不重复注入;被压缩后自动重注入;提示词里出现独立单词no-trellis可跳过当轮。 - 隔离的原生会话上下文身份 — 从当前 agent 的 DSH 原生 session header 生成受管的
DSH_TRELLIS_CONTEXT_ID,让task.py start/create/current解析到会话级 active-task 指针,并在子代理身份不同于 shell 自身 session 时优先使用被转发的身份;插件命令启动的子进程也显式使用同一个 DSH 身份。 - 原生子代理同步 — 安装插件后,Trellis 角色可用 DSH continuable 后台子代理;主会话先继续独立工作,耗尽后可调用事件驱动的
trellis_wait。它监听 DSH 的subagent/end,利用 lifecycle 自带的 run/provider/output-block 元数据返回completed / failed / aborted / unknown的 fail-closed 结论。error、max-tokens、refusal和未来未知失败原因都不会被误报成通过。rc.8 在父会话 idle 时也会用原生 settlement notice 唤醒,因此已经结束当前轮时无需额外调用 wait。 /trellis命令 —/trellis-status(活跃任务 + git 状态)、/trellis-finish(只读检查 + 安全收尾清单,不提前清 active-task 指针)。命令输出不进模型历史;真正的会话收尾走技能面/trellis-finish-work,由技能先归档再写 journal。rc.8 下两条零输入命令使用recordInput: false,并显式拒绝参数和图片附件,避免静默忽略输入。- Web 配置菜单 — DSH
0.1.7-rc.1的“插件 → dsh-trellis”详情页直接显示全部六个配置项;保留0.1.6-alpha.2详情页与旧版 RC 卡片。新版支持带修订号的原子保存、恢复 profile 继承值和冲突时保留草稿。配置里的enabled=false会停用工作流功能但保留表单;插件管理器的整包或组件开关则会连同表单一起卸载。
非 Trellis 项目不注入面包屑;命令只有被用户显式调用时才会检查并返回“未初始化 Trellis”。
这是 Trellis DSH 适配的可选伴侣插件,不是使用 trellis init --dsh 的前置条件。存在 trellis_wait 时可使用 continuable 后台派发和事件汇合。未安装插件时,只有工具 schema 明确支持 run_in_background 的旧宿主才设置 run_in_background: false;DSH 0.2.1-alpha.2 已移除该参数,统一立即返回 child ID,应让父会话结束当前轮、由原生完成通知唤醒,或直接在主会话完成工作。收到 child ID 不代表依赖步骤通过;没有可用的事件汇合或可靠原生通知路径时不要派发。所有路径都禁止 sleep 或轮询,Trellis CLI 不会自动安装任何 DSH profile 插件。
安装
# 装进实际使用的 profile;CLI 修改在下次启动时加载
dsh plugin --profile web add dsh-trellis
dsh plugin --profile headless add dsh-trellis
# 如果你维护独立的 tui profile,也需要装进该 profile
dsh plugin --profile tui add dsh-trellis
dsh plugin 会把插件安装到指定 profile;每个实际使用的 profile 都需要单独安装。
DSH 0.2.0-rc.2 的 macOS / Windows 桌面端可在菜单栏“Manage dsh command”中安装或管理内置 dsh 命令,无需单独安装 Node 或 pnpm。先用 dsh --version 确认 PATH 中实际调用的版本;旧的全局 CLI 可能与桌面端不同。桌面端默认使用 desktop profile,其他 profile 仍需分别安装。
新版本刚发布时,插件页预览的版本可能与安装器最终选择的版本不同。需要本版插件 0.1.13 时,在插件页输入 [email protected],或显式安装到实际使用的 profile:
dsh plugin --profile desktop add [email protected]
# Web / headless 用户将 desktop 替换为对应 profile 名称。
DSH 0.2.0-rc.2 发布说明曾引入 pnpm 11;其默认新版本等待期为 24 小时,裸包名可能暂时解析到较旧版本。不要仅凭“RC.2”推断其他版本的包管理器:以实际宿主和解析结果为准。显式版本安装仍须通过版本准入,不需要关闭全局等待期或绕过兼容性检查。参见 DSH 0.2.0-rc.2 更新说明 与 pnpm 11 发布说明。
日常升级命令:
dsh plugin --profile web update dsh-trellis
dsh plugin --profile headless update dsh-trellis
对 tui profile 使用同样的 update。CLI 在进程外修改 profile 后,应重启对应 DSH 进程。0.2.1-alpha.3 起,运行中的插件管理器可对满足 HMR 条件的包执行代码热替换;无法热替换时会提示需要重启,以实际结果为准。整包/组件开关只证明卸载与重挂,不等同于包代码已更新。更换 DSH 宿主 release 后,还需按页面提示刷新浏览器,避免旧 Web 壳连接新宿主。参见插件管理器生命周期。
DSH 0.1.6-alpha.2 也可从 Web 侧栏“插件 → 添加插件”安装包。Web 安装后需要手动启用;CLI add 默认启用。安装命令仍是 dsh plugin --profile <name> add <package>,无需增加额外安装脚本。
如果要从源码开发或验证尚未发布的版本,可以改用本地 file: 安装:
git clone https://github.com/SajoLuo/dsh-trellis.git
cd dsh-trellis
pnpm install --frozen-lockfile
pnpm run build:client
dsh plugin --profile headless add file:C:/path/to/dsh-trellis
file: 插件会作为 profile 内的 pnpm 快照安装;拉取源码更新后,尤其是版本新增文件时,需要先 remove 再 add 刷新该 profile。外部 CLI 刷新快照后重启对应进程,不要假定源码目录变化会自动热更新。
配套要求:项目的 Trellis 平台需包含 dsh(trellis init --dsh,见 Trellis-DeepSeekHarness 适配分支),且 .trellis/scripts 需包含读取原生 DSH_SESSION_ID 的适配(已含在同一分支)。现有 engines.dsh 和 Host peer 范围已接纳 0.2.1-rc.2,无需为每个预发布标签追加范围。0.2.1-alpha.4 起宿主优先检查显式 engines.dsh,仅未声明时才回退 DSH peer;其 includePrerelease: true 规则与 npm 默认匹配不同。通过准入不等于实际兼容,不应使用 allow-version 绕过缺失的 API。开发基线固定为 0.2.0-rc.1,隔离回归覆盖开发章节的十二个明确宿主,不代表测试了范围内所有版本。Web 配置只在具备对应 client surface 的 profile 中加载。参见官方版本声明迁移说明。
运行时需要 profile 提供 sessionProjections 服务;该依赖由插件的 inject 声明。自定义或精简 profile 若未组装此服务,需先加载 @deepseek-ai/dsh-session-projection,否则插件会等待依赖,不会退回直接扫描历史。
0.1.13:DSH 0.2.1-rc.2 兼容回归
- 补齐 alpha.3 / alpha.4 / alpha.5 / RC.1 / RC.2 的隔离回归与 Windows/Linux CI 目标,按各版实际发布的 Cordis、Schemastery、Include 和 Loader 精确配对;未知宿主直接拒绝,不猜测依赖组合。
- 新增版本准入声明和依赖矩阵回归。保留
0.2.0-rc.1开发基线、现有 peer / engine 范围及插件运行时代码,不新增清单格式、安装脚本或强制升级路径。 - 修正安装、热替换、AgentPreset、SDK 会话和技能缓存边界说明。本版仅更新插件仓库;不改 Trellis 模板、现有项目或另行跟进的上游 PR。实际验证范围见 RC.2 验证记录,远端 CI 与发布状态以对应标签和 npm 为准。
0.1.11:DSH 0.2.0-rc.2 兼容验证
- 增加
0.2.0-rc.2隔离回归与 Windows/Linux CI 目标;本地 RC.1 / RC.2 均为 130 项通过、无失败或跳过,RC.2 独立 Web profile 验收通过。 - 现有
^0.2.0-rc.1已覆盖 RC.2,无需扩展 peer 或新增运行时补丁。开发基线仍为锁定的 RC.1。 - 补充桌面内置 CLI、profile 区别及显式版本安装说明。本版不包含 Trellis CLI 的归档与嵌套身份补丁,它们在独立适配分支中维护。范围与限制见RC.2 验证记录;远端 CI 和发布状态以对应标签为准。
0.1.12:DSH 0.2.1-alpha.2 适配
- 面包屑和两条命令按每次调用读取 agent 作用域的
workingDirectory.ensure(),支持切换项目/worktree及目录恢复;仅旧宿主没有服务时才使用原始header.cwd。目录验证失败不偷偷回退旧项目,原生 session ID 不随目录改变。 trellis_wait只证明匹配的执行结算;完成通知投递另由宿主负责。兼容字段settlementNoticeQueued=false表示未证明入队,不表示确认未投递。通过依赖门禁前仍需检查子代理报告或 transcript;inactive 快照保持 unknown。- 为 DSH、Cordis 和 Schemastery 显式声明已验证 alpha peer 范围,保留 RC 开发基线及旧宿主范围;移除无直接用途的
dsh-invariants开发依赖。新增 alpha.2 精确工具链隔离回归与 CI 目标,不升级本机 DSH。 - alpha 用户可显式安装
[email protected]。Trellis 模板在独立适配工作区同步,不包含在 npm 插件包中,也不是官方 Trellis npm 升级;现有项目的 workflow 不会被插件自动改写。测试结果及边界见 alpha.2 验证记录,远端 CI 与发布状态以对应标签为准。
0.1.10:DSH 0.2.0-rc.1 适配
- 七项 DSH peer 和
engines.dsh新增^0.2.0-rc.1;旧的^0.1.7-rc.1不接纳 0.2。开发依赖及锁文件升级到 0.2,Windows/Linux CI 配置继续覆盖四条旧宿主线。使用 0.2 宿主时请安装插件 0.1.10 或更新版本,0.1.9 不包含这项适配。 - 跟随宿主的失败工具历史恢复,新增真实 AgentLoop 回归:工具尚未启动时记录
TOOL_NOT_STARTED,已执行但结果未提交时记录TOOL_OUTCOME_UNKNOWN;保留原始错误和已提交结果,继续会话不自动重试等待,也不重复注入面包屑。 - 已用隔离 DSH Web 验证正常版本准入、配置保存与读回、恢复继承值、整包/组件开关、冲突保留草稿以及页面重载。无需改变运行时代码、插件清单形态、安装命令或 Trellis 模板。完整范围见验证记录。
0.1.9:DSH 0.1.7-rc.2 兼容验证
- 新增 RC.2 隔离回归及 Windows/Linux CI 覆盖,修复兼容测试把非 RC.1 宿主错误归为旧版 Cordis 依赖的逻辑。
- 使用真实 AgentLoop、Loader 和 Session 验证动态工具增删、Settings 重挂、面包屑去重、恢复/分叉及压缩后的重新注入;补充等待目录失败与卸载清理回归。
- 本版不改变插件运行时代码、peer 范围、安装命令或 Trellis 生成模板;保留 RC.1 开发基线及两条旧宿主回归。验证范围与限制见详细记录。
0.1.8:DSH 0.1.7-rc.1 适配
- 按新版 Settings 契约声明六个
.volatile()配置字段,读取 live Config,并由 Loader 的loader/volatile-update通知更新工作流注册。Settings 仅持有当前插件 fiber 的自定义页面策略;迟到、替换或卸载该服务不会重置配置。旧宿主保留原 helper/provider 路径。 - Web 改用
configForms.get(entryId),保留旧settingsScope兼容分支。新版一次提交全部字段与编辑开始时的 revision,冲突或断连保留草稿;冲突后先放弃更改、读入新值,再重新编辑。旧宿主继续使用逐字段写入。 - 适配父会话
subagentCatalog:目录只证明直接归属和 continuable 模式,当前驻留状态另读 Session store,并校验创建时间和父会话,防止复用 id 串会话。查询期间捕获的subagent/end优先于 inactive 快照;冷子代理仍返回 unknown,不猜成功。旧目录格式继续支持。 - 保留单文件
dsh.bundle.patch、manifestVersion: 1和 profile 安装命令;无需增加安装脚本。不改变 Trellis 生成模板及已有任务绑定。 - 本轮按本地工作区验证;不宣称支持新版 DSH 的 SSH 远程工作区文件访问。
0.1.7:DSH 0.1.6-alpha.2 适配
- 跟随官方插件页 slot 契约,第三方包配置注册到
plugins.bundle.config,以dsh-trellis包名为 key;详情页直接渲染表单,不重复包装标题和折叠卡片。保留旧settings.plugin.itemkeyed/list 两种形态,按实际存在的 slot 延迟注册并随 owner 卸载。 - 依照官方插件管理器规范,保留
dsh.bundle.patch安装入口,增加dsh.manifestVersion: 1与engines.dsh兼容性声明。engines.dsh在该宿主版本中是声明信息,不是运行时兼容性检查器。 - 升级开发依赖和锁文件;测试依赖使用新名
dsh-ptc-runtime,RC 回归隔离副本继续使用dsh-code-runtime。dsh.client.inject保留旧宿主需要的依赖信息;新宿主实际运行时模块请求仍由编译产物决定,不额外安装一份 Web 壳。 - 加固实时卸载:取消所有正在等待的
trellis_wait、注销结算监听器、拒绝旧工具引用继续执行;清除尚未消费的 Trellis 面包屑,但保留用户输入。异步 pre-step continuation 在卸载后不再注入。Settings 保存遇到断连或拒绝时显示失败、保留草稿并允许重试。 - 本轮不改变 Trellis 的任务绑定、Python 脚本或生成模板;继续保留 0.1.6 的精确会话指针和
task_error行为。
既有 DSH 0.1.5-rc.2 对齐
- 已迁移:面包屑使用
sessionProjections的纯 fold,在恢复或分叉时重建状态、按已提交事件增量更新,不再调用 Session 的eventAt()/snapshotEvents()/ownEvents()或访问旧事件集合。当前 DSH 注册 Host-only projection;旧版 registry 通过 projection snapshot 兼容,仅包含序号和 payload 哈希,不传输工作流正文。 - 已修复:恢复会话、插件或 Settings 重载后的首轮也会去重;以最后一条仍可见的面包屑判断,避免 A → B → A 状态切换被旧记录误抑制。压缩移除后会重新注入,字节预算变化导致的正文变化也会重新注入。
- 前瞻适配:上游同步历史读取弃用决策 已进入主线,但 RC.2 仍提供这些方法;本次提前解除依赖,不代表 RC.2 已删除接口。插件不负责迁移磁盘会话格式。
- 已核对:插件不依赖 0.1.5 移除的
ctx.agent或可构造Inbox;pre-step 从事件载荷取得 agent,工具从exec.agent取得调用方,待处理消息只使用agent.inbox当前公开的nextStep、prepend、replace与remove。 - 已采用:command lifecycle 的
recordInput、command attachment envelope 的 fail-closed 输入检查、subagent/end的 run/provider/final-output 元数据,以及 report-before-settlement 与 idle-parent 原生唤醒语义。 - 已接入:Host
dsh-trellissettings namespace 与dsh.client浏览器卡片。保存值写入 DSH 的settings.yaml用户层,并实时重挂插件 runtime;settings provider 单独重载时退回 loader 配置,插件自身卸载时则不会错误重挂 runtime。没有 settings 服务的 profile 继续使用原有 loader 配置。当前可选 Settings 生命周期由settings.installSection()承担;插件仍在运行时兼容旧版 helper。 - 已对齐:
dsh.client.inject指向的三个 DSH client 包与 React 都只作为浏览器构建输入保留在devDependencies,发布安装不会重复解析 Web 壳已经提供的模块。 - 保持可选:
trellis_wait仍是“父会话还在当前轮里、需要明确同步点”时的工具;已经 yield 的父会话直接由 DSH 原生 settlement notice 唤醒。 - 保持直接归属:
trellis_wait继续使用listChildren(parent.id)验证 direct continuable child;这与 0.1.5 修正后的可继续子代理归属一致,不会把子代理误当作根会话参与调度。
配置
支持 Settings 的 DSH Web profile,在新版打开“插件 → dsh-trellis”,旧版 RC 打开“设置 → 插件 → 插件配置 → Trellis 工作流”。0.1.7-rc.1 起(含 0.2.0-rc.1)保存到当前 profile 的 cordis.patch.yml,全局 patch 和命令行覆盖仍优先,无法生效的表单写入会被拒绝;旧宿主仍保存到 settings.yaml。
升级前备份 settings.yaml 和各 profile 配置。新版宿主会把旧文件改名为 settings.yaml.imported,并向首次启动的 profile 按 entry id 一次性导入;拒绝的 section 只保留在备份文件,不会自动重试。插件不会自行重命名、删除或跨 profile 复制配置;应先安装兼容插件,再启动迁移,并核对其他 profile 的需要。
Headless、rc.6 或需要声明部署默认值时,仍可在 profile 的 cordis.patch.yml 里覆盖(整行替换);Web 卡片的“恢复配置文件值”会清除用户层字段并重新继承这里的值:
- id: dsh-trellis
config:
maxBytes: 4096 # 面包屑注入的字节预算(0 = 关闭注入)
skipKeyword: no-trellis # 提示词中的独立单词可跳过当轮注入(空 = 禁用)
pythonCmd: "" # 空 = 自动选择:Windows 先 py -3 再 python;其他系统先 python3 再 python
commandsEnabled: true
0.1.6:Trellis 会话隔离与任务错误兼容
- 跟随 Trellis #608:只读取当前 DSH 会话的精确指针。缺少身份或匹配指针时返回
no_task,不再借用唯一的其他会话;也不从派发提示词反向建立会话绑定。子代理继续通过明确的Active task:派发上下文读取任务。 - 对齐 官方
task_error工作流:已绑定任务的task.json缺失、不可读、JSON 损坏或状态为空时,保留任务路径,提示先修复记录,不把它当成“没有任务”。不修改或删除任何任务与指针。 - 旧项目没有
[workflow-state:task_error]块时,插件提供保守的修复提示;恢复有效记录后,下一轮自动恢复正常状态。因此无需先更新 Trellis CLI 才能使用本插件的修复。 - 插件修复不替代 Trellis Python 脚本升级:旧版
task.py current/finish的回退策略、归档恢复和上下文清单检查仍由项目中的.trellis/scripts实现。
工作原理
- 状态解析(
lib/workflow.js):向上找项目根 → 读.trellis/workflow.md解析状态块 → 只读当前会话指针.trellis/.runtime/sessions/dsh_<id>.json,不枚举其他会话。指针缺失时返回no_task;指向的任务记录不可读时返回task_error并保留路径。修复记录或重新绑定任务后会在下一轮重新解析。 - 注入去重(
lib/breadcrumb-projection.js):投影仅保存面包屑的事件序号和 source/content 指纹,与 DSH 已维护的session.surface.nodes一起确定最后可见面包屑。恢复、分叉和重载均从 projection 重建;不缓存“本进程最后注入”的临时判断,也不扫描完整事件历史。 - 会话身份:DSH 原生提供
DSH_SESSION_ID = agent.session.header.id,并先丢弃环境中已有的DSH_*再重建受管命名空间。Trellis beta 因此会在同时看到DSH_SHELL=1与DSH_SESSION_ID时优先解析当前 DSH 身份,即使没有插件也不会被外层 host 继承的TRELLIS_CONTEXT_ID串任务。插件通过shellEnv为每次执行额外生成DSH_TRELLIS_CONTEXT_ID = dsh_<session-id>,用于转发可能不同于 shell 自身 session 的子代理身份;主会话与子代理仍各自保留 DSH 身份,子代理通过派发 prompt 首行的Active task:和角色 prelude 取得父任务上下文。 - Headless 会话:默认每次
dsh --profile headless调用都会创建新 DSH session。需要跨轮保留 active-task 指针时,应保持同一会话,或在支持的宿主上用--session-id明确继续已有会话;不能把多个未指定身份的独立调用当成同一 session。 - 工作目录:优先读取当前 agent 的可选
workingDirectory服务,跟随宿主提交的目录切换/恢复;仅服务不存在时回退 session header。服务故障不会触发旧目录操作。切换目录不会替换会话身份,不会复制任务指针;新目录按同一身份查找自己的指针。 - 取消与生命周期:命令和
trellis_wait都继承 DSH invocation 的AbortSignal;取消后命令不会继续尝试另一个 Python 启动器,等待工具也会立即注销临时事件监听器。结算事件不能单独证明父会话通知入队,因此settlementNoticeQueued保守返回 false(未验证);仅从 catalog 看到 inactive 时保持unknown,不猜任务通过。插件卸载或 Settings 重挂时,还会取消自己的活跃等待和待消费面包屑,不删除用户消息或任务记录。 - 子代理并发:主会话先做独立工作,需要汇合时用
trellis_wait等待直接 continuable 子代理的结算。以实际工具目录、schema 和 PTC/SDK 绑定为准,不假定它一定是顶层直接可调用的模型工具。无插件时根据实际工具 schema 选择旧宿主前台参数,或 alpha.2 的父会话 yield/原生通知路径;不存在可靠事件路径时主会话直接做工作。SDK 的session/wait不是可以假定存在的模型工具。所有路径都必须检查结果后才能推进依赖步骤。 - AgentPreset 与 SDK:新宿主通过
agentPreset组合子代理策略,不再发送移除的persona/toolFilter;模型侧仅在宿主公开可用列表时使用agent_preset,fork 保持宿主原生的预设继承,不自行拼接身份。SDKsession/resume恢复原生 session ID、历史和有效目录,本身不派发模型回合;初始化的模型路由不是新的 Trellis 身份。插件不保存或搬运模型凭据。参见预设迁移与SDK 契约。 - 技能目录刷新:alpha.5 的技能缓存修正响应插件管理器变化,不等于任意磁盘
SKILL.md修改或外部 CLI 更新都会推送刷新。执行trellis init/update后,按宿主的预设切换或重连路径刷新技能目录;本插件不增加全局缓存失效补丁。可选 Discover 使用独立插件索引,并非 Trellis marketplace gitlink;普通包安装无需创建索引。参见技能缓存和插件索引。
开发
pnpm install
pnpm run build:client
pnpm test # node --test test/*.test.js
pnpm run test:compat 0.1.5-rc.2 # 临时副本中安装旧宿主并运行同一套测试
pnpm run test:compat 0.1.7-rc.2 # RC.2 动态工具与面包屑集成回归
pnpm run test:compat 0.2.0-rc.2 # 保留 0.2.0 RC.2 回归
pnpm run test:compat 0.2.1-alpha.2 # 新工作目录与统一 activation 契约
pnpm run test:compat 0.2.1-rc.2 # 当前 RC.2 隔离回归
pnpm run test:compat # 默认跑全部十二个显式目标
GitHub Actions 配置在 Windows / Linux 的 Node 24 环境执行锁定的 0.2.0-rc.1 安装、客户端构建、测试、其余十一个宿主的隔离回归及打包检查。测试覆盖真实 Session/projection 的恢复、分叉、压缩和 checkpoint,临时项目的精确绑定与任务错误恢复,以及新版真实 Loader 的 volatile 更新、子代理目录/查询/驻留状态;新版专属测试在旧宿主明确跳过。另有编译客户端 React 渲染、slot 生命周期、原子保存与拒绝写入测试。配置了 CI 目标不等于远端 CI 已运行,结果以对应提交为准。
RC.2 集成用例运行真实 AgentLoop、Loader、ToolRuntime 和 Session,以本地脚本化模型响应验证三种 toolUpdate 能力:不支持、addition-only、in-history。覆盖插件启停的工具增删消息、Settings 重挂不重复注入、混合历史的恢复/分叉投影,以及 surface 替换后重建工具基线并重新注入面包屑。等待工具另覆盖目录损坏/不存在及卸载期间查询失败的错误保留与监听器清理。该验证不调用外部模型,也不替代 Web 浏览器或真实子代理派发验收;详情见 2026-09-28 验证记录。
0.2 集成用例另以真实 AgentLoop / ToolRuntime / Session 和实际 trellis_wait 验证失败工具历史的补齐顺序、错误分类、监听器清理及继续会话的消息配对。只注入 scheduler 故障和本地模型响应,不增加运行时补丁或自动重试;旧宿主按 ToolCallRecovery 能力明确跳过。还覆盖“目录查询期间收到成功结算、随后查询失败”的竞争,查询错误不能被伪装成成功。
test:compat 不改当前 checkout 的依赖,临时副本保留在系统临时目录并打印路径供检查。十二个目标采用以下明确配对,不按“非最新版本”猜测;未知宿主必须先核对官方包并补齐测试。
| DSH 目标 | Cordis | Schemastery | Include | Loader |
|---|---|---|---|---|
| 0.1.5-rc.2、0.1.6-alpha.2 | 4.0.2 | 3.18.2 | 1.0.7 | 1.0.3 |
| 0.1.7-rc.1 / rc.2、0.2.0-rc.1 / rc.2 | 4.0.4 | 3.18.4 | 1.0.9 | 1.0.5 |
| 0.2.1-alpha.2 | 4.0.5-alpha.1 | 3.18.5-alpha.1 | 1.0.10-alpha.1 | 1.0.6-alpha.1 |
| 0.2.1-alpha.3 / alpha.4 / alpha.5 | 4.0.5-alpha.2 | 3.18.5-alpha.2 | 1.0.10-alpha.2 | 1.0.6-alpha.2 |
| 0.2.1-rc.1 / rc.2 | 4.0.5 | 3.18.5 | 1.0.10 | 1.0.6 |
发布前还应使用隔离 DSH_HOME 启动真实 Web profile,验证配置保存/读回、整包及组件开关、重新挂载和卸载;不复用个人凭据或会话。代码 HMR、外部 CLI 快照刷新和浏览器跨宿主 release 刷新是不同验收项,不能用一次开关测试代替。当前结果与未覆盖项见 2026-10-18 验证记录。
Host half 是直接由 main 加载的 ESM JavaScript;Web half 通过 tsdown 生成 DSH lazy-CJS factory 到 lib/client.js。pnpm pack 会在 prepack 阶段自动重建客户端 bundle。
License
MIT