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 +25 -0
- package/README.md +6 -3
- package/README_zh.md +6 -3
- package/assets/floating-panel.png +0 -0
- package/assets/icon-180.png +0 -0
- package/assets/icon.svg +19 -0
- package/assets/sidebar-panel.png +0 -0
- package/client.js +15 -30
- package/package.json +1 -1
- package/assets/panel.png +0 -0
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
|
-
[](https://github.com/haruri03/dsh-todo-ledger/releases) [](LICENSE)
|
|
3
|
+
[](https://github.com/haruri03/dsh-todo-ledger/releases) [](https://www.npmjs.com/package/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
|
-
|
|
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
|
-
[](https://github.com/haruri03/dsh-todo-ledger/releases) [](LICENSE)
|
|
3
|
+
[](https://github.com/haruri03/dsh-todo-ledger/releases) [](https://www.npmjs.com/package/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
|
-
|
|
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
|
package/assets/icon.svg
ADDED
|
@@ -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: '
|
|
19
|
-
error: '
|
|
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
|
|
130
|
-
slug: {
|
|
131
|
-
note: {
|
|
132
|
-
footer: { display: 'flex', justifyContent: 'space-between', gap: '8px',
|
|
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
|
|
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,
|
|
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: `
|
|
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:
|
|
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.
|
|
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
|