repothing Get in touch

Every repo · every agent · one command

Know what's going on in every repo.

With agents working across dozens of repositories, nobody knows what's uncommitted, what's unpushed, or whether an agent could wreck a default branch. repothing is a CLI that answers all of it, and the place every git chore ends up.

Act I

By hand, across every repo.

Three agents worked overnight across a couple of dozen repositories. Before you trust any of it, you need to know what they left behind.

01 · What changed?

A loop, and a lot of reading.

git status in every folder, then reading down a wall of paths to spot which repos have something in them.

~/src
$ for d in ~/src/*/; do echo "== $d"; git -C "$d" status -s; done
== ~/src/booking/
== ~/src/hostingthing/
== ~/src/iacthing/
M roles/proxy.nix
M hosts/prod01/configuration.nix
?? notes.md
== ~/src/shop/
M lib/shop/checkout.ex
… 19 more

02 · Is it pushed?

Then, is any of it pushed?

A clean folder isn't a safe one. Commits that were never pushed, on a branch an agent made at 3am, live on one disk.

~/src
$ git -C shop log --oneline @{u}..
fatal: no upstream configured for branch 'agent/fix-login'
$ git -C hostingthing log --oneline @{u}..
9e1f0c2 sites: render after the kit change
4b136f1 leave a note on where the kit stands
# two commits nobody pushed. one disk from gone.

03 · Could it break main?

Then, could an agent break main?

An agent's credential is yours, so it can force-push or delete anything you can. Protection is a settings page, one repository at a time.

git-forge.example/you/shop/settings/rules/new
you/shop Settings · Rules · New ruleset
Name agent-safety
Target Default branch
Rules Block force pushes · Restrict deletions · Require a pull request
Create
Ruleset created for you/shop.
21 repositories to go. New ones start unprotected.

04 · What needs me?

Then, which pull requests need you?

One list per repository, and working out for each one whether it's waiting on you, on CI, or on the agent that opened it.

~/src
$ gh pr list -R you/shop
41 fix login redirect agent/fix-login OPEN
38 fix login (wip) agent/fix-login DRAFT
$ gh pr list -R you/iacthing
17 www for every site agent/caddy-www OPEN
# twenty more repositories. is 38 a duplicate of 41?

That was four repositories, of twenty-two.

commands
5
repositories checked by hand
6
things you'd have missed
3
protected from the agents
1

Here's the same morning, with repothing.

Act II

The repothing way.

One CLI, one command per chore. These are the real commands and the real shape of what they print.

01 · check

Everything unsaved, in one table.

Every repository under a root: branch, unpushed commits, uncommitted and untracked files, and why it needs you. It exits non-zero when anything does, so it can run as a watchdog.

~/src
$ repothing check
REPO BRANCH AHEAD DIRTY UNTRACKED NOTE
booking main 0 0 0
* hostingthing main 2 0 0 unpushed
* iacthing agent/caddy-www 0 2 1 uncommitted
* shop agent/fix-login 0 1 0 no upstream
nix-config main 0 0 0
3 of 5 repositories hold work that is not committed or not pushed

02 · lock

Every repo, protected from its agents.

The hardening is declared once: no force pushes and no deletions on the default branch or tags, and changes land as pull requests. lock dry-runs by default and says plainly when it can't.

~/src
$ repothing lock
you/booking locked
you/shop would add agent-safety, agent-safety-tags
you/hostingthing would add agent-safety-tags
you/iacthing cannot: Upgrade to GitHub Pro or make this repository public to enable this feature.
1 locked, 2 would change, 1 cannot, 4 archived skipped

03 · prs

The review queue, across everything.

Every open pull request in one list, ordered by what needs you first, and a flag when one branch carries two of them. It never merges or approves anything.

~/src
$ repothing prs
REPO PR BRANCH STATE UPDATED NOTE
you/shop 41 agent/fix-login needs review 2h
you/iacthing 17 agent/caddy-www ci failing 5h
you/booking 9 agent/receipts changes requested 1d
you/shop 38 agent/fix-login draft 3d 2 open on this branch
4 open: 2 waiting on you, 2 waiting on the author

04 · And the next chore

Where every git chore ends up.

It's a prototype, and it grows the same way: each chore that's tedious or easy to get wrong by clicking becomes one more boring, dry-run-first command.

~
$ repothing help
repothing - repo automation
usage: repothing <command> [flags]
commands:
check report uncommitted and unpushed work across local repositories
lock reconcile repositories with the declared hardening
prs the review queue: open pull requests and what they are waiting on
run "repothing <command> -h" for a command's flags.

Act III

How it holds up.

Three habits keep a tool like this safe to run across everything you own.

  1. 1

    Dry-run by default

    Anything that changes something reports first and acts only with --execute. Read-only commands stay read-only.

  2. 2

    A watchdog, not a chore

    check exits non-zero when work is at risk, so it can run on a timer and complain, instead of waiting for you to remember it.

  3. 3

    Honest about limits

    Where the plan or the platform refuses, it says "cannot" and why. A repository the policy covers but can't protect is the finding, not a footnote.

The morning after the agents, both ways
Question By hand repothing
What's uncommitted or unpushed? a loop and a lot of reading check
Can an agent break main? a settings page per repo lock
What needs my review? a list per repo prs
A new repository starts unprotected covered on the next lock

Running agents across your repos?

Tell me which chores eat your mornings. repothing is where they go.

Get in touch