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
28 changes: 24 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,18 @@ jobs:
globs: |
docs/**/*.md

no-private-identifiers:
name: No private identifiers
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
- name: ShellCheck
run: shellcheck scripts/check-no-private-identifiers.sh scripts/test-check-no-private-identifiers.sh
- name: Repo is clean, and the check fails on a forbidden pattern
run: |
bash scripts/check-no-private-identifiers.sh
bash scripts/test-check-no-private-identifiers.sh

pw-mcp-loopback:
name: Playwright MCP stays on loopback (#115)
runs-on: ubuntu-latest
Expand All @@ -46,7 +58,11 @@ jobs:
- name: Build
run: swift build
- name: Packaging smoke (unsigned; release signing is tag-only)
run: scripts/test-packaging.sh .build/debug/oab-instance-mcp
run: scripts/test-packaging.sh .build/debug/oab-computer
- name: Name consistency and warn-only old-agent check (stub launchctl/systemctl)
run: |
bash scripts/test-name-consistency.sh
bash scripts/test-legacy-agent.sh
- name: Test
run: swift test

Expand Down Expand Up @@ -81,10 +97,14 @@ jobs:
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
- name: ShellCheck
run: shellcheck scripts/install-linux.sh scripts/test-install-linux.sh
run: shellcheck scripts/install-linux.sh scripts/test-install-linux.sh scripts/test-name-consistency.sh scripts/test-legacy-agent.sh
- name: Generated units (fake HOME, stubbed systemctl/tailscale/loginctl)
# Diffs each written unit against its expected text and runs systemd-analyze verify (#90).
run: bash scripts/test-install-linux.sh
- name: Names agree between installer, units and release assets; old agent only warned about
run: |
bash scripts/test-name-consistency.sh
bash scripts/test-legacy-agent.sh

linux-hands-node:
name: Linux hands node (${{ matrix.arch }})
Expand Down Expand Up @@ -148,8 +168,8 @@ jobs:
run: bash smoke.sh
- uses: actions/upload-artifact@v4
with:
name: reverse-attach-linux-${{ matrix.arch }}
path: poc/reverse-attach-linux/target/release/reverse-attach
name: oab-computer-linux-${{ matrix.arch }}
path: poc/reverse-attach-linux/target/release/oab-computer
- name: Smoke a plain build (reports -dev)
# After the upload: rebuilds only this crate without OAB_RELEASE_VERSION, so smoke.sh
# checks the "<crate>-dev" fallback a local build reports (#74). The first smoke run
Expand Down
40 changes: 20 additions & 20 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ permissions:
contents: write

concurrency:
group: instance-mcp-release-${{ github.ref }}
group: oab-computer-release-${{ github.ref }}
cancel-in-progress: false

jobs:
Expand Down Expand Up @@ -73,13 +73,13 @@ jobs:
swift build -c release --arch arm64 --scratch-path "$RUNNER_TEMP/build-arm64"
swift build -c release --arch x86_64 --scratch-path "$RUNNER_TEMP/build-x86_64"
/usr/bin/lipo -create \
"$RUNNER_TEMP/build-arm64/release/oab-instance-mcp" \
"$RUNNER_TEMP/build-x86_64/release/oab-instance-mcp" \
-output "$DIST/oab-instance-mcp"
chmod 755 "$DIST/oab-instance-mcp"
/usr/bin/lipo -info "$DIST/oab-instance-mcp" | grep -q 'x86_64 arm64\|arm64 x86_64'
[ "$($DIST/oab-instance-mcp --version)" = "$VERSION" ]
scripts/assemble-app.sh "$DIST/oab-instance-mcp" "$DIST/oab-instance-mcp.app" "$VERSION"
"$RUNNER_TEMP/build-arm64/release/oab-computer" \
"$RUNNER_TEMP/build-x86_64/release/oab-computer" \
-output "$DIST/oab-computer"
chmod 755 "$DIST/oab-computer"
/usr/bin/lipo -info "$DIST/oab-computer" | grep -q 'x86_64 arm64\|arm64 x86_64'
[ "$($DIST/oab-computer --version)" = "$VERSION" ]
scripts/assemble-app.sh "$DIST/oab-computer" "$DIST/oab-computer.app" "$VERSION"

- name: Import Developer ID certificates
shell: bash
Expand Down Expand Up @@ -110,7 +110,7 @@ jobs:
shell: bash
run: |
set -euo pipefail
APP="$DIST/oab-instance-mcp.app"
APP="$DIST/oab-computer.app"
/usr/bin/codesign --force --deep --options runtime --timestamp \
--keychain "$KEYCHAIN" --sign "$APP_SIGN_IDENTITY" "$APP"
/usr/bin/codesign --verify --deep --strict --verbose=2 "$APP"
Expand All @@ -122,41 +122,41 @@ jobs:
--key "$RUNNER_TEMP/AuthKey.p8" --key-id "$NOTARY_KEY_ID" --issuer "$NOTARY_ISSUER_ID" --wait
xcrun stapler staple "$APP"
xcrun stapler validate "$APP"
rm -f "$DIST/oab-instance-mcp-$VERSION-universal.app.zip"
rm -f "$DIST/oab-computer-$VERSION-universal.app.zip"
/usr/bin/ditto -c -k --sequesterRsrc --keepParent "$APP" \
"$DIST/oab-instance-mcp-$VERSION-universal.app.zip"
"$DIST/oab-computer-$VERSION-universal.app.zip"

- name: Build, sign, and notarize installer pkg
shell: bash
run: |
set -euo pipefail
PKG="$DIST/oab-instance-mcp-$VERSION-universal.pkg"
PKG="$DIST/oab-computer-$VERSION-universal.pkg"
EXPECT_TEAM="$EXPECTED_TEAM_ID" PKG_SIGN_IDENTITY="$INSTALLER_SIGN_IDENTITY" \
PKG_KEYCHAIN="$KEYCHAIN" \
scripts/package-pkg.sh "$DIST/oab-instance-mcp.app" "$PKG" "$VERSION"
scripts/package-pkg.sh "$DIST/oab-computer.app" "$PKG" "$VERSION"
/usr/sbin/pkgutil --check-signature "$PKG" | grep -q 'Developer ID Installer'
xcrun notarytool submit "$PKG" \
--key "$RUNNER_TEMP/AuthKey.p8" --key-id "$NOTARY_KEY_ID" --issuer "$NOTARY_ISSUER_ID" --wait
xcrun stapler staple "$PKG"
xcrun stapler validate "$PKG"
/usr/sbin/spctl -a -vv --type install "$PKG"
scripts/verify-release.sh \
"$DIST/oab-instance-mcp-$VERSION-universal.app.zip" "$PKG" "$EXPECTED_TEAM_ID"
"$DIST/oab-computer-$VERSION-universal.app.zip" "$PKG" "$EXPECTED_TEAM_ID"

- name: Checksums and release
shell: bash
run: |
set -euo pipefail
cd "$DIST"
/usr/bin/shasum -a 256 \
"oab-instance-mcp-$VERSION-universal.app.zip" \
"oab-instance-mcp-$VERSION-universal.pkg" > SHA256SUMS
"oab-computer-$VERSION-universal.app.zip" \
"oab-computer-$VERSION-universal.pkg" > SHA256SUMS
gh release view "$RELEASE_TAG" --repo "$GITHUB_REPOSITORY" >/dev/null 2>&1 || \
gh release create "$RELEASE_TAG" --repo "$GITHUB_REPOSITORY" \
--verify-tag --generate-notes --title "oab-computer $VERSION"
gh release upload "$RELEASE_TAG" --repo "$GITHUB_REPOSITORY" --clobber \
"oab-instance-mcp-$VERSION-universal.app.zip" \
"oab-instance-mcp-$VERSION-universal.pkg" SHA256SUMS
"oab-computer-$VERSION-universal.app.zip" \
"oab-computer-$VERSION-universal.pkg" SHA256SUMS

- name: Clean signing material
if: always()
Expand Down Expand Up @@ -219,9 +219,9 @@ jobs:
shell: bash
run: |
set -euo pipefail
NAME="oab-instance-mcp-$VERSION-linux-${{ matrix.arch }}"
NAME="oab-computer-$VERSION-linux-${{ matrix.arch }}"
mkdir -p "$NAME"
cp poc/reverse-attach-linux/target/release/reverse-attach "$NAME/oab-instance-mcp"
cp poc/reverse-attach-linux/target/release/oab-computer "$NAME/oab-computer"
cp poc/reverse-attach-linux/pw-mcp.sh scripts/install-linux.sh "$NAME/"
cp poc/reverse-attach-linux/README.md "$NAME/README.md"
tar czf "$NAME.tar.gz" "$NAME"
Expand Down
10 changes: 5 additions & 5 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
import PackageDescription

let package = Package(
name: "oab-instance-mcp",
name: "oab-computer",
platforms: [.macOS(.v14)],
products: [
.executable(name: "oab-instance-mcp", targets: ["oab-instance-mcp"]),
.executable(name: "oab-computer", targets: ["oab-computer"]),
.library(name: "InstanceMCPCore", targets: ["InstanceMCPCore"]),
],
targets: [
Expand All @@ -23,15 +23,15 @@ let package = Package(
),
// Thin CLI: flag parsing + wiring. No logic worth testing lives here.
.executableTarget(
name: "oab-instance-mcp",
name: "oab-computer",
dependencies: ["InstanceMCPCore"],
path: "Sources/oab-instance-mcp"
path: "Sources/oab-computer"
),
.testTarget(
name: "InstanceMCPCoreTests",
// The executable is a dependency only so it is built beside the tests: one test runs it with the hidden
// permission-check argument.
dependencies: ["InstanceMCPCore", "oab-instance-mcp"],
dependencies: ["InstanceMCPCore", "oab-computer"],
path: "Tests/InstanceMCPCoreTests"
),
]
Expand Down
Loading
Loading