ao-desktop-dev
Launch, restart, or troubleshoot the real AO Electron desktop app from this repository; run a checkout against isolated or real…
What AO is doing on every host: which sessions are running, waiting on the user, idle or exited, which PRs are ready to merge or got a review, and a daily digest. Read-only. Use for "status", "what's running", "what's waiting on me", "what's ready to merge", "anything stuck",
$ npx -y skills add orchestratorinc/agent-orchestrator --skill ao-status --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/ao-statusContext preview
The summary Claude sees to decide when to auto-load this skill.
What AO is doing on every host: which sessions are running, waiting on the user, idle or exited, which PRs are ready to merge or got a review, and a daily digest. Read-only. Use for "status", "what's running", "what's waiting on me", "what's ready to merge", "anything stuck",
name: ao-status description: >- What AO is doing on every host: which sessions are running, waiting on the user, idle or exited, which PRs are ready to merge or got a review, and a daily digest. Read-only. Use for "status", "what's running", "what's waiting on me", "what's ready to merge", "anything stuck", and the AO daily digest routine.
Follow the ao-rules skill. Read-only in AO: it never marks anything read there. It keeps its own seen list in `~/.ao-grok/` on each `via` computer. Run on every host in the **AO hosts** note, in parallel, each from its `via` computer with the `aoapi` helper (set `AO_REMOTE_BASE` and `AO_REMOTE_HEADER` for remote hosts). If memory has no **AO hosts** note, run ao-setup first. Don't save hosts without the user's yes.
f(){ <aoapi helper>; aoapi GET 'sessions?active=true' | python3 -c '
import json,sys
for s in json.load(sys.stdin)["sessions"]:
a=s.get("activity") or {}
print("\t".join([s["id"], s.get("kind",""), a.get("state",""), str(len(s.get("prs") or [])), (s.get("displayName") or "")[:60]]))'; }; fColumns: id, kind (`orchestrator` or `worker`), state, PR count, name. States:
| State | Say | |---|---| | `active` | running | | `waiting_input`, `blocked` | waiting on you | | `idle` | idle: finished its turn, or not started | | `exited` | the agent exited; it can be resumed (ao-actions) |
For what's waiting on the user, run ao-answer "Find what's waiting": it finds sessions in `waiting_input` or `blocked`, and idle sessions whose last reply asked the user a question. Never use notifications for it. Group by host, then by project (the session id starts with the project id).
Keep the reply short enough for a phone, at most 6 lines: first what needs the user, then what's running, then one line per host with counts (for example "MacBook Pro: 25 idle, 9 exited"). Name a session only when it needs the user or is running. Leave out idle orchestrators, PR numbers and exited sessions unless asked. Report what you saw; don't guess why (a crash, a restart) unless the user asks.
f(){ <aoapi helper>
aoapi GET 'notifications?status=unresolved' | python3 -c '
import json,sys
for n in json.load(sys.stdin)["notifications"]:
if n.get("type")=="ready_to_merge": print("\t".join(["ready_to_merge", n.get("sessionId",""), n.get("prUrl",""), (n.get("title") or "")[:80]]))'
SEEN="$HOME/.ao-grok/<host name>.seen-news"; mkdir -p ~/.ao-grok; touch "$SEEN"
aoapi GET 'notifications?status=unread' | python3 -c '
import json,sys
seen=set(open(sys.argv[1]).read().split()); new=[]
for n in json.load(sys.stdin)["notifications"]:
if n.get("type") in ("review_completed","review_changes_requested","pr_merged","pr_closed_unmerged") and not n.get("resolvedAt") and n.get("id") not in seen:
new.append(n["id"]); print("\t".join([n["type"], n.get("sessionId",""), n.get("prUrl",""), (n.get("title") or "")[:80]]))
open(sys.argv[1],"a").writelines(i+"\n" for i in new)' "$SEEN"
tail -n 500 "$SEEN" > "$SEEN.tmp" && mv "$SEEN.tmp" "$SEEN"; }; fFor "what is <session> doing": find it (ask which host if the id is on two hosts), then read its last turn:
f(){ <aoapi helper>; aoapi GET "sessions/<id>/history?offset=0&limit=1" | python3 -c '
import json,sys
t=(json.load(sys.stdin).get("turns") or [{}])[0]
print("asked:", (t.get("userRequest") or "")[:500]); print("replied:", (t.get("agentResponse") or "")[-1500:])'; }; fSummarise in two or three lines. For "catch me up on <project>", ask the project's orchestrator instead (ao-orchestrator). It has the workers' reports.
The **AO daily digest** routine runs this skill. Per host: what finished since the last digest (idle sessions with `lastEventAt` since then), what's waiting on the user, what's ready to merge, and anything exited unexpectedly. Skip quiet projects. Send nothing if nothing happened and nothing is waiting. Write the time of this digest to `~/.ao-grok/<host name>.last-digest` on `via` and read it next time, instead of keeping it in memory.
Plan, run and supervise fleets of agents from task to merged PR. Desktop (macOS, Windows, Linux) + iPhone & Android apps. Supports Claude Code, Codex & 35+ coding agents.
Launch, restart, or troubleshoot the real AO Electron desktop app from this repository; run a checkout against isolated or real…
Help clarify human bug reports, search for duplicates, and gather diagnostic evidence separately from a concise issue draft.
Direct actions on one AO session or PR: stop or interrupt, resume, merge a PR, start a review, screenshot a session's browser,…
Find AO sessions that wait on the user, show each question or approval as tap-to-answer options, and send the answer back to that…
Talk to a project's AO orchestrator: pass the user's request to it, wait for its reply and relay it. The default route for…
Shared rules and the connection helper for every ao-* skill (run Orchestrator from chat). Read before running any ao-* skill.