demobite 1.8.1 → 1.8.3

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.
@@ -141,6 +141,19 @@ if (needed.length) {
141
141
  if (r.status === 0) ok("Playwright ready");
142
142
  else warn(`Install failed — run: npm install --prefix ~/.claude/skills/agentic-recorder ${needed.join(" ")}`);
143
143
  }
144
+ // Playwright's OWN ffmpeg: recordVideo needs it even when the real Chrome is
145
+ // the browser (founder's test 2026-10-14: the first take failed — the
146
+ // launcher had checked the system ffmpeg, not the one Playwright's capture
147
+ // uses, and with Chrome present `playwright install` never ran). Always.
148
+ {
149
+ const pw = path.join(dest, "node_modules", "playwright", "cli.js");
150
+ const marker = path.join(dest, ".pw-ffmpeg-ready");
151
+ if (!fs.existsSync(marker) && fs.existsSync(pw)) {
152
+ const r = spawnSync("node", [pw, "install", "ffmpeg"], { stdio: "inherit", cwd: dest });
153
+ if (r.status === 0) { fs.writeFileSync(marker, new Date().toISOString()); ok("Playwright's video encoder ready"); }
154
+ else warn(`Playwright's ffmpeg install failed — run: node ${pw} install ffmpeg`);
155
+ } else if (fs.existsSync(marker)) ok("Playwright's video encoder ready");
156
+ }
144
157
  // No Chrome on this machine: fetch Playwright's Chromium once so the first
145
158
  // take has a browser. Linux needs the shared libraries too (--with-deps).
146
159
  if (!haveChrome) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "demobite",
3
- "version": "1.8.1",
3
+ "version": "1.8.3",
4
4
  "description": "The DemoBites agentic recorder — you prompt, it films a real browser, and DemoBites turns the take into an editable demo bite.",
5
5
  "bin": {
6
6
  "demobite": "launcher/index.mjs"
package/skill/SKILL.md CHANGED
@@ -24,6 +24,7 @@ The plugin is a product. Every line you say is read by the person who asked for
24
24
  - **Progress you can glance at.** While filming, relay record.mjs's `Filming ████░░ step n of N` line. While writing the storyboard, one dim line of what you are reading.
25
25
  - **Plain words only.** Never on screen: dry run, control, selector, resolves, beat, surface, profile, headed, Playwright, vocab, obstacle, revert, JSON, storyboard.json, manifest, take. Use: step, demo, page, window, sign in, film, deliver, Demos grid.
26
26
  - **Demo, never recording.** The thing the person gets is a demo; the act is filming.
27
+ - **Findings go to us, never to the person.** Anything you learned about the recorder, the installer, the camera or DemoBites itself (a title that got cut, a merge rule, a missing encoder) is written to `.recorder/notes.md` in the project — dated, one paragraph each — and never said in the chat. The person asked for a demo, not a report on our product. (Founder 2026-10-14: "all this nonsense and all this explanation is not relevant.")
27
28
 
28
29
  ## Phase 0: Auth gate, ALWAYS FIRST — announced, never silent
29
30
 
@@ -88,6 +89,8 @@ Write the answers to `.recorder/config.json` and never ask again:
88
89
 
89
90
  ## Phase 1a: The address and the sign-in — in the FIRST reply
90
91
 
92
+ The plugin's record door does this step BEFORE loading this file (so the window opens within seconds, not after you have read these pages). If `signin.mjs --check <url>` already says "session", or the window is already open, skip this phase — never ask the sign-in question twice.
93
+
91
94
  Work out the starting address yourself, in seconds: the person's words if they named one, else `url` in `.recorder/config.json`, else the codebase (the app's dev server, the route the brief points at). Then:
92
95
 
93
96
  ```bash
@@ -364,7 +367,7 @@ On the person's "1": say "Filming. About <m:ss>; I'll tell you when it lands." a
364
367
 
365
368
  ## Phase 6: Deliver into DemoBites
366
369
 
367
- When `upload.mjs` prints its last line, say: "✓ Delivered. \"<title>\" (<m:ss>) is landing in your Demos grid now: <base>/demos — watch it come in there. You can change any sentence, the voice and the zooms in the editor." When minutes ran out, relay upload.mjs's "Kept…" line as it is.
370
+ When `upload.mjs` prints its last line, say ONE line: "✓ Delivered. \"<title>\" (<m:ss>) is being prepared — about two minutes; I'll give you the link when it's ready." Then run `node scripts/status.mjs <takeDir>` (it waits until the demo is completed and prints `Studio: <url>`). When it does, say exactly, and only: "✓ Ready — open it: <that url>". That is the LAST line of the whole run: no notes, no findings, no list of what happened (those go to `.recorder/notes.md`, How you talk). When minutes ran out, relay upload.mjs's "Kept…" line as it is, and stop.
368
371
 
369
372
 
370
373
  Send the TRIMMED CLEAN take into DemoBites. The studio owns the look: NO backdrop, NO rounded corners, NO shadow on the uploaded file. Everything (voice, zooms, look, intro, outro) becomes editable there.