feat: add multi-platform release CI workflow and curl-based install script
Some checks are pending
Release / Build (aarch64-apple-darwin) (push) Waiting to run
Release / Build (aarch64-unknown-linux-gnu) (push) Waiting to run
Release / Build (x86_64-apple-darwin) (push) Waiting to run
Release / Build (x86_64-pc-windows-msvc) (push) Waiting to run
Release / Build (x86_64-unknown-linux-gnu) (push) Waiting to run
Release / Publish GitHub Release (push) Blocked by required conditions
Release / Publish to Crates.io (push) Blocked by required conditions
Some checks are pending
Release / Build (aarch64-apple-darwin) (push) Waiting to run
Release / Build (aarch64-unknown-linux-gnu) (push) Waiting to run
Release / Build (x86_64-apple-darwin) (push) Waiting to run
Release / Build (x86_64-pc-windows-msvc) (push) Waiting to run
Release / Build (x86_64-unknown-linux-gnu) (push) Waiting to run
Release / Publish GitHub Release (push) Blocked by required conditions
Release / Publish to Crates.io (push) Blocked by required conditions
This commit is contained in:
parent
8c7a08edfc
commit
172e9d3165
4 changed files with 305 additions and 4 deletions
152
.github/workflows/release.yml
vendored
Normal file
152
.github/workflows/release.yml
vendored
Normal file
|
|
@ -0,0 +1,152 @@
|
||||||
|
name: Release
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- "v*"
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
|
env:
|
||||||
|
CARGO_TERM_COLOR: always
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-release:
|
||||||
|
name: Build (${{ matrix.target }})
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- target: x86_64-unknown-linux-gnu
|
||||||
|
os: ubuntu-latest
|
||||||
|
use_cross: false
|
||||||
|
archive_name: brokecrew-${{ github.ref_name }}-x86_64-unknown-linux-gnu.tar.gz
|
||||||
|
|
||||||
|
- target: aarch64-unknown-linux-gnu
|
||||||
|
os: ubuntu-latest
|
||||||
|
use_cross: true
|
||||||
|
archive_name: brokecrew-${{ github.ref_name }}-aarch64-unknown-linux-gnu.tar.gz
|
||||||
|
|
||||||
|
- target: x86_64-apple-darwin
|
||||||
|
os: macos-13
|
||||||
|
use_cross: false
|
||||||
|
archive_name: brokecrew-${{ github.ref_name }}-x86_64-apple-darwin.tar.gz
|
||||||
|
|
||||||
|
- target: aarch64-apple-darwin
|
||||||
|
os: macos-latest
|
||||||
|
use_cross: false
|
||||||
|
archive_name: brokecrew-${{ github.ref_name }}-aarch64-apple-darwin.tar.gz
|
||||||
|
|
||||||
|
- target: x86_64-pc-windows-msvc
|
||||||
|
os: windows-latest
|
||||||
|
use_cross: false
|
||||||
|
archive_name: brokecrew-${{ github.ref_name }}-x86_64-pc-windows-msvc.zip
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout source
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install Rust toolchain
|
||||||
|
uses: dtolnay/rust-toolchain@stable
|
||||||
|
with:
|
||||||
|
targets: ${{ matrix.target }}
|
||||||
|
|
||||||
|
- name: Install Cross for cross-compilation
|
||||||
|
if: matrix.use_cross
|
||||||
|
run: cargo install cross --git https://github.com/cross-rs/cross
|
||||||
|
|
||||||
|
- name: Build release binary
|
||||||
|
run: |
|
||||||
|
if [ "${{ matrix.use_cross }}" = "true" ]; then
|
||||||
|
cross build --release --target ${{ matrix.target }}
|
||||||
|
else
|
||||||
|
cargo build --release --target ${{ matrix.target }}
|
||||||
|
fi
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- name: Package artifacts (Unix)
|
||||||
|
if: runner.os != 'Windows'
|
||||||
|
run: |
|
||||||
|
BIN_PATH="target/${{ matrix.target }}/release/brokecrew"
|
||||||
|
STAGING="brokecrew-staging"
|
||||||
|
mkdir -p "$STAGING"
|
||||||
|
cp "$BIN_PATH" "$STAGING/brokecrew"
|
||||||
|
cp README.md LICENSE-MIT LICENSE-APACHE "$STAGING/"
|
||||||
|
mkdir -p "$STAGING/config"
|
||||||
|
cp config/personas.example.toml "$STAGING/config/"
|
||||||
|
tar -czvf "${{ matrix.archive_name }}" -C "$STAGING" .
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- name: Package artifacts (Windows)
|
||||||
|
if: runner.os == 'Windows'
|
||||||
|
run: |
|
||||||
|
$bin = "target/${{ matrix.target }}/release/brokecrew.exe"
|
||||||
|
$staging = "brokecrew-staging"
|
||||||
|
New-Item -ItemType Directory -Force -Path $staging
|
||||||
|
Copy-Item $bin -Destination "$staging/brokecrew.exe"
|
||||||
|
Copy-Item README.md, LICENSE-MIT, LICENSE-APACHE -Destination "$staging/"
|
||||||
|
New-Item -ItemType Directory -Force -Path "$staging/config"
|
||||||
|
Copy-Item config/personas.example.toml -Destination "$staging/config/"
|
||||||
|
Compress-Archive -Path "$staging/*" -DestinationPath "${{ matrix.archive_name }}"
|
||||||
|
shell: pwsh
|
||||||
|
|
||||||
|
- name: Generate SHA256 checksum
|
||||||
|
run: |
|
||||||
|
if [ "${{ runner.os }}" = "Windows" ]; then
|
||||||
|
CertUtil -hashfile "${{ matrix.archive_name }}" SHA256 | Select-String -Pattern "^[a-f0-9]" | ForEach-Object { "$($_.Line.Trim()) ${{ matrix.archive_name }}" } > "${{ matrix.archive_name }}.sha256"
|
||||||
|
else
|
||||||
|
shasum -a 256 "${{ matrix.archive_name }}" > "${{ matrix.archive_name }}.sha256"
|
||||||
|
fi
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- name: Upload artifacts
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: assets-${{ matrix.target }}
|
||||||
|
path: |
|
||||||
|
${{ matrix.archive_name }}
|
||||||
|
${{ matrix.archive_name }}.sha256
|
||||||
|
|
||||||
|
publish-release:
|
||||||
|
name: Publish GitHub Release
|
||||||
|
needs: [build-release]
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Download all built artifacts
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
path: dist
|
||||||
|
merge-multiple: true
|
||||||
|
|
||||||
|
- name: Create Release and Upload Assets
|
||||||
|
uses: softprops/action-gh-release@v2
|
||||||
|
with:
|
||||||
|
files: |
|
||||||
|
dist/*
|
||||||
|
generate_release_notes: true
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
publish-crates:
|
||||||
|
name: Publish to Crates.io
|
||||||
|
needs: [build-release]
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: startsWith(github.ref, 'refs/tags/v')
|
||||||
|
steps:
|
||||||
|
- name: Checkout source
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install Rust toolchain
|
||||||
|
uses: dtolnay/rust-toolchain@stable
|
||||||
|
|
||||||
|
- name: Publish to crates.io
|
||||||
|
if: env.CARGO_REGISTRY_TOKEN != ''
|
||||||
|
run: cargo publish --token "$CARGO_REGISTRY_TOKEN"
|
||||||
|
env:
|
||||||
|
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
|
||||||
|
|
@ -6,7 +6,7 @@ authors = ["oiupoyt <oiupoyt.cat@gmail.com>"]
|
||||||
description = "A Rust-native multi-model AI team CLI with resilient OpenRouter fallback routing"
|
description = "A Rust-native multi-model AI team CLI with resilient OpenRouter fallback routing"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
repository = "https://github.com/brokecrew/brokecrew"
|
repository = "https://github.com/oiupoyt/brokecrew"
|
||||||
keywords = ["cli", "llm", "openrouter", "multi-agent", "ai"]
|
keywords = ["cli", "llm", "openrouter", "multi-agent", "ai"]
|
||||||
categories = ["command-line-utilities", "development-tools"]
|
categories = ["command-line-utilities", "development-tools"]
|
||||||
|
|
||||||
|
|
|
||||||
12
README.md
12
README.md
|
|
@ -1,6 +1,6 @@
|
||||||
# BrokeCrew 🤖⚡
|
# BrokeCrew 🤖⚡
|
||||||
|
|
||||||
[](https://github.com/brokecrew/brokecrew/actions)
|
[](https://github.com/oiupoyt/brokecrew/actions)
|
||||||
[](LICENSE-MIT)
|
[](LICENSE-MIT)
|
||||||
[](https://crates.io/crates/brokecrew)
|
[](https://crates.io/crates/brokecrew)
|
||||||
|
|
||||||
|
|
@ -47,13 +47,19 @@ Code Review:
|
||||||
|
|
||||||
### 1. Installation
|
### 1. Installation
|
||||||
|
|
||||||
|
**One-line curl install (Linux & macOS):**
|
||||||
|
```bash
|
||||||
|
curl -fsSL https://raw.githubusercontent.com/oiupoyt/brokecrew/main/install.sh | bash
|
||||||
|
```
|
||||||
|
|
||||||
|
**Via Cargo (Crates.io):**
|
||||||
```bash
|
```bash
|
||||||
cargo install brokecrew
|
cargo install brokecrew
|
||||||
```
|
```
|
||||||
|
|
||||||
Or build from source:
|
**Build from source:**
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/brokecrew/brokecrew.git
|
git clone https://github.com/oiupoyt/brokecrew.git
|
||||||
cd brokecrew
|
cd brokecrew
|
||||||
cargo install --path .
|
cargo install --path .
|
||||||
```
|
```
|
||||||
|
|
|
||||||
143
install.sh
Executable file
143
install.sh
Executable file
|
|
@ -0,0 +1,143 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# BrokeCrew Installer
|
||||||
|
# Usage: curl -fsSL https://raw.githubusercontent.com/oiupoyt/brokecrew/main/install.sh | bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
REPO="oiupoyt/brokecrew"
|
||||||
|
BINARY_NAME="brokecrew"
|
||||||
|
|
||||||
|
# ANSI Color codes
|
||||||
|
BOLD="\033[1m"
|
||||||
|
GREEN="\033[0;32m"
|
||||||
|
CYAN="\033[0;36m"
|
||||||
|
YELLOW="\033[0;33m"
|
||||||
|
RED="\033[0;31m"
|
||||||
|
RESET="\033[0m"
|
||||||
|
|
||||||
|
log_info() {
|
||||||
|
printf "${CYAN}==>${RESET} ${BOLD}%b${RESET}\n" "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_success() {
|
||||||
|
printf "${GREEN}✔${RESET} ${BOLD}%b${RESET}\n" "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_warn() {
|
||||||
|
printf "${YELLOW}⚠ %b${RESET}\n" "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_error() {
|
||||||
|
printf "${RED}✖ Error: %b${RESET}\n" "$1" >&2
|
||||||
|
}
|
||||||
|
|
||||||
|
# 1. Detect Operating System
|
||||||
|
OS="$(uname -s | tr '[:upper:]' '[:lower:]')"
|
||||||
|
case "$OS" in
|
||||||
|
linux)
|
||||||
|
TARGET_OS="unknown-linux-gnu"
|
||||||
|
;;
|
||||||
|
darwin)
|
||||||
|
TARGET_OS="apple-darwin"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
log_error "Unsupported operating system: $OS. BrokeCrew supports Linux and macOS via this script."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# 2. Detect CPU Architecture
|
||||||
|
ARCH="$(uname -m)"
|
||||||
|
case "$ARCH" in
|
||||||
|
x86_64|amd64)
|
||||||
|
TARGET_ARCH="x86_64"
|
||||||
|
;;
|
||||||
|
aarch64|arm64)
|
||||||
|
TARGET_ARCH="aarch64"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
log_error "Unsupported CPU architecture: $ARCH. BrokeCrew prebuilts support x86_64 and aarch64."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
TARGET="${TARGET_ARCH}-${TARGET_OS}"
|
||||||
|
log_info "Detected platform: ${BOLD}${TARGET}${RESET}"
|
||||||
|
|
||||||
|
# 3. Determine Installation Directory
|
||||||
|
if [ -n "${INSTALL_DIR:-}" ]; then
|
||||||
|
DEST_DIR="$INSTALL_DIR"
|
||||||
|
elif [ -d "$HOME/.cargo/bin" ] && [[ ":$PATH:" == *":$HOME/.cargo/bin:"* ]]; then
|
||||||
|
DEST_DIR="$HOME/.cargo/bin"
|
||||||
|
elif [ -d "$HOME/.local/bin" ]; then
|
||||||
|
DEST_DIR="$HOME/.local/bin"
|
||||||
|
else
|
||||||
|
DEST_DIR="$HOME/.local/bin"
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p "$DEST_DIR"
|
||||||
|
|
||||||
|
# 4. Resolve Latest Version from GitHub
|
||||||
|
log_info "Resolving latest release for ${REPO}..."
|
||||||
|
LATEST_TAG=$(curl -sSL "https://api.github.com/repos/${REPO}/releases/latest" 2>/dev/null | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/' || true)
|
||||||
|
|
||||||
|
if [ -z "$LATEST_TAG" ]; then
|
||||||
|
LATEST_TAG="v0.1.0"
|
||||||
|
log_warn "Could not resolve latest tag from GitHub API, defaulting to ${LATEST_TAG}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
ARCHIVE_NAME="brokecrew-${LATEST_TAG}-${TARGET}.tar.gz"
|
||||||
|
DOWNLOAD_URL="https://github.com/${REPO}/releases/download/${LATEST_TAG}/${ARCHIVE_NAME}"
|
||||||
|
|
||||||
|
TMP_DIR=$(mktemp -d -t brokecrew-install-XXXXXX)
|
||||||
|
cleanup() {
|
||||||
|
rm -rf "$TMP_DIR"
|
||||||
|
}
|
||||||
|
trap cleanup EXIT
|
||||||
|
|
||||||
|
# 5. Download & Extract
|
||||||
|
log_info "Downloading BrokeCrew (${LATEST_TAG}) for ${TARGET}..."
|
||||||
|
DOWNLOAD_SUCCESS=false
|
||||||
|
|
||||||
|
if curl -sSL -f -o "${TMP_DIR}/${ARCHIVE_NAME}" "$DOWNLOAD_URL"; then
|
||||||
|
DOWNLOAD_SUCCESS=true
|
||||||
|
tar -xzf "${TMP_DIR}/${ARCHIVE_NAME}" -C "$TMP_DIR"
|
||||||
|
INSTALL_SRC="${TMP_DIR}/${BINARY_NAME}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Fallback to cargo install if release asset not yet published
|
||||||
|
if [ "$DOWNLOAD_SUCCESS" = false ]; then
|
||||||
|
log_warn "Precompiled release asset not found at ${DOWNLOAD_URL}."
|
||||||
|
if command -v cargo >/dev/null 2>&1; then
|
||||||
|
log_info "Building from source via cargo..."
|
||||||
|
cargo install --git "https://github.com/${REPO}.git" --root "${TMP_DIR}/cargo-install"
|
||||||
|
INSTALL_SRC="${TMP_DIR}/cargo-install/bin/${BINARY_NAME}"
|
||||||
|
else
|
||||||
|
log_error "No prebuilt binary available and cargo is not installed."
|
||||||
|
log_info "Please install Rust (https://rustup.rs) or download a binary manually from https://github.com/${REPO}/releases"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 6. Install Executable
|
||||||
|
chmod +x "$INSTALL_SRC"
|
||||||
|
cp -f "$INSTALL_SRC" "${DEST_DIR}/${BINARY_NAME}"
|
||||||
|
|
||||||
|
log_success "Installed '${BINARY_NAME}' into ${DEST_DIR}/${BINARY_NAME}"
|
||||||
|
|
||||||
|
# 7. PATH Verification
|
||||||
|
if [[ ":$PATH:" != *":$DEST_DIR:"* ]]; then
|
||||||
|
log_warn "${DEST_DIR} is not in your system PATH."
|
||||||
|
printf "Add the following line to your ~/.bashrc or ~/.zshrc:\n"
|
||||||
|
printf " export PATH=\"%s:\$PATH\"\n\n" "$DEST_DIR"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 8. Success Banner
|
||||||
|
printf "\n"
|
||||||
|
printf "${GREEN}${BOLD}BrokeCrew successfully installed!${RESET}\n\n"
|
||||||
|
printf "Run the command:\n"
|
||||||
|
printf " ${CYAN}${BOLD}brokecrew --help${RESET}\n\n"
|
||||||
|
printf "To set up your OpenRouter API key:\n"
|
||||||
|
printf " ${CYAN}${BOLD}brokecrew config set-key${RESET}\n\n"
|
||||||
|
printf "To start chatting with your AI personas:\n"
|
||||||
|
printf " ${CYAN}${BOLD}brokecrew chat \"build me a proxy checker site\"${RESET}\n\n"
|
||||||
Loading…
Add table
Reference in a new issue