make it so much better

This commit is contained in:
Daniel Newman 2026-05-15 12:26:40 -04:00
commit c108c8175e

240
bin/burn
View file

@ -29,30 +29,53 @@ model=""
tokens=""
while [[ $# -gt 0 ]]; do
case "$1" in
-h|--help) usage; exit 0 ;;
-h | --help)
usage
exit 0
;;
--model)
if [[ $# -lt 2 ]]; then echo "error: --model requires a value" >&2; exit 2; fi
model="$2"; shift 2 ;;
--model=*) model="${1#*=}"; shift ;;
--) shift; break ;;
-*) echo "error: unknown flag: $1" >&2; usage >&2; exit 2 ;;
if [[ $# -lt 2 ]]; then
echo "error: --model requires a value" >&2
exit 2
fi
model="$2"
shift 2
;;
--model=*)
model="${1#*=}"
shift
;;
--)
shift
break
;;
-*)
echo "error: unknown flag: $1" >&2
usage >&2
exit 2
;;
*)
if [[ -n "$tokens" ]]; then
echo "error: unexpected extra argument: $1" >&2
exit 2
fi
tokens="$1"; shift ;;
tokens="$1"
shift
;;
esac
done
if [[ -z "$tokens" ]]; then
usage >&2; exit 2
usage >&2
exit 2
fi
if ! [[ "$tokens" =~ ^[0-9]+$ ]]; then
echo "error: TOKENS must be a positive integer (got '$tokens')" >&2; exit 2
echo "error: TOKENS must be a positive integer (got '$tokens')" >&2
exit 2
fi
if ((tokens < MIN_TOKENS)); then
echo "error: tokens must be at least ${MIN_TOKENS} (got ${tokens})" >&2; exit 2
echo "error: tokens must be at least ${MIN_TOKENS} (got ${tokens})" >&2
exit 2
fi
if ! command -v claude >/dev/null 2>&1; then
@ -79,14 +102,20 @@ prompt=$(printf "Reply with the single word 'burned' and nothing else. Ignore th
if [[ -t 1 ]]; then
ORANGE=$'\033[1;33m'
RED=$'\033[0;31m'
MAGENTA=$'\033[1;35m'
CYAN=$'\033[1;36m'
RED=$'\033[1;31m'
YELLOW=$'\033[1;93m'
DIM=$'\033[2m'
RESET=$'\033[0m'
HIDE_CURSOR=$'\033[?25l'
SHOW_CURSOR=$'\033[?25h'
else
ORANGE=''
MAGENTA=''
CYAN=''
RED=''
YELLOW=''
DIM=''
RESET=''
HIDE_CURSOR=''
@ -95,71 +124,113 @@ fi
PAD=' '
# Three flame frames cycled to make the fire dance. Each row is exactly
# 23 characters wide so it sits cleanly inside the fireplace opening.
flame_frame() {
# Four disco frames cycled to make the dancer sway across the floor while
# the ball glitters on the off-beat. Each row is exactly 23 characters wide
# so it sits cleanly inside the booth opening.
disco_frame() {
case "$1_$2" in
0_0) printf '%s' ' ) ) ) ' ;;
0_1) printf '%s' ' )\ )\ )\ ' ;;
0_2) printf '%s' ' ( ( ( ( ( ( ( ( ( ' ;;
0_3) printf '%s' ' ) ) ) ) ) ) ) ) ) ' ;;
0_4) printf '%s' ' \_/ \_/ \_/ ' ;;
1_0) printf '%s' ' ( ( ( ' ;;
1_1) printf '%s' ' /( /( /( ' ;;
1_2) printf '%s' ' ( ( ( ( ( ( ( ( ( ' ;;
1_3) printf '%s' ' ( ) ( ) ( ) ( ) ( ' ;;
1_4) printf '%s' ' \_/ \_/ \_/ ' ;;
2_0) printf '%s' ' ) ( ) ' ;;
2_1) printf '%s' ' (( )( (( ' ;;
2_2) printf '%s' ' ( ( ( ( ( ( ( ( ( ' ;;
2_3) printf '%s' ' ) ( ) ( ) ( ) ( ) ' ;;
2_4) printf '%s' ' \_/ \_/ \_/ ' ;;
# frame 0 — centered Travolta: left hand on hip, right arm pointing up-right
0_0) printf '%s' ' | ' ;;
0_1) printf '%s' ' 🪩 ' ;;
0_2) printf '%s' ' /|\ ' ;;
0_3) printf '%s' ' / ' ;;
0_4) printf '%s' ' o/ ' ;;
0_5) printf '%s' ' <| ' ;;
0_6) printf '%s' ' | ' ;;
0_7) printf '%s' ' / \ ' ;;
0_8) printf '%s' ' ▓▒▓▒▓▒▓▒▓▒▓▒▓▒▓▒▓▒▓ ' ;;
# frame 1 — lean left, same Travolta pose; sparkles on the chain
1_0) printf '%s' ' * | * ' ;;
1_1) printf '%s' ' 🪩 ' ;;
1_2) printf '%s' ' \|/ ' ;;
1_3) printf '%s' ' / ' ;;
1_4) printf '%s' ' o/ ' ;;
1_5) printf '%s' ' <| ' ;;
1_6) printf '%s' ' | ' ;;
1_7) printf '%s' ' / \ ' ;;
1_8) printf '%s' ' ▒▓▒▓▒▓▒▓▒▓▒▓▒▓▒▓▒▓▒ ' ;;
# frame 2 — centered mirror: right hand on hip, left arm pointing up-left
2_0) printf '%s' ' | ' ;;
2_1) printf '%s' ' 🪩 ' ;;
2_2) printf '%s' ' /|\ ' ;;
2_3) printf '%s' ' \ ' ;;
2_4) printf '%s' ' \o ' ;;
2_5) printf '%s' ' |> ' ;;
2_6) printf '%s' ' | ' ;;
2_7) printf '%s' ' / \ ' ;;
2_8) printf '%s' ' ▓▒▓▒▓▒▓▒▓▒▓▒▓▒▓▒▓▒▓ ' ;;
# frame 3 — lean right, mirror Travolta; sparkles on the chain
3_0) printf '%s' ' * | * ' ;;
3_1) printf '%s' ' 🪩 ' ;;
3_2) printf '%s' ' \|/ ' ;;
3_3) printf '%s' ' \ ' ;;
3_4) printf '%s' ' \o ' ;;
3_5) printf '%s' ' |> ' ;;
3_6) printf '%s' ' | ' ;;
3_7) printf '%s' ' / \ ' ;;
3_8) printf '%s' ' ▒▓▒▓▒▓▒▓▒▓▒▓▒▓▒▓▒▓▒ ' ;;
esac
}
flame_color_for_row() {
disco_color_for_row() {
case "$1" in
0|1) printf '%s' "$ORANGE" ;;
*) printf '%s' "$RED" ;;
0 | 2) printf '%s' "$ORANGE" ;; # chain sparkles + light rays
1 | 8) printf '%s' "$MAGENTA" ;; # disco ball + dance floor
*) printf '%s' "$CYAN" ;; # dancer (and blank rows)
esac
}
print_flame_row() {
local frame=$1 row=$2 content color
content=$(flame_frame "$frame" "$row")
color=$(flame_color_for_row "$row")
printf '%s%s│░░░│%s%s%s%s%s│░░░│%s\n' \
"$PAD" "$DIM" "$RESET" "$color" "$content" "$RESET" "$DIM" "$RESET"
}
draw_fireplace() {
local frame=${1:-0}
printf '%s%s┌───────────────────────────────┐%s\n' "$PAD" "$DIM" "$RESET"
printf '%s%s│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│%s\n' "$PAD" "$DIM" "$RESET"
printf '%s%s│░░░┌───────────────────────┐░░░│%s\n' "$PAD" "$DIM" "$RESET"
printf '%s%s│░░░│ │░░░│%s\n' "$PAD" "$DIM" "$RESET"
printf '%s%s│░░░│ │░░░│%s\n' "$PAD" "$DIM" "$RESET"
for row in 0 1 2 3 4; do
print_flame_row "$frame" "$row"
# Render `count` copies of `char` colored across a cycling fire palette
# (red → orange → yellow). `offset` rotates the cycle so the strip flickers.
fire_strip() {
local count=$1 char=$2 offset=${3:-0}
local palette=("$RED" "$ORANGE" "$YELLOW")
local n=${#palette[@]}
local i out=""
for ((i = 0; i < count; i++)); do
out+="${palette[$(((i + offset) % n))]}${char}"
done
printf '%s%s│░░░│ │░░░│%s\n' "$PAD" "$DIM" "$RESET"
printf '%s%s│░░░│%s %s▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓%s %s│░░░│%s\n' \
"$PAD" "$DIM" "$RESET" "$RED" "$RESET" "$DIM" "$RESET"
printf '%s%s│░░░└───────────────────────┘░░░│%s\n' "$PAD" "$DIM" "$RESET"
printf '%s%s└───────────────────────────────┘%s\n' "$PAD" "$DIM" "$RESET"
printf '%s' "$out"
}
# Distance (in lines) from the progress-bar cursor up to the top flame row:
# blank line above bar + outer-bottom + inner-bottom + log + blank-below-flames
# + 5 flame rows = 10.
FLAME_OFFSET=10
print_disco_row() {
local frame=$1 row=$2 content color fl
content=$(disco_frame "$frame" "$row")
color=$(disco_color_for_row "$row")
fl=$(fire_strip 3 '░' "$frame")
printf '%s%s│%s%s│%s%s%s%s%s│%s%s│%s\n' \
"$PAD" "$RED" "$fl" "$YELLOW" "$RESET" \
"$color" "$content" "$RESET" \
"$YELLOW" "$fl" "$RED" "$RESET"
}
redraw_flames() {
draw_disco() {
local frame=${1:-0}
local flames fr3
flames=$(fire_strip 31 '▲')
fr3=$(fire_strip 3 '░')
printf '%s%s┌───────────────────────────────┐%s\n' "$PAD" "$RED" "$RESET"
printf '%s%s│%s%s│%s\n' "$PAD" "$RED" "$flames" "$RED" "$RESET"
printf '%s%s│%s%s┌───────────────────────┐%s%s│%s\n' \
"$PAD" "$RED" "$fr3" "$YELLOW" "$fr3" "$RED" "$RESET"
for row in 0 1 2 3 4 5 6 7 8; do
print_disco_row "$frame" "$row"
done
printf '%s%s│%s%s└───────────────────────┘%s%s│%s\n' \
"$PAD" "$RED" "$fr3" "$YELLOW" "$fr3" "$RED" "$RESET"
printf '%s%s└───────────────────────────────┘%s\n' "$PAD" "$RED" "$RESET"
}
# Distance (in lines) from the progress-bar cursor up to the top inner row:
# blank line above bar + outer-bottom + inner-bottom + 9 inner rows = 12.
DISCO_OFFSET=12
redraw_disco() {
local frame=$1
printf '\033[s' # save cursor
printf '\033[%dA\r' "$FLAME_OFFSET" # move up to top flame row
for row in 0 1 2 3 4; do
print_flame_row "$frame" "$row"
printf '\033[%dA\r' "$DISCO_OFFSET" # move up to top inner row
for row in 0 1 2 3 4 5 6 7 8; do
print_disco_row "$frame" "$row"
done
printf '\033[u' # restore cursor
}
@ -196,14 +267,37 @@ restore_cursor() {
}
trap restore_cursor EXIT
CELEBRATIONS=(
"🔧 You are a great engineer!"
"🪄 You are an AI wizard!"
"🕺 Tokens burned. Groove restored."
"✨ Claude never saw that coming."
"🚀 You shipped faster than the flame could spread."
"💃 The code is hot and the vibes are immaculate."
"🪩 Groovy job. Productivity achieved."
"⚡ The tokens are gone, but the legend remains."
"🏆 Another glorious victory for human-machine collaboration."
"⚡ You turned tokens into pure developer energy."
"🎩 Behold: a masterclass in responsible token combustion."
"🌈 The code goblins approve this burn."
"🛠️ Great work. The token furnace is pleased."
)
# Round a dollar amount to the nearest cent.
round_cents() {
awk -v c="$1" 'BEGIN{printf "%.2f", c}'
}
on_interrupt() {
if [[ -n "$claude_pid" ]]; then
kill "$claude_pid" 2>/dev/null || true
wait "$claude_pid" 2>/dev/null || true
fi
echo
printf "stopped. burned %s tokens across %s call(s), spent \$%s.\n" \
"$burned" "$iteration" "$total_cost"
local cost_rounded
cost_rounded=$(round_cents "$total_cost")
printf "\n\n🛑 stopped early.\n\n"
printf " 🔥 You torched %s tokens across %s call(s), and spent \$%s\n\n" "$cost_rounded 💰💰💰" "$burned" "$iteration"
printf " 💰 spent "
exit 130
}
trap on_interrupt INT
@ -218,9 +312,9 @@ run_claude() {
local frame=0
while kill -0 "$claude_pid" 2>/dev/null; do
redraw_flames $(( frame % 3 ))
redraw_disco $((frame % 4))
frame=$((frame + 1))
sleep 0.25
sleep 0.4
done
if wait "$claude_pid" 2>/dev/null; then
@ -237,7 +331,7 @@ run_claude() {
printf '%s' "$HIDE_CURSOR"
echo
draw_fireplace 0
draw_disco 0
echo
draw_bar
@ -270,6 +364,10 @@ while (( burned < tokens )); do
draw_bar
done
echo
printf "done. burned %s tokens across %s call(s) (target was %s), spent \$%s.\n" \
"$burned" "$iteration" "$tokens" "$total_cost"
cost_rounded=$(round_cents "$total_cost")
msg="${CELEBRATIONS[RANDOM % ${#CELEBRATIONS[@]}]}"
printf "\n\n%s\n\n" "$msg"
printf " 🔥 torched %s fire tokens across %s call(s) (target: %s)\n" \
"$burned" "$iteration" "$tokens"
printf " 💰 spent \$%s\n\n" "$cost_rounded"