taskplane 0.28.1 → 0.28.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.
@@ -517,9 +517,11 @@ function renderSummary(batch) {
517
517
  const checkboxDone = ws.checked === ws.total && ws.total > 0;
518
518
  const pastWave = ws.waveIdx < currentWaveIdx;
519
519
  const batchDone = batch.phase === "completed";
520
- // TP-178: During merging, only past waves are done; current wave is merging, future waves are pending (#493)
520
+ // TP-178: During merging, only past waves are truly done. The current wave's
521
+ // checkboxDone/allSucceeded can be true (tasks finished) but the wave itself
522
+ // isn't done until the merge completes. (#493)
521
523
  const isMerging = batch.phase === "merging";
522
- const isDone = checkboxDone || pastWave || batchDone || ws.allSucceeded;
524
+ const isDone = batchDone || pastWave || (!isMerging && (checkboxDone || ws.allSucceeded));
523
525
  const isMergingWave = isMerging && ws.waveIdx === currentWaveIdx;
524
526
  const isCurrent = ws.waveIdx === currentWaveIdx && (batch.phase === "executing" || isMerging);
525
527
  const isFuture = ws.waveIdx > currentWaveIdx && (batch.phase === "executing" || isMerging);
@@ -711,7 +713,10 @@ function renderLanesTasks(batch, sessions) {
711
713
  // TP-176: Succeeded tasks always show 100% regardless of sidecar/statusData (#491).
712
714
  let progressHtml = "";
713
715
  const v2p = ls && ls._v2Progress;
714
- const useV2 = v2p && v2p.total > 0 && ls.taskId === task.taskId;
716
+ const taskMatch = v2p && ls.taskId === task.taskId;
717
+ // Split V2 usage: progress needs totals > 0, but step/iter can be used whenever present
718
+ const useV2Progress = taskMatch && v2p.total > 0;
719
+ const useV2Step = taskMatch && !!v2p.currentStep;
715
720
  if (task.status === "succeeded") {
716
721
  // #491 fix: succeeded tasks always show 100%
717
722
  progressHtml = `
@@ -719,9 +724,9 @@ function renderLanesTasks(batch, sessions) {
719
724
  <div class="task-progress-bar"><div class="task-progress-fill pct-hi" style="width:100%"></div></div>
720
725
  <span class="task-progress-text">100%</span>
721
726
  </div>`;
722
- } else if (sd || useV2) {
723
- const displayChecked = useV2 ? v2p.checked : (sd ? sd.checked : 0);
724
- const displayTotal = useV2 ? v2p.total : (sd ? sd.total : 0);
727
+ } else if (useV2Progress || (sd && sd.total > 0)) {
728
+ const displayChecked = useV2Progress ? v2p.checked : sd.checked;
729
+ const displayTotal = useV2Progress ? v2p.total : sd.total;
725
730
  const displayProgress = displayTotal > 0 ? Math.round((displayChecked / displayTotal) * 100) : 0;
726
731
  const fillClass = pctClass(displayProgress);
727
732
  progressHtml = `
@@ -731,20 +736,20 @@ function renderLanesTasks(batch, sessions) {
731
736
  </div>
732
737
  <span class="task-progress-text">${displayProgress}% ${displayChecked}/${displayTotal}</span>
733
738
  </div>`;
734
- } else if (task.status === "pending") {
735
- progressHtml = `
736
- <div class="task-progress">
737
- <div class="task-progress-bar"><div class="task-progress-fill pct-0" style="width:0%"></div></div>
738
- <span class="task-progress-text">0%</span>
739
- </div>`;
740
739
  } else if (task.status === "running") {
741
- // TP-178: Show executing indicator for running tasks without sidecar data (#494)
742
- // This covers non-final segment execution where the sidecar hasn't started yet.
740
+ // #494 fix: running tasks without meaningful totals show executing indicator
741
+ // This covers non-final segments, early execution before sidecar captures, and stale 0/0 data
743
742
  progressHtml = `
744
743
  <div class="task-progress">
745
744
  <div class="task-progress-bar"><div class="task-progress-fill pct-low task-progress-executing" style="width:100%"></div></div>
746
745
  <span class="task-progress-text">executing…</span>
747
746
  </div>`;
747
+ } else if (task.status === "pending") {
748
+ progressHtml = `
749
+ <div class="task-progress">
750
+ <div class="task-progress-bar"><div class="task-progress-fill pct-0" style="width:0%"></div></div>
751
+ <span class="task-progress-text">0%</span>
752
+ </div>`;
748
753
  } else {
749
754
  progressHtml = '<span style="color:var(--text-faint)">—</span>';
750
755
  }
@@ -756,10 +761,11 @@ function renderLanesTasks(batch, sessions) {
756
761
  if (task.status === "succeeded") {
757
762
  // TP-178: Succeeded tasks always show "Complete" regardless of sidecar data (#491)
758
763
  stepHtml = '<span style="color:var(--green)">Complete</span>';
759
- } else if (sd || (useV2 && v2p)) {
760
- const stepName = (useV2 && v2p && v2p.currentStep) ? v2p.currentStep : (sd ? sd.currentStep : "Unknown");
761
- const iter = (useV2 && v2p && v2p.iteration != null) ? v2p.iteration : (sd ? sd.iteration : 0);
762
- const revs = (useV2 && v2p && v2p.reviews != null) ? v2p.reviews : (sd ? sd.reviews : 0);
764
+ } else if (sd || useV2Step) {
765
+ // #488 fix: prefer V2 step name whenever present (even if totals are 0)
766
+ const stepName = useV2Step ? v2p.currentStep : (sd ? sd.currentStep : "Unknown");
767
+ const iter = (useV2Step && v2p.iteration != null) ? v2p.iteration : (sd ? sd.iteration : 0);
768
+ const revs = (useV2Step && v2p.reviews != null) ? v2p.reviews : (sd ? sd.reviews : 0);
763
769
  stepHtml = escapeHtml(stepName);
764
770
  if (iter > 0) stepHtml += `<span class="task-iter">i${iter}</span>`;
765
771
  if (revs > 0) stepHtml += `<span class="task-iter">r${revs}</span>`;