dsh-task-ledger 0.0.93 → 0.0.96
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-task-ledger",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.96",
|
|
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/SKILL.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: task-ledger
|
|
3
3
|
description: 本地任务台账,跨会话记录在办任务的归属、进度与起止。当用户要登记一件新的事(新建任务 / 建个坑 / 这活我领了)、记录已有任务的进展(接着做 / 记一条进展 / 这轮先记下)、查看任务状态或历史(现在该做什么 / 这活谁在做 / 上周做过什么)、给任务结案或退回(做完了 / 验收通过 / 不做了 / 退回待认领)、整理标签或检查台账一致性时加载;只是改代码、讨论方案时不要用。
|
|
4
|
-
version: 1.3.
|
|
4
|
+
version: 1.3.22
|
|
5
5
|
allowed-tools: Read,Edit,Bash,Grep
|
|
6
6
|
---
|
|
7
7
|
|
package/skill/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "task-ledger",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.22",
|
|
4
4
|
"description": "Task-ledger skill for coding agents: per-workspace progress tracking (ledger/pool.json + owners/<hash>.json shards + owners.json index, 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",
|
|
@@ -6,25 +6,23 @@
|
|
|
6
6
|
|
|
7
7
|
**你没有写身份的权限。** 非终端下 `init --claim` / `init --new` 一律被脚本拒绝,`--yes` 也已禁用。你只能:报名单、给用户命令、等 ta 跑完。
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## 你该做的(只有这几步,每次都是同一套)
|
|
10
10
|
|
|
11
|
-
1.
|
|
11
|
+
1. 只读报名单(你在非终端里裸跑,只会打印候选、零写):
|
|
12
12
|
|
|
13
13
|
```
|
|
14
14
|
python3 <本 SKILL.md 所在目录>/scripts/progress.py init --repo <工作区根>
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
2.
|
|
18
|
-
-
|
|
19
|
-
-
|
|
17
|
+
2. 把名册给用户选,并把这**同一条命令**交给用户在 ta 自己的终端跑(真终端里它自己会变成 ↑/↓ 选择框):
|
|
18
|
+
- 名册有内容 ⇒「名册现有:@A(uuid)、@B(uuid)。请在你的终端运行上面这条,它会让你选。」
|
|
19
|
+
- 名册为空 ⇒「名册为空。请在你的终端运行上面这条,输入一个用户名新建。」
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
**格式只有这一套**:一条命令只出现一次,步骤只编一套号。**不许**出现「1. 报名单…」「1. 请运行…」这种两个都从 1 开始的列表,也不许把同一件事拆成两套方案各编一遍。
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
python3 <本 SKILL.md 所在目录>/scripts/progress.py init --repo <工作区根>
|
|
25
|
-
```
|
|
23
|
+
3. 用户说「好了」后,重跑原命令。用户没跑完就等着,不要替 ta 写。
|
|
26
24
|
|
|
27
|
-
|
|
25
|
+
**每次进这个分支都照这套走**:用户上一次关掉选择框、说过「算了」或取消了,**不算**以后不用问;下次照样走同一套呈现,不要退化成纯文字、也不要跳过这一步。
|
|
28
26
|
|
|
29
27
|
## 硬规则
|
|
30
28
|
|
|
@@ -32,13 +32,18 @@ def esc_cell(text: str) -> str:
|
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
def owner_cell(owner: str | None) -> str:
|
|
35
|
-
"""owner
|
|
36
|
-
return
|
|
35
|
+
"""owner 列的值:裸 uuid,**不加 `@`**(`@` 只加在名字列;匹配一律用裸 uuid)。"""
|
|
36
|
+
return owner or ""
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
def creator_cell(creator: str | None) -> str:
|
|
40
|
-
"""creator
|
|
41
|
-
return
|
|
40
|
+
"""creator 列的值(与 owner_cell 同一约定:裸 uuid,不加 `@`)。"""
|
|
41
|
+
return creator or ""
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def name_cell(name: str | None) -> str:
|
|
45
|
+
"""名字列的展示值:名字前加 `@`(与过程文档 `@名字 · uuid` 同一口径)。"""
|
|
46
|
+
return f"@{name}" if name else ""
|
|
42
47
|
|
|
43
48
|
|
|
44
49
|
def split_row(line: str) -> list[str]:
|
|
@@ -74,9 +79,9 @@ def history_line(
|
|
|
74
79
|
) -> str:
|
|
75
80
|
"""十一列的一行。`worklog` 收**相对 `ledger/`** 的路径,这里负责换成相对 `history/` 的链接。
|
|
76
81
|
|
|
77
|
-
owner / creator 传**裸 uuid
|
|
78
|
-
`
|
|
79
|
-
|
|
82
|
+
owner / creator 传**裸 uuid**、名字传**裸名字**,两处都别先加 `@`:
|
|
83
|
+
`@` 由 `name_cell` 只加在名字列(与过程文档 `@名字 · uuid` 同一口径),uuid 列永远是裸值。
|
|
84
|
+
`owner_name` / `creator_name` 是**落盘的显示名快照**(结案那一刻的名字,之后改名不改旧行)。
|
|
80
85
|
"""
|
|
81
86
|
log_rel = to_history_rel(worklog) if worklog else ""
|
|
82
87
|
tag_cell = esc_cell("、".join(tags) if tags else "")
|
|
@@ -84,8 +89,8 @@ def history_line(
|
|
|
84
89
|
return (
|
|
85
90
|
f"| {finished} | {created or ''} | {esc_cell(title)} "
|
|
86
91
|
f"| {esc_cell(category or '')} | {tag_cell} "
|
|
87
|
-
f"| {esc_cell(owner_cell(owner))} | {esc_cell(owner_name
|
|
88
|
-
f"| {esc_cell(creator_cell(creator))} | {esc_cell(creator_name
|
|
92
|
+
f"| {esc_cell(owner_cell(owner))} | {esc_cell(name_cell(owner_name))} "
|
|
93
|
+
f"| {esc_cell(creator_cell(creator))} | {esc_cell(name_cell(creator_name))} "
|
|
89
94
|
f"| {esc_cell(summary)} | {link} |\n"
|
|
90
95
|
)
|
|
91
96
|
|
|
@@ -94,8 +99,8 @@ def parse_history(text: str) -> tuple[list[Row], list[str]]:
|
|
|
94
99
|
"""解析十一列历史表 → (records, warnings)。坏行(列数不对 / 时间列不合法)跳过并警告。
|
|
95
100
|
|
|
96
101
|
返回的键:finished / created / title / category / tags / owner / owner_name /
|
|
97
|
-
creator / creator_name / summary / worklog / fmt / line。owner 与 creator
|
|
98
|
-
**剥掉 `@`**(存储值是裸 uuid
|
|
102
|
+
creator / creator_name / summary / worklog / fmt / line。owner 与 creator 两列
|
|
103
|
+
**剥掉 `@`**(存储值是裸 uuid);两个名字列剥掉展示用的 `@`(落盘快照,可能为空)。
|
|
99
104
|
"""
|
|
100
105
|
records: list[Row] = []
|
|
101
106
|
warnings: list[str] = []
|
|
@@ -135,9 +140,9 @@ def parse_history(text: str) -> tuple[list[Row], list[str]]:
|
|
|
135
140
|
t.strip() for t in _TAG_SPLIT_RE.split(tag_cell) if t.strip()
|
|
136
141
|
),
|
|
137
142
|
"owner": owner.strip().removeprefix("@") or None,
|
|
138
|
-
"owner_name": owner_name.strip() or None,
|
|
143
|
+
"owner_name": owner_name.strip().removeprefix("@") or None,
|
|
139
144
|
"creator": creator.strip().removeprefix("@") or None,
|
|
140
|
-
"creator_name": creator_name.strip() or None,
|
|
145
|
+
"creator_name": creator_name.strip().removeprefix("@") or None,
|
|
141
146
|
"summary": summary,
|
|
142
147
|
"worklog": (m.group(1) if m else doc.strip()) or None,
|
|
143
148
|
"fmt": "v11",
|