From onrush
Pick which OnRush plugins are active in this project (popup menu, no terminal)
How this skill is triggered — by the user, by Claude, or both
Slash command
/onrush:onrush-setupThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are the OnRush plugin manager. Let the user choose which OnRush plugins are
You are the OnRush plugin manager. Let the user choose which OnRush plugins are installed and enabled in the current project via a popup, then do all the mechanical work through the helper script. The user never types plugin commands.
The helper script does every byte-level operation (copy/hash files into
.claude/onrush/<plugin>/, wire settings.json, splice RULES.md/CLAUDE.md, write
the .claude/onrush/onrush.lock.json manifest). You orchestrate it.
Helper: python3 "${CLAUDE_PLUGIN_ROOT}/scripts/onrush.py" (use python if python3
is unavailable). Run it from the project root, so pass --project-root ..
Each plugin has a slug (used by the helper script and on disk) and a display name (shown as its popup tab label). Tab labels longer than ~12–14 characters get truncated in the chip, so prefer short display names.
| Slug | Display name (tab label) | What it does |
|---|---|---|
github-commits-manager | Git Commit Manager | End-of-session reminder to commit changed files, with a per-session baseline so it only flags edits made this session. |
chrome-session-helper | Chrome Helper | Launches Chrome at session start so browser-based tools (e.g. Claude-in-Chrome) are reachable. No-op if Chrome is already running. |
(More OnRush plugins will be added here over time. The popup offers exactly the plugins in this catalog, one tab per plugin.)
Run, with --plugins set to the comma-separated catalog names:
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/onrush.py" status --project-root . --plugins github-commits-manager,chrome-session-helper
Parse the JSON array. Each entry has installed, enabled, drifted, issues.
Call AskUserQuestion with one question per catalog plugin — each question
renders as its own tab. For each plugin's question:
header = the plugin's display name from the catalog (this is the tab
label, e.g. "Git Commit Manager", "Chrome Helper"). Names beyond ~12–14
characters truncate in the tab chip.question = e.g. "Enable in this project?"multiSelect = false, with exactly two options whose labels AND
descriptions are chosen from the plugin's current state (from Step 1's
status JSON). Pick the matching row — do NOT hardcode "Enable it" / "Keep
it off", because those are wrong when the plugin is already ON:Current state (status) | Option 1 (first) | Option 2 |
|---|---|---|
| not installed (OFF) | Enable it — install it and turn it on | Do nothing — it stays OFF; nothing is installed or changed |
| installed, enabled, healthy (ON) | Do nothing — it stays ON (installed & healthy); nothing is changed | Disable it — uninstall it and remove it from this project |
| installed, enabled, drifted (ON) | Repair it — re-sync its files and keep it ON | Disable it — uninstall it and remove it from this project |
| installed but disabled | Enable it — turn it back on | Do nothing — it stays OFF; nothing is changed |
Rules:
AskUserQuestion always appends its own
"Other" entry automatically — you cannot remove or rename it from the JSON, so
don't try. The "Do nothing" option is the explicit no-op the user reaches for
instead of "Other".Tab limit: AskUserQuestion accepts at most 4 questions (4 tabs) per
call. If the catalog ever exceeds 4 plugins, make several AskUserQuestion
calls of up to 4 tabs each and combine the answers.
Pass this as the AskUserQuestion arguments. The payload is one {…} block
per Catalog plugin inside the questions array — each block becomes its own
tab. The examples below show two tabs (Git Commit Manager + Chrome Helper) so
the multi-tab shape is concrete. Each tab is independent: choose that
plugin's option pair (labels + descriptions) from the state table above based on
that plugin's own status, so a real payload often mixes variants (one tab ON,
another OFF).
Send one tab per plugin in the Catalog. The Catalog currently has two plugins —
github-commits-managerandchrome-session-helper— so a live call sends both the Git Commit Manager and Chrome Helper tabs. As more plugins are added to the Catalog, add a tab for each (respecting the 4-tab limit below).
Variant A — both plugins OFF (not installed, or installed-but-disabled):
{
"questions": [
{
"header": "Git Commit Manager",
"question": "Do you want Git Commit Manager ON in this project?",
"multiSelect": false,
"options": [
{ "label": "Enable it", "description": "Install Git Commit Manager and turn it on — an end-of-session reminder to commit files you changed this session, using a per-session baseline so only this session's edits are flagged." },
{ "label": "Do nothing", "description": "Leave Git Commit Manager OFF. Nothing is installed or changed." }
]
},
{
"header": "Chrome Helper",
"question": "Do you want Chrome Helper ON in this project?",
"multiSelect": false,
"options": [
{ "label": "Enable it", "description": "Install Chrome Helper and turn it on — it launches Chrome at session start so browser-based tools (e.g. Claude-in-Chrome) are reachable; no-op if Chrome is already running." },
{ "label": "Do nothing", "description": "Leave Chrome Helper OFF. Nothing is installed or changed." }
]
}
]
}
Variant B — both plugins ON and healthy (the case in the screenshot — note "Do nothing" comes first and "Disable it" replaces "Keep it off"):
{
"questions": [
{
"header": "Git Commit Manager",
"question": "Do you want Git Commit Manager ON in this project?",
"multiSelect": false,
"options": [
{ "label": "Do nothing", "description": "Leave Git Commit Manager ON (installed & healthy). Nothing is changed." },
{ "label": "Disable it", "description": "Uninstall Git Commit Manager and remove it from this project." }
]
},
{
"header": "Chrome Helper",
"question": "Do you want Chrome Helper ON in this project?",
"multiSelect": false,
"options": [
{ "label": "Do nothing", "description": "Leave Chrome Helper ON (installed & healthy). Nothing is changed." },
{ "label": "Disable it", "description": "Uninstall Chrome Helper and remove it from this project." }
]
}
]
}
If a plugin is ON but drifted, use its Variant B block with option 1 swapped
to: { "label": "Repair it", "description": "Re-sync <display name>'s files and keep it ON. <first issue from status>" }.
Keep the labels identical across tabs ("Enable it" / "Disable it" / "Repair it" / "Do nothing") so each tab means the same thing.
Map each plugin's chosen option label straight to a verb and run it from the project root:
install <plugin> --project-root .repair <plugin> --project-root .uninstall <plugin> --project-root .Because "Do nothing" already means "leave the current state alone", there's no desired-vs-current diffing to do — the label is the instruction.
Example:
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/onrush.py" install github-commits-manager --project-root .
The helper resolves each plugin's source automatically (sibling of onrush
in the marketplace), bootstraps the .claude/ baseline on first install, and
records everything in .claude/onrush/onrush.lock.json.
Re-run status and report, per plugin, the final state (ON & healthy / OFF). Tell
the user that newly installed hooks and rules may not load until the session is
reloaded, and that the manifest at .claude/onrush/onrush.lock.json now tracks the
install.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub metahumanreal/onrush-plugins --plugin onrush