Node.js 18 is EOL and the toolchain init installs no longer supports it:
current Playwright releases and the skills CLI both require Node.js 20+.
Bump engines for screenci and create-screenci, run the CI smoke matrix on
Node.js 20, and update the setup docs.
Add a captureAudio record option that records system audio alongside the
screen recording and mixes it into the rendered video starting at time 0.
- screenAudio.ts: spawn ffmpeg to capture the platform default loopback
source (PulseAudio default.monitor on Linux, avfoundation on macOS, WASAPI
loopback on Windows), with a graceful stdin 'q' stop and an exit-settler
pattern that avoids a race where an early ffmpeg exit hung stop() forever.
- video.ts: start capture when captureAudio > 0 and attach the captured
track via addScreenAudioTrack after the recording finalizes.
- events.ts: addScreenAudioTrack injects an audioStart event at timeMs 0.
- types.ts: document captureAudio as a linear gain value (0 disables).
- browserLaunchOptions.ts: drop Playwright's default --mute-audio via
ignoreDefaultArgs so headless Chromium actually outputs audio to the
system mixer where the ffmpeg monitor can capture it.
- cli.ts: upload audioStart assets, add wav/m4a/aac content types, and add
an alwaysUpload flag so the per-recording screen-audio file bypasses
content-hash dedup and is never skipped as "already exists".
- docs: add the screen-audio guide with per-OS and CI setup, register it in
the manifest, and link it from ci-setup.
- ci.yml: add an audio-capture integration job across ubuntu/macos/windows.
Resolve config by walking up for a flat screenci.config.ts only. When the
command runs from outside the island and a nested screenci/screenci.config.ts
is found, exit with guidance to cd into it, rather than silently running a
registry-downloaded CLI version. Run smoke-test CI steps from inside the
island so they exercise the local build.
Install the dev dependencies that share install flags (@playwright/test,
@types/node, @playwright/cli) in a single command, keeping screenci
separate since pnpm needs --allow-build=ffmpeg-static. Resolves the
dependency graph twice instead of four times.
Make the generated island pnpm-workspace.yaml version-aware: pnpm 11
removed onlyBuiltDependencies in favour of allowBuilds, so a flagless
pnpm install on pnpm 11 silently skipped the ffmpeg-static build.
Resolve the pnpm version before writing the workspace file and emit the
matching approval key.
Add a pnpm 10 + 11 CI job (scripts/assert-ffmpeg-built.js) that runs
init and asserts the ffmpeg-static binary built, including a flagless
reinstall that relies only on the generated workspace approval.