dmtrKovalenko / dmtrKovalenko/fff

MCP grep results appear partial vs native grep (need exhaustive mode for drop-in routing)

Open
#365 3 comments 0 reactions 0 assignees View on GitHub
triaged
Dominant language
Rust
Stars
10.7k
Forks
446
Avg merge
1d 21h
Merged PRs (30d)
39

Description

### Summary

When using `fff-mcp` grep as a backend for a `grep -R -n --fixed-strings` workflow, results can be ranked/partial rather than exhaustive vs native `grep` for the same target subdirectory.

### Environment

- fff.nvim repo: `main` (as of 2026-04-10)
- install path: `fff-mcp` via `install-fff-mcp.sh`
- macOS host

### Repro (real monorepo case, sanitized)

```bash
API_SRC=apps/api/src
WEB_SRC=apps/web/src

# run from repo root
/usr/bin/grep -R -n --fixed-strings TODO "$API_SRC" | wc -l
/usr/bin/grep -R -n --fixed-strings TODO "$WEB_SRC" | wc -l

# fff-backed path (wrapper -> fff-mcp grep)
NCR_ENABLE_FFF_GREP=1 grep -R -n --fixed-strings TODO "$API_SRC" | wc -l
NCR_ENABLE_FFF_GREP=1 grep -R -n --fixed-strings TODO "$WEB_SRC" | wc -l
```

Observed in one repo:

- API native: `14`
- API fff-backed: `6`
- Web native: `4`
- Web fff-backed: `2`

### Minimal synthetic repro (public-safe)

```bash
ROOT="$(mktemp -d)"
mkdir -p "$ROOT"/apps/api/src "$ROOT"/apps/web/src "$ROOT"/docs "$ROOT"/scripts
cd "$ROOT"
git init

# 14 TODOs in api target path
for i in $(seq 1 14); do echo "export const a$i = 'TODO api $i'" >> apps/api/src/api.ts; done
# 4 TODOs in web target path
for i in $(seq 1 4); do echo "export const w$i = 'TODO web $i'" >> apps/web/src/web.ts; done
# noise outside target paths
for i in $(seq 1 80); do echo "TODO doc $i" >> docs/readme.md; done
for i in $(seq 1 80); do echo "echo TODO script $i" >> scripts/build.sh; done

git add . && git commit -m "seed"

/usr/bin/grep -R -n --fixed-strings TODO apps/api/src | wc -l
# expected: 14

# helper call used by wrapper
node ~/.local/share/ncr/bin/grep-fff-helper.mjs --path "$ROOT/apps/api/src" --query TODO --line-number 1 | wc -l
# observed here: 10 (lines 11-14 missing)
```

### Why this matters

For command-router use cases, `grep` compatibility requires shape + completeness parity for supported forms.

If FFF is intentionally ranked/preview-oriented, that is useful for AI workflows, but wrappers need an explicit exhaustive contract/mode before using it as a default native backend.

### Request

Would you consider adding one of these:

1. An explicit exhaustive grep mode for MCP/tool calls (native-like completeness), or
2. Tool metadata/options that clearly distinguish `ranked/preview` vs `exhaustive`, including paging semantics and termination guarantees.

Happy to test a proposed flag/contract and report back with parity checks.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.