Beads 已死,Linear CLI 万岁

不到一个月前,我写了一篇完整的文章来解释如何在 Claude Code 中使用三层记忆系统:Linear 负责战略,Beads 负责战术,Tasks 负责执行。一个漂亮而优雅的金字塔。 然而现实打脸了。 今天我正式退役 Beads。不是心血来潮,而是因为现实已经充分证明:一个给你带来的麻烦比它解决的还多的工具,不叫工具,叫累赘。 Beads 带来了什么 对于没读过原文的人来说,Beads 是一个基于 git 的 issue 追踪器。它是 Claude Code 的插件,把 issues 以 JSONL 文件的形式存储在你的仓库里。这个想法在纸面上很漂亮: Git 持久化:issues 保存在 .beads/ 目录中,和你的代码一起提交。 依赖关系:一个 issue 可以阻塞另一个。 离线可用:不需要网络连接。 LLM 直接可见:不需要 API,不需要配置。代理读取文件就行了。 它的承诺是:在"这周想做什么"(Linear)和"现在正在做什么"(Tasks)之间提供一个中间层。战术层面的粘合剂。 哪里出了问题 一切都很好,直到不再好了。而且不好的方式还挺有创意。 来自地狱的守护进程 Beads 在后台运行一个守护进程来管理 SQLite 数据库并与 git 同步。听起来很合理。但实际上: DATABASE MISMATCH DETECTED! This database belongs to a different repository: Database repo ID: d1f9ca0c Current repo ID: 01eac8ea ⚠️ CRITICAL: This mismatch can cause beads to incorrectly delete issues during sync! 每次启动会话都会看到这条消息。守护进程崩溃,同步崩溃,然后你就陷入了一种量子态:issues 存在于你的本地 SQLite 中但不在 git 里,或者反过来。你的 issues 同时存在又不存在。 ...

2026年2月18日 · Fernando

Git Worktrees:如何让多个AI助手同时工作而不相互冲突

单一checkout的瓶颈 我正在开发一个macOS菜单栏应用。我有三个功能在待办清单中:一个消耗量的迷你图表、原生通知和一个桌面小组件。这三个功能都是独立的。我打算用Claude Code来完成这三个功能。 问题是:Claude Code在一个目录中工作。一个目录有一个分支。而git checkout就像一个单车道的环岛:一次只能通过一个。 如果我想同时推进这三个功能,我的传统选择是: Stash乒乓球:git stash,切换分支,工作,git stash pop,祈祷没有冲突。重复直到发疯或退休,看哪个先到。 克隆仓库三次:可以工作,但现在我有三个.git/副本,三个独立的历史记录,每个都要执行git fetch。浪费。 接受串行生活:一个功能接着一个功能。安全,可预测,但慢得像手动归并排序。 都不好。但有第四个选择,自2015年以来git就有了,但几乎没人使用。 Worktrees:你已经安装的解决方案 一个worktree是第二个工作目录,共享同一个.git仓库。没有副本,没有克隆,没有黑魔法。 比喻:你的仓库是一个图书馆。到目前为止你有一张桌子,只能打开一本书。worktree是放更多桌子。每张桌子都打开着不同的书,但都从同一个书架取书。 ~/code/miapp/ ← 桌子1 (main) .git/ ← 图书馆(只有一个) ~/code/miapp-sparkline/ ← 桌子2 (feature/sparkline) .git ← 文件,不是文件夹(指向图书馆的指针) ~/code/miapp-notificaciones/ ← 桌子3 (feature/notifications) .git ← 另一个指针 每个目录都是一个完整的checkout,包含所有文件。你可以在一个中编译,在另一个中运行测试,在第三个中让你的AI助手工作。同时进行。 创建只需一行命令 从你的主仓库: 1 2 git worktree add ../miapp-sparkline -b feature/sparkline git worktree add ../miapp-notificaciones -b feature/notifications 就这样。两个新目录,每个在自己的分支上,共享整个git数据库。不需要克隆,不需要配置远程,不需要复制历史记录。 它们共享什么,不共享什么 这很重要。worktrees共享整个仓库:提交、分支、标签、远程、钩子、配置。如果你在sparkline的worktree中做了一个提交,你可以立即从notifications的worktree中看到它,不需要fetch或任何操作,因为它们是同一个数据库。 它们不共享: 磁盘上的文件(每张桌子都有自己的工作副本) 暂存区(每个都有自己的git add) HEAD(每个指向自己的分支) 简单来说:“我正在处理什么"的状态对每个worktree是私有的。其他一切都是公共的。 ...

2026年2月16日 · Fernando

MEMORY.md:你的 AI 自主编写的工作笔记本

