Skip to content

工作区 ​

工作区是你在 Codeg 中真正完成工作的地方。它把四样东西放在同一个屏幕上——智能体的对话、你项目的文件、它的 git 更改,以及一个终端——让提示、审阅、提交的整个闭环在同一处完成,无需在编辑器、diff 工具和 shell 之间来回切换标签页。

Codeg 工作区

Codeg 工作区

布局 ​

桌面工作区是并排的四列,每一列都有自己的头部条,列与列之间由可拖动的细线分隔,细线从顶边一直贯穿到底部:

  • 对话(最左)。 你打开过的每个文件夹中的每个会话——既是你的历史记录,也是你开启新会话的地方。它们按项目分组,每个都带有一个实时状态圆点:进行中、待审阅、已完成。顶部的条上有新建对话、标签筛选、全部折叠以及视图选项,其下则是导航行:自动化、待办任务、仓库面板和无限画布。自动化和待办任务各自带有自己的徽标——前者是失败的运行,后者是等你处理的任务数量——因此无论你身在哪个界面,需要照看的队列都会主动说话。
  • 对话(中间偏左)。 智能体的对话记录,composer 停靠在底部。它的标签页在顶部,下方一条纤细的详情头部显示文件夹面包屑和该对话的标题,标题后面是它的标签。
  • 文件(中间偏右)。 你打开的文件的编辑器、diff 和实时预览——就在对话旁边,因此你可以在智能体做出更改时实时看到它们落地。它有自己的标签页条和一个文件路径详情头部。
  • 辅助面板(最右)。 一个带标签页的面板——会话详情 · 文件 · 更改 · 提交——容纳会话信息、项目树、你工作树中的更改和提交历史。当面板变窄时,这四个标签会折叠成一个下拉菜单。

终端在两个中间列的下方展开,底部的状态栏显示你的对话数量、更新提示、命令启动器、codeg-mcp 伴生服务的状态,以及最右端的告警——你的会话发出过的警告和错误,留在那里供你回头查找。打开电脑操作之后,那里也会多出它的图标。当连接到远程工作区时,它的名称也会显示在那里。点击那个对话数量会打开 Token 用量——按天、文件夹、智能体和模型拆开看你的智能体到底花了多少。

状态栏的最左端——也就是窗口的左下角——是快捷操作,一个把所有「只能经由某个会消失的东西才能到达」的入口都收拢起来的菜单。三个分组:

分组里面有什么
工作区打开文件夹、克隆仓库、项目引导,以及远程工作区
导航自动化、待办任务、仓库面板、无限画布——带着它们侧边栏同名行的那些徽标
更多桌面宠物

在 0.30.0 之前还有一个会话分组。它那两行作用于某一个文件夹,而这恰恰是状态栏里的启动器所没有的东西——并且两者本来就都在文件夹自己的右键菜单和「文件夹」标题栏上,所以这个分组被移除了,而不是留在那儿对着一个猜出来的文件夹动手。

重点不在于新增能力——每一个入口在别处都有自己的家。重点在于状态栏从不卸载,所以在侧边栏收起时,这里仍是一条进得去的路。远程工作区和宠物仅限桌面端。搜索被刻意排除在外,因为它自己的家同样不会消失——见下文。

当有更新的 Codeg 发布时,状态栏会主动告诉你,而不是等你到设置里去发现:一个 New v… 徽章会出现,点击后弹出一个浮层,其中包含版本号、完整的更新内容说明,以及可执行的按钮——与设置面板相同的下载 → 安装 → 重启流程,另加一个稍后用于暂时略过。忽略某个版本会在每个打开的窗口中一并静默它,并留下一个灰色图标让你随时还能回来;下一个版本会重新点亮徽章。→ 设置 → 系统

这里没有横贯整个宽度的标题栏——取而代之的是两个角落簇,它们在面板开合时保持原位:左上角切换侧边栏并打开搜索,右上角是终端、辅助面板和设置。搜索在 0.27 搬到这里,理由和快捷操作存在的理由完全一样:它原本是侧边栏里的一行,而侧边栏一收起就被卸载,于是 ⌘K 成了唯一入口。角落簇从不卸载,按钮上的提示还会显示你当前生效的 ⌘K 绑定。从 0.32.3 起,⌘K 打开搜索时光标已经停在搜索框里,而且无论你在对话和文件之间切换,还是选择某个智能体筛选,光标都会留在那里。(移动端在它的标题栏里得到同一个按钮,那里本来就没有快捷键。)被它挤走的远程工作区选择器移到了侧边栏列表的右键菜单中,单独成组——它上面的每一行都作用于本机,只有这一行是去往另一台主机的。每个面板都可以通过拖动调整大小,当你需要空间时,侧边面板和终端可以折叠收起——⌘B(对话)、⌘E(辅助面板)、⌘J(终端)。在手机或狭窄的浏览器窗口中,侧边面板会变成滑入式抽屉。

待办任务、自动化、仓库面板和 Token 用量会接管整片区域,因此其中之一打开时,右上角那一簇会把此刻无从作用的终端与面板开关换成一个返回箭头,用于回到你的会话。当侧边栏已收起、屏幕上又没有对话可点时,它就是那条出路;而它不改变别的任何东西:你原先所在的标签页会原样回来。有自己控件的页面会把它们放进腾出来的那两个位置:待办任务把视图切换和设置按钮停在那里,仓库面板停的则是刷新和设置。

面板从你工作的旁边滑入 ​

从 0.28 起,每一个滑入式面板——移动端侧边栏、辅助面板、终端、设置导航、技能详情、任务详情、仓库工作项详情——都是一个内嵌抽屉,而不再是对话框:它离窗口边缘略有内缩、自带一道边线,而且背后的一切既不变暗也不冻结。下面那一层保持活着,这正是重点——这些面板是你一边工作一边查看的,而不是要先关掉才能回到手头事情的模态框。Esc、关闭按钮和滑动手势依然能关掉它;移动端那四个导航抽屉还额外保留了「点一下它们留出的那条页面」就收起的行为,因为在手机上人们就是这么收起面板的。

会话查看器可以层叠。 被委派的子智能体的对话记录、待办任务的会话、Grok 的子运行——这三者都会互相嵌套,因为一份子智能体的记录里本身就带着它自己的委派卡片,每张卡片又各有一个「查看会话」。它们从前是居中的模态对话框,彼此之间没有层叠关系,于是第二个直接把第一个埋了。现在每一个都在开启它的那一个内部打开,宽度全部相同,所以下层不会有一侧支棱出来。

随之消失的还有两个你本会当成 bug 的现象:查看器不再因为开启它的那张卡片滚出视野而关闭,而一个留在整页路由或后台标签页背后的查看器,也不会再画到取代它的东西上面——它是被隐藏后再恢复的,所以切回来时它还在你离开时的位置。

文件夹与侧边栏 ​

左侧边栏是你的大本营:你打开过的每个文件夹(即一个项目目录),其对话都分组显示在其下方。打开一个项目文件夹即可添加(⌘O)。右键点击文件夹的标题栏(或点击其 ⋯),即可看到你能对它执行的所有操作:

  • 设为默认智能体。 选择某个文件夹应使用的智能体,之后你在该文件夹中开启的每个新对话都会预选它。选择无默认(使用全局)可回退到你的全局选择。它只设定智能体——一旦该智能体连接,模型和模式仍由它提供。
  • 更改颜色。 为文件夹指定一种强调色,让它的分区在你同时处理多个项目时更醒目。该颜色会为侧边栏中的文件夹及其对话着色;但不会延续到标签页中。
  • 设置别名。 给文件夹起一个更友好的显示名称,而不改动磁盘上的任何东西——它会在侧边栏和对话头部显示为 别名 [ 文件夹 ]。把输入框留空即可清除它,回到原始名称。
  • 导入本地会话。 打开导入窗口,并预先选中本项目的过往会话,从而把你各个智能体自己的历史拉入工作区——这正是 Codeg 对话聚合的实际运作。→ 对话聚合 介绍了它扫描哪些内容以及如何匹配。
  • 会话管理。 批量选择对话来更改其状态或删除它们。它是从某个文件夹打开的,但并不锁定在那个文件夹上:一个搜索框占满整行,下方是四个由粗到细的筛选器——文件夹、分支、智能体、状态——因此无论你从哪里打开它,都能横扫整个工作区。分支按共同前缀折叠,task/49 和 task/50 会收进同一个 task/ 下并带上计数,而每一行都会显示对话当初是在哪条分支上开始的。
  • 关联的文件夹。 把其他目录以子目录的形式带进这个工作区,让一个智能体能跨它们一起工作。→ 跨多个文件夹工作
  • 管理标签… 新建、编辑、排序和删除这个文件夹提供给自己会话的标签,全局标签也在这里。→ 给会话打标签
  • 在外部打开。 在 Finder / Explorer / 你的文件管理器中显示该文件夹、在该处进入终端,或者——从 0.29.0 起——用 VS Code 打开它(仅桌面版)。VS Code 这一项在目录和单个文件上也有,不只在文件夹标题上。
  • 从工作区移除。 将文件夹移出 Codeg——它的标签页和终端会关闭,但磁盘上的任何内容都不会被改动。

文件夹的真实名称始终是它在磁盘上的目录名——这一点永远不变——但设置别名可以给它一个更友好的标签,而颜色和分组能帮你一眼区分各个项目。

