Skip to content

Releases: loyalchiiina/dsh-todo-float-ball

v0.14.7 — 官方主题皮肤 / 三球皮肤同步 / 强制字色 / 拖拽带修复

Choose a tag to compare

@github-actions github-actions released this 28 Oct 18:33

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

Choose a tag to compare

@loyalchiiina loyalchiiina released this 21 Oct 08:20

v0.14.6:与 npm 同版本发布(GitHub 源码 + npm 包 + 本 Release 三处对齐)。

v0.14.5 — first-tool gate: three defects fixed

Choose a tag to compare

@loyalchiiina loyalchiiina released this 18 Oct 04:35

Merges community PR #1 by @WanchengWildMan. Host-half only; lib/client.js is byte-identical to v0.14.4.

Fixed

  1. Counter deadlock (most severe) — toolCallsThisTurn === 1 denied a call that was never appended back, freezing the counter at 1 and rejecting every following call in the turn (74 rejections reported). Now dispatchedThisTurn > 1 counts only dispatched calls, and hasTodoWriteThisTurn unblocks as soon as a todo_write appears.
  2. run_code wrapper not recognised — only exec.name === "todo_write" was matched. Added callArgs.indexOf("todo_write") !== -1 as a fallback.
  3. 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

Choose a tag to compare

@loyalchiiina loyalchiiina released this 14 Sep 03:15

v0.12.1: shared skin catalog hintC contrast fixes (08/09/11/17).

v0.11.1 - typography cleanup (maintenance)

Choose a tag to compare

@loyalchiiina loyalchiiina released this 13 Sep 15:24

[0.11.1] - 2026-09-13

Maintenance release: typography cleanup only. No behaviour, API or UI change
of any kind — the shipped lib/client.js is 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 said v0.9.1 after the package had moved through
    0.10.0 and 0.11.0; it now reads v0.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
    inside renderList() — 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
    between renderList() and renderPinned(). 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 inside buildUI() — the file's original style.
  • Two-statement lines split (lib/client.js). Three lines each carried two
    statements: ui.ctitle.textContent = … followed by the ui.capCur caption
    update (Plan-A11), ui.pinSec = … followed by ui.capCur = …, and
    e.stopPropagation(); followed by var 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 of lib/client.js before and after (code tokens, string
    literals and comments kept separately) shows exactly two differences: the
    header version text and the deleted "" CSS element. node --check passes,
    and both regression harnesses are unchanged — dev-verify-refresh.cjs
    14/14 and dev-verify-merge.cjs 59/59.

v0.11.0 - pinned-panel parity + panel layout switch

Choose a tag to compare

@loyalchiiina loyalchiiina released this 13 Sep 13:52

[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 history row and no ♻️ Restore all hidden history row. 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 at snapLen first 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 /
    historyOpenOpen became 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 / pinnedOpenHistOpen maps 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 → legacy data-sid → the
    current session as the last fallback), so a control inside a pinned panel can
    never act on the current list. ACT_ALIAS maps 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.json version 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.js is 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
    copyItem branch that appeared while this batch was in flight (it never
    shipped in a release; no user-visible effect).
  • The lib/client.js header comment still reads v0.9.1 (cosmetic drift; the
    authoritative version is package.json, and this file is published exactly
    as deployed).
  • Regression baseline at release time: node --check clean, the local
    DOM-stub probes passed 14/14 (refresh) and 59/59 (history merge / fold /
    cleanup / restore) checks.

v0.10.0

Choose a tag to compare

@loyalchiiina loyalchiiina released this 21 Oct 08:23

历史版本补建 Release(tag 复用仓库既有 tag);该版本已发布至 npm。

v0.9.0

Choose a tag to compare

@loyalchiiina loyalchiiina released this 21 Oct 08:23

历史版本补建 Release(tag 复用仓库既有 tag);该版本已发布至 npm。