From c7f1f3ea2c9b3d2fd5b23114ca80d11248fd79f3 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 26 Aug 2026 14:42:16 +0000 Subject: [PATCH 1/4] chore: enable windows and linux builds Reapply PR #83's changes onto current main (the original branch had diverged with no common ancestor, so rebase wasn't possible): add Windows/Linux CI matrix entries and jj install support, add Ubuntu/Windows release targets, and update docs and homepage for cross-platform availability. --- .github/workflows/ci.yml | 50 +++++++++++++++++------ .github/workflows/release.yml | 25 +++++++++--- web/docs/getting-started/installation.mdx | 11 ++++- web/docs/intro.md | 2 +- web/docs/reference/contributing.md | 2 +- web/e2e/navigation.spec.ts | 13 ++++++ web/src/pages/index.tsx | 8 +++- web/static/llms.txt | 4 +- 8 files changed, 91 insertions(+), 24 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f5ff1d423..c2688c788 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,9 @@ name: CI +defaults: + run: + shell: bash + on: pull_request: paths: @@ -47,6 +51,14 @@ jobs: kind: rust task: test timeout-minutes: 15 + - platform: windows-latest + kind: js + task: test:unit + timeout-minutes: 15 + - platform: windows-latest + kind: rust + task: test + timeout-minutes: 15 name: ${{ matrix.kind }} / ${{ matrix.task }} / ${{ matrix.platform }} runs-on: ${{ matrix.platform }} @@ -125,7 +137,7 @@ jobs: if: matrix.task == 'test:integration' || matrix.kind == 'rust' uses: actions/cache/restore@v4 with: - path: .ci-bin/jj + path: .ci-bin key: jj-${{ runner.os }}-${{ runner.arch }}-${{ steps.jj.outputs.tag }} - name: Install jj CLI @@ -142,21 +154,35 @@ jobs: Linux-X64) target=x86_64-unknown-linux-musl ;; macOS-ARM64) target=aarch64-apple-darwin ;; macOS-X64) target=x86_64-apple-darwin ;; + Windows-X64) target=x86_64-pc-windows-msvc ;; *) echo "unsupported runner: ${{ runner.os }}-${{ runner.arch }}" exit 1 ;; esac - asset="jj-${JJ_TAG}-${target}.tar.gz" - tmp=$(mktemp -d) - curl -fsSL \ - -H "Authorization: Bearer ${GITHUB_TOKEN}" \ - -L "https://github.com/jj-vcs/jj/releases/download/${JJ_TAG}/${asset}" \ - | tar -xz -C "$tmp" - # tarball may nest the binary; find it - jj_bin=$(find "$tmp" -type f -name jj | head -n 1) - test -n "$jj_bin" - install -m 755 "$jj_bin" .ci-bin/jj + if [ "${{ runner.os }}" = "Windows" ]; then + asset="jj-${JJ_TAG}-${target}.zip" + tmp=$(mktemp -d) + curl -fsSL \ + -H "Authorization: Bearer ${GITHUB_TOKEN}" \ + -L "https://github.com/jj-vcs/jj/releases/download/${JJ_TAG}/${asset}" \ + -o "$tmp/jj.zip" + unzip -q "$tmp/jj.zip" -d "$tmp" + jj_bin=$(find "$tmp" -type f -name jj.exe | head -n 1) + test -n "$jj_bin" + install -m 755 "$jj_bin" .ci-bin/jj.exe + else + asset="jj-${JJ_TAG}-${target}.tar.gz" + tmp=$(mktemp -d) + curl -fsSL \ + -H "Authorization: Bearer ${GITHUB_TOKEN}" \ + -L "https://github.com/jj-vcs/jj/releases/download/${JJ_TAG}/${asset}" \ + | tar -xz -C "$tmp" + # tarball may nest the binary; find it + jj_bin=$(find "$tmp" -type f -name jj | head -n 1) + test -n "$jj_bin" + install -m 755 "$jj_bin" .ci-bin/jj + fi - name: Save jj CLI cache if: > @@ -165,7 +191,7 @@ jobs: continue-on-error: true uses: actions/cache/save@v4 with: - path: .ci-bin/jj + path: .ci-bin key: ${{ steps.jj-cache.outputs.cache-primary-key }} - name: Add jj to PATH diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index dd37a2e80..a4e2f9b1b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,5 +1,9 @@ name: Release +defaults: + run: + shell: bash + on: workflow_dispatch: @@ -59,15 +63,20 @@ jobs: matrix: include: - platform: "macos-latest" # for Arm based macs (M1 and above). + target: "aarch64-apple-darwin" args: "--target aarch64-apple-darwin" - platform: "macos-latest" # for Intel based macs. + target: "x86_64-apple-darwin" args: "--target x86_64-apple-darwin" # - platform: "macos-latest" + # target: "universal-apple-darwin" # args: "--target universal-apple-darwin" - # - platform: 'ubuntu-22.04' - # args: '' - # - platform: 'windows-latest' - # args: '' + - platform: "ubuntu-22.04" + target: "x86_64-unknown-linux-gnu" + args: "--target x86_64-unknown-linux-gnu" + - platform: "windows-latest" + target: "x86_64-pc-windows-msvc" + args: "--target x86_64-pc-windows-msvc" runs-on: ${{ matrix.platform }} environment: prod steps: @@ -82,7 +91,13 @@ jobs: - name: install Rust stable uses: dtolnay/rust-toolchain@stable with: - targets: ${{ matrix.platform == 'macos-latest' && 'aarch64-apple-darwin,x86_64-apple-darwin' || '' }} + targets: ${{ matrix.target }} + + - name: install dependencies (ubuntu only) + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf - uses: Swatinem/rust-cache@v2 with: diff --git a/web/docs/getting-started/installation.mdx b/web/docs/getting-started/installation.mdx index 6781613c3..3b466879a 100644 --- a/web/docs/getting-started/installation.mdx +++ b/web/docs/getting-started/installation.mdx @@ -6,7 +6,14 @@ sidebar_position: 1 _How to install and set up Treq on your machine._ -Download the latest version for macOS from the GitHub Releases page. +Download the latest version for your platform from the GitHub Releases page. + +| Platform | Release target | +|---|---| +| macOS on Apple silicon | `aarch64-apple-darwin` | +| macOS on Intel | `x86_64-apple-darwin` | +| Windows | `x86_64-pc-windows-msvc` | +| Linux | `x86_64-unknown-linux-gnu` | [View Releases](https://github.com/Ziinc/treq/releases) @@ -26,7 +33,7 @@ Click **Select Repository** or the folder icon, and navigate to a Git repository A [workspace](/docs/concepts/workspaces) is where each piece of parallel work lives. -1. Click **New Workspace** (or press `Cmd+N`) to open the creation dialog. +1. Click **New Workspace**. You can also press `Cmd+N` on macOS or `Ctrl+N` on Windows and Linux. 2. Fill in a plan title describing what you're working on. 3. Adjust the branch name if needed. 4. Click **Create Workspace** to save. diff --git a/web/docs/intro.md b/web/docs/intro.md index bd1f3697a..ad4dceaf3 100644 --- a/web/docs/intro.md +++ b/web/docs/intro.md @@ -5,7 +5,7 @@ slug: / # Treq -_Technical overview of Treq's workspace model, runtime behavior, and macOS-specific assumptions._ +_Technical overview of Treq's workspace model and runtime behavior on macOS, Windows, and Linux._ Treq is a local review and workspace manager for Git repositories. You open a repo, create workspaces for parallel work, and push through your normal Git remotes. You never need to know [Jujutsu](https://jj-vcs.github.io/jj/latest/) to use it. diff --git a/web/docs/reference/contributing.md b/web/docs/reference/contributing.md index 83c413067..efa4b0e6d 100644 --- a/web/docs/reference/contributing.md +++ b/web/docs/reference/contributing.md @@ -81,7 +81,7 @@ Do not fold unrelated tidying into feature work. Treq has several layers with di Docs follow the style guide in `web/STYLE_GUIDE.md`. Write plain technical prose, skip the marketing language, and use tables for dense reference data. -Public docs describe macOS behavior unless another platform is spelled out. Leave out implementation details a reader cannot act on. +Public docs describe macOS, Windows, and Linux behavior. Call out platform-specific behavior when it differs. Leave out implementation details a reader cannot act on. ## Learn More diff --git a/web/e2e/navigation.spec.ts b/web/e2e/navigation.spec.ts index 7e883569d..5de45a768 100644 --- a/web/e2e/navigation.spec.ts +++ b/web/e2e/navigation.spec.ts @@ -53,6 +53,13 @@ test.describe('Homepage Features layout', () => { }); test.describe('Navbar navigation', () => { + test('shows desktop platform availability', async ({ page }) => { + await page.goto('/'); + await expect(page.getByLabel('macOS')).toBeVisible(); + await expect(page.getByLabel('Windows')).toBeVisible(); + await expect(page.getByLabel('Linux')).toBeVisible(); + }); + test('Learn link navigates to learn section', async ({ page }) => { await page.goto('/'); await clickNavDropdownItem(page, 'Discover', 'Learn'); @@ -71,6 +78,12 @@ test.describe('Navbar navigation', () => { await expect(page.getByRole('heading', { name: 'Installation and Quickstart', level: 1 })).toBeVisible(); }); + test('installation lists each release target', async ({ page }) => { + await page.goto('/docs/getting-started/installation'); + await expect(page.getByRole('cell', { name: 'x86_64-pc-windows-msvc' })).toBeVisible(); + await expect(page.getByRole('cell', { name: 'x86_64-unknown-linux-gnu' })).toBeVisible(); + }); + test('logo navigates home from a docs page', async ({ page }) => { await page.goto('/'); await clickNavDropdownItem(page, 'Discover', 'Learn'); diff --git a/web/src/pages/index.tsx b/web/src/pages/index.tsx index 97ddb73da..c10e6c7b4 100644 --- a/web/src/pages/index.tsx +++ b/web/src/pages/index.tsx @@ -86,6 +86,12 @@ function HomepageHeader() { + + + + + +
Treq is an open-source macOS app for managing parallel AI development: create isolated Git workspaces per branch, run coding agents inside them, then review, commit, and merge changes without leaving the app. +> Treq is an open-source desktop app for macOS, Windows, and Linux. Create isolated Git workspaces per branch, run coding agents inside them, then review, commit, and merge changes without leaving the app. ## Getting Started -- [Installation and Quickstart](https://treq.dev/docs/getting-started/installation.md): Download Treq for macOS, open a repository, create a workspace, launch an agent, and commit and push changes. +- [Installation and Quickstart](https://treq.dev/docs/getting-started/installation.md): Download Treq for macOS, Windows, or Linux, open a repository, create a workspace, launch an agent, and commit and push changes. ## Concepts From be36d22b4789216869279e0ac32e39661e8a9980 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 26 Aug 2026 14:45:45 +0000 Subject: [PATCH 2/4] fix: use UI navigation in e2e installation target test Direct page.goto() to an internal URL is disallowed by the no-e2e-direct-url-goto ast-grep rule; navigate via the Get Started link instead, matching the existing test's pattern. --- web/e2e/navigation.spec.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/web/e2e/navigation.spec.ts b/web/e2e/navigation.spec.ts index 5de45a768..f78b98e9b 100644 --- a/web/e2e/navigation.spec.ts +++ b/web/e2e/navigation.spec.ts @@ -79,7 +79,9 @@ test.describe('Navbar navigation', () => { }); test('installation lists each release target', async ({ page }) => { - await page.goto('/docs/getting-started/installation'); + await page.goto('/'); + await nav(page).getByRole('link', { name: 'Get Started' }).click(); + await expect(page.getByRole('heading', { name: 'Installation and Quickstart', level: 1 })).toBeVisible(); await expect(page.getByRole('cell', { name: 'x86_64-pc-windows-msvc' })).toBeVisible(); await expect(page.getByRole('cell', { name: 'x86_64-unknown-linux-gnu' })).toBeVisible(); }); From d14a051741ed79e31e77f197b35659618d615644 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 26 Aug 2026 14:48:48 +0000 Subject: [PATCH 3/4] fix: make test:unit script cross-platform for Windows CI Inline VAR=value env syntax in the npm script is POSIX-only and fails under npm's cmd.exe shell on Windows. Move DEBUG_PRINT_LIMIT into vitest.unit.config.ts's test.env instead, which works on every platform. --- package.json | 2 +- vitest.unit.config.ts | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 1eb9f3476..836fd5d01 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "test:run": "npm run test:unit && npm run test:integration", "test:ui": "vitest --ui", "build:napi": "cargo build --manifest-path src-tauri/Cargo.toml --lib --features tauri-test", - "test:unit": "DEBUG_PRINT_LIMIT=10 vitest run --config vitest.unit.config.ts --silent=passed-only", + "test:unit": "vitest run --config vitest.unit.config.ts --silent=passed-only", "test:integration:run": "DEBUG_PRINT_LIMIT=10 vitest run --config vitest.integration.config.ts --maxWorkers=1 --fileParallelism=false --silent=passed-only", "test:integration": "npm run build:napi --silent && npm run test:integration:run", "test": "npm run test:unit && npm run test:integration", diff --git a/vitest.unit.config.ts b/vitest.unit.config.ts index ec3125242..0b03f00d7 100644 --- a/vitest.unit.config.ts +++ b/vitest.unit.config.ts @@ -24,5 +24,8 @@ export default defineConfig({ globals: true, fileParallelism: true, testTimeout: 15000, + env: { + DEBUG_PRINT_LIMIT: "10", + }, }, }); From 08bd85091eb132806b1ce0d0242ac568371ea361 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 26 Aug 2026 15:14:02 +0000 Subject: [PATCH 4/4] fix: give the windows-latest rust CI job more time Cold Rust builds on Windows (no warm cache yet) run past the 15 minute timeout that works fine on Linux/macOS. Bump it to 30. --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c2688c788..2ebff4060 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -58,7 +58,7 @@ jobs: - platform: windows-latest kind: rust task: test - timeout-minutes: 15 + timeout-minutes: 30 name: ${{ matrix.kind }} / ${{ matrix.task }} / ${{ matrix.platform }} runs-on: ${{ matrix.platform }}