1.14.3 — 2026-10-25
Changed
- Repository renamed to
yazeed/proc-cli, matching the crate, the npm package, the agent skill and proc-cli.com. Oldgithub.com/yazeed/proclinks, git remotes and release downloads redirect, so existing installs keep working. Install commands now use the new name:npx skills add yazeed/proc-cli,/plugin marketplace add yazeed/proc-cli,nix profile install github:yazeed/proc-cli. The Homebrew command is unchanged (brew install yazeed/proc/proc) - Docker image published as
yazeed/proc-cli. Docker Hub can’t rename repositories, so each release also pushes the same image toyazeed/proc, anddocker pull yazeed/prockeeps getting updates
Removed
Formula/proc.rbandpkg/scoop/proc.json: hand-maintained copies left over from before publishing was automated (frozen at 1.2.2 and 1.3.3 since January). Releases have written the real Homebrew formula and Scoop manifest toyazeed/homebrew-procandyazeed/scoop-bucket-procever since; nothing read these
1.14.2 — 2026-10-25
Fixed
proc stop --signalonly checked the signal name after the dry run and the confirmation prompt.--dry-runreported success for a signal the real run rejects (--signal 9), and without--yesyou confirmed before being told the name was invalid. An unknown signal now exits 4 straight away, with or without--dry-run
Changed
- Website moved to proc-cli.com. The old
yazeed.github.io/procaddress redirects there - PHILOSOPHY.md describes proc as it is today: every command in the grammar, the JSON and exit-code contract shared by people, scripts and agents, how targets are read without guessing, and
--killonorphans/stuck
1.14.1 — 2026-10-25
Fixed
proc in <dir>exited 4 (“Directory not found”) when the directory had been deleted, even with processes still running in it, such as a dev server left behind in a removed git worktree. It now lists them. A missing path with nothing running in it still exits 4, as a typo- Linux: processes in a deleted directory reported their
cwdas<dir> (deleted), which the kernel appends, so--in <dir>never matched them.cwdnow shows the plain path, as on macOS, and--inmatches it
Changed
- Skill: tells agents when to reach for proc. It covers:
- a fuller description of situations that trigger the skill (a busy port,
EADDRINUSE, leftover dev servers and headless browsers, a slow machine) - a table of the shell commands proc replaces (
lsof,ps | grep,pkill,kill) - playbooks for a busy port, cleaning up background work, checking for leftovers before finishing, a slow machine, and clean restarts
- safety rules for not touching other people’s or other agents’ processes
- how to check the installed version and install proc
- the command aliases, and the flags it was missing (
list --path,ports --local,tree --depth/--compact,orphans --kill) - new gotchas:
kill/stopdon’t signal children, how to find processes left running in a deleted directory, and an orphan isn’t necessarily abandoned
- a fuller description of situations that trigger the skill (a busy port,
- Release checklist: triggers a skills.sh refresh after publishing, since skills.sh only re-reads the repo when someone installs the skill
1.14.0 — 2026-10-25
Added
- Uptime in process output: every process in JSON has
uptime_secs; tables fromlist,by,inand the other process lists show anUPTIMEcolumn on terminals at least 100 columns wide, and--verboseprints it proc inspect: alias ofproc info, next toi- Skill: explains that inspecting a process means
proc info(orproc inspect) and what it reports, thatbytakes one pattern whilelisttakes comma-separated ones, and thatstart_timeis a timestamp whileuptime_secsis the duration
Changed
- Release checklist: after publishing, upgrades the local Homebrew
procon its own (brew upgrade yazeed/proc/proc) and checks its version
1.13.4 — 2026-10-25
Fixed
- Linux binaries failed to start on anything older than Ubuntu 24.04 (
GLIBC_2.39 not found, e.g. on Debian 12), because they were built on theubuntu-latestrunner and linked against its glibc. They are now static musl builds (x86_64-unknown-linux-musl,aarch64-unknown-linux-musl) with no glibc dependency. Tested on x86_64 and ARM64 with Amazon Linux 2, Debian 10, 11 and 12, Ubuntu 20.04 and Alpine 3.20. File names are unchanged, so the curl install, npm, Homebrew on Linux and cargo-binstall pick them up as before - Docker image:
on :port,portsandfreefailed withFailed to run ss: No such file or directory, because the image didn’t includess, which port lookups use on Linux. The image now installsiproute2. The documenteddocker runcommand adds--net=host, which port lookups need to see the host’s ports usershowed the numeric user ID (e.g."501") in JSON,info,listandwatch. It now shows the user name, and falls back to the ID when the ID has no name on the system. Scripts that readuseras a number need updating
Changed
- CI builds the same Linux targets as a release, including ARM64, so a broken release build shows up on every push instead of at tag time
- cargo-binstall: musl hosts (Alpine) now resolve to the Linux release files
- Release checklist: runs the published Linux binaries on Debian 11 and Alpine
1.13.3 — 2026-10-24
Fixed
npm install proc-clifailed for every version withRedirect to untrusted host: release-assets.githubusercontent.com. GitHub now serves release downloads from that host, which the installer’s allowlist didn’t include. It is now allowed; the existing hosts and the SHA-256 checksum check are unchanged- npm 12: install scripts no longer run by default, so the binary was never downloaded and
proccrashed. Theproccommand now downloads and verifies the binary on first run when it is missing, with progress on stderr so--jsonoutput stays clean. If the package directory isn’t writable, the binary goes to~/.cache/proc-cli/<version>(%LOCALAPPDATA%\proc-cli\<version>on Windows). A failed download during install no longer failsnpm install; it is retried on first run - npm wrapper: a
prockilled by a signal now exits non-zero, and a binary that can’t be started reports an error instead of crashing
Changed
- Release checklist: installs the npm package from a local tarball before tagging, and runs a real
npm installafter publishing
1.13.2 — 2026-10-24
Changed
- npm publishing uses Trusted Publishing (OIDC) from the release workflow instead of a stored token. The
NPM_TOKENsecret is no longer used. The publish job runs on Node 24 with npm 11.5.1 or newer, as Trusted Publishing requires. 1.13.0 and 1.13.1 were not published to npm, so npm goes from 1.12.3 to 1.13.2
1.13.1 — 2026-10-24
Fixed
- Docker image: the binary failed to start (
GLIBC_2.39 not found) on both amd64 and arm64, since at least 1.12.3. The build stage usedrust:latest, which moved to Debian trixie, while the runtime stage isdebian:bookworm-slim(glibc 2.36). The build stage now usesrust:1-bookworm - Release workflow: the crates.io and npm publish steps reported success even when publishing failed, because the result was piped through
teewithoutpipefail. This hid that 1.13.0 was never published to npm
1.13.0 — 2026-10-24
A consistent JSON and exit-code contract: every command prints one JSON document, action is always the command name, and "success": false always comes with a non-zero exit code. Scripts that relied on the old behaviour should check the Changed entries below.
Changed
--dry-run --jsonnow reports the command’s ownaction(e.g."kill") and"dry_run": true, instead of a list result with"action": "list"(kill,stop,freeze,thaw,free,orphans --kill,stuck --kill)proc orphans --kill/proc stuck --killwith--jsonprint one action result ("action": "orphans"/"stuck",succeeded/failed) instead of two JSON documentsproc thaw --jsonreports"action": "thaw"instead of"resume"proc why/proc treeJSON use lowercasestatus("running") andprotocol("tcp"), matching the Process and Port objects- Invalid flags and arguments exit with code 4 (invalid input) instead of 2, which meant “not found”; with
--jsonthe error is a JSON object on stdout proc wait --jsonon timeout exits 1, as it already did without--jsonproc stop,freeze,thaw,orphans --kill,stuck --killexit 1 when any process fails, asproc killalready didproc freeexits 1 when a port is still in use after--waitproc unstickexits 1 when a process is still stuck or failed; an explicit target removed by--in/--byis “not found” (exit 2)proc infoexits 2 when no target is foundproc onwith multiple targets and--jsonprints one document (count,resultswithtarget/process/ports,not_found) instead of one per target; exits 2 when no target is foundproc in <path>exits 4 when the directory does not exist, likeproc forwith a missing file
Fixed
proc why --jsonprints a JSON error and exits 2 when nothing is found, instead of printing nothing and exiting 0; multiple targets print one document instead of one per targetproc kill --jsonno longer prints a second JSON error document after a partial failure- Error
actionuses the canonical command name when an alias is used (proc k→"kill") - JSON errors are detected for short-flag clusters such as
-yj - Human output: “Stopped” instead of “Stoped”
- Agent skill:
SKILL.mdcoversproc for,proc in,proc unstick,--ancestors,--graceful,--exposed/--local/--range,--status,--min-uptime,--parent, with a per-command filter table and the boundedproc watch --jsonstream;reference.mdadds theon <PID>,tree --ancestors,--dry-run,unstick, andwatchshapes - Plugin manifest:
.claude-plugin/marketplace.jsonversion kept in sync and added to the release checklist
Added
- Docs: agent skill install instructions (
npx skills add yazeed/proc, Claude Code plugin) in README and the install page; exit code table in README and the commands page - Tests: JSON contract integration tests (
tests/cli_json.rs)
1.12.3 — 2026-05-03
Fixed
- Clippy: Use
sort_by_keyinstead ofsort_byfor name sorting (Rust 1.95+ lint)
1.12.2 — 2026-03-30
Security
- npm install script hardened: SHA-256 checksum verification, redirect host pinning,
execFileSync(no shell injection), dead code removed
Fixed
- README: SafeSkill badge, correct badge ordering
- Skills: Added
proc forand empty result JSON schemas to reference - Rust docs: Added
wait,free,why,freeze/thaw,--signal,--jsonto Quick Start and Features
1.12.1 — 2026-03-27
Fixed
- CI: Upgrade to
softprops/action-gh-release@v2— v1 fails with immutable releases enabled
1.12.0 — 2026-03-27
Added
proc wait: Block until process(es) exit — the pipe-friendly replacement forwhile ps aux | grep ... | grep -v grep; do sleep; doneproc wait node— wait until all node processes exitproc wait :3000 --timeout 60— wait up to 60s for port process to exitproc wait node -n 10 -q— check every 10s, quiet mode for scripting- Supports
--in,--by,--json,--verboselike other commands - Reports each process as it exits, with elapsed time
- JSON output includes per-process exit timing and timeout status
Fixed
--bynow matches full command line: The--byfilter across all commands now matches against both process name AND command line arguments (consistent with how positional targets andproc bywork). Previouslyproc wait node --by KXBTCDwould not match a process whose args contained “KXBTCD” — now it does. Affects: kill, stop, freeze, thaw, info, tree, stuck, unstick, orphans, wait, on, watch, for- JSON output for empty results: Commands that find nothing (
stuck,orphans,freewhen ports already free) now output{"action":"...", "success":true, "count":0, "message":"..."}in JSON mode instead of empty stdout - Consistent JSON envelopes:
on(name target),for,whynow wrap results in{"action":"...", "success":true, "count":N, "results":[...]}instead of outputting bare arrays - Consistent JSON action field: All commands now use lowercase action names (
"kill","stop","freeze","resume") instead of mixed-case past-tense verbs ("Killed","Stopped") - Command-specific action names:
by,in,stuck,orphansnow report their own command name as the JSONactionfield instead of generic"list" waittimeout no longer double-outputs JSON: Previously emitted both a WaitOutput and an error envelope; now emits a single{"success":false, "timed_out":true, ...}object- Error envelope includes
actionfield: JSON error responses now include the command name (e.g.{"action":"kill", "success":false, "error":"...", "exit_code":2}) watchJSON includessuccessfield: Consistent with all other commandstree --ancestorsusesaction: "tree": Consistent regardless of--ancestorsflag- Ancestor chain exclusion: Name matching now excludes the entire ancestor process chain (up to 10 levels) instead of just the immediate parent. Prevents false matches in deep shell environments (IDE → terminal → shell → shell wrapper → proc)
Changed
- Shared
matches_by_filter: Extracted the--bymatching logic intocore::filters::matches_by_filter(), replacing 14 inline copies with a single consistent implementation - Agent Skills: Added
proc waitto skill reference, added “Agent/Pipe Readiness” section documenting which commands are safe for agents vs interactive-only src/lib.rs: Clarifiedwatchas interactive TUI,waitas pipe-friendly blocking
Updated
- Updated dependencies (
mio,roff,unicode-segmentation,wasm-bindgen)
1.11.0 — 2026-03-23
Changed
- CLAUDE.md: Added explicit rules requiring user approval before every push, tag, and release. Added mandatory RELEASE.md checklist compliance for all versions including patches
Updated
- Updated dependencies (
itoa,unicode-segmentation)
1.10.1 — 2026-03-23
Fixed
- Parent shell self-matching: Name-based searches (
proc by,proc on <name>,proc tree <name>) no longer match the parent shell process whose command line contains proc’s own arguments. Previously,proc on :99999 --jsonwould match the shell running proc instead of returning “not found”. Now correctly returns exit code 2 with a JSON error
1.10.0 — 2026-03-23
Added
- JSON error envelope: With
--json, errors now output{"success":false, "error":"...", "exit_code":N}to stdout instead of plain text to stderr — enables reliable machine parsing by LLMs and scripts - Agent Skills:
skills/proc-cli/SKILL.md— Claude Code skill for process management with proc. Includes structured command reference, JSON output schemas, and LLM usage guidelines. Compatible with the Agent Skills open standard
1.9.1 — 2026-03-16
Fixed
- Windows build: Gate unix-only imports behind
#[cfg(unix)]infreeze.rsandthaw.rs— fixes unused import errors with-D warningson Windows CI
1.9.0 — 2026-03-16
Added
proc freeze: Pause processes with SIGSTOPproc freeze node— freeze all node processesproc freeze :3000 --yes— freeze by port, skip confirmation- Supports
--in,--by,--dry-run,--json,--verbose
proc thaw: Resume frozen processes with SIGCONTproc thaw node— resume all frozen node processesproc thaw :3000— resume process on port 3000- Supports
--in,--by,--dry-run,--json,--verbose
proc orphans: Find orphaned processes (parent exited, reparented to init/launchd)proc orphans— list orphaned processesproc orphans --in .— orphans in current directoryproc orphans --kill --yes— find and kill orphans- Filters out system daemons on both macOS and Linux
proc why: Trace why a port is busy or show process ancestryproc why :3000— ancestry chain with port contextproc why node— how was this node process started?- Shows working directory and command for the target process
- Full JSON output support
proc free: Free ports by killing the process and verifying availabilityproc free :3000— kill process, verify port freedproc free :3000,:8080 --yes— free multiple portsproc free :3000 --wait 30— wait up to 30s for port to free- Reports per-port success/failure (handles TIME_WAIT)
- Port-only targets; rejects PIDs/names with clear error message
--signalflag onproc stop: Send custom initial signal instead of SIGTERMproc stop nginx --signal HUP— reload config (SIGHUP)proc stop worker --signal USR1— application-defined signal- Accepts signal names: HUP, INT, QUIT, ABRT, KILL, TERM, STOP, CONT, USR1, USR2
Changed
- Core: Added
Process::send_signal()for arbitrary Unix signal delivery - Core: Added
Process::find_orphans()for orphan detection with system process filtering
Updated
- Updated dependencies (
clap,sysinfo,libc,tempfile, and others)
1.8.1 — 2026-03-06
Fixed
- README demo image: use absolute URL so it renders on Docker Hub, crates.io, and npm
Added
- GitHub Pages blog with 7 technical posts
- Install page with all platforms, shell completions, and man page setup
- Blog redesign: terminal editorial theme with syntax highlighting and SEO meta tags
1.8.0 — 2026-03-06
Added
proc watch: real-time process monitoring with auto-refresh- aliases:
proc top,proc w - configurable interval (
-n), sort (-s), limit (-l) - combines with
--in,--by,--min-cpu,--min-mem - alternate screen with clean terminal restore on exit
- NDJSON output (
--json) for streaming - non-TTY detection: single snapshot when piped
- aliases:
Fixed
- multi-target “not found” output consolidated into single warning
1.7.4 — 2026-03-01
Fixed
- self-exclusion: proc no longer shows itself in results
1.7.3 — 2026-02-26
Added
- working directory in output: see which project folder a process runs from
Changed
- table
PATHcolumn replaced withDIR(working directory)