| 一切皆插件;新行为挂已文档化扩展点,不改 agent-loop |
只注册 ctx.tools/ctx.commands/ctx.systemPrompt/ctx.skills/ctx.webServer,不碰 agent-loop/引擎/apiproxy/官方 UI 包。0.2 起附加消费全部特性探测:sessionPersistence.listSnapshots/readFrom、fs.streamText、ctx.jobs、ctx.agents.resume、客户端 shell 的 sessions.refresh/open/workspaces.refresh(均带缺失回退,rc.6 仍可启动) |
✅ |
注册即 effect:贡献走 ctx.effect()/ctx.on()/服务 register()(返回 disposer) |
工具/命令/路由/提示词段/技能 provider 均经服务 register()(返回 disposer);可选服务经 ctx.on('internal/service') 响应式注册(disposer 随插件生命周期撤销) |
✅ |
waterfall 监听器必须 next() |
不监听任何 waterfall 事件 |
N/A(无监听) |
| 模型可见 ⟺ 已记录 |
工具描述/结果即落盘 tool/result;注入走 ctx.systemPrompt 组装(可重建);交接摘要走 agent.inject(inbox 持久上下文) |
✅(设计保证) |
类型化事件/服务 declaration merging;事件标注 @mode |
纯 JS 插件,不声明/不派发自定义事件与自定义服务 |
N/A |
| 配置用 Schemastery;非法配置加载期响亮失败;不得硬编码可调参数 |
Config = Schema.object(...);全部可调参数(claudeHome/scanGit/maxTranscriptBytes/excludeProjects/enable*/max*/resumeMaxChars/enableWebPanel/importConcurrency/workspaceMode/claudecodeDir)可 cordis.yml 覆盖 |
✅ |
工具 DSL:defineTool、execute 只返回 output.schema 规范值、人读内容在 output.render、UI presenter 纯函数、尊重 exec.signal |
defineTool + 输出 schema 经 validateJsonSchemaValue 校验;render 生成中文摘要;未定义 presenter(回退 generic 卡);execute 签名 (args, exec),扫描/单文件/批量全程检查 exec.signal(流式扫描逐行、批量并发阶段与落盘阶段每文件),中止抛出 signal.reason,测试覆盖已中止/在途中止 |
✅ |
| 可替换能力按三层接缝拆分;不提前拆 |
本插件是固定来源的迁移器,无可替换 provider 需求 |
N/A |
bundle 清单 dsh.bundle.patch;按 id 整行替换 config;!!js 双感叹号 |
dsh.bundle 声明 ✅;不使用 !!js(无环境选择需求) |
✅ |
独立插件包:cordis 是 peerDependency;ESM;git 安装需 prepare+allowBuilds;发布带构建产物 |
cordis/dsh-tools/schemastery 均 peer(锁 rc.6);纯 ESM 无构建步骤 → git 安装免 prepare/allowBuilds |
✅ |
| 包 README 含 Model Experience / Known Limitations(仓库门禁惯例) |
README 已含两段 |
✅ |
| 双语文档成对 |
GitHub 介绍页已五语(EN 主 + 中/西/葡/印地),行为变更同 commit 同步五语 |
✅ |
| 测试:纯函数单测 + mock 集成 + 畸形/平台用例 |
161 用例:vendored convert + 扩展单测 + discovery + import/report + context/settings + handoff + commands + routes mock 集成 + 客户端 bundle 契约 + 畸形行/密钥/大小防护 + 复制式迁移(源文件内容不变/force 不归档)+ 增量续写 + 工作区镜像(per-project 与 claudecode 两种模式)+ 中断工具调用修复(fixture + validateSessionEvents 自校验)+ 技能候选硬化(README/MEMORY/无描述跳过)+ frontmatter 解引用 + exec.signal 中止 + 并发确定性 + 发布面安全 tripwire(静态审计:白名单外任何 rm/unlink/truncate/archiveSession 判失败);三平台路径用例 |
✅ |
加载验证 --dump-config / 行为验证 |
已在真实 dsh 0.1.0-rc.6 验证:--dump-config 显示 # == dsh-claude-move 层与 claude-move 行;web 启动无 FAILED;__DSH_BOOT__ 含 dsh-claude-move 客户端条目(immediately: true);/plugins/dsh-claude-move/client.js 正常伺服;/api/claude-move/index 真实扫描 40 项目/2387 会话;单会话真实导入成功。0.2 复验(隔离 DSH_HOME + 隔离 CLAUDE_CONFIG_DIR,真实 rc.6 web boot,绝无触碰用户数据):tarball 从零安装、--dump-config 层生效、web 启动就绪;GET /api/claude-move/index 扫描 1 项目/2 会话/1 技能(README.md 被排除)/1 memory;POST /api/claude-move/import {path:"all"} 2/2 导入(repaired.synthesized:1,中断调用补合成结果);两个会话均 workspace.attached:true, mode:"claudecode";storages/workspace.json 生成标题「claudecode」的单一工作区(archivedSessionIds 为空);sessions/<claudecode 目录编码>/import-*/session.jsonl.zstd 落盘且 seq 连续、tool/call↔tool/result 一一对应;imports.json 记录 sourceCwd;重复导入 2/2 alreadyImported(幂等);POST /api/claude-move/reset 只清插件缓存、已导入会话原样保留;真实 $DSH_HOME(C:\Users\zzhdz.dsh)全程零改动(无新增工作区/会话/归档) |
✅(模型驱动续聊回合仍需有 API key 的机器验收) |
| 复制式迁移边界(S1):源文件只读;DSH 会话只 create+append;不归档、不删除、不隐藏任何会话 |
导入路径无任何 archiveSession/删除调用;force 只另存新 id 副本;测试断言「导入前后源文件内容不变」「force 不触发归档」;唯一的有意写入是 claudecode 模式下 mkdir(claudecodeDir)(默认 $DSH_HOME/claudecode);test/safety.test.mjs 静态审计发布面源码,白名单外任何删除/改写操作判失败 |
✅ |