sha256:cad09037ad60e0b4ff753ceedfef23838a53f0d5c5a44388568c6fa2772844aa
Last pushed
29 days by javieralonso716
Type
Sandbox Kit
Manifest digest
sha256:cad09037ad60e0b4ff753ceedfef23838a53f0d5c5a44388568c6fa2772844aa
schemaVersion: "2"
kind: mixin
name: vcr-watch
version: 1.0.0
displayName: VCR Watch
description: Mirrors the Claude Code session transcript into the workspace so it can be tailed live from the host.
licenses:
- MIT
agentInstructions:
content: |
## Live session transcript (vcr-watch)
This sandbox mirrors the live session transcript to a host-visible path.
`~/.claude/projects` sits on a VM-private ext4 volume the host cannot read;
the workspace is a virtiofs passthrough. The `vcr-watch` mixin bridges them.
The watcher starts automatically in the background and writes to
`<workspace>/.claude-live/` -- `live.log` (readable feed) and
`raw/*.jsonl` (byte-exact mirrors). The user tails these from the host.
If asked to watch/tail/follow the session and it is not already running:
setsid nohup python3 ~/.local/share/vcr-watch/vcr-watch.py \
--dst "$PWD/.claude-live" > /tmp/vcr-watch.err 2>&1 < /dev/null &
To stop it, kill by PID. Never use `pkill -f vcr-watch.py` from a Bash tool
call: the pattern matches the invoking shell's own command line and kills
the shell.
Thinking blocks render empty because Claude Code persists the `signature`
but not the `thinking` text. That is a storage fact, not a formatter bug.
setup:
startup:
- command:
- sh
- -c
- /home/agent/.local/bin/vcr-watch-start.sh "${WORKDIR}/.claude-live" || true
user: "1000"
background: true
description: Start the vcr-watch transcript mirror
files:
- path: /home/agent/.local/bin/vcr-watch-start.sh
content: |
#!/bin/sh
# Publish the skill, then start the mirror. Must always exit 0: the
# durable-startup dispatcher aborts every remaining kit on a non-zero
# exit, which would break sibling kits (e.g. MCP registration).
SKILL_DIR="$HOME/.claude/skills/vcr-watch"
STAGE="$HOME/.local/share/vcr-watch"
# Brace-free on purpose: the kit loader scans file content for
# dollar-brace placeholders and accepts only WORKDIR, so plain
# shell brace expansion here fails kit resolution.
DST="$1"
[ -n "$DST" ] || DST="$HOME/.claude-live"
# Copy rather than ship straight to ~/.claude/skills: that path is a
# virtiofs mount from the host, so kit-injected files there may be
# shadowed depending on mount ordering.
mkdir -p "$SKILL_DIR" 2>/dev/null || true
cp "$STAGE/SKILL.md" "$STAGE/vcr-watch.py" "$SKILL_DIR/" 2>/dev/null || true
mkdir -p "$DST" 2>/dev/null || true
if [ -f "$STAGE/vcr-watch.py" ]; then
setsid nohup python3 "$STAGE/vcr-watch.py" --dst "$DST" \
> /tmp/vcr-watch.err 2>&1 < /dev/null &
fi
exit 0
mode: "0755"