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.
Files changed (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +194 -0
  3. package/agents/solveos-build-validator.md +183 -0
  4. package/agents/solveos-debugger.md +226 -0
  5. package/agents/solveos-executor.md +187 -0
  6. package/agents/solveos-plan-validator.md +200 -0
  7. package/agents/solveos-planner.md +190 -0
  8. package/agents/solveos-researcher.md +152 -0
  9. package/agents/solveos-reviewer.md +263 -0
  10. package/commands/solveos/archive.md +106 -0
  11. package/commands/solveos/build.md +170 -0
  12. package/commands/solveos/fast.md +85 -0
  13. package/commands/solveos/new-cycle.md +165 -0
  14. package/commands/solveos/new.md +142 -0
  15. package/commands/solveos/next.md +86 -0
  16. package/commands/solveos/plan.md +139 -0
  17. package/commands/solveos/quick.md +109 -0
  18. package/commands/solveos/research.md +117 -0
  19. package/commands/solveos/review.md +198 -0
  20. package/commands/solveos/ship.md +129 -0
  21. package/commands/solveos/status.md +78 -0
  22. package/commands/solveos/validate-build.md +155 -0
  23. package/commands/solveos/validate-plan.md +115 -0
  24. package/dist/bin/install.d.ts +11 -0
  25. package/dist/bin/install.d.ts.map +1 -0
  26. package/dist/bin/install.js +158 -0
  27. package/dist/bin/install.js.map +1 -0
  28. package/dist/hooks/brief-anchor.d.ts +68 -0
  29. package/dist/hooks/brief-anchor.d.ts.map +1 -0
  30. package/dist/hooks/brief-anchor.js +236 -0
  31. package/dist/hooks/brief-anchor.js.map +1 -0
  32. package/dist/hooks/context-monitor.d.ts +70 -0
  33. package/dist/hooks/context-monitor.d.ts.map +1 -0
  34. package/dist/hooks/context-monitor.js +166 -0
  35. package/dist/hooks/context-monitor.js.map +1 -0
  36. package/dist/lib/artifacts.d.ts +63 -0
  37. package/dist/lib/artifacts.d.ts.map +1 -0
  38. package/dist/lib/artifacts.js +382 -0
  39. package/dist/lib/artifacts.js.map +1 -0
  40. package/dist/lib/config.d.ts +10 -0
  41. package/dist/lib/config.d.ts.map +1 -0
  42. package/dist/lib/config.js +29 -0
  43. package/dist/lib/config.js.map +1 -0
  44. package/dist/lib/runtime-adapters/claude-code.d.ts +18 -0
  45. package/dist/lib/runtime-adapters/claude-code.d.ts.map +1 -0
  46. package/dist/lib/runtime-adapters/claude-code.js +125 -0
  47. package/dist/lib/runtime-adapters/claude-code.js.map +1 -0
  48. package/dist/lib/runtime-adapters/cursor.d.ts +18 -0
  49. package/dist/lib/runtime-adapters/cursor.d.ts.map +1 -0
  50. package/dist/lib/runtime-adapters/cursor.js +113 -0
  51. package/dist/lib/runtime-adapters/cursor.js.map +1 -0
  52. package/dist/lib/runtime-adapters/gemini-cli.d.ts +18 -0
  53. package/dist/lib/runtime-adapters/gemini-cli.d.ts.map +1 -0
  54. package/dist/lib/runtime-adapters/gemini-cli.js +127 -0
  55. package/dist/lib/runtime-adapters/gemini-cli.js.map +1 -0
  56. package/dist/lib/runtime-adapters/opencode.d.ts +14 -0
  57. package/dist/lib/runtime-adapters/opencode.d.ts.map +1 -0
  58. package/dist/lib/runtime-adapters/opencode.js +109 -0
  59. package/dist/lib/runtime-adapters/opencode.js.map +1 -0
  60. package/dist/lib/runtime-detect.d.ts +22 -0
  61. package/dist/lib/runtime-detect.d.ts.map +1 -0
  62. package/dist/lib/runtime-detect.js +73 -0
  63. package/dist/lib/runtime-detect.js.map +1 -0
  64. package/dist/lib/security.d.ts +88 -0
  65. package/dist/lib/security.d.ts.map +1 -0
  66. package/dist/lib/security.js +230 -0
  67. package/dist/lib/security.js.map +1 -0
  68. package/dist/types.d.ts +224 -0
  69. package/dist/types.d.ts.map +1 -0
  70. package/dist/types.js +31 -0
  71. package/dist/types.js.map +1 -0
  72. package/dist/workflows/state-machine.d.ts +55 -0
  73. package/dist/workflows/state-machine.d.ts.map +1 -0
  74. package/dist/workflows/state-machine.js +271 -0
  75. package/dist/workflows/state-machine.js.map +1 -0
  76. package/dist/workflows/wave-executor.d.ts +112 -0
  77. package/dist/workflows/wave-executor.d.ts.map +1 -0
  78. package/dist/workflows/wave-executor.js +496 -0
  79. package/dist/workflows/wave-executor.js.map +1 -0
  80. package/package.json +58 -0
  81. package/templates/build-validation.md +82 -0
  82. package/templates/config-default.json +21 -0
  83. package/templates/plan-brief.md +106 -0
  84. package/templates/plan-validation-log.md +77 -0
  85. package/templates/post-ship-review.md +75 -0
  86. package/templates/pre-ship-review.md +56 -0
  87. 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