packages/dsh-task-board
zhu1090093659/dsh-web侧边栏多列任务看板:卡片交给真实 DSH 智能体会话执行,支持 cron 定时(Host 侧到点执行,关浏览器也生效)。
雪球行情面板:嵌入输入框上方,免登录查看 A股/港美股行情、指数与自选股,K线蜡烛图(成交量/均线/十字光标)、热榜、搜索、7×24 快讯,另有可拖动迷你指数徽章。
DeepSeek Harness 上的雪球行情面板:免登录查看 A股/港股/美股实时行情、K线、分时、热榜、搜索、7×24 快讯与热议用户。面板嵌入输入框上方不遮挡对话,常驻行情区域显示四大指数与自选股涨跌,交易时段智能刷新。
中文 | English
功能 · 截图 · 安装 · 使用 · 稳定性 · 质量与测试 · FAQ · 更新日志
| 能力 | dsh-xueqiu | 股票皮肤类插件 |
|---|---|---|
| 面板形态 | 嵌入输入框上方,不遮挡对话 | 全局换肤/状态栏 |
| K线/分时 | KLineChart 引擎蜡烛图/分时面积图+均线+十字光标,7 档周期 | 部分有 |
| 热榜/快讯/KOL | 全有 | 多数无 |
| 数据源 | 雪球(社区数据:帖子/热议用户独有) | 腾讯/Yahoo 等 |
| 请求防护 | 闸门+看门狗+缓存+自愈+隐藏暂停 | 一般仅缓存 |
| 常驻行情区域 | 四大指数+12 自选两列平铺,⤡ 调宽 | 多为纯状态栏 |
| 主题 | 跟随 DSH 明暗 | 需整体换肤 |
| 功能 | 说明 |
|---|---|
| 📊 实时行情 | 大盘指数(上证/深证/创业板/科创50)+ 自选股列表,涨红跌绿,表头点击排序 |
| 🕯️ K线图 | 基于 KLineChart v10 引擎(canvas 渲染,内置主题适配):蜡烛图 + 独立成交量窗格 + MA 均线 + 十字光标 legend,5分/15分/30分/60分/日K/周K/月K 7 档切换;滚轮缩放 + 拖拽平移,右拖触底自动加载更早历史(500 根/次,已实测连续加载至 3400+ 根) |
| ⏱️ 分时图 | 面积价格线(涨跌色)+ 均价线 + 昨收基准虚线,十字光标 tooltip 查任意分钟 价/均价/涨跌 |
| 🔥 热榜 | 雪球热门榜,A股/美股/港股/全球 切换 |
| 🔍 搜索 | 搜股票(一键加自选/看详情)、搜帖子 |
| 📰 快讯 | 7×24 实时快讯,重要新闻高亮 |
| 👥 热议用户 | 个股热门 KOL(粉丝数/认证标识) |
| 💼 自选股 | 本地持久化,增删随点随改;可选登录后直接使用雪球云端自选股 |
| 👤 可选登录 | 粘贴浏览器 Cookie 即可登录(借鉴 xueqiu-cli 手动模式):登录后自动拉取云端自选股,加/删自选尽力同步到云端;Cookie 仅存本机 ~/.dsh 工作区文件,不上传任何第三方 |
| 🧲 嵌入式面板 | 完整面板停靠在输入框上方(官方 conversation.input.dock 槽位),随页面布局流动,不遮挡对话记录 |
| 🏷️ 行情区域 | 常驻悬浮区域:头部一行 logo/盘中状态,四大指数两列(上证/深证/创业/科创50)+ 自选前 12 只两列平铺;点击开合面板,拖动调整位置(记忆),右下角 ⤡ 手柄调宽度 120–480px(双击复位 320),宽度/位置持久化 |
| 📏 面板高度可调 | 拖动面板底边调整高度(160px–85% 视口,双击复位),高度持久化记忆 |
| ⌨️ Esc 收起 | Esc 先关个股详情,再收起面板;点行情区域或底部指数条重新展开 |
| 🛡️ 请求防护 | 并发 2 + 100ms 最小间隔对齐网页端行为;30s 看门狗强制释放悬挂请求防管线冻结;Cookie 失效/风控自动重播种重试;限频指数退避;页面隐藏自动暂停全部轮询(回前台立即恢复) |
| 🗂️ 渐进详情 | 个股详情报价+K线先上屏,分时/财务/KOL 到达后增量合并,不用等齐 |
| ⏱️ 智能刷新 | 盘中 20s 刷新行情,收盘自动放慢,降低被风控概率 |
| 🕐 交易时段 | 面板头常驻显示 A 股/港股/美股 盘中·午休·盘前·休市(本地时区推算,不含节假日),行情区域显示精确 A 股时段 |
| 🌗 主题自适应 | 跟随 DSH 明暗主题 |
| 🤖 Agent 工具 | 对话内直接问行情:xueqiu_quote(实时行情)、xueqiu_kline(K线)、xueqiu_search(搜股票)、xueqiu_hot(热榜)、xueqiu_news(7×24 快讯)、xueqiu_kol(个股热议大V)——模型直接调用,无需翻网页 |
| 🃏 工具调用卡片 | xueqiu_quote 渲染为红涨绿跌行情表、xueqiu_kline 为迷你蜡烛图、xueqiu_hot 为热榜排名列表、xueqiu_news 为快讯时间线(重要快讯高亮),对话流内直接看结果 |
所有数据来自雪球公开接口(访问首页获取匿名 cookie + 浏览器 UA/Referer),无需登录。
嵌入式主面板:停靠在输入框上方,指数卡 + 自选股行情 + 四个功能页签:

