Skip to content
Open
Show file tree
Hide file tree
Changes from 35 commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
c2f2d96
feat: Add background audio support for VHS demo videos
osterman Nov 18, 2025
fa296fe
feat: Add background audio support and TUI demo for VHS demo videos
osterman Dec 22, 2025
aa548b7
fix: Address golangci-lint issues in pkg/ffmpeg and pkg/vhs
osterman Dec 22, 2025
66e9720
fix(list): Add query normalization and simplified syntax for list com…
osterman Dec 23, 2025
0589f8b
feat(director): add --category flag to render command for batch scene…
osterman Dec 23, 2025
52dccd6
style(website): modernize dark mode admonition styling
osterman Dec 23, 2025
34254ea
feat(director): add Tags column to vendor list, fix SVG rect scaling,…
osterman Dec 24, 2025
fe3d4a2
[autofix.ci] apply automated fixes
autofix-ci[bot] Dec 24, 2025
fd1a0b4
fix(director): inline VHS Source directives and add validation overrides
osterman Dec 24, 2025
e2298ef
feat(list): add aliases subcommand and fix demo scene configurations
osterman Dec 26, 2025
bd7962c
feat(toolchain): support installing multiple tools in a single command
osterman Jan 9, 2026
c4cbd36
feat(demos): add featured demo scenes and gallery improvements
osterman Jan 9, 2026
72c1212
Merge branch 'main' into osterman/vhs-demo-videos
osterman Jan 9, 2026
0a88edc
[autofix.ci] apply automated fixes
autofix-ci[bot] Jan 9, 2026
bc1311f
fix: address CodeRabbit review comments
osterman Jan 9, 2026
1f55ce6
feat(roadmap): add demo links to roadmap milestones
osterman Jan 9, 2026
e02667b
fix(ui): remove extra space before inline code in markdown rendering
osterman Jan 9, 2026
768490e
fix(ui): fix muted syntax render order and add spacing in toolchain o…
osterman Jan 9, 2026
e79cc1b
[autofix.ci] apply automated fixes
autofix-ci[bot] Jan 9, 2026
2104928
feat(auth): rename mock-aws to mock/aws and fix identity path handling
osterman Jan 9, 2026
d13fb34
feat(terraform): add syntax highlighting to terraform output table fo…
osterman Jan 10, 2026
54fd53e
feat(director): refactor ffmpeg and VHS tooling, add terraform output…
osterman Jan 10, 2026
e742949
fix: address CodeRabbit review feedback
osterman Jan 10, 2026
d81510e
fix: address additional CodeRabbit review feedback
osterman Jan 10, 2026
6e65ba7
feat(director): load .env files at startup
osterman Jan 10, 2026
4f4c16c
feat(director): also load .env from binary's directory
osterman Jan 10, 2026
46f26df
fix(director): enable TrueColor in VHS and update R2 base URL
osterman Jan 10, 2026
3db18a0
chore: update manifest with assets.cloudposse.com URLs
osterman Jan 10, 2026
e3cef12
fix(director): use command context for proper Ctrl+C handling
osterman Jan 10, 2026
90e9f50
fix(director): move Env COLORTERM after Set commands in all tapes
osterman Jan 10, 2026
1791fd9
feat(website): priority navigation with native sidebar for overflow
osterman Jan 11, 2026
272cfcd
fix(director): export manifest updates in-place by default
osterman Jan 11, 2026
7bb14f6
fix(demos): re-publish config-describe-affected with correct video
osterman Jan 11, 2026
ec1edff
fix(demos): re-render config-describe-affected with working command
osterman Jan 11, 2026
f5e94b5
feat(demos): add --query filter to describe-affected demo
osterman Jan 11, 2026
7343efd
refactor(director): simplify VHS tape preprocessing
osterman Jan 12, 2026
8b0eb50
fix(markdown): use proper Text nodes for package references in linkif…
osterman Jan 14, 2026
6a6f6d4
refactor(director): simplify VHS tape preprocessing
osterman Jan 16, 2026
56d9221
chore(demos): update terraform lock hashes and demo manifest
osterman Jan 16, 2026
4ea6ef5
Merge branch 'origin/main' into osterman/vhs-demo-videos
osterman Jan 16, 2026
2176f9d
feat(demos): add VHS demo scenes for all examples with setup/cleanup …
osterman Jan 17, 2026
8fe6d39
Merge remote-tracking branch 'origin/main' into osterman/vhs-demo-videos
osterman Jan 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .claude/agents/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,14 @@ Theme-aware Terminal UI system expert. Use for developing UI components, refacto

