cofluxd 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/package.json +1 -1
- package/skills/coflux/SKILL.md +102 -8
package/README.md
CHANGED
|
@@ -43,6 +43,8 @@ cofluxd ports # 端口 + 可直接
|
|
|
43
43
|
|
|
44
44
|
不需要任何凭证:daemon 用调用方 pid 反查进程树确认它属于哪个会话,**coflux 会话之外的进程一律拒绝**,权限也天然限定在该会话所属的工作区内。
|
|
45
45
|
|
|
46
|
+
每个 coflux 开出来的 PTY 会话里还注入了一组 `COFLUX_*` 环境变量(由 supervisor 组装,中心只下发 id):`COFLUX_DEVICE_ID` / `COFLUX_PROJECT_ID`(目录工作区为空串)/ `COFLUX_WORKSPACE_ID` / `COFLUX_TASK_ID` / `COFLUX_SESSION_ID` / `COFLUX_MCP_URL`。agent 读它们就知道自己在哪台设备、哪个项目/工作区/终端,值与中心 MCP `list_*` 返回的 id 完全一致,可直接传给 MCP tools。本地命令与 MCP 的分工:本工作区内的开终端/读/等/输入/播报/叫人/端口用上面的零凭证命令;开子工作区、跨工作区/跨设备读写、或从 coflux 之外接入,用中心的 `coflux` MCP(`claude mcp add --transport http coflux "$COFLUX_MCP_URL"`,一次 OAuth 授权)。supervisor 不走热升级,旧机器要 `cofluxd update && cofluxd restart` 之后会话里才有这些变量;skill 里写了变量为空时的降级分支。
|
|
47
|
+
|
|
46
48
|
配套的 skill 在 `skills/coflux/SKILL.md`(随包分发),装给 Claude Code:
|
|
47
49
|
|
|
48
50
|
```sh
|
package/package.json
CHANGED
package/skills/coflux/SKILL.md
CHANGED
|
@@ -1,17 +1,49 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: coflux
|
|
3
|
-
description: 当你运行在 coflux 终端里时,把长任务、并行工作和求助外化成用户在 coflux web
|
|
3
|
+
description: 当你运行在 coflux 终端里时,把长任务、并行工作和求助外化成用户在 coflux web/手机上看得见、能随时接管的真实终端;读 COFLUX_* 环境变量知道自己在哪台设备/项目/工作区/终端,本工作区内用本地 cofluxd 命令,开子工作区或跨工作区/跨设备操作用中心的 coflux MCP。适用于跑测试/构建/dev server 等耗时命令、需要用户接管或决策、想给用户一个可点开的预览 URL、要在隔离的子工作区并行干活的场景。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# 在 coflux 里工作
|
|
7
7
|
|
|
8
8
|
你可能正跑在 coflux 的一个终端里。coflux 让用户在浏览器和手机上盯着各台机器上的
|
|
9
|
-
agent
|
|
9
|
+
agent 干活,随时接管。这个 skill 让你把自己的工作**变成用户看得见的东西**,并在需要时
|
|
10
|
+
操作账号下的其它工作区和设备。
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
这时忘掉这个 skill,照常用你自己的工具。
|
|
12
|
+
有两条轨道,分工固定:
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
| 轨道 | 凭证 | 能触达的范围 | 用在 |
|
|
15
|
+
|---|---|---|---|
|
|
16
|
+
| 本地命令 `cofluxd terminal/progress/notify/ports` | 零凭证(daemon 按你的进程树认身份) | 只有**你所在的工作区** | 本工作区内开终端、读、等、输入、播报、叫人、拿预览 URL——最省事的路径 |
|
|
17
|
+
| 中心 MCP `coflux`(14 个 tools) | 用户在宿主里做一次 OAuth 授权 | **整个账号**:所有设备、项目、工作区、终端 | 开子工作区(git worktree)、跨工作区/跨设备读写、从 coflux 之外接入 |
|
|
18
|
+
|
|
19
|
+
## 先判断自己在哪
|
|
20
|
+
|
|
21
|
+
先看环境变量:
|
|
22
|
+
|
|
23
|
+
```sh
|
|
24
|
+
env | grep '^COFLUX_'
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
- **`COFLUX_WORKSPACE_ID` 非空** → 你在 coflux 终端里,且 daemon 已是新版。下面的变量就是
|
|
28
|
+
你的坐标,MCP tools 要的 id 直接从这里拿,不用去 `list_*` 里猜:
|
|
29
|
+
|
|
30
|
+
| 变量 | 含义 |
|
|
31
|
+
|---|---|
|
|
32
|
+
| `COFLUX_DEVICE_ID` | 你所在机器的设备 id(`list_devices` 的 id) |
|
|
33
|
+
| `COFLUX_PROJECT_ID` | 所属项目 id;无仓库的目录工作区为空串 |
|
|
34
|
+
| `COFLUX_WORKSPACE_ID` | 所属工作区 id(`list_workspaces` 的 id) |
|
|
35
|
+
| `COFLUX_TASK_ID` | 你这个终端的 id(`list_terminals` / `read_terminal` 用的 terminalId) |
|
|
36
|
+
| `COFLUX_SESSION_ID` | 你这个 PTY 会话 id |
|
|
37
|
+
| `COFLUX_MCP_URL` | 中心 MCP 地址,用户配 MCP 时就用它 |
|
|
38
|
+
|
|
39
|
+
- **变量为空或不存在** → 跑一条 `cofluxd terminal list`:
|
|
40
|
+
- 返回「不在 coflux 终端里」→ 你不在 coflux 里,忘掉这个 skill,照常用你自己的工具
|
|
41
|
+
(除非用户已经在宿主里配了 coflux MCP,那时 MCP tools 照用,只是没有「我在哪」的坐标)。
|
|
42
|
+
- 能列出终端 → 你在 coflux 里,但 daemon 还没升级到注入环境变量的版本:本地命令全部可用,
|
|
43
|
+
只是你不知道自己的 id;要用 MCP 就先 `list_devices` / `list_workspaces` 按路径对一下
|
|
44
|
+
`pwd`,并顺手告诉用户 `cofluxd update && cofluxd restart` 之后就有环境变量了。
|
|
45
|
+
|
|
46
|
+
## 什么时候用本地命令
|
|
15
47
|
|
|
16
48
|
**用 `cofluxd terminal new` 而不是自己后台起进程**——只要这条命令满足任一条:
|
|
17
49
|
|
|
@@ -26,7 +58,7 @@ agent 干活,随时接管。这套命令让你把自己的工作**变成用户
|
|
|
26
58
|
**不要用**在一次性的快命令上(`ls`、`grep`、`git status`、读文件)——你自己的工具更快,
|
|
27
59
|
给用户开一堆一秒就结束的终端只是噪音。
|
|
28
60
|
|
|
29
|
-
##
|
|
61
|
+
## 本地命令
|
|
30
62
|
|
|
31
63
|
### 开终端跑命令
|
|
32
64
|
|
|
@@ -44,6 +76,8 @@ cofluxd terminal new --title "跑单测" --cmd "pnpm -C tests test"
|
|
|
44
76
|
关掉颜色和进度条。极少数程序在非 tty 下行为不同(比如不输出进度、切成 CI 模式),如果你
|
|
45
77
|
依赖那种行为,自己在 Bash 里跑。
|
|
46
78
|
|
|
79
|
+
新开的终端里同样有 `COFLUX_*` 变量(指向它自己的 task/session id,工作区与你相同)。
|
|
80
|
+
|
|
47
81
|
### 看跑到哪了
|
|
48
82
|
|
|
49
83
|
```sh
|
|
@@ -117,12 +151,72 @@ cofluxd ports
|
|
|
117
151
|
列出本工作区所有监听端口和对应的公网预览 URL。起了 dev server 之后用它拿 URL 直接
|
|
118
152
|
告诉用户,他点开就能看,不用自己去翻。
|
|
119
153
|
|
|
154
|
+
## 中心 MCP:跨出本工作区
|
|
155
|
+
|
|
156
|
+
本地命令只看得见你所在的工作区。要做下面这些事,用宿主里名为 `coflux` 的 MCP server:
|
|
157
|
+
|
|
158
|
+
- **开一个隔离的子工作区并行干活**:`create_workspace`(项目 id 用 `$COFLUX_PROJECT_ID`)
|
|
159
|
+
在设备上真的 `git worktree add`,然后 `create_terminal` 在那里跑命令。
|
|
160
|
+
- **看/操作别的工作区、别的设备上的终端**:`list_*` → `read_terminal` / `send_terminal_input`。
|
|
161
|
+
- **不在 coflux 终端里**(比如用户在自己电脑上开的 Claude Code)时接入账号下的一切。
|
|
162
|
+
|
|
163
|
+
### 没配 MCP 时
|
|
164
|
+
|
|
165
|
+
先 `claude mcp list`(Codex:`codex mcp list`)看有没有 `coflux`。没有就告诉用户一行接入,
|
|
166
|
+
地址用 `$COFLUX_MCP_URL`(它就是中心公网地址 + `/mcp`):
|
|
167
|
+
|
|
168
|
+
```sh
|
|
169
|
+
claude mcp add --transport http coflux "$COFLUX_MCP_URL" # Claude Code
|
|
170
|
+
codex mcp add coflux --url "$COFLUX_MCP_URL" # Codex
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
之后宿主会引导用户在浏览器完成一次 OAuth 授权(Claude Code 里是 `/mcp`)。授权是用户的事,
|
|
174
|
+
你只需要把地址和命令给他;没配好之前本工作区内的活照样用本地命令干。
|
|
175
|
+
|
|
176
|
+
### 14 个 tools
|
|
177
|
+
|
|
178
|
+
id 优先从 `COFLUX_*` 环境变量拿;跨出本工作区的 id 用 `list_*` 查。
|
|
179
|
+
|
|
180
|
+
| tool | 用途 |
|
|
181
|
+
|---|---|
|
|
182
|
+
| `list_devices` | 账号下的设备(跑着 daemon 的机器):id、名称、在线、版本 |
|
|
183
|
+
| `list_projects` | 导入的项目(git 仓库):id、所在设备、仓库路径、默认分支 |
|
|
184
|
+
| `list_workspaces` | 工作区(主工作区 = 仓库本身,其余是 worktree;目录工作区 projectId 为 null),可按 projectId 筛 |
|
|
185
|
+
| `list_terminals` | 终端:id、工作区、标题、状态 idle/running/exited、退出码,可按 workspaceId 筛 |
|
|
186
|
+
| `read_terminal` | 读终端纯文本(去 ANSI,默认尾 200 行):source=log 是命令终端的完整日志(退出后仍可读),snapshot 是当前画面,checkpoint 是设备离线时中心的最近快照 |
|
|
187
|
+
| `list_ports` | 终端里检测到的监听端口 + 可直接打开的预览 URL |
|
|
188
|
+
| `create_workspace` | 在项目下新建 git worktree 工作区(可新建分支),设备真在磁盘上建目录 |
|
|
189
|
+
| `rename_workspace` | 改工作区名(纯展示) |
|
|
190
|
+
| `remove_workspace` | 删 worktree 工作区:先关其下所有终端再 `git worktree remove --force`(未提交改动会丢);主工作区不可删 |
|
|
191
|
+
| `create_terminal` | 在某工作区开真实终端跑一条命令(用户可接管、侧栏可见),跑完带退出码;输出落日志供 `read_terminal` |
|
|
192
|
+
| `send_terminal_input` | 往运行中的终端写文本(默认追加回车) |
|
|
193
|
+
| `wait_terminal` | 有界等待终端退出并拿退出码(默认 30 秒、上限 50 秒) |
|
|
194
|
+
| `stop_terminal` | 结束终端会话(等价 web 上的停止) |
|
|
195
|
+
| `remove_terminal` | 删终端记录;运行中的必须先 `stop_terminal` |
|
|
196
|
+
|
|
197
|
+
### 用 MCP 的三条纪律
|
|
198
|
+
|
|
199
|
+
1. **人类优先**:`send_terminal_input` 在用户正在接管那个终端时会被拒,错误里写明
|
|
200
|
+
「用户正在接管」——把交互留给用户,不要重试;要沟通用本工作区的 `cofluxd notify`。
|
|
201
|
+
`send` 之前先 `read_terminal` 看清它在等什么;回执超时先 `read` 再决定要不要重发。
|
|
202
|
+
2. **有界等待**:`wait_terminal` 最多等 50 秒,到期返回 `timedOut=true` 不是错误——需要更久
|
|
203
|
+
就再调一次,**别自己写轮询循环去 `read_terminal`**。`create_workspace` / `create_terminal`
|
|
204
|
+
最多等 30 秒启动回执,到期返回「已提交」并附 id,稍后用 `list_*` 查。
|
|
205
|
+
3. **「需要升级」就停**:写 tools 在目标设备的 daemon 太旧时立即返回「该设备的 daemon 需要
|
|
206
|
+
升级」——这是能力门禁,不是暂时故障。转告用户在那台机器上 `cofluxd update && cofluxd restart`,
|
|
207
|
+
别重试也别换 tool 绕。
|
|
208
|
+
|
|
209
|
+
本地命令的纪律(先 read 再 send、被拒即停、`progress` 与 `notify` 分界、用 `wait` 别轮询)
|
|
210
|
+
在 MCP 里同样成立。
|
|
211
|
+
|
|
120
212
|
## 边界
|
|
121
213
|
|
|
122
214
|
- 你能开、读、等、输入,但**输入是人类优先的受限写权**:用户正在接管的终端你写不进去
|
|
123
215
|
(会被明确拒绝),用户随时接管也会把你顶掉。别和人抢终端。
|
|
124
|
-
-
|
|
216
|
+
- 本地命令只看得见**你自己所在的工作区**;别的工作区和别的机器要经 MCP,且限于同一账号。
|
|
125
217
|
- 一个工作区同时活着的终端有上限(默认 8,含用户自己开的)。撞上限先 `list` 看看,
|
|
126
218
|
多半是有跑完没收的;真是用户占满了,就 `notify` 告诉他,别硬试。
|
|
127
|
-
-
|
|
219
|
+
- 这些命令与 tools 都要 daemon 连着中心才能用——毕竟「让用户看见」就是它们的全部意义。
|
|
128
220
|
连不上时会明确报错,不会默默降级。
|
|
221
|
+
- `COFLUX_*` 变量只在 coflux 开出来的 PTY 里有;你自己 `export` 或改它们没有任何效果,
|
|
222
|
+
中心只认它自己下发的 id。
|