Skip to content
Merged
Show file tree
Hide file tree
Changes from 168 commits
Commits
Show all changes
171 commits
Select commit Hold shift + click to select a range
bf2b1cd
fix: clear baseline runtime type issues
zvadaadam May 14, 2026
cfca1fe
build: stage compiled deus runtime and native clis
zvadaadam May 14, 2026
31dfb24
feat: launch packaged services through deus-runtime
zvadaadam May 14, 2026
518407e
feat: resolve packaged agent clis from bundled binaries
zvadaadam May 14, 2026
3454d41
build: verify packaged runtime resources
zvadaadam May 14, 2026
8838a37
docs: capture deus runtime goal handoff
zvadaadam May 14, 2026
71aea67
fix: drop packaged node path runtime env
zvadaadam May 14, 2026
0d55ea7
build: unpack native runtime externals
zvadaadam May 14, 2026
6ef9ddf
fix: resolve runtime externals outside asar
zvadaadam May 14, 2026
ec9cfc9
build: add runnable runtime validation gate
zvadaadam May 14, 2026
2827958
build: externalize x64 canvas runtime package
zvadaadam May 14, 2026
8345aac
build: verify packaged native module payloads
zvadaadam May 14, 2026
760638f
build: gate packaged runnable checks by env
zvadaadam May 14, 2026
f9f7ee2
build: keep packaged node-pty on runtime prebuilds
zvadaadam May 14, 2026
723b8fe
build: drop packaged sqlite native payload
zvadaadam May 14, 2026
24de1b5
build: verify packaged native payload signatures
zvadaadam May 14, 2026
3352ad6
build: reject stale packaged main runtime contract
zvadaadam May 14, 2026
8c70404
build: add packaged resources smoke
zvadaadam May 14, 2026
7e1e687
test: cover signed runtime manifest verification
zvadaadam May 14, 2026
914cb2c
build: reject unstaged packaged runtime platforms
zvadaadam May 14, 2026
fbdc39d
test: cover packaged main runtime contract
zvadaadam May 14, 2026
fd88b5a
test: add source runtime smoke
zvadaadam May 14, 2026
f127d24
test: cover packaged terminal cli fallbacks
zvadaadam May 14, 2026
5238fa2
test: cover packaged gh auth cli path
zvadaadam May 14, 2026
b8d5aca
fix: initialize packaged main runtime env
zvadaadam May 14, 2026
07feea3
build: require packaged main env contract
zvadaadam May 14, 2026
f093cec
fix: refresh runtime node path resolution
zvadaadam May 14, 2026
28de3c3
fix: fail closed for packaged cli lookup
zvadaadam May 14, 2026
77f2b35
fix: require executable bundled cli files
zvadaadam May 14, 2026
a99f63f
fix: require bundled cli regular files
zvadaadam May 14, 2026
1610226
fix: validate managed runtime executable
zvadaadam May 14, 2026
b81ba52
fix: validate packaged runtime before backend spawn
zvadaadam May 14, 2026
6a3fcea
build: require runtime executables to be files
zvadaadam May 14, 2026
575e0ef
build: preserve runtime codesign page size
zvadaadam May 14, 2026
1bf9538
test: add packaged app runtime smoke
zvadaadam May 14, 2026
13221fa
build: narrow electron build freshness guard
zvadaadam May 14, 2026
52c991b
ci: smoke packaged deus-runtime in mac release
zvadaadam May 14, 2026
0031a97
test: cover electron build version guard
zvadaadam May 14, 2026
af48015
ci: require Gatekeeper for mac runtime smoke
zvadaadam May 14, 2026
12d7db2
ci: extract packaged runtime direct smoke
zvadaadam May 14, 2026
a9d1b09
ci: select native mac dmg for runtime smoke
zvadaadam May 14, 2026
4d721ed
build: validate runtime package version explicitly
zvadaadam May 14, 2026
de0a4f1
test: assert packaged runtime manifest version
zvadaadam May 14, 2026
ed5473b
ci: add packaged desktop launch smoke
zvadaadam May 14, 2026
b55508c
ci: harden packaged desktop smoke launch checks
zvadaadam May 14, 2026
9b6397b
ci: harden packaged runtime smoke cleanup
zvadaadam May 14, 2026
600635b
ci: clarify mac packaged smoke step name
zvadaadam May 14, 2026
e97d4fb
ci: disable linux desktop release packaging
zvadaadam May 14, 2026
cd7294e
build: fail fast for unstaged desktop platforms
zvadaadam May 14, 2026
5351de4
test: sanitize packaged desktop smoke environment
zvadaadam May 14, 2026
4003108
test: require bundled agent cli resolution in runtime smokes
zvadaadam May 14, 2026
18feeb4
test: report missing source runtime smoke patterns
zvadaadam May 14, 2026
7ce121f
ci: add staged native runtime smoke
zvadaadam May 14, 2026
3258e21
test: verify runtime sdk imports in self-test
zvadaadam May 14, 2026
551f2e9
ci: typecheck agent server in tests workflow
zvadaadam May 14, 2026
1c3e5c6
test: add native runtime smoke diagnostics
zvadaadam May 14, 2026
919b1b8
test: verify runtime sdk entrypoints in self-test
zvadaadam May 14, 2026
13934c2
test: capture codesign stderr in native smoke diagnostics
zvadaadam May 14, 2026
f0a61f0
ci: typecheck runtime surfaces before mac release
zvadaadam May 14, 2026
3cdf36f
test: run packaged gh and rg version checks
zvadaadam May 14, 2026
356d4d5
test: validate packaged gh and rg version output
zvadaadam May 14, 2026
f0a404e
test: include runtime diagnostics on native readiness failures
zvadaadam May 14, 2026
fc2dde5
test: sanitize runtime smoke launch env
zvadaadam May 14, 2026
5307d0d
test: add packaged runtime smoke diagnostics
zvadaadam May 14, 2026
926c0f6
build: declare cli runtime sdk dependencies
zvadaadam May 14, 2026
771fa99
ci: smoke packaged runtime resources before release
zvadaadam May 14, 2026
f1ed763
build: verify packaged sqlite runtime binding
zvadaadam May 14, 2026
ab394dc
test: exercise backend database route in runtime smokes
zvadaadam May 14, 2026
b8372a1
test: verify sqlite contract in runtime self-test
zvadaadam May 14, 2026
6107f7d
docs: note bun sqlite runtime boundary
zvadaadam May 14, 2026
ebe8d96
ci: smoke native runtime on macos prs
zvadaadam May 14, 2026
4e43752
test: require exact packaged cli paths in smokes
zvadaadam May 14, 2026
9bf60e2
test: add packaged desktop smoke diagnostics
zvadaadam May 14, 2026
c780853
test: verify initialized agents in runtime smokes
zvadaadam May 14, 2026
53f4ba8
test: verify packaged desktop runtime endpoints
zvadaadam May 14, 2026
eaa6352
test: cover packaged desktop cli lookup
zvadaadam May 14, 2026
da4d5cb
test: cover packaged main runtime env
zvadaadam May 14, 2026
15ea147
docs: document runtime verification boundary
zvadaadam May 14, 2026
e26088f
ci: run desktop runtime unit tests
zvadaadam May 14, 2026
9d22a38
docs: note desktop runtime unit coverage
zvadaadam May 14, 2026
55fa67c
test: consolidate packaged desktop cli coverage
zvadaadam May 14, 2026
2d8dabb
test: require codex app-server in runtime smokes
zvadaadam May 14, 2026
951aaa6
docs: reflect codex server smoke coverage
zvadaadam May 14, 2026
b5f78d9
ci: narrow desktop runtime test job
zvadaadam May 14, 2026
a7db05b
test: clarify mac runtime smoke policy failures
zvadaadam May 14, 2026
946e8e7
test: diagnose packaged binary version check timeouts
zvadaadam May 14, 2026
7da8de6
test: diagnose staged runtime runnable checks
zvadaadam May 14, 2026
2c21323
fix: use bundled gh and rg in terminal commands
zvadaadam May 14, 2026
053045d
docs: note electron build host blocker
zvadaadam May 14, 2026
f8ade1c
test: cover packaged agent env path isolation
zvadaadam May 14, 2026
9de2910
test: guard bundled codex app-server version
zvadaadam May 14, 2026
0a3ce50
fix: refuse packaged agent-server fallback
zvadaadam May 14, 2026
d4918de
test: avoid hanging runtime smoke diagnostics
zvadaadam May 14, 2026
6b30778
test: make packaged CLI version checks bounded
zvadaadam May 14, 2026
b7f1b53
test: bound staged agent CLI runnable checks
zvadaadam May 14, 2026
5814bb0
test: bound staged runtime runnable validation
zvadaadam May 14, 2026
845117f
docs: record packaged cua launch blocker
zvadaadam May 14, 2026
1302ed5
test: resolve runtime version check paths
zvadaadam May 14, 2026
98bc7ed
test: verify packaged bin hashes before signing
zvadaadam May 14, 2026
6d85d60
docs: clarify signed app manifest smoke
zvadaadam May 14, 2026
25b3697
build: make runtime manifests relocatable
zvadaadam May 14, 2026
5bf960e
fix: scrub packaged backend spawn env
zvadaadam May 14, 2026
e66cb94
fix: scrub runtime agent-server spawn env
zvadaadam May 14, 2026
984b936
docs: clarify desktop cli lookup
zvadaadam May 14, 2026
b72f4d9
test: smoke current desktop runtime contract
zvadaadam May 14, 2026
0dc2017
docs: add runtime completion audit
zvadaadam May 14, 2026
fa6cfca
test: tighten packaged main runtime guard
zvadaadam May 14, 2026
87f66d8
docs: record runtime resign diagnostic
zvadaadam May 14, 2026
264703a
docs: refresh runtime completion audit
zvadaadam May 14, 2026
e032727
ci: inspect packaged apps in release
zvadaadam May 14, 2026
84f2e3a
ci: require gatekeeper for packaged app smoke
zvadaadam May 14, 2026
175fefd
test: verify runtime self-test layout
zvadaadam May 14, 2026
ea8bebf
fix: force packaged runtime production env
zvadaadam May 14, 2026
3cd2b36
fix: scrub backend env from runtime agent server
zvadaadam May 14, 2026
e55cfe9
test: restrict packaged bin contents
zvadaadam May 14, 2026
5273616
ci: inspect packaged dmg apps
zvadaadam May 14, 2026
b57efce
docs: refresh runtime verification audit
zvadaadam May 14, 2026
19c46e3
fix: scrub packaged runtime backend env
zvadaadam May 14, 2026
cdfc5c2
fix: scrub stale bundled bin env
zvadaadam May 14, 2026
bc2c1aa
test: guard packaged main env scrub
zvadaadam May 14, 2026
b2e4e1d
docs: record packaging build blocker
zvadaadam May 14, 2026
7c16f95
fix: scrub version check env
zvadaadam May 14, 2026
7b86a25
fix: scrub gh cli child env
zvadaadam May 14, 2026
d537f86
test: guard packaged cli main contract
zvadaadam May 14, 2026
6b1bed8
test: verify runtime path self test
zvadaadam May 14, 2026
0f16b70
test: clarify packaged desktop gatekeeper failure
zvadaadam May 14, 2026
af8a5a8
ci: guard release bun version pin
zvadaadam May 14, 2026
1e6b511
fix: scrub packaged env for agent runtime child
zvadaadam May 14, 2026
fca6e44
fix: bundle agent browser runtime cli
zvadaadam May 14, 2026
8db4adf
test: allow installed packaged desktop smoke
zvadaadam May 14, 2026
c25f61c
ci: launch packaged desktop smoke in place
zvadaadam May 14, 2026
58b1f9e
test: guard desktop smoke install path
zvadaadam May 14, 2026
59f8c41
test: tighten packaged main env guard
zvadaadam May 14, 2026
667aae4
fix: reset packaged main resource env
zvadaadam May 14, 2026
3b8938f
test: reject duplicate packaged cli payloads
zvadaadam May 14, 2026
e8c4552
test: reject packaged codex wrappers
zvadaadam May 14, 2026
4562759
fix: prune packaged canvas native payloads
zvadaadam May 14, 2026
6eb27f7
test: match duplicate cli package roots
zvadaadam May 14, 2026
b397450
fix: keep staged runtime signing explicit
zvadaadam May 14, 2026
1a1eb47
docs: clarify packaged desktop platform support
zvadaadam May 14, 2026
cfc0476
docs: refresh runtime completion audit
zvadaadam May 14, 2026
2611949
ci: smoke packaged runtime app bundle
zvadaadam May 14, 2026
55f9895
docs: note bundled desktop agent clis
zvadaadam May 14, 2026
fbcba3b
ci: execute packaged runtime smoke
zvadaadam May 14, 2026
d75d784
fix: keep shell path sync out of packaged runtime
zvadaadam May 14, 2026
76781ba
fix: scrub runtime env for agent-browser cli
zvadaadam May 14, 2026
3fb90f1
test: validate packaged codex claude versions
zvadaadam May 14, 2026
7f54d27
docs: record runtime ci push blocker
zvadaadam May 14, 2026
3564e9f
fix: scrub backend child runtime env
zvadaadam May 14, 2026
e7af036
fix: refresh runtime unit guards
zvadaadam May 14, 2026
2bef98e
fix: keep claude sdk external in agent bundle
zvadaadam May 14, 2026
31a1464
style: format runtime app files
zvadaadam May 14, 2026
940051b
fix: detect compiled runtime executable
zvadaadam May 14, 2026
a7c57e2
fix: resolve native runtime from packaged bin
zvadaadam May 14, 2026
0f4309a
fix: compile native runtime as production
zvadaadam May 14, 2026
576f373
test: smoke packaged resources for host arch
zvadaadam May 14, 2026
0063788
fix: avoid native helpers in pencil build
zvadaadam May 14, 2026
628d6d4
test: add mac dir package smoke
zvadaadam May 14, 2026
780de3c
ci: use mac dir runtime package smoke
zvadaadam May 14, 2026
53c6b6b
fix: restore react-dom package version
zvadaadam May 14, 2026
931ede1
ci: smoke packaged desktop runtime
zvadaadam May 14, 2026
2b3e51f
fix: canonicalize app install preflight paths
zvadaadam May 14, 2026
b6c97f1
test: cover symlinked app install preflight
zvadaadam May 14, 2026
5e50e28
test: harden runtime smoke guards
zvadaadam May 14, 2026
2d53ffd
fix: allow smoke home in install preflight
zvadaadam May 14, 2026
acb9f22
test: read packaged desktop process output
zvadaadam May 14, 2026
1cbe37d
test: parse relayed agent-server listen URL
zvadaadam May 14, 2026
4f5e73e
docs: refresh runtime completion audit
zvadaadam May 14, 2026
8d24dcb
refactor: share runtime smoke helpers
zvadaadam May 14, 2026
dfc3f70
fix: address runtime review findings
zvadaadam May 14, 2026
6a5ca63
test: model executable bundled cli mocks
zvadaadam May 14, 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
166 changes: 82 additions & 84 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
# Multi-platform release workflow (macOS, Linux)
# Release workflow (macOS desktop + CLI)
#
# Builds and publishes the Electron app for all platforms via GitHub Releases.
# electron-updater reads latest-mac.yml / latest.yml / latest-linux.yml from
# the release assets to deliver auto-updates.
# Builds and publishes the macOS Electron app via GitHub Releases.
# electron-updater reads latest-mac.yml from the release assets to deliver
# auto-updates. Linux desktop packaging is intentionally disabled until the
# native packaged runtime and bundled agent CLIs are staged for Linux.
#
# Trigger: GitHub Actions UI → "Run workflow" → pick bump type
# Or CLI: gh workflow run release.yml -f bump=patch
Expand Down Expand Up @@ -44,6 +45,9 @@ on:
permissions:
contents: write

