Repository navigation
v1.4.1
One report, and it arrived from a session doing something entirely ordinary: working on a branch in a linked worktree.
prepare_capture binds to the server's checkout, and now says so or refuses
The MCP server is registered against one working tree and answers from it. A caller in a linked worktree of the same repository received a transaction bound to the other tree — base_head was the main checkout's HEAD, the staged diff was empty, and three files were staged in the caller's tree at that moment.
Nothing in the response was wrong, and nothing in it looked wrong either: staged_diff_empty: true is also exactly what you see when you have staged nothing. The harvest prompt then said (no diff — nothing is staged) and its rule 8 told the agent to proceed on the transcript alone, so the flow continued and a record would have been bound to a tree its author never touched.
The server cannot discover a caller's working directory — MCP carries no such field, and a guess from the process tree is wrong in precisely the multi-worktree case this exists for. So prepare_capture takes an optional repository: the caller states the tree it means and the server verifies the statement, the shape --diff already has on capture. It cannot change the binding, only assert it.
A mismatch is a refusal that names both trees with their branches and heads, says whether they are worktrees of one repository, and leaves no pending transaction behind:
capture would bind to a different working tree than the one you named.
you asked for /Users/you/repo-wt (branch feat/x, HEAD c9145c860ccc)
this server is /Users/you/repo (branch main, HEAD 83aca80cff5d)
Both are worktrees of the same repository, so the transaction would have bound to the
other branch's HEAD and staged diff, and nothing in the response would have looked wrong.
Omitting the argument keeps the old behaviour.
Where nothing is staged, the response now explains what that means instead of only flagging it: staged_diff_empty_means names the tree that was inspected and points at the assertion that would have refused. repository was already in the answer, which is how the reporter caught this — but it was one field among sixteen with nothing drawing attention to it.
Fixes #1030.
Three README claims corrected
The symbol-anchor paragraph described a command by a name this build does not ship; commitlore coverage is what it is called. A link pointed at a docs/README.md that does not exist. And the payload sample omitted the short-sha column every real answer carries, so the first thing a reader compared against their own output did not match.
Install
curl -fsSL https://raw.githubusercontent.com/MongLong0214/commitlore/v1.4.1/install.sh | sh -s v1.4.1Already installed: commitlore upgrade, then commitlore hooks install in each repository — an upgrade cannot reach a hook file that was written at install time. In a running host session, reconnect the MCP server (/mcp in Claude Code); a host resolves the launcher once at session start.