Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
80cea4f
docs(helm): document supported values and add usage examples (#280)
chihkang May 6, 2026
7084636
feat: echo STT transcripts to thread before agent reply (#571)
dogzzdogzz May 6, 2026
442f480
feat(discord): support role mention as trigger (allowed_role_ids) (#759)
chaodu-agent May 6, 2026
271bbb1
release: v0.8.3-beta.4 (#763)
openab-app[bot] May 6, 2026
0ec5b8f
docs: add ECS Fargate Spot reference architecture (#765)
chaodu-agent May 7, 2026
00da8e4
feat(gateway): feishu thread participation tracking (involved mode) (…
wangyuyan-agent May 7, 2026
205aa8f
fix(acp): clean up pending + cancel agent on abandoned prompts (#760)
brettchien May 7, 2026
abff22e
docs(adr): fix compliance rule precision in turn-boundary-batching (#…
masami-agent May 7, 2026
d728ef2
[codex] Pass Discord video attachments to agents (#772)
clsung May 8, 2026
83ffebd
feat(gateway): feishu multibot-mentions mode (#746)
wangyuyan-agent May 8, 2026
7bf7f63
docs: add steering design guide for AI agent hot/cold memory (#774)
chaodu-agent May 8, 2026
c06e0e6
feat: agent-controlled reply-to via [[reply_to:message_id]] directive…
chaodu-agent May 9, 2026
59c5e3b
release: v0.8.3-beta.5 (#778)
openab-app[bot] May 9, 2026
80d0dbb
fix: lenient output directive parser for inline content (#780)
chaodu-agent May 9, 2026
d6f9c34
release: v0.8.3-beta.6 (#781)
openab-app[bot] May 9, 2026
ac5fa57
fix(docker): pre-create agent hidden directories with correct ownersh…
pro5251 May 10, 2026
e74b171
fix(cron): translate POSIX day-of-week to match documented semantics …
charlie0228 May 10, 2026
cc9495e
feat: add receiver_id to SenderContext schema (#787)
chaodu-agent May 11, 2026
984b829
release: v0.8.3-beta.7 (#788)
openab-app[bot] May 11, 2026
2f20fdb
feat(discord): add /remind slash command (#797)
chaodu-agent May 11, 2026
1a77a5c
release: v0.8.3-beta.8 (#798)
openab-app[bot] May 11, 2026
8d312a3
docs(copilot): document setting auto as default model via settings.js…
chaodu-agent May 11, 2026
8416166
feat(gateway): support [[reply_to]] directive for gateway platforms (…
wangyuyan-agent May 12, 2026
1a5a998
feat(gateway): add WeCom (企业微信) channel adapter (#769)
canyugs May 12, 2026
e3f6b54
feat(gateway): feishu voice message STT via gateway audio attachment …
wangyuyan-agent May 12, 2026
cc5fe22
feat(discord): add thread export command (#794)
clsung May 13, 2026
db90591
docs(cronjob): add version annotation to breaking change note (#809)
CHC-Agent May 13, 2026
104bf7b
release: v0.8.3-beta.9 (#812)
openab-app[bot] May 13, 2026
bb5b328
fix(ci): add gateway/Cargo.lock to CI path triggers (#813)
chaodu-agent May 13, 2026
d06bf26
fix(slack): accept raw bot IDs in trustedBotIds (#814)
chaodu-agent May 14, 2026
1f8864c
fix(slack): match both bare and labelled mention forms in mentions_bo…
howie May 14, 2026
0079352
feat(gateway): Google Chat attachment support (image / file / audio +…
canyugs May 15, 2026
5f9489d
fix(discord): Register slash commands globally only (#804)
jacklau1993 May 15, 2026
645b56b
feat: add Hermes Agent as agent provider (#824)
chaodu-agent May 16, 2026
60b56fb
release: v0.8.3-beta.10 (#825)
openab-app[bot] May 16, 2026
dfd9960
docs(hermes): add detailed xAI OAuth guide for ECS + file ownership f…
chaodu-agent May 16, 2026
925b484
feat: add Grok Build CLI as supported agent (#831)
canyugs May 17, 2026
1da46e8
release: v0.8.3-beta.11 (#833)
openab-app[bot] May 17, 2026
c1592ec
docs: add message_processing_mode, max_buffered_messages, max_batch_t…
chaodu-agent May 17, 2026
914ca43
docs: add CI Visibility for Discord Teams refarch (#838)
chaodu-agent May 17, 2026
ffcc8e8
docs: update CI observability refarch with final implementation (#839)
chaodu-agent May 18, 2026
26b10e0
feat: add xai-proxy — OAuth PKCE sidecar for xAI SuperGrok (#841)
chaodu-agent May 18, 2026
1597129
docs: add reference architecture for Telegram via Cloudflare Tunnel (…
chaodu-agent May 18, 2026
07e17ee
docs: refarch single-pod architecture (#848)
chaodu-agent May 18, 2026
6afe59a
docs(adr): ECS Control Plane — CRD+Operator pattern (#850)
chaodu-agent May 19, 2026
4968732
feat(operator): oabctl Phase 1 — apply, get, delete (#851)
chaodu-agent May 19, 2026
8f70959
docs(operator): add README and sample manifest (#852)
chaodu-agent May 19, 2026
8cf6ac8
fix: raise bot turn tracker hard cap to 1000 (#855)
rockexe0000 May 19, 2026
abef26d
feat(gateway): media proxy colocate mode — filesystem store replaces …
chaodu-agent May 19, 2026
9f9b033
chore: rename build.yml to build-operator.yml for clarity (#861)
chaodu-agent May 19, 2026
0fd8926
release: gateway-v0.5.0 (#860)
openab-app[bot] May 19, 2026
ed5122c
release: v0.8.3-beta.12 (#862)
openab-app[bot] May 19, 2026
88b4b60
ci: scope each job to its own paths with dorny/paths-filter (#867)
chaodu-agent May 20, 2026
6ec51b3
ci: add macOS native build on operator/* branch push (#868)
chaodu-agent May 20, 2026
804c7ef
fix: use standard runner labels for macOS build (#869)
chaodu-agent May 20, 2026
ef28a57
fix: publish gateway image with v-prefixed tag (#876)
chaodu-agent May 20, 2026
0287ff8
feat: add :stable and :beta floating image tags (#878)
chaodu-agent May 20, 2026
2bde340
release: gateway-v0.5.1 (#877)
openab-app[bot] May 20, 2026
dcec956
release: v0.8.3-beta.13 (#880)
openab-app[bot] May 20, 2026
a2870aa
release: v0.8.3 (#881)
openab-app[bot] May 20, 2026
4944acb
feat: add openab-telegram chart (#873)
chaodu-agent May 21, 2026
ef9adee
fix(openab-telegram): default allowAllUsers to false (#882)
chaodu-agent May 21, 2026
28c212e
chore: bump all coding CLI versions to latest (#888)
chaodu-agent May 21, 2026
192f32f
fix: capture ACP agent stderr and extract error.data from JSON-RPC er…
chaodu-agent May 21, 2026
459d9f5
chore: remove pending-screening workflow (#890)
chaodu-agent May 21, 2026
31ec34b
chore: ignore .claude/ and .claude.local.md (#837)
howie May 21, 2026
f60b7f4
docs(config): fix claude examples to use claude-agent-acp (#892)
chaodu-agent May 21, 2026
38e3744
fix(media): validate Content-Type and magic bytes before sending to m…
howie May 21, 2026
63dd3b8
fix: bump codex-acp 0.10.0 → 0.14.0 (#889)
chaodu-agent May 21, 2026
d81442d
feat(cron): goal-driven auto-disable usercron jobs (implements #816) …
chaodu-agent May 21, 2026
db76abb
release: v0.8.4-beta.1 (#893)
openab-app[bot] May 21, 2026
b3bcefb
docs(opencode): add xAI Grok auth example with device-code flow (#894)
chaodu-agent May 22, 2026
1f16400
feat: add agy-acp adapter for Google Antigravity CLI (#896)
chaodu-agent May 22, 2026
37f4632
release: v0.8.4-beta.2 (#897)
openab-app[bot] May 22, 2026
0ac3132
docs: add Antigravity CLI to README agent list (#898)
chaodu-agent May 22, 2026
d2aa9d3
ci: add Dockerfile.antigravity to build and smoke test matrices (#902)
chaodu-agent May 22, 2026
109c2d9
feat(openab): add existingSecret support for Slack agent credentials …
antigenius0910 May 22, 2026
97f429b
fix(agy-acp): use --conversation ID + delta extraction for multi-turn…
chaodu-agent May 22, 2026
b89fd40
release: v0.8.4-beta.3 (#907)
openab-app[bot] May 22, 2026
a8186c8
feat: pivot xai-proxy → openab-auth-proxy (generic OAuth sidecar) (#891)
chaodu-agent May 23, 2026
65c8a7a
feat: add openab-feishu chart (#883)
wangyuyan-agent May 23, 2026
b29c765
docs: add PR lifecycle flow to CONTRIBUTING.md (#912)
chaodu-agent May 23, 2026
ac01c29
fix: align workflows to PR lifecycle spec (#915)
chaodu-agent May 23, 2026
5d2980e
feat(chart): add serviceAccountName support at per-agent and global l…
antigenius0910 May 23, 2026
090ffe1
feat(chart): add imagePullSecrets support at per-agent and global lev…
antigenius0910 May 23, 2026
ea94efd
fix(discord): dedup WarnAndStop warning across multiple bot processes…
feiyun968-agent May 23, 2026
2d95233
docs(codex): troubleshoot bubblewrap unavailable in sandboxed runtime…
chaodu-agent May 24, 2026
15dc2cc
fix(gateway/googlechat): handle HTTP endpoint URL events + correct JW…
sebastian-hsu May 24, 2026
7ac97d9
feat(pi): support Pi coding agent via Dockerfile.pi (#920)
chaodu-agent May 26, 2026
b57d8cb
release: v0.8.4-beta.4 (#921)
openab-app[bot] May 26, 2026
6b880e7
fix(pi): bump pi-coding-agent to 0.75.5 (#923)
chaodu-agent May 26, 2026
627808b
ci: replace dorny/paths-filter with native git diff (#926)
chaodu-agent May 26, 2026
6610efd
feat: openab-agent — native Rust coding agent with subscription auth …
chaodu-agent May 26, 2026
b7cd85f
release: v0.8.4-beta.5 (#929)
openab-app[bot] May 26, 2026
7dfefb2
ci: add Dockerfile.native to build matrix (#930)
chaodu-agent May 26, 2026
4818364
fix(Dockerfile.native): build openab-agent from its own crate directo…
chaodu-agent May 26, 2026
5e451fb
ci: add native to merge-manifests matrix (#932)
chaodu-agent May 26, 2026
41a065c
docs(adr): openab-agent — native Rust coding agent (#922)
chaodu-agent May 27, 2026
4267f68
chore: sync upstream openabdev/openab v0.8.4-beta.5
claude May 27, 2026
7ff7547
fix(gateway): suppress dead_code warnings in media.rs to pass CI clippy
claude May 27, 2026
ccadffe
chore: update gateway/Cargo.lock after media.rs dependency changes
claude May 27, 2026
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
1 change: 1 addition & 0 deletions .github/workflows/build-gateway.yml
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ jobs:
cd /tmp/digests
docker buildx imagetools create \
-t ${{ env.IMAGE_NAME }}:${{ steps.tag.outputs.version }} \
-t ${{ env.IMAGE_NAME }}:v${{ steps.tag.outputs.version }} \
-t ${{ env.IMAGE_NAME }}:latest \
$(printf '${{ env.IMAGE_NAME }}@sha256:%s ' *)

Expand Down
36 changes: 36 additions & 0 deletions .github/workflows/build-operator-branch.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
name: Build Operator (Branch)

on:
push:
branches:
- "operator/**"
workflow_dispatch:

jobs:
build-macos:
runs-on: [self-hosted, macOS, ARM64]
permissions:
contents: read
steps:
- uses: actions/checkout@v6

- name: Install Rust
run: |
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"

- name: Build (aarch64-apple-darwin)
run: cargo build --release

- name: Package
run: |
mkdir -p dist
cp target/release/openab dist/
cd dist && tar czf ../openab-macos-arm64.tar.gz *

- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: openab-macos-arm64
path: openab-macos-arm64.tar.gz
retention-days: 7
285 changes: 285 additions & 0 deletions .github/workflows/build-operator.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,285 @@
name: Build Operator

on:
push:
tags:
- "v*"
workflow_dispatch:
inputs:
tag:
description: 'Version tag (e.g. v0.7.0-beta.1 or v0.7.0)'
required: true
type: string
default: 'v'
dry_run:
description: 'Dry run (build only, no push)'
required: false
type: boolean
default: false

env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}

jobs:
resolve-tag:
runs-on: ubuntu-latest
outputs:
tag: ${{ steps.resolve.outputs.tag }}
chart_version: ${{ steps.resolve.outputs.chart_version }}
is_prerelease: ${{ steps.resolve.outputs.is_prerelease }}
steps:
- name: Resolve and validate tag
id: resolve
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
TAG="${{ inputs.tag }}"
else
TAG="${GITHUB_REF_NAME}"
fi

# Validate tag format
if [[ ! "$TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+ ]]; then
echo "::error::Invalid tag format '${TAG}'. Expected v{major}.{minor}.{patch}[-prerelease]"
exit 1
fi

CHART_VERSION="${TAG#v}"

# Pre-release if version contains '-' (e.g. 0.7.0-beta.1)
if [[ "$CHART_VERSION" == *-* ]]; then
IS_PRERELEASE="true"
else
IS_PRERELEASE="false"
fi

echo "tag=${TAG}" >> "$GITHUB_OUTPUT"
echo "chart_version=${CHART_VERSION}" >> "$GITHUB_OUTPUT"
echo "is_prerelease=${IS_PRERELEASE}" >> "$GITHUB_OUTPUT"

# ── Pre-release path: full build ──────────────────────────────

build-image:
needs: resolve-tag
if: ${{ needs.resolve-tag.outputs.is_prerelease == 'true' }}
strategy:
matrix:
variant:
- { suffix: "", dockerfile: "Dockerfile", artifact: "default" }
- { suffix: "-codex", dockerfile: "Dockerfile.codex", artifact: "codex" }
- { suffix: "-claude", dockerfile: "Dockerfile.claude", artifact: "claude" }
- { suffix: "-gemini", dockerfile: "Dockerfile.gemini", artifact: "gemini" }
- { suffix: "-copilot", dockerfile: "Dockerfile.copilot", artifact: "copilot" }
- { suffix: "-opencode", dockerfile: "Dockerfile.opencode", artifact: "opencode" }
- { suffix: "-cursor", dockerfile: "Dockerfile.cursor", artifact: "cursor" }
- { suffix: "-hermes", dockerfile: "Dockerfile.hermes", artifact: "hermes" }
- { suffix: "-grok", dockerfile: "Dockerfile.grok", artifact: "grok" }
- { suffix: "-antigravity", dockerfile: "Dockerfile.antigravity", artifact: "antigravity" }
- { suffix: "-pi", dockerfile: "Dockerfile.pi", artifact: "pi" }
- { suffix: "-native", dockerfile: "Dockerfile.native", artifact: "native" }
platform:
- { os: linux/amd64, runner: ubuntu-latest }
- { os: linux/arm64, runner: ubuntu-24.04-arm }
runs-on: ${{ matrix.platform.runner }}
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v6

- uses: docker/setup-buildx-action@v3

- uses: docker/login-action@v4
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Docker metadata
id: meta
uses: docker/metadata-action@v6
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}${{ matrix.variant.suffix }}

- name: Build and push by digest
id: build
uses: docker/build-push-action@v6
with:
context: .
file: ${{ matrix.variant.dockerfile }}
platforms: ${{ matrix.platform.os }}
outputs: type=image,name=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}${{ matrix.variant.suffix }},push-by-digest=true,name-canonical=true,push=${{ inputs.dry_run != true }}
cache-from: type=gha,scope=${{ matrix.variant.suffix }}-${{ matrix.platform.os }}
cache-to: type=gha,scope=${{ matrix.variant.suffix }}-${{ matrix.platform.os }},mode=max

- name: Export digest
if: inputs.dry_run != true
run: |
mkdir -p /tmp/digests
digest="${{ steps.build.outputs.digest }}"
touch "/tmp/digests/${digest#sha256:}"

- name: Upload digest
if: inputs.dry_run != true
uses: actions/upload-artifact@v4
with:
name: digests-${{ matrix.variant.artifact }}-${{ matrix.platform.runner }}
path: /tmp/digests/*
retention-days: 1

merge-manifests:
needs: [resolve-tag, build-image]
if: ${{ inputs.dry_run != true && needs.resolve-tag.outputs.is_prerelease == 'true' }}
strategy:
matrix:
variant:
- { suffix: "", artifact: "default" }
- { suffix: "-codex", artifact: "codex" }
- { suffix: "-claude", artifact: "claude" }
- { suffix: "-gemini", artifact: "gemini" }
- { suffix: "-copilot", artifact: "copilot" }
- { suffix: "-opencode", artifact: "opencode" }
- { suffix: "-cursor", artifact: "cursor" }
- { suffix: "-hermes", artifact: "hermes" }
- { suffix: "-grok", artifact: "grok" }
- { suffix: "-antigravity", artifact: "antigravity" }
- { suffix: "-pi", artifact: "pi" }
- { suffix: "-native", artifact: "native" }
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Download digests
uses: actions/download-artifact@v4
with:
path: /tmp/digests
pattern: digests-${{ matrix.variant.artifact }}-*
merge-multiple: true

- uses: docker/setup-buildx-action@v3

- uses: docker/login-action@v4
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Docker metadata
id: meta
uses: docker/metadata-action@v6
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}${{ matrix.variant.suffix }}
tags: |
type=sha,prefix=
type=semver,pattern={{version}},value=${{ needs.resolve-tag.outputs.tag }}
type=raw,value=beta

- name: Create manifest list
working-directory: /tmp/digests
run: |
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
$(printf '${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}${{ matrix.variant.suffix }}@sha256:%s ' *)

# ── Stable path: promote pre-release image (no rebuild) ──────

promote-stable:
needs: resolve-tag
if: ${{ inputs.dry_run != true && needs.resolve-tag.outputs.is_prerelease == 'false' }}
strategy:
matrix:
variant:
- { suffix: "" }
- { suffix: "-codex" }
- { suffix: "-claude" }
- { suffix: "-gemini" }
- { suffix: "-copilot" }
- { suffix: "-opencode" }
- { suffix: "-cursor" }
- { suffix: "-hermes" }
- { suffix: "-grok" }
- { suffix: "-antigravity" }
- { suffix: "-pi" }
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0

- uses: docker/setup-buildx-action@v3

- uses: docker/login-action@v4
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Find pre-release image
id: find-prerelease
run: |
CHART_VERSION="${{ needs.resolve-tag.outputs.chart_version }}"
# Find latest pre-release tag matching this version (e.g. v0.7.0-beta.1)
PRERELEASE_TAG=$(git tag -l "v${CHART_VERSION}-*" --sort=-v:refname | head -1)
if [ -z "$PRERELEASE_TAG" ]; then
echo "::error::No pre-release tag found for v${CHART_VERSION}-*. Run a pre-release build first."
exit 1
fi
PRERELEASE_VERSION="${PRERELEASE_TAG#v}"
echo "Found pre-release: ${PRERELEASE_TAG} (${PRERELEASE_VERSION})"
echo "prerelease_version=${PRERELEASE_VERSION}" >> "$GITHUB_OUTPUT"

- name: Verify pre-release image exists
run: |
IMAGE="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}${{ matrix.variant.suffix }}"
PRERELEASE_VERSION="${{ steps.find-prerelease.outputs.prerelease_version }}"
echo "Checking ${IMAGE}:${PRERELEASE_VERSION} ..."
docker buildx imagetools inspect "${IMAGE}:${PRERELEASE_VERSION}" || \
{ echo "::error::Image ${IMAGE}:${PRERELEASE_VERSION} not found — build the pre-release first"; exit 1; }

- name: Promote to stable tags
run: |
IMAGE="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}${{ matrix.variant.suffix }}"
PRERELEASE_VERSION="${{ steps.find-prerelease.outputs.prerelease_version }}"
CHART_VERSION="${{ needs.resolve-tag.outputs.chart_version }}"
MAJOR_MINOR="${CHART_VERSION%.*}"

echo "Promoting ${IMAGE}:${PRERELEASE_VERSION} → ${CHART_VERSION}, ${MAJOR_MINOR}, latest, stable"
docker buildx imagetools create \
-t "${IMAGE}:${CHART_VERSION}" \
-t "${IMAGE}:${MAJOR_MINOR}" \
-t "${IMAGE}:latest" \
-t "${IMAGE}:stable" \
"${IMAGE}:${PRERELEASE_VERSION}"

# ── Chart release (runs after either path) ───────────────────

release-chart:
needs: [resolve-tag, merge-manifests, promote-stable]
if: >-
${{ always() && inputs.dry_run != true &&
needs.resolve-tag.result == 'success' &&
(needs.merge-manifests.result == 'success' || needs.promote-stable.result == 'success') }}
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v6

- name: Install Helm
uses: azure/setup-helm@v4

- uses: docker/login-action@v4
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Build and push chart to OCI
run: |
CHART_VERSION="${{ needs.resolve-tag.outputs.chart_version }}"
helm package charts/openab
helm push openab-${CHART_VERSION}.tgz oci://ghcr.io/${{ github.repository_owner }}/charts
42 changes: 42 additions & 0 deletions .github/workflows/ci-auth-proxy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
name: CI (openab-auth-proxy)

on:
pull_request:
paths:
- "openab-auth-proxy/**"
push:
branches: [main]
paths:
- "openab-auth-proxy/**"

env:
CARGO_TERM_COLOR: always

jobs:
check:
runs-on: ubuntu-latest
defaults:
run:
working-directory: openab-auth-proxy
steps:
- uses: actions/checkout@v6

- uses: dtolnay/rust-toolchain@stable
with:
components: clippy

- uses: Swatinem/rust-cache@v2
with:
workspaces: openab-auth-proxy

- name: cargo check
run: cargo check

- name: cargo clippy
run: cargo clippy -- -D warnings

- name: cargo test
run: cargo test

- name: cargo build (release)
run: cargo build --release
Loading
Loading