env:
BUN_VERSION: 1.2.19

jobs:
# ── Step 1: Validate version & bump files ───────────────────────────
validate-and-bump:
Expand Down Expand Up @@ -90,7 +94,15 @@ jobs:

- uses: oven-sh/setup-bun@v2
with:
bun-version: 1.2.19
bun-version: ${{ env.BUN_VERSION }}

- name: Verify Bun version pin
run: |
package_manager="$(sed -nE 's/.*"packageManager": "bun@([^"]+)".*/\1/p' package.json)"
if [[ "$package_manager" != "$BUN_VERSION" ]]; then
echo "::error::release workflow BUN_VERSION=$BUN_VERSION but package.json packageManager=bun@$package_manager"
exit 1
fi

- name: Bump version, commit & create tag
if: ${{ inputs.dry_run == false }}
Expand All @@ -117,7 +129,15 @@ jobs:

- uses: oven-sh/setup-bun@v2
with:
bun-version: 1.2.19
bun-version: ${{ env.BUN_VERSION }}

- name: Verify Bun version pin
run: |
package_manager="$(sed -nE 's/.*"packageManager": "bun@([^"]+)".*/\1/p' package.json)"
if [[ "$package_manager" != "$BUN_VERSION" ]]; then
echo "::error::release workflow BUN_VERSION=$BUN_VERSION but package.json packageManager=bun@$package_manager"
exit 1
fi

- uses: actions/setup-node@v4
with:
Expand All @@ -126,9 +146,21 @@ jobs:
- name: Install dependencies
run: bun install --frozen-lockfile

- name: Typecheck runtime surfaces
run: |
bun run typecheck
bun run typecheck:backend
bun run typecheck:agent-server

- name: Build all
run: bun run build:all

- name: Smoke test staged native runtime
run: bun run smoke:runtime-native

- name: Smoke test packaged runtime resources
run: bun run smoke:runtime-resources

- name: Prepare Apple API key for notarization
run: |
if [[ -z "$APPLE_API_KEY" || -z "$APPLE_API_KEY_ID" || -z "$APPLE_API_ISSUER" ]]; then
Expand Down Expand Up @@ -201,35 +233,48 @@ jobs:
while IFS= read -r app_path; do
echo "Verifying signature for $app_path"
codesign --verify --deep --strict --verbose=2 "$app_path"
node scripts/runtime/smoke-packaged-app.cjs --app "$app_path" --require-gatekeeper
done < <(find dist-electron -maxdepth 2 -path '*/Deus.app' -type d | sort)

while IFS= read -r dmg_path; do
echo "Validating notarization for $dmg_path"
xcrun stapler validate "$dmg_path"
done < <(find dist-electron -maxdepth 1 -name '*.dmg' -type f | sort)

- name: Smoke test packaged runtime from DMG copy
node scripts/runtime/smoke-packaged-dmgs.cjs \
--require-gatekeeper \
$(find dist-electron -maxdepth 1 -name '*.dmg' -type f | sort)

- name: Smoke test packaged runtime and desktop from DMG copy
run: |
set -euo pipefail

dmg_path="$(find dist-electron -maxdepth 1 -name '*arm64.dmg' -type f | head -n 1)"
runner_arch="$(uname -m)"
case "$runner_arch" in
arm64)
dmg_path="$(find dist-electron -maxdepth 1 -name '*arm64.dmg' -type f | head -n 1)"
;;
x86_64)
dmg_path="$(find dist-electron -maxdepth 1 \( -name '*x64.dmg' -o \( -name '*.dmg' ! -name '*arm64.dmg' \) \) -type f | head -n 1)"
;;
*)
echo "::error::Unsupported macOS runner architecture: ${runner_arch}"
exit 1
;;
esac
if [[ -z "$dmg_path" ]]; then
dmg_path="$(find dist-electron -maxdepth 1 -name '*.dmg' -type f | head -n 1)"
echo "::error::No macOS DMG found for runner architecture ${runner_arch}"
find dist-electron -maxdepth 1 -name '*.dmg' -type f -print
exit 1
fi

mount_dir="$(mktemp -d "${RUNNER_TEMP}/deus-dmg.XXXXXX")"
copied_root="$(mktemp -d "${RUNNER_TEMP}/deus-app.XXXXXX")"
copied_app="$copied_root/Deus.app"
smoke_log="$(mktemp "${RUNNER_TEMP}/deus-smoke.XXXXXX.log")"
smoke_db="$(mktemp "${RUNNER_TEMP}/deus-smoke.XXXXXX.db")"
copied_home="$copied_root/home"
copied_app="$copied_home/Applications/Deus.app"
attached=0
backend_pid=""

cleanup() {
if [[ -n "$backend_pid" ]]; then
kill "$backend_pid" 2>/dev/null || true
wait "$backend_pid" 2>/dev/null || true
fi
if [[ "$attached" -eq 1 ]]; then
hdiutil detach "$mount_dir" -quiet || true
fi
Expand All @@ -238,6 +283,7 @@ jobs:

hdiutil attach "$dmg_path" -mountpoint "$mount_dir" -nobrowse
attached=1
mkdir -p "$(dirname "$copied_app")"
ditto "$mount_dir/Deus.app" "$copied_app"
hdiutil detach "$mount_dir" -quiet
attached=0
Expand All @@ -246,34 +292,17 @@ jobs:
resources_dir="$copied_app/Contents/Resources"
test -x "$resources_dir/simulator/simbridge"
test -f "$resources_dir/simulator/siminspector.dylib"
test -x "$app_bin"

ELECTRON_RUN_AS_NODE=1 \
DATABASE_PATH="$smoke_db" \
AUTH_TOKEN=smoke \
PORT=0 \
CDP_PORT=19222 \
DEUS_PACKAGED=1 \
DEUS_RESOURCES_PATH="$resources_dir" \
DEUS_BUNDLED_BIN_DIR="$resources_dir/bin" \
DEVICE_USE_SIMBRIDGE="$resources_dir/simulator/simbridge" \
DEVICE_USE_SIMINSPECTOR="$resources_dir/simulator/siminspector.dylib" \
AGENT_SERVER_ENTRY="$resources_dir/bin/index.bundled.cjs" \
AGENT_SERVER_CWD="$resources_dir/bin" \
NODE_PATH="$resources_dir/app.asar/node_modules" \
"$app_bin" "$resources_dir/backend/server.bundled.cjs" >"$smoke_log" 2>&1 &
backend_pid=$!

for _ in {1..30}; do
if grep -q '^\[BACKEND_PORT\]' "$smoke_log"; then
break
fi
if ! kill -0 "$backend_pid" 2>/dev/null; then
break
fi
sleep 1
done
node scripts/runtime/smoke-packaged-runtime.cjs \
--app "$copied_app" \
--require-gatekeeper

grep -q '^\[BACKEND_PORT\]' "$smoke_log"
node scripts/runtime/smoke-packaged-desktop.cjs \
--app "$copied_app" \
--home "$copied_home" \
--launch-in-place \
--require-gatekeeper

- name: Clean up Apple API key
if: always()
Expand All @@ -291,47 +320,9 @@ jobs:
dist-electron/latest-mac.yml
if-no-files-found: error

# ── Step 2b: Build Linux (x64) ─────────────────────────────────────
build-linux:
needs: validate-and-bump
runs-on: ubuntu-latest
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
steps:
- uses: actions/checkout@v4
with:
ref: ${{ inputs.dry_run == false && needs.validate-and-bump.outputs.tag || github.ref }}

- uses: oven-sh/setup-bun@v2
with:
bun-version: 1.2.19

- uses: actions/setup-node@v4
with:
node-version: 22

- name: Install dependencies
run: bun install --frozen-lockfile

- name: Build all
run: bun run build:all

- name: Package Linux (x64)
run: bunx electron-builder --linux --publish never

- uses: actions/upload-artifact@v4
with:
name: linux
path: |
dist-electron/*.AppImage
dist-electron/*.deb
dist-electron/*.blockmap
dist-electron/latest-linux.yml
if-no-files-found: error

# ── Step 3: Stage a draft GitHub Release with all artifacts ─────────
create-release:
needs: [validate-and-bump, build-macos, build-linux]
needs: [validate-and-bump, build-macos]
if: ${{ inputs.dry_run == false }}
runs-on: ubuntu-latest
steps:
Expand All @@ -344,7 +335,6 @@ jobs:
mkdir -p release
find artifacts -type f \( \
-name "*.dmg" -o -name "*.zip" -o \
-name "*.AppImage" -o -name "*.deb" -o \
-name "*.blockmap" -o -name "*.yml" \
\) -exec cp {} release/ \;
echo "=== Release files ==="
Expand Down Expand Up @@ -387,7 +377,15 @@ jobs:

- uses: oven-sh/setup-bun@v2
with:
bun-version: 1.2.19
bun-version: ${{ env.BUN_VERSION }}

- name: Verify Bun version pin
run: |
package_manager="$(sed -nE 's/.*"packageManager": "bun@([^"]+)".*/\1/p' package.json)"
if [[ "$package_manager" != "$BUN_VERSION" ]]; then
echo "::error::release workflow BUN_VERSION=$BUN_VERSION but package.json packageManager=bun@$package_manager"
exit 1
fi

- uses: actions/setup-node@v4
with:
Expand Down
113 changes: 113 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,122 @@ jobs:
- name: Typecheck (backend)
run: bun run typecheck:backend

- name: Typecheck (agent-server)
run: bun run typecheck:agent-server

- name: Typecheck & test (cloud-relay)
run: cd apps/cloud-relay && bun install --frozen-lockfile && bunx tsc --noEmit && bunx vitest run

runtime-macos:
name: Native Runtime Smoke (macOS)
runs-on: macos-14
timeout-minutes: 20
steps:
- uses: actions/checkout@v4

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

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

- name: Install dependencies
run: bun install --frozen-lockfile

- name: Build staged native runtime
run: bun run build:runtime

- name: Validate staged runtime
run: bun run validate:runtime

- name: Smoke source runtime contract
run: bun run smoke:runtime-source

- name: Smoke desktop main runtime contract
run: bun run smoke:desktop-main-runtime

- name: Smoke native runtime executable
run: bun run smoke:runtime-native -- --skip-validate

- name: Smoke packaged runtime resources
run: bun run smoke:runtime-resources

- name: Build Electron desktop outputs
run: |
bun run build:pencil
bun run build

- name: Select macOS package architecture
run: |
set -euo pipefail
case "$(uname -m)" in
arm64)
echo "MAC_BUILDER_ARCH=arm64" >> "$GITHUB_ENV"
echo "MAC_EXPECTED_ARCH=arm64" >> "$GITHUB_ENV"
echo "MAC_APP_PATH=dist-electron/mac-arm64/Deus.app" >> "$GITHUB_ENV"
;;
x86_64)
echo "MAC_BUILDER_ARCH=x64" >> "$GITHUB_ENV"
echo "MAC_EXPECTED_ARCH=x64" >> "$GITHUB_ENV"
echo "MAC_APP_PATH=dist-electron/mac/Deus.app" >> "$GITHUB_ENV"
;;
*)
echo "::error::Unsupported macOS runner architecture: $(uname -m)"
exit 1
;;
esac

- name: Package macOS app directory
run: bun run package:mac:dir -- --arch "$MAC_BUILDER_ARCH"
env:
CSC_IDENTITY_AUTO_DISCOVERY: "false"

- name: Smoke packaged macOS app bundle
run: >
node scripts/runtime/smoke-packaged-app.cjs
--app "$MAC_APP_PATH"
--arch "$MAC_EXPECTED_ARCH"
--skip-app-signature
--run-version-checks

- name: Smoke packaged runtime executable
run: >
node scripts/runtime/smoke-packaged-runtime.cjs
--app "$MAC_APP_PATH"
--skip-app-check

- name: Smoke packaged Electron desktop
run: >
node scripts/runtime/smoke-packaged-desktop.cjs
--app "$MAC_APP_PATH"
--skip-app-check

desktop-runtime-tests:
name: Desktop Runtime Unit Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

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

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

- name: Install dependencies
run: bun install --frozen-lockfile

- name: Run desktop/runtime unit tests
run: bun run test:desktop-runtime

backend-tests:
name: Backend Tests
runs-on: ubuntu-latest
Expand Down
Loading
Loading