dsh-task-ledger 0.0.91 → 0.0.92

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.91",
3
+ "version": "0.0.92",
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.17
4
+ version: 1.3.18
5
5
  allowed-tools: Read,Edit,Bash,Grep
6
6
  ---
7
7
 
@@ -15,7 +15,7 @@ allowed-tools: Read,Edit,Bash,Grep
15
15
 
16
16
  ## 身份闸门(未初始化时怎么走)
17
17
 
18
- **任何命令返回「这台机器还没有初始化身份」⇒ 停下,不许绕。** 身份是用户自己的,不是你的决定:不替用户选、不读 `ledger/*.json` 兜底、未初始化时不写任何东西。**具体走法(用户自跑 / 你代跑的分步流程、Y/N 与回退)见 `references/init-identity.md`,按那里一步步做;未初始化时别 `ls` / 扫描仓库或读文件,只跑裸 `init` 报名单、然后问用户。**
18
+ **任何命令返回「这台机器还没有初始化身份」⇒ 停下,不许绕。** 身份是用户自己的,不是你的决定:不替用户选、不读 `ledger/*.json` 兜底、未初始化时不写任何东西。**具体走法见 `references/init-identity.md`;你只能报名单 + 给用户命令,写身份必须用户自己在终端完成。未初始化时别 `ls` / 扫描仓库或读文件,也不要基于「上次确认过 / 同名」自行重建。**
19
19
 
20
20
  ## 手写边界
21
21
 
@@ -35,7 +35,7 @@ allowed-tools: Read,Edit,Bash,Grep
35
35
  | `--claim <uuid>` | 认领名册里已有的 uuid(名字一起复制) |
36
36
  | `--new --name "…"` | 新建身份:生成 uuid + 名字 |
37
37
 
38
- 干什么:写本机身份文件(`~/.taskledger/identity.json`),**一台机器只一次**,与台账无关。真终端里裸跑 `init` 是交互式选择框(↑/↓ 选、Enter 认领、末尾「+ 新建身份」输名字、Y/N 确认、ESC/Ctrl-C 取消);非终端(agent)下裸跑 `init` 只报名单,写操作须带 `--yes`。完整流程见 `references/init-identity.md`。
38
+ 干什么:写本机身份文件(`~/.taskledger/identity.json`),**一台机器只一次**,与台账无关。真终端里裸跑 `init` 是交互式选择框(↑/↓ 选、Enter 认领、末尾「+ 新建身份」输名字、Y/N 确认、ESC/Ctrl-C 取消);非终端(agent)下裸跑 `init` 只报名单,任何写操作都被脚本拒绝(Agent 不得代写/重建)。完整流程见 `references/init-identity.md`。
39
39
 
40
40
  ### new — 建任务
41
41
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "task-ledger",
3
- "version": "1.3.17",
3
+ "version": "1.3.18",
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",
@@ -2,51 +2,33 @@
2
2
 
3
3
  触发:任何命令返回「这台机器还没有初始化身份」。身份是用户自己的,**不是你的决定**。
4
4
 
5
- **触发后立刻照做,不要探索。** 除「裸跑 init 只读报名单」这一条外,不要 `ls` / 扫描仓库、不要读任何目录或文件(`ledger/`、README、源码都不读),不要猜身份。没拿到用户名时只做两件事:报名单、问用户。
5
+ **触发后立刻照做,不要探索。** 除「裸跑 init 只读报名单」外,不要 `ls` / 扫描仓库、不要 `cat identity.json`、不要读任何目录或文件,不要猜身份。
6
6
 
7
- 先问用户走哪条:
7
+ **你没有写身份的权限。** 非终端下 `init --claim` / `init --new` 一律被脚本拒绝,`--yes` 也已禁用。你只能:报名单、给用户命令、等 ta 跑完。
8
8
 
9
- 1. 用户自己在终端执行(推荐)
10
- 2. 你一步步代跑
9
+ ## 你该做的(只有这几步)
11
10
 
12
- ## 路径 1:用户自跑
13
-
14
- 给用户这条命令,让 ta 在自己的终端里跑:
11
+ 1. 只读报名单:
15
12
 
16
13
  ```
17
14
  python3 <本 SKILL.md 所在目录>/scripts/progress.py init --repo <工作区根>
18
15
  ```
19
16
 
20
- 交互式:↑/↓ 选、Enter 认领、末尾「+ 新建身份」输名字、Y/N 确认、ESC/Ctrl-C 取消。
21
- 用户说「好了」后,重跑原来那条命令。
22
-
23
- ## 路径 2:你代跑(分步,每步停下等用户回答)
17
+ 2. 把名单原样给用户,并附上第 3 步的命令:
18
+ - 有名单 ⇒「名册现有:@A(uuid)、@B(uuid)。请在你的终端运行下面这条,它会让你选。」
19
+ - 没名单 ⇒「名册为空。请在你的终端运行下面这条,输入一个用户名新建。」
24
20
 
25
- 1. 只读报名单(非终端下裸跑 `init` 就是只读,不写):
21
+ 3. 让用户在自己终端跑这条(交互式:↑/↓ 选、Enter、末尾「+ 新建身份」输名字、Y/N 确认、ESC 取消):
26
22
 
27
23
  ```
28
24
  python3 <本 SKILL.md 所在目录>/scripts/progress.py init --repo <工作区根>
29
25
  ```
30
26
 
31
- 2. 把名单原样给用户:
32
- - 有名单 ⇒「名册现有:@A(uuid)、@B(uuid)。请告诉我要用哪一个;或回「新建」并给出用户名。」
33
- - 没名单 ⇒「名册为空,请给一个用户名。」
34
- 3. 复述并要确认:
35
- - 选现有 ⇒「您确认是要使用「@X」这个身份吗?回复 Y 或 N。」
36
- - 新建 ⇒「您确认要用「X」这个名称新建账户吗?回复 Y 或 N。」
37
- 4. 仅当用户这一轮明确回 Y,才执行(注意 `--yes`):
38
- - 认领:`... init --claim <uuid> --yes --repo <工作区根>`
39
- - 新建:`... init --new --name "X" --yes --repo <工作区根>`
40
- - 回 N ⇒ 回到第 2 步重选。
41
- - 用户取消 / 不回 ⇒ 停,什么都不写。
42
- 5. 成功后重跑原命令;失败照实报告并停。
27
+ 4. 用户说「好了」后,重跑原命令。用户没跑完就等着,不要替 ta 写。
43
28
 
44
29
  ## 硬规则
45
30
 
46
- - 不自己编 uuid 或名字;不猜身份。
47
- - 没有用户这一轮的明确 Y,**不得**加 `--yes`。
48
- - 用户没回,不要自己继续。
49
- - 不读 `ledger/*.json`、worklog 去"自己看"。
31
+ - **不得**替用户执行 `init --claim` / `init --new` / 任何带 `--yes` 的写法——脚本也会拒绝。
32
+ - **不得**基于「上一轮确认过 / 同名 / 记得 uuid」自行重建身份:身份文件缺失就是未初始化,必须让用户重新亲自选。重建会换新 uuid、断开旧任务关联。
33
+ - 不读 `ledger/*.json`、worklog、identity 文件去「自己看」。
50
34
  - 未初始化时不做任何写。
51
-
52
- `--yes` 只表示「用户已在此对话中明确同意」,不是安全沙箱:Agent 无视规则时脚本拦不住,靠的是这份流程约束。
@@ -111,7 +111,7 @@ def build_parser() -> argparse.ArgumentParser:
111
111
  initp.add_argument(
112
112
  "--yes",
113
113
  action="store_true",
114
- help="非交互写入确认(由 Agent 在用户明确同意后使用)",
114
+ help="已禁用:身份写入只能在真终端交互完成",
115
115
  )
116
116
 
117
117
  # 宿主(插件 / SKILL.md)的调用写法是 `progress.py list --repo <仓库>`:
@@ -426,17 +426,22 @@ def _run_init(args: argparse.Namespace) -> int:
426
426
  tty = sys.stdin.isatty()
427
427
 
428
428
  try:
429
+ if yes:
430
+ raise Fail(
431
+ "--yes 已禁用:身份写入只能在真终端交互完成,Agent 不得代写或重建身份。\n"
432
+ " 处理:请用户在自己的终端运行 `python3 progress.py init --repo <工作区根>`。"
433
+ )
429
434
  existing = env.read_identity()
430
435
  if existing is not None:
431
436
  # 已初始化:幂等空转(带不带 flag 都一样,零写)
432
437
  res = init_identity(repo, claim=claim, new=new, name=name)
433
438
  elif claim or new or name:
434
- # 非终端写入必须带 --yes:Agent 只能在用户明确同意后代跑(2026-10-26 事故)
435
- if not tty and not yes:
439
+ # 身份写入只能由用户在真终端交互完成;非终端(agent)一律拒绝(2026-10-26 事故)
440
+ if not tty:
436
441
  raise Fail(
437
- "非交互写入身份需要用户明确同意。\n"
438
- " 处理:先裸跑 init(只读)把名册报给用户,取得明确同意后再加 --yes 重跑;\n"
439
- " 或请用户自己在终端运行 init(交互式选择/新建)。"
442
+ "身份写入只能在真终端交互完成;Agent 不得代写或代为重建身份。\n"
443
+ " 处理:请用户在自己的终端运行 `python3 progress.py init --repo <工作区根>`,\n"
444
+ " 由 ta 亲自选择/新建并确认。"
440
445
  )
441
446
  res = init_identity(repo, claim=claim, new=new, name=name)
442
447
  else: