Skip to content

v4.7.6

Choose a tag to compare

@michael-wojcik michael-wojcik released this 05 Sep 08:26
· 80 commits to main since this release
c2c571a

Summary

The backlog can now live on a multi-repo workspace directory with no .git of its own, and the three names PACT keeps for one project — the backlog file, the pact-memory project id, and the session-directory slug — all derive from the same resolved directory through the same sanitiser.

What landed

  • Umbrella backlogs. project_root() falls back to the resolved CLAUDE_PROJECT_DIR when git resolves nothing and no .git sits at or above it; a directory inside a repository git could not read refuses instead of writing a second backlog keyed on a subdirectory or worktree. The refusal names which input it saw and echoes the rejected value.
  • One project name. The pact-memory project id returns the resolved basename for a symlinked project directory. One project_slug helper replaces eleven inline derivations across the session hooks and the pact-memory session script. Every reader and writer of a session path — the resume-line fallback, the old-name reaper sweep, and the pact-memory session script — composes it through the one sanitising helper.
  • Symlink-launched sessions crossing this upgrade keep their journal: session start adopts the old-name directory (only when the two names differ, the old path is a real directory, and the new path is absent or empty; never clobbers, never raises), the previous-session-dir reader follows the moved path, and the reaper sweeps the old-name directory beside the new one.
  • Re-key note. New pact-memory records for a project launched through a symlink land under the target's name; older records stay under the link's name.
  • Ten backlog tests that reached the writer through the process cwd now pin CLAUDE_PROJECT_DIR; one test pins the cwd path on purpose.

Why

A workspace umbrella was the only project shape the backlog writer refused outright, and the session-start remedy it printed could not succeed there. Review found that a project launched through a symlink was named three different ways; closing that split without leaving a documented gap meant adopting old session directories, following moved paths, and putting every path composition through the sanitiser the writers already used.