dsh-todo-ledger 0.3.0 → 0.3.1

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 CHANGED
@@ -4,6 +4,31 @@ All notable changes to this project are documented here. The format follows
4
4
  [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project adheres to
5
5
  [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [0.3.1] - 2026-10-24
8
+
9
+ A follow-up on the floating window: its surface now matches the host's own floating panels, and the
10
+ status colours are the ones the panel has always used.
11
+
12
+ ### Fixed
13
+
14
+ - **The window surface no longer reads as a lighter grey than everything around it.** It used
15
+ `--dsw-alias-bg-overlay`, which resolves to a mid grey in the dark theme. It now takes the raised
16
+ layer the host's own floating panels use: `--dsw-alias-bg-layer-1`, a `--dsw-alias-border-l2`
17
+ border, a 14px radius and the same two-layer shadow.
18
+
19
+ ### Changed
20
+
21
+ - **Status colours are the previous palette again** — blue in progress, slate to do, violet awaiting
22
+ review, red blocked. Only the accept action and error text use the host state tokens.
23
+ - Count chips and task rows stay on `--dsw-alias-bg-layer-2` with a `--dsw-alias-border-l1` border,
24
+ and section titles, slugs and the footer use `--dsw-alias-label-secondary`.
25
+
26
+ ### Added
27
+
28
+ - A storefront icon (`assets/icon-180.png`, rendered from `assets/icon.svg`) and `screenshots.json`
29
+ declaring the sidebar and floating-window captures.
30
+ - Install-from-npm instructions in both READMEs, plus the npm version badge.
31
+
7
32
  ## [0.3.0] - 2026-10-24
8
33
 
9
34
  The release that gives the ledger a window of its own, and keeps every view on the session you are
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # dsh-todo-ledger
2
2
 
3
- [![release](https://img.shields.io/github/v/release/haruri03/dsh-todo-ledger?sort=semver)](https://github.com/haruri03/dsh-todo-ledger/releases) [![license](https://img.shields.io/github/license/haruri03/dsh-todo-ledger)](LICENSE)
3
+ [![release](https://img.shields.io/github/v/release/haruri03/dsh-todo-ledger?sort=semver)](https://github.com/haruri03/dsh-todo-ledger/releases) [![npm](https://img.shields.io/npm/v/dsh-todo-ledger)](https://www.npmjs.com/package/dsh-todo-ledger) [![license](https://img.shields.io/github/license/haruri03/dsh-todo-ledger)](LICENSE)
4
4
 
5
5
  [English](README.md) | [中文](README_zh.md)
6
6
 
@@ -116,7 +116,7 @@ Every tool accepts an optional `root`, so it can operate on repositories outside
116
116
 
117
117
  ## Sidebar panel
118
118
 
119
- ![The ledger panel in the sidebar: in progress, to do, awaiting review with an Accept button, and blocked](assets/panel.png)
119
+ <img src="assets/sidebar-panel.png" width="420" alt="The sidebar ledger panel: in progress, to do, awaiting review with an Accept button, and blocked">
120
120
 
121
121
  The plugin also serves a sidebar panel for the ledger of the current session working directory:
122
122
  browsing is read-only, and the panel's only action is accepting a review task. It is opt-in: nothing is injected into the layout until a user opens the panel from the
@@ -141,7 +141,10 @@ A book launcher below the composer opens a movable, resizable Todo Ledger floati
141
141
  its header to move it and drag the bottom-right grip to resize it. It is an additional way to view
142
142
  the ledger; the original right-sidebar panel remains available. The floating panel's labels follow
143
143
  the host locale, and its body starts directly with the status counts because the window header
144
- already names it.
144
+ already names it. Every surface, border and state colour comes from the host theme tokens, so the
145
+ window follows the active theme — light, dark or a custom one — instead of carrying its own palette.
146
+
147
+ <img src="assets/floating-panel.png" width="360" alt="The floating ledger window: the same four sections, with the header used to drag it and the bottom-right grip used to resize it">
145
148
 
146
149
  Each status group is collapsible: click a group header to fold it. Clicking a status count expands
147
150
  that group and scrolls its header to the top of the list, which is how a long queue stays
package/README_zh.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # dsh-todo-ledger
2
2
 
3
- [![release](https://img.shields.io/github/v/release/haruri03/dsh-todo-ledger?sort=semver)](https://github.com/haruri03/dsh-todo-ledger/releases) [![license](https://img.shields.io/github/license/haruri03/dsh-todo-ledger)](LICENSE)
3
+ [![release](https://img.shields.io/github/v/release/haruri03/dsh-todo-ledger?sort=semver)](https://github.com/haruri03/dsh-todo-ledger/releases) [![npm](https://img.shields.io/npm/v/dsh-todo-ledger)](https://www.npmjs.com/package/dsh-todo-ledger) [![license](https://img.shields.io/github/license/haruri03/dsh-todo-ledger)](LICENSE)
4
4
 
5
5
  [English](README.md) | [中文](README_zh.md)
6
6
 
@@ -106,7 +106,7 @@ _todo/
106
106
 
107
107
  ## 侧栏面板
108
108
 
109
- ![侧栏里的账本面板:进行中、待办、待复核(带「通过」按钮)、阻塞四区](assets/panel.png)
109
+ <img src="assets/sidebar-panel.png" width="420" alt="侧栏里的账本面板:进行中、待办、待复核(带「通过」按钮)、阻塞四区">
110
110
 
111
111
  插件还会为当前会话工作目录的账本提供一个侧栏面板:浏览是只读的,面板上唯一的动作是「通过」一个待复核任务。
112
112
  它是按需打开的:在右侧栏的引导胶囊(以插件名命名)点开之前,布局里不会多出任何东西;点开后作为一个侧栏标签页渲染。
@@ -124,7 +124,10 @@ _todo/
124
124
 
125
125
  输入框下方的书本入口可打开可移动、可缩放的 Todo Ledger 浮动面板:拖动标题栏移动窗口,拖动右下角
126
126
  握把调整大小。这是查看账本的另一种方式,原有右侧栏面板仍可使用;浮动面板的文案跟随宿主语言,
127
- 面板正文直接从状态计数开始,因为窗口标题栏已经写了名称。
127
+ 面板正文直接从状态计数开始,因为窗口标题栏已经写了名称。所有背景、边框与状态颜色都取自宿主
128
+ 主题 token,所以窗口会跟随当前主题(亮色、暗色或自定义主题),不自带一套配色。
129
+
130
+ <img src="assets/floating-panel.png" width="360" alt="浮动面板:同样四区,标题栏可拖动移动窗口,右下角握把可缩放">
128
131
 
129
132
  浏览器本地存储保存浮动面板经视口边界限制后的窗口框(位置与尺寸),并在再次打开时恢复。
130
133
  显示状态和账本内容不会保存在本地存储中:打开面板时读取当前账本,而不是恢复上次的内容。
Binary file
Binary file
@@ -0,0 +1,19 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="180" height="180" viewBox="0 0 180 180">
2
+ <defs>
3
+ <linearGradient id="bg" x1="0" y1="0" x2="0" y2="1">
4
+ <stop offset="0" stop-color="#211f2b"/>
5
+ <stop offset="1" stop-color="#121118"/>
6
+ </linearGradient>
7
+ </defs>
8
+ <rect x="8" y="8" width="164" height="164" rx="36" fill="url(#bg)"/>
9
+ <rect x="8.75" y="8.75" width="162.5" height="162.5" rx="35.25" fill="none" stroke="#3a3747" stroke-width="1.5"/>
10
+ <g transform="translate(38,34) scale(4.3333)" fill="none" stroke="#f9fafb" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
11
+ <path d="M12 6c-2.4-1.5-5.3-1.8-9-1v13c3.7-.8 6.6-.5 9 1 2.4-1.5 5.3-1.8 9-1V5c-3.7-.8-6.6-.5-9 1Z"/>
12
+ <path d="M12 6v13"/>
13
+ </g>
14
+ <g fill="#a78bfa">
15
+ <circle cx="70" cy="141" r="3.4"/>
16
+ <circle cx="90" cy="141" r="3.4"/>
17
+ <circle cx="110" cy="141" r="3.4"/>
18
+ </g>
19
+ </svg>
Binary file
package/client.js CHANGED
@@ -15,18 +15,10 @@ window.__ModuleLoader__.load({
15
15
  todo: '#94a3b8',
16
16
  review: '#a855f7',
17
17
  blocked: '#ef4444',
18
- accept: '#22c55e',
19
- error: '#ef4444',
18
+ accept: 'var(--dsw-alias-state-success-primary)',
19
+ error: 'var(--dsw-alias-state-error-primary)',
20
20
  };
21
21
 
22
- function tint(hex, alpha) {
23
- const value = hex.replace('#', '');
24
- const r = parseInt(value.slice(0, 2), 16);
25
- const g = parseInt(value.slice(2, 4), 16);
26
- const b = parseInt(value.slice(4, 6), 16);
27
- return `rgba(${r}, ${g}, ${b}, ${alpha})`;
28
- }
29
-
30
22
  const LOCALE_NAMESPACE = 'todo-ledger-panel';
31
23
  const MESSAGES = {
32
24
  zh: {
@@ -114,22 +106,22 @@ window.__ModuleLoader__.load({
114
106
  shell: { display: 'flex', flexDirection: 'column', gap: '8px', padding: '10px 12px', minHeight: 0, minWidth: 0, flex: '1 1 auto', fontSize: '12px', color: 'var(--dsw-alias-label-primary)' },
115
107
  header: { display: 'flex', alignItems: 'center', gap: '8px', flexShrink: 0 },
116
108
  counts: { display: 'flex', gap: '6px', flexWrap: 'wrap', flexShrink: 0, fontVariantNumeric: 'tabular-nums' },
117
- chip: { padding: '1px 6px', borderRadius: '999px', background: 'var(--dsw-alias-bg-layer-2)' },
109
+ chip: { padding: '1px 6px', borderRadius: '999px', background: 'var(--dsw-alias-bg-layer-2)', border: '1px solid var(--dsw-alias-border-l1)' },
118
110
  body: { display: 'flex', flexDirection: 'column', gap: '10px', flex: '1 1 auto', minHeight: 0, overflowY: 'auto', overflowX: 'hidden', overscrollBehavior: 'contain', scrollbarGutter: 'stable', paddingRight: 4 },
119
- sectionTitle: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: '8px', textTransform: 'uppercase', letterSpacing: '.04em', fontSize: '10px', fontWeight: 600 },
111
+ sectionTitle: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: '8px', textTransform: 'uppercase', letterSpacing: '.04em', fontSize: '10px', fontWeight: 600, color: 'var(--dsw-alias-label-secondary)' },
120
112
  sectionToggle: { width: '100%', background: 'transparent', border: 0, padding: 0, font: 'inherit', cursor: 'pointer', textAlign: 'left' },
121
113
  chevron: { width: '10px', flexShrink: 0, opacity: 0.8 },
122
114
  sectionLabel: { display: 'flex', alignItems: 'center', gap: '5px', flex: '1 1 auto', minWidth: 0 },
123
115
  dot: { width: '7px', height: '7px', borderRadius: '50%', display: 'inline-block' },
124
- countPill: { padding: '0 6px', borderRadius: '999px', fontSize: '10px', fontWeight: 600 },
116
+ countPill: { padding: '0 6px', borderRadius: '999px', fontSize: '10px', fontWeight: 600, background: 'var(--dsw-alias-bg-layer-2)' },
125
117
  list: { listStyle: 'none', margin: 0, padding: 0, display: 'flex', flexDirection: 'column', gap: '4px' },
126
- item: { display: 'flex', flexDirection: 'column', gap: '1px', padding: '3px 6px', borderRadius: '6px', background: 'var(--dsw-alias-bg-layer-2)' },
118
+ item: { display: 'flex', flexDirection: 'column', gap: '1px', padding: '3px 6px', borderRadius: '6px', background: 'var(--dsw-alias-bg-layer-2)', border: '1px solid var(--dsw-alias-border-l1)' },
127
119
  itemTitle: { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' },
128
120
  itemMeta: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: '6px' },
129
- accept: { background: 'transparent', border: '1px solid currentColor', borderRadius: '999px', padding: '0 8px', color: 'inherit', font: 'inherit', fontSize: '10px', cursor: 'pointer', opacity: 0.85 },
130
- slug: { opacity: 0.6, fontSize: '10px', fontFamily: 'var(--dsw-alias-font-mono, ui-monospace, monospace)' },
131
- note: { opacity: 0.72, padding: '6px 0', flexShrink: 0 },
132
- footer: { display: 'flex', justifyContent: 'space-between', gap: '8px', opacity: 0.68, fontSize: '10px', flexShrink: 0, paddingRight: 16 },
121
+ accept: { background: 'transparent', border: '1px solid var(--dsw-alias-border-l1)', borderRadius: '999px', padding: '0 8px', font: 'inherit', fontSize: '10px', cursor: 'pointer' },
122
+ slug: { color: 'var(--dsw-alias-label-secondary)', fontSize: '10px', fontFamily: 'var(--dsw-alias-font-mono, ui-monospace, monospace)' },
123
+ note: { color: 'var(--dsw-alias-label-secondary)', padding: '6px 0', flexShrink: 0 },
124
+ footer: { display: 'flex', justifyContent: 'space-between', gap: '8px', color: 'var(--dsw-alias-label-secondary)', fontSize: '10px', flexShrink: 0, paddingRight: 16 },
133
125
  path: { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', direction: 'rtl', textAlign: 'left' },
134
126
  action: { background: 'transparent', border: '0', padding: 0, color: 'inherit', font: 'inherit', textDecoration: 'underline', cursor: 'pointer' },
135
127
  };
@@ -353,11 +345,11 @@ window.__ModuleLoader__.load({
353
345
  'aria-controls': `todo-ledger-list-${status}`,
354
346
  title: collapsed === true ? translate('expandSection') : translate('collapseSection'),
355
347
  onClick: () => onToggle(status),
356
- style: { ...styles.sectionTitle, ...styles.sectionToggle, color: tone },
348
+ style: { ...styles.sectionTitle, ...styles.sectionToggle },
357
349
  },
358
350
  h('span', { style: styles.chevron }, collapsed === true ? '▸' : '▾'),
359
351
  h('span', { style: styles.sectionLabel }, h('span', { style: { ...styles.dot, background: tone } }), translate(status)),
360
- h('span', { style: { ...styles.countPill, background: tint(tone, 0.16), color: tone } }, String(tasks.length)),
352
+ h('span', { style: { ...styles.countPill, color: tone } }, String(tasks.length)),
361
353
  ),
362
354
  collapsed === true
363
355
  ? null
@@ -369,7 +361,7 @@ window.__ModuleLoader__.load({
369
361
  'li',
370
362
  {
371
363
  key: task.slug,
372
- style: { ...styles.item, borderLeft: `3px solid ${tone}`, background: tint(tone, 0.08) },
364
+ style: { ...styles.item, borderLeft: `2px solid ${tone}` },
373
365
  title: `${task.title} · ${task.slug}`,
374
366
  },
375
367
  h('span', { style: styles.itemTitle }, task.title),
@@ -382,12 +374,7 @@ window.__ModuleLoader__.load({
382
374
  'button',
383
375
  {
384
376
  type: 'button',
385
- style: {
386
- ...styles.accept,
387
- borderColor: tint(TONE.accept, 0.55),
388
- background: tint(TONE.accept, pending === true ? 0.08 : 0.16),
389
- color: TONE.accept,
390
- },
377
+ style: { ...styles.accept, color: TONE.accept, opacity: pending === true ? 0.6 : 1 },
391
378
  disabled: pending === true,
392
379
  onClick: () => onAccept(task.slug),
393
380
  },
@@ -484,9 +471,7 @@ window.__ModuleLoader__.load({
484
471
  key: status,
485
472
  style: {
486
473
  ...styles.chip,
487
- background: tint(TONE[status] ?? TONE.todo, 0.16),
488
474
  color: TONE[status] ?? TONE.todo,
489
- border: `1px solid ${tint(TONE[status] ?? TONE.todo, 0.4)}`,
490
475
  cursor: 'pointer',
491
476
  font: 'inherit',
492
477
  fontSize: '12px',
@@ -636,7 +621,7 @@ window.__ModuleLoader__.load({
636
621
  }, h('section', {
637
622
  role: 'region',
638
623
  'aria-label': translate('title'),
639
- style: { position: 'absolute', left: layout.x, top: layout.y, width: layout.width, height: layout.height, display: 'flex', flexDirection: 'column', overflow: 'hidden', pointerEvents: 'auto', borderRadius: 10, border: '1px solid var(--dsw-alias-border-l1)', background: 'var(--dsw-alias-bg-overlay)', color: 'var(--dsw-alias-label-primary)', boxShadow: '0 12px 32px rgba(0,0,0,.24)' },
624
+ style: { position: 'absolute', left: layout.x, top: layout.y, width: layout.width, height: layout.height, display: 'flex', flexDirection: 'column', overflow: 'hidden', pointerEvents: 'auto', borderRadius: 14, border: '1px solid var(--dsw-alias-border-l2)', background: 'var(--dsw-alias-bg-layer-1)', color: 'var(--dsw-alias-label-primary)', boxShadow: '0 12px 40px rgba(0, 0, 0, 0.28), 0 2px 8px rgba(0, 0, 0, 0.12)' },
640
625
  }, h('div', {
641
626
  style: { display: 'flex', alignItems: 'center', gap: 8, padding: '8px 10px', borderBottom: '1px solid var(--dsw-alias-border-l1)' },
642
627
  }, h('div', {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-todo-ledger",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "todo-ledger for DeepSeek Harness: resident prompt section plus native tools that keep authoritative task state and cross-session context in the repo's ledger directory — `_todo/` preferred, legacy `todo/` still supported (todo.md + tasks.md + tasks/*.md + archived/ + context/).",
5
5
  "type": "module",
6
6
  "license": "MIT",
package/assets/panel.png DELETED
Binary file