diff --git a/.github/scripts/create-tapes.js b/.github/scripts/create-tapes.js
index 387b19e..6658396 100644
--- a/.github/scripts/create-tapes.js
+++ b/.github/scripts/create-tapes.js
@@ -46,13 +46,37 @@ Sleep ${wait}s`;
? 'Enter\nSleep 1s\nEnter'
: 'Enter';
+ // VHS Type command must be single-line; split multi-line prompts
+ const lines = text.split('\n');
+ let typeBlock;
+ if (lines.length > 1) {
+ typeBlock = lines
+ .map((line, i) => i < lines.length - 1 ? `Type "${line}"\nEnter` : `Type "${line}"`)
+ .join('\n');
+ } else {
+ typeBlock = `Type "${text}"`;
+ }
+
+ // Break response wait into chunks with periodic hidden nudges.
+ // A hidden space+backspace forces copilot's TUI to scroll to the input area.
+ const nudgeInterval = 3;
+ let waitBlock = '';
+ let remaining = wait;
+ while (remaining > nudgeInterval) {
+ waitBlock += `Sleep ${nudgeInterval}s\nHide\nType " "\nBackspace\nShow\n`;
+ remaining -= nudgeInterval;
+ }
+ if (remaining > 0) {
+ waitBlock += `Sleep ${remaining}s`;
+ }
+
return `# ${label}
-Type "${text}"
+${typeBlock}
Sleep 2s
${enterBlock}
-# Wait for response
-Sleep ${wait}s`;
+# Wait for response (with periodic nudges to keep input visible)
+${waitBlock}`;
}
function generateTapeContent(demo, settings) {
@@ -95,9 +119,14 @@ Sleep ${s.startupWait}s
${promptBlocks}
+# Nudge TUI to scroll to input area
+Type " "
+Backspace
+Sleep ${s.exitWait}s
+
# Exit cleanly
Ctrl+C
-Sleep ${s.exitWait}s
+Sleep 1s
`;
}
diff --git a/.github/scripts/demos.json b/.github/scripts/demos.json
index f041f97..a5cffd1 100644
--- a/.github/scripts/demos.json
+++ b/.github/scripts/demos.json
@@ -7,8 +7,8 @@
"typingSpeed": "60ms",
"framerate": 10,
"startupWait": 5,
- "responseWait": 25,
- "exitWait": 2
+ "responseWait": 40,
+ "exitWait": 3
},
"demos": [
{
@@ -69,14 +69,14 @@
"chapter": "03-development-workflows",
"name": "refactor-demo",
"description": "Workflow 2: Refactoring - refactor command handling to dictionary dispatch",
- "responseWait": 30,
+ "responseWait": 60,
"prompt": "@samples/book-app-project/book_app.py Refactor the command handling to use a dictionary dispatch pattern instead of if/elif chains"
},
{
"chapter": "03-development-workflows",
"name": "fix-bug-demo",
"description": "Workflow 3: Debugging - debug a search issue",
- "responseWait": 30,
+ "responseWait": 60,
"prompt": "@samples/book-app-buggy/books_buggy.py Users report that searching for 'The Hobbit' returns no results even though it's in the data. Debug why."
},
{
@@ -110,8 +110,8 @@
"chapter": "05-skills",
"name": "skill-trigger-demo",
"description": "Copilot detects and triggers a matching skill",
- "responseWait": 45,
- "prompt": "Review the book collection code for issues"
+ "responseWait": 120,
+ "prompt": "Check the book collection code for quality issues"
},
{
"chapter": "06-mcp-servers",
@@ -129,22 +129,6 @@
{ "text": "@samples/book-app-project/books.py What code handles the search functionality?", "responseWait": 20 },
{ "text": "Based on the code, suggest improvements for the search feature", "responseWait": 30 }
]
- },
- {
- "chapter": "07-putting-it-together",
- "name": "full-review-demo",
- "description": "Idea to merged PR: plan, implement, test a new feature",
- "prompts": [
- { "text": "I need to add a 'list unread' command to the book app that shows only books where read is False. What files need to change?", "responseWait": 25 },
- { "text": "/agent", "agentSelect": "python-reviewer", "arrowDown": 3, "responseWait": 3 },
- { "text": "@samples/book-app-project/books.py Design a get_unread_books method. What is the best approach?", "responseWait": 30 },
- { "text": "/agent", "agentSelect": "pytest-helper", "arrowDown": 2, "responseWait": 3 },
- { "text": "@samples/book-app-project/tests/test_books.py Design test cases for filtering unread books.", "responseWait": 30 },
- { "text": "Add a get_unread_books method to BookCollection in books.py. Add a 'list unread' command option in book_app.py. Update the help text in the show_help function.", "responseWait": 30 },
- { "text": "Generate comprehensive tests for the new feature", "responseWait": 35 },
- { "text": "/review", "responseWait": 25 },
- { "text": "Create a pull request titled 'Feature: Add list unread books command'", "responseWait": 25 }
- ]
}
]
}
diff --git a/.github/scripts/preview-gifs.js b/.github/scripts/preview-gifs.js
new file mode 100644
index 0000000..f3fec52
--- /dev/null
+++ b/.github/scripts/preview-gifs.js
@@ -0,0 +1,108 @@
+#!/usr/bin/env node
+/**
+ * Extract a preview frame from each demo GIF for quick visual inspection.
+ * Saves individual PNG frames to demo-previews/ directory.
+ *
+ * Requires: ffmpeg, gifsicle (for frame delay info)
+ *
+ * Usage:
+ * node preview-gifs.js # default: 3s before end
+ * node preview-gifs.js --before 5 # 5s before end
+ */
+
+const { execSync } = require('child_process');
+const { readdirSync, existsSync, mkdirSync, rmSync } = require('fs');
+const { join, basename } = require('path');
+
+const rootDir = join(__dirname, '..', '..');
+const previewDir = join(rootDir, 'demo-previews');
+
+// Parse CLI args
+const args = process.argv.slice(2);
+let beforeSeconds = 3;
+
+for (let i = 0; i < args.length; i++) {
+ if (args[i] === '--before' && args[i + 1]) {
+ beforeSeconds = parseFloat(args[++i]);
+ }
+}
+
+// Find all demo GIFs
+function findGifs() {
+ const gifs = [];
+ for (const entry of readdirSync(rootDir)) {
+ if (!/^\d{2}-/.test(entry)) continue;
+ const imagesDir = join(rootDir, entry, 'images');
+ if (!existsSync(imagesDir)) continue;
+ for (const file of readdirSync(imagesDir)) {
+ if (file.endsWith('-demo.gif')) {
+ gifs.push({ path: join(imagesDir, file), chapter: entry });
+ }
+ }
+ }
+ return gifs.sort((a, b) => a.path.localeCompare(b.path));
+}
+
+// Get frame delays from a GIF
+function getFrameDelays(gifPath) {
+ const output = execSync(`gifsicle --info "${gifPath}"`, { encoding: 'utf8', maxBuffer: 50 * 1024 * 1024 });
+ const delays = [];
+ const delayRegex = /delay (\d+(?:\.\d+)?)s/g;
+ let match;
+ while ((match = delayRegex.exec(output)) !== null) {
+ delays.push(parseFloat(match[1]));
+ }
+ return delays;
+}
+
+// Find frame index at N seconds before the end
+function frameAtSecondsBeforeEnd(delays, seconds) {
+ const totalTime = delays.reduce((a, b) => a + b, 0);
+ const targetTime = totalTime - seconds;
+ if (targetTime <= 0) return 0;
+
+ let cumulative = 0;
+ for (let i = 0; i < delays.length; i++) {
+ cumulative += delays[i];
+ if (cumulative >= targetTime) return i;
+ }
+ return delays.length - 1;
+}
+
+// Main
+if (existsSync(previewDir)) rmSync(previewDir, { recursive: true });
+mkdirSync(previewDir, { recursive: true });
+
+const gifs = findGifs();
+if (gifs.length === 0) {
+ console.log('No demo GIFs found');
+ process.exit(0);
+}
+
+console.log(`\nExtracting frames (${beforeSeconds}s before end) from ${gifs.length} GIFs...\n`);
+
+let count = 0;
+for (const { path: gif, chapter } of gifs) {
+ const name = basename(gif, '.gif');
+ const delays = getFrameDelays(gif);
+ const frameIndex = frameAtSecondsBeforeEnd(delays, beforeSeconds);
+ const prefix = chapter.replace(/^(\d+)-.+/, '$1');
+ const outName = `${prefix}-${name}.png`;
+ const outPath = join(previewDir, outName);
+
+ try {
+ execSync(
+ `ffmpeg -y -i "${gif}" -vf "select=eq(n\\,${frameIndex})" -vframes 1 -update 1 "${outPath}" 2>/dev/null`,
+ { stdio: 'pipe' }
+ );
+ console.log(` ✓ ${outName} (frame #${frameIndex}/${delays.length})`);
+ count++;
+ } catch (e) {
+ console.log(` ✗ ${name}: extraction failed`);
+ }
+}
+
+console.log(`\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
+console.log(`✓ ${count} preview frames saved to demo-previews/`);
+console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
+console.log(`\nOpen in Finder: open demo-previews/`);
diff --git a/.github/scripts/scan-demos.js b/.github/scripts/scan-demos.js
index 05aa739..9edffd4 100644
--- a/.github/scripts/scan-demos.js
+++ b/.github/scripts/scan-demos.js
@@ -27,6 +27,7 @@ const defaultSettings = {
height: 600,
theme: "Dracula",
typingSpeed: "60ms",
+ framerate: 15,
startupWait: 5,
responseWait: 25,
exitWait: 2
diff --git a/.gitignore b/.gitignore
index 5fe2c22..b79ec11 100644
--- a/.gitignore
+++ b/.gitignore
@@ -100,3 +100,4 @@ Desktop.ini
.claude
.plans
.plans.vhs-wrapper
+demo-previews
\ No newline at end of file
diff --git a/00-quick-start/images/hello-demo.gif b/00-quick-start/images/hello-demo.gif
index 36e016a..fbbeca8 100644
Binary files a/00-quick-start/images/hello-demo.gif and b/00-quick-start/images/hello-demo.gif differ
diff --git a/00-quick-start/images/hello-demo.tape b/00-quick-start/images/hello-demo.tape
index 7eb1e26..d5ae053 100644
--- a/00-quick-start/images/hello-demo.tape
+++ b/00-quick-start/images/hello-demo.tape
@@ -28,9 +28,79 @@ Type "Say hello and tell me what you can help with"
Sleep 2s
Enter
-# Wait for response
-Sleep 25s
+# Wait for response (with periodic nudges to keep input visible)
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 1s
+
+# Nudge TUI to scroll to input area
+Type " "
+Backspace
+Sleep 3s
# Exit cleanly
Ctrl+C
-Sleep 2s
+Sleep 1s
diff --git a/01-setup-and-first-steps/images/code-review-demo.gif b/01-setup-and-first-steps/images/code-review-demo.gif
index aa20e6e..a64139e 100644
Binary files a/01-setup-and-first-steps/images/code-review-demo.gif and b/01-setup-and-first-steps/images/code-review-demo.gif differ
diff --git a/01-setup-and-first-steps/images/code-review-demo.tape b/01-setup-and-first-steps/images/code-review-demo.tape
index 383d628..4f788a6 100644
--- a/01-setup-and-first-steps/images/code-review-demo.tape
+++ b/01-setup-and-first-steps/images/code-review-demo.tape
@@ -28,9 +28,79 @@ Type "Review @samples/book-app-project/book_app.py for code quality issues and s
Sleep 2s
Enter
-# Wait for response
-Sleep 25s
+# Wait for response (with periodic nudges to keep input visible)
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 1s
+
+# Nudge TUI to scroll to input area
+Type " "
+Backspace
+Sleep 3s
# Exit cleanly
Ctrl+C
-Sleep 2s
+Sleep 1s
diff --git a/01-setup-and-first-steps/images/explain-code-demo.gif b/01-setup-and-first-steps/images/explain-code-demo.gif
index 9c3f5bc..956f4b9 100644
Binary files a/01-setup-and-first-steps/images/explain-code-demo.gif and b/01-setup-and-first-steps/images/explain-code-demo.gif differ
diff --git a/01-setup-and-first-steps/images/explain-code-demo.tape b/01-setup-and-first-steps/images/explain-code-demo.tape
index 01519f7..5eb4253 100644
--- a/01-setup-and-first-steps/images/explain-code-demo.tape
+++ b/01-setup-and-first-steps/images/explain-code-demo.tape
@@ -28,9 +28,79 @@ Type "Explain what @samples/book-app-project/books.py does in simple terms"
Sleep 2s
Enter
-# Wait for response
-Sleep 25s
+# Wait for response (with periodic nudges to keep input visible)
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 1s
+
+# Nudge TUI to scroll to input area
+Type " "
+Backspace
+Sleep 3s
# Exit cleanly
Ctrl+C
-Sleep 2s
+Sleep 1s
diff --git a/01-setup-and-first-steps/images/generate-code-demo.gif b/01-setup-and-first-steps/images/generate-code-demo.gif
index 3090092..fe4d326 100644
Binary files a/01-setup-and-first-steps/images/generate-code-demo.gif and b/01-setup-and-first-steps/images/generate-code-demo.gif differ
diff --git a/01-setup-and-first-steps/images/generate-code-demo.tape b/01-setup-and-first-steps/images/generate-code-demo.tape
index d463506..673c77f 100644
--- a/01-setup-and-first-steps/images/generate-code-demo.tape
+++ b/01-setup-and-first-steps/images/generate-code-demo.tape
@@ -28,9 +28,69 @@ Type "Write a Python function that takes a list of books and returns statistics:
Sleep 2s
Enter
-# Wait for response
-Sleep 35s
+# Wait for response (with periodic nudges to keep input visible)
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 2s
+
+# Nudge TUI to scroll to input area
+Type " "
+Backspace
+Sleep 3s
# Exit cleanly
Ctrl+C
-Sleep 2s
+Sleep 1s
diff --git a/02-context-conversations/images/file-context-demo.gif b/02-context-conversations/images/file-context-demo.gif
index 46ad97d..00b1701 100644
Binary files a/02-context-conversations/images/file-context-demo.gif and b/02-context-conversations/images/file-context-demo.gif differ
diff --git a/02-context-conversations/images/file-context-demo.tape b/02-context-conversations/images/file-context-demo.tape
index 3b2a698..992885b 100644
--- a/02-context-conversations/images/file-context-demo.tape
+++ b/02-context-conversations/images/file-context-demo.tape
@@ -28,9 +28,79 @@ Type "What does @samples/book-app-project/utils.py do? Summarize briefly."
Sleep 2s
Enter
-# Wait for response
-Sleep 25s
+# Wait for response (with periodic nudges to keep input visible)
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 1s
+
+# Nudge TUI to scroll to input area
+Type " "
+Backspace
+Sleep 3s
# Exit cleanly
Ctrl+C
-Sleep 2s
+Sleep 1s
diff --git a/02-context-conversations/images/multi-file-demo.gif b/02-context-conversations/images/multi-file-demo.gif
index d1b8931..c0cefe5 100644
Binary files a/02-context-conversations/images/multi-file-demo.gif and b/02-context-conversations/images/multi-file-demo.gif differ
diff --git a/02-context-conversations/images/multi-file-demo.tape b/02-context-conversations/images/multi-file-demo.tape
index bf093f1..b746e0d 100644
--- a/02-context-conversations/images/multi-file-demo.tape
+++ b/02-context-conversations/images/multi-file-demo.tape
@@ -28,9 +28,79 @@ Type "Compare @samples/book-app-project/book_app.py and @samples/book-app-projec
Sleep 2s
Enter
-# Wait for response
-Sleep 25s
+# Wait for response (with periodic nudges to keep input visible)
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 1s
+
+# Nudge TUI to scroll to input area
+Type " "
+Backspace
+Sleep 3s
# Exit cleanly
Ctrl+C
-Sleep 2s
+Sleep 1s
diff --git a/02-context-conversations/images/multi-turn-demo.gif b/02-context-conversations/images/multi-turn-demo.gif
index 3e8ba0f..78e4a40 100644
Binary files a/02-context-conversations/images/multi-turn-demo.gif and b/02-context-conversations/images/multi-turn-demo.gif differ
diff --git a/02-context-conversations/images/multi-turn-demo.tape b/02-context-conversations/images/multi-turn-demo.tape
index c8fed63..291c59c 100644
--- a/02-context-conversations/images/multi-turn-demo.tape
+++ b/02-context-conversations/images/multi-turn-demo.tape
@@ -28,25 +28,230 @@ Type "@samples/book-app-project/ Give me an overview of this project"
Sleep 2s
Enter
-# Wait for response
-Sleep 25s
+# Wait for response (with periodic nudges to keep input visible)
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 1s
# Prompt 2
Type "What are the main code quality issues?"
Sleep 2s
Enter
-# Wait for response
-Sleep 25s
+# Wait for response (with periodic nudges to keep input visible)
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 1s
# Prompt 3
Type "Which issue should I fix first and show me how?"
Sleep 2s
Enter
-# Wait for response
-Sleep 45s
+# Wait for response (with periodic nudges to keep input visible)
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+
+# Nudge TUI to scroll to input area
+Type " "
+Backspace
+Sleep 3s
# Exit cleanly
Ctrl+C
-Sleep 2s
+Sleep 1s
diff --git a/03-development-workflows/images/code-review-demo.gif b/03-development-workflows/images/code-review-demo.gif
index 7c30b11..0d89dd5 100644
Binary files a/03-development-workflows/images/code-review-demo.gif and b/03-development-workflows/images/code-review-demo.gif differ
diff --git a/03-development-workflows/images/code-review-demo.tape b/03-development-workflows/images/code-review-demo.tape
index 6bd2411..6e5aceb 100644
--- a/03-development-workflows/images/code-review-demo.tape
+++ b/03-development-workflows/images/code-review-demo.tape
@@ -28,9 +28,59 @@ Type "Review @samples/book-app-project/book_app.py for code quality"
Sleep 2s
Enter
-# Wait for response
-Sleep 30s
+# Wait for response (with periodic nudges to keep input visible)
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+
+# Nudge TUI to scroll to input area
+Type " "
+Backspace
+Sleep 3s
# Exit cleanly
Ctrl+C
-Sleep 2s
+Sleep 1s
diff --git a/03-development-workflows/images/fix-bug-demo.gif b/03-development-workflows/images/fix-bug-demo.gif
index 69461e4..535b499 100644
Binary files a/03-development-workflows/images/fix-bug-demo.gif and b/03-development-workflows/images/fix-bug-demo.gif differ
diff --git a/03-development-workflows/images/fix-bug-demo.tape b/03-development-workflows/images/fix-bug-demo.tape
index 0663a69..8e7f09e 100644
--- a/03-development-workflows/images/fix-bug-demo.tape
+++ b/03-development-workflows/images/fix-bug-demo.tape
@@ -28,9 +28,109 @@ Type "@samples/book-app-buggy/books_buggy.py Users report that searching for 'Th
Sleep 2s
Enter
-# Wait for response
-Sleep 30s
+# Wait for response (with periodic nudges to keep input visible)
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+
+# Nudge TUI to scroll to input area
+Type " "
+Backspace
+Sleep 3s
# Exit cleanly
Ctrl+C
-Sleep 2s
+Sleep 1s
diff --git a/03-development-workflows/images/git-integration-demo.gif b/03-development-workflows/images/git-integration-demo.gif
index 1fae2de..730bdff 100644
Binary files a/03-development-workflows/images/git-integration-demo.gif and b/03-development-workflows/images/git-integration-demo.gif differ
diff --git a/03-development-workflows/images/git-integration-demo.tape b/03-development-workflows/images/git-integration-demo.tape
index f284938..8597454 100644
--- a/03-development-workflows/images/git-integration-demo.tape
+++ b/03-development-workflows/images/git-integration-demo.tape
@@ -28,9 +28,59 @@ Type "Generate a conventional commit message for: $(git diff --staged)"
Sleep 2s
Enter
-# Wait for response
-Sleep 30s
+# Wait for response (with periodic nudges to keep input visible)
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+
+# Nudge TUI to scroll to input area
+Type " "
+Backspace
+Sleep 3s
# Exit cleanly
Ctrl+C
-Sleep 2s
+Sleep 1s
diff --git a/03-development-workflows/images/refactor-demo.gif b/03-development-workflows/images/refactor-demo.gif
index 1ad8a2d..61ddd9a 100644
Binary files a/03-development-workflows/images/refactor-demo.gif and b/03-development-workflows/images/refactor-demo.gif differ
diff --git a/03-development-workflows/images/refactor-demo.tape b/03-development-workflows/images/refactor-demo.tape
index bd27305..271ecc6 100644
--- a/03-development-workflows/images/refactor-demo.tape
+++ b/03-development-workflows/images/refactor-demo.tape
@@ -28,9 +28,109 @@ Type "@samples/book-app-project/book_app.py Refactor the command handling to use
Sleep 2s
Enter
-# Wait for response
-Sleep 30s
+# Wait for response (with periodic nudges to keep input visible)
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+
+# Nudge TUI to scroll to input area
+Type " "
+Backspace
+Sleep 3s
# Exit cleanly
Ctrl+C
-Sleep 2s
+Sleep 1s
diff --git a/03-development-workflows/images/test-gen-demo.gif b/03-development-workflows/images/test-gen-demo.gif
index 1a97a0d..9042ea1 100644
Binary files a/03-development-workflows/images/test-gen-demo.gif and b/03-development-workflows/images/test-gen-demo.gif differ
diff --git a/03-development-workflows/images/test-gen-demo.tape b/03-development-workflows/images/test-gen-demo.tape
index f0c6c38..ae520f2 100644
--- a/03-development-workflows/images/test-gen-demo.tape
+++ b/03-development-workflows/images/test-gen-demo.tape
@@ -28,9 +28,109 @@ Type "@samples/book-app-project/books.py Generate comprehensive pytest tests. In
Sleep 2s
Enter
-# Wait for response
-Sleep 60s
+# Wait for response (with periodic nudges to keep input visible)
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+
+# Nudge TUI to scroll to input area
+Type " "
+Backspace
+Sleep 3s
# Exit cleanly
Ctrl+C
-Sleep 2s
+Sleep 1s
diff --git a/04-agents-custom-instructions/images/python-reviewer-demo.gif b/04-agents-custom-instructions/images/python-reviewer-demo.gif
index 002606d..49d8805 100644
Binary files a/04-agents-custom-instructions/images/python-reviewer-demo.gif and b/04-agents-custom-instructions/images/python-reviewer-demo.gif differ
diff --git a/04-agents-custom-instructions/images/python-reviewer-demo.tape b/04-agents-custom-instructions/images/python-reviewer-demo.tape
index 780a4f3..8e92d04 100644
--- a/04-agents-custom-instructions/images/python-reviewer-demo.tape
+++ b/04-agents-custom-instructions/images/python-reviewer-demo.tape
@@ -28,9 +28,79 @@ Type "As a Python code quality expert, review @samples/book-app-project/books.py
Sleep 2s
Enter
-# Wait for response
-Sleep 25s
+# Wait for response (with periodic nudges to keep input visible)
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 1s
+
+# Nudge TUI to scroll to input area
+Type " "
+Backspace
+Sleep 3s
# Exit cleanly
Ctrl+C
-Sleep 2s
+Sleep 1s
diff --git a/05-skills/images/list-skills-demo.gif b/05-skills/images/list-skills-demo.gif
index 4d68dbe..6f3f09f 100644
Binary files a/05-skills/images/list-skills-demo.gif and b/05-skills/images/list-skills-demo.gif differ
diff --git a/05-skills/images/list-skills-demo.tape b/05-skills/images/list-skills-demo.tape
index 4d79c35..7b9117c 100644
--- a/05-skills/images/list-skills-demo.tape
+++ b/05-skills/images/list-skills-demo.tape
@@ -28,9 +28,54 @@ Type "What slash commands and skills are available? List the main ones."
Sleep 2s
Enter
-# Wait for response
-Sleep 25s
+# Wait for response (with periodic nudges to keep input visible)
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 1s
+
+# Nudge TUI to scroll to input area
+Type " "
+Backspace
+Sleep 3s
# Exit cleanly
Ctrl+C
-Sleep 2s
+Sleep 1s
diff --git a/05-skills/images/skill-trigger-demo.gif b/05-skills/images/skill-trigger-demo.gif
index a5485af..0035e2e 100644
Binary files a/05-skills/images/skill-trigger-demo.gif and b/05-skills/images/skill-trigger-demo.gif differ
diff --git a/05-skills/images/skill-trigger-demo.tape b/05-skills/images/skill-trigger-demo.tape
index da024d3..df0d0c5 100644
--- a/05-skills/images/skill-trigger-demo.tape
+++ b/05-skills/images/skill-trigger-demo.tape
@@ -28,9 +28,209 @@ Type "Check the book collection code for quality issues"
Sleep 2s
Enter
-# Wait for response
-Sleep 45s
+# Wait for response (with periodic nudges to keep input visible)
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+
+# Nudge TUI to scroll to input area
+Type " "
+Backspace
+Sleep 3s
# Exit cleanly
Ctrl+C
-Sleep 2s
+Sleep 1s
diff --git a/06-mcp-servers/images/mcp-status-demo.gif b/06-mcp-servers/images/mcp-status-demo.gif
index f20b92b..81fe7c7 100644
Binary files a/06-mcp-servers/images/mcp-status-demo.gif and b/06-mcp-servers/images/mcp-status-demo.gif differ
diff --git a/06-mcp-servers/images/mcp-status-demo.tape b/06-mcp-servers/images/mcp-status-demo.tape
index aae9724..f17eb8a 100644
--- a/06-mcp-servers/images/mcp-status-demo.tape
+++ b/06-mcp-servers/images/mcp-status-demo.tape
@@ -28,9 +28,54 @@ Type "/mcp show"
Sleep 2s
Enter
-# Wait for response
-Sleep 25s
+# Wait for response (with periodic nudges to keep input visible)
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 1s
+
+# Nudge TUI to scroll to input area
+Type " "
+Backspace
+Sleep 3s
# Exit cleanly
Ctrl+C
-Sleep 2s
+Sleep 1s
diff --git a/06-mcp-servers/images/mcp-workflow-demo.gif b/06-mcp-servers/images/mcp-workflow-demo.gif
index 506a497..aec536a 100644
Binary files a/06-mcp-servers/images/mcp-workflow-demo.gif and b/06-mcp-servers/images/mcp-workflow-demo.gif differ
diff --git a/06-mcp-servers/images/mcp-workflow-demo.tape b/06-mcp-servers/images/mcp-workflow-demo.tape
index 6da6b14..187648d 100644
--- a/06-mcp-servers/images/mcp-workflow-demo.tape
+++ b/06-mcp-servers/images/mcp-workflow-demo.tape
@@ -28,25 +28,170 @@ Type "List open issues on this repository"
Sleep 2s
Enter
-# Wait for response
-Sleep 25s
+# Wait for response (with periodic nudges to keep input visible)
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 1s
# Prompt 2
Type "@samples/book-app-project/books.py What code handles the search functionality?"
Sleep 2s
Enter
-# Wait for response
-Sleep 20s
+# Wait for response (with periodic nudges to keep input visible)
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 2s
# Prompt 3
Type "Based on the code, suggest improvements for the search feature"
Sleep 2s
Enter
-# Wait for response
-Sleep 30s
+# Wait for response (with periodic nudges to keep input visible)
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+Hide
+Type " "
+Backspace
+Show
+Sleep 3s
+
+# Nudge TUI to scroll to input area
+Type " "
+Backspace
+Sleep 3s
# Exit cleanly
Ctrl+C
-Sleep 2s
+Sleep 1s
diff --git a/07-putting-it-together/README.md b/07-putting-it-together/README.md
index 9816305..ae81ce7 100644
--- a/07-putting-it-together/README.md
+++ b/07-putting-it-together/README.md
@@ -104,17 +104,6 @@ copilot
---
-
-🎬 See it in action!
-
-
-
-*Demo output varies. Your model, tools, and responses will differ from what's shown here.*
-
-
-
----
-
# Additional Workflows
diff --git a/07-putting-it-together/images/full-review-demo.gif b/07-putting-it-together/images/full-review-demo.gif
deleted file mode 100644
index b7c32ea..0000000
Binary files a/07-putting-it-together/images/full-review-demo.gif and /dev/null differ
diff --git a/07-putting-it-together/images/full-review-demo.tape b/07-putting-it-together/images/full-review-demo.tape
deleted file mode 100644
index 8e16c51..0000000
--- a/07-putting-it-together/images/full-review-demo.tape
+++ /dev/null
@@ -1,112 +0,0 @@
-# 07-putting-it-together: Idea to merged PR: plan, implement, test a new feature
-# Auto-generated from demos.json - Real copilot execution
-
-Output full-review-demo.gif
-
-Set FontSize 18
-Set Width 1000
-Set Height 600
-Set Theme "Dracula"
-Set Padding 20
-Set BorderRadius 8
-Set Margin 10
-Set MarginFill "#282a36"
-Set Framerate 10
-
-# Human typing speed
-Set TypingSpeed 60ms
-
-# Launch copilot
-Type "copilot"
-Enter
-
-# Wait for copilot to start
-Sleep 5s
-
-# Prompt 1
-Type "I need to add a 'list unread' command to the book app that shows only books where read is False. What files need to change?"
-Sleep 2s
-Enter
-
-# Wait for response
-Sleep 25s
-
-# Prompt 2 - Select python-reviewer agent
-Type "/agent"
-Sleep 1s
-Enter
-
-# Wait for agent picker
-Sleep 3s
-Down 3
-Sleep 1s
-Enter
-
-# Wait for agent to load
-Sleep 3s
-
-# Prompt 3
-Type "@samples/book-app-project/books.py Design a get_unread_books method. What is the best approach?"
-Sleep 2s
-Enter
-
-# Wait for response
-Sleep 30s
-
-# Prompt 4 - Select pytest-helper agent
-Type "/agent"
-Sleep 1s
-Enter
-
-# Wait for agent picker
-Sleep 3s
-Down 2
-Sleep 1s
-Enter
-
-# Wait for agent to load
-Sleep 3s
-
-# Prompt 5
-Type "@samples/book-app-project/tests/test_books.py Design test cases for filtering unread books."
-Sleep 2s
-Enter
-
-# Wait for response
-Sleep 30s
-
-# Prompt 6
-Type "Add a get_unread_books method to BookCollection in books.py. Add a 'list unread' command option in book_app.py. Update the help text in the show_help function."
-Sleep 2s
-Enter
-
-# Wait for response
-Sleep 30s
-
-# Prompt 7
-Type "Generate comprehensive tests for the new feature"
-Sleep 2s
-Enter
-
-# Wait for response
-Sleep 35s
-
-# Prompt 8
-Type "/review"
-Sleep 2s
-Enter
-
-# Wait for response
-Sleep 25s
-
-# Prompt 9
-Type "Create a pull request titled 'Feature: Add list unread books command'"
-Sleep 2s
-Enter
-
-# Wait for response
-Sleep 25s
-
-# Exit cleanly
-Ctrl+C
-Sleep 2s
diff --git a/package.json b/package.json
index e3c0424..26a84cf 100644
--- a/package.json
+++ b/package.json
@@ -8,7 +8,7 @@
"create:tapes": "node .github/scripts/create-tapes.js",
"generate:vhs": "node .github/scripts/generate-demos.js",
"verify:gifs": "node .github/scripts/verify-gifs.js",
- "generate:demos": "npm run scan:demos && npm run create:tapes && npm run generate:vhs && npm run verify:gifs",
+ "generate:demos": "npm run create:tapes && npm run generate:vhs && npm run verify:gifs",
"release": "npm run generate:demos",
"release:ci": "npm run generate:headers"
},