@ckanner/flywheel 0.29.1 → 0.30.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 +11 -0
- package/README.en.md +5 -1
- package/README.md +5 -1
- package/docs/configuration.md +26 -0
- package/docs/en/configuration.md +26 -0
- package/docs/en/flow-console.md +86 -0
- package/docs/en/workflow.md +4 -0
- package/docs/flow-console.md +90 -0
- package/docs/workflow.md +5 -1
- package/package.json +9 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.30.0 — 流程控制台
|
|
4
|
+
|
|
5
|
+
- DSH 横向画布:规划/拆分、调度、任务、集成、终验、PR、Merge;节点运行、重跑与完整证据。
|
|
6
|
+
- 全局/项目配置编辑、逐阶段权限、Provider/模型/thinking 映射及角色历史策略。
|
|
7
|
+
- CLI 运行登记、多任务关联、运行归属与按 invocation 对账的成本/时延/验收统计。
|
|
8
|
+
- 受管 Provider session 交互、核对回执、验证交回与保持暂停退出;会话账本 v2 防止旧引擎忽略接管。
|
|
9
|
+
- 显式依赖/写入范围下的并行 Execute/L1、集中 CAS 与预算、串行 Review/合成候选复验。
|
|
10
|
+
- 明确授权的 PR 推送/创建和精确 HEAD 合并;保留未知或排队中的远端结果。
|
|
11
|
+
|
|
12
|
+
源码门禁与同候选双平台安装已通过;npm 可用性以六包 registry 完整性、公开安装及 latest 复核为准。
|
|
13
|
+
|
|
3
14
|
## 0.29.1
|
|
4
15
|
|
|
5
16
|
- 完成会话 P3 源码:Codex Pro 0.9.0/Claude Code Pro 0.4.0 公开 lifecycle v1、独立 durable journal 与只读 recovery,经 worker v3 接入 Go。派发检查点先 fsync 再 ACK;恢复终态仍绑定原候选和角色 guard,未知不盲目重放。
|
package/README.en.md
CHANGED
|
@@ -104,7 +104,7 @@ flywheel control status --cwd "$PWD" --task-dir "$PWD/docs/my-feature"
|
|
|
104
104
|
|
|
105
105
|
`control launch` defaults to Auto and consumes prepared contracts; it does not invent requirements or create the outer task branch. `control start` and foreground `run` preserve the contract/persisted selection when `--mode` is omitted. Their optional mode is `auto|quick|full`; Go still enforces eligibility and one-way upgrade rules. `--only execute` is a partial loop, not Quick or complete delivery.
|
|
106
106
|
|
|
107
|
-
Packet delivery is a **local Git operation**. After evidence matches the current candidate, the engine commits the packet and fast-forwards it into the branch checked out at `cwd`. With the recommended layout, that is the task integration branch.
|
|
107
|
+
Packet delivery is a **local Git operation**. After evidence matches the current candidate, the engine commits the packet and fast-forwards it into the branch checked out at `cwd`. With the recommended layout, that is the task integration branch. Ordinary run does not publish remotely. Explicit console/CLI delivery controls can push a verified commit, create a PR and merge its exact head after authorization; release publication remains a separate operation. See [Workflow](docs/en/workflow.md) for commands, directory ownership, and merge timing.
|
|
108
108
|
|
|
109
109
|
### Desktop task controls
|
|
110
110
|
|
|
@@ -163,3 +163,7 @@ Maintainers can build the six packages from a tagged source checkout and use the
|
|
|
163
163
|
## License status
|
|
164
164
|
|
|
165
165
|
The package currently declares **`UNLICENSED`**. An open-source license has not been selected; these English documents do not change the repository's visibility or licensing status.
|
|
166
|
+
|
|
167
|
+
### Workflow console (current source)
|
|
168
|
+
|
|
169
|
+
The DSH view adds a horizontal task canvas, stage run/retry, per-stage configuration, controlled Provider-session interaction, declared parallel execution with serial integration, observed run metrics and PR/Merge receipts. See the [console guide](docs/en/flow-console.md). Source implementation does not imply npm publication or a local upgrade.
|
package/README.md
CHANGED
|
@@ -152,7 +152,7 @@ Quick 不省略仓库门禁、适用 L2/L3、缺陷注入或 Git 持久化检查
|
|
|
152
152
|
阶段 Agent 调用(Execute、最终 Review),不含宿主准备、内部工具轮次与重试。
|
|
153
153
|
旧任务缺少新字段仍为 Full;恢复沿用持久化策略,Full 不因重启自动降为 Quick。
|
|
154
154
|
|
|
155
|
-
业务仓库建议先建立任务集成分支与独立 worktree;准备契约、Draft PR 和人工合并的完整流程见[从需求准备到 PR 合并](docs/workflow.md)。引擎的单元合并目标是启动 checkout 当前所在分支,GitHub PR
|
|
155
|
+
业务仓库建议先建立任务集成分支与独立 worktree;准备契约、Draft PR 和人工合并的完整流程见[从需求准备到 PR 合并](docs/workflow.md)。引擎的单元合并目标是启动 checkout 当前所在分支,GitHub PR 操作由使用者或获授权的宿主执行,也可使用[流程控制台](docs/flow-console.md)的明确授权入口。
|
|
156
156
|
|
|
157
157
|
准备阶段由当前 DSH 对话模型生成需求契约,`loops.plan` 只控制引擎启动后的规划/修订。复杂需求建议先用已授权的 `gpt-6-astra`、`high` 生成可审阅草稿;简单明确的任务可沿用 Flash,避免每个 packet 都重复调用昂贵规划模型。
|
|
158
158
|
|
|
@@ -285,3 +285,7 @@ npm run build:npm
|
|
|
285
285
|
## 许可证
|
|
286
286
|
|
|
287
287
|
当前源码与 Flywheel npm 包标记为 `UNLICENSED`,尚未授予开源许可证。英文文档和公开 npm 分发不改变这一状态;正式开源时需由维护者选择许可证,并同步源码声明与全部包的 metadata。第三方依赖遵循各自许可证。
|
|
288
|
+
|
|
289
|
+
### 流程控制台(当前源码)
|
|
290
|
+
|
|
291
|
+
DSH 会话视图提供从左到右的任务画布、节点运行/重跑、按阶段配置、受管 Session 交互、声明式并行与串行集成、运行指标和 PR/Merge 回执。完整操作与当前能力边界见[控制台指南](docs/flow-console.md)。源码状态不等于 npm 已发布或本机已升级。
|
package/docs/configuration.md
CHANGED
|
@@ -407,3 +407,29 @@ lifecycle/recovery 导出、Node >=22.18.0 与 Codex 命令版本;同一 wor
|
|
|
407
407
|
任何 probe 都不发送 `session/prompt`、不运行 L1/L2/L3、不写 Flywheel 状态或创建工作树;SDK 初始化可能访问 provider 目录并产生自己的会话/缓存文件。只读指 Flywheel 配置与任务状态,不表示整个宿主文件系统绝对无写入。
|
|
408
408
|
|
|
409
409
|
桌面面板、`/flywheel` 和 `flywheel_control` 共用 `control config|doctor`,可省略 taskDir;只有 doctor 支持 `probe:true`。诊断阻断与传输失败分开显示。桌面使用的 PATH/profile/环境可能与终端不同,安装后应在面板里再检查一次。
|
|
410
|
+
|
|
411
|
+
### 在流程控制台编辑配置
|
|
412
|
+
|
|
413
|
+
DSH 的「全局 / 项目配置」先读取显式作用域和文件 revision,再编辑模型绑定、角色会话策略、预算、超时、重试或全局权限。保存前显示字段差异。目标文件被其他编辑器修改时拒绝覆盖,保存结果未确认时先重新读取核对。新项目文件以当前版本默认模板创建完整配置,项目文件优先于全局,任务文件优先于项目。
|
|
414
|
+
|
|
415
|
+
高级调用通过 stdin 传入 JSON。读取示例使用 `flywheel control config-edit --cwd /absolute/repo`,输入为 `{"scope":"project"}`。保存使用 `control config-save`,输入包含 scope、读取返回的 revision,以及仅包含改动章节的 values。reset=true 从内嵌默认完整模板开始替换。配置保存创建备份并原子发布,下一次引擎启动时加载。
|
|
416
|
+
|
|
417
|
+
### 控制台权限与调度
|
|
418
|
+
|
|
419
|
+
`permissions.bindings` 在全局 `permissions.mode` 上按 `loops.<role>`、`routes.<route>`、`judge-panel` 覆盖实际宿主权限,值为 `read-only`、`workspace-write` 或 `danger-full-access`。语法以 `permission-policy.schema.json` 为准;后端仍须证明支持该权限,不会把 Claude 原生审批模式伪装成只读沙箱。
|
|
420
|
+
|
|
421
|
+
`scheduler` 的字段以 `scheduler-policy.schema.json` 为准。默认 serial;parallel 只并发满足冻结 `schedule.after/writes` 的独立单元,`max-parallel` 控制任务并发,`providers` 按实际账号渠道限流。hard 预算在确认计费前只允许一个模型调用。声明缺失或写入冲突不会被解释为独立。
|
|
422
|
+
|
|
423
|
+
例如把 Review 固定为只读,并允许两个已声明独立的任务并行:
|
|
424
|
+
|
|
425
|
+
```json
|
|
426
|
+
{
|
|
427
|
+
"permissions": {
|
|
428
|
+
"mode": "full-access",
|
|
429
|
+
"bindings": {"loops.review":"read-only","routes.hard":"workspace-write"}
|
|
430
|
+
},
|
|
431
|
+
"scheduler": {"mode":"parallel","max-parallel":2,"providers":{"deepseek-account":1}}
|
|
432
|
+
}
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
这是字段片段,不是可直接替代完整配置的文件。控制台按实际文件读取完整草稿并校验后保存。CLI 运行索引、受管 Session 交互、指标完整性和 PR/Merge 权限边界见[流程控制台](flow-console.md)。
|
package/docs/en/configuration.md
CHANGED
|
@@ -352,3 +352,29 @@ Codex Pro checks actually import the public API and verify exact version 0.9.0/p
|
|
|
352
352
|
No probe sends an inference prompt, runs L1/L2/L3, creates a worktree, or writes Flywheel task state. SDK initialization may contact a provider's catalog and write its own cache/session files; read-only here is scoped to Flywheel state and configuration. Recheck in the desktop panel because its PATH/profile/environment may differ from the terminal.
|
|
353
353
|
|
|
354
354
|
Repository references: [inline defaults](https://github.com/ckanner/flywheel/blob/main/templates/flywheel.config.example.json), [complete profiles](https://github.com/ckanner/flywheel/blob/main/templates/flywheel.profiles.example.json), [design](https://github.com/ckanner/flywheel/blob/main/docs/design.md), and [worker protocol](https://github.com/ckanner/flywheel/blob/main/plugins/dsh/PROTOCOL.md).
|
|
355
|
+
|
|
356
|
+
### Editing configuration in the workflow console
|
|
357
|
+
|
|
358
|
+
The Global / project configuration view first reads an explicit scope and file revision. Edit model bindings, role history policies, budget, timeouts, retries or the global permission policy, then review section changes before saving. Concurrent edits reject replacement; reread an unconfirmed save before proceeding. New project files use the current version's complete default template. Task files override project files, which override global configuration.
|
|
359
|
+
|
|
360
|
+
Advanced callers send JSON on stdin to `flywheel control config-edit --cwd /absolute/repo`, with `{"scope":"project"}`. Save through `control config-save` using scope, the returned revision and values containing changed sections only. With reset=true, replacement starts from the full embedded default template. Saving creates a backup and publishes atomically; the next engine start loads the file.
|
|
361
|
+
|
|
362
|
+
### Console permissions and scheduling
|
|
363
|
+
|
|
364
|
+
`permissions.bindings` overrides the global mode by `loops.<role>`, `routes.<route>` or `judge-panel`, using read-only, workspace-write or danger-full-access. Read `permission-policy.schema.json` for the contract. Adapters must still prove the requested capability; native Claude approval modes are not advertised as an OS read-only sandbox.
|
|
365
|
+
|
|
366
|
+
`scheduler` is defined by `scheduler-policy.schema.json`. Serial is the default. Parallel only dispatches independent units declared by frozen schedule.after/writes; max-parallel limits units and providers limits actual account channels. Hard budgets admit one model call until its accounting is durable. Missing declarations and overlapping write scopes are not independence.
|
|
367
|
+
|
|
368
|
+
For example:
|
|
369
|
+
|
|
370
|
+
```json
|
|
371
|
+
{
|
|
372
|
+
"permissions": {
|
|
373
|
+
"mode": "full-access",
|
|
374
|
+
"bindings": {"loops.review":"read-only","routes.hard":"workspace-write"}
|
|
375
|
+
},
|
|
376
|
+
"scheduler": {"mode":"parallel","max-parallel":2,"providers":{"deepseek-account":1}}
|
|
377
|
+
}
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
This is a field excerpt, not a complete configuration replacement. The console reads and validates the complete selected file. See the [console guide](flow-console.md) for run indexing, controlled session interaction, observation completeness and remote-delivery authority.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Flywheel workflow console
|
|
2
|
+
|
|
3
|
+
This guide describes the current source. Source, development candidates, local installation and npm publication are separate acceptance boundaries. Keep the CLI, platform packages and DSH plugin at one version.
|
|
4
|
+
|
|
5
|
+
## Configuration
|
|
6
|
+
|
|
7
|
+
The Flywheel conversation view remains after Statistics. Its pages are Workflow canvas, Global/project configuration, and Runs and comparison. Global settings require no task directory. Project settings target the selected Git root. Discovery still selects one complete file in task → project → global → embedded order; it does not deep-merge files.
|
|
8
|
+
|
|
9
|
+
Read a draft, edit the resource/Harness, model, effort, permissions and history policy, then inspect the target and diff. Version defaults replace the complete configuration. Go checks the content revision, backs up the original and publishes atomically. A running engine retains its snapshot; subsequent starts load the new settings.
|
|
10
|
+
|
|
11
|
+
Resources include ChatGPT through DSH or Codex Pro, Kimi Code, DeepSeek Account (Flash by default), and optional Claude Code Pro. Defaults come from the embedded template. Use config inspect and doctor for actual backend capabilities. An absent peer or unsupported permission fails explicitly. Provider sign-in stays with its normal account flow.
|
|
12
|
+
|
|
13
|
+
`permissions.bindings` overrides `loops.<role>`, `routes.<route>` or `judge-panel`. Unspecified bindings use the global policy. History overrides are role-based: execution routes share the execute policy while each packet keeps its own session. Scoped continuation requires the same task, role, goal and eligible binding; fresh also retains invocation-safety records.
|
|
14
|
+
|
|
15
|
+
## Canvas and operations
|
|
16
|
+
|
|
17
|
+
The left-to-right canvas shows Plan/decomposition, scheduling, task branches, integration, final acceptance, PR and Merge. A packet expands into Execute, L1, Review and Git delivery. State colors have text labels. Details identify the DSH source conversation, project/worktree, branch, HEAD, run ID, actual invocation binding and failure evidence.
|
|
18
|
+
|
|
19
|
+
The canvas supports panning, locating the current node and packet paging. Large tasks use bounded diagnostic excerpts. Read full node evidence loads one packet with a matching fresh canvas revision; it never changes the original ledger.
|
|
20
|
+
|
|
21
|
+
- Run stage submits the observed revision for lease-bound admission.
|
|
22
|
+
- Continue once records a reason and adds one Execute/L1 attempt without resetting failures or billing.
|
|
23
|
+
- Reopening a completed packet archives old evidence and invalidates downstream acceptance.
|
|
24
|
+
- Git delivery requires current L1 and independent Review evidence.
|
|
25
|
+
- Final acceptance runs milestone gates and Judge without starting Plan or unfinished execution units.
|
|
26
|
+
- Continue workflow resumes the persisted Full or ultraWork/Quick policy.
|
|
27
|
+
- Stop waits for managed work to settle; closing a view is not a stop.
|
|
28
|
+
|
|
29
|
+
Explicitly independent packets with satisfied dependencies can be run ahead in isolated worktrees. Integration changes invalidate old acceptance. Each asynchronous node operation records running/passed/failed/cancelled and its reason. Quick retains deterministic checks and independent final Review; omitted Plan/Judge stages are not presented as passes.
|
|
30
|
+
|
|
31
|
+
## Parallel execution
|
|
32
|
+
|
|
33
|
+
Read `flywheel template scheduler-policy.schema.json` for the current fields and bounds. For example:
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
{"scheduler":{"mode":"parallel","max-parallel":2,"providers":{"deepseek-account":1}}}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Provider-limit keys are account channel names. Eligibility comes from frozen packet contracts:
|
|
40
|
+
|
|
41
|
+
```yaml
|
|
42
|
+
schedule:
|
|
43
|
+
after: [M01-T01]
|
|
44
|
+
writes: [src/search/, tests/search/]
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Dependencies reference earlier known packet IDs. Writes are normalized relative paths or directory prefixes, without globs or escapes. Include ordinary tests/configuration and account for shared test resources. Undeclared independence, overlapping scopes and live-credential units remain serial.
|
|
48
|
+
|
|
49
|
+
Only Execute/L1 run concurrently. Each unit has a worktree; one Go coordinator serializes CAS writes and accounting. Hard budgets admit only one model call at a time, retaining its slot through durable accounting. Other modes enforce total and channel concurrency. Cancellation awaits every started worker.
|
|
50
|
+
|
|
51
|
+
Review, integration and milestone gates remain serial. A combined candidate is revalidated after incorporating earlier work. Bounded execution failures retain their escalation policy. Integration conflicts and failed gates preserve the worktree and evidence. Write scopes are orchestration/acceptance contracts; full access is not an OS sandbox.
|
|
52
|
+
|
|
53
|
+
## Controlled Provider session interaction
|
|
54
|
+
|
|
55
|
+
Read latest response opens the exact digest-bound receipt, not an invented native history path or a claim of complete provider history.
|
|
56
|
+
|
|
57
|
+
A settled, consumed, eligible packet session can be claimed. The persisted handoff prevents automatic run/step from continuing. Both the desktop prompt form and managed terminal restore that exact thread through its adapter and keep budgets/accounting. Missing history, changed bindings or a required rebuild cannot silently become a cold start.
|
|
58
|
+
|
|
59
|
+
```sh
|
|
60
|
+
cd -- '/absolute/task-worktree'
|
|
61
|
+
flywheel session '/absolute/task-worktree/docs/task-slug' --key 'execute/M01-T01'
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Each terminal line is a prompt. `/history` reads the latest response; `/reconcile` checks the original invocation; `/return` validates and returns; `/release` releases human control while staying paused; `/quit` retains the handoff. The desktop form supports multiline prompts.
|
|
65
|
+
|
|
66
|
+
Returning runs L1, applicable Quick gates and independent Review. Human text is not a passing verdict. Candidate-bound human-takeover evidence allows normal subsequent delivery. Release does not claim verification and cannot bypass unknown effects or cleanup. Milestone sessions currently expose read-only responses; interactive handoff is packet-scoped.
|
|
67
|
+
|
|
68
|
+
Ledger storage v2 is accepted by the new engine alongside legacy v1. Older engines reject v2 rather than ignoring human ownership. Session policy-version remains 1; worker/lifecycle versions are independent.
|
|
69
|
+
|
|
70
|
+
## Discovery and comparison
|
|
71
|
+
|
|
72
|
+
CLI and desktop starts register run IDs. A conversation retains multiple confirmed task associations. The index lives in runs/ beside the global configuration, optionally overridden by absolute FLYWHEEL_RUNS_DIR. It shows the latest 100 registrations and never scans the disk. Query Go again for liveness.
|
|
73
|
+
|
|
74
|
+
Compare operation kind, branch, HEAD, contract/configuration conditions, elapsed time and newly observed attempts, failures and deliveries. Select an exact run or all calls for the current task, including unregistered legacy observations. Invocation/receipt reconciliation precedes aggregation; late receipts keep their original attribution and are not double-billed.
|
|
75
|
+
|
|
76
|
+
Usage, cost and duration are known amounts, with missing/partial observations retained. Costs may include estimates from configured prices. Call failure rate is not code quality. Different conditions permit descriptive comparison only; quality conclusions require acceptance evidence and an independent oracle.
|
|
77
|
+
|
|
78
|
+
## PR and Merge
|
|
79
|
+
|
|
80
|
+
Inspect the project and remote first. Writes require normal GitHub CLI authentication, completed local acceptance, a still-valid candidate, and explicit repository/HEAD/base authorization. A changed registered repository identity is rejected. Fetch and push URLs must identify the same repository.
|
|
81
|
+
|
|
82
|
+
Push uses the approved commit and named task branch, without force, implicit tags or recursive submodule pushes. A separate remote task branch does not require switching the local checkout. Requery after push so an earlier Draft PR is updated instead of duplicated.
|
|
83
|
+
|
|
84
|
+
Merge rechecks the PR, head, base and checks, using `--match-head-commit`. It never uses admin bypass or enables auto-merge on its own. Merge-queue acceptance and actual MERGED state remain distinct; see the [GitHub CLI contract](https://cli.github.com/manual/gh_pr_merge).
|
|
85
|
+
|
|
86
|
+
Retries reconcile existing PR/merge results before mutations. Missing receipts remain unknown. Remote state is separate from local engine completion. Publication must bind the actual merge commit and artifacts for its own validation; Merge does not automatically publish npm packages or deploy.
|
package/docs/en/workflow.md
CHANGED
|
@@ -210,3 +210,7 @@ For a delivery conflict, preserve the packet worktree, inspect Git state, resolv
|
|
|
210
210
|
The engine owns local state, bounded loops, verification, and Git delivery. The authorized host/user owns task-branch setup, GitHub pushes and PRs, remote CI policy, PR merge, and publication. Repository visibility and licensing are separate decisions.
|
|
211
211
|
|
|
212
212
|
Implementation references: [engine](https://github.com/ckanner/flywheel/blob/main/internal/machine/run.go), [Git/worktree operations](https://github.com/ckanner/flywheel/blob/main/internal/verify/verify.go), [design](https://github.com/ckanner/flywheel/blob/main/docs/design.md), and [bundled skills](https://github.com/ckanner/flywheel/tree/main/skills). Additional documentation: [Git worktree](https://git-scm.com/docs/git-worktree) and [GitHub auto-merge](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/automatically-merging-a-pull-request).
|
|
213
|
+
|
|
214
|
+
## Interactive console delivery
|
|
215
|
+
|
|
216
|
+
The [workflow console](flow-console.md) adds stage controls, handoff, declared parallelism and explicitly authorized PR/Merge operations. Local completion does not authorize remote writes. An earlier Draft PR is reconciled after push; publication validates the actual merge commit separately.
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Flywheel 流程控制台
|
|
2
|
+
|
|
3
|
+
本文描述当前源码中的控制台。源码、开发候选、本机安装与 npm 正式发行分别验收;不要仅凭本文判断 `@latest` 已包含这些功能。CLI、平台包和 DSH 插件必须同版。
|
|
4
|
+
|
|
5
|
+
## 从配置开始
|
|
6
|
+
|
|
7
|
+
DSH 的 Flywheel 会话视图仍排在“统计”之后。内部有“运行画布”“全局/项目配置”“运行与对比”。全局配置可在没有任务目录时编辑;项目配置写入所选 Git 项目根。任务配置仍具有最高优先级,取首个完整文件,不做字段深度合并。
|
|
8
|
+
|
|
9
|
+
先读取草稿,再选择 Provider/Harness、模型、推理等级、权限与历史策略。“载入本版本默认值”导入完整默认模板;保存前显示差异与目标,Go 核对内容 revision、备份旧文件并原子写入。正在运行的引擎保留原快照,新配置在后续启动时加载。
|
|
10
|
+
|
|
11
|
+
支持的资源入口包括 ChatGPT · DSH、ChatGPT · Codex Pro、Kimi Code、DeepSeek Account(默认 Flash)及可选 Claude Code Pro。模型初值来自本版本模板,真实能力以 `config inspect`/`doctor` 为准。Claude 的可选适配器必须匹配公开 machine API;缺失或权限不支持会拒绝调用,不自动换后端。账号登录仍由各 Provider 自己完成。
|
|
12
|
+
|
|
13
|
+
`permissions.bindings` 可以覆盖 `loops.<role>`、`routes.<route>` 和 `judge-panel`;未覆盖项使用全局策略。会话策略按角色覆盖:执行 routes 共用 execute 的策略,各 packet 的历史仍隔离。scoped 只续接相同任务、角色、目标和绑定下可恢复的历史;fresh 也保留调用安全账本。
|
|
14
|
+
|
|
15
|
+
## 横向画布与节点操作
|
|
16
|
+
|
|
17
|
+
主线从左到右展示 Plan/拆分、调度、任务分支、集成、终验、PR、Merge。点击任务展开 Execute、L1、Review、Git 交付。状态配合颜色和文字,运行与节点详情展示来源 DSH 会话、项目/worktree、分支、HEAD、run ID、调用绑定和失败证据。
|
|
18
|
+
|
|
19
|
+
画布支持拖动、横移、定位当前节点和分组浏览。大任务使用有界诊断摘要;“读取完整节点证据”按需加载选中节点,revision 与同一时刻的画布状态一起刷新。摘要不会改写原始账本。
|
|
20
|
+
|
|
21
|
+
| 操作 | 含义 |
|
|
22
|
+
|---|---|
|
|
23
|
+
| 运行此阶段 | 提交已观察的 revision;Go 在任务租约内重新检查前置条件 |
|
|
24
|
+
| 人工继续一次 | 填写原因,追加一次 Execute/L1 尝试;保留累计失败和预算 |
|
|
25
|
+
| 已完成单元重跑 | 归档旧证据和提交回执,使当前与后续单元的候选证据失效 |
|
|
26
|
+
| Git 交付 | 只在当前 L1 与独立 Review 通过后持久化当前单元 |
|
|
27
|
+
| 终验 | 已集成单元的 L2/L3 与独立 Judge;不重新调用 Plan 或启动未完成单元 |
|
|
28
|
+
| 继续整个流程 | 由 Go 继续已保存的 Full 或 ultraWork/Quick 策略 |
|
|
29
|
+
| 停止 | 请求 Go 收束在飞子进程;关闭页面不代表停止 |
|
|
30
|
+
|
|
31
|
+
有显式调度声明且依赖已交付的独立 packet 可单独提前执行,仍使用隔离 worktree。合并后的候选变化会使旧验收失效,必须重新验证和 Review。每个异步节点操作保存 running/passed/failed/cancelled 回执,失败原因不会仅留在后台日志。
|
|
32
|
+
|
|
33
|
+
Quick 在 UI 中显示为 ultraWork/Quick;它仍要求确定性验证和独立最终 Review。Plan/Judge 按持久化策略标为不适用,不伪造完成状态。
|
|
34
|
+
|
|
35
|
+
## 串行与并行
|
|
36
|
+
|
|
37
|
+
配置入口为 `scheduler`,字段和边界以 `flywheel template scheduler-policy.schema.json` 为准。例如:
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
{"scheduler":{"mode":"parallel","max-parallel":2,"providers":{"deepseek-account":1}}}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
`providers` 的键是实际账号渠道名。并行资格来自冻结 packet 的声明,而不是模型临时口头建议:
|
|
44
|
+
|
|
45
|
+
```yaml
|
|
46
|
+
schedule:
|
|
47
|
+
after: [M01-T01]
|
|
48
|
+
writes: [src/search/, tests/search/]
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
依赖必须指向较早编号的已知 packet;写入范围是规范相对路径/目录前缀,不支持通配符或越出项目的路径。声明要覆盖实现、普通测试和必要配置,并考虑共享测试服务等真实依赖。未声明独立性、写入范围冲突或需要 live 凭证的单元保留串行。
|
|
52
|
+
|
|
53
|
+
只有 Execute/L1 并发,工作区各自独立;一个 Go 协调器串行 CAS 保存状态和用量。hard 预算只允许一个模型调用在飞,并在下一调用前确认前一笔计费。其他模式按最大并发与渠道限制接纳。停止会等待整批已启动工作收尾。
|
|
54
|
+
|
|
55
|
+
Review、集成与里程碑 gate 保持串行。后续分支吸收已完成成果后,在合成候选上重新验收。执行重试耗尽仍走原有升级策略;集成冲突或门禁失败保留 worktree 和失败证据。`writes` 是调度/验收契约,完全权限本身不提供 OS 沙箱。
|
|
56
|
+
|
|
57
|
+
## 在同一 Provider Session 中接管
|
|
58
|
+
|
|
59
|
+
任务节点显示准确的 Provider session。读取最近回复只读取摘要校验过的原回执,不宣称它是后端的完整历史。
|
|
60
|
+
|
|
61
|
+
已确认收尾、已消费结果、绑定匹配的 packet session 可“暂停并接管”。接管标记持久化后,普通 run/单阶段操作不能绕过它。桌面输入的人工 Prompt 和 `flywheel session` 都通过原适配器恢复那个准确 thread,并继续预算与计费;恢复失败或需要重建时不冷启动替代。
|
|
62
|
+
|
|
63
|
+
```sh
|
|
64
|
+
cd -- '/absolute/task-worktree'
|
|
65
|
+
flywheel session '/absolute/task-worktree/docs/task-slug' --key 'execute/M01-T01'
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
终端每行是一条 Prompt;`/history` 查看最近回复,`/reconcile` 核对原调用,`/return` 验证交回,`/release` 退出接管并保持暂停,`/quit` 保留接管退出。多行 Prompt 可用桌面文本框。
|
|
69
|
+
|
|
70
|
+
“验证并交回”重新运行 L1、适用的 Quick gate 和独立 Review;人工回复本身不是通过证据。Go 保存绑定当前候选的 `human-takeover` 来源,后续正常交付仍由引擎完成。“退出接管”不声称验收成功;结果或清理未知时也不能借此解除阻断。里程碑会话目前提供只读回复,交互接管以 packet 为单位。
|
|
71
|
+
|
|
72
|
+
会话账本存储为 v2,新引擎兼容旧 v1;旧引擎会拒绝 v2,避免忽略接管标记。配置的 `sessions.policy-version` 仍是 1,worker/lifecycle 协议不因此改变。
|
|
73
|
+
|
|
74
|
+
## 发现运行与比较
|
|
75
|
+
|
|
76
|
+
CLI 和桌面启动自动登记 run ID;会话投影保留多个已确认任务。登记位于全局配置旁的 `runs/`,可用绝对 `FLYWHEEL_RUNS_DIR` 覆盖。列表只读取明确登记,显示最近 100 项,不扫描整个磁盘;当前存活状态始终重新查询 Go。
|
|
77
|
+
|
|
78
|
+
对比页面显示操作种类、分支、HEAD、契约/配置条件、运行时长、新增尝试、失败尝试和交付。可选准确 run ID,也可查看本任务全部调用(包括早期未登记记录)。指标先按 invocation/receipt 对账再汇总,迟到回执归属原调用,不重复计费。
|
|
79
|
+
|
|
80
|
+
用量、费用和时延只表示已知量,缺失/部分数据单列,费用也可能来自配置单价估算。调用失败率不等于代码质量;条件不同的运行只并列展示,不伪称配对收益。完整的质量结论需要任务验收和独立 oracle。
|
|
81
|
+
|
|
82
|
+
## 远端 PR 与 Merge
|
|
83
|
+
|
|
84
|
+
在 PR 节点先查询项目与远端状态。远端操作需要 GitHub CLI 的正常登录,以及当前本地任务完成、候选仍有有效验收、明确的仓库/HEAD/目标分支授权。已记录的项目远端发生变化会拒绝交付;fetch 与 push URL 必须指向同一仓库。
|
|
85
|
+
|
|
86
|
+
推送使用已批准的 commit 和明确任务分支,不强推,不隐式跟随 tags 或推送 submodules。可选择独立的远端任务分支,不必切换本地 checkout。推送后重新查询已有 PR,避免把预先创建的 Draft PR 误当成需要重复创建。
|
|
87
|
+
|
|
88
|
+
合并再次核对 PR、源 HEAD、base 和检查状态,并使用 GitHub CLI 的 `--match-head-commit`。不使用 admin 绕过,也不擅自开启 auto-merge。仓库要求 merge queue 时,“请求已接收”和“已合并”分别记录,以远端回执为准。接口语义见 [GitHub CLI 文档](https://cli.github.com/manual/gh_pr_merge)。
|
|
89
|
+
|
|
90
|
+
已确认的创建/合并操作重跑时先核对已有结果。命令失败或回执丢失保留 unknown,不猜测远端成功。PR/Merge 状态与引擎的本地完成分开;发布应绑定实际 merge commit 和发布产物重新验收,不因点击 Merge 自动发布 npm 或部署。
|
package/docs/workflow.md
CHANGED
|
@@ -238,7 +238,7 @@ Plan/Execute 请求 `workspace-write`,Review/Judge 以及 DSH/Codex(
|
|
|
238
238
|
packet worktree 贯穿该单元的执行、验收与评审;完成交付才由引擎处理本地合并
|
|
239
239
|
与清理。恢复入口仍是 `flywheel-run`,没有另一个独立的 resume skill。
|
|
240
240
|
|
|
241
|
-
Go
|
|
241
|
+
Go 按已配置策略和冻结依赖调度 packet,不依赖一个持续存活的父模型会话监督。`sessions.mode=scoped`
|
|
242
242
|
允许同 packet 的 Executor 返修续用,以及独立 Reviewer 在同范围复审时续用自己的
|
|
243
243
|
历史;每次复审仍完整检查当前候选、契约和适用需求,不能只关闭上轮 findings。
|
|
244
244
|
Plan 按同任务/里程碑续用,Judge 与第二意见各自隔离;显式 Plan
|
|
@@ -304,3 +304,7 @@ required checks、审阅要求和授权,再按仓库策略启用;Agent 的 p
|
|
|
304
304
|
[Astra 模型与 effort](https://developers.openai.com/api/docs/models/gpt-6-astra)、
|
|
305
305
|
[Kimi 模型配置](https://www.kimi.com/code/docs/en/kimi-code/models)、
|
|
306
306
|
[Flywheel 设计](design.md)。
|
|
307
|
+
|
|
308
|
+
## 控制台交互交付
|
|
309
|
+
|
|
310
|
+
新的[流程控制台](flow-console.md)提供阶段操作、接管、声明式并行与明确授权的 PR/Merge 入口。普通 run 的本地完成不自动授权远端写入;已有 Draft PR 会在推送后重新核对,Merge 后的发布另按真实 merge commit 验收。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ckanner/flywheel",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.30.0",
|
|
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",
|
|
@@ -34,10 +34,12 @@
|
|
|
34
34
|
"docs/configuration.md",
|
|
35
35
|
"docs/model-policy.md",
|
|
36
36
|
"docs/workflow.md",
|
|
37
|
+
"docs/flow-console.md",
|
|
37
38
|
"docs/en/getting-started.md",
|
|
38
39
|
"docs/en/configuration.md",
|
|
39
40
|
"docs/en/model-policy.md",
|
|
40
41
|
"docs/en/workflow.md",
|
|
42
|
+
"docs/en/flow-console.md",
|
|
41
43
|
"docs/examples/create-first-task.sh",
|
|
42
44
|
"docs/claude-code-pro.md",
|
|
43
45
|
"docs/en/claude-code-pro.md",
|
|
@@ -47,10 +49,10 @@
|
|
|
47
49
|
"docs/en/session-evaluation.md"
|
|
48
50
|
],
|
|
49
51
|
"optionalDependencies": {
|
|
50
|
-
"@ckanner/flywheel-darwin-arm64": "0.
|
|
51
|
-
"@ckanner/flywheel-darwin-amd64": "0.
|
|
52
|
-
"@ckanner/flywheel-linux-arm64": "0.
|
|
53
|
-
"@ckanner/flywheel-linux-amd64": "0.
|
|
52
|
+
"@ckanner/flywheel-darwin-arm64": "0.30.0",
|
|
53
|
+
"@ckanner/flywheel-darwin-amd64": "0.30.0",
|
|
54
|
+
"@ckanner/flywheel-linux-arm64": "0.30.0",
|
|
55
|
+
"@ckanner/flywheel-linux-amd64": "0.30.0"
|
|
54
56
|
},
|
|
55
57
|
"scripts": {
|
|
56
58
|
"release:check": "node scripts/release-preflight.js",
|
|
@@ -58,10 +60,10 @@
|
|
|
58
60
|
"test": "node --test npm/test/*.test.js",
|
|
59
61
|
"test:install": "node --test npm/test/install.integration.js",
|
|
60
62
|
"test:registry": "node npm/test/registry-smoke.js",
|
|
61
|
-
"build:npm": "bash scripts/build-npm.sh 0.
|
|
63
|
+
"build:npm": "bash scripts/build-npm.sh 0.30.0 dist-npm",
|
|
62
64
|
"test:sessions": "node scripts/test-session-evaluation.js"
|
|
63
65
|
},
|
|
64
66
|
"dependencies": {
|
|
65
|
-
"@ckanner/dsh-plugin-flywheel": "0.
|
|
67
|
+
"@ckanner/dsh-plugin-flywheel": "0.30.0"
|
|
66
68
|
}
|
|
67
69
|
}
|