Skip to content

Validate macOS e2e workflow - #6

Open
pattobrien wants to merge 22 commits into
mainfrom
patt/ops-macos-app-setup
Open

Validate macOS e2e workflow#6
pattobrien wants to merge 22 commits into
mainfrom
patt/ops-macos-app-setup

Conversation

@pattobrien

@pattobrien pattobrien commented Jun 26, 2026

Copy link
Copy Markdown
Owner

Summary

  • add a Namespace macOS workflow that installs the dotfiles and runs the terminal E2E suites in series
  • align the repo with Vite+ 0.2.1 catalog pins and direct vitest test imports
  • stabilize the lazygit, LSP, kitty hyperlink, and related terminal E2E assertions

Validation

  • vp check $(git diff --name-only) .github/workflows/validate-macos-e2e.yaml
  • cd tests/e2e && vp test && vp test --tags-filter='kitty'
  • ruby -e 'require "yaml"; YAML.load_file(".github/workflows/validate-macos-e2e.yaml"); puts "yaml-ok"'

Note: claude-plugins/meagain/* tests remain outside the E2E expectation discussed here..

Runs README Setup steps 2 & 3 one script at a time on a Namespace macOS
runner (profile: mac), so a failure points at the exact script that broke.

- Reproduces step 2 by placing the repo at ~/dev/pattobrien/dotfiles and
  letting ./install init the dotbot submodule (no submodule prefetch).
- Runs base / homebrew / essentials / macos / mise / personal in order.
- Skips 1password and xcode: both need a GUI / Apple ID + 2FA and would
  hang or fail headless (notes in the workflow on enabling them via VNC).
- Bridges Homebrew onto PATH via `brew shellenv` (as zshrc does) since CI
  run: shells don't source the dotfiles' shell init.

Triggers on PRs touching install scripts/configs/Brewfiles, plus manual
workflow_dispatch.
A fresh/migrated Mac can already ship a real ~/.zshenv (and similar), which
dotbot refuses to clobber, so the very first `install` run fails. Add
scripts/backup_dotfiles.zsh to move such real files to <file>.bak before the
link step. Drop the CI workaround so the run exercises this for real.
CI/tooling:
- workflow: actions/checkout@v4 -> @v5 (silences Node 20 deprecation warning)
- mise: remove unused npm:figma-use (shipped a broken figma-fast bin)
- brew: mark third-party taps trusted: true across all Brewfiles
  (essentials/personal/work/runner/server) for Homebrew 6 tap-trust,
  fixing the 'formula is unreadable / requires the tap' warning

Editor config:
- codex: drop posthog plugin/marketplace/skills, add superwhisper, bump RevenueCat
- claude: add superwhisper + understand-anything marketplaces, restructure voice config
Root causes (validated by local repro + research):
- github.copilot/copilot-chat are now built into VS Code, so the marketplace
  entries try to downgrade and fail -> removed (obsolete).
- Brewfiles listed extension PACKS and their MEMBERS; the pack installs the
  members, then brew re-installs them without --force, racing VS Code's
  extensions.json rewrite under CI load -> ENOTEMPTY/EntryNotFound. De-duplicate
  packs vs members across personal/runner/server (members still install via
  their packs; extension set unchanged).
- Heavy VSIX downloads truncate on CI and get cached corrupt + never re-fetched
  (vscode#199675) -> CI step resets ~/.vscode/extensions + CachedExtensionVSIXs
  before ./install personal (emulates a fresh Mac).
- scripts/dequarantine.zsh: strip com.apple.quarantine from installed apps
  after each profile's brew bundle, so apps don't show the Gatekeeper
  'downloaded from the internet' prompt on first launch. HOMEBREW_CASK_OPTS
  --no-quarantine was removed in Homebrew 5, so the old setup_homebrew.zsh
  approach was a no-op; replaced with this supported sudo xattr sweep, wired
  into essentials/personal/work/runner/server.
- brew/*: ms-vsliveshare.vsliveshare-pack is dead on the marketplace (404);
  use the still-published base ms-vsliveshare.vsliveshare instead.
Standalone zsh CLI that drives agent-browser to check whether an existing
Chrome profile is still signed in to one or more web apps. Loads a read-only
snapshot of a real profile (--profile, default "Profile 2"), visits each URL
headlessly, and classifies via a generic heuristic:

  - final URL is a login/auth route         -> logged out
  - login CTA in the interactive snapshot    -> logged out
  - bot/security interstitial (Cloudflare)   -> inconclusive
  - blank / still-loading / nav failed       -> inconclusive
  - otherwise                                -> logged in

Detection reads the accessibility snapshot's interactive elements rather than
body prose, so login verbs in ordinary copy don't cause false negatives. URLs
run in parallel with per-op wall-clock caps so a slow/hanging site can't stall
the run. Exit 0 all logged in, 1 some logged out, 2 only inconclusive.
Remove the E2E_CHROME_USER_DATA_DIR override so preventSessionRestore()
can never delete session state from a real Chrome profile.
@cursor

cursor Bot commented Jul 24, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@pattobrien

Copy link
Copy Markdown
Owner Author

test !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant