dsh-global-todo 0.16.3 → 0.17.0
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 +30 -0
- package/README.md +43 -24
- package/README.zh.md +34 -19
- package/docs/DESIGN.md +21 -1
- package/docs/FAQ.md +4 -0
- package/docs/QUICKSTART.md +3 -0
- package/docs/ROADMAP.md +2 -1
- package/lib/index.js +3 -2
- package/lib/tools.js +11 -2
- package/locale/en.json +1 -1
- package/locale/zh.json +1 -1
- package/package.json +7 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,33 @@
|
|
|
1
|
+
## [0.17.0] — 2026-10-24
|
|
2
|
+
|
|
3
|
+
Documentation and prompt text: the confirmation gate is the headline now, not the third bullet.
|
|
4
|
+
Nothing in the write path changed — no field, no route, no validation rule — so upgrading is safe
|
|
5
|
+
for existing stores.
|
|
6
|
+
|
|
7
|
+
- **A release at all, because npm freezes documentation at publish time.** The README, `docs/` and
|
|
8
|
+
the plugin-page locales in the tarball are a snapshot; leading with the gate only reaches the npm
|
|
9
|
+
page and the installed docs through a version.
|
|
10
|
+
|
|
11
|
+
- **Both READMEs lead with the gate.** It is claim 01 (was 03) and it names **both doors**: an
|
|
12
|
+
agent's `global_todo_done` (or a status change to `done`), and the host closing a dispatched todo
|
|
13
|
+
after a clean turn. A new early section — 「完成确认:没有一条记录能自己变成「完成」」 / *Confirmation:
|
|
14
|
+
no record finishes itself* — carries the two-door table, the two answers and the clean-turn rule;
|
|
15
|
+
the old 0.7 subsection and its row are gone rather than duplicated, and the comparison table gained
|
|
16
|
+
a *Finishing* row.
|
|
17
|
+
- **The landing page, the npm description and the plugin-page locales open with the same sentence**:
|
|
18
|
+
page title, `meta`/`og`/`twitter` descriptions, hero lede, claim 01 (was 03), and the compare
|
|
19
|
+
table. `package.json` gained `human-in-the-loop`, `confirmation` and `approval`, which is how
|
|
20
|
+
someone looking for this actually searches.
|
|
21
|
+
- **`docs/DESIGN.md` documents `review` for the first time.** It lived in `lib/model.js` and in no
|
|
22
|
+
design doc: there is now a *Done is a claim, from either door* section, a `review` field row, and
|
|
23
|
+
the `links` row finally admits `kind: 'image'` (0.15 shipped it).
|
|
24
|
+
- **The model-facing half says it too.** The `global_todo_done` and `global_todo_update`
|
|
25
|
+
descriptions call a completion a claim; the done result prints 「这条挂在「待确认」…」; `todoLine()`
|
|
26
|
+
marks pending records in every rendering, so the model cannot read one as settled; and the injected
|
|
27
|
+
guidance tells the model to reply 「已标记完成,等你确认」 instead of 「已经结束了」. The stale
|
|
28
|
+
「插件也会在你安静下来后自动划掉」 line is gone — that idle-window heuristic was removed in 0.3.0
|
|
29
|
+
and the sentence outlived it by thirteen minor versions, telling the model the opposite of the rule.
|
|
30
|
+
|
|
1
31
|
## [0.16.3] — 2026-10-23
|
|
2
32
|
|
|
3
33
|
Documentation release: the npm page finally shows the current install instructions.
|
package/README.md
CHANGED
|
@@ -5,14 +5,17 @@
|
|
|
5
5
|
**A cross-session todo list for DeepSeek Harness: one file you own, written by you and your
|
|
6
6
|
agent, and handed to a conversation in one click.**
|
|
7
7
|
|
|
8
|
-
Three things it does that a session-local plan cannot:
|
|
9
|
-
|
|
10
|
-
1. **
|
|
8
|
+
Three things it does that a session-local plan cannot — the first is the one it is known for:
|
|
9
|
+
|
|
10
|
+
1. **An agent saying "done" is a claim, whichever door it comes through.** Its own report — the
|
|
11
|
+
tool call, a status change — and the host closing the todo after a clean turn are both just
|
|
12
|
+
claims: the record waits in **待确认 / Needs review** until a person confirms it, or sends it
|
|
13
|
+
back with its completion cleared. A session-local plan never asks that question: the agent
|
|
14
|
+
rewrites the table and the work is "finished".
|
|
15
|
+
2. **One JSON file is the whole list.** `cat`, diff, commit it, put it on a NAS, carry it to
|
|
11
16
|
another machine. Nothing lives inside a session log.
|
|
12
|
-
|
|
17
|
+
3. **Hand-off is a button, not a paragraph.** Four modes, the working directory checked, and
|
|
13
18
|
the todo's own **steps** arrive as a numbered plan.
|
|
14
|
-
3. **An agent saying "done" is a claim.** It lands in **待确认 / Needs review** until a person
|
|
15
|
-
confirms it — or sends it back to the list.
|
|
16
19
|
|
|
17
20
|

