dsh-loopx-plugin
loopx-project/loopxLoopX——面向长周期 Agent 的提供商中立、本地优先状态内核与控制平面:在 DeepSeek Harness 执行层之上持久化 Goal、Todo、门禁、证据、配额、恢复与交接状态;插件负责引导安装 CLI 与技能、准入有界的同会话续跑,并为精确绑定的工作循环提供本地 GoalBar。
AgentCompare A/B 对比:同一需求做两版 Vite 应用,在 DSH 主对话中并排体验、统一验收、盲选,再审查采用到当前项目。复用已有模型配置;适用于本地 Git 仓库(至少一次提交)的根目录 Vite 前端。
中文 · English · 日本語 · 한국어 · Español · Português (Brasil) · Français · Deutsch
同一需求,两版真跑,盲选再揭晓。
DSH 桌面端 + 浏览器 / Desktop + Web
安装 / Install · 真实演示 / Recorded demo
1.1.0 · 正式版。 支持 DSH 桌面端与浏览器界面。首期面向本地 Git 仓库中的根目录 Vite 前端,复用 DSH 当前模型。
1.1.0 增加快速与完整示例、可确认的副本空间清理、采用预演停止、跨对话操作确认及重启后的当前状态同步。包管理器的实测范围与限制见更新记录。
AgentCompare 是 DeepSeek Harness(DSH)插件:同一前端需求,生成并实际运行两份实现。先体验再选,选后揭晓模型或策略;采用前核对当前项目与候选改动,确认后写回。
插件目录与安装 · Plugin directories and installation · Listing status / 收录状态
功能示意 / Product illustrations · 查看真实演示 / Watch the recorded workflow
公开 1.1.0 产物的固定候选演示,中文界面。两份应用、共同验收、采用与撤销均实际执行;视频剪去了等待,GIF 以 0.5 倍速回放交互片段,本地路径已隐藏。
以下命令用于自行运行的 DSH Web profile。桌面版的 desktop profile 由应用管理,请使用应用的插件页面。
安装 npm 包到默认 Web profile(公开发布状态见顶部 npm 徽章):
dsh plugin --profile web add dsh-agent-compare@1.1.0
如使用其他自行运行的 profile,请将 web 换成实际名称。
也可以从源码构建并安装:
git clone https://github.com/lijiaqi-AI-Product-Manager/dsh-agent-compare.git
cd dsh-agent-compare
npm ci
npm pack
dsh plugin --profile <你的 profile> add ./dsh-agent-compare-1.1.0.tgz
重启 DSH 后,在主对话输入框左下角点 A|B:
设置条中的「试跑内置示例」可选择基础的搜索与清空,或完整的组合筛选与手机适配;选择会记住。它直接新建独立仓库并在本对话中启动,不修改已有草稿,结果只采用到示例仓库。两版分别使用真实模型并消耗用量,较小范围不保证固定耗时。示例范围与耗时说明。
右上角的比较记录与使用教程在新建和已有对话中均可打开。历史保留需求、检查、选择、采用与撤销记录;预览停止后可查看验收截图。
安装环境造成失败时,卡片会区分连接、访问权限、磁盘、运行环境、锁文件和超时,给出处理建议。修正环境后点「重新验收 A/B」即可复用已封存代码和原验收定义,不重复生成;上次失败、检查与用量继续保留。锁文件不一致需要修正后开始新的比较,不能靠反复安装或放宽条件通过。
运行记录、重启与恢复 · 支持范围 · 自定义验收
主分支另有Windows 进程兼容设置:提供自动与关闭选项,保留原有宿主约束,并在揭晓后显示实际观察到的钩子。该设置尚未进入 npm 1.1.0。
界面和交互类任务:好坏要靠人体验,测试只能判断「有没有做到」。比如搜索和筛选、表单流程、落地页、仪表盘布局、组件重设计。 答案唯一的修 bug 或重构,用单个 Agent 加测试更合适。
两种比较方式:
| 方式 | 两边相同的 | 两边不同的 |
|---|---|---|
| 同一模型 · 两种策略(默认) | 模型、需求、验收 | 「稳妥」沿用现有写法 vs「大胆」重做交互 |
| 两个模型 · 同一要求 | 需求、验收、给 Agent 的说明 | 模型(从你在 DSH 里已配置的模型中选两个) |
自己开两个会话也能让模型写两版,真正麻烦的是后面这些,AgentCompare 把它们变成一步:
typecheck / lint / test / build 脚本 + 页面验收),并记录这些脚本的内容、验收相关文件(tsconfig*、vite/vitest 配置、lint 配置、已有测试文件、.agent-compare.json)的内容哈希、锁文件和运行时。仓库根目录的 .agent-compare.json 可以加上逐步交互验收(见下文)。git worktree,放在插件目录(~/.dsh/agent-compare/w/<run>/<A|B>),并在副本的 git 管理目录里写入归属标记。workspace-write 约束,审批策略固定为「从不」。具体约束由宿主执行,包含下文列出的平台限制。每个候选有生成时间上限(界面可选 5 / 15 / 30 / 60 / 120 分钟,默认 30)。到时还没说完成,就停止它,照样封存并验收它已写的改动;生成期间卡片上显示它走了几轮、最近在做什么、多久没有新动作。node_modules。vite preview 运行构建产物 → 在独立的无头浏览器上下文里跑页面验收(可加载、无控制台错误、逐步交互、桌面和手机截图)→ 再确认验收没有在副本里留下未封存的改动。构建没通过时只提供开发模式预览,并标明「仅供观察」。封存与验收从原仓库核对副本的 Git 管理目录、双向链接和归属标记,再显式绑定 Git 目录与工作区执行。指针被改写、链接替换、过大或缺失时,拒绝继续封存和重新打开预览;清理会保留归属不明的副本并说明原因。终端遗留的 Git 仓库、index 和配置选择变量不会重定向这些操作,内部显式创建的私有 index 仍可使用。这些检查保护插件的 Git 生命周期操作;项目进程的约束仍由宿主沙箱提供。
| 方面 | 做法 | 边界 |
|---|---|---|
| 候选写文件 | 候选会话的目录就是它的副本,由 DSH 沙箱在执行前限制 | DSH 官方把 Windows 沙箱标为 partial;平台临时目录可能可写 |
| 项目命令 | 安装、检查、初次预览和重新预览都使用宿主的 workspace-write 约束;子进程环境使用宿主的规范清理接口 | 没有约束就停止,不会退回无约束执行。宿主报告部分约束时保留记录并提示;不提供文件读取或网络隔离 |
| 你的项目 | 生成期间检查项目是否和基线不同,并在面板中提示 | 只报告观察到的变化,不推断是谁修改;采用时检查是否重叠 |
| 并发编辑 | 核验工作区与原始文件指纹;先保留原始文件,再以不覆盖现有路径的链接交接。撤销和恢复也保留冲突内容 | 仓库锁不锁定外部编辑器;交接逐文件完成,涉及文件的编辑与目录重排请等操作结束。不是对同权限进程的安全沙箱 |
| 验收 | 绑定脚本内容、配置和测试文件的哈希;验收前后核对副本内容 | 自由文本需求中无法自动验证的部分只能靠你体验,不会被宣称已验证 |
| 依赖 | 有锁文件时总是冻结安装,包缓存各自放在候选副本内 | 没有锁文件的项目只能非冻结安装,会明确提示 |
| 进程 | 预览进程只在命令行能证明是本插件启动的那个时才会被结束;预览写入同样使用宿主约束 | 网络访问和进程可见性不隔离 |
| 浏览器状态 | 每次启动预览分配新的随机 .localhost 域名,进程仍只绑定 127.0.0.1;宿主直接连接回环探测,并要求 HTTP 成功状态 | 嵌入 Cookie 受浏览器策略限制,登录、外部后端和共享数据库暂不支持;外部标签页可能使用不同存储。重开预览会重置页面状态,比较记录和截图仍保留 |
| 嵌入导航 | 预览允许脚本和表单,不允许跳转比较窗口的顶层页面 | 不提供完整的恶意代码沙箱;页面与网络请求仍受浏览器自身策略管理 |
| 清理 | 只删除「已注册为该仓库 worktree + 归属标记匹配」的目录 | 不能证明归属的目录会保留并列出 |
| 原始内容保留 | 项目内自忽略的 .agent-compare-transfer-* 目录保留原始文件和交接日志,结果中可查看位置;预览清理不会删除它 | 直接写回限普通文件、10,000 个路径及合计 128 MiB 的原始与候选内容;不支持硬链接的文件系统、符号链接及特殊文件可另存分支。未完成恢复前请保留目录 |
| 旧版记录 | 0.1 版本留下的记录只读显示 | 不会对其中记录的路径或进程做任何操作 |
DSH 宿主没有提供会话创建接口(ctx.agents.create)时,会退回 0.1 的子 Agent 方式(isolation: shared-root):副本放在仓库内的 .agents/worktrees,越界写入只能事后发现。面板和运行记录都会标明当前用的是哪种。
当前 Windows 宿主限制受限进程内部创建捕获输出的命名管道。npm 安装脚本改用前台输出,不改变项目的脚本许可;esbuild 版本检查及 Vite 的可选 net use 探测通过私有临时文件捕获输出,esbuild 服务使用宿主公开的匿名管道接口,子进程继承同一个受限令牌。其他需要嵌套命名管道的工具仍可能失败,不会降低权限要求重试。此边界不包含文件读取和网络访问隔离。
在 profile 的 cordis.patch.yml 里追加一条以插件 id 为目标的配置:
- id: agent-compare
name: dsh-agent-compare
config:
generationMinutes: 20
| 键 | 默认值 | 说明 |
|---|---|---|
generationMinutes | 30 | 每个候选的生成时间预算 |
maxActiveRuns | 1 | 同时生成的比较轮数 |
isolation | own-root | shared-root 为实验性的旧方式 |
home | ~/.dsh/agent-compare | 记录、补丁、截图和副本的位置 |
.agent-compare.json放在仓库根目录、并提交(验收读取的是基线里的版本,候选改它不算数):
{
"scripts": ["test:e2e"],
"browser": {
"path": "/",
"steps": [
{ "label": "初始 8 个商品", "expectCount": "[data-testid=product-card]", "min": 8, "max": 8 },
{ "fill": "input[type=search]", "text": "lamp" },
{ "expectCount": "[data-testid=product-card]", "min": 1, "max": 1 },
{ "click": "button:has-text(\"清空\")" },
{ "viewport": { "width": 390, "height": 844 } },
{ "expectVisible": "input[type=search]" }
]
}
}
步骤类型:fill、click、press、expectVisible、expectCount、expectText、viewport;选择器是 Playwright 选择器。完整示例见 examples/vite-react-demo/.agent-compare.json。
配置会在生成前严格校验。未知字段、不存在的脚本、非法步骤和跨来源页面路径会直接报错。自动绑定根目录 JS/TS 辅助程序、scripts/、tools/、config/、已知配置和已有测试;新增验证配置及 package scripts(包括生命周期钩子)的变化也会使候选不可直接采用。其它位置的验证数据或辅助文件可在基线配置中通过 "protectedFiles": ["custom/fixture.json"] 指定,必须是已存在的具体仓库相对路径。
绑定范围不会推断任意程序动态读取的全部文件。程序验收说明已配置检查的结果;需求中的其它质量标准仍需实际体验和代码审查。
| 项目 | 状态 |
|---|---|
| DSH 0.2.1-rc.3 桌面版,Windows 11 | 历史兼容案例:真实模型完成生成、验收、盲选和采用;候选会话申请各自副本的写入边界,shell 命令已运行 |
| DSH 0.2.1-rc.5,Windows 11 Web UI | 生产版指令、真实子会话、预览、采用、历史恢复及采用说明进入主对话下一次请求已通过;使用本地脚本化适配器 |
| Linux,Ubuntu CI,DSH 0.2.1-rc.5 | 核心回归和真实宿主进程约束、环境清理、冻结安装、构建、预览重开、取消检查已通过;未测外部模型完整交付 |
| DSH next 通道 | 独立 Windows/Linux/macOS 原生运行 canary,记录实际版本;状态见 CI,不等同于完整模型交付验收 |
| macOS | 当前源码增加原生完整回归、Chromium 界面、真实 DSH 与包管理器检查;Safari 实时比较另见 #115,不能用 Chromium 结果代替 |
| 当前源码验收基线(未发布) | Windows/Linux/macOS 固定 DSH 0.2.1-rc.5 与 0.2.2-rc.1;Playwright 1.65.0、Vite 8.3.6、pnpm 12.18.0,具体通过项与限制见执行矩阵及本次 CI |
| Node | 26.13.0 为主开发基线;22/24 维护线的最新补丁版也纳入 CI 兼容检查 |
| 项目类型 | 仓库根目录的 Vite 项目;至少有一次提交的 Git 仓库。包管理器的完整通过项与已知限制见执行矩阵 |
以下案例保留各自的源码与工具版本。当前源码的测试脚本使用上方「未发布」基线,历史运行数字不作为新版重新测量的结果。
最新结果见 CI。可复现的原生运行检查还在 Windows 上实测了 DSH 0.2.1-rc.5、Node 26.13 和 Vite 8.3.5:相邻文件写入被拒绝、子进程环境被清理、冻结安装、类型检查和构建通过、预览两次启动、取消后停止写入。Windows 如实报告部分约束。
用单独的依赖目录安装官方当前宿主后,可以重复这项检查:
npm install --prefix .runtime-checks/host-sdk --ignore-scripts --no-audit --no-fund @deepseek-ai/dsh@latest
npm run test:runtime
测试宿主依赖目录被忽略,也不会打入插件包。本项使用受控示例,不请求模型。
自动化回归(数量和结果以当前 CI 为准),包含真实 git、冻结 npm 安装、构建与预览进程的集成测试(临时路径带空格),以及单元测试和宿主接口契约测试。已建立的回归包括:
node scripts/smoke.mjs:脚本代替模型,用内置案例真实运行 React 19.3.1、Vite 8.3.5 与 Playwright Chromium 156.0.8078.4。完整实现的一版通过 12/12 步验收;漏做「清空」按钮的一版只通过 9/12 步,被判为不可采用。基线建立后再次编辑笔记文件,采用必须先预演组合结果,并保留更新后的笔记。--escape B 时,候选写到副本外的文件被检测出来。
DSH 0.2.1-rc.5 隔离环境:生产版指令读取界面选择的五分钟上限,创建两个真实候选会话,运行应用并完成审查及采用。刷新并返回普通对话后,本地脚本化适配器在真实主会话请求中读到了采用说明。新建/已有对话的入口均正常,没有页面异常。本项没有请求外部模型。
开发与示例依赖审计均为零已知漏洞。npm run test:coverage 单独报告后端覆盖率;浏览器和原生宿主集成检查属于其他验证层,不计入这个百分比。
浏览器断言覆盖输入框设置、设置持久化、多条记录的独立操作、两个可交互预览、空白会话导航与重新打开、代码审查、采用确认、返回输入框的焦点、响应式状态及弹窗键盘操作。历史导航包含 72 条样例的分页、搜索、慢响应、旧服务端提示、错误重试和需处理记录筛选。浅色/深色界面状态通过 WCAG 2 A/AA 和 2.1 AA 自动规则检查。此项使用明确标记的示例记录。
真实模型(DSH 0.2.1-rc.3 桌面版,deepseek-flash,内置案例):两个候选会话的头部记录 cwd 分别是各自的副本,sandbox/mode 为 workspace-write、approval/policy 为 never;候选里的 pwsh 正常执行(0.1 的 SetNamedSecurityInfoW 错误不再出现);token 用量来自会话日志。两个候选都在 30 分钟上限内没有说完成——其中一个已写完全部改动,事后对它的副本跑共同验收:冻结安装、类型检查、构建和 12/12 步页面验收全部通过。0.2.0-alpha.2 因此改为到时照样验收已写的改动。
真实模型完整一轮(DSH 0.2.1-rc.3 桌面版,deepseek-flash,同一模型两种策略,60 分钟上限):两版各用约 42 分钟生成,token 用量约 264 万和 294 万;两版都通过类型检查、构建和页面验收;选择 B 后采用到工作区,写入 src/App.tsx 和 src/styles.css,未提交、index 和 HEAD 未改动。
对话内运行(DSH 0.2.1-rc.3 运行时,测试 profile):/ab 出现在指令菜单;输入框的 A|B 按钮把草稿变成 /ab …,发送后按指令执行;会话日志里记录 command/run(ab 及参数)和 command/done(含运行编号);生成结束时,一条说明结果的消息写入该对话,供模型下一步读取;输入框按钮、指令卡片、工具卡片、标题栏按钮的注册全部被宿主接受。
打包安装后的界面检查(DSH 0.2.1-rc.3 Web UI,隔离 profile):原输入框的图形化提交、两份真实 Vite 预览中的搜索与清空、选择、采用审查及工作区写入、结果说明写入持久会话并进入下一步消息队列、刷新后恢复已采用记录,以及退出比较模式后继续普通对话。本项使用固定的脚本化候选,没有请求模型。
使用 Node 26.13.0(.nvmrc)与 npm 12.2.2。编译和测试基线为 TypeScript 7、React 19.3、Vitest 5;分发的客户端复用 DSH 提供的 React 运行时。
npm ci && npm run typecheck && npm test
npx playwright-core install --only-shell chromium
npm run test:ui
npm run test:coverage
npm run smoke
node scripts/preview-ui.mjs
贡献方式见 CONTRIBUTING.md,版本变化见 CHANGELOG.md。
MIT
Star 历史每天自动更新。更新日期采用 UTC,Star 日期沿用 GitHub 聚合口径。 同时展示 npm 每日下载请求量。
下载请求包含重复与自动化访问,不等于独立用户或活跃用户。