{"record":{"id":"d8a2eaac9da722c4","repo":"oraios/serena","slug":"download-failed-could-not-find-marksman-executabl","errorCode":null,"errorMessage":"Download failed? Could not find marksman executable at {marksman_executable_path}","messagePattern":"Download failed\\? Could not find marksman executable at (.+?)","errorType":"exception","errorClass":"FileNotFoundError","httpStatus":null,"severity":"error","filePath":"src/solidlsp/language_servers/marksman.py","lineNumber":140,"sourceCode":"            \"\"\"Setup runtime dependencies for marksman and return the command to start the server.\"\"\"\n            marksman_version = self._custom_settings.get(\"marksman_version\", DEFAULT_MARKSMAN_VERSION)\n            deps = self._runtime_dependencies(marksman_version)\n            dependency = deps.get_single_dep_for_current_platform()\n\n            # legacy unversioned dir reserved for INITIAL; every other version goes into a versioned subdir\n            marksman_ls_dir = (\n                self._ls_resources_dir\n                if marksman_version == INITIAL_MARKSMAN_VERSION\n                else os.path.join(self._ls_resources_dir, f\"marksman-{marksman_version}\")\n            )\n            marksman_executable_path = deps.binary_path(marksman_ls_dir)\n            if not os.path.exists(marksman_executable_path):\n                log.info(\n                    f\"Downloading marksman from {dependency.url} to {marksman_ls_dir}\",\n                )\n                deps.install(marksman_ls_dir)\n            if not os.path.exists(marksman_executable_path):\n                raise FileNotFoundError(f\"Download failed? Could not find marksman executable at {marksman_executable_path}\")\n            os.chmod(marksman_executable_path, 0o755)\n            return marksman_executable_path\n\n        def _create_launch_command(self, core_path: str) -> list[str]:\n            return [core_path, \"server\"]\n\n    def __init__(self, config: LanguageServerConfig, repository_root_path: str, solidlsp_settings: SolidLSPSettings):\n        \"\"\"\n        Creates a Marksman instance. This class is not meant to be instantiated directly.\n        Use LanguageServer.create() instead.\n        \"\"\"\n        super().__init__(\n            config,\n            repository_root_path,\n            None,\n            \"markdown\",\n            solidlsp_settings,\n        )","sourceCodeStart":122,"sourceCodeEnd":158,"githubUrl":"https://github.com/oraios/serena/blob/7fcbca7e62555ec2287ddb2f083caee805848ea6/src/solidlsp/language_servers/marksman.py#L122-L158","documentation":"marksman downloads its binary on first use via the deps installer. After running deps.install, the code re-checks for the executable and raises FileNotFoundError if it still does not exist, indicating the download or install layout did not produce the expected file at marksman_executable_path.","triggerScenarios":"First-run auto-install of marksman where deps.install(marksman_ls_dir) fails to place the binary (network failure, unsupported platform asset, 404 from GitHub releases, or proxy blocking the download) and the subsequent os.path.exists check fails.","commonSituations":"Corporate proxies or firewalls blocking GitHub downloads; marksman release assets changed for your OS/arch; disk permission problems in the install directory; offline environments.","solutions":["Check network/proxy access to the marksman release URL (dependency.url) and retry","Manually download the marksman binary for your platform and place it at the expected path in the marksman install directory, then chmod +x","Check logs for the underlying download error from deps.install and verify the URL still serves assets for your OS/arch"],"exampleFix":"# before (rely on auto-download)\nls = SolidLSP(\"marksman\")\n# after (pre-install manually)\n# curl -L -o ~/.serena/language_servers/static/marksman/marksman <release-url> && chmod +x .../marksman\nls = SolidLSP(\"marksman\")","handlingStrategy":"retry","validationCode":"import os\nmarksman_dir = \"<install_dir>\"\nexe = os.path.join(marksman_dir, \"marksman\")\nassert os.path.exists(exe) and os.access(exe, os.X_OK), \"pre-install marksman first\"","typeGuard":"def marksman_installed(path: str) -> bool:\n    return os.path.isfile(path) and os.access(path, os.X_OK)","tryCatchPattern":"try:\n    ls = SolidLSP(\"marksman\")\nexcept FileNotFoundError as e:\n    if \"marksman executable\" in str(e):\n        manually_download_and_chmod(marksman_dir)\n        ls = SolidLSP(\"marksman\")\n    else:\n        raise","preventionTips":["Pre-install the marksman binary in the expected location instead of relying on auto-download","Ensure egress to GitHub releases from CI/proxied environments","Verify disk permissions on the language server install directory"],"tags":["network","download","installation","marksman"],"backgroundTag":"binary-download-failed","analyzedSha":"7fcbca7e62555ec2287ddb2f083caee805848ea6","analyzedAt":"2026-08-29T00:04:09.619Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}