Add image paste support for Claude Code CLI with Z.AI vision MCP
Add clipboard image helper scripts to enable easy image paste functionality in Claude Code CLI using the Z.AI vision MCP server. Features: - clippaste-image: Simple clipboard image extractor (Wayland/X11) - clipimage-paste: Advanced handler with JSON/base64/watch modes - IMAGE-PASTE-README.md: Complete documentation Integration: - Works with Ctrl+V in Claude Code CLI - Automatic Wayland (wl-paste) and X11 (xclip) detection - Z.AI MCP server provides 8 vision analysis tools Usage: clippaste-image # Paste to temp file clippaste-image ~/screenshot.png # Paste to specific file clipimage-paste --json # Get JSON with metadata clipimage-paste --watch # Watch for new images Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
163
bin/clipimage-paste
Executable file
163
bin/clipimage-paste
Executable file
@@ -0,0 +1,163 @@
|
||||
#!/bin/bash
|
||||
# clipimage-paste - Advanced clipboard image handler for Claude Code
|
||||
# Provides multiple output formats and clipboard inspection
|
||||
#
|
||||
# Usage:
|
||||
# clipimage-paste # Paste to temp file, output path
|
||||
# clipimage-paste --json # Output JSON with metadata
|
||||
# clipimage-paste --base64 # Output base64 encoded
|
||||
# clipimage-paste --info # Show clipboard image info only
|
||||
# clipimage-paste --watch # Watch for new images
|
||||
|
||||
set -e
|
||||
|
||||
ACTION="paste"
|
||||
OUTPUT_PATH="/tmp/clipboard-image-$(date +%s).png"
|
||||
|
||||
# Parse arguments
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
--json)
|
||||
ACTION="json"
|
||||
shift
|
||||
;;
|
||||
--base64)
|
||||
ACTION="base64"
|
||||
shift
|
||||
;;
|
||||
--info)
|
||||
ACTION="info"
|
||||
shift
|
||||
;;
|
||||
--watch)
|
||||
ACTION="watch"
|
||||
shift
|
||||
;;
|
||||
-o|--output)
|
||||
OUTPUT_PATH="$2"
|
||||
shift 2
|
||||
;;
|
||||
-h|--help)
|
||||
echo "Usage: clipimage-paste [OPTIONS]"
|
||||
echo ""
|
||||
echo "Options:"
|
||||
echo " -o, --output PATH Output file path"
|
||||
echo " --json Output as JSON"
|
||||
echo " --base64 Output as base64"
|
||||
echo " --info Show clipboard info only"
|
||||
echo " --watch Watch for new images"
|
||||
echo " -h, --help Show this help"
|
||||
echo ""
|
||||
echo "Examples:"
|
||||
echo " clipimage-paste # Save to temp file"
|
||||
echo " clipimage-paste -o shot.png # Save to specific file"
|
||||
echo " clipimage-paste --json # Get JSON output"
|
||||
echo " clipimage-paste --base64 | pbcopy # Copy base64 to clipboard"
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo "Unknown option: $1" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Function to get image from clipboard
|
||||
get_clipboard_image() {
|
||||
local output_file="$1"
|
||||
|
||||
# Try Wayland first
|
||||
if command -v wl-paste &> /dev/null; then
|
||||
if wl-paste --type image/png > "$output_file" 2>/dev/null && [[ -s "$output_file" ]]; then
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
# Fallback to X11
|
||||
if command -v xclip &> /dev/null; then
|
||||
if xclip -selection clipboard -t image/png -o > "$output_file" 2>/dev/null && [[ -s "$output_file" ]]; then
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
# Function to get image info
|
||||
get_image_info() {
|
||||
local file="$1"
|
||||
local size_bytes=$(stat -c%s "$file" 2>/dev/null || stat -f%z "$file" 2>/dev/null || echo "0")
|
||||
local size_human=$(du -h "$file" 2>/dev/null | cut -f1 || echo "unknown")
|
||||
local dimensions=$(identify -format "%wx%h" "$file" 2>/dev/null || echo "unknown")
|
||||
local mime=$(file --mime-type -b "$file" 2>/dev/null || echo "image/png")
|
||||
|
||||
cat <<EOF
|
||||
{
|
||||
"path": "$file",
|
||||
"size_bytes": $size_bytes,
|
||||
"size_human": "$size_human",
|
||||
"dimensions": "$dimensions",
|
||||
"mime_type": "$mime",
|
||||
"timestamp": "$(date -Iseconds)"
|
||||
}
|
||||
EOF
|
||||
}
|
||||
|
||||
# Handle different actions
|
||||
case "$ACTION" in
|
||||
paste)
|
||||
if get_clipboard_image "$OUTPUT_PATH"; then
|
||||
echo "$OUTPUT_PATH"
|
||||
else
|
||||
echo "No image in clipboard" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
|
||||
json)
|
||||
if get_clipboard_image "$OUTPUT_PATH"; then
|
||||
get_image_info "$OUTPUT_PATH"
|
||||
rm -f "$OUTPUT_PATH" # Cleanup temp file
|
||||
else
|
||||
echo '{"error": "No image in clipboard"}' >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
|
||||
base64)
|
||||
if get_clipboard_image "$OUTPUT_PATH"; then
|
||||
base64 "$OUTPUT_PATH"
|
||||
rm -f "$OUTPUT_PATH"
|
||||
else
|
||||
echo "No image in clipboard" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
|
||||
info)
|
||||
if get_clipboard_image "$OUTPUT_PATH"; then
|
||||
get_image_info "$OUTPUT_PATH"
|
||||
rm -f "$OUTPUT_PATH"
|
||||
else
|
||||
echo '{"error": "No image in clipboard"}' >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
|
||||
watch)
|
||||
echo "Watching clipboard for images... Press Ctrl+C to stop"
|
||||
last_hash=""
|
||||
while true; do
|
||||
if get_clipboard_image "$OUTPUT_PATH"; then
|
||||
current_hash=$(md5sum "$OUTPUT_PATH" | cut -d' ' -f1)
|
||||
if [[ "$current_hash" != "$last_hash" ]]; then
|
||||
echo "[$(date '+%H:%M:%S')] New image: $OUTPUT_PATH"
|
||||
get_image_info "$OUTPUT_PATH"
|
||||
last_hash="$current_hash"
|
||||
fi
|
||||
rm -f "$OUTPUT_PATH"
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
;;
|
||||
esac
|
||||
Reference in New Issue
Block a user