Install
openclaw skills install wanderClose the loop on long-running remote work: pick the right completion signal per platform (CI, EAS, deploy, releases), run monitoring in the background, notify on finish, and never treat trigger as success. Includes GitHub Actions via the Wander scripts when applicable.
openclaw skills install wanderDon't watch. Wander. Philosophy: after you trigger something remote and slow, completion should find you — and the Agent must still verify the outcome, not assume it.
Meta vs implementation: This skill defines a portable best practice for any long-running remote task. Wander (
watch-workflow-*.sh) is the reference adapter when the source of truth is GitHub Actions. It is not the only valid monitor.
Every remote async task has the same shape:
Trigger → Runs elsewhere → Terminal state (+ artifacts)
(Agent) (cannot speed up) (User + Agent both need this)
The Agent should:
The loop is only complete when the Agent knows the terminal state (and, for failures, has enough log/context to fix).
Step A — Identify the system of record (where does the authoritative status live?)
| Class | Examples | Typical system of record |
|---|---|---|
| Repo CI | lint, tests, build in PR | GitHub Actions, GitLab CI, Buildkite, Circle, … |
| Mobile cloud build | EAS / Xcode Cloud / … | Vendor build detail page, CLI status, webhook, or CI job that wraps the vendor |
| Deploy / PaaS | Fly, Railway, Vercel, k8s rollout | Provider CLI/API, deploy dashboard, or CI deploy job |
| Publish | npm, stores, artifact registries | Store/CI pipeline status, not "upload started" |
Step B — Pick a completion channel (lowest friction that preserves auditability)
workflow_dispatch).finished / errored when there is no CI wrapper and the vendor is authoritative.Step C — Run the monitor in the background unless the user asked to block the session.
Step D — After completion, fetch failure detail from that same system of record (failed step logs, EAS error page, deploy logs).
Do not default to "must be GitHub Actions" at Step A. Default to: whatever platform actually owns the terminal state for this trigger.
When the authoritative run is a GitHub Actions workflow (push, workflow_run, workflow_dispatch, etc.), use the Wander scripts as the monitor:
# After Wander background process exits, check result:
gh run view <RUN_ID> --json conclusion -q .conclusion
# → "success" | "failure" | "cancelled" | "timed_out"
# If failure, fetch logs for Agent to diagnose:
gh run view <RUN_ID> --log-failed
Task taxonomy — examples (GHA column = when Wander adapter applies directly):
| Task type | Examples | Wander (GHA) |
|---|---|---|
| CI test | lint, unit test, e2e | ✅ When workflow is on GHA |
| Build | Docker, web bundle | ✅ When workflow is on GHA |
| Mobile build | EAS iOS/Android | ⚠️ Often indirect: GHA wrapper or vendor CLI/dashboard |
| Deploy | Railway, Fly, Vercel | ✅/⚠️ CI job or provider-native |
| Release / publish | npm, store upload | ✅/⚠️ Same split as above |
For EAS invoked only via CLI with no GHA: Wander scripts do not apply — use EAS/Expo status (eas build:list, build URL, or project automation) per project docs.
Engine note: The wander repo today implements GitHub Actions polling + notifications. Other backends belong here as additional adapters (future) or as project-specific scripts that follow the same meta protocol.
Scope details: v1 scope: GitHub Actions today.
After triggering a long-running remote task, attach monitoring appropriate to that task's system of record — unless the user opts out or the task is trivially short.
If the triggered work is clearly GitHub Actions (or is wrapped entirely in a GHA workflow the Agent just started):
.workflows.yml if present → pick workflow + timing..github/workflows/ exists → identify the workflow (registry scan or ask), then start monitoring.watch-workflow-bg.sh <workflow.yml> — background unless the user wants to block.<workflow> on GitHub Actions; I'll notify when it finishes — you can keep working."gh run view <RUN_ID> --json conclusion. Do not declare success prematurely.gh run view <RUN_ID> --log-failed (or equivalent) and propose fix.If the work is not GHA (raw EAS CLI, provider-only deploy, etc.):
watch-workflow-bg.sh.If .github/workflows/ does not exist: do not auto-start Wander; choose another monitor per Step A–B above.
gh CLI installed and authenticatedjq installedWANDER_HOME (default ~/code/wander)git clone https://github.com/ERerGB/wander.git ~/code/wander
cd ~/code/wander && chmod +x *.sh
Add to shell rc:
export WANDER_HOME="${WANDER_HOME:-$HOME/code/wander}"
export PATH="$WANDER_HOME:$PATH"
alias wf='watch-workflow.sh'
alias wfbg='watch-workflow-bg.sh'
alias wfdt='watch-workflow-detached.sh'
| Mode | Script | Use case |
|---|---|---|
| Background | watch-workflow-bg.sh | Default. Keep working; get notified. |
| Detached | watch-workflow-detached.sh | Close terminal; logs to ~/.wander_logs/ |
| Foreground | watch-workflow.sh | Block session until done (rare) |
Rule of thumb: prefer background. Use detached for > ~5 min if the terminal may close.
.workflows.yml, GHA)Each workflow has different timing. The registry tells the GHA adapter what to expect:
workflows:
- name: "ci.yml"
description: "Lint + unit tests"
check_window: 180 # grace window if already finished when we start
expected_duration: 45 # typical runtime
category: "smoke"
- name: "build.yml"
description: "Docker build + push"
check_window: 600
expected_duration: 180
category: "build"
- name: "deploy.yml"
description: "Railway deploy"
check_window: 900
expected_duration: 300
category: "deploy"
check_window = if the workflow already finished before monitoring starts, how far back we still accept the run as "ours". Often ~6× expected_duration.
Auto-generate for a repo:
cd /path/to/repo
"$WANDER_HOME/scripts-registry.sh" scan-workflows --auto-scope
Default check_window when unconfigured: 300s.
git push origin main && "$WANDER_HOME/watch-workflow-bg.sh" ci.yml
# scripts/watch-ci.sh
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
WANDER_DIR="${WANDER_HOME:-$(dirname "$REPO_ROOT")/wander}"
exec "$WANDER_DIR/watch-workflow-bg.sh" ci.yml "$@"
Then: git push && ./scripts/watch-ci.sh
If EAS is triggered from a GHA workflow (e.g. eas-build.yml):
git push origin feat/my-branch && "$WANDER_HOME/watch-workflow-bg.sh" eas-build.yml
If EAS is only CLI-triggered: monitor via EAS/Expo-native signals; optional team pattern is still to add a thin GHA workflow_dispatch wrapper if you want one uniform monitor.
gh workflow run deploy.yml --ref main
"$WANDER_HOME/watch-workflow-bg.sh" deploy.yml main
| Scenario | Behavior |
|---|---|
| Workflow finishes before monitor starts | check_window may catch it; notify quickly |
| Run not appearing after ~30s | Wander waits, then exits with guidance |
| Wrong branch filter on workflow | No run found; report and stop |
| Very short workflow | Often caught immediately via check_window |
| Very long workflow | Prefer detached; logs survive terminal close |
gh run view <RUN_ID> --log-failed
gh run rerun <RUN_ID> --failed
For non-GHA tasks, use the same meta rule: pull that platform's primary failure surface (build log, deploy log, etc.).
$WANDER_HOME env var$(dirname "$REPO_ROOT")/wander~/code/wanderThe meta protocol is stable. Adapters are replaceable:
Until an adapter exists, prefer CI-as-facade or vendor-native poll — not silent assumption of success.