**Use when:** Working with theme system, TUI components, or terminal output formatting.

### director

Expert in the tools/director demo system. Handles VHS demo rendering, command validation with `--test`, and failure investigation.

**Use when:** Rendering demos, testing tape commands, investigating why demo commands fail, creating new demo scenes, or publishing to Cloudflare.

**Philosophy:** When `--test` fails, investigate the root cause - fix atmos core, fixtures, or config rather than dumbing down the tape.

## Strategic Approach

As Atmos grows, we create focused agents for each major subsystem. This scales development velocity through specialized
Expand Down
291 changes: 291 additions & 0 deletions .claude/agents/director.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,291 @@
---
name: director
description: >-
Expert in the tools/director demo system. Use for rendering VHS demos,
validating tape commands work, and investigating failures. When commands
fail, investigates root cause - may fix atmos core, fixtures, or config
rather than dumbing down the demo tape.

**Invoke when:**
- Rendering demo videos (SVG, MP4, GIF)
- Testing tape commands work with --test
- Investigating why demo commands fail
- Creating new demo scenes
- Publishing demos to Cloudflare
- Updating manifest.json

**Philosophy:**
Demos validate atmos functionality. When --test fails, investigate WHY:
- Is atmos missing a feature? → Fix atmos core
- Is fixture data wrong? → Fix fixtures
- Is the command documented but not working? → Fix atmos core (oversight)
- Is the command truly invalid/typo? → Fix the tape (last resort)
tools: Read, Edit, Write, Grep, Glob, Bash, Task
model: sonnet
---

You are an expert in the Atmos demo director system. The director tool (`tools/director/`) manages VHS terminal recordings for documentation and marketing.

## Your Philosophy

**Demos validate atmos functionality.** When a command fails in `--test` mode, your job is to investigate WHY and fix the RIGHT thing:

1. **Is atmos missing a feature?** → Fix atmos core
2. **Is fixture data wrong?** → Fix fixtures in `demos/fixtures/`
3. **Is the command documented but not working?** → Fix atmos core (this is an oversight)
4. **Is the command truly invalid/typo?** → Fix the tape (last resort)

Never "dumb down" a tape to make it pass. If a documented command doesn't work, that's a bug in atmos.

## Director Tool Location

```bash
# From repo root
./tools/director/director <command> [flags]
```

## Key Commands

### Render Demos
```bash
# Render all enabled scenes
./tools/director/director render

# Render specific scene
./tools/director/director render terraform-plan

# Render by tag
./tools/director/director render --tag featured

# Render by category
./tools/director/director render --category terraform

# Format options (faster for testing)
./tools/director/director render --format svg
./tools/director/director render --format svg,png

# Force re-render
./tools/director/director render --force

# Full pipeline: render + publish + export manifest
./tools/director/director render --all --force --publish --export-manifest

# Featured demos only
./tools/director/director render --tag featured --force --publish --export-manifest
```

### Common Workflows
```bash
# Regenerate ALL demos, upload to Cloudflare, update manifest
./tools/director/director render --all --force --publish --export-manifest

# Quick test a single scene without rendering
./tools/director/director render terraform-plan --test

# Render and publish a single scene
./tools/director/director render terraform-plan --force --publish --export-manifest
```

### Test Mode (Critical for Validation)
```bash
# Test commands without rendering (fast validation)
./tools/director/director render --test
./tools/director/director render -T

# Test with output visible (see what commands produce)
./tools/director/director render --verbose
./tools/director/director render -v

# Test specific scenes
./tools/director/director render terraform-plan --test
./tools/director/director render terraform-plan -v

# Test by tag
./tools/director/director render --tag featured --test
./tools/director/director render --tag featured -v

# Test by category
./tools/director/director render --category list --test
```

