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
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ jobs:
vm-e2e:
name: release vm-e2e (L4)
needs: gate-tests
runs-on: macos-14
runs-on: macos-15
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/vm-e2e-spike.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ on:

jobs:
vm-e2e:
runs-on: macos-14
runs-on: macos-15
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
Expand All @@ -22,7 +22,7 @@ jobs:
- name: Build binary
run: make build

# GitHub's macos-14 image ships with third-party taps (aws/tap,
# GitHub's macos-15 image ships with third-party taps (aws/tap,
# azure/bicep, hashicorp/tap) pre-installed. Recent Homebrew refuses
# to load formulae/casks from untrusted taps, which breaks `brew`
# operations the L4 suite drives. Trust everything already tapped so
Expand Down
4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ The `agent-config` architecture test verifies the import and skill adapters.

## Project

OpenBoot is a **macOS-only** Go 1.25 CLI that automates dev-environment setup: Homebrew packages/casks, npm globals, Oh-My-Zsh, macOS `defaults`, and dotfiles. Built on **Cobra** (CLI) + **Charmbracelet** (bubbletea / lipgloss / huh for TUI).
OpenBoot is a **macOS-only** Go 1.26 CLI that automates dev-environment setup: Homebrew packages/casks, npm globals, Oh-My-Zsh, macOS `defaults`, and dotfiles. Built on **Cobra** (CLI) + **Charmbracelet** (bubbletea / lipgloss / huh for TUI).

Entry point: `cmd/openboot/main.go` -> `internal/cli.Execute()`.
Core flow: `openboot install` orchestrates plan -> apply in `internal/installer/installer.go`.
Expand All @@ -63,7 +63,7 @@ make build-release VERSION=0.25.0 # optimized + UPX
# Test — full tier table in CONTRIBUTING.md
make test-unit # L1 (~75s) — unit + integration + contract; pre-push hook
make test-e2e # L3 compiled binary
# L4 — destructive e2e runs in CI only (vm-e2e-spike.yml on macos-14)
# L4 — destructive e2e runs in CI only (vm-e2e-spike.yml on macos-15)
make test-coverage # coverage.out + coverage.html

# Single test
Expand Down
4 changes: 2 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ Tests are split across four tiers. Which one runs where:
| **L1 Unit + Integration + Contract** | Pure-Go logic with faked `Runner` *plus* real `brew` / `git` / `npm` against temp dirs and real `httptest` servers | `make test-unit` (~75s) | Every push (pre-push hook); CI on push/PR |
| **L2 Contract schema** | JSON schema validation against [openboot-contract](https://github.com/openbootdotdev/openboot-contract) | (runs in CI only) | CI on push/PR |
| **L3 E2E binary** | Compiled binary driven by scripts; `-tags=e2e` | `make test-e2e` | CI on release |
| **L4 VM e2e** | Full destructive suite (`-tags="e2e,vm"`). Installs real packages, modifies `~/.zshrc`, writes `defaults`. Each run requires a clean macOS host (Apple Silicon). | CI only — `vm-e2e-spike.yml` on `macos-14` | Every PR as the required `vm-e2e` check. No local target. |
| **L4 VM e2e** | Full destructive suite (`-tags="e2e,vm"`). Installs real packages, modifies `~/.zshrc`, writes `defaults`. Each run requires a clean macOS host (Apple Silicon). | CI only — `vm-e2e-spike.yml` on `macos-15` | Every PR as the required `vm-e2e` check. No local target. |

Rules of thumb:

Expand All @@ -47,7 +47,7 @@ Rules of thumb:

## VM E2E

L4 tests run on GitHub Actions (`macos-14` runner, Apple Silicon, `vm-e2e-spike.yml`).
L4 tests run on GitHub Actions (`macos-15` runner, Apple Silicon, `vm-e2e-spike.yml`).
Each job gets a fresh macOS VM — no local setup or Makefile target required.

## Git Hooks
Expand Down
4 changes: 2 additions & 2 deletions docs/HARNESS.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ Three regulation categories:
| Behav. | L1 unit + integration + contract (faked runners *and* real brew/git/npm in temp dirs) | pre-push, CI | `make test-unit` |
| Behav. | L2 contract schema (against openboot-contract repo) | every PR | `.github/workflows/test.yml` `contract` job |
| Behav. | L3 e2e binary | release | `make test-e2e` |
| Behav. | L4 VM e2e (`vm`) — required full destructive suite on a clean macOS host | every PR | `.github/workflows/vm-e2e-spike.yml` (`vm-e2e` required check on a macos-14 runner) |
| Behav. | L4 VM e2e (`vm`) — required full destructive suite on a clean macOS host | every PR | `.github/workflows/vm-e2e-spike.yml` (`vm-e2e` required check on a macos-15 runner) |
| Behav. | `install.sh` upgrade over an existing install — tap refresh, upgrade, reinstall fallback, and resolved-version reporting with fake Homebrew/OpenBoot commands | L1 | `test/integration/install_script_test.go` |
| Behav. | Install-wizard TUI on a real pty — L3: launch/quit smoke + full keyboard choreography (stops before confirm, installs nothing); L4: same key sequence through a real install via `expect(1)`, asserting brew/git system state | L3 at release, L4 every PR | `test/e2e/install_wizard_e2e_test.go`, `test/e2e/install_wizard_vm_test.go` |
| Behav. | curl\|bash smoke — mock-served install script piped into `bash`, driving the built binary through a config install (**not** `scripts/install.sh`; that's the L1 row above) | every PR | `.github/workflows/test.yml` `curl-bash-smoke` job |
Expand Down Expand Up @@ -117,7 +117,7 @@ it survives doc rot.
the two apart from `TERM`/TTY/height alone. It now draws a plain in-place
`\r\033[K` status line that trails top-to-bottom output on every terminal.
Don't reintroduce the scroll region.
- **L4 runs on GitHub Actions, not a self-hosted runner.** `macos-14`
- **L4 runs on GitHub Actions, not a self-hosted runner.** `macos-15`
runners are Apple Silicon VMs — each job gets a fresh clean macOS
environment, which is exactly what L4 needs. Tart is no longer required.
The L4 workflow (`vm-e2e-spike.yml`) runs on every PR as the required
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module github.com/openbootdotdev/openboot

go 1.25.12
go 1.26.8

require (
github.com/charmbracelet/bubbles v0.20.0
Expand Down
2 changes: 1 addition & 1 deletion testutil/machost.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
//go:build e2e && vm

// MacHost runs destructive openboot E2E tests directly against the
// current macOS host. In CI this is a fresh GitHub Actions macos-14 runner;
// current macOS host. In CI this is a fresh GitHub Actions macos-15 runner;
// locally it should only be used on a throwaway machine.
//
// A host refuses to activate unless CI=true, OPENBOOT_IN_VM=1, or
Expand Down Expand Up @@ -110,7 +110,7 @@
return nil
}

func shellescape(s string) string {

Check failure on line 113 in testutil/machost.go

View workflow job for this annotation

GitHub Actions / deadcode (drift)

unreachable func: shellescape
return "'" + strings.ReplaceAll(s, "'", "'\\''") + "'"
}

Expand Down
Loading