Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add plumbkit/plumb --skill plumb-gitgit clone --depth 1 https://github.com/plumbkit/plumbWrote 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/skills/plumbkit/plumb/plumb-git)<a href="https://agentmods.dev/skills/plumbkit/plumb/plumb-git"><img src="https://agentmods.dev/badge/skills/plumbkit/plumb/plumb-git/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/skills/plumbkit/plumb/plumb-git"><img src="https://agentmods.dev/badge/skills/plumbkit/plumb/plumb-git.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.00056 | $0.02660 |
| Opus 5.5 | $0.00022 | $0.01064 |
| Sonnet 5.5 | $0.00011 | $0.00532 |
| Haiku 4.5 | $0.00006 | $0.00266 |
Grade A, and why
plumb-git scanned grade A with 0 findings 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 7d 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.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 88 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Plumb's git tool is a policy-gated wrapper, not a shell. The subcommand leads the argv, nothing is interpolated by a shell, and eight global flags that could re-target the repository or inject config are refused wherever they appear in args: -c, -C, --exec-path, --git-dir, --work-tree, --namespace, --upload-pack, --receive-pack. The one exception is switch, where -c / -C mean create-branch rather than anything global: they are rewritten to --create / --force-create before the denylist runs, and the response says so. Prefer this tool over shelling out — the shell path bypasses the policy and plumb's per-repository git lock.
Under a lean tool profile file_status and minimal_diff_review are not advertised; set [tools] profile = "full" in .plumb/config.toml to see them.
The four tiers
| Tier | Subcommands | Gate |
|---|---|---|
| read | status, log, diff, show, blame, shortlog, check-ignore, merge-tree, check-attr, cherry, ls-files, grep |
always allowed |
| write | add, commit, mv |
[git] allow_writes |
| destructive | reset, clean, rebase, revert, cherry-pick |
[git] allow_destructive and a confirmation |
| network | push, fetch, pull |
[git] allow_push and a confirmation |
rm is refused at every tier: delete the file with delete_file, then stage the deletion with add.
Because the read tier is always on, a read verb's options that would do anything but read this repository are refused. --output (on diff, log, show, shortlog, blame and stash show) writes a file. grep -O runs a pager. --no-index, blame --contents, blame -S / --ignore-revs-file, grep -f, ls-files -X and -O<orderfile> read files outside the repository. So does any argument that names an existing path outside it — including a search pattern such as /usr, which you can anchor (^/usr) to get past the check. Use git grep <pattern> <rev> to search a past revision, ls-files to ask whether a path is tracked, and cherry -v <upstream> to see which commits are already upstream after a squash merge.
Eight subcommands are classified by their arguments, biased towards the safer-to-deny higher tier — so the same subcommand can land in different tiers on different calls. Options are read as git reads them: an abbreviation (--disc), a bundle (-dr) or a value (tag -m -d) counts exactly as git counts it:
checkout -b(branch creation) is write; every othercheckoutis destructive, since it can discard the working tree or detach HEAD — including-Bon a branch that already exists (on a new, plain-named branch-Bgiven once is a write). Preferswitchfor a safe branch change.switchis write, butswitch -f/--force/--discard-changesand-C/--force-createon a branch that already exists are destructive (on a new, plain-named branch-Cgiven once is a write; a name git expands, such as@{-1}, is not plain).restore: with--staged(the index only) it is write; with--worktree, or with no flag at all, it is destructive.branch:--list/-l/-a/-r/--show-current/--contains/--merged/--points-at, and a barebranch(-vincluded), are read — a later--no-listcancels list mode; creating,-m/--move/--copyand the upstream/description options are write;-d/--deleteand every forced form (-f/--force,-M,-C— also inside a bundle such as-qC— and-D) are destructive whether or not the branch exists. Unlikecheckout -B,switch -Candtag -f, a forcedbranchis never lowered to a write for a new name; to start a branch, usebranch <name>,checkout -borswitch -c.tag:-l/--list/-n/--contains/--merged, and a baretag, are read; creating is write;-d/--delete, and-f/--forceon an existing tag, are destructive (on a new, plain-named tag-fgiven once is a write).stash:list/showare read; a barestashpluspush/save/pop/apply/create/storeare write;drop/clearare destructive; any other sub-subcommand is refused with the permitted list.merge(--no-ff,--ff-only,--no-edit,-m <message>,<ref>) is write, likecommit, and runs the merge hooks;--abort/--quitare destructive.--continue,--no-verify,-e/--editand-F/--fileare refused: conclude a merge withcommitand a message instead. A merge that stops on conflicts names the conflicted files and leaves git's merging state: resolve,add, thencommit.worktree:listis read;add,remove,lockandunlockare write;move,pruneandrepairare destructive, as areadd -B(which resets a branch) andadd -f(which lets two worktrees hold one branch).add,moveandremoveare confined to the workspace — an outside path is refused outright, andconfirmdoes not lift it — andremoveneedsconfirm: trueonly when it would discard something: uncommitted work, or a detached HEAD whose commits no branch, tag or remote reaches.
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.
- 7d ago Changed · +2 lines 65a7e9630935
- 8d ago Changed · +1 lines 14fe4383ebc4
- 18d ago Changed · +5 lines e793187fa491
- 1mo ago First seen · 80 lines · 56 tokens per session scan A 6c895dce0474
plumb-git is a skill published in the GitHub repository plumbkit/plumb (4 stars, last pushed yesterday), licensed MIT. It adds 56 tokens to every session and 2,660 once invoked, about $0.0002 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
vhs-e2e-gif
Record a test run, a TUI session, or any terminal command as a GIF with VHS and attach it to a GitHub PR as a release-hosted asset, never a repo commit. Use when asked to record an e2e run, demo a fix on a PR, attach a GIF or screen recording to a pull request, show a test passing visually, or produce a terminal…
check-linters-before-commit
Before any commit, run linters, vet, tests, and build verification; do not commit until checks pass.
pi-sync
Daily upstream-sync job for the pi Go port — fetch upstream pi, triage every change since the recorded pin, port what's in scope, verify idiomatic + parity via independent reviews, update the ledger, and push. Use for "sync with upstream", "porting job", or as the scheduled daily run.
yaml
Validate and understand schema-backed YAML (Kubernetes, Flux, and JSON-Schema configs) with the yayamlls language server. Use when editing or reviewing .yaml/.yml files, diagnosing schema validation errors, configuring .yayamlls.yaml, suppressing a diagnostic, or working with Flux HelmRelease / Kustomization rendering.
repo-hygiene
Use when the scheduled repo-hygiene workflow runs from GitHub Actions (or an operator dry-run) to scan the repository for small, certain docs/test/code hygiene issues and fix them as one batched branch.
create-issue
Draft and submit a GitHub issue from a user idea or bug description, with bilingual body and correct labels.