Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
2da52cf
feat(providers): add Google Cloud Vertex AI provider (#5)
mrgoonie May 11, 2026
2c2e016
feat(skills): privacy/visibility controls for agent-owned skills (#1)
mrgoonie May 11, 2026
e589545
feat(packages): unify Packages & CLI Credentials + per-grant env over…
mrgoonie May 11, 2026
ddf8e10
feat(webhooks): HTTP webhooks to trigger agents with HMAC auth + dura…
mrgoonie May 11, 2026
4472c60
feat(workstation): Remote Workstation Runtime — SSH exec + security +…
mrgoonie May 11, 2026
6e5e51a
feat(packages): Phase 2a — pip + npm update flow (#900) (#6)
mrgoonie May 11, 2026
425cecb
feat(packages): Phase 2b — apk update flow + pkg-helper v2 protocol (…
mrgoonie May 11, 2026
c029e4f
feat(cli-credentials): support per-agent env grants
mrgoonie May 17, 2026
536ab4a
feat(permissions): add agent channel permission matrix
mrgoonie May 17, 2026
2fa715b
fix(context): share agent scoped context data
mrgoonie May 17, 2026
5a18933
fix(test): support windows test execution
mrgoonie May 17, 2026
506e96c
feat(agents): add model fallback configuration
mrgoonie May 17, 2026
9a3aad5
chore(repo): add agent instructions and ignore backups
mrgoonie May 17, 2026
f1277af
style(protocol): format method constants
mrgoonie May 17, 2026
d57d381
fix(cli-credentials): clarify agent grant env controls
mrgoonie May 17, 2026
9a6fd2d
feat(ci): automate dev beta releases
mrgoonie May 17, 2026
6a253c4
fix(test): stabilize ci unit tests
mrgoonie May 17, 2026
d931dc0
fix(ci): allow ghcr-only beta releases
mrgoonie May 17, 2026
3084896
fix(ci): publish beta release without checkout
mrgoonie May 17, 2026
0b6ecde
docs(deploy): add sanitized VPS deployment runbook
mrgoonie May 17, 2026
ba3b535
fix(agents): handle null JSON config updates (#13)
mrgoonie May 17, 2026
0d6c5bb
fix(skills): add agent manage grants
mrgoonie May 17, 2026
f09b08e
feat(gateway): add remote release upgrade trigger
mrgoonie May 17, 2026
a33de08
fix(packages): support bare-metal runtime installs
mrgoonie May 17, 2026
27cf2d2
chore: codex AGENTS.md
mrgoonie May 18, 2026
b377282
Merge branch 'dev' of github.com:digitopvn/goclaw into dev
mrgoonie May 18, 2026
1de07cf
fix(packages): support npm workspace dependency installs
mrgoonie May 18, 2026
d8fdf8f
fix(packages): install sanitized npm tarballs
mrgoonie May 18, 2026
99460a7
fix(packages): repack npm fallback without scripts
mrgoonie May 18, 2026
8f5aad5
Merge remote-tracking branch 'origin/dev' into fix/skill-grants-tenan…
mrgoonie May 18, 2026
3a62bb5
fix(skills): enforce tenant scope on agent grants
mrgoonie May 18, 2026
2686a6c
docs: add skill grants beta ship journal
mrgoonie May 18, 2026
134cc71
docs(deployment): document codex service user auth (#17)
mrgoonie May 18, 2026
52aa110
feat(providers): default ChatGPT OAuth to GPT-5.5
mrgoonie May 18, 2026
8ef8fc4
fix(skills): scope agent grant status joins
mrgoonie May 18, 2026
077e81c
Merge pull request #16 from digitopvn/fix/skill-grants-tenant-scope
mrgoonie May 18, 2026
c174279
fix(packages): use runtime dir for GitHub binaries
mrgoonie May 18, 2026
069f984
Merge pull request #19 from digitopvn/fix/github-installer-runtime-bin
mrgoonie May 18, 2026
d48ae43
feat(tools): add built-in wait tool
mrgoonie May 18, 2026
ed558e6
merge: bring dev into wait tool branch
mrgoonie May 19, 2026
703c0b2
fix(config): remove BOM from channels config
mrgoonie May 19, 2026
f55ea3d
fix(pipeline): remove BOM from deps source
mrgoonie May 19, 2026
a08c626
fix(secure-cli): resolve runtime npm binary aliases
mrgoonie May 19, 2026
951733c
Merge pull request #24 from digitopvn/codex/feat-wait-tool
mrgoonie May 19, 2026
328cbf3
Merge pull request #25 from digitopvn/codex/securecli-openrouter-alias
mrgoonie May 19, 2026
1858ceb
feat(skills): add management metadata and deeplinks
mrgoonie May 19, 2026
2a48e62
feat(skills): add bulk management actions
mrgoonie May 19, 2026
532ff91
fix(security): harden upstream critical surfaces (#32)
mrgoonie May 20, 2026
0c7add6
Merge pull request #33 from digitopvn/dev
mrgoonie May 20, 2026
392f0fd
Merge pull request #1165 from digitopvn/main
mrgoonie May 20, 2026
fe6e5ef
feat(docker): add kubectl + uvx to :full image variant
raihan0824 May 24, 2026
b6374e0
feat(secure-cli): per-chat grant scoping for credentialed CLI
raihan0824 May 24, 2026
5dd066b
feat(secure-cli): paste-file env values via __FILE_ key prefix
raihan0824 May 24, 2026
a8a2d63
feat(ui): drag-and-drop file upload for kubeconfig grants + presets
raihan0824 May 24, 2026
3ef68a0
Merge pull request #1 from raihan0824/feat/cli-grant-chat-scope-and-k…
raihan0824 May 24, 2026
4eeb984
feat(providers): add kimi_coding provider with fixed User-Agent header
raihan0824 May 25, 2026
ecb7ada
Merge pull request #2 from raihan0824/feat/provider-kimi-coding
raihan0824 May 25, 2026
a52110e
Revert "feat(providers): add kimi_coding provider with required User-…
raihan0824 May 25, 2026
543fedc
Merge pull request #3 from raihan0824/revert-2-feat/provider-kimi-coding
raihan0824 May 25, 2026
3b74c4a
feat(providers): add kimi_coding provider with fixed User-Agent + tem…
raihan0824 May 25, 2026
6d73e41
fix(providers): kimi_coding requires reasoning_content on assistant t…
raihan0824 May 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
# LLM provider API keys: configure via the web dashboard setup wizard.

# --- Gateway (required) ---
# Required for Docker/external binds. Run ./prepare-env.sh to generate.
# Local loopback-only development may opt into empty-token mode with:
# GOCLAW_ALLOW_INSECURE_NO_AUTH=1
GOCLAW_GATEWAY_TOKEN=
GOCLAW_ENCRYPTION_KEY=
POSTGRES_PASSWORD=
Expand Down
327 changes: 327 additions & 0 deletions .github/workflows/dev-beta-release.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,327 @@
name: Dev CI and Beta Release

on:
push:
branches: [dev]
workflow_dispatch:

permissions:
contents: read

concurrency:
group: dev-beta-release-${{ github.ref }}
cancel-in-progress: false

env:
GHCR_IMAGE: ghcr.io/${{ github.repository }}
DOCKERHUB_IMAGE: digitop/goclaw
INITIAL_VERSION: 3.11.3
PRERELEASE_ID: beta

jobs:
go:
runs-on: ubuntu-latest
services:
pg:
image: pgvector/pgvector:pg18
env:
POSTGRES_PASSWORD: test
POSTGRES_DB: goclaw_test
ports:
- 5432:5432
options: >-
--health-cmd "pg_isready -U postgres"
--health-interval 5s
--health-timeout 3s
--health-retries 10
env:
TEST_DATABASE_URL: postgres://postgres:test@localhost:5432/goclaw_test?sslmode=disable
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version-file: go.mod
cache-dependency-path: go.sum
- run: go build ./...
- run: go build -tags sqliteonly ./...
- run: go vet ./...
- name: Unit tests
run: go test -race -timeout=5m -coverpkg=./... -coverprofile=coverage.out ./...
- name: Invariant tests (P0)
run: go test -race -timeout=90s -tags integration ./tests/invariants/...
- name: Contract tests (P1)
run: go test -race -timeout=90s -tags integration ./tests/contracts/... || echo "::warning::Contract tests skipped (no server configured)"
continue-on-error: true
- name: Integration tests
run: go test -race -timeout=180s -tags integration ./tests/integration/
- name: Coverage summary
run: go tool cover -func=coverage.out | tail -1

web:
runs-on: ubuntu-latest
defaults:
run:
working-directory: ui/web
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
with:
version: 10
- uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
cache-dependency-path: ui/web/pnpm-lock.yaml
- run: pnpm install --frozen-lockfile
- run: pnpm lint
- run: pnpm build

beta_version:
needs: [go, web]
if: github.ref == 'refs/heads/dev'
runs-on: ubuntu-latest
permissions:
contents: write
outputs:
released: ${{ steps.version.outputs.released }}
version: ${{ steps.version.outputs.version }}
tag: ${{ steps.version.outputs.tag }}
notes_path: ${{ steps.version.outputs.notes_path }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Fetch upstream release tags
run: git fetch --force --tags https://github.com/nextlevelbuilder/goclaw.git "refs/tags/v*:refs/tags/v*"
- name: Compute semantic beta version
id: version
run: node scripts/ci/semantic-beta-version.mjs
- name: Create or verify beta tag
if: steps.version.outputs.released == 'true'
env:
TAG: ${{ steps.version.outputs.tag }}
run: |
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
if ! git rev-parse "$TAG" >/dev/null 2>&1; then
git tag -a "$TAG" -m "Release $TAG"
git push origin "$TAG"
fi
- name: Upload release notes
if: steps.version.outputs.released == 'true'
uses: actions/upload-artifact@v4
with:
name: release-notes
path: ${{ steps.version.outputs.notes_path }}

build_binaries:
needs: beta_version
if: needs.beta_version.outputs.released == 'true'
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- goos: linux
goarch: amd64
- goos: linux
goarch: arm64
steps:
- uses: actions/checkout@v4
with:
ref: ${{ needs.beta_version.outputs.tag }}

- uses: actions/setup-go@v5
with:
go-version-file: go.mod
cache-dependency-path: go.sum

- uses: actions/setup-node@v4
with:
node-version: 22

- name: Build web UI
run: |
corepack enable && corepack prepare pnpm@10.28.2 --activate
cd ui/web && pnpm install --frozen-lockfile && pnpm build && cd ../..
mkdir -p internal/webui/dist
cp -r ui/web/dist/* internal/webui/dist/

- name: Build binary
env:
GOOS: ${{ matrix.goos }}
GOARCH: ${{ matrix.goarch }}
VERSION: ${{ needs.beta_version.outputs.tag }}
run: |
CGO_ENABLED=0 go build -tags embedui \
-ldflags="-s -w -X github.com/nextlevelbuilder/goclaw/cmd.Version=${VERSION}" \
-o goclaw .
tar -czf "goclaw-${VERSION}-${{ matrix.goos }}-${{ matrix.goarch }}.tar.gz" goclaw migrations/

- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: binary-${{ matrix.goos }}-${{ matrix.goarch }}
path: goclaw-*.tar.gz

publish_release:
needs: [beta_version, build_binaries, promote_beta_aliases]
if: needs.beta_version.outputs.released == 'true'
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
pattern: binary-*
path: artifacts
merge-multiple: true

- name: Download release notes
uses: actions/download-artifact@v4
with:
name: release-notes
path: release-notes

- name: Publish prerelease
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_REPO: ${{ github.repository }}
TAG: ${{ needs.beta_version.outputs.tag }}
run: |
if gh release view "$TAG" >/dev/null 2>&1; then
gh release edit "$TAG" \
--title "GoClaw $TAG" \
--notes-file release-notes/release-notes.md \
--prerelease
else
gh release create "$TAG" \
--title "GoClaw $TAG" \
--notes-file release-notes/release-notes.md \
--prerelease
fi
gh release upload "$TAG" artifacts/* --clobber

docker_images:
needs: beta_version
if: needs.beta_version.outputs.released == 'true'
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
env:
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
strategy:
fail-fast: false
matrix:
include:
- variant: latest
suffix: ""
enable_otel: "false"
enable_embedui: "true"
enable_python: "true"
enable_full_skills: "false"
- variant: full
suffix: "-full"
enable_otel: "false"
enable_embedui: "true"
enable_python: "true"
enable_full_skills: "true"
steps:
- uses: actions/checkout@v4
with:
ref: ${{ needs.beta_version.outputs.tag }}

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

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

- name: Log in to GHCR
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Log in to Docker Hub
if: env.DOCKERHUB_USERNAME != '' && env.DOCKERHUB_TOKEN != ''
uses: docker/login-action@v3
with:
username: ${{ env.DOCKERHUB_USERNAME }}
password: ${{ env.DOCKERHUB_TOKEN }}

- name: Resolve Docker tags
id: docker_tags
env:
TAG: ${{ needs.beta_version.outputs.tag }}
SUFFIX: ${{ matrix.suffix }}
run: |
{
echo "tags<<EOF"
echo "${GHCR_IMAGE}:${TAG}${SUFFIX}"
if [[ -n "$DOCKERHUB_USERNAME" && -n "$DOCKERHUB_TOKEN" ]]; then
echo "${DOCKERHUB_IMAGE}:${TAG}${SUFFIX}"
fi
echo "EOF"
} >> "$GITHUB_OUTPUT"
if [[ -z "$DOCKERHUB_USERNAME" || -z "$DOCKERHUB_TOKEN" ]]; then
echo "::notice::Docker Hub secrets not configured; publishing GHCR only."
fi

- name: Build and push
uses: docker/build-push-action@v6
with:
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ steps.docker_tags.outputs.tags }}
build-args: |
ENABLE_OTEL=${{ matrix.enable_otel }}
ENABLE_EMBEDUI=${{ matrix.enable_embedui }}
ENABLE_PYTHON=${{ matrix.enable_python }}
ENABLE_FULL_SKILLS=${{ matrix.enable_full_skills }}
VERSION=${{ needs.beta_version.outputs.tag }}
cache-from: type=gha,scope=dev-beta-${{ matrix.variant }}
cache-to: type=gha,mode=max,scope=dev-beta-${{ matrix.variant }}

promote_beta_aliases:
needs: [beta_version, docker_images]
if: needs.beta_version.outputs.released == 'true'
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
env:
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
steps:
- uses: docker/setup-buildx-action@v3

- name: Log in to GHCR
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Log in to Docker Hub
if: env.DOCKERHUB_USERNAME != '' && env.DOCKERHUB_TOKEN != ''
uses: docker/login-action@v3
with:
username: ${{ env.DOCKERHUB_USERNAME }}
password: ${{ env.DOCKERHUB_TOKEN }}

- name: Promote beta aliases
env:
TAG: ${{ needs.beta_version.outputs.tag }}
run: |
docker buildx imagetools create -t "${GHCR_IMAGE}:beta" "${GHCR_IMAGE}:${TAG}"
docker buildx imagetools create -t "${GHCR_IMAGE}:beta-full" "${GHCR_IMAGE}:${TAG}-full"
if [[ -n "$DOCKERHUB_USERNAME" && -n "$DOCKERHUB_TOKEN" ]]; then
docker buildx imagetools create -t "${DOCKERHUB_IMAGE}:beta" "${DOCKERHUB_IMAGE}:${TAG}"
docker buildx imagetools create -t "${DOCKERHUB_IMAGE}:beta-full" "${DOCKERHUB_IMAGE}:${TAG}-full"
else
echo "::notice::Docker Hub secrets not configured; promoted GHCR beta aliases only."
fi
4 changes: 4 additions & 0 deletions .github/workflows/release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -168,14 +168,17 @@ jobs:
enable_embedui: "false"
enable_python: "false"
enable_full_skills: "false"
enable_kubectl: "false"
- variant: latest
enable_embedui: "true"
enable_python: "true"
enable_full_skills: "false"
enable_kubectl: "false"
- variant: full
enable_embedui: "true"
enable_python: "true"
enable_full_skills: "true"
enable_kubectl: "true"
- platform: linux/amd64
runner: ubuntu-latest
arch: amd64
Expand Down Expand Up @@ -207,6 +210,7 @@ jobs:
ENABLE_EMBEDUI=${{ matrix.enable_embedui }}
ENABLE_PYTHON=${{ matrix.enable_python }}
ENABLE_FULL_SKILLS=${{ matrix.enable_full_skills }}
ENABLE_KUBECTL=${{ matrix.enable_kubectl }}
VERSION=v${{ needs.release.outputs.version }}
cache-from: type=gha,scope=${{ matrix.variant }}-${{ matrix.arch }}
cache-to: type=gha,mode=max,scope=${{ matrix.variant }}-${{ matrix.arch }}
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# Test artifacts
tests/integration/testdata/
backup/

# Binary
openclaw-go
Expand Down
Loading
Loading