dsh-task-ledger 0.0.55 → 0.0.57
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/dist/client.js +103 -56
- package/dist/client.js.map +1 -1
- package/dist/host/services/home.service.d.ts +4 -2
- package/dist/host/services/home.service.js +10 -3
- package/dist/host/types.d.ts +10 -4
- package/package.json +1 -1
- package/skill/README.md +2 -1
- package/skill/SKILL.md +6 -5
- package/skill/package.json +1 -1
- package/skill/references/state-model.md +6 -5
- package/skill/references/worklog.md +3 -1
- package/skill/scripts/progress.py +2 -2
|
@@ -2,8 +2,10 @@ import { type DegradedInfo } from '../errors.js';
|
|
|
2
2
|
import type { BoardSnapshot, LedgerWorkspace, TaskScope } from '../types.js';
|
|
3
3
|
/** 停滞阈值:进行中且 updated 至今满这么多天没更新(2026-10-19 拍板,显示级)。 */
|
|
4
4
|
export declare const STALE_DAYS = 3;
|
|
5
|
-
/**
|
|
6
|
-
export declare const OVERDUE_DAYS =
|
|
5
|
+
/** 超期阈值:进行中且 started 至今满这么多天还没做完——中途更新不影响(2026-10-19 拍板 7 → 14 天)。 */
|
|
6
|
+
export declare const OVERDUE_DAYS = 14;
|
|
7
|
+
/** 积压阈值:待认领且 created 至今满这么多天还没人接(2026-10-19 拍板)。 */
|
|
8
|
+
export declare const BACKLOG_DAYS = 30;
|
|
7
9
|
/** 快路径读法:单工作区 readTasks + git 身份(并行;供 settle 逐工作区调)。 */
|
|
8
10
|
export declare function readTaskScope(workspace: LedgerWorkspace): Promise<TaskScope>;
|
|
9
11
|
/** 在办行加工 + 六个统计面 + identities(纯函数;`now` 显式传入)。 */
|
|
@@ -10,8 +10,10 @@ import { settleWorkspaces } from '../errors.js';
|
|
|
10
10
|
import { daysSince } from './dates.js';
|
|
11
11
|
/** 停滞阈值:进行中且 updated 至今满这么多天没更新(2026-10-19 拍板,显示级)。 */
|
|
12
12
|
export const STALE_DAYS = 3;
|
|
13
|
-
/**
|
|
14
|
-
export const OVERDUE_DAYS =
|
|
13
|
+
/** 超期阈值:进行中且 started 至今满这么多天还没做完——中途更新不影响(2026-10-19 拍板 7 → 14 天)。 */
|
|
14
|
+
export const OVERDUE_DAYS = 14;
|
|
15
|
+
/** 积压阈值:待认领且 created 至今满这么多天还没人接(2026-10-19 拍板)。 */
|
|
16
|
+
export const BACKLOG_DAYS = 30;
|
|
15
17
|
/** 快路径读法:单工作区 readTasks + git 身份(并行;供 settle 逐工作区调)。 */
|
|
16
18
|
export async function readTaskScope(workspace) {
|
|
17
19
|
const [tasks, identity] = await Promise.all([readTasks(workspace), getCurrentIdentity(workspace)]);
|
|
@@ -23,13 +25,15 @@ export function computeSnapshot(scopes, now) {
|
|
|
23
25
|
// blocked 只是旧数据(新任务不可能再有);读侧一律当进行中
|
|
24
26
|
const working = task.status === 'doing' || task.status === 'blocked';
|
|
25
27
|
const ageDays = working ? daysSince(task.started ?? task.created, now) : null;
|
|
26
|
-
//
|
|
28
|
+
// 停滞看「最后更新」,超期看「接任务至今」,积压看「创建至今还没人认领」——三个不同的问题,互不覆盖
|
|
27
29
|
const idleDays = working ? daysSince(task.updated ?? task.started ?? task.created, now) : null;
|
|
30
|
+
const idleOpen = task.status === 'open' ? daysSince(task.created, now) : null;
|
|
28
31
|
return {
|
|
29
32
|
...task,
|
|
30
33
|
ageDays,
|
|
31
34
|
stale: idleDays !== null && idleDays >= STALE_DAYS,
|
|
32
35
|
overdue: ageDays !== null && ageDays >= OVERDUE_DAYS,
|
|
36
|
+
backlog: idleOpen !== null && idleOpen >= BACKLOG_DAYS,
|
|
33
37
|
};
|
|
34
38
|
}));
|
|
35
39
|
const openTasks = withMeta.filter((task) => task.status === 'open');
|
|
@@ -45,7 +49,10 @@ export function computeSnapshot(scopes, now) {
|
|
|
45
49
|
doing: withMeta.filter((task) => task.status === 'doing' || task.status === 'blocked').length,
|
|
46
50
|
overdue: withMeta.filter((task) => task.overdue).length,
|
|
47
51
|
stale: withMeta.filter((task) => task.stale).length,
|
|
52
|
+
backlog: withMeta.filter((task) => task.backlog).length,
|
|
48
53
|
staleDays: STALE_DAYS,
|
|
54
|
+
overdueDays: OVERDUE_DAYS,
|
|
55
|
+
backlogDays: BACKLOG_DAYS,
|
|
49
56
|
oldestOpenDays: openTasks.length === 0
|
|
50
57
|
? null
|
|
51
58
|
: openTasks.reduce((max, task) => Math.max(max, daysSince(task.created, now) ?? 0), 0),
|
package/dist/host/types.d.ts
CHANGED
|
@@ -106,18 +106,22 @@ export interface ClosedSummary {
|
|
|
106
106
|
export interface BoardStats {
|
|
107
107
|
/** 我的 doing(旧数据里的 blocked 也算进行中)。 */
|
|
108
108
|
readonly myActive: number;
|
|
109
|
-
/**
|
|
109
|
+
/** 我的超期(接任务至今满 OVERDUE_DAYS 天未结案)。 */
|
|
110
110
|
readonly myOverdue: number;
|
|
111
111
|
/** 待认领(open)。 */
|
|
112
112
|
readonly open: number;
|
|
113
113
|
/** 全部 doing(旧数据里的 blocked 也算进行中)。 */
|
|
114
114
|
readonly doing: number;
|
|
115
|
-
/**
|
|
115
|
+
/** 全部超期——按时间判定,不是状态。 */
|
|
116
116
|
readonly overdue: number;
|
|
117
117
|
/** 停滞 = 进行中且 updated 至今满 STALE_DAYS 天没更新。 */
|
|
118
118
|
readonly stale: number;
|
|
119
|
-
/**
|
|
119
|
+
/** 积压 = 待认领且 created 至今满 BACKLOG_DAYS 天没人接。 */
|
|
120
|
+
readonly backlog: number;
|
|
121
|
+
/** 停滞 / 超期 / 积压阈值(天)——随响应下发,界面文案不硬编码(单一真源)。 */
|
|
120
122
|
readonly staleDays: number;
|
|
123
|
+
readonly overdueDays: number;
|
|
124
|
+
readonly backlogDays: number;
|
|
121
125
|
/** 最老一条待认领躺了多少天(没有待认领 = null)。 */
|
|
122
126
|
readonly oldestOpenDays: number | null;
|
|
123
127
|
}
|
|
@@ -127,8 +131,10 @@ export interface BoardTask extends TaskRow {
|
|
|
127
131
|
readonly ageDays: number | null;
|
|
128
132
|
/** 停滞标记:updated 至今满 STALE_DAYS 天没更新(与 ageDays 无关)。 */
|
|
129
133
|
readonly stale: boolean;
|
|
130
|
-
/**
|
|
134
|
+
/** 超期标记:接任务至今满 OVERDUE_DAYS 天还没做完(不看中途更新)。 */
|
|
131
135
|
readonly overdue: boolean;
|
|
136
|
+
/** 积压标记:待认领且创建至今满 BACKLOG_DAYS 天没人接。 */
|
|
137
|
+
readonly backlog: boolean;
|
|
132
138
|
}
|
|
133
139
|
export interface BoardSnapshot {
|
|
134
140
|
readonly at: string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-task-ledger",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.57",
|
|
4
4
|
"description": "Task ledger board for dsh (DeepSeek Harness): read-only board over task-ledger skill workspaces. The task-ledger skill is bundled — install the plugin, get the skill globally.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"deepseek",
|
package/skill/README.md
CHANGED
package/skill/SKILL.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: task-ledger
|
|
3
3
|
description: 本地任务台账,跨会话记录在办任务的归属、进度与起止。当用户要登记一件新的事(新建任务 / 建个坑 / 这活我领了)、记录已有任务的进展(接着做 / 记一条进展 / 这轮先记下)、查看任务状态或历史(现在该做什么 / 这活谁在做 / 上周做过什么)时加载;对某个具体任务要求结案或退回时,只认用户的明确指令;只是改代码、讨论方案时不要用。
|
|
4
|
-
version: 1.2.
|
|
4
|
+
version: 1.2.2
|
|
5
5
|
allowed-tools: Read,Write,Bash,Grep
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -34,7 +34,7 @@ allowed-tools: Read,Write,Bash,Grep
|
|
|
34
34
|
| 「谁在做 X」「有哪些在办」 | `list`;在等认领的加 `--status open` |
|
|
35
35
|
| 「这个任务到哪一步了」「这轮做了什么」 | `show --id`(任务 JSON + worklog 全文) |
|
|
36
36
|
| 「某件老活什么时候做的」「谁做过哪些活」 | `history`(可按 `--owner` / `--since` 筛) |
|
|
37
|
-
| 「哪些任务停太久」 | `list --json`:`updated` 满 3 天=停滞、`started` 满
|
|
37
|
+
| 「哪些任务停太久」 | `list --json`:`updated` 满 3 天=停滞、`started` 满 14 天=超期、`created` 满 30 天仍 `open`=积压(看板算,别改状态) |
|
|
38
38
|
| 「新建一个任务」 | `new`(`--self` = 建完即认领) |
|
|
39
39
|
| 「这活我领了」 | `claim`(只对 `open` 有效) |
|
|
40
40
|
| 「开始做 / 接着做 X」 | 还是 `open` 就先 `claim`;已是 `doing` 就直接改正文 + `log` |
|
|
@@ -61,11 +61,12 @@ python3 <本 SKILL.md 所在目录>/scripts/progress.py <子命令> --repo <当
|
|
|
61
61
|
|
|
62
62
|
## 铁律
|
|
63
63
|
|
|
64
|
-
- **状态只有 `open` / `doing`**;`done` 只能由 `close` 产生。**没有 `blocked`
|
|
64
|
+
- **状态只有 `open` / `doing`**;`done` 只能由 `close` 产生。**没有 `blocked` 状态**:超期 = `started` 满 14 天、停滞 = `updated` 满 3 天、积压 = `created` 满 30 天且仍 `open`,都由看板按时间算,`progress.json` 里不存、不手改;卡在哪写进正文。
|
|
65
65
|
- **`log` 就是刷新 `updated` 的动作**:该记不记,任务会被看板标成停滞。
|
|
66
66
|
- **owner = 当前 `git config user.name`**,不能由外部传入;读不到就报错(先让用户配 git)。**只能动自己名下**的任务(`open` 的先 `claim`),不是你的直接拒绝 —— 不要绕过脚本改 JSON。
|
|
67
67
|
- **换人只能「释放 → 认领」**:skill 不提供交接,随便写的名字都是假的。
|
|
68
68
|
- **「执行记录」禁手改**:只由脚本按 `new / claim / set / release / log / close` 追加,只增不改;手写=伪造时间线,且不刷新 `updated`。
|
|
69
|
+
- **改正文必配一条日志**:只要动了 worklog 的正文(改一句、补一节、改标题、修错字都算),**必须立刻跑一次 `log`**。没有对应日志的正文改动 = 这轮没做完 —— 时间线上会留下你改过、但没人知道为什么改的空洞。
|
|
69
70
|
- **升级前建的老 worklog 没有这一节**:不用你补,脚本第一次记时自动在文末补一节;文档丢失时 `log` 报错(`updated` 已刷新),用 `show` 查路径,**不要手写**。
|
|
70
71
|
- **旧数据里的 `blocked`**:读侧当进行中;`list --status blocked` 可捞出,用 `set --status doing` 归位。
|
|
71
72
|
|
|
@@ -74,7 +75,7 @@ python3 <本 SKILL.md 所在目录>/scripts/progress.py <子命令> --repo <当
|
|
|
74
75
|
## 过程文档
|
|
75
76
|
|
|
76
77
|
1. **建档**:`new` 按模板建六节骨架并把路径写进状态表。
|
|
77
|
-
2.
|
|
78
|
+
2. **推进**:你直接编辑前五节,标题不许改名;**每改一轮正文就配一条日志**——同一次编辑动作里连改多处只记一条,改完立刻 `log --note "这轮做了什么"`。
|
|
78
79
|
3. **交付(待验收)**:任务仍留 `doing`,「待办」写「待用户验收」,「下一步」写清验收该看什么;这轮**照样要走收工三步**。结论只写可验证事实,评价等用户验收。
|
|
79
80
|
4. **封卷**:`close` 打封卷标记,此后不再改;文档靠 `history` 给的回链找回。
|
|
80
81
|
|
|
@@ -83,7 +84,7 @@ python3 <本 SKILL.md 所在目录>/scripts/progress.py <子命令> --repo <当
|
|
|
83
84
|
## 每次收工必做(「收工」= 这一轮对用户有可见产出)
|
|
84
85
|
|
|
85
86
|
1. 改正文:这轮变化的事实都落笔,「下一步」写具体动作,不写「继续推进」。
|
|
86
|
-
2. 跑 `log
|
|
87
|
+
2. 跑 `log`:**这一轮只要改过正文就必须记**(一轮至少一条);正文没变也能记一条推进,但要同时重写「下一步」。
|
|
87
88
|
3. 回读末行(`tail -n 3 <路径>` 或 `show --id`):时间 = 现在、说明 = 这轮的事。
|
|
88
89
|
|
|
89
90
|
交付前必须走完这三步;不走,这轮等于没发生,看板还会标停滞。
|
package/skill/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "task-ledger",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.3",
|
|
4
4
|
"description": "Task-ledger skill for coding agents: per-workspace progress tracking (ledger/progress.json, history, worklog) driven by a CLI script. Standalone install for CodeBuddy and other agents; also bundled inside the dsh-task-ledger DSH plugin.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"skill",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 状态与时间模型
|
|
2
2
|
|
|
3
|
-
> TL;DR:状态只有 `open` / `doing`;`done` 由 `close`
|
|
3
|
+
> TL;DR:状态只有 `open` / `doing`;`done` 由 `close` 产生。超期 = `started` 满 14 天、停滞 = `updated` 满 3 天、积压 = `created` 满 30 天仍 `open`,看板算、不存字段。`updated` 由 `new/claim/set/log` 刷新。owner 只取当前 git 身份。
|
|
4
4
|
|
|
5
5
|
## 状态机
|
|
6
6
|
|
|
@@ -12,15 +12,16 @@ doing ──set --status open──> open # 释放认领,执行记录
|
|
|
12
12
|
- `open`:已建、等认领。`doing`:已认领、在做。`done` 只由 `close` 产生。
|
|
13
13
|
- **没有 `blocked` 状态**(2026-10-19 取消)。旧数据里残留的 `blocked` 读侧当进行中:`list --status blocked` 可捞出,用 `set --status doing` 归位;新写入一律拒绝。
|
|
14
14
|
|
|
15
|
-
##
|
|
15
|
+
## 三个标记(看板计算,不是状态)
|
|
16
16
|
|
|
17
17
|
| 标记 | 依据 | 阈值 |
|
|
18
18
|
|---|---|---|
|
|
19
|
-
|
|
|
19
|
+
| 积压 | `created`(建了)至今仍 `open`(没人认领) | 满 30 天 |
|
|
20
|
+
| 超期 | `started`(接任务)至今,中途更新不影响 | 满 14 天 |
|
|
20
21
|
| 停滞 | `updated`(最后推进)至今 | 满 3 天 |
|
|
21
22
|
|
|
22
|
-
- 真源:`packages/plugin/src/host/services/home.service.ts` 的 `OVERDUE_DAYS =
|
|
23
|
-
-
|
|
23
|
+
- 真源:`packages/plugin/src/host/services/home.service.ts` 的 `BACKLOG_DAYS = 30` / `OVERDUE_DAYS = 14` / `STALE_DAYS = 3`;看板随响应下发三个天数,界面文案不硬编码。
|
|
24
|
+
- 脚本不算这三个值,`progress.json` 里也不存;agent 要回答「哪些停太久」时用 `list --json` 的 `created` / `updated` / `started` 与当前时间比。
|
|
24
25
|
- 老数据没有 `updated` 时,读侧回退到 `started`,再到 `created`。
|
|
25
26
|
|
|
26
27
|
## 时间
|
|
@@ -27,7 +27,9 @@
|
|
|
27
27
|
|
|
28
28
|
1. `show --id` 拿任务 JSON + worklog 全文与路径;
|
|
29
29
|
2. 直接改前五节;
|
|
30
|
-
3.
|
|
30
|
+
3. **立刻** `log --id <任务号> --note "补了…/改了…"`。
|
|
31
|
+
|
|
32
|
+
**改正文必配一条日志**:只要动过正文(哪怕一处错字、一个标题),就必须跟一条 `log`;没有日志的正文改动等于没发生过。同一次编辑动作里连改多处,只记一条。
|
|
31
33
|
|
|
32
34
|
已结案任务:worklog 已封卷、不在状态表,用 `history` 给出的回链找回,只读不改。
|
|
33
35
|
|
|
@@ -38,7 +38,7 @@ except ImportError:
|
|
|
38
38
|
msvcrt = None
|
|
39
39
|
|
|
40
40
|
STATUSES = ("open", "doing")
|
|
41
|
-
# 旧数据只读兼容:早期版本有 blocked
|
|
41
|
+
# 旧数据只读兼容:早期版本有 blocked 状态(手动标「卡住」)。现在超期按时间判定
|
|
42
42
|
# (接任务满 7 天),不再允许新写入;list / validate / 看板仍能吃老文件。
|
|
43
43
|
LEGACY_STATUSES = ("blocked",)
|
|
44
44
|
PROGRESS_REL = Path("ledger/progress.json")
|
|
@@ -1364,7 +1364,7 @@ def cmd_set(args: argparse.Namespace) -> None:
|
|
|
1364
1364
|
)
|
|
1365
1365
|
if status == "blocked":
|
|
1366
1366
|
raise Fail(
|
|
1367
|
-
"没有 blocked
|
|
1367
|
+
"没有 blocked 状态:超期由时间自动判定(接任务满 14 天仍未结案),"
|
|
1368
1368
|
"状态只有 open / doing;卡在哪里请写进 worklog。"
|
|
1369
1369
|
)
|
|
1370
1370
|
if status == "done":
|