{"record":{"id":"8c83dadf54336bd9","repo":"xpipe-io/xpipe","slug":"incompatible-development-version-source-source","errorCode":null,"errorMessage":"Incompatible development version. Source: ${source}, Installation: ${install}\n\nPlease try to check out the matching release version in the repository. See https://github.com/xpipe-io/xpipe/blob/master/CONTRIBUTING.md#development-setup","messagePattern":"Incompatible development version\\. Source: (.+?), Installation: (.+?)\n\nPlease try to check out the matching release version in the repository\\. See https://github\\.com/xpipe-io/xpipe/blob/master/CONTRIBUTING\\.md#development-setup","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"app/src/main/java/io/xpipe/app/core/AppExtensionManager.java","lineNumber":146,"sourceCode":"                    Path p = localInstallation.getBaseInstallationPath();\n                    if (!Files.exists(p)) {\n                        throw new IllegalStateException(\n                                \"Required local \" + AppNames.ofCurrent().getName()\n                                        + \" installation was not found but is required for development. See https://github\"\n                                        + \".com/xpipe-io/xpipe/blob/master/CONTRIBUTING.md#development-setup\");\n                    }\n\n                    if (AppProperties.get().isLocatorVersionCheck()) {\n                        var iv = getLocalInstallVersion(localInstallation);\n                        var installVersion = AppVersion.parse(iv)\n                                .orElseThrow(() -> new IllegalArgumentException(\"Invalid installation version: \" + iv));\n                        var sv = !AppProperties.get().isImage()\n                                ? Files.readString(Path.of(\"version\")).strip()\n                                : AppProperties.get().getVersion();\n                        var sourceVersion = AppVersion.parse(sv)\n                                .orElseThrow(() -> new IllegalArgumentException(\"Invalid source version: \" + sv));\n                        if (!installVersion.equals(sourceVersion)) {\n                            throw new IllegalStateException(\"Incompatible development version. Source: \" + sv\n                                    + \", Installation: \"\n                                    + iv\n                                    + \"\\n\\nPlease try to check out the matching release version in the repository. See https://github\"\n                                    + \".com/xpipe-io/xpipe/blob/master/CONTRIBUTING.md#development-setup\");\n                        }\n                    }\n\n                    externalModuleFileSystem = FileSystems.newFileSystem(\n                            URI.create(\"jrt:/\"),\n                            Map.of(\n                                    \"java.home\",\n                                    localInstallation.getRuntimePath().toString()));\n                }\n\n                var moduleName = \"io.xpipe.ext.\" + name;\n                var basePath = externalModuleFileSystem.getPath(\"modules\", moduleName);\n                var found = parseExtensionDirectory(basePath, parent);\n                if (found.isPresent()) {","sourceCodeStart":128,"sourceCodeEnd":164,"githubUrl":"https://github.com/xpipe-io/xpipe/blob/d85ca821baa46092a320ebb13546d7240adb74f8/app/src/main/java/io/xpipe/app/core/AppExtensionManager.java#L128-L164","documentation":"XPipe throws this when a development (non-packaged image) build is run and the version file in the checked-out source repository does not match the version the installed extension bundle was built for. It guards against running a mismatched dev source tree against prebuilt extension artifacts. The message directs developers to check out the release tag matching their installation.","triggerScenarios":"Running the app from source (AppProperties.isImage() == false) via findAndParseExtension: the 'version' file in the repo root is parsed and compared to the installation's version; any inequality throws.","commonSituations":"Developer checked out master/main after a release bump while still using extensions installed from an older release; stale local build artifacts from a previous version; forgot to run the build step that regenerates the version file.","solutions":["Check out the git tag/release matching the installed version (see CONTRIBUTING.md development-setup section)","Rebuild the installation so its version matches the source 'version' file","Update the local 'version' file only if you intentionally align with the installed build","Run a clean build to remove stale artifacts from the previous version"],"exampleFix":"// before\ngit checkout master   # version file says 1.2.3, installation is 1.2.2\n// after\ngit checkout 1.2.2    # or rebuild the installation from current source","handlingStrategy":"validation","validationCode":"var src = Files.readString(Path.of(\"version\")).strip();\nif (!src.equals(AppProperties.get().getVersion())) {\n    throw new IllegalStateException(\"Checkout version \" + src + \" != installed \" + AppProperties.get().getVersion());\n}","typeGuard":null,"tryCatchPattern":"try { extManager.extension(...); } catch (IllegalStateException e) { if (e.getMessage().startsWith(\"Incompatible development version\")) { /* rebuild or checkout matching tag */ } else throw e; }","preventionTips":["Always check out the release tag before running from source against installed extensions","Keep the repo-root 'version' file in sync via the build","Do a clean rebuild after switching branches"],"tags":["versioning","build","development-setup"],"backgroundTag":"version-mismatch","analyzedSha":"d85ca821baa46092a320ebb13546d7240adb74f8","analyzedAt":"2026-09-06T14:30:08.251Z","contentChangedAt":"2026-09-06T14:30:08.251Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}