“我们昨天不是已经决定这个了吗?” 我正在将我的邮件从 Google 迁移出来。已经用 Claude Code 工作了两个会话:Linear 中的 issues、做出的决策、执行的脚本。我开始第三个会话,问它"degoogle 还剩什么待办事项?" 沉默。完全失忆。 这就像和一个聪明的同事一起工作,但他每天早上来办公室都完全不记得你们前一天做了什么。不记得决策,不记得错误,不记得发现。每个会话都是一张白纸。 结果有一个文件恰好解决了这个问题。它已经在那里几个月了。而且几乎没人知道。 CLAUDE.md vs MEMORY.md:手册和笔记本 如果你使用 Claude Code,可能已经了解 CLAUDE.md。这是你告诉 AI 如何工作的文件:使用什么语言、你有什么工具、你的代码约定。 CLAUDE.md 是你的指令手册。你编写它,你维护它。 MEMORY.md 是另一回事。它是 AI 自己编写的工作笔记本。它记录在与你合作时学到的东西:犯过的错误、做出的决策、项目模式、尝试过但没有成功的东西。 简单来说: CLAUDE.md MEMORY.md 谁编写 你 AI 包含什么 指令 学习内容 何时更改 当你想要时 每次会话后 类比 规章制度 工作笔记本 如果 CLAUDE.md 是你第一天给实习生的合同,MEMORY.md 就是实习生工作时在笔记本中记录的笔记。 它在哪里 ~/.claude/projects/<目录哈希>/memory/MEMORY.md 每个项目目录都有自己的内存文件。如果你在 ~/code/项目-a 工作,它有一个 MEMORY.md。如果你在 ~/code/项目-b 中打开 Claude Code,它有另一个不同的。它们不会混合。 文件在每个会话开始时自动加载到上下文中。你不需要做任何事情。 没有全局的 MEMORY.md 吗? 没有。只按项目分类。这是个问题。 今天我创建了一个 op(1Password CLI)的包装器,缓存密钥一小时。这在我所有项目中都有用,不只是我正在工作的那个。但 MEMORY.md 只在那个目录的内存中记录了它。 CLAUDE.md 确实有全局版本(~/.claude/CLAUDE.md),会在所有会话中加载。MEMORY.md 没有对应功能。如果 AI 学到了适用于你整个环境的东西(别名、系统特性、偏好),它必须在每个项目中分别记录。或者不记录。 ...

2026年2月12日 · Fernando

Linear、Beads 和 Tasks:Claude Code 的三层内存系统

内存问题 Claude Code 有一个问题:它会忘记一切。关闭会话,打开新会话,就像和一个不认识你的人说话。你可以通过 CLAUDE.md 加载上下文,是的,但是那些进行到一半的任务怎么办?你发现但没有修复的 bug 怎么办?你为明天制定的计划怎么办? 有三个互补的解决方案:Linear(或你的产品工具)、Beads(基于 git 的插件)和 Tasks(集成在 Claude Code 中)。每一个都用于不同的时间范围。 Tasks:工作内存 Tasks 是 Claude Code 的内部系统,用于跟踪它现在正在做什么。当你向它请求复杂任务时,Claude 会自动创建一个任务列表。 按 Ctrl+T 查看: ┌─────────────────────────────────────────────────┐ │ Tasks │ ├─────────────────────────────────────────────────┤ │ ✓ 读取项目结构 │ │ ● 实现认证端点 │ │ ○ 编写测试 │ │ ○ 更新文档 │ └─────────────────────────────────────────────────┘ 特性 自动化:当工作有多个步骤时,Claude 会自动创建 压缩后持久:当上下文被压缩时仍然存在 通过 Ctrl+T 可见:快速切换视图 限制为 10 个:只显示前 10 个(请求"show me all tasks"查看更多) 会话间共享 默认情况下,Tasks 会随着会话结束而消失。但你可以让它们持久化: 1 CLAUDE_CODE_TASK_LIST_ID=qualitra claude 这会将任务保存在 ~/.claude/tasks/qualitra/ 中。下次用相同的 ID 启动时,你会恢复任务列表。 ...

2026年1月23日 · Fernando

Claude Code 中的子代理:在不失控制的情况下进行委派

无限上下文的问题 想象一下,你让 Claude 研究项目的身份验证是如何工作的。它开始读取文件。很多文件。突然你的上下文就被 50,000 个令牌的代码填满了,而这些代码你只需要查阅,而不是记住。 现在每个响应都变得更慢。也更贵。当你想做其他事情时,所有这些上下文仍然在那里,占用着思维空间。 解决方案:子代理。你启动一个专门的代理,它在自己的独立上下文中完成繁重的工作,给你返回一个摘要,然后消失。你的主对话保持清洁。 什么是子代理 子代理是 Claude 的一个独立实例,它: 拥有自己的上下文(不会污染你的对话) 可以拥有受限的工具(只读、只有 bash 等) 可以使用不同的模型(haiku 用于简单任务,opus 用于复杂任务) 可以在前台(阻塞)或后台(并行)执行 把它们想象成专门的实习生。你给他们分配任务,他们独立工作,完成后向你汇报。 你已经拥有的子代理 Claude Code 自带几个集成的子代理: 代理 模型 用途 工具 Explore Haiku 搜索和分析代码 只读 Plan 继承 规划期间的研究 只读 general-purpose 继承 复杂的多步骤任务 全部 Bash 继承 在独立上下文中执行命令 只有 Bash Claude Code Guide Haiku 关于 Claude Code 的问题 文档 最有用的是 Explore。当 Claude 需要在你的代码库中搜索内容时,它会启动一个 Explore,疯狂地读取文件,处理一切,然后只返回相关内容。 如何启动子代理 从 REPL(正常对话) 只需用自然语言请求: 使用子代理研究缓存系统是如何工作的 启动 Explore 代理找到所有 API 端点 在我继续工作的同时并行研究身份验证 Claude 理解这些请求,并在内部使用 Task 工具启动适当的子代理。 ...

