Files

164 lines
5.0 KiB
Bash

#!/usr/bin/env bash
# Checks that the skill CLI is installed and refreshes upstream.json + LICENSES.
# Does NOT copy or ship the EXE into the extension package.
# Usage: scripts/fetch-cli.sh <skill-name> [cli-path]
set -euo pipefail
source "$(dirname "$0")/lib.sh"
name="${1:-}"
cli_path="${2:-}"
if [[ -z "$name" ]]; then
echo "Aufruf: scripts/fetch-cli.sh <skill-name> [cli-path]" >&2
exit 1
fi
ext="$SKILLS_DIR/$name/extension"
if [[ ! -f "$ext/manifest.json" ]]; then
echo "skills/$name/extension/manifest.json fehlt." >&2
exit 1
fi
source_name='ArtCraft-Launcher'
case "$name" in
wordcraft-mcp)
exe_name=wordcraft-cli.exe
default='C:/Program Files/WordCraft/wordcraft-cli.exe'
repo='https://github.com/storytold/wordcraft'
repo_slug='storytold/wordcraft'
;;
gridcraft-mcp)
exe_name=gridcraft-cli.exe
default='C:/Program Files/GridCraft/gridcraft-cli.exe'
repo='https://github.com/storytold/gridcraft'
repo_slug='storytold/gridcraft'
;;
pdfcraft-mcp)
exe_name=pdfcraft-cli.exe
default='C:/Program Files/PdfCraft/pdfcraft-cli.exe'
repo='https://github.com/storytold/pdfcraft'
repo_slug='storytold/pdfcraft'
;;
figcraft-mcp)
exe_name=figcraft-cli.exe
default='C:/Program Files/FigCraft/figcraft-cli.exe'
repo='https://github.com/storytold/figcraft'
repo_slug='storytold/figcraft'
;;
vectorcraft-mcp)
exe_name=vectorcraft-cli.exe
default='C:/Program Files/VectorCraft/vectorcraft-cli.exe'
repo='https://github.com/storytold/vectorcraft'
repo_slug='storytold/vectorcraft'
;;
solidcraft-mcp)
exe_name=solidcraft-cli.exe
default='C:/Program Files/SolidCraft/solidcraft-cli.exe'
repo='https://github.com/tangency-labs/solidcraft'
repo_slug='tangency-labs/solidcraft'
source_name='SolidCraft-Installer'
;;
cadcraft-mcp)
exe_name=cadcraft-cli.exe
default='C:/Program Files/CADCraft/cadcraft-cli.exe'
repo='https://github.com/storytold/cadcraft'
repo_slug='storytold/cadcraft'
;;
effectcraft-mcp)
exe_name=effectcraft-cli.exe
default='C:/Program Files/EffectCraft/effectcraft-cli.exe'
repo='https://github.com/storytold/effectcraft'
repo_slug='storytold/effectcraft'
;;
filmcraft-mcp)
exe_name=filmcraft-cli.exe
default='C:/Program Files/FilmCraft/filmcraft-cli.exe'
repo='https://github.com/storytold/filmcraft'
repo_slug='storytold/filmcraft'
;;
*)
echo "Kein CLI-Mapping fuer Skill '$name'." >&2
exit 1
;;
esac
src="${cli_path:-$default}"
if [[ ! -f "$src" ]]; then
echo "CLI fehlt: $src" >&2
if [[ "$source_name" == ArtCraft-Launcher ]]; then
echo "Bitte die App ueber den ArtCraft-Launcher installieren, oder Pfad als Argument angeben." >&2
else
echo "Bitte die App ueber den eigenen Installer installieren, oder Pfad als Argument angeben." >&2
fi
exit 1
fi
mkdir -p "$ext/server"
rm -f "$ext/server"/*.exe
if [[ ! -f "$ext/server/README.txt" ]]; then
if [[ "$source_name" == ArtCraft-Launcher ]]; then
install_line='Installiere die App ueber den ArtCraft-Launcher.'
else
install_line='Installiere die App ueber den eigenen Installer.'
fi
printf '%s\n' \
'Diese Erweiterung enthaelt keine CLI.' \
"$install_line" \
"Erwarteter Pfad: $src" > "$ext/server/README.txt"
fi
# CLI-Ausgabe als UTF-8 lesen (kein Locale-Default wie Windows-1252).
ver_out="$(PYTHONIOENCODING=utf-8 python3 -c '
import subprocess, sys
r = subprocess.run(sys.argv[1:], capture_output=True)
sys.stdout.buffer.write(r.stdout)
sys.stdout.buffer.write(r.stderr)
' "$src" --version || true)"
if [[ ! "$ver_out" =~ [0-9]+\.[0-9]+\.[0-9]+ ]] && [[ "$name" == gridcraft-mcp ]]; then
ver_out="$(PYTHONIOENCODING=utf-8 python3 -c '
import subprocess, sys
r = subprocess.run(sys.argv[1:], capture_output=True)
sys.stdout.buffer.write(r.stdout)
sys.stdout.buffer.write(r.stderr)
' "$src" version || true)"
fi
if [[ ! "$ver_out" =~ ([0-9]+\.[0-9]+\.[0-9]+) ]]; then
echo "Version der CLI nicht lesbar: $ver_out" >&2
exit 1
fi
ver="${BASH_REMATCH[1]}"
if command -v sha256sum >/dev/null 2>&1; then
hash="$(sha256sum "$src" | awk '{print $1}')"
elif command -v shasum >/dev/null 2>&1; then
hash="$(shasum -a 256 "$src" | awk '{print $1}')"
else
hash="$(python3 -c "import hashlib,sys; print(hashlib.sha256(open(sys.argv[1],'rb').read()).hexdigest())" "$src")"
fi
python3 -c "
import json, sys
print(json.dumps({
'source': sys.argv[6],
'path': sys.argv[1],
'exe': sys.argv[2],
'version': sys.argv[3],
'sha256': sys.argv[4],
'repository': sys.argv[5],
'tag': 'v' + sys.argv[3],
'bundled': False,
}, separators=(',', ':')))
" "$src" "$exe_name" "$ver" "$hash" "$repo" "$source_name" > "$ext/upstream.json"
printf '\n' >> "$ext/upstream.json" || true
mkdir -p "$ext/LICENSES"
tag="v$ver"
for f in LICENSE-MIT LICENSE-APACHE NOTICE; do
url="https://raw.githubusercontent.com/$repo_slug/$tag/$f"
if ! curl -fsSL "$url" -o "$ext/LICENSES/$f"; then
echo "Lizenzdatei fehlgeschlagen: $url" >&2
exit 1
fi
done
echo "OK $name $ver (nicht gebundelt) $src"