diff --git a/.github/workflows/ci-fast.yml b/.github/workflows/ci-fast.yml index 12495344..14f09e60 100644 --- a/.github/workflows/ci-fast.yml +++ b/.github/workflows/ci-fast.yml @@ -13,6 +13,7 @@ permissions: jobs: fast: + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork != true runs-on: depot-ubuntu-24.04-arm-16 timeout-minutes: 120 env: @@ -20,6 +21,18 @@ jobs: CARGO_NET_GIT_FETCH_WITH_CLI: "true" steps: + - name: Validate PR title + if: github.event_name == 'pull_request' + env: + TITLE: ${{ github.event.pull_request.title }} + run: | + if ! echo "$TITLE" | grep -qE '^(feat|fix|refactor|chore|docs|test|ci|perf)(\(.+\))?!?: .+'; then + echo "::error::PR title must follow Conventional Commits: : " + echo " Valid types: feat, fix, refactor, chore, docs, test, ci, perf" + echo " Example: feat: add Azure container deployment support" + exit 1 + fi + - uses: actions/checkout@v4 - uses: dorny/paths-filter@v3 diff --git a/.github/workflows/ci-fork.yml b/.github/workflows/ci-fork.yml new file mode 100644 index 00000000..4a8b8a49 --- /dev/null +++ b/.github/workflows/ci-fork.yml @@ -0,0 +1,75 @@ +name: CI (Fork) + +on: + pull_request: + +permissions: + contents: read + +jobs: + check: + if: github.event.pull_request.head.repo.fork == true + runs-on: ubuntu-24.04-arm + timeout-minutes: 120 + env: + CARGO_INCREMENTAL: "0" + CARGO_NET_GIT_FETCH_WITH_CLI: "true" + + steps: + - name: Validate PR title + env: + TITLE: ${{ github.event.pull_request.title }} + run: | + if ! echo "$TITLE" | grep -qE '^(feat|fix|refactor|chore|docs|test|ci|perf)(\(.+\))?!?: .+'; then + echo "::error::PR title must follow Conventional Commits: : " + echo " Valid types: feat, fix, refactor, chore, docs, test, ci, perf" + echo " Example: feat: add Azure container deployment support" + exit 1 + fi + + - uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + with: + version: 10.11.0 + + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: pnpm + cache-dependency-path: pnpm-lock.yaml + + - uses: dtolnay/rust-toolchain@nightly + with: + components: rustfmt, clippy + + - uses: Swatinem/rust-cache@v2 + + - uses: taiki-e/install-action@nextest + + - name: Install protoc + run: sudo apt-get update && sudo apt-get install -y protobuf-compiler + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Lint + run: pnpm format-and-lint + + - name: TypeScript typecheck + env: + NODE_OPTIONS: "--max-old-space-size=4096" + run: pnpm test:ts + + - name: Rust tests (non-cloud) + run: | + cargo nextest run --workspace \ + --exclude alien-aws-clients \ + --exclude alien-gcp-clients \ + --exclude alien-azure-clients \ + --exclude alien-k8s-clients \ + --exclude alien-bindings \ + --exclude byocdb \ + --exclude endpoint-agent \ + --exclude alien-test-server \ + --filter-expr 'not binary_id(alien-build::build_integration_tests) and not binary_id(alien-build::rust_integration_tests) and not binary_id(alien-build::typescript_integration_tests) and not binary_id(alien-runtime::lambda) and not binary_id(alien-test::pull) and not binary_id(alien-test::push) and not binary_id(alien-manager::registry_proxy_cloud_test)' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9b045634..a6332b09 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -75,13 +75,7 @@ jobs: run: | VERSION="${{ steps.bump.outputs.version }}" for pkg in packages/core packages/sdk packages/testing client-sdks/platform/typescript client-sdks/manager/typescript; do - node -e " - const fs = require('fs'); - const p = fs.readFileSync('${pkg}/package.json', 'utf8'); - const j = JSON.parse(p); - j.version = process.env.VERSION; - fs.writeFileSync('${pkg}/package.json', JSON.stringify(j, null, 2) + '\n'); - " VERSION="$VERSION" + sed -i "s/\"version\": \"[^\"]*\"/\"version\": \"${VERSION}\"/" "${pkg}/package.json" done - name: Commit and tag diff --git a/README.md b/README.md index 31fb811c..9675053b 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # Alien -![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/alien) +[![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/alien)](https://x.com/alien) [![GitHub Release](https://img.shields.io/github/v/release/alienplatform/alien)](https://github.com/alienplatform/alien/releases) [![Discord](https://img.shields.io/discord/1490401456124199224?label=Discord&logo=discord&logoColor=white)](https://alien.dev/discord) -*"My data is sensitive. Can you deploy into my cloud?"* — Every enterprise prospect, **ever**. +*"My data is sensitive. Can you deploy into my cloud?"* — Every enterprise customer, **ever**. Alien provides infrastructure for deploying into your customers' cloud accounts and keeping it fully managed. AWS, GCP, or Azure. @@ -18,7 +18,7 @@ The usual answer is sending a Docker image or a Helm chart. But while self-hosti Alien gives you a different option. Deploy into their cloud and keep full control — push updates, collect non-sensitive logs and metrics, roll back. The customer doesn't operate anything. Their data never leaves. -## Getting started +## Quickstart The best way to get started is to follow the [Quickstart](https://alien.dev/docs/quickstart) guide. You'll build an AI worker, test it locally, and deploy it — no cloud account needed to start. @@ -28,6 +28,17 @@ cd my-worker pnpm dev ``` +## Features + +- **[TypeScript & Rust](https://alien.dev/docs/infrastructure/function/toolchains)** — First-class support for both. Python and arbitrary containers coming soon. +- **[Real-time Heartbeat](https://alien.dev/docs/how-alien-works)** — Know the instant a deployment goes down. Continuous health checks with sub-second alerting. +- **[Auto Updates](https://alien.dev/docs/releases)** — Push a release and every deployment picks it up automatically. No coordination, no manual steps. +- **[Local-first Development](https://alien.dev/docs/local-development)** — Build and test on your machine. No cloud account necessary. Local equivalents for every cloud resource. +- **[Cloud-agnostic Infrastructure](https://alien.dev/docs/infrastructure)** — Ship to AWS, GCP, and Azure customers without maintaining separate integrations. Alien maps a single API to each cloud's native services at deploy time. +- **[Remote Commands](https://alien.dev/docs/commands)** — Invoke code on remote deployments from your control plane. Zero inbound networking. Zero open ports. No VPC peering. +- **[Observability](https://alien.dev/docs/how-alien-works)** — Logs, metrics, and traces from every deployment. Full visibility without touching customer infrastructure. +- **[Least-privilege Permissions](https://alien.dev/docs/permissions)** — Alien derives the exact IAM permissions required to deploy and manage your app. Nothing more. + ## What you can build - **AI Worker** — Agent harness in your cloud, tool execution in theirs. Read files, run commands, query data — all local. ([example](examples/remote-worker-ts)) diff --git a/biome.json b/biome.json index be1c6b41..5075254b 100644 --- a/biome.json +++ b/biome.json @@ -2,6 +2,9 @@ "files": { "ignore": [ ".wrangler/*.js", + ".turbo/**", + "**/.alien/**", + "**/alien-data/**", "**/dist/**", "client-sdks/**", "**/openapi.json", diff --git a/packages/core/package.json b/packages/core/package.json index 6ff045be..978f28ae 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,5 +1,6 @@ { "name": "@alienplatform/core", + "version": "1.3.2", "type": "module", "exports": { ".": { diff --git a/packages/sdk/package.json b/packages/sdk/package.json index aeff7f80..6c601f02 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,5 +1,6 @@ { "name": "@alienplatform/sdk", + "version": "1.3.2", "type": "module", "exports": { ".": { diff --git a/packages/testing/package.json b/packages/testing/package.json index 704f7962..12be5367 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,5 +1,6 @@ { "name": "@alienplatform/testing", + "version": "1.3.2", "description": "Testing framework for Alien applications", "author": "Alien Software, Inc. ", "license": "FSL-1.1-Apache-2.0",