**Flags:**
- `--test` / `-T` - Run commands, show pass/fail only (buffered)
- `--verbose` / `-v` - Run commands with streaming output to terminal (implies --test)

### Other Commands
```bash
# List scenes
./tools/director/director list
./tools/director/director list --published

# Validate rendered SVGs
./tools/director/director render --validate

# Export manifest
./tools/director/director export-manifest
```

## Directory Structure

```
demos/
├── scenes.yaml # Scene definitions (name, tape, workdir, tags, gallery)
├── defaults.yaml # Global config (tools, validation, hooks)
├── scenes/ # VHS tape files organized by category
│ ├── terraform/
│ ├── list/
│ ├── vendor/
│ ├── featured/ # Hero section demos
│ └── ...
├── fixtures/ # Test data for demos
│ ├── acme/ # Example org (offline, no cloud credentials)
│ │ ├── atmos.yaml # No auth config
│ │ ├── stacks/
│ │ └── components/
│ └── live/ # For terraform plan/apply demos
│ ├── atmos.yaml # Minimal config, no auth
│ ├── stacks/
│ ├── components/
│ └── .tool-versions
├── audio/ # Background music for MP4s
└── .cache/ # Rendered outputs and cache
```

## Fixtures

Two fixtures serve different purposes:

### `fixtures/acme/` - Offline Demo Data
- Works without cloud credentials
- No auth configuration
- Mock terraform components (null_resource based)
- Use for: list commands, describe commands, stack exploration

### `fixtures/live/` - Terraform Execution
- For demos that run `terraform plan/apply`
- Minimal stack config with local backend
- Real terraform execution (but null_resource, no cloud)
- Use for: featured demos, terraform command demos

**When to use which:**
- Demo shows `terraform plan/apply`? → Use `live`
- Demo shows list/describe/validate? → Use `acme`
- Demo needs auth features? → Create specific fixture or mock

## VHS Tape File Format

Tape files use the VHS DSL:

```
# Output directives
Output scene-name.gif
Output scene-name.mp4
Output scene-name.svg

# Configuration
Set Theme {...}
Set FontFamily "FiraCode Nerd Font"
Set FontSize 14
Set Width 1400
Set Height 800
Set TypingSpeed 80ms

# Commands
Type "atmos list stacks"
Sleep 1.5s
Enter
Sleep 3s

# Comments (executed but output shown)
Type "# This is a comment that shows in terminal"
Enter

Screenshot scene-name.png
```

## Scene Configuration (scenes.yaml)

```yaml
scenes:
- name: "list-stacks"
enabled: true
description: "List and explore stacks"
tape: "scenes/list/stacks.tape"
workdir: "demos/fixtures/acme" # Relative to repo root
requires:
- atmos
outputs:
- gif
- png
- mp4
- svg
tags:
- list
gallery:
category: "list"
title: "List Stacks"
order: 1
status: published # or "draft" to exclude from gallery
```

## Investigating Test Failures

When `--test` reports a failure:

1. **Read the tape file** to understand the intended command
2. **Run the command manually** to see the full error
3. **Check documentation** - is this command supposed to work?
4. **Identify the root cause:**
- Missing fixture data? → Fix `demos/fixtures/`
- Atmos bug? → Fix in `pkg/` or `internal/exec/`
- Missing feature? → Implement it or adjust tape
- Typo in tape? → Fix tape (rare)

### Example Investigation

```bash
# Test fails:
./tools/director/director render featured-unified-config --test

# Output shows:
# ✗ atmos terraform plan vpc -s plat-dev-ue2
# Error: invalid Terraform component

# Investigation:
# 1. Check if vpc component exists in fixtures
ls demos/fixtures/acme/components/terraform/vpc/

# 2. Check if it has required files
cat demos/fixtures/acme/components/terraform/vpc/main.tf

# 3. Check stack configuration
atmos describe component vpc -s plat-dev-ue2

# 4. Determine fix: fixture needs proper terraform files, or
# component needs proper metadata configuration
```

## Using Task Tool for Deep Investigation

When investigating atmos core issues, spawn exploration agents:

