Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

Plan history loses its Versions tab when the agent changes directory into another git repo between submits

Open
#2,197 0 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

@backnotprop is already working on this.

Since Oct 26, 2026.

  • #2199 by @backnotprop — open
  • #2205 by @aomalov — open

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
48/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
typescript
Domain
backend

Research direction

Start with server/index.ts and trace how startPlannotatorServer detects the project and saves plan history. Then read the Claude Code plan launch path in apps/hook/hooks/mod/controller.ts and the classic PermissionRequest hook to see which session directory information is available. Done means consecutive submits stay in the same history chain after the agent changes directories, so the Versions tab and diff remain available.

Written by the indexing model from the issue text.

Description

bug
What happened?

When the agent changes directory into a different git repo between two plan submits, the Versions tab disappears and there is no diff. The revised plan is correct and the earlier version is still on disk; they just land in two different history projects, so the UI sees a chain of length 1.

Concretely: a Claude Code session started in a workspace repo (workspace) whose subfolders are separate git clones. The first submit went to history/workspace/<slug>/001.md. Before the resubmit, the agent ran cd service-a (a nested clone) in its shell, and the second submit went to history/service-a/<slug>/001.md. The session record for the second review shows "project": "service-a".

Root cause: the history project is detected from the process cwd at every submit.

packages/server/index.ts (startPlannotatorServer):

project = (await detectProjectName()) ?? "_unknown";
historySlug = resolveHistorySlug(project, slug);
const historyResult = saveToHistory(project, historySlug, plan);

detectProjectName() defaults to process.cwd() and returns the basename of git rev-parse --show-toplevel. The plan CLI inherits whatever directory the session is in at that moment:

  • the Claude Code mod launches plannotator claude-mod-plan without a cwd or PLANNOTATOR_CWD (apps/hook/hooks/mod/controller.ts, launch)
  • the classic PermissionRequest hook runs plannotator in the session's current directory

So a shell cd mid-session (common in multi-repo workspaces and monorepos with nested clones) changes the project key, getNextVersionNumber returns 1 in the fresh directory, previousPlan is null, and the Versions gate never opens. The code-review paths already prefer PLANNOTATOR_CWD; the plan paths ignore it.

This is the same class of bug as #1679 (history key not stable across a resubmit), on the project half of history/{project}/{slug} rather than the slug half.

Suggested fix

  1. Name the history project from the session's project root rather than the current directory: $.session.root() in the mod (a shell cd does not move it), CLAUDE_PROJECT_DIR in the classic hook.
  2. Pin a plan's project per (session, date-free slug) on its first save, so /cd or a worktree move mid-plan still continues the same chain.

Other agents (OpenCode, Pi, Codex, Gemini, Copilot, Droid, Vibe) are unaffected.

Plannotator version

plannotator 0.28.31

OS

macOS

Agent

Claude Code

Where did it happen?

Plan review

Dominant language
TypeScript
Stars
8.7k
Forks
649
Avg merge
4h 9m
Merged PRs (30d)
448

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from backnotprop/plannotator

All issues in backnotprop/plannotator

Similar issues

More TypeScript issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.