Skip to content

v2.29.0: Stable boot executable paths and Ctrl+C shutdown on Windows

Choose a tag to compare

@jdx jdx released this 29 Sep 21:32
· 119 commits to main since this release
Immutable release. Only release title and notes can be modified.
cfdea79

Boot registrations can now point at a stable executable path that survives package-manager upgrades. On Windows, daemons with stop_signal = "SIGINT" now get Ctrl+C, so they can shut down cleanly. This release also adds config add --label for proxy hostnames, gives a clear error when the state directory path is too long for the socket, and removes a broken MessagePack IPC mode.

Added

  • boot.executable setting for stable boot registrations (#940) by @jdx. If you install pitchfork through a versioned package manager, the boot registration can end up pointing at a binary that a later upgrade removes. You can now set an absolute, stable path, such as a mise latest symlink. Pitchfork writes that path into the registration exactly as given and uses it when it repairs a stale entry.

    [settings.boot]
    executable = "/home/alice/.local/share/mise/installs/pitchfork/latest/pitchfork"

    Put this in user or system config, or set PITCHFORK_BOOT_EXECUTABLE, then run pitchfork boot enable (or sudo pitchfork boot enable for a system service). Project config can't set it. The path must be absolute, must exist and must be executable. An invalid path makes registration fail, and automatic repair leaves the existing entry unchanged. If you leave it empty, pitchfork uses the running binary's resolved path, as before. Related change: pitchfork settings set now requires --global for global-only settings and rejects settings that can only be set through environment variables. For example: pitchfork settings set boot.executable /path/to/pitchfork --global.

  • pitchfork config add --label to choose the project hostname label (#956) by @jdx. Tools that register a project under a generated namespace, such as mise's shop-528f92b13a6784f0, used to get proxy hostnames like web.shop-528f92b13a6784f0.localhost. Requests to the hostname the tool printed, such as web.shop.localhost, failed with 404 "Unknown project". A registration can now name its label:

    pitchfork config add gen/pitchfork.toml --dir ~/src/shop \
      --namespace shop-528f92b13a6784f0 --label shop

    This routes web.shop.localhost and linked worktrees such as web.feat-x.shop.localhost. The project label now comes from the registered label first, then the explicit namespace, then the directory name. The label must already be a valid hostname label. Re-adding the config without --label keeps the existing label. pitchfork config list --json now includes label.

  • Pitchfork agent skill (#942) by @jdx. Releases now publish a pitchfork agent skill through Packslip. The skill covers configuring daemons, readiness checks, dependencies, ports, restarts and diagnosing problems from logs. You need a mise version with Packslip skill support:

    mise use packslip:github.com/jdx/pitchfork
    mise skills sync --dir .agents/skills

Fixed

  • stop_signal = "SIGINT" now sends Ctrl+C on Windows (#931) by @JamBalaya56562. Previously, Windows ignored stop_signal and force-killed every daemon with taskkill /F /T. Daemons like PostgreSQL were left needing crash recovery. Now these daemons get Ctrl+C and have until their stop timeout to exit before pitchfork terminates them. Any other signal, including the default SIGTERM, still terminates the daemon right away. Limitations:

    • Delivery is best effort. A child process that ignores Ctrl+C and outlives the daemon keeps running.
    • Under pitchfork supervisor run on a real console, daemons that share the supervisor's console are terminated without Ctrl+C.

    Unix behavior is unchanged.

  • Clear error when the state directory is too long for the supervisor socket (#955) by @jdx. On Unix, the socket path <state dir>/sock/main.sock must fit in 108 bytes on Linux or 104 on macOS. If PITCHFORK_STATE_DIR or XDG_STATE_HOME made it longer, commands used to fail after five connection retries with a generic error. They now fail right away with pitchfork::ipc::socket_path_too_long. The message shows the path, its length and the limit, and suggests a shorter state directory.

  • Removed the broken MessagePack IPC mode (#930) by @JamBalaya56562. Setting the undocumented IPC_JSON=false switched IPC to MessagePack, which caused errors such as message contains null byte when starting daemons. IPC now always uses JSON, and IPC_JSON no longer has any effect. The default setup already used JSON, so nothing changes for it.

Full Changelog: v2.28.0...v2.29.0

💚 Sponsor pitchfork

pitchfork is built and maintained by @jdx, an open source developer at entire.io, the title sponsor of his open source work.

If pitchfork has a place in your development workflow, please consider becoming an individual or company sponsor. Your support funds ongoing development and helps keep pitchfork fast, free, and independent.