Skip to content

Releases: VDERR/echocat-skill-panel

v4.2.0 —— 整个界面重做:一套现代、中性的工具面板

Choose a tag to compare

@VDERR VDERR released this 21 Sep 06:14

v4.2.0 —— 整个界面重做:一套现代、中性的工具面板

这是一次设计系统级的重做,不是调色。配色、圆角、阴影、字阶、间距一起换 —— 因为它们互相依赖:一张中性灰的卡片配上旧的紫色阴影和胶囊按钮,会比不改更糟。

升级要注意

  • 没有任何破坏性改动。 包名、路由、存储的 key、meta.yaml 的写法、已装 skill 的数据全部不变,直接覆盖安装即可。
  • host 半侧(服务端那一半)有改动,需要重启 DSH,不是刷新页面。
  • 已装的 skill 不受影响;你自己标的颜色标签、停用状态、来源记录都保留。

界面

  • 中性工具色板。 之前的 Vapor Chrome(长春花紫 + 水蓝)换成一份中性的灰 + 单一主色:底色 #F5F5F7、卡片纯白、正文 #1D1D1F、说明文字 #6B7280、发丝线 #E5E7EB、主色 #2563EB。aqua / ice / lilac 三个装饰色删掉了 —— 全局只有一种主色,用在主操作和选中态。
  • 四个色值是算过之后改的,不是照抄:三级灰、成功、警告、危险四个色在浅色底上当文字用的时候过不了 AA(警告色只有 2.80:1,而它正是"本轮没用 skill"这个核心信号)。反解"什么底色能让它过"得到的是负数亮度 —— 也就是任何浅色底都不可能,所以只能让墨色让步。每个都保留原色相、只降一档。
  • 圆角和宿主的输入框对齐。 从 DSH 里读出来的值是 22px.Ogvy6G_card),而且宿主自己的刻度和我们结构一样:表面 22 / 表面内部的控件 8 / 真正该圆的用 999。所以 22px 给了面板、横栏、卡片、弹窗;按钮、输入框、标签页保持 8。没有无脑全 22 —— .sr-btn--sm 只有 22px 高,22px 圆角就是半圆,那正是之前要求去掉的胶囊。
  • 深色主题重做,对比度是算出来的。 每个墨色在每个深色表面都过 AA(最差 4.85:1)。两个反直觉的结果:三级灰必须调亮(原本在卡片上只有 4.27:1),而主色按钮上的字必须是深色(白色在上面只有 2.77:1)。
  • 去掉了老旧感。 阴影从每级两层叠影改成一层浅影,主色按钮的彩色光晕删掉,磨砂头部后面三个装饰性径向渐变删掉,粗边框统一成 1px,字阶从十六种收敛到四种(14 标题 / 13 正文 / 12 界面 / 11 说明)。
  • 卡片底部重新排版:调用次数在左、按钮左对齐紧跟其后、来源在右下角并和按钮同一行对齐。
  • 鼠标悬停在卡片上会轻微放大(2%),其他卡片不动。

修掉的 bug(都是这一轮定位的)

  • 颜色标签点了没反应。 根因不在颜色功能里:applySkills 把写入响应里的 skills 数组整个替换掉,而那个数组来自磁盘扫描、不带 provenance —— 所以每次写操作(改色、开关、改名、删除)都会把所有 skill 的颜色和来源记录抹掉,最多 5 秒后才回来。现在改成合并:响应里有的字段生效,没有的保留。
  • 插件自带的 skill 混在你的列表里。 它们是 DSH 把插件的 skill 和你的 skill 合并上报的,现在默认隐藏,右上角有开关可以显示,并且卡片上会标出它是哪来的。删除按钮不再对它们显示 —— 它们本来就删不掉。
  • "插件自带"开关点一下就消失。 判断显示与否用的是"被过滤掉的数量",而那个数在你点开的瞬间就变成 0 —— 于是开关把自己删了。改成用总数判断。
  • 弹窗不会自己消失。 错误提示以前是故意不自动关闭的(理由是要留时间看清 host 的报错)。实际结果是它变成常驻物、每次都要手动清。现在所有提示 1 秒后自动消失,✕ 仍在。
  • 横栏的四个图标移进了圆角框里,包括为此把横栏从 <button> 改成 role="button"div —— HTML 不允许 button 里套 button。
  • 悬停缩放一开始是完全不生效的,前后有四个不同原因(第三个文件里硬编码的 translateY 按顺序赢了 / 缩小规则的特异性比放大规则高 / 入场动画的关键帧写了 transform,而动画的优先级凌驾于整个级联之上)。现在有一条真实浏览器的门禁:用 CDP 真的移动鼠标,读 getComputedStyle().transform

