orchestrix-yuri 4.8.7 → 4.8.9
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.
|
@@ -722,6 +722,8 @@ class PhaseOrchestrator {
|
|
|
722
722
|
}).trim();
|
|
723
723
|
|
|
724
724
|
if (output && output !== 'NO_STORIES_DIR') {
|
|
725
|
+
let planned = 0;
|
|
726
|
+
let created = 0;
|
|
725
727
|
for (const line of output.split('\n')) {
|
|
726
728
|
if (!line.includes(':')) continue;
|
|
727
729
|
const colonIdx = line.indexOf(':');
|
|
@@ -729,7 +731,9 @@ class PhaseOrchestrator {
|
|
|
729
731
|
const value = line.slice(colonIdx + 1);
|
|
730
732
|
|
|
731
733
|
if (key === 'Total') {
|
|
732
|
-
|
|
734
|
+
planned = parseInt(value, 10) || 0;
|
|
735
|
+
} else if (key === 'Created') {
|
|
736
|
+
created = parseInt(value, 10) || 0;
|
|
733
737
|
} else if (key === 'Epics') {
|
|
734
738
|
result.totalEpics = parseInt(value, 10) || 0;
|
|
735
739
|
} else if (key === 'CurrentEpic') {
|
|
@@ -742,8 +746,11 @@ class PhaseOrchestrator {
|
|
|
742
746
|
result.byStatus[statusName] = (result.byStatus[statusName] || 0) + 1;
|
|
743
747
|
if (statusName === 'Done') result.doneStories++;
|
|
744
748
|
}
|
|
745
|
-
// 'Created' is metadata — skip (Total is the authoritative count)
|
|
746
749
|
}
|
|
750
|
+
// Use actual story files as ground truth — YAML plans can be stale
|
|
751
|
+
result.totalStories = Math.max(planned, created);
|
|
752
|
+
// Ensure current epic is counted in total
|
|
753
|
+
if (result.currentEpic > result.totalEpics) result.totalEpics = result.currentEpic;
|
|
747
754
|
}
|
|
748
755
|
} catch { /* fallback to phase3.yaml */ }
|
|
749
756
|
}
|
package/lib/gateway/router.js
CHANGED
|
@@ -1074,8 +1074,9 @@ Reply with ONLY one word: small, medium, or large. Nothing else.`;
|
|
|
1074
1074
|
const runMin = Math.floor(runMs / 60000);
|
|
1075
1075
|
const elapsed = runMin < 60 ? `${runMin}min` : `${Math.floor(runMin / 60)}h ${runMin % 60}min`;
|
|
1076
1076
|
|
|
1077
|
-
// 6. Build card
|
|
1078
|
-
const total = totalPlanned
|
|
1077
|
+
// 6. Build card — use actual story files as ground truth, not stale YAML
|
|
1078
|
+
const total = Math.max(totalPlanned, createdStories);
|
|
1079
|
+
if (currentEpic > totalEpics) totalEpics = currentEpic; // ensure current epic counted
|
|
1079
1080
|
const pct = total > 0 ? Math.min(100, Math.round(doneStories / total * 100)) : 0;
|
|
1080
1081
|
const barLen = 20;
|
|
1081
1082
|
const filled = Math.min(barLen, Math.round(pct / 100 * barLen));
|
|
@@ -1085,7 +1086,7 @@ Reply with ONLY one word: small, medium, or large. Nothing else.`;
|
|
|
1085
1086
|
if (totalEpics > 0) {
|
|
1086
1087
|
lines.push(`Epic: ${currentEpic}/${totalEpics}`);
|
|
1087
1088
|
}
|
|
1088
|
-
lines.push(`Story: ${doneStories}/${total}
|
|
1089
|
+
lines.push(`Story: ${doneStories}/${total} (${pct}%)`);
|
|
1089
1090
|
lines.push(`${bar} ${pct}%`);
|
|
1090
1091
|
lines.push('━━━━━━━━━━━━━━━━━━━━━');
|
|
1091
1092
|
|
package/package.json
CHANGED
|
@@ -70,8 +70,11 @@ for f in "$STORIES_DIR"/*.md; do
|
|
|
70
70
|
blocked) echo "StatusBlocked:$fname" ;;
|
|
71
71
|
approved|ready) echo "StatusApproved:$fname" ;;
|
|
72
72
|
draft|new|todo|pending|open) echo "StatusDraft:$fname" ;;
|
|
73
|
+
awaitingarchreview|awaiting_arch_review) echo "StatusAwaitingArchReview:$fname" ;;
|
|
74
|
+
requiresrevision|requires_revision) echo "StatusRequiresRevision:$fname" ;;
|
|
75
|
+
escalated) echo "StatusEscalated:$fname" ;;
|
|
73
76
|
"") echo "StatusNoStatus:$fname" ;;
|
|
74
|
-
*) echo "
|
|
77
|
+
*) echo "Status${status}:$fname" ;;
|
|
75
78
|
esac
|
|
76
79
|
done
|
|
77
80
|
|