This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Process Compose is a process orchestrator for non-containerized applications, written in Go. It uses YAML configuration (similar to docker-compose) to define and manage processes with dependency tracking, health checks, scheduling, and more. It operates in multiple modes: TUI (default), HTTP API server, daemon, and MCP server.
make build # Build binary to bin/process-compose (CGO_ENABLED=0)
make test # Run tests with coverage
make testrace # Run tests with race detector
make testrace-clean # Clear test cache, then run with race detector
make lint # Run golangci-lint (downloads to ./bin/ if needed)
make coverhtml # Generate HTML coverage report
make swag # Regenerate Swagger/OpenAPI docs
make schema # Regenerate JSON schema
make docs # Regenerate CLI documentationRun a single test:
go test -run TestName ./src/package/...Run with debug mode:
PC_DEBUG_MODE=1 ./bin/process-compose -e .envEntry point: main.go → src/cmd/root.go (Cobra CLI framework)
| Package | Purpose |
|---|---|
cmd/ |
Cobra CLI command definitions |
app/ |
Core process execution engine — ProjectRunner manages lifecycle of all processes, Process wraps individual process execution |
types/ |
Domain models — Project, ProcessConfig, ProcessState, dependency graph |
loader/ |
YAML config parsing, env var expansion, project merging, validation |
config/ |
CLI flags, global settings, themes, version info (embedded via ldflags) |
api/ |
REST API using Gin framework, WebSocket support, Swagger docs |
tui/ |
Terminal UI using rivo/tview — process table, log viewer, terminal view |
client/ |
HTTP client for remote API communication |
health/ |
Liveness/readiness probe implementations (HTTP, exec) |
scheduler/ |
Cron/interval-based process scheduling via gocron/v2 |
mcp/ |
Model Context Protocol server, tools, and resources |
pclog/ |
Process log buffers with rotation and ANSI color tracking |
command/ |
Shell command execution abstraction (cross-platform, PTY support) |
admitter/ |
Namespace-based process filtering |
templater/ |
Variable/template expansion using envsubst |
CLI/API Input → Cobra Commands (cmd/) → ProjectRunner (app/)
→ Process execution with dependency resolution
→ Health checks (health/) + Scheduling (scheduler/)
→ State updates → TUI (tui/) / API (api/) output
→ Logs → ProcessLogBuffer (pclog/)
States: Pending → Launching → Running → [Restarting] → Terminating → Completed/Error
Dependency conditions: process_started, process_healthy, process_completed, process_log_ready
Searches for: compose.yml, compose.yaml, process-compose.yml, process-compose.yaml with optional .override.* files.
- CLI:
spf13/cobra - HTTP API:
gin-gonic/gin - TUI:
rivo/tview+gdamore/tcell/v2 - YAML:
gopkg.in/yaml.v3 - Logging:
rs/zerolog - Process metrics:
shirou/gopsutil/v4 - Scheduling:
go-co-op/gocron/v2 - MCP:
mark3labs/mcp-go
Heavy use of goroutines, mutexes, and channels for process coordination. ProjectRunner uses fine-grained mutexes to manage shared process state maps. Always run make testrace to catch data races.
A Rust client library lives in crates/ (workspace with client and example crates). This is a separate component with its own CI workflow.