安装

dsh plugin --profile web add echocat-skill-panel     # 走 dsh 的插件安装
npm install echocat-skill-panel                      # 或直接装进 profile 目录

装完重启 DSH Desktop Beta。

这一版新增的验证手段

三条断言换来三个真实 bug,所以补了三种以前没有的检查:

  • 真实浏览器门禁tools/hover-test.mjs):真的移动鼠标、读浏览器算出来的 transform 和圆角。之前所有关于悬停的断言都是读 CSS 文本 —— 而这条功能坏过四次,每一次都对读文本的断言完全隐形。
  • 圆角审计tools/radius-audit.mjs):问浏览器每个元素的实际圆角。这个问题读任何一个文件都答不出来,因为答案取决于三层样式里哪一层点了它的名。
  • 包身份检查tools/check-identity.mjs):包名同时是目录名、Loader 条目名、vendor 目录名和客户端 bundle id,四处必须一致 —— 改名时漏一处就会静默失效。

v4.1.0 — 改名 echocat-skill-panel,配色换 Vapor Chrome,修复颜色标签

Choose a tag to compare

@VDERR VDERR released this 21 Sep 00:01

v4.1.0 —— 改名了:echocat-skill-panel

-3.0 是最开始在名字里标版本号用的,现在去掉。包名、目录名、Loader 条目名、vendor 目录名是同一个字符串,所以四处一起改,并由 tools/check-identity.mjs 断言它们一致。

升级要注意

旧名字 echocat-skill-panel-3.0 已经停更,新包叫 echocat-skill-panel。直接更新你已经装好的那份不会跨名字 —— 两种方式:

  1. 重新安装(推荐):下载下面的 zip,跑 安装.ps1。它会把旧的 vendor 目录、旧 junction、旧 bundles 条目一起清掉再装新的(任何一个残留都会让 profile 装配失败)。
  2. 手动替换:把 echocat-skill-panel-3.0dsh.profile.bundlesdependencies 里删掉,换成 echocat-skill-panel,vendor 目录同名替换。

安装-3.0.ps1 保留了一个转发脚本,旧的快捷方式仍然能用。

这次修掉的 bug

颜色标签点了没反应。 原因不是代码:host 半侧在 DSH 启动时快照,客户端半侧每次刷新页面重新拉取。只按 F5 的话,客户端是新的、host 还是旧的,于是客户端发一个 host 根本不认识的 action,控件没有任何反应也不报错

  • 这个 action 上线两个版本一直没有路由测试 —— 现在补上了,覆盖完整往返:写进插件自己的 .echocat.json不碰作者的 meta.yaml)、从面板读取的 state feed 里读回来、清空是一次真实操作而不是"缺值"、非法 key 返回 400 而不是落盘。
  • host 改动需要重启 DSH,客户端改动只要刷新页面。 这条规则值得记住。

