Repository navigation
Releases: loyalchiiina/dsh-todo-float-ball
Release list
v0.14.7 — 官方主题皮肤 / 三球皮肤同步 / 强制字色 / 拖拽带修复
dsh-todo-float-ball v0.14.7
悬浮球把 DSH 的任务清单常驻在桌面右下角:已完成/总数 常驻可见、当前进行中的任务名直接写在球面上,可拖、可缩成胶囊、可换 130 款皮肤。
适配 DSH 内核 0.2.1-rc.3 / 桌面端 2.0.20-next,已在本地最新版实测。
✨ 新增
- 官方主题皮肤(129 官方深色 / 130 官方浅色) —— 与 DSH 界面同色系。选到官方皮肤后字色由皮肤强制决定、◐ 按钮呈锁定态:官方皮肤本身自带正确对比度,不需要也不允许手动覆盖。
- 0 · 随系统 · 深/浅自动 —— 跟随
prefers-color-scheme,系统切深浅色时球和面板实时跟着切。 - 三球皮肤同步开关 —— 皮肤菜单首行。勾选 = 跟随全局皮肤(三球同款,改一个三个一起变);不勾 = 本球独立皮肤,全局换肤不动它。经典(旧版)皮肤改为各球独立开关,不再写全局键。
- 强制字色(◐ 自动 → 黑 → 白) —— 作用于面板内外所有文字(球面标签、任务行、折叠行、提示语),专治浅色皮肤白字看不清 / 深色皮肤黑字看不清。
- 设置页「悬浮球导航」分区 —— 三球显隐、皮肤下拉、◎ 回到右下角、作者插件清单(由姊妹插件
dsh-skill-browser注册的共用分区)。 - 标题栏按钮全部改为黑白线性 SVG 图标 ——
stroke: currentColor跟随字色,不再用 emoji。
🔴 修复
- 拖到屏幕顶部就点不动 —— 球、面板、皮肤菜单统一补
app-region: no-drag。DSH 桌面端窗口顶部约 40px 是 Electron 拖拽带,落在上面的球会被窗口拖拽逻辑吃掉全部鼠标事件,看着在、实际已经"死"了。 - 经典皮肤关联破绽 —— 旧实现把
localStorage["dsh-ball-skin"]写成legacy,那是全局键,Todo 球一选经典,另外两个球就被迫解析成官方皮肤。改为各球独立开关 + 旧数据自动迁移。 - 皮肤计数与目录不一致 ——
128→ 实测130(官方主题 2 + 招牌特效 20 + 克制精选 8 + 100 款公式配色)。
📝 文档
- README 全中文重写(
README.md主文档 +README-en.md英文版),新增「适配版本」节。 - 效果图整体换新 3 张(皮肤菜单 + 悬浮球 / 胶囊态 + 面板展开 / 设置页悬浮球导航),删除 4 张过期旧图。
- npm 包体排除
lib/*.bak-*开发备份 —— 原先会把 40 个备份文件(约 7MB)打进包,现在包体 387kB / 18 个文件。
安装
- 插件市场:DSH 插件市场搜
dsh-todo-float-ball或Todo 进度球 - npm:
npm install dsh-todo-float-ball
Full Changelog: v0.14.6...v0.14.7
v0.14.6
v0.14.6:与 npm 同版本发布(GitHub 源码 + npm 包 + 本 Release 三处对齐)。
v0.14.5 — first-tool gate: three defects fixed
Merges community PR #1 by @WanchengWildMan. Host-half only; lib/client.js is byte-identical to v0.14.4.
Fixed
- Counter deadlock (most severe) —
toolCallsThisTurn === 1denied a call that was never appended back, freezing the counter at 1 and rejecting every following call in the turn (74 rejections reported). NowdispatchedThisTurn > 1counts only dispatched calls, andhasTodoWriteThisTurnunblocks as soon as atodo_writeappears. run_codewrapper not recognised — onlyexec.name === "todo_write"was matched. AddedcallArgs.indexOf("todo_write") !== -1as a fallback.- Parallel batch ordering — the old rule depended on event arrival order, which parallel batches do not guarantee. The new rule is order-independent.
Plus a fail-open guard: when a turn has calls but no readable name, the gate allows the call instead of blocking the session.
Verified
~/.dsh/logs/desktop-next.log on 2026-10-18: exactly one deny in the whole run, and every subsequent call went through after a todo_write.
dsh-todo-float-ball v0.12.1
v0.12.1: shared skin catalog hintC contrast fixes (08/09/11/17).
v0.11.1 - typography cleanup (maintenance)
[0.11.1] - 2026-09-13
Maintenance release: typography cleanup only. No behaviour, API or UI change
of any kind — the shippedlib/client.jsis the same program with the
whitespace residue of the 0.11.0 scripted edits taken out.
Fixed
- Header comment reported the wrong version (
lib/client.js, top-of-file
banner). The banner still saidv0.9.1after the package had moved through
0.10.0 and 0.11.0; it now readsv0.11.1. Comment text only — nothing here
is read at runtime.
Changed
- Blank-line residue compressed (
lib/client.js). The scripted edits that
produced 0.11.0 (Plan-A9 / A10 / A11) left 47 stray blank lines behind: 43
insiderenderList()— one between every statement, and even between the
continuation lines of a shared comment — 2 whitespace-only lines inside the
buildUI()panel-markup concatenation, and 2 extras in a triple blank run
betweenrenderList()andrenderPinned(). Blank lines 104 → 57,
trailing whitespace 2 → 0, and no blank run longer than a single line is left.
The surviving blank lines are the 57 that separate top-level declarations and
the comment-led groups insidebuildUI()— the file's original style. - Two-statement lines split (
lib/client.js). Three lines each carried two
statements:ui.ctitle.textContent = …followed by theui.capCurcaption
update (Plan-A11),ui.pinSec = …followed byui.capCur = …, and
e.stopPropagation();followed byvar li = …. Every statement now owns
its line. - Leftover empty CSS element removed (
lib/client.js,cssText()). The
column-caption edit left an""element in the shared CSS rule array, which
joined into a stray empty line in the generated stylesheet. The element line
is gone; the surrounding rules are byte-identical. - Zero semantic change, verified mechanically. A whitespace-insensitive
token comparison oflib/client.jsbefore and after (code tokens, string
literals and comments kept separately) shows exactly two differences: the
header version text and the deleted""CSS element.node --checkpasses,
and both regression harnesses are unchanged —dev-verify-refresh.cjs
14/14 anddev-verify-merge.cjs59/59.
v0.11.0 - pinned-panel parity + panel layout switch
[0.11.0] - 2026-09-13
Client-half release. Pinned (📌) sessions now render exactly like the current
view — one shared history renderer, per-session fold state, per-session
controls — and the panel gained a two-column layout switch with captions.
Fixed
- One shared history renderer for current and pinned lists
(lib/client.js,historySectionHtml(sid, list), Plan-A9). Pinned sessions
used to carry their own copy of the fold logic (Plan-A8) which had no
🧹 Clear all historyrow and no♻️ Restore all hidden historyrow. Both
list kinds are now produced by the same function, so the pinned panel and
the current panel are the same experience by construction, not by
duplication. - Snapshot / history split ignores the hidden filter
(lib/client.js,snapshotRowsOf()+historySectionHtml()). The split
was taken on the already filtered list, so hiding one snapshot row pulled an
archived row up into the flat area and shifted every fold boundary. The raw
(unfiltered) list is now cut atsnapLenfirst and each part is filtered
afterwards — fold counts and boundaries are stable while you hide rows. - Fold state is per session (
lib/client.js,historyOpen/
historyOpenOpenbecame sid-keyed maps). Expanding "已完成历史" in one
conversation no longer expands it in every other one; the pinned panels and
the current panel now share the same per-sid buckets (the Plan-A8
pinnedHistOpen/pinnedOpenHistOpenmaps are gone). - Fold / 🧹 / ♻️ controls carry the session they belong to
(lib/client.js,actionSid()+data-ownsid). Now that one renderer serves
both list kinds, every action row is tagged with the sid it was rendered for
and the dispatcher resolves it (data-ownsid→ legacydata-sid→ the
current session as the last fallback), so a control inside a pinned panel can
never act on the current list.ACT_ALIASmaps the legacy Plan-A8 action
names onto the unified ones, so nothing that used to work stops working. - Pinned header counts report the current plan only
(lib/client.js,countsOf(snapshotRowsOf(sid))). The pinned row's
done/total previously folded archived history into the numbers, breaking the
statistics rule established in 0.10.0.
Added
- Panel layout switch (⇄) (
lib/client.js, Plan-A10). A new ⇄ button in
the panel header toggles between the stacked layout (current list above,
pinned sessions below) and a side-by-side layout (left column = current
list, right column = pinned sessions). The choice is persisted in
localStorage["dsh-todo-float-ball-layout"], restored on load, and the
panel repositions itself after the switch. - Column captions in the side-by-side layout (
lib/client.js, Plan-A11).
Each column gets a caption line: the left one shows the current
conversation title (▸ <title>, kept in sync with the header title), the
right one shows📌 固定会话. In the stacked layout the captions are hidden,
so nothing changes there.
Changed
package.jsonversion 0.10.0 → 0.11.0.- Client-half changes only; the host half (
lib/index.js,
cordis.patch.yml, discipline injection, health routes) is unchanged. lib/client.jsis stored with LF line endings from this release (it matches
the byte-for-byte copy that actually runs here); no content change beyond
the fixes above.- Internal cleanup: the click dispatcher no longer carries an empty duplicate
copyItembranch that appeared while this batch was in flight (it never
shipped in a release; no user-visible effect). - The
lib/client.jsheader comment still readsv0.9.1(cosmetic drift; the
authoritative version ispackage.json, and this file is published exactly
as deployed). - Regression baseline at release time:
node --checkclean, the local
DOM-stub probes passed 14/14 (refresh) and 59/59 (history merge / fold /
cleanup / restore) checks.
v0.10.0
历史版本补建 Release(tag 复用仓库既有 tag);该版本已发布至 npm。
v0.9.0
历史版本补建 Release(tag 复用仓库既有 tag);该版本已发布至 npm。