orchestrix-yuri 4.1.6 → 4.1.8

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.
@@ -596,7 +596,7 @@ class PhaseOrchestrator {
596
596
  */
597
597
  _gatherDevProgress() {
598
598
  const result = {
599
- totalEpics: 0, doneEpics: 0,
599
+ totalEpics: 0, currentEpic: 0,
600
600
  totalStories: 0, doneStories: 0,
601
601
  byStatus: {},
602
602
  currentAgent: null, currentWindow: null, currentStory: null,
@@ -617,6 +617,8 @@ class PhaseOrchestrator {
617
617
  const count = parseInt(countStr, 10) || 0;
618
618
  if (key === 'Epics') {
619
619
  result.totalEpics = count;
620
+ } else if (key === 'CurrentEpic') {
621
+ result.currentEpic = count;
620
622
  } else if (key && count > 0) {
621
623
  result.byStatus[key] = count;
622
624
  result.totalStories += count;
@@ -648,7 +650,10 @@ class PhaseOrchestrator {
648
650
  const prdDir = path.join(this._projectRoot, 'docs', 'prd');
649
651
  if (fs.existsSync(prdDir)) {
650
652
  try {
651
- result.totalEpics = fs.readdirSync(prdDir).filter((f) => /^epic/i.test(f)).length;
653
+ const epicNums = fs.readdirSync(prdDir)
654
+ .map((f) => { const m = f.match(/^epic-(\d+)/i); return m ? parseInt(m[1], 10) : 0; })
655
+ .filter((n) => n > 0);
656
+ result.totalEpics = epicNums.length > 0 ? Math.max(...epicNums) : 0;
652
657
  } catch { /* ok */ }
653
658
  }
654
659
  }
@@ -690,7 +695,7 @@ class PhaseOrchestrator {
690
695
  ];
691
696
 
692
697
  if (p.totalEpics > 0) {
693
- lines.push(`Epic: ${p.doneEpics}/${p.totalEpics}`);
698
+ lines.push(`Epic: ${p.currentEpic}/${p.totalEpics}`);
694
699
  }
695
700
  lines.push(`Story: ${p.doneStories}/${p.totalStories} (${pct}%)`);
696
701
  lines.push(`${bar}`);
@@ -570,6 +570,8 @@ class Router {
570
570
  let byStatus = {};
571
571
  let totalStories = 0;
572
572
  let doneStories = 0;
573
+ let totalEpics = 0;
574
+ let currentEpic = 0;
573
575
  const scriptPath = path.join(os.homedir(), '.claude', 'skills', 'yuri', 'scripts', 'scan-stories.sh');
574
576
  if (fs.existsSync(scriptPath)) {
575
577
  const output = execSync(`bash "${scriptPath}" "${projectRoot}"`, { encoding: 'utf8', timeout: 10000 }).trim();
@@ -579,6 +581,8 @@ class Router {
579
581
  const n = parseInt(cnt, 10) || 0;
580
582
  if (key === 'Epics') {
581
583
  totalEpics = n;
584
+ } else if (key === 'CurrentEpic') {
585
+ currentEpic = n;
582
586
  } else if (n > 0) {
583
587
  byStatus[key] = n;
584
588
  totalStories += n;
@@ -624,7 +628,10 @@ class Router {
624
628
  const prdDir = path.join(projectRoot, 'docs', 'prd');
625
629
  if (fs.existsSync(prdDir)) {
626
630
  try {
627
- totalEpics = fs.readdirSync(prdDir).filter((f) => /^epic/i.test(f)).length;
631
+ const epicNums = fs.readdirSync(prdDir)
632
+ .map((f) => { const m = f.match(/^epic-(\d+)/i); return m ? parseInt(m[1], 10) : 0; })
633
+ .filter((n) => n > 0);
634
+ totalEpics = epicNums.length > 0 ? Math.max(...epicNums) : 0;
628
635
  } catch { /* ok */ }
629
636
  }
630
637
  }
@@ -642,7 +649,9 @@ class Router {
642
649
  const bar = '▓'.repeat(filled) + '░'.repeat(barLen - filled);
643
650
 
644
651
  const lines = ['📊 **Dev Progress Report**', '━━━━━━━━━━━━━━━━━━━━━'];
645
- if (totalEpics > 0) lines.push(`Epic: ${totalEpics}`);
652
+ if (totalEpics > 0) {
653
+ lines.push(`Epic: ${currentEpic}/${totalEpics}`);
654
+ }
646
655
  lines.push(`Story: ${doneStories}/${totalStories} (${pct}%)`);
647
656
  lines.push(`${bar} ${pct}%`);
648
657
  lines.push('━━━━━━━━━━━━━━━━━━━━━');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orchestrix-yuri",
3
- "version": "4.1.6",
3
+ "version": "4.1.8",
4
4
  "description": "Yuri — Meta-Orchestrator for Orchestrix. Drive your entire project lifecycle with natural language.",
5
5
  "main": "lib/installer.js",
6
6
  "bin": {
@@ -38,6 +38,15 @@ for status in Done InProgress Review Blocked Approved AwaitingArchReview Require
38
38
  echo "$status:$count"
39
39
  done
40
40
 
41
- # Count epics by unique filename prefix (e.g., 1.x epic 1, 2.x → epic 2)
42
- epics=$(ls "$STORIES_DIR" 2>/dev/null | grep -oE '^[0-9]+' | sort -u | wc -l | tr -d ' ')
43
- echo "Epics:$epics"
41
+ # Count total epics from docs/prd/epic-N-*.yaml (max N = total epics)
42
+ PRD_DIR="$1/docs/prd"
43
+ if [ -d "$PRD_DIR" ]; then
44
+ epics=$(ls "$PRD_DIR" 2>/dev/null | grep -oE '^epic-[0-9]+' | grep -oE '[0-9]+' | sort -n | tail -1)
45
+ echo "Epics:${epics:-0}"
46
+ else
47
+ echo "Epics:0"
48
+ fi
49
+
50
+ # Current epic (max prefix from story files)
51
+ current_epic=$(ls "$STORIES_DIR" 2>/dev/null | grep -oE '^[0-9]+' | sort -n | tail -1)
52
+ echo "CurrentEpic:${current_epic:-0}"