Repository navigation
Releases: noodles/ProjectBoss
Releases · noodles/ProjectBoss
Release list
v2026.09.4
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
- Add a demo recording to the README, reproducible with
demo/record.sh. It runs against a throwaway home directory built bydemo/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 youcd, 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 infoandpb newnow print~/Projects/...rather than the full home path. The home prefix is noise in every line it appears in. Stored data and--jsonkeep absolute paths, since anything parsing them needs a path it can use
v2026.09.0
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.pyis nowpb.py, the shell function ispb, and the environment
variable the function sets isPB_SHELL_WRAPPER- The data directory moved from
~/.projto~/.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 ~/.zshrcto replace the old shell function.
The oldprojname is deliberately not kept as an alias: it would re-create
the collision for exactly the people the rename protects - Add
pb list --jsonfor scripts and agents. It emits the same object shape as
pb info --json, which means the stored fields plusstatus, computed from
last_worked_atrather than stored. Filters, sorting and--limitapply, 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.mdso an agent can resolve a
project the user names out loud into a path.install.shoffers 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 infonow prints-rather than an em dash for an empty field
v0.8.0
- Add a test suite: 85 tests in
test_proj.py, stdlibunittest, no dependencies. Run withpython3 -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_ignoredcomparing paths case-sensitively. It usedos.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 intoproj ignorewith 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
projshells out toopenandpbpasteand the installer writes to~/.zshrc, so a Linux run would pass while proving nothing; 3.9 because that is thepython3macOS 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 listoutput, and the three things that are actually distinctive: computed status, discovery, and review .gitignoreno longer ignores all ofdocs/, which meant the project could never commit its own documentation. It now ignores only the generated per-project prompt files