On this page
Locate installed Claude Code binaries and the active `claude` symlink.
#claudewheel.binaries
#claudewheel.binaries
Locate installed Claude Code binaries and the active claude symlink.
#BinaryLocator
Locate the Claude Code binary for a version, the fallback symlink, and installed versions.
versions_dir and claude_symlink live outside ~/.claudewheel -- they locate the Claude Code binary itself, not claudewheel's own data.
#default
def default(cls) -> 'BinaryLocator'Build a locator at today's default paths, computed at call time.
#binary_for
def binary_for(self, version: str) -> PathReturn the on-disk path for a specific installed version's binary.
#fallback
def fallback(self) -> PathReturn the claude symlink used when no specific version is selected.
#installed_versions
def installed_versions(self) -> list[str]List installed version names, newest first.
Mirrors the cli versions handler: only regular files under versions_dir count, sorted by :func:version_sort_key descending. Returns an empty list when versions_dir is not a directory.
#symlink_target
def symlink_target(self) -> Path | NoneReturn the resolved target of the claude symlink, or None.
Returns None when the symlink does not exist or cannot be resolved. The current version name is the .name of the returned path.
#effective_cli_version
def effective_cli_version(selected: str | None, locator: BinaryLocator) -> str | NoneResolve the Claude Code version a launch would actually run.
The version segment's selection wins; with none, the launch runs whatever the claude symlink points at, so the symlink target's name is the answer. None means the version cannot be determined -- no selection and no resolvable symlink.
This is the ONE place that fallback is expressed. Both readers of MODEL_MIN_CLI_VERSION call it -- the pre-launch model-version guard and the model picker's dimming -- so the picker cannot dim a model the guard would have let through, or the other way round.