Sign inSign up

javieralonso716/vcr-watch-kit:latest

Manifest digest

sha256:cad09037ad60e0b4ff753ceedfef23838a53f0d5c5a44388568c6fa2772844aa

Last pushed

29 days by javieralonso716

Type

Sandbox Kit

Manifest digest

sha256:cad09037ad60e0b4ff753ceedfef23838a53f0d5c5a44388568c6fa2772844aa

yaml
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"