Skip to content

Commit 26bad3f

Browse files
committed
demo: self-rollback GIF tooling (scripted + real Claude Code TUI recorder)
The viral hook = zero-mount self-rollback. Two paths to a GIF: - examples/demo/self-rollback-demo.sh + docs/self-rollback.gif: a narrated, reproducible demo (real agentenv commands) of an agent changing the SYSTEM (/usr/local/bin, /etc), rolling the WHOLE env back itself, and continuing. - scripts/record-claude-tui.sh: records a REAL interactive Claude Code session (the iconic '⏺ agentenv__checkout' tool cards) rolling back its own env. Must run in a real terminal (TTY) — claude -p only prints the final answer, so the step-by-step UI can't be captured headlessly. - scripts/Dockerfile.recorder builds rewindable-claude-rec (image + asciinema + agg) so recording is fast; make-demo-gif.sh is parameterized (DEMO_SCRIPT/ DEMO_OUT); make-claude-gif.sh + _claude-gif-inner.sh drive the headless path. README GIF is left unwired until the final asset is chosen.
1 parent c996f97 commit 26bad3f

8 files changed

Lines changed: 245 additions & 18 deletions

File tree

docs/self-rollback.cast

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
{"version": 2, "width": 100, "height": 32, "timestamp": 1781662414, "env": {"SHELL": "/bin/sh", "TERM": "xterm-256color"}}
2+
[0.002898, "o", "\r\n\u001b[1;36m━━━━━━━━━━ agentenv — an agent that undoes its own mistakes ━━━━━━━━━━\u001b[0m\r\n"]
3+
[1.210149, "o", "\u001b[0;37m🤖 I'm an AI agent running INSIDE a rewindable environment.\u001b[0m\r\n"]
4+
[2.511997, "o", "\u001b[0;37m🤖 Everything I do — files, system binaries, /etc, installs — is auto-snapshotted.\u001b[0m\r\n"]
5+
[4.822842, "o", "\r\n\u001b[1;36m━━━━━━━━━━ 1. I try an approach (and change the SYSTEM, not just files) ━━━━━━━━━━\u001b[0m\r\n"]
6+
[6.028564, "o", "\u001b[0;37m🤖 Adding a 'greet' command to /usr/local/bin and editing /etc/motd...\u001b[0m\r\n"]
7+
[7.332756, "o", "\u001b[0;33m$ printf '#!/bin/sh\\necho hello form greet\\n' > /usr/local/bin/greet && chmod +x /usr/local/bin/greet\u001b[0m\r\n"]
8+
[8.777528, "o", "\u001b[0;33m$ echo 'Welcome — managed by my agent' > /etc/motd\u001b[0m\r\n"]
9+
[11.214944, "o", "\u001b[0;37m🤖 Let me test it:\u001b[0m\r\n"]
10+
[12.521185, "o", "\u001b[0;33m$ greet\u001b[0m\r\n"]
11+
[12.934106, "o", "hello form greet\r\n"]
12+
[13.935833, "o", "\u001b[1;31m🤖 ...typo: 'form' should be 'from'. And honestly this whole approach is wrong.\u001b[0m\r\n"]
13+
[15.938988, "o", "\r\n\u001b[1;36m━━━━━━━━━━ 2. I roll the WHOLE environment back — MYSELF ━━━━━━━━━━\u001b[0m\r\n"]
14+
[17.142474, "o", "\u001b[0;37m🤖 git can't undo a system binary or /etc. I can — and I won't even restart.\u001b[0m\r\n"]
15+
[18.448859, "o", "\u001b[0;33m$ agentenv checkout 91638a0f22e73136a04018f5\u001b[0m\r\n"]
16+
[19.933249, "o", "HEAD is now 91638a0f22e73136a04018f5\r\n"]
17+
[20.939511, "o", "\u001b[0;37m🤖 Same agent, still running. My changes are gone — system-wide:\u001b[0m\r\n"]
18+
[22.246582, "o", "\u001b[0;33m$ ls /usr/local/bin/greet 2>&1 || echo 'greet: gone'\u001b[0m\r\n"]
19+
[22.660682, "o", "ls: cannot access '/usr/local/bin/greet': No such file or directory\r\n"]
20+
[22.660711, "o", "greet: gone\r\n"]
21+
[23.665177, "o", "\u001b[0;33m$ cat /etc/motd 2>&1 || echo '/etc/motd: restored'\u001b[0m\r\n"]
22+
[24.094009, "o", "\r\nThe programs included with the Debian GNU/Linux system are free software;\r\nthe exact distribution terms for each program are described in the\r\nindividual files in /usr/share/doc/*/copyright.\r\n\r\nDebian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent\r\npermitted by applicable law.\r\n"]
23+
[26.104633, "o", "\r\n\u001b[1;36m━━━━━━━━━━ 3. I try again, correctly — from the clean state ━━━━━━━━━━\u001b[0m\r\n"]
24+
[27.31163, "o", "\u001b[0;33m$ printf '#!/bin/sh\\necho hello from greet\\n' > /usr/local/bin/greet && chmod +x /usr/local/bin/greet\u001b[0m\r\n"]
25+
[28.733796, "o", "\u001b[0;33m$ greet\u001b[0m\r\n"]
26+
[29.149935, "o", "hello from greet\r\n"]
27+
[30.154178, "o", "\u001b[1;32m🤖 Fixed. I explored, failed, undid the whole environment, and kept going.\u001b[0m\r\n"]
28+
[32.156762, "o", "\r\n\u001b[1;36m━━━━━━━━━━ the history — a branch from the point I rolled back to ━━━━━━━━━━\u001b[0m\r\n"]
29+
[33.36001, "o", "\u001b[0;33m$ agentenv log\u001b[0m\r\n"]
30+
[33.767291, "o", "└─ 91638a0f22e73136a04018f5 \"init from /\" <- HEAD\r\n"]
31+
[34.774067, "o", "\r\n\u001b[1;32magentenv — rewind the whole environment, rootless. The agent drives it.\u001b[0m\r\n"]