导入本地会话并不只在文件夹菜单里。右键点击列表周围的空白处也能找到同一项;而在一个还什么都没有的工作区上,这个按钮就直接摆在空状态里——挨着打开文件夹和项目引导——因为把你已有的东西导进来,通常是让一个全新的 Codeg 迅速充实起来的最快方式。那个空白处菜单也正是远程工作区选择器所在的地方,位于本机相关的那几项之下,单独成组。

右键点击一行对话会给出添加到会话,把它作为一枚提及徽章放进 composer——和 @ 面板、文件树产出的是同一种徽章。它落在你的光标处,点两次也不会加两遍。想说「看看那个会话里发生了什么」时,这是最短的一条路,不必再走 @ 然后敲名字。同一个菜单里还有一个标签子菜单,用来给这个会话打标签。

文件夹旁边的数字统计的是此刻正在其中运行的东西——正在工作的会话,worktree 也算在内——没有时它会消失。它是一个实时的负载指示,而不是总数,因此顺着侧边栏扫一眼,就知道你的智能体究竟都在哪儿。展开/折叠的箭头只在悬停时出现;文件夹图标本身已经说明了它是开是合。

把指针停在一个对话行上,旁边会浮出一张卡片,装着这一行本身放不下的东西:更多的标题(最多三行 —— 目的是让你看清它,而不是摊开一篇文章)、智能体、有记录时的模型、所属文件夹(认别名,是 worktree 时还会打上标记)、它的绝对路径、分支,以及它带着的每一个标签。如果这个会话是从一个后来被移除的 worktree 里重新挂过来的,它还会点出原来的路径。上面刻意没有状态:你指着的那一行本来就已经标出了值得提示的那两种状态。这不花任何请求,上面的一切本来就在内存里。在 0.29.0 之前,想知道这些只能开「会话详情」对话框,而那里连文件夹和它的路径都没有——并且当同一个仓库开着好几个 worktree 时,两行读起来是真的一模一样。

给文件夹分组 ​

装着十几个仓库的工作区就是一条长长的平铺列表。文件夹分组是有名字、可以上色的带子,用来收纳文件夹 —— 而且它们和你那些零散的文件夹共用同一个顺序,于是两者可以交错排列,而不是把分组统统赶到某一端去。

把文件夹拖到某个分组的标题上就放进去;拖到尾部的区域就拿出来;拖动分组本身则搬动整条带子。你拖着文件夹的时候,每个分组都会展开,折叠着的也不例外,于是没有哪里是够不到的。文件夹右键菜单里的移动到分组是同一件事的无指针版本。

分组标题上带着一个把里面一切加总起来的运行中会话徽标,于是一个折叠着的分组也能告诉你:它下面某个项目是不是有智能体在干活。成员的缩进方式与 worktree 子项完全一致,导轨和对话一起位移,因为底下就是同一套机制。

三个分区,顺序由你定 ​

侧边栏有三个顶层分区:

  • 文件夹——你的项目,对话嵌套在各自之下。
  • 聊天——不属于任何文件夹的对话,也就是你在聊天模式下开始的那些。
  • 最近——把你此刻能够到的对话排成一张扁平列表,属于文件夹的和聊天的一并在内,顺序取决于排序方式。不嵌套、不分组;它回答的是「我刚才在干什么?」,而不需要展开任何东西。它遵循与侧边栏其余部分相同的显示选项——已收起文件夹里的对话、在显示已完成会话关闭时的已完成对话,以及已经在置顶里的对话,都不会出现在这里。它一次显示 15 行,底部的显示更多每点一次多显示一页,而分区自己的计数徽标报告的仍是全部总数。从 0.28.2 起,那一行也能把列表收回去:一旦你展开到第一页之外,同一行上就会出现一个复位入口——于是一个你为找某样东西才展开的列表,不会在接下来的整个会话里一直占着屏幕,把它下面的分区挤出可视区域。只有当确实多显示了不止一页时才会提供它。它的标题栏上带着新建对话按钮,和「聊天」一样;从 0.32.3 起还多了一个 ⋯,可以把列表收窄为全部、聊天或文件夹——也就是只看无文件夹的聊天,或只看属于某个文件夹的对话。这个选择会在本设备上记住,而且列表处于收窄状态时这个按钮会一直显示,所以一张筛选过的列表绝不会被误当成一张本来就短的列表。

这三个分区都可以在显示选项菜单里调整顺序——每个分区一行,带上移和下移(或在聚焦行上按 Alt+方向键)——而「最近」也可以整个关掉,如果你不想要它的话。

整理列表——显示选项 ​

侧边栏顶部的四个按钮能让长长的历史保持可管理。第一个是漏斗,即按标签筛选,它把列表收窄到带有你所选标签的会话——见给会话打标签。定位当前会话会跳转到你所在的会话,并展开它被折叠在其后的任何层级。全部展开/折叠如今是它旁边一个独立的按钮,因为它作用于列表本身,而不是保存某个显示偏好——而且它折叠的是所有东西,包括扁平的聊天、最近和已置顶这几个分区标题,而不只是它们里面的文件夹分组。全部折叠后剩下四行标题、下面空无一物;再展开时,下面的文件夹会原样恢复,因为分区折叠和单个文件夹的折叠是分开记住的。

最后一个是一只眼睛,而不是第二个漏斗——它的菜单里没有任何一项是把列表筛成匹配项的——它打开显示选项,分为四个带标题的分组:

  • 对话列表(子菜单)——显示已完成会话,默认关闭,因此已完成的工作不会挡道,列表中呈现的就是仍在进行的内容;显示工作树文件夹,默认开启;以及显示「最近」分组,默认开启。
  • 导航项(子菜单)——见下文。
  • 排序方式——按创建时间排序(默认)或按更新时间排序。
  • 区域顺序——上文所述的那个可排序列表。

那两组清单被放进了悬停展开的子菜单里,好让「排序方式」和「区域顺序」——人们真正会反复回来改的那两项——不必待在一个十五行菜单的最底部。另外两项则留在外层:一对单选按钮和一个可排序列表,藏在多一层跳转之后读起来不对,而顺序那几行也需要菜单的完整宽度。拨动一个开关既不会关掉子菜单,也不会关掉菜单本身,因此改两项设置只需进去一次。

关于显示工作树文件夹:开启时,每个 worktree 都作为独立分组置于其仓库之下,带有自己的计数和颜色。它的标题栏也用项目标题栏那种别名 [ 名称 ] 的写法——task/49 [ codeg-task-49 ],前面是检出在那里的分支,后面是它所在的目录——因此同一个仓库的好几个 worktree 一眼就能分清。从 0.30.0 起,仓库自己那一行也用同样的写法标注 —— main [ root ],与它的 worktree 兄弟们对齐 —— 而不再是一个对分支只字不提的光秃秃的「root」。已有的 worktree 会在启动时被打上标签,而你自己起过的名字绝不会被覆盖。把它关闭即可把它们合并进父文件夹,成为单一列表。

选择你要看到哪些导航行 ​

导航项子菜单可以逐个开关侧边栏那四行整页入口:自动化、待办任务、仓库面板和无限画布。如果你不用 forge 集成,那一行不必一直杵在那里。

隐藏一行不会让你永久失去什么——每一条路由都仍可从状态栏的快捷操作到达,正因如此隐藏它们才是安全的。这个设置按设备保存,而一行你从未动过的入口是显示的,所以将来版本新增的路由到来时是可见的,而不会悄悄处于关闭状态。

给会话打标签 ​

从 0.34.0 起,一个会话可以带上标签——每个标签有一个名称和一种颜色——紧跟在标题后面显示,侧边栏也可以筛选出带有这些标签的会话。标签分两种:

  • 全局标签——所有会话都能用,聊天模式也包括在内。
  • 文件夹自己的标签——只出现在那个文件夹的会话上,它的工作树中的会话也算在内。聊天模式的会话不属于任何文件夹,所以只能用全局标签。

名称在每一组里唯一——全局那一组,或某个文件夹那一组——且不区分大小写:全局的 bug 和某个文件夹自己的 bug 可以并存,但同一组里不能 Bug 与 bug 并列。

给会话打标签,有两个地方可以用:

  • 会话头部。 标签就排在标题后面——没有标签时是一个标签图标,即添加标签——点一下就会打开选择器。可以搜索,点一个标签就给会话加上或取下;选择器不会关闭,所以一口气打三个标签也只要打开一次。输入一个还不存在的名称,它就会提出新建:新建全局标签“…”,以及用来建文件夹自有标签的在 文件夹 中新建“…”——聊天模式下没有后者。新建的标签会直接加到这个会话上,颜色取九个深色预设里第一个还没被旁边的标签——全局标签,或这个文件夹自己的标签——用掉的;九个都用掉之后,就会重复使用。
  • 侧边栏。 右键一个会话,有一个标签子菜单。在那里勾选标签同样不会关掉菜单;新建标签…会打开完整的表单,其中可用范围可以选所有会话,或者仅 该文件夹。

会话身上还带着的、属于另一个文件夹的标签,会单独列在其他文件夹下面。它在那里只是为了让你取下;一旦取下,就加不回去了。子智能体会话——由委派派生出来的那些——不能打标签。

