T3 Code 项目设置指南:环境 × 项目两级作用域、覆盖链与自动拉取
【免费下载链接】t3code项目地址: https://gitcode.com/GitHub_Trending/t3/t3code
本文围绕 T3 Code 的“设置(Settings)”模块展开,讲解其以环境(Environment)和项目(Project)为两轴的作用域模型:如何在多个连接环境上批量修改配置、如何为单个项目覆盖默认值、如何通过层级图标追踪配置来源,以及 Source Control 中自动拉取(Automatically pull)的触发条件。读完本文,你将掌握 T3 Code 配置继承与覆盖的完整规则,并能结合仓库源码定位每条设置背后实际的存储与同步逻辑。
设置面包屑:两个轴决定“改给谁”
T3 Code 设置页的顶部面包屑结构为Settings / 分类 / 环境 / 项目,其中环境与项目两个末级面包屑(crumb)决定了当前修改作用于谁。两者默认停留在All environments(所有环境)与All projects(所有项目),并且在切换分类或搜索设置时保持选中状态,不会丢失当前的作用域上下文。
- 只选中环境(All projects):当前修改会应用到所选环境上的所有项目;
- 再选中某个项目:修改就变成该项目在所选环境上的项目覆盖(project override)。
从源码看,这一交互由 SettingsBreadcrumb.tsx 实现:环境轴使用ALL_ENVIRONMENTS_VALUE作为“所有环境”的哨兵值,项目轴使用ALL_PROJECTS_VALUE作为“所有项目”的哨兵值(SettingsBreadcrumb.tsx#L164-L233)。注释还点明了一个关键规则:同一个项目在不同环境上是同一个项目,因此环境面包屑单独决定了项目覆盖写入到哪个环境(SettingsBreadcrumb.tsx#L54-L60)。
本地偏好与服务器设置的分界
设置按存储位置分成两类:
- 保存在本机的偏好(如外观 appearance、确认弹窗 confirmations、浏览器配置文件 browser profiles)始终显示在当前值,不受环境/项目选择影响;
- 其余所有设置都存储在服务器上,因此需要选择作用域。
针对服务器存储的设置,你可以:
- 选择单个环境:只编辑该环境的配置;
- 保持All environments:一次批量编辑所有已连接环境的配置。注意,离线环境保持其当前值不变——这是批量编辑,不是“同步的全局默认值”。换句话说,批量编辑是每个环境各自写一份新值,未来新连接的环境并不会自动继承这次修改。
项目覆盖、层级链与 Mixed 状态
为某个项目设置覆盖值后,该环境上的该设置将优先使用项目覆盖值。每行服务器设置标题旁会出现一个图层图标(layers icon),点击后可以查看该设置在所有选中环境上的“取值链”,链条共三层:
- 内置默认值(built-in default);
- 环境值(environment);
- 项目覆盖(project override)。
判断逻辑如下:
- 当所选环境的值不一致时,控件不显示具体值,而是显示Mixed,且图层图标变为琥珀色。此时选择一个值会把它应用到每一个选中的环境;
- 项目中不能被覆盖的设置,在选中项目时以只读(read-only)状态显示;
- 修改环境值永远不会触碰项目自己的覆盖。当你编辑的设置恰好被某些项目覆盖时,图层图标会显示覆盖项目数量,取值链中会逐个列出每个项目的值:点击项目可直接跳转,或使用Reset all让这些项目重新跟随环境值;
- 单个项目覆盖可通过Reset恢复为继承(inherit)环境值。
这一“Mixed”交互在 UI 层有直接对应实现:ProjectDefaultsSettings.tsx 通过useScopedSettingsMixed为defaultModelSelection、defaultRuntimeMode、defaultThreadEnvMode、enableAgentBrowserAccess、defaultAutoPull、pullRequestMergeMethod等设置计算混合状态并显示 “Mixed” 标签(ProjectDefaultsSettings.tsx#L70-L76);ScopedSwitch.tsx 则把同一套混合判定复用到开关类控件上。可以推断,useScopedSettingsMixed的作用是:当所选多个环境对该设置的值不一致时返回 true,从而驱动 UI 呈现 Mixed 而非单一值。
按机器的设置例外
Providers(提供商)与 Diagnostics(诊断)是按机器(per machine)的设置:它们同一时刻只展示一个环境(默认展示主环境,primary,直到你手动切换),不参与上述的多环境批量扩散;其余所有设置才“扇出(fans out)”到当前的选择。
默认值与继承:各设置分类的职责
选中不同面包屑时,同一行编辑控件操作的对象会切换:
| 分类 | 职责 | 与作用域的关系 |
|---|---|---|
| General | 新线程(new threads)使用的模型(model)与工作区(workspace) | 同一切面既可编辑环境默认值,也可编辑项目覆盖 |
| Integrations | 控制 agent 的浏览器访问(agent browser access) | 浏览器访问变更在 agent 会话下次启动时生效 |
| Source Control | 自动拉取(Automatically pull)、默认 PR 合并方式(default pull request merge method)、文本生成(text generation) | 同一切面既编辑环境默认值,也可编辑项目覆盖 |
| Project(选中项目时才出现) | 项目的名称、图标、操作(actions)、检出版本(checkouts)与移除 | 操作属于项目:编辑会在每个选中环境上创建该项目自己的操作列表,Reset 则回到环境共享列表 |
工作区模式下的 t3.json:在 workspace 模式下,当项目没有覆盖时,项目根目录的t3.json偏好(preference)生效——即t3.json是低于环境值、高于内置默认值的一层来源。t3.json的加载由服务端的 T3ProjectFileLoader.ts 完成(该 Effect 服务专门加载仓库中检入的t3.json并解码);其测试 T3ProjectFileLoader.test.ts 覆盖了“有效文件可加载、文件缺失返回 none”两类情况。
t3.json:项目的声明式配置
仓库根目录的 t3.json 是该项目自身的声明式配置,包含两个主要区域:
- iconPath:指向一个图片路径,作为项目图标的来源(T3 Code 桌面版与 Web 端均可识别);
- scripts:项目操作(actions)列表,每个操作含
name、command、icon,并可通过runOnWorktreeCreate标记在创建 worktree 时自动运行。
当前仓库的 t3.json 就定义了两个 Setup Worktree 脚本(Unix 与 Windows 各一个),用于把项目根目录的.env以符号链接方式同步到每个新 worktree,并预热 Web 依赖缓存:
{ "$schema": "https://t3.codes/schema/t3.json", "iconPath": "assets/dev/blueprint-web-apple-touch-180.png", "scripts": [ { "name": "Setup Worktree", "command": "vp i && ln -sf $T3CODE_PROJECT_ROOT/.env .env && ...", "icon": "configure", "runOnWorktreeCreate": true } ] }这些操作可以在设置页的 Project 分类中导入(import),从而免去手工逐条录入。图标解析方面,ProjectFaviconResolver.ts 的测试(ProjectFaviconResolver.test.ts)明确了几条规则:
t3.json中的iconPath优先于仓库内约定俗成的图标文件位置;- 若
iconPath指向的文件不存在,则回退到约定位置; - 非法的
t3.json(无法解析为 JSON)会被忽略; - 指向工作区根目录之外(如
../secret.svg)的iconPath不会被解析,防止路径逃逸。
项目图标(Project icons)
选中项目后进入Project分类即可修改图标,支持三种来源:
- 图标(icon):内置图标集;
- Emoji;
- 图片(image):可选用项目内的图片文件。
选择结果会应用到项目组(project group)下的每一个 checkout,并同步显示在已连接客户端上。若想恢复自动识别,选择Automatic,T3 Code 会重新检测图标(例如重新读取t3.json的iconPath或约定位置)。
保持默认分支最新:Automatically pull
在Source Control中开启Automatically pull(自动拉取),可以让默认分支(default branch)的 checkout 始终保持与其配置的上游(upstream)一致。该设置同样遵循两级作用域:选中环境时设置的是默认值,选中项目时则成为项目覆盖。
T3 Code 执行自动拉取的前提非常严格,只有在全部满足时才会拉取:
- 可以fast-forward(快进);
- checkout 没有已更改文件(changed files);
- checkout 没有未跟踪文件(untracked files);
- checkout 没有本地提交(local commits)。
同时会跳过以下情况:
- checkout 当前位于其他分支;
- checkout 没有配置 upstream。
如果 checkout 存在本地工作(local work),需要你自己先解决(提交、暂存或清理),自动拉取才能恢复。
该设置在服务端有完整的持久化与启动链路,可以作为验证依据:
- 数据库迁移 045_ProjectionProjectsAutoPull.ts 为项目投影表新增
auto_pull列(INTEGER NOT NULL DEFAULT 0); - 项目投影持久化层 ProjectionProjects.ts 负责读写该字段;
- 服务器启动阶段在
projects.auto-pull阶段调用syncAutoPullProjects同步该设置(serverRuntimeStartup.ts#L830-L886); - 投影快照查询层 ProjectionSnapshotQuery.ts 将
auto_pull列映射为autoPull字段;其相关测试 decider.projectThreadEnvMode.test.ts 验证了autoPull通过事件meta.update传播进读模型并持久化的完整链路。
从上述链路可以看出,自动拉取不是一个前端定时器的装饰性功能,而是从设置写入、投影持久化到服务器启动恢复的端到端能力。
小结:一条配置的完整旅程
把上面各部分串起来,一条“项目级覆盖”设置从写入到生效的旅程是:
- 在设置页通过环境与项目两个面包屑确定作用域(SettingsBreadcrumb.tsx);
- UI 通过
useScopedSettingsMixed判断多环境取值是否一致,不一致则显示Mixed与琥珀色图层图标(ProjectDefaultsSettings.tsx); - 服务器端将设置写入项目投影(
auto_pull、scripts_json等列,见 ProjectionProjects.ts 与迁移脚本); - 服务器重启时在
projects.auto-pull启动阶段恢复设置(serverRuntimeStartup.ts#L830-L886); - 取值时按“内置默认值 → 环境值 → 项目覆盖(含
t3.json偏好)”的链条解析,图层图标展示来源,Reset / Reset all 恢复继承。
理解这套“环境 × 项目”的两轴模型,是高效管理多环境、多仓库工作区配置的前提:既能避免在每台机器上重复手工配置,也能为单个项目精准定制行为而不污染其他项目。
【免费下载链接】t3code项目地址: https://gitcode.com/GitHub_Trending/t3/t3code
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考