Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
5eb3eb5
refactor: move Python tree into packages/cuttle-py (monorepo restruct…
tenequm Jul 16, 2026
d1ef431
feat(go): scaffold cuttle-go package + toolchain
tenequm Jul 16, 2026
5f79d9f
feat(go/fingerprint): port cloakbrowser arg-building, geoip, proxy no…
tenequm Jul 16, 2026
fde637e
feat(go/serve): port cuttleserve CDP multiplexer
tenequm Jul 16, 2026
d13eedd
feat(go/config): TOML contexts + profiles with strict-mode loading
tenequm Jul 16, 2026
bd199ff
feat(go/backend): local/k8s/ssh/direct backends behind an exec seam
tenequm Jul 16, 2026
efe29ac
feat(go/cli): up/down/status/login/connect + context ls + driver brie…
tenequm Jul 16, 2026
19f947d
feat(go/profile): local-canonical storage_state checkout/checkin over…
tenequm Jul 16, 2026
6cd212c
feat(go/mcp): cuttle mcp + thread --profile through login/connect/mcp
tenequm Jul 16, 2026
44626b9
feat(go): Python-free multi-stage Dockerfile
tenequm Jul 16, 2026
feb4876
feat(helm): cuttle chart for the k8s backend
tenequm Jul 16, 2026
f4cc6c3
ci: monorepo paths + Go pipeline
tenequm Jul 16, 2026
6981a4e
docs: monorepo README + cuttle-go guide
tenequm Jul 16, 2026
f6c34b3
fix(go): green the golangci-lint gate
tenequm Jul 16, 2026
42e450d
fix(go): match Python oracle on proxy-auth splitting and guard it in …
tenequm Jul 16, 2026
c69885f
fix(go): fall back to proxy-host DNS when GeoIP echo services fail
tenequm Jul 16, 2026
1ece05e
fix(go): honor --name and default the local container to "cuttle"
tenequm Jul 16, 2026
c20716e
fix(go): align cuttle mcp with connect's forwarded port for remote co…
tenequm Jul 16, 2026
084f791
docs(go): sanitize SSH example username in public README
tenequm Jul 16, 2026
69dba20
test(harness): assert WebGL renderer is a real GPU via ANGLE
tenequm Jul 16, 2026
a74a4a9
refactor(go): dedup seed grammar, backend run-check, dead proxy-dict …
tenequm Jul 16, 2026
763a7ac
refactor(go): apply pre-release polish findings
tenequm Jul 16, 2026
6ff7e7f
ci: adopt GoReleaser and rewire release/CI for the Go module
tenequm Jul 16, 2026
52cbc95
build: bake Windows fonts, drop the Python fontbuilder stage
tenequm Jul 16, 2026
0548265
test: port the smoke harness and parity-golden regen to Go
tenequm Jul 16, 2026
50cf75e
refactor!: promote the Go module to the repo root, delete the Python …
tenequm Jul 16, 2026
0837580
refactor: group container build assets under ops/docker/
tenequm Jul 16, 2026
37e6771
ci: consolidate workflows into a single ci.yml
tenequm Jul 16, 2026
19ea20f
docs: restore THIRD-PARTY notices for the redistributed binaries
tenequm Jul 16, 2026
c67bbdd
feat(cli): restore cuttle skill command and apply post-review fixes
tenequm Jul 16, 2026
782f29f
ci: update actions and deps to latest, unblock the lint gate
tenequm Jul 16, 2026
2ebb12c
refactor: scrub upstream attribution, XDG-align serve data dir, tidy …
tenequm Jul 16, 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
9 changes: 0 additions & 9 deletions .dockerignore

This file was deleted.

46 changes: 0 additions & 46 deletions .github/cliff.toml

This file was deleted.

9 changes: 5 additions & 4 deletions .github/release-please-config.json
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
{
"$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json",
"release-type": "python",
"release-type": "go",
"include-component-in-tag": false,
"bump-minor-pre-major": true,
"bump-patch-for-minor-pre-major": true,
"packages": {
".": {
"package-name": "cuttle-browser",
"skip-changelog": true,
"extra-files": [{ "type": "generic", "path": "SKILL.md" }]
"package-name": "cuttle",
"extra-files": [
"internal/cli/SKILL.md"
]
}
}
}
159 changes: 143 additions & 16 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,30 +1,157 @@
name: ci

# Lint + type-check the authored Python (the `just check` gate, in check-only
# mode - CI never mutates). Runs on human PRs and pushes to main. NOTE: the
# release PR is opened by github-actions via github.token, which GitHub does not
# let trigger workflows, so this does not run on it - that PR only bumps version
# strings and needs no code CI. Heavier gates (`just smoke`, real-amd64) stay
# manual pre-merge; see AGENTS.md.
on:
pull_request:
push:
branches: [main]
pull_request:

# Read-only by default; the release job elevates for its own publishing.
permissions:
contents: read

concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true
# Concurrency is per-job, not workflow-level: a build stays cancellable, but the
# release job must never be cancelled mid-publish.

jobs:
check:
build-and-test:
runs-on: ubuntu-latest
concurrency:
group: build-${{ github.ref }}
cancel-in-progress: true
steps:
- uses: actions/checkout@v7
- uses: actions/setup-go@v7
with:
go-version-file: go.mod
- uses: docker/setup-buildx-action@v4

- name: Lint
uses: golangci/golangci-lint-action@v9
with:
version: v2.12

- name: Test
run: |
go install gotest.tools/gotestsum@latest
gotestsum --format github-actions -- -race -coverprofile=coverage.out -covermode=atomic ./...

- name: Vuln
run: |
go install golang.org/x/vuln/cmd/govulncheck@latest
govulncheck ./...

# helm is preinstalled on ubuntu-latest; guard the chart against drift.
- name: Helm lint
run: |
helm lint ops/helm/cuttle
helm template ops/helm/cuttle >/dev/null

# Build the amd64 image and smoke it over raw CDP (per-seed isolation,
# stealth coherence, WebGL via ANGLE). buildx GHA cache reuses the apt +
# clark/clearcote + KasmVNC layers so only a Chrome bump re-downloads them.
- name: Build image (cached)
uses: docker/build-push-action@v7
with:
context: .
file: ops/docker/Dockerfile
platforms: linux/amd64
load: true
tags: cuttle:ci
cache-from: type=gha
cache-to: type=gha,mode=max,ignore-error=true

- name: Smoke (Go harness over CDP)
run: |
set -euo pipefail
docker run -d --name cuttle-smoke -p 127.0.0.1:19222:9222 --shm-size=2g cuttle:ci
for _ in $(seq 1 60); do
curl -sf http://127.0.0.1:19222/json/version >/dev/null 2>&1 && break
sleep 1
done
CUTTLE_URL=http://127.0.0.1:19222 go run ./test/smoke

- name: Teardown
if: always()
run: docker rm -f cuttle-smoke >/dev/null 2>&1 || true

# Runs only on push to main, and only after build-and-test is green.
# release-please maintains the release PR; merging it cuts the tag + GitHub
# release, and the gated steps then publish (GoReleaser binaries + Homebrew
# cask, and the GHCR image) in this same run - no PAT-triggered tag handoff.
release:
needs: build-and-test
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
permissions:
contents: write # tag + release, GoReleaser upload
pull-requests: write # release-please PR
packages: write # push image to GHCR
concurrency:
group: release-${{ github.ref }}
cancel-in-progress: false
steps:
# release-please-action is API-driven and needs no checkout.
- uses: googleapis/release-please-action@v5
id: rp
with:
config-file: .github/release-please-config.json
manifest-file: .github/.release-please-manifest.json

# Everything below runs only when merging the release PR actually cut a
# release (release_created == true).
- uses: actions/checkout@v7
- uses: astral-sh/setup-uv@v8.3.2
- run: uv run ty check
- run: uv run ruff check --output-format github
- run: uv run ruff format --check
- run: uv run python scripts/check-skill-version.py
if: steps.rp.outputs.release_created == 'true'
with:
fetch-depth: 0 # GoReleaser needs full history + the new tag

- uses: actions/setup-go@v7
if: steps.rp.outputs.release_created == 'true'
with:
go-version-file: go.mod

- uses: goreleaser/goreleaser-action@v7
if: steps.rp.outputs.release_created == 'true'
with:
version: "~> v2"
args: release --clean --config ops/config/goreleaser.yaml
env:
GITHUB_TOKEN: ${{ github.token }}
# Push the Homebrew cask to the separate tap repo.
GH_RELEASE_TOKEN: ${{ secrets.GH_RELEASE_TOKEN }}

- uses: docker/setup-buildx-action@v4
if: steps.rp.outputs.release_created == 'true'

- name: Log in to GHCR
if: steps.rp.outputs.release_created == 'true'
uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Image metadata
id: meta
if: steps.rp.outputs.release_created == 'true'
uses: docker/metadata-action@v6
with:
images: ghcr.io/glim-sh/cuttle
tags: |
type=raw,value=${{ steps.rp.outputs.version }}
type=raw,value=${{ steps.rp.outputs.major }}.${{ steps.rp.outputs.minor }}
type=raw,value=latest
type=sha

# clark/clearcote ship linux-x64 prebuilts only, so the image is amd64-only.
- name: Build and push image
if: steps.rp.outputs.release_created == 'true'
uses: docker/build-push-action@v7
with:
context: .
file: ops/docker/Dockerfile
platforms: linux/amd64
push: true
build-args: |
VERSION=${{ steps.rp.outputs.version }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
Loading