docs/self-rollback.gif

577 KB
Loading
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
#!/usr/bin/env bash
2+
# agentenv self-rollback demo — an agent makes SYSTEM-LEVEL changes, realizes
3+
# it went the wrong way, and rolls the WHOLE environment back ITSELF, then keeps
4+
# going. The one thing git can't do (system binaries, /etc) and the agent never
5+
# even restarts. Zero mounts, rootless.
6+
#
7+
# Record & render a shareable GIF: DEMO_SCRIPT=examples/demo/self-rollback-demo.sh bash scripts/make-demo-gif.sh
8+
set -euo pipefail
9+
10+
H='\033[1;36m' # scene title
11+
N='\033[0;37m' # narration (the agent "thinking")
12+
CMD='\033[0;33m' # the actual command
13+
OK='\033[1;32m' # payoff
14+
BAD='\033[1;31m' # the mistake
15+
OFF='\033[0m'
16+
17+
title() { printf "\n${H}━━━━━━━━━━ %s ━━━━━━━━━━${OFF}\n" "$1"; sleep 1.2; }
18+
say() { printf "${N}🤖 %s${OFF}\n" "$1"; sleep 1.3; }
19+
ae() { printf "${CMD}\$ agentenv %s${OFF}\n" "$*"; sleep 0.4; agentenv "$@"; sleep 1; }
20+
inenv() { printf "${CMD}\$ %s${OFF}\n" "$1"; sleep 0.4; agentenv exec -- bash -lc "$1"; sleep 1; }
21+
quiet() { agentenv exec -- bash -lc "$1" >/dev/null 2>&1; }
22+
23+
if ! command -v agentenv >/dev/null; then
24+
cd /src && CGO_ENABLED=0 go build -o /tmp/agentenv . && export PATH=/tmp:$PATH
25+
fi
26+
export AGENTENV_ROOT=${AGENTENV_ROOT:-/tmp/agentfs}
27+
28+
# ==========================================================================
29+
title "agentenv — an agent that undoes its own mistakes"
30+
say "I'm an AI agent running INSIDE a rewindable environment."
31+
say "Everything I do — files, system binaries, /etc, installs — is auto-snapshotted."
32+
GOOD=$(agentenv head)
33+
sleep 1
34+
35+
title "1. Approach A — I change the SYSTEM, not just files"
36+
say "Installing a 'greet' command into /usr/local/bin (a system binary)..."
37+
inenv "printf '#!/bin/sh\necho hello form greet\n' > /usr/local/bin/greet && chmod +x /usr/local/bin/greet"
38+
say "Test it:"
39+
inenv "greet"
40+
printf "${BAD}🤖 Typo — 'form', not 'from'. And this whole approach is a dead end.${OFF}\n"; sleep 2
41+
ae commit -m "approach A (broken)"
42+
43+
title "2. I roll the WHOLE environment back — MYSELF"
44+
say "git can't undo a system binary. I can — and I won't even restart."
45+
ae checkout "$GOOD"
46+
say "Same agent, still running. /usr/local/bin/greet is gone, system-wide:"
47+
inenv "command -v greet || echo 'greet: gone'"
48+
sleep 1
49+
50+
title "3. Approach B — try again from the clean state"
51+
inenv "printf '#!/bin/sh\necho hello from greet\n' > /usr/local/bin/greet && chmod +x /usr/local/bin/greet"
52+
inenv "greet"
53+
ae commit -m "approach B (works)"
54+
printf "${OK}🤖 Fixed. I explored a dead end, undid the whole environment, kept going.${OFF}\n"; sleep 2
55+
56+
title "the history — A was a dead end, B is the keeper"
57+
ae log
58+
printf "\n${OK}agentenv — rewind the whole environment, rootless. The agent drives it.${OFF}\n"
59+
sleep 2