管理标签…——选择器底部、标签子菜单里、文件夹的右键菜单上,以及标签筛选的底部都有它——会打开一个统管这一切的对话框,并从你打开它时所在的文件夹开始:

  • 最上面是分支标签——见下文。
  • 然后是全局标签,再往下是文件夹标签,标题旁边有一个文件夹选择器。
  • 每个标签都可以拖动到新位置、编辑和删除。你拖出来的顺序,就是标签在各处出现的顺序——先全局标签,再文件夹自己的。编辑只改名称和颜色,从不改变它属于哪一种。删除前会先确认,因为这个标签会从所有带着它的会话上取下,而且无法撤销。
  • 新标签需要一个最多 64 个字符的名称和一种颜色——十八个预设色,分深浅两行,或者用自定义颜色选任意别的颜色。在对话框里添加的标签,属于哪一种由你添加时所在的分区决定。

标签显示在哪里。 侧边栏的一行在标题后面放得下两个标签,再往后是一个 +N,它的提示会列出其余的;标题太长时会先让出位置,但总会保留几个字。会话头部最多显示三个——窄屏上只有一个——而把指针停在一行上时浮出的那张卡片会把它们全部列出。存下来的一种颜色同时服务两种主题:浅色模式下是实心的标签,深色模式下是带提亮文字的淡色底。打标签不算活动,所以列表按更新时间排序时,会话不会因此挪位置。搜索、画布、标签页标题和会话详情里都不会出现标签。

按标签筛选。 侧边栏头部那一行最前面的漏斗,用来挑选要筛选的标签,每个标签旁边都标着带有它的会话数。匹配决定多个标签怎么组合——默认的任一显示至少带有其中一个的会话,全部则只显示每个都带的会话。筛选生效时,漏斗会高亮并带一个计数,列表上方还有一条会列出选中的标签,每个都能单独移除,旁边就是清除筛选。它会收窄每一个分区——已置顶、文件夹、聊天和最近——并拿掉筛完后空无一物的文件夹、工作树分组或文件夹分组;在文件夹、聊天和最近里,显示已完成会话仍会照常隐藏已完成的会话——已置顶一向不受它影响——文件夹的运行计数也不受影响。筛选条件按设备记住,而标签本身存放在 Codeg 的数据库里。

分支标签会把会话开始时所在的 git 分支——和会话管理里列出的是同一个,而不是现在检出的那个——作为一个标签放在它其余标签的前面,颜色由你选。它默认关闭:在对话框的分支标签下勾选显示即可。它计入各处的标签数量上限,也从不被折进 +N。不在 git 里的会话、聊天模式的会话、在分离 HEAD 上开始的会话都没有分支可显示,子智能体会话也不显示。

标签和分支标签的设置都存放在 Codeg 的数据库里,而不是窗口里,所以每个窗口看到的都一样、变化也会同步过来,浏览器会话能用上完整的功能,备份也会把它们带上。分叉出来的会话保留原会话的标签;导入的会话进来时不带标签。

跨多个文件夹工作 ​

一个工作区不必只有一个目录。从 0.23.1 起,你可以把其他文件夹以子目录的形式关联进来——隔壁的服务、共用的库、旁边的文档仓库——智能体便能在同一段对话里跨它们读写。文件树会显示它们,工作区搜索会覆盖它们,@ 提及也能伸进去。

只需要一个动作:在侧边栏里右键该文件夹 → 关联的文件夹,然后添加文件夹,想选几个就选几个。(新打开一个文件夹时,在你选好主文件夹之后也会紧接着提供同一步,因此可以边创建边把工作区拼起来。)

它适合用来做什么 ​

重点其实不在于"目录变多了",而在于:主文件夹不必再是那个项目本身,而成了你组装项目的地方——需要多久就摆多久,不需要了就拆掉。

  • 分处两个仓库的前端与后端。 把 api 关联到 web 旁边,一个回合就能同时改动接口和调用它的代码——契约的两侧都摆在智能体眼前,而不是一侧加上一次猜测。
  • 本周的改动实际涉及的那几个微服务。 把牵涉到的两三个关联进来,做完,解除关联,下周换一组。工作区于是成了一个看待你那些服务的视角,而不是一份需要你维护的检出。
  • 一个自己不装任何代码的空目录。 专门建一个用来组装的目录——比如 ~/work/current-task——需要什么就关联什么进去。事后没有任何东西要清理,因为那里本来就什么都没有。
  • 代码与它的文档。 把文档仓库关联到代码仓库里,一次改动和描述它的那一页就能落在同一个会话、同一次评审里。(这份文档正是这样与 Codeg 本体保持同步的。)
  • 想从源头修好的那个库。 把共用的包关联进依赖它的应用,智能体就能在缺陷真正所在的地方修它,而不是在调用方绕过去。
  • 你无意改动的参考资料。 一个设计系统仓库、一份接口规范、另一个团队的服务。智能体照着真实的接口工作,而不是靠推测。
  • 旧仓库与它的替代品并排摆着,用于把代码搬过去的那段时间——这种场景下,同时打开两棵树本身就是全部工作。
  • 有意不放进仓库的样本数据。 把一个装着测试夹具或真实输入文件的目录关联进来,智能体就能拿它们跑,而这些东西一份也不会被提交。

底层是怎么回事 ​

这些关联在磁盘上是真正的文件系统链接,这是有意为之:智能体 CLI 是以工作区主文件夹为工作目录运行的,因此一个只存在于 Codeg 界面中的合并,对它们而言根本不可见。既然它是一个真实的目录项,其余的一切也就顺理成章——ls 找得到它,智能体自己的文件工具找得到它,你的终端也找得到它。

在 macOS 和 Linux 上,它是一个符号链接。在 Windows 上,只要系统允许,它同样是符号链接;但创建符号链接需要一项权限,普通进程只有在开启开发者模式时才具备——因此 Codeg 会退而使用目录联接(junction),它不需要任何权限,对 Codeg 所关联的本地绝对路径而言行为完全一致。若两者都失败,界面会提示你开启开发者模式,或以管理员身份运行 Codeg。

每个被关联的文件夹以它自己目录的名字出现,并在文件树中标记为关联的文件夹。如果该名字在主文件夹中已被占用,Codeg 会消歧为 api-2,而不是覆盖任何东西——而且是不区分大小写的,因为 macOS 和 Windows 把 API 和 api 视为同一个条目。

之后如何管理 ​

在同一个菜单里重新打开关联的文件夹,每个关联都会显示它当前的状态:

状态发生了什么该怎么做
已关联一切正常—
链接已从该文件夹中消失有东西删掉了这个符号链接重建链接
该名称已被其它条目占用一个真实的文件或文件夹占了这个名字重命名,然后重建
被关联的文件夹已不存在目标被移动或删除了按它的新路径重新关联

重命名只改变它在工作区里显示的名字——它所指向的那个目录仍然叫它自己的名字。解除关联只删除符号链接,别的什么都不动;被关联的文件夹本身永远不会被触碰。

那个界面上还有一个默认开启的开关,不让关联目录污染 git 状态:它会把关联的名字写进仓库的 .git/info/exclude。那个文件只属于你这份克隆,从不会被提交,所以别人的检出不会知道你的关联习惯。

它在工作区文件夹是一个 git 仓库时生效,并且是尽力而为的:即便规则写不进去,代价也只是 git status 更吵一点,绝不会导致关联失败。有两处值得知道的空缺——工作区若不是仓库,这条规则就无处可放;而重命名一个关联并不会把它的规则一并带过去,因此在你自己补上排除项之前,新名字会以未跟踪文件的形式出现。

有些选择它会直接拒绝,并告诉你是哪一类:工作区文件夹自身、包含工作区的文件夹、已经在它内部的东西(不需要关联——它本来就够得着),以及已经关联过的东西。

只有你自己建立的关联才会被跟随

Codeg 把每一次文件操作都限制在工作区主文件夹之内,而这道防线并不会对符号链接一路放行——它会比对你所创建的那份关联清单。所以你克隆下来的某个仓库即便自带一条 secrets -> ~/.ssh,它在你关联任何东西之后,依然和之前一样读不到。→ 隐私与安全

关联并不会延伸的两件事

有两样东西仍然只跟随工作区主文件夹。一是文件实时监听——智能体在被关联文件夹内做出的修改不会自动刷新文件树,需要你重新打开或刷新它。二是更改与提交面板跟踪的是主文件夹的仓库,因此被关联仓库自身的工作树改动与历史不会显示在那里。当你想审阅并提交那个仓库的改动时,请把它作为独立的文件夹打开。

开启会话——composer ​

