Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
3cc28be
feat(spec): repoint codegen at the public extraction API
Goldziher May 9, 2026
483ab1b
feat(typescript): add ergonomic client methods + error hierarchy
Goldziher May 9, 2026
60b4cb2
feat(go): add types and error hierarchy
Goldziher May 9, 2026
fb44260
feat(go): add ergonomic client methods + retry/backoff
Goldziher May 9, 2026
22f049b
feat(go): add FromSandbox constructor
Goldziher May 9, 2026
be51fde
test(typescript): add msw-mocked test suite covering ~57 cases
Goldziher May 9, 2026
70489bd
feat(python): add ergonomic client methods + error hierarchy
Goldziher May 9, 2026
fdea7b1
test(python): add respx-mocked test suite covering ~50 cases
Goldziher May 9, 2026
230f384
docs(typescript): rewrite README with real, runnable examples
Goldziher May 9, 2026
9518e9c
docs(python): rewrite README with real, runnable examples
Goldziher May 9, 2026
63a4784
test(go): add httptest-backed test suite covering ~40 cases
Goldziher May 9, 2026
2f03193
docs(go): rewrite README with real, runnable examples
Goldziher May 9, 2026
2d56d5e
fix(ci): drop pnpm version override; let action read packageManager
Goldziher May 9, 2026
4bfb0f3
fix(ci): bump node baseline to 22 (pnpm 11 requires >= 22.13)
Goldziher May 9, 2026
c616147
style: apply pyproject-fmt formatting
Goldziher May 9, 2026
23bd397
style: apply prek auto-fixes (go-fmt, oxfmt) + typos config
Goldziher May 9, 2026
bdd23b4
ci(validate): generate SDK bindings before prek; docstring sync-versi…
Goldziher May 9, 2026
3ca66f4
fix(scripts): allow intentional print() in sync-versions CLI
Goldziher May 9, 2026
face0d3
chore(release): add per-package LICENSE files for v0.0.1
Goldziher May 10, 2026
bc11990
chore(python): add Changelog URL, point license-files at local copy
Goldziher May 10, 2026
05e5d53
chore(typescript): bump engines.node to >=22 and align description
Goldziher May 10, 2026
83c27c7
feat(go): export Version constant and use it in User-Agent
Goldziher May 10, 2026
97cb620
docs: add CHANGELOG.md following Keep a Changelog
Goldziher May 10, 2026
d0e7fee
feat(release): add task version:set + release helpers
Goldziher May 10, 2026
7026d03
ci: unify release workflow on kreuzberg-dev/actions composites
Goldziher May 10, 2026
bf93b58
docs(readme): add registry badges and install snippets
Goldziher May 10, 2026
2623313
chore: rename _typos.toml to .typos.toml
Goldziher May 10, 2026
be969b4
ci: slim test matrices to a single combo per language
Goldziher May 10, 2026
711333e
docs: apply OSS branding + split dev workflow into CONTRIBUTING.md
Goldziher May 10, 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
11 changes: 3 additions & 8 deletions .github/workflows/ci-go.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,18 +26,13 @@ permissions:

