dsh-task-ledger 0.0.95 → 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.95",
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.21
4
+ version: 1.3.22
5
5
  allowed-tools: Read,Edit,Bash,Grep
6
6
  ---
7
7
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "task-ledger",
3
- "version": "1.3.21",
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",
@@ -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 列的展示值:人名前加 @(`@` 只是展示约定,匹配一律用裸 uuid)。"""
36
- return f"@{owner}" if owner else ""
35
+ """owner 列的值:裸 uuid,**不加 `@`**(`@` 只加在名字列;匹配一律用裸 uuid)。"""
36
+ return owner or ""
37
37
 
38
38
 
39
39
  def creator_cell(creator: str | None) -> str:
40
- """creator 列展示值(与 owner_cell 同一 `@` 约定)。"""
41
- return f"@{creator}" if creator else ""
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**(`@` 由 owner_cell / creator_cell 加),外面别先加。
78
- `owner_name` / `creator_name` 是**落盘的显示名快照**(结案那一刻的名字,之后改名不改旧行),
79
- 原值写入、**不加 `@`** —— `@` 只属于 uuid 那两列。
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 or '')} "
88
- f"| {esc_cell(creator_cell(creator))} | {esc_cell(creator_name or '')} "
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",