83 lines
3.2 KiB
Bash
83 lines
3.2 KiB
Bash
#!/usr/bin/env bash
|
|
# dev.sh — Single entry point for creator plugin development.
|
|
#
|
|
# Usage:
|
|
# scripts/dev.sh # watch mode (default): hot-feedback loop.
|
|
# # Auto-installs first if not installed yet.
|
|
# scripts/dev.sh install # (re)install once: full build + clean staged
|
|
# # copy + `qwenpaw plugin install --force`.
|
|
# # Needed after plugin.json / requirements.txt
|
|
# # changes (they affect the registered manifest
|
|
# # and pip deps, not just synced files).
|
|
#
|
|
# Watch mode:
|
|
# - frontend: `vite build --watch` rebuilds ui/dist incrementally; changes
|
|
# are synced into the installed copy — hard-refresh the browser.
|
|
# - backend: *.py changes are synced and hot-reloaded via the plugins
|
|
# install API — fully automatic, no restart.
|
|
#
|
|
# Environment:
|
|
# QWENPAW_BIN qwenpaw executable (default: qwenpaw on PATH)
|
|
# QWENPAW_PYTHON Python used by QwenPaw (default: python3 on PATH)
|
|
# QWENPAW_WORKING_DIR working dir of the target instance (default ~/.qwenpaw)
|
|
# QWENPAW_PORT API port for backend hot reload (default 8088)
|
|
#
|
|
# Why stage instead of installing the plugin dir directly? The dir doubles
|
|
# as the frontend dev workspace: after a build it contains ui/node_modules
|
|
# (~300MB), and QwenPaw's installer copies everything with no ignore rules,
|
|
# blowing past the CLI's 120s hot-install timeout.
|
|
|
|
set -euo pipefail
|
|
|
|
PLUGIN_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
QWENPAW_BIN="${QWENPAW_BIN:-qwenpaw}"
|
|
QWENPAW_PYTHON="${QWENPAW_PYTHON:-python3}"
|
|
WORKING_DIR="${QWENPAW_WORKING_DIR:-$HOME/.qwenpaw}"
|
|
WORKING_DIR="${WORKING_DIR/#\~/$HOME}"
|
|
|
|
install_plugin() {
|
|
echo "==> Building creator UI..."
|
|
(cd "$PLUGIN_DIR/ui" && npm run build)
|
|
|
|
STAGE_DIR="${TMPDIR:-/tmp}/qwenpaw-creator-staged"
|
|
echo "==> Staging runtime files to $STAGE_DIR ..."
|
|
rm -rf "$STAGE_DIR"
|
|
mkdir -p "$STAGE_DIR/ui"
|
|
cp "$PLUGIN_DIR/plugin.json" "$STAGE_DIR/"
|
|
cp "$PLUGIN_DIR/requirements.txt" "$STAGE_DIR/"
|
|
[ -f "$PLUGIN_DIR/__init__.py" ] && cp "$PLUGIN_DIR/__init__.py" "$STAGE_DIR/"
|
|
rsync -a --exclude '__pycache__' --exclude '*.pyc' \
|
|
"$PLUGIN_DIR/backend/" "$STAGE_DIR/backend/"
|
|
rsync -a "$PLUGIN_DIR/ui/dist/" "$STAGE_DIR/ui/dist/"
|
|
du -sh "$STAGE_DIR" | awk '{print "==> Staged package size: " $1}'
|
|
|
|
echo "==> Installing via qwenpaw plugin install --force ..."
|
|
"$QWENPAW_BIN" plugin install "$STAGE_DIR" --force
|
|
echo "==> Ensuring Playwright Chromium is installed for motion overlays ..."
|
|
"$QWENPAW_PYTHON" -m playwright install chromium
|
|
echo "==> Installed. If a console page is already open, hard-refresh it."
|
|
}
|
|
|
|
watch_plugin() {
|
|
if [ ! -d "$WORKING_DIR/plugins/qwenpaw-creator" ]; then
|
|
echo "==> Plugin not installed yet — installing first ..."
|
|
install_plugin
|
|
fi
|
|
|
|
echo "==> Starting vite build --watch (ui/) ..."
|
|
(cd "$PLUGIN_DIR/ui" && npx vite build --watch) &
|
|
VITE_PID=$!
|
|
trap 'kill "$VITE_PID" 2>/dev/null || true' EXIT
|
|
|
|
python3 -u "$PLUGIN_DIR/scripts/dev_watch.py"
|
|
}
|
|
|
|
case "${1:-watch}" in
|
|
install) install_plugin ;;
|
|
watch) watch_plugin ;;
|
|
*)
|
|
echo "Usage: $0 [install|watch]" >&2
|
|
exit 1
|
|
;;
|
|
esac
|