Harden runner + add /mp test service#119
Merged
Merged
Conversation
- cli: add --device <ids> to restrict a run to specific device ids - detect: resolve flowsDir to .maestro when .maestro/config.yaml exists (the flows/ dir is the subflow library, not the runnable suite) - runner: idle-kill watchdog 30s -> 120s (was truncating flows mid-suite), add gRPC fail-fast for incompatible devices, give shard groups the same app-install check + foregrounding as per-device runs - exec: unify spawnToFile + spawnSilentWithProgress into spawnCaptured; remove dead spawnPrefixedUntilMarker - config: add idleKillMs / grpcBailThreshold + validate appleTeamId and numeric fields - main: fail-fast preflight (maestro on PATH, flowsDir exists), extract resolveBuildMode, warn on multi-Android full-mode race - setup: clear app state on physical iOS (terminate) - devices: extract pure discovery parsers - junit: de-dupe shard results in merge + summary - ui: drop unused helpers (logRaw/step/plan/stepLabel/success/error) - defaultBuild: filter iOS .app by bundleId, build idle-kill safety net Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 64 deno tests covering config resolution, build-mode, flow/bundle detect, build-strategy detect, shard-config stripping, device parsers, junit merge/dedup, spawnCaptured (marker/idle/bail), and service helpers - ci.yml: fmt --check + lint + check + test on PR - release.yml: JSR publish on version tag Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Run maestro-parallel from GitHub and stream live output into one self-updating PR comment. - poll mode (default, outbound-only, no tunnel): every ~3 min run open PRs carrying the `maestro-auto` label whose head changed - webhook mode: trusted author comments `/mp` (HMAC-verified) - isolated git worktree per run; shared device lock; rolling tail + tally - mp-service.sh control script (start/stop/restart/status/logs/url), .env.example, README Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- cli: document --device - configuration: idleKillMs, grpcBailThreshold, maestroConfigPath note - index: multi-Android concurrency caveat - troubleshooting: multi-Android race, undefined env vars, Xcode 26 iOS driver Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Hardens the runner against the Maestro quirks that surfaced testing real Expo
projects, removes dead code, adds a unit suite + CI, and adds a
/mptestservice that runs maestro-parallel from GitHub and streams output into a PR
comment.
Tool
--device <ids>to restrict a run to specific devices (exclude dead/incompatible ones)detectFlowsDirresolves to.maestrowhenconfig.yamlis present (subflowflows/is not the suite)spawnToFile+spawnSilentWithProgressunified intospawnCaptured; dead code removed (spawnPrefixedUntilMarker, unused ui helpers, duplicatedeviceSlug)idleKillMs/grpcBailThreshold+ validation (appleTeamId, numerics).appdisambiguated by bundleId; build idle-kill safety netTests + CI
/mpservice (service/)maestro-autolabel whose head changed/mp(HMAC-verified).env.example+ READMETest plan
Screen: terminal in the repo root
How to get there:
deno task check && deno task lint && deno fmt --check && deno task testWhat to check: all green, 64 tests pass.
Screen: an Expo project with
.maestro/flows + a connected deviceHow to get there:
deno run -A cli.ts --all --skip-build --device <serial>What to check: flows run to completion; the live checklist shows the per-device tally; no premature watchdog kill during long login flows.
Screen: the
/mpserviceHow to get there:
cp service/.env.example service/.env(fill in),./service/mp-service.sh start, then in poll mode add themaestro-autolabel to a PR; in webhook mode comment/mp.What to check: a PR comment appears and updates live with the run output, finishing with ✅/❌ + exit code.