Skip to content

Commit fb798c3

Browse files
author
ActivLayer Community
committed
Add one-command global installer
1 parent 406d2aa commit fb798c3

8 files changed

Lines changed: 118 additions & 18 deletions

File tree

‎.github/workflows/ci.yml‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,19 @@ jobs:
3030
steps:
3131
- uses: actions/checkout@v5
3232
- run: docker build -t activlayer-community:test .
33+
34+
installer:
35+
runs-on: ubuntu-latest
36+
steps:
37+
- uses: actions/checkout@v5
38+
- uses: actions/setup-python@v6
39+
with:
40+
python-version: "3.12"
41+
- name: Install into a clean user environment
42+
run: |
43+
export HOME="$RUNNER_TEMP/activlayer-home"
44+
export ACTIVLAYER_SOURCE="$GITHUB_WORKSPACE"
45+
export PATH="$HOME/.local/bin:$PATH"
46+
sh install.sh
47+
activlayer --version
48+
activlayer agent node types

‎CHANGELOG.md‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
All notable changes to ActivLayer Community Edition are documented here.
44

5+
## 0.3.1 — 2026-10-03
6+
7+
- One-command, no-root installer for Linux and macOS
8+
- Isolated installation with a globally available `activlayer` command
9+
- Idempotent installation command that also upgrades an existing installation
10+
511
## 0.3.0 — 2026-10-03
612

713
- Explicit `worker` and `orchestrator` agent types with managed-worker allowlists

‎README.md‎

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,19 +39,32 @@ It has no required cloud account, mandatory telemetry, or proprietary service in
3939

4040
## Install
4141

42+
Linux and macOS:
43+
4244
```bash
43-
git clone https://github.com/ActivLayer/activlayer.git
44-
cd activlayer
45-
git switch community-edition
45+
curl -fsSL https://raw.githubusercontent.com/ActivLayer/activlayer/community-edition/install.sh | sh
46+
```
4647

47-
python -m venv .venv
48-
source .venv/bin/activate
49-
pip install -e ".[dev]"
48+
Then use the single `activlayer` command from any directory:
5049

50+
```bash
5151
activlayer --help
52+
activlayer init --organization "Example Organization"
5253
```
5354

54-
Python 3.11 or newer is required.
55+
The installer requires Python 3.11 or newer, creates an isolated environment under
56+
`~/.local/share/activlayer`, and exposes only `activlayer` through `~/.local/bin`. Running the same
57+
install command upgrades the existing installation. It does not require root access.
58+
59+
For contributors who want an editable source checkout:
60+
61+
```bash
62+
git clone --branch community-edition https://github.com/ActivLayer/activlayer.git
63+
cd activlayer
64+
python -m venv .venv
65+
source .venv/bin/activate
66+
python -m pip install -e ".[dev]"
67+
```
5568

5669
## Create the environment
5770

‎docs/quickstart.md‎

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,19 @@
33
## Requirements
44

55
- Python 3.11 or newer
6-
- Git
6+
- `curl` for the one-command installer
77
- An optional OpenAI-compatible model server for AI nodes
88

99
## Install
1010

1111
```bash
12-
git clone https://github.com/ActivLayer/activlayer.git
13-
cd activlayer
14-
git switch community-edition
15-
python -m venv .venv
16-
source .venv/bin/activate
17-
pip install -e ".[dev]"
12+
curl -fsSL https://raw.githubusercontent.com/ActivLayer/activlayer/community-edition/install.sh | sh
13+
activlayer --version
1814
```
1915

16+
The installer uses an isolated environment and makes `activlayer` available from any directory. If
17+
it adds `~/.local/bin` to your shell profile, open a new terminal once after installation.
18+
2019
## Initialize
2120

2221
```bash
@@ -56,4 +55,3 @@ activlayer run approve <run-id> --actor owner@example.com --reason "Checked"
5655
```
5756

5857
Continue with the [CLI guide](cli.md) and [Agent JSON reference](agent-json.md).
59-

‎install.sh‎

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#!/bin/sh
2+
3+
set -eu
4+
5+
PROJECT_URL="https://github.com/ActivLayer/activlayer"
6+
DEFAULT_SOURCE="$PROJECT_URL/archive/refs/heads/community-edition.zip"
7+
SOURCE="${ACTIVLAYER_SOURCE:-$DEFAULT_SOURCE}"
8+
INSTALL_ROOT="${ACTIVLAYER_INSTALL_ROOT:-$HOME/.local/share/activlayer}"
9+
BIN_DIR="${ACTIVLAYER_BIN_DIR:-$HOME/.local/bin}"
10+
PYTHON="${ACTIVLAYER_PYTHON:-python3}"
11+
12+
fail() {
13+
printf 'ActivLayer installation failed: %s\n' "$1" >&2
14+
exit 1
15+
}
16+
17+
command -v "$PYTHON" >/dev/null 2>&1 || fail "Python 3.11 or newer is required."
18+
19+
"$PYTHON" -c '
20+
import sys
21+
if sys.version_info < (3, 11):
22+
raise SystemExit("ActivLayer requires Python 3.11 or newer.")
23+
' || fail "Python 3.11 or newer is required."
24+
25+
case "$INSTALL_ROOT" in
26+
""|/|"$HOME") fail "Refusing unsafe installation directory: $INSTALL_ROOT" ;;
27+
esac
28+
29+
printf 'Installing ActivLayer Community Edition...\n'
30+
mkdir -p "$INSTALL_ROOT" "$BIN_DIR"
31+
32+
if [ ! -x "$INSTALL_ROOT/venv/bin/python" ]; then
33+
"$PYTHON" -m venv "$INSTALL_ROOT/venv" || fail "Could not create the isolated environment."
34+
fi
35+
36+
"$INSTALL_ROOT/venv/bin/python" -m pip install \
37+
--disable-pip-version-check \
38+
--quiet \
39+
--upgrade \
40+
"$SOURCE" || fail "Package installation failed."
41+
42+
"$INSTALL_ROOT/venv/bin/activlayer" --version >/dev/null || fail "Installed command is not healthy."
43+
ln -sf "$INSTALL_ROOT/venv/bin/activlayer" "$BIN_DIR/activlayer"
44+
45+
case ":$PATH:" in
46+
*":$BIN_DIR:"*)
47+
printf '\nActivLayer is ready. Run:\n activlayer --help\n'
48+
;;
49+
*)
50+
case "${SHELL:-}" in
51+
*/zsh) PROFILE="$HOME/.zprofile" ;;
52+
*/bash)
53+
if [ -f "$HOME/.bash_profile" ]; then
54+
PROFILE="$HOME/.bash_profile"
55+
else
56+
PROFILE="$HOME/.profile"
57+
fi
58+
;;
59+
*) PROFILE="$HOME/.profile" ;;
60+
esac
61+
PATH_LINE="export PATH=\"$BIN_DIR:\$PATH\""
62+
if [ ! -f "$PROFILE" ] || ! grep -F "$PATH_LINE" "$PROFILE" >/dev/null 2>&1; then
63+
printf '\n%s\n' "$PATH_LINE" >> "$PROFILE"
64+
fi
65+
printf '\nActivLayer is installed. Open a new terminal, then run:\n activlayer --help\n'
66+
;;
67+
esac

‎pyproject.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "activlayer"
7-
version = "0.3.0"
7+
version = "0.3.1"
88
description = "The open framework for building and operating governed AI workers."
99
readme = "README.md"
1010
requires-python = ">=3.11"

‎src/activlayer/__init__.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""ActivLayer Community Edition public SDK."""
22

3-
__version__ = "0.3.0"
3+
__version__ = "0.3.1"
44

55
from .extensions import Extension, install
66
from .graph_runtime import GraphRuntime, NodeExecutionError, UnsupportedNodeError

‎src/activlayer/api.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def create_app(workspace: Workspace | None = None) -> FastAPI:
4444
runtime = GraphRuntime(workspace)
4545
application = FastAPI(
4646
title="ActivLayer Community Edition",
47-
version="0.3.0",
47+
version="0.3.1",
4848
description="Self-hosted API for governed orchestrators and Agent Workers.",
4949
)
5050

0 commit comments

Comments
 (0)