界面

  • 配色换成 Vapor Chrome(长春花 + 水绿 + 冰蓝 + 丁香紫),标记调色板同步重新调色 —— 键名没改,因为那是写进每个 skill 的 .echocat.json 的东西,改名会静默丢掉你已做的全部标记。
  • 修复:全插件的"胶囊"其实都不是胶囊。 生成器只给小于 100 的数字补 px,于是 border-radius:999 少了单位 —— 无效 CSS,被浏览器整条丢弃,回退成 8px 圆角矩形。修复前后用浏览器实测:胶囊控件 3 → 17,方角 18 → 4(剩下 4 个是布局容器)。顺带发现四个圆角分量属性被错列为"无单位",那几条记录等于从未生效。新增 tools/check-css-units.mjs 守住这个形状 —— 原有断言检查"声明存在",而 border-radius:999 确实存在,抓不到。
  • 分类标签筛选换成颜色块筛选;目录标题写明「点头像框选颜色标签」。
  • 四个计数常驻横栏(折叠也显示),展开的报告单独悬浮,不再和横栏合成一个盒子。
  • 状态点健康时绿,只有主机不可达时才红。
  • 横栏左侧显示 N 个 skill 已准备就绪
  • EchoCat LOGO 居中在横栏,浅色主题用睁眼、深色主题用闭眼(跟随系统偏好和应用内主题两个信号)。

安装

npm i echocat-skill-panel

或从下面的 echocat-skill-panel-4.1.0.zip 解压后跑 安装.ps1

装完重启 DSH Desktop Beta(host 半侧需要重启;之后只改界面的话刷新页面即可)。

本轮全部改动(180+ 条具名调整)

横栏两侧等宽包裹层让 LOGO 真正居中、计数块紧凑档、仅可 / 调用用过的 保留为功能筛选、滚动条/占位符/选中色/原生强调色统一样式、三档间距层级、单一光源的层次(卡片 e2 / hover e3 / 控件 e1)、字距随字号走、每类控件四个状态齐备、CJK 严格断行、所有实时计数器等宽数字。

4.0.2

Choose a tag to compare

@VDERR VDERR released this 20 Sep 20:39

echocat-skill-panel-3.0 4.0.2

修掉一个用户可见、而且很显眼的 bug。这次要特别说明:bug 不是我发现的,也不是测试套件发现的 —— 是一位测试员定位、取证并给出修复方案的。定位质量很高,报告里连截图的逐像素测量都有。

症状

打开过一次安装面板(不需要真的装任何东西),之后页面底部就会永久多出一个空白、带细边框、圆角的白盒子。文档高度变成「视口 + 视口」,往下滑就是那个"空白带框、什么都没有的页面"。刷新页面会消失;再打开一次面板又出现。

根因

安装面板是挂到 document.body 上的(为了让 position:fixed 真的相对视口定位,而不是被横栏那一列截住)。这个 host 节点:

  • 带着 sr-root sr-portal-host 两个类 —— sr-root面板外框类:height:100% + 1px 边框 + 圆角 + 白底;
  • 模块级、只创建一次、永不删除的;面板关闭时内容变成 null,于是它就成了一个空 div
  • 本来有一条规则专门中和它(display:contents,不生成盒子)。

但那条规则被生成成了后代选择器

.sr-root .sr-portal-host, .sr-strip-shell .sr-portal-host, … { position:static; display:contents }

而 host 自己就是 .sr-root(挂在 document.body 上),不是它的后代 —— 所以这条规则永远匹配不到它要匹配的元素。中和失效,height:100% 和边框照常生效,于是一个空盒子占满了整整一个视口的高度。

为什么 135 项断言全绿却漏了它

守这条规则的断言写的是:

ok('the portal host adds no box of its own', /\.sr-portal-host\{[^}]*display:contents/u.test(RENDERED))

它只验证声明进了样式表 —— 而 .sr-root .sr-portal-host{…display:contents} 完美满足这个正则。声明存在 ≠ 规则能命中它要作用的元素。 这正是「断言测量结果、而不是断言意图」这条纪律要防的事,结果还是发生了。