|
|
18
21
|
|
|
@@ -39,14 +42,44 @@ one record:
|
|
|
39
42
|
| When it was added | not tracked | **`createdAt`, immutable, shown everywhere** |
|
|
40
43
|
| Context | title + state | description + **documents and addresses** |
|
|
41
44
|
| Hand-off | — | **one click: reuse the bound conversation or open a session** |
|
|
45
|
+
| Finishing | whatever the agent writes | **waits in Needs review for a person** |
|
|
42
46
|
| Storage | session event log | one JSON file you can `cat`, edit, diff and back up |
|
|
43
47
|
|
|
48
|
+
## Confirmation: no record finishes itself
|
|
49
|
+
|
|
50
|
+
This is the rule the plugin is known for, and the one that separates it from every list that lets
|
|
51
|
+
the agent report its own progress: **an agent's "done" is a sentence it said.** The record is
|
|
52
|
+
written as `done` and carries `review: { pending: true }`; the row shows a **Needs review** badge
|
|
53
|
+
and the header a chip with the count, until a person answers.
|
|
54
|
+
|
|
55
|
+
Both doors are gated, because both are only a claim:
|
|
56
|
+
|
|
57
|
+
| Where "done" came from | The record | Who answers |
|
|
58
|
+
|---|---|---|
|
|
59
|
+
| the agent's `global_todo_done`, or a status change to `done` | `done` **+ pending review** | a person |
|
|
60
|
+
| the dispatched conversation ended cleanly, so the host closed it (`turn/end` = `completed`) | `done` **+ pending review** | a person |
|
|
61
|
+
| you clicked done in the panel | `done` | already a person |
|
|
62
|
+
|
|
63
|
+
- **Two answers.** *Confirm done* drops the mark and records who confirmed it; *Send back* returns
|
|
64
|
+
the todo to `open`, clears `doneAt` and the completion record, and adds a `reopened` entry.
|
|
65
|
+
Nothing is deleted: title, description, steps, attachments and notes all stay.
|
|
66
|
+
- **The automatic close goes through the same gate.** What the host writes on the agent's behalf is
|
|
67
|
+
thinner than what the agent could have written — only the closing message and the files that turn
|
|
68
|
+
changed — so it has even less business counting by itself.
|
|
69
|
+
- **Only clean turns are candidates.** `error`, `aborted`, `interrupted` and `max-tokens` leave the
|
|
70
|
+
todo open. A failed job wearing a "done" label is the one failure mode that would make the whole
|
|
71
|
+
list untrustworthy.
|
|
72
|
+
|
|
73
|
+
There is exactly one implementation of the rule: `completeTodo`, `applyPatch` and a status change in
|
|
74
|
+
`lib/model.js` share the same `by === 'agent'` test, and the panel and the ten tools all go through
|
|
75
|
+
it.
|
|
76
|
+
|
|
44
77
|
## What 0.9 and 0.10 added (and the two just before)
|
|
45
78
|
|
|
46
|
-
|
|
47
|
-
Markdown and the weekly report in 0.10; steps in 0.8
|
|
48
|
-
|
|
49
|
-
|
|
79
|
+
Five surfaces these READMEs had never explained. Session read-back and evidence came in 0.9;
|
|
80
|
+
Markdown and the weekly report in 0.10; steps in 0.8. Each changes what a record can carry, or what
|
|
81
|
+
you can do with it after the fact. (The review mark came in 0.7 and now opens this document, instead
|
|
82
|
+
of hiding among the new features.)
|
|
50
83
|
|
|
51
84
|
### Steps: a plan inside the todo
|
|
52
85
|
|
|
@@ -78,20 +111,6 @@ The tail is bounded and in memory: 200 conversations, 400 characters each, fille
|
|
|
78
111
|
`assistant/message`. Nothing is written to disk, so a Host restart forgets it. A missing tail is
|
|
79
112
|
normal — this process has not seen that conversation speak.
|
|
80
113
|
|
|
81
|
-
### Review: "done" is a claim
|
|
82
|
-
|
|
83
|
-
When an agent finishes (`global_todo_done`, or the watcher on a clean turn), the record becomes
|
|
84
|
-
done **and** carries `review: { pending: true }`. The row gets a **Needs review** badge and the
|
|
85
|
-
header a **Review** chip with the count.
|
|
86
|
-
|
|
87
|
-
| Answer | Effect |
|
|
88
|
-
|---|---|
|
|
89
|
-
| **Confirm done** | stays done, the mark is dropped, the activity trail records who confirmed |
|
|
90
|
-
| **Send back** | back to `open`; `doneAt` and the completion record are cleared; a `reopened` activity entry is added |
|
|
91
|
-
|
|
92
|
-
Both answers are recorded as the person's action. Sending back deletes nothing: title,
|
|
93
|
-
description, steps, attachments and progress notes stay.
|
|
94
|
-
|
|
95
114
|
### Markdown in and out
|
|
96
115
|
|
|
97
116
|
The JSON export is the round-trip format. Markdown is the one you read, diff and edit by hand
|
package/README.zh.md
CHANGED
|
@@ -4,11 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
**一份跨会话的待办清单:一个属于你的文件,你和 Agent 读写同一份,一键交给某个对话继续干。**
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
三件会话级计划做不到的事——第一件是这个插件最要紧的一条:
|
|
8
8
|
|
|
9
|
-
1.
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
1. **Agent 说「做完了」不算数,两个入口都只是声明**。它自己在工具里报完成是一种,交给的会话干净收尾、
|
|
10
|
+
宿主替它收尾是另一种;两条路都只把记录送进**待确认**。人点「确认完成」才算完成,点「退回清单」
|
|
11
|
+
就回到清单里、完成记录一并清掉。会话级计划没人问这一句:Agent 把表一改,事情就算结束了。
|
|
12
|
+
2. **一个 JSON 文件就是全部**。能 `cat`、能 diff、能提交进仓库、能放 NAS、换机带走——不藏在任何会话日志里。
|
|
13
|
+
3. **交接是一个按钮,不是一段话**。四种模式、会先检查工作目录,待办自己的**步骤**会作为编号计划一起交出去。
|
|
12
14
|
|
|
13
15
|

