@ckanner/flywheel 0.28.5 → 0.29.1
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 +17 -0
- package/README.en.md +35 -12
- package/README.md +46 -13
- package/bin/flywheel-claude-code-pro-worker.js +16 -0
- package/bin/flywheel.js +4 -1
- package/bin/runtime.js +7 -1
- package/docs/claude-code-pro.md +128 -0
- package/docs/configuration.md +214 -11
- package/docs/en/claude-code-pro.md +145 -0
- package/docs/en/configuration.md +123 -11
- package/docs/en/getting-started.md +26 -16
- package/docs/en/model-policy.md +6 -2
- package/docs/en/session-evaluation.md +120 -0
- package/docs/en/session-recovery.md +81 -0
- package/docs/en/workflow.md +41 -8
- package/docs/getting-started.md +51 -17
- package/docs/model-policy.md +6 -2
- package/docs/session-evaluation.md +120 -0
- package/docs/session-recovery.md +81 -0
- package/docs/workflow.md +92 -20
- package/npm/install.js +5 -5
- package/package.json +17 -9
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# 会话中断恢复与上下文质量
|
|
2
|
+
|
|
3
|
+
本指南描述会话方案 P3/P4 的当前源码实现。P1/P2 的角色历史续用和已保存回执消费继续有效;新能力需要配套的 **Codex Pro 0.9.0** 或 **Claude Code Pro 0.4.0** 公开 machine API。源码、npm 发行、账号可用性和真实任务效果是不同的验收项。
|
|
4
|
+
|
|
5
|
+
## 1. 谁拥有哪些事实
|
|
6
|
+
|
|
7
|
+
| 层 | 责任 |
|
|
8
|
+
|---|---|
|
|
9
|
+
| Go 引擎 | 任务状态、角色与范围、调用意图、候选与契约检查、预算、计量、回执消费和交付 |
|
|
10
|
+
| Flywheel worker v3 | 传递有类型的生命周期帧;等待 Go 的持久化 ACK;转发取消;不作业务判断 |
|
|
11
|
+
| 上游 machine API | 独立 supervisor、私有 durable journal、原生进程 guardian、完整原始终态回执、只读 `recoverMachine` |
|
|
12
|
+
| 原生 Codex / Claude | 模型与工具执行、原生历史、实际配置与可观察 usage |
|
|
13
|
+
|
|
14
|
+
外层 worker 协议为 3,插件请求和回执仍是 machine protocol 1,生命周期单独为 version 1。DSH 和 Kimi 继续使用其已实现的正常历史续用及 Go 回执恢复;不能从这两个新插件的能力推断它们也有同样的 P3 接口。
|
|
15
|
+
|
|
16
|
+
## 2. 派发前必须有持久化确认
|
|
17
|
+
|
|
18
|
+
Go 准备任务的 `.sessions/` 父目录并保存调用意图,上游 API 再独占创建本次调用的恢复子目录。子目录以调用 ID 的摘要命名;不在用户的全局模型历史中搜索。
|
|
19
|
+
|
|
20
|
+
上游按实际可观察边界发送 `thread-ready`、`dispatch-intent`、`dispatch-possible`、`turn-accepted`、`terminal` 和 `cleanup-confirmed`。不同后端可观察到的事件不同,不能自行补齐:
|
|
21
|
+
|
|
22
|
+
- **Codex** 的 `thread-ready` 在 `turn/start` 之前返回实际 thread/configuration。Go 在确认 ACK 前核对完整权限策略、cwd、模型和身份。任一确认失败会阻止后续 turn。
|
|
23
|
+
- **Claude** 只有提交 prompt 后才返回原生 init。它提供派发前的 intent/possible ACK,但不宣称有 prompt 前的 thread-ready 或真实 turn-accepted;实际配置仍是终态接纳检查。
|
|
24
|
+
|
|
25
|
+
Go 将事件与原调用身份核对后,先原子保存并 `fsync` 检查点与状态,再回 ACK。缺失、错误、重复、过早或超时的 ACK 不能释放后续步骤。`persistent:true` 表示请求保留原生历史;不表示空 thread 已有可恢复 rollout。
|
|
26
|
+
|
|
27
|
+
上游 supervisor 与 worker 的生命周期分离,拥有原生 guardian。worker 断连时,它取消尚未确认的步骤并收束原生进程;终态回执在向 worker 通知终态之前已落盘。通知或最后 ACK 丢失不能把原本成功的完整回执改成“未执行”。
|
|
28
|
+
|
|
29
|
+
## 3. 恢复只读,不会重发 prompt
|
|
30
|
+
|
|
31
|
+
重新启动同一任务时,Go 根据原调用保存的 adapter 版本、request/run ID、任务目录与绑定,调用公开 `recoverMachine`。它只读取那个调用的 journal,不启动原生 CLI,不执行 `thread/resume`,不查询其他任务,不重新提交 prompt。
|
|
32
|
+
|
|
33
|
+
| 恢复返回 | 含义与引擎行为 |
|
|
34
|
+
|---|---|
|
|
35
|
+
| `terminal` | 找到同一调用的完整原始回执;继续核验身份、执行终态、清理、用量与原候选证据 |
|
|
36
|
+
| `pending` | 尚未找到已持久化终态;不证明原进程仍存活,保持阻断 |
|
|
37
|
+
| `unknown` / 损坏 / 错配 | 无法证明该次调用结果,保留证据并阻断;不能换 fresh、换后端或删账本来重放 |
|
|
38
|
+
|
|
39
|
+
只读查询可以重复。原生机器、历史文件或 journal 不可用时,不承诺跨机器恢复。supervisor 自身也被终止时可能只剩 pending;本实现没有 exactly-once 执行保证。
|
|
40
|
+
|
|
41
|
+
### 回执成功仍须有原候选证据
|
|
42
|
+
|
|
43
|
+
`cleanup-confirmed` 到达时,Go 在 ACK 前保存该次执行结束后的候选摘要、原角色 guard,以及 Execute 的报告。恢复得到成功回执后,必须同时有这份原调用的证据,才能应用业务结果。重启后重新拍摄的工作区、重新跑过的验收不能替代原检查点。
|
|
44
|
+
|
|
45
|
+
若 supervisor 保存了回执,但 Go 尚未来得及记录原候选,则可恢复可信用量,业务仍保持阻断。只有物理事实证明未派发、清理完成且候选与原 guard 完全未变的拒绝,才允许按已知未执行处理。独立 Review/Judge 的原契约与候选检查继续适用。
|
|
46
|
+
|
|
47
|
+
## 4. 计量与预算
|
|
48
|
+
|
|
49
|
+
已消费的调用不再次计数,不重发模型请求。原调用曾因丢失回执计为 unknown、后又找回可信 usage 时,Go 按同一调用记一条可审计 correction;保留原 provider、原日桶和 lifetime 归属。已过保留窗口的日桶不会因为恢复而重新出现。
|
|
50
|
+
|
|
51
|
+
状态采用 CAS,receipt、状态和 metrics 都在成功前持久化。metric 已追加但状态 CAS 失败时,重试不会追加第二份相同调用;已存在行也必须再次确认文件与目录已同步,不能将“可读”当作持久化完成。
|
|
52
|
+
|
|
53
|
+
未知仍不是零。恢复中的质量重建、Quick → Full、角色模式变化和新 worker 都不重置预算、尝试次数或未知调用阻断。预算只约束新的派发,不妨碍消费已经执行完成且证据齐全的结果。
|
|
54
|
+
|
|
55
|
+
## 5. 可解释的上下文重建
|
|
56
|
+
|
|
57
|
+
`sessions.roles` 可分别选择 Plan、Execute、Review、Judge 的 fresh/scoped;未覆盖的角色沿用总模式。具体配置见[会话策略](configuration.md#会话策略历史复用与调用安全)。
|
|
58
|
+
|
|
59
|
+
可选 `sessions.quality` 接受三个有界指标:
|
|
60
|
+
|
|
61
|
+
| 字段 | 观测事实 |
|
|
62
|
+
|---|---|
|
|
63
|
+
| `max-confirmed-turns` | 当前角色历史已确认且去重后的调用次数 |
|
|
64
|
+
| `max-unproductive-turns` | Execute 连续完成调用但候选摘要未变化的次数 |
|
|
65
|
+
| `max-run-input-tokens` | 最近一次可完整归属的实际输入 token 数;不是猜测的上下文窗口大小 |
|
|
66
|
+
|
|
67
|
+
所有阈值默认关闭。只有原调用已安全终止、计量并消费后,阈值才可让下一次调用重建。unknown 或待消费结果优先处理,不能借重建绕过。
|
|
68
|
+
|
|
69
|
+
重建保留明确原因与 generation,并用当前 Spec、packet、工作区、合法报告、验证与结构化反馈交接。它不读取另一个角色的私有 transcript,不以“压缩成功”伪造模型事实,也不另发未计量的模型压缩调用。Review 即使续用自己历史,仍须检查完整当前候选。
|
|
70
|
+
|
|
71
|
+
## 6. P4 对照评估与证据边界
|
|
72
|
+
|
|
73
|
+
仓库提供固定源码与独立 oracle 的评估工具,比较 fresh、仅 Execute scoped、各角色 scoped。覆盖一次成功、L1 返修、Review return、长上下文、停止恢复、配置改变;轮换策略顺序并要求重复运行。工具记录完成质量、漏项、回归、返修轮数、重复 findings、耗时、已知/未知 token 与缓存、重建原因和恢复失败。场景是否发生由实际状态证据判断,不靠名称。
|
|
74
|
+
|
|
75
|
+
离线 native fixture 经过真实 Go、worker v3 和公开插件接口,验证评估工具及安全边界;它不是实际模型质量、缓存率或节省比例。真实账号的对照结果需要可用的原生 CLI、账号、权限与模型环境。未获得该结果前不自动启用阈值,不改变任何默认模型或 loop。操作步骤与实验产物说明见[配置指南](configuration.md)及 `scripts/prepare-session-evaluation.js`、`scripts/evaluate-sessions.js` 的帮助。
|
|
76
|
+
|
|
77
|
+
## 7. 保存和排障
|
|
78
|
+
|
|
79
|
+
上游恢复目录与文件使用私有权限、独占创建、身份/摘要检查和原子持久化;已存在目录不会触发二次执行。它们属于任务审计证据,可能含模型输出与诊断。按任务一起保存、备份和控制访问,不复制凭证,也不因安装升级而删除未知调用的证据。
|
|
80
|
+
|
|
81
|
+
当前没有自动删除这些恢复证据的保留计时器。确认任务完成或由人解决未知结果之后,才能按项目的任务归档流程处理;删除 journal 不是解除阻断的恢复方法。`control status`/doctor 是查看入口,模型与 skills 不修改 `state.json`。需要恢复时仍从原任务目录使用正常 Go 启动入口,由引擎核对并决定下一步。
|
package/docs/workflow.md
CHANGED
|
@@ -10,9 +10,44 @@ Codex Pro 插件 machine API;源码存在不代表 npm `latest` 已更新,
|
|
|
10
10
|
Flywheel 将通过验收的 packet 合入任务分支;整个需求通过终验和远端检查后,
|
|
11
11
|
再由人或已获授权的宿主 Agent 合并 PR 到 `main`。
|
|
12
12
|
|
|
13
|
+
## 0. 常规入口:描述目标并启动
|
|
14
|
+
|
|
15
|
+
包含自适应工作流的同版本 CLI/DSH 插件提供统一入口:
|
|
16
|
+
|
|
17
|
+
```text
|
|
18
|
+
/flywheel-task 修复已定位的问题,补齐回归测试并完成验证。mode=auto
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
宿主使用当前对话研究代码、复用或建立任务 worktree,准备 Spec、packet、验收与
|
|
22
|
+
工作流事实,保存契约后调用 `flywheel_launch`。Go 校验资格并启动,DSH 将这个
|
|
23
|
+
具体任务关联到当前会话的 Flywheel 视图;通常无需复制路径或反复确认已授权范围。
|
|
24
|
+
`flywheel control launch --help` 可确认新接口是否存在;旧发行中的基础命令不代表
|
|
25
|
+
已经具备此入口。
|
|
26
|
+
|
|
27
|
+
| 选择 | 引擎选择与闭环 |
|
|
28
|
+
|---|---|
|
|
29
|
+
| Auto(默认) | 根据已研究并记录的事实选择 Quick;资格不足或存在风险则 Full |
|
|
30
|
+
| Quick | 一个里程碑、一个 packet,执行、全部必需验证、独立最终 Review、Git 交付 |
|
|
31
|
+
| Full | Plan、逐 packet 执行与评审、集成 L2/L3、Judge |
|
|
32
|
+
|
|
33
|
+
Quick 不按文件数量判断风险。范围与实现模式必须明确、全部需求有验收映射、
|
|
34
|
+
独立最终评审可以完整判断,缺失 L2/L3 要有不适用理由。鉴权、支付、迁移、并发、
|
|
35
|
+
权限或未决设计等使用 Full;显式 Quick 也不能绕过资格。最终 Review 发现验收
|
|
36
|
+
缺口或新风险时,Go 保存升级并继续 Full,保留预算、工作区和历史。
|
|
37
|
+
|
|
38
|
+
正常首次成功的 Quick 只有 Execute 与最终 Review 两次阶段 Agent 调用,宿主
|
|
39
|
+
准备、模型内部轮次和重试另计。必需测试、覆盖率、适用 L2/L3 与缺陷注入仍保留,
|
|
40
|
+
而且都必须验证最终 Review 读取的同一候选。Plan/Judge 记录为“不适用”及原因,
|
|
41
|
+
不能显示假通过。
|
|
42
|
+
|
|
43
|
+
只想先看方案时用 `/flywheel-new <需求>`;已准备或要恢复任务时用
|
|
44
|
+
`/flywheel-run <真实任务目录>`。用户已有的工作区、实施与交付授权继续沿用,
|
|
45
|
+
明确提出“先给我看方案”时才停在审阅。下面逐节展开准备、启动与交付的检查点,
|
|
46
|
+
不要求自动入口逐项等待用户点击。
|
|
47
|
+
|
|
13
48
|
## 1. 选择准备阶段的模型
|
|
14
49
|
|
|
15
|
-
`flywheel-new` 使用当前 DSH 对话的模型。`loops.plan` 只控制引擎启动后的规划
|
|
50
|
+
`flywheel-task` 与 `flywheel-new` 使用当前 DSH 对话的模型。`loops.plan` 只控制引擎启动后的规划
|
|
16
51
|
和修订,不会替准备阶段切换模型。建议按需求的不确定性选择:
|
|
17
52
|
|
|
18
53
|
| 准备任务 | DSH Provider / 模型 | 思考等级 |
|
|
@@ -95,6 +130,11 @@ Kimi 的语法。依据见 [DSH 技能入口](https://github.com/deepseek-ai/dee
|
|
|
95
130
|
不要填未经运行的验收结果;环境缺失应标记 unverified。不要手工创建或修改
|
|
96
131
|
`state.json`,它由引擎管理。完整要求见 [flywheel-new](../skills/flywheel-new/SKILL.md)。
|
|
97
132
|
|
|
133
|
+
自动准备启动使用 `flywheel-task`,其契约在 Spec 的 `workflow` 中记录 mode、
|
|
134
|
+
版本、代码依据、风险与资格判断,字段见[工作流配置](configuration.md#工作流策略与恢复)。
|
|
135
|
+
只有模型写了“low risk”不能取得 Quick;Go 校验结构与声明,执行和最终评审再
|
|
136
|
+
检查实际候选。没有 workflow 字段的旧契约保留 Full。
|
|
137
|
+
|
|
98
138
|
按已有 Git 授权保存审阅后的契约,仅选择本任务文件:
|
|
99
139
|
|
|
100
140
|
```sh
|
|
@@ -144,38 +184,46 @@ flywheel control start --cwd "$PWD" --task-dir "$PWD/docs/my-feature"
|
|
|
144
184
|
flywheel control status --cwd "$PWD" --task-dir "$PWD/docs/my-feature"
|
|
145
185
|
```
|
|
146
186
|
|
|
187
|
+
新统一入口可将 start 换成 `control launch ... --mode auto`;它消费已经准备的
|
|
188
|
+
契约,默认请求 Auto。`start`/前台 `run` 可带 `--mode auto|quick|full`,省略时
|
|
189
|
+
保留契约或持久化策略。旧状态不会因新增 --mode 而静默跳过原来的 Full 阶段,
|
|
190
|
+
恢复也不会重新分类或从 Full 降为 Quick。
|
|
191
|
+
|
|
147
192
|
预检不发送模型推理,不能证明账号额度或真实模型调用已经通过。启动会实际调用
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
193
|
+
所选模型。DSH `flywheel_launch` 与 `flywheel_control` start 将明确的 `taskDir`
|
|
194
|
+
和 `cwd` 关联到发起会话的 Flywheel 视图;单纯 shell 调 CLI 不会创建桌面会话关联。
|
|
195
|
+
终端启动或另开已有任务时,仍可手动填“任务资料目录”和“项目目录”。后者仅在
|
|
196
|
+
会话当前目录已经是同一 `repo_dir` 时可留空。插件通过公开
|
|
197
|
+
`workingDirectory.get(session)` 读取目录;不扫描或猜测。仅在 shell 中 `cd`
|
|
198
|
+
不会改变 DSH 的会话目录,不要混用原 checkout 的账本和新 worktree。
|
|
199
|
+
|
|
200
|
+
Full 的每个 packet 经实现、L1 与独立 Review 通过后,引擎提交并快进合入任务分支,
|
|
201
|
+
全部 packet 完成后仍需集成 L2/L3 与 Judge。Quick 在实际 packet 候选中先执行
|
|
202
|
+
所有适用 L2/L3,再作覆盖全部需求的一次最终 Review,然后持久化同一候选。
|
|
203
|
+
两种流程都必须核对 `state.status` 与交付证据;单元合并不等于整个需求完成。
|
|
157
204
|
合并冲突或验证失败时保留产物并处理记录,不强制清理。停止与恢复见
|
|
158
205
|
[入门教程](getting-started.md#7-启动观察停止与恢复)。
|
|
159
206
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
207
|
+
若派发、结果或清理未知,引擎停止自动执行并保留工作区和调用记录。先核对本次调用
|
|
208
|
+
拥有的 worker、guardian 和 app-server;外层退出或等待几秒不证明内部进程已停止,
|
|
209
|
+
子进程退出也不证明模型结果已知。Go 仅消费匹配原始身份与证据的可信终态回执,不能
|
|
210
|
+
通过切 fresh、换目录、换后端或重置 state 绕过未知调用。没有可核对回执的中断仍阻断。
|
|
164
211
|
|
|
165
212
|
### 5.1 Skills 入口与各 Loop 的工作目录
|
|
166
213
|
|
|
167
214
|
内置 skills 将任务 worktree 约定作为准备、启动、恢复和单环入口的检查步骤。
|
|
168
|
-
`flywheel-new` 在生成契约前创建或复用任务 worktree;`flywheel-run` 以及单环
|
|
215
|
+
`flywheel-task`/`flywheel-new` 在生成契约前创建或复用任务 worktree;`flywheel-run` 以及单环
|
|
169
216
|
skills 从实际任务目录解析同一 worktree 根,再调用 CLI。默认不从 `main`、
|
|
170
217
|
`master` 或 detached HEAD 启动开发;已有明确工作区选择与授权不重复询问。
|
|
171
218
|
恢复复用原任务路径及引擎保存的 packet 状态,不为恢复另建一份任务或复制 state。
|
|
172
219
|
|
|
173
220
|
| 阶段/入口 | 实际工作目录 | 谁负责选择或创建 |
|
|
174
221
|
|---|---|---|
|
|
175
|
-
| `flywheel-new` 准备契约 | 任务集成 worktree | 宿主 Agent 按 skill 创建或复用 |
|
|
176
|
-
| Plan | 任务集成 worktree,修订任务契约 | 引擎使用启动时的根目录 |
|
|
222
|
+
| `flywheel-task`/`flywheel-new` 准备契约 | 任务集成 worktree | 宿主 Agent 按 skill 创建或复用 |
|
|
223
|
+
| Full Plan/升级后修订 | 任务集成 worktree,修订任务契约 | 引擎使用启动时的根目录 |
|
|
177
224
|
| Execute、L1、Review | 当前 packet 候选工作区;正常模式为 packet worktree | 引擎创建、记录并复用 packet worktree |
|
|
178
|
-
| L2/L3
|
|
225
|
+
| Quick 适用 L2/L3 | 同一 packet 候选工作区,先于最终 Review | 引擎不能使用尚未集成修改的旧 checkout |
|
|
226
|
+
| Full L2/L3、Judge | 任务集成 worktree | 引擎验证已集成的需求与里程碑 |
|
|
179
227
|
| Intake、Garden | 所选任务所属 worktree | 入口解析目录,Go 写建议结果 |
|
|
180
228
|
| Status、Stop | 对应原任务路径与根目录 | 直接查询或停止,不要求为此新建 worktree、切分支或提交 |
|
|
181
229
|
|
|
@@ -189,8 +237,32 @@ Plan/Execute 请求 `workspace-write`,Review/Judge 以及 DSH/Codex(
|
|
|
189
237
|
各 Loop 不会各自新建一份 worktree。任务 worktree 贯穿整个需求,
|
|
190
238
|
packet worktree 贯穿该单元的执行、验收与评审;完成交付才由引擎处理本地合并
|
|
191
239
|
与清理。恢复入口仍是 `flywheel-run`,没有另一个独立的 resume skill。
|
|
192
|
-
|
|
193
|
-
|
|
240
|
+
|
|
241
|
+
Go 串行调度 packet,不依赖一个持续存活的父模型会话监督。`sessions.mode=scoped`
|
|
242
|
+
允许同 packet 的 Executor 返修续用,以及独立 Reviewer 在同范围复审时续用自己的
|
|
243
|
+
历史;每次复审仍完整检查当前候选、契约和适用需求,不能只关闭上轮 findings。
|
|
244
|
+
Plan 按同任务/里程碑续用,Judge 与第二意见各自隔离;显式 Plan
|
|
245
|
+
`resident-session:false` 继续生效。团队通信和依赖图并行调度不在本期范围。
|
|
246
|
+
|
|
247
|
+
新配置模板显式启用 scoped,旧文件未声明时保留 fresh。fresh 不启用通用的角色历史
|
|
248
|
+
复用,保留旧 Kimi Plan resident 选项;两种模式都为 Codex Pro/Claude Code Pro/DSH/Kimi 主任务
|
|
249
|
+
调用保存安全记录。其他适配器、mock 及 Intake/Garden 保留原路径。历史复用不减少
|
|
250
|
+
任何验证要求,也不增加 Quick 首次成功的两次固定阶段调用。具体契约见
|
|
251
|
+
[会话配置](configuration.md#会话策略历史复用与调用安全)。
|
|
252
|
+
|
|
253
|
+
恢复保存的回执时沿用原调用的候选、契约和保护证据;不得重新执行抽检或验收来替换
|
|
254
|
+
待消费回执所绑定的证据。Go 对已完成结果的消费不重发模型请求或重复计费;预算限制
|
|
255
|
+
新的派发。Codex/Claude 的 P3 通过公开 typed lifecycle、Go 持久化 ACK 与原调用
|
|
256
|
+
journal 只读核对恢复;成功回执还必须绑定原调用结束时保存的候选与角色证据。
|
|
257
|
+
P4 提供按角色的 fresh/scoped、有界质量重建及三组对照评估;阈值默认关闭,真实模型
|
|
258
|
+
效果另验,详见[中断恢复与上下文质量](session-recovery.md)和[对照评估](session-evaluation.md)。
|
|
259
|
+
|
|
260
|
+
`flywheel-verify` 只运行确定性验收:Full 保留指定 packet 的 L1/当前里程碑
|
|
261
|
+
L2/L3 语义;Quick 还会在实际候选上收齐适用 L2/L3。它不调用 Review/Judge,
|
|
262
|
+
不创建 worktree,也不交付任务。Quick 的 `--only review` 是最终 Review;若发现
|
|
263
|
+
验收缺口或资格失效,Go 当即保存单向 Full 升级,下一次完整 run 才进入 Full。
|
|
264
|
+
`--only plan` 则要求 Full,确需规划时显式 `--mode full` 由引擎升级。
|
|
265
|
+
`--only execute` 始终只是 Execute/L1 子环,不等于完整 Quick。
|
|
194
266
|
|
|
195
267
|
Skill 的启动检查由宿主 Agent 遵守,CLI/GUI 直接调用不会自动执行这些 skill
|
|
196
268
|
正文,也不会自动创建外层任务分支。直接使用控制接口时仍须显式选择正确的
|
package/npm/install.js
CHANGED
|
@@ -227,7 +227,7 @@ function launcherContent({ cli, prefix, dshBin, environment = process.env }) {
|
|
|
227
227
|
return lines.join("\n");
|
|
228
228
|
}
|
|
229
229
|
|
|
230
|
-
async function writeLauncher({ directory, previous, cli, prefix, worker, codexProWorker, adapter, dshBin, environment }) {
|
|
230
|
+
async function writeLauncher({ directory, previous, cli, prefix, worker, codexProWorker, claudeCodeProWorker, adapter, dshBin, environment }) {
|
|
231
231
|
await fsp.mkdir(directory, { recursive: true });
|
|
232
232
|
const launcher = path.join(directory, "npm-launcher");
|
|
233
233
|
const content = launcherContent({ cli, prefix, dshBin, environment });
|
|
@@ -240,7 +240,7 @@ async function writeLauncher({ directory, previous, cli, prefix, worker, codexPr
|
|
|
240
240
|
}
|
|
241
241
|
} catch (error) { if (error.code !== "ENOENT") throw error; }
|
|
242
242
|
await atomicWrite(launcher, content, 0o755);
|
|
243
|
-
const receipt = { protocol: 1, owner: OWNER, version: meta.version, prefix, cli, worker, codexProWorker, adapter,
|
|
243
|
+
const receipt = { protocol: 1, owner: OWNER, version: meta.version, prefix, cli, worker, codexProWorker, claudeCodeProWorker, adapter,
|
|
244
244
|
node: process.execPath, launcher: { path: launcher, sha256: digest(content) } };
|
|
245
245
|
await atomicWrite(path.join(directory, "installation.json"), JSON.stringify(receipt, null, 2) + "\n", 0o600);
|
|
246
246
|
return receipt;
|
|
@@ -315,12 +315,12 @@ async function install(options, { environment = process.env, cwd = process.cwd()
|
|
|
315
315
|
const installedRequire = createRequire(path.join(installedRoot, "package.json"));
|
|
316
316
|
const runtime = installedRequire("./bin/runtime.js");
|
|
317
317
|
report.paths = { cli: path.join(installedRoot, "bin", "flywheel.js"), native: runtime.loadNativePath(), worker: runtime.loadWorkerPath(),
|
|
318
|
-
codexProWorker: runtime.loadCodexProWorkerPath() };
|
|
318
|
+
codexProWorker: runtime.loadCodexProWorkerPath(), claudeCodeProWorker: runtime.loadClaudeCodeProWorkerPath() };
|
|
319
319
|
const probe = await run(process.execPath, [report.paths.codexProWorker, '--doctor']);
|
|
320
320
|
requireSuccess(probe, 'installed Codex Pro dependency');
|
|
321
321
|
const adapter = parseDocument(probe, 'installed Codex Pro dependency');
|
|
322
322
|
if (adapter.protocol !== 1 || adapter.type !== 'doctor' || adapter.package !== 'dsh-subagent-codex-pro' ||
|
|
323
|
-
adapter.version !== '0.
|
|
323
|
+
adapter.version !== '0.9.0' || adapter.machineProtocol !== 1 || adapter.available !== true || adapter.inferenceTested !== false) {
|
|
324
324
|
throw new Error('installed Codex Pro dependency did not verify the exact public machine API');
|
|
325
325
|
}
|
|
326
326
|
report.adapter = { package: adapter.package, version: adapter.version, protocol: adapter.machineProtocol, inferenceTested: false };
|
|
@@ -358,7 +358,7 @@ async function install(options, { environment = process.env, cwd = process.cwd()
|
|
|
358
358
|
const dshBin = findExecutable(requestedDsh, environment);
|
|
359
359
|
await step("desktop-launcher", async item => {
|
|
360
360
|
const receipt = await writeLauncher({ directory, previous, cli: report.paths.cli, prefix, worker: report.paths.worker,
|
|
361
|
-
codexProWorker: report.paths.codexProWorker, adapter: report.adapter, dshBin, environment });
|
|
361
|
+
codexProWorker: report.paths.codexProWorker, claudeCodeProWorker: report.paths.claudeCodeProWorker, adapter: report.adapter, dshBin, environment });
|
|
362
362
|
report.paths.launcher = receipt.launcher.path;
|
|
363
363
|
item.path = receipt.launcher.path;
|
|
364
364
|
});
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ckanner/flywheel",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.29.1",
|
|
4
4
|
"description": "A deterministic Go orchestrator for coding-agent loops, with task contracts, verification gates, Git worktrees, and DSH desktop integration.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"flywheel": "bin/flywheel.js",
|
|
7
7
|
"flywheel-dsh-worker": "bin/flywheel-dsh-worker.js",
|
|
8
|
-
"flywheel-codex-pro-worker": "bin/flywheel-codex-pro-worker.js"
|
|
8
|
+
"flywheel-codex-pro-worker": "bin/flywheel-codex-pro-worker.js",
|
|
9
|
+
"flywheel-claude-code-pro-worker": "bin/flywheel-claude-code-pro-worker.js"
|
|
9
10
|
},
|
|
10
11
|
"os": [
|
|
11
12
|
"darwin",
|
|
@@ -37,13 +38,19 @@
|
|
|
37
38
|
"docs/en/configuration.md",
|
|
38
39
|
"docs/en/model-policy.md",
|
|
39
40
|
"docs/en/workflow.md",
|
|
40
|
-
"docs/examples/create-first-task.sh"
|
|
41
|
+
"docs/examples/create-first-task.sh",
|
|
42
|
+
"docs/claude-code-pro.md",
|
|
43
|
+
"docs/en/claude-code-pro.md",
|
|
44
|
+
"docs/session-recovery.md",
|
|
45
|
+
"docs/en/session-recovery.md",
|
|
46
|
+
"docs/session-evaluation.md",
|
|
47
|
+
"docs/en/session-evaluation.md"
|
|
41
48
|
],
|
|
42
49
|
"optionalDependencies": {
|
|
43
|
-
"@ckanner/flywheel-darwin-arm64": "0.
|
|
44
|
-
"@ckanner/flywheel-darwin-amd64": "0.
|
|
45
|
-
"@ckanner/flywheel-linux-arm64": "0.
|
|
46
|
-
"@ckanner/flywheel-linux-amd64": "0.
|
|
50
|
+
"@ckanner/flywheel-darwin-arm64": "0.29.1",
|
|
51
|
+
"@ckanner/flywheel-darwin-amd64": "0.29.1",
|
|
52
|
+
"@ckanner/flywheel-linux-arm64": "0.29.1",
|
|
53
|
+
"@ckanner/flywheel-linux-amd64": "0.29.1"
|
|
47
54
|
},
|
|
48
55
|
"scripts": {
|
|
49
56
|
"release:check": "node scripts/release-preflight.js",
|
|
@@ -51,9 +58,10 @@
|
|
|
51
58
|
"test": "node --test npm/test/*.test.js",
|
|
52
59
|
"test:install": "node --test npm/test/install.integration.js",
|
|
53
60
|
"test:registry": "node npm/test/registry-smoke.js",
|
|
54
|
-
"build:npm": "bash scripts/build-npm.sh 0.
|
|
61
|
+
"build:npm": "bash scripts/build-npm.sh 0.29.1 dist-npm",
|
|
62
|
+
"test:sessions": "node scripts/test-session-evaluation.js"
|
|
55
63
|
},
|
|
56
64
|
"dependencies": {
|
|
57
|
-
"@ckanner/dsh-plugin-flywheel": "0.
|
|
65
|
+
"@ckanner/dsh-plugin-flywheel": "0.29.1"
|
|
58
66
|
}
|
|
59
67
|
}
|