jobs:
test:
name: test (go${{ matrix.go }} on ${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
go: ["1.26"]
name: test (go 1.26)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-go@v6
with:
go-version: ${{ matrix.go }}
go-version: "1.26"
cache: true
- name: Install task
uses: arduino/setup-task@v2
Expand Down
11 changes: 3 additions & 8 deletions .github/workflows/ci-python.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,20 +26,15 @@ permissions:

jobs:
test:
name: test (py${{ matrix.python }} on ${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
python: ["3.10", "3.11", "3.12", "3.13"]
name: test (python 3.10)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: astral-sh/setup-uv@v6
with:
enable-cache: true
- name: Pin Python
run: uv python install ${{ matrix.python }}
run: uv python install 3.10
- name: Install task
uses: arduino/setup-task@v2
with:
Expand Down
13 changes: 3 additions & 10 deletions .github/workflows/ci-typescript.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,21 +30,14 @@ permissions:

jobs:
test:
name: test (node${{ matrix.node }} on ${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
node: ["20", "22", "24"]
name: test (node 24)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: pnpm/action-setup@v4
with:
version: 11.0.8
- uses: actions/setup-node@v5
with:
node-version: ${{ matrix.node }}
node-version: "24"
cache: pnpm
- name: Install task
uses: arduino/setup-task@v2
Expand Down
38 changes: 0 additions & 38 deletions .github/workflows/publish-python.yml

This file was deleted.

43 changes: 0 additions & 43 deletions .github/workflows/publish-typescript.yml

This file was deleted.

214 changes: 214 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
name: release

on:
push:
tags: ['v*.*.*']
workflow_dispatch:
inputs:
tag:
description: "Override tag (vX.Y.Z) — required for workflow_dispatch"
required: false
dry_run:
description: "Build everything, skip publishes"
type: boolean
default: false
force_republish:
description: "Republish even if version exists in registry"
type: boolean
default: false

permissions:
contents: write
id-token: write

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

jobs:
prepare:
runs-on: ubuntu-latest
outputs:
tag: ${{ steps.metadata.outputs.tag }}
version: ${{ steps.metadata.outputs.version }}
npm_tag: ${{ steps.metadata.outputs.npm_tag }}
dry_run: ${{ steps.metadata.outputs.dry_run }}
force_republish: ${{ steps.metadata.outputs.force_republish }}
release_python: ${{ steps.metadata.outputs.release_python }}
release_node: ${{ steps.metadata.outputs.release_node }}
release_go: ${{ steps.metadata.outputs.release_go }}
steps:
- uses: kreuzberg-dev/actions/prepare-release-metadata@v1
id: metadata
with:
available-targets: "python,node,go"

validate-versions:
needs: prepare
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Verify all manifests match the tag
shell: bash
env:
VERSION: ${{ needs.prepare.outputs.version }}
run: |
set -euo pipefail
file_version=$(cat VERSION)
py_version=$(grep -E '^version = ' packages/python/pyproject.toml | head -1 | sed 's/version = "\(.*\)"/\1/')
ts_version=$(python3 -c 'import json; print(json.load(open("packages/typescript/package.json"))["version"])')
go_version=$(grep -E '^const Version = ' packages/go/v1/version.go | sed 's/.*"\(.*\)".*/\1/')
for v in "$file_version" "$py_version" "$ts_version" "$go_version"; do
if [ "$v" != "$VERSION" ]; then
echo "version mismatch: tag=$VERSION file=$file_version py=$py_version ts=$ts_version go=$go_version" >&2
exit 1
fi
done
echo "all manifests at $VERSION"

check-pypi:
needs: prepare
if: needs.prepare.outputs.release_python == 'true'
runs-on: ubuntu-latest
outputs:
exists: ${{ steps.check.outputs.exists }}
steps:
- uses: kreuzberg-dev/actions/check-registry@v1
id: check
with:
registry: pypi
package: kreuzberg-cloud
version: ${{ needs.prepare.outputs.version }}

check-npm:
needs: prepare
if: needs.prepare.outputs.release_node == 'true'
runs-on: ubuntu-latest
outputs:
exists: ${{ steps.check.outputs.exists }}
steps:
- uses: kreuzberg-dev/actions/check-registry@v1
id: check
with:
registry: npm
package: "@kreuzberg/cloud"
version: ${{ needs.prepare.outputs.version }}

build-python:
needs: [prepare, validate-versions]
if: needs.prepare.outputs.release_python == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: kreuzberg-dev/actions/setup-python-env@v1
with:
python-version: "3.10"
- uses: kreuzberg-dev/actions/install-task@v1
- name: Generate client
run: task python:generate
- name: Build wheel + sdist
run: task python:build
- uses: actions/upload-artifact@v7
with:
name: python-dist
path: dist/
retention-days: 7

build-typescript:
needs: [prepare, validate-versions]
if: needs.prepare.outputs.release_node == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: kreuzberg-dev/actions/setup-node-workspace@v1
- uses: kreuzberg-dev/actions/install-task@v1
- name: Generate client
run: task typescript:generate
- name: Build
run: task typescript:build
- name: Pack
run: cd packages/typescript && pnpm pack --pack-destination ${{ runner.temp }}
- uses: actions/upload-artifact@v7
with:
name: typescript-dist
path: ${{ runner.temp }}/*.tgz
retention-days: 7

publish-pypi:
needs: [prepare, validate-versions, check-pypi, build-python]
if: |
needs.prepare.outputs.release_python == 'true' &&
(needs.check-pypi.outputs.exists != 'true' ||
needs.prepare.outputs.force_republish == 'true')
runs-on: ubuntu-latest
environment:
name: pypi
url: https://pypi.org/p/kreuzberg-cloud
permissions:
id-token: write
steps:
- uses: actions/download-artifact@v7
with:
name: python-dist
path: dist/
- uses: kreuzberg-dev/actions/publish-pypi@v1
with:
packages-dir: dist
dry-run: ${{ needs.prepare.outputs.dry_run }}

publish-npm:
needs: [prepare, validate-versions, check-npm, build-typescript]
if: |
needs.prepare.outputs.release_node == 'true' &&
(needs.check-npm.outputs.exists != 'true' ||
needs.prepare.outputs.force_republish == 'true')
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v6
- uses: actions/download-artifact@v7
with:
name: typescript-dist
path: packages/typescript/dist-pack/
- uses: kreuzberg-dev/actions/publish-npm@v1
with:
packages-dir: packages/typescript/dist-pack
npm-tag: ${{ needs.prepare.outputs.npm_tag }}
provenance: "true"
dry-run: ${{ needs.prepare.outputs.dry_run }}
env:
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

tag-go:
needs: [prepare, validate-versions]
if: needs.prepare.outputs.release_go == 'true'
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- uses: kreuzberg-dev/actions/finalize-release@v1
with:
tag: ${{ needs.prepare.outputs.tag }}
go-module-path: packages/go/v1
dry-run: ${{ needs.prepare.outputs.dry_run }}

github-release:
needs: [prepare, publish-pypi, publish-npm, tag-go]
if: |
always() &&
!cancelled() &&
needs.prepare.outputs.dry_run != 'true'
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v6
- uses: kreuzberg-dev/actions/publish-github-release@v1
with:
tag: ${{ needs.prepare.outputs.tag }}
generate-notes: "true"
Loading
Loading