修了什么

  1. rooted: false 真正实现了(两个生成器都补上)。这个选项从第一天就写在 polish.js 的 JSDoc 里,两个生成器都没实现它 —— 这就是这个 bug 的根:任何不以 surface root 开头的选择器都会被静默展开成"后代"。现在记录可以明确声明"这条规则说的是 host 自己"。
  2. portal host 不再带 sr-root 外框类。它根本不需要:设计令牌和基础排版由 .sr-backdrop 提供,而它本身就是 surface root、并且永远是 portal 的内容。这样即使将来某条规则再丢,失败模式也只是"对话框没居中",而不是"整页空白"。
  3. 把弱断言换成会失败的断言:现在验证"这条选择器能不能匹配 host 本身"和"没有任何规则以 surface 后代的形式去找它"。
  4. 新增 tools/check-portal-assertions.mjs 并纳入 npm test:它把同一批断言喂给故意还原成 4.0.1 错误样式表的输入,确认它们真的会 FAIL;同时演示旧断言在两份样式表上都通过,把这个漏洞钉死。

实测(真 Chrome,DevTools 协议)

              文档高  页面溢出  host 是否绘制  host 盒子      display
修复前 host    1770    +885     是            820x885       flex
修复后 host     885      +0     否            0x0           contents

node tools/check-portal-host.mjs 在两种窗口尺寸、开/关两种状态下全部 exit 0。

顺带修掉两处工具问题(同一份报告里指出的)

  • tools/dock-harness.html 没有随包发布,所以 check-dock-height.mjs 在别人机器上必然 ENOENT 崩掉(我本机有它,所以从没发现)。已补进 package.json#files
  • 浏览器候选表缺 (x86) Edge 路径。在只装了 Edge 的机器上它会打印 "no browser found" 然后 exit 0 —— 一个看起来和"通过"一模一样的静默跳过。现在 exit 2,因为**「我没测成」不是「测过了」**。

验证

十二个门全绿,1364 项断言(ui-polish 137 + 新增守卫套件 8)。另外这次 pnpm install 也第一次成功了。

装了 4.0.0 / 4.0.1 的话,面板头部的「检查更新」会报出 4.0.2。

4.0.1

Choose a tag to compare

@VDERR VDERR released this 20 Sep 10:40

echocat-skill-panel-3.0 4.0.1

修两个只在成品上才看得见的问题。

修了什么

npm 包页面上的两张截图是坏的。 package.jsonfiles 里没有 docs/,而 README 引用的是 docs/panel.pngdocs/install-sheet.png;npm 渲染的是打包进去的那份 README,所以那两个图在 npm 页面上一直是 404 —— 3.0.0 和 4.0.0 都一样。在仓库里看不出来,因为文件就在那儿。

这是在你让我更换第一张截图时顺手发现的:把 docs/ 加进 files,截图和新版本一起发出去。第一张截图也换成了当前界面(带搜索筛选、启用/停用开关、检查更新按钮的实际面板)。

版本号有三份拷贝,而只有两份被检查。 package.jsonsrc/version.js(host 半侧)、src/client/theme.js(浏览器半侧 —— 它无法 import host 模块,因为它是独立 bundle,对着宿主冻结的平台模块表解析)。测试只断言了前两份一致,第三份没人看,而它恰恰是最容易被忘掉的。

现在五处一起被断言:三份代码 + README 标题 + 安装说明的版本行。这正是 src/version.js 注释里写的那个漂移风险 —— 以前只是写在注释里,现在会被测试拦下。

顺带

  • test/release.mjs 里有两条断言把 '4.0.0' 写死了,这次升版本就挂了。其中一条的意思是「检查器默认用发布出去的那个版本」,这是关于默认行为的断言,而不是关于版本号是多少 —— 两条现在都改成跟导入的 VERSION 比较。一个每次发版都必须手改的测试,只会训练人去改测试。
  • docs/ 进包:37 → 40 个文件,371KB → 542KB。多出的 171KB 是两张截图和 设计要点.md,换来一个图片能正常显示的包页面。
  • 1354 项断言,十二个门全绿(release 套件 52 → 57)。

安装

npm i echocat-skill-panel-3.0

已经装了 4.0.0 的话,面板头部的「检查更新」现在会报出 4.0.1 —— 这次是真的有得可更新了(4.0.0 发布时它还只能报"已是最新")。

4.0.0

Choose a tag to compare

@VDERR VDERR released this 20 Sep 10:31

