Commit fd514e1
Changed files (1)
.wraith
bin
.wraith/bin/install-app
@@ -6,46 +6,108 @@ gum style --foreground 212 --border double --border-foreground 212 --padding "1
┃╻┃┣┳┛┣━┫┃ ┃ ┣━┫ ┃ ┣┳┛┣━┫┣╸ ┃
┗┻┛╹┗╸╹ ╹╹ ╹ ╹ ╹ ┗━╸╹┗╸╹ ╹╹ ╹
-Install a Web App or TUI App to your system
+Install Web Apps, TUI Apps, or AppImages
"
if [ "$#" -lt 3 ]; then
- TUI_OR_WEBAPP=$(gum choose "Web App" "TUI App")
- APP_NAME=$(gum input --prompt "Name> " --placeholder "Github Desktop")
- ICON_REF=$(gum input --prompt "Icon URL/Path> " --placeholder "https://example.com/icon.png")
+ APP_TYPE=$(gum choose "Web App" "TUI App" "AppImage")
+ APP_NAME=$(gum input --prompt "Name> " --placeholder "GitHub Desktop")
+ ICON_REF=$(gum input --prompt "Icon URL/Path (optional)> " --placeholder "https://example.com/icon.png")
SINGLETON=$(gum confirm "Singleton app (focus existing instance)?" && echo "yes" || echo "no")
+else
+ APP_NAME="$1"
+ APP_LOCATION="$2"
+ ICON_REF="$3"
+ CUSTOM_EXEC="$4"
+ MIME_TYPES="$5"
+fi
+
+[[ -z "$APP_NAME" ]] && { echo "App name required"; sleep 3; exit 1; }
- if [ "$TUI_OR_WEBAPP" == "Web App" ]; then
+APP_ID=$(echo "$APP_NAME" | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed 's/[^a-z0-9-]//g')
+
+# ------------------ APP TYPE HANDLING ------------------
+case "$APP_TYPE" in
+ "Web App")
APP_LOCATION=$(gum input --prompt "URL> " --placeholder "https://github.com")
DOMAIN=$(echo "$APP_LOCATION" | awk -F[/:] '{print $4}' | sed 's/^www\.//')
APP_ID="chrome-$DOMAIN"
- [[ "$SINGLETON" == "yes" ]] && CUSTOM_EXEC="smart-launch --web \"$APP_ID\" \"$APP_LOCATION\"" || CUSTOM_EXEC="smart-launch --web -n \"$APP_ID\" \"$APP_LOCATION\""
- else
- APP_ID=$(echo "$APP_NAME" | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed 's/[^a-z0-9-]//g')
+ [[ "$SINGLETON" == "yes" ]] \
+ && CUSTOM_EXEC="smart-launch --web \"$APP_ID\" \"$APP_LOCATION\"" \
+ || CUSTOM_EXEC="smart-launch --web -n \"$APP_ID\" \"$APP_LOCATION\""
+ ;;
+
+ "TUI App")
APP_LOCATION=$(gum input --prompt "Path> " --placeholder "/usr/bin/htop")
- [[ "$SINGLETON" == "yes" ]] && CUSTOM_EXEC="smart-launch --tui \"$APP_ID\" \"$APP_LOCATION\"" || CUSTOM_EXEC="smart-launch --tui -n \"$APP_ID\" \"$APP_LOCATION\""
- fi
-else
- APP_NAME="$1"; APP_LOCATION="$2"; ICON_REF="$3"; CUSTOM_EXEC="$4"; MIME_TYPES="$5"
-fi
+ [[ "$SINGLETON" == "yes" ]] \
+ && CUSTOM_EXEC="smart-launch --tui \"$APP_ID\" \"$APP_LOCATION\"" \
+ || CUSTOM_EXEC="smart-launch --tui -n \"$APP_ID\" \"$APP_LOCATION\""
+ ;;
-# Validation
-[[ -z "$APP_NAME" || -z "$APP_LOCATION" || -z "$ICON_REF" ]] && { echo "Missing required fields"; exit 1; }
+ "AppImage")
+ APPIMAGE_SRC=$(gum input --prompt "AppImage URL or Path> " --placeholder "https://example.com/app.AppImage")
+ [[ -z "$APPIMAGE_SRC" ]] && { echo "AppImage not found"; sleep 2; exit 1; }
+
+ APPIMAGE_DIR="$HOME/.local/appimages"
+ mkdir -p "$APPIMAGE_DIR"
-APP_ID=$(echo "$APP_NAME" | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed 's/[^a-z0-9-]//g')
+ if [[ "$APPIMAGE_SRC" =~ ^https?:// ]]; then
+ TMP_APPIMAGE="/tmp/$APP_ID.AppImage"
+ gum spin --spinner dot --title "Downloading AppImage…" -- \
+ curl -fL "$APPIMAGE_SRC" -o "$TMP_APPIMAGE"
+ APPIMAGE_PATH="$TMP_APPIMAGE"
+ else
+ APPIMAGE_PATH="$(realpath "$APPIMAGE_SRC")"
+ fi
-# Icon Management
-ICON_DIR="$HOME/.assets/icons"
-mkdir -p "$ICON_DIR"
-if [[ $ICON_REF =~ ^https?:// ]]; then
- ICON_PATH="$ICON_DIR/$APP_ID.png"
- curl -sL -o "$ICON_PATH" "$ICON_REF" || { echo "Icon download failed"; exit 1; }
-else
- ICON_PATH="$ICON_DIR/$ICON_REF"
+ [[ ! -f "$APPIMAGE_PATH" ]] && { echo "AppImage not found"; sleep 2; exit 1; }
+
+ INSTALL_PATH="$APPIMAGE_DIR/$APP_ID.AppImage"
+ cp "$APPIMAGE_PATH" "$INSTALL_PATH"
+ chmod +x "$INSTALL_PATH"
+
+ CUSTOM_EXEC="$INSTALL_PATH"
+
+ # Auto icon extraction (if user didn't provide one)
+ if [[ -z "$ICON_REF" ]]; then
+ TMPDIR="$(mktemp -d)"
+ pushd "$TMPDIR" >/dev/null
+ if "$INSTALL_PATH" --appimage-extract >/dev/null 2>&1; then
+ ICON_FOUND=$(find squashfs-root -type f \( -name '*.png' -o -name '*.svg' \) | head -n 1)
+ if [[ -n "$ICON_FOUND" ]]; then
+ ICON_DIR="$HOME/.assets/icons"
+ mkdir -p "$ICON_DIR"
+ ICON_REF="$ICON_DIR/$APP_ID.${ICON_FOUND##*.}"
+ cp "$ICON_FOUND" "$ICON_REF"
+ fi
+ fi
+ popd >/dev/null
+ rm -rf "$TMPDIR"
+ fi
+ ;;
+esac
+
+# ------------------ ICON MANAGEMENT ------------------
+ICON_LINE=""
+if [[ -n "$ICON_REF" ]]; then
+ ICON_DIR="$HOME/.assets/icons"
+ mkdir -p "$ICON_DIR"
+
+ if [[ "$ICON_REF" =~ ^https?:// ]]; then
+ ICON_PATH="$ICON_DIR/$APP_ID.png"
+ curl -sL -o "$ICON_PATH" "$ICON_REF" || { echo "Icon download failed"; exit 1; }
+ else
+ ICON_PATH="$ICON_REF"
+ fi
+
+ ICON_LINE="Icon=$ICON_PATH"
fi
-# Create .desktop file
-DESKTOP_FILE="$HOME/.local/share/applications/$APP_ID.desktop"
+# ------------------ DESKTOP FILE ------------------
+DESKTOP_DIR="$HOME/.local/share/applications"
+mkdir -p "$DESKTOP_DIR"
+
+DESKTOP_FILE="$DESKTOP_DIR/$APP_ID.desktop"
cat >"$DESKTOP_FILE" <<EOF
[Desktop Entry]
@@ -54,10 +116,11 @@ Name=$APP_NAME
Exec=$CUSTOM_EXEC
Terminal=false
Type=Application
-Icon=$ICON_PATH
StartupNotify=true
+$ICON_LINE
$( [[ -n "$MIME_TYPES" ]] && echo "MimeType=$MIME_TYPES" )
EOF
chmod +x "$DESKTOP_FILE"
-gum spin --spinner dot --title "Installation complete! You can now find '$APP_NAME' in your app launcher." -- sleep 3
\ No newline at end of file
+
+gum spin --spinner dot --title "Installed '$APP_NAME' successfully" -- sleep 2