|
|
14
16
|
|
|
@@ -33,13 +35,38 @@ DSH 自带的 `todo_write` 属于**某一个 agent 会话**:整表替换、三
|
|
|
33
35
|
| 加入时间 | 不记录 | **`createdAt` 只写一次,处处可见** |
|
|
34
36
|
| 上下文 | 标题 + 状态 | 描述 + **文档与地址** |
|
|
35
37
|
| 交给 Agent | 无 | **一键:复用已绑定会话,或新开一个** |
|
|
38
|
+
| 标成完成 | Agent 改了就算 | **进「待确认」,人点头才算完成** |
|
|
36
39
|
| 存储 | 会话事件日志 | 一个 JSON 文件,能 `cat`、能手改、能 diff、能备份 |
|
|
37
40
|
|
|
41
|
+
## 完成确认:没有一条记录能自己变成「完成」
|
|
42
|
+
|
|
43
|
+
这是它最容易被记住的一条,也是它和所有「让 Agent 自己报进度」的清单最不一样的地方:
|
|
44
|
+
**Agent 说「做完了」,只是它说了这句话。** 记录写完是 `done`,同时带上
|
|
45
|
+
`review: { pending: true }`;行上有「待确认」徽标,顶部有带计数的筛选,直到人回答为止。
|
|
46
|
+
|
|
47
|
+
两个入口都受同一条规则管,因为它们同样只是声明:
|
|
48
|
+
|
|
49
|
+
| 「做完了」从哪来 | 记录变成 | 谁来回答 |
|
|
50
|
+
|---|---|---|
|
|
51
|
+
| Agent 调 `global_todo_done`,或把状态改成 `done` | `done` **+ 待确认** | 人 |
|
|
52
|
+
| 交给的会话干净收尾,宿主自动收尾(`turn/end` 是 `completed`) | `done` **+ 待确认** | 人 |
|
|
53
|
+
| 你自己在面板里点完成 | `done` | 已经是人 |
|
|
54
|
+
|
|
55
|
+
- **回答只有两个**:「确认完成」清掉标记,动态里记下是谁确认的;「退回清单」回到 `open`,
|
|
56
|
+
清空 `doneAt` 与完成记录,动态里加一条 `reopened`。标题、描述、步骤、附件、进展一条不删。
|
|
57
|
+
- **自动收尾也走这个门**。宿主替 Agent 写的那份完成记录本来就更薄——只有最后一段回复和这一轮
|
|
58
|
+
改过的文件——它更没理由自己算数。
|
|
59
|
+
- **只有干净收尾才是候选**:`error`、`aborted`、`interrupted`、`max-tokens` 一律留着未完成。
|
|
60
|
+
一轮失败的任务挂着「完成」标签,是让整份清单不可信的唯一起点。
|
|
61
|
+
|
|
62
|
+
规则在代码里只有一个实现:`completeTodo`、`applyPatch` 和状态改写共用 `lib/model.js` 里那个
|
|
63
|
+
`by === 'agent'` 判断,面板和十个工具都走它。
|
|
64
|
+
|
|
38
65
|
## 0.9 / 0.10 补了什么(以及再往前两版)
|
|
39
66
|
|
|
40
|
-
|
|
41
|
-
步骤是 0.8
|
|
42
|
-
|
|
67
|
+
五件这两份 README 一直没讲的能力:会话回读与原话是 0.9 的,Markdown 与本周报告是 0.10 的,
|
|
68
|
+
步骤是 0.8 的。每一个都改变了记录能装什么,或者改变了事后能拿它做什么。
|
|
69
|
+
(还有一件是 0.7 的「待确认」,它现在就是开头那条规则,不在这里当新功能讲。)
|
|
43
70
|
|
|
44
71
|
### 步骤:待办里的一份计划
|
|
45
72
|
|
|
@@ -67,18 +94,6 @@ DSH 自带的 `todo_write` 属于**某一个 agent 会话**:整表替换、三
|
|
|
67
94
|
tail 有上限、只在内存里:200 个会话、每个 400 字,来自每条 `assistant/message`。不落盘,宿主一重启就忘。
|
|
68
95
|
查不到 tail 是正常情况——这个进程没见那个对话说过话。
|
|
69
96
|
|
|
70
|
-
### 待确认:Agent 的「做完了」只是声明
|
|
71
|
-
|
|
72
|
-
Agent 收尾时(`global_todo_done`,或干净一轮后的自动收尾),记录会变成已完成,**同时**带上
|
|
73
|
-
`review: { pending: true }`。行上有「待确认」徽标,顶部多一个带计数的「待确认」筛选。
|
|
74
|
-
|
|
75
|
-
| 你的回答 | 结果 |
|
|
76
|
-
|---|---|
|
|
77
|
-
| **确认完成** | 保持已完成,标记清除,动态里记下是谁确认的 |
|
|
78
|
-
| **退回清单** | 回到 `open`,`doneAt` 与完成记录清空,动态里加一条 `reopened` |
|
|
79
|
-
|
|
80
|
-
两个回答都按**人**的动作记录。退回不删除任何东西:标题、描述、步骤、附件、进展记录都还在。
|
|
81
|
-
|
|
82
97
|
### Markdown 进与出
|
|
83
98
|
|
|
84
99
|
JSON 导出是往返格式;Markdown 是拿来读、diff、手改的那份:
|
package/docs/DESIGN.md
CHANGED
|
@@ -18,7 +18,7 @@ so the file stays readable, hand-editable and diffable.
|
|
|
18
18
|
| `priority` | `low` \| `normal` \| `high` \| `urgent` | `urgent` was added in front of the first three; `normal` stays the default |
|
|
19
19
|
| `dueAt` | ISO-8601 string \| `null` | canonicalised to UTC on write |
|
|
20
20
|
| `tags` | string[] | ≤ 20, each ≤ 32, de-duplicated case-insensitively |
|
|
21
|
-
| `links` | `{ kind: 'url' \| 'file', value, title }[]` | documents and
|
|
21
|
+
| `links` | `{ kind: 'url' \| 'file' \| 'image', value, title }[]` | documents, addresses and images |
|
|
22
22
|
| `createdAt` | epoch ms | **written once, never rewritten** |
|
|
23
23
|
| `updatedAt` | epoch ms | last accepted change |
|
|
24
24
|
| `createdBy` | `human` \| `agent` | which side added it |
|
|
@@ -29,12 +29,32 @@ so the file stays readable, hand-editable and diffable.
|
|
|
29
29
|
| `originSessionId` | string | the conversation that wrote it; the panel groups by this |
|
|
30
30
|
| `lastDispatch` | `{ at, mode, ok, sessionId?, error? }` \| `null` | last hand-off, including its failure reason |
|
|
31
31
|
| `completion` | `{ at, by, summary, sessionId, artifacts }` \| `null` | what the finishing turn said and produced; cleared on reopen |
|
|
32
|
+
| `review` | `{ pending, at, by }` \| `null` | an agent's completion waiting for a person (*Done is a claim, from either door*) |
|
|
32
33
|
| `notes` | `{ at, by, text }[]` | append-only progress notes, capped at `LIMITS.notes` |
|
|
33
34
|
| `activity` | `{ at, by, kind, summary? }[]` | trimmed to `activityLimit` (default 50) |
|
|
34
35
|
|
|
35
36
|
The activity kinds are `created`, `updated`, `status`, `done`, `reopened`, `linked`,
|
|
36
37
|
`unlinked`, `dispatched`, `dispatch-failed`, `noted`, `completed`.
|
|
37
38
|
|
|
39
|
+
## Done is a claim, from either door
|
|
40
|
+
|
|
41
|
+
An agent "finishes" work in two places, and both are only claims. `global_todo_done` — or a status
|
|
42
|
+
change to `done` through `applyPatch` — is the model saying so. The dispatch watcher (*Finishing by
|
|
43
|
+
itself, without lying*) is the host inferring it from a clean `turn/end`. Either way `lib/model.js`
|
|
44
|
+
sets `review: { pending: true, at, by }` when the writer is an agent, and the record keeps that mark
|
|
45
|
+
until a person answers: `reviewTodo` clears it and records the person in the activity trail, or
|
|
46
|
+
sending it back returns the todo to `open` with `doneAt` and `completion` cleared and everything
|
|
47
|
+
else intact.
|
|
48
|
+
|
|
49
|
+
Why one gate instead of trusting the better-evidenced path: a single wrong `done` makes the list
|
|
50
|
+
worthless, and the two paths differ in how much evidence they carry, not in who is entitled to
|
|
51
|
+
decide. The mirror matters as much — a person's own click never sets the mark, because marking your
|
|
52
|
+
own work as unconfirmed would be noise. The badge means exactly one thing: *an agent said finished,
|
|
53
|
+
no person has answered yet.*
|
|
54
|
+
|
|
55
|
+
It is one function, not a convention. The panel's done button, `global_todo_done`, a bulk complete
|
|
56
|
+
and the watcher all go through the same service path, so no writer can opt out of the gate.
|
|
57
|
+
|
|
38
58
|
## Storage
|
|
39
59
|
|
|
40
60
|
```
|
package/docs/FAQ.md
CHANGED
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
14 个真问题,答案都能在代码里核对。文中路径相对仓库根;`$DSH_HOME` 默认是 `~/.dsh`。
|
|
4
4
|
|
|
5
|
+
> **这个插件的中心规则:完成要人点头。** Agent 在工具里报完成,和交给的会话干净收尾后宿主自动
|
|
6
|
+
> 收尾,都只把记录送进「待确认」;你点「确认完成」才算完成,点「退回清单」就回到清单里。为什么
|
|
7
|
+
> 两条路都要人回答,见[第 3 问](#3-agent-把一条标成完成之后会发生什么)。
|
|
8
|
+
|
|
5
9
|
## 1. 我的数据到底存在哪?卸载会删掉吗?
|
|
6
10
|
|
|
7
11
|
默认 `$DSH_HOME/global-todo/todos.json`,可以用插件配置的 `storePath` 指到任意绝对路径
|
package/docs/QUICKSTART.md
CHANGED
package/docs/ROADMAP.md
CHANGED
|
@@ -134,7 +134,8 @@ re-litigated every time someone tries to "clean it up".
|
|
|
134
134
|
**External ingest with an inbox** — `POST /ingest` takes source-tagged, confidence-scored items
|
|
135
135
|
behind a Bearer token; low-confidence records wait in an `inbox` tag view with 确认 / 丢弃 and a
|
|
136
136
|
seven-day sweep, so an external source cannot silently fill the list.
|
|
137
|
-
**An agent's "done" is a claim** — finishing as an agent sets `review = { pending }
|
|
137
|
+
**An agent's "done" is a claim** — finishing as an agent sets `review = { pending }`, whether the
|
|
138
|
+
model reported it or the dispatch watcher closed a clean turn; a person
|
|
138
139
|
confirms or sends it back through `POST /review` (`reviewTodo()` in `lib/model.js`, `review()` in
|
|
139
140
|
`lib/service.js`). Confirming keeps the record finished; rejecting reopens it and drops the
|
|
140
141
|
completion record, because "not actually done" is the only honest reading. The panel shows a
|
package/lib/index.js
CHANGED
|
@@ -37,7 +37,7 @@ import { createStore, resolveStorePath } from './store.js'
|
|
|
37
37
|
import { createTools, normalizeToolGroups, selectTools } from './tools.js'
|
|
38
38
|
|
|
39
39
|
/** Must equal `package.json`'s version; `npm run check` enforces that. */
|
|
40
|
-
export const VERSION = '0.
|
|
40
|
+
export const VERSION = '0.17.0'
|
|
41
41
|
|
|
42
42
|
/** Plugin id. Also the Loader row id in `cordis.patch.yml`. */
|
|
43
43
|
export const name = 'dsh-global-todo'
|
|
@@ -104,7 +104,8 @@ const GUIDANCE = [
|
|
|
104
104
|
'记的时候:标题一句话说清要做什么;把相关文档**绝对路径**或网址挂进 `links`(接手时会作为上下文一起交出去);需要精确时间的写 `dueAt`。',
|
|
105
105
|
'**大活拆步骤**:一件需要多轮才能做完的事,用 `steps` 记下 3–6 步(`global_todo_add` 的 `steps` 参数)——派发时这些步骤会作为编号计划原样交给接手的 Agent,比一段散文有用得多;做完一步就用 `global_todo_update` 把该步的 `done` 置为 true。',
|
|
106
106
|
'记完用一句话说明记了什么(别复述整条描述)。做完用 `global_todo_done` 留痕,**不要删**。',
|
|
107
|
-
'
|
|
107
|
+
'**完成要人点头**:`global_todo_done`(或把状态改成 `done`)只是声明——记录会挂「待确认」,用户回答之后才算完成。所以在回复里说「已标记完成,等你确认」,别说「已经结束了」。',
|
|
108
|
+
'**一轮收尾时顺手划掉**:如果清单里某条就是你刚做完的事,直接 `global_todo_done` 结束它,并写清 `summary` 与 `artifacts`。交给会话的那条待办,宿主会在这一轮干净结束时自动收尾,但那样只留下最后一段回复和改动的文件——两条路都要人确认。',
|
|
108
109
|
'做不到 / 卡住了:用 `global_todo_note` 追加一条进展,说明卡在哪、需要用户做什么——**不要**改写待办的 description(那是用户自己的文字)。',
|
|
109
110
|
'用户说「抓一下待办 / 整理一下要跟进的」时:扫最近对话,用 `global_todo_capture` 一次登记多条,再回一句汇总。',
|
|
110
111
|
].join('\n')
|
package/lib/tools.js
CHANGED
|
@@ -229,6 +229,9 @@ export function todoLine(todo) {
|
|
|
229
229
|
const mark = todo.status === 'done' ? 'x' : todo.status === 'doing' ? '~' : todo.status === 'cancelled' ? '-' : ' '
|
|
230
230
|
const label = Number.isInteger(todo.seq) && todo.seq > 0 ? `#${todo.seq} ` : ''
|
|
231
231
|
const parts = [`- [${mark}] ${label}${todo.title} id=${todo.id}`, `加入于 ${new Date(todo.createdAt).toISOString()}`]
|
|
232
|
+
// An agent's "done" is a claim: every rendering that shows the mark shows that it is unanswered,
|
|
233
|
+
// so the model cannot read a completed record as settled and report it as finished.
|
|
234
|
+
if (todo.review?.pending === true) parts.push('待确认(人还没回答)')
|
|
232
235
|
if (todo.priority !== 'normal') parts.push(PRIORITY_LABELS[todo.priority] ?? todo.priority)
|
|
233
236
|
if (todo.dueAt !== null) parts.push(`截止 ${todo.dueAt}`)
|
|
234
237
|
if (todo.tags.length > 0) parts.push(todo.tags.map((tag) => `#${tag}`).join(' '))
|
|
@@ -625,7 +628,8 @@ export function createTools(service, options = {}) {
|
|
|
625
628
|
{
|
|
626
629
|
name: 'global_todo_update',
|
|
627
630
|
description:
|
|
628
|
-
'改一条全局待办。只传要改的字段;`dueAt: ""` 清空截止时间,`tags: []` 清空标签,`links` / `steps` 是整体替换(要单独加附件请用 global_todo_link),`status` 可以设为 archived(归档,不删除)。'
|
|
631
|
+
'改一条全局待办。只传要改的字段;`dueAt: ""` 清空截止时间,`tags: []` 清空标签,`links` / `steps` 是整体替换(要单独加附件请用 global_todo_link),`status` 可以设为 archived(归档,不删除)。'
|
|
632
|
+
+ '`status` 设成 `done` 和 `global_todo_done` 一样只是声明:会挂「待确认」,用户点头才算完成。',
|
|
629
633
|
parameters: {
|
|
630
634
|
type: 'object',
|
|
631
635
|
properties: {
|
|
@@ -801,8 +805,10 @@ export function createTools(service, options = {}) {
|
|
|
801
805
|
+ '标为完成时**务必带上 `summary`**(一句话说明你做了什么、结论是什么),'
|
|
802
806
|
+ '以及 `artifacts`(这次产出的文件路径或相关网址)——'
|
|
803
807
|
+ '清单上留下的完成记录就是这个,缺了它「已完成」等于什么都没说。'
|
|
808
|
+
+ '**标完成只是声明**:记录会进「待确认」,用户点头才算完成,所以在回复里别把'
|
|
809
|
+
+ '「我已标记完成」说成「这件事已经结束了」。'
|
|
804
810
|
+ '(交付给会话的待办即使你忘了调用,宿主也会在这一轮干净结束时自动收尾,'
|
|
805
|
-
+ '
|
|
811
|
+
+ '但那样只有最后一段回复和改动文件,不如你主动写清楚;那条同样要人确认。)',
|
|
806
812
|
parameters: {
|
|
807
813
|
type: 'object',
|
|
808
814
|
properties: {
|
|
@@ -838,6 +844,9 @@ export function createTools(service, options = {}) {
|
|
|
838
844
|
render: (_args, value) => {
|
|
839
845
|
if (value.ok !== true) return text(`状态没改成功:${value.error ?? value.reason ?? '未知原因'}`)
|
|
840
846
|
const lines = [`已更新状态:${value.todo.status}`, todoLine(value.todo)]
|
|
847
|
+
if (value.todo.status === 'done' && value.todo.review?.pending === true) {
|
|
848
|
+
lines.push('', '这条挂在「待确认」:标完成只是声明,用户点头才算完成——回复里别把它说成已经收尾。')
|
|
849
|
+
}
|
|
841
850
|
const completion = value.todo.completion
|
|
842
851
|
if (completion !== null && completion !== undefined) {
|
|
843
852
|
lines.push('', `完成于 ${new Date(completion.at).toISOString()}(${completion.by})`)
|
package/locale/en.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"meta": {
|
|
3
3
|
"title": "Global Todos",
|
|
4
|
-
"description": "Cross-session todos for DeepSeek Harness.
|
|
4
|
+
"description": "Cross-session todos for DeepSeek Harness whose central rule is that an agent's \"done\" is not completion. Whether the agent reports it from a tool or the host infers it when a dispatched conversation ends cleanly, the record waits in Needs review: a person confirms it, or it goes back to the list. One JSON file you own, written by both sides, with created time, description, attached documents and links, a plan of steps and the sentence it came from; hand an item to a conversation in one click and read back what that conversation last said."
|
|
5
5
|
}
|
|
6
6
|
}
|
package/locale/zh.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"meta": {
|
|
3
3
|
"title": "全局待办",
|
|
4
|
-
"description": "DeepSeek Harness
|
|
4
|
+
"description": "DeepSeek Harness 的跨会话待办清单,中心规则是:Agent 说「做完了」不算完成。它自己在工具里报完成,或交给的会话干净收尾后宿主自动收尾,两条路都只进「待确认」,人点头才算完成、退回就回清单。一份属于你的 JSON 文件,人和 Agent 读写同一条记录:加入时间、描述、文档与地址、步骤计划、原话;一键交给某个对话继续干,随时回读那边最后说了什么。"
|
|
5
5
|
}
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-global-todo",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.17.0",
|
|
4
4
|
"icon": "./docs/icon.svg",
|
|
5
|
-
"description": "Cross-session todo list for DeepSeek Harness
|
|
5
|
+
"description": "Cross-session todo list for DeepSeek Harness where an agent's \"done\" never settles itself: whether it is reported by the tool or inferred from a clean turn, the record waits in Needs review until a person confirms it. One JSON file both write, numbered step hand-offs, session read-back.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"author": "LUgABeEEE",
|
|
@@ -27,6 +27,9 @@
|
|
|
27
27
|
"task-management",
|
|
28
28
|
"handoff",
|
|
29
29
|
"agent",
|
|
30
|
+
"human-in-the-loop",
|
|
31
|
+
"confirmation",
|
|
32
|
+
"approval",
|
|
30
33
|
"productivity",
|
|
31
34
|
"待办",
|
|
32
35
|
"全局待办"
|
|
@@ -86,7 +89,8 @@
|
|
|
86
89
|
"check:matrix": "node scripts/matrix.mjs",
|
|
87
90
|
"market": "node tools/market.mjs",
|
|
88
91
|
"market:check": "node tools/market.mjs --check",
|
|
89
|
-
"market:fresh": "node tools/market.mjs --fresh"
|
|
92
|
+
"market:fresh": "node tools/market.mjs --fresh",
|
|
93
|
+
"release:check": "node tools/release-check.mjs"
|
|
90
94
|
},
|
|
91
95
|
"dsh": {
|
|
92
96
|
"manifestVersion": 1,
|