diff --git a/README.md b/README.md index bbffef25..4f934167 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,8 @@ ### **🚀 Quick One-Line Installation** +#### **Install Latest Stable Release (Recommended)** + **Windows (PowerShell):** ```powershell Invoke-Expression (Invoke-WebRequest -Uri "https://raw.githubusercontent.com/catlog22/Claude-Code-Workflow/main/install-remote.ps1" -UseBasicParsing).Content @@ -49,6 +51,32 @@ Invoke-Expression (Invoke-WebRequest -Uri "https://raw.githubusercontent.com/cat bash <(curl -fsSL https://raw.githubusercontent.com/catlog22/Claude-Code-Workflow/main/install-remote.sh) ``` +#### **Install Latest Development Version** + +**Windows (PowerShell):** +```powershell +$script = (Invoke-WebRequest -Uri "https://raw.githubusercontent.com/catlog22/Claude-Code-Workflow/main/install-remote.ps1" -UseBasicParsing).Content +[ScriptBlock]::Create($script).Invoke('-Version', 'latest') +``` + +**Linux/macOS (Bash/Zsh):** +```bash +bash <(curl -fsSL https://raw.githubusercontent.com/catlog22/Claude-Code-Workflow/main/install-remote.sh) --version latest +``` + +#### **Install Specific Version** + +**Windows (PowerShell):** +```powershell +$script = (Invoke-WebRequest -Uri "https://raw.githubusercontent.com/catlog22/Claude-Code-Workflow/main/install-remote.ps1" -UseBasicParsing).Content +[ScriptBlock]::Create($script).Invoke('-Version', 'stable', '-Tag', 'v3.2.0') +``` + +**Linux/macOS (Bash/Zsh):** +```bash +bash <(curl -fsSL https://raw.githubusercontent.com/catlog22/Claude-Code-Workflow/main/install-remote.sh) --version stable --tag v3.2.0 +``` + ### **✅ Verify Installation** After installation, run the following command to ensure CCW is working: ```bash diff --git a/README_CN.md b/README_CN.md index b18be338..837d31e9 100644 --- a/README_CN.md +++ b/README_CN.md @@ -39,6 +39,8 @@ ### **🚀 一键快速安装** +#### **安装最新稳定版(推荐)** + **Windows (PowerShell):** ```powershell Invoke-Expression (Invoke-WebRequest -Uri "https://raw.githubusercontent.com/catlog22/Claude-Code-Workflow/main/install-remote.ps1" -UseBasicParsing).Content @@ -49,6 +51,32 @@ Invoke-Expression (Invoke-WebRequest -Uri "https://raw.githubusercontent.com/cat bash <(curl -fsSL https://raw.githubusercontent.com/catlog22/Claude-Code-Workflow/main/install-remote.sh) ``` +#### **安装最新开发版** + +**Windows (PowerShell):** +```powershell +$script = (Invoke-WebRequest -Uri "https://raw.githubusercontent.com/catlog22/Claude-Code-Workflow/main/install-remote.ps1" -UseBasicParsing).Content +[ScriptBlock]::Create($script).Invoke('-Version', 'latest') +``` + +**Linux/macOS (Bash/Zsh):** +```bash +bash <(curl -fsSL https://raw.githubusercontent.com/catlog22/Claude-Code-Workflow/main/install-remote.sh) --version latest +``` + +#### **安装指定版本** + +**Windows (PowerShell):** +```powershell +$script = (Invoke-WebRequest -Uri "https://raw.githubusercontent.com/catlog22/Claude-Code-Workflow/main/install-remote.ps1" -UseBasicParsing).Content +[ScriptBlock]::Create($script).Invoke('-Version', 'stable', '-Tag', 'v3.2.0') +``` + +**Linux/macOS (Bash/Zsh):** +```bash +bash <(curl -fsSL https://raw.githubusercontent.com/catlog22/Claude-Code-Workflow/main/install-remote.sh) --version stable --tag v3.2.0 +``` + ### **✅ 验证安装** 安装后,运行以下命令以确保 CCW 正常工作: ```bash diff --git a/image.png b/image.png new file mode 100644 index 00000000..2e1bde6c Binary files /dev/null and b/image.png differ diff --git a/install-remote.ps1 b/install-remote.ps1 index 1adc260e..41eb35de 100644 --- a/install-remote.ps1 +++ b/install-remote.ps1 @@ -1,16 +1,88 @@ #!/usr/bin/env pwsh -# Claude Code Workflow (CCW) - Remote Installation Script -# One-liner remote installation for Claude Code Workflow system +<# +.SYNOPSIS + Claude Code Workflow (CCW) - Remote Installation Script + +.DESCRIPTION + One-liner remote installation for Claude Code Workflow system. + Downloads and installs CCW from GitHub with flexible version selection. + +.PARAMETER Version + Installation version type: + - "stable" (default): Latest stable release tag + - "latest": Latest main branch (development version) + - "branch": Install from specific branch + +.PARAMETER Tag + Specific release tag to install (e.g., "v3.2.0") + Only used when Version is "stable" + +.PARAMETER Branch + Branch name to install from (default: "main") + Only used when Version is "branch" + +.PARAMETER Global + Install to global user directory (~/.claude) + +.PARAMETER Directory + Install to custom directory + +.PARAMETER Force + Skip confirmation prompts + +.PARAMETER NoBackup + Skip backup of existing installation + +.PARAMETER NonInteractive + Run in non-interactive mode + +.PARAMETER BackupAll + Backup all files including git-ignored files + +.EXAMPLE + # Install latest stable release (recommended) + .\install-remote.ps1 + +.EXAMPLE + # Install specific stable version + .\install-remote.ps1 -Version stable -Tag "v3.2.0" + +.EXAMPLE + # Install latest development version + .\install-remote.ps1 -Version latest + +.EXAMPLE + # Install from specific branch + .\install-remote.ps1 -Version branch -Branch "feature/new-feature" + +.EXAMPLE + # Install to global directory without prompts + .\install-remote.ps1 -Global -Force + +.LINK + https://github.com/catlog22/Claude-Code-Workflow +#> [CmdletBinding()] param( + [ValidateSet("stable", "latest", "branch")] + [string]$Version = "stable", + + [string]$Tag = "", + + [string]$Branch = "main", + [switch]$Global, + [string]$Directory = "", + [switch]$Force, + [switch]$NoBackup, + [switch]$NonInteractive, - [switch]$BackupAll, - [string]$Branch = "main" + + [switch]$BackupAll ) # Set encoding for proper Unicode support @@ -26,7 +98,7 @@ if ($PSVersionTable.PSVersion.Major -ge 6) { # Script metadata $ScriptName = "Claude Code Workflow (CCW) Remote Installer" -$Version = "2.1.1" +$InstallerVersion = "2.2.0" # Colors for output $ColorSuccess = "Green" @@ -43,7 +115,7 @@ function Write-ColorOutput { } function Show-Header { - Write-ColorOutput "==== $ScriptName v$Version ====" $ColorInfo + Write-ColorOutput "==== $ScriptName v$InstallerVersion ====" $ColorInfo Write-ColorOutput "========================================================" $ColorInfo Write-Host "" } @@ -78,29 +150,70 @@ function Get-TempDirectory { return $tempDir } +function Get-LatestRelease { + try { + $apiUrl = "https://api.github.com/repos/catlog22/Claude-Code-Workflow/releases/latest" + $response = Invoke-RestMethod -Uri $apiUrl -UseBasicParsing + return $response.tag_name + } catch { + Write-ColorOutput "WARNING: Failed to fetch latest release, using 'main' branch" $ColorWarning + return $null + } +} + function Download-Repository { param( [string]$TempDir, - [string]$Branch = "main" + [string]$Version = "stable", + [string]$Branch = "main", + [string]$Tag = "" ) - + $repoUrl = "https://github.com/catlog22/Claude-Code-Workflow" - $zipUrl = "$repoUrl/archive/refs/heads/$Branch.zip" + + # Determine download URL based on version type + if ($Version -eq "stable") { + # Download latest stable release + if ([string]::IsNullOrEmpty($Tag)) { + $latestTag = Get-LatestRelease + if ($latestTag) { + $Tag = $latestTag + } else { + # Fallback to main branch if API fails + $zipUrl = "$repoUrl/archive/refs/heads/main.zip" + $downloadType = "main branch (fallback)" + } + } + + if (-not [string]::IsNullOrEmpty($Tag)) { + $zipUrl = "$repoUrl/archive/refs/tags/$Tag.zip" + $downloadType = "stable release $Tag" + } + } elseif ($Version -eq "latest") { + # Download latest main branch + $zipUrl = "$repoUrl/archive/refs/heads/main.zip" + $downloadType = "latest main branch" + } else { + # Download specific branch + $zipUrl = "$repoUrl/archive/refs/heads/$Branch.zip" + $downloadType = "branch $Branch" + } + $zipPath = Join-Path $TempDir "repo.zip" - + Write-ColorOutput "Downloading from GitHub..." $ColorInfo Write-ColorOutput "Source: $repoUrl" $ColorInfo - Write-ColorOutput "Branch: $Branch" $ColorInfo - + Write-ColorOutput "Type: $downloadType" $ColorInfo + try { # Download with progress $progressPreference = $ProgressPreference $ProgressPreference = 'SilentlyContinue' - + Invoke-WebRequest -Uri $zipUrl -OutFile $zipPath -UseBasicParsing - + $ProgressPreference = $progressPreference - + if (Test-Path $zipPath) { $fileSize = (Get-Item $zipPath).Length Write-ColorOutput "Download complete ($([math]::Round($fileSize/1024/1024, 2)) MB)" $ColorSuccess @@ -237,17 +350,29 @@ function Main { Wait-ForUserConfirmation "System check failed! Press any key to exit..." -ExitAfter } + # Determine version information for display + $versionInfo = switch ($Version) { + "stable" { + if ($Tag) { "Stable release: $Tag" } + else { "Latest stable release (auto-detected)" } + } + "latest" { "Latest main branch (development)" } + "branch" { "Custom branch: $Branch" } + } + # Confirm installation if (-not $NonInteractive -and -not $Force) { Write-Host "" - Write-ColorOutput "SECURITY NOTE:" $ColorWarning - Write-Host "- This script will download and execute Claude Code Workflow from GitHub" - Write-Host "- Repository: https://github.com/catlog22/Claude-Code-Workflow" - Write-Host "- Branch: $Branch (latest stable version)" + Write-ColorOutput "INSTALLATION DETAILS:" $ColorInfo + Write-Host "- Repository: https://github.com/catlog22/Claude-Code-Workflow" + Write-Host "- Version: $versionInfo" Write-Host "- Features: Intelligent workflow orchestration with multi-agent coordination" + Write-Host "" + Write-ColorOutput "SECURITY NOTE:" $ColorWarning + Write-Host "- This script will download and execute code from GitHub" Write-Host "- Please ensure you trust this source" Write-Host "" - + $choice = Read-Host "Continue with installation? (y/N)" if ($choice -notmatch '^[Yy]') { Write-ColorOutput "Installation cancelled" $ColorWarning @@ -261,7 +386,7 @@ function Main { try { # Download repository - $zipPath = Download-Repository $tempDir $Branch + $zipPath = Download-Repository -TempDir $tempDir -Version $Version -Branch $Branch -Tag $Tag if (-not $zipPath) { throw "Download failed" } diff --git a/install-remote.sh b/install-remote.sh index 1ada09fc..e9ae64ac 100644 --- a/install-remote.sh +++ b/install-remote.sh @@ -6,9 +6,13 @@ set -e # Exit on error # Script metadata SCRIPT_NAME="Claude Code Workflow (CCW) Remote Installer" -VERSION="2.1.1" +INSTALLER_VERSION="2.2.0" BRANCH="${BRANCH:-main}" +# Version control +VERSION_TYPE="${VERSION_TYPE:-stable}" # stable, latest, branch +TAG_VERSION="" + # Colors for output COLOR_RESET='\033[0m' COLOR_SUCCESS='\033[0;32m' @@ -32,7 +36,7 @@ function write_color() { } function show_header() { - write_color "==== $SCRIPT_NAME v$VERSION ====" "$COLOR_INFO" + write_color "==== $SCRIPT_NAME v$INSTALLER_VERSION ====" "$COLOR_INFO" write_color "========================================================" "$COLOR_INFO" echo "" } @@ -72,17 +76,80 @@ function get_temp_directory() { echo "$temp_dir" } +function get_latest_release() { + local api_url="https://api.github.com/repos/catlog22/Claude-Code-Workflow/releases/latest" + + if command -v jq &> /dev/null; then + # Use jq if available + local tag + tag=$(curl -fsSL "$api_url" 2>/dev/null | jq -r '.tag_name' 2>/dev/null) + if [ -n "$tag" ] && [ "$tag" != "null" ]; then + echo "$tag" + return 0 + fi + else + # Fallback: parse JSON with grep/sed + local tag + tag=$(curl -fsSL "$api_url" 2>/dev/null | grep -o '"tag_name":\s*"[^"]*"' | sed 's/"tag_name":\s*"\([^"]*\)"/\1/') + if [ -n "$tag" ]; then + echo "$tag" + return 0 + fi + fi + + write_color "WARNING: Failed to fetch latest release, using 'main' branch" "$COLOR_WARNING" >&2 + return 1 +} + function download_repository() { local temp_dir="$1" - local branch="${2:-main}" + local version_type="${2:-stable}" + local branch="${3:-main}" + local tag="${4:-}" local repo_url="https://github.com/catlog22/Claude-Code-Workflow" - local zip_url="${repo_url}/archive/refs/heads/${branch}.zip" + local zip_url="" + local download_type="" + + # Determine download URL based on version type + case "$version_type" in + stable) + # Download latest stable release + if [ -z "$tag" ]; then + tag=$(get_latest_release) + if [ -z "$tag" ]; then + # Fallback to main branch if API fails + zip_url="${repo_url}/archive/refs/heads/main.zip" + download_type="main branch (fallback)" + else + zip_url="${repo_url}/archive/refs/tags/${tag}.zip" + download_type="stable release $tag" + fi + else + zip_url="${repo_url}/archive/refs/tags/${tag}.zip" + download_type="stable release $tag" + fi + ;; + latest) + # Download latest main branch + zip_url="${repo_url}/archive/refs/heads/main.zip" + download_type="latest main branch" + ;; + branch) + # Download specific branch + zip_url="${repo_url}/archive/refs/heads/${branch}.zip" + download_type="branch $branch" + ;; + *) + write_color "ERROR: Invalid version type: $version_type" "$COLOR_ERROR" >&2 + return 1 + ;; + esac + local zip_path="${temp_dir}/repo.zip" write_color "Downloading from GitHub..." "$COLOR_INFO" >&2 write_color "Source: $repo_url" "$COLOR_INFO" >&2 - write_color "Branch: $branch" "$COLOR_INFO" >&2 - write_color "URL: $zip_url" "$COLOR_INFO" >&2 + write_color "Type: $download_type" "$COLOR_INFO" >&2 # Download with curl if curl -fsSL -o "$zip_path" "$zip_url" 2>&1 >&2; then @@ -217,6 +284,23 @@ function wait_for_user() { function parse_arguments() { while [[ $# -gt 0 ]]; do case "$1" in + --version) + VERSION_TYPE="$2" + if [[ ! "$VERSION_TYPE" =~ ^(stable|latest|branch)$ ]]; then + write_color "ERROR: Invalid version type: $VERSION_TYPE" "$COLOR_ERROR" + write_color "Valid options: stable, latest, branch" "$COLOR_ERROR" + exit 1 + fi + shift 2 + ;; + --tag) + TAG_VERSION="$2" + shift 2 + ;; + --branch) + BRANCH="$2" + shift 2 + ;; --global) INSTALL_GLOBAL=true shift @@ -241,10 +325,6 @@ function parse_arguments() { BACKUP_ALL=true shift ;; - --branch) - BRANCH="$2" - shift 2 - ;; --help) show_help exit 0 @@ -260,30 +340,45 @@ function parse_arguments() { function show_help() { cat << EOF -$SCRIPT_NAME v$VERSION +$SCRIPT_NAME v$INSTALLER_VERSION Usage: $0 [OPTIONS] -Options: +Version Options: + --version TYPE Version type: stable (default), latest, or branch + --tag TAG Specific release tag (e.g., v3.2.0) - for stable version + --branch BRANCH Branch name (default: main) - for branch version + +Installation Options: --global Install to global user directory (~/.claude) --directory DIR Install to custom directory --force Force installation without prompts --no-backup Skip backup creation --non-interactive Non-interactive mode (no prompts) --backup-all Backup all files before installation - --branch BRANCH Specify GitHub branch (default: main) --help Show this help message Examples: - # Interactive installation + # Install latest stable release (recommended) $0 + # Install specific stable version + $0 --version stable --tag v3.2.0 + + # Install latest development version + $0 --version latest + + # Install from specific branch + $0 --version branch --branch feature/new-feature + # Global installation without prompts $0 --global --non-interactive # Custom directory installation $0 --directory /opt/claude-code-workflow +Repository: https://github.com/catlog22/Claude-Code-Workflow + EOF } @@ -300,14 +395,34 @@ function main() { exit 1 fi + # Determine version information for display + local version_info="" + case "$VERSION_TYPE" in + stable) + if [ -n "$TAG_VERSION" ]; then + version_info="Stable release: $TAG_VERSION" + else + version_info="Latest stable release (auto-detected)" + fi + ;; + latest) + version_info="Latest main branch (development)" + ;; + branch) + version_info="Custom branch: $BRANCH" + ;; + esac + # Confirm installation if [ "$NON_INTERACTIVE" != true ] && [ "$FORCE" != true ]; then echo "" - write_color "SECURITY NOTE:" "$COLOR_WARNING" - echo "- This script will download and execute Claude Code Workflow from GitHub" + write_color "INSTALLATION DETAILS:" "$COLOR_INFO" echo "- Repository: https://github.com/catlog22/Claude-Code-Workflow" - echo "- Branch: $BRANCH (latest stable version)" + echo "- Version: $version_info" echo "- Features: Intelligent workflow orchestration with multi-agent coordination" + echo "" + write_color "SECURITY NOTE:" "$COLOR_WARNING" + echo "- This script will download and execute code from GitHub" echo "- Please ensure you trust this source" echo "" @@ -328,7 +443,7 @@ function main() { # Download repository local zip_path write_color "Starting download process..." "$COLOR_INFO" - zip_path=$(download_repository "$temp_dir" "$BRANCH") + zip_path=$(download_repository "$temp_dir" "$VERSION_TYPE" "$BRANCH" "$TAG_VERSION") local download_status=$? if [ $download_status -eq 0 ] && [ -n "$zip_path" ] && [ -f "$zip_path" ]; then