个股详情:16 项行情数据 + K线蜡烛图(成交量柱 / MA5-10-20 均线 / 十字光标)+ 财务指标 + 热议用户:

迷你行情区域:四大指数 + 自选 12 只两列平铺,⤡ 手柄调宽度,点击开合面板,可拖动:

Agent 工具调用卡片(对话内直接问行情,结果渲染为专属卡片而非 JSON):
xueqiu_quote 行情表 | xueqiu_kline 蜡烛图 |
|---|---|
![]() | ![]() |
xueqiu_hot 热榜 | xueqiu_news 快讯时间线 |
|---|---|
![]() | ![]() |
# npm 包
dsh plugin --profile web add dsh-xueqiu
# 或 GitHub 源(git 安装会直接从源码构建)
dsh plugin --profile web add github:wanderer-yk/dsh-xueqiu
# 或本地目录
dsh plugin --profile web add ./dsh-xueqiu
添加后重启一次 dsh web(插件行发现按启动缓存),之后刷新页面即可看到面板。
本仓库 dynamic/ 目录提供已实测可用的动态 Cordis 插件源码(host.js + client.js)。在任意 DSH 会话中让 Agent 加载即可:
请读取本仓库 dynamic/host.js 与 dynamic/client.js 两个文件,
用 cordis_define(kind: new)定义插件:
code.host 填入 host.js 的内容,code.client 填入 client.js 的内容,
然后 cordis_run 启动它。
收起 — 或 Esc 收起。portfolio/stock/add.json / cancel.json)。Cookie 只保存在本机,退出登录即清除。数据层内置多层防护,长时间挂机也不会卡死:
$DSH_HOME/dsh-xueqiu/,进程重启/新会话免播种直接复用(2026-10 实测部分网络 IP 被雪球边缘节点拦截、播种拿不到 token——活进程靠内存 cookie 存活而冷启动即死的教训);文件 cookie 失效时自动重播种自愈。debug RPC 的环形事件流(最近 50 条播种/重试/落盘事件)可一键看现场。平台要求:macOS / Linux / Windows。macOS/Linux 走 POSIX shell curl;Windows 走 DSH 的 PowerShell 层显式调用
curl.exe(Win10+ 自带),引号语义天然兼容,已在 GitHub Actionswindows-latest上真连雪球全量验证(含匿名 Cookie 播种链路)。
三套互补的自动化测试,每次发版前全部通过(最近一次实测 2026-08-20,macOS + dsh web 3080 端口):
| 套件 | 覆盖 | 实测结果 |
|---|---|---|
scripts/static-smoke.sh | 静态安装 7 道门禁(tarball 解包 → cordis 组合 → bundle 注册 → RPC 起活) | ✅ 7/7 |
scripts/feature-matrix.py | 20 个 RPC 动作 × 正常/边界/非法/降级 × 未登录/已登录/Cookie过期 三环境 | ✅ 54–56 项断言全过 / 每环境 |
scripts/browser-interact.sh | 真实鼠标交互:徽章拖动/⤡调宽/双击复位/面板开合/四个页签数据/越界恢复钳制 | ✅ 全过 |
热缓存性能实测(数据已在 TTL 窗口内,即用户连续操作时的体验):
kline 日K 120 根 1–12 ms
quote 3 只行情批量 1 ms
quoteDetail 个股详情 1 ms
search 搜索"茅台" 2 ms
finance 财务指标 2 ms
首次冷请求(需访问雪球取数)典型耗时 100–700ms,全部经请求闸门(并发 2)排队。复现方式:装好插件后 python3 scripts/feature-matrix.py --base http://127.0.0.1:3080 --mode logged。
dsh-xueqiu/
├── src/
│ ├── index.js # Host 插件(curl 数据层 + connection RPC)
│ └── client/index.js # Client 插件(嵌入式面板 + 常驻行情区域 UI)
├── dynamic/
│ ├── host.js # 动态插件版 Host(已实测)
│ └── client.js # 动态插件版 Client(已实测)
├── package.json # bundle 声明(dsh.bundle / dsh.client)
└── cordis.patch.yml # bundle 层插入
Q: 安装后面板不出现?
按安装说明重启一次 dsh web(插件行按启动缓存发现),再硬刷新页面(Ctrl/Cmd+Shift+R)。仍无面板时看右下角有无行情区域——区域在则点它展开。
Q: 行情数据突然全空/报错?
雪球匿名 cookie 偶发被风控(错误码 400016 或空响应)。插件会自动重播种 cookie 并重试;播种成功的 cookie 会落盘,重启后免播种复用。若报 [seed_blocked] 匿名 Cookie 获取失败(雪球边缘风控拦截或网络不可达),说明当前出口 IP 被雪球边缘节点拦截(不是插件故障)——等 1–2 分钟再试,或在面板右上「登录」粘贴浏览器 Cookie 直接解锁全部数据。debug RPC 的 events 字段(最近 50 条播种/重试事件)可供排障。
Q: K线周期里分时下为什么没有周期按钮? 分时模式只展示当日分钟线,K线模式才有 7 档周期,属设计行为。
Q: 交易时段提示节假日准吗? 不准。时段按每周一至周五的固定钟点本地推算,不含法定节假日调休,仅供参考。
Q: 自选股和面板设置存在哪?
宿主本地稳定目录 $DSH_HOME/dsh-xueqiu/(默认 ~/.dsh/dsh-xueqiu/)下的 .xueqiu-watchlist.json / .xueqiu-ui-state.json / .xueqiu-login.json(登录)与 .xueqiu-anon.json(匿名 cookie 缓存,1.25.0 起),各带 .bak 损坏兜底;沙箱拒绝时透明回退工作区目录。与浏览器 localStorage 无关,换浏览器不丢,也不随 dsh web 启动目录漂移(v1.22.12 起的稳定目录行为)。
Q: 会不会影响 DSH 本体?
插件 UI 全部挂在官方槽位(conversation.input.dock / shell.overlay / conversation.composer.dock),卸载即完全消失,不改 DSH 源码。
$DSH_HOME/dsh-xueqiu/.xueqiu-anon.json,冷启动先读文件免播种(失效自动重播种自愈并覆盖);② 种子请求补浏览器导航头(Accept/Accept-Language/sec-fetch 系)+ --compressed 收窄指纹差异,单种子超时 12s→8s(最坏 2×10s+12s 不再撞穿 30s 看门狗);③ 播种失败 + 上游 400016 时快速失败为 [seed_blocked],文案直接引导"面板右上登录粘贴 Cookie",不再空转 3 轮上游请求循环报错。qa/probe-seed.mjs 播种探针(候选 URL × 头组合实测 set-cookie 返回,扩容播种链的决策工具,不进 CI)。typeof host / typeof styles 判定),gen-static.py 不再做 DYNAMIC_CALL/STATIC_CALL 整函数文本替换——每次改 call() 从此不必同步改生成器(锚点漂移即失败的一整类维护负担消失)。qa/client-pure.mjs,61 断言)——格式化/交易时段/K线归一化 + makeIndexPoll/makeUiStore 工厂化(依赖全注入:in-flight 去重、订阅回放、隐藏门、5s 节流、open 即时落盘全可测);host 缓存工厂 makeCache 时钟注入(qa/cache.mjs,16 断言:TTL 过期/FIFO 淘汰/24h 清扫——unit.mjs 曾自认"伪造时间不好做"的盲区);传输接缝路由回归(qa/client-bundle.mjs,13 断言:生成物伪浏览器求值防 TDZ + 动态门面/普通函数/无 host 三环境分支路由——后者源自复审发现的接缝守卫缺陷:typeof host.call 对任何同名全局函数都为真,已加 !== Function.prototype.call 收紧)。三套件全部接入本地与 CI 关卡。debug RPC 增加最近 50 条环形事件流(播种成败/重试类型/落盘失败,不含 cookie 值);watchlist.pull 复用同步结果消除双倍上游请求;冒烟数据关卡分级 SMOKE_LIVE=strict|warn(PR 路径上游拦截降级警告,结构关卡仍全 FAIL),CI 真连雪球的 live 步骤移至每日定时;xqIso(null) 不再渲染 1970-01-01;fmtFullDay/pad2 重复定义合并;契约测试 UA 改从 host.js 单一真源提取(曾 Chrome/126 vs /120 漂移);新增 test:offline 聚合脚本与 engines 字段;修复 static-smoke/browser-interact 对新版 dsh token 鉴权的适配缺口(CI 9 月起未跑 push 路径、dsh 升级引入 token 后,smoke 就绪探测裸 poll / 得 401 误报"实例未启动"——现对齐 e2e-boot 的双路径探测并全程携带鉴权;e2e 徽章检查由单次 sleep 8 改 6×5s 轮询 + 失败分层诊断)。onUp 提交 badgePos 后未调 saveUi,而落盘订阅者(DockPanel)仅在面板打开时挂载;徽章交互常态恰发生在面板关闭时,刷新后位置回退(对照:调宽手柄 onGripUp 一直有显式落盘)。现为拖拽松手后显式 saveUi()。ui.set 同样无人落盘,host 里永久残留越屏值(如 99999),每次加载重复钳制。现钳制确有修正时立即 saveUi()。subscribeBar 订阅(v10 原生流式通道:_addData(t,'update'),末根值演进 replace、新 bar 到点 push,不重置视图、保持拖拽/缩放位置,MA/VOL 自动重算)。20s 拉最新 5 根走 begin=now 零缓存路径(无 begin 的 kline 缓存 TTL 高达 5min,常规请求拿不到进行中的 bar);以图表缓冲末根为准值有变化才触发;开市门/隐藏暂停同详情活性。图表容器留 __xqLastBar/__xqTickInfo 诊断钩子(e2e/排障用,画布内容无法从 DOM 断言)。chart.resetData()」走既有 loader 重新 init 加载(vendored v10 无 applyNewData/updateData,resetData 内部即 _processDataLoad("init")),不重建图表实例;涨跌色随最新价重算、笔数增长仍铺满宽度;签名守卫(笔数+末笔时间+昨收)防重复应用。useLogin / useWatchlistData / useHotNewsData / useDetailData),六个内联渲染函数(登录框/行情/详情/热榜/搜索/快讯)提升为真正的组件(稳定组件身份,经 el() 渲染);所有状态、竞态守卫与注释原样搬移,行为不变(8 套件 415 断言 + 浏览器 e2e 全绿)。chmod 600(fs 无权限原语,借 shell 执行,失败不阻塞);actQuote 超量截断显式返回 truncated 计数。fmtTime 兼容字符串时间戳、无效输入显示 --:--:--(此前 NaN:NaN:NaN);稳定目录探测失败不再永久缓存回退路径(磁盘满恢复后自动回到稳定目录);探针文件不再留时间戳数据。xqParseResult 包 useMemo,流式更新重渲染时跳过重复 JSON.parse。shell.run 移除导致所有请求报 shell.run is not a function、自选股不展示)。新增 runShell 兼容层:旧版走 run,新版走 execute+result()。%27(encodeURIComponent 不转义 ');kline symbol 剥除非白名单字符,剥除后为空立即返回空结果。[parse] 改为 [waf] 可重试:仅首轮且匿名路径触发重播种(带 5s 冷却窗);播种成功判据收紧为拿到 xq_a_token,失败不再缓存废 cookie。begin 按周期回退一个安全步长(实测上游 inclusive 语义;month 取 20 天,当月未收线 bar 与上一根 gap 可小至 21 天),防 forward:false 永久截断。AbortSignal.timeout + 老 WebView race 兜底 + res.ok/JSON 防护;动态版 host.call race 看门狗。action='constructor' 命中原型真值函数,改 hasOwnProperty 白名单);登录/自选加载竞态(迟到文件内容不再覆盖并发 logout/save/add);触屏 pointercancel 误触发面板开合;行情轮询竞态(mktSeq 三道守卫含 catch)。-H @- 注入(ps 不可见、不落盘),值剥除换行防 header 注入。.bak,半截 JSON 损坏时读取侧自动回退,最坏丢"最后一次写"而非整份自选。execute+result() 形态(生产必经分支此前零单测);login.status.path 在真实 fs(resolve 返回对象)下统一为可读字符串;补身份切换缓存失效三连/login.save 成功链路(含 .bak)/登录态 WAF 不播种/stdin+POST 形状共 9 条盲区测试。wanderer-yk。GitHub 账号更名后全量同步:README / README.en / package.json / LICENSE 中的仓库链接、徽章、图片外链、安装命令全部更新为 wanderer-yk/dsh-xueqiu;git 全部历史提交与标签署名经 git filter-repo 重写为 noreply 身份,历史文件内容同步清洗。static-smoke.sh 查找 dsh 二进制时硬编码机器特定绝对路径,改为 $HOME 展开(可移植性 + 去隐私泄露)。volume 字段全市场均为股(实证 amount/volume ≈ price,quote/kline/minute 三接口、A/港/美/ETF/指数一致),而 fmtVol 一律按"手"格式化:茅台 145 万股显示成"145.05万手"(实为 1.45 万手)。现按市场感知:A 股(SH/SZ/BJ 前缀,含 ETF/指数/北交所)÷100 换算成手,港/美维持股。qa/vol-units.mjs 26 例(从 client 源码提取 fmtVol 独立求值 + host 周期白名单)。--,名称回退显示代码,仍可删除/查详情),价格闪烁逻辑对 null 现价免疫。period(如模型手滑传 1h)返回 200+0 根;host 侧加白名单兜底为 day。volume 单位为股(A股 1手=100股),防模型侧误读换算。$DSH_HOME/dsh-xueqiu/(稳定目录,writeText 自动建目录);沙箱策略拒绝工作区外绝对路径写入时探测失败,透明回退旧工作区行为(零回归);读取时稳定文件缺失则回读旧工作区文件,存量数据无缝迁移(首次保存落到稳定目录,旧文件不删)。qa/state-paths.mjs 11 例覆盖四种模式(稳定/迁移/回退/首启)。注意:host 侧改动需重启 dsh web 生效,迁移发生在重启后首次写入。scroll(拖拽位移) 内容跟手:右拖=左缘涌出更早历史+触底自动加载;左拖是回最新方向、右边留白。用户指出后核对引擎源码确认,client 6 处 + README 3 处已正。grab、按住抓手 grabbing、松手复位(松手点在图外时 window mouseup 兜底);监听统一在 klcSetup 随 dispose 清理。::1 裸 IPv6 回环白名单死代码。端口剥离正则 /:\d+$/ 会把裸 ::1 末尾 :1 误剥,改 /^(.*[^:]):\d+$/;fence.mjs 原 xfail 用例转正(两形态均 200)。open=true 从未落盘——刷新必丢(1.22.10 的姊妹问题)。ui.set({open:true}) 发生在面板组件订阅建立之前(订阅挂载后才生效),无人续触发时 saveUi 永不执行。open 翻转现在在 ui.set 内直接触发落盘。闭环实测:开面板 → host open:true → 刷新 → 面板自动恢复。>30,北京时间 9:30~10:01 触发的 CI 必红(开盘仅十几个点)。改按盘中时间自适应下限。ui.get 里 open: s.open !== false 被上一行的行尾注释吞掉,客户端 hydrate 永远拿不到该字段。254 例边界套件捕获(qa/edge.mjs 保持红用例直至修复)。cssVarColor 在 <html> 上读主题令牌,而 GUI 把令牌定义在 <body>——两主题都渲染硬编码回退 #8a8f98,白底对比度仅 ~1.8:1(WCAG AA 要 4.5:1)。改为先读 body:浅色下图例/轴文字用真实令牌 #61666b(~5.8:1)。matchMedia('(prefers-color-scheme)') change 监听,主题翻转即时重设图表样式。qa/edge.mjs(254 例黑盒边界)、qa/fence.mjs(同源栅栏 18 例,含 1 例 ::1 死代码 xfail 标记)、qa/regress-v1228.mjs(21 例)、qa/persist-upgrade.mjs(16 例,含真实状态文件升级演练)。check:fast 保持秒级(1.8s)。showRule follow_cross → always:进详情即见最新一根 开高低收量,悬停时跟随十字光标那根(MA 彩色行仍悬停显示)。v1.22.3 改悬停触发是因为当时英文两行图例压蜡烛;v1.22.5 起已是紧凑中文单行(字号10),实测图例带 0 蜡烛像素、无遮挡。/xq-rpc 同源栅栏收紧(Origin 必须存在且同源,浏览器同源 POST 必带 Origin,无 Origin 的 curl/跨进程直调一律 403);ui.get tab 白名单(损坏状态文件的非法 tab 回退 market);curl 失败错误不再回显 stderr(信息泄漏);空云结果也推进同步节流时间戳;云增删失败静默兜底;工具 execute 参数空值兜底 args || {};快讯无效 created_at 不再渲染 NaN 月NaN 日。registerIndicator('xq-minute') 全局只注册一次,其 calc 闭包捕获的是首次挂载实例的 baseRef——第二只股票的分时图复用了旧 calc,昨收基准仍是前一只股票的(宁德挂上茅台昨收 1304.66,y 轴被撑到 404overrideIndicator 重绑当前实例 baseRef 的新 calc。实测三股连环切换(茅台 1304.66 → 宁德 387.89 → 京东方 5.75),昨收均正确、价格波动 span 130~180px 饱满。follow_cross:悬停时蜡烛行(开高低收量)下方第二行彩色显示 MA5/10/30/60 数值(实测茅台 MA 行单行占宽 70%,不折行),与雪球一致。follow_cross 后默认英文 time/open/high/low/close/volume 标题过长,悬停时图例在窄面板折两行盖住蜡烛。改为紧凑中文单行(开 高 低 收 量,字号 10)+ 隐藏 ticker 标题——实测悬停图例单行 10px 高、占宽 45%,不再折行。boxRef.current.removeEventListener,但 React 卸载组件时先清 ref 再跑 effect 清理,此时 boxRef.current 已是 null → 抛 TypeError → conversation.input.dock 槽位整体崩溃,只剩自选股小徽章且无法重开。改为 effect 内闭包捕获节点。回归:K线↔分时来回 4 轮 + 收起/徽章重开/再进详情,0 报错。candle.tooltip.showRule: 'always' 把 time/open/high/low/close/volume 永久画在蜡烛区左上角(像素级实测 1394 个文字像素自 y=23 起覆盖蜡烛)。改为 follow_cross(十字光标悬停才显示,与雪球一致),此前只关了指标 tooltip 漏了蜡烛自身的。chart.scrollToRealTime()(实测可视区 132→430-500 回到最新)。createIndicator('MA') 默认给指标新开 pane——均线不在蜡烛主图上(主图被挤到 72px),分时均价/昨收也在独立附图。须传 { name, paneId: 'candle_pane' } 显式叠加到主图(pane id 从引擎源码确认)。修复后:K线主图 173px 蜡烛+MA5/10/30/60 叠加、附图仅成交量;分时只剩一张主图(分时曲线+均价+昨收全部叠加),与雪球布局一致。1304.66 +31.83 +2.50%);16 格 stat 卡片更轻盈(浅底/圆角/等宽数字/标签次要色);卡片标题左侧主题色强调条;K线/分时与周期按钮选中态改主题色 tint 填充;K线画布 264→300px;MA 均线和谐四色(蓝/橙/紫/青);关闭最高/最低点重复标注(消除窄图顶部杂乱数字)。npx dsh(prepublishOnly 下找不到 dsh 命令)。useLayoutEffect 每次渲染后钳制(数据到达必伴随重渲染,无时序死角;ui.set 仅在有变更时触发下一轮,收敛不循环)。CI 实测踩坑修复。browser-e2e job)。此前这层(唯一抓到过钳制死代码真 bug 的测试)只在本机手动跑。scripts/e2e-ci-boot.sh 合成"已完成引导"的隔离 DSH 实例(settings 跳过 onboarding + workspace 表 + 含完整一轮对话的逐行 zstd 会话日志——踩坑记录:DSH 逐记录写日志,每 zstd 帧恰好一行;slug 规则 cwd 去首 /、余 /→-、两端包 --),agent-browser 跑全部 18 项断言。E2E 脚本兜底:全新实例无活动对话时先展开会话分组再点开一个会话(conversation.input.dock 槽需要对话视图)。useEffect 依赖为 [],只在首帧跑一次——而 hydrate 异步恢复 badgePos 发生在其后,钳制永远空跑;DockGate 恢复时的估算宽度(badgeW 空时按 320)又偏小,实测 346px。后果:恢复越屏坐标后徽章右/下缘出屏,真实鼠标点击落空,面板打不开(热榜/快讯/搜索随之全空)。修复:effect 依赖加 badgePos(hydrate 后按实测尺寸再钳一次)+ ResizeObserver 监听徽章自身长高长宽再钳。浏览器回归连跑 3 轮 18 项全绿。agent-browser dblclick 的两次点击间隔超出系统双击判定阈值(页面 dblclick 监听计数为 0),改派发 dblclick 事件;② 交互步骤前 rpc 固定徽章到视口中部再刷新,消除"上一轮遗留位置导致真实鼠标命中失败"的漂移。qa/contract.mjs 新增 C3:add 无效代码被拒或静默忽略且列表不变、cancel 不存在代码幂等零副作用、坏 Cookie 写被 400016 拒绝零副作用;qa/unit.mjs 新增 5 URL × 3 并发回源恰 5 次的 stampede 冒烟)。实测发现:上游对无效代码 add 返回 {data:true} 但列表不变(静默忽略)。login.status 不暴露路径,排障只能猜(曾误查 ~/. 而插件实际写入会话工作区)。现在 login.status 返回真实 path 与 savedAt;契约测试多候选探测(env → ~/. → cwd → 父目录)并打印命中的文件路径;Cookie 过期(400016)时哨兵直接提示"重新登录更新 XQ_COOKIE"而非误报接口变更。另:实测登录 Cookie 约 3 天过期,过期后需重跑插件登录并更新 secret。pwsh -Command),单引号字面量语义与 POSIX 一致——原先"cmd 引号不兼容"的障碍实际不存在。三处适配:① 显式调用 curl.exe(绕开 PS 5.1 中 curl = Invoke-WebRequest 别名,Win10+ 自带 curl.exe);② Cookie 播种的 -o /dev/null 在 Windows 换成 NUL;③ Cookie 请求头剥离引号字符防注入。测试桩 realShell 平台对齐(win32 走 pwsh,同 DSH win32 层)。CI 新增 windows-latest 任务:单测 + cookie 测试 + live.mjs 真连雪球(51 断言,含匿名播种链路)全绿。README 平台要求同步更正为 macOS / Linux / Windows。qa/contract.mjs,7 断言)——直连真实端点验证 portfolio/list.json / portfolio/stock/list.json / add.json / cancel.json 契约(含真实 add→cancel 往返后还原)。每日定时(UTC 21:00)用 XQ_COOKIE secret 真跑,雪球改接口时这里最先失败,防止 watch.json 类"虚构端点"事故重演;无 secret 时(push/PR)自动 skip,同一定时任务顺带跑 live.mjs(51 断言)。需在仓库 Settings → Secrets 配置 XQ_COOKIE(浏览器完整 Cookie 请求头,含 xq_a_token)。watch.json 是不存在的端点(WAF 对未知路径统一 403,曾误判为"雪球封禁第三方写入")。真实端点是 portfolio/stock/add.json / cancel.json(POST form,symbols 参数)。已修正并经真实账号完整往返验证:插件加自选 → 云端 116 只 ✓ → 插件移除 → 云端还原 115 只 ✓。本地加/删自选恢复真正的双端同步,账号面板与 README 文案同步更正。/xq-rpc 请求体 1MB 上限(超出 413),防失控本地进程 OOM。login.status 在登录文件缺 uid/screenName 字段时不再返回空,回退到 JWT 解码值;② K 线查询无效代码的错误文案不再误导为「cookie 不完整」,明确提示检查代码格式;③ xueqiu_news 的 count 参数现在真正生效(上游固定每页 ~10 条并忽略 count,工具层用 max_id 自动翻页补足,最多 3 页)。qa/(mock shell,不发网络)并接入 GitHub Actions——覆盖调度节流/TTL 缓存/重试链/云端同步语义/cookie 双 URL 回退/命令注入防护等 40 项断言;另有本地 live 套件 qa/live.mjs 对真实 API 做 51 项数据正确性验证。xueqiu_search、只要最新价别拉 K 线、热榜≠涨幅榜等边界)。纯文案改动,直接提升 agent 选工具与传参的准确率(对标 dsh-us-stocks 的描述深度)。