AgentProcs
Keep development services alive, observable, and controllable across separate AI coding-agent tool calls.
Coding agents often start an API, web app, or worker in one shell, then lose track of the process on a later tool call. AgentProcs keeps those services under a per-session daemon so the next call can inspect logs, check status, restart a process, or stop everything cleanly.
AgentProcs is for developers using agentic coding workflows on Linux and macOS (Unix only). It provides same-user process supervision, not sandboxing; managed commands retain your filesystem and network access. See Architecture and security boundary for details.
- A daemon persists across CLI calls, with project and session isolation.
- Readiness checks and dependency ordering start services in the right sequence.
- Durable indexed logs and JSON status keep process state available to agents and scripts.
- Restart policies and file watching recover development services; an optional proxy gives them named localhost URLs.

This is a real, reproducible local run. Follow the demo instructions to play or record it yourself.
Engineering proof: Unit tests live alongside the source, with property, integration, and end-to-end tests; current v0.6.2 release binaries target Linux and macOS on x86_64 and ARM64.
Quick start · Architecture and security
Install
cargo install agent-procs
Quick start
# Start a process
# Auto-restart on crash (up to 5 times)
# Restart when source files change
# Wait for it to be ready
# Check output
# See what's running
# Stop it
Config file
Create an agent-procs.yaml to manage multiple processes together:
session: myproject # optional — isolates this project's processes
proxy: true # optional — enables reverse proxy
proxy_port: 9095 # optional — pin proxy to a specific port
processes:
db:
cmd: docker compose up postgres
ready: "ready to accept connections"
autorestart: always
max_restarts: 3
api:
cmd: ./start-api-server
cwd: ./backend
env:
DATABASE_URL: postgres://localhost:5432/mydb
ready: "Listening on :8080"
port: 8080
depends_on:
autorestart: on-failure
watch:
- "src/**"
- "config/*"
watch_ignore:
- "*.generated.ts"
Processes start in dependency order; independent ones run concurrently.
Field reference
Per-process fields:
| Field | Required | Description |
|---|---|---|
cmd |
yes | Shell command to execute |
cwd |
no | Working directory (relative to config file location) |
env |
no | Environment variables (key: value map) |
ready |
no | Stdout pattern that signals the process is ready |
depends_on |
no | List of process names that must be ready first |
port |
no | Port number — injected as PORT and HOST=127.0.0.1 env vars |
autorestart |
no | Restart policy: always, on-failure, or never (default) |
max_restarts |
no | Maximum restart attempts (unlimited if omitted) |
restart_delay |
no | Delay between crash and restart in ms (default: 1000) |
watch |
no | List of glob patterns — restart process when matched files change |
watch_ignore |
no | Additional glob patterns to ignore (.git, node_modules, target, __pycache__ always ignored) |
Top-level fields:
| Field | Required | Description |
|---|---|---|
session |
no | Session name (overridden by --session CLI flag) |
proxy |
no | Enable reverse proxy (default: false) |
proxy_port |
no | Pin proxy to a specific port (default: auto-assign from 9090-9190) |
Reverse proxy
Give processes stable named URLs instead of port numbers. Opt-in via proxy: true in config or --proxy on the CLI.
)
)
- Processes without an explicit
portget one auto-assigned (4000-4999 range) PORTandHOST=127.0.0.1are injected into the process env (user env takes precedence)- Each session gets its own proxy port, so two projects can both have
apiwithout conflict
Ad-hoc usage without a config file:
# → http://api.localhost:9090
Commands
| Command | Description |
|---|---|
run <cmd> [--name N] [--port P] [--proxy] [--autorestart MODE] [--max-restarts N] [--restart-delay MS] [--watch GLOB]... [--watch-ignore GLOB]... |
Spawn a background process |
stop <name> |
Stop a process |
stop-all |
Stop all processes |
restart <name> |
Restart a process |
status [--json] |
Show all process statuses |
logs <name> [--tail N] [--follow] [--stderr] [--all] |
View process output |
wait <name> --until <pattern> [--regex] [--timeout N] |
Wait for output pattern |
wait <name> --exit [--timeout N] |
Wait for process to exit |
up [--only X,Y] [--config path] [--proxy] |
Start from config file |
down |
Stop config-managed processes |
session list |
List active sessions |
session clean |
Remove stale sessions |
ui |
Open terminal UI |
completions <shell> |
Generate shell completions (bash, zsh, fish, powershell) |
Restart policies
Automatically recover from crashes without agent intervention.
# Restart on non-zero exit, up to 5 times with 2s delay
# Always restart (even clean exits), unlimited attempts
| Mode | Behavior |
|---|---|
always |
Restart on any exit |
on-failure |
Restart only on non-zero exit |
never |
Don't restart (default) |
When max_restarts is exhausted, the process enters Failed state. Manual stop disables auto-restart; restart re-enables it and resets the count.
Supervisor annotations ([agent-procs] Restarted, Max restarts exhausted) are written to disk logs and visible in logs --tail, --follow, and the TUI.
File watch mode
Auto-restart processes when source files change.
- Uses OS-native file watching (FSEvents on macOS, inotify on Linux) with 500ms debounce
.git,node_modules,target, and__pycache__are always ignored- Add
--watch-ignore "*.log"for additional ignore patterns - Watch restarts reset the restart count (they're intentional, not crashes)
- File changes can revive a
Failedprocess
Sessions
Use --session to isolate process groups (e.g. per-project):
Alternatives
AgentProcs is intentionally narrow for host-process control in agent-driven development; other tools fit different operating models. Linked tool names and notes point to official documentation.
| Tool | Persistent model / isolation | Readiness, status, and logs | Best fit |
|---|---|---|---|
| AgentProcs | A per-session host daemon persists across CLI calls; sessions separate process groups but do not sandbox them. | Dependency-ordered startup with bounded stdout string or regex readiness waits; after a timeout, startup warns and continues. status --json; durable indexed logs; crash policies and native file watching. |
Agent-driven Unix development workflows. |
nohup |
Runs one command with hangup signals ignored; control remains with normal shell and PID tools. | Writes to nohup.out or redirected output. Readiness, named sessions, reconnectable control, and machine-readable status are not documented as built-in workflows in the reviewed manual. |
One command must survive logout, and PID/file control is enough. |
tmux |
Detached, reconnectable terminal sessions with window and pane separation; terminal persistence is not process supervision. | Formatted listings, pane history, and pipe-pane; readiness and dependency workflows or JSON status are not documented as built-in workflows in the reviewed docs. |
Interactive terminals that must be reattached later. |
PM2 |
A host daemon manages named apps and ecosystem files. | PM2 normally detects Node's listen event; --wait-ready instead waits for app IPC (process.send('ready')). Neither matches stdout. jlist JSON; stored and streamed logs; restart, watch, boot, and cluster support. |
A mature host application manager, especially for long-running or Node.js apps. |
Docker Compose |
Project-scoped containers, optionally detached, with images, networks, and volumes. | depends_on sets order; readiness requires a service_healthy condition and healthcheck. ps --format json, aggregated logs, restart policies, and Compose Watch. |
Container-based stacks where those boundaries and healthchecks are the desired model. |
Overmind |
A tmux-backed Procfile runner with working-directory socket and daemon controls. | Text status plus multiplexed or echo output; readiness/dependency gating and durable indexed logs are not documented as built-in workflows in the reviewed README; selected processes can auto-restart. |
An existing Procfile with direct tmux attachment. |
Foreman |
Runs a Procfile directly or exports it; the reviewed manual does not document a reconnectable Foreman daemon/status workflow. | Interleaved stdout; readiness and dependencies are not documented as built-ins. Export targets include systemd, runit, supervisord, and launchd; their runtime behavior belongs to the target supervisor. | A lightweight Procfile runner or native-supervisor configuration generator. |
Use another tool when
nohupfits when one command only needs to survive logout and PID/files are enough.- Choose
tmuxwhen a reconnectable interactive terminal is the main need. - PM2 suits apps that need an established manager with Node support, restarts, boot integration, metrics, or clustering.
- Docker Compose is the better model when the stack should use containers, images, networks, volumes, and healthchecks.
- Overmind fits a project that already has a Procfile and needs direct tmux attachment.
- Foreman works for a lightweight Procfile workflow or export to a native supervisor.
Architecture and security boundary
Each Quick start command is a short-lived CLI client, while a per-session daemon persists across invocations and owns the control plane. CLI requests cross a Unix domain socket whose 0700 parent directory limits access to the current user; the daemon supervises process groups, durable session logs, and the optional Reverse proxy.
AgentProcs provides process supervision, not sandboxing: managed commands retain the current user's filesystem and network access. Use a container or VM when isolation is required; see Sessions for operational separation and SECURITY.md for the complete security model.
Exit codes
| Code | Meaning |
|---|---|
| 0 | Success |
| 1 | Error (timeout, connection failure, unexpected response) |
| 2 | No logs found for target process |