grep: optional tgrep backend for large workspaces
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 5/5
- Tempo estimado
- Mais de uma semana
- Facilidade para iniciantes
- 35/100
- Tipo de issue
- Funcionalidade
- Clareza
- Razoavelmente clara
- Status de atividade
- Ativa
- Stack de tecnologia
- git, node.js, typescript
- Domínio
- cli, performance, tooling
Direção de pesquisa
Start by locating the grep tool implementation, its settings, and the beforeToolCall interception path. Review how the built-in grep handles output_mode, head_limit, and offset, then check whether a live tgrep server is available before considering query behavior. Done means an opt-in backend uses tgrep only when safe, preserves the built-in output behavior, and falls back to ripgrep for unavailable servers or unsuitable patterns.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Feature Description
Let the grep tool run against a tgrep trigram index when one exists for the session root, and fall back to the bundled ripgrep otherwise. Opt-in, not a default change — tgrep only pays off with an index plus a live server, and it is slower than ripgrep on patterns the index cannot narrow.
Today there is no setting to change the grep backend, and a mod cannot register a tool named grep (colliding names are skipped with mod_error), so the only seam is beforeToolCall interception.
Use Case
On a 124,465-file / 29 GB workspace, a selective search such as TODO takes ~3.1s through the grep tool. Agents issue dozens per session, serially. With a live tgrep server the same search returns in 31ms end to end — 100x. Measured on macOS arm64, tgrep 1.2.5, ripgrep 15.2.0, warm cache, best of 5:
| query | ripgrep (full search) | tgrep |
|---|---|---|
TODO (selective, 1,280 files) |
3.07s | 31ms |
function (broad, 65,004 matching lines) |
3.37s | 163ms |
| absent token | 3.01s | 16ms |
For comparison, engine-to-engine with full output the broad case is only 1.2x (3.31s vs 2.83s); the 21x through a tool result comes from stopping at the page limit instead of materialising everything.
Additional Context
I built this as a mod and hit six things a native implementation would need to handle:
output_modedefaults differ — the built-in isfiles_with_matches, tgrep is content, so-lmust be passed when the field is absent.- tgrep omits line numbers unless
-nis given explicitly. head_limit/offsetneed a stream that aborts atoffset + limit + 1lines; buffering a broad match set hit 23 MB and a 285k-line result.- An index without a running server is not safe. It silently misses files written since the build. Reproduced: a newly created file returned exit 1 (no matches) from tgrep while ripgrep found it. A native backend should require a live server, not just an index on disk.
- A cheap
tgrep status .probe gates it (0.00s live, 0.08s dead), plus a stderr check forfalling back to local indexto cover a server dying mid-query. - Patterns with no literal trigrams scan every indexed file —
\d{9,}took 40.5s against ripgrep's 3.0s — so a timeout fallback or trigram heuristic is required. My mod caps at 30s and then defers to the built-in.
Prototype with methodology, raw output and limitations: https://github.com/Hashimlokasher/cmd-mod-tgrep-grep (BENCHMARKS.md). tgrep also powers GitHub Copilot CLI's grep, so it is actively maintained.
Proposal: a grep.backend: "tgrep" setting, or auto-detect when tgrep is installed and a live index is present, keeping ripgrep as the default and the fallback. Happy to test or contribute.
Priority: Important for my workflow
- Linguagem predominante
- Sem dados de linguagem
- Estrelas
- 4.2k
- Forks
- 377
- Merge médio
- 1d 3h
- PRs com merge (30d)
- 6
Preparar o ambiente
Este projeto não oferece contêiner de desenvolvimento, Dockerfile nem guia de contribuição, então a configuração fica por sua conta: comece pelo README e veja nosso guia da primeira contribuição para os passos gerais.
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de CommandCodeAI/command-code
-
Provider /v1/messages rejects role:"system" inside messages[] — Claude Code ≥ 2.1.154 incompatibleAberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
CommandCodeAI/command-code#1085 ·
Mantenedores costumam responder em até 1 dia
-
Feature request: auto-reconnect remote control (/rc) after restartTalvez já em andamento @aliarain assumiu há 20 dias. Abertap2
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 85/100
CommandCodeAI/command-code#992 · 1 comentário · 1 responsável ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
CommandCodeAI/command-code#933 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
CommandCodeAI/command-code#855 ·
Mantenedores costumam responder em até 1 dia
-
grep tool passes empty file type to ripgrepTalvez já em andamento @ahmadbilaldev assumiu há 19 dias. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
CommandCodeAI/command-code#655 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
Todas as issues de CommandCodeAI/command-code
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 73/100
FinanceFlash/unvibecode#675 ·
Mantenedores costumam responder em até 1 dia
-
area:tui bug platform:macos
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
anthropics/claude-code#109005 ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 85/100
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 64/100
criticalmanufacturing/cli#909 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
vercel-labs/just-bash#756 ·
Mantenedores costumam responder em até 1 dia