echocat-skill-panel-3.0 4.0.0

包名仍然是 echocat-skill-panel-3.0(4.0 刻意没有改名:包名 / 目录名 / bundle id / Loader entry 名必须完全一致,改名会让已安装的用户升不上来)。

4.0 的新东西

每个 skill 记住自己从哪来,因此可以被更新。 安装时在 skill 目录里写一份 .echocat.json 记录来源(仓库 / 分支 / 子目录 / commit / 文件指纹)。面板据此显示「来自 …」,可以检查上游有没有新版本,并一键更新 —— 旧副本先备份,删除永远是"移走"而不是"删掉"。

每个 skill 一个真的启用/关闭开关。 DSH 是按 <skills 根>/<名字>/SKILL.md 监视来发现 skill 的,所以停用被实现为把目录移出这个根(到 $DSH_HOME/skill-report/disabled/)—— 模型真的加载不到它,而文件一个不少、随时一键启用回来。已启用与已停用分两组列出,停用的卡片仍可改名、查来源、更新、删除。

插件自己也能检查更新。 面板头部与横栏各有一组按钮:「检查更新」问 npm 与 GitHub 谁更新(10 分钟缓存,只有点击才联网),旁边是 GitHub 发布页跳转。查到新版本时按钮带强调色和小圆点,头部直接写出「可更新 x.y.z」;"查不到"和"已是最新"是两句不同的话。

一套完整的设计语言,485 条具名调整。 四个表面台阶、一个强调色、五级字阶、三级投影,全部是带名字和理由的数据记录,样式表由它们生成,测试逐条核对真的生效。深浅两套都验过,所有文字色按 WCAG 算过对比度。

宽度跟着界面缩放。 横栏与面板的宽度由宿主自己的输入框宽度推导,永远比输入框窄,并且和输入框共享同一条中轴 —— 宽窗口、窄窗口、嵌入式布局都对。

计数器就在横栏那一行里。 回合 / 用到 skill / 未用 / 调用次数 与结论、回合数同在一条线上,不用展开面板。

skill 名字一行显示全。 卡片是三行结构(名字行 / 说明 / 按钮行),名字独占整行并且会换行、不会被省略号截断。

修复

  • 卡片按钮行里的「标记来源」输入框曾经溢出到隔壁卡片(flex-basis:100% 在收缩型 inline-flex 盒子里按行宽而非卡片的宽度解析)。
  • 安装窗口曾经不居中:它被渲染在横栏的列里,position:fixed 于是相对那一列而不是页面。现在挂在 document.body 上。
  • 「安装」旁边两个长得一样的刷新图标,现在一个是带文字的「检查更新」(下载图标),一个是重扫目录。
  • 打包时误发了生成的 tools/preview.html 和两张约 300KB 截图(npm 会忽略 files 已包含目录下的 .npmignore)。tarball 908KB → 367KB。

测试

十二个门全绿,1398 项断言:十套 1349 项(units 54、smoke 25、install 305、http 44、install-route 153、release 52、scope 17、client-bundle 451、client-css 113、ui-polish 135)+ 两个重启前门禁 49 项。

安装

npm i echocat-skill-panel-3.0

或者在 DSH 里用面板的「安装」按钮,或直接把仓库目录放进 profile 的 vendor/ 再重启 DSH Desktop Beta。详见 安装说明.md

v3.0.0

Choose a tag to compare

@VDERR VDERR released this 18 Sep 00:20

第一版正式发布:每轮对话的 skill 调用审计 + 应用内 skill 管理器。

  • 三个界面:输入框上方横栏、左栏图标、中栏完整报告
  • 一行安装:粘贴作者给的任意地址(仓库主页 / 文件夹链接 / SKILL.md / zip)
  • 中文显示名:写进 skill 的 meta.yaml,装完还能改
  • 装卸都留备份,永不硬删
  • 926 项断言,十个门全绿

安装:解压后跑 安装-3.0.ps1,然后重启 DSH Desktop Beta。详见 安装说明.md。