2026年1月20日 · Fernando

Claude Code 中的 Skills:教老狗学新把戏

重复同样事情的问题 你有没有遇到过必须向某人解释同一件事二十遍的情况?现在想象一下,这个人是个机器人,而且每隔几个小时就会失去记忆。 “不,Claude,commit 必须先通过测试。” “Claude,我已经告诉过你要用 type: description 格式。” “别加表情符号,该死的!” 这就是我每天的工作,直到我发现了 Skills。简单来说:这些是你写一次,Claude 就会永远遵循的指令。就像训练狗一样,但不需要狗粮。 什么是 Skills 从 2.1.3 版本开始,Claude Code 将旧的 slash commands 与更强大的东西合并:Skills。这些是包含指令的 Markdown 文件,Claude 可以通过两种方式执行: 手动:当你输入 /my-skill 时 自动:当 Claude 检测到应该使用它时 第二点就是魔法所在。你不再需要记住调用命令。如果你有一个技能说"在用户完成任务且有未提交的更改时使用",Claude 会自动执行。 就像有一个管家知道何时收拾桌子而不需要你要求。 它们在哪里 ~/.claude/skills/ # 个人(所有项目) .claude/skills/ # 项目(与团队共享) ~/.claude/commands/ # 旧版,仍然有效 .claude/commands/ # 旧版,仍然有效 如果你只想自己使用技能,就把它放在你的主目录。如果你想让整个团队都有,就提交到仓库。就这么简单。 Skill 的结构 一个 skill 是一个带有 frontmatter YAML 和内容的 Markdown 文件: 1 2 3 4 5 6 7 8 --- name: my-skill description: 它做什么的简要描述 --- # 指令 Claude 在调用此技能时应该做什么。 这是最基本的。但 frontmatter 有更多值得了解的选项。 ...

2026年1月12日 · Fernando

Linear 和 Beads:如何避免你的 AI 患阿尔茨海默症

机器人的失忆症 想象一下,你雇佣了一个才华横溢的程序员。他能解决复杂问题,写出整洁的代码,理解你的架构。但他有一个小缺陷:每隔几个小时就会被抹掉记忆。重新从零开始。不记得自己在做什么,不记得你们一起做的决定,也不记得代码为什么是现在这样。 这正是 Claude Code 和其他 AI 代理发生的情况。 当上下文满了(如果你在真实项目中工作,它会很快满),系统就会进行"压缩"。通俗地说:总结对话并丢弃其他所有内容。问题在于这种总结会丢失细节、决策,特别是正在进行的任务状态。 解决方案?两个相互补充的工具:Linear 给你用,Beads 给你的 AI 用。 Linear:你的产品视图 Linear 是一个现代的问题管理器。如果你用过 Jira,想象一下它的反面:快速、简洁,不会让你想挖掉眼睛。 我用它做什么 产品待办事项:功能、bug、史诗。所有业务层面需要完成的事情 路线图:什么先做,什么后做 沟通:团队其他成员(如果有的话)可以看到状态 真实例子 QIN-500: 为应用添加暗黑模式 QIN-501: 优化图片加载 QIN-502: 集成支付网关 这些是产品任务。它们是"需要做什么"。不说明如何做。那是开发者的工作……或者你的 AI 代理的工作。 Beads:你 AI 的记忆 这里就轮到 Beads 登场了,由 Steve Yegge(Google 和 Amazon 著名咆哮文章的作者)创建。 Beads 是一个生活在你代码库内的问题跟踪器。但它不是给你用的,是给你的 AI 代理用的。它是 AI 的持久化内存。 它解决的问题 当我用 Claude Code 处理复杂任务时,会发生这样的情况: 阅读 Linear 中的问题 QIN-500 研究当前架构 创建一个 5 步的心理计划 开始实施… 💥 压缩 💥 “你好,我是 Claude。有什么可以帮你的吗?” 所有的上下文、计划、进度……蒸发了。就像电影《记忆碎片》,但没那么电影化,更让人沮丧。 解决方案 使用 Beads,在压缩之前,状态会持久化到代码库的 .beads/ 中: ...

2025年1月12日 · Fernando