Problem
omm engine status/doctor가 brew(cask/formula)·winget·flatpak로 설치 안 한 러너는
버전을 "Not identified"로만 표시함. 공식 설치 프로그램(dmg 드래그, exe 직접 설치)이나
CLI-only 설치(예: ollama formula 없이 그냥 바이너리)는 전부 여기 해당.
원인: engine_manager.py:106-129 inspect_engine() → package_receipt()
(engine_manager.py:49-103)가 오직 brew/winget/flatpak DB만 조회함. 앱 설치 여부 자체는
linker.py의 별도 경로(_app_bundle_installed, is_ollama_installed,
is_lmstudio_installed, _lms_cli_path)로 정확히 잡는데, 그 정보를 버전 조회엔 안 씀.
부수 발견: API가 살아있을 때 OllamaAdapter.health()/LMStudioAdapter.health()가 실제로
/api/version, x-lm-studio-version 헤더에서 버전을 얻어와 inspect_engine()의
runtime_version에 담아두는데(engine_manager.py:122-126), cli_views.py:57-70
print_engines()가 이 필드를 테이블에 아예 안 씀. package_receipt 없으면 API 켜져 있어도
"Not identified"로 뜸.
Proposed solution
표시 전용 버전 폴백 추가. package_receipt()/PackageReceipt 자체는 손대지 않음 — 이건
plan_action/execute_action(engine_manager.py:153-, update/uninstall 커맨드 조립)이
"실제 관리 가능한 패키지 매니저"라는 가정으로 쓰는 값이라, 여기 정보를 섞으면
omm engine update가 존재하지 않는 관리 경로로 명령을 만들 위험 있음.
대신 inspect_engine()에 별도 표시용 필드(detected_version 등) 추가, 우선순위:
- macOS:
<앱>.app/Contents/Info.plist의 CFBundleShortVersionString
(Ollama.app, LM Studio.app 등 — 이미 _app_bundle_installed가 아는 경로 재사용)
- Windows: exe 버전 리소스.
ctypes + version.dll
(GetFileVersionInfoSizeW/GetFileVersionInfoW/VerQueryValueW)로 stdlib만으로 가능,
새 의존성 불필요
- CLI 버전 플래그:
ollama -v (formula/바이너리 전용 설치, .app 없어도 잡힘).
LM Studio는 lms 서브커맨드에 버전 옵션 있는지 먼저 확인 필요
- 이미 있는
runtime_version(API 응답)을 package_receipt 없을 때 폴백으로 테이블에
노출 — 이건 새 감지 로직 없이 cli_views.py 한 줄 수정으로 해결됨
Alternatives considered
package_receipt()에 Info.plist/CLI 결과를 얹어 하나의 반환값으로 합치는 안 — 기각.
위에서 설명한 대로 update/uninstall 명령 조립 로직이 receipt를 "관리 가능한 패키지"로
가정하기 때문에, 관리 불가능한 감지 결과를 같은 타입으로 섞으면 위험함.
Additional context
관련 위치: engine_manager.py:49-129 (package_receipt, inspect_engine),
cli_views.py:57-70 (print_engines), linker.py
(_app_bundle_installed, is_ollama_installed, is_lmstudio_installed, _lms_cli_path).
테스트: macOS Info.plist 목킹, Windows ctypes 목킹, CLI subprocess 목킹 각각 필요.
표시 전용 변경이라 우선순위는 낮음(cosmetic), omm engine update/uninstall 동작에는
영향 없어야 함.
관련 이슈: #365 (brew cask 쿼리 버그 — 이걸 먼저 고쳐야 이 이슈의
"Not identified" 케이스가 정말 brew 밖 설치인지, 아니면 그냥 쿼리가 깨진 건지 명확해짐).
Problem
omm engine status/doctor가 brew(cask/formula)·winget·flatpak로 설치 안 한 러너는버전을 "Not identified"로만 표시함. 공식 설치 프로그램(dmg 드래그, exe 직접 설치)이나
CLI-only 설치(예:
ollamaformula 없이 그냥 바이너리)는 전부 여기 해당.원인:
engine_manager.py:106-129inspect_engine()→package_receipt()(
engine_manager.py:49-103)가 오직 brew/winget/flatpak DB만 조회함. 앱 설치 여부 자체는linker.py의 별도 경로(_app_bundle_installed,is_ollama_installed,is_lmstudio_installed,_lms_cli_path)로 정확히 잡는데, 그 정보를 버전 조회엔 안 씀.부수 발견: API가 살아있을 때
OllamaAdapter.health()/LMStudioAdapter.health()가 실제로/api/version,x-lm-studio-version헤더에서 버전을 얻어와inspect_engine()의runtime_version에 담아두는데(engine_manager.py:122-126),cli_views.py:57-70print_engines()가 이 필드를 테이블에 아예 안 씀. package_receipt 없으면 API 켜져 있어도"Not identified"로 뜸.
Proposed solution
표시 전용 버전 폴백 추가.
package_receipt()/PackageReceipt자체는 손대지 않음 — 이건plan_action/execute_action(engine_manager.py:153-, update/uninstall 커맨드 조립)이"실제 관리 가능한 패키지 매니저"라는 가정으로 쓰는 값이라, 여기 정보를 섞으면
omm engine update가 존재하지 않는 관리 경로로 명령을 만들 위험 있음.대신
inspect_engine()에 별도 표시용 필드(detected_version등) 추가, 우선순위:<앱>.app/Contents/Info.plist의CFBundleShortVersionString(
Ollama.app,LM Studio.app등 — 이미_app_bundle_installed가 아는 경로 재사용)ctypes+version.dll(
GetFileVersionInfoSizeW/GetFileVersionInfoW/VerQueryValueW)로 stdlib만으로 가능,새 의존성 불필요
ollama -v(formula/바이너리 전용 설치, .app 없어도 잡힘).LM Studio는
lms서브커맨드에 버전 옵션 있는지 먼저 확인 필요runtime_version(API 응답)을package_receipt없을 때 폴백으로 테이블에노출 — 이건 새 감지 로직 없이
cli_views.py한 줄 수정으로 해결됨Alternatives considered
package_receipt()에 Info.plist/CLI 결과를 얹어 하나의 반환값으로 합치는 안 — 기각.위에서 설명한 대로 update/uninstall 명령 조립 로직이 receipt를 "관리 가능한 패키지"로
가정하기 때문에, 관리 불가능한 감지 결과를 같은 타입으로 섞으면 위험함.
Additional context
관련 위치:
engine_manager.py:49-129(package_receipt,inspect_engine),cli_views.py:57-70(print_engines),linker.py(
_app_bundle_installed,is_ollama_installed,is_lmstudio_installed,_lms_cli_path).테스트: macOS Info.plist 목킹, Windows ctypes 목킹, CLI subprocess 목킹 각각 필요.
표시 전용 변경이라 우선순위는 낮음(cosmetic),
omm engine update/uninstall동작에는영향 없어야 함.
관련 이슈: #365 (brew cask 쿼리 버그 — 이걸 먼저 고쳐야 이 이슈의
"Not identified" 케이스가 정말 brew 밖 설치인지, 아니면 그냥 쿼리가 깨진 건지 명확해짐).