Borrowing it
Nothing to install: this file belongs to littlebearapps/untether. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/littlebearapps/untether/master/.claude/commands/pr-main.mdgit clone --depth 1 https://github.com/littlebearapps/untetherWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/commands/littlebearapps/untether/pr-main)<a href="https://agentmods.dev/commands/littlebearapps/untether/pr-main"><img src="https://agentmods.dev/badge/commands/littlebearapps/untether/pr-main/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/commands/littlebearapps/untether/pr-main"><img src="https://agentmods.dev/badge/commands/littlebearapps/untether/pr-main.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00111 | $0.02923 |
| Opus 5.5 | $0.00044 | $0.01169 |
| Sonnet 5.5 | $0.00022 | $0.00585 |
| Haiku 4.5 | $0.00011 | $0.00292 |
Grade A, and why
pr-main scanned grade A with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 18d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Makes network callslowCapability
Not a fault in itself. Listed so you know the mod talks to something, and to what.
exist; PyPI serves it (`curl -s https://pypi.org/pypi/untether/json | jq -r How it starts
The opening of the file, as written. The whole thing — 193 lines — stays where its author put it; the contents beside it link to each section on GitHub.
You are handling /pr-main. /pr-main prepares a stable release and opens
the dev→master PR — then STOPS. The release itself (merging that PR →
auto-tag-on-master.yml → release.yml → PyPI) happens only when Nathan
explicitly approves it: then /pr-main X.Y.Z --merge merges and verifies the
publish (#917).
User input: $ARGUMENTS
Untether adaptations (read first)
Load .claude/rules/workflow-commands.md (routing + cross-cutting rules) and
.claude/rules/release-discipline.md (semver, changelog format, FAQ, staging vs
release). Key points:
- Authority boundary (mirrors
release-guard.sh).gh pr create --base masteris allowed. Merging thedev→masterPR is allowed only after Nathan explicitly approves this release in the conversation ("merge it", "release X.Y.Z"), and only asgh pr merge <n> --squash --admin. The guard then checks the head isdevand CI is green, and asks Nathan to confirm in the permission prompt. A finished/pr-main X.Y.Z, a green CI or an earlier approval of a different version is NOT approval.git push master,git tag v*,gh release createand--delete-branchstay forbidden — the release pipeline tags and publishes. Never work around a block. - The version-bump commit lands on
dev(pushing todevis allowed;masteris not). The PR isdev→master. fleet-rollout.sh X.Y.Zruns only after PyPI has the version, and only when Nathan asks (it's a separate step from the merge). The attestation marker gates it.- Confirm-gated + idempotent. Surface the PR title + body and wait for a tap;
a re-invoked
/pr-mainmust not double-open the release PR (check for an existing opendev→masterPR first). - Untether-mode. State the confirmation in text and STOP for a reply. Keep the report brief.
Sub-commands
| Form | Action |
|---|---|
/pr-main X.Y.Z |
Prepare the stable release + open the dev→master PR, then STOP |
/pr-main X.Y.Z --merge |
Only after Nathan's explicit go: merge the open release PR (ask-gated) + verify the PyPI publish (M-8) |
/pr-main X.Y.Z --dry-run |
Prepare + validate + print the would-be PR body; open nothing |
/pr-main --rc-summary |
Finalise the (unreleased) CHANGELOG section (M-3) + validate only; no bump, no PR |
/pr-main --help |
Usage, then stop |
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 18d ago Changed · +57 lines · +12 tokens per session 023d13dc187c
- 1mo ago First seen · 136 lines · 99 tokens per session scan A d5381771150b
pr-main is a command published in the GitHub repository littlebearapps/untether (74 stars, last pushed today), licensed MIT. It adds 111 tokens to every session and 2,923 once invoked, about $0.0004 per session on Opus 5.5. A static security scan graded it A with 1 finding (makes network calls). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other commands, from other repositories
publish
Publish oh-my-opencode to npm via GitHub Actions workflow.
get-unpublished-changes
Compare HEAD with the latest published npm versions and list all unpublished changes by release layer.
release
Run the iPolloWork release flow.
release
Verify, write the CHANGELOG, cut a version — then hand the release sequence back.
day-one-patch
Prepare day-one patch for launch.
team-release
Orchestrate release deployment team.