scripts/Dockerfile.recorder

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Recorder image: rewindable-claude + asciinema + agg, so make-claude-gif.sh
2+
# can record without re-installing the (slow) python/asciinema stack every run.
3+
# docker build --platform=linux/arm64 -f scripts/Dockerfile.recorder \
4+
# --build-arg AGG_LOCAL=... -t rewindable-claude-rec scripts/ (see make-claude-gif.sh)
5+
FROM rewindable-claude
6+
7+
RUN sed -ri 's#deb\.debian\.org#mirrors.aliyun.com#g' /etc/apt/sources.list.d/*.sources 2>/dev/null || true \
8+
&& apt-get update -qq \
9+
&& apt-get install -y -qq python3-pip fonts-dejavu-core >/dev/null 2>&1 \
10+
&& (pip3 install --quiet --break-system-packages --index-url https://mirrors.aliyun.com/pypi/simple/ asciinema \
11+
|| pip3 install --quiet --break-system-packages asciinema)
12+
13+
# agg (the cast→GIF renderer) is copied in from the build context.
14+
COPY agg /usr/local/bin/agg
15+
RUN chmod 0755 /usr/local/bin/agg
16+
17+
# Restore the rewindable-claude entrypoint (FROM inherits it, but be explicit).
18+
ENTRYPOINT ["/usr/local/bin/rewindable-claude-entrypoint"]

scripts/_claude-gif-inner.sh

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#!/bin/bash
2+
# Inner command for make-claude-gif.sh, run INSIDE the rewindable-claude image
3+
# under asciinema. Invokes the image's own entrypoint (which runs
4+
# `supervise --self-rollback -- ...`) so this is the REAL Claude Code rolling
5+
# back its OWN environment via the agentenv__checkout MCP tool. Reads PROMPT and
6+
# ANTHROPIC_* from the environment.
7+
exec /usr/local/bin/rewindable-claude-entrypoint \
8+
claude --permission-mode acceptEdits --verbose \
9+
--allowedTools Write,Bash,mcp__agentenv__agentenv__log,mcp__agentenv__agentenv__checkout \
10+
-p "$PROMPT"

scripts/make-claude-gif.sh

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#!/usr/bin/env bash
2+
# Record a GIF of REAL Claude Code rolling back its own environment via the
3+
# agentenv__checkout MCP tool. Unlike the scripted demos, this runs the actual
4+
# `claude` binary inside the rewindable-claude image and captures its output.
5+
#
6+
# Needs the rewindable-claude image built locally and an API key in the env:
7+
# ANTHROPIC_API_KEY=... [ANTHROPIC_BASE_URL=... ANTHROPIC_MODEL=...] \
8+
# bash scripts/make-claude-gif.sh
9+
#
10+
# How it works: a small recorder container (with the docker CLI + asciinema +
11+
# agg, and the host docker socket mounted) records a sibling `docker run` of the
12+
# rewindable-claude image driving `claude -p`. Output: docs/claude-rewind.{cast,gif}.
13+
set -euo pipefail
14+
cd "$(dirname "$0")/.."
15+
mkdir -p docs
16+
17+
: "${ANTHROPIC_API_KEY:?set ANTHROPIC_API_KEY}"
18+
# Default to the prebuilt recorder image (rewindable-claude + asciinema + agg);
19+
# build it once with scripts/Dockerfile.recorder so recording is fast.
20+
IMAGE="${IMAGE:-rewindable-claude-rec}"
21+
PLATFORM="${PLATFORM:-linux/$(uname -m | sed 's/x86_64/amd64/;s/arm64/arm64/;s/aarch64/arm64/')}"
22+
23+
# The prompt: explicit steps so Claude reliably uses the MCP tools on camera.
24+
# MUST be a single line — it travels through several layers of shell quoting.
25+
PROMPT='You have agentenv MCP tools. Do these steps, printing a one-line note before each: (1) write /work/calc.py containing "def add(a, b): return a - b # BUG should be +"; (2) call agentenv__log, the first node whose message starts with "init from" is the clean start; (3) call agentenv__checkout with that node id to roll the WHOLE environment back; (4) run: cat /work/calc.py — it should be gone; (5) in one sentence, say you rolled your own environment back and are still running.'
26+
27+
export PROMPT # must be exported so `docker run -e PROMPT` forwards it
28+
29+
# Record INSIDE the recorder image (rewindable-claude + asciinema + agg, built
30+
# once via scripts/Dockerfile.recorder). asciinema records the image's own
31+
# entrypoint driving `claude -p` — the REAL Claude Code self-rollback.
32+
docker run --rm --platform="$PLATFORM" \
33+
--security-opt seccomp=unconfined --security-opt apparmor=unconfined \
34+
-v "$PWD/docs":/out \
35+
-v "$PWD/scripts/_claude-gif-inner.sh":/rec.sh:ro \
36+
-e ANTHROPIC_API_KEY -e ANTHROPIC_BASE_URL -e ANTHROPIC_MODEL -e PROMPT \
37+
--entrypoint bash \
38+
"$IMAGE" -c '
39+
set -e
40+
command -v asciinema >/dev/null || { echo "recorder image missing asciinema — build scripts/Dockerfile.recorder" >&2; exit 1; }
41+
42+
# /rec.sh (mounted) invokes the image entrypoint → supervise --self-rollback
43+
# -- claude. asciinema records the real Claude Code session.
44+
TERM=xterm-256color asciinema rec --overwrite --cols 100 --rows 30 \
45+
-c "bash /rec.sh" /out/claude-rewind.cast
46+
47+
agg --theme monokai --speed 1.5 --font-size 15 /out/claude-rewind.cast /out/claude-rewind.gif
48+
ls -la /out/claude-rewind.cast /out/claude-rewind.gif
49+
'
50+
echo "wrote: $(pwd)/docs/claude-rewind.gif"

scripts/make-demo-gif.sh

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@ set -euo pipefail
1111
cd "$(dirname "$0")/.."
1212
mkdir -p docs
1313

14+
# Which demo to record + output basename (defaults: killer demo → docs/demo.*).
15+
# Override e.g.:
16+
# DEMO_SCRIPT=examples/demo/self-rollback-demo.sh DEMO_OUT=self-rollback \
17+
# bash scripts/make-demo-gif.sh
18+
DEMO_SCRIPT="${DEMO_SCRIPT:-examples/demo/killer-demo.sh}"
19+
DEMO_OUT="${DEMO_OUT:-demo}"
20+
1421
# The recording happens inside Docker so this script needs no host-side tools.
1522
# Inside the container we:
1623
# 1) install asciinema (pip) and download the agg binary (Cast -> GIF renderer)
@@ -21,6 +28,9 @@ docker run --rm --security-opt seccomp=unconfined \
2128
-v "$PWD":/src \
2229
-v "${HOME}/go/pkg/mod":/go/pkg/mod \
2330
-e GOPROXY="${GOPROXY:-http://goproxy.alibaba-inc.com,direct}" \
31+
-e DEMO_SCRIPT="$DEMO_SCRIPT" -e DEMO_OUT="$DEMO_OUT" \
32+
-e PIP_INDEX_URL="${PIP_INDEX_URL:-}" -e AGG_BASE="${AGG_BASE:-https://github.com/asciinema/agg/releases/download/v1.5.0}" \
33+
${AGG_LOCAL:+-v "$AGG_LOCAL":/agg-local:ro} -e AGG_LOCAL="${AGG_LOCAL:+/agg-local}" \
2434
-w /src golang:1.26 bash -c '
2535
set -e
2636
# --- 1) install asciinema + agg as root ---
@@ -29,13 +39,17 @@ docker run --rm --security-opt seccomp=unconfined \
2939
# fonts-dejavu-core supplies DejaVu Sans Mono, one of the default agg font families.
3040
apt-get install -y -qq python3-pip wget ca-certificates fonts-dejavu-core >/dev/null 2>&1
3141
pip3 install --quiet --break-system-packages asciinema 2>/dev/null || pip3 install --quiet asciinema
32-
arch=$(uname -m)
33-
case "$arch" in
34-
x86_64) AGG_URL=https://github.com/asciinema/agg/releases/download/v1.5.0/agg-x86_64-unknown-linux-gnu ;;
35-
aarch64) AGG_URL=https://github.com/asciinema/agg/releases/download/v1.5.0/agg-aarch64-unknown-linux-gnu ;;
36-
*) echo "unsupported arch: $arch" >&2; exit 1 ;;
37-
esac
38-
wget -qO /usr/local/bin/agg "$AGG_URL"
42+
if [ -n "${AGG_LOCAL:-}" ] && [ -f "$AGG_LOCAL" ]; then
43+
cp "$AGG_LOCAL" /usr/local/bin/agg # host pre-fetched it (avoids a flaky github pull)
44+
else
45+
arch=$(uname -m)
46+
case "$arch" in
47+
x86_64) AGG_URL=$AGG_BASE/agg-x86_64-unknown-linux-gnu ;;
48+
aarch64) AGG_URL=$AGG_BASE/agg-aarch64-unknown-linux-gnu ;;
49+
*) echo "unsupported arch: $arch" >&2; exit 1 ;;
50+
esac
51+
wget -qO /usr/local/bin/agg "$AGG_URL"
52+
fi
3953
chmod +x /usr/local/bin/agg
4054
4155
# --- 2) build agentenv as the demo user (uid 1001) ---
@@ -50,15 +64,14 @@ docker run --rm --security-opt seccomp=unconfined \
5064
"
5165
5266
# --- 3a) pre-init the env OUTSIDE the recording so the GIF doesnt show the
53-
# ~2-minute base-image download. The demo skips init when it sees the
54-
# pre-seeded AGENTENV_ROOT.
55-
arch=$(uname -m | sed "s/x86_64/amd64/;s/aarch64/arm64/")
56-
: "${AGENTENV_DEMO_TARBALL:=https://cdimage.ubuntu.com/ubuntu-base/releases/24.04/release/ubuntu-base-24.04.4-base-${arch}.tar.gz}"
67+
# seed copy. Seed from the container rootfs (this Debian image) — no
68+
# foreign download, and it has /usr/local/bin + /etc + bash, which the
69+
# demos use. The demo skips init when it sees the pre-seeded root.
5770
su demo -c "
5871
HOME=/home/demo \
5972
PATH=/home/demo/bin:/usr/local/bin:/usr/bin:/bin \
6073
AGENTENV_ROOT=/home/demo/agentfs \
61-
agentenv init --tarball '$AGENTENV_DEMO_TARBALL' >/dev/null
74+
agentenv init --from / >/dev/null 2>&1
6275
"
6376
# --- 3b) record (still as uid 1001, the headline) ---
6477
su demo -c "
@@ -67,17 +80,17 @@ docker run --rm --security-opt seccomp=unconfined \
6780
AGENTENV_ROOT=/home/demo/agentfs \
6881
TERM=xterm-256color \
6982
asciinema rec --overwrite --cols 100 --rows 32 \
70-
-c \"bash /src/examples/demo/killer-demo.sh\" \
71-
/src/docs/demo.cast
83+
-c \"bash /src/$DEMO_SCRIPT\" \
84+
/src/docs/$DEMO_OUT.cast
7285
"
7386
7487
# --- 4) render the cast to a GIF (run as root, faster) ---
7588
# The demo has built-in reading pauses; render at original speed so they land.
7689
agg --theme monokai --speed 1.0 --font-size 15 \
77-
/src/docs/demo.cast /src/docs/demo.gif
78-
ls -la /src/docs/demo.cast /src/docs/demo.gif
90+
/src/docs/$DEMO_OUT.cast /src/docs/$DEMO_OUT.gif
91+
ls -la /src/docs/$DEMO_OUT.cast /src/docs/$DEMO_OUT.gif
7992
'
8093

8194
echo
82-
echo "wrote: $(pwd)/docs/demo.cast"
83-
echo "wrote: $(pwd)/docs/demo.gif"
95+
echo "wrote: $(pwd)/docs/$DEMO_OUT.cast"
96+
echo "wrote: $(pwd)/docs/$DEMO_OUT.gif"

scripts/record-claude-tui.sh

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#!/usr/bin/env bash
2+
# Record a GIF of a REAL interactive Claude Code session rolling back its own
3+
# environment (the iconic TUI with the "⏺ agentenv__checkout(...)" tool cards).
4+
#
5+
# IMPORTANT: run this IN YOUR TERMINAL — it needs a real TTY and you drive
6+
# Claude live. It cannot be produced headlessly (claude -p only prints the final
7+
# answer; the step-by-step tool cards exist only in the interactive UI).
8+
#
9+
# ANTHROPIC_API_KEY=... [ANTHROPIC_BASE_URL=... ANTHROPIC_MODEL=...] \
10+
# bash scripts/record-claude-tui.sh
11+
#
12+
# What happens: you land in Claude Code inside the rewindable sandbox. Give it a
13+
# task, let it work, then ask it to roll back — e.g.:
14+
#
15+
# create /work/calc.py with a bug, then use the agentenv__checkout tool to
16+
# roll the whole environment back to the init node, and confirm the file is gone
17+
#
18+
# Watch it call agentenv__checkout and KEEP RUNNING. Exit with Ctrl-D / /exit;
19+
# the GIF renders to docs/claude-rewind.gif.
20+
set -euo pipefail
21+
cd "$(dirname "$0")/.."
22+
: "${ANTHROPIC_API_KEY:?set ANTHROPIC_API_KEY}"
23+
mkdir -p docs
24+
25+
IMAGE="${IMAGE:-rewindable-claude-rec}" # built via scripts/Dockerfile.recorder (has asciinema + agg)
26+
PLATFORM="${PLATFORM:-linux/$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/')}"
27+
28+
docker run --rm -it --platform="$PLATFORM" \
29+
--security-opt seccomp=unconfined --security-opt apparmor=unconfined \
30+
-v "$PWD/docs":/out \
31+
-e ANTHROPIC_API_KEY -e ANTHROPIC_BASE_URL -e ANTHROPIC_MODEL \
32+
--entrypoint bash "$IMAGE" -lc '
33+
command -v asciinema agg >/dev/null || { echo "image lacks asciinema/agg — build scripts/Dockerfile.recorder" >&2; exit 1; }
34+
echo
35+
echo " Claude Code starts now, inside the rewindable env."
36+
echo " Try: \"write /work/calc.py with a bug, then use agentenv__checkout to roll the env back to the init node and confirm it is gone\""
37+
echo " Exit with Ctrl-D when done — the GIF will render."
38+
echo
39+
sleep 2
40+
TERM=xterm-256color asciinema rec --overwrite --cols 100 --rows 30 \
41+
-c "/usr/local/bin/rewindable-claude-entrypoint claude --permission-mode acceptEdits" \
42+
/out/claude-rewind.cast
43+
agg --theme monokai --speed 1.2 --font-size 15 /out/claude-rewind.cast /out/claude-rewind.gif
44+
echo "wrote docs/claude-rewind.gif"
45+
'
46+
echo "wrote: $(pwd)/docs/claude-rewind.gif"

0 commit comments

Comments
 (0)