diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml new file mode 100644 index 0000000..152f665 --- /dev/null +++ b/.github/workflows/integration-test.yml @@ -0,0 +1,82 @@ +name: Integration Test + +on: + push: + branches: [main, develop] + pull_request: + branches: [main, develop] + +permissions: + contents: read + +jobs: + vhs-test: + runs-on: ubuntu-latest + env: + CGO_ENABLED: 0 + AWS_ENDPOINT_URL: http://localhost:4566 + AWS_ACCESS_KEY_ID: test + AWS_SECRET_ACCESS_KEY: test + AWS_DEFAULT_REGION: us-east-1 + AWS_EC2_METADATA_DISABLED: "true" + steps: + - uses: actions/checkout@v6 + + - uses: actions/setup-go@v6 + with: + go-version-file: 'go.mod' + cache: true + + - name: Build + run: go build -o claws ./cmd/claws + + - name: Start LocalStack + run: | + docker run -d --name localstack -p 4566:4566 localstack/localstack:4.12.0 + echo "Waiting for LocalStack..." + for i in $(seq 1 30); do + if curl -s http://localhost:4566/_localstack/health | grep -qE '"s3": "(available|running)"'; then + echo "LocalStack is ready" + exit 0 + fi + sleep 1 + done + echo "LocalStack failed to start" + exit 1 + + - name: Setup demo data + timeout-minutes: 5 + run: ./scripts/localstack-demo-setup.sh + + - name: Create AWS config for demo + run: | + mkdir -p ~/.aws + cp scripts/demo-aws-config/config ~/.aws/config + cp scripts/demo-aws-config/credentials ~/.aws/credentials + + - name: Run VHS tapes + run: | + set -e + for tape in docs/tapes/*.tape; do + echo "==========================================" + echo "Running: $tape" + echo "==========================================" + docker run --rm --network host \ + -v "$(pwd)":/vhs \ + -v ~/.aws:/root/.aws:ro \ + -e AWS_ENDPOINT_URL=http://localhost:4566 \ + -e AWS_EC2_METADATA_DISABLED=true \ + ghcr.io/charmbracelet/vhs "$tape" + done + + - name: Upload screenshots on failure + if: failure() + uses: actions/upload-artifact@v4 + with: + name: vhs-screenshots + path: docs/images/ + retention-days: 7 + + - name: Cleanup LocalStack + if: always() + run: docker stop localstack || true diff --git a/Taskfile.yml b/Taskfile.yml index f73547c..1e53fd7 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -107,7 +107,9 @@ tasks: cmds: - task: demo:record:gif - task: demo:record:themes + - task: demo:record:theme-light - task: demo:record:features + - task: demo:record:command-mode demo:record:gif: desc: Record demo.gif only @@ -154,6 +156,57 @@ tasks: -e AWS_EC2_METADATA_DISABLED=true \ ghcr.io/charmbracelet/vhs docs/tapes/features.tape + demo:record:theme-light: + desc: Record light theme screenshot (requires white terminal background) + deps: [build, localstack:start, localstack:demo-setup] + preconditions: + - sh: '[ "$(uname -s)" = "Linux" ]' + msg: "demo:record requires Linux (--network host not supported on macOS/Windows)" + cmds: + - | + docker run --rm --network host \ + -v "$(pwd)":/vhs \ + -v "$(pwd)/scripts/demo-aws-config:/root/.aws:ro" \ + -e AWS_ENDPOINT_URL=http://localhost:4566 \ + -e AWS_EC2_METADATA_DISABLED=true \ + ghcr.io/charmbracelet/vhs docs/tapes/theme-light.tape + + demo:record:command-mode: + desc: Record command mode suggestion/completion test + deps: [build, localstack:start, localstack:demo-setup] + preconditions: + - sh: '[ "$(uname -s)" = "Linux" ]' + msg: "demo:record requires Linux (--network host not supported on macOS/Windows)" + cmds: + - | + docker run --rm --network host \ + -v "$(pwd)":/vhs \ + -v "$(pwd)/scripts/demo-aws-config:/root/.aws:ro" \ + -e AWS_ENDPOINT_URL=http://localhost:4566 \ + -e AWS_EC2_METADATA_DISABLED=true \ + ghcr.io/charmbracelet/vhs docs/tapes/command-mode.tape + + test:vhs: + desc: Run all VHS tapes as integration tests + deps: [build, localstack:start, localstack:demo-setup] + preconditions: + - sh: '[ "$(uname -s)" = "Linux" ]' + msg: "test:vhs requires Linux (--network host not supported on macOS/Windows)" + cmds: + - | + set -e + for tape in docs/tapes/*.tape; do + echo "==========================================" + echo "Running: $tape" + echo "==========================================" + docker run --rm --network host \ + -v "$(pwd)":/vhs \ + -v "$(pwd)/scripts/demo-aws-config:/root/.aws:ro" \ + -e AWS_ENDPOINT_URL=http://localhost:4566 \ + -e AWS_EC2_METADATA_DISABLED=true \ + ghcr.io/charmbracelet/vhs "$tape" + done + test-localstack: desc: Run integration tests with LocalStack deps: [localstack:start] diff --git a/docs/images/actions-menu.png b/docs/images/actions-menu.png index 36ebf96..ff53437 100644 Binary files a/docs/images/actions-menu.png and b/docs/images/actions-menu.png differ diff --git a/docs/images/cmd-suggest-ec.png b/docs/images/cmd-suggest-ec.png new file mode 100644 index 0000000..4db6f8e Binary files /dev/null and b/docs/images/cmd-suggest-ec.png differ diff --git a/docs/images/cmd-suggest-ec2-c.png b/docs/images/cmd-suggest-ec2-c.png new file mode 100644 index 0000000..b74361d Binary files /dev/null and b/docs/images/cmd-suggest-ec2-c.png differ diff --git a/docs/images/cmd-suggest-ec2-slash.png b/docs/images/cmd-suggest-ec2-slash.png new file mode 100644 index 0000000..443ed61 Binary files /dev/null and b/docs/images/cmd-suggest-ec2-slash.png differ diff --git a/docs/images/cmd-suggest-ec2.png b/docs/images/cmd-suggest-ec2.png new file mode 100644 index 0000000..4db6f8e Binary files /dev/null and b/docs/images/cmd-suggest-ec2.png differ diff --git a/docs/images/cmd-tab-completion.png b/docs/images/cmd-tab-completion.png new file mode 100644 index 0000000..f3240fc Binary files /dev/null and b/docs/images/cmd-tab-completion.png differ diff --git a/docs/images/demo.gif b/docs/images/demo.gif index 15ae199..4f46f73 100644 Binary files a/docs/images/demo.gif and b/docs/images/demo.gif differ diff --git a/docs/images/detail-view.png b/docs/images/detail-view.png index dc12095..939cb42 100644 Binary files a/docs/images/detail-view.png and b/docs/images/detail-view.png differ diff --git a/docs/images/multi-account-region.png b/docs/images/multi-account-region.png index a7ef7b8..52b06cd 100644 Binary files a/docs/images/multi-account-region.png and b/docs/images/multi-account-region.png differ diff --git a/docs/images/multi-profile.png b/docs/images/multi-profile.png index 99b1cc3..a43fd2e 100644 Binary files a/docs/images/multi-profile.png and b/docs/images/multi-profile.png differ diff --git a/docs/images/multi-region-data.png b/docs/images/multi-region-data.png index 2adc098..7f2e098 100644 Binary files a/docs/images/multi-region-data.png and b/docs/images/multi-region-data.png differ diff --git a/docs/images/multi-region.png b/docs/images/multi-region.png index 2021fa6..84e27d3 100644 Binary files a/docs/images/multi-region.png and b/docs/images/multi-region.png differ diff --git a/docs/images/resource-browser.png b/docs/images/resource-browser.png index bf4a4a4..642b433 100644 Binary files a/docs/images/resource-browser.png and b/docs/images/resource-browser.png differ diff --git a/docs/images/test-diff-after-tab.png b/docs/images/test-diff-after-tab.png deleted file mode 100644 index 1a9c5d8..0000000 Binary files a/docs/images/test-diff-after-tab.png and /dev/null differ diff --git a/docs/images/test-diff-after-tab2.png b/docs/images/test-diff-after-tab2.png deleted file mode 100644 index f05ea91..0000000 Binary files a/docs/images/test-diff-after-tab2.png and /dev/null differ diff --git a/docs/images/test-diff-before-tab.png b/docs/images/test-diff-before-tab.png deleted file mode 100644 index e9fad98..0000000 Binary files a/docs/images/test-diff-before-tab.png and /dev/null differ diff --git a/docs/images/test-diff.gif b/docs/images/test-diff.gif deleted file mode 100644 index 0b83fb5..0000000 Binary files a/docs/images/test-diff.gif and /dev/null differ diff --git a/docs/images/theme-catppuccin.png b/docs/images/theme-catppuccin.png index 45aaa9d..3b5b3e2 100644 Binary files a/docs/images/theme-catppuccin.png and b/docs/images/theme-catppuccin.png differ diff --git a/docs/images/theme-dark.png b/docs/images/theme-dark.png index f5c431a..36d597d 100644 Binary files a/docs/images/theme-dark.png and b/docs/images/theme-dark.png differ diff --git a/docs/images/theme-dracula.png b/docs/images/theme-dracula.png index 06e9372..6cbc5c6 100644 Binary files a/docs/images/theme-dracula.png and b/docs/images/theme-dracula.png differ diff --git a/docs/images/theme-gruvbox.png b/docs/images/theme-gruvbox.png index 46deae7..3aa0fcf 100644 Binary files a/docs/images/theme-gruvbox.png and b/docs/images/theme-gruvbox.png differ diff --git a/docs/images/theme-light.png b/docs/images/theme-light.png index b4c6185..d07fd72 100644 Binary files a/docs/images/theme-light.png and b/docs/images/theme-light.png differ diff --git a/docs/images/theme-nord.png b/docs/images/theme-nord.png index 86343c3..95fdcd8 100644 Binary files a/docs/images/theme-nord.png and b/docs/images/theme-nord.png differ diff --git a/docs/tapes/README.md b/docs/tapes/README.md index d569e9f..5c20320 100644 --- a/docs/tapes/README.md +++ b/docs/tapes/README.md @@ -8,7 +8,9 @@ This directory contains [VHS](https://github.com/charmbracelet/vhs) tape files f |------|---------|--------| | `demo.tape` | Main demo GIF | `docs/images/demo.gif` | | `themes.tape` | Theme screenshots | `docs/images/theme-*.png` | +| `theme-light.tape` | Light theme (white bg) | `docs/images/theme-light.png` | | `features.tape` | Feature screenshots | `docs/images/*.png` | +| `command-mode.tape` | Command suggestions/completion | `docs/images/cmd-*.png` | ## Usage (Recommended) @@ -19,9 +21,14 @@ Use task commands from project root (requires Docker + Linux): task demo:record # Record individual items -task demo:record:gif # Main demo GIF only -task demo:record:themes # Theme screenshots only -task demo:record:features # Feature screenshots only +task demo:record:gif # Main demo GIF only +task demo:record:themes # Theme screenshots only +task demo:record:theme-light # Light theme (requires white terminal bg) +task demo:record:features # Feature screenshots only +task demo:record:command-mode # Command mode tests + +# Run all tapes as integration tests +task test:vhs ``` This automatically: diff --git a/docs/tapes/command-mode.tape b/docs/tapes/command-mode.tape new file mode 100644 index 0000000..e411922 --- /dev/null +++ b/docs/tapes/command-mode.tape @@ -0,0 +1,84 @@ +# Command Mode Suggestion & Completion Test +# Tests command mode navigation, suggestions, tab completion, and enter behavior + +Set FontSize 16 +Set Width 1200 +Set Height 600 +Set TypingSpeed 0.08 + +Type "./claws" +Enter +Sleep 2s +Require "Services" + +# --- Suggestion Tests --- + +# ec → ec2 | ecr | ecs +Type ":" +Sleep 300ms +Type "ec" +Sleep 500ms +Require "ec2" +Require "ecr" +Require "ecs" +Screenshot docs/images/cmd-suggest-ec.png + +# ec2 → ec2 (resolved) +Type "2" +Sleep 500ms +Screenshot docs/images/cmd-suggest-ec2.png + +# ec2/ → ec2 | ec2/capacity-reservations | ... +Type "/" +Sleep 500ms +Require "ec2/capacity" +Screenshot docs/images/cmd-suggest-ec2-slash.png + +# ec2/c → ec2/capacity-reservations +Type "c" +Sleep 500ms +Require "capacity-reservations" +Screenshot docs/images/cmd-suggest-ec2-c.png + +Escape +Sleep 300ms + +# --- Enter Navigation Tests --- + +# ec Enter → ec2 service +Type ":ec" +Sleep 300ms +Enter +Sleep 2s +Require "ec2" + +# ec2/ Enter → ec2 service +Type ":ec2/" +Sleep 300ms +Enter +Sleep 2s +Require "ec2" + +# ec2/c Enter → ec2/capacity-reservations +Type ":ec2/c" +Sleep 300ms +Enter +Sleep 2s +Require "Capacity" + +# --- Tab Completion Test --- + +# ec2/c Tab → completes to ec2/capacity-reservations +Type ":" +Sleep 300ms +Type "ec2/c" +Sleep 300ms +Tab +Sleep 500ms +Require "ec2/capacity-reservations" +Screenshot docs/images/cmd-tab-completion.png +Escape +Sleep 300ms + +Type "q" +Sleep 500ms diff --git a/docs/tapes/demo.tape b/docs/tapes/demo.tape index ca08f36..46efb17 100644 --- a/docs/tapes/demo.tape +++ b/docs/tapes/demo.tape @@ -14,6 +14,7 @@ Sleep 1.5s Enter Sleep 2.5s +Require "Services" Type ":" Sleep 1.5s @@ -21,11 +22,13 @@ Type "vpc/subnets" Sleep 1.5s Enter Sleep 2s +Require "Subnet ID" Type "/web" Sleep 1s Enter Sleep 2s +Require "web" Type "m" Sleep 1s @@ -33,6 +36,7 @@ Type "G" Sleep 1s Type "d" Sleep 3s +Require "Detail" Escape Sleep 1.5s @@ -42,14 +46,17 @@ Type "ec2/instances" Sleep 1.5s Enter Sleep 2s +Require "Instance ID" Type "/running" Sleep 1s Enter Sleep 2s +Require "running" Type "a" Sleep 2s +Require "Stop" Type "S" Sleep 1.5s Type "y" @@ -62,6 +69,7 @@ Sleep 2s Type "a" Sleep 2s +Require "Describe" Type "D" Sleep 2s Type "i-" diff --git a/docs/tapes/features.tape b/docs/tapes/features.tape index cecc590..83f591c 100644 --- a/docs/tapes/features.tape +++ b/docs/tapes/features.tape @@ -9,28 +9,33 @@ Set TypingSpeed 0.05 Type "./claws" Enter Sleep 2s +Require "Services" Type ":" Sleep 0.5s Type "ec2/instances" Enter Sleep 2s +Require "Instance ID" Screenshot docs/images/resource-browser.png Type "d" Sleep 2s +Require "Detail" Screenshot docs/images/detail-view.png Escape Sleep 1s Type "a" Sleep 1.5s +Require "Stop" Screenshot docs/images/actions-menu.png Escape Sleep 1s Type "R" Sleep 1s +Require "Region" Screenshot docs/images/multi-region.png Type "/ap-northeast-1" Sleep 1s diff --git a/docs/tapes/test-diff.tape b/docs/tapes/test-diff.tape deleted file mode 100644 index 9e9ffad..0000000 --- a/docs/tapes/test-diff.tape +++ /dev/null @@ -1,37 +0,0 @@ -Output docs/images/test-diff.gif - -Set Shell "bash" -Set FontSize 16 -Set Width 800 -Set Height 400 -Set Padding 10 - -Type "./claws" -Enter -Sleep 2s - -# Navigate to ec2 instances (has demo data) -Type ":ec2/instances" -Enter -Sleep 2s - -# Open command mode and type diff with space -Type ":diff " -Sleep 500ms - -Screenshot docs/images/test-diff-before-tab.png - -# Press Tab to complete -Tab -Sleep 500ms - -Screenshot docs/images/test-diff-after-tab.png - -# Press Tab again -Tab -Sleep 500ms - -Screenshot docs/images/test-diff-after-tab2.png - -Type "q" -Sleep 500ms diff --git a/docs/tapes/theme-light.tape b/docs/tapes/theme-light.tape index 1449aed..8bbfb0d 100644 --- a/docs/tapes/theme-light.tape +++ b/docs/tapes/theme-light.tape @@ -13,6 +13,7 @@ Sleep 0.5s Type "ec2/instances" Enter Sleep 2s +Require "Instance ID" Screenshot docs/images/theme-light.png diff --git a/docs/tapes/themes.tape b/docs/tapes/themes.tape index 0bb9c13..1682a01 100644 --- a/docs/tapes/themes.tape +++ b/docs/tapes/themes.tape @@ -15,26 +15,12 @@ Sleep 0.5s Type "ec2/instances" Enter Sleep 2s +Require "Instance ID" Screenshot docs/images/theme-dark.png Type "q" Sleep 0.5s -# Theme: light (white background) -Set Theme { "background": "#ffffff", "foreground": "#333333", "black": "#000000", "white": "#ffffff" } -Type "./claws -t light" -Enter -Sleep 2s -Type ":" -Sleep 0.5s -Type "ec2/instances" -Enter -Sleep 2s -Screenshot docs/images/theme-light.png -Type "q" -Sleep 0.5s - -# Reset to dark background for remaining themes -Set Theme "Builtin Dark" +# Theme: light - see theme-light.tape (requires white terminal background) # Theme: nord Type "./claws -t nord" @@ -45,6 +31,7 @@ Sleep 0.5s Type "ec2/instances" Enter Sleep 2s +Require "Instance ID" Screenshot docs/images/theme-nord.png Type "q" Sleep 0.5s @@ -58,6 +45,7 @@ Sleep 0.5s Type "ec2/instances" Enter Sleep 2s +Require "Instance ID" Screenshot docs/images/theme-dracula.png Type "q" Sleep 0.5s @@ -71,6 +59,7 @@ Sleep 0.5s Type "ec2/instances" Enter Sleep 2s +Require "Instance ID" Screenshot docs/images/theme-gruvbox.png Type "q" Sleep 0.5s @@ -84,6 +73,7 @@ Sleep 0.5s Type "ec2/instances" Enter Sleep 2s +Require "Instance ID" Screenshot docs/images/theme-catppuccin.png Type "q" Sleep 0.5s