Add support for custom global installation paths with automatic context reference transformation. This enables users to install to any location while maintaining working context references. Changes: - Add universal path transformation for ANY global installation path (not just ~/.config/opencode) - Implement automatic cleanup trap for temp files on exit/crash/interrupt - Add early validation for --install-dir argument with clear error messages - Add developer documentation for context reference convention Technical Details: - Path transformation detects local vs global by checking if path ends in .opencode (local) or not (global) - Transformation applies to ALL file types during installation - sed transforms both @ references and shell command paths - Cleanup trap handles EXIT, INT, and TERM signals Testing: - 31 unit and integration tests (100% pass rate) - All README installation scenarios verified - Edge cases tested and handled - Cross-platform compatible (macOS, Linux, Windows Git Bash) Documentation: - Added dev/docs/context-reference-convention.md explaining the required @.opencode/context/ format and why it's necessary - Includes examples, validation instructions, and test results Breaking changes: None New capabilities: Custom global path support
195 lines
4.7 KiB
Bash
Executable file
195 lines
4.7 KiB
Bash
Executable file
#!/bin/bash
|
||
# uninstall.sh - Uninstalls OpenCode Agents
|
||
|
||
set -e
|
||
|
||
# Colors
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m' # No Color
|
||
|
||
echo ""
|
||
echo -e "${BLUE}OpenCode Agents Uninstaller${NC}"
|
||
echo "=============================="
|
||
echo ""
|
||
|
||
# Parse arguments
|
||
UNINSTALL_TYPE=""
|
||
FORCE=false
|
||
|
||
while [[ $# -gt 0 ]]; do
|
||
case $1 in
|
||
--global)
|
||
UNINSTALL_TYPE="global"
|
||
shift
|
||
;;
|
||
--local)
|
||
UNINSTALL_TYPE="local"
|
||
shift
|
||
;;
|
||
--force)
|
||
FORCE=true
|
||
shift
|
||
;;
|
||
--help|-h)
|
||
echo "Usage: ./uninstall.sh [options]"
|
||
echo ""
|
||
echo "Options:"
|
||
echo " --global Uninstall from ~/.config/opencode"
|
||
echo " --local Uninstall from current directory .opencode/"
|
||
echo " --force Skip confirmation prompts"
|
||
echo " --help Show this help message"
|
||
echo ""
|
||
exit 0
|
||
;;
|
||
*)
|
||
echo "Unknown option: $1"
|
||
echo "Use --help for usage information"
|
||
exit 1
|
||
;;
|
||
esac
|
||
done
|
||
|
||
# Determine uninstall location
|
||
if [ -z "$UNINSTALL_TYPE" ]; then
|
||
echo "Select uninstall location:"
|
||
echo " 1) Local (.opencode/ in current directory)"
|
||
echo " 2) Global (~/.config/opencode/)"
|
||
echo ""
|
||
read -p "Enter your choice [1-2]: " choice
|
||
|
||
case $choice in
|
||
1) UNINSTALL_TYPE="local" ;;
|
||
2) UNINSTALL_TYPE="global" ;;
|
||
*)
|
||
echo -e "${RED}Invalid choice${NC}"
|
||
exit 1
|
||
;;
|
||
esac
|
||
fi
|
||
|
||
# Set target directory
|
||
if [ "$UNINSTALL_TYPE" == "global" ]; then
|
||
TARGET_DIR="$HOME/.config/opencode"
|
||
else
|
||
TARGET_DIR="$(pwd)/.opencode"
|
||
fi
|
||
|
||
echo ""
|
||
echo -e "${YELLOW}Uninstall location:${NC} $TARGET_DIR"
|
||
echo ""
|
||
|
||
# Check if installation exists
|
||
if [ ! -f "$TARGET_DIR/.opencode-agents-version" ]; then
|
||
echo -e "${YELLOW}⚠️ No OpenCode Agents installation found at: $TARGET_DIR${NC}"
|
||
echo ""
|
||
echo "This directory may contain other files or a manual installation."
|
||
echo ""
|
||
|
||
if [ "$FORCE" != "true" ]; then
|
||
read -p "Continue with uninstall anyway? (y/N): " -n 1 -r
|
||
echo ""
|
||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||
echo "Uninstall cancelled."
|
||
exit 0
|
||
fi
|
||
fi
|
||
else
|
||
# Show installation info
|
||
echo "Installation details:"
|
||
cat "$TARGET_DIR/.opencode-agents-version"
|
||
echo ""
|
||
fi
|
||
|
||
# Confirm uninstall
|
||
if [ "$FORCE" != "true" ]; then
|
||
echo -e "${RED}⚠️ This will remove all OpenCode Agents files from: $TARGET_DIR${NC}"
|
||
echo ""
|
||
echo "The following will be removed:"
|
||
echo " - $TARGET_DIR/agent/"
|
||
echo " - $TARGET_DIR/command/"
|
||
echo " - $TARGET_DIR/context/"
|
||
echo " - $TARGET_DIR/.opencode-agents-version"
|
||
echo ""
|
||
read -p "Are you sure you want to uninstall? (y/N): " -n 1 -r
|
||
echo ""
|
||
|
||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||
echo "Uninstall cancelled."
|
||
exit 0
|
||
fi
|
||
fi
|
||
|
||
# Perform uninstall
|
||
echo ""
|
||
echo "Uninstalling..."
|
||
|
||
removed_count=0
|
||
|
||
# Remove agent directory
|
||
if [ -d "$TARGET_DIR/agent" ]; then
|
||
rm -rf "$TARGET_DIR/agent"
|
||
echo -e "${GREEN}✓${NC} Removed agents"
|
||
removed_count=$((removed_count + 1))
|
||
fi
|
||
|
||
# Remove command directory
|
||
if [ -d "$TARGET_DIR/command" ]; then
|
||
rm -rf "$TARGET_DIR/command"
|
||
echo -e "${GREEN}✓${NC} Removed commands"
|
||
removed_count=$((removed_count + 1))
|
||
fi
|
||
|
||
# Remove context directory
|
||
if [ -d "$TARGET_DIR/context" ]; then
|
||
rm -rf "$TARGET_DIR/context"
|
||
echo -e "${GREEN}✓${NC} Removed context files"
|
||
removed_count=$((removed_count + 1))
|
||
fi
|
||
|
||
# Remove version file
|
||
if [ -f "$TARGET_DIR/.opencode-agents-version" ]; then
|
||
rm -f "$TARGET_DIR/.opencode-agents-version"
|
||
echo -e "${GREEN}✓${NC} Removed installation metadata"
|
||
fi
|
||
|
||
# Remove AGENTS.md.new if it exists
|
||
if [ -f "$TARGET_DIR/AGENTS.md.new" ]; then
|
||
rm -f "$TARGET_DIR/AGENTS.md.new"
|
||
echo -e "${GREEN}✓${NC} Removed AGENTS.md.new"
|
||
fi
|
||
|
||
# Check if directory is now empty
|
||
if [ -d "$TARGET_DIR" ]; then
|
||
if [ -z "$(ls -A "$TARGET_DIR")" ]; then
|
||
read -p "Remove empty directory $TARGET_DIR? (y/N): " -n 1 -r
|
||
echo ""
|
||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||
rmdir "$TARGET_DIR"
|
||
echo -e "${GREEN}✓${NC} Removed directory"
|
||
fi
|
||
else
|
||
echo ""
|
||
echo -e "${YELLOW}ℹ${NC} Directory not empty. Remaining files:"
|
||
ls -la "$TARGET_DIR"
|
||
fi
|
||
fi
|
||
|
||
echo ""
|
||
echo -e "${GREEN}✅ Uninstall complete!${NC}"
|
||
echo ""
|
||
|
||
if [ $removed_count -eq 0 ]; then
|
||
echo "No OpenCode Agents files were found to remove."
|
||
else
|
||
echo "Removed $removed_count component(s)."
|
||
fi
|
||
|
||
echo ""
|
||
echo "To reinstall, run:"
|
||
echo " ./install.sh"
|
||
echo ""
|
||
|
||
exit 0
|