* 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>
40 lines
No EOL
2.4 KiB
Markdown
40 lines
No EOL
2.4 KiB
Markdown
# 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 стандартизированы). |