dsh-global-todo 0.6.5 → 0.6.6
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
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
## [0.6.6] — 2026-10-20
|
|
2
|
+
|
|
3
|
+
Both forms now look like forms.
|
|
4
|
+
|
|
5
|
+
- **Add form** gets real labels and a hint under each field instead of placeholder-only inputs
|
|
6
|
+
(a placeholder vanishes the moment you type, so it can never carry a rule), and the expanded
|
|
7
|
+
area is separated from the title row by a hairline.
|
|
8
|
+
- **Detail editor** gets the same treatment: labelled Title / Priority / Due / Description rows.
|
|
9
|
+
- **The 340px detail card no longer fights its own grid.** Meta rows stack to one column inside
|
|
10
|
+
the card, attachments wrap to their own lines, and the raw path is dropped there because the
|
|
11
|
+
card cannot show it next to two buttons — the title still carries it as a tooltip.
|
|
12
|
+
|
|
1
13
|
## [0.6.5] — 2026-10-20
|
|
2
14
|
|
|
3
15
|
The three loose ends the spec called out but the earlier passes left behind.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/lib/client.js
CHANGED
|
@@ -50,7 +50,7 @@ window.__ModuleLoader__.load({
|
|
|
50
50
|
* different mechanisms (restart vs. hot reload), so "which one am I looking
|
|
51
51
|
* at" needs an answer that the bundle itself carries.
|
|
52
52
|
*/
|
|
53
|
-
const UI_REV = '
|
|
53
|
+
const UI_REV = 'ui42'
|
|
54
54
|
/** Last language resolved for the shell; module-level so a fetch failure can be worded too. */
|
|
55
55
|
let activeLang = 'zh'
|
|
56
56
|
|
|
@@ -229,6 +229,10 @@ window.__ModuleLoader__.load({
|
|
|
229
229
|
'field.title': '要做什么?回车即存',
|
|
230
230
|
'field.description': '描述:验收标准、已知的坑…',
|
|
231
231
|
'field.links': '相关文档与地址,一行一个(/绝对路径 或 https://…)',
|
|
232
|
+
'field.tagsLabel': '标签',
|
|
233
|
+
'field.titleLabel': '标题',
|
|
234
|
+
'field.descriptionHint': '验收标准、已知的坑都可以写在这里。',
|
|
235
|
+
'field.linksHint': '一行一个:绝对路径或 https:// 链接。',
|
|
232
236
|
'field.tags': '标签,逗号分隔',
|
|
233
237
|
'field.priority': '优先级',
|
|
234
238
|
'field.due': '截止时间',
|
|
@@ -487,6 +491,10 @@ window.__ModuleLoader__.load({
|
|
|
487
491
|
'field.title': 'What needs doing? Enter to save',
|
|
488
492
|
'field.description': 'Description: acceptance, known traps…',
|
|
489
493
|
'field.links': 'Documents and links, one per line (/abs/path or https://…)',
|
|
494
|
+
'field.tagsLabel': 'Tags',
|
|
495
|
+
'field.titleLabel': 'Title',
|
|
496
|
+
'field.descriptionHint': 'Acceptance criteria and known traps belong here.',
|
|
497
|
+
'field.linksHint': 'One per line: an absolute path or an https:// link.',
|
|
490
498
|
'field.tags': 'Tags, comma separated',
|
|
491
499
|
'field.priority': 'Priority',
|
|
492
500
|
'field.due': 'Due',
|
|
@@ -976,6 +984,19 @@ window.__ModuleLoader__.load({
|
|
|
976
984
|
.gt-card { background: var(--dsw-alias-bg-layer-1); border: 1px solid var(--dsw-alias-border-l1);
|
|
977
985
|
border-radius: 12px; padding: 12px 14px; }
|
|
978
986
|
.gt-new { display: flex; flex-direction: column; gap: 10px; }
|
|
987
|
+
.gt-new-fields { display: flex; flex-direction: column; gap: 12px; padding-top: 4px;
|
|
988
|
+
border-top: 1px solid var(--dsw-alias-border-l1); }
|
|
989
|
+
.gt-new-fields .gt-textarea { min-height: 64px; }
|
|
990
|
+
.gt-new-fields .gt-field-row { display: grid; grid-template-columns: minmax(0, 1fr) 190px; gap: 12px; }
|
|
991
|
+
.gt-edit-meta { display: grid; grid-template-columns: minmax(0, 1fr) 190px; gap: 12px; align-items: start; }
|
|
992
|
+
/* The 340px card cannot hold the two-column meta row or a path beside two buttons:
|
|
993
|
+
stack them there, and let attachments wrap onto their own lines. */
|
|
994
|
+
.gt-root[data-wide="1"][data-wide-detail="1"] .gt-detail .gt-edit-meta,
|
|
995
|
+
.gt-root[data-wide="1"][data-wide-detail="1"] .gt-detail .gt-new-fields .gt-field-row {
|
|
996
|
+
grid-template-columns: minmax(0, 1fr); }
|
|
997
|
+
.gt-root[data-wide="1"][data-wide-detail="1"] .gt-detail .gt-link { flex-wrap: wrap; row-gap: 4px; }
|
|
998
|
+
.gt-root[data-wide="1"][data-wide-detail="1"] .gt-detail .gt-link .gt-mono { display: none; }
|
|
999
|
+
.gt-root[data-wide="1"][data-wide-detail="1"] .gt-detail .gt-link-main { flex: 1 1 100%; }
|
|
979
1000
|
.gt-row { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
|
|
980
1001
|
.gt-input, .gt-select, .gt-textarea { background: var(--dsw-alias-bg-base); color: var(--dsw-alias-label-primary);
|
|
981
1002
|
border: 1px solid var(--dsw-alias-border-l1); border-radius: 8px; padding: 7px 10px; font: inherit; }
|
|
@@ -1905,34 +1926,59 @@ button.gt-chip[data-on="1"] { color: var(--dsw-alias-label-primary); border-colo
|
|
|
1905
1926
|
h('div', { className: 'gt-section-title' }, t('detail.edit')),
|
|
1906
1927
|
h(
|
|
1907
1928
|
'div',
|
|
1908
|
-
{ className: 'gt-
|
|
1909
|
-
h('
|
|
1910
|
-
h(Segmented, {
|
|
1911
|
-
label: t('field.priority'),
|
|
1912
|
-
value: draft.priority,
|
|
1913
|
-
onChange: (priority) => setDraft({ ...draft, priority }),
|
|
1914
|
-
options: [
|
|
1915
|
-
{ value: 'low', label: t('priority.low') },
|
|
1916
|
-
{ value: 'normal', label: t('priority.normal') },
|
|
1917
|
-
{ value: 'high', label: t('priority.high') },
|
|
1918
|
-
{ value: 'urgent', label: t('priority.urgent') },
|
|
1919
|
-
],
|
|
1920
|
-
}),
|
|
1929
|
+
{ className: 'gt-field' },
|
|
1930
|
+
h('label', { className: 'gt-field-label', htmlFor: 'gt-edit-title' }, t('field.titleLabel')),
|
|
1921
1931
|
h('input', {
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
value: draft.
|
|
1925
|
-
|
|
1926
|
-
|
|
1932
|
+
id: 'gt-edit-title',
|
|
1933
|
+
className: 'gt-input',
|
|
1934
|
+
value: draft.title,
|
|
1935
|
+
onChange: (event) => setDraft({ ...draft, title: event.target.value }),
|
|
1936
|
+
}),
|
|
1937
|
+
),
|
|
1938
|
+
h(
|
|
1939
|
+
'div',
|
|
1940
|
+
{ className: 'gt-field-row gt-edit-meta' },
|
|
1941
|
+
h(
|
|
1942
|
+
'div',
|
|
1943
|
+
{ className: 'gt-field' },
|
|
1944
|
+
h('span', { className: 'gt-field-label' }, t('field.priority')),
|
|
1945
|
+
h(Segmented, {
|
|
1946
|
+
label: t('field.priority'),
|
|
1947
|
+
value: draft.priority,
|
|
1948
|
+
onChange: (priority) => setDraft({ ...draft, priority }),
|
|
1949
|
+
options: [
|
|
1950
|
+
{ value: 'urgent', label: t('priority.urgent') },
|
|
1951
|
+
{ value: 'high', label: t('priority.high') },
|
|
1952
|
+
{ value: 'normal', label: t('priority.normal') },
|
|
1953
|
+
{ value: 'low', label: t('priority.low') },
|
|
1954
|
+
],
|
|
1955
|
+
}),
|
|
1956
|
+
),
|
|
1957
|
+
h(
|
|
1958
|
+
'div',
|
|
1959
|
+
{ className: 'gt-field' },
|
|
1960
|
+
h('label', { className: 'gt-field-label', htmlFor: 'gt-edit-due' }, t('field.due')),
|
|
1961
|
+
h('input', {
|
|
1962
|
+
id: 'gt-edit-due',
|
|
1963
|
+
className: 'gt-input',
|
|
1964
|
+
type: 'datetime-local',
|
|
1965
|
+
value: draft.due,
|
|
1966
|
+
onChange: (event) => setDraft({ ...draft, due: event.target.value }),
|
|
1967
|
+
}),
|
|
1968
|
+
),
|
|
1969
|
+
),
|
|
1970
|
+
h(
|
|
1971
|
+
'div',
|
|
1972
|
+
{ className: 'gt-field' },
|
|
1973
|
+
h('label', { className: 'gt-field-label', htmlFor: 'gt-edit-desc' }, t('detail.description')),
|
|
1974
|
+
h('textarea', {
|
|
1975
|
+
id: 'gt-edit-desc',
|
|
1976
|
+
className: 'gt-textarea',
|
|
1977
|
+
value: draft.description,
|
|
1978
|
+
placeholder: t('field.description'),
|
|
1979
|
+
onChange: (event) => setDraft({ ...draft, description: event.target.value }),
|
|
1927
1980
|
}),
|
|
1928
1981
|
),
|
|
1929
|
-
h('textarea', {
|
|
1930
|
-
className: 'gt-textarea',
|
|
1931
|
-
value: draft.description,
|
|
1932
|
-
placeholder: t('field.description'),
|
|
1933
|
-
'aria-label': t('detail.description'),
|
|
1934
|
-
onChange: (event) => setDraft({ ...draft, description: event.target.value }),
|
|
1935
|
-
}),
|
|
1936
1982
|
dirty
|
|
1937
1983
|
? h(
|
|
1938
1984
|
'div',
|
|
@@ -3555,31 +3601,65 @@ button.gt-chip[data-on="1"] { color: var(--dsw-alias-label-primary); border-colo
|
|
|
3555
3601
|
more
|
|
3556
3602
|
? h(
|
|
3557
3603
|
'div',
|
|
3558
|
-
{ className: 'gt-new' },
|
|
3559
|
-
h('textarea', {
|
|
3560
|
-
className: 'gt-textarea',
|
|
3561
|
-
placeholder: t('field.description'),
|
|
3562
|
-
value: draft.description,
|
|
3563
|
-
'aria-label': t('detail.description'),
|
|
3564
|
-
onChange: (event) => setDraft({ ...draft, description: event.target.value }),
|
|
3565
|
-
}),
|
|
3566
|
-
h('textarea', {
|
|
3567
|
-
className: 'gt-textarea',
|
|
3568
|
-
placeholder: t('field.links'),
|
|
3569
|
-
value: draft.links,
|
|
3570
|
-
'aria-label': t('detail.links'),
|
|
3571
|
-
onChange: (event) => setDraft({ ...draft, links: event.target.value }),
|
|
3572
|
-
}),
|
|
3604
|
+
{ className: 'gt-new-fields' },
|
|
3573
3605
|
h(
|
|
3574
3606
|
'div',
|
|
3575
|
-
{ className: 'gt-
|
|
3576
|
-
h('
|
|
3577
|
-
|
|
3578
|
-
|
|
3579
|
-
|
|
3580
|
-
|
|
3581
|
-
|
|
3607
|
+
{ className: 'gt-field' },
|
|
3608
|
+
h('label', { className: 'gt-field-label', htmlFor: 'gt-new-desc' }, t('detail.description')),
|
|
3609
|
+
h('textarea', {
|
|
3610
|
+
id: 'gt-new-desc',
|
|
3611
|
+
className: 'gt-textarea',
|
|
3612
|
+
placeholder: t('field.description'),
|
|
3613
|
+
value: draft.description,
|
|
3614
|
+
onChange: (event) => setDraft({ ...draft, description: event.target.value }),
|
|
3582
3615
|
}),
|
|
3616
|
+
h('span', { className: 'gt-hint' }, t('field.descriptionHint')),
|
|
3617
|
+
),
|
|
3618
|
+
h(
|
|
3619
|
+
'div',
|
|
3620
|
+
{ className: 'gt-field' },
|
|
3621
|
+
h('label', { className: 'gt-field-label', htmlFor: 'gt-new-links' }, t('detail.links')),
|
|
3622
|
+
h('textarea', {
|
|
3623
|
+
id: 'gt-new-links',
|
|
3624
|
+
className: 'gt-textarea',
|
|
3625
|
+
placeholder: t('field.links'),
|
|
3626
|
+
value: draft.links,
|
|
3627
|
+
onChange: (event) => setDraft({ ...draft, links: event.target.value }),
|
|
3628
|
+
}),
|
|
3629
|
+
h('span', { className: 'gt-hint' }, t('field.linksHint')),
|
|
3630
|
+
),
|
|
3631
|
+
h(
|
|
3632
|
+
'div',
|
|
3633
|
+
{ className: 'gt-field-row' },
|
|
3634
|
+
h(
|
|
3635
|
+
'div',
|
|
3636
|
+
{ className: 'gt-field' },
|
|
3637
|
+
h('label', { className: 'gt-field-label', htmlFor: 'gt-new-tags' }, t('field.tagsLabel')),
|
|
3638
|
+
h('input', {
|
|
3639
|
+
id: 'gt-new-tags',
|
|
3640
|
+
className: 'gt-input gt-input-sm',
|
|
3641
|
+
placeholder: t('field.tags'),
|
|
3642
|
+
value: draft.tags,
|
|
3643
|
+
onChange: (event) => setDraft({ ...draft, tags: event.target.value }),
|
|
3644
|
+
}),
|
|
3645
|
+
),
|
|
3646
|
+
h(
|
|
3647
|
+
'div',
|
|
3648
|
+
{ className: 'gt-field' },
|
|
3649
|
+
h('label', { className: 'gt-field-label', htmlFor: 'gt-new-due' }, t('field.due')),
|
|
3650
|
+
h('input', {
|
|
3651
|
+
id: 'gt-new-due',
|
|
3652
|
+
className: 'gt-input gt-input-sm',
|
|
3653
|
+
type: 'datetime-local',
|
|
3654
|
+
value: draft.due,
|
|
3655
|
+
onChange: (event) => setDraft({ ...draft, due: event.target.value }),
|
|
3656
|
+
}),
|
|
3657
|
+
),
|
|
3658
|
+
),
|
|
3659
|
+
h(
|
|
3660
|
+
'div',
|
|
3661
|
+
{ className: 'gt-field' },
|
|
3662
|
+
h('span', { className: 'gt-field-label' }, t('field.priority')),
|
|
3583
3663
|
h(Segmented, {
|
|
3584
3664
|
label: t('field.priority'),
|
|
3585
3665
|
value: draft.priority,
|
|
@@ -3591,14 +3671,6 @@ button.gt-chip[data-on="1"] { color: var(--dsw-alias-label-primary); border-colo
|
|
|
3591
3671
|
{ value: 'low', label: t('priority.low') },
|
|
3592
3672
|
],
|
|
3593
3673
|
}),
|
|
3594
|
-
h('input', {
|
|
3595
|
-
className: 'gt-input gt-input-sm',
|
|
3596
|
-
type: 'datetime-local',
|
|
3597
|
-
value: draft.due,
|
|
3598
|
-
title: t('field.due'),
|
|
3599
|
-
'aria-label': t('field.due'),
|
|
3600
|
-
onChange: (event) => setDraft({ ...draft, due: event.target.value }),
|
|
3601
|
-
}),
|
|
3602
3674
|
),
|
|
3603
3675
|
)
|
|
3604
3676
|
: null,
|
package/lib/index.js
CHANGED
|
@@ -36,7 +36,7 @@ import { createStore, resolveStorePath } from './store.js'
|
|
|
36
36
|
import { createTools } from './tools.js'
|
|
37
37
|
|
|
38
38
|
/** Must equal `package.json`'s version; `npm run check` enforces that. */
|
|
39
|
-
export const VERSION = '0.6.
|
|
39
|
+
export const VERSION = '0.6.6'
|
|
40
40
|
|
|
41
41
|
/** Plugin id. Also the Loader row id in `cordis.patch.yml`. */
|
|
42
42
|
export const name = 'dsh-global-todo'
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-global-todo",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.6",
|
|
4
4
|
"icon": "./docs/icon.svg",
|
|
5
5
|
"description": "Global, cross-session todos for DeepSeek Harness: one list owned by the human and the agent together, with creation time, attached documents and links, and one-click hand-off to an agent session. 全局待办:跨会话一份清单,记录加入时间,可挂文档与地址,可一键交给 Agent 继续干。",
|
|
6
6
|
"type": "module",
|