Beagle's command language is a small, fixed set of HTTP verbs — GET, HEAD, POST, PUT, DELETE, PATCH — chosen to combat git's command and flag sprawl. Nobody remembers all of git, so these verbs are kept orthogonal: each has one clear function and a single direction of data flow, and none can be supplemented by creative use of another. You pick the verb for the move you want, then each URI slot adds its own effect.
Pick the verb, then each populated URI part adds its own effect; the same four slots — ?branch, ./path, //remote, #frag — combine the same way across every verb.
?branch: HEAD/GET scope or switch; POST FF-advances; PUT names the ref; PATCH sources from it; DELETE drops it../path: scopes the diff (HEAD), restores a file (GET), stages (PUT), unlinks (DELETE), or scopes absorption (PATCH).//remote: cached by default; a transport scheme (ssh:) opens the wire to fetch (GET/HEAD/PATCH) or push (POST/PUT).#frag: a sha pin or a commit-message body; PATCH takes no #message, and the ! bang on ?br selects whole-branch vs one commit.?branch defaults to cur; cross-branch commits don't exist — switch cur first, then commit there.A bare token with no URI markers lands in each verb's natural slot, so the common case needs no punctuation.
be post fix ≡ be post '#fix'); HEAD/PATCH → query branch (be head main ≡ ?main).be get file.c vs be get feat).be put file.c, be delete README, be file.c opens it in bro)./, ?, #, or a scheme bypasses the default and parses as a URI.The everyday git commands map onto verb + URI combinations, no extra flags; the dirty-words post derives the merge/rebase/squash/cherry split.
git clone URL → be get ssh://URL; git fetch → be head ssh://origin?*; git checkout feat → be get ?feat.git checkout -b feat → be put ?./feat && be get ?./feat (mkdir, then cd).git add f && commit -m → be put ./f && be post '#msg'; git commit -am → be put . && be post 'msg'.git merge trunk → be patch ?trunk! && be post '#sync'; git cherry-pick <sha> → be patch '#<sha>' && be post #!.git rebase feat → loop be patch ?feat && make test && be post #!; git merge --squash feat → be patch ?feat! && be post '#msg!'.git push → be put ssh://origin; git branch -d feat → be delete ?feat; git status → bare be.git stash → use a sub-branch (eager branching); git log -n 20 feat → be log:?feat#20.