your test agents will run away.
tman won't let them.
A single NativeAOT binary that supervises every process it launches — killing runs that have genuinely hung, capping time, memory, and CPU when you ask it to, and automatically reaping the orphans your LLM agents leave behind when they hang, get distracted, or your machine suspends.

$ tman run --max-time 10m --max-mem 2g -- npm test # hangs? killed. leaks? culled. runner dies? orphan reaped next invocation.
what it does
--max-time / --stall
Wall-clock limits, plus stall detection that needs silence and an idle process tree — so quiet-but-working runs like go test survive. Exit 124 or 125.
--max-mem / --max-cpu
Opt-in resource culling. Breach the memory ceiling, measured across the whole process tree, or sustain high CPU, and the tree is killed — exit 126.
orphan reaper
Machine suspended? Agent crashed? Every tman command reaps children whose runner died and prunes expired records — and a bucket held by a dead runner is free the moment the kernel drops its lock. Nothing drains your system overnight.
--max-parallel
Resource-gated multi-process runs, scoped per name-and-directory bucket. Each run holds a slot file exclusively, so excess runs queue instead of stampeding your cores even when they launch at the same instant — and one repo never starves another.
--name dedup
Duplicate processes never start. Same-name runs in the same directory refuse by default, or --replace kills the old one and waits for it to hand the name back.
.tman.kdl aliases
Folder-level aliases with per-alias caps. Repo-root shims make ./test route through supervision transparently.
Claude Code hook
An agent that runs npm test directly bypasses your shims. Registered as a PreToolUse hook, tman rewrites those bare commands to run supervised — and never blocks one: anything uncertain passes through untouched.
install
# npm $ npm install -g @standardbeagle/tman # or the shell one-liner $ curl -fsSL https://raw.githubusercontent.com/standardbeagle/tman/main/install.sh | sh # prebuilt binaries for linux-x64/arm64, win-x64, osx-arm64/x64 on every release
adopt in a project
$ cd your-project $ tman init --shims --gitignore # auto-detects npm / pytest / go / make $ ./test # now supervised: 30m stall backstop, dedup + parallel gating
~3.8 MB native binary · no dependencies · cross-platform
wire it into your AI coding agent
Shims catch commands that go through a shell. An agent calling a Bash tool withnpm test walks straight past them — so each agent gets its own guide, because what tman can do depends on whether that agent's pre-tool hook can replace a command or only allow and deny it.
Claude Code
Native PreToolUse rewrite — tman ships the hook, no adapter needed.
Codex CLI
Same PreToolUse payload as Claude Code — the shipped hook drops straight in.
Gemini CLI
BeforeTool hook merges a replacement command into the tool arguments.
opencode
A plugin mutates the bash tool's arguments in tool.execute.before.
Cursor
beforeShellExecution can allow, ask, or deny — but not rewrite.
Antigravity
PreToolUse gates run_command; hooks receive the call but cannot modify it.
Kimi Code CLI
PreToolUse hooks in config.toml; rewriting is undocumented, so shim first.
GitHub Copilot CLI
preToolUse allows or denies only; policy file lives in .github/hooks/.
Any other agent
PATH shims plus an AGENTS.md rule — no hook surface required.
recommended caps, per tool
A cold Rust build is silent for minutes. A Playwright suite leaks browsers and binds a port. A dev server is designed never to exit, so a wall-clock limit on it is guaranteed to fire and guaranteed to mean nothing. One tuning guide per tool, with the reasoning behind each number:
VitestJestpytestgo testdotnet testcargo testPlaywrightRSpecGradle & MavenESLintRuffBiomegolangci-lintTypeScript (tsc)Vite & webpack