dsh-claude-style 0.14.0 → 0.14.1-dev.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +45 -9
- package/lib/assets/18b7187b47b9.js.br +0 -0
- package/lib/assets/320343f862cd.js.br +0 -0
- package/lib/assets/fdd63e5ce50d.js.br +0 -0
- package/lib/assets/manifest.json +12 -12
- package/lib/client.js +11 -11
- package/package.json +1 -2
- package/lib/assets/4ec527e58330.js.br +0 -0
- package/lib/assets/755d09170f37.js.br +0 -0
- package/lib/assets/c02a70a798bc.js.br +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,45 +4,81 @@ All notable changes to `dsh-claude-style` are documented here, newest first.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
-
[
|
|
7
|
+
## [0.14.1] - 2026-10-15
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
[中文](#cn-0.14.1) | [English](#en-0.14.1)
|
|
10
10
|
|
|
11
|
-
-
|
|
11
|
+
<h3 id="cn-0.14.1">体验优化</h3>
|
|
12
|
+
|
|
13
|
+
- 会话切换更顺滑:皮肤在使用中会反复翻转的页面标记(首页形态、页头提升、页签栏置顶、竖屏适配、阅读暂停、输入区随页签隐藏,以及上下文圆盘的尺寸读数)从 `<body>` 下移到最近的公共祖先元素上。此前这些属性上悬挂着一千二百余条选择器,每写一次整个文档都要重新参与样式匹配;实测改版后,会话之间、会话与首页之间的切换对 `<body>` 的属性与内联样式写入降为零,样式失效范围收敛到对应子树。
|
|
14
|
+
- 测试入口按档给结论:`npm run verify` 不带参数时同时跑那批检查、构建与工作树改动触及的单元测试,本机 5 秒上下返回;`--full` 加上整份冒烟,页面按 `--jobs` 一起驱动(看动效的页面一次两个),整份冒烟由 251 秒降到 50 秒上下;端到端通道的场景也并发起跑,整条通道共用一个浏览器、每个场景一份临时 home。
|
|
12
15
|
- `npm run verify` 在走整份冒烟与端到端通道那一档之前打印一句「请确认你正处于发布流程。」:这一档就是云端的发布闸门,起跑前先让发起的人确认自己在发布流程里。
|
|
16
|
+
- 皮肤不再按宿主类名的片段匹配界面:`core/parts.ts` 每次页面结构变化时把宿主自己声明的类名(`_2H3hWW_root` 这类带哈希的名字)读成自己的部件名,写在元素上,样式表只按 [data-dsh-claude-part] 整词匹配。原来 45 个样式表里的 565 处子串选择器与 31 处 TypeScript 子串查询全部改完:匹配变得精确(`row` 不再命中 `grow`,`rail` 不再命中 `trailing`),宿主改名时对应的规则直接静默而不误伤邻居,别的插件也不会再被这些规则扫到。
|
|
17
|
+
- 输入光标的测量移到帧的读阶段,探针读数按内容、光标位置、End 倾向、复制样式与字体代次缓存,输入框自身的盒子每次测量只读一次;同一次会话切换(3 轮,与 `@linxin666/dsh-web-all` 同装)中本插件的盒模型读取由 470 至 680 毫秒降到 297 至 402 毫秒。
|
|
18
|
+
- 工作区段落在当前视图上悬停时恢复的三个属性、以及工作区段按钮悬停时的文字颜色,去掉多余的 `!important`:它们所在的规则本来就比被压过的规则多一个伪类,靠层叠顺序就能赢。`importance` 场景逐条丢弃实测之后,577 处 `!important` 里只有这 4 处可以去掉,其余 16 处被证明需要,余下的在走查的页面形态里从未匹配到元素、只在短暂标记下生效或属于第三方应答。
|
|
19
|
+
- 进程摘要的隐藏量宽元素按措辞与字体缓存,同一句措辞不再重写它并为它触发布局:该项在会话切换中的盒模型读取由 3 轮 11 次、94.5 毫秒降为零。
|
|
20
|
+
- 滑动高亮与推理档位按钮的定位改在读阶段取读数:`createSlidingPill` 分出 `measure` 与 `sync` 两个入口,会话标签、权限分段、工作区分段、搜索过滤条与设置分段五处分别在各自阶段调用;同一次会话切换(3 轮,与 `@linxin666/dsh-web-all` 同装)中本插件在自身写入之后发生的盒模型读取由 231 次、370 至 578 毫秒降到 245 次、178 至 214 毫秒,单次由 1.6 至 2.5 毫秒降到 0.73 至 0.87 毫秒。
|
|
21
|
+
- 输入框之外也被读取的三个取值——渐隐带高度、数字入场参数与用量色调——移到输入框门控之外(features/composer/vars.css):等待行与面板在输入框重绘关闭时同样拿到这些值。
|
|
22
|
+
- 等待行的三个圆点在关键帧里不再写圆角:那些取值在 4px 的盒子上每一帧都取整到圆点本就带的同一条曲线,去掉之后动画只含 `scale` 与 `translate`,圆点不再逐帧重绘。
|
|
23
|
+
- 权限菜单的选中标记改用只写存在的写法,状态未变时不再落笔:一次生成期间该属性的写入由每秒 7.7 次降为 0.1 次。
|
|
24
|
+
- 实时匹配表按批次扫描新增节点,同一批次里已被更早的载体带进来的节点不再单独匹配与查询:一次生成期间每秒新增的 13.2 个节点中有 9.2 个属于这种重复,扫描次数由每秒 13.2 次降为 4.0 次。
|
|
13
25
|
|
|
14
26
|
### 问题修复
|
|
15
27
|
|
|
16
|
-
- `npm run session` 拆除会话工作树前先删掉它的 `node_modules` 联接:`git worktree remove` 把这个联接当目录走进去,再顺着主树 `node_modules` 里的工作区联接删掉主树 `packages/*` 的文件;现在先删联接再拆树,树里另有指向自己的链接时拒绝拆除并列出它们。
|
|
17
28
|
- 手机远程访问(`@linxin666/dsh-remote-web-ui` 的竖屏适配)下,输入区底行不再错位:发送与停止按钮回到输入行内并完整落在卡片里;档位选择器与上下文圆环之间只隔 16px,和桌面一致;模型名称在行内还有空间时完整显示,只有真的放不下才以省略号收尾。上下文圆环的预留宽度变化时(流式输出期间也会发生),档位选择器当帧就跟着重新定位,不再停在旧位置。
|
|
29
|
+
- 工作区分栏控件回到原样:进行中时它让位给「工作区」标题,指针进入该段才浮现,切到已归档才常驻。此前按类名片段定位列表区域时,片段同时命中了列表区域的外层容器,区间标记因此落在会话树自身的容器上,样式表里那对交叉淡入的两条规则都读不到它。现在按部件读列表区域,标记重新落在整个区段的根元素上。
|
|
30
|
+
- 首页用量面板回来了:英雄页的根元素在中间列里,不在会话滚动区之内,按会话区域登记「root」这个局部名就读不到它,页面布局与工作室标记因此双双落空。该名字改为整页读取,规则再用宿主自己的 data-phase 限定到英雄页。
|
|
31
|
+
- 宿主菜单卡片的部件重新写上:皮肤给菜单卡片打上自己的标记之后,只重读了那个元素本身,卡片里的行没有重读,于是账号弹层与英雄页的两个选择弹层按宿主原本的样子绘制,账号弹层因此出现了滚动条。元素因标记或类名变化成为区域锚点时,整棵子树一并重读。同一处顺带修正:账号弹层里选中行读的是侧栏的部件名,改为菜单区域自己的名字。
|
|
32
|
+
- 部件落定之后多跑一遍标记:菜单卡片的样式决定了卡片的实际高度,而卡片的位置是量出高度之后才写下的,标记与位置因此在同一帧里互相追赶。写下新部件的那一批结束后主动请求再走一遍,下一遍不再写任何部件,遍历随即停下。
|
|
33
|
+
|
|
34
|
+
### 移除
|
|
35
|
+
|
|
36
|
+
- `npm run session` 随它的会话工作树机制一并移除:会话直接在仓库主树开工,改动在主树提交与推送,`session/` 分支、`finish` 与 `sweep` 子命令不再存在。
|
|
18
37
|
|
|
19
38
|
### 其他变更
|
|
20
39
|
|
|
21
|
-
- `node scripts/changelog.mjs --release <版本>` 在汇编版本一节之前核对 `session/` 分支:有未合并的会话分支时列出它们并终止发版。
|
|
22
40
|
- 文档里带单位的数值不再进闸门:`scripts/doc-numbers.mjs` 留着按需运行(`npm run docs:numbers`),lint 不再核对它,`docs/STYLE.md` 里与样式表逐字对应的几何与时长因此不再让推送失败。
|
|
23
41
|
- `npm run verify` 先跑云端快档那批检查(lint、特性清单、决策索引、变更记录、AGENTS 表),推送前的一次运行与云端判定同一批内容。
|
|
24
42
|
- 端到端通道不带 `--scenario` 时走 `packages/contracts/src/timing.ts` 那张表里除停放的两个统计场景之外的全部条目,新加入表的场景默认进入云端判定,停放名单与场景表对不上时运行直接终止。
|
|
25
43
|
- 发版工作流在把这一版转正之前跑完快档那批检查、Windows 上的完整冒烟与端到端通道,与 pull request 判定的内容一致。
|
|
26
44
|
- 一次运行期间 `npm run dev` 的重建换掉了构建产物时,这次运行不写结论并判定为不通过,结论只对它真正跑过的那份产物成立。
|
|
45
|
+
- 持续集成先由一个任务按改动的路径定下范围:只改了文档、语言包或工作流的推送跳过读页面的通道,改动落在一个功能目录内时冒烟只走那个目录的用例,其余改动才走完整冒烟;端到端的行为场景与截图捕获按矩阵分成四份并行跑,构建的慢步骤按树内容的散列在运行之间取回,每个分钟级的步骤都有时限,分支规则只登记一个汇总任务。
|
|
27
46
|
|
|
28
|
-
<h3 id="en-
|
|
47
|
+
<h3 id="en-0.14.1">Improvements</h3>
|
|
29
48
|
|
|
30
|
-
-
|
|
49
|
+
- Smoother conversation switches: the page marks the skin flips during normal use (the home layout's hero mark, the header band lift, the titlebar tabs, the mobile portrait adaptation, the reader's scroll hold, the composer hiding with the conversation tab, and the context meter's measured numbers) moved from `<body>` to the nearest element that ancestors every styled target. Over twelve hundred selectors used to hang off those body attributes, so every write re-matched the whole document; measured on this build, a switch between conversations or between a conversation and the home page now writes zero attributes and zero inline styles on `<body>`, and style invalidation stays inside the subtree that changed.
|
|
50
|
+
- The test entry answers by tier: a bare `npm run verify` runs the checks, the build and the tests the working tree's change reaches at once and answers in about five seconds on this machine; `--full` adds the whole smoke walk, whose pages are driven `--jobs` at a time (the motion ones two at a time), taking that walk from 251 s to about 50 s; the end-to-end lane's scenarios likewise run several at once, over one browser for the whole lane and a scratch home each.
|
|
31
51
|
- `npm run verify` prints 请确认你正处于发布流程。 before a request that walks the whole smoke and the end-to-end lane's default table, so whoever starts the release gate's minutes confirms the release process is what they are in.
|
|
52
|
+
- The skin stops matching the interface by fragments of the host's class names: `core/parts.ts` reads the local part of every hashed host class name (`_2H3hWW_root` and the like) into the skin's own part name, writes it onto the element on each structural change, and the stylesheets match one whole [data-dsh-claude-part] token. All 565 substring selectors across 45 stylesheets and all 31 TypeScript substring queries are gone: a match is exact (`row` no longer takes `grow`, `rail` no longer takes `trailing`), a host rename leaves the rule quiet instead of wrong, and no other plugin's class names are swept up.
|
|
53
|
+
- The composer caret's measurement runs in the frame's read phase, and what its probe yields is remembered per content, caret offset, End leaning, copied styles and face generation, so the input's own box is read once per measurement; across one conversation switch (3 rounds, with `@linxin666/dsh-web-all` installed) the plugin's box readings fall from 470–680 ms to 297–402 ms.
|
|
54
|
+
- The three properties that bring the workspace segment group back on hover, and the segment button's hover ink, drop their `!important`: the rules already carry one pseudo-class more than the rule they beat, so the cascade settles it. Dropping each one on the real page showed four of the skin's 577 `!important` declarations to be unnecessary; sixteen are proven needed, and the rest never match an element in the walk's page states, hold only under a transient mark, or answer another plugin.
|
|
55
|
+
- The process summary's hidden measuring span is cached by wording and face, so a repeated sentence neither rewrites it nor lays it out again: its box readings across a conversation switch fall from 11 calls and 94.5 ms per 3 rounds to none.
|
|
56
|
+
- The sliding highlight and the reasoning-level trigger take their readings in the read phase: `createSlidingPill` splits into `measure` and `sync`, called from the conversation tabs, the permission segments, the workspace segments, the search filter bar and the settings segments in their own phases; across one conversation switch (3 rounds, with `@linxin666/dsh-web-all` installed) the plugin's box readings taken after its own writes fall from 231 calls and 370–578 ms to 245 calls and 178–214 ms, each from 1.6–2.5 ms to 0.73–0.87 ms.
|
|
57
|
+
- The three sets of values the rest of the page reads — the fade band's height, the digits' entrance and the usage tones — move outside the composer gate (features/composer/vars.css), so the wait row and the panels hold them with the composer restyle off as well.
|
|
58
|
+
- The waiting line's three dots no longer write a corner radius in their keyframes: on a 4px box every one of those stops clamps to the same curve the dot already carries, and without them the animation carries only `scale` and `translate`, so the dots stop repainting every frame.
|
|
59
|
+
- The permission menu's check mark uses a presence-only write and leaves the attribute alone while its state matches: across one streaming turn its writes fall from 7.7 to 0.1 per second.
|
|
60
|
+
- The live-match registry scans a batch's added nodes once, so a node an earlier carrier in the same batch already holds is neither matched nor searched again: across one streaming turn 9.2 of the 13.2 nodes added per second are such repeats, and the scans fall from 13.2 to 4.0 per second.
|
|
32
61
|
|
|
33
62
|
### Bug Fixes
|
|
34
63
|
|
|
35
|
-
- `npm run session` drops a session tree's `node_modules` junction before it removes the tree: `git worktree remove` walked into that junction and, through the workspace junctions in the main tree's `node_modules`, deleted the main tree's own `packages/*` files. The junction goes first now, and a tree holding any other link out of itself is listed and kept.
|
|
36
64
|
- On a phone via the mobile remote plugin (`@linxin666/dsh-remote-web-ui`, portrait adaptation) the composer's bottom line no longer slips out of place: the send and stop buttons sit back on the input's own line and inside the card, the tier trigger stands 16px from the context ring as it does on a desktop, and the model name is shown whole whenever the row has room for it, ending in an ellipsis only when it does not. When the room the context ring reserves changes — which also happens while an answer streams — the tier trigger is placed again in that same frame instead of holding its old position.
|
|
65
|
+
- The workspace section's segmented control behaves as before: in 进行中 it steps aside for the plain 工作区 heading and returns when the pointer enters the section, and it stays put in 已归档. Locating the list area by a class-name fragment also took that area's own outer container, so the view mark landed on the conversation tree's container instead of the section root and neither half of the stylesheet's cross-fade could read it. The list area is now read by its part, and the mark rides the section root again.
|
|
66
|
+
- The home page's usage panel is back: the hero page's root sits in the centre column rather than inside the conversation's scroll region, so registering the host's `root` local name with that region never wrote it, and the page's layout and the studio mark both fell through. The name is read page-wide now, and a rule narrows it to the hero page with the host's own data-phase.
|
|
67
|
+
- A host menu card's parts are written again: when the skin stamped its own mark on the card, only that element was re-read and the rows inside it were not, so the account card and the hero page's two pickers drew the host's own way — which is where the account card's scrollbar came from. An element that becomes a region's anchor through a stamp or a class rewrite now has its whole subtree re-read. The selected row in the account card read the sidebar's part name; it reads the menu region's own name now.
|
|
68
|
+
- A batch that writes part marks asks for one more pass: a menu card's height is what its styled rows draw, and the card's position is written from a measurement taken before those rows were marked, so the two chased each other inside one frame. The next pass writes nothing — every mark already holds — and the walk settles.
|
|
69
|
+
|
|
70
|
+
### Removals
|
|
71
|
+
|
|
72
|
+
- `npm run session` goes with the session-worktree mechanism it drove: a session works in the repository's main tree and pushes from there, and the `session/` branch with the `finish` and `sweep` subcommands is gone.
|
|
37
73
|
|
|
38
74
|
### Chores
|
|
39
75
|
|
|
40
|
-
- `node scripts/changelog.mjs --release <version>` checks the `session/` branches before it assembles the version's section: an unmerged session branch is listed and stops the release.
|
|
41
76
|
- A number with a unit in a document is no longer a gate: `scripts/doc-numbers.mjs` stays for running on demand (`npm run docs:numbers`), and lint no longer checks it, so the geometry and timing in `docs/STYLE.md` that mirror the stylesheets no longer fail a push.
|
|
42
77
|
- `npm run verify` starts with the checks the cloud's fast tier runs (lint, the feature list, the decisions index, the changelog and the AGENTS table), so the run before a push judges the same set.
|
|
43
78
|
- The end-to-end lane without `--scenario` walks every entry of the table in `packages/contracts/src/timing.ts` but the two parked statistics scenarios, so a scenario added to the table is judged in the cloud by default, and a parked name the table does not hold stops the run.
|
|
44
79
|
- The release workflow runs the fast tier's checks, the full smoke on Windows and the end-to-end lane before it promotes a version, the same set a pull request is judged on.
|
|
45
80
|
- A run whose build output a rebuild behind `npm run dev` swapped files no verdict and reads as failed, so a recorded verdict belongs to the output that run actually drove.
|
|
81
|
+
- Continuous integration now settles its scope first, from the paths a push changed: a push holding only documents, locale files or the workflow skips the lanes that read a page, a change inside one feature directory walks that directory's smoke cases, and anything else walks the whole smoke. The end-to-end behaviour scenarios and screenshot captures run as four parallel shards, the build's slow steps are restored from a cache keyed on the tree's hash, every minutes-long step carries a limit, and a branch rule names a single aggregate job.
|
|
46
82
|
|
|
47
83
|
## [0.14.0] - 2026-10-14
|
|
48
84
|
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/lib/assets/manifest.json
CHANGED
|
@@ -91,15 +91,15 @@
|
|
|
91
91
|
"encoding": "br",
|
|
92
92
|
"bytes": 143044
|
|
93
93
|
},
|
|
94
|
-
"
|
|
94
|
+
"18b7187b47b9.js": {
|
|
95
95
|
"type": "text/javascript; charset=utf-8",
|
|
96
96
|
"encoding": "br",
|
|
97
|
-
"bytes":
|
|
97
|
+
"bytes": 15684
|
|
98
98
|
},
|
|
99
|
-
"
|
|
99
|
+
"2f741302b16a.js.map": {
|
|
100
100
|
"type": "application/json; charset=utf-8",
|
|
101
101
|
"encoding": "br",
|
|
102
|
-
"bytes":
|
|
102
|
+
"bytes": 78196
|
|
103
103
|
},
|
|
104
104
|
"3b91bf51db72.js": {
|
|
105
105
|
"type": "text/javascript; charset=utf-8",
|
|
@@ -121,15 +121,15 @@
|
|
|
121
121
|
"encoding": "br",
|
|
122
122
|
"bytes": 27515
|
|
123
123
|
},
|
|
124
|
-
"
|
|
124
|
+
"fdd63e5ce50d.js": {
|
|
125
125
|
"type": "text/javascript; charset=utf-8",
|
|
126
126
|
"encoding": "br",
|
|
127
|
-
"bytes":
|
|
127
|
+
"bytes": 20510
|
|
128
128
|
},
|
|
129
|
-
"
|
|
129
|
+
"38a1428c065d.js.map": {
|
|
130
130
|
"type": "application/json; charset=utf-8",
|
|
131
131
|
"encoding": "br",
|
|
132
|
-
"bytes":
|
|
132
|
+
"bytes": 74534
|
|
133
133
|
},
|
|
134
134
|
"7323c8c86470.js": {
|
|
135
135
|
"type": "text/javascript; charset=utf-8",
|
|
@@ -151,15 +151,15 @@
|
|
|
151
151
|
"encoding": "br",
|
|
152
152
|
"bytes": 125786
|
|
153
153
|
},
|
|
154
|
-
"
|
|
154
|
+
"320343f862cd.js": {
|
|
155
155
|
"type": "text/javascript; charset=utf-8",
|
|
156
156
|
"encoding": "br",
|
|
157
|
-
"bytes":
|
|
157
|
+
"bytes": 30480
|
|
158
158
|
},
|
|
159
|
-
"
|
|
159
|
+
"b89fd5e90fd7.js.map": {
|
|
160
160
|
"type": "application/json; charset=utf-8",
|
|
161
161
|
"encoding": "br",
|
|
162
|
-
"bytes":
|
|
162
|
+
"bytes": 104355
|
|
163
163
|
}
|
|
164
164
|
}
|
|
165
165
|
}
|