Skip to content

Releases: noodles/ProjectBoss

v2026.09.4

Choose a tag to compare

@noodles noodles released this 13 Sep 10:08

Install with Homebrew:

brew tap noodles/tap
brew trust noodles/tap
brew install noodles/tap/pb

See the changelog for 2026.09.2 through 2026.09.4.

v2026.09.1

Choose a tag to compare

@noodles noodles released this 13 Sep 08:48
  • Add a demo recording to the README, reproducible with demo/record.sh. It runs against a throwaway home directory built by demo/setup.sh, so it can never show real projects and re-recording gives the same session
  • Add a "Why not zoxide, fd, or just cd" section to the README. Those find directories; this tracks projects. zoxide learns from where you cd, so the project you have not touched in two months is precisely the one it has forgotten, which is the one worth being reminded about
  • pb info and pb new now print ~/Projects/... rather than the full home path. The home prefix is noise in every line it appears in. Stored data and --json keep absolute paths, since anything parsing them needs a path it can use

v2026.09.0

Choose a tag to compare

@noodles noodles released this 13 Sep 08:14

The command is now pb, not proj. brew install proj installs PROJ, the
cartographic projections library, which puts a proj binary on PATH and
arrives as a dependency of gdal, postgis and qgis. Shipping a tool that shadows
it, or gets shadowed by it depending on PATH order, was a defect rather than a
preference. Nothing in Homebrew or on a stock macOS installs a pb command.

  • proj.py is now pb.py, the shell function is pb, and the environment
    variable the function sets is PB_SHELL_WRAPPER
  • The data directory moved from ~/.proj to ~/.pb. It migrates itself on
    first run, and only when the old directory exists and the new one does not, so
    it can never merge two sets of data or overwrite anything. The notice goes to
    stderr so that stdout stays parseable
  • Re-run bash install.sh && source ~/.zshrc to replace the old shell function.
    The old proj name is deliberately not kept as an alias: it would re-create
    the collision for exactly the people the rename protects
  • Add pb list --json for scripts and agents. It emits the same object shape as
    pb info --json, which means the stored fields plus status, computed from
    last_worked_at rather than stored. Filters, sorting and --limit apply, so
    the JSON is exactly what the table would have shown; an empty result is []
    rather than prose
  • Ship a Claude Code skill at skills/pb/SKILL.md so an agent can resolve a
    project the user names out loud into a path. install.sh offers to link it
    into ~/.claude/skills/ and defaults to no, because a project CLI has no
    business writing into an agent's config directory uninvited
  • Remove every em dash and en dash from the repository, including the ADR
    templates that get scaffolded into other people's projects, and add a test
    that fails if one comes back
  • pb info now prints - rather than an em dash for an empty field

v0.8.0

Choose a tag to compare

@noodles noodles released this 13 Sep 07:33
  • Add a test suite: 85 tests in test_proj.py, stdlib unittest, no dependencies. Run with python3 -m unittest discover. Covers slugging, status thresholds, query resolution, ID allocation, frontmatter, remote-URL parsing, discovery classification, index review, the ignore list, the data layer, template rendering, and both ADR modes
  • Fix is_ignored comparing paths case-sensitively. It used os.path.normcase, which is a no-op on everything except Windows, so the case-insensitive matching the code claimed to do never happened: a path typed into proj ignore with different casing to the one on disk silently failed to match. It now casefolds, and compares realpaths on both sides so a symlink matches its target either way round
  • Every test that touches disk uses a temp directory, and the data-layer tests repoint proj's module paths, so a test run can never read or write the real ~/.proj
  • Run the tests in CI: a GitHub Actions workflow on push and pull request, against Python 3.9 and 3.13 on macOS. macOS because proj shells out to open and pbpaste and the installer writes to ~/.zshrc, so a Linux run would pass while proving nothing; 3.9 because that is the python3 macOS ships
  • Rewrite the README opening. It led with one line of description and then a command reference, which told a visitor nothing about why they would want the tool. It now opens with the problem, real proj list output, and the three things that are actually distinctive: computed status, discovery, and review
  • .gitignore no longer ignores all of docs/, which meant the project could never commit its own documentation. It now ignores only the generated per-project prompt files