Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
77 changes: 76 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,23 @@ jobs:
with:
components: rustfmt, clippy

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: npm

- name: Setup Bun
uses: oven-sh/setup-bun@v2

- name: Install dependencies
run: npm ci

# tauri-build validates bundle.externalBin at build time — the sidecars
# must exist before cargo clippy/build runs.
- name: Build sidecar packages
run: npm run build:sidecars

- name: Rust cache
uses: swatinem/rust-cache@v2
with:
Expand All @@ -168,13 +185,66 @@ jobs:
working-directory: apps/desktop/src-tauri
run: cargo build --release

# ─────────────────────────────────────────────────────────────────
# Sidecars (bun-compiled agent binaries) — build + smoke test per platform
# ─────────────────────────────────────────────────────────────────
sidecar:
name: Build sidecars (${{ matrix.platform }})
runs-on: ${{ matrix.platform }}
needs: changes
if: needs.changes.outputs.ts == 'true'
strategy:
fail-fast: false
matrix:
platform: [ubuntu-latest, windows-latest, macos-latest]
steps:
- uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: npm

- name: Setup Bun
uses: oven-sh/setup-bun@v2

- name: Install dependencies
run: npm ci

- name: Build sidecar packages
run: npm run build:sidecars

- name: Smoke test codex sidecar (invalid JSON → error event)
shell: bash
run: |
echo 'not json' | "$BIN" 2>&1 | grep -q "Invalid JSON input" \
|| (echo "codex sidecar smoke test failed"; exit 1)
env:
BIN: ${{ runner.os == 'Windows' && 'apps/desktop/src-tauri/binaries/codex-sidecar.exe' || 'apps/desktop/src-tauri/binaries/codex-sidecar' }}

- name: Smoke test claude-agent sidecar (invalid JSON → error event)
shell: bash
run: |
echo 'not json' | "$BIN" 2>&1 | grep -q "Invalid JSON input" \
|| (echo "claude-agent sidecar smoke test failed"; exit 1)
env:
BIN: ${{ runner.os == 'Windows' && 'apps/desktop/src-tauri/binaries/claude-agent.exe' || 'apps/desktop/src-tauri/binaries/claude-agent' }}

- name: Upload sidecar binaries
uses: actions/upload-artifact@v4
with:
name: sidecars-${{ matrix.platform }}
path: apps/desktop/src-tauri/binaries/
if-no-files-found: error

# ─────────────────────────────────────────────────────────────────
# Aggregate: all must pass
# ─────────────────────────────────────────────────────────────────
ci-success:
name: CI Success
runs-on: ubuntu-latest
needs: [lint, typecheck, test, rust]
needs: [lint, typecheck, test, rust, sidecar]
if: always()
steps:
- name: Check all required jobs
Expand All @@ -196,4 +266,9 @@ jobs:
[ "${{ needs.rust.result }}" = "cancelled" ]; then
echo "Rust failed"; exit 1
fi
# sidecar job is skipped when no changes — treat as success
if [ "${{ needs.sidecar.result }}" = "failure" ] || \
[ "${{ needs.sidecar.result }}" = "cancelled" ]; then
echo "Sidecar build failed"; exit 1
fi
echo "All CI checks passed"
61 changes: 59 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,12 @@ jobs:
- name: Install dependencies
run: npm ci

- name: Setup Bun
uses: oven-sh/setup-bun@v2

- name: Build AI sidecars (Windows x64)
run: npm run build:sidecars

- name: Build Tauri (Windows x64 — binary only)
uses: tauri-apps/tauri-action@v0
env:
Expand All @@ -322,6 +328,12 @@ jobs:
# compiled binary; Inno Setup step below creates the actual installer.
args: --target x86_64-pc-windows-msvc --no-bundle

- name: Copy sidecars next to release binary
shell: pwsh
run: |
node scripts/copy-sidecars.mjs --target "apps/desktop/src-tauri/target/x86_64-pc-windows-msvc/release"
Get-ChildItem "apps/desktop/src-tauri/target/x86_64-pc-windows-msvc/release" -Name | Select-String "codex|claude"

- name: Build Inno Setup installer
shell: pwsh
env:
Expand Down Expand Up @@ -399,6 +411,9 @@ jobs:
- name: Install dependencies
run: npm ci

- name: Setup Bun
uses: oven-sh/setup-bun@v2

- name: Build Tauri (Linux x64)
uses: tauri-apps/tauri-action@v0
env:
Expand All @@ -408,10 +423,52 @@ jobs:
releaseId: ${{ needs.create-release.outputs.release_id }}

# ─────────────────────────────────────────────────────────────────────────────
# JOB 4 — Publish release (after all platform builds succeed)
# JOB 4 — Build macOS
# ─────────────────────────────────────────────────────────────────────────────
build-macos:
needs: create-release
runs-on: macos-latest
permissions:
contents: write

steps:
- uses: actions/checkout@v4
with:
# Check out the version-bump commit, not the original trigger SHA.
ref: ${{ needs.create-release.outputs.bumped_sha }}

- name: Setup Rust
uses: dtolnay/rust-toolchain@stable

- name: Rust cache
uses: swatinem/rust-cache@v2
with:
workspaces: "apps/desktop/src-tauri -> target"

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20

- name: Setup Bun
uses: oven-sh/setup-bun@v2

- name: Install dependencies
run: npm ci

- name: Build Tauri (macOS)
uses: tauri-apps/tauri-action@v0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
projectPath: apps/desktop
releaseId: ${{ needs.create-release.outputs.release_id }}

# ─────────────────────────────────────────────────────────────────────────────
# JOB 5 — Publish release (after all platform builds succeed)
# ─────────────────────────────────────────────────────────────────────────────
publish-release:
needs: [create-release, build-windows, build-linux]
needs: [create-release, build-windows, build-linux, build-macos]
runs-on: ubuntu-latest
permissions:
contents: write
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
node_modules/
dist/
.turbo/
*.tsbuildinfo
target/
*.log
.DS_Store
Expand All @@ -11,6 +12,8 @@ apps/desktop/src-tauri/target/
apps/desktop/src-tauri/WixTools/
apps/desktop/src-tauri/gen/
apps/desktop/src-tauri/binaries/*.exe
apps/desktop/src-tauri/binaries/claude-agent
apps/desktop/src-tauri/binaries/codex-sidecar

# IDE
.vscode/
Expand Down
3 changes: 2 additions & 1 deletion apps/desktop/package.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
{
"name": "@hyscode/desktop",
"version": "0.7.2-build.72",
"version": "0.7.3",
"private": true,
"type": "module",
"scripts": {
"dev": "tauri dev",
"frontend:dev": "vite",
"build": "tsc -b && vite build",
"build:sidecars": "turbo build --filter=@hyscode/codex-sidecar --filter=@hyscode/claude-agent-sidecar",
"preview": "vite preview",
"tauri": "tauri",
"tauri:build": "tauri build",
Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion apps/desktop/src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "hyscode"
version = "0.7.2-build.72"
version = "0.7.3"
edition = "2021"
description = "An agentic code IDE"

Expand Down
5 changes: 5 additions & 0 deletions apps/desktop/src-tauri/installer/windows/hyscode.iss
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,11 @@ Name: "associatewithfiles"; Description: "Register {#MyAppName} as an editor for
Source: "{#SourceDir}\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#SourceDir}\*.dll"; DestDir: "{app}"; Flags: ignoreversion skipifsourcedoesntexist
Source: "{#SourceDir}\resources\*"; DestDir: "{app}\resources"; Flags: ignoreversion recursesubdirs createallsubdirs skipifsourcedoesntexist
; AI agent sidecars (copied next to the exe by scripts/build-windows.ps1)
Source: "{#SourceDir}\claude-agent.exe"; DestDir: "{app}"; Flags: ignoreversion skipifsourcedoesntexist
Source: "{#SourceDir}\codex-sidecar.exe"; DestDir: "{app}"; Flags: ignoreversion skipifsourcedoesntexist
; Note: the Codex CLI itself is NOT bundled — it is installed by the user
; (npm install -g @openai/codex) and detected at runtime.

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Expand Down
Loading
Loading