太长了
具有CLI、交互式TUI和MCP服务器的最小全局标记任务日志。
灵感源自 Backlog.md,但其核心思想是保持现有markdown文件的原样。 tl 将结构化任务叠加在自由形式的markdown之上,而无需重写或重组内容。它支持具有不同角色的多个文件,因此您可以有一个主工作日志、一个单独的愿望清单和其他任何东西,所有这些都可以通过一个工具进行管理。
Backlog.md感觉更适合团队协作,需要单独的目录设置。我已经有了 log.md 我使用的文件混合了TODO、思想转储和活动更新。问题是低优先级任务一直被埋没,如果我在给定日期写一个TODO,它会在一周内消失在新条目下,我必须手动滚动以确保没有遗漏任何内容。这个想法与 tl 我可以继续以相同的方式使用我的日志,但每个TODO都会以结构化的方式进行跟踪,因此无论任务有多旧,都不会丢失。添加MCP支持是因为通过 PLAN.md 可能很难审查,让代理在任何项目中创建和跟踪任务并附上简短的注释似乎是一种更好的方法。
运作原理
tl 将日志文件视为事实的来源。它识别遵循严格模式的结构化任务:
- [ ] tag-1 some task title
- a note on this task
- [x] tag-2 a completed task
- [ ] tag-3! a high priority task文件中的其他所有内容(自由形式的项目符号、散文、标题、链接)都保持不变。各节由日期标题分隔:
### 12/02/2026
- [ ] dev-1! review the scan results
- check the false positives
- escalate critical findings
### 11/02/2026
- [x] infra-3 rotate production keys标签充当项目标识符。每个标签都有自己的自动递增计数器,所以 dev-1, dev-2, infra-1等等都是独立的。
__优先__ 标有a ! 在任务ID之后(例如。 dev-1!).默认情况下,所有内容都是低优先级的,可以随时切换。
__任务链接__ 自动检测。如果一张便条包含以下内容 continuing bb-5 with a modification,参考 bb-5 是公认的,可以在TUI中遵循。
安装
需要Rust 1.88+。
cargo install --path .这将安装 tl 二进制到 ~/.cargo/bin/.
入门
# Initialize with the default log location (~/.config/tasklog/log.md)
tl init
# Or point to your existing log file
tl init --log ~/notes/log.md这将创建:
~/.config/tasklog/config.toml--配置~/.config/tasklog/state.json--用于ID分配的标记计数器- 您的日志文件(如果不存在则创建,如果存在则保留)
命令行界面
# Add a task
tl add dev implement the login flow
# => created dev-1
# Add a high priority task
tl add -p dev fix the auth bypass
# => created dev-2
# Mark a task as done
tl done dev-1
# => completed dev-1
# Reopen a completed task (moves it to today's section)
tl undo dev-1
# => reopened dev-1
# Edit a task's title
tl edit dev-1 implement the login flow v2
# => edited dev-1
# Delete a task and all its notes
tl delete dev-1
# => deleted dev-1
# Toggle priority
tl priority dev-2
# => dev-2 marked as high priority
# Add a note to a task
tl note infra-1 blocked on access request
# => noted on infra-1
# Rename a tag across the entire log
tl rename infra infrastructure
# => renamed infra -> infrastructure
# Search across tasks and notes
tl search rotate
# => [x] infra-1 rotate production credentials
# Show today's raw section
tl today
# Manage multiple log files (see Multi-file support)
tl file add --path ~/wishlist.md --label wishlist --mode fixed --tags wish --insert top
tl file list
tl file remove wishlist文本用户界面
tl tuiTUI有三个面板: __项目__ (左)列出了所有具有打开/总计数的标签, __打开__ (中心)显示所选项目的未完成任务,以及 __完成__ (右)显示已完成的任务。
优先级任务排序到顶部并以红色呈现。标签截断为 … 当终端太窄时。
键绑定
| 关键 | 行动 |
|---|---|
j / k | 向上/向下导航 |
h / l | 左/右开关面板 |
Tab / Shift+Tab | 循环面板焦点 |
Enter | 打开任务详细信息弹出窗口 |
a | 添加任务(如果在任务面板上,则自动选择标记) |
e | 编辑所选任务标题 |
x | 删除所选任务(或在详细弹出窗口中注释) |
d | 将所选任务标记为已完成 |
u | 撤消已完成的任务(从“已完成”面板) |
n | 为所选任务添加注释 |
p | 切换优先级 |
R | 重命名标记(从“项目”面板) |
/ | 搜索 |
c | 清除搜索筛选器 |
. | 切换隐藏没有打开任务的项目 |
g / G | 跳到顶部/底部 |
r | 从磁盘刷新 |
b | 点击任务链接后返回 |
? | 显示帮助 |
q / Esc | 关闭弹出窗口或退出 |
详细信息弹出窗口
按 Enter 在任何任务上打开详细信息弹出窗口。里面:
j/k选择单个笔记x删除所选注释(如果未选择注释,则删除任务本身)e编辑任务标题p切换优先级- 注释中的任务ID引用(如
bb-5)突出显示。按n在检测到的链接中循环f跟随/跳转到链接的任务。b回去。
MCP服务器
tl mcp服务器通过以下方式进行通信 stdio 并公开了这些工具:
| 工具 | 说明 |
|---|---|
init_log | 初始化任务日志环境 |
create_task | 使用标签和标题创建新任务 |
complete_task | 按ID将任务标记为已完成 |
add_note | 向现有任务添加注释 |
search_tasks | 搜索任务和笔记,可选择按标签过滤 |
get_today_section | 获取今天部分的原始文本 |
大多数MCP兼容工具接受服务器定义,如:
{
"tasklog": {
"type": "local",
"command": ["tl", "mcp"]
}
}唯一的要求是 tl 在你的 PATH。您可以使用MCP检查器进行交互式测试:
npx @modelcontextprotocol/inspector tl mcp多文件支持
默认情况下 tl 对单个日志文件进行操作。您可以使用以下命令以不同的模式和行为注册其他文件 tl file:
# Add a wishlist file that only accepts the "wish" tag, with new tasks at the top
tl file add \
--path ~/notes/wishlist.md \
--label wishlist \
--mode fixed \
--tags wish \
--insert top
# Add a second general-purpose log
tl file add \
--path ~/notes/work.md \
--label work \
--mode variable
# List configured files
tl file list
# => [main] ~/.config/tasklog/log.md (variable)
# => [wishlist] ~/notes/wishlist.md (fixed(wish), insert=top)
# => [work] ~/notes/work.md (variable)
# Remove a file
tl file remove work当你添加第一个文件时, tl 自动迁移您现有的 log_path 随着 main 变量文件,这样就不会有任何损坏。
文件模式
__变量__ 文件接受任何标签。这是默认设置。如果你有多个变量文件,并添加了一个带有新标签的任务,TUI将显示一个文件选择器,这样你就可以选择它的位置。
__固定的__ 文件只接受特定的标签。一个固定文件 tags = ["wish"] 将永远不会收到任何其他标签的任务,并且 wish 标签将始终路由到该文件。这可以防止事情混淆。
插入位置
每个文件都有一个插入位置,用于控制新日期部分的显示位置:
bottom(默认)--新建### date章节附在末尾。这是正常的按时间顺序的日志行为。top--新的部分被添加到文件的顶部。当你有一个现有的文件,其中包含你想保留在下面的自由形式内容时,这很有用,比如一个带有注释和链接的愿望清单,应该放在底部,而新跟踪的任务则显示在顶部。
路由如何工作
当您添加任务时,路由器会决定将其发送到哪个文件:
- 如果任何固定文件声明了标签,则任务将转到那里。
- 否则,所有变量文件都符合条件。如果只有一个,它是自动的。如果有多个,TUI会显示一个选择器,CLI默认为第一个。
对于现有任务的操作(已完成、撤消、注释、编辑、删除),路由器会扫描所有文件,按ID查找任务。标记重命名也会在所有文件中操作。
今天搜索,TUI聚合每个注册文件中的任务。在多文件模式下,TUI面板在其标题中显示文件标签(例如。 Open — wish — wishlist).
配置格式
这 [[files]] 数组输入 config.toml 驱动多文件。如果缺席, log_path 用作单个变量文件:
log_path = "~/.config/tasklog/log.md"
date_format = "DD/MM/YYYY"
note_indent = 6
scan_window_lines = 5000
[[files]]
path = "~/.config/tasklog/log.md"
label = "main"
mode = "variable"
[[files]]
path = "~/notes/wishlist.md"
label = "wishlist"
mode = "fixed"
tags = ["wish"]
insert = "top"配置
Config住在 ~/.config/tasklog/config.toml:
log_path = "~/.config/tasklog/log.md"
date_format = "DD/MM/YYYY"
note_indent = 6
scan_window_lines = 5000| 字段 | 描述 | 默认值 |
|---|---|---|
log_path | 日志文件的路径(支持 ~) | ~/.config/tasklog/log.md |
date_format | 节标题的日期格式 | DD/MM/YYYY |
note_indent | 缩进注释的空格数 | 6 |
scan_window_lines | 仅解析日志的最后N行以了解性能 | 5000 |
files | 多文件配置(参见 多文件支持) | 未设置 |
hide_empty_projects | TUI从没有隐藏打开任务的项目开始(使用 .) | false |
关键在于 log_path 您可以将其指向您已经使用的现有markdown文件。 tl 将在您的自由形式内容旁边添加结构化任务,而不会干扰它。当您开始使用多文件时, log_path 如果没有,仍然可以作为后备方案 [[files]] 已配置。
设计决策
- __叠加,而非接管__ --
tl只读取和写入与其严格任务模式匹配的行。你的自由标记对它是不可见的,也从未被修改过。 - __带路由的多文件__ --任务根据标记路由到正确的文件。固定文件强制标记边界,可变文件接受任何东西。ID在所有文件中都是全局唯一的。
- __全局,而不是每个项目__ --一个用于所有事情的工具,带有用于分隔关注点的标签。多个文件允许您按域(工作日志、愿望清单等)拆分,而不会丢失统一视图。
- __原子写入__ --所有文件突变都使用
write-to-temp然后rename,因此您的日志永远不会处于半写状态。 - __文件锁定__ --通过以下方式并发CLI/TUI/MCP访问是安全的
flock. - __扫描窗口__ --每个文件只解析最后N行,因此即使在大型日志文件上,该工具也能保持快速。