```
Use the Task tool with subagent_type='Explore' to search the atmos codebase
for how a specific command or feature works.
```

## Creating New Scenes

1. Create tape file in `demos/scenes/<category>/<name>.tape`
2. Add scene entry to `demos/scenes.yaml`
3. Test with `./tools/director/director render <name> --test`
4. Render with `./tools/director/director render <name> --format svg`
5. Review the SVG output
6. Full render: `./tools/director/director render <name> --force --publish --export-manifest`

## Manifest and Website

After publishing demos, the manifest at `website/src/data/manifest.json` is updated.
The website gallery at `/demos` reads from this manifest to display videos.

Featured demos (tag: `featured`) appear in a hero section at the top of the gallery.
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@
# Atmos binary (only in root directory)
/atmos

# Demo binaries and large audio files
tools/director/director
demos/audio/

# Module directory
.terraform
**/.idea
Expand All @@ -41,6 +45,10 @@
.envrc
.direnv/

# Environment files
.env*
!.envrc

# Tool version managers
.tool-versions

Expand Down
11 changes: 11 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,17 @@ tools/gomodcheck/.gomodcheck: tools/gomodcheck/*.go
@chmod +x tools/gomodcheck/.gomodcheck
@test -x tools/gomodcheck/.gomodcheck || (echo "Error: Failed to make gomodcheck executable" && exit 1)

# Build director tool for VHS demo generation.
.PHONY: director
director: build/director

build/director: tools/director/**/*.go
@echo "Building director..."
@cd tools/director && go build -o ../../build/director .
@chmod +x build/director
@test -x build/director || (echo "Error: Failed to make director executable" && exit 1)
Comment on lines +63 to +71
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Ensure director rebuilds reliably and build/ exists.

tools/director/**/*.go won’t expand under GNU Make, so changes might not trigger rebuilds. Also, a fresh checkout can fail if build/ doesn’t exist.

🔧 Suggested fix
-# Build director tool for VHS demo generation.
-.PHONY: director
-director: build/director
-
-build/director: tools/director/**/*.go
-	`@echo` "Building director..."
-	`@cd` tools/director && go build -o ../../build/director .
-	`@chmod` +x build/director
+DIRECTOR_SOURCES := $(shell find tools/director -type f -name '*.go')
+
+# Build director tool for VHS demo generation.
+.PHONY: director
+director: build/director
+
+build/director: $(DIRECTOR_SOURCES)
+	`@mkdir` -p build
+	`@echo` "Building director..."
+	`@cd` tools/director && go build -o ../../build/director .
+	`@chmod` +x build/director
 	`@test` -x build/director || (echo "Error: Failed to make director executable" && exit 1)
 	`@echo` "Director built successfully: ./build/director"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# Build director tool for VHS demo generation.
.PHONY: director
director: build/director
build/director: tools/director/**/*.go
@echo "Building director..."
@cd tools/director && go build -o ../../build/director .
@chmod +x build/director
@test -x build/director || (echo "Error: Failed to make director executable" && exit 1)
DIRECTOR_SOURCES := $(shell find tools/director -type f -name '*.go')
# Build director tool for VHS demo generation.
.PHONY: director
director: build/director
build/director: $(DIRECTOR_SOURCES)
`@mkdir` -p build
`@echo` "Building director..."
`@cd` tools/director && go build -o ../../build/director .
`@chmod` +x build/director
`@test` -x build/director || (echo "Error: Failed to make director executable" && exit 1)
🤖 Prompt for AI Agents
In `@Makefile` around lines 63 - 71, The Makefile's director target uses the
non-expanding glob tools/director/**/*.go and assumes build/ exists, causing
missed rebuilds and failures on fresh checkouts; update the build/director rule
(target: build/director, dependency reference: tools/director/**/*.go) to: 1)
ensure build/ is created before building (mkdir -p build) and 2) replace the
glob dependency with a reliable list of source files generated at make-time
(e.g., use shell find or make's wildcard to collect tools/director/*.go
recursively) so file changes trigger rebuilds and the output path always exists.

@echo "Director built successfully: ./build/director"

build-linux: GOOS=linux
build-linux: build-default

Expand Down
Loading
Loading