Files
2026-07-13 13:33:09 +08:00

212 lines
5.6 KiB
Bash
Executable File

#!/usr/bin/env bash
set -e
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
PLATFORM=
ARCH=
VERSION=
RELEASES_URL="https://github.com/plandex-ai/plandex/releases/download"
# Ensure cleanup happens on exit and on specific signals
trap cleanup EXIT
trap cleanup INT TERM
cleanup () {
cd "${SCRIPT_DIR}"
rm -rf plandex_install_tmp
}
# Set platform
case "$(uname -s)" in
Darwin)
PLATFORM='darwin'
;;
Linux)
PLATFORM='linux'
;;
FreeBSD)
PLATFORM='freebsd'
;;
CYGWIN*|MINGW*|MSYS*)
PLATFORM='windows'
;;
*)
echo "Platform may or may not be supported. Will attempt to install."
PLATFORM='linux'
;;
esac
if [[ "$PLATFORM" == "windows" ]]; then
echo "🚨 Windows is only supported via WSL. It doesn't work in the Windows CMD prompt or PowerShell."
echo "How to install WSL 👉 https://learn.microsoft.com/en-us/windows/wsl/about"
exit 1
fi
# Set arch
if [[ "$(uname -m)" == 'x86_64' ]]; then
ARCH="amd64"
elif [[ "$(uname -m)" == 'arm64' || "$(uname -m)" == 'aarch64' ]]; then
ARCH="arm64"
fi
if [[ "$(cat /proc/1/cgroup 2> /dev/null | grep docker | wc -l)" > 0 ]] || [ -f /.dockerenv ]; then
IS_DOCKER=true
else
IS_DOCKER=false
fi
# Set Version
if [[ -z "${PLANDEX_VERSION}" ]]; then
VERSION=$(curl -sL https://plandex.ai/v2/cli-version.txt)
else
VERSION=$PLANDEX_VERSION
echo "Using custom version $VERSION"
fi
welcome_plandex () {
echo ""
echo "$(printf '%*s' "$(tput cols)" '' | tr ' ' -)"
echo ""
echo "🚀 Plandex v$VERSION • Quick Install"
echo ""
echo "$(printf '%*s' "$(tput cols)" '' | tr ' ' -)"
echo ""
}
download_plandex () {
ENCODED_TAG="cli%2Fv${VERSION}"
url="${RELEASES_URL}/${ENCODED_TAG}/plandex_${VERSION}_${PLATFORM}_${ARCH}.tar.gz"
mkdir -p plandex_install_tmp
cd plandex_install_tmp
echo "📥 Downloading Plandex tarball"
echo ""
echo "👉 $url"
echo ""
curl -s -L -o plandex.tar.gz "${url}"
tar zxf plandex.tar.gz 1> /dev/null
should_sudo=false
if [ "$PLATFORM" == "darwin" ] || $IS_DOCKER ; then
if [[ -d /usr/local/bin ]]; then
if ! mv plandex /usr/local/bin/ 2>/dev/null; then
echo "Permission denied when attempting to move Plandex to /usr/local/bin."
if hash sudo 2>/dev/null; then
should_sudo=true
echo "Attempting to use sudo to complete installation."
sudo mv plandex /usr/local/bin/
if [[ $? -eq 0 ]]; then
echo "✅ Plandex is installed in /usr/local/bin"
echo ""
else
echo "Failed to install Plandex using sudo. Please manually move Plandex to a directory in your PATH."
exit 1
fi
else
echo "sudo not found. Please manually move Plandex to a directory in your PATH."
exit 1
fi
else
echo "✅ Plandex is installed in /usr/local/bin"
fi
else
echo >&2 'Error: /usr/local/bin does not exist. Create this directory with appropriate permissions, then re-install.'
exit 1
fi
else
if [ $UID -eq 0 ]
then
# we are root
mv plandex /usr/local/bin/
elif hash sudo 2>/dev/null;
then
# not root, but can sudo
sudo mv plandex /usr/local/bin/
should_sudo=true
else
echo "ERROR: This script must be run as root or be able to sudo to complete the installation."
exit 1
fi
echo "✅ Plandex is installed in /usr/local/bin"
fi
# create 'pdx' alias, but don't overwrite existing pdx command
if [ ! -x "$(command -v pdx)" ]; then
echo "🎭 Creating pdx alias..."
LOC=$(which plandex)
BIN_DIR=$(dirname "$LOC")
if [ "$should_sudo" = true ]; then
sudo ln -s "$LOC" "$BIN_DIR/pdx" && \
echo "✅ Successfully created 'pdx' alias with sudo." || \
echo "⚠️ Failed to create 'pdx' alias even with sudo. Please create it manually."
else
ln -s "$LOC" "$BIN_DIR/pdx" && \
echo "✅ Successfully created 'pdx' alias." || \
echo "⚠️ Failed to create 'pdx' alias. Please create it manually."
fi
fi
}
check_existing_installation () {
if command -v plandex >/dev/null 2>&1; then
existing_version=$(plandex version 2>/dev/null || echo "unknown")
# Check if version starts with 1.x.x
if [[ "$existing_version" =~ ^1\. ]]; then
echo "Found existing Plandex v1.x installation ($existing_version). Renaming to 'plandex1' before installing v2..."
# Get the location of existing binary
existing_binary=$(which plandex)
binary_dir=$(dirname "$existing_binary")
# Rename plandex to plandex1
if ! mv "$existing_binary" "${binary_dir}/plandex1" 2>/dev/null; then
sudo mv "$existing_binary" "${binary_dir}/plandex1"
fi
# Rename pdx to pdx1 if it exists
if [ -L "${binary_dir}/pdx" ]; then
if ! mv "${binary_dir}/pdx" "${binary_dir}/pdx1" 2>/dev/null; then
sudo mv "${binary_dir}/pdx" "${binary_dir}/pdx1"
fi
echo "Renamed 'pdx' alias to 'pdx1'"
fi
echo "Your v1.x installation is now accessible as 'plandex1' and 'pdx1'"
fi
fi
}
welcome_plandex
check_existing_installation
download_plandex
echo ""
echo "🎉 Installation complete"
echo ""
echo "$(printf '%*s' "$(tput cols)" '' | tr ' ' -)"
echo ""
echo "⚡️ Run 'plandex' or 'pdx' in any project directory and start building!"
echo ""
echo "$(printf '%*s' "$(tput cols)" '' | tr ' ' -)"
echo ""
echo "📚 Need help? 👉 https://docs.plandex.ai"
echo ""
echo "👋 Join a community of AI builders 👉 https://discord.gg/plandex-ai"
echo ""
echo "$(printf '%*s' "$(tput cols)" '' | tr ' ' -)"
echo ""