pi-claude-supervisor 0.6.0 → 0.7.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/CHANGELOG.md +40 -0
- package/README.cn.md +342 -148
- package/README.md +394 -241
- package/docs/architecture.md +196 -12
- package/docs/testing.md +5 -4
- package/package.json +1 -1
- package/src/acceptance.ts +7 -1
- package/src/config.ts +110 -0
- package/src/cwd-lease.ts +166 -37
- package/src/decision-session-store.ts +43 -2
- package/src/decision-worker.ts +284 -18
- package/src/events.ts +125 -5
- package/src/hooks/install.ts +187 -0
- package/src/hooks/relay.ts +191 -0
- package/src/hooks/server.ts +260 -0
- package/src/hooks/settings.ts +44 -0
- package/src/hooks/types.ts +83 -0
- package/src/index.ts +267 -26
- package/src/json-extract.ts +49 -0
- package/src/notifications.ts +61 -10
- package/src/pi-model.ts +44 -0
- package/src/policy.ts +394 -21
- package/src/redaction.ts +1 -1
- package/src/reviewer.ts +86 -56
- package/src/supervisor.ts +774 -82
- package/src/types.ts +55 -3
- package/src/verifier.ts +49 -16
- package/src/worker/environment.ts +41 -2
- package/src/worker/process-adapter.ts +32 -7
- package/src/worker/runtime.ts +51 -0
- package/src/worker/tmux-adapter.ts +573 -28
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,46 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented here.
|
|
4
4
|
|
|
5
|
+
## [0.7.0](https://github.com/btnalit/pi-claude-supervisor/compare/v0.6.0...v0.7.0) (2026-09-17)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* **config:** add Worker/Decision model and safety-limit knobs ([a12710a](https://github.com/btnalit/pi-claude-supervisor/commit/a12710a0579a03f8a836c56e85ea1a707f88621e))
|
|
11
|
+
* **decision:** compact Decision Worker prompts, proactive compaction, and model/usage wiring ([a423515](https://github.com/btnalit/pi-claude-supervisor/commit/a423515d7b345edb9b265795c07ff11e0a869d19))
|
|
12
|
+
* declare hook relay and interactive tmux contracts ([2a7db8d](https://github.com/btnalit/pi-claude-supervisor/commit/2a7db8d46ab8ee975f49a9808a37a92b7e0778a7))
|
|
13
|
+
* declare token-accounting and permission-authority contracts ([73e77d9](https://github.com/btnalit/pi-claude-supervisor/commit/73e77d97157091452fdb953712790e4746727665))
|
|
14
|
+
* **hooks:** Claude Code hook relay and Supervisor hook server ([92877f6](https://github.com/btnalit/pi-claude-supervisor/commit/92877f6b20ccaa825609ceb7fb33af7bd8997c28))
|
|
15
|
+
* **index:** install the Claude Code hook relay automatically in interactive tmux mode ([a0f3923](https://github.com/btnalit/pi-claude-supervisor/commit/a0f39233c52335791f0f0dbc5d306c54996a9006))
|
|
16
|
+
* **index:** wire token controls, cost status and docs ([bf4c341](https://github.com/btnalit/pi-claude-supervisor/commit/bf4c3411f3af3e72e003f5743ce29f2367204084))
|
|
17
|
+
* let adapter preflight see the interactive flag ([7c93346](https://github.com/btnalit/pi-claude-supervisor/commit/7c93346196b3ee6aff35fa72d27c23125ee3a3e7))
|
|
18
|
+
* permission phase and defer contracts for interactive sessions ([399683c](https://github.com/btnalit/pi-claude-supervisor/commit/399683cecdb6132c5544b0a20801b0014e261390))
|
|
19
|
+
* **supervisor:** anchor automatic tasks to the baseline commit, not the branch ([7b75593](https://github.com/btnalit/pi-claude-supervisor/commit/7b75593792d124cff2a1acb3dcc7b2b88ff54587))
|
|
20
|
+
* **supervisor:** route routine permissions through policy, account for Worker/Pi cost ([342b2c2](https://github.com/btnalit/pi-claude-supervisor/commit/342b2c2c0b94d26b9357ba436ee44d813ed07ee4))
|
|
21
|
+
* **tmux:** hook-driven interactive Claude sessions ([e942911](https://github.com/btnalit/pi-claude-supervisor/commit/e9429112945090462307120958cf6b91bc37fb6c))
|
|
22
|
+
* wire hook-driven interactive tmux supervision ([29eb6fe](https://github.com/btnalit/pi-claude-supervisor/commit/29eb6fedd9f69a19bdab11243e59320b36fd7d50))
|
|
23
|
+
* WorkerStatus.detached contract for kept-open sessions ([a970d89](https://github.com/btnalit/pi-claude-supervisor/commit/a970d897b9a7446c085f158d014292710d4ec95c))
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
### Bug Fixes
|
|
27
|
+
|
|
28
|
+
* close post-review gaps in noop handling, redaction, reviewer abort and log rotation ([fb856d6](https://github.com/btnalit/pi-claude-supervisor/commit/fb856d6feed03183c1575f59f36f90380d1efe31))
|
|
29
|
+
* **cwd-lease:** quarantine unreadable leases and remove nested cgroups ([d45da59](https://github.com/btnalit/pi-claude-supervisor/commit/d45da59349832a66fdea1d59287e4f3b628ebd99))
|
|
30
|
+
* **decision:** surface Decision Worker and Reviewer API/abort failures ([5e1a9ea](https://github.com/btnalit/pi-claude-supervisor/commit/5e1a9ea2a88b5dfdc27d921780c74c6381b2f3e9))
|
|
31
|
+
* **events:** make EventLog.append O(1) in log size and add rotation ([960ab8e](https://github.com/btnalit/pi-claude-supervisor/commit/960ab8edb08c17140477ba226c341ce8934f819d))
|
|
32
|
+
* hand a kept-open interactive session back to the operator cleanly ([eaff8f3](https://github.com/btnalit/pi-claude-supervisor/commit/eaff8f30340599bb5d617fb997634d888a780440))
|
|
33
|
+
* harden the routine-permission classifier and cost accounting after review ([81d8f7d](https://github.com/btnalit/pi-claude-supervisor/commit/81d8f7db5d623a49291ef87a9e956bd3acd0cf41))
|
|
34
|
+
* **hooks:** keep the hook socket under the unix sun_path limit ([00a2ffd](https://github.com/btnalit/pi-claude-supervisor/commit/00a2ffdec7d59af135e3b54a53f5cfc4aa003b24))
|
|
35
|
+
* **index:** wire review timeout and event-log rotation; align docs ([f2b81d4](https://github.com/btnalit/pi-claude-supervisor/commit/f2b81d43e26806161988e9836b5665e34c28e201))
|
|
36
|
+
* **policy:** clarify deny reasons, narrow redaction, retry webhooks, raise evidence limits ([f9fcc0c](https://github.com/btnalit/pi-claude-supervisor/commit/f9fcc0c1acf6baf93de3c60ed6983f82a0b52a71))
|
|
37
|
+
* **supervisor:** close lifecycle-event and shutdown safety gaps ([47b9a10](https://github.com/btnalit/pi-claude-supervisor/commit/47b9a10e04e228781720da1809135f3818834890))
|
|
38
|
+
* **supervisor:** drive watchdog verification, tighten commit/evidence gates, replay deferred decisions ([b193441](https://github.com/btnalit/pi-claude-supervisor/commit/b1934415528231860a1f9e69db973896dcdde611))
|
|
39
|
+
* **tmux:** distinct prompt-phase request ids, pid-anchored hook binding, precise relay matching ([d4f6bc7](https://github.com/btnalit/pi-claude-supervisor/commit/d4f6bc7dac2359db1915217512b3c1f1eb8897ee))
|
|
40
|
+
* **tmux:** errored and idle turns, questions during takeover, quieter takeover notices ([d133f70](https://github.com/btnalit/pi-claude-supervisor/commit/d133f705c03601ee8df4c27bb47c1669b4f1e3ee))
|
|
41
|
+
* **tmux:** recover launcher-wrapped interactive sessions and preflight interactive args ([d986253](https://github.com/btnalit/pi-claude-supervisor/commit/d986253467b56c51bfb310c51f0cefe64eacbae5))
|
|
42
|
+
* **tmux:** type the task into an idle adopted interactive session ([acc8160](https://github.com/btnalit/pi-claude-supervisor/commit/acc8160ade5053f2affb719b782ddb119dfd510b))
|
|
43
|
+
* **worker:** repair dead process-group detection and tmux guardian readiness ([ea7645e](https://github.com/btnalit/pi-claude-supervisor/commit/ea7645ef388066b626c7d06e996e8e765da45d4e))
|
|
44
|
+
|
|
5
45
|
## [0.6.0](https://github.com/btnalit/pi-claude-supervisor/compare/v0.5.5...v0.6.0) (2026-09-16)
|
|
6
46
|
|
|
7
47
|
|
package/README.cn.md
CHANGED
|
@@ -4,189 +4,383 @@
|
|
|
4
4
|
[](https://www.npmjs.com/package/pi-claude-supervisor)
|
|
5
5
|
[](LICENSE)
|
|
6
6
|
|
|
7
|
-
[English](README.md)
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
|
|
32
|
-
-
|
|
33
|
-
|
|
34
|
-
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
需要 Pi 0.85+ 和 Node.js 22.19+:
|
|
7
|
+
[English](README.md) · 简体中文
|
|
8
|
+
|
|
9
|
+
## 这是什么
|
|
10
|
+
|
|
11
|
+
pi-claude-supervisor 是一个标准的 [Pi](https://pi.dev) agent 扩展包,用于监督
|
|
12
|
+
Claude Code 完成无人值守的本地开发。Pi 负责任务的生命周期、状态机、策略决策、
|
|
13
|
+
验收检查和独立 Review;Claude Code 是负责实际编辑的 Worker。这个扩展只需要一次
|
|
14
|
+
`pi install`:Pi 会自行发现并加载它,没有单独的构建步骤或二进制文件,在 Pi 内部
|
|
15
|
+
除了环境变量之外也没有任何需要配置的地方。
|
|
16
|
+
|
|
17
|
+
有一条 Worker 永远不能越过的硬边界,无论它自己的权限设置如何:它不能 push 到
|
|
18
|
+
远程仓库、合并进 `main` 或 integration 分支、创建 pull request,也不能执行任何
|
|
19
|
+
远程 CLI 变更;`.git` 元数据写入和对受保护分支的破坏性改写一律拒绝。除此之外的
|
|
20
|
+
一切——编辑、测试、shell 命令、本地提交——都按你配置的策略执行。扩展本身在运行时
|
|
21
|
+
从不执行 merge、deploy、release 或 publish。
|
|
22
|
+
|
|
23
|
+
任务启动后,这个循环是这样运作的:
|
|
24
|
+
|
|
25
|
+
- Worker 执行一轮;一轮结束时(`turn_completed`),Pi 的 Decision Worker——一个
|
|
26
|
+
持久化、只有只读工具的 Pi session——会选择继续、重定向、回答问题、验收、停止
|
|
27
|
+
或挂起任务。
|
|
28
|
+
- `verify` 运行验收检查(默认是 `git diff --check`,或者来自 `--spec` 文件的检查)。
|
|
29
|
+
- 一个独立的 Reviewer——全新的只读 Pi session——返回通过、需要修改或需要人工介入。
|
|
30
|
+
- 需要修改时会给 Worker 发送一轮有限的修复(最多 `maxRepairRounds` 轮);通过后
|
|
31
|
+
产出一个 `completed` 候选。
|
|
32
|
+
- 无法解决的工作会被挂起为 `blocked`(不可发布的候选,而不是崩溃);崩溃和超时
|
|
33
|
+
则变为 `failed`。
|
|
34
|
+
- 每个终态都会发出候选通知,既在 Pi UI 中显示,也可以选择发到 webhook(企业微信
|
|
35
|
+
或通用 JSON 格式,失败会重试)。
|
|
36
|
+
|
|
37
|
+
## 快速开始
|
|
38
|
+
|
|
39
|
+
需要 Pi 0.85+、Node.js 22.19+、Claude Code 2.1.270+(交互式 hooks 已在 2.1.273
|
|
40
|
+
上验证),cgroup 和 tmux 相关功能需要 Linux。
|
|
41
|
+
|
|
42
|
+
像安装任何其他 Pi 扩展一样安装它:
|
|
44
43
|
|
|
45
44
|
```text
|
|
46
45
|
pi install npm:pi-claude-supervisor
|
|
47
46
|
```
|
|
48
47
|
|
|
49
|
-
|
|
48
|
+
这就是全部安装步骤——Pi 会直接加载包中的 `./src/index.ts` 扩展并注册
|
|
49
|
+
`/supervise` 命令。配置只通过环境变量完成,在启动 Pi 之前设置(或写入
|
|
50
|
+
`~/.config/pi-claude-supervisor/env`):
|
|
50
51
|
|
|
51
52
|
```bash
|
|
52
53
|
export PI_CLAUDE_SUPERVISOR_MODE=auto
|
|
53
|
-
export
|
|
54
|
-
#
|
|
54
|
+
export PI_CLAUDE_SUPERVISOR_TRANSPORT=tmux
|
|
55
|
+
# 可选:候选/失败通知
|
|
55
56
|
export PI_CLAUDE_SUPERVISOR_HUMAN_WEBHOOK_URL='https://example.invalid/webhook'
|
|
56
57
|
export PI_CLAUDE_SUPERVISOR_HUMAN_WEBHOOK_FORMAT=generic
|
|
57
|
-
# export PI_CLAUDE_SUPERVISOR_HUMAN_WEBHOOK_SECRET='shared-secret'
|
|
58
58
|
```
|
|
59
59
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
60
|
+
然后在任意 Pi session 中:
|
|
61
|
+
|
|
62
|
+
```text
|
|
63
|
+
/supervise start implement the requested change
|
|
64
|
+
/supervise adopt-tmux my-tmux-session implement the requested change
|
|
65
|
+
```
|
|
64
66
|
|
|
65
|
-
|
|
67
|
+
用 `/supervise status <task-id>` 或 `/supervise sessions` 观察任务;对于 tmux
|
|
68
|
+
transport,可以直接用两者打印出的 `tmux -S <socket> attach -t <session>` 命令
|
|
69
|
+
attach。`/supervise stop <task-id>` 会关闭任务;在交互式 tmux transport 下,
|
|
70
|
+
完成的任务默认会保持会话开启(见下文)。
|
|
71
|
+
|
|
72
|
+
## 模式与 transport
|
|
73
|
+
|
|
74
|
+
`PI_CLAUDE_SUPERVISOR_MODE=auto`(或 `PI_CLAUDE_SUPERVISOR_AUTOMATION=1`)启用
|
|
75
|
+
自动监督——也就是上面的 Decision Worker/Reviewer 循环。不设置时,`/supervise`
|
|
76
|
+
仍然暴露所有命令,但 Worker 运行时没有这个循环。
|
|
77
|
+
|
|
78
|
+
| Transport | `TRANSPORT` | `TMUX_MODE` | Worker 以什么形式运行 | 适用场景 |
|
|
79
|
+
| --- | --- | --- | --- | --- |
|
|
80
|
+
| 交互式 tmux | `tmux` | `interactive`(默认) | 在 tmux pane 中运行真实、未经修改的 Claude Code TUI,由 Claude Code hooks 驱动 | 想要观察或偶尔亲自输入 Claude 正在使用的那个会话 |
|
|
81
|
+
| Headless JSONL | `jsonl`(自动模式下默认) | – | `claude -p --input-format stream-json`,没有终端界面 | 每一个与权限相关的命令都必须对 Supervisor 可见 |
|
|
82
|
+
| tmux bridge | `tmux` | `bridge` | Claude 的 stream-json 协议,渲染进 tmux pane | 需要一个可见的 pane,但使用较早的结构化(非 hook)transport |
|
|
83
|
+
| 手动(process-pipe) | `process-pipe`(`MODE` 未设置时默认) | – | Worker 的 stdin/stdout 作为纯文本 | 只暴露命令,不启用自动监督 |
|
|
84
|
+
|
|
85
|
+
## 交互式 tmux 模式(hooks)
|
|
86
|
+
|
|
87
|
+
`PI_CLAUDE_SUPERVISOR_TRANSPORT=tmux` 默认在 tmux pane 中运行真实、未经修改的
|
|
88
|
+
Claude Code TUI——就是你自己运行 `claude` 时看到的那个界面——而不是下文描述的
|
|
89
|
+
结构化 stream-json bridge。你可以随时 attach 到打印出的 `attach=...` 命令上观察,
|
|
90
|
+
或者亲自输入;Pi 通过 Claude Code 自身的 hooks 上报事件,而不是抓取屏幕文字。
|
|
91
|
+
|
|
92
|
+
当扩展以交互模式(默认 `TMUX_MODE`)加载
|
|
93
|
+
`PI_CLAUDE_SUPERVISOR_TRANSPORT=tmux` 时,会自动把它用到的八个 Claude Code hook
|
|
94
|
+
事件的小型 relay 命令安装进 `~/.claude/settings.json`(或
|
|
95
|
+
`$CLAUDE_CONFIG_DIR/settings.json`)——这个安装是幂等的,并且只会在 Pi UI 中
|
|
96
|
+
提示一次。设置 `PI_CLAUDE_SUPERVISOR_AUTO_INSTALL_HOOKS=0` 可以关闭自动安装;
|
|
97
|
+
`/supervise uninstall-hooks` 会移除这一条目,`/supervise install-hooks` 仍然
|
|
98
|
+
可以用来手动安装。在没有 Supervisor 监听的 Claude session 中,relay 本身只是
|
|
99
|
+
一个耗时约 1 毫秒的空操作。owned 的 `/supervise start` 完全不依赖这个机制——
|
|
100
|
+
它会传入自己的 `--settings` 文件——但 `/supervise adopt-tmux` 运行在你自己的
|
|
101
|
+
Claude Code 配置中,需要那里已经装好 relay。
|
|
66
102
|
|
|
67
103
|
```text
|
|
68
|
-
/supervise
|
|
69
|
-
/supervise
|
|
70
|
-
/supervise start --spec ./task.json
|
|
71
|
-
/supervise poll
|
|
72
|
-
/supervise sessions
|
|
73
|
-
/supervise recover [--takeover] <task-id>
|
|
74
|
-
/supervise stop human requested stop
|
|
75
|
-
/supervise verify
|
|
76
|
-
/supervise approve <task-id> allow|deny [request-id]
|
|
77
|
-
/supervise takeover <task-id>
|
|
78
|
-
/supervise resume-auto <task-id>
|
|
104
|
+
/supervise start <task>
|
|
105
|
+
/supervise adopt-tmux <tmux-session> <task>
|
|
79
106
|
```
|
|
80
107
|
|
|
81
|
-
|
|
108
|
+
Pi 会在 Claude 结束一轮对话时(`Stop`;轮中 API/模型失败会以 `StopFailure` 到达
|
|
109
|
+
并按"出错的一轮"交给 Decision Worker 重试;提示符空闲一分钟且没有结束信号时作为
|
|
110
|
+
兜底把这一轮收尾)、Claude 即将向你展示真实权限提示时(仅此时——其余每一次普通
|
|
111
|
+
工具调用都交给你自己的 Claude Code 权限模式处理)、Claude 询问 `AskUserQuestion`
|
|
112
|
+
时(Decision Worker 会选择一个答案,Claude 以普通文本形式继续,与 headless 模式
|
|
113
|
+
中完全一致),以及 session 退出时介入。在展示提示之前的 `PreToolUse` 否决点只会
|
|
114
|
+
拒绝已知的直接远程 push/merge/PR 或其他破坏性/受保护分支操作(或转发一个
|
|
115
|
+
`AskUserQuestion`);它从不干预普通的编辑、读取或本地命令——那些请求会直接进入
|
|
116
|
+
你自己的权限模式,Pi 完全不做决策。
|
|
117
|
+
|
|
118
|
+
**这对安全边界意味着什么。** 交互式模式有意跳过 headless 模式那条"拒绝设置中
|
|
119
|
+
预授权 `Bash` 或 `auto`/`bypassPermissions` 模式"的检查:你自己的 Claude 配置
|
|
120
|
+
决定 Claude 无需询问就能做什么,和你亲自运行 Claude 时完全一样。凡是你的设置
|
|
121
|
+
已经放行的操作都不会到达 Decision Worker;它只在 Claude 本来要问*你*的地方做
|
|
122
|
+
判断。硬边界(远程 push/merge/PR、远端 CLI 变更、`.git` 写入、受保护分支的
|
|
123
|
+
破坏性改写)由 `PreToolUse` 强制执行,与权限模式无关——已在 Claude Code 2.1.273
|
|
124
|
+
的 `auto` 模式下实测——这也是该模式在你自己的设置之外唯一的保证。需要让每个
|
|
125
|
+
`Bash` 调用都经过 Supervisor 时,请使用 headless(`bridge`)模式。
|
|
126
|
+
|
|
127
|
+
**接管空闲会话。** `adopt-tmux` 只在 Claude 空闲停在提示符时才把任务敲进去;
|
|
128
|
+
接管时正在跑的一轮会保留其当前工作,等它下一次 `Stop` 再判断。
|
|
129
|
+
|
|
130
|
+
**人机协同。** 如果你在已 attach 的 session 中输入内容,自动化会暂停
|
|
131
|
+
(`human_takeover`,以警告形式呈现),直到你执行 `/supervise resume-auto
|
|
132
|
+
<task-id>`;你接管期间完成的那一轮会在此时重放给 Decision Worker,因此不会
|
|
133
|
+
丢失已经完成的工作。
|
|
134
|
+
|
|
135
|
+
**完成后把会话交还给你。** 与其他 transport 不同,任务完成后默认只是让 Pi 与
|
|
136
|
+
该会话断开,而不是关闭它,方便你在同一窗口中继续工作或查看 Claude 做了什么;
|
|
137
|
+
`/supervise stop <task-id>` 可以显式关闭它,被阻塞或失败的候选仍会像以往一样
|
|
138
|
+
停止 Worker。设置 `PI_CLAUDE_SUPERVISOR_CLOSE_WORKER_ON_COMPLETION=1` 可恢复
|
|
139
|
+
旧的"完成即关闭"行为。这次交还是干净的,而不只是断开连接:在报告候选就绪之前,
|
|
140
|
+
Pi 会把每个进程从自己的私有 cgroup 移到其父进程(而不是杀掉它们)并停止 guardian
|
|
141
|
+
进程,tmux server 和 pane 会保持原样——会话能在 Pi 重启后继续存在,不会留下任何
|
|
142
|
+
未完成的清理。之后它就是一个普通的、没有 Supervisor 附着的 tmux session;
|
|
143
|
+
`tmux -S <socket> attach -t <session>` 可以直接连上去,`/supervise adopt-tmux`
|
|
144
|
+
也可以像对待其他外部创建的 session 一样重新接管它。
|
|
145
|
+
|
|
146
|
+
**成本核算的限制。** TUI 的 `Stop` hook 没有 `total_cost_usd` 或 token `usage`
|
|
147
|
+
(这些字段只出现在 Claude 自己的 `result` stream-json 记录中,而 TUI 不会产生
|
|
148
|
+
这种记录),因此交互模式下的成本统计只计算轮次,不计算费用;`--max-budget-usd`
|
|
149
|
+
同样不可用(Claude Code 只在 `-p` 模式下强制执行它),也不会传给交互式启动。
|
|
150
|
+
如果设置了 `autonomy.maxWorkerCostUsd`,请预期它在交互模式下不起作用;需要
|
|
151
|
+
硬性成本上限时请使用 bridge/jsonl 模式。
|
|
152
|
+
|
|
153
|
+
**信任对话框。** Claude Code 第一次在某个目录中运行时,会先弹出它自己的
|
|
154
|
+
一次性"是否信任该文件夹"对话框,然后 hook 才会开始生效。由 `/supervise start`
|
|
155
|
+
启动的会话,启动器会自动接受它——且仅当 pane 所在目录就是任务目录时;被接管的
|
|
156
|
+
会话是你自己启动的,你早已回答过。
|
|
157
|
+
|
|
158
|
+
## Headless 模式(JSONL)
|
|
159
|
+
|
|
160
|
+
`PI_CLAUDE_SUPERVISOR_TRANSPORT=jsonl` 以 `claude -p --input-format
|
|
161
|
+
stream-json` 的方式运行 Claude,完全没有终端界面;一旦设置
|
|
162
|
+
`PI_CLAUDE_SUPERVISOR_MODE=auto`,它就是默认 transport。Claude 发出的每一个
|
|
163
|
+
权限请求都由 Supervisor 回答——拒绝列表、任务目录内的常规编辑、以及只读/本地
|
|
164
|
+
开发类 shell 命令由策略直接回答,其余都交给 Decision Worker。`worker_usage`
|
|
165
|
+
事件携带来自 Claude 自身 `result` 记录的完整 token 和费用信息,因此
|
|
166
|
+
`--max-budget-usd` 以及下文的 token/费用统计都能按预期工作。当任何操作都不能
|
|
167
|
+
在 Supervisor 看不到的情况下运行,或者你不需要 attach 时,使用这个 transport。
|
|
168
|
+
|
|
169
|
+
## 安全边界
|
|
170
|
+
|
|
171
|
+
- 无论策略或权限模式如何,始终拒绝:远程 push、合并/PR 进 `main` 或 integration
|
|
172
|
+
分支、其他远程 CLI 变更、`.git` 元数据写入,以及对受保护分支的破坏性改写
|
|
173
|
+
(`reset`、`update-ref`、`symbolic-ref`,或带删除/移动/强制标志的 `branch`)。
|
|
174
|
+
除此之外的一切都按配置的策略处理。
|
|
175
|
+
- `autonomy.permissionAuthority`(`policy` | `hybrid` 默认 |
|
|
176
|
+
`decision-worker`)决定谁来回答权限请求——headless 模式下是每一个请求,交互式
|
|
177
|
+
tmux 模式下只是那些 Claude 本来会弹窗问你的请求:`hybrid` 会让策略独自回答
|
|
178
|
+
任务目录内的常规编辑和本地只读/开发类 shell 命令,并把所有含糊的请求发给
|
|
179
|
+
Decision Worker(策略拒绝总是直接生效)。
|
|
180
|
+
- **看 baseline,不看分支。** 任何分支,包括 `main`,都可以被监督;候选只需要
|
|
181
|
+
从记录的 baseline commit 派生出来(`merge-base --is-ancestor`)。任务过程中
|
|
182
|
+
切换分支会被记录(`worker_branch_changed`),而不是被拒绝;落在受保护分支上
|
|
183
|
+
的候选会在通知中报告(`branch`、`protectedBranch`),而不是被挂起。
|
|
184
|
+
`checkout`/`switch` 到 `main` 是允许的;只有对受保护分支名的破坏性改写才会
|
|
185
|
+
被拒绝。Claude Code 自己"默认分支上先切分支"的建议只是提示,不会被强制执行。
|
|
186
|
+
- Worker 命令不经过 shell 启动。自动模式只接受裸的 `claude` 命令名,并固定
|
|
187
|
+
由操作者拥有的、不可写的可执行文件路径(可用
|
|
188
|
+
`PI_CLAUDE_SUPERVISOR_TRUSTED_CLAUDE` 显式固定)。
|
|
189
|
+
- Linux 上,cgroup v2 边界会清理每一个后代进程,包括 `setsid()` 后代;
|
|
190
|
+
`required` 模式会 fail closed,而不是回退到其他清理方式。
|
|
191
|
+
- 默认 4 小时总时限、20 分钟无输出 watchdog 会停止 Worker;嵌入方调用可以修改或
|
|
192
|
+
关闭任一项(`deadlineMs`、`noOutputTimeoutMs`)。
|
|
193
|
+
- 验收命令、证据收集和 Reviewer 共用一个 abort signal,因此 stop 或 shutdown
|
|
194
|
+
不必等待完整的命令或模型超时。
|
|
195
|
+
- 每个任务只持有一个 cwd 租约;并发任务需要各自独立的 worktree。
|
|
196
|
+
|
|
197
|
+
## 任务 spec
|
|
198
|
+
|
|
199
|
+
`--spec file.json` 接受如下格式:
|
|
82
200
|
|
|
83
201
|
```json
|
|
84
202
|
{
|
|
85
|
-
"goal": "
|
|
203
|
+
"goal": "Implement the requested change",
|
|
86
204
|
"scope": ["src/"],
|
|
87
|
-
"constraints": ["
|
|
88
|
-
"forbidden": ["
|
|
205
|
+
"constraints": ["Keep the public API compatible"],
|
|
206
|
+
"forbidden": ["Do not publish artifacts"],
|
|
89
207
|
"acceptance": [
|
|
90
|
-
{ "id": "tests", "name": "tests", "command": "npm", "args": ["test"], "required": true }
|
|
208
|
+
{ "id": "tests", "name": "tests", "command": "npm", "args": ["test"], "required": true, "timeoutMs": 120000 }
|
|
91
209
|
],
|
|
92
210
|
"maxRepairRounds": 3,
|
|
93
211
|
"autonomy": {
|
|
94
212
|
"unattended": true,
|
|
95
213
|
"requireLocalCommit": true,
|
|
96
|
-
"maxDecisionRetries": 2
|
|
214
|
+
"maxDecisionRetries": 2,
|
|
215
|
+
"permissionAuthority": "hybrid",
|
|
216
|
+
"maxWorkerCostUsd": 20
|
|
97
217
|
}
|
|
98
218
|
}
|
|
99
219
|
```
|
|
100
220
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
`
|
|
126
|
-
|
|
127
|
-
`
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
221
|
+
验收命令始终使用 argv 执行,不经过 shell。纯文本任务(不带 `--spec`)会变成一个
|
|
222
|
+
带默认 `git diff --check` 验收检查(120 秒超时)和下文环境默认值的 `goal`。
|
|
223
|
+
|
|
224
|
+
## 配置参考
|
|
225
|
+
|
|
226
|
+
环境变量(或 `~/.config/pi-claude-supervisor/env`),均以 `PI_CLAUDE_SUPERVISOR_`
|
|
227
|
+
为前缀;完整模板见 `.env.example`。
|
|
228
|
+
|
|
229
|
+
| 变量 | 默认值 | 含义 |
|
|
230
|
+
| --- | --- | --- |
|
|
231
|
+
| `MODE` | 未设置(手动) | `auto` 启用自动监督(Decision Worker + Reviewer 循环) |
|
|
232
|
+
| `AUTOMATION` | 未设置 | `1` 等价于 `MODE=auto` |
|
|
233
|
+
| `TRANSPORT` | 自动模式下 `jsonl`,否则 `process-pipe` | `jsonl` \| `tmux` \| `process-pipe`(仅手动模式) |
|
|
234
|
+
| `TMUX_MODE` | `interactive` | `interactive`(通过 hooks 驱动真实 TUI) \| `bridge`(pane 中的 stream-json) |
|
|
235
|
+
| `AUTO_INSTALL_HOOKS` | `true` | 仅交互式 tmux 模式:加载时自动把 hook relay 安装进用户 Claude 配置;`0` 关闭自动安装 |
|
|
236
|
+
| `CLOSE_WORKER_ON_COMPLETION` | `false` | 仅交互式 tmux:完成时关闭 Worker/session,而不是保持开启 |
|
|
237
|
+
| `CGROUP_MODE` | `auto` | `off` \| `auto` \| `required`;自动模式在 Linux 上要求 cgroup;`required` 只在手动(非自动)tmux Worker 上会被拒绝;自动模式在 Linux 上总是使用 `required` |
|
|
238
|
+
| `TMUX_SOCKET` | 未设置(默认 tmux server) | 接管非默认 tmux server 时使用的 socket 路径 |
|
|
239
|
+
| `WORKER` | `claude` | Worker 命令;可以包含参数 |
|
|
240
|
+
| `NODE` | 未设置(从 `PATH` 解析) | 显式 `node` 可执行文件路径,用于 Bun 编译版 Pi |
|
|
241
|
+
| `TRUSTED_CLAUDE` | 未设置 | 显式固定预期的解析后 Claude 可执行文件身份 |
|
|
242
|
+
| `STATE_DIR` | `~/.pi/agent/claude-supervisor` | Supervisor 状态目录 |
|
|
243
|
+
| `CWD_LEASE_DIR` | `<state>/cwd-leases` | 共享的 cwd 租约注册目录 |
|
|
244
|
+
| `WORKER_ENV` | 未设置 | 传给手动 Worker 的环境变量名逗号分隔列表 |
|
|
245
|
+
| `HUMAN_WEBHOOK_URL` | 未设置 | 出站候选/失败通知的目标地址 |
|
|
246
|
+
| `HUMAN_WEBHOOK_FORMAT` | `generic` | `wecom` \| `generic` |
|
|
247
|
+
| `HUMAN_WEBHOOK_SECRET` | 未设置 | HMAC 签名密钥;以 `x-pi-supervisor-signature` header 发送 |
|
|
248
|
+
| `UNATTENDED` | `true` | 任务无需同步人工回调即可运行 |
|
|
249
|
+
| `REQUIRE_LOCAL_COMMIT` | `true` | 完成前要求在候选所在分支上有本地 commit |
|
|
250
|
+
| `MAX_DECISION_RETRIES` | `2`(0–10) | Decision Worker 调用超时或失败(429/529、网络、鉴权)时的重试次数 |
|
|
251
|
+
| `PERMISSION_AUTHORITY` | `hybrid` | `policy` \| `hybrid` \| `decision-worker` |
|
|
252
|
+
| `WORKER_MAX_BUDGET_USD` | 未设置 | 作为 `--max-budget-usd` 传入的硬上限;交互式 tmux 下不可用 |
|
|
253
|
+
| `WORKER_MODEL` | 未设置(Claude 自身默认值) | Claude Worker 的 `--model` |
|
|
254
|
+
| `WORKER_AUTOCOMPACT_TOKENS` | 自动模式默认 `200000` | 每轮上下文上限;`0` 保留 Claude 自身默认值 |
|
|
255
|
+
| `WORKER_MCP_CONFIG` | 未设置 | 作为 `--strict-mcp-config --mcp-config` 传入的路径,限制 Worker 可用的 MCP server |
|
|
256
|
+
| `DECISION_MODEL` | 未设置(Pi 默认) | Pi Decision Worker 使用的 `provider/model-id`,格式与 Pi 列出的一致 |
|
|
257
|
+
| `REVIEWER_MODEL` | 未设置(Pi 默认) | 独立 Reviewer 使用的 `provider/model-id` |
|
|
258
|
+
| `DECISION_COMPACT_TOKENS` | `60000` | 持久化 Decision Worker session 超过此大小时主动 compact;`0` 关闭该功能 |
|
|
259
|
+
| `PROGRESS_HEARTBEAT_MS` | `60000` | 同一阶段重复进度通知之间的最小间隔 |
|
|
260
|
+
| `DECISION_SESSION_RETENTION_DAYS` | `30` | 启动时清理早于此天数的已关闭 Decision Worker session 记录;`0` 表示永久保留 |
|
|
261
|
+
| `EVIDENCE_MAX_BYTES` | `1048576`(1 MiB) | 每个任务收集的最大仓库证据字节数 |
|
|
262
|
+
| `EVIDENCE_MAX_UNTRACKED_FILES` | `512` | 每个任务作为证据收集的最大未跟踪文件数 |
|
|
263
|
+
| `REVIEW_TIMEOUT_MS` | `600000`(10 分钟) | 每轮独立 Reviewer 的总预算,含一次针对 provider 错误的重试 |
|
|
264
|
+
| `EVENT_LOG_MAX_BYTES` | `67108864`(64 MiB) | `events.jsonl` 达到该大小后滚动,保留 5 份滚动文件 |
|
|
265
|
+
|
|
266
|
+
## 恢复、租约与状态
|
|
267
|
+
|
|
268
|
+
Pi 非正常重启后,`/supervise sessions` 会列出可恢复的任务;`/supervise recover
|
|
269
|
+
[--takeover] <task-id>` 会恢复 Decision Worker 上下文并启动一个新的 Claude
|
|
270
|
+
Worker,它不会静默恢复或重复执行任务。只有在租约证明旧 Worker 的进程组已经
|
|
271
|
+
消失、其 cgroup 是真实可读的空边界时(对 tmux 而言,还要求私有 tmux session
|
|
272
|
+
也已消失)才应添加 `--takeover`;缺失或无法确认的证据会被拒绝,而不是被强行
|
|
273
|
+
接管。`/supervise recover` 不会持久化原始任务是否为交互式;它在恢复时根据当前
|
|
274
|
+
的 `TRANSPORT`/`TMUX_MODE` 配置来判断,因此在启动任务和恢复任务之间请不要
|
|
275
|
+
改变这两个配置。
|
|
276
|
+
|
|
277
|
+
每个任务在 `CWD_LEASE_DIR` 下持有一个 cwd 租约;并发任务需要各自独立的
|
|
278
|
+
worktree。无法读取的租约记录(损坏的 JSON、异常的结构)会被隔离到 quarantine
|
|
279
|
+
目录,而不会阻塞其他查找;`/supervise sessions` 会列出当前被隔离的记录,方便
|
|
280
|
+
操作者检查和清理。
|
|
281
|
+
|
|
282
|
+
事件以 append-only 的 JSONL 形式写入 `<STATE_DIR>/events.jsonl`,其中
|
|
283
|
+
`worker_output` 有大小上限,日志会在超过 `EVENT_LOG_MAX_BYTES` 后滚动。每个
|
|
284
|
+
任务的 Decision Worker session 都持久化为状态目录下独立的 JSONL 文件,由
|
|
285
|
+
`DECISION_SESSION_RETENTION_DAYS` 负责清理。
|
|
286
|
+
|
|
287
|
+
## 通知
|
|
288
|
+
|
|
289
|
+
每个终态(`completed`、`blocked`、`failed`)都会在 Pi UI 中发出候选通知,如果
|
|
290
|
+
设置了 `HUMAN_WEBHOOK_URL`,还会以 `wecom` 或 `generic` JSON 格式发到 webhook,
|
|
291
|
+
设置了 `HUMAN_WEBHOOK_SECRET` 时会附带签名。被挂起并提出问题的候选会发出一条
|
|
292
|
+
单独的"需要你"通知;人工接管(你在会话里敲了字)只在 Pi 界面提示,因为你本来就在。当通知涉及 tmux session 时,两种通知
|
|
293
|
+
都会带一个 `attach` 字段,内容是可直接执行的 `tmux -S <socket> attach -t
|
|
294
|
+
<session>` 命令,以及一份费用摘要(`CandidateNotice.usage`:费用、Worker
|
|
295
|
+
轮次/token、Pi token、decision 和 reviewer 调用次数)。webhook 投递会对瞬时
|
|
296
|
+
错误(网络、429/5xx)重试。通知只是出站单向的:收到通知不授予任何批准权限,
|
|
297
|
+
webhook 也不能把命令推回 Pi——需要那样做时请使用 `/supervise
|
|
298
|
+
send`/`approve`/`takeover`。
|
|
299
|
+
|
|
300
|
+
## Token 消耗与成本控制
|
|
301
|
+
|
|
302
|
+
以下数据来自一次真实的无人值守 review 任务(总耗时 29 分钟):
|
|
303
|
+
|
|
304
|
+
| 组成部分 | 轮次/调用次数 | Token | 花费 |
|
|
305
|
+
| --- | --- | --- | --- |
|
|
306
|
+
| Claude Code Worker | 70 轮 | 15.5M cache-read + 370k cache-write + 100k output | $18.46 |
|
|
307
|
+
| Pi Decision Worker | 30 次模型调用 | 约 1.0M(91k 未缓存 + 914k cache-read) | $0.04 |
|
|
308
|
+
|
|
309
|
+
花费几乎全部来自 Worker,而不是 Supervisor 自身的 Decision Worker 或 Reviewer
|
|
310
|
+
调用。这次运行中 Worker 每轮平均消耗约 22 万 token 的上下文,原因是它以单个
|
|
311
|
+
长期 `-p` session 运行在 1M token 窗口下,从未触发过 compact;一次普通的
|
|
312
|
+
Claude Code 轮次仅系统提示词就要消耗约 2.4 万 prompt token,与配置了哪些 MCP
|
|
313
|
+
server 无关。30 次 Decision Worker 调用中有 28 次是权限请求;Decision Worker
|
|
314
|
+
推翻确定性 policy 的情形有 4 次(拒绝下载和任务目录之外的写入)——这正是默认
|
|
315
|
+
`permissionAuthority` 选择 `hybrid` 而不是 `policy` 的原因。把这 28 次请求
|
|
316
|
+
回放到实际发布的 `isRoutinePermission` 分类器,有 4 次可在本地直接回答;那次
|
|
317
|
+
任务以内联 `node -e` 脚本和 `$(...)` 替换为主,这两类永远不算例行操作。普通
|
|
318
|
+
实现类任务主要是 cwd 内的 `Edit`/`Write`、`npm test` 和 `git
|
|
319
|
+
status/diff/add/commit`,这些都是例行操作,Decision Worker 调用次数会下降
|
|
320
|
+
得多得多。
|
|
321
|
+
|
|
322
|
+
各项开关及其默认值和取舍:
|
|
323
|
+
|
|
324
|
+
- `PERMISSION_AUTHORITY`(`policy` | `hybrid` 默认 | `decision-worker`):
|
|
325
|
+
`hybrid` 会让确定性 policy(`src/policy.ts` 的 `isRoutinePermission`)直接
|
|
326
|
+
回答任务目录内的常规文件编辑和本地只读/开发类 shell 命令,其余请求以及任何
|
|
327
|
+
policy 拒绝仍会发给 Decision Worker。它主要节省的是延迟和 Decision Worker
|
|
328
|
+
的上下文大小,而不是费用:上面的 30 次调用本身只花了 $0.04。
|
|
329
|
+
- `WORKER_MODEL` / `--model`:Opus 级和 Sonnet 级模型之间大约相差 5 倍价格,
|
|
330
|
+
是账单上最大的单一杠杆;这是操作者自己的选择,Supervisor 不会替你决定。
|
|
331
|
+
- `WORKER_AUTOCOMPACT_TOKENS`(自动模式默认 200000;`0` 保留 Claude 自身默认
|
|
332
|
+
值):限制每轮 Worker 的上下文大小,避免像本例一样持续累积到约 22 万
|
|
333
|
+
token/轮;能节省几十个百分点,但会牺牲一些上下文质量。
|
|
334
|
+
- `WORKER_MAX_BUDGET_USD` / `autonomy.maxWorkerCostUsd`:作为
|
|
335
|
+
`--max-budget-usd` 传给 Claude,并由 Supervisor 根据 Worker `result` 的
|
|
336
|
+
累计花费再次核对;这是一个上限而不是节省手段,达到上限的任务会连同证据一起
|
|
337
|
+
被挂起。
|
|
338
|
+
- `WORKER_MCP_CONFIG`(`--strict-mcp-config --mcp-config`):限制 Worker 只能
|
|
339
|
+
使用列出的 MCP server;它约束的是 Worker 能触达的范围,而不是普通轮次约
|
|
340
|
+
2.4 万 token 的固定开销。
|
|
341
|
+
- `DECISION_MODEL` / `REVIEWER_MODEL`(`provider/model-id`,例如
|
|
342
|
+
`anthropic/claude-haiku-4-5-20251001`):Pi Decision Worker 和 Reviewer
|
|
343
|
+
使用的模型。本例中 Pi 侧花费本就只有几美分,换更便宜的模型主要是换取延迟,
|
|
344
|
+
而不是显著省钱。
|
|
345
|
+
- `DECISION_COMPACT_TOKENS`(默认 60000;`0` 关闭):当持久化的 Decision
|
|
346
|
+
Worker session 估算的上下文超过该阈值时主动 compact,并在 compact 之后的
|
|
347
|
+
下一次 prompt 里重新发送一次启动指令。
|
|
348
|
+
|
|
349
|
+
Supervisor 记录的是实际花费,而不是事后估算:每条 Worker `result` 记录都会
|
|
350
|
+
生成一条 `worker_usage` 事件,每次 Decision Worker/Reviewer 模型调用都会生成
|
|
351
|
+
一条 `pi_usage` 事件,二者都会累计进 `session.usage`(`SupervisorTokenUsage`)。
|
|
352
|
+
`/supervise status <task-id>` 会打印一行 `cost=… workerTurns=…
|
|
353
|
+
workerTokens=… piTokens=… decisionCalls=… reviewerCalls=…` 摘要;进度通知
|
|
354
|
+
携带 `SupervisorProgress.costUsd`/`.piTokens`,候选通知则通过
|
|
355
|
+
`CandidateNotice.usage` 携带同样的摘要(generic webhook 以数值型 `usage`
|
|
356
|
+
对象输出,WeCom 格式追加两行费用/tokens)。
|
|
357
|
+
|
|
358
|
+
除了 Worker 模型和预算的选择之外,以上机制本身并不会改变任务的实际花费;
|
|
359
|
+
Supervisor 侧的这些改动主要是削减 Decision Worker 的 token 消耗和延迟,而
|
|
360
|
+
这部分原本就只有几美分。对成本敏感的无人值守场景,一个合理的起点是:
|
|
361
|
+
`WORKER_MODEL` 选择 Sonnet 级模型、为任务设置明确的 `WORKER_MAX_BUDGET_USD`、
|
|
362
|
+
保留默认的 `hybrid` permission authority,并将 `DECISION_MODEL` 设为 Haiku
|
|
363
|
+
级模型。
|
|
364
|
+
|
|
365
|
+
## 开发
|
|
366
|
+
|
|
367
|
+
为扩展本身贡献代码(使用这个扩展本身不需要这些步骤):
|
|
138
368
|
|
|
139
369
|
```bash
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
# 接管非默认 tmux server 时可选:
|
|
146
|
-
# export PI_CLAUDE_SUPERVISOR_TMUX_SOCKET=/path/to/tmux.sock
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
`/supervise start <task>` 会在私有 tmux server 中启动 Claude,并返回可复制的 attach 命令。
|
|
150
|
-
可以在另一个终端 attach 到同一个 PTY,观察或人工输入。多行消息通过 tmux buffer 和 Enter
|
|
151
|
-
发送,不会把消息拼接进 shell 命令;`pipe-pane` 记录原始输出,`capture-pane` 检测稳定的 Claude
|
|
152
|
-
输入提示,并复用 watchdog、审计和独立验收流程。自动模式会在 pane 内启动 bridge:它运行
|
|
153
|
-
Claude stream-json、把可读输出渲染到附着的终端,并通过同一 PTY 的私有 framing 返回结构化
|
|
154
|
-
记录;bridge 及其后代放入受 Supervisor 管理的 Linux cgroup,并由 parent-death guardian
|
|
155
|
-
保护;bridge 会在 spawn Claude 前再次读取生效设置,任一 containment 机制或权限检查不可用时 fail closed。适配器直接从 PTY 原始 pipe 解析,因此没有
|
|
156
|
-
独立 JSONL sidecar。自动模式拒绝被接管的 session;Supervisor 自有 bridge 支持自动输入串行化、
|
|
157
|
-
权限响应、turn 完成和 stop。
|
|
158
|
-
|
|
159
|
-
如果 Claude 已由你在 tmux 中启动,可以显式接管且不会重放原始任务:
|
|
160
|
-
|
|
161
|
-
```text
|
|
162
|
-
/supervise adopt-tmux <tmux-session-name> <task description>
|
|
370
|
+
npm ci --ignore-scripts
|
|
371
|
+
npm run check
|
|
372
|
+
npm run build
|
|
373
|
+
npm run test:pi
|
|
374
|
+
npm run test:install
|
|
163
375
|
```
|
|
164
376
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
`PI_CLAUDE_SUPERVISOR_TMUX_SOCKET`;只有默认 server 才能只使用 session 名称。对被接管的 session,
|
|
168
|
-
`/supervise stop` 和 Pi 关闭只会断开监督,不会杀掉你的 tmux 窗口;需要关闭时请由你执行
|
|
169
|
-
`tmux kill-session`。`/supervise takeover <task-id>` 会暂停 Decision Worker 自动发送,只有
|
|
170
|
-
`/supervise resume-auto <task-id>` 才恢复。
|
|
171
|
-
|
|
172
|
-
PTY 屏幕文字本身不是 Claude JSONL,不能把屏幕文字当作结构化权限证据;只有 Supervisor bridge
|
|
173
|
-
的私有 framing 记录才是结构化证据。TUI 决策应按任务授权策略处理并记录;无法形成候选时可以自动挂起,不要求人工持续在线。普通终端里已经运行的 Claude 不能安全迁移进 tmux;`--resume`
|
|
174
|
-
是读取历史的新进程,不是实时 attach。实时测试请使用 plan/read-only 参数。
|
|
175
|
-
|
|
176
|
-
可以从不同工作目录启动多个任务会话;活动会话不能共享同一 cwd,建议每个任务使用独立 worktree:
|
|
177
|
-
|
|
178
|
-
```text
|
|
179
|
-
/supervise sessions
|
|
180
|
-
/supervise poll all
|
|
181
|
-
/supervise poll <task-id>
|
|
182
|
-
/supervise send <task-id> continue after checking the test failure
|
|
183
|
-
```
|
|
377
|
+
部分测试会针对真实的 checkout 校验可信可执行文件和受保护分支的边界,因此必须
|
|
378
|
+
从非受保护分支、且不在 group/world-writable 路径下运行。
|
|
184
379
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
该阶段应安排在 Claude `2.1.270` 以上版本的稳定性统计和单 Worker recovery 语义完成之后。
|
|
380
|
+
详见 [architecture](docs/architecture.md)、[testing](docs/testing.md) 和
|
|
381
|
+
[releasing](docs/releasing.md);`docs/autonomy-target.md` 记录了本项目所
|
|
382
|
+
围绕的、已确认的无人值守开发目标。
|
|
189
383
|
|
|
190
|
-
|
|
384
|
+
## License
|
|
191
385
|
|
|
192
|
-
|
|
386
|
+
MIT。见 [LICENSE](LICENSE)。
|