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! - -![Full Review Demo](images/full-review-demo.gif) - -*Demo output varies. Your model, tools, and responses will differ from what's shown here.* - -
- ---- - # Additional Workflows People assembling a colorful giant jigsaw puzzle with gears, representing how agents, skills, and MCP combine into unified 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" },