Files
codegraph/__tests__
Colby MchenryandClaude Opus 5.5 1cb4aab913 fix(status): a project below its repository root sees its uncommitted changes (#2932)
When the indexed project is a folder of its git repository (a monorepo
package, an app/ folder beside a server/ one), `codegraph status`,
`status --json` and the freshness check behind codegraph_status reported
the index up to date while `codegraph sync` found the very same changes.
`git status --porcelain` prints paths from the repository root whatever
folder it runs in, and reports the whole repository. Change detection
joined `app/src/index.js` under the project, found nothing at
`app/app/src/index.js`, and dropped it. The dirty paths a sync records
for the restore check (from PR #1878) were stored the same way, so a
file put back with git after a sync was missed too. And a project in a
folder its repository gitignores got a permanently clean answer from
git, which says nothing about an ignored folder.

Change detection now asks where the project sits in its repository
(`git rev-parse --show-prefix`, kept per folder, and skipped when the
folder has its own .git). Below the root it runs git status with a
`-- .` pathspec, takes the prefix off every path and leaves out anything
outside the folder. The project's ignore rules match those
project-relative paths, the recorded dirty paths are project-relative,
and a project its repository ignores declines the git path as the scan
already did, so callers take the full scan. A project at its repository
root runs exactly the git command it ran before.

Validation:
- git-status-subdir-project.test.ts (new, 7 cases): edited, added and
  deleted files in a subdir project, matching sync; edits outside the
  project left out, with the pathspec asserted; the restore case, across
  a reopen; the project's own anchored .gitignore rule; an embedded repo
  inside the project; the gitignored-project fallback; and a repo-root
  project running exactly today's status command with no prefix call.
  6 fail on main's source; the repo-root control passes on both. Four
  mutations (no pathspec, ignore rules on repo-relative paths, no
  fallback, no .git shortcut) each fail the test.
- CLI repros: after an edit and an added file in app/, status --json
  reads 0/0/0 on main and 1 added + 1 modified with the fix; the same in
  a gitignored project; a subdir restore reads 0 on main and 1 modified
  with the fix (a repo-root project reads 1 on both).
- The MCP freshness worker on a subdir project: 0/0/0 on main, 1 added
  + 1 modified with the fix.

Reported in PR #1636 by @innoxxicide. This reimplements the fix
independently, on top of the restore check that landed after it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 18:56:18 +00:00
..