Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 69 additions & 0 deletions .github/workflows/build-openfang-full-arm.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
name: Build OpenFang Full (ARM Ubuntu)

on:
workflow_dispatch:
push:
tags:
- "v*"

permissions:
contents: write

jobs:
build:
runs-on: ubuntu-24.04-arm

steps:
- name: Checkout
uses: actions/checkout@v4

- name: System deps (build)
run: |
sudo apt-get update
sudo apt-get install -y \
build-essential pkg-config clang cmake perl git curl \
libssl-dev libsqlite3-dev \
libgtk-3-dev libayatana-appindicator3-dev libwebkit2gtk-4.1-dev

- name: Rust toolchain
uses: dtolnay/rust-toolchain@stable

- uses: Swatinem/rust-cache@v2
with:
key: arm-ubuntu24

- name: Build full workspace
env:
CARGO_BUILD_JOBS: "2"
RUSTFLAGS: "-C debuginfo=0"
run: |
cargo build --release --workspace --locked

- name: Collect release binaries
run: |
mkdir -p out/bin
find target/release -maxdepth 1 -type f -executable \
! -name "*.d" ! -name "build-script-*" -exec cp {} out/bin/ \;
ls -lah out/bin

- name: Package
run: |
tar -C out -czf openfang-aarch64-unknown-linux-gnu-native.tar.gz bin
sha256sum openfang-aarch64-unknown-linux-gnu-native.tar.gz > openfang-aarch64-unknown-linux-gnu-native.tar.gz.sha256

- name: Upload artifact (manual run)
if: github.event_name == 'workflow_dispatch'
uses: actions/upload-artifact@v4
with:
name: openfang-aarch64-unknown-linux-gnu-native
path: openfang-aarch64-unknown-linux-gnu-native.tar.gz

- name: Upload to GitHub Release (tag run)
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v2
with:
files: |
openfang-aarch64-unknown-linux-gnu-native.tar.gz
openfang-aarch64-unknown-linux-gnu-native.tar.gz.sha256
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<img src="public/assets/openfang-logo.png" width="160" alt="OpenFang Logo" />
</p>

<h1 align="center">OpenFang</h1>
<h1 align="center">Self experimenting on OpenFang</h1>
<h3 align="center">The Agent Operating System</h3>

<p align="center">
Expand Down
147 changes: 147 additions & 0 deletions install.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
#!/bin/sh
set -eu

# OpenFang Installer (1BigBear fork - proot-distro ARM64 support)
# https://raw.githubusercontent.com/1BigBear/openfang/main/install.sh

REPO="1BigBear/openfang"
INSTALL_DIR="$HOME/.openfang"
BIN_DIR="$HOME/.openfang/bin"
BINARY="openfang"

main() {
need_cmd curl
need_cmd tar
need_cmd uname

_os="$(uname -s)"
_arch="$(uname -m)"

case "$_os" in
Linux)
case "$_arch" in
x86_64|amd64)
_target="x86_64-unknown-linux-gnu"
;;
aarch64|arm64)
_target="aarch64-unknown-linux-gnu-native"
;;
*)
err "Unsupported architecture: $_arch"
;;
esac
;;
Darwin)
case "$_arch" in
x86_64|amd64) _target="x86_64-apple-darwin" ;;
aarch64|arm64) _target="aarch64-apple-darwin" ;;
*) err "Unsupported architecture: $_arch" ;;
esac
;;
*)
err "Unsupported OS: $_os"
;;
esac

_url="https://github.com/${REPO}/releases/latest/download/openfang-${_target}.tar.gz"

say "Detected: $_os $_arch -> $_target"
say "Downloading from: $_url"

_tmpdir="$(mktemp -d 2>/dev/null || mktemp -d -t openfang)"
trap 'rm -rf "$_tmpdir"' EXIT

_code=$(curl -fsSL -w "%{http_code}" "$_url" -o "${_tmpdir}/openfang.tar.gz") || true
if [ "$_code" = "404" ]; then
err "Release not found. Check https://github.com/${REPO}/releases"
fi
if [ ! -f "${_tmpdir}/openfang.tar.gz" ] || [ "$(wc -c < "${_tmpdir}/openfang.tar.gz")" -lt 1000 ]; then
err "Download failed (HTTP ${_code}). Check https://github.com/${REPO}/releases"
fi

say "Extracting..."
tar -xzf "${_tmpdir}/openfang.tar.gz" -C "$_tmpdir"

_bin="$(find "$_tmpdir" -name "$BINARY" -type f -perm +111 2>/dev/null | head -1)"
if [ -z "$_bin" ]; then
_bin="$(find "$_tmpdir" -name "$BINARY" -type f | head -1)"
fi
if [ -z "$_bin" ]; then
err "Could not find openfang binary in archive"
fi

mkdir -p "$BIN_DIR"
cp "$_bin" "${BIN_DIR}/${BINARY}"
chmod +x "${BIN_DIR}/${BINARY}"

if "${BIN_DIR}/${BINARY}" --version >/dev/null 2>&1; then
_ver=$("${BIN_DIR}/${BINARY}" --version 2>/dev/null || echo "unknown")
say "Installed: $_ver"
else
say "Installed to: ${BIN_DIR}/${BINARY}"
fi

add_to_path

say ""
say "OpenFang installed successfully!"
say ""
say " Run: openfang init"
say " Docs: https://github.com/${REPO}"
say ""

if ! command -v openfang >/dev/null 2>&1; then
say "Note: restart your shell or run:"
say " export PATH=\"${BIN_DIR}:\$PATH\""
say ""
fi
}

add_to_path() {
case ":$PATH:" in
*":${BIN_DIR}:"*) return ;;
esac

_line="export PATH=\"${BIN_DIR}:\$PATH\""

_profile=""
if [ -n "${SHELL:-}" ]; then
case "$SHELL" in
*/zsh) _profile="$HOME/.zshrc" ;;
*/bash)
if [ -f "$HOME/.bashrc" ]; then
_profile="$HOME/.bashrc"
else
_profile="$HOME/.bash_profile"
fi ;;
*/fish) _profile="$HOME/.config/fish/config.fish" ;;
*) _profile="$HOME/.profile" ;;
esac
else
_profile="$HOME/.profile"
fi

if [ -n "$_profile" ] && [ -f "$_profile" ]; then
if ! grep -q "/.openfang/bin" "$_profile" 2>/dev/null; then
printf "\n# OpenFang\n%s\n" "$_line" >> "$_profile"
say "Added to PATH via $_profile"
fi
fi
}

say() {
printf " \033[1;36mopenfang\033[0m %s\n" "$1"
}

err() {
printf " \033[1;36mopenfang\033[0m \033[1;31merror:\033[0m %s\n" "$1" >&2
exit 1
}

need_cmd() {
if ! command -v "$1" >/dev/null 2>&1; then
err "need '$1' (command not found)"
fi
}

main