cq-guojia

task-ledger

本地任务台账,跨会话记录在办任务的归属、进度与起止。当用户要登记一件新的事(新建任务 / 建个坑 / 这活我领了)、记录已有任务的进展(接着做 / 记一条进展 / 这轮先记下)、查看任务状态或历史(现在该做什么 / 这活谁在做 / 上周做过什么)时加载;对某个具体任务要求结案或退回时,只认用户的明确指令;只是改代码、讨论方案时不要用。

cq-guojia 1 Updated 2d ago

Resources

5
GitHub

Install

npx skillscat add cq-guojia/dsh-task-ledger/task-ledger

Install via the SkillsCat registry.

SKILL.md

task-ledger

台账只管三件事:谁在做、做到哪、什么时候建 / 结。状态只在台账 JSON(pool.json + 每人分片),叙事只在 worklog,全部经脚本改。

台账文件

文件 装什么
ledger/pool.json 公共池:还没人认领的任务(owner 空、状态 open)。只由脚本写
ledger/owners.json 索引:身份(git 邮箱)→ 分片文件。只由脚本写
ledger/owners/<hash>.json 每人一份分片:自己认领的任务。字段同下,另带 identity。只由脚本写
ledger/worklog/…md 任务正文,六节:背景 / 待办 / 下一步 / 过程 / 结论 / 执行记录(末节)
ledger/history/<年月>.md 已结案,一行一条。只由脚本写

任务字段:标题 / creator / owner / 状态 / 时间(created started updated finished)/ 分类标签 / 过程文档路径。
一人一份:自己只改自己分片;池里那条是「未认领的登记」,谁都不改它 —— 要动先 claim。

前五节你直接编辑;末节「执行记录」只由脚本追加,一个字都不许手写。
不另建副本、不手改状态表和历史、不自己拼 worklog 文件名(new 会建好并给路径)。
台账 ≠ 产出物:成果按所在项目自己的约定落盘,台账只放「建/做/结」和指向成果的链接。

什么时候用

❌ 项目没有 ledger/ 且只是临时一次性的事 → 先问要不要建台账(没有 init:第一条写命令会自动把台账建好)。
❌ 只想改某任务正文 → 用 show 拿路径与全文直接改,不要另建 md;已结案的用 history 找链接。

意图 → 命令

用户说 动作
「现在该做什么」「我还有啥没做完」 list --mine(只读自己分片)
「谁在做 X」 list --owner <某人的 git 邮箱>(me 指自己);先看 ledger/owners.json 的 workers 键确认标识
「有哪些在办」 list(默认 = 公共池 + 自己分片);要全量加 --all;只看待认领加 --status open
「这个任务到哪一步了」「这轮做了什么」 show --id(任务 JSON + worklog 全文)
「某件老活什么时候做的」「谁做过哪些活」 history(可按 --owner / --since 筛)
「哪些任务停太久」 list --json(默认只看池 + 自己分片,要看所有人加 --all)拿 created / started / updated 自己比时间:updated 满 3 天=停滞、started 满 14 天=逾期、created 满 30 天仍 open=积压。脚本不算这三个值、也不写进 JSON(别改状态去表达)
「新建一个任务」 new(--self = 建完即认领)
「这活我领了」 claim(只对 open 有效)
「开始做 / 接着做 X」 还是 open 就先 claim;已是 doing 就直接改正文 + log
「继续做」「推进一下」 改「下一步 / 过程」,再 log --note "本轮做了 X,下一步 Y"
「记一下这轮」「这段做完了」 log --id <任务号> --note "…"(agent 可主动做)
「卡住了」「先放一放」 写清卡在哪(不改状态),再 log
「退回待认领」「让别人接」 set --status open(记 release),回待认领
「转给某人」 skill 不换人:你先释放,对方自己 claim;不许替用户写别人的名字
「彻底不做了」「取消这个任务」 close --summary "放弃:原因"(需用户明说)
「做完了」「验收通过」「结案」 close(需用户明说,见红线)
「把某任务过程补一下」 show --id → 改前五节 → log
台账可疑(索引 ↔ 分片不一致、同一任务号两份) validate(只报不改)
「标签太乱」「两个标签一个意思」 tags --all 看频次(表里「在办 / 已封卷」两列,--rename 只动在办)→ tags --rename 旧 新 --dry-run 报条数与任务号 → 确认后去掉 --dry-run

