Mole:那款你不知道自己需要的 Mac 清理工具(但只有两个命令值得用)

你的 Mac 现在有多少垃圾文件,是你完全不知道的? 我不是指那些2019年烧烤派对的重复照片,也不是那个简直快变成垃圾堆的下载文件夹。我说的是构建的临时文件,比如那些你疫情后就再也没碰过的 node_modules 文件夹、你甚至不记得安装过的框架缓存文件、堆积如山的 Xcode 的 derived data(派生数据),就像床底下的灰尘一样。 我好几个月磁盘空间占用达到了85%,每次删东西都跟玩杂技一样小心翼翼。直到我发现了Mole,运行了 mo purge --dry-run,屏幕上弹出了一个数字:17GB可回收空间。整理出来了三百五十个被遗忘的构建临时文件,还在那里静静地腐烂着。 十七个G!完全没有碰到任何照片或文档。 什么是Mole(以及它不是什么) Mole 是一个适用于 macOS 的CLI工具,它声称可以“深度清理并优化你的 Mac”。它带有一些看起来像瑞士军刀一样多功能的命令菜单: mo clean # 清理缓存、日志和临时文件 mo uninstall # 完全卸载应用程序 mo optimize # 检查并“优化”系统 mo analyze # 分析磁盘使用情况 mo status # 系统健康监控 mo purge # 删除项目构建临时文件 mo installer # 找到旧的安装包 mo touchid # 配置 sudo 使用 Touch ID 八个命令。直接告诉你吧:**只有两个命令值得你花费时间**。其余的从“嗯,这个我自己就搞定了”到“绝对不可能执行”都有。 ## mo purge:低调的宝藏 如果你是开发者,并且用 Mac 已经超过六个月,那么`mo purge`会帮你发现隐藏的宝藏。简单来说,它会扫描你的项目目录,找出那些占用空间却对你完全没有帮助的构建临时文件。 都有哪些类型的临时文件?基本上都是常见的“嫌疑人”: - **node_modules**(你几个月没碰的 Node/Bun 项目) - **target/**(Rust 项目) - **build/** 和 **.build/**(Swift/Xcode 项目) - **DerivedData**(Xcode 的派生数据) - **__pycache__** 和 Python 的虚拟环境 - **.gradle** 和 **build/**(Java/Kotlin 项目) - **Pods/**(iOS 的 CocoaPods 项目) 这些文件夹的好处是:可以100%重新生成。如果你某天重新打开这个项目,运行一个`npm install`或者`cargo build`,它们会从零重新创建。但在此之前,这些文件像“赖账房客”一样,白占着你的磁盘空间不交房租。 ### 正确的操作流程 首先,一切都从**干跑模式(dry-run)**开始: ```bash mo purge --dry-run 这个命令会显示找到的内容以及可以释放的空间大小,但不会实际删除任何内容。你需要利用这个阶段检查列表,并确定它不会误删掉你正在使用的项目文件(比如你当前有几个窗口正在打开一个项目的node_modules)。 ...

2026年3月23日 · Fernando

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同步。听起来合理?实际状况: 检测到数据库不匹配! 当前数据库属于其他代码库: 数据库记录库ID:d1f9ca0c 当前代码库ID:01eac8ea ⚠️ 严重警告:此错误可能导致同步时误删issues! 这个错误会在每次会话启动时出现。守护进程崩溃、同步失败,导致issues陷入量子态——既存在于本地SQLite又不存在于Git,反之亦然。 幽灵同步 bd sync本应同步Git远程仓库的issues,但经常失效: → 从远程拉取中... 错误:git pull执行失败:退出状态1 remote: 仓库不存在 fatal: 无法访问'https://git.frr.dev/frr/wuwei.git/' 当代码库配置多个remote时(这很常见),Beads可能选错远程仓库。若该仓库不存在或已更名,每次操作都会静默报错。最终issues停止同步,直到下次会话时数据全部消失才后知后觉。 认知损耗 每次Claude Code会话都这样开始: Claude读取Beads提示(通过hooks注入) 尝试启动守护进程 因数据库不匹配失败 Claude尝试bd sync 因远程仓库错误失败 你手动输入"忽略该错误" 终于可以开始工作 六个摩擦步骤消耗着上下文、时间和耐心。 局势转变 两件事让Beads从"带bug的实用工具"沦为"不必要的负担": 1. Tasks的成熟 当初设计三层架构时,Tasks功能简陋。现在已具备: 支持描述和元数据的TaskCreate 带依赖关系的TaskUpdate 查询功能TaskList/TaskGet 通过CLAUDE_CODE_TASK_LIST_ID实现跨会话持久化 简言之:Tasks现已实现Beads的所有会话内功能,且无需守护进程、SQLite或Git同步。 2. Linear CLI问世 原生的Linear管理控制台(MCP)往好了说也很糟糕——延迟高、稳定性差,总在关键时刻掉链子。 直接调用GraphQL API?理论上可行,直到你需要在issue描述中使用特殊字符: # 尝试1:使用bash字符串插值 # 结果:括号和箭头破坏JSON结构 # 尝试2:Python urllib方案 # 结果:因op read无法在Python环境执行报401错误 # 尝试3:默默流泪 # 结果:情绪宣泄但无实际产出 直到发现linear命令行工具: ...

2026年2月18日 · Fernando

线性、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个显示:若需要更多任务显示,可以请求“show me all tasks” 在会话间共享 默认情况下,任务列表会随会话结束而丢失。但你可以让任务持续保存: CLAUDE_CODE_TASK_LIST_ID=qualitra claude 此操作会把任务列表保存到 ~/.claude/tasks/qualitra/ 中。下次使用相同 ID 启动时,可以恢复列表。 使用 Tasks 的场景 场景 Tasks 在一个会话中实现一个功能 ✓ 按定义好的工作计划推进 ✓ 步骤性的 Debugging ✓ 清晰步骤的重构工作 ✓ Tasks 用于执行层面。当你明确知道需要完成什么,只需要辅助工具来进行跟踪。 ...

2026年1月23日 · Fernando

Claude Code中的子代理:授权不失控

无限上下文的困局 假设你让Claude研究项目认证机制。它开始读取文件。大量文件。转眼间上下文已消耗5万token,而这些代码你只需要查阅而非记忆。 响应变慢了。成本增加了。当你想处理其他事务时,这些上下文依然占据着思维空间。 解决方案:子代理。启动专属代理在隔离上下文中处理脏活,返回摘要后自动消失,主会话保持清爽。 何为子代理 子代理是Claude的独立实例,具有以下特性: 专属上下文(不污染主会话) 可限制工具权限(仅读/仅bash等) 可选用不同模型(简单任务用Haiku,复杂任务用Opus) 支持前台(阻塞式)与后台(并行)执行 将其视为专业助理:分配任务后独立工作,完成后汇报结果。 内置子代理 Claude Code预装多个子代理: 代理类型 模型 用途 工具权限 Explore Haiku 代码检索分析 仅读 Plan 继承主模型 规划阶段调研 仅读 general-purpose 继承主模型 复杂多步任务 全权限 Bash 继承主模型 独立环境执行命令 仅Bash Claude Code指南 Haiku 解决Claude Code相关问题 文档查询 其中Explore最实用。当Claude需要检索代码库时,会启动Explore代理疯狂读取文件,处理后仅返回相关部分。 启动子代理 通过REPL(常规对话) 直接使用自然语言指令: 使用子代理研究缓存系统原理 启动Explore代理查找所有API端点 请并行研究认证机制,我继续处理其他任务 Claude能理解这些请求并调用Task工具启动对应子代理。 通过Skill技能 在技能配置中通过context: fork指定隔离执行: --- name: deep-analysis description: 架构深度分析 context: fork agent: Explore --- 进行项目全架构分析 生成包含以下内容的报告: - 目录结构 - 核心依赖项 - 识别到的设计模式 context: fork使技能在子代理运行,agent: Explore指定代理类型。 ...

2026年1月20日 · Fernando

Claude Code 的技能:老狗学新把戏

一再重复的痛苦 你是否曾经不得不一遍又一遍地向某人解释相同的内容?那就想象一下,这种情况还是发生在一台几小时内就会“忘记”你的话的机器人上。 “Claude,提交操作前必须通过测试。” “Claude,我跟你说过要用格式 类型: 描述。” “别加表情符号,拜托!” 这就是我每天的写照,直到我发现了 技能(Skills)。简单来说,就是你只需写一次指令,Claude会永远听以执行。就像训练一只狗一样,只不过这次不需要狗粮。 什么是技能? 从 2.1.3 版本开始,Claude Code 将之前的 斜杠命令(slash commands) 合并成了一种更强大的功能:技能(Skills)。它们是 Markdown 文件,Claude 可以通过以下两种方式执行: 手动:当你输入 /我的技能 时触发 自动:当 Claude 检测到应该使用它时触发 第二点是这个功能的魔力所在。你再也不需要记得手动调用命令了。如果你设置了一个技能,告诉系统:“在用户完成任务且存在未提交更改时使用”,Claude 会自动帮你完成。 它就如同一个不需要你吩咐也会知道什么时候该收拾餐桌的管家。 技能存放在哪里? ~/.claude/skills/ # 个人技能(适用于所有你的项目) .claude/skills/ # 项目技能(与团队共享) ~/.claude/commands/ # 旧版支持,仍然可用 .claude/commands/ # 旧版支持,仍然可用 如果你希望只有你自己可以使用某个技能,可以将其放在 home 目录下。如果你希望整个团队都能用它,则可以将其提交到代码库中。就是这么简单。 技能的基本结构 一个技能是包含 YAML frontmatter 和内容的 Markdown 文件: --- name: mi-skill description: 简要描述此技能的功能 --- # 指令 当调用此技能时,Claude 应执行的具体操作。 这已经是最简单的形式了。但其实 frontmatter 中还有更多值得关注的选项。 必填字段 name 技能的唯一标识符。只能使用小写字母、数字和连字符(最多 64 个字符)。这个字段必须和文件名或文件夹名称一致。 ...

2026年1月12日 · Fernando

Linear与Beads:如何避免你的AI患上健忘症

AI的失忆症 想象你雇佣了一个才华横溢的程序员。他能解决复杂问题,编写干净代码,理解系统架构。但有个小缺陷:每隔几小时就会被清空记忆。所有工作从头开始。他不记得正在做什么,你们讨论过什么,也不理解代码为什么会是现在这样。 这就是Claude Code等AI代理的工作现状。 当上下文填满时(在真实项目中很快会发生),系统会执行"压缩"。说白了就是:总结对话并丢弃其他内容。问题在于这种总结会丢失细节、决策记录,尤其是任务当前状态。 解决方案?两个互补工具:你用的Linear和AI用的Beads。 Linear:产品视图 Linear是现代化任务管理系统。如果你用过Jira,可以想象它的反面:快速、简洁、不会让人想自戳双目。 我的使用场景 产品待办项:功能、缺陷、史诗故事等业务级任务 路线规划:优先级排序 团队协作:其他成员(如果有)可以查看状态 实际案例 QIN-500: 为应用添加深色模式 QIN-501: 优化图片加载 QIN-502: 集成支付网关 这些都是产品级任务,属于"做什么"。不涉及"怎么做",这是开发者…或者说你的AI代理的工作。 Beads:AI的记忆库 这就是Beads的用武之地,由Steve Yegge开发(就是那位以Google/Amazon吐槽闻名的工程师)。 Beads是内置在代码仓库中的任务跟踪系统。但不是给你用的,是给你的AI代理准备的持久记忆。 解决的问题 当我用Claude Code处理复杂任务时,常出现这种状况: 阅读Linear中的QIN-500任务 调研当前架构 制定5步实施方案 开始执行… 💥 内存压缩 💥 “你好,我是Claude。有什么可以帮您?” 所有上下文、计划、进度…全部蒸发。就像电影《记忆碎片》,但没那么戏剧化,却更令人抓狂。 解决方案 使用Beads后,在压缩前会将状态持久化到仓库的.beads/目录: bd create --title "调研现有主题系统" --priority P2 bd create --title "创建ThemeContext" --priority P2 bd create --title "在设置中添加切换按钮" --priority P2 内存压缩后,首先运行: bd ready 立刻就能找回上下文: 📋 可继续任务 (2个无阻碍事项): 1. [P2] acme-a3f2: 创建ThemeContext 2. [P2] acme-b4c5: 在设置中添加切换按钮 工作原理 Beads将所有数据存于代码库中: 你的项目/ └── .beads/ ├── beads.db # SQLite数据库 ├── issues.jsonl # 可版本化的问题记录 └── config.yaml # 配置文件 由于使用git管理,可以和代码一起版本控制。你可以查看历史、创建分支、合并…这是代码本身,不是外部服务。 ...

2025年1月12日 · Fernando