From 43d35cebf92ca9e5c68c379d3fecf8a71349bee1 Mon Sep 17 00:00:00 2001 From: Miguel Angel Simon Sierra Date: Wed, 8 Jul 2026 16:40:23 -0400 Subject: [PATCH] chore(cli): add-flag test, webm-alpha telemetry, subcomp-media comment (R1 follow-ups) - #2067: add regression coverage for add --no-clipboard flag negation. - #2044: emit fleet telemetry when WebM alpha is dropped. - #2062: document browser media timing invariant for numeric data-start. --- packages/cli/src/telemetry/events.test.ts | 13 +++++ packages/cli/src/telemetry/events.ts | 6 +++ .../src/utils/reject-unknown-flags.test.ts | 5 ++ .../cli/src/utils/reject-unknown-flags.ts | 2 +- packages/cli/src/utils/webmAlphaCheck.test.ts | 51 ++++++++++++++++++- packages/cli/src/utils/webmAlphaCheck.ts | 2 + .../producer/src/services/htmlCompiler.ts | 5 ++ 7 files changed, 81 insertions(+), 3 deletions(-) diff --git a/packages/cli/src/telemetry/events.test.ts b/packages/cli/src/telemetry/events.test.ts index 5801d8f9be..2754aae80c 100644 --- a/packages/cli/src/telemetry/events.test.ts +++ b/packages/cli/src/telemetry/events.test.ts @@ -20,6 +20,7 @@ const { trackFigmaImport, trackRenderFeedback, trackRenderPreflightRejected, + trackWebmAlphaDropped, trackAuthLoginStarted, trackAuthLoginCompleted, trackAuthLoginFailed, @@ -199,6 +200,18 @@ describe("trackCommandFailure", () => { }); }); +describe("trackWebmAlphaDropped", () => { + beforeEach(() => { + trackEvent.mockClear(); + }); + + it("emits a minimal dropped-alpha event", () => { + trackWebmAlphaDropped(); + + expect(trackEvent).toHaveBeenCalledWith("webm_alpha_dropped", {}); + }); +}); + describe("trackFigmaImport", () => { beforeEach(() => { trackEvent.mockClear(); diff --git a/packages/cli/src/telemetry/events.ts b/packages/cli/src/telemetry/events.ts index a6d0176767..bffeb70036 100644 --- a/packages/cli/src/telemetry/events.ts +++ b/packages/cli/src/telemetry/events.ts @@ -488,6 +488,12 @@ export function trackTranscribeUnavailable(props: { optional: boolean }): void { trackEvent("transcribe_unavailable", { optional: props.optional }); } +// Track dropped WebM alpha as an environment signal, so fleet telemetry can +// reveal ffmpeg/libvpx-vp9 builds and OS combinations that need MOV fallback. +export function trackWebmAlphaDropped(): void { + trackEvent("webm_alpha_dropped", {}); +} + // A skills install was skipped because a required prerequisite binary is // absent from PATH (e.g. git on a fresh Windows box). Best-effort callers // (init) skip cleanly rather than crash, so the skip is otherwise invisible; diff --git a/packages/cli/src/utils/reject-unknown-flags.test.ts b/packages/cli/src/utils/reject-unknown-flags.test.ts index 09dd114e7e..987a4d8bb0 100644 --- a/packages/cli/src/utils/reject-unknown-flags.test.ts +++ b/packages/cli/src/utils/reject-unknown-flags.test.ts @@ -1,5 +1,6 @@ import { describe, expect, it } from "vitest"; import type { ArgsDef, CommandDef } from "citty"; +import addCmd from "../commands/add.js"; import { assertKnownFlags } from "./reject-unknown-flags.js"; const cmd = { @@ -39,6 +40,10 @@ describe("assertKnownFlags", () => { expect(ok(["--no-docker"])).not.toThrow(); }); + it("accepts add command --no-clipboard negation", () => { + expect(() => assertKnownFlags(addCmd, ["shader-wipe", "--no-clipboard"])).not.toThrow(); + }); + it("accepts global flags and stops at --", () => { expect(ok(["--help"])).not.toThrow(); expect(ok(["--json"])).not.toThrow(); diff --git a/packages/cli/src/utils/reject-unknown-flags.ts b/packages/cli/src/utils/reject-unknown-flags.ts index e8007b879b..f030fd4bfe 100644 --- a/packages/cli/src/utils/reject-unknown-flags.ts +++ b/packages/cli/src/utils/reject-unknown-flags.ts @@ -53,7 +53,7 @@ function unknownFlagIn(tok: string, known: Set): string | null { * + the global set). Only dash-prefixed tokens are inspected, so positionals and * flag values pass through untouched. Stops at `--`. */ -export function assertKnownFlags(cmd: CommandDef, rawArgs: string[]): void { +export function assertKnownFlags(cmd: CommandDef, rawArgs: string[]): void { if (!Array.isArray(rawArgs)) return; // citty types `args` as Resolvable (it may be a fn/promise); every // hyperframes command uses a static object, so treat anything else as "no diff --git a/packages/cli/src/utils/webmAlphaCheck.test.ts b/packages/cli/src/utils/webmAlphaCheck.test.ts index 7fc812ff0a..07d7354277 100644 --- a/packages/cli/src/utils/webmAlphaCheck.test.ts +++ b/packages/cli/src/utils/webmAlphaCheck.test.ts @@ -1,5 +1,28 @@ -import { describe, expect, it } from "vitest"; -import { webmAlphaAdvisory } from "./webmAlphaCheck.js"; +import { beforeEach, describe, expect, it, vi } from "vitest"; + +const execFileSync = vi.fn(); +const findFFprobe = vi.fn(); +const trackWebmAlphaDropped = vi.fn(); + +vi.mock("node:child_process", () => ({ + execFileSync: (...args: unknown[]) => execFileSync(...args), +})); + +vi.mock("../browser/ffmpeg.js", () => ({ + findFFprobe: () => findFFprobe(), +})); + +vi.mock("../telemetry/events.js", () => ({ + trackWebmAlphaDropped: () => trackWebmAlphaDropped(), +})); + +const { webmAlphaAdvisory, warnIfWebmAlphaDropped } = await import("./webmAlphaCheck.js"); + +beforeEach(() => { + execFileSync.mockReset(); + findFFprobe.mockReset(); + trackWebmAlphaDropped.mockReset(); +}); describe("webmAlphaAdvisory", () => { it("warns when a probed webm lacks the ALPHA_MODE sidecar tag", () => { @@ -27,3 +50,27 @@ describe("webmAlphaAdvisory", () => { expect(webmAlphaAdvisory("mov", { probed: true, alphaMode: false })).toBeUndefined(); }); }); + +describe("warnIfWebmAlphaDropped", () => { + it("tracks telemetry when a completed WebM lost alpha", () => { + findFFprobe.mockReturnValue("/usr/bin/ffprobe"); + execFileSync.mockReturnValue(JSON.stringify({ streams: [{ codec_name: "vp9", tags: {} }] })); + const warn = vi.spyOn(console, "warn").mockImplementation(() => {}); + + try { + warnIfWebmAlphaDropped("out.webm", "webm", false); + } finally { + warn.mockRestore(); + } + + expect(trackWebmAlphaDropped).toHaveBeenCalledTimes(1); + }); + + it("does not track telemetry when quiet or not rendering WebM", () => { + warnIfWebmAlphaDropped("out.webm", "webm", true); + warnIfWebmAlphaDropped("out.mp4", "mp4", false); + + expect(trackWebmAlphaDropped).not.toHaveBeenCalled(); + expect(findFFprobe).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/cli/src/utils/webmAlphaCheck.ts b/packages/cli/src/utils/webmAlphaCheck.ts index af1074c543..529e888059 100644 --- a/packages/cli/src/utils/webmAlphaCheck.ts +++ b/packages/cli/src/utils/webmAlphaCheck.ts @@ -1,5 +1,6 @@ import { execFileSync } from "node:child_process"; import { findFFprobe } from "../browser/ffmpeg.js"; +import { trackWebmAlphaDropped } from "../telemetry/events.js"; import { c } from "../ui/colors.js"; /** @@ -96,6 +97,7 @@ export function warnIfWebmAlphaDropped(outputPath: string, format: string, quiet if (quiet || format !== "webm") return; const advisory = webmAlphaAdvisory(format, probeWebmAlpha(outputPath)); if (!advisory) return; + trackWebmAlphaDropped(); console.warn(`\n${c.warn("⚠")} ${c.bold("Transparency not preserved")}`); console.warn(` ${c.dim(advisory)}\n`); } diff --git a/packages/producer/src/services/htmlCompiler.ts b/packages/producer/src/services/htmlCompiler.ts index fdffd8aaa2..4acb770b38 100644 --- a/packages/producer/src/services/htmlCompiler.ts +++ b/packages/producer/src/services/htmlCompiler.ts @@ -1920,6 +1920,11 @@ export async function discoverMediaFromBrowser(page: Page): Promise