@nonamelego/dsh-catppuccin 0.5.9 → 0.5.10-beta.0

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/README.en.md CHANGED
@@ -125,22 +125,29 @@ dsh plugin --profile web add @nonamelego/dsh-catppuccin
125
125
  Restart `dsh web` after installing — `dsh plugin` adds it to the profile's bundles.
126
126
  Use the profile name of your choice in place of `web` (e.g. `headless`).
127
127
 
128
- **Desktop**: the desktop build's active profile is named `desktop`
129
- (`$DSH_HOME/profiles/desktop`), so run:
128
+ **Desktop**: the official desktop shell and the community desktop shell both read the **same profile**
129
+ `$DSH_HOME/profiles/desktop`, but **they install/upgrade plugins in completely different, non-interchangeable
130
+ ways** — pick the column that matches your shell:
130
131
 
131
- ```sh
132
- dsh plugin --profile desktop add @nonamelego/dsh-catppuccin
133
- ```
132
+ | | Official desktop shell ([DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) app) | Community shell ([DSH Desktop](https://github.com/anywhere-labs/dsh-desktop)) |
133
+ |---|---|---|
134
+ | **Install** | Its **plugin UI** → add plugin → enter the package name `@nonamelego/dsh-catppuccin` (Git URLs / tarballs / local paths are accepted too) | In the app's own **DSH terminal**:<br>`dsh plugin --profile desktop add @nonamelego/dsh-catppuccin` |
135
+ | **Upgrade** | **Remove the plugin in the plugin UI, then enter the same package name again to reinstall it** (v0.2.0 has no upgrade entry point and no version picker) | The same `update` command as web:<br>`dsh plugin --profile desktop update @nonamelego/dsh-catppuccin` |
136
+ | Runs pnpm | The app's bundled pnpm | The app's bundled pnpm |
137
+
138
+ Either way, **restart the desktop app** to load the new version.
134
139
 
135
- Run it in the DSH terminal of the desktop app (`dsh plugin` defaults to the active profile),
136
- then restart the app.
137
- Installing from the repo works the same way: `dsh plugin --profile desktop add https://github.com/NoNameLeGo/dsh-catppuccin-theme`.
140
+ > ⚠️ **Do not mix the columns**: the official shell's plugin UI does not run commands, and the community
141
+ > shell's `update` command does not apply to the official shell. Also, **the plain `dsh` on your system PATH
142
+ > cannot manage `desktop` in either shell** — upstream reserves that profile name and rejects it with
143
+ > `error: profile "desktop" is managed exclusively by the Electron application`. To use the CLI, use another
144
+ > profile name (`web`, `headless`, `dsh-tui`).
138
145
 
139
146
  > **Two desktop shells, one profile**: the official
140
147
  > [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) monorepo ships
141
- > `apps/desktop` / `apps/desktop-host` (Electron, still in development), and the community
142
- > [DSH Desktop](https://github.com/anywhere-labs/deepseek-harness-desktop) does the same — both boot
143
- > `$DSH_HOME/profiles/desktop`, so the command above works for either. This plugin's desktop support
148
+ > `apps/desktop` / `apps/desktop-host` (Electron), and the community
149
+ > [DSH Desktop](https://github.com/anywhere-labs/dsh-desktop) does the same — both boot
150
+ > `$DSH_HOME/profiles/desktop`, so a plugin installed once works in either. This plugin's desktop support
144
151
  > targets the **official web + desktop** builds; the community shell's `desktopProfiles` service probe
145
152
  > is kept. The official shell's profile process carries **no** dedicated env marker (its
146
153
  > `DSH_DESKTOP_NODE_EXECUTABLE` is injected only into its package-install children), so the plugin
@@ -157,6 +164,10 @@ dsh plugin --profile web add https://github.com/NoNameLeGo/dsh-catppuccin-theme
157
164
  When installing from git, pnpm may ask you to allow build scripts — follow pnpm's prompt
158
165
  and add the package to the profile's `pnpm-workspace.yaml` `allowBuilds`, then run it again.
159
166
 
167
+ On desktop, follow the table above instead: the **official shell** takes the Git URL directly in its
168
+ plugin UI, while the **community shell** runs the same command with
169
+ `dsh plugin --profile desktop add …`.
170
+
160
171
  ### dsh-TUI (terminal) themes
161
172
 
162
173
  The same package covers the TUI. Install it into the dsh-tui profile:
@@ -246,6 +257,12 @@ In **Settings → General**, right below the **Glass** row:
246
257
  - Channel policy: stable builds follow the `latest` tag; prereleases follow both `latest`
247
258
  and `beta` (the upgrade command automatically carries `@beta`). Offline or network
248
259
  failures show the reason and offer a retry.
260
+ - The upgrade path follows the **host**: the **official desktop build** (DeepSeek Harness
261
+ client) gets no command line — it has no reachable terminal — so this row shows the
262
+ **`package@channel`** spec and tells you to delete the plugin on the **Plugins** page and
263
+ reinstall it (the same path as the desktop section above). The **community desktop shell**
264
+ and **web** keep the copyable `dsh plugin …` command. The host classifies itself
265
+ (`web` / `community-desktop` / `official-desktop`); you do not pick.
249
266
 
250
267
  ## Glassmorphism
251
268
 
@@ -269,7 +286,7 @@ What this plugin does:
269
286
  - **One-click toggle**: off restores the stock UI exactly; uninstalling the plugin leaves
270
287
  nothing behind.
271
288
 
272
- ### What Compatibility mode matches
289
+ ### When Compatibility mode matches the wrong surface
273
290
 
274
291
  Compatibility mode frosts host and third-party floating surfaces through **class substrings and
275
292
  semantic attributes**, needing no cooperation from other plugins — the price is that a substring
@@ -278,54 +295,19 @@ matches are exactly these:
278
295
 
279
296
  | Family | Anchor |
280
297
  |---|---|
281
- | Composer card | `[data-composer-card]` (the host's own attribute) |
298
+ | Composer card | `[data-composer-card]` (the material is painted on its `::before`, see issue #19) |
282
299
  | Menus | `[role='menu']` |
283
300
  | Popovers | `[class*='popover']` / `[class*='dropdown']` (still substrings) |
284
301
  | Modal dialogs | `[role='dialog'][aria-modal='true']` |
285
302
  | Host right sidebar (open state only) | `[data-sidebar-right-panel][data-sidebar-right-open]` |
286
303
 
287
- `0.5.8` narrowed the three widest families out of the sheet on evidence (the `card` substring, the
288
- `panel` substring and row-level tooltips — see issue #17), but a **new class name in a third-party
289
- plugin can still be misread**. Defaults only change with evidence, so when you hit one:
290
-
291
- **1. Collect evidence** (read-only — paste into the browser console). Lists every element the glass
292
- rules match, the matched rule text and its computed values:
293
-
294
- ```js
295
- (() => {
296
- const rules = []
297
- for (const ss of document.styleSheets) {
298
- let rs; try { rs = ss.cssRules } catch { continue }
299
- for (const r of rs) if (r.selectorText && r.selectorText.includes('dsh-glass')) rules.push(r)
300
- }
301
- const out = []
302
- for (const el of document.querySelectorAll('[class*="card"],[class*="panel"],[role="tooltip"]')) {
303
- const hit = rules.filter(r => { try { return el.matches(r.selectorText) } catch { return false } })
304
- if (!hit.length) continue
305
- const cs = getComputedStyle(el), b = el.getBoundingClientRect()
306
- if (b.width < 8 || b.height < 8) continue
307
- out.push({ cls: String(el.className).slice(0, 48), w: Math.round(b.width), h: Math.round(b.height),
308
- bf: cs.backdropFilter, bg: cs.backgroundColor,
309
- rule: hit.map(x => x.style.cssText).join(' | ').slice(0, 60) })
310
- }
311
- console.table(out.slice(0, 40))
312
- })()
313
- ```
314
-
315
- **2. Stop the bleeding locally.** The plugin has **no** "custom CSS" option (DSH's profile patch
316
- layer can only write plugin `config` — there is no generic style entry point), so this needs an
317
- external injector: a browser extension (Stylus / Violentmonkey) or DevTools Overrides with an
318
- `!important` rule, e.g.
319
-
320
- ```css
321
- [class*='yourRow'] { backdrop-filter: none !important; background: none !important; outline: none !important; }
322
- ```
323
-
324
- **3. Report it.** Paste step 1's output plus your DSH and plugin versions into
325
- [issues](https://github.com/NoNameLeGo/dsh-catppuccin-theme/issues). That is how `0.5.8` was built:
326
- the reporter supplied per-element computed values and we narrowed the **defaults** — which is also
327
- why there is no "custom CSS" option: the default should be right first, an escape hatch is only a
328
- supplement.
304
+ **A new class name in a third-party plugin can still be misread.** When you hit one, work through three
305
+ steps: **① collect evidence** (a probe snippet you paste into the console, listing every matched element
306
+ and rule) → **② temporary relief** (inject an `!important` override from outside; this plugin
307
+ deliberately ships **no** "custom CSS" option) → **③ report** (attach the evidence plus your DSH and
308
+ plugin versions to [issues](https://github.com/NoNameLeGo/dsh-catppuccin-theme/issues)).
309
+ The full write-up, the probe snippet and the history (#16 / #17 / #19) live in
310
+ [docs/glass-mis-hits.md](docs/glass-mis-hits.md).
329
311
 
330
312
  ### Environment limit: glass needs a see-through base from the host
331
313
 
@@ -393,53 +375,18 @@ The machine-readable form of the above is `dsh.compatibility` (`dsh` / `dshRelea
393
375
  ## Development
394
376
 
395
377
  ```sh
396
- pnpm install
397
- pnpm typecheck # tsc --noEmit: type check for src
398
- pnpm typecheck:tests # tsc --noEmit: type check for the specs (vitest transpiles, it never type checks)
399
- pnpm test # vitest palette-coverage tests
400
- pnpm build # tsdown build -> lib/index.js (host) + lib/client.js (browser)
401
- ```
402
-
403
- Palettes are produced by a generator script — after editing
404
- `scripts/generate-palettes.mjs`, rerun:
405
-
406
- ```sh
407
- node scripts/generate-palettes.mjs
408
- ```
409
-
410
- The changelog draft is generated from your conventional commits (bilingual `EN:` support
411
- in commit bodies):
412
-
413
- ```sh
414
- pnpm changelog:gen # print the draft since the last tag
415
- pnpm changelog:gen -- --write # write it into the [Unreleased] section
416
- ```
417
-
418
- TypeDoc docs for the public API (`./client`, `./tui-themes` subpath exports) are generated
419
- locally on demand into `docs/api/` (that directory is **not** committed — it's in
420
- `.gitignore`; wire up CI Pages publishing later if an online copy is ever wanted):
421
-
422
- ```sh
423
- pnpm docs:api
424
- ```
425
-
426
- See [CONTRIBUTING.md](CONTRIBUTING.md) for the contribution guide and
427
- [docs/state-migrations.md](docs/state-migrations.md) for the state versioning contract.
428
-
429
- ### Local link debugging
430
-
431
- Clone the repo, link it into a profile and add it to the bundles (use your own paths;
432
- `$DSH_HOME` defaults to `~/.dsh`):
433
-
434
- ```sh
435
- pnpm --dir ~/.dsh/profiles/web add link:/path/to/dsh-catppuccin
436
- # Windows example:
437
- # pnpm --dir C:\Users\<you>\.dsh\profiles\web add link:D:\dev\dsh-catppuccin
378
+ pnpm install # install dependencies
379
+ pnpm typecheck # tsc --noEmit for src
380
+ pnpm typecheck:tests # tsc --noEmit for tests
381
+ pnpm test # vitest
382
+ pnpm build # tsdown -> lib/index.js (host) + lib/client.js (browser)
438
383
  ```
439
384
 
440
- Then add `@nonamelego/dsh-catppuccin` to the profile's `package.json`
441
- `dsh.profile.bundles` and restart `dsh web`. For DSH Desktop use
442
- `~/.dsh/profiles/desktop` instead.
385
+ The palette table is generated by `scripts/generate-palettes.mjs` — **never hand-edit**
386
+ `src/client/palettes.ts`; CHANGELOG drafts come from `pnpm changelog:gen`.
387
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for the full command list, the generators, typedoc and local
388
+ link debugging; state-contract migration rules are in
389
+ [docs/state-migrations.md](docs/state-migrations.md).
443
390
 
444
391
  ## 🙋 FAQ
445
392
 
@@ -459,8 +406,12 @@ Then add `@nonamelego/dsh-catppuccin` to the profile's `package.json`
459
406
  A: Settings → General → **Check Catppuccin plugin updates** compares against npm in one
460
407
  click and gives a copyable upgrade command; or run
461
408
  `dsh plugin --profile web update @nonamelego/dsh-catppuccin` manually (re-`add` the
462
- latest version works too). In [DSH Desktop](https://github.com/anywhere-labs/deepseek-harness-desktop),
463
- use `desktop` as the profile name, or just run `dsh plugin update` in the app's DSH terminal.
409
+ latest version works too). **Desktop depends on which shell you use**: the community
410
+ [DSH Desktop](https://github.com/anywhere-labs/dsh-desktop) runs that same command in the app's own
411
+ DSH terminal (with `desktop` as the profile name), while the **official shell has no upgrade entry
412
+ point** — **remove the plugin in its plugin UI, then enter the package name
413
+ `@nonamelego/dsh-catppuccin` again to reinstall**, and restart the app. The two routes are not
414
+ interchangeable; see the table under Install → Desktop.
464
415
 
465
416
  ## 💝 Credits
466
417
 
package/README.md CHANGED
@@ -117,25 +117,27 @@ dsh plugin --profile web add @nonamelego/dsh-catppuccin
117
117
  装完重启 `dsh web` 即可,`dsh plugin` 会自动把它加进 profile 的 bundles。
118
118
  其他 profile 把命令里的 `web` 换成对应名字即可(如 `headless`)。
119
119
 
120
- **桌面版**:桌面端默认激活的 profile 就叫 `desktop`(`$DSH_HOME/profiles/desktop`),
121
- 把命令里的 `web` 换成 `desktop` 即可:
120
+ **桌面版**:官方桌面壳与社区桌面壳都读**同一个 profile** `$DSH_HOME/profiles/desktop`,但
121
+ **两者装/升插件的方式完全不同、也不通用**——按你用的壳选一列:
122
122
 
123
- ```sh
124
- dsh plugin --profile desktop add @nonamelego/dsh-catppuccin
125
- ```
123
+ | | 官方桌面壳([DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 客户端) | 社区桌面壳([DSH Desktop](https://github.com/anywhere-labs/dsh-desktop)) |
124
+ |---|---|---|
125
+ | **安装** | 应用内的**插件界面** → 添加插件 → 填包名 `@nonamelego/dsh-catppuccin`(也接受 Git 地址 / 压缩包 / 本地路径) | 在打开的 **终端**里执行命令:<br>`dsh plugin --profile desktop add @nonamelego/dsh-catppuccin` |
126
+ | **升级** | **先在插件界面里把插件删除,再重新填一遍同一个包名安装**(v0.2.0 没有升级入口,也没有版本选择器) | 与 web 类似的更新命令:<br>`dsh plugin --profile desktop update @nonamelego/dsh-catppuccin` |
127
+ | 谁执行 pnpm | 应用自带的 pnpm | 应用自带的 pnpm |
126
128
 
127
- 在桌面的 **DSH 终端**里运行即可(`dsh plugin` 默认作用于当前激活的 profile,
128
- 若在托盘里选了别的 profile 就换成那个名字),装完**重启桌面应用**生效。
129
- 从仓库安装的方式同理:`dsh plugin --profile desktop add https://github.com/NoNameLeGo/dsh-catppuccin-theme`。
129
+ 两种方式改完都要**重启桌面应用**才会加载新版本。
130
130
 
131
- > **两个桌面壳,同一个 profile**:官方 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)
132
- > 仓库里的 `apps/desktop` / `apps/desktop-host`(Electron,仍在开发中)与社区的
133
- > [DSH Desktop](https://github.com/anywhere-labs/deepseek-harness-desktop) 都启动
134
- > `$DSH_HOME/profiles/desktop`,所以**上面的命令对两者都成立**。本插件的桌面支持以
131
+ > ⚠️ **两列别混用**:官方壳的插件界面不执行命令;社区壳那条 `update` 命令对官方壳也不适用。
132
+ > 另外,**系统 PATH 上那个普通 `dsh` 两个壳都管不了 `desktop`**——上游把 `desktop` 当自己保留的
133
+ > profile,会直接报 `error: profile "desktop" is managed exclusively by the Electron application`。
134
+ > 想用 CLI 管就用别的 profile 名(`web`、`headless`、`dsh-tui`)。
135
+
136
+ > 本插件的桌面支持以
135
137
  > **官方 web + 官方 desktop** 为维护核心;社区壳的 `desktopProfiles` 服务探测也保留。
136
138
  > 但官方壳的 profile 进程**没有**专用的环境标记(它的 `DSH_DESKTOP_NODE_EXECUTABLE` 只注入给
137
139
  > 包安装子进程),所以本插件改为识别 **Electron-as-node 运行时**(`process.versions.electron`)
138
- > 来判定官方桌面版——升级提示里的 profile 名与文案因此是对的;设置的读写不受影响。
140
+ > 来判定官方桌面版;设置的读写不受影响。
139
141
 
140
142
  ### 方式二:从仓库安装
141
143
 
@@ -146,6 +148,9 @@ dsh plugin --profile web add https://github.com/NoNameLeGo/dsh-catppuccin-theme
146
148
  从 git 安装时 pnpm 可能要求允许构建脚本——按 pnpm 的提示把对应包加进 profile
147
149
  `pnpm-workspace.yaml` 的 `allowBuilds` 后重跑一次即可。
148
150
 
151
+ 桌面版同理,但按上面的表走:**官方壳**在插件界面里直接填 Git 地址;**社区壳**把这条命令的
152
+ `dsh plugin --profile web add …` 换成 `dsh plugin --profile desktop add …`。
153
+
149
154
  ### dsh-TUI(终端版)主题
150
155
 
151
156
  与 Web GUI 插件同一个包。用标准的插件安装命令装进 dsh-tui profile:
@@ -175,7 +180,7 @@ dsh plugin --profile dsh-tui add https://github.com/NoNameLeGo/dsh-catppuccin-th
175
180
 
176
181
  ## 使用
177
182
 
178
- 1. 打开 Web GUI(默认 `http://127.0.0.1:3080`);在 [DSH Desktop](https://github.com/anywhere-labs/deepseek-harness-desktop) 中则直接打开桌面应用即可。
183
+ 1. 打开 Web GUI(默认 `http://127.0.0.1:3080`);在 [DSH Desktop](https://github.com/anywhere-labs/dsh-desktop) 中则直接打开桌面应用即可。
179
184
  2. 进入 **设置 → 常规**。
180
185
  3. 在 **外观** 区域下方找到 **Catppuccin** 行,选择主题:
181
186
  **Latte**(浅色)、**Frappé**、**Macchiato** 或 **Mocha**(深色)。
@@ -224,6 +229,11 @@ dsh plugin --profile dsh-tui add https://github.com/NoNameLeGo/dsh-catppuccin-th
224
229
  命令,会提示改用 `git pull` 或重新构建。
225
230
  - 通道策略:正式版只跟随 `latest` 标签;预发布版同时跟随 `beta`(升级命令
226
231
  自动带 `@beta`)。离线或网络失败时显示原因并可重试。
232
+ - 升级路径按**宿主**分流:**官方桌面版**(DeepSeek Harness 客户端)不给命令行——
233
+ 它没有可达的终端入口,所以这一行改为给出 **`包名@渠道`** 并提示在
234
+ **插件界面**里先删除、再重新安装(与上面「桌面版」段的升级路径一致);
235
+ **社区桌面壳**与 **web** 仍照常给出可复制的 `dsh plugin …` 命令。
236
+ 判定由宿主完成(`web` / `community-desktop` / `official-desktop`),无需你选。
227
237
 
228
238
  ## 玻璃拟态(Glassmorphism)
229
239
 
@@ -244,65 +254,24 @@ dsh plugin --profile dsh-tui add https://github.com/NoNameLeGo/dsh-catppuccin-th
244
254
  变色;页面底色取当前主题纯色,背景亮度旋钮直接往纯色里调和白/黑;
245
255
  - **一键开关**:关闭即完全还原原生界面,插件卸载不留任何残留。
246
256
 
247
- ### 兼容模式会命中哪些面
257
+ ### 兼容模式误命中了别的面?
248
258
 
249
- 兼容模式靠**类名子串与语义属性**给宿主与第三方插件的悬浮面加玻璃,不需要任何插件配合——
259
+ 兼容模式靠**类名子串与语义属性**给宿主与第三方插件的悬浮面加玻璃,不需要插件配合——
250
260
  代价是子串匹配**无法区分「面」与「面里的行级容器」**。自 `0.5.8` 起,明确会被命中的族只剩这些:
251
261
 
252
262
  | 族 | 锚点 |
253
263
  |---|---|
254
- | 输入框卡片 | `[data-composer-card]`(宿主自己的属性;材质画在它的 `::before` 上,见 issue #19) |
264
+ | 输入框卡片 | `[data-composer-card]`(材质画在它的 `::before` 上,见 issue #19) |
255
265
  | 菜单 | `[role='menu']` |
256
- | 弹出层 | `[class*='popover']` / `[class*='dropdown']`(这两个仍是子串) |
266
+ | 弹出层 | `[class*='popover']` / `[class*='dropdown']`(仍是子串) |
257
267
  | 模态框 | `[role='dialog'][aria-modal='true']` |
258
268
  | 宿主右侧栏(仅展开态) | `[data-sidebar-right-panel][data-sidebar-right-open]` |
259
269
 
260
- `0.5.8` 按证据把最宽的三族收窄掉了(宽泛的 `card` 子串、`panel` 子串、行级 tooltip,详见
261
- issue #17),但**第三方插件里新出现的类名仍可能被误命中**。默认收窄要讲证据,遇到时走下面三步。
262
-
263
- #### 1. 取证(只读,粘进浏览器控制台)
264
-
265
- 列出当前所有被玻璃规则命中的元素、命中的规则原文与 computed 值:
266
-
267
- ```js
268
- (() => {
269
- const rules = []
270
- for (const ss of document.styleSheets) {
271
- let rs; try { rs = ss.cssRules } catch { continue }
272
- for (const r of rs) if (r.selectorText && r.selectorText.includes('dsh-glass')) rules.push(r)
273
- }
274
- const out = []
275
- for (const el of document.querySelectorAll('[class*="card"],[class*="panel"],[role="tooltip"]')) {
276
- const hit = rules.filter(r => { try { return el.matches(r.selectorText) } catch { return false } })
277
- if (!hit.length) continue
278
- const cs = getComputedStyle(el), b = el.getBoundingClientRect()
279
- if (b.width < 8 || b.height < 8) continue
280
- out.push({ cls: String(el.className).slice(0, 48), w: Math.round(b.width), h: Math.round(b.height),
281
- bf: cs.backdropFilter, bg: cs.backgroundColor,
282
- rule: hit.map(x => x.style.cssText).join(' | ').slice(0, 60) })
283
- }
284
- console.table(out.slice(0, 40))
285
- })()
286
- ```
287
-
288
- #### 2. 临时止血
289
-
290
- 本插件**没有**「自定义 CSS」配置项(DSH 的 profile patch 层只能给插件写 `config`,没有通用样式入口;
291
- 但**个别第三方插件自带样式入口**,例如 `dsh-better-sidebar@0.21.1` 的 `customCss`——它 gate 在自身的
292
- `titleBarScheme: 'custom'` 上、以 `data-dsh-custom-css` 注入,装了这类插件时也可以直接写在它的 `config` 里),
293
- 所以这一步要用外部注入——浏览器扩展(Stylus / 暴力猴)或 DevTools 的 Overrides——加一条
294
- `!important` 规则把该族还原,例如:
295
-
296
- ```css
297
- [class*='yourRow'] { backdrop-filter: none !important; background: none !important; outline: none !important; }
298
- ```
299
-
300
- #### 3. 反馈
301
-
302
- 把第 1 步的表格输出连同 DSH 与插件版本贴到
303
- [issues](https://github.com/NoNameLeGo/dsh-catppuccin-theme/issues)。`0.5.8` 就是这么修出来的:
304
- 报告人给了逐元素的 computed 对照,我们据此收窄**默认**规则——这也是为什么没有「自定义 CSS」
305
- 配置项:默认行为应该先是对的,配置项只能当补充。
270
+ **第三方插件里新出现的类名仍可能被误命中**。遇到时走三步:**① 只读取证**(一段粘进控制台的探针脚本,
271
+ 列出命中的元素与规则)→ **② 临时止血**(外部注入一条 `!important` 还原;本插件**不**提供
272
+ 「自定义 CSS」配置项)→ **③ 反馈**(把取证输出连同 DSH 与插件版本提到
273
+ [issues](https://github.com/NoNameLeGo/dsh-catppuccin-theme/issues))。
274
+ 三步的完整说明、探针脚本与历史(#16 / #17 / #19)见 [docs/glass-mis-hits.md](docs/glass-mis-hits.md)。
306
275
 
307
276
  ### 环境限制:玻璃需要宿主提供可透出的底色
308
277
 
@@ -364,51 +333,17 @@ alias 101 / specific 11 / 非三族 1)全覆盖,含 0.2.0 新增的 17 个 a
364
333
  ## 开发
365
334
 
366
335
  ```sh
367
- pnpm install
368
- pnpm typecheck # tsc --noEmit:src 的类型检查
369
- pnpm typecheck:tests # tsc --noEmit:tests 的类型检查(vitest 跑 esbuild,不做类型检查)
370
- pnpm test # vitest 跑配色表 / 契约 / e2e 覆盖测试
371
- pnpm build # tsdown 构建 -> lib/index.js(服务端)+ lib/client.js(浏览器)
372
- ```
373
-
374
- 配色表由生成器脚本产出——修改 `scripts/generate-palettes.mjs` 后重跑
375
- (`--pin <sha>` 可把上游 commit SHA 写进 `palettes.ts` 头部,见
376
- `docs/plugin-improvements.md` 的 L 项):
377
-
378
- ```sh
379
- node scripts/generate-palettes.mjs [--pin <upstream-sha>]
380
- ```
381
-
382
- CHANGELOG 草稿由 conventional 提交生成(提交正文里的 `EN:` 行会被渲染成英文摘要):
383
-
384
- ```sh
385
- pnpm changelog:gen # 打印上一 tag 之后的草稿
386
- pnpm changelog:gen -- --write # 直接写入 [Unreleased] 节
387
- ```
388
-
389
- 对外 API(`./client`、`./tui-themes` 子路径导出)的 typedoc 文档**按需本地生成**到
390
- `docs/api/`(该目录不入库、已进 `.gitignore`;哪天真需要在线版本再接 CI 发布):
391
-
392
- ```sh
393
- pnpm docs:api
394
- ```
395
-
396
- 贡献指南见 [CONTRIBUTING.md](CONTRIBUTING.md);状态契约的版本迁移约定见
397
- [docs/state-migrations.md](docs/state-migrations.md)。
398
-
399
- ### 本地链接调试
400
-
401
- 克隆到本地后,把包链接进 profile(把路径换成你自己的;`$DSH_HOME` 默认是 `~/.dsh`):
402
-
403
- ```sh
404
- pnpm --dir ~/.dsh/profiles/web add link:/path/to/dsh-catppuccin
405
- # Windows 例:
406
- # pnpm --dir C:\Users\<you>\.dsh\profiles\web add link:D:\dev\dsh-catppuccin
336
+ pnpm install # 装依赖
337
+ pnpm typecheck # tsc --noEmit:src 的类型检查
338
+ pnpm typecheck:tests # tsc --noEmit:tests 的类型检查
339
+ pnpm test # vitest
340
+ pnpm build # tsdown -> lib/index.js(服务端)+ lib/client.js(浏览器)
407
341
  ```
408
342
 
409
- 再把 `@nonamelego/dsh-catppuccin` 加进 profile `package.json` 的
410
- `dsh.profile.bundles`,重启 `dsh web`。DSH Desktop 用
411
- `~/.dsh/profiles/desktop` 对应路径。
343
+ 配色表由 `scripts/generate-palettes.mjs` 生成,**不要手改** `src/client/palettes.ts`;
344
+ CHANGELOG 草稿由 `pnpm changelog:gen` 从 conventional 提交里产出。
345
+ 完整命令清单、生成器与 typedoc、本地 link 调试见 [CONTRIBUTING.md](CONTRIBUTING.md);
346
+ 状态契约的版本迁移约定见 [docs/state-migrations.md](docs/state-migrations.md)。
412
347
 
413
348
  ## 🙋 常见问题
414
349
 
@@ -436,9 +371,11 @@ pnpm --dir ~/.dsh/profiles/web add link:/path/to/dsh-catppuccin
436
371
  A: 设置 → 常规 → **检查 Catppuccin 插件更新** 一键检测本插件在 npm 上的最新版本,
437
372
  发现新版会给出可复制的升级命令;也可以随时手动执行
438
373
  `dsh plugin --profile web update @nonamelego/dsh-catppuccin`
439
- (或重新 `add` 最新版)。在 [DSH Desktop](https://github.com/anywhere-labs/deepseek-harness-desktop) 中,把 `web` 换成 `desktop`
440
- (`dsh plugin --profile desktop update @nonamelego/dsh-catppuccin`),
441
- 或者直接在 DSH 终端里运行 `dsh plugin update`(默认作用于当前 profile)。
374
+ (或重新 `add` 最新版)。
375
+ **桌面版要分壳**:社区壳 [DSH Desktop](https://github.com/anywhere-labs/dsh-desktop) 在应用内的
376
+ DSH 终端里用同一条命令(把 `web` 换成 `desktop`);**官方壳没有升级入口**——要在插件界面里
377
+ **先删掉本插件,再重新填一遍包名 `@nonamelego/dsh-catppuccin` 安装**,然后重启应用。
378
+ 两种方式不通用,详见上面「安装 → 桌面版」的对照表。
442
379
 
443
380
  ## 💝 致谢
444
381
 
package/icon.png ADDED
Binary file
package/lib/client.js CHANGED
@@ -547,9 +547,11 @@ window.__ModuleLoader__.load({
547
547
  "update.commandHint": "在终端运行以下命令升级(把 web 换成你的 profile 名):",
548
548
  "update.commandHintDetected": "已自动探测到 profile「{profile}」,在终端运行以下命令升级:",
549
549
  "update.commandHintDesktop": "已检测到你在使用 DSH Desktop,目标 profile「{profile}」,请在 DSH 终端中运行以下命令升级:",
550
+ "update.commandHintOfficialDesktop": "已检测到官方桌面版(DeepSeek Harness 客户端):它没有命令行升级入口——请在**插件界面**里先删除本插件,再把下面的包名粘进「添加插件」重新安装。",
550
551
  "update.restartHint": "升级完成后重启 dsh web 生效。",
551
552
  "update.restartHintDesktop": "升级完成后重启 DSH Desktop 生效。",
552
553
  "update.copy": "复制命令",
554
+ "update.copySpec": "复制包名",
553
555
  "update.copied": "已复制 ✓",
554
556
  "update.failed": "检查失败,请稍后重试。",
555
557
  "update.retry": "重试",
@@ -622,9 +624,11 @@ window.__ModuleLoader__.load({
622
624
  "update.commandHint": "Run this in a terminal to upgrade (replace web with your profile name):",
623
625
  "update.commandHintDetected": "Profile \"{profile}\" detected — run this in a terminal to upgrade:",
624
626
  "update.commandHintDesktop": "DSH Desktop detected — target profile \"{profile}\", run this in the DSH terminal to upgrade:",
627
+ "update.commandHintOfficialDesktop": "Official desktop build detected (DeepSeek Harness client) — it has no CLI upgrade path: delete this plugin on the **Plugins** page, then paste the package name below into \"Add plugin\" to reinstall.",
625
628
  "update.restartHint": "Restart dsh web after the upgrade.",
626
629
  "update.restartHintDesktop": "Restart DSH Desktop after the upgrade.",
627
630
  "update.copy": "Copy command",
631
+ "update.copySpec": "Copy package name",
628
632
  "update.copied": "Copied ✓",
629
633
  "update.failed": "Check failed — try again later.",
630
634
  "update.retry": "Retry",
@@ -697,9 +701,11 @@ window.__ModuleLoader__.load({
697
701
  "update.commandHint": "ターミナルで以下を実行してアップグレード(web をあなたの profile 名に変更):",
698
702
  "update.commandHintDetected": "profile「{profile}」を検出。ターミナルで以下を実行してアップグレード:",
699
703
  "update.commandHintDesktop": "DSH Desktop を検出。target profile「{profile}」、DSH ターミナルで以下を実行:",
704
+ "update.commandHintOfficialDesktop": "公式デスクトップ版(DeepSeek Harness クライアント)を検出: CLI からのアップグレード経路はありません——**プラグイン画面**で本プラグインを先に削除し、下のパッケージ名を「プラグインを追加」に貼り付けて再インストールしてください。",
700
705
  "update.restartHint": "アップグレード後、dsh web を再起動してください。",
701
706
  "update.restartHintDesktop": "アップグレード後、DSH Desktop を再起動してください。",
702
707
  "update.copy": "コマンドをコピー",
708
+ "update.copySpec": "パッケージ名をコピー",
703
709
  "update.copied": "コピーしました ✓",
704
710
  "update.failed": "確認に失敗しました。後で再試行してください。",
705
711
  "update.retry": "再試行",
@@ -772,9 +778,11 @@ window.__ModuleLoader__.load({
772
778
  "update.commandHint": "터미널에서 다음을 실행해 업그레이드하세요 (web을 당신의 profile 이름으로 교체):",
773
779
  "update.commandHintDetected": "profile「{profile}」을 감지했습니다. 터미널에서 다음을 실행하세요:",
774
780
  "update.commandHintDesktop": "DSH Desktop 감지. 대상 profile「{profile}」, DSH 터미널에서 다음을 실행하세요:",
781
+ "update.commandHintOfficialDesktop": "공식 데스크톱 버전(DeepSeek Harness 클라이언트)을 감지했습니다: CLI 업그레이드 경로가 없습니다——**플러그인 화면**에서 이 플러그인을 먼저 삭제한 뒤 아래 패키지 이름을 「플러그인 추가」에 붙여 다시 설치하세요.",
775
782
  "update.restartHint": "업그레이드 후 dsh web을 재시작하세요.",
776
783
  "update.restartHintDesktop": "업그레이드 후 DSH Desktop을 재시작하세요.",
777
784
  "update.copy": "명령 복사",
785
+ "update.copySpec": "패키지 이름 복사",
778
786
  "update.copied": "복사됨 ✓",
779
787
  "update.failed": "확인 실패. 잠시 후 다시 시도하세요.",
780
788
  "update.retry": "다시 시도",
@@ -847,9 +855,11 @@ window.__ModuleLoader__.load({
847
855
  "update.commandHint": "Ejecuta esto en una terminal para actualizar (sustituye web por el nombre de tu profile):",
848
856
  "update.commandHintDetected": "Profile \"{profile}\" detectado: ejecuta esto en una terminal para actualizar:",
849
857
  "update.commandHintDesktop": "DSH Desktop detectado: profile objetivo \"{profile}\", ejecuta esto en la terminal de DSH:",
858
+ "update.commandHintOfficialDesktop": "Se detectó la versión oficial de escritorio (cliente DeepSeek Harness): no tiene ruta de actualización por CLI; elimina este plugin en la página **Plugins** y pega el nombre del paquete de abajo en «Añadir plugin» para reinstalarlo.",
850
859
  "update.restartHint": "Reinicia dsh web tras la actualización.",
851
860
  "update.restartHintDesktop": "Reinicia DSH Desktop tras la actualización.",
852
861
  "update.copy": "Copiar comando",
862
+ "update.copySpec": "Copiar nombre del paquete",
853
863
  "update.copied": "Copiado ✓",
854
864
  "update.failed": "Error al comprobar; inténtalo de nuevo más tarde.",
855
865
  "update.retry": "Reintentar",
@@ -922,9 +932,11 @@ window.__ModuleLoader__.load({
922
932
  "update.commandHint": "Exécutez ceci dans un terminal pour mettre à jour (remplacez web par le nom de votre profile) :",
923
933
  "update.commandHintDetected": "Profile « {profile} » détecté — exécutez ceci dans un terminal :",
924
934
  "update.commandHintDesktop": "DSH Desktop détecté — profile cible « {profile} », exécutez ceci dans le terminal DSH :",
935
+ "update.commandHintOfficialDesktop": "Version bureau officielle détectée (client DeepSeek Harness) : aucune mise à jour en ligne de commande — supprimez ce plugin dans la page **Plugins**, puis collez le nom du paquet ci-dessous dans « Ajouter un plugin » pour le réinstaller.",
925
936
  "update.restartHint": "Redémarrez dsh web après la mise à jour.",
926
937
  "update.restartHintDesktop": "Redémarrez DSH Desktop après la mise à jour.",
927
938
  "update.copy": "Copier la commande",
939
+ "update.copySpec": "Copier le nom du paquet",
928
940
  "update.copied": "Copié ✓",
929
941
  "update.failed": "Échec de la vérification — réessayez plus tard.",
930
942
  "update.retry": "Réessayer",
@@ -997,9 +1009,11 @@ window.__ModuleLoader__.load({
997
1009
  "update.commandHint": "Führen Sie dies in einem Terminal aus (ersetzen Sie web durch Ihren Profile-Namen):",
998
1010
  "update.commandHintDetected": "Profile „{profile}“ erkannt – führen Sie dies in einem Terminal aus:",
999
1011
  "update.commandHintDesktop": "DSH Desktop erkannt – Ziel-Profile „{profile}“, führen Sie dies im DSH-Terminal aus:",
1012
+ "update.commandHintOfficialDesktop": "Offizielle Desktop-Version erkannt (DeepSeek Harness-Client): Es gibt keinen CLI-Upgradepfad – löschen Sie dieses Plugin auf der Seite **Plugins** und fügen Sie den Paketnamen unten in „Plugin hinzufügen“ ein, um es neu zu installieren.",
1000
1013
  "update.restartHint": "Starten Sie dsh web nach dem Update neu.",
1001
1014
  "update.restartHintDesktop": "Starten Sie DSH Desktop nach dem Update neu.",
1002
1015
  "update.copy": "Befehl kopieren",
1016
+ "update.copySpec": "Paketnamen kopieren",
1003
1017
  "update.copied": "Kopiert ✓",
1004
1018
  "update.failed": "Prüfung fehlgeschlagen – versuchen Sie es später erneut.",
1005
1019
  "update.retry": "Erneut versuchen",
@@ -3027,6 +3041,8 @@ window.__ModuleLoader__.load({
3027
3041
  const autoResult = lastAutoResult();
3028
3042
  const localInstall = payload?.ok === true && payload.installSource !== void 0 && payload.installSource !== "registry";
3029
3043
  const isDesktop = payload?.ok === true && payload.env === "desktop";
3044
+ const officialDesktop = payload?.ok === true && payload.shell === "official-desktop";
3045
+ const upgradeValue = payload?.ok === true ? officialDesktop ? payload.updateSpec : payload.updateCommand : void 0;
3030
3046
  const showConflict = conflicts > dismissedConflicts;
3031
3047
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3032
3048
  style: {
@@ -3273,14 +3289,14 @@ window.__ModuleLoader__.load({
3273
3289
  " ",
3274
3290
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: payload.latest })
3275
3291
  ]
3276
- }), payload.updateCommand !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
3292
+ }), upgradeValue !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
3277
3293
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3278
3294
  style: {
3279
3295
  color: "var(--dsw-alias-label-tertiary)",
3280
3296
  fontSize: 12,
3281
3297
  lineHeight: "18px"
3282
3298
  },
3283
- children: isDesktop ? t("update.commandHintDesktop").replace("{profile}", payload.profile ?? "") : payload.profileDetected === true && payload.profile !== void 0 ? t("update.commandHintDetected").replace("{profile}", payload.profile) : t("update.commandHint")
3299
+ children: officialDesktop ? t("update.commandHintOfficialDesktop") : isDesktop ? t("update.commandHintDesktop").replace("{profile}", payload.profile ?? "") : payload.profileDetected === true && payload.profile !== void 0 ? t("update.commandHintDetected").replace("{profile}", payload.profile) : t("update.commandHint")
3284
3300
  }),
3285
3301
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3286
3302
  style: {
@@ -3304,17 +3320,17 @@ window.__ModuleLoader__.load({
3304
3320
  textOverflow: "ellipsis",
3305
3321
  fontFamily: "ui-monospace, SFMono-Regular, Menlo, Consolas, monospace"
3306
3322
  },
3307
- children: payload.updateCommand
3323
+ children: upgradeValue
3308
3324
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
3309
3325
  type: "button",
3310
3326
  onClick: () => {
3311
- copyCommand(payload.updateCommand ?? "").then(setCopied);
3327
+ copyCommand(upgradeValue).then(setCopied);
3312
3328
  },
3313
3329
  style: {
3314
3330
  ...buttonStyle,
3315
3331
  cursor: "pointer"
3316
3332
  },
3317
- children: copied ? t("update.copied") : t("update.copy")
3333
+ children: copied ? t("update.copied") : t(officialDesktop ? "update.copySpec" : "update.copy")
3318
3334
  })]
3319
3335
  }),
3320
3336
  localInstall && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {