Skip to content

feat(config): add multi doc-root support#27

Merged
epicsagas merged 9 commits into
mainfrom
orbit-multi-doc-root
Jun 8, 2026
Merged

feat(config): add multi doc-root support#27
epicsagas merged 9 commits into
mainfrom
orbit-multi-doc-root

Conversation

@epicsagas

Copy link
Copy Markdown
Owner

Summary

docs_roots 배열을 통해 다중 doc-root를 지원합니다. 기존 docs_root 단일 필드는 후방 호환으로 유지됩니다.

Changes

  • src/config.rs: DocRootEntry, ResolvedDocRoot, resolved_docs_roots() 추가
  • src/mcp.rs: resolve_project_multi(), ok_with_root! 매크로로 다중 루트 처리
  • src/tools.rs: list_projects_impl, tool_search_global_multi 다중 루트 지원

Config Example

[[docs_roots]]
name = "oss"
path = "~/.alcove/docs-oss"

[[docs_roots]]
name = "work"
path = "~/.alcove/docs-work"

Notes

  • DOCS_ROOT 환경변수 > docs_root > docs_roots 우선순위 유지
  • main 위로 rebase 완료 (feat/path 충돌 해결 포함)

epicsagas added 9 commits June 8, 2026 19:11
- Add DocRootEntry and ResolvedDocRoot types to config
- Add DocConfig::resolved_docs_roots() with priority chain:
  DOCS_ROOT env > docs_root field > [[docs_roots]] vec > default
- DocRootEntry supports per-root embedding override (embed-candle)
- tool_list_projects_multi: aggregate projects across all roots with root field
- tool_search_global_multi: Rayon parallel search across indexed roots
- tool_list_projects: delegates to multi variant, strips root field for compat
- mcp.rs: resolve all_roots via resolved_docs_roots(), route list_projects
  and global search to multi-root variants; resolve_project iterates all roots
- Global grep fallback iterates all roots until results found
- Full backward compat: DOCS_ROOT env and single docs_root field unchanged
- 454 tests pass, 0 clippy warnings
- Fix misleading comment in resolved_docs_roots() priority chain
- Add failure logging when per-root index search fails (eprintln)
- Add intent comment for grep fallback (first-match, not cross-root merge)
- Add CWD cross-validation to prevent wrong root selection on name clash
- Harden DocRootEntry.expand_path with canonicalize + blocked path check
- Canonicalize DOCS_ROOT env var and legacy docs_root field for consistency
  with expand_path() in docs_roots entries (security: defense-in-depth)
- Fix misleading doc comment on tool_search_global_multi (Rayon always available)
- Add WalkDir max_depth(5) in tool_list_projects_multi (performance)
- Add ambiguity warning when MCP_PROJECT_NAME matches multiple roots
- Derive Clone on ResolvedProject for multi-root scan
- Update tests to use non-blocked paths and canonicalize-aware assertions
- Use actual query string in grep no-match response instead of empty string
- Log read_dir failures in tool_list_projects_multi for debugging
- Replace Value mutation in tool_list_projects with shared list_projects_impl
  using include_root flag, avoiding serde_json round-trip overhead
- Merge grep fallback results from all roots instead of returning only
  the first root with matches, ensuring comprehensive cross-root coverage
- Parallelize rebuild_index across roots using rayon::par_iter
- Remove unnecessary #[derive(Clone)] from ResolvedProject (move suffices)
- validate DOCS_ROOT and docs_root paths with is_dir() before accepting
- improve tool_search_global_multi error message with root count
- raise WalkDir max_depth from 5 to 10 for deeper doc trees
- document build_index thread safety at parallel rebuild site
- replace manual remove_dir_all with RAII TempDir guard in tests
…h sources, remove duplicate test

- mcp.rs: fix ambiguous_env logic — was checking found.is_some() before
  storing the first match, so ambiguity was never detected; restructured
  loop to store first env match then flag on second match
- config.rs: extract expand_tilde() helper; apply tilde expansion to
  DOCS_ROOT env var and docs_root field (previously only DocRootEntry
  used expand_path() which handled ~/); fixes silent failure on paths
  like '~/.alcove/docs'
- config.rs: remove resolved_docs_roots_legacy_takes_precedence_over_vec
  test (duplicate of the precedence check already in
  resolved_docs_roots_uses_docs_roots_vec)
- config.rs: add resolved_docs_roots_expands_tilde_in_docs_root test
- config.rs: add resolved_docs_roots_blocked_docs_root_skips_to_fallback test
Rebase onto main introduced a stale inline resolve loop (is_global guard
and a second let (docs_root, resolved) block) that was already superseded
by resolve_project_multi().  Remove both dead code sections; cargo check
confirms no remaining compile errors.
@epicsagas epicsagas merged commit ae8cbdf into main Jun 8, 2026
10 of 13 checks passed
@epicsagas epicsagas deleted the orbit-multi-doc-root branch June 8, 2026 10:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant