Skip to content

Add RunPool extension - #30343

Open
aicayzer wants to merge 10 commits into
raycast:mainfrom
aicayzer:ext/runpool
Open

Add RunPool extension#30343
aicayzer wants to merge 10 commits into
raycast:mainfrom
aicayzer:ext/runpool

Conversation

@aicayzer

@aicayzeraicayzer commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Description

RunPool manages pools of self-hosted GitHub Actions runners on a Mac. The pools are on-demand: they wake within about a minute of a job queueing and stand down once idle, so the machine is not carrying idle runner processes all day.

The extension drives runpool, an MIT-licensed command line tool installable with brew install aicayzer/tap/runpool. It shells out to runpool status --json and never reads the tool's state files, so the JSON is the contract and the layout on disk stays free to change.

Commands

  • Show Runner Pools lists every pool against its owner's GitHub avatar, with how many of its runner slots are busy. Start and stop pools, change how many runners each has, disable local CI, open the log, and drill into the repositories a pool serves.
  • Runner Status keeps a live summary in its own root search subtitle.
  • Runner Status in Menu Bar is off by default. The icon fills to the work in flight, monochrome unless you prefer the colour.
  • Machine Load is off by default. It reports load average against core count, which is what distinguishes a genuinely failing test from a contended machine.

Plus five AI tools, with confirmations on anything that deregisters runners or stops CI from waking.

A couple of notes for review

  • The extension drives a user-installed CLI rather than bundling a binary. If runpool is not on the machine it renders a screen with the install command and a copy action, rather than failing with a toast, since not having it is an ordinary first-run state rather than an error.
  • Background commands read with --local, which skips the GitHub API entirely. A one-minute refresh calling the API would be thousands of requests a day and would make a passive readout fail whenever the network did.
  • Offline is styled neutrally on purpose. It is GitHub's own word for a runner that is not connected, which for an on-demand pool is the normal resting state. Colouring it as a fault would teach people to ignore the colour.
  • The screenshots use invented pools, generated by a fixture in the CLI repo, so no private repositories appear.

Screencast

Runner pools

Checklist

aicayzerand others added 7 commits August 19, 2026 13:28
Manage on-demand self-hosted GitHub Actions runner pools from Raycast.
Three commands: a view listing pools with their live state, a pause and
resume toggle, and a background command keeping a summary in its own
root-search subtitle. No menu-bar command, deliberately.
Wraps the runpool CLI, shelling out to its JSON output rather than reading
its files. The background refresh uses a local-only mode so it makes no
GitHub request on a one-minute timer.
AI tools cover reading pool state and changing capacity, with typed
confirmations on anything that deregisters runners or stops CI waking.
State labels are now Active, Idle and Offline, matching what GitHub shows
on its own runners page. Offline is styled neutrally: it is GitHub's word
for a runner that is not connected, which for an on-demand pool is the
normal resting state, and colouring that as a fault teaches people to
ignore the colour.
Rows carry the owner's GitHub avatar, which makes the organisation versus
personal distinction visible without explaining it.
The standalone toggle command is gone. Disabling local CI stops every pool
waking, so anything pushed afterwards queues with no signal; that is too
consequential to sit one keystroke from root search. It is now an action in
the pools list behind a confirmation.
Adds an optional menu bar command, disabled by default, whose icon is the
mark filled to the proportion of runners awake.
Every surface now shows jobs running out of total runner slots as 2/4, and
the icon fills to that same fraction. Previously the icon filled by runners
awake while the text described work, so a full pool sat next to the word
Idle.
State words are GitHub's own. Unreachable replaces Not registered.
Menu bar is monochrome by default, tinted to the menu bar's text colour, on
tighter assets that read larger at a fixed height. Its rows carry the same
fraction and no header total, which only repeated them.
Adds an optional machine load readout: load against core count, which is
what distinguishes a failing test from a contended machine.
Naming settled as RunPool in prose and lowercase runpool for anything typed
or installed.
Menu bar dropdown rows used the padded pool-* assets in full colour: inset
from the canvas edge they render small and read as misaligned against the
text, and the blue fought with the monochrome bar icon above them. They now
use the tighter bar-* set and follow the same colour preference.
GitHub avatars are masked to a rounded rectangle. A square photograph at
list-item size looks pasted in beside Raycast's own rounded iconography.
Repository rows in the pool detail now carry the owner's avatar too, rather
than a generic book glyph.
The menu bar mark and the dropdown rows both render a little smaller.
Disable Local CI moves up next to the pool's own start and stop, with
capacity below it, since capacity is changed rarely.
Drops the unused padded icon set and the 1024px master, neither of which
the extension referenced.
The meetsCriteria form errors here whatever the criterion says, so the
suite reported 40% while the extension itself was fine. Tool-call
expectations pass 5/5.
@raycastbot

Copy link
Copy Markdown
Collaborator

Congratulations on your new Raycast extension! 🚀

We're currently experiencing a high volume of incoming requests. As a result, the initial review may take up to 15 business days.

Once the PR is approved and merged, the extension will be available on our Store.

@greptile-apps

greptile-appsBot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

The PR adds the RunPool extension, including pool management views, background status commands, menu-bar and machine-load displays, and AI tools for runner operations.

  • Integrates with the user-installed runpool CLI through its JSON status contract.
  • Adds confirmations for destructive capacity and local-CI operations.
  • Includes extension metadata, assets, documentation, and standard build configuration.

Confidence Score: 5/5

The PR appears safe to merge.

No blocking failure remains.

Important Files Changed

FilenameOverview
extensions/runpool/src/hooks/useStatus.tsCentralizes installed-state detection and cached status loading; initial status errors are now surfaced correctly.
extensions/runpool/src/pools.tsxImplements pool listing and management actions with distinct loading, failure, and empty states plus destructive confirmations.
extensions/runpool/src/lib/runpool.tsResolves and executes the external CLI, parses its JSON contract, and now avoids retaining stale executable paths.
extensions/runpool/src/menubar.tsxDisplays background pool utilization and distinguishes an initial status failure from an empty pool set.
extensions/runpool/package.jsonDefines the extension commands, preferences, supported platform, dependencies, and store metadata.

Reviews (4): Last reviewed commit: "Offer 1 to 6 runners, and stop asserting..." | Re-trigger Greptile

Comment threadextensions/runpool/src/pools.tsx Outdated
Comment threadextensions/runpool/src/pools.tsx Outdated
A status call that rejects left the list on its loading view for good
once the failure toast had faded, because the empty state was chosen on
whether data had arrived and never on whether the read had failed. The
menu bar had the same blind spot and drew an empty pool instead.
Shrinking a pool deregisters the surplus runners from GitHub rather than
stopping them, and the AI tool for that operation already confirms it.
The action panel now asks too.
Comment threadextensions/runpool/src/lib/runpool.ts Outdated
Preference values are tied to the moment a command launched and Raycast
does not promise a view command remounts when they change, so the cached
path meant correcting it in preferences and pressing Try Again ran the
same broken executable. That is the one moment it has to work.
The capacity list was 2, 4, 6, 8, which implied a view of what a machine
can take that nothing here has established, and put 1 and 3 out of reach
for no reason. A plain range makes no claim.
The tool input and the AI instructions both stated the one-worker-per-core
argument as established fact. It is the standard argument and it has not
been measured; runpool stats exists to settle it.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

AI Extensionnew extensionLabel for PRs with new extensionsplatform: macOS

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@aicayzer@raycastbot