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,
|
|
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
|
-
|
|
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.
|
|
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}`);
|
package/lib/gateway/router.js
CHANGED
|
@@ -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
|
-
|
|
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)
|
|
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
|
@@ -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
|
|
42
|
-
|
|
43
|
-
|
|
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}"
|