opencode-config/docs/decisions/055-pr-124-keyword-search-out-of-box.md
Sergey 7249f1fcb5
fix(memory): keyword search out-of-box + doctor gaps + tests (#124)
* fix(docker): add system ripgrep via apt for keyword search fallback

* fix(ci): install ripgrep and npm deps for keyword search in CI

* fix(memory-search): warn when ripgrep not resolvable instead of silent skip

* fix(memory-doctor): check rg status, arch mismatch, and require errors

* test(memory): add keyword search and doctor unit tests

* test(memory): unskip e2e keyword tests without RUN_LIVE

* docs(handoff): add handoff and ADR for keyword search fix

* test(memory): remove unused var in keyword search test

* docs(handoff): set PR number to 124

* docs(project-map): update after structural changes (PR#124)

---------

Co-authored-by: opencode-agent <agent@opencode.local>
2026-07-29 17:20:59 +03:00

2.4 KiB
Raw Blame History

ADR-055: System ripgrep fallback + memory-doctor status checks

Статус

Accepted (2026-07-29)

Контекст

Keyword search (ripgrep) в memory-системе заявлен в README как "always works", но на практике system rg не был установлен нигде — только npm-пакет @vscode/ripgrep через volume-mount (хрупко, platform-specific). CI не устанавливал ripgrep. memory-doctor имел 4 диагностических gap'а: allGreen проверял rgBin!==null вместо r.status===0, расхождение allowSystemFallback с memory-search, нет arch-mismatch detection, require-ошибки не попадали в отчёт.

Решение

  • Dual ripgrep source: @vscode/ripgrep (npm, primary) + system rg через apt (fallback). Dockerfile и CI устанавливают оба.
  • resolveRgBinary({ allowSystemFallback: true }) в memory-doctor — консистентно с memory-search (раньше doctor не пробовал system fallback, что расходилось с реальным поведением search).
  • checkRipgrep возвращает { lines, rgWorks }rgWorks = rgBin!==null && r.status===0. allGreen использует rgWorks, не rgBin!==null — закрывает G9 (битый бинарник с существующим path).
  • detectArchMismatch() — эвристика по имени path бинарника (contains 'darwin'/'linux'/'win32' + 'arm64'/'x64'). Не вызывает file — portable.
  • Warning в stderr при rgBin===null в memory-search — вместо молчаливого skip. Упрощает диагностику.

Альтернативы

  • Только system rg (убрать npm-пакет): rejected — npm-пакет даёт pinned version и не зависит от distro package manager; Dockerfile slim image может не иметь rg в apt без extra repos.
  • Только npm-пакет (убрать apt): rejected — volume-mount хрупок, CI runner без npm install для .opencode/package.json = нет rg.
  • file command для arch-mismatch: rejected — extra dependency, эвристика по path покрывает основной случай (@vscode/ripgrep platform dir names стандартизированы).