| name | capture |
|---|---|
| description | Autonomously produce browser-extension launch assets with shotkit, then present the technically verified final media for explicit user approval. Use for CWS/YouTube promo video, X video, YouTube Shorts, store screenshots, listing/privacy evidence, or channel variants. Infer mechanical channel settings, capture, validate, fix, and retry without interrupting the user; bind Approve or Request changes to the exact final file digest. |
| allowed-tools | Bash(shotkit*), Bash(node bin/shotkit.js*), Bash(npm run capture:store*), Bash(npm exec -- playwright install chromium), Read, Edit, Write |
shotkit drives the repo's built extension with Playwright and writes assets
into the config's outDir (default store-assets/). A successful run doubles
as a real-bundle smoke test — a screenshot or clip only appears if that feature
rendered from the shipped code. By default, it also writes a handoff pack:
storyboard.json, captions.json, and shotkit-manifest.json.
-
Translate intent into targets — infer channel profiles from the user's campaign request. Supported targets are
cws-youtube,x, andyoutube-shorts. Do not ask the user to choose viewport, codec, duration, thumbnail timing, or editor. -
Preconditions — the repo has a
shotkit.config.js(or legacystore.config.js); Chromium is installed (npm exec -- playwright install chromium, one-time); the config'sbuildcommand succeeds. -
Create or update one story — keep product actions and captions in one demo and declare channel variants through
targets:demo: { name: 'skillbridge', targets: ['cws-youtube', 'x'], captions: [ { at: 0.5, text: 'Translate the lesson in place' }, { at: 18, text: 'Restore the original anytime' }, ], async run({ page, env, demo, target }) { /* one reusable story */ }, }
Shotkit expands target-specific names, viewport, H.264 MP4, 30-second cap, poster frame, and caption treatment. The
youtube-shortsprofile uses three-word outline focus chunks with an animated current-word highlight and a visual-guide-safe left/bottom placement. UsetargetOptions.<id>only when the shared story genuinely needs target-specific framing or caption tuning. If a desktop UI does not reflow at 720×1280, give Shorts a focusedrunoverride and fixture layout that removes secondary panels and enlarges the action/result. Never squeeze the complete desktop story into the vertical frame. For every localized campaign variant, declarecaptionOptions.typographywith the exact locale and project-local licensed font files. Prefer a font family designed for that script; include fallback faces until glyph QA is complete. Do not rely on the operator machine's system fonts for a publishable multilingual asset. -
Run attempt 1 (from the repo, or pass its path):
shotkit --json --attempt 1 shotkit <path> --json --attempt 1
If repeated composition fixes remain unresolved and the repo declares
config.calibration, startshotkit --calibrate. Keep adjustments inside its authored presets, bounded framing/caption controls, and three protected regions. Save the profile, trigger the real recapture, and continue only from its resultingpublish-readyor structuredneeds-fixstate. Do not ask the user to diagnose composition or operate the controls. Once technical QA passes, openshotkit --campaignfor the user's final media decision.Before npm publication, run the source checkout with
node bin/shotkit.js --json --attempt 1, or use a project wrapper such asnpm run capture:store -- --json.Useful flags:
--scene <name>(one story, expanded variant, static scene,description, orprivacy),--target <id>(one channel target),--no-video(skip the screencast),--mp4(also emit an H.264 mp4 of the demo — needs ffmpeg on PATH orSHOTKIT_FFMPEG),--no-build(reuse an existing build). -
Read the result — stdout is exactly one JSON object:
{ "ok": true, "status": "awaiting-approval", "machineStatus": "publish-ready", "outDir": "...", "manifest": "/abs/path/shotkit-manifest.json", "produced": [...] }. Progress logs go to stderr in--jsonmode. Readhandoff.automationfor technical repair work andhandoff.approvalfor the user decision. Do not use the legacy compatibility review summary. -
Fix, review, and publish through the gate:
needs-fix: apply everyautomation.actions[]item whose owner isagent, edit the config, then rerunautomation.retryScenes[]with--attempt 2. Repeat throughautomation.maxAttempts.blocked: automated attempts are exhausted. Report only the concrete technical blocker and attempted fixes; ask for technical input.awaiting-approval: technical QA passed. Open the Campaign Dashboard and present the rendered candidate to the user. Keep the Calibrator under Advanced for agent-owned composition work. Do not approve on the user's behalf.changes-requested: read the digest-bound decision note, implement it as the next agent-owned edit, recapture, and return the new candidate for another decision.approved: the exact recorded digest passed user review. An authorized uploader may publish that digest; any recapture or profile edit invalidates the decision.not-requested: legacy capture mode; no channel target was configured.
-
On runtime failure — exit code
2= usage/no config found,1= runtime failure; stdout still carries the single JSON payload{ "ok": false, "error": … }. Common causes: build failure, Chromium not installed, an unknown--scene, or a scene's wait timing out (feature didn't render).
- Runs the full-Chromium channel; headless works (
HEADED=0 shotkit …— verified, video included) and is the mode to use in CI. Headed-under-xvfb is unreliable on CI runners — don't use it. - Scenes are the repo's own config — to change what is captured, edit
shotkit.config.js, not shotkit. description.frommay point toSTORE_LISTING.mdfor copy only or toproduct.manifest.jsonfor shared listing + privacy disclosure inputs.privacy-disclosure.mdis a worksheet for store review, not legal policy text.- CWS assets and SNS demo clips have different jobs. For X/SNS clips, prefer
demo.preset: 'sns-video'(1280×720),demo.mp4: { crf: 18 }, 20-40 seconds, short captions, first-result-within-3-seconds, and a before → action → result → safety/restore story. Usesns-twitter(1200×675) for static X card images. - Demo configs can use timed
demo.captionsplus the helper passed todemo.run:demo.caption(text),demo.step(text, async () => { ... }),demo.wait(ms),demo.click(selectorOrLocator, { moveMs, beforeMs, holdMs }), anddemo.select(selectorOrLocator, value, { openMs, holdMs }). Captions, arrow-pointer clicks, and mirrored native-select options render as DOM overlays during recording and avoid the top-left disclaimer badge. Always usedemo.select()for a native<select>because its OS popup is not part of the Playwright page screencast. - For short-form focus captions, prefer authored timed captions and
captionOptions: { mode: 'focus', appearance: 'outline', wordsPerChunk: 3, wordMs: 360 }. Shotkit animates those words deterministically even when the product demo is silent; do not add speech transcription solely to create caption motion. Shorts enables this mode by default, while CWS and X stay static unless overridden. The resolved style is recorded in both caption and storyboard handoff docs;captions.jsonalso carries the trim-relative renderedtimeline[]. Treat adense-focus-captionlint as an agent-owned timing fix, never drop words. - Locale typography is a harness contract, not a prompt-only suggestion. Set
typography.locale,family,minFontSize,maxFontSize,maxLines, and one or morefonts[].frompaths. Shotkit preserves authored separators, verifies glyph coverage, embeds and waits for those fonts, then records the resolved size and line balance. Fixcaption-locale-missing,caption-font-not-embedded,caption-missing-glyph,caption-font-load-failed,caption-typography-not-applied,caption-type-fit-failed, andcaption-unbalanced-linesbefore presenting the candidate. - Runtime caption QA measures the actual DOM frames for bounds, overflow, line count, outline stroke, missing frames, and timing drift. Treat every resulting storyboard warning as an agent-owned config fix and rerun the target.
storyboard.jsoncarries structured lint (code,severity,message,fix) for agents. Treat those warnings as the edit list for the nextshotkit.config.jspass.- Use
demos: []for multiple campaign cuts. Each entry needs a uniquenamebecause it becomes<name>.webmand optional<name>.mp4;--scene <name>reruns just that clip. - Use
thumbnail: { at: 1.2 }for poster frames,zoom: { scale: 1.04 }or a smallcropwhen the UI is too small. Keep storyboard lint on for every channel target;storyboardLint:falseis only for legacy, non-publishing smoke clips and producesneeds-fixfor a target. - Shotkit is not a timeline editor. It automates the repeatable channel work (capture, trim, framing, captions, encode, poster frame, QA) and leaves manual editors disabled by default. Use manifest roles instead of guessing files.
- Target workflows default to
automation.manualFallback:false; manual editor recommendations are omitted. Never suggest iMovie, Screen Studio, Canva, or manual recapture unless the user explicitly requests a manual fallback. - Machine
publish-readymeans the final file passed shotkit's automated story, codec, pixel-format, actual-dimension, actual-duration, full-video decode, thumbnail-dimension, nonblank-frame, integrity, and channel-profile checks. It is not user approval. Publication additionally requireshandoff.approval.publishable:trueand an authorized connector. - Validate a received pack through
handoff.schemaFiles; schema paths are relative to the manifest directory. On partial runs, compare each asset'srunIdwithmanifest.run.idand inspectstatebefore assuming it was refreshed.