oraios/serena · error · FileNotFoundError

Taplo executable not found at {taplo_executable}. Installati

Error message

Taplo executable not found at {taplo_executable}. Installation may have failed. Try installing manually: cargo install taplo-cli --locked

What it means

After the Taplo language server auto-installer downloads and extracts the Taplo archive, it verifies that the expected executable path actually exists. If the file is still missing post-install, it raises FileNotFoundError because the language server cannot be started without the binary. It is a defensive post-condition check against failed or silently-corrupted downloads/extraction.

Source

Thrown at src/solidlsp/language_servers/taplo_server.py:166

            # Setup local installation directory; legacy unversioned dir reserved for INITIAL only
            taplo_version = self._custom_settings.get("taplo_version", DEFAULT_TAPLO_VERSION)
            ls_dirname = "taplo" if taplo_version == INITIAL_TAPLO_VERSION else f"taplo-{taplo_version}"
            taplo_dir = os.path.join(self._ls_resources_dir, ls_dirname)
            os.makedirs(taplo_dir, exist_ok=True)
            _, executable_name = _get_taplo_download_url(taplo_version)
            taplo_executable = os.path.join(taplo_dir, executable_name)

            if os.path.exists(taplo_executable) and os.access(taplo_executable, os.X_OK):
                log.info(f"Using cached Taplo at: {taplo_executable}")
                return taplo_executable

            # Download and install Taplo
            log.info(f"Taplo not found. Downloading version {taplo_version}...")
            self._download_taplo(taplo_dir, taplo_executable, taplo_version)

            if not os.path.exists(taplo_executable):
                raise FileNotFoundError(
                    f"Taplo executable not found at {taplo_executable}. "
                    "Installation may have failed. Try installing manually: cargo install taplo-cli --locked"
                )

            return taplo_executable

        def _create_launch_command(self, core_path: str) -> list[str]:
            return [core_path, "lsp", "stdio"]

        @classmethod
        def _download_taplo(cls, install_dir: str, executable_path: str, version: str = DEFAULT_TAPLO_VERSION) -> None:
            """Download and extract Taplo binary using the shared verified download helper."""
            download_url, _ = _get_taplo_download_url(version)
            archive_filename = os.path.basename(download_url)
            # only verify the SHA when the resolved version is one of our pinned ones (INITIAL or current DEFAULT)
            expected_hash = _taplo_sha(version, archive_filename)
            if expected_hash is None and version in (INITIAL_TAPLO_VERSION, DEFAULT_TAPLO_VERSION):
                raise RuntimeError(f"No SHA256 checksum configured for Taplo archive: {archive_filename}")

View on GitHub (pinned to 7fcbca7e62)

Solutions

  1. Install Taplo manually: `cargo install taplo-cli --locked`, or download the binary from Taplo GitHub releases and put it on PATH, so auto-install never runs.
  2. Delete the partial Taplo install directory (under the SolidLSP runtime deps dir) and retry to force a clean re-download.
  3. Check the install directory for a nested binary layout; symlink or move the `taplo` binary to the expected executable path.
  4. Verify network/proxy access to the Taplo release download URL and adequate disk space/permissions in the install dir.

Example fix

// before: relying on auto-install on a machine with restricted egress
ls = SolidLanguageServer.create("taplo")  // FileNotFoundError after failed download
// after: install taplo yourself so auto-install is skipped
cargo install taplo-cli --locked  # or download release binary into ~/.local/bin
ls = SolidLanguageServer.create("taplo")
Defensive patterns

Strategy: fallback

Validate before calling

import shutil
if shutil.which("taplo") is None:
    # pre-install so auto-install path is never exercised
    subprocess.run(["cargo", "install", "taplo-cli", "--locked"], check=True)
assert shutil.which("taplo") is not None

Type guard

def taplo_available() -> bool:
    return shutil.which("taplo") is not None and os.path.isfile(shutil.which("taplo"))

Try / catch

try:
    server = SolidLanguageServer.create("taplo")
except FileNotFoundError:
    subprocess.run(["cargo", "install", "taplo-cli", "--locked"], check=True)
    server = SolidLanguageServer.create("taplo")

Prevention

When it happens

Trigger: Creating or starting the Taplo language server (via _get_or_install_core_dependency) when the binary `taplo` is not already on PATH, the download step runs, and os.path.exists(taplo_executable) is still False after _download_taplo returns (e.g. archive extracted to an unexpected subdirectory or extraction silently skipped).

Common situations: Offline or proxied networks where the download half-succeeds; non-glibc Linux (musl/Alpine) where the pinned archive layout differs; filesystem permission problems in the install dir; Taplo changing archive contents between versions so the binary lands at a nested path like taplo-<ver>/taplo.

Related errors


AI-assisted analysis of oraios/serena@7fcbca7e62 (2026-08-29). Data as JSON: /api/errors/ecd3c7dac44d5f6a. Report an issue: GitHub.