comfy-qa 1.13.0 → 1.15.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "comfy-qa",
3
- "version": "1.13.0",
3
+ "version": "1.15.0",
4
4
  "description": "ComfyUI QA automation CLI",
5
5
  "repository": {
6
6
  "type": "git",
@@ -604,9 +604,11 @@ function generateSpec(results: ResearchResults, checklist: Checklist): string {
604
604
  }
605
605
 
606
606
  if (setupLines.length > 0) {
607
- const actionBody = visualLines.length > 0
608
- ? visualLines.map(l => ` ${l}`).join("\n") + "\n await pace();"
609
- : " await pace();";
607
+ // Interleave visual actions with pace() calls so the cursor moves
608
+ // throughout the narration, not just once at the start.
609
+ const interleavedAction = visualLines.length > 0
610
+ ? visualLines.map(l => ` ${l}\n await pace();`).join("\n")
611
+ : " await pace();\n await pace();";
610
612
 
611
613
  segments.push(` // ${icon} ${op.id} (${op.type}) — PASS
612
614
  .segment(${JSON.stringify(narration)}, {
@@ -614,17 +616,18 @@ function generateSpec(results: ResearchResults, checklist: Checklist): string {
614
616
  ${setupLines.map(l => ` ${l}`).join("\n")}
615
617
  },
616
618
  action: async (pace) => {
617
- ${actionBody}
619
+ ${interleavedAction}
618
620
  },
619
621
  })`);
620
622
  } else {
621
- const bodyLines = visualLines.length > 0
622
- ? visualLines.map(l => ` ${l}`).join("\n") + "\n await pace();"
623
- : " await pace();";
623
+ // Interleave visual actions with pace() so cursor moves during narration
624
+ const interleaved = visualLines.length > 0
625
+ ? visualLines.map(l => ` ${l}\n await pace();`).join("\n")
626
+ : " await pace();\n await pace();";
624
627
 
625
628
  segments.push(` // ${icon} ${op.id} (${op.type}) — PASS
626
629
  .segment(${JSON.stringify(narration)}, async (pace) => {
627
- ${bodyLines}
630
+ ${interleaved}
628
631
  })`);
629
632
  }
630
633
  } else {
@@ -664,22 +667,28 @@ import { createVideoScript } from "../lib/demowright/dist/index.mjs";
664
667
  const SCORECARD_HTML = ${JSON.stringify(scorecardHtml)};
665
668
 
666
669
  test("${slug} QA evidence", async ({ page }) => {
667
- test.setTimeout(10 * 60_000);
670
+ test.setTimeout(20 * 60_000);
668
671
 
669
672
  const script = createVideoScript()
670
673
  .title(${JSON.stringify(checklist.product + " QA")}, {
671
674
  subtitle: "Score: ${results.totalPassed}/${results.totalOperations} (${results.scorePercent}%)",
672
- durationMs: 3000,
675
+ durationMs: 3500,
673
676
  })
674
677
  ${segments.join("\n")}
675
678
 
676
- // Render the full scorecard as the last segment (visible for ~8s)
679
+ // Render the full scorecard as the last segment narration is intentionally
680
+ // long (~15s) so the card stays on screen long enough to read.
677
681
  .segment(${JSON.stringify(buildScorecardNarration(results, checklist))}, {
678
682
  setup: async () => {
679
683
  await page.setContent(SCORECARD_HTML, { waitUntil: "domcontentloaded" });
680
684
  await page.waitForTimeout(500);
681
685
  },
682
686
  action: async (pace) => {
687
+ // Multiple pace() calls distribute the full narration duration
688
+ // across visible card time (so card is held, not rushed to outro)
689
+ await pace();
690
+ await pace();
691
+ await pace();
683
692
  await pace();
684
693
  },
685
694
  })
@@ -687,7 +696,7 @@ ${segments.join("\n")}
687
696
  .outro({
688
697
  text: "QA Results: ${results.totalPassed}/${results.totalOperations} (${results.scorePercent}%)",
689
698
  subtitle: ${JSON.stringify(scoreLines.join(" | "))},
690
- durationMs: 4000,
699
+ durationMs: 5000,
691
700
  });
692
701
 
693
702
  // Pre-generate TTS BEFORE navigating — avoids idle time in recording