fix(config): use XDG-standard paths on macOS (prevent DataOnly reset deleting config) #118

Merged
altair823 merged 1 commits from fix/xdg-macos-path-collision into main 2026-05-07 13:01:02 +00:00
Owner

버그

macOS 에서 dirs::config_dir()dirs::data_dir() 이 동일하게 ~/Library/Application Support/ 반환. 결과:

  • config 파일: ~/Library/Application Support/kebab/config.toml
  • data dir: ~/Library/Application Support/kebab/

kebab reset (DataOnly) 가 data_dir 을 삭제하면 config 파일도 같은 경로에 있으므로 함께 삭제됨. 사용자가 workspace.root 등 커스텀 설정을 잃는 데이터 손실 버그.

수정

xdg_config_path, xdg_data_dir, xdg_cache_dir 에서 dirs crate fallback 제거 → $HOME/.config, $HOME/.local/share, $HOME/.cache 직접 사용. xdg_state_dir 은 이미 같은 패턴 사용 중 (변경 없음).

새 경로 (macOS):

  • config: ~/.config/kebab/config.toml
  • data: ~/.local/share/kebab/
  • cache: ~/.cache/kebab/
  • state: ~/.local/state/kebab/ (unchanged)

마이그레이션

Config::load(None) 에서 새 경로가 없고 macOS legacy path (~/Library/Application Support/kebab/config.toml) 가 있으면 자동 copy 후 stderr 안내 출력. data dir (SQLite / vector store) 는 크기 문제로 auto-migration 없음 — kebab init + kebab ingest 로 재생성 필요.

테스트

기존 31개 kebab-config 테스트 통과. xdg_paths_honor_envXDG_CONFIG_HOME env 가 설정된 경우를 커버 (변경 없음).

## 버그 macOS 에서 `dirs::config_dir()` 과 `dirs::data_dir()` 이 동일하게 `~/Library/Application Support/` 반환. 결과: - config 파일: `~/Library/Application Support/kebab/config.toml` - data dir: `~/Library/Application Support/kebab/` `kebab reset` (DataOnly) 가 `data_dir` 을 삭제하면 config 파일도 같은 경로에 있으므로 함께 삭제됨. 사용자가 `workspace.root` 등 커스텀 설정을 잃는 데이터 손실 버그. ## 수정 `xdg_config_path`, `xdg_data_dir`, `xdg_cache_dir` 에서 `dirs` crate fallback 제거 → `$HOME/.config`, `$HOME/.local/share`, `$HOME/.cache` 직접 사용. `xdg_state_dir` 은 이미 같은 패턴 사용 중 (변경 없음). **새 경로 (macOS):** - config: `~/.config/kebab/config.toml` - data: `~/.local/share/kebab/` - cache: `~/.cache/kebab/` - state: `~/.local/state/kebab/` (unchanged) ## 마이그레이션 `Config::load(None)` 에서 새 경로가 없고 macOS legacy path (`~/Library/Application Support/kebab/config.toml`) 가 있으면 자동 copy 후 stderr 안내 출력. data dir (SQLite / vector store) 는 크기 문제로 auto-migration 없음 — `kebab init` + `kebab ingest` 로 재생성 필요. ## 테스트 기존 31개 kebab-config 테스트 통과. `xdg_paths_honor_env` 는 `XDG_CONFIG_HOME` env 가 설정된 경우를 커버 (변경 없음).
altair823 added 1 commit 2026-05-07 13:00:09 +00:00
dirs::config_dir() and dirs::data_dir() both return ~/Library/Application Support
on macOS, so data_dir == config parent dir. ResetScope::DataOnly removes data_dir
and silently deletes config.toml along with it.

Fix: bypass dirs crate fallback for config/data/cache dirs; use
$HOME/.config, $HOME/.local/share, $HOME/.cache directly (XDG standard).
xdg_state_dir already used this pattern. dirs::home_dir() still used for
portability.

Migration: Config::load(None) auto-copies legacy ~/Library/Application
Support/kebab/config.toml to the new ~/.config/kebab/ on first run and
prints a migration notice to stderr.
altair823 merged commit 6f0b2bcc37 into main 2026-05-07 13:01:02 +00:00
altair823 deleted branch fix/xdg-macos-path-collision 2026-05-07 13:01:03 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: altair823-org/kebab#118