命令怎么调

python3 <本 SKILL.md 所在目录>/scripts/progress.py <子命令> --repo <当前工作区>

子命令:new claim set log close list history show tags validate。
定位项目:--repo <目录> 优先;不给就按「git 仓根 → 含 docs/ 的上级」自己找,传子目录会抬到台账根。
参数细节一律看 <子命令> --help(不要凭记忆编参数)。
new / claim / set / show 返回 worklog 路径 + 全文;log 回一行确认、close 回结案摘要,list / history 只回摘要不吐正文。

铁律

  • 状态只有 open / doing;done 只能由 close 产生。没有 blocked 状态:逾期 = started 满 14 天、停滞 = updated 满 3 天、积压 = created 满 30 天且仍 open,都由看板按时间算,台账里不存、不手改;卡在哪写进正文。
  • log 就是刷新 updated 的动作:该记不记,任务会被看板标成停滞。
  • owner = 当前 git 邮箱(git var GIT_COMMITTER_IDENT,退回 git config user.email),不能由外部传入;在 git 仓库里读不到就报错(与 git 自己提交不了对齐)。只能动自己分片里的任务(open 的先 claim),不在你分片里的直接拒绝 —— 不要绕过脚本改 JSON。
  • 换人只能「释放 → 认领」:set --status open 把任务搬回 pool.json,对方自己 claim;不许替别人挂名字。脚本确实留着 set --owner(看板 / 维护者通道,当前没有任何端在用),agent 一律不得使用 —— 它能把任务直接写进别人分片,绕过释放 → 认领。
  • 「执行记录」禁手改:只由脚本按 new / claim / set / release / log / close 追加,只增不改;手写=伪造时间线,且不刷新 updated。
  • 改正文必配一条日志:只要动了 worklog 的正文(改一句、补一节、改标题、修错字都算),必须立刻跑一次 log。没有对应日志的正文改动 = 这轮没做完 —— 时间线上会留下你改过、但没人知道为什么改的空洞。(纪律条款,脚本不校验,别指望它兜底。)
  • 升级前建的老 worklog 没有这一节:不用你补,脚本第一次记时自动在文末补一节;文档丢失时 log 报错,用 show 查路径,不要手写。(updated 一般在报错前就刷新了;若这条命令同时触发过写前取最新,失败收尾会把整份文件回滚,updated 也就跟着回退 —— 以 show 看到的为准。)
  • 旧数据里的 blocked:list --status doing 会一并捞出(读侧当进行中),--status blocked 也能精确定位;用 set --status doing 归位。看板侧同样按进行中统计。

细节见 references/state-model.md。

过程文档

  1. 建档:new 按模板建六节骨架并把路径写进任务对象(worklog 字段)。
  2. 推进:你直接编辑前五节,标题不许改名(脚本不校验六节标题,validate 只查骨架与缺失);每改一轮正文就配一条日志——同一次编辑动作里连改多处只记一条,改完立刻 log --note "这轮做了什么"。
  3. 交付(待验收):任务仍留 doing,「待办」写「待用户验收」,「下一步」写清验收该看什么;这轮照样要走收工三步。结论只写可验证事实,评价等用户验收。
  4. 封卷:close 打封卷标记,此后不再改;文档靠 history 给的回链找回。

细节见 references/worklog.md。

每次收工必做(「收工」= 这一轮对用户有可见产出)

  1. 改正文:这轮变化的事实都落笔,「下一步」写具体动作,不写「继续推进」。
  2. 跑 log:这一轮只要改过正文就必须记(一轮至少一条);正文没变也能记一条推进,但要同时重写「下一步」。
  3. 回读末行(tail -n 3 <路径> 或 show --id):说明 = 这轮的事;时间是UTC(北京时间就是「现在 − 8 小时」,别当成没记上)。