一切都从 composer 开始,它是对话底部的输入框。选择智能体、模型和模式,将它指向一个工作文件夹,输入提示词,然后发送。

  • 智能体和模型。 从你已启用的智能体以及该智能体提供的模型中选择。(智能体选择器会在你开启新对话时出现。)这一行会按拿到的宽度自适应:能放下几个就显示几个,放不下的收进一个更多智能体按钮里——而当前选中的那个永远不会被收进去,因此写着你选择的那枚标签始终在屏幕上、始终读得清。
  • 模式,以及智能体自己的选项。 下拉菜单列出所连接智能体提供的模式——计划优先模式、接受编辑模式等等。它旁边还有该智能体所声明的会话选项:给出一组取值时是一个选择器,给出一个开关时是一个开关标签(比如 Cline 的 auto approve)。这些全都来自智能体本身,因此你看到的内容取决于你正在运行哪一个——而某个选项如果用的是这一版 Codeg 还看不懂的类型,它会被安静地略过,而不是被放进来把整个会话弄坏。从 0.34.0 起(适配器 0.86.0),一旦你定义了自定义子智能体——Claude Code 从你的用户目录、项目或插件里读取的那些 agents/*.md 文件——Claude Code 就会多出一个 Agent 选项;选中其中一个,会话就从你的下一条消息起以那个子智能体的身份运行。它和其他选项一样,会在这台设备上为 Claude Code 记住,所以你下一个 Claude Code 会话也会以那个子智能体开始,直到你重新选回默认那一项;已经不再定义的子智能体会被跳过。
  • 工作文件夹与分支。 输入框正下方的一行显示智能体将在何处工作:一个文件夹标签和一个分支标签。当对话还是草稿时,文件夹标签可以切换(它的列表会显示文件夹别名并支持按别名搜索,底部固定的聊天模式一行可无文件夹运行,便于快速对话);一旦对话绑定到某个文件夹,该标签就只作为标识显示。分支标签就是完整的 git 菜单——参见分支与 git 操作。
  • 上下文与连接。 在同一行的右侧,一个小圆环跟踪你已用掉多少模型上下文窗口——点击可查看 token 细分(输入、输出、缓存写入、缓存读取、总计,以及自 0.31.0 起位于总计下方、保留一位小数的缓存命中率;若该会话的智能体完全没有报告缓存计数,这一行会直接不显示,而不是给出一个笃定的 0.0%)——旁边的心形图标显示智能体的连接状态:已连接、正在连接、错误或已断开。那个心形是一个按钮——见下文。
  • + 菜单。 附加文件、插入已保存的快捷消息、在智能体工作时留下实时反馈、运行斜杠命令,或从 Experts、办公工作或科学研究技能包中加入一个技能。实时反馈会打开一个对话框,让你给正在运行的智能体写一张便条——和 composer 的中途发送走的是同一条通道,下文会详细说明。→ 设置 → 协作
  • 富文本输入。 输入 @ 可提及文件、智能体、过往会话或提交;输入 / 使用斜杠命令——匹配是模糊的,因此 rvw 也能找到 review。你发出的长消息会带一个展开开关折叠起来,让对话记录保持易读。
  • 两个面板都像面板了。 @ 列表如今取用 composer 自己的宽度和边界并在其上方展开,和 / 完全一样,而不再是钉在光标旁边的一个窄框——多出来的空间给了描述,那部分从前是被截断的。它也会跟着它所属的那个 composer:切换到「待办任务」时留着没关的面板,不会再浮在新页面上。而且 / 在智能体还在连接时就能用:斜杠命令要等智能体起来才存在,所以从前提前敲 / 什么都不会发生;现在面板会带着一行加载状态打开,命令到齐时自动填上,不必重新敲一遍。
  • 中日韩文字之后的 @,以及手机上的 @。 提及面板从前只在一个 ASCII 空格之后才触发——而中文、日文、韩文并不写这个空格——并且在软键盘的输入法组合过程中拒绝打开。这两点都修好了,它也会避开屏幕键盘。
  • 发送、排队、停止。 Enter 发送,Shift+Enter 换行。当智能体正在工作时,发送按钮会变成红色的取消按钮 —— 而当你在一个有投递通道的会话上打了字之后,它旁边还会出现一个分体发送:按钮本身是加入队列,这也正是 Enter 在那里一直做的事;它的箭头里则放着唯一一个不必等待的动作。无论走哪条路,你都可以提前输入,消息会排队直到智能体准备好接收。→ 在智能体工作时插话

审批来自智能体

Codeg 没有全局的"自动批准一切"开关。智能体的行动自由度取决于你选择的模式,以及它在任务中途弹出的权限提示(见下文)——因此控制权始终掌握在智能体自身的安全模型手中。

跟随进展——对话 ​

当智能体工作时,它的对话记录会实时流入:以格式化 Markdown 呈现的回复(包含代码、数学公式和图表)、它的推理过程,以及针对多步骤任务的实时计划清单。长到足以淹没本回合其余内容的计划会限制高度,并提供展开 / 收起,与你发出的长消息早已具备的行为一致。

  • 每一条回复都坐在一个头部之下。 智能体书写时它读作 正在处理…,这一轮落定后读作 处理了 1 分 9 秒 —— 单轮耗时如今就住在这里,而不再放在页脚的统计行里。点击这个头部,折起来的是这条回复的中间过程 —— 它走过的那些工具调用和推理 —— 而最终答案留在屏幕上,因为那才是你回来要看的东西。你发出下一条消息时,上面的过程会自动折叠,这也是你回到一个对话时它打开的样子。没有东西可折的回复只是一个静态标签而不是按钮:停在某次工具调用上的、或者答案本身就是一张卡片的,都保持展开 —— 折起来只会在原本有内容的地方留下一个孤零零的头部。
  • 思考块在你打开它之前一直折叠着。 智能体的推理以一行折叠的形式出现——正在流式输出时是 Thinking…,结束后是 Thought——要不要展开由你决定。到 0.31.2 之前,它会在第一个 token 到达时自己展开、又在这一段结束一秒后自己收起:展开时把回复往下推出视野,收起时又把正在读的人眼前的文字抽走,那个计时器根本不管这个面板是不是你亲手打开的。现在你打开的会一直开着,而没人打开的那个在流式输出时根本不渲染任何内容。
  • 从这里分叉。 已完成的回复会在它的统计行上给出分叉入口:新会话继承这个对话,原来的那个分毫未动,实时的和重新打开的都可以。从 0.30.2 起,这就是分叉的全部了 —— composer 里那个旧的 Fork & Send 快捷入口已经移除,它是通往同一件事的多余的第二道门,而且说不清自己是从哪条回复分出去的。这个入口出现在已连接、且其智能体声明了支持分叉的会话上 —— 这是从握手里读出来的,而不是一份写死的名单,所以随着适配器陆续支持,这个集合还会变大,如今也已经不止下面这几个。真正值得知道的是它从哪里分叉,而这一部分确实是一份写死的名单:Claude Code、Codex 和 DeepSeek Harness 能指名某一条具体的回复,于是分叉就精确落在那里 —— DeepSeek 从 0.30.2 起,Claude 从 0.30.4 起,即便你选中的那条回复位于此前某次分叉遗弃的分支上也一样。其余的智能体,以及任何一条没有可供指名内容的回合,分叉会落在对话的末尾,而不是失败。从 0.33.0 起,只要智能体支持关闭会话,分叉一建好 Codeg 还会请智能体关闭原来的那个会话——于是 Claude Code 不再为每一次分叉都留着一个进程在跑,Codex 则会在大约一分钟内放开原会话。这个请求不会被等待确认,所以它是一次顺手的收拾,而不是保证。在 Codex 上分叉后立刻去打开原会话,它可能仍会提示这个会话正在别处打开——过一分钟再重新加载即可。
  • 分叉不可用时,它会说明原因。 按钮会置灰并给出提示,而不是干脆消失:回合运行期间无法分叉,因为去指名一条智能体还在写的消息本来就不成立;以及暂时还不能从这条回复分叉,请稍后再试,指的是本次会话流式产出、但 Codeg 还没重新读完的那条回复 —— 从那里分叉会不声不响地落到对话末尾,而不是你指的地方。当你指向的是一条中途插话之前的那半段回复时,遇到的就是第二种。它通常一两秒后就随着重新解析拿到名字而解除;不过如果你恰好是在一轮的末尾插话,那条回复会比线程的末尾少一条消息,而那个名字永远不会到来,它就会一直保持置灰。
  • 工具调用会显示为带状态标记的可折叠卡片——等待审批、运行中、已完成、已拒绝。Shell 命令会实时流式输出——从 0.32.0 起 Codex 的也是,而不再在命令结束之前一直停在一个 [Terminal: …] 占位符上——重复的操作会折叠成一条摘要,例如"已运行 3 条命令"。
  • 什么也没搜到不算失败。 rg 和 grep 在没有任何匹配时以 1 退出,这从前会把 rg --files src | rg foo 这样的命令标成红色,并在它所在的分组里记作一次错误。从 0.33.0 起,一条以 rg 或 grep 结尾、以 1 退出且没有任何输出的单一管道会显示为已完成,退出码仍然留在卡片上。其他任何情况——退出码 2、一行错误输出、一条 && 串联——仍然显示为失败。
  • 没有专属卡片的工具结果——比如某个 Codeg 从未见过的 MCP 工具——会渲染成一棵可折叠的树,而不是一坨 JSON:小的载荷完全展开,大的只显示轮廓,长字符串折成一行。显示原始 JSON 随时可以切回纯文本。
  • 智能体改动了什么会在每条回复末尾归纳出来,分为两组:新增文件(默认展开)和改动文件(默认收起,带有数量以及 +/− 合计)。点击卡片可在编辑器中打开该文件,或使用它的查看差异按钮只看这条回复对它做了什么——在桌面端,还可用在访达/资源管理器中显示在磁盘上定位它。被删除的文件也会列出,并标记为移除。
  • 文件名是活的。 智能体提到的文件——以及你用 @ 附加的任何文件——都会渲染成一个徽章,点击即可在文件窗格中打开。右键它可以获得与文件树菜单相同的操作:在访达 / 资源管理器 / 文件管理器中显示、复制相对路径或复制绝对路径。(在无法生效的地方——浏览器中,或连接到远程工作区的桌面窗口——显示选项会被隐藏;而当文件位于当前文件夹之外时,相对路径一项会置灰。)从 0.32.2 起,相对链接也能打开了——./index.html、../docs/a.md、a.ts:12、Dockerfile 相对当前活动的工作区文件夹解析,~/notes.md 则相对你的主目录——思考块和回复里都一样,而从前这里显示的是 [blocked]。仍在流式输出中的链接,在它闭合之前显示为纯文本。
  • 权限提示。 当智能体需要许可时——运行命令、应用编辑、执行计划——一张卡片会停靠在 composer 正上方:"智能体请求许可以继续本回合。" 它的按钮是智能体自己的选项(允许、拒绝等)。另一张单独的卡片则处理智能体向你提出的多项选择问题;自 0.31.0 起,这一张可以一键收起为标题行,把消息列表的空间还给你,同时问题保持待答状态 —— 当智能体换了新一组问题、或你提交的回答失败时,它会自动重新展开。如果智能体一次问出好几个——Codex 就经常这样——它们会排队:一次显示一张卡片,旁边标着还有 n 个在等待,你答完一张下一张就到。于是一批审批读起来就是一批审批,而不是像卡死了。智能体撤回的卡片——比如属于某个被你停掉的 Claude Code 子智能体,或某个被中断的工具——会自行关闭,而不是留在那里无从作答,还挡住排在它后面的卡片。
  • 每个选项授予什么。 只要智能体把这件事告诉了 Codeg——Claude Code 和 Codex 都会——那些按钮上方就会有一块面板,写清每个选择实际会允许什么,并为每一条标上它的有效期:仅本次运行、本次会话、写入用户设置、写入项目设置、写入本地项目设置,或永久保存。挥手放行一条命令,和把一条规则写进队友也会继承的文件里,两者的区别就在这里说清楚——在你按下任何按钮之前。从 0.30.1 起,Claude Code 自己的按钮上也带着这件事 —— 本次会话对上在这个项目里始终允许 —— 于是作用范围写在你点的那个东西上,而不只是在它上方的面板里。
  • 回复为空时会说明原因。 如果一个回合结束时里面什么都没有,提醒不会只叫你去检查配置——它会指明是三种情况中的哪一种:智能体确实没有产生任何回复、它产生的输出 Codeg 无法解析(通常意味着智能体与协议的版本不匹配),或者它本回合只发来了状态更新(计划、模式、用量)而没有回复。智能体自己的输出——它的错误流末尾,并已抹去一切看起来像凭据的内容——收在状态栏告警里一个折叠着的详情中,那是唯一放得下它的地方。
  • 上下文压缩。 当智能体压缩自己的上下文时 —— 无论是因为空间不够,还是因为你让它这么做 —— Codeg 会在那个位置留下标记:一条横贯对话的分隔线,落在两轮之间,而不是折进它上面那条回复里,因为它本来就是一个边界,不是一次工具调用。智能体给出数据时,它会报出压缩前 → 压缩后的 token 数,悬停时会写明这次是手动触发还是自动触发,而且重新打开对话后它仍然在那里。这些你能拿到多少,取决于适配器:0.75.0 起的 Claude Code 会把整套都给出来,实时与历史都一样;Codex 不提供数量,所以它的分隔线上只写着上下文已压缩;DeepSeek 则是从它的日志里能凑出多少算多少。在 Claude Code 上,一次压缩还会把 composer 旁边的上下文圆环重置为压缩后剩下的量,那个圆环从前会继续按一个已经不存在的窗口来计算。
  • 压缩留下的摘要。 从 0.32.0 起,Claude Code 或 Codex 的分隔线上可以带一个摘要开关,展开的是模型从被丢弃的历史中保留下来的内容 —— 它一边写一边就流式显示出来。从 0.32.3 起,重新打开的对话也以同样的方式显示它,而不再让摘要单独冒出来成为一条消息,或者被接在上一条回复的末尾。同一轮里的两次 Codex 压缩会各有一条分隔线。
  • 压缩失败时会明说。 分隔线会变红并写着上下文压缩失败,悬停可看到原因 —— Codex 发来服务方自己的说明时显示的就是那段说明,而不是原始 JSON —— Grok 失败的压缩也以同样的方式呈现。被中断或取消的压缩会停止转圈,而不是一直停在「进行中」。
  • 目标。 在 Claude Code 和 Codex 上,/goal 会渲染成一张卡片,带着目标内容、状态,以及 token、预算、剩余和已用时长这几项计数——实时可见,之后重新打开对话时也还在。它的操作按钮只会是该智能体真正实现的那些,所以 Codex 提供暂停和清除,而 Claude Code 只提供清除。两者现在都真的会让工作停下来:它们以前要等智能体下一次空闲才生效,于是暂停了的目标还在跑,清除了的还在自我续跑。
  • 委派的工作。 当一个智能体交接给另一个时,一个子智能体浮层会追踪被委派的会话——这正是多智能体协作的核心。
  • 每个回合结束时都会显示其模型和令牌统计——时长已经移到回复自己的头部去了——你还可以将整个对话导出为图片、Markdown 或 HTML。而在回合进行中,composer 上方那一行还会在已用时长和文件数旁边显示它的每秒输出 token 数——一个涵盖正文与思考内容的估算值。它也会出现在对话标签页上,以及那些只读的记录里——一条待办任务的会话、一个子智能体的会话——也就是你在旁观并非自己发起的工作的时候。
  • 把一条消息变成任务。 在复制按钮旁边——你自己的消息和已完成的回复上都有——是一个清单图标:由此消息创建任务。它会把那段文本送到待办任务那边,并预先填好项目文件夹,用于那些你注意到了但此刻不想动手的后续事项。
  • 选中消息里的一段。 在对话记录中任意位置划选文字,选区上方会弹出一个小工具条,带三个操作:复制;引用——把它作为 Markdown 引用块追加到你的草稿里,于是回复一段长答复里的某一段,不必自己复制、粘贴再补上 >;以及追问。引用块现在会渲染出一条真正的引用竖线,composer 里和智能体回复里都是。这个气泡会跟着选区一起滚动和重排,上方放不下时翻到下方,并把整个框限制在面板之内,因此再窄的平铺列也不会把它切掉。只读的对话记录只有复制,因为那里没有可供引用的 composer。
  • 就一段话追问,而不打断当前这条线。 追问会把气泡上的按钮换成一个输入框;写好提交,Codeg 就新开一个对话,先带上引用的那段话,再跟上你的问题。新对话以当前这个对话的智能体开场,并留在同一个分屏组里,于是回答你的仍是写出这段话的那个智能体,而不是一个空白对话会默认选到的那个——而就某一段问一句「为什么用这个方案?」,也不必赔上你正在读的这条线。从文件夹对话发起时,新对话会落在同一个文件夹和工作目录上;从聊天模式发起时,它会作为一个全新的无文件夹聊天开始,因为聊天对话之间并不共用文件夹。
  • 把图片复制出去。 右键点击一张图片即可复制图片——在对话记录里、在放大预览里,以及从 0.28.2 起,也包括你已经放进 composer 但还没发出去的那一张。在桌面端,这件事对 JPEG、WebP 和 GIF 从前是直接失败的;现在三者都可用。
  • Mermaid 图表有了自己的查看器。 一个 mermaid 代码块会渲染成带自己一套控件的图表:0.2× 到 8× 缩放、拖动平移、重置视图和全屏。放到多大都清晰,因为缩放是按真实尺寸重新排版这张图,而不是把它的一张位图拉大。配色跟随你的界面主题,切换主题时已经画出来的图也会跟着重绘。用复制源码把它带走,或下载成 SVG、PNG 或 .mmd。渲染失败的图会明说,并给出查看源码与重试,而不是在本该有图的地方留一块空白。
  • 系统消息会显示预览。 智能体写进对话记录里的摘要——Pi 的分支摘要、Qoder 的压缩摘要——从前是一个关着的折叠块,你得打开才知道里面有什么。现在它会限行渲染出来,只有在下面确实还有内容时才给一个展开开关。(Claude Code 和 Codex 的压缩摘要如今放在分隔线的摘要里。)
  • 后台工作有了一条可以盯着看的条带。 当智能体启动了会活过这一轮的工作时 —— Claude Code 的后台任务,以及从 0.30.3 起 Codex 挂到后台的长命令,它们在对话记录里会标上后台运行 —— 对话记录上方会钉住一条条带,正在跑或已暂停的任务一行一个:它最后跑的工具、已经花掉多少 token、一个停止按钮,以及一个把该任务日志在文件标签页里打开的输出链接 —— 这些都要等任务真的报上来才会出现,所以一行刚开始可能只比一个名字多不了多少。只列未结束的任务 —— 一个任务落定就立刻离开条带,因为它的结果属于对话记录,而一份已完成作业的常驻清单只会整个会话地涨下去。停止需要一个你拥有的活连接,而被拒绝的停止会明说 —— 成功的那次靠「这一行消失了」来宣告自己,沉默看起来会和「点了但什么也没发生」一模一样。0.32.3 起,Grok 的后台工作流也加入了这条条带,显示它们所处的阶段和当前正在干活的智能体,但没有自己的停止按钮;某个工作流结束后,Grok 写的那条回复会落进对话里。
  • 插入消息会把正在跑的东西转到后台 —— 在 Claude Code 2.1.286 及以上版本上。 从这个版本起,回合中途有消息到达时——也就是插入当前回合——正在运行的命令、MCP 调用或子智能体会被移到后台,而不是等它结束或把它打断,Codeg 也会像对其他后台命令一样给这样的命令标上后台运行;而一张仍然开着的提问卡片,在你插入时会和以前一样被丢弃。普通的发送仍会排队,直到这一回合结束。从 0.33.0 起,后台命令结束时,它的卡片不会再被内部标记文本覆盖。
  • 通知会弹出来,而不会打断回复。 Claude Code 和 Codex 就某个会话发出的通告 —— 模型回退、拦下了你提示词的 hook、配置或弃用警告 —— 从 0.32.0 起会以 toast 的形式弹出、标题是智能体的名字,而不再作为一行粗体字写进回复里;警告还会留在状态栏的告警里。从 0.32.3 起,这也包括加载失败的 Claude Code 插件:它会被点名,并附上 Claude Code 给出的原因,而不是让这个插件悄无声息地丢掉它的命令、技能、智能体或 MCP 服务器。
  • 智能体用 HTML 做出来的东西会出现在回复里。 从 0.32.3 起,Codex 的可视化 —— Claude Code 用同一个技能时做出的也算 —— 或者 Hermes 的预览,会在回复引用它的位置渲染成一张卡片,而不是一段原始标记。回复里提到的其他本地 .html 文件,会在回复结束后于其下方得到一行预览,每条回复最多四个,点开也是同样的卡片。卡片头部带有重新加载和打开文件,过高的卡片会折叠在展开全部后面。完整的页面一开始脚本是关闭的:启用脚本会运行它们,并允许这张卡片访问网络 —— 只对这一张卡片有效,也只持续到它消失为止,不会记住任何东西。Codex 可视化自己的片段从一开始就运行脚本,但运行在一个沙箱里:它只从少数几个公共 CDN 加载代码和字体,不抓取任何其他东西,也碰不到你的文件。路径相对于对话运行时所在的文件夹解析。

在智能体工作时插话 ​

眼看着智能体走偏、却只能等它写完才有机会开口,是这类工具里最古老的一种憋屈。从 0.30.3 起,任何有投递通道的会话都有了入口:在智能体工作时往 composer 里打字,分体发送的箭头里就多出一个动作,与那个寻常的加入队列并列。

通道有两条,Codeg 对它们的措辞是刻意区分开的,因为它们承诺的确实不是同一件事:

  • 插入当前回合 ⚡ —— 原生 _session/steering 推送。便条会进到已经在跑的那份工作里,智能体当场就能看到。这是 Claude Code 独有的,且需要适配器 0.65.0 或更高;而这个下限是一项策略判断,不只是版本钉住:Codeg 校验的是实际在跑的那个适配器,而不是它本该装上的那一个。
  • 发送留言,供下次检查时读取 🕐 —— 便条会被记下来等着。智能体下一次查看时才取走,而这正是对一个「需要智能体主动调用」的工具最诚实的描述。这适用于任何在启动时被交给了 check_user_feedback 工具的会话 —— Codex、Grok、Gemini、OpenCode 等等,前提是伴生服务在位,且实时反馈在那个智能体启动之前就已打开。中途再去打开这个开关,没法把这个工具补装到一个已经在跑的智能体上。因为这些智能体通常只有在被提醒时才会查看,所以在你最初那条消息里加上一句「定期查看我的实时反馈」,才是让这条通道真正靠谱的办法。

两者都没有的会话,保持它一直以来那个只有取消按钮的样子。

附件会一起过去。 带着图片或 @ 提及文件的草稿,会以与普通发送完全相同的块列表被送出去,不会有东西被悄悄剥掉 —— 而且图片当场就显示在正在进行的这一轮里,不用关掉会话再打开。在便条类会话上,后端不接受这些块,于是整条草稿连同附件一起排进队列。

发出去的同时可以接着打字。 插入当前回合需要片刻才会得到确认,从 0.34.0 起,你在这片刻里对 composer 做的修改都会保留:只有当输入框里仍然恰好是你发出的那段内容时,它才会被清空。保留的是整份草稿——你新加的一行会和已经送达的那部分文字一起留在框里,所以再次发送前请先把那部分删掉。0.34.0 之前,确认一到就会清空 composer,连同你的修改一起。

已经排进队列的消息也能插进去。 排队的消息以带编号的行等在输入框上方:拖住一行的把手可以调整顺序,编辑会把它放回 composer,删除则把它丢掉。从 0.30.10 起,当一个有投递通道的会话正在运行回合时,每一行还会带上那条通道的动作——⚡ 插入当前回合,或 🕐 作为留言,供下次检查时读取——这样一分钟前排进去的消息不用重打就能送到正在工作的智能体那里。有两种行不提供它:你正在编辑的那一行,因为它当前的文字在 composer 里而不在行里;以及在便条类会话上带着附件的行,它仍会随下一轮整条发出。同一时间只会有一次插入在进行——其余行的按钮会置灰,直到它有了结果——并且从 0.34.0 起,连点两下也不会再同时插进两条消息。

已发出的便条以行的形式显示在输入框上方 —— 在智能体读到它之前是等待中,读到后变为已接收。在推送通道上,便条同时也是一条真正的消息:它作为独立的一轮落在对话记录里,智能体针对它的回答也会另起一轮,不会和上一段答案粘在同一处连成一片;而一旦对话记录这样采纳了它,它那一行就会消失,因为两边都显示等于把同一件事印了两遍。在便条通道上则没有可供采纳的轮次 —— 那一行就是它的全部,直到智能体下一次查看把文字取走。

它可能落空的两种方式,都会明说:

  • 还没插进去,那一轮就结束了。 草稿会改为排队,随下一轮发出 —— 它会告诉你,而不是不声不响地改道。从 0.34.0 起,你点过的那条排队消息会移到队列最前面,最先发出,而不是排在它前面那些消息的后头。
  • 智能体没读到就收尾了。 这些行不会随那一轮消失,而是留下来写明「智能体在读到你的反馈之前就结束了」,每一行都提供作为新消息发送或忽略。已经被读到的便条则随这一轮退场 —— 它们的活已经干完了 —— 而你的下一条消息会清掉其余的。

+ 菜单里的实时反馈会打开一个通往同一条通道的对话框,适合那些你不想直接写在 composer 里的便条。→ 实时反馈如何抵达正在运行的智能体

一个回合失败时,它会说清楚是哪一类失败 ​

一个中途夭折的回合,以前只会留给你一句笼统的报错和一堆猜测。Claude Code 和 Codex 会按类型上报失败——连接异常、访问受限、已达限制、请求被拒绝或服务异常,遇到 Codeg 认不出的类型则退回到一个笼统的会话异常——下面附上智能体自己的说明。

从 0.32.2 起,会话的警告和错误都以同一种方式到达:一条通知。每一条会以 toast 的形式弹出一次,带着真正帮得上忙的那些按钮,并且留在状态栏的告警列表里,所以错过的 toast 并不会就此消失。有两类会留在它们该在的地方:智能体自行重试时显示在输入框下方(见下文),压缩失败则显示在对话记录里它的分隔线上。那些按钮是智能体给出的建议,而不是 Codeg 的猜测。目前认得三种:

  • 重试会重新发送那个失败回合正在处理的消息。(如果没有可重发的内容,它会直接说明,而不是按下去什么也不发生。)
  • 新建会话会开一段新对话。
  • 去登录会在一个单独的窗口里打开设置,停在该智能体的页面上,而你原来所在的工作区留在原处不动。从 0.32.3 起,凡是因为你需要重新登录而拒收消息的智能体都会给出它,而不只是 Claude Code 和 Codex。

重试和新建会话作用于刚刚失败的那一轮,所以它们只出现在 toast 上,并在你发出下一条消息后失效;去登录则在告警条目上也有。只读的查看器——一段待办任务的记录、一个子智能体的会话——会收到这些通知,但没有那些恢复按钮。

告警是状态栏最右边的入口:一个计数,只要其中有一条是错误就显示为红色,只有警告时则为琥珀色。条目按从新到旧排列,每一条带着它的消息、一行细节,以及——在智能体输出过内容的情况下——一个折叠的详情,里面装着那段输出,其错误流末尾已抹去一切看起来像凭据的内容。你可以逐条忽略,也可以一次全部清空。同一条消息再次出现时会替换它原来的条目,而不是叠加上去;这份列表只保留最近的 50 条,且只存在内存里。

留在 composer 下方的,只有仍在进行中的事。当智能体在自行重试时,一行琥珀色提示会写明第几次尝试和倒计时——正在重试 3/10,4.0 秒后重试——并且不带任何按钮,因为它自己在处理期间没有你要做的事。同时出现的多次重试会合并成一条,并标注另 N 条。一旦它恢复,留下的是一行灰色的已恢复,它会在十秒后自行消失,而不是一直通报一件早已过去的小插曲。

崩溃时会说明原因。 进程挂掉的智能体——无论是在启动时还是回复到一半——会连同它的退出状态一起报告出来,它写进错误输出的最后几行则收在详情后面;从前你能拿到的只有一句光秃秃的 Incoming transport closed。回复中途的崩溃还会关闭连接,而不是留下一个看起来仍已连接、却让每条消息都失败的会话。而一个向 Codeg 请求了它不处理之事的智能体,会被如实告知,然后继续这一轮,而不是永远等一个答复。

打开一个旧会话不会把这些重放一遍:上周掉的一张图、失败过的一次上下文压缩,都留在历史里,而不会冒出来变成一条实时提醒和一条桌面通知。

一条提示被拒,代价是这一轮,不是整个会话。 Codeg 驱动的每一个智能体都会拒绝某些提示,而它本身完全健康、完全可以继续对话——Qwen Code 对它 ACP 层没实现的 /mcp 回一句「Slash command not supported in ACP integration」,OpenCode 把供应商侧的限流也包成同一种错误。到 0.31.2 之前,这些都会把整条连接拆掉:一个终态错误,外加一个一直置灰到重建完成的输入框。现在智能体自己的那句话会以非终态错误呈现,这一轮就此落定,会话继续可用——下一条提示照发照用。只有三类仍然致命,因为之后的任何一条也活不下来:智能体根本没有 Codeg 刚才所提示的那个会话记录、它回话说自己的会话或进程已经没了,以及根本没等到回应——那意味着死掉的是传输层而不是这一轮。要求认证则和以前一样,只作用于这一轮。

当连接看起来不对劲时 ​

composer 下方的那个连接心形是一个按钮。点它就能看到 Codeg 对这个会话实际掌握的信息:智能体、它的真实状态——正在响应…与静止的已连接会被区分开——工作目录、会话 id,以及任何错误。当一次连接尝试失败时,心形会变红——连接异常——它的提示和弹出面板都会说明原因,而从前它只会退回到一个暗淡的未连接。

底部是重新连接,它在每一种状态下都有效,包括那个你之所以点它正是因为它卡住了的「正在连接」。它会尝试恢复会话,所以你的历史会跟着一起回来;如果智能体无法加载会话(Cline 就是其中之一),或者加载失败,就会在同一个对话上开启一个新的智能体会话——对话记录保留,但智能体之前的上下文不在了。

当一个会话确实加载不回来时,横幅会说明它属于哪一种已知原因,而不是笼统的「加载会话失败,正在新建」——而其中一种还附带解法。被你 codex archive 过的 Codex 会话会点出确切的 codex unarchive <id> 命令,id 已经填好,一点即可复制。在 0.29.0 之前,这种情况不在已识别的失败之列,于是一个只差一条命令就能回来的对话,被悄无声息地丢在了那里。

会话开着时登出 Claude,只会结束这一轮,不会波及别的。 从 0.30.3 起,那一轮会停下并写明「Claude Code 需要你重新登录,才能运行这一轮」,会话本身留在原地 —— 去设置里登录,然后把消息再发一次即可。它从前会把整条连接一起拖垮,并让对话读起来像是已取消,而那对真正的原因只字未提。同样状态下的委派子智能体会报需要登录,而不是一句看不懂的异常结束。

长会话打开更快 ​

一个持续了好几周的对话,不会让你等着它全部加载完。Codeg 只加载最近 120 个回合——起点还会往前挪到你自己的某条消息上,因此窗口不会从一次问答的中间切开——你向上滚动时再每次取进 120 个,而且视图不会在你脚下跳动:你正在读的位置保持不动,更早的回合追加在它上方。来自服务器或远程工作区的响应还会在传输时压缩。

这个窗口只是显示层面的事。导出仍然取完整记录,其他把对话当作一份文档来读的功能也一样。

会话加载失败时,你看得见的部分会被保留

如果加载一次对话时出错,失败提示现在会作为一条小提示停靠在输入框上方,带上重新加载和新建会话,而不是用整页报错顶掉一切。你已经拿到的那段记录会留在屏幕上,也依旧可读。

处理文件——编辑器、diff 与预览 ​

右侧面板中的文件标签页是你的项目树,以工作区为根;点击任意文件即可在中间的文件窗格中打开它。拖动某个条目可以重排项目或投喂智能体:把一个文件或文件夹拖放到另一个文件夹(或工作区根目录)上可在磁盘上移动它,或把它拖入 composer 可将它附加为下一条消息的文件引用——由拖放的目标决定是哪一种,无需任何修饰键。这棵树也支持键盘操作:↑/↓ 移动,→ 展开文件夹或进入其中,← 收起它或跳到父级,Home/End 跳到首尾,Enter 打开文件或展开/收起文件夹。每一行都带着一个 ⋯ 按钮,点开的是右键和长按同样会打开的那份菜单 —— 在触屏上它是一个看得见的入口,毕竟每一行同时还能拖拽,长按有时会含混。

  • 复制——路径,或者文件本身。 行的右键菜单里有一个 复制 子菜单:相对路径(写提示词或敲 git 时要的那个)、绝对路径(给别的应用用的那个),以及 文件——目录行上则是 文件夹——它把这个条目本身放进系统剪贴板,于是在访达或资源管理器里粘贴出来的是一份真正的副本。0.31.2 新增,文件行、文件夹行和工作区根目录行都有。第三项仅限桌面:在浏览器里、以及连接到远程工作区的桌面窗口里,文件都在另一台机器上,复制会落到那台机器的剪贴板,所以那里不提供它。
  • 编辑。 文件会在完整的编辑器中打开。这里没有保存按钮——Codeg 会在你按下 ⌘/Ctrl+S、编辑器失去焦点时,以及你停止输入几秒后自动保存;未保存的文件会在其标签页中显示一个 *。用 ⌘L 可将一个文件或仅选中的内容发送给智能体。
  • Diff。 智能体的编辑会以只读 diff 的形式打开——并排(HEAD ↔ 工作树)或作为内联的统一 diff,一次一个文件,带有更改计数和上一处/下一处导航。Diff 用于审阅;你通过 git 面板(见下文)提交,而不是逐行接受更改。
  • 那些小的 diff 卡片也能并排看了。 那些紧凑的预览——回复里的 diff、权限询问在你批准一次编辑前给你看的那份、待办任务的变更文件,以及作为独立标签页打开的查看差异——在 0.28.2 里,右上角多了一个内联 ⇄ 并排开关。默认仍是内联,而这个选择会被记住并共享:在一处设好,其余每一份预览都跟着走。纯粹是新增的文件保持单栏,因为它没有旧的一侧可展示。
  • 实时预览在同一个窗格中打开:Office 文档(.docx、.xlsx、.pptx)会随着智能体编辑而渲染并刷新;Markdown 和 HTML 提供预览 ⇄ 编辑源码切换(HTML 仅在你选择启用时才运行脚本);图片可缩放和平移。→ Office 文档

合并冲突拥有专属的编辑器

解决冲突会打开一个三栏合并编辑器——本地、结果、远程——在这里你可以逐块接受更改。这是唯一提供逐块控制的地方;在其他任何地方,diff 都保持只读。

会话详情 ​

辅助面板默认打开在会话详情上——它是你所在对话的一览:标题和各种 id、正在运行它的智能体和模型、状态和当前 git 分支,以及实时的令牌用量(输入、输出、缓存和上下文窗口总量)连同耗时与时间戳。每个字段都有一个复制按钮;当没有聚焦任何内容时,它只显示暂无活动会话。它是一份只读一览,而非控制面板——同样的内容也可以从对话头部的 ⋮ 菜单打开。

分支与 git 操作 ​

composer 下方的分支标签首先是一个分支选择器,而且每个对话各有一个,因此平铺的会话会各自显示自己的分支。点击它会打开一个可搜索的菜单,分为两部分:

  • 顶部的操作——只有作用于你当前所在分支的那一小组:更新代码、提取远程分支、提交代码...、推送...、新建分支...,以及新建工作树...
  • 下方的你的分支:本地分支和远程分支,共同前缀(feature/…)会折叠成默认收起的分组,当前检出的那个标记为当前。点击其他任意分支即可看到它的操作——切换到此分支、将它合并到当前分支、把当前分支变基到它上面、删除分支,或者不检出就对它执行拉取代码 / 推送。被某个 worktree 检出的分支还会提供删除工作树和删除工作树及分支。

长尾的那些操作不在这里:储藏与恢复储藏和其余工作树操作一起位于辅助面板的更改标签页,管理远程仓库位于它的提交标签页。

顶部的一个搜索框会同时过滤这两部分,因此输入 push 能找到该操作,输入分支名的一部分则能找到分支。在聊天模式下完全不会出现这个标签;在不是 git 仓库的文件夹中,它显示为无分支并提供初始化 Git 仓库。

→ Git 与 Worktree 介绍了完整的工作流程。

运行已保存的命令 ​

状态栏带有一个启动器,用于你反复运行的那些命令——开发服务器、测试监听。Codeg 会从你项目的 package.json 脚本中为该列表播种,因此你第一次查看时通常就已经有内容了;在那之前它显示为添加命令。从菜单中选一个,▶ 按钮就会在终端中运行它,并变成 ■ 用于停止。管理命令...可以添加、编辑、重新排序和删除它们,而你的选择会按文件夹被记住。

审阅与提交 ​

右侧面板的两个标签页让版本控制触手可及:

  • 更改列出你工作树中的编辑——已跟踪和未跟踪的,附带每个文件的行数统计。你可以从这里打开某个文件的 diff、放弃某项编辑(回滚),或开始一次提交。
  • 提交是你的完整历史记录,呈现为一条会随滚动加载更多内容的时间线。两个筛选胶囊可以缩小范围——分支和作者——而且 Codeg 会按项目记住这两者。点击某个提交即可展开:完整的提交信息、它改动的文件及其 +/− 计数(点击某个文件可查看它的 diff),以及包含它的分支。右键可使用查看差异、新建分支...、重置到此处或推送...

分支胶囊一开始就停在 HEAD 上——也就是你当前所在的分支,它的名字就标在旁边——它会在每次查询时重新解析,因此历史会随着你的每一次检出跟着走,即便处于分离 HEAD 状态也照常可用。指定一个分支名会把视图钉在那个分支上;用胶囊上的 ✕ 把它清除,则会一次显示全部分支;无论你选哪种,都会为那个文件夹记住。在 0.32.3 之前,这个标签页一打开显示的是全部分支。

更改标签页本身就能提交:在它的工具栏里写一条消息按回车,即可对已跟踪的改动做一次快速提交;也可以打开完整的提交窗口,精确勾选你想要的文件,写一条消息,然后选择提交或提交并推送。它的菜单里还有拉取、获取、推送、储藏与恢复储藏。切换分支、合并和 worktree 则是分支标签的活。

使用 worktree 的并行开发、远程账户以及完整的 git 工作流程都有各自的页面。→ Git 与 Worktree

终端 ​

按 ⌘J 可在你的工作文件夹中打开一个集成终端——一个真实的 shell,而非沙箱。你可以在标签页中打开任意多个。它专为那些你更愿意自己运行的命令而存在:启动开发服务器、检查输出、在智能体旁边运行一次性脚本。

Ctrl+Shift+C 复制选区,Windows 上的 Git Bash 也包括在内,并且复制后焦点仍留在终端里 —— 而单纯的 Ctrl+C 保持它一直以来的含义:中断。

在窄窗口下 —— 手机,或者任何小于 768 px 的宽度 —— 软键盘上方会浮着一条虚拟按键条,因为触屏键盘上一个 shell 需要的键都没有:ESC、TAB、/、-、四个方向键、HOME、END、PGUP 和 PGDN。CTRL 与 ALT 是闩锁而不是按住不放的键,而且两者互斥 —— 点一下它会高亮,接着你输入的下一个字符会被它包装,然后闩锁自动弹起,于是 Ctrl+C 是两下,而且对软键盘打出的字母和按键条自己的键都有效。无论如何这个闩锁都会被消耗掉:如果你按下它之后输入的那个字符它没有对应的编码,那个字符会原样送出去。这条按键条可以从终端的标签栏收起,收起状态会为那个浏览器或应用记住。

标签页与多任务处理 ​

中间区域采用标签页形式,因此可以同时打开多个会话:

  • 对话标签页可通过拖动重新排序,双击可固定。⌘T 打开新对话,⌘W 关闭标签页,⌘Tab 在它们之间循环切换。
  • 文件标签页追踪你在文件窗格中打开的文件、diff 和预览。标签条末尾的 + 可以开一个空白浏览器标签页,并列出此刻正在运行的本机服务,于是智能体刚起的开发服务器只隔着一次点击。
  • 未发送的草稿能在重启后保留。 你开启却从未发送的对话会回到原处——连你在 composer 里敲过的文字也一并回来。每个草稿都保留各自的文本,因此并排的两个草稿不会再互相覆盖。

把对话视图拆分为分组 ​

一条标签页条并不总是够用。右键点击任意对话标签页,你就可以把对话区域拆分成标签分组——与编辑器的分屏是同一个思路,而且数量没有固定上限:

  • 向右拆分 / 向下拆分——把当前分组一分为二。新分组会打开一个空白草稿,因为同一段对话不能同时出现在两个分组里。
  • 拆分并向右移动 / 拆分并向下移动——同样的拆分,只是这个标签页会移入新分组。

每个分组都是一套完整的工作区:自己的标签页条、下方自己的对话头部,以及自己的新建对话按钮(沿用该分组的文件夹)。同一时刻只有一段对话是活动的——即 composer 和快捷键作用的那个——因此拆分之后你也不会搞不清按键落在了哪里。

拆分之后,同一个右键菜单还负责管理布局:

  • 移动到对面分组,或在分组较多时使用移动到分组 n(每一项都会标注它正显示的对话)。
  • 更改分隔方向——把左右并排的一对翻转成上下堆叠,或反过来。
  • 取消拆分会把当前分组并入相邻分组;全部取消拆分则把一切收回成一个。

你也可以直接把标签页拖过去——拖到另一个分组的标签条上,或它窗格中的任意位置——一个浮动小片会跟随光标,同时会有落点指示告诉你它将落在哪里。拖动两个分组之间的分隔条可以改变空间的分配。拆分可以自由组合:先向右拆,再把其中一半向下拆,你就得到了一个网格。

你的布局会按工作区记住,草稿也包含在内——重新打开 Codeg,拆分会回来,同样的对话仍在同样的分组里。

有两条小规则让这一切保持可预期。草稿会留在生成它的分组里(它在服务端还没有可移动的东西),因此它的移动菜单项和跨分组拖动会被撤下——在自己分组内重新排序仍然可用。而在分组之间移动标签页不会打断它:会话会保持连接、继续流式输出,只是换了个家。

将多个会话并排平铺 ​

拆分是每个分组显示一段对话,平铺显示则正相反——它把一个分组所有的标签页同时显示出来。右键点击一个对话标签页并选择它,即可把该分组的对话并排铺开:不是固定的两栏分屏,而是每个打开的标签页对应一个窗格,并排排列,当它们放不下时可横向滚动。这就是你同时运行一支智能体舰队的方式:在一个里开启一项任务,在另一个里开启另一项任务,无需切换标签页就能看到每份对话记录并行流动。

  • 窗格就是你的标签页。 打开另一个对话(⌘T 或侧边栏)可添加一个窗格;关闭一个标签页可移除一个。平铺至少需要该分组中有两个对话才能生效。
  • 自由混合项目。 平铺的窗格不局限于单个文件夹——可以把来自不同项目的会话并排放在一起。
  • 只有一个窗格是活动的。 活动窗格——即 composer 和快捷键作用的那个——会以流动的渐变边框勾勒出来。点击任意其他窗格即可聚焦它。
  • 它是按分组生效的。 平铺与拆分可以组合:把一个分组平铺成一整面对话记录墙,同时让旁边的分组只显示一段对话。
  • 随时退出。 右键 → 退出平铺会把该分组带回单标签页视图。

平铺是多智能体协作的绝佳搭档:将主导会话与它启动的子智能体会话并排平铺,观看整个团队协同工作。

欢迎界面 ​

在会话开始之前,对话窗格会询问"你今天想做什么?",并在三个标签页中提供快捷操作——代码开发、办公工作和科学研究。每张卡片只需一键即可将一个现成的技能(对于办公和研究,还有一个提示词模板)放入 composer;任何尚未为你所选智能体启用的项目都会显示一个锁形图标,点击可跳转到启用它的位置。下方是智能体选择器和一条轮换显示的提示。

快捷操作下面那一排技能快捷方式会在两端停住,不再自己往前漂:两端各有一个箭头用来移动它,而每个箭头只在那个方向还有内容时才可点。

桌面版与浏览器版 ​

无论你运行桌面应用还是在浏览器中打开 codeg-server,工作区都是一样的。有几处不同:

  • 文件。 桌面应用使用原生文件对话框,并且可以在 Finder / Explorer / 终端中打开;在浏览器中,你则改为上传文件或在服务器上选择文件。
  • 窗口与附加功能。 自定义窗口控件和桌面宠物仅限桌面版;浏览器则增加了登录(你的访问令牌),以及连接断开时的重新连接提示。
  • 远程工作区。 桌面应用可以连接到远程服务器,此时它的文件操作会表现得像浏览器一样——而从 0.32.2 起,它的内置浏览器打开的是远程主机自己的地址。
  • 你的窗口会回来。 从 0.33.0 起,桌面应用会重新打开你退出时开着的那些工作区窗口——本地的那个和每一个远程工作区,而你当时正在用的那个会回到最前面。连不上的远程工作区会改为在本地窗口里报告。
  • 退出会停掉 Codeg 启动的东西。 从 0.33.0 起,无论你以哪种方式退出——⌘Q、程序坞、登出,或在 Windows 上注销——智能体、终端和 Web 服务都会被关闭,和一直以来从托盘的「退出 Codeg」退出时一样。
  • 触屏。 在手机或平板上,切换到另一个对话时,屏幕键盘不会再弹出来盖住它;想打字时点一下 composer 即可。使用鼠标或触控板时一切照旧。

键盘快捷键 ​

快捷键操作
⌘/Ctrl B切换对话面板
⌘/Ctrl E切换右侧(会话详情 / 文件 / 更改 / 提交)面板
⌘/Ctrl J切换终端
⌘/Ctrl T新建对话
⌘/Ctrl K搜索对话和文件
⌘/Ctrl W关闭当前标签页——在 macOS 上,焦点位于网页或 HTML 预览内部时同样有效
⌘/Ctrl Tab在标签页间循环切换
Enter / Shift+Enter发送 / 换行
⌘/Ctrl L将当前文件或选中内容添加到对话
⌘/Ctrl S保存当前文件
⌃⌘Esc / Ctrl+Alt+Esc停止电脑操作——所有共享立即全部结束(桌面版,且仅在它开启时)

以上是默认设置;其中一些可以更改。

后续步骤 ​

  • 使用智能体——启用一个智能体,并在工作区中运行你的第一个会话。
  • 对话聚合——来自每个智能体的过往会话如何进入对话列表。
  • Git 与 Worktree——完整的版本控制工作流程,包括并行开发。
  • Token 用量——状态栏里那个对话计数点开之后是什么。
  • 多智能体协作——将任务的一部分委派给其他智能体。

基于 Apache-2.0 许可证发布。