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,496 @@
|
|
|
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
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Granularity Ranges
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
/** Target unit count ranges per granularity level. */
|
|
19
|
+
export const GRANULARITY_RANGES = {
|
|
20
|
+
coarse: { min: 2, max: 4 },
|
|
21
|
+
standard: { min: 3, max: 6 },
|
|
22
|
+
fine: { min: 5, max: 10 },
|
|
23
|
+
};
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// Work Unit Creation
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
/**
|
|
28
|
+
* Create a work unit with defaults.
|
|
29
|
+
* Used by the build command / executor agent to register decomposed units.
|
|
30
|
+
*/
|
|
31
|
+
export function createWorkUnit(id, name, description, opts) {
|
|
32
|
+
return {
|
|
33
|
+
id,
|
|
34
|
+
name,
|
|
35
|
+
description,
|
|
36
|
+
depends_on: opts?.depends_on ?? [],
|
|
37
|
+
criteria: opts?.criteria ?? [],
|
|
38
|
+
status: "pending",
|
|
39
|
+
discovered: opts?.discovered ?? false,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// Dependency Validation
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
/**
|
|
46
|
+
* Validate that all dependency references in a unit list are valid
|
|
47
|
+
* (no dangling references, no self-references, no cycles).
|
|
48
|
+
*
|
|
49
|
+
* @returns Array of error messages (empty if valid).
|
|
50
|
+
*/
|
|
51
|
+
export function validateDependencies(units) {
|
|
52
|
+
const errors = [];
|
|
53
|
+
const ids = new Set(units.map((u) => u.id));
|
|
54
|
+
for (const unit of units) {
|
|
55
|
+
// Self-reference check
|
|
56
|
+
if (unit.depends_on.includes(unit.id)) {
|
|
57
|
+
errors.push(`Unit "${unit.id}" depends on itself`);
|
|
58
|
+
}
|
|
59
|
+
// Dangling reference check
|
|
60
|
+
for (const dep of unit.depends_on) {
|
|
61
|
+
if (!ids.has(dep)) {
|
|
62
|
+
errors.push(`Unit "${unit.id}" depends on unknown unit "${dep}"`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Cycle detection via DFS
|
|
67
|
+
const cycleErrors = detectCycles(units);
|
|
68
|
+
errors.push(...cycleErrors);
|
|
69
|
+
return errors;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Detect cycles in the dependency graph using iterative DFS.
|
|
73
|
+
* Returns error messages for each cycle found.
|
|
74
|
+
*/
|
|
75
|
+
function detectCycles(units) {
|
|
76
|
+
const errors = [];
|
|
77
|
+
const WHITE = 0; // unvisited
|
|
78
|
+
const GRAY = 1; // in current path
|
|
79
|
+
const BLACK = 2; // fully processed
|
|
80
|
+
const color = new Map();
|
|
81
|
+
const parent = new Map();
|
|
82
|
+
const adjMap = new Map();
|
|
83
|
+
for (const unit of units) {
|
|
84
|
+
color.set(unit.id, WHITE);
|
|
85
|
+
adjMap.set(unit.id, unit.depends_on);
|
|
86
|
+
}
|
|
87
|
+
for (const unit of units) {
|
|
88
|
+
if (color.get(unit.id) !== WHITE)
|
|
89
|
+
continue;
|
|
90
|
+
// Iterative DFS using an explicit stack
|
|
91
|
+
const stack = [{ id: unit.id, childIdx: 0 }];
|
|
92
|
+
color.set(unit.id, GRAY);
|
|
93
|
+
parent.set(unit.id, null);
|
|
94
|
+
while (stack.length > 0) {
|
|
95
|
+
const top = stack[stack.length - 1];
|
|
96
|
+
const deps = adjMap.get(top.id) ?? [];
|
|
97
|
+
if (top.childIdx < deps.length) {
|
|
98
|
+
const dep = deps[top.childIdx];
|
|
99
|
+
top.childIdx++;
|
|
100
|
+
// Only process if the dependency exists in our graph
|
|
101
|
+
if (!color.has(dep))
|
|
102
|
+
continue;
|
|
103
|
+
const depColor = color.get(dep);
|
|
104
|
+
if (depColor === GRAY) {
|
|
105
|
+
// Found a cycle — trace back
|
|
106
|
+
const cyclePath = [dep, top.id];
|
|
107
|
+
for (let i = stack.length - 2; i >= 0; i--) {
|
|
108
|
+
if (stack[i].id === dep)
|
|
109
|
+
break;
|
|
110
|
+
cyclePath.push(stack[i].id);
|
|
111
|
+
}
|
|
112
|
+
cyclePath.reverse();
|
|
113
|
+
errors.push(`Dependency cycle detected: ${cyclePath.join(" → ")}`);
|
|
114
|
+
}
|
|
115
|
+
else if (depColor === WHITE) {
|
|
116
|
+
color.set(dep, GRAY);
|
|
117
|
+
parent.set(dep, top.id);
|
|
118
|
+
stack.push({ id: dep, childIdx: 0 });
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
color.set(top.id, BLACK);
|
|
123
|
+
stack.pop();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return errors;
|
|
128
|
+
}
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
// Wave Grouping (Topological Sort)
|
|
131
|
+
// ---------------------------------------------------------------------------
|
|
132
|
+
/**
|
|
133
|
+
* Group work units into waves based on dependency analysis.
|
|
134
|
+
*
|
|
135
|
+
* Algorithm:
|
|
136
|
+
* 1. Find all units with no unsatisfied dependencies → Wave 1
|
|
137
|
+
* 2. Remove those units from the graph
|
|
138
|
+
* 3. Find the next set of units with satisfied dependencies → Wave 2
|
|
139
|
+
* 4. Repeat until all units are assigned
|
|
140
|
+
*
|
|
141
|
+
* This is essentially Kahn's algorithm for topological sorting,
|
|
142
|
+
* but instead of producing a linear order, it groups by "level".
|
|
143
|
+
*/
|
|
144
|
+
export function groupIntoWaves(units) {
|
|
145
|
+
if (units.length === 0)
|
|
146
|
+
return [];
|
|
147
|
+
const waves = [];
|
|
148
|
+
const assigned = new Set();
|
|
149
|
+
let remaining = units.map((u) => u.id);
|
|
150
|
+
const depsMap = new Map();
|
|
151
|
+
for (const unit of units) {
|
|
152
|
+
depsMap.set(unit.id, [...unit.depends_on]);
|
|
153
|
+
}
|
|
154
|
+
let waveNum = 1;
|
|
155
|
+
while (remaining.length > 0) {
|
|
156
|
+
// Find units whose dependencies are all in the assigned set
|
|
157
|
+
const ready = [];
|
|
158
|
+
const notReady = [];
|
|
159
|
+
for (const id of remaining) {
|
|
160
|
+
const deps = depsMap.get(id) ?? [];
|
|
161
|
+
const allSatisfied = deps.every((d) => assigned.has(d));
|
|
162
|
+
if (allSatisfied) {
|
|
163
|
+
ready.push(id);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
notReady.push(id);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// If nothing is ready, there's a cycle (shouldn't happen if validateDependencies passed)
|
|
170
|
+
if (ready.length === 0) {
|
|
171
|
+
// Force-assign remaining to avoid infinite loop — mark as a degraded wave
|
|
172
|
+
waves.push({
|
|
173
|
+
number: waveNum,
|
|
174
|
+
unit_ids: notReady,
|
|
175
|
+
status: "pending",
|
|
176
|
+
});
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
waves.push({
|
|
180
|
+
number: waveNum,
|
|
181
|
+
unit_ids: ready,
|
|
182
|
+
status: "pending",
|
|
183
|
+
});
|
|
184
|
+
for (const id of ready) {
|
|
185
|
+
assigned.add(id);
|
|
186
|
+
}
|
|
187
|
+
remaining = notReady;
|
|
188
|
+
waveNum++;
|
|
189
|
+
}
|
|
190
|
+
return waves;
|
|
191
|
+
}
|
|
192
|
+
// ---------------------------------------------------------------------------
|
|
193
|
+
// Execution Plan Creation
|
|
194
|
+
// ---------------------------------------------------------------------------
|
|
195
|
+
/**
|
|
196
|
+
* Build a complete wave execution plan from a list of work units.
|
|
197
|
+
* Validates dependencies, groups into waves, and detects single-unit tasks.
|
|
198
|
+
*
|
|
199
|
+
* @throws Error if dependency validation fails.
|
|
200
|
+
*/
|
|
201
|
+
export function buildExecutionPlan(units, granularity) {
|
|
202
|
+
// Validate dependencies
|
|
203
|
+
const errors = validateDependencies(units);
|
|
204
|
+
if (errors.length > 0) {
|
|
205
|
+
throw new Error(`Invalid dependency graph:\n${errors.map((e) => ` - ${e}`).join("\n")}`);
|
|
206
|
+
}
|
|
207
|
+
// Group into waves
|
|
208
|
+
const waves = groupIntoWaves(units);
|
|
209
|
+
return {
|
|
210
|
+
units,
|
|
211
|
+
waves,
|
|
212
|
+
granularity,
|
|
213
|
+
single_unit: units.length === 1,
|
|
214
|
+
created_at: new Date().toISOString(),
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
// ---------------------------------------------------------------------------
|
|
218
|
+
// Execution State Management
|
|
219
|
+
// ---------------------------------------------------------------------------
|
|
220
|
+
/**
|
|
221
|
+
* Mark a unit as in-progress.
|
|
222
|
+
*/
|
|
223
|
+
export function startUnit(plan, unitId) {
|
|
224
|
+
const unit = findUnit(plan, unitId);
|
|
225
|
+
if (unit.status !== "pending") {
|
|
226
|
+
throw new Error(`Cannot start unit "${unitId}": status is "${unit.status}", expected "pending"`);
|
|
227
|
+
}
|
|
228
|
+
unit.status = "in_progress";
|
|
229
|
+
// Also update wave status if this is the first unit starting in that wave
|
|
230
|
+
const wave = findWaveForUnit(plan, unitId);
|
|
231
|
+
if (wave && wave.status === "pending") {
|
|
232
|
+
wave.status = "in_progress";
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Mark a unit as completed with a summary.
|
|
237
|
+
*/
|
|
238
|
+
export function completeUnit(plan, unitId, summary) {
|
|
239
|
+
const unit = findUnit(plan, unitId);
|
|
240
|
+
if (unit.status !== "in_progress") {
|
|
241
|
+
throw new Error(`Cannot complete unit "${unitId}": status is "${unit.status}", expected "in_progress"`);
|
|
242
|
+
}
|
|
243
|
+
unit.status = "completed";
|
|
244
|
+
unit.summary = summary;
|
|
245
|
+
// Check if wave is fully completed
|
|
246
|
+
updateWaveStatus(plan, unitId);
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Mark a unit as failed with an error message.
|
|
250
|
+
*/
|
|
251
|
+
export function failUnit(plan, unitId, error) {
|
|
252
|
+
const unit = findUnit(plan, unitId);
|
|
253
|
+
if (unit.status !== "in_progress") {
|
|
254
|
+
throw new Error(`Cannot fail unit "${unitId}": status is "${unit.status}", expected "in_progress"`);
|
|
255
|
+
}
|
|
256
|
+
unit.status = "failed";
|
|
257
|
+
unit.error = error;
|
|
258
|
+
// Check if wave is fully completed/failed
|
|
259
|
+
updateWaveStatus(plan, unitId);
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Skip a unit (e.g., due to a dependency failure).
|
|
263
|
+
*/
|
|
264
|
+
export function skipUnit(plan, unitId, reason) {
|
|
265
|
+
const unit = findUnit(plan, unitId);
|
|
266
|
+
unit.status = "skipped";
|
|
267
|
+
unit.error = reason;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Skip all units that depend on a failed unit (cascade).
|
|
271
|
+
* Returns the IDs of units that were skipped.
|
|
272
|
+
*/
|
|
273
|
+
export function cascadeSkip(plan, failedUnitId) {
|
|
274
|
+
const skipped = [];
|
|
275
|
+
const toCheck = [failedUnitId];
|
|
276
|
+
const failedSet = new Set([failedUnitId]);
|
|
277
|
+
while (toCheck.length > 0) {
|
|
278
|
+
const currentId = toCheck.pop();
|
|
279
|
+
// Find all units that depend on the current failed/skipped unit
|
|
280
|
+
for (const unit of plan.units) {
|
|
281
|
+
if (failedSet.has(unit.id))
|
|
282
|
+
continue;
|
|
283
|
+
if (unit.depends_on.includes(currentId) && unit.status === "pending") {
|
|
284
|
+
skipUnit(plan, unit.id, `Dependency "${currentId}" failed`);
|
|
285
|
+
skipped.push(unit.id);
|
|
286
|
+
failedSet.add(unit.id);
|
|
287
|
+
toCheck.push(unit.id);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return skipped;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Add a discovered work unit to the plan.
|
|
295
|
+
* Discovered units are added to the current or next wave depending on dependencies.
|
|
296
|
+
*/
|
|
297
|
+
export function addDiscoveredUnit(plan, unit) {
|
|
298
|
+
unit.discovered = true;
|
|
299
|
+
plan.units.push(unit);
|
|
300
|
+
plan.single_unit = false;
|
|
301
|
+
// Re-calculate which wave it belongs to
|
|
302
|
+
// Find the highest wave number among its dependencies
|
|
303
|
+
let maxDepWave = 0;
|
|
304
|
+
for (const depId of unit.depends_on) {
|
|
305
|
+
const wave = findWaveForUnit(plan, depId);
|
|
306
|
+
if (wave && wave.number > maxDepWave) {
|
|
307
|
+
maxDepWave = wave.number;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
const targetWaveNum = maxDepWave + 1;
|
|
311
|
+
// Find or create the target wave
|
|
312
|
+
let targetWave = plan.waves.find((w) => w.number === targetWaveNum);
|
|
313
|
+
if (!targetWave) {
|
|
314
|
+
targetWave = {
|
|
315
|
+
number: targetWaveNum,
|
|
316
|
+
unit_ids: [],
|
|
317
|
+
status: "pending",
|
|
318
|
+
};
|
|
319
|
+
plan.waves.push(targetWave);
|
|
320
|
+
plan.waves.sort((a, b) => a.number - b.number);
|
|
321
|
+
}
|
|
322
|
+
targetWave.unit_ids.push(unit.id);
|
|
323
|
+
}
|
|
324
|
+
// ---------------------------------------------------------------------------
|
|
325
|
+
// Execution Result Generation
|
|
326
|
+
// ---------------------------------------------------------------------------
|
|
327
|
+
/**
|
|
328
|
+
* Generate an execution result from the current plan state.
|
|
329
|
+
*/
|
|
330
|
+
export function generateResult(plan) {
|
|
331
|
+
const completed = plan.units.filter((u) => u.status === "completed").length;
|
|
332
|
+
const total = plan.units.length;
|
|
333
|
+
const discovered = plan.units.filter((u) => u.discovered).length;
|
|
334
|
+
let status;
|
|
335
|
+
if (plan.units.every((u) => u.status === "completed")) {
|
|
336
|
+
status = "completed";
|
|
337
|
+
}
|
|
338
|
+
else if (plan.units.some((u) => u.status === "failed")) {
|
|
339
|
+
status = plan.units.some((u) => u.status === "completed") ? "partial" : "failed";
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
status = "partial";
|
|
343
|
+
}
|
|
344
|
+
const waveSummaries = plan.waves.map((wave) => {
|
|
345
|
+
const waveUnits = wave.unit_ids.map((id) => findUnit(plan, id));
|
|
346
|
+
return {
|
|
347
|
+
wave_number: wave.number,
|
|
348
|
+
completed: waveUnits.filter((u) => u.status === "completed").map((u) => u.id),
|
|
349
|
+
failed: waveUnits.filter((u) => u.status === "failed").map((u) => u.id),
|
|
350
|
+
skipped: waveUnits.filter((u) => u.status === "skipped").map((u) => u.id),
|
|
351
|
+
};
|
|
352
|
+
});
|
|
353
|
+
return {
|
|
354
|
+
status,
|
|
355
|
+
units_completed: completed,
|
|
356
|
+
units_total: total,
|
|
357
|
+
discovered_tasks: discovered,
|
|
358
|
+
wave_summaries: waveSummaries,
|
|
359
|
+
completed_at: new Date().toISOString(),
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
// ---------------------------------------------------------------------------
|
|
363
|
+
// Query Helpers
|
|
364
|
+
// ---------------------------------------------------------------------------
|
|
365
|
+
/**
|
|
366
|
+
* Get the next wave that needs execution (first wave with pending/in_progress status).
|
|
367
|
+
* Returns null if all waves are completed or failed.
|
|
368
|
+
*/
|
|
369
|
+
export function getNextWave(plan) {
|
|
370
|
+
return plan.waves.find((w) => w.status === "pending" || w.status === "in_progress") ?? null;
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Get all pending units in a specific wave.
|
|
374
|
+
*/
|
|
375
|
+
export function getPendingUnits(plan, waveNumber) {
|
|
376
|
+
const wave = plan.waves.find((w) => w.number === waveNumber);
|
|
377
|
+
if (!wave)
|
|
378
|
+
return [];
|
|
379
|
+
return wave.unit_ids
|
|
380
|
+
.map((id) => findUnit(plan, id))
|
|
381
|
+
.filter((u) => u.status === "pending");
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Check if a wave is fully completed (all units completed, failed, or skipped).
|
|
385
|
+
*/
|
|
386
|
+
export function isWaveComplete(plan, waveNumber) {
|
|
387
|
+
const wave = plan.waves.find((w) => w.number === waveNumber);
|
|
388
|
+
if (!wave)
|
|
389
|
+
return true;
|
|
390
|
+
return wave.unit_ids.every((id) => {
|
|
391
|
+
const unit = findUnit(plan, id);
|
|
392
|
+
return unit.status === "completed" || unit.status === "failed" || unit.status === "skipped";
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Check if the entire plan is finished (all units in terminal state).
|
|
397
|
+
*/
|
|
398
|
+
export function isPlanComplete(plan) {
|
|
399
|
+
return plan.units.every((u) => u.status === "completed" || u.status === "failed" || u.status === "skipped");
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Get a progress summary string for display.
|
|
403
|
+
*/
|
|
404
|
+
export function getProgressSummary(plan) {
|
|
405
|
+
const completed = plan.units.filter((u) => u.status === "completed").length;
|
|
406
|
+
const failed = plan.units.filter((u) => u.status === "failed").length;
|
|
407
|
+
const skipped = plan.units.filter((u) => u.status === "skipped").length;
|
|
408
|
+
const inProgress = plan.units.filter((u) => u.status === "in_progress").length;
|
|
409
|
+
const pending = plan.units.filter((u) => u.status === "pending").length;
|
|
410
|
+
const total = plan.units.length;
|
|
411
|
+
const currentWave = getNextWave(plan);
|
|
412
|
+
const parts = [
|
|
413
|
+
`${completed}/${total} units completed`,
|
|
414
|
+
];
|
|
415
|
+
if (failed > 0)
|
|
416
|
+
parts.push(`${failed} failed`);
|
|
417
|
+
if (skipped > 0)
|
|
418
|
+
parts.push(`${skipped} skipped`);
|
|
419
|
+
if (inProgress > 0)
|
|
420
|
+
parts.push(`${inProgress} in progress`);
|
|
421
|
+
if (pending > 0)
|
|
422
|
+
parts.push(`${pending} pending`);
|
|
423
|
+
if (currentWave)
|
|
424
|
+
parts.push(`Wave ${currentWave.number}/${plan.waves.length}`);
|
|
425
|
+
return parts.join(" | ");
|
|
426
|
+
}
|
|
427
|
+
// ---------------------------------------------------------------------------
|
|
428
|
+
// Rendering (for STATE.md integration)
|
|
429
|
+
// ---------------------------------------------------------------------------
|
|
430
|
+
/**
|
|
431
|
+
* Render the wave execution plan as a markdown section for STATE.md.
|
|
432
|
+
*/
|
|
433
|
+
export function renderPlanMarkdown(plan) {
|
|
434
|
+
const lines = [
|
|
435
|
+
"## Wave Execution Plan",
|
|
436
|
+
"",
|
|
437
|
+
`**Granularity:** ${plan.granularity}`,
|
|
438
|
+
`**Units:** ${plan.units.length}`,
|
|
439
|
+
`**Waves:** ${plan.waves.length}`,
|
|
440
|
+
`**Single-unit:** ${plan.single_unit ? "yes (no wave overhead)" : "no"}`,
|
|
441
|
+
"",
|
|
442
|
+
];
|
|
443
|
+
for (const wave of plan.waves) {
|
|
444
|
+
const waveUnits = wave.unit_ids.map((id) => findUnit(plan, id));
|
|
445
|
+
const statusIcon = wave.status === "completed" ? "✓" :
|
|
446
|
+
wave.status === "failed" ? "✗" :
|
|
447
|
+
wave.status === "in_progress" ? "▶" : "○";
|
|
448
|
+
lines.push(`### Wave ${wave.number} ${statusIcon}`);
|
|
449
|
+
lines.push("");
|
|
450
|
+
lines.push("| Unit | Status | Criteria | Summary |");
|
|
451
|
+
lines.push("|------|--------|----------|---------|");
|
|
452
|
+
for (const unit of waveUnits) {
|
|
453
|
+
const statusEmoji = statusIcon_(unit.status);
|
|
454
|
+
const criteria = unit.criteria.length > 0 ? unit.criteria.join(", ") : "—";
|
|
455
|
+
const summary = unit.summary?.slice(0, 60) ?? unit.error?.slice(0, 60) ?? "—";
|
|
456
|
+
const discovered = unit.discovered ? " (discovered)" : "";
|
|
457
|
+
lines.push(`| ${unit.name}${discovered} | ${statusEmoji} ${unit.status} | ${criteria} | ${summary} |`);
|
|
458
|
+
}
|
|
459
|
+
lines.push("");
|
|
460
|
+
}
|
|
461
|
+
return lines.join("\n");
|
|
462
|
+
}
|
|
463
|
+
/** Status icon for a work unit. */
|
|
464
|
+
function statusIcon_(status) {
|
|
465
|
+
switch (status) {
|
|
466
|
+
case "completed": return "✓";
|
|
467
|
+
case "failed": return "✗";
|
|
468
|
+
case "in_progress": return "▶";
|
|
469
|
+
case "skipped": return "⊘";
|
|
470
|
+
case "pending": return "○";
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
// ---------------------------------------------------------------------------
|
|
474
|
+
// Internal Helpers
|
|
475
|
+
// ---------------------------------------------------------------------------
|
|
476
|
+
function findUnit(plan, unitId) {
|
|
477
|
+
const unit = plan.units.find((u) => u.id === unitId);
|
|
478
|
+
if (!unit)
|
|
479
|
+
throw new Error(`Unit "${unitId}" not found in plan`);
|
|
480
|
+
return unit;
|
|
481
|
+
}
|
|
482
|
+
function findWaveForUnit(plan, unitId) {
|
|
483
|
+
return plan.waves.find((w) => w.unit_ids.includes(unitId)) ?? null;
|
|
484
|
+
}
|
|
485
|
+
function updateWaveStatus(plan, unitId) {
|
|
486
|
+
const wave = findWaveForUnit(plan, unitId);
|
|
487
|
+
if (!wave)
|
|
488
|
+
return;
|
|
489
|
+
const waveUnits = wave.unit_ids.map((id) => findUnit(plan, id));
|
|
490
|
+
const allDone = waveUnits.every((u) => u.status === "completed" || u.status === "failed" || u.status === "skipped");
|
|
491
|
+
if (allDone) {
|
|
492
|
+
const anyFailed = waveUnits.some((u) => u.status === "failed");
|
|
493
|
+
wave.status = anyFailed ? "failed" : "completed";
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
//# sourceMappingURL=wave-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wave-executor.js","sourceRoot":"","sources":["../../src/workflows/wave-executor.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "solveos-cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Install the solveOS problem-solving framework as slash commands, agents, and hooks into AI coding assistants",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"solveos-cli": "dist/bin/install.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"dev": "tsx",
|
|
12
|
+
"test": "tsx --test tests/state-machine.test.ts tests/artifacts.test.ts tests/templates.test.ts tests/security.test.ts tests/wave-executor.test.ts tests/hooks.test.ts tests/runtime-adapters.test.ts",
|
|
13
|
+
"test:coverage": "c8 --check-coverage --lines 70 --reporter text --reporter lcov tsx --test tests/state-machine.test.ts tests/artifacts.test.ts tests/templates.test.ts tests/security.test.ts tests/wave-executor.test.ts tests/hooks.test.ts tests/runtime-adapters.test.ts",
|
|
14
|
+
"clean": "rm -rf dist",
|
|
15
|
+
"prepublishOnly": "npm run clean && npm run build && npm test"
|
|
16
|
+
},
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/t0k1dev/solveos-cli.git"
|
|
20
|
+
},
|
|
21
|
+
"homepage": "https://github.com/t0k1dev/solveos-cli#readme",
|
|
22
|
+
"bugs": {
|
|
23
|
+
"url": "https://github.com/t0k1dev/solveos-cli/issues"
|
|
24
|
+
},
|
|
25
|
+
"engines": {
|
|
26
|
+
"node": ">= 20.0.0"
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"dist/",
|
|
30
|
+
"commands/",
|
|
31
|
+
"agents/",
|
|
32
|
+
"templates/",
|
|
33
|
+
"README.md",
|
|
34
|
+
"LICENSE"
|
|
35
|
+
],
|
|
36
|
+
"keywords": [
|
|
37
|
+
"solveos",
|
|
38
|
+
"cli",
|
|
39
|
+
"ai",
|
|
40
|
+
"coding-assistant",
|
|
41
|
+
"framework",
|
|
42
|
+
"plan-brief",
|
|
43
|
+
"opencode",
|
|
44
|
+
"claude-code",
|
|
45
|
+
"cursor",
|
|
46
|
+
"gemini-cli",
|
|
47
|
+
"problem-solving",
|
|
48
|
+
"workflow"
|
|
49
|
+
],
|
|
50
|
+
"author": "t0k1dev",
|
|
51
|
+
"license": "MIT",
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@types/node": "^25.5.0",
|
|
54
|
+
"c8": "^11.0.0",
|
|
55
|
+
"tsx": "^4.19.0",
|
|
56
|
+
"typescript": "^5.7.0"
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
## Build Validation Report
|
|
2
|
+
|
|
3
|
+
**Date:** _YYYY-MM-DD_
|
|
4
|
+
**Plan Brief:** _Problem statement or title from BRIEF.md_
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
### Question 1: Does it work?
|
|
9
|
+
|
|
10
|
+
<!-- Does the output function as intended? Can the primary use case be completed
|
|
11
|
+
end-to-end without critical failures? -->
|
|
12
|
+
|
|
13
|
+
**Assessment:** _Works / Partially works / Does not work_
|
|
14
|
+
|
|
15
|
+
**Details:**
|
|
16
|
+
_Explanation of what works and what doesn't_
|
|
17
|
+
|
|
18
|
+
**Issues found:**
|
|
19
|
+
- _Issue description_
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
### Question 2: Does it match the plan?
|
|
24
|
+
|
|
25
|
+
#### Success Criteria Status
|
|
26
|
+
|
|
27
|
+
<!-- Check each success criterion from BRIEF.md individually.
|
|
28
|
+
Status: Pass = fully met, Partial = partially met, Fail = not met -->
|
|
29
|
+
|
|
30
|
+
| # | Criterion | Status | Notes |
|
|
31
|
+
|---|-----------|--------|-------|
|
|
32
|
+
| 1 | _Criterion from BRIEF.md_ | _Pass / Partial / Fail_ | _Details_ |
|
|
33
|
+
| 2 | _Criterion from BRIEF.md_ | _Pass / Partial / Fail_ | _Details_ |
|
|
34
|
+
|
|
35
|
+
**Criteria summary:** _{x} Pass, {y} Partial, {z} Fail out of {total}_
|
|
36
|
+
|
|
37
|
+
#### Scope Drift
|
|
38
|
+
|
|
39
|
+
<!-- Was anything added that wasn't in the plan? Cut from the plan?
|
|
40
|
+
Modified from the original scope? -->
|
|
41
|
+
|
|
42
|
+
**Additions (not in plan):**
|
|
43
|
+
- _Addition — justified / unjustified_
|
|
44
|
+
|
|
45
|
+
**Cuts (in plan but not built):**
|
|
46
|
+
- _Cut — intentional / accidental_
|
|
47
|
+
|
|
48
|
+
**Modifications:**
|
|
49
|
+
- _What changed and why_
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
### Question 3: Is it stable enough to ship?
|
|
54
|
+
|
|
55
|
+
<!-- Are remaining issues known, bounded, and acceptable?
|
|
56
|
+
Would the stated audience have a good experience? -->
|
|
57
|
+
|
|
58
|
+
**Assessment:** _Stable / Conditionally stable / Not stable_
|
|
59
|
+
|
|
60
|
+
**Details:**
|
|
61
|
+
_Explanation_
|
|
62
|
+
|
|
63
|
+
**Time bombs (if any):**
|
|
64
|
+
- _Thing that will break and when_
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
### Known Issues
|
|
69
|
+
|
|
70
|
+
<!-- Catalog all issues found during validation -->
|
|
71
|
+
|
|
72
|
+
| # | Issue | Severity | Decision | Notes |
|
|
73
|
+
|---|-------|----------|----------|-------|
|
|
74
|
+
| 1 | _Description_ | _Critical / High / Medium / Low_ | _Fix now / Defer / Accept_ | _Rationale_ |
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
### Routing Decision
|
|
79
|
+
|
|
80
|
+
- [ ] Pass — ready for Review or Ship
|
|
81
|
+
- [ ] Iterate — return to Build to fix issues
|
|
82
|
+
- [ ] Re-plan — fundamental plan gaps require revising the Plan Brief
|