@chllming/wave-orchestration 0.8.9 → 0.9.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 +57 -0
- package/README.md +135 -18
- package/docs/README.md +9 -3
- package/docs/architecture/README.md +1498 -0
- package/docs/concepts/context7-vs-skills.md +1 -1
- package/docs/concepts/operating-modes.md +3 -3
- package/docs/concepts/what-is-a-wave.md +1 -1
- package/docs/guides/author-and-run-waves.md +27 -4
- package/docs/guides/monorepo-projects.md +226 -0
- package/docs/guides/planner.md +10 -3
- package/docs/guides/{recommendations-0.8.9.md → recommendations-0.9.1.md} +8 -7
- package/docs/guides/sandboxed-environments.md +158 -0
- package/docs/guides/terminal-surfaces.md +14 -12
- package/docs/plans/current-state.md +11 -7
- package/docs/plans/end-state-architecture.md +3 -1
- package/docs/plans/examples/wave-example-design-handoff.md +3 -1
- package/docs/plans/examples/wave-example-live-proof.md +6 -1
- package/docs/plans/examples/wave-example-rollout-fidelity.md +2 -0
- package/docs/plans/migration.md +48 -18
- package/docs/plans/sandbox-end-state-architecture.md +153 -0
- package/docs/plans/wave-orchestrator.md +4 -4
- package/docs/reference/cli-reference.md +125 -57
- package/docs/reference/coordination-and-closure.md +1 -1
- package/docs/reference/github-packages-setup.md +1 -1
- package/docs/reference/migration-0.2-to-0.5.md +9 -7
- package/docs/reference/npmjs-token-publishing.md +53 -0
- package/docs/reference/npmjs-trusted-publishing.md +4 -50
- package/docs/reference/package-publishing-flow.md +272 -0
- package/docs/reference/runtime-config/README.md +140 -12
- package/docs/reference/sample-waves.md +100 -5
- package/docs/reference/skills.md +1 -1
- package/docs/reference/wave-control.md +23 -5
- package/docs/roadmap.md +43 -201
- package/package.json +1 -1
- package/releases/manifest.json +38 -0
- package/scripts/wave-orchestrator/adhoc.mjs +49 -17
- package/scripts/wave-orchestrator/agent-process-runner.mjs +344 -0
- package/scripts/wave-orchestrator/agent-state.mjs +0 -1
- package/scripts/wave-orchestrator/artifact-schemas.mjs +7 -0
- package/scripts/wave-orchestrator/autonomous.mjs +96 -29
- package/scripts/wave-orchestrator/benchmark-external.mjs +23 -7
- package/scripts/wave-orchestrator/benchmark.mjs +33 -10
- package/scripts/wave-orchestrator/closure-engine.mjs +138 -17
- package/scripts/wave-orchestrator/config.mjs +239 -24
- package/scripts/wave-orchestrator/control-cli.mjs +71 -28
- package/scripts/wave-orchestrator/coord-cli.mjs +22 -14
- package/scripts/wave-orchestrator/coordination-store.mjs +8 -0
- package/scripts/wave-orchestrator/dashboard-renderer.mjs +123 -44
- package/scripts/wave-orchestrator/dep-cli.mjs +47 -21
- package/scripts/wave-orchestrator/derived-state-engine.mjs +6 -3
- package/scripts/wave-orchestrator/feedback.mjs +28 -11
- package/scripts/wave-orchestrator/gate-engine.mjs +106 -38
- package/scripts/wave-orchestrator/human-input-resolution.mjs +5 -1
- package/scripts/wave-orchestrator/install.mjs +13 -0
- package/scripts/wave-orchestrator/launcher-progress.mjs +91 -0
- package/scripts/wave-orchestrator/launcher-runtime.mjs +179 -68
- package/scripts/wave-orchestrator/launcher.mjs +222 -53
- package/scripts/wave-orchestrator/ledger.mjs +7 -2
- package/scripts/wave-orchestrator/planner.mjs +48 -27
- package/scripts/wave-orchestrator/project-profile.mjs +31 -8
- package/scripts/wave-orchestrator/projection-writer.mjs +13 -1
- package/scripts/wave-orchestrator/proof-cli.mjs +18 -12
- package/scripts/wave-orchestrator/reducer-snapshot.mjs +6 -0
- package/scripts/wave-orchestrator/retry-cli.mjs +19 -13
- package/scripts/wave-orchestrator/retry-control.mjs +3 -3
- package/scripts/wave-orchestrator/retry-engine.mjs +93 -6
- package/scripts/wave-orchestrator/role-helpers.mjs +30 -0
- package/scripts/wave-orchestrator/session-supervisor.mjs +94 -85
- package/scripts/wave-orchestrator/shared.mjs +77 -14
- package/scripts/wave-orchestrator/supervisor-cli.mjs +1306 -0
- package/scripts/wave-orchestrator/terminals.mjs +12 -32
- package/scripts/wave-orchestrator/tmux-adapter.mjs +300 -0
- package/scripts/wave-orchestrator/wave-control-client.mjs +84 -16
- package/scripts/wave-orchestrator/wave-files.mjs +43 -6
- package/scripts/wave.mjs +13 -0
|
@@ -129,7 +129,6 @@ Upload policy meanings:
|
|
|
129
129
|
|
|
130
130
|
- `local-only`: keep only the descriptor remotely
|
|
131
131
|
- `metadata-only`: report path, hash, size, and presence only
|
|
132
|
-
- `selected`: upload metadata plus the artifact body when the runtime is in `metadata-plus-selected`
|
|
133
132
|
- `selected`: upload metadata plus the artifact body when the runtime is in `metadata-plus-selected` or `full-artifact-upload` **and** the artifact kind is allowed by `waveControl.uploadArtifactKinds`
|
|
134
133
|
- `full`: upload the artifact body in `full-artifact-upload` flows; if `uploadArtifactKinds` is set, keep the kind allowlist aligned with that policy
|
|
135
134
|
|
|
@@ -142,9 +141,9 @@ Upload policy meanings:
|
|
|
142
141
|
"waveControl": {
|
|
143
142
|
"endpoint": "https://wave-control.up.railway.app/api/v1",
|
|
144
143
|
"workspaceId": "my-workspace",
|
|
145
|
-
"projectId": "
|
|
144
|
+
"projectId": "app",
|
|
146
145
|
"authTokenEnvVar": "WAVE_CONTROL_AUTH_TOKEN",
|
|
147
|
-
"reportMode": "metadata-
|
|
146
|
+
"reportMode": "metadata-only",
|
|
148
147
|
"uploadArtifactKinds": [
|
|
149
148
|
"trace-run-metadata",
|
|
150
149
|
"trace-quality",
|
|
@@ -154,7 +153,16 @@ Upload policy meanings:
|
|
|
154
153
|
}
|
|
155
154
|
```
|
|
156
155
|
|
|
157
|
-
|
|
156
|
+
Packaged defaults:
|
|
157
|
+
|
|
158
|
+
- endpoint: `https://wave-control.up.railway.app/api/v1`
|
|
159
|
+
- enabled: `true`
|
|
160
|
+
- report mode: `metadata-only`
|
|
161
|
+
- identity defaults to the resolved project, lane, wave, run kind, and run id
|
|
162
|
+
|
|
163
|
+
This package is distributed with the author's personal Wave Control endpoint enabled by default. Repos that do not want telemetry delivered there must explicitly opt out.
|
|
164
|
+
|
|
165
|
+
Lane overrides may refine the same surface under `lanes.<lane>.waveControl` or `projects.<projectId>.lanes.<lane>.waveControl`.
|
|
158
166
|
|
|
159
167
|
For a single run, operators can disable Wave Control reporting entirely with:
|
|
160
168
|
|
|
@@ -162,6 +170,16 @@ For a single run, operators can disable Wave Control reporting entirely with:
|
|
|
162
170
|
pnpm exec wave launch --lane main --no-telemetry
|
|
163
171
|
```
|
|
164
172
|
|
|
173
|
+
Repo or project config may also opt out with:
|
|
174
|
+
|
|
175
|
+
```json
|
|
176
|
+
{
|
|
177
|
+
"waveControl": {
|
|
178
|
+
"enabled": false
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
165
183
|
That suppresses the local telemetry spool and remote delivery for that invocation, while leaving the canonical runtime artifacts and local control-plane state intact.
|
|
166
184
|
|
|
167
185
|
## Delivery Model
|
|
@@ -169,7 +187,7 @@ That suppresses the local telemetry spool and remote delivery for that invocatio
|
|
|
169
187
|
Wave Control reporting should:
|
|
170
188
|
|
|
171
189
|
- append local telemetry first
|
|
172
|
-
- queue pending uploads under `.tmp/<lane>-wave-launcher/control-plane/telemetry/`
|
|
190
|
+
- queue pending uploads under `.tmp/<lane>-wave-launcher/control-plane/telemetry/` for the implicit default project, or `.tmp/projects/<projectId>/<lane>-wave-launcher/control-plane/telemetry/` for explicit projects
|
|
173
191
|
- respect `waveControl.uploadArtifactKinds` before uploading any selected artifact body
|
|
174
192
|
- cap pending remote uploads with `waveControl.maxPendingEvents` by dropping the oldest queued remote-delivery files, while keeping the local `events.jsonl` stream intact
|
|
175
193
|
- retry delivery with idempotency keys
|
package/docs/roadmap.md
CHANGED
|
@@ -1,226 +1,68 @@
|
|
|
1
1
|
# Wave Orchestrator Roadmap
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
This roadmap is intentionally short and current. The older planner-foundation and ad-hoc-run phase list has been removed because that work no longer describes the actual shipping direction for this package.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Current Release: 0.9.1
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
`0.9.1` is the runtime-hardening release.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
It focuses on:
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
- detached process-backed agent execution instead of tmux-heavy live execution
|
|
12
|
+
- lower steady-state memory pressure and less terminal churn during long runs
|
|
13
|
+
- better behavior in constrained sandboxes such as LEAPclaw, OpenClaw, Nemoshell, and Docker-based operator environments
|
|
14
|
+
- a safer `submit -> supervise -> status/wait -> attach` control path for long-running agentic orchestration
|
|
15
|
+
- tighter supervisor recovery, progress journaling, and closure/retry correctness
|
|
12
16
|
|
|
13
|
-
|
|
14
|
-
- wave parsing and validation
|
|
15
|
-
- role-based execution with cont-qa, integration, and documentation stewards
|
|
16
|
-
- executor profiles and lane runtime policy
|
|
17
|
-
- compiled inboxes, ledgers, docs queues, dependency snapshots, and trace bundles
|
|
18
|
-
- orchestrator-first clarification handling and human feedback workflows
|
|
17
|
+
## Next Release: Final Planned Feature Release On This Line
|
|
19
18
|
|
|
20
|
-
The
|
|
19
|
+
The next planned release after `0.9.1`, aside from bug fixes and release-surface maintenance, is the final feature release for this standalone Node-based line.
|
|
21
20
|
|
|
22
|
-
|
|
21
|
+
That release is focused on Wave Control authentication:
|
|
23
22
|
|
|
24
|
-
|
|
23
|
+
- token-based auth for `wave-control`
|
|
24
|
+
- web auth for the Wave Control operator surface
|
|
25
|
+
- a cleaner control-plane boundary between the local orchestrator runtime and authenticated operator access
|
|
26
|
+
- documentation and setup guidance for protected control surfaces in local, containerized, and hosted environments
|
|
25
27
|
|
|
26
|
-
|
|
27
|
-
- What exact components are being promoted and why now?
|
|
28
|
-
- What is the required runtime mix and fallback policy?
|
|
29
|
-
- Which deploy environment or infra substrate is in scope?
|
|
30
|
-
- Is the run `oversight` or `dark-factory`?
|
|
31
|
-
- What exact validation commands must pass?
|
|
32
|
-
- What exact artifact closes the role?
|
|
28
|
+
After that release, this package should move into maintenance mode:
|
|
33
29
|
|
|
34
|
-
|
|
30
|
+
- bug fixes
|
|
31
|
+
- compatibility updates
|
|
32
|
+
- documentation updates
|
|
33
|
+
- release-surface alignment work
|
|
35
34
|
|
|
36
|
-
|
|
37
|
-
- reference rule or source-of-truth note
|
|
38
|
-
- project bootstrap context
|
|
39
|
-
- deploy environments
|
|
40
|
-
- component promotions
|
|
41
|
-
- Context7 defaults
|
|
42
|
-
- per-agent required context
|
|
43
|
-
- earlier-wave outputs to read
|
|
44
|
-
- requirements
|
|
45
|
-
- validation
|
|
46
|
-
- output or closure contract
|
|
35
|
+
## Strategic Direction: LEAPclaw Execution Model
|
|
47
36
|
|
|
48
|
-
|
|
37
|
+
After the Wave Control auth release, the main execution roadmap moves away from expanding this Node runtime and toward the LEAPclaw execution model.
|
|
49
38
|
|
|
50
|
-
|
|
39
|
+
The target shape is:
|
|
51
40
|
|
|
52
|
-
-
|
|
53
|
-
-
|
|
54
|
-
-
|
|
55
|
-
-
|
|
56
|
-
|
|
57
|
-
- `docs/plans/waves/wave-<n>.md`
|
|
58
|
-
- Treat the JSON draft spec as the canonical authoring artifact and render markdown from it.
|
|
59
|
-
- Keep generated waves fully compatible with the current parser and launcher.
|
|
60
|
-
- Add `wave launch --terminal-surface vscode|tmux|none`.
|
|
61
|
-
- Support a tmux-only operator mode that never touches `.vscode/terminals.json`.
|
|
41
|
+
- LEAPclaw-native execution semantics for agent orchestration and management
|
|
42
|
+
- Go-based runtime ownership for the long-running execution layer
|
|
43
|
+
- Temporal-backed workflow and recovery coordination
|
|
44
|
+
- LEAPclaw nodes as the durable execution substrate for orchestrated agent work
|
|
45
|
+
- Wave Control acting as an authenticated control and observability surface rather than the long-term primary execution engine
|
|
62
46
|
|
|
63
|
-
|
|
47
|
+
This direction matches the broader local platform work in the sibling `slowfast.ai` repository, where the support-service and runtime direction already points toward LEAPclaw support services, Go runtime ownership, and Temporal-backed orchestration.
|
|
64
48
|
|
|
65
|
-
|
|
66
|
-
- The repo already has strong runtime and closure machinery.
|
|
67
|
-
- Project memory removes repeated setup questions and gives future planner steps a durable baseline.
|
|
49
|
+
## Future Standalone Runtime Direction
|
|
68
50
|
|
|
69
|
-
|
|
51
|
+
For future standalone Wave Orchestrator versions, the preferred implementation direction is the Rust runtime at:
|
|
70
52
|
|
|
71
|
-
|
|
53
|
+
- `https://github.com/chllming/agent-wave-orchestrator`
|
|
72
54
|
|
|
73
|
-
|
|
55
|
+
That line is expected to carry:
|
|
74
56
|
|
|
75
|
-
-
|
|
76
|
-
-
|
|
77
|
-
-
|
|
78
|
-
- `wave adhoc show --run <id>`
|
|
79
|
-
- `wave adhoc promote --run <id> --wave <n>`
|
|
57
|
+
- its own runtime implementation
|
|
58
|
+
- its own terminal-native/TUI operator surface
|
|
59
|
+
- the longer-term standalone execution model once the Node package settles into maintenance mode
|
|
80
60
|
|
|
81
|
-
|
|
61
|
+
## Practical Guidance
|
|
82
62
|
|
|
83
|
-
|
|
84
|
-
- normalize them into a single transient plan or spec
|
|
85
|
-
- synthesize the worker roles needed for the request while still preserving cont-qa, integration, and documentation closure when relevant
|
|
86
|
-
- run that transient plan through the existing launcher, coordination, inbox, ledger, docs queue, integration, and trace machinery
|
|
87
|
-
- keep ad-hoc runs logged, inspectable, and replayable with the same basic operator surfaces as roadmap waves
|
|
88
|
-
- route shared-plan documentation deltas into the canonical shared docs queue, plus an ad-hoc closure report for the run
|
|
89
|
-
- treat only repo-local paths as ownership hints and ignore external references such as URLs
|
|
63
|
+
For this repository, the practical sequence is:
|
|
90
64
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
-
|
|
95
|
-
- keep runtime state isolated under `.tmp/<lane>-wave-launcher/adhoc/<run-id>/`
|
|
96
|
-
- extend trace metadata with `runKind: adhoc` and `runId`
|
|
97
|
-
|
|
98
|
-
Design constraints:
|
|
99
|
-
|
|
100
|
-
- reuse the planner and launcher instead of building a second runtime
|
|
101
|
-
- treat ad-hoc as a transient single-run execution unit, not a fake roadmap wave
|
|
102
|
-
- do not let ad-hoc completion mutate normal `completedWaves` lane state
|
|
103
|
-
- give `wave coord`, `wave feedback`, and future replay or reporting flows a way to target `--run <id>`
|
|
104
|
-
- promote numbered roadmap artifacts from the stored ad-hoc spec instead of recomputing them from the current project profile
|
|
105
|
-
|
|
106
|
-
Why this matters:
|
|
107
|
-
|
|
108
|
-
- many real operator requests are one-off bugfix, investigation, doc, infra, or release tasks
|
|
109
|
-
- the framework's coordination, closure, and traceability should apply to ad-hoc work too
|
|
110
|
-
- isolated ad-hoc runs preserve auditability without polluting the long-lived roadmap
|
|
111
|
-
|
|
112
|
-
## Phase 3: Forward Replanning
|
|
113
|
-
|
|
114
|
-
Add `wave update --from-wave <n>`.
|
|
115
|
-
|
|
116
|
-
Rules:
|
|
117
|
-
|
|
118
|
-
- closed waves are immutable
|
|
119
|
-
- the current open wave and later waves may be regenerated
|
|
120
|
-
- replanning must record what changed and why
|
|
121
|
-
- new repo state, new user intent, and refreshed research may all trigger a replan
|
|
122
|
-
|
|
123
|
-
Outputs:
|
|
124
|
-
|
|
125
|
-
- updated draft JSON specs
|
|
126
|
-
- regenerated markdown waves
|
|
127
|
-
- a short replan summary for operator review
|
|
128
|
-
|
|
129
|
-
Why this matters:
|
|
130
|
-
|
|
131
|
-
- multi-wave plans drift as code lands
|
|
132
|
-
- research and infra assumptions change
|
|
133
|
-
- forward-only replanning preserves auditability without pretending older waves never existed
|
|
134
|
-
|
|
135
|
-
## Phase 4: Infra and Deploy-Aware Planning
|
|
136
|
-
|
|
137
|
-
Infra and deploy roles need typed environment context, not free-form prompt notes only.
|
|
138
|
-
|
|
139
|
-
Project profile should support typed deploy providers with a `custom` escape hatch:
|
|
140
|
-
|
|
141
|
-
- `railway-mcp`
|
|
142
|
-
- `railway-cli`
|
|
143
|
-
- `docker-compose`
|
|
144
|
-
- `kubernetes`
|
|
145
|
-
- `ssh-manual`
|
|
146
|
-
- `custom`
|
|
147
|
-
|
|
148
|
-
Planner-generated infra or deploy roles should know:
|
|
149
|
-
|
|
150
|
-
- which environment they own
|
|
151
|
-
- which substrate is authoritative
|
|
152
|
-
- what credentials or executors are expected
|
|
153
|
-
- what validation commands prove readiness
|
|
154
|
-
- what rollback or recovery guidance applies
|
|
155
|
-
|
|
156
|
-
This is especially important for `dark-factory` mode. Fully autonomous infra work should require stronger environment modeling than human-overseen work.
|
|
157
|
-
|
|
158
|
-
## Phase 5: Oversight and Dark-Factory Modes
|
|
159
|
-
|
|
160
|
-
Execution posture must be explicit plan data.
|
|
161
|
-
|
|
162
|
-
Default:
|
|
163
|
-
|
|
164
|
-
- `oversight`
|
|
165
|
-
|
|
166
|
-
Opt-in:
|
|
167
|
-
|
|
168
|
-
- `dark-factory`
|
|
169
|
-
|
|
170
|
-
`oversight` means:
|
|
171
|
-
|
|
172
|
-
- human checkpoints remain normal for live mutation, deploy, release, or risky infra work
|
|
173
|
-
- the planner should generate explicit review gates
|
|
174
|
-
|
|
175
|
-
`dark-factory` means:
|
|
176
|
-
|
|
177
|
-
- the wave is intended to run end-to-end without routine human approvals
|
|
178
|
-
- deploy environment, validation, rollback, and closure signals must be stricter
|
|
179
|
-
- missing environment context is a planning error, not a runtime surprise
|
|
180
|
-
|
|
181
|
-
## Phase 6: Coordination and Integration Upgrades
|
|
182
|
-
|
|
183
|
-
The runtime already has strong coordination primitives, but the roadmap should still push these areas:
|
|
184
|
-
|
|
185
|
-
- keep the canonical authority set explicit and the markdown board as a rendered view
|
|
186
|
-
- keep compiled per-agent inboxes and shared summaries central to prompt construction
|
|
187
|
-
- strengthen the integration steward output as the single closure-ready synthesis artifact
|
|
188
|
-
- add `wave lint` for ownership, component promotion, runtime mix, deploy environment, and closure completeness
|
|
189
|
-
- expand replay scenarios for replanning, autonomy modes, and infra-heavy waves
|
|
190
|
-
|
|
191
|
-
## Additional Features Worth Scheduling
|
|
192
|
-
|
|
193
|
-
- template packs for common wave shapes: implementation, QA, infra, release, migration
|
|
194
|
-
- doc-delta extraction plus changelog or release-note queues when waves change public behavior
|
|
195
|
-
- executor and credential preflight checks before launch
|
|
196
|
-
- project-profile-aware defaults for lane, template, terminal surface, and oversight mode
|
|
197
|
-
- richer branch and PR guidance in draft specs when the wave is release or deploy oriented
|
|
198
|
-
- benchmark scenarios that compare oversight vs dark-factory outcomes
|
|
199
|
-
|
|
200
|
-
## Research Notes
|
|
201
|
-
|
|
202
|
-
The direction above is consistent with the local source set and the current external references:
|
|
203
|
-
|
|
204
|
-
- OpenAI, “Harness engineering: leveraging Codex in an agent-first world”
|
|
205
|
-
- repository-local plans and environment design matter more than prompt-only control
|
|
206
|
-
- Anthropic, “Effective harnesses for long-running agents”
|
|
207
|
-
- first-run initialization and durable progress artifacts are critical
|
|
208
|
-
- DOVA
|
|
209
|
-
- deliberation-first orchestration and transparent intermediate state support better refinement loops
|
|
210
|
-
- Silo-Bench
|
|
211
|
-
- communication alone is not enough; integration quality is the real bottleneck
|
|
212
|
-
- Evaluating AGENTS.md
|
|
213
|
-
- repository-level context files help, but they should complement executable and versioned planning artifacts rather than replace them
|
|
214
|
-
|
|
215
|
-
## Immediate Recommendation
|
|
216
|
-
|
|
217
|
-
The next shipping sequence should be:
|
|
218
|
-
|
|
219
|
-
1. planner foundation
|
|
220
|
-
2. ad-hoc task runs on the same substrate
|
|
221
|
-
3. forward replanning
|
|
222
|
-
4. typed infra and deploy planning
|
|
223
|
-
5. explicit oversight vs dark-factory workflows
|
|
224
|
-
6. stronger linting, replay, and benchmark coverage
|
|
225
|
-
|
|
226
|
-
That sequence keeps the current harness intact while making planning, execution posture, and infra ownership much more explicit and durable.
|
|
65
|
+
1. Ship `0.9.1` with the sandbox/runtime hardening and aligned docs.
|
|
66
|
+
2. Ship the Wave Control token/web auth release as the last planned feature release on this Node line.
|
|
67
|
+
3. Keep this package maintained for bug fixes, compatibility, and release-surface sync.
|
|
68
|
+
4. Move long-term execution investment to the LEAPclaw + Go + Temporal architecture and the Rust standalone runtime.
|
package/package.json
CHANGED
package/releases/manifest.json
CHANGED
|
@@ -2,6 +2,44 @@
|
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"packageName": "@chllming/wave-orchestration",
|
|
4
4
|
"releases": [
|
|
5
|
+
{
|
|
6
|
+
"version": "0.9.1",
|
|
7
|
+
"date": "2026-03-29",
|
|
8
|
+
"summary": "Detached process-backed agent execution, sandbox-safe supervisor hardening, lower memory pressure, and 0.9.1 release-surface alignment.",
|
|
9
|
+
"features": [
|
|
10
|
+
"Live agent execution now uses detached process runners by default instead of per-agent tmux execution sessions, which reduces tmux churn and lowers memory use during wide orchestration bursts while keeping tmux as an optional dashboard projection layer.",
|
|
11
|
+
"The sandbox-facing path is now `wave submit`, `wave supervise`, `wave status`, `wave wait`, and `wave attach`, with exact-context lookup, read-side launcher-status reconciliation, progress journaling, degraded-run handling, and log-follow attach behavior suited to LEAPclaw, OpenClaw, Nemoshell, and similar short-lived exec environments.",
|
|
12
|
+
"Supervisor recovery now relies on run-owned terminal artifacts and finalized progress instead of lane-global completion history, preserving the correct remaining wave range and final active wave during multi-wave reruns and launcher-loss recovery.",
|
|
13
|
+
"Ordinary runs, closure runs, and resident orchestrator runs now all preserve process-runtime metadata for timeout and cleanup, while process-backed resident orchestrators terminate cleanly and rate-limit retry detection stays scoped to the current attempt output.",
|
|
14
|
+
"Planner migration guidance and the `planner-agentic` bundle placeholder remain part of the shipped current-surface docs so adopted repos still have one aligned upgrade target.",
|
|
15
|
+
"A dedicated setup guide now ships for sandboxed and containerized operation, including Nemoshell and Docker guidance, while README, migration docs, terminal-surface docs, runtime-config docs, coordination docs, and the renamed recommendations guide `docs/guides/recommendations-0.9.1.md` now describe the same sandbox-safe release surface."
|
|
16
|
+
],
|
|
17
|
+
"manualSteps": [
|
|
18
|
+
"Run `pnpm exec wave doctor` and `pnpm exec wave launch --lane main --dry-run --no-dashboard` after upgrading so the repo validates against the `0.9.1` release surface.",
|
|
19
|
+
"If your repo runs Wave inside LEAPclaw, OpenClaw, Nemoshell, Docker, or another short-lived exec sandbox, move long-running orchestration to `wave supervise`, use `wave submit/status/wait/attach` from disposable clients, and set Codex sandbox defaults in `wave.config.json` instead of relying on per-command overrides.",
|
|
20
|
+
"If your repo copied starter docs or runbooks, sync `README.md`, `docs/README.md`, `docs/plans/current-state.md`, `docs/plans/migration.md`, `docs/reference/coordination-and-closure.md`, `docs/reference/runtime-config/README.md`, `docs/guides/sandboxed-environments.md`, `docs/guides/terminal-surfaces.md`, and `docs/guides/recommendations-0.9.1.md` so local guidance matches the packaged release."
|
|
21
|
+
],
|
|
22
|
+
"breaking": false
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"version": "0.9.0",
|
|
26
|
+
"date": "2026-03-28",
|
|
27
|
+
"summary": "First-class monorepo project support, project-aware runtime isolation, default Wave Control metadata delivery, and 0.9.0 release-surface alignment.",
|
|
28
|
+
"features": [
|
|
29
|
+
"Wave configs can now declare `defaultProject` and `projects.<projectId>`, so one repo can host multiple projects with isolated lane roots, docs roots, planner defaults, and runtime state.",
|
|
30
|
+
"Lane-scoped CLI surfaces now accept `--project`, including launch, autonomous, dashboard, control, coordination, dependencies, ad-hoc work, proof, retry, feedback, drafting, and benchmarks.",
|
|
31
|
+
"Planner defaults, ad-hoc runs, dependency tickets, tmux naming, launcher state, and benchmark identity are now project-aware, which prevents same-lane-name collisions in monorepos.",
|
|
32
|
+
"Wave Control now defaults to `https://wave-control.up.railway.app/api/v1` with `reportMode: \"metadata-only\"`, and benchmark plus runtime metadata now include project, lane, and wave identity unless explicitly opted out.",
|
|
33
|
+
"Planner migration guidance and the `planner-agentic` bundle placeholder remain part of the shipped current-surface docs so adopted repos still have one aligned upgrade target.",
|
|
34
|
+
"README, current-state notes, migration guidance, runtime-config docs, coordination docs, the new monorepo guide, the versioned recommendations guide, release manifest, and tracked install-state fixtures now all point at the `0.9.0` package surface."
|
|
35
|
+
],
|
|
36
|
+
"manualSteps": [
|
|
37
|
+
"Run `pnpm exec wave doctor` and `pnpm exec wave launch --lane main --dry-run --no-dashboard` after upgrading so the repo validates against the `0.9.0` release surface.",
|
|
38
|
+
"If your repo copied starter docs or runbooks, sync `README.md`, `docs/README.md`, `docs/plans/current-state.md`, `docs/plans/migration.md`, `docs/reference/coordination-and-closure.md`, `docs/reference/runtime-config/README.md`, `docs/guides/monorepo-projects.md`, and `docs/guides/recommendations-0.9.0.md` so local guidance matches the packaged release.",
|
|
39
|
+
"If your repo copied starter `wave.config.json` defaults or automation around lane-only state paths, update them for `defaultProject`, `projects.<projectId>`, project-scoped `.wave/projects/<projectId>/project-profile.json`, project-scoped ad-hoc storage, and explicit telemetry opt-out controls before relying on monorepo behavior."
|
|
40
|
+
],
|
|
41
|
+
"breaking": false
|
|
42
|
+
},
|
|
5
43
|
{
|
|
6
44
|
"version": "0.8.9",
|
|
7
45
|
"date": "2026-03-27",
|
|
@@ -25,6 +25,7 @@ import {
|
|
|
25
25
|
buildLanePaths,
|
|
26
26
|
compactSingleLine,
|
|
27
27
|
ensureDirectory,
|
|
28
|
+
findAdhocRunRecord,
|
|
28
29
|
parseNonNegativeInt,
|
|
29
30
|
readJsonOrNull,
|
|
30
31
|
REPO_ROOT,
|
|
@@ -205,8 +206,8 @@ async function withSuppressedNestedUpdateNotice(fn) {
|
|
|
205
206
|
}
|
|
206
207
|
}
|
|
207
208
|
|
|
208
|
-
function readEffectiveProjectProfile(config) {
|
|
209
|
-
return readProjectProfile({ config }) || buildDefaultProjectProfile(config);
|
|
209
|
+
function readEffectiveProjectProfile(config, project) {
|
|
210
|
+
return readProjectProfile({ config, project }) || buildDefaultProjectProfile(config);
|
|
210
211
|
}
|
|
211
212
|
|
|
212
213
|
function detectKeyword(text, keywords) {
|
|
@@ -451,6 +452,10 @@ function buildCommonRequiredContext() {
|
|
|
451
452
|
);
|
|
452
453
|
}
|
|
453
454
|
|
|
455
|
+
function adhocReportPath(lanePaths, filename) {
|
|
456
|
+
return repoRelativePath(path.join(lanePaths.adhocRunDir, "reports", filename));
|
|
457
|
+
}
|
|
458
|
+
|
|
454
459
|
function buildDocumentationOwnedPaths({ lanePaths, waveNumber, mode }) {
|
|
455
460
|
const canonicalPaths = requiredDocumentationStewardPathsForWave(waveNumber, {
|
|
456
461
|
laneProfile: lanePaths.laneProfile,
|
|
@@ -459,7 +464,7 @@ function buildDocumentationOwnedPaths({ lanePaths, waveNumber, mode }) {
|
|
|
459
464
|
return canonicalPaths;
|
|
460
465
|
}
|
|
461
466
|
return uniqueStrings([
|
|
462
|
-
|
|
467
|
+
adhocReportPath(lanePaths, `wave-${waveNumber}-doc-closure.md`),
|
|
463
468
|
...canonicalPaths,
|
|
464
469
|
]);
|
|
465
470
|
}
|
|
@@ -476,11 +481,11 @@ function buildSpecialAgents({
|
|
|
476
481
|
const contQaReportPath =
|
|
477
482
|
mode === "roadmap"
|
|
478
483
|
? `docs/plans/waves/reviews/wave-${waveNumber}-cont-qa.md`
|
|
479
|
-
:
|
|
484
|
+
: adhocReportPath(lanePaths, `wave-${waveNumber}-cont-qa.md`);
|
|
480
485
|
const contEvalReportPath =
|
|
481
486
|
mode === "roadmap"
|
|
482
487
|
? `docs/plans/waves/reviews/wave-${waveNumber}-cont-eval.md`
|
|
483
|
-
:
|
|
488
|
+
: adhocReportPath(lanePaths, `wave-${waveNumber}-cont-eval.md`);
|
|
484
489
|
const documentationOwnedPaths = buildDocumentationOwnedPaths({
|
|
485
490
|
lanePaths,
|
|
486
491
|
waveNumber,
|
|
@@ -489,7 +494,7 @@ function buildSpecialAgents({
|
|
|
489
494
|
const securityReportPath =
|
|
490
495
|
mode === "roadmap"
|
|
491
496
|
? relativeStatePath(path.join(lanePaths.securityDir, `wave-${waveNumber}-review.md`))
|
|
492
|
-
:
|
|
497
|
+
: adhocReportPath(lanePaths, `wave-${waveNumber}-security-review.md`);
|
|
493
498
|
const integrationOwnedPaths = [
|
|
494
499
|
relativeStatePath(path.join(lanePaths.integrationDir, `wave-${waveNumber}.md`)),
|
|
495
500
|
relativeStatePath(path.join(lanePaths.integrationDir, `wave-${waveNumber}.json`)),
|
|
@@ -727,6 +732,7 @@ function buildAdhocRequest({ runId, lanePaths, profile, tasks, launcherArgs = []
|
|
|
727
732
|
schemaVersion: ADHOC_SCHEMA_VERSION,
|
|
728
733
|
runKind: "adhoc",
|
|
729
734
|
runId,
|
|
735
|
+
project: lanePaths.project,
|
|
730
736
|
lane: lanePaths.lane,
|
|
731
737
|
createdAt: toIsoTimestamp(),
|
|
732
738
|
oversightMode: profile.defaultOversightMode,
|
|
@@ -846,6 +852,7 @@ function buildResultRecord(lanePaths, request, spec, status, extra = {}) {
|
|
|
846
852
|
schemaVersion: ADHOC_SCHEMA_VERSION,
|
|
847
853
|
runKind: "adhoc",
|
|
848
854
|
runId: request.runId,
|
|
855
|
+
project: request.project || lanePaths.project,
|
|
849
856
|
lane: request.lane,
|
|
850
857
|
title: spec.title,
|
|
851
858
|
status,
|
|
@@ -1009,6 +1016,7 @@ function parseArgs(argv) {
|
|
|
1009
1016
|
const args = Array.isArray(argv) ? argv.slice() : [];
|
|
1010
1017
|
const subcommand = cleanText(args.shift()).toLowerCase();
|
|
1011
1018
|
const options = {
|
|
1019
|
+
project: "",
|
|
1012
1020
|
lane: "",
|
|
1013
1021
|
runId: "",
|
|
1014
1022
|
wave: null,
|
|
@@ -1022,6 +1030,8 @@ function parseArgs(argv) {
|
|
|
1022
1030
|
const arg = args.shift();
|
|
1023
1031
|
if (arg === "--task") {
|
|
1024
1032
|
options.tasks.push(cleanText(args.shift()));
|
|
1033
|
+
} else if (arg === "--project") {
|
|
1034
|
+
options.project = cleanText(args.shift());
|
|
1025
1035
|
} else if (arg === "--lane") {
|
|
1026
1036
|
options.lane = cleanText(args.shift());
|
|
1027
1037
|
} else if (arg === "--run") {
|
|
@@ -1074,24 +1084,25 @@ function parseArgs(argv) {
|
|
|
1074
1084
|
|
|
1075
1085
|
function printUsage() {
|
|
1076
1086
|
console.log(`Usage:
|
|
1077
|
-
wave adhoc plan --task <text> [--task <text>] [--lane <lane>] [--json]
|
|
1078
|
-
wave adhoc run --task <text> [--task <text>] [--lane <lane>] [--yes] [--json] [launcher options]
|
|
1079
|
-
wave adhoc list [--lane <lane>] [--json]
|
|
1087
|
+
wave adhoc plan --task <text> [--task <text>] [--project <id>] [--lane <lane>] [--json]
|
|
1088
|
+
wave adhoc run --task <text> [--task <text>] [--project <id>] [--lane <lane>] [--yes] [--json] [launcher options]
|
|
1089
|
+
wave adhoc list [--project <id>] [--lane <lane>] [--json]
|
|
1080
1090
|
wave adhoc show --run <id> [--json]
|
|
1081
|
-
wave adhoc promote --run <id> --wave <n> [--force] [--json]
|
|
1091
|
+
wave adhoc promote --run <id> [--project <id>] --wave <n> [--force] [--json]
|
|
1082
1092
|
`);
|
|
1083
1093
|
}
|
|
1084
1094
|
|
|
1085
1095
|
function resolveLaneForOptions(config, options) {
|
|
1086
|
-
const profile = readEffectiveProjectProfile(config);
|
|
1096
|
+
const profile = readEffectiveProjectProfile(config, options.project || config.defaultProject);
|
|
1087
1097
|
return cleanText(options.lane) || profile.plannerDefaults?.lane || config.defaultLane;
|
|
1088
1098
|
}
|
|
1089
1099
|
|
|
1090
1100
|
function createStoredRun({ config, options }) {
|
|
1091
|
-
const
|
|
1101
|
+
const projectId = options.project || config.defaultProject;
|
|
1102
|
+
const profile = readEffectiveProjectProfile(config, projectId);
|
|
1092
1103
|
const lane = resolveLaneForOptions(config, options);
|
|
1093
1104
|
const runId = buildAdhocRunId();
|
|
1094
|
-
const lanePaths = buildLanePaths(lane, { config, adhocRunId: runId });
|
|
1105
|
+
const lanePaths = buildLanePaths(lane, { config, project: projectId, adhocRunId: runId });
|
|
1095
1106
|
const request = buildAdhocRequest({
|
|
1096
1107
|
runId,
|
|
1097
1108
|
lanePaths,
|
|
@@ -1114,7 +1125,17 @@ function createStoredRun({ config, options }) {
|
|
|
1114
1125
|
}
|
|
1115
1126
|
|
|
1116
1127
|
function readStoredRun(runId) {
|
|
1117
|
-
const
|
|
1128
|
+
const record = findAdhocRunRecord(runId);
|
|
1129
|
+
if (!record) {
|
|
1130
|
+
throw new Error(`Ad-hoc run not found: ${runId}`);
|
|
1131
|
+
}
|
|
1132
|
+
const lanePaths = buildLanePaths(
|
|
1133
|
+
record.result?.lane || DEFAULT_LANE_PLACEHOLDER,
|
|
1134
|
+
{
|
|
1135
|
+
project: record.project,
|
|
1136
|
+
adhocRunId: runId,
|
|
1137
|
+
},
|
|
1138
|
+
);
|
|
1118
1139
|
const request = readJsonOrNull(lanePaths.adhocRequestPath);
|
|
1119
1140
|
const spec = readJsonOrNull(lanePaths.adhocSpecPath);
|
|
1120
1141
|
const result = readJsonOrNull(lanePaths.adhocResultPath);
|
|
@@ -1166,6 +1187,7 @@ export async function runAdhocCli(argv) {
|
|
|
1166
1187
|
}
|
|
1167
1188
|
const launchLanePaths = buildLanePaths(stored.lanePaths.lane, {
|
|
1168
1189
|
config,
|
|
1190
|
+
project: stored.request.project || stored.lanePaths.project,
|
|
1169
1191
|
adhocRunId: stored.lanePaths.runId,
|
|
1170
1192
|
runVariant: options.launcherArgs.includes("--dry-run") ? "dry-run" : undefined,
|
|
1171
1193
|
});
|
|
@@ -1178,6 +1200,8 @@ export async function runAdhocCli(argv) {
|
|
|
1178
1200
|
try {
|
|
1179
1201
|
await withSuppressedNestedUpdateNotice(() =>
|
|
1180
1202
|
runLauncherCli([
|
|
1203
|
+
"--project",
|
|
1204
|
+
stored.request.project || stored.lanePaths.project,
|
|
1181
1205
|
"--lane",
|
|
1182
1206
|
stored.lanePaths.lane,
|
|
1183
1207
|
"--adhoc-run",
|
|
@@ -1219,9 +1243,10 @@ export async function runAdhocCli(argv) {
|
|
|
1219
1243
|
|
|
1220
1244
|
if (subcommand === "list") {
|
|
1221
1245
|
const lane = cleanText(options.lane);
|
|
1222
|
-
const
|
|
1246
|
+
const projectId = options.project || config.defaultProject;
|
|
1247
|
+
const lanePaths = buildLanePaths(lane || config.defaultLane, { config, project: projectId });
|
|
1223
1248
|
const runs = collectStoredRuns(lanePaths.adhocIndexPath).filter((run) =>
|
|
1224
|
-
lane ? run.lane === lane : true,
|
|
1249
|
+
(lane ? run.lane === lane : true) && (options.project ? run.project === projectId : true),
|
|
1225
1250
|
);
|
|
1226
1251
|
if (options.json) {
|
|
1227
1252
|
console.log(JSON.stringify(runs, null, 2));
|
|
@@ -1242,6 +1267,7 @@ export async function runAdhocCli(argv) {
|
|
|
1242
1267
|
const { lanePaths, request, spec, result } = readStoredRun(options.runId);
|
|
1243
1268
|
const payload = {
|
|
1244
1269
|
runId: options.runId,
|
|
1270
|
+
project: result.project || request.project || lanePaths.project,
|
|
1245
1271
|
lane: result.lane,
|
|
1246
1272
|
status: result.status,
|
|
1247
1273
|
title: result.title,
|
|
@@ -1263,6 +1289,7 @@ export async function runAdhocCli(argv) {
|
|
|
1263
1289
|
return;
|
|
1264
1290
|
}
|
|
1265
1291
|
console.log(`[wave:adhoc] run=${payload.runId}`);
|
|
1292
|
+
console.log(`[wave:adhoc] project=${payload.project}`);
|
|
1266
1293
|
console.log(`[wave:adhoc] lane=${payload.lane}`);
|
|
1267
1294
|
console.log(`[wave:adhoc] status=${payload.status}`);
|
|
1268
1295
|
console.log(`[wave:adhoc] title=${payload.title}`);
|
|
@@ -1290,8 +1317,13 @@ export async function runAdhocCli(argv) {
|
|
|
1290
1317
|
throw new Error("--wave <n> is required for `wave adhoc promote`.");
|
|
1291
1318
|
}
|
|
1292
1319
|
const stored = readStoredRun(options.runId);
|
|
1320
|
+
const projectId =
|
|
1321
|
+
cleanText(options.project) ||
|
|
1322
|
+
cleanText(stored.result.project) ||
|
|
1323
|
+
cleanText(stored.request.project) ||
|
|
1324
|
+
config.defaultProject;
|
|
1293
1325
|
const lane = cleanText(options.lane) || stored.result.lane || config.defaultLane;
|
|
1294
|
-
const lanePaths = buildLanePaths(lane, { config });
|
|
1326
|
+
const lanePaths = buildLanePaths(lane, { config, project: projectId });
|
|
1295
1327
|
const wavePath = path.join(lanePaths.wavesDir, `wave-${options.wave}.md`);
|
|
1296
1328
|
const specPath = path.join(lanePaths.wavesDir, "specs", `wave-${options.wave}.json`);
|
|
1297
1329
|
if (!options.force && (fs.existsSync(wavePath) || fs.existsSync(specPath))) {
|