diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index f5ff1d423..2ebff4060 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: 30
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/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",
+ },
},
});
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..f78b98e9b 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,14 @@ 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('/');
+ 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();
+ });
+
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() {