collaborator-ai/collab-public
GitHub: collaborator-ai/collab-public
一款基于无限画布的 Agentic 开发环境,支持在统一界面中与 AI Agent 协同工作。
Stars: 216 | Forks: 14
# 协作者
Collaborator 是一个用于与 Agent 协同构建的环境。

Collaborator 是一个端到端的 Agentic 开发环境。终端、上下文文件和正在运行的代码——全部排列在一个无限画布上,集于一处。无需切换上下文,无需寻找标签页。只有你的 Agent 和你的工作,并排呈现。
该应用目前处于早期阶段,正在积极开发中。目前仅支持 macOS。
## 安装
**[下载最新版本](https://github.com/collaborator-ai/collab-public/releases/latest)** (macOS, Apple Silicon)
或者通过命令行安装:
```
curl -fsSL https://raw.githubusercontent.com/collaborator-ai/collab-public/main/install.sh | bash
```
## 技术栈
Collaborator 是一个原生桌面应用,构建于:
- **Electron 40** — 具有多 webview 架构的桌面外壳
- **React 19** — UI 框架
- **Tailwind CSS 4** — 样式
- **electron-vite** — 支持热重载的构建工具
- **xterm.js** — 终端模拟,由 tmux 会话支持以实现持久化
- **Monaco Editor** — 带语法高亮的代码编辑器
- **BlockNote / TipTap** — 富文本 Markdown 编辑
- **D3** — 力导向图可视化
- **sharp** — 图像处理
- **KaTeX** — Markdown 中的数学公式渲染
所有数据均存储在本地磁盘。
## 快速开始
1. 打开 Collaborator
2. 添加一个 workspace — 点击导航栏中的 workspace 下拉菜单并选择 "Add workspace",或按 Cmd+Shift+O,然后选择一个本地文件夹
3. 双击画布创建一个终端,并启动一个 Agent
4. 从导航栏拖拽文件到画布上,将其作为 Tile 与你正在运行的 Agent 并排打开
## 规格说明
### 应用概述
Collaborator 是一个单窗口 macOS (arm64) 应用程序。它主要操作本地文件,无需账户。通过 PostHog 收集匿名的、非识别性的使用情况分析数据。
窗口分为两个区域:
* **Navigator(导航栏)** — 左侧可调整大小的侧边栏,包含文件树和 workspace 切换器
* **Main area(主区域)** — 画布,一个无限平移和缩放的表面,用于排列 Tile;同时也包含 viewer(查看器),用于显示在 Navigator 中选中的文件内容
所有应用状态均以 JSON 文件形式存储在 `~/.collaborator/` 中。
### 多 Workspace 导航
Navigator 侧边栏显示以当前活跃的 workspace 文件夹为根的文件树。用户可以维护多个 Workspace 并在它们之间切换。
#### Workspace 管理
Navigator 顶部的下拉菜单显示当前活跃的 workspace 名称。它提供:
* 所有 Workspace 的列表,用于快速切换
* "Add workspace" 用于打开一个新的本地文件夹(也可通过 Cmd+Shift+O 使用)
* "Remove workspace" 用于从列表中移除一个 workspace(不会删除文件)
每个 Workspace 都有自己独立的文件树。画布和 viewer 在各个 Workspace 间共享。
#### 文件树
文件树显示当前活跃 workspace 中的所有文件和文件夹。它支持:
* 点击**展开/折叠**文件夹
* **两种视图模式**:分层树状视图,以及按日期排序的按时间顺序的 Feed 视图
* **排序**:在创建时间(最新/最旧)、修改时间(最新/最旧)和名称(A-Z/Z-A)之间循环切换
* **文件操作**:创建新笔记(生成 `Untitled.md`)、创建新文件夹、重命名 (F2)、删除(移至废纸篓)
* 通过在文件夹之间拖拽来**移动文件**
* 使用 Shift+点击和 Cmd+点击进行**多选**
* 通过 Cmd+K 进行**搜索**
在文件树中选择一个文件会在 viewer 中打开它。将文件从文件树拖到画布上会创建一个 Tile。
### 画布 (Canvas)
画布是一个填充主区域的无限平移和缩放表面。它使用点阵网格背景进行空间定位。
#### 视口控制
| 操作 | 输入方式 |
| -------- | ------------------------------------------------ |
| 平移 | 滚轮,或 Space+拖拽,或 中键点击+拖拽 |
| 放大 | Cmd+= 或 Ctrl+向上滚动 |
| 缩小 | Cmd+- 或 Ctrl+向下滚动 |
| 重置缩放 | Cmd+0 |
* **缩放范围**:33% 到 100%,超出限制时具有橡皮筋回弹效果
* **缩放指示器**:缩放变化后短暂出现在右下角,显示当前百分比
#### 网格
* 规则间隔的次级网格点
* 每 4 个间隔出现一个主级网格点
* 所有 Tile 的位置和大小都对齐到网格
#### 数据模型
Tile 是实时视图,而非独立的容器。
* **文件 Tile**(笔记、代码、图像)通过绝对路径绑定到磁盘上的文件。如果文件被重命名,Tile 会更新以跟踪新路径。如果文件被删除,Tile 会被关闭。如果文件内容在磁盘上发生更改,Tile 会重新加载。
* **终端 Tile** 绑定到一个 tmux 会话。每个终端 Tile 创建并管理自己的会话,该会话独立于 Tile 在画布上的生命周期而持久存在。
#### Tile 管理
Tile 是画布上的内容单元。每个 Tile 具有:
* 一个用于拖动的**标题栏**
* **八个调整大小的控制柄**(四个边缘,四个角)
* 一个用于分层的 **z-index** — 点击一个 Tile 会将其置于顶层
Tile 通过以下方式创建:
* **双击**空白画布区域 — 在该位置创建一个终端 Tile
* 将文件从 Navigator **拖到**画布上 — 根据文件类型创建笔记、代码或图像 Tile
Tile 可以通过其标题栏关闭。按住 Shift 键滚动可将滚动事件穿透 Tile 传递给画布。
### Tile 类型
#### 终端 (Terminal)
一个交互式终端会话。通过双击空白画布区域创建。终端的工作目录设置为当前活跃的 workspace 路径。
终端是运行 AI Agent 的主要接口。每个终端 Tile 管理自己独立的会话。
#### 笔记 (Note)
一个富文本 Markdown 编辑器。通过从 Navigator 拖拽 `.md` 文件到画布创建。支持带实时渲染的行内编辑。
#### 代码 (Code)
一个语法高亮的代码编辑器。通过从 Navigator 拖拽任何非 Markdown、非图像文件到画布创建。支持带语言检测的行内编辑。
#### 图像 (Image)
一个只读图像显示组件。通过从 Navigator 拖拽图像文件(`.png`、`.jpg`、`.jpeg`、`.gif`、`.svg`、`.webp`)到画布创建。
### 查看器 (Viewer)
Viewer 显示 Navigator 中当前选中文件的内容。它与画布一起占据主区域。
| 文件类型 | 显示内容 |
| -------------------------------------------------------- | ----------------------------------------------------------------------------- |
| Markdown (`.md`, `.mdx`, `.markdown`, `.txt`) | 支持 frontmatter、封面图像和 wiki 风格链接的富文本编辑器 |
| 代码(所有其他文本文件) | 带行号的语法高亮编辑器 |
| 图像 (`.png`, `.jpg`, `.jpeg`, `.gif`, `.svg`, `.webp`) | 带元数据的图像显示 |
Markdown 和代码文件支持在 Viewer 中进行行内编辑。Viewer 会监视磁盘上的外部文件更改并自动重新加载。
按下 Escape 键关闭 Viewer(当未处于主动编辑状态时)。
### 持久化
所有状态均本地存储在 `~/.collaborator/` 中。
#### 画布状态 (`canvas-state.json`)
```
{
"version": 1,
"tiles": [
{
"id": "tile--",
"type": "term | note | code | image",
"x": 0,
"y": 0,
"width": 440,
"height": 540,
"filePath": "/absolute/path/to/file",
"zIndex": 1
}
],
"viewport": {
"panX": 0,
"panY": 0,
"zoom": 1.0
}
}
```
画布状态在每次更改后 500ms 保存(防抖处理),并在创建或关闭 Tile 时立即保存。
#### 应用配置 (`config.json`)
```
{
"workspaces": ["/path/to/workspace1", "/path/to/workspace2"],
"active_workspace": 0,
"window_state": {
"x": 0,
"y": 0,
"width": 1440,
"height": 900,
"isMaximized": false
},
"ui": {}
}
```
⠀
标签:D3.js, Electron, electron-vite, IDE, Markdown编辑, Monaco Editor, Mutation, React, Syscalls, Tailwind CSS, tmux, xterm.js, 上下文管理, 人工智能, 人机协作, 代码编辑器, 可视化, 开发环境, 无限画布, 智能体开发, 本地优先, 桌面应用, 生产力工具, 用户模式Hook绕过, 终端模拟