Atlas 新手教程
给编程智能体做「版本控制」的桌面应用。它把每一次 agent 会话和你提交的代码连成一条链——几个月后你还能问:这段代码是哪个 agent 写的、当时让它干什么、它怎么想的。
01这是什么
一句话:Atlas 是编程智能体的源代码管理器(source control for coding agents)——它管的不是代码,是「产生代码的过程」。
你打开一个项目文件夹,在里面跑 Claude Code、Codex、Atlas 自带的 agent,或者任何符合 ACP(Agent Client Protocol)协议的 agent。agent 每一次提交都会变成一个检查点(checkpoint),并反向链接回产生它的那次会话——提示词、工具调用、它改过哪些文件,全部绑在一起。
git commit 记录的是「代码变了什么」;Atlas 的检查点记录的是「谁让它变、为什么变」。两者用同一个提交连起来,而且这份记录活在本地。
它明确不做什么
新手最容易误解的地方,往往不是「它能干什么」,而是「它是不是又一个 X」。先把边界划清:
它不是一个新 agent
Atlas 不跟你抢「谁的模型更强」。它是调度方:Claude Code、Codex、Cursor、OpenCode、Kilo Code 都在同一个窗口里跑,走同一条发送路径。
它不是云端 IDE
本地优先。代码、笔记、会话都留在你机器上,账号是可选的。唯一需要联网的场景,是你自己选的那个 agent 要调 API。
它不是团队 code review 平台
检查点服务的是你自己事后追问「这段代码背后的那次会话发生了什么」,不是给别人贴评论、开讨论串。
它不是跨平台的
官方写得很直白:只有 macOS 是受支持的平台。Linux 和 Windows 能从同一套 Tauri 代码编译,但未经测试,作者欢迎这两个平台的问题反馈。
alpha-0.3.1。作者在贡献指南里列出的求助方向也很实在:Linux / Windows 生产包测试、更多 ACP agent、LSP 支持、MCP 接入、主题配色。
02为什么需要它
先看你今天是怎么凑合的——如果下面三条你一条都没中,那 Atlas 可能真的不是给你用的。
三个常见的失败 workaround
| 你现在的做法 | 它会在哪一步断掉 |
|---|---|
靠终端滚动历史,或者 agent 自己的 --resume | 终端一滚就没了;而且 agent 之间读不到彼此的记录——Claude Code 的会话历史,Codex 看不见。 |
在每个仓库手写 CLAUDE.md / AGENTS.md | 每个 agent 只认自己那一份,于是同一件事被抄成好几份;改了一处,另外几处悄悄过期。 |
把 agent 生成的东西直接提交,之后靠 git log 猜 | 提交信息只说了「改了什么」。三个月后你盯着一处诡异的实现,没人能告诉你当初让它干什么。 |
核心洞察
把这三条串起来看,会发现它们是同一个缺口的不同表现:agent 的产物(代码)已经有版本控制了,agent 的过程(提示词、工具调用、推理、失败)没有。
Atlas 的做法是给「过程」补上这一层,然后让两边在「提交」这个点上咬合起来。它有三条不变量,理解了这三条,后面所有功能你都能自己推出来:
| 不变量 | 含义 |
|---|---|
| Atlas 拥有历史 | 侧边栏只读 Atlas 自己的 threads.db,不读 agent CLI 的私有存储(ADR-0001)。所以 agent 换版本、改存储格式,你的历史还在。 |
| 线程 ≠ 会话 | thread 是 Atlas 跟踪的对话(id 由 Atlas 生成),session 是 agent 那一侧的对话(ACP id)。两者对「一条消息」的理解本来就不同,中间有专门一层做调和。 |
| 流独立于标签页 | agent 的输出流由投影层广播,不挂在 UI 组件上。所以切标签页不会打断正在跑的某一轮。 |
别人给你的是「一个聊天面板贴在一个编辑器上」;Atlas 给的是「agent 运行时 + 共享记忆 + 会话历史」这三样当地基,编辑器和终端反而是后来砌上去的墙。
03核心概念与流程
三个动作就能走完一圈:打开项目、跑一个会话、看检查点。
先认词
官方文档把每个术语只在「概念」页定义一次,别处一律链接过去。这里把你会立刻用到的挑出来:
项目 · Project
Atlas 工作的一个文件夹,外加它旁边创建的 .atlas/ 目录。打开文件夹是它唯一要求的设置——没有配置文件,没有向导。
组织 · Organisation
拥有项目的账号容器,带成员和角色。每个项目属于恰好一个组织;Atlas 自动给你建一个本地「Personal」,所以你永远不用自己去建。
会话 · Session
一次 agent 对话,被记录下来、可恢复:每条消息、每次工具调用、每处文件改动,实时落盘。
检查点 · Checkpoint
会话与它所产生的那次提交之间的链接。一个会话可以产生多次提交,每次各自成为一个检查点。这是 Atlas 区别于普通聊天面板的东西。
时间线 · Timeline
一个项目里所有会话和检查点的记录。它的用途只有一个:不用读原始对话,也能找回一次改动背后的推理。
共享记忆 · Shared memory
设备端索引,每个 agent 都往里写、也都从里读:计划、决定、文件改动、失败。
知识库 · Knowledge base
.atlas/knowledge/ 里的 markdown 笔记。共享记忆是 Atlas 自己推断出来的,知识库是你主动决定值得写下来的。
提及 · Mention
在提示里 @ 任何东西:文件、文件夹、符号、分支、笔记、论文、过去的会话……
技能 / 包 · Skill / Pack
技能是一个 SKILL.md,按全局或项目划分作用域,再按 agent 分别启用。包是一堆技能 / 命令 / 钩子 / 子 agent / 规则的合集,通常来自一个 GitHub 仓库。
主流程
下面这条链路是 Atlas 唯一真正重要的东西。注意最后一步:检查点不是一个静态记录,你可以直接跟它对话。
Atlas 不装 git 钩子、不改 git 配置、不写 ref。它是旁观 git 历史,然后做匹配。这就是为什么「在终端里提交的代码」也能被认领,也是为什么「一次纯人工提交不会被误挂到 agent 头上」。
04安装:两条路
先想清楚你要干什么:只是想用,还是想改代码。这决定了走哪条路,也决定了要不要装 Bun 和 Rust。
路 A · 下载 .dmg
从 tryatlas.cc 或 Releases 拿最新安装包。适合只想用的人。
下载前务必分清芯片:
Atlas_0.3.1_aarch64.dmg— 78.8 MB,Apple Silicon(M 系列)Atlas_0.3.1_x86_64.dmg— 87.4 MB,Intel
下错架构通常不会报「架构不匹配」这么清楚,一般表现是打不开,或者要 Rosetta 兜一圈。
路 B · 源码构建
想改代码、想给上游提 PR,或者你就是要跑最新 main,走这条。
需要三样东西:Bun、Rust(stable,用 rustup 装)、Xcode Command Line Tools。
项目自带 mise.toml 锁定 Bun 版本:用 mise 的话 mise install 会自动装对版本;不用 mise 直接装 Bun 也可以。
源码构建:最短路径
干净克隆就能跑起来,不需要 API key,不需要 .env,不需要账号。
git clone https://github.com/pacifio/atlas
cd atlas
bun install
bun run dev:app
首次 Rust 编译要几分钟,之后每次只要几秒。bun run dev:app 会让前端热重载,但 Rust 改动必须重启。
容易混淆的两条命令
这是这个项目里新手最容易踩的第一个坑:
bun run dev:app ← 默认用这个
完整应用:Vite 前端 + Tauri 外壳 + Rust 后端,三个都在。
任何涉及 invoke() 的功能都要求它。前端改动会热重载,Rust 改动必须重启。
bun run dev
只有 Vite,没有 Tauri 外壳,启动更快。
纯调 UI 样式时可以用它;但点任何真实功能都会失败——因为后端根本不在。
# Debian / Ubuntu / Linux Mint:
sudo apt install -y libglib2.0-dev libgtk-3-dev libwebkit2gtk-4.1-dev
# Fedora / RHEL:
sudo dnf install glib2-devel gtk3-devel webkit2gtk4.1-devel
# Arch Linux / Manjaro:
sudo pacman -S glib2 gtk3 webkit2gtk-4.1
# openSUSE:
sudo zypper install glib2-devel gtk3-devel webkit2gtk3-devel
生产构建有两个目标:bun run build:app 出 .app 包,bun run build:app:dmg 再加一层 dmg 安装器。
05环境自检与 agent 选择
装完了先别急着发消息。跑四条命令,把「环境问题」和「应用问题」提前分开。
bun --version # 期望:1.x
rustc --version # 期望:stable,例如 1.8x
xcode-select -p # 期望:打印 CommandLineTools 路径,而不是报错
which claude # 只有你要用 Claude Code 才需要
最关键的一个认知分歧点
Atlas 里有两种 agent,它们在「谁负责装、在哪运行」上完全不同。这是读官方文档时最容易被跳过、但实际最影响体验的一节。
原生 agent(内置)
进程内运行,引擎是 Codex 的硬分叉(vendored,见 ADR-0004),所在 crate 叫 atlas-native-agent。
什么都不用装。它在应用里,装完 Atlas 就能用。
一个冷知识:它在存储里的 agent id 至今还是字面量 "cersei"——那是存储键,不是遗留引用;改名会让已有的历史变成孤儿。
外部 ACP agent
以子进程方式运行,通过 stdio 讲 JSON-RPC(Agent Client Protocol,Zed 那一套)。
Codex、Cursor、OpenCode、Kilo Code 在你第一次选中它们时会在后台自动安装。
Claude Code 需要你本机的 claude CLI;缺了的话输入框上方会有横幅,提供安装和登录入口。
全新安装的 Atlas 不附带任何 ACP agent,只有原生 agent——这是刻意的设计决定(ADR-0002)。所以第一次打开时列表很短是正常的,其他 agent 要你从 Marketplace 装了才存在。顺带一提:Atlas 在 PATH 里发现某个二进制,只代表「检测到了、可以提供」,不等于它自动成为候选。
依赖总表
| 组件 | 是否必需 | 说明 |
|---|---|---|
| Bun | 源码构建必需 | 包管理与脚本运行;仓库用 mise.toml 锁版本 |
| Rust(stable) | 源码构建必需 | 用 rustup 安装 |
| Xcode Command Line Tools | 源码构建必需(macOS) | 提供系统编译链 |
claude CLI | 仅 Claude Code agent 需要 | 缺了会有横幅引导安装 |
| API key / 账号 | 都不需要 | Atlas 本身不需要;但你要用的那个 agent 需要它自己的登录 |
.env | 不需要 | 只有想把遥测指向自己的 PostHog 项目时才复制 .env.example;留空则遥测永久失效 |
06第一次实战:跑通检查点
官方说得很干脆:没有安装向导,你打开一个文件夹,就在工作了。从打开文件夹到看见第一个检查点,按顺序走一遍。
第 1 步 · 打开项目
按 ⌘O,或者点 Open Folder,挑一个磁盘上的文件夹。这个文件夹就成了一个项目,Atlas 不会先问你任何配置——没有提示、没有信任对话框。
下次启动时,它会出现在欢迎界面的最近项目列表里。
.atlas/ 目录。记忆、知识库、画布这些功能,各自在第一次被使用时才创建自己那一块。唯一自动发生的事是——它会把你项目 .gitignore 里的 .atlas/ 补上(如果还没有的话)。
第 2 步 · 选 agent
Atlas 打开时停在一个聊天面板上。点输入框里的 agent 图标可以切换,或者直接按 ⌥/ 循环切换,不用碰鼠标。
| agent | 怎么到位 |
|---|---|
| Atlas Agent(原生) | 内置,什么都不用做 |
| Claude Code | 需要本机 claude CLI,缺了会有横幅引导安装 + 登录 |
| Codex / Cursor / OpenCode / Kilo Code | 第一次选中时后台自动安装 |
| 其他 ACP agent | 去 Settings → Agents,从 registry 手动装 |
第 3 步 · 跑一个会话
发一条消息。这次对话就是一个会话,会被记录,之后能从同一个面板恢复。
当 agent 改了文件并提交时,你不需要做任何事来保留这次提交背后的上下文——Atlas 会自动把提交链接回产生它的会话。这是整个产品存在的理由,所以它必须自动。
第 4 步 · 看见检查点
那个链接就是检查点。打开 Git 面板选中那个提交,你会看到 "Produced by 1 session",点一下就会跳回时间线里的那次会话。
时间线头部还有一个「Recent Checkpoints」列表,可以直接搜索。
如果你按上面走完,能在一个提交上看到「Produced by 1 session」并且点得进去——说明核心链路已经通了。剩下所有功能都是这条链路的延长线。
如果想先跑一下源码版
git clone https://github.com/pacifio/atlas
cd atlas
bun install
bun run dev:app # 首次 Rust 编译几分钟,之后秒级
提交之前想先检查一遍的话,这几个命令是你最常用的:
bun run lint # oxlint on src/
bun run format:check # oxfmt --check on src/
bun run typecheck # 前端类型检查(含测试代码)
bun run test # 前端与跨层测试
bun run test:rust # 每个 Rust crate + src-tauri --lib
cargo check --workspace # 全工作区的 Rust 类型检查
07产物结构:.atlas/ 里到底存了什么
这一节值得慢慢看。Atlas 对「你的数据归你」这件事的态度,全写在这个目录结构里。
<你的项目>/.atlas/
├── sessions.db 检查点 / 时间线记录(SQLite)+ blobs/
├── knowledge/ markdown 笔记,可以有子目录
├── shared-memory/ 跨 agent 的记忆事实
├── memory/ 设备端 RAG 索引(atlas-memory)
├── codebase-index/ atlas-codeindex 的输出
├── repos/ 通过 GitHub 面板克隆下来的仓库
├── skills/, agent-skills/ SKILL.md 文件
├── packs/ 已安装的包
├── plans/ 计划文档
├── screenshots/, canvas-media/
├── logs.jsonl 项目级活动日志
├── interactions.jsonl 知识库交互历史
├── canvas.json ReactFlow 的节点/边状态(Canvas / Spaces)
├── editor-state.json 打开的标签页 + 分栏布局
├── project.json 项目级设置
├── recent-files.json 最近文件列表
└── git-status-cache.json 缓存的 git status
三个层级,别混
| 位置 | 存什么 | 说明 |
|---|---|---|
<项目>/.atlas/ | 项目相关的一切 | 跟着代码走。设计上它会被自动加进 .gitignore,所以通常不随 git 分发。 |
~/.atlas/ | 置顶的活动日志行 | 只有 log/pinned.jsonl——你钉住的日志能跨重启保留。 |
<app-config-dir>/threads.db | 会话历史 | macOS 上是 ~/Library/Application Support/dev.atlas.ide/。这是全局的,不属于任何单个项目。 |
设计原则:只有一样东西被锁进专有格式
README 承诺「Nothing is locked in」,落实下来是这样的:
笔记是 Markdown
知识库就是一堆 .md 文件,和代码一起放在项目里。哪天你不想用 Atlas 了,它们还是能用的笔记。
画布是 JSON
canvas.json 存节点和边。结构化、可读、可脚本处理。
会话是 JSONL
logs.jsonl、interactions.jsonl,一行一条,标准的追加式日志格式。
编辑器状态是磁盘文件
editor-state.json / project.json 等,重启后按项目恢复。
检查点记录用 SQLite,存在项目内的 .atlas/sessions.db(另有一份会话历史的库在应用配置目录下)。这是唯一一个「你得靠 Atlas 才读得舒服」的数据。作者没有藏着这一点。
.atlas/ 被加进了 .gitignore,你的队友克隆仓库后拿不到你的会话记录。Atlas 的解法是另一条线——用组织(Organisation)做跨设备、跨成员的同步;本地那份始终是各自独立的。
08怎么用:@ 提及、斜杠命令、快捷键
Atlas 的设计目标是「让一次会话整个发生在应用里」。所以它的键盘密度很高——学会这几个,你会明显少用鼠标。
@ 提及:本地解析,不塞全文
在任何输入框里打 @,就能把某样东西拉进上下文。可提及的类型比多数人预期得多:
| 类型 | 是什么 |
|---|---|
| file / folder | 项目里的任何文件或文件夹 |
| symbol | 一个函数、类,或其他代码符号 |
| note | 知识库里的一条笔记 |
| component | 从包里装来的命令、子 agent 或规则 |
| repo | 一个克隆下来的 GitHub 仓库 |
| project | 另一个项目 |
| paper | 你在 Research 里加进来的论文 |
| branch | 一个 git 分支 |
| past message / past session | 本次会话里更早的消息,或者更早的一次会话 |
把 @ 换成 ~,会打开同一个选择器,但范围只限定在知识库——和笔记编辑器里用的是同一个快捷键。
会发生什么 vs 不会发生什么
这一段是整篇教程里最值得记住的,因为它决定了你对 @ 的用法对不对:
| 你做的动作 | 实际发生 | 不会发生 |
|---|---|---|
@ 一个 5000 行的文件 |
发送的是一个路径,agent 需要时自己去读 | 不会把 5000 行原文粘进去,把上下文窗口占满整个会话 |
在提示里写 /some-command |
只有当它出现在消息开头时才作为命令执行 | 写在句子中间时,Atlas 把它当普通文本发出去,不执行 |
| 一轮对话结束 | 给你一份摘要:耗时、token 用量、改动过的文件;可以打开 diff、跳转到文件、在 Finder 里定位,或者让 Atlas 起草提交信息等你确认 | 不会自动替你提交 |
| agent 正在跑的时候你又写了消息 | 消息进入队列,运行前你可以编辑或删除 | 不会把正在跑的那一轮打断或重来 |
快捷键速查
这些直接来自官方的 Power user 页。挑前十个记住就够用了:
| 快捷键 | 动作 |
|---|---|
⌘O | 打开一个项目 |
⌘K | 命令面板 |
⌘P | 文件选择器 |
⌘⇧F | 搜索 |
⌘T | 新建 agent 会话 |
⌥/ | 循环切换 agent(不碰鼠标) |
⌘⌥J | 开关会话侧栏(用来搜索历史会话) |
⌘⇧B | 开关右侧面板(Git 与 diff 在这里) |
⌘J | 开关终端 |
⌥J | 打开知识库 |
⌘F | 在长会话里搜索 |
Enter / Shift+Enter / ⌘Enter | 发送 / 换行 / 永远发送 |
还有一整组窗口操作:⌘1–⌘9 按序号跳标签(⌘9 是最后一个)、⌘⇧[ ⌘⇧] 循环标签、⌘\ 新建分栏、⌥; 和 ⌥' 在相邻分栏间移动焦点、⌥Z 进 Zen 模式、⌘B / ⌘⇧B / ⌘⌥B 分别开关左 / 右 / 下三块面板。
你写消息时打 @,Atlas 会把你引用的大块内容显示在消息下方,让你先看清楚 agent 到底收到了什么,再发出去。这个「可见的上下文块」,在知识库笔记和论文上是同一套交互。
09进阶:多 agent 与共享记忆
上文那条主链路只是骨架。真正让 Atlas 值得装的,是挂在骨架上的这几块。
共享记忆:换 agent 不等于从零开始
这是整个项目最核心的一个卖点,机制值得讲清楚:agent 干活时会写下指令文件、笔记和其它持久上下文,Atlas 持续索引这些文件,把它们和你的提示做匹配,把最强的那几条交给 agent。
嵌入(embedding)在你本机跑,文本不往外发。系统里还有一个低权重的结构化事实图,但图匹配永远不会压过更强的直接匹配。
还有一层「跨项目记忆」:Atlas 只会把高置信度、且出现在不止一个项目里的偏好和约束提升上去,并且只在当前项目自身上下文稀少时才动用它。这个保守策略是对的——不然你在 A 项目定的规范会到处乱窜。
记忆面板:看得见才敢信
打开 Memory 面板可以检查 Atlas 到底「知道」什么:
| 页签 | 内容 |
|---|---|
| Graph | 结构化事实以及它们之间的连接 |
| Agent preferences | Atlas 从你文件里找出来的、可编辑的规则 |
| Timeline | 把记忆、会话、提交放在同一张日历上 |
| Shared | 跨 agent 的事件日志和保存下来的计划 |
另外,Atlas 会单独索引你的代码库(tree-sitter 扫描),让记忆检索始终「贴住」这个仓库。索引状态就显示在输入框附近,可以在那里重建;嵌入模型在 Settings → Local Models 里选,换模型会重建索引——Atlas 会先跟你确认。这个操作有成本,别手滑。
Agent preferences:把你散落的规则收成一张清单
Atlas 会去搜你已有的记忆和指令文件,找出 12 类偏好。每条显示的都是源文件里的原文,不是摘要;你在这里改了,它去改原文里那一段。
| 类别 | Atlas 在找什么 |
|---|---|
| Version control | 提交、推送、暂存的规则 |
| Theme | 浅色还是深色 |
| Edit permissions | agent 什么时候可以改文件 |
| Testing | 测试与测试驱动开发 |
| Comments & style | 注释与代码风格 |
| Package manager | npm、pnpm、yarn 还是 bun |
| Commit messages | 提交信息格式与风格 |
| Languages & frameworks | 你偏好的技术栈 |
| Architecture | 逻辑该放在哪一层 |
| Communication | 语气和解释深度 |
| Dependencies & files | 添加依赖或文件的规则 |
| Formatting & linting | 格式化与 lint 的期望 |
它还会把你措辞的强度分成两档:Strong("must" / "never" / "always" 这类硬要求)和 Soft(供 agent 权衡的建议)。想让一条建议变成规则,就在源文件里用更硬的措辞——写软话,就别指望它变成铁律。这个设计挺诚实。
技能与包
两者都在 Settings → Skills 里管:
- 技能(Skill)是一个
SKILL.md。作用域选 global(每个项目都能用)或 project(只留在这个项目)。 - 再按 agent 分别启用——Atlas 保留一份正本,然后链接(symlink)到各个 agent 自己的 skills 目录。所以你不会在几处改同一件事。
- 技能在被 agent 调用之前不占上下文。你还可以把一个 agent 专属的老技能「收编」进 Atlas,让它跨 agent 通用。
- 包(Pack)是一批东西的合集:技能、命令、子 agent、规则、钩子、脚本。搜 skills.sh 的 registry、预览、一键装;Atlas 拉源仓库、用 lockfile 记版本、还能检查更新。
装完之后:包里的技能变成可调用的指令,而命令 / 子 agent / 规则变成你可以在输入框里 @ 的对象。
知识库与研究
知识库从左侧面板打开,块编辑器支持标题、列表、大纲、属性、图标和封面,⌘S 保存、⌘' 查看当前笔记、⌘; 开关侧栏。笔记之间可以互链并显示反向链接。
研究面板能搜 arXiv 和 Semantic Scholar,结果带标题、作者、摘要、发表日期、分类和论文 / PDF 链接。下载进项目后,用 @ 就能把它作为上下文交给 agent。
知识库能导出成 HTML,或者导出成一个独立的 server 二进制(atlas-kb-server,跑在 localhost:4747)。这个设计挺聪明:你不必为了看笔记而开着 Atlas,也不必把它部署到某台服务器上才能分享。
工作区本身也是记录的一部分
Atlas 同时是编辑器、终端和 git 客户端——所以它保留的记录覆盖的是提交周围的规划和手工改动,不只是 diff。几个值得一提的点:
| 模块 | 关键设计 |
|---|---|
| 编辑器 | CodeMirror;编辑器状态按项目恢复,重启后标签页和分栏还在 |
| 终端 | 块式终端——每条命令带着自己的输出、退出码和耗时;同时也提供完整交互界面给 vim、htop 这类程序 |
| Git | 真正的提交图(带泳道分配)、暂存 / 取消暂存、分支操作、文件级 diff;History 里可以把提交 revert / cherry-pick / tag / reset |
| 浏览器 | 标签页里的原生 WebKit,带真实的登录、cookie 和阅读模式 |
| Spaces | 笔记及其连接的空间画板,以 JSON 存在项目里 |
| Split view | 最多三列,每列有自己的标签页 |
| Mission control | agent 活跃度看板:随时间的用量、消耗构成、时间线、可筛选的日志表 |
| Capture health | 每个工作区一个信号:OK / Degraded / Stopped,各自带原因和下一步 |
10不止于此:几个真实场景
「源代码管理」这个定位听起来很窄。但把它落在具体场景上,会发现它其实在解决一些你没意识到的问题。
接手三个月前的模块
你盯着一处诡异的实现,不知道它为什么长这样。打开时间线,找到那次提交对应的会话,直接跟检查点对话——它会基于那次会话实际发生的事回答你。本地模式完全离线。
同一个需求让三个 agent 各做一版
在同一窗口里开三个标签,分别选 Claude Code、Codex 和原生 agent,同一个需求各跑一遍,比完再挑。会话独立于标签页,所以切来切去看结果时没有任何一轮会被打断。
把团队的规则收敛成一张清单
你们的 CLAUDE.md、AGENTS.md、各路 agent 自己的记忆文件散在十处。Agent preferences 把它们折叠成一个索引,按 12 类归位,改一处就改到源头。
边读论文边改代码
在 Research 里搜 arXiv,把论文下进项目,@ 进提示。对做算法实现的人来说,这比在浏览器和编辑器之间来回复制摘要靠谱得多。
没有 git 也想留记录
Git 是可选的。一个不是仓库的文件夹照样会保留会话,只是不会产生检查点而已。做实验、写脚本的临时目录也能用。
看清 agent 到底花了多少
每一轮结束都有耗时和 token 摘要;Mission control 把用量按时间和构成拆开。同时跑多个 agent 的人,迟早会需要这个。
检查点在 rebase 和 amend 之后依然存活——它靠 patch-id 做重对账,把链接重新指过去。而当一次 squash 让链接真的变得有歧义时,它选择变成孤儿,而不是瞎猜。对一个「记录真相」的工具来说,这个取舍是对的。
11性能、成本与限制
先说结论:Atlas 是个本地优先的桌面应用,它自己几乎不产生服务端成本。你花钱的地方,是你自己选的那个 agent 的 API 额度。
| 项目 | 数值 / 事实 | 条件 |
|---|---|---|
| 安装包体积 | 78.8 MB(aarch64)/ 87.4 MB(x86_64) | 0.3.1 release |
| 首次 Rust 编译 | 几分钟 | 源码构建,bun run dev:app 第一次 |
| 增量启动 | 秒级 | 首次编译之后 |
| 嵌入与检索 | 全在本机跑(candle + HNSW) | 文本不外发 |
| 代码库索引 | tree-sitter 扫描,状态在输入框可见 | 可手动重建;换嵌入模型会重建 |
| IPC 接口规模 | 365 个命令,分布在约 70 个域模块 | 架构文档自述 |
| Rust 工作区 | 19 个 crate + vendor 化的引擎 | 架构文档自述 |
| 知识库独立服务 | localhost:4747 | 导出成独立二进制后 |
| 遥测 | PostHog,匿名、粗粒度、可关(默认开) | 不含提示词与文件内容 |
现在就该知道的限制
平台
macOS 是唯一受支持平台。Linux / Windows 同源可构建,但未经测试——终端字体、PATH 解析、整体 GUI 行为都是作者列出的已知缺口。
另外,macOS 会剥掉 GUI 进程的 PATH,所以 Atlas 得先猜,再执行 $SHELL -lc 'echo $PATH' 来还原真实 PATH。这就是为什么在某些终端配置下,agent 二进制的探测可能不准。
成熟度
当前版本是 alpha-0.3.1,标签形态是 alpha-X.Y.Z,偶尔有 exp- 快照。默认分支 main 永远严格等于最新已发布的构建。
这意味着:装正式版的人拿不到未发布的功能,但也不会撞上 main 上的半成品。想贡献代码得瞄准版本分支,不是 main。
panic = "unwind" 是必须的,用来让 atlas-embed 捕获 Metal 的 panic。这种约束不写在文档里就只能靠踩坑发现——这也是为什么下面这一节值得读。
12FAQ 与踩坑
这些都是文档和架构笔记里明确写过的行为。遇到怪事先查这里,多数时候答案是「这是设计,不是 bug」。
装完打开,agent 列表里没有 Claude Code,是装失败了吗?
不是。全新安装的 Atlas 本来就没有任何 ACP agent,只有内置的原生 agent(ADR-0002 就是这个决定)。外部 agent 只在你从 Marketplace 装过之后才存在。
顺带一个容易误导的点:Atlas 在 PATH 里找到某个二进制,只意味着「检测到了、可以提供」,不等于它自动成为可选候选。
我明明提交了,为什么没有生成检查点?
链接规则是明确定义的:
- 已存在的文件——提交里包含了 agent 碰过的路径,就建立链接。
- 新增的文件——提交的内容必须与 agent 的输出一致。
这样设计是为了:后续的正常编辑仍然保持链接,但不会把你亲手替换掉的文件算成 agent 的功劳。另外两条:一旦某个被碰过的路径已经判定完毕,Atlas 就不再拿它去提名未来的提交;合并提交不产生检查点,纯人工提交也不会被认领。
我 rebase / amend 过了,链接会断吗?
不会。链接会通过 patch-id 重新对账,指回原来的会话。只有一种情况它会放弃:squash 让链接真的变得有歧义时,它选择变成孤儿,而不是猜一个。
还有一点值得强调:Atlas 全程没有安装 git 钩子、没改 git 配置、没写 ref。它是从外部观察历史——这也解释了为什么在别处提交的代码同样能被认领。
bun run dev 界面正常,但点什么都报错?
这是预期行为。bun run dev 只有 Vite,没有 Tauri 外壳,所以任何走 invoke() 的调用都会失败。
纯改 UI 样式时用它更快;但只要你要碰真实功能,就换回 bun run dev:app。前端会热重载,Rust 改动必须重启。
.atlas/ 要提交进 git 吗?
不需要。Atlas 会自动把 .atlas/ 加进项目的 .gitignore(如果还没有的话)。
代价是:队友克隆仓库后拿不到你的会话记录。要跨设备、跨成员共享,走组织(Organisation)那条线,而不是 git。
agent 读了我的 .env,密钥会不会被存下来?
不会。Atlas 在写入磁盘之前先做密钥擦除(redaction),所以本地存储本身不构成泄露风险。这个擦除逻辑集中在 atlas-redact 这一个 crate 里,是单一事实源,而不是各处零散实现。
我在非 git 目录里工作,还能用吗?
能。git 是可选的:非仓库文件夹照样保留会话,只是无法产生检查点(检查点的定义就是「会话与提交之间的链接」)。
另外,即使一个会话从未产生提交,Atlas 也会把它记录下来。
在终端里跑 vim / htop 行不行?
行。终端是基于 portable-pty 的。除了块式展示(每条命令带退出码和耗时),它同时提供一个完整的交互界面给这类全屏程序用。
我想把知识库给别的机器或别人看,要装 Atlas 吗?
不用。知识库可以导出成 HTML,或者导出为一个独立的 server 二进制 atlas-kb-server,跑在 localhost:4747。
这个小 crate 有个有意思的工程细节:它被排除在根 cargo workspace 之外,保留自己的 Cargo.lock,用 --manifest-path 单独构建。原因是它要在运行时按自己的 release profile 编译,而 profile 是工作区全局的——如果加进工作区,就会被应用自己的 profile 覆盖掉。
我要给这个项目提 PR,该合到哪个分支?
不是 main。Atlas 的分支模型和多数开源项目相反:它是要发号版本、带自动更新的应用,所以 main 必须永远等于「已经发布的那个版本」,不能超前。
于是工作先汇集到版本分支(比如 0.2.5),PR 指向它;等版本分支要发布时,整条合进 main——那次合并本身就是发布。只有不需要等版本的改动(文档修正、一行热修)才直接提给 main。
13隐私、遥测与合规
这类工具会看到你的代码、你的终端、你的浏览器。所以「它往外发什么」必须能查清楚,而不是靠信任。
本地优先,具体指什么
- 代码、笔记、会话保存在本机。
- 会话捕获默认仅本地。
- 账号是可选的。
- 密钥在写入磁盘前被擦除。
遥测:一条很窄的管道
Atlas 只有一条 PostHog 管道,代码在 src-tauri/src/telemetry/。它是匿名的、粗粒度的、可关闭的(默认开启,属于 opt-out)。
官方明确列出了「任何情况下都不发送」的清单:
| 永不发送 | 说明 |
|---|---|
| 提示词或响应文本 | 你和 agent 说的任何话 |
| 文件内容,或绝对路径 | 路径只以相对或匿名形式参与 |
| 知识库或聊天内容 | 包括笔记正文 |
| API key 与凭据 | — |
| 终端输入或输出 | — |
| 浏览器 URL | — |
新增遥测事件需要先在 issue 里讨论,而且任何对管道的改动,都必须在同一个 PR 里更新 TELEMETRY.md。想彻底关掉,把 .env 留空即可——遥测会永久失效。
架构文档里自己写着:遥测默认开启这件事,「真实行为的定义在 app_state.rs」,而模块的 doc 注释已经过期了。看到这种自我纠正,比看到一句「我们很重视隐私」更让人放心。
许可与第三方
Atlas 本体是 MIT 许可。但它调度的 agent 是另一回事:Claude Code、Codex、Cursor、OpenCode、Kilo Code 各自有自己的许可和条款;Research 面板用的 arXiv / Semantic Scholar 也各有自己的使用规则。你实际承担的义务,取决于你用了哪些。
.atlas/ 和 ~/Library/Application Support/dev.atlas.ide/ 这两处。
14参考链接与仓库结构
想深入的话,按这个顺序读:先官方文档的概念页,再架构文档,最后看 ADR。
| 资源 | 地址 |
|---|---|
| 官网 / 下载 | tryatlas.cc |
| 官方文档 | docs.tryatlas.cc |
| 快速上手 | Quickstart |
| 概念词典 | Concepts |
| 快捷键与 @ 提及 | Power user |
| 会话与聊天 | Chat & Sessions |
| 共享记忆 | Memory |
| 知识库 | Knowledge base |
| 技能与包 | Skills |
| 时间线 | Timeline |
| Git 与 diff | Git & Diff |
| 支持的 agent | Supported agents |
| 架构文档 | ARCHITECTURE.md |
| 贡献指南 | CONTRIBUTING.md |
| 遥测说明 | TELEMETRY.md |
| 安全政策 | SECURITY.md |
| 社区 | Discord(#dev 是最快的提问入口) |
| ACP 协议 | agent-client-protocol |
仓库长什么样
想读源码或者提 PR 的人,先记住这条调用链。几乎所有真实功能都横跨整个技术栈:
src/features/<功能>/components → stores (Zustand) → lib/*-api.ts (invoke + listen)
↓
src-tauri/src/commands/<域>.rs
↓
crates/atlas-*
前端永远不直接碰文件系统,也不自己派生进程,一切都走 invoke() 和 listen()。Rust 那一侧拥有重型的有状态子系统(agent 会话、终端 PTY),Zustand store 只存 UI 元数据。
atlas/
├── src/ React 19 前端
│ ├── features/ 每个功能一个文件夹(约 30 个切片)
│ ├── components/ ui/ hooks/ lib/
│ ├── styles/ types/
│ └── App.tsx main.tsx
│
├── src-tauri/ Tauri 宿主(Rust)
│ ├── src/
│ │ ├── lib.rs tauri::Builder + invoke_handler
│ │ ├── auth/ state/ telemetry/
│ │ └── commands/ 每个 IPC 域一个 .rs
│ ├── capabilities/ icons/ resources/
│ └── tauri.conf.json Cargo.toml
│
├── crates/ Rust crate(工作区成员)
│ ├── atlas-acp-thread 会话模型 + AgentConnection 接缝
│ ├── atlas-agent-servers 外部 ACP 传输 + 启动器 + host env
│ ├── atlas-agent-manager 连接与打开的会话
│ ├── atlas-agent-delta 线程事件 → 冻结的 SessionDelta wire
│ ├── atlas-agent-wire 冻结的 wire 形状(契约测试)
│ ├── atlas-native-agent 移植的引擎,挂在 AgentConnection 上
│ ├── atlas-thread-metadata 应用自有的会话历史(threads.db)
│ ├── atlas-bus 事件广播 + 中间件管道
│ ├── atlas-checkpoint 会话记录 / 时间线(sessions.db)
│ ├── atlas-redact 密钥擦除(单一事实源)
│ ├── atlas-git / atlas-gitdiff
│ ├── atlas-terminal PTY(portable-pty)
│ ├── atlas-memory / atlas-embed
│ ├── atlas-codeindex tree-sitter 代码库扫描器
│ └── atlas-kb-server 独立知识库服务(不在工作区内)
│
├── vendor/codex Atlas Agent 背后的引擎
├── scripts/ landing/
└── README.md ARCHITECTURE.md CONTRIBUTING.md SECURITY.md TELEMETRY.md
四个 ADR:理解这个项目的最短路径
ADR-0001 · 应用自有的历史
会话历史的权威在 Atlas 自己的 threads.db,不读 agent CLI 的私有存储。这是「换 agent 不丢历史」的根基。
ADR-0002 · 不预装 ACP agent
全新安装只有原生 agent。外部 agent 必须由用户显式安装——解释了为什么你第一次打开时列表是空的。
ADR-0003 · 原生 agent 是移植的
它把 Codex 引擎移植到 AgentConnection 这个接缝上,进程内运行,不需要任何外部二进制。
ADR-0004 · vendor 化的引擎
vendor/codex 是那个引擎的落点。它和工作区一起管理,但来源是外部的。
supports_* 谓词或 Option<Arc<dyn …>> 来表达,禁止按 agent 身份分支——文档直接写明了「if agent_id == "claude" 是 bug」。理解这一条,你就理解了它为什么能让任意 agent 接进来。