Files
elizaos--eliza/packages/os/linux/Justfile
T
wehub-resource-sync 426e9eeabd
Benchmark Bridge Tests / benchmark (bunx @biomejs/biome check packages/lifeops-bench/src, benchmark-lint) (push) Waiting to run
Benchmark Bridge Tests / benchmark (bunx vitest run --config packages/lifeops-bench/vitest.config.ts --root packages/lifeops-bench --passWithNoTests, benchmark-tests) (push) Waiting to run
Build Agent Image / build-and-push (push) Waiting to run
Chat shell gestures / Chat shell gesture + parity e2e (push) Waiting to run
ci / test (push) Waiting to run
ci / lint-and-format (push) Waiting to run
ci / build (push) Waiting to run
ci / dev-startup (push) Waiting to run
Cloud Gateway Discord / Test (push) Waiting to run
Cloud Gateway Webhook / Test (push) Waiting to run
Cloud Tests / lint-and-types (push) Waiting to run
Cloud Tests / unit-tests (push) Waiting to run
Cloud Tests / integration-tests (push) Waiting to run
Cloud Tests / e2e-tests (push) Blocked by required conditions
CodeQL Advanced / Analyze (javascript-typescript) (push) Waiting to run
Deploy Apps Worker (Product 2) / Determine environment (push) Waiting to run
Deploy Apps Worker (Product 2) / Deploy apps worker to apps-control host (${{ needs.determine-env.outputs.environment }}) (push) Blocked by required conditions
Deploy Eliza Provisioning Worker / Determine environment (push) Waiting to run
Deploy Eliza Provisioning Worker / Deploy worker to Hetzner host (${{ needs.determine-env.outputs.environment }} @ ${{ needs.determine-env.outputs.deployment_sha }}) (push) Blocked by required conditions
Dev Smoke / Classify changed paths (push) Waiting to run
Dev Smoke / bun run dev onboarding chat (push) Blocked by required conditions
Dev Smoke / Vite HMR dependency-level smoke (push) Blocked by required conditions
Electrobun Submodule Guard / electrobun gitlink is fetchable (push) Waiting to run
gitleaks / gitleaks (push) Waiting to run
Markdown Links / Relative Markdown Links (push) Waiting to run
Publish @elizaos/example-code / check_npm (push) Waiting to run
Publish @elizaos/example-code / publish_npm (push) Blocked by required conditions
Publish @elizaos/plugin-elizacloud / verify_version (push) Waiting to run
Publish @elizaos/plugin-elizacloud / publish_npm (push) Blocked by required conditions
Quality (Extended) / Homepage Build (PR smoke) (push) Waiting to run
Quality (Extended) / Comment-only diff guard (push) Waiting to run
Quality (Extended) / Format + Type Safety Ratchet (push) Waiting to run
Quality (Extended) / Develop Gate (secret scan + UI determinism) (push) Waiting to run
Quality (Extended) / Develop Gate (lint) (push) Waiting to run
Sandbox Live Smoke / Sandbox live smoke (push) Waiting to run
Snap Build & Test / Build Snap (amd64) (push) Waiting to run
Snap Build & Test / Build Snap (arm64) (push) Waiting to run
supply-chain / sbom (push) Waiting to run
supply-chain / vulnerability-scan (push) Waiting to run
Build, Push & Deploy to Phala Cloud / build-and-push (push) Waiting to run
Test Packaging / Validate Packaging Configs (push) Waiting to run
Test Packaging / PyPI on Python ${{ matrix.python }} (push) Waiting to run
Test Packaging / Pack & Test JS Tarballs (push) Waiting to run
Test Packaging / elizaos CLI global-install smoke (node + bun) (push) Waiting to run
UI Fixture E2E / ui-fixture-e2e (push) Waiting to run
UI Fixture E2E / fixture-e2e (push) Waiting to run
UI Story Gate / story-gate (push) Waiting to run
vault-ci / test (macos-latest) (push) Waiting to run
vault-ci / test (ubuntu-latest) (push) Waiting to run
vault-ci / test (windows-latest) (push) Waiting to run
vault-ci / app-core wiring tests (push) Waiting to run
verify-patches / verify patches/CHECKSUMS.sha256 (push) Waiting to run
Voice Benchmark Smoke / voice-emotion fixture smoke (push) Waiting to run
Voice Benchmark Smoke / voiceagentbench fixture smoke (push) Waiting to run
Voice Benchmark Smoke / voicebench-quality unit smoke (push) Waiting to run
Voice Benchmark Smoke / voicebench TypeScript unit (no audio) (push) Waiting to run
Voice Benchmark Smoke / voice bench smoke summary (push) Blocked by required conditions
Windows CI / windows ([bun run --cwd packages/app-core test bun run --cwd packages/elizaos test bun run --cwd packages/cloud/shared test], app-and-cli) (push) Waiting to run
Windows CI / windows ([bun run --cwd packages/scenario-runner test bun run --cwd packages/vault test bun run --cwd packages/security test bun run --cwd plugins/plugin-coding-tools test], framework-packages) (push) Waiting to run
Windows CI / windows ([bun run --cwd plugins/plugin-elizacloud test bun run --cwd plugins/plugin-discord test bun run --cwd plugins/plugin-anthropic test bun run --cwd plugins/plugin-openai test bun run --cwd plugins/plugin-app-control test bun run --cwd plugins/pl… (push) Waiting to run
Windows CI / windows ([node packages/scripts/run-turbo.mjs run build --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/agent --concurrency=4 node packages/scripts/run-bash-linux-only.mjs scripts/verify-riscv64-buildpaths.sh node packages/scripts/run… (push) Waiting to run
Windows CI / windows ([node packages/scripts/run-turbo.mjs run typecheck --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/cloud-shared --concurrency=4 bun run --cwd packages/core test bun run --cwd packages/shared test], core-runtime, 75) (push) Waiting to run
Test Packaging / Build & Test PyPI Package (push) Waiting to run
Voice Workbench / headless workbench (mocked backends) (push) Has been cancelled
Voice Workbench / real acoustic lane (nightly, provisioned only) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:43:05 +08:00

344 lines
15 KiB
Makefile

# elizaOS Live — Justfile recipes
#
# The ISO build is containerized: any host with Docker (Linux / macOS /
# Windows WSL2 / CI) builds an identical ISO with no VM, no Vagrant, no
# host-specific setup. See build.sh / Dockerfile / build-iso.sh.
#
# The dev loop has three speeds — pick the slowest one your change needs:
#
# 1. App work (the elizaOS desktop) → develop the app on your host,
# normal hot-reload. Never touches the ISO. ~90% of dev time.
# 2. OS-level config (branding, → `just nspawn` — boots the built
# systemd units, hooks, files) chroot/ in seconds for non-GUI
# sanity checks. No ISO build.
# 3. Full integration test → `just binary` — incremental
# ISO rebuild (~10 min), or
# `just build` for a clean one.
#
# A cold `just build` is a once-in-a-while thing, not the dev loop.
default:
@just --list
# --- Preflight --------------------------------------------------------------
# The only host requirement is Docker — the container is the build env.
setup:
@command -v docker >/dev/null 2>&1 || { echo "Install Docker first — it is the only host requirement."; exit 1; }
@docker info >/dev/null 2>&1 || { echo "Docker is installed but not running / not accessible to this user."; exit 1; }
@echo "Docker OK — run 'just config' for a go/no-go, or 'just build' for a full ISO."
# --- Build ------------------------------------------------------------------
# Build or stage the elizaOS Electrobun app artifact for the ISO. If the
# existing app build is present, this only rsyncs it into live-build's
# chroot_local-includes overlay. Set ELIZAOS_BUILD_APP=1 to allow
# this recipe to run the heavier app build when the artifact is missing.
elizaos-app:
#!/usr/bin/env bash
set -euo pipefail
eliza_root="$(git rev-parse --show-toplevel)"
outer_root="$(cd "${eliza_root}/.." && pwd)"
app_out="${ELIZAOS_APP_ARTIFACT:-${eliza_root}/packages/app-core/platforms/electrobun/build/dev-linux-x64/elizaOS-dev}"
stage="tails/config/chroot_local-includes/usr/share/elizaos/elizaos-app"
ensure_plugin_runtime_dist() {
local package_rel="$1"
local mode="$2"
local package_dir="${eliza_root}/${package_rel}"
local dist_index="${package_dir}/dist/index.js"
if [ -s "${dist_index}" ]; then
return 0
fi
echo "Building ${package_rel} runtime dist for elizaOS Live"
case "${mode}" in
package-build)
if [ ! -x "${eliza_root}/node_modules/.bin/tsup" ] || [ ! -x "${eliza_root}/node_modules/.bin/tsc" ]; then
echo "Installing workspace build dependencies for ${package_rel}"
( cd "${eliza_root}" && bun install --no-frozen-lockfile --ignore-scripts )
fi
( cd "${package_dir}" && bun run build )
;;
package-js)
if [ ! -x "${eliza_root}/node_modules/.bin/tsup" ]; then
echo "Installing workspace build dependencies for ${package_rel}"
( cd "${eliza_root}" && bun install --no-frozen-lockfile --ignore-scripts )
fi
( cd "${package_dir}" && bun run build:js )
;;
tsup-index)
if [ ! -x "${eliza_root}/node_modules/.bin/tsup" ]; then
echo "Installing workspace build dependencies for ${package_rel}"
( cd "${eliza_root}" && bun install --no-frozen-lockfile --ignore-scripts )
fi
( cd "${package_dir}" && bunx tsup src/index.ts --format esm --clean )
;;
bun-runtime-index)
( cd "${package_dir}" && \
rm -rf dist && \
bun build src/index.ts \
--outdir dist \
--target=node \
--format=esm \
--sourcemap=external \
--external '@elizaos/agent' \
--external '@elizaos/app-core' \
--external '@elizaos/app-core/*' \
--external '@elizaos/core' \
--external '@elizaos/plugin-registry' \
--external '@elizaos/shared' \
--external '@elizaos/vault' \
--external dotenv \
--external 'node:*' \
--external 'bun:*' )
;;
*)
echo "Unknown runtime package build mode: ${mode}" >&2
exit 1
;;
esac
test -s "${dist_index}" || {
echo "missing ${dist_index} after runtime package build" >&2
exit 1
}
}
if [ ! -x "${app_out}/bin/launcher" ]; then
if [ "${ELIZAOS_BUILD_APP:-0}" != "1" ]; then
echo "elizaOS app build not found at ${app_out}/bin/launcher"
echo "Build it separately, set ELIZAOS_APP_ARTIFACT, or rerun with ELIZAOS_BUILD_APP=1 to permit this recipe to build it."
exit 1
fi
echo "elizaOS app build not found; ELIZAOS_BUILD_APP=1 so building it now"
( cd "${eliza_root}" && bun install --no-frozen-lockfile --ignore-scripts )
if [ -f "${outer_root}/package.json" ] && [ -d "${outer_root}/eliza" ]; then
( cd "${outer_root}" && bun install --no-frozen-lockfile --ignore-scripts )
( cd "${outer_root}" && bun install --cwd eliza --no-frozen-lockfile --ignore-scripts )
( cd "${outer_root}" && ELIZAOS_ELIZA_SOURCE=local node scripts/setup-upstreams.mjs )
if [ -d "${outer_root}/eliza/packages/electrobun-carrots" ]; then
( cd "${outer_root}/eliza/packages/electrobun-carrots" && bun run build )
fi
( cd "${outer_root}" && ELIZAOS_ELIZA_SOURCE=local bun run build:desktop )
else
( cd "${eliza_root}" && ELIZAOS_ELIZA_SOURCE=local node packages/app-core/scripts/setup-upstreams.mjs )
if [ -d "${eliza_root}/packages/electrobun-carrots" ]; then
( cd "${eliza_root}/packages/electrobun-carrots" && bun run build )
fi
( cd "${eliza_root}" && \
ELIZA_APP_NAME=elizaOS \
ELIZA_APP_ID=org.elizaos.app \
ELIZA_URL_SCHEME=elizaos \
ELIZA_NAMESPACE=elizaos \
bun run --cwd packages/app-core/platforms/electrobun build )
fi
fi
test -x "${app_out}/bin/launcher" || { echo "missing ${app_out}/bin/launcher"; exit 1; }
ensure_plugin_runtime_dist "plugins/plugin-health" package-js
ensure_plugin_runtime_dist "plugins/plugin-calendly" tsup-index
ensure_plugin_runtime_dist "plugins/plugin-registry" package-js
ensure_plugin_runtime_dist "plugins/plugin-app-manager" bun-runtime-index
if [ -e "${stage}" ] && ! rm -rf "${stage}"; then
sudo -n rm -rf "${stage}"
fi
mkdir -p "${stage}"
rsync -a --delete "${app_out}/" "${stage}/"
node scripts/prepare-elizaos-app-overlay.mjs "${stage}"
echo "staged elizaOS app at ${stage}"
# Full clean ISO build → out/. ~1.5h cold, much faster once the
# apt-cacher-ng volume is warm. This is the release-quality build.
build: elizaos-app
./build.sh build
# Like 'build' but with low-compression squashfs — faster mksquashfs,
# larger ISO. For dev iteration when you just need a bootable image.
build-fast: elizaos-app
MT_FAST=1 ./build.sh build
# Low-CPU full build for hot laptops / parallel dev work. Override the
# cap with ELIZAOS_BUILD_CPUS=3 just build-cool. This defaults to
# demo-friendly docs behavior; set ELIZAOS_SKIP_WEBSITE=0 to rebuild docs.
build-cool: elizaos-app
ELIZAOS_SKIP_WEBSITE="${ELIZAOS_SKIP_WEBSITE:-1}" scripts/run-cool-build.sh build
# Fastest full demo build: keep the Tails OS build, low-compression ISO,
# and CPU cap, but skip rebuilding the bundled offline website/docs.
# Use release `just build` when the local Tails documentation must be exact.
build-demo: elizaos-app
ELIZAOS_SKIP_WEBSITE=1 scripts/run-cool-build.sh build
# Go/no-go: run only `lb config` in the container. Fast (~1 min) sanity
# check that the Tails config tree still processes cleanly.
config:
./build.sh config
# Incremental rebuild: reuse the chroot/ from the last full build and
# re-run only the squashfs + ISO assembly (~10 min). Use after editing
# overlay files. Run a full `just build` first to create the chroot/.
sync-chroot:
scripts/sync-runtime-to-chroot.sh
binary: elizaos-app sync-chroot
./build.sh binary
# Low-CPU incremental rebuild. Still requires an existing chroot/ from a
# previous full build.
binary-cool: elizaos-app sync-chroot
scripts/run-cool-build.sh binary
# --- Test -------------------------------------------------------------------
# Run CPU-light static checks only. No Docker, no QEMU, no ISO build.
static-smoke:
scripts/static-smoke.sh
# Start the staged bundled runtime and prove the local API endpoints needed by
# the desktop onboarding shell return successfully. No Docker, no QEMU.
runtime-smoke:
scripts/runtime-api-smoke.sh
# Boot the built chroot/ in systemd-nspawn — seconds, no QEMU. For
# non-GUI sanity (do my systemd units parse? did my file land where I
# expect? does a service start?). --volatile=overlay keeps the chroot
# read-only; all writes go to a discarded tmpfs. NOT for GUI testing —
# use `just boot` for that.
nspawn:
@test -d tails/chroot || { echo "no tails/chroot/ — run 'just build' first"; exit 1; }
sudo systemd-nspawn --boot --directory=tails/chroot \
--volatile=overlay --machine=elizaos-live-dev
# Boot the latest built ISO in QEMU. Tails stopped making the ISO
# isohybrid, so the ISO must be presented as a CD-ROM. Needs KVM.
boot:
scripts/boot-qemu.sh
# Write the latest built USB image to a removable USB device with guard rails.
usb-write device:
scripts/usb-write.sh "{{device}}"
# Write a specific ISO/USB image to a removable USB device with guard rails.
# ISO input is rejected by default unless a neighboring .img exists or
# ELIZAOS_CREATE_USB_IMAGE_FROM_ISO=1 is set.
usb-write-iso device iso:
scripts/usb-write.sh "{{device}}" "{{iso}}"
# CPU-light validation for the active elizaOS Live distro.
lint:
./scripts/static-smoke.sh
test:
./scripts/static-smoke.sh
# --- CI aliases -------------------------------------------------------------
#
# The release pipeline (.github/workflows/build-linux-iso.yml) calls a fixed
# set of `iso-*` targets so a single contract spans every architecture. These are
# thin wrappers around the recipes above. If a step has no underlying
# implementation in this distro it prints a clear "skipping" message and
# exits 0 — the workflow gates the corresponding step explicitly so we never
# silently pretend a missing step ran.
# Stage build inputs (elizaOS app rsync into chroot_local-includes).
iso-stage: elizaos-app
@echo "iso-stage: staged elizaOS app into chroot_local-includes overlay"
# Pre-cache the bundled LLM model. The elizaOS distro currently downloads the
# model from the chroot during live-build, so this compatibility target keeps
# the workflow uniform while doing no separate cache work.
iso-cache-model:
@echo "iso-cache-model: skipping — elizaos resolves the model inside live-build's chroot; no separate cache step"
# Pre-cache the eliza CLI binary. Same story — fetched inside live-build.
iso-cache-cli:
@echo "iso-cache-cli: skipping — elizaos resolves the eliza CLI inside live-build's chroot; no separate cache step"
# Alias for `config` (live-build go/no-go).
iso-config: config
# Alias for `static-smoke` (pre-build sanity check).
iso-check: static-smoke
# Alias for the full ISO build.
iso-build: build
# --- Clean ------------------------------------------------------------------
# Remove build artifacts (out/ + the chroot/binary/cache trees inside
# tails/). These are root-owned (built in-container as root), so this
# needs sudo. The apt-cacher-ng volume is left alone — see cache-clean.
clean:
sudo rm -rf out tails/chroot tails/binary tails/cache tails/.build \
tails/tmp tails/chroot.files tails/*.buildlog tails/*.iso tails/*.img
@echo "Build artifacts cleared. The apt-cacher-ng cache volume is kept (run 'just cache-clean' to drop it)."
# Drop the persistent apt-cacher-ng package cache. Next build re-downloads
# everything from the network — only do this to reclaim disk or force a
# fully cold rebuild.
cache-clean:
docker volume rm elizaos-acng elizaos-acng 2>/dev/null || true
@echo "apt-cacher-ng cache volume removed."
# Fast per-arch smoke. First validates the per-arch bootloader package
# case in a tiny Docker build, then runs the real build.sh config path so
# ELIZAOS_ARCH plumbing reaches live-build's architecture/kernel settings.
# Use this when iterating on the multi-arch parameterization in
# Dockerfile / build.sh — catches "Unable to locate package grub-pc-bin"
# on arm64 / riscv64 in minutes instead of waiting hours for a real ISO
# build to fail at the same step.
#
# just smoke-arch # default amd64, no emulation, ~2 min
# just smoke-arch arm64 # qemu-aarch64 emulation, ~3 min
# just smoke-arch riscv64 # qemu-riscv64 emulation, ~5 min
#
# arm64 + riscv64 require qemu-user-static + binfmt_misc registered:
# docker run --rm --privileged tonistiigi/binfmt --install all
#
# Update the inline Dockerfile here whenever the real Dockerfile's
# per-arch package case changes.
smoke-arch arch="amd64":
#!/usr/bin/env bash
set -euo pipefail
case "{{arch}}" in
amd64|arm64|riscv64) ;;
*) echo "ERROR: arch must be amd64, arm64, or riscv64 (got {{arch}})" >&2; exit 1 ;;
esac
tmp=$(mktemp -d)
trap 'rm -rf "$tmp"' EXIT
cat > "$tmp/Dockerfile" <<'EOF'
FROM debian:trixie
ENV DEBIAN_FRONTEND=noninteractive
ARG TARGETARCH=amd64
RUN apt-get update && apt-get install -y --no-install-recommends \
grub2-common debootstrap rsync xorriso ca-certificates \
&& rm -rf /var/lib/apt/lists/*
RUN apt-get update && case "${TARGETARCH}" in \
amd64) apt-get install -y --no-install-recommends \
isolinux syslinux syslinux-common \
grub-pc-bin grub-efi-amd64-bin ;; \
arm64) apt-get install -y --no-install-recommends \
grub-efi-arm64-bin ;; \
riscv64) apt-get install -y --no-install-recommends \
grub-efi-riscv64-bin ;; \
esac \
&& rm -rf /var/lib/apt/lists/*
RUN echo "=== installed bootloader for TARGETARCH=${TARGETARCH} ===" \
&& dpkg-query -W -f '${Package}\n' \
isolinux syslinux syslinux-common grub-pc-bin grub-efi-amd64-bin \
grub-efi-arm64-bin grub-efi-riscv64-bin 2>/dev/null | sort
EOF
echo "=== smoke build {{arch}} (per-arch package set only, not the full ISO build) ==="
docker build \
--platform "linux/{{arch}}" \
--build-arg "TARGETARCH={{arch}}" \
-t "elizaos-smoke-{{arch}}" \
"$tmp"
echo
echo "=== config smoke {{arch}} (real build.sh/live-build path) ==="
ELIZAOS_ARCH="{{arch}}" ./build.sh config
echo
echo "✅ smoke passed for {{arch}}. To run the full ISO build:"
echo " ELIZAOS_ARCH={{arch}} just build"