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 demo: init, supervised test run, hang kill, dedup refusal
$ 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: