baro-ai 0.22.1 → 0.22.2

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/dist/cli.mjs CHANGED
@@ -7525,6 +7525,55 @@ function extractStderr(e) {
7525
7525
  return e instanceof Error ? e.message : String(e);
7526
7526
  }
7527
7527
 
7528
+ // ../baro-orchestrator/src/dag.ts
7529
+ function buildDag(stories, options = {}) {
7530
+ const onlyIncomplete = options.onlyIncomplete ?? false;
7531
+ const completedIds = new Set(
7532
+ stories.filter((s) => s.passes === true).map((s) => s.id)
7533
+ );
7534
+ const active = onlyIncomplete ? stories.filter((s) => s.passes !== true) : stories.slice();
7535
+ const storyMap = new Map(active.map((s) => [s.id, s]));
7536
+ const inDegree = /* @__PURE__ */ new Map();
7537
+ const dependents = /* @__PURE__ */ new Map();
7538
+ for (const s of active) {
7539
+ const activeDeps = (s.dependsOn ?? []).filter(
7540
+ (d) => storyMap.has(d) && (!onlyIncomplete || !completedIds.has(d))
7541
+ );
7542
+ inDegree.set(s.id, activeDeps.length);
7543
+ for (const dep of activeDeps) {
7544
+ const list = dependents.get(dep) ?? [];
7545
+ list.push(s.id);
7546
+ dependents.set(dep, list);
7547
+ }
7548
+ }
7549
+ const levels = [];
7550
+ let queue = active.filter((s) => (inDegree.get(s.id) ?? 0) === 0);
7551
+ while (queue.length > 0) {
7552
+ queue.sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));
7553
+ levels.push({ storyIds: queue.map((s) => s.id) });
7554
+ const next = [];
7555
+ for (const s of queue) {
7556
+ const deps = dependents.get(s.id);
7557
+ if (!deps) continue;
7558
+ for (const dependentId of deps) {
7559
+ const remaining = (inDegree.get(dependentId) ?? 0) - 1;
7560
+ inDegree.set(dependentId, remaining);
7561
+ if (remaining === 0) {
7562
+ const story = storyMap.get(dependentId);
7563
+ if (story) next.push(story);
7564
+ }
7565
+ }
7566
+ }
7567
+ queue = next;
7568
+ }
7569
+ const placed = new Set(levels.flatMap((l) => l.storyIds));
7570
+ if (placed.size !== active.length) {
7571
+ const cycled = active.filter((s) => !placed.has(s.id)).map((s) => s.id);
7572
+ throw new Error(`Dependency cycle detected: ${cycled.join(", ")}`);
7573
+ }
7574
+ return levels;
7575
+ }
7576
+
7528
7577
  // ../baro-orchestrator/src/participants/auditor.ts
7529
7578
  import { appendFileSync, mkdirSync } from "fs";
7530
7579
  import { dirname } from "path";
@@ -7901,55 +7950,6 @@ var Auditor = class extends Participant {
7901
7950
  import { existsSync, readFileSync as readFileSync2 } from "fs";
7902
7951
  import { join } from "path";
7903
7952
 
7904
- // ../baro-orchestrator/src/dag.ts
7905
- function buildDag(stories, options = {}) {
7906
- const onlyIncomplete = options.onlyIncomplete ?? false;
7907
- const completedIds = new Set(
7908
- stories.filter((s) => s.passes === true).map((s) => s.id)
7909
- );
7910
- const active = onlyIncomplete ? stories.filter((s) => s.passes !== true) : stories.slice();
7911
- const storyMap = new Map(active.map((s) => [s.id, s]));
7912
- const inDegree = /* @__PURE__ */ new Map();
7913
- const dependents = /* @__PURE__ */ new Map();
7914
- for (const s of active) {
7915
- const activeDeps = (s.dependsOn ?? []).filter(
7916
- (d) => storyMap.has(d) && (!onlyIncomplete || !completedIds.has(d))
7917
- );
7918
- inDegree.set(s.id, activeDeps.length);
7919
- for (const dep of activeDeps) {
7920
- const list = dependents.get(dep) ?? [];
7921
- list.push(s.id);
7922
- dependents.set(dep, list);
7923
- }
7924
- }
7925
- const levels = [];
7926
- let queue = active.filter((s) => (inDegree.get(s.id) ?? 0) === 0);
7927
- while (queue.length > 0) {
7928
- queue.sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));
7929
- levels.push({ storyIds: queue.map((s) => s.id) });
7930
- const next = [];
7931
- for (const s of queue) {
7932
- const deps = dependents.get(s.id);
7933
- if (!deps) continue;
7934
- for (const dependentId of deps) {
7935
- const remaining = (inDegree.get(dependentId) ?? 0) - 1;
7936
- inDegree.set(dependentId, remaining);
7937
- if (remaining === 0) {
7938
- const story = storyMap.get(dependentId);
7939
- if (story) next.push(story);
7940
- }
7941
- }
7942
- }
7943
- queue = next;
7944
- }
7945
- const placed = new Set(levels.flatMap((l) => l.storyIds));
7946
- if (placed.size !== active.length) {
7947
- const cycled = active.filter((s) => !placed.has(s.id)).map((s) => s.id);
7948
- throw new Error(`Dependency cycle detected: ${cycled.join(", ")}`);
7949
- }
7950
- return levels;
7951
- }
7952
-
7953
7953
  // ../baro-orchestrator/src/prd.ts
7954
7954
  import { readFileSync, writeFileSync } from "fs";
7955
7955
  var STORY_DEFAULTS = { retries: 2 };
@@ -9919,6 +9919,10 @@ async function orchestrate(config) {
9919
9919
  depends_on: s.dependsOn
9920
9920
  }))
9921
9921
  });
9922
+ const dagLevels = buildDag(prd.userStories).map(
9923
+ (lvl) => lvl.storyIds.map((id) => ({ id }))
9924
+ );
9925
+ emit({ type: "dag", levels: dagLevels });
9922
9926
  }
9923
9927
  env.deliverContextItem(operator, new RunStartRequestItem("orchestrate"));
9924
9928
  const summary = await conductor.done;
@@ -10286,6 +10290,18 @@ async function main() {
10286
10290
  process.exit(1);
10287
10291
  }
10288
10292
  }
10293
+ process.on("unhandledRejection", (reason) => {
10294
+ const stack = reason?.stack ?? String(reason);
10295
+ process.stderr.write(`[cli] unhandledRejection: ${stack}
10296
+ `);
10297
+ process.exit(1);
10298
+ });
10299
+ process.on("uncaughtException", (err) => {
10300
+ const stack = err?.stack ?? String(err);
10301
+ process.stderr.write(`[cli] uncaughtException: ${stack}
10302
+ `);
10303
+ process.exit(1);
10304
+ });
10289
10305
  main().catch((e) => {
10290
10306
  process.stderr.write(`[cli] unhandled: ${e?.stack ?? String(e)}
10291
10307
  `);