public boolean isInstalled() {
		if (installDir == null) {
			return false;
		}

		// If running out of a jar and the install path is valid, just return true. The alternative
		// would be to inspect the jar and verify that the install path is there and is valid, but
		// that's overkill.
		if (Application.inSingleJarMode()) {
			return true;
		}

		File f = new File(installDir, ModuleUtilities.MANIFEST_FILE_NAME);
		return f.exists();
	}
An extension is known to be installed if it has a valid installation path AND that path
contains a Module.manifest file.   Extensions that are {@link #isPendingUninstall()} are 
still on the filesystem, may be in use by the tool, but will be removed upon restart.
<p>
Note: The module manifest file is a marker that indicates several things; one of which is
the installation status of an extension. When a user marks an extension to be uninstalled via
the UI, the only thing that is done is to remove this manifest file, which tells the tool to 
remove the entire extension directory on the next launch.

@return true if the extension is installed.
Ghidra/Framework/Generic/src/main/java/ghidra/util/extensions/ExtensionDetails.java