交付前必须走完这三步;不走,这轮等于没发生,看板还会标停滞。

什么算一个节点:明天你自己想不起来、或换个人接手会看不出的事,就记一条;一次状态/结论变化对应一条,不对应一次工具调用。
--note 一句一条、约 60 字、含命令 / 文件:行号 / 符号名 / 结论之一(纪律条款:脚本只拒空值,不限长度)。
不记:读文件、跑 list、改错别字、依赖锁文件变更。

细节与正反例见 references/log-note.md。

分类与标签

new 时自行总结:--category 答「是什么类型」(单值:中文按字符 ≤4、纯英文按单词 ≤3,吃不准写「其他」);--tags 答「涉及什么」(0~5 个;写不出就不传这个参数,传空串等于没传)。
口径错开:tags 不许写 category 的同义词(纪律条款,脚本不校验)。统计只认 category,查询用 tags(包含匹配)。

细节见 references/taxonomy.md。

写操作红线

命令 档位 要求
new / claim / set 动手类 执行前把完整参数复述给用户并取得确认
log 免确认 本任务的推进 / 卡点 / 交付记录直接跑,跑完一句话交代「已记执行记录:…」;要替用户下结论、或替别人记,先问
close 独立授权 只认用户明确的验收 / 结案 / 放弃指令;agent 自判「干完了」不算 —— 那是交付,停在 doing 等用户回话
tags --rename 批量写 先 tags --all 看频次(只信「在办」列),再 tags --rename 旧 新 --dry-run 拿到条数与任务号,报给用户确认,最后去掉 --dry-run 才真改
list / show / history / validate / tags --all 只读 直接跑

出错即停

非 0 退出就停手、原样报告,不要绕过脚本手改台账 JSON(pool.json / owners/)或历史层。
退出码 0 不等于没事:写命令之后的同步(commit / push)失败仍返回 0,原因只写在输出里。写命令跑完必看输出,出现 提示: / 错误: / 警告: 就先用一句话说清「发生了什么 + 你要做什么」,再附原文关键行,按 references/troubleshooting.md 对应条目给步骤;纯告知类(如已用 --no-verify 提交)一句话带过。只读命令只有 错误: 才需要转述。
并发冲突(文件被改动)重跑一次即可,台账同步一律交给脚本,不要自己用 git pull / rebase 去「解决」;只有提示明确说脚本已回滚、或说它不替你 rebase 时,才让用户手动 git pull --rebase / git merge 后 git push,推完再重跑。
写前会定向取最新:只刷新本次要写的台账文件(owners.json、自己的分片、认领/释放涉及的 pool.json、close 当月的 history/)以及本次命令要改写的那一篇 worklog(log / claim / set / close / tags --rename;干净就刷成最新,本地有未提交的手写改动则先 stash → 快进 → 叠回,冲突即中止)。worklog/ 里其余已有的正文一个字都不动,只补本地缺的新文件;
有未推送的台账提交时先自动补推再写,不要让用户先去 push(push 是分支级的:本地属于用户自己的提交会一并被推走,脚本只提示、不 rebase);补推失败、本地台账有未提交改动、未入库的同名文件,都会中止 —— 按提示处理,或加 --no-sync(写在子命令前后都行)继续本地写。
同一仓库里写命令排队执行(最多等 60 秒),并发时不要重试轰炸,等前一个跑完再重跑。

细节见 references/troubleshooting.md。

references(按需读,别全读)

何时读 文件
要传 --created / --finished 补录时间、看到旧 blocked、答「停太久」要解释口径 references/state-model.md
填正文前、补老任务文档、log 报错找不到文档 references/worklog.md
拿不准一条记录够不够格、--note 怎么写 references/log-note.md
写分类/标签、用户说标签太乱要归并 references/taxonomy.md
任何非 0 退出、退出码 0 但有 提示: / 错误:、并发冲突、validate 报错 references/troubleshooting.md