#!/usr/bin/env bash set -euo pipefail DEMO_DIR="${1:-muse-content-addressing-episode00}" command -v muse >/dev/null 2>&1 || { echo "error: muse not found on PATH" >&2; exit 1; } command -v python3 >/dev/null 2>&1 || { echo "error: python3 not found on PATH" >&2; exit 1; } rm -rf "$DEMO_DIR" mkdir -p "$DEMO_DIR" cd "$DEMO_DIR" muse init --domain code cat > engine.py <<'PY' def render_state(state): return {"status": "ready", "items": list(state)} PY cat > README.md <<'MD' # Episode 00 — Content Addressing Demo Tiny repo for objects, snapshots, commits, branches, DAGs, and domain semantics. MD muse commit -m "Baseline: render structured state" cat >> engine.py <<'PY' def validate_state(state): return all(item is not None for item in state) PY muse commit -m "Add state validation" muse checkout -b feature/render cat > formatter.py <<'PY' def format_item(item): return f"[{item}]" PY cat >> engine.py <<'PY' def render_item(item): from formatter import format_item return format_item(item) PY muse commit -m "Feature: semantic item formatting" muse checkout main muse checkout -b feature/metrics cat > metrics.py <<'PY' def count_items(state): return len(state) PY muse commit -m "Feature: state metrics" muse checkout main muse merge feature/render muse merge feature/metrics mkdir -p demo-bytes printf 'Muse content-addressed object\n' > demo-bytes/object-a.txt cp demo-bytes/object-a.txt demo-bytes/object-b-identical.txt printf 'Muse content-addressed object!\n' > demo-bytes/object-c-changed.txt echo echo "Ready in: $(pwd)" echo "Run the screenshot commands from inside this directory."