Releases: kadj-amoah/showrunner
Releases · kadj-amoah/showrunner
Release list
v1.1.8
Added
- Bare-command welcome detects missing
ffmpegandffprobealongsidechromium. Lists per-OS install hints (apt / pacman / dnf / brew / winget). - Init wizard prints the resolved cwd and gates further prompts behind an explicit confirm before scaffolding.
Docs
- README first-demo section leads with
cd <product-root>and explains why runninginitfrom a non-product directory breaks the scaffold's defaults. - New "After installing: run the doctor first" section pointing at the system-only
showrunner doctorpass.
v1.1.7
Fixed
understand --agentwas spawningclaudewith cwd =process.cwd(), which is typically the scaffold directory rather than the product codebase. The agent had nothing useful to read and timed out.
Added
--project-dir <path>flag onshowrunner understandfor explicit per-invocation override.project.codebase_rootfield on the config schema, resolved relative to the config's directory.- Resolution order when
--agentis set:--project-dirflag, thenproject.codebase_root, thenconfigDir/..(when-cis given), thenprocess.cwd(). The resolved path is logged alongside the rule that selected it. - Scaffolded
demo.yamlwritescodebase_root: ..by default.
Changed
- Claude spawn passes
--allowedTools "Read,Glob,Grep"explicitly. - Agent timeout reduced from 180s to 90s.
v1.1.6
Added
showrunner understand --agentdelegates project exploration to the localclaudeCLI. Spawnsclaude -p --output-format json; the agent uses its native Read/Glob/Grep tools to walk the project and synthesiseproduct_model.jsonmatching the existing Zod schema. Mutually exclusive with--interactive. Errors ifclaudeis missing from PATH.
Changed
- Error message for empty
comprehension.sourcesnow names all three options: add a source,--interactive, or--agent.
Known limitations
type: codebaseentries incomprehension.sourcesremain non-functional in the non---agentpath. Directories are silently skipped andinclude/excludeglobs are ignored. Wiring real codebase support to the document path remains future work.
v1.1.5
Added
showrunner set-target -c <config> --url <url>re-probes a URL and rewritesrecording.target_urlindemo.yaml.--forceskips the probe.- Port-scan during
init. When the typed URL doesn't respond, probes common dev ports onlocalhostin parallel (3000, 3001, 4321, 5173, 5174, 8000, 8080) and offers responding ports as aselect. - Agent-driven dev-server discovery. When the LLM provider is
agent_bridgeandclaudeis on PATH, the wizard offers to inspect the project, propose a dev-server command + URL, spawn it detached and unref'd, then poll the URL for up to 60 seconds. Reports the spawned PID.
Changed
init's URL section is now a cascade: direct probe → port-scan → optional agent discovery → fallback. Each step short-circuits on success.src/setup/targetProbe.tsis shared betweeninitandset-target.
Known limitations
- Spawned dev-server PIDs are not tracked across runs. Stop manually with
kill <pid>. set-targetrewritesdemo.yamlviayaml.dump, which strips comments.- Agent discovery only fires when the LLM provider is
agent_bridge.
v1.1.4
Added
showrunner initis interactive by default when stdout is a TTY. The wizard detects the environment (claudeCLI,ffmpeg/ffprobe, chromium, provider env vars), then prompts through project name, resolution, LLM provider (defaults toagent_bridgewhenclaudeis detected), inline API key paste, TTS provider, inline API key paste, target URL with a HEAD probe.- A real
.envis written with the pasted keys alongside.env.example. --yesflag skips prompts and uses defaults or passed flags. Automatically forced when stdout is not a TTY.@clack/promptsdependency for the wizard UI.
Changed
initnext-steps footer adapts to wizard state. Skips the "edit.env" step when keys were pasted; lists only the still-missing keys otherwise.
v1.1.3
Changed
- Bare-command welcome rewritten. Each state (chromium missing / no project / in project) now shows one next command and one line of context, instead of a 15-line block that duplicated
init's footer. initnext-steps footer split conflated steps. Each required env var is listed individually with the provider's dashboard URL; theagent_bridgealternative is a single parenthetical at the end.
v1.1.2
Fixed
showrunner --versioncrashed on fresh global install withERR_MODULE_NOT_FOUNDfor@babel/parser. The babel runtime dependencies (@babel/parser,@babel/traverse,@babel/types) used by theinstrumentstage were indevDependenciesand therefore absent from the published tarball. Moved todependencies.@types/babel__traversestays indevDependencies(type-only).
Added
showrunner install-browsersubcommand. Wraps the bundledplaywright-coreCLI directly, sidestepping the "install your dependencies first" warning that barenpx playwright installemits when invoked outside a Node project.- Welcome detects missing chromium and surfaces an
install-browserhint.
v1.1.1
Changed
- Replace
playwrightwithplaywright-core. Eliminates the ~300 MB browser auto-download onnpm install.npx playwright install chromiumis now a required post-install step (enforced bydoctor). doctorfailure rows include per-OS install hints forffmpegandffprobe(apt / pacman / dnf on Linux, brew on macOS, winget / choco on Windows).doctorprobes the root / admin Playwright cache and warns when a browser is present there but missing from the user cache (the typical aftermath ofsudo npx playwright install).
Removed
fluent-ffmpegand@types/fluent-ffmpeg. The package was listed but never imported; ffmpeg invocations have always gone throughchild_process.spawnvia the internalrunFfmpeg()wrapper.
Fixed
- Generated Playwright spec at
src/manifest/playwrightCodegen.tsimportedexpectfrom'playwright', which doesn't export it. Theassert_visibleaction now emitslocator.waitFor({ state: 'visible' }).
Docs
- README leads with
npx @kadj-amoah/showrunner. Browser bootstrap (npx playwright install chromium) is called out as required. - Troubleshooting note added for Arch / CachyOS / Fedora users who see Playwright's "OS not officially supported" warning during browser install.
v1.1.0 — first release
Changelog
All notable changes to Showrunner are documented here. Format follows Keep a Changelog; the project tracks loose semver — minor bumps for new capability, patch for fixes.
1.1.0 — 2026-05-23
First tagged release. Versioned 1.1.0 rather than 0.1.0 because the project has been tracked as "v1.1 — reliability hardening + provider-agnostic refactor" throughout development; this is the first cut where the pipeline works end-to-end against real Next.js targets and the LLM + TTS layers are swappable. No 1.0.0 was ever published.
Added
- Provider-agnostic LLM layer (
llm.default+ per-stagellm.overrides). Four providers:anthropic— Claude via the official SDK with structured outputs.openai—gpt-4o-style models viaresponse_format: json_schemawithjson_objectfallback.agent_bridge— spawn a headless CLI agent likeclaude -p --output-format json; no API key on file required. Supportsspawnandfile_pollmodes.custom— dynamic-import an operator-supplied module conforming to theLLMProviderinterface.
- Provider-agnostic TTS layer (
voiceover.provider). Three providers:elevenlabs— the only one that returns per-character alignment.openai—tts-1-hdvia the audio API.custom— dynamic-import for in-house TTS pipelines.
alignment_strategy: required | best_effort— when a TTS provider doesn't return alignment, switch automatically to per-segment synthesis (one TTS call per segment) so audio doesn't get sliced across mid-word boundaries.showrunner doctor— preflight checks before any run. Validates config syntax, provider env vars, ffmpeg + ffprobe on PATH, Playwright chromium binary, target URL reachability, free disk on every output dir, free memory + computed ffmpeg thread cap, and lifecycle script executability. Wired intorunimplicitly (escape with--skip-doctor).showrunner record-actionswith scroll capture. Drives a headed browser; captures click / input / change / keydown / submit / scroll events; coalesces them into a clean action stream. Scroll capture is 250 ms debounced with direction coalescing.- DOM preflight in the
scriptstage — scrapes the live target's actionable selector inventory (≈60–80 entries on a typical marketing site) before asking the LLM for a manifest. The LLM is constrained to inventory selectors only, with a one-shot remediation retry if it strays. - Resource preflight in
recordandmuxstages — checks free disk against estimated artifact sizes, computes an ffmpeg-threadscap from free RAM × resolution × quality preset (SHOWRUNNER_FFMPEG_THREADSenv override available). - Structured ffmpeg errors — categorized as
oom | no_space | codec_missing | permission | unknown, with per-category remediation hints. --resolutionflag on bothinitandrun. Presets:low(854×480),standard(720p, the default),high(1080p),extreme(4K). Onrunit overrides bothrecording.viewportandoutput.resolutionin one step so they stay matched and mux doesn't upscale.initflags:--llm-provider,--tts-provider,--resolution. Scaffolds ademo.yamlwith the right provider blocks, an.env.examplelisting only the env vars that combination actually needs (deduplicated when LLM + TTS both use OpenAI), and a realdocs/PRD.mdstub with section guides.- Legacy config auto-migration — pre-v0.1
demo.yamlfiles with flatvoiceover.{voice_id, model, ...}fields and nollmblock are normalized at load time. Existing configs keep working with zero edits. validate --strict— exit nonzero on missing provider env vars (otherwise warns).- Captions — SRT + VTT emitted alongside the final MP4 when
output.captions.enabledis set. Whole-segment cues are used as a fallback when per-character alignment isn't available.
Changed
engines.nodebumped to>=20.6(needed forprocess.loadEnvFile).initdefaults:script.vo_review_gate: false(was true),recording.viewport: 1280×720(was 1920×1080),output.resolution: 1280x720. Each is opt-in to the larger/stricter value via a one-line edit.tsupconfigured withskipNodeModulesBundle: trueandtarget: 'node20'. Builtdist/cli.jsdropped from 1.75 MB to 247 KB and no longer crashes withDynamic require of "tty" is not supported—npm linkandnpm i -gare viable now.- README rewritten for v0.1 — install path (with
npm link), full prereqs (Node ≥ 20.6, ffmpeg, chromium), provider-choice tables, pipeline-per-stage table, daily-commands cookbook, troubleshooting section.
Fixed
understand --interactiveno longer silently exits after the second question on piped stdin. Replacedreadline/promises.question()with a queued'line'-event reader that handles both TTY and pipe semantics.understand --output <path>now correctly takes precedence overproject.product_modelin the config (was silently overridden).- Script-stage prompt now bans Tailwind arbitrary-value class names (
.max-w-[1280px]) which aren't legal CSS and crashed Playwright with aSyntaxError. A post-validator catches violations and retries once with a remediation prompt before accepting the manifest. looksUnstable()heuristic now catches Next.js compiled-CSS classes like__variable_3eb911(leading underscores were previously slipping past).muxoutput write now falls back to a timestamped sibling MP4 when the canonical path is locked by a media player, with a warning, instead of failing the run.
Known limitations (Tier 3 — coded but not exercised end-to-end)
- OpenAI LLM + OpenAI TTS provider paths are wired but were not run with a real API key in v0.1 validation. The agent_bridge + ElevenLabs combination is the validated default.
agent_bridgefile_poll mode is coded but onlyspawnmode was exercised.- Custom provider modules (LLM + TTS) — dynamic-import loader is wired but no reference implementation has been swapped in.
instrument,capture-auth,trace,preview,rerun-segment,print-vo,approve-vocommands are mostly thin wrappers but were not stress-tested in v0.1.- Background music mix and title-card logo / custom-font rendering are coded but were not exercised.
- 1920×1080 mux remains RAM-sensitive on tight boxes; the thread-cap heuristic mitigates but the safe default is
--resolution standard.
Validation artifact
A real end-to-end run against the Credstone Atlas marketing site produced output/ct-website-atlas_demo.mp4 (4.3 MB, H.264 + AAC, 1280×720, 48.2 s, with SRT + VTT) using:
agent_bridgeLLM (via localclaudeCLI, no Anthropic key on file)- ElevenLabs TTS with
alignment_strategy: required - DOM preflight + selector validator producing inventory-only manifest selectors
- Full mux preflight + thread cap on a 5.9 GB RAM machine with 1.1 GB free at run time