solveos-cli 0.1.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/LICENSE +21 -0
- package/README.md +194 -0
- package/agents/solveos-build-validator.md +183 -0
- package/agents/solveos-debugger.md +226 -0
- package/agents/solveos-executor.md +187 -0
- package/agents/solveos-plan-validator.md +200 -0
- package/agents/solveos-planner.md +190 -0
- package/agents/solveos-researcher.md +152 -0
- package/agents/solveos-reviewer.md +263 -0
- package/commands/solveos/archive.md +106 -0
- package/commands/solveos/build.md +170 -0
- package/commands/solveos/fast.md +85 -0
- package/commands/solveos/new-cycle.md +165 -0
- package/commands/solveos/new.md +142 -0
- package/commands/solveos/next.md +86 -0
- package/commands/solveos/plan.md +139 -0
- package/commands/solveos/quick.md +109 -0
- package/commands/solveos/research.md +117 -0
- package/commands/solveos/review.md +198 -0
- package/commands/solveos/ship.md +129 -0
- package/commands/solveos/status.md +78 -0
- package/commands/solveos/validate-build.md +155 -0
- package/commands/solveos/validate-plan.md +115 -0
- package/dist/bin/install.d.ts +11 -0
- package/dist/bin/install.d.ts.map +1 -0
- package/dist/bin/install.js +158 -0
- package/dist/bin/install.js.map +1 -0
- package/dist/hooks/brief-anchor.d.ts +68 -0
- package/dist/hooks/brief-anchor.d.ts.map +1 -0
- package/dist/hooks/brief-anchor.js +236 -0
- package/dist/hooks/brief-anchor.js.map +1 -0
- package/dist/hooks/context-monitor.d.ts +70 -0
- package/dist/hooks/context-monitor.d.ts.map +1 -0
- package/dist/hooks/context-monitor.js +166 -0
- package/dist/hooks/context-monitor.js.map +1 -0
- package/dist/lib/artifacts.d.ts +63 -0
- package/dist/lib/artifacts.d.ts.map +1 -0
- package/dist/lib/artifacts.js +382 -0
- package/dist/lib/artifacts.js.map +1 -0
- package/dist/lib/config.d.ts +10 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +29 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/runtime-adapters/claude-code.d.ts +18 -0
- package/dist/lib/runtime-adapters/claude-code.d.ts.map +1 -0
- package/dist/lib/runtime-adapters/claude-code.js +125 -0
- package/dist/lib/runtime-adapters/claude-code.js.map +1 -0
- package/dist/lib/runtime-adapters/cursor.d.ts +18 -0
- package/dist/lib/runtime-adapters/cursor.d.ts.map +1 -0
- package/dist/lib/runtime-adapters/cursor.js +113 -0
- package/dist/lib/runtime-adapters/cursor.js.map +1 -0
- package/dist/lib/runtime-adapters/gemini-cli.d.ts +18 -0
- package/dist/lib/runtime-adapters/gemini-cli.d.ts.map +1 -0
- package/dist/lib/runtime-adapters/gemini-cli.js +127 -0
- package/dist/lib/runtime-adapters/gemini-cli.js.map +1 -0
- package/dist/lib/runtime-adapters/opencode.d.ts +14 -0
- package/dist/lib/runtime-adapters/opencode.d.ts.map +1 -0
- package/dist/lib/runtime-adapters/opencode.js +109 -0
- package/dist/lib/runtime-adapters/opencode.js.map +1 -0
- package/dist/lib/runtime-detect.d.ts +22 -0
- package/dist/lib/runtime-detect.d.ts.map +1 -0
- package/dist/lib/runtime-detect.js +73 -0
- package/dist/lib/runtime-detect.js.map +1 -0
- package/dist/lib/security.d.ts +88 -0
- package/dist/lib/security.d.ts.map +1 -0
- package/dist/lib/security.js +230 -0
- package/dist/lib/security.js.map +1 -0
- package/dist/types.d.ts +224 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +31 -0
- package/dist/types.js.map +1 -0
- package/dist/workflows/state-machine.d.ts +55 -0
- package/dist/workflows/state-machine.d.ts.map +1 -0
- package/dist/workflows/state-machine.js +271 -0
- package/dist/workflows/state-machine.js.map +1 -0
- package/dist/workflows/wave-executor.d.ts +112 -0
- package/dist/workflows/wave-executor.d.ts.map +1 -0
- package/dist/workflows/wave-executor.js +496 -0
- package/dist/workflows/wave-executor.js.map +1 -0
- package/package.json +58 -0
- package/templates/build-validation.md +82 -0
- package/templates/config-default.json +21 -0
- package/templates/plan-brief.md +106 -0
- package/templates/plan-validation-log.md +77 -0
- package/templates/post-ship-review.md +75 -0
- package/templates/pre-ship-review.md +56 -0
- package/templates/research-summary.md +30 -0
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cycle state machine for solveos-cli.
|
|
3
|
+
*
|
|
4
|
+
* Tracks which phase/gate the user is in, enforces valid transitions,
|
|
5
|
+
* and provides helpers for state queries. Persistence (load/save to
|
|
6
|
+
* .solveos/STATE.md) is handled by the artifacts module.
|
|
7
|
+
*
|
|
8
|
+
* The transition map encodes all ~20 valid transitions from docs/plan.md.
|
|
9
|
+
* Invalid transitions throw — they are programming errors, not user errors.
|
|
10
|
+
*/
|
|
11
|
+
import { CycleState } from "../types.js";
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Transition Map
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
/**
|
|
16
|
+
* Map from each state to its valid target states.
|
|
17
|
+
* This is the runtime representation of the StateTransition type.
|
|
18
|
+
*/
|
|
19
|
+
const TRANSITION_MAP = {
|
|
20
|
+
[CycleState.INIT]: [CycleState.RESEARCHING, CycleState.PLANNING],
|
|
21
|
+
[CycleState.RESEARCHING]: [CycleState.PLANNING],
|
|
22
|
+
[CycleState.PLANNING]: [CycleState.VALIDATING_PLAN, CycleState.BUILDING],
|
|
23
|
+
[CycleState.VALIDATING_PLAN]: [CycleState.PLANNING, CycleState.BUILDING],
|
|
24
|
+
[CycleState.BUILDING]: [
|
|
25
|
+
CycleState.VALIDATING_BUILD,
|
|
26
|
+
CycleState.REVIEWING_PRE,
|
|
27
|
+
CycleState.READY_TO_SHIP,
|
|
28
|
+
],
|
|
29
|
+
[CycleState.VALIDATING_BUILD]: [
|
|
30
|
+
CycleState.BUILDING,
|
|
31
|
+
CycleState.PLANNING,
|
|
32
|
+
CycleState.REVIEWING_PRE,
|
|
33
|
+
CycleState.READY_TO_SHIP,
|
|
34
|
+
],
|
|
35
|
+
[CycleState.REVIEWING_PRE]: [CycleState.BUILDING, CycleState.READY_TO_SHIP],
|
|
36
|
+
[CycleState.READY_TO_SHIP]: [CycleState.SHIPPED],
|
|
37
|
+
[CycleState.SHIPPED]: [CycleState.REVIEWING_POST, CycleState.CYCLE_COMPLETE],
|
|
38
|
+
[CycleState.REVIEWING_POST]: [CycleState.CYCLE_COMPLETE],
|
|
39
|
+
[CycleState.CYCLE_COMPLETE]: [CycleState.INIT],
|
|
40
|
+
};
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// Gate Tracking Helpers
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
/**
|
|
45
|
+
* Map from state to the gate it represents (if any).
|
|
46
|
+
* States not in this map are phases, not gates.
|
|
47
|
+
*/
|
|
48
|
+
const STATE_TO_GATE = {
|
|
49
|
+
[CycleState.RESEARCHING]: "RESEARCH",
|
|
50
|
+
[CycleState.VALIDATING_PLAN]: "PLAN_VALIDATION",
|
|
51
|
+
[CycleState.VALIDATING_BUILD]: "BUILD_VALIDATION",
|
|
52
|
+
[CycleState.REVIEWING_PRE]: "REVIEW_PRE_SHIP",
|
|
53
|
+
[CycleState.REVIEWING_POST]: "REVIEW_POST_SHIP",
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Determines which gates were skipped when transitioning from `from` to `to`.
|
|
57
|
+
* A gate is "skipped" when a transition bypasses a state that has a gate.
|
|
58
|
+
*
|
|
59
|
+
* Returns the list of gate names that were skipped (may be empty).
|
|
60
|
+
*/
|
|
61
|
+
function detectSkippedGates(from, to, alreadySkipped, alreadyCompleted) {
|
|
62
|
+
const skipped = [];
|
|
63
|
+
// INIT -> PLANNING skips RESEARCH
|
|
64
|
+
if (from === CycleState.INIT && to === CycleState.PLANNING) {
|
|
65
|
+
const gate = "RESEARCH";
|
|
66
|
+
if (!alreadySkipped.includes(gate) && !alreadyCompleted.includes(gate)) {
|
|
67
|
+
skipped.push(gate);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// PLANNING -> BUILDING skips PLAN_VALIDATION
|
|
71
|
+
if (from === CycleState.PLANNING && to === CycleState.BUILDING) {
|
|
72
|
+
const gate = "PLAN_VALIDATION";
|
|
73
|
+
if (!alreadySkipped.includes(gate) && !alreadyCompleted.includes(gate)) {
|
|
74
|
+
skipped.push(gate);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// BUILDING -> REVIEWING_PRE skips BUILD_VALIDATION
|
|
78
|
+
if (from === CycleState.BUILDING && to === CycleState.REVIEWING_PRE) {
|
|
79
|
+
const gate = "BUILD_VALIDATION";
|
|
80
|
+
if (!alreadySkipped.includes(gate) && !alreadyCompleted.includes(gate)) {
|
|
81
|
+
skipped.push(gate);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// BUILDING -> READY_TO_SHIP skips BUILD_VALIDATION and REVIEW_PRE_SHIP
|
|
85
|
+
if (from === CycleState.BUILDING && to === CycleState.READY_TO_SHIP) {
|
|
86
|
+
for (const gate of ["BUILD_VALIDATION", "REVIEW_PRE_SHIP"]) {
|
|
87
|
+
if (!alreadySkipped.includes(gate) && !alreadyCompleted.includes(gate)) {
|
|
88
|
+
skipped.push(gate);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// VALIDATING_BUILD -> READY_TO_SHIP skips REVIEW_PRE_SHIP
|
|
93
|
+
if (from === CycleState.VALIDATING_BUILD && to === CycleState.READY_TO_SHIP) {
|
|
94
|
+
const gate = "REVIEW_PRE_SHIP";
|
|
95
|
+
if (!alreadySkipped.includes(gate) && !alreadyCompleted.includes(gate)) {
|
|
96
|
+
skipped.push(gate);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// SHIPPED -> CYCLE_COMPLETE skips REVIEW_POST_SHIP
|
|
100
|
+
if (from === CycleState.SHIPPED && to === CycleState.CYCLE_COMPLETE) {
|
|
101
|
+
const gate = "REVIEW_POST_SHIP";
|
|
102
|
+
if (!alreadySkipped.includes(gate) && !alreadyCompleted.includes(gate)) {
|
|
103
|
+
skipped.push(gate);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return skipped;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Determines which gate was completed when leaving a gate state.
|
|
110
|
+
* Returns the gate name if the `from` state is a gate, otherwise null.
|
|
111
|
+
*/
|
|
112
|
+
function detectCompletedGate(from, to) {
|
|
113
|
+
const gate = STATE_TO_GATE[from];
|
|
114
|
+
if (!gate)
|
|
115
|
+
return null;
|
|
116
|
+
// A gate is "completed" when we transition forward from it.
|
|
117
|
+
// Going backward (e.g., VALIDATING_PLAN -> PLANNING) means the gate
|
|
118
|
+
// found issues and is not yet complete.
|
|
119
|
+
const backwardTransitions = {
|
|
120
|
+
[CycleState.VALIDATING_PLAN]: [CycleState.PLANNING],
|
|
121
|
+
[CycleState.VALIDATING_BUILD]: [CycleState.BUILDING, CycleState.PLANNING],
|
|
122
|
+
[CycleState.REVIEWING_PRE]: [CycleState.BUILDING],
|
|
123
|
+
};
|
|
124
|
+
const backward = backwardTransitions[from];
|
|
125
|
+
if (backward && backward.includes(to)) {
|
|
126
|
+
return null; // Going backward — gate not completed
|
|
127
|
+
}
|
|
128
|
+
return gate;
|
|
129
|
+
}
|
|
130
|
+
// ---------------------------------------------------------------------------
|
|
131
|
+
// State Machine API
|
|
132
|
+
// ---------------------------------------------------------------------------
|
|
133
|
+
/**
|
|
134
|
+
* Validate and apply a state transition.
|
|
135
|
+
*
|
|
136
|
+
* @param stateData - Current cycle state data.
|
|
137
|
+
* @param target - The desired next state.
|
|
138
|
+
* @param maxPlanValidationPasses - From config; defaults to 3.
|
|
139
|
+
* @returns TransitionResult with updated state data and metadata.
|
|
140
|
+
* @throws Error if the transition is invalid.
|
|
141
|
+
*/
|
|
142
|
+
export function transition(stateData, target, maxPlanValidationPasses = 3) {
|
|
143
|
+
const from = stateData.current_state;
|
|
144
|
+
const validTargets = TRANSITION_MAP[from];
|
|
145
|
+
if (!validTargets.includes(target)) {
|
|
146
|
+
throw new Error(`Invalid transition: ${from} -> ${target}. ` +
|
|
147
|
+
`Valid targets from ${from}: [${validTargets.join(", ")}]`);
|
|
148
|
+
}
|
|
149
|
+
// Detect gate events
|
|
150
|
+
const gatesSkipped = detectSkippedGates(from, target, stateData.gates_skipped, stateData.gates_completed);
|
|
151
|
+
const gateCompleted = detectCompletedGate(from, target);
|
|
152
|
+
// Track plan validation passes
|
|
153
|
+
let planValidationPasses = stateData.plan_validation_passes;
|
|
154
|
+
let planValidationEscalation = false;
|
|
155
|
+
if (target === CycleState.VALIDATING_PLAN) {
|
|
156
|
+
planValidationPasses += 1;
|
|
157
|
+
if (planValidationPasses > maxPlanValidationPasses) {
|
|
158
|
+
planValidationEscalation = true;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// Build transition log entry
|
|
162
|
+
const now = new Date().toISOString();
|
|
163
|
+
const logEntry = {
|
|
164
|
+
from,
|
|
165
|
+
to: target,
|
|
166
|
+
at: now,
|
|
167
|
+
};
|
|
168
|
+
// Record the first gate skipped (if any) on the log entry
|
|
169
|
+
if (gatesSkipped.length > 0) {
|
|
170
|
+
logEntry.gate_skipped = gatesSkipped[0];
|
|
171
|
+
}
|
|
172
|
+
if (gateCompleted) {
|
|
173
|
+
logEntry.gate_completed = gateCompleted;
|
|
174
|
+
}
|
|
175
|
+
// Build updated state
|
|
176
|
+
const updatedState = {
|
|
177
|
+
...stateData,
|
|
178
|
+
current_state: target,
|
|
179
|
+
gates_skipped: [...stateData.gates_skipped, ...gatesSkipped],
|
|
180
|
+
gates_completed: gateCompleted
|
|
181
|
+
? [...stateData.gates_completed, gateCompleted]
|
|
182
|
+
: [...stateData.gates_completed],
|
|
183
|
+
plan_validation_passes: planValidationPasses,
|
|
184
|
+
transitions_log: [...(stateData.transitions_log ?? []), logEntry],
|
|
185
|
+
updated_at: now,
|
|
186
|
+
};
|
|
187
|
+
// Reset state when starting a new cycle
|
|
188
|
+
if (from === CycleState.CYCLE_COMPLETE && target === CycleState.INIT) {
|
|
189
|
+
updatedState.cycle_number = stateData.cycle_number + 1;
|
|
190
|
+
updatedState.gates_skipped = [];
|
|
191
|
+
updatedState.gates_completed = [];
|
|
192
|
+
updatedState.plan_validation_passes = 0;
|
|
193
|
+
updatedState.blockers = [];
|
|
194
|
+
updatedState.transitions_log = [];
|
|
195
|
+
}
|
|
196
|
+
return {
|
|
197
|
+
transition: [from, target],
|
|
198
|
+
stateData: updatedState,
|
|
199
|
+
gatesSkipped,
|
|
200
|
+
gateCompleted,
|
|
201
|
+
planValidationEscalation,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Get all valid next states from the current state.
|
|
206
|
+
*/
|
|
207
|
+
export function getNextStates(currentState) {
|
|
208
|
+
return [...TRANSITION_MAP[currentState]];
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Check if a transition is valid without applying it.
|
|
212
|
+
*/
|
|
213
|
+
export function isValidTransition(from, to) {
|
|
214
|
+
return TRANSITION_MAP[from].includes(to);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Create initial state data for a new cycle.
|
|
218
|
+
*/
|
|
219
|
+
export function createInitialState(cycleNumber = 1) {
|
|
220
|
+
const now = new Date().toISOString();
|
|
221
|
+
return {
|
|
222
|
+
current_state: CycleState.INIT,
|
|
223
|
+
cycle_number: cycleNumber,
|
|
224
|
+
gates_skipped: [],
|
|
225
|
+
gates_completed: [],
|
|
226
|
+
plan_validation_passes: 0,
|
|
227
|
+
blockers: [],
|
|
228
|
+
transitions_log: [],
|
|
229
|
+
created_at: now,
|
|
230
|
+
updated_at: now,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Get a human-readable description of the current state.
|
|
235
|
+
*/
|
|
236
|
+
export function describeState(state) {
|
|
237
|
+
const descriptions = {
|
|
238
|
+
[CycleState.INIT]: "Project initialized — ready to start",
|
|
239
|
+
[CycleState.RESEARCHING]: "Research gate — gathering information",
|
|
240
|
+
[CycleState.PLANNING]: "Plan phase — creating the Plan Brief",
|
|
241
|
+
[CycleState.VALIDATING_PLAN]: "Plan Validation gate — checking the brief",
|
|
242
|
+
[CycleState.BUILDING]: "Build phase — executing against the plan",
|
|
243
|
+
[CycleState.VALIDATING_BUILD]: "Build Validation gate — checking the output",
|
|
244
|
+
[CycleState.REVIEWING_PRE]: "Pre-ship Review gate — final check before shipping",
|
|
245
|
+
[CycleState.READY_TO_SHIP]: "Ready to ship — all checks passed",
|
|
246
|
+
[CycleState.SHIPPED]: "Shipped — work delivered",
|
|
247
|
+
[CycleState.REVIEWING_POST]: "Post-ship Review gate — reflecting on the cycle",
|
|
248
|
+
[CycleState.CYCLE_COMPLETE]: "Cycle complete — ready for next cycle",
|
|
249
|
+
};
|
|
250
|
+
return descriptions[state];
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Get the suggested next command for a given state.
|
|
254
|
+
*/
|
|
255
|
+
export function suggestNextCommand(state) {
|
|
256
|
+
const suggestions = {
|
|
257
|
+
[CycleState.INIT]: "/solveos:research or /solveos:plan",
|
|
258
|
+
[CycleState.RESEARCHING]: "Complete research, then /solveos:plan",
|
|
259
|
+
[CycleState.PLANNING]: "/solveos:validate-plan or /solveos:build",
|
|
260
|
+
[CycleState.VALIDATING_PLAN]: "Address gaps, then /solveos:plan to refine",
|
|
261
|
+
[CycleState.BUILDING]: "/solveos:validate-build or /solveos:ship",
|
|
262
|
+
[CycleState.VALIDATING_BUILD]: "Fix issues or /solveos:review",
|
|
263
|
+
[CycleState.REVIEWING_PRE]: "Address feedback or proceed to ship",
|
|
264
|
+
[CycleState.READY_TO_SHIP]: "/solveos:ship",
|
|
265
|
+
[CycleState.SHIPPED]: "/solveos:review (post-ship) or /solveos:new-cycle",
|
|
266
|
+
[CycleState.REVIEWING_POST]: "/solveos:new-cycle",
|
|
267
|
+
[CycleState.CYCLE_COMPLETE]: "/solveos:new-cycle",
|
|
268
|
+
};
|
|
269
|
+
return suggestions[state];
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=state-machine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-machine.js","sourceRoot":"","sources":["../../src/workflows/state-machine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wave-based parallel execution engine for the Build phase.
|
|
3
|
+
*
|
|
4
|
+
* Implements GSD's wave execution model:
|
|
5
|
+
* 1. Decompose goal into atomic work units
|
|
6
|
+
* 2. Analyze dependencies between units
|
|
7
|
+
* 3. Group independent units into waves (topological sort)
|
|
8
|
+
* 4. Execute units within a wave concurrently
|
|
9
|
+
* 5. Wait for all units in a wave before starting the next
|
|
10
|
+
*
|
|
11
|
+
* The "execution" is orchestrated by the AI agent — this module manages
|
|
12
|
+
* the data structures, wave grouping algorithm, and state tracking.
|
|
13
|
+
* The AI agent (solveos-executor) reads the plan and processes units.
|
|
14
|
+
*/
|
|
15
|
+
import type { WorkUnit, Wave, WaveExecutionPlan, WaveExecutionResult, Granularity } from "../types.js";
|
|
16
|
+
/** Target unit count ranges per granularity level. */
|
|
17
|
+
export declare const GRANULARITY_RANGES: Record<Granularity, {
|
|
18
|
+
min: number;
|
|
19
|
+
max: number;
|
|
20
|
+
}>;
|
|
21
|
+
/**
|
|
22
|
+
* Create a work unit with defaults.
|
|
23
|
+
* Used by the build command / executor agent to register decomposed units.
|
|
24
|
+
*/
|
|
25
|
+
export declare function createWorkUnit(id: string, name: string, description: string, opts?: {
|
|
26
|
+
depends_on?: string[];
|
|
27
|
+
criteria?: string[];
|
|
28
|
+
discovered?: boolean;
|
|
29
|
+
}): WorkUnit;
|
|
30
|
+
/**
|
|
31
|
+
* Validate that all dependency references in a unit list are valid
|
|
32
|
+
* (no dangling references, no self-references, no cycles).
|
|
33
|
+
*
|
|
34
|
+
* @returns Array of error messages (empty if valid).
|
|
35
|
+
*/
|
|
36
|
+
export declare function validateDependencies(units: WorkUnit[]): string[];
|
|
37
|
+
/**
|
|
38
|
+
* Group work units into waves based on dependency analysis.
|
|
39
|
+
*
|
|
40
|
+
* Algorithm:
|
|
41
|
+
* 1. Find all units with no unsatisfied dependencies → Wave 1
|
|
42
|
+
* 2. Remove those units from the graph
|
|
43
|
+
* 3. Find the next set of units with satisfied dependencies → Wave 2
|
|
44
|
+
* 4. Repeat until all units are assigned
|
|
45
|
+
*
|
|
46
|
+
* This is essentially Kahn's algorithm for topological sorting,
|
|
47
|
+
* but instead of producing a linear order, it groups by "level".
|
|
48
|
+
*/
|
|
49
|
+
export declare function groupIntoWaves(units: WorkUnit[]): Wave[];
|
|
50
|
+
/**
|
|
51
|
+
* Build a complete wave execution plan from a list of work units.
|
|
52
|
+
* Validates dependencies, groups into waves, and detects single-unit tasks.
|
|
53
|
+
*
|
|
54
|
+
* @throws Error if dependency validation fails.
|
|
55
|
+
*/
|
|
56
|
+
export declare function buildExecutionPlan(units: WorkUnit[], granularity: Granularity): WaveExecutionPlan;
|
|
57
|
+
/**
|
|
58
|
+
* Mark a unit as in-progress.
|
|
59
|
+
*/
|
|
60
|
+
export declare function startUnit(plan: WaveExecutionPlan, unitId: string): void;
|
|
61
|
+
/**
|
|
62
|
+
* Mark a unit as completed with a summary.
|
|
63
|
+
*/
|
|
64
|
+
export declare function completeUnit(plan: WaveExecutionPlan, unitId: string, summary: string): void;
|
|
65
|
+
/**
|
|
66
|
+
* Mark a unit as failed with an error message.
|
|
67
|
+
*/
|
|
68
|
+
export declare function failUnit(plan: WaveExecutionPlan, unitId: string, error: string): void;
|
|
69
|
+
/**
|
|
70
|
+
* Skip a unit (e.g., due to a dependency failure).
|
|
71
|
+
*/
|
|
72
|
+
export declare function skipUnit(plan: WaveExecutionPlan, unitId: string, reason: string): void;
|
|
73
|
+
/**
|
|
74
|
+
* Skip all units that depend on a failed unit (cascade).
|
|
75
|
+
* Returns the IDs of units that were skipped.
|
|
76
|
+
*/
|
|
77
|
+
export declare function cascadeSkip(plan: WaveExecutionPlan, failedUnitId: string): string[];
|
|
78
|
+
/**
|
|
79
|
+
* Add a discovered work unit to the plan.
|
|
80
|
+
* Discovered units are added to the current or next wave depending on dependencies.
|
|
81
|
+
*/
|
|
82
|
+
export declare function addDiscoveredUnit(plan: WaveExecutionPlan, unit: WorkUnit): void;
|
|
83
|
+
/**
|
|
84
|
+
* Generate an execution result from the current plan state.
|
|
85
|
+
*/
|
|
86
|
+
export declare function generateResult(plan: WaveExecutionPlan): WaveExecutionResult;
|
|
87
|
+
/**
|
|
88
|
+
* Get the next wave that needs execution (first wave with pending/in_progress status).
|
|
89
|
+
* Returns null if all waves are completed or failed.
|
|
90
|
+
*/
|
|
91
|
+
export declare function getNextWave(plan: WaveExecutionPlan): Wave | null;
|
|
92
|
+
/**
|
|
93
|
+
* Get all pending units in a specific wave.
|
|
94
|
+
*/
|
|
95
|
+
export declare function getPendingUnits(plan: WaveExecutionPlan, waveNumber: number): WorkUnit[];
|
|
96
|
+
/**
|
|
97
|
+
* Check if a wave is fully completed (all units completed, failed, or skipped).
|
|
98
|
+
*/
|
|
99
|
+
export declare function isWaveComplete(plan: WaveExecutionPlan, waveNumber: number): boolean;
|
|
100
|
+
/**
|
|
101
|
+
* Check if the entire plan is finished (all units in terminal state).
|
|
102
|
+
*/
|
|
103
|
+
export declare function isPlanComplete(plan: WaveExecutionPlan): boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Get a progress summary string for display.
|
|
106
|
+
*/
|
|
107
|
+
export declare function getProgressSummary(plan: WaveExecutionPlan): string;
|
|
108
|
+
/**
|
|
109
|
+
* Render the wave execution plan as a markdown section for STATE.md.
|
|
110
|
+
*/
|
|
111
|
+
export declare function renderPlanMarkdown(plan: WaveExecutionPlan): string;
|
|
112
|
+
//# sourceMappingURL=wave-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wave-executor.d.ts","sourceRoot":"","sources":["../../src/workflows/wave-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EACV,QAAQ,EAER,IAAI,EACJ,iBAAiB,EACjB,mBAAmB,EAEnB,WAAW,EACZ,MAAM,aAAa,CAAC;AAMrB,sDAAsD;AACtD,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,WAAW,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAIhF,CAAC;AAMF;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE;IACL,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GACA,QAAQ,CAUV;AAMD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,CAuBhE;AAqED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,CAsDxD;AAMD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,QAAQ,EAAE,EACjB,WAAW,EAAE,WAAW,GACvB,iBAAiB,CAiBnB;AAMD;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAYvE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAU3F;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAUrF;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAItF;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAoBnF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,iBAAiB,EACvB,IAAI,EAAE,QAAQ,GACb,IAAI,CA8BN;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,iBAAiB,GAAG,mBAAmB,CAgC3E;AAMD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,GAAG,IAAI,CAEhE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,GAAG,QAAQ,EAAE,CAMvF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAOnF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAI/D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAmBlE;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAiClE"}
|