Monitor GitHub Actions runs and extract failure diagnostics. Use when watching PR CI, branch builds, or specific workflow runs.
Scanned 5/28/2026
Install to Claude Code
npx -y skills add bendrucker/claude --skill actions-monitor --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Actions Monitor?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/bendrucker-actions-monitor)More formats (shields.io, HTML) on the badges page.
---
name: github:actions-monitor
description: Monitor GitHub Actions runs and extract failure diagnostics. Use when watching PR CI, branch builds, or specific workflow runs.
allowed-tools:
- Monitor
- TaskStop
- Agent
- Bash(bun:*)
- Bash(gh run:*)
- Bash(gh pr view:*)
- Bash(gh pr checks:*)
- Bash(git remote:*)
- Bash(jq:*)
---
# Actions Monitor
Watch a PR, a branch, or a specific run's GitHub Actions progress and react to failures by pulling logs through the `github:logs` agent. The monitor handles state tracking, deduplication, and the initial-green fast path; this skill is the thin coordinator that starts it, reacts to events, and stops it.
## Target
`$ARGUMENTS`
Accepted forms:
- A GitHub PR URL (e.g. `https://github.com/owner/repo/pull/42`) runs in **PR mode**.
- A branch name (e.g. `main`) runs in **branch mode**. The script infers the repo from `git remote get-url origin` in the current directory; pass `--repo <owner/repo>` to override.
- A run ID (e.g. `12345678`) runs in **run-id mode**, watching a specific workflow run directly. Covers `workflow_dispatch`, manually-triggered, and re-run cases where the exact run ID is known. The script infers the repo from the git remote; pass `--repo <owner/repo>` to override.
- No argument: derive the current PR from the current branch with `gh pr view --json url --jq '.url'`. If the current branch has no PR, fall back to branch mode with the current branch name.
## Workflow
#### Start the monitor
Invoke `Monitor` with `persistent: true` on the watch script. Pick a mode by flag:
PR mode:
```
bun ${CLAUDE_SKILL_DIR}/scripts/watch.ts --pr <pr-url>
```
Branch mode:
```
bun ${CLAUDE_SKILL_DIR}/scripts/watch.ts --branch <name> [--repo <owner/repo>]
```
Run-id mode:
```
bun ${CLAUDE_SKILL_DIR}/scripts/watch.ts --run-id <id> [--repo <owner/repo>]
```
Exactly one of `--pr`, `--branch`, or `--run-id` must be set. `--repo` applies to branch mode and run-id mode and is inferred from the git remote when omitted.
Optional flags: `--interval <seconds>`, `--max-minutes <N>`, `--queued-timeout <minutes>`, `--api-error-threshold <N>`. Omit `--interval` to let the script derive one from recent run durations in PR/branch mode; run-id mode uses a 180s default.
#### Event schema
The script emits one JSON object per line on stdout:
- `{"type":"status","state":"running|failing|success","sha":"...","run_id":"..."}`
- `{"type":"conflicts","sha":"..."}` (PR mode only)
- `{"type":"queued-timeout","minutes":N}`
- `{"type":"api-error","consecutive":N}`
- `{"type":"rate-limited","retry_after":"..."}`
- `{"type":"pr-closed"}` (PR mode only)
- `{"type":"max-time-reached","minutes":60}`
`conflicts` and `pr-closed` fire only in PR mode; run-id and branch mode never emit them. The script exits on `status:success`, `pr-closed`, and `max-time-reached`. In run-id mode it also exits on `status:failing`, since a specific run reaches a terminal conclusion and there is no "next run" to wait for. In PR and branch mode, `failing` is not terminal (the user may push a fix or start another run).
#### React to status:failing
On a `status` event with `state == "failing"`, invoke the `github:logs` agent via the `Agent` tool. Pass the `run_id` and the PR URL (or branch name in branch mode) from the event:
```
Agent({
subagent_type: "github:logs",
model: "haiku",
prompt: "Fetch failing-job logs for run <run_id>. Return the structured JSON summary."
})
```
Use the agent's JSON response to report failures to the user. The agent persists the raw logs to a known temp path; read that file if you need more context.
#### React to other events
- `conflicts` (PR mode): note the conflicting SHA; the caller (e.g. `pull-request:babysit`) decides whether to resolve.
- `queued-timeout`: surface to the user that a run has been queued past the threshold.
- `api-error`: surface repeated CLI failures so the user can intervene.
- `rate-limited`: back off or stop; retry once the window passes.
- `pr-closed` (PR mode): the PR was merged, closed, or the branch was deleted. The script exits on its own.
- `max-time-reached`: the wall-clock cap fired. The script exits on its own.
#### Initial-green case
No separate path. If the target is already green at startup, the script emits a single `status:success` event and exits. Report that the target is green and stop.
#### Stopping
The monitor exits naturally on `status:success`, `pr-closed` (PR mode), `status:failing` (run-id mode only), or `max-time-reached`. To stop early, call `TaskStop` on the monitor task.
## References
Log parsing strategy (shared with `github:logs`): [references/log-parsing.md](references/log-parsing.md).
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!