Skip to content

Commit 30f89e5

Browse files
nam-hleclaude
andauthored
#49 Consume nadle kernel for workspace resolution (#59)
* #49 Consume nadle kernel for workspace resolution - Port @nadle/kernel functions (deriveWorkspaceId, parseTaskReference, composeTaskIdentifier, isWorkspaceQualified, isRootWorkspaceId) to NadleKernel.kt with 18 unit tests - Fix leading colon prefix divergence: task names now use kernel convention (packages:lib:build instead of :packages:lib:build) - Consolidate duplicated NADLE_CONFIG_PATTERN into NadleFileUtil - Add NadleProjectService with @nadle/project-resolver CLI integration, JSON parsing, caching, and VFS-based cache invalidation - Refactor NadleToolWindowPanel and NadleTaskSearchEverywhereContributor to use project service with fallback to NadleTaskScanner - Bundle @nadle/project-resolver in plugin JAR alongside language server - Update nightly packages to @4e92eba Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * #49 Fix LSP server: always use bundled server with manifest-based extraction - Remove project-local and global resolution from NadleLspServerDescriptor, always use the bundled language server from plugin JAR - Rewrite NadleLspServerExtractor to use a build-time manifest for reliable extraction across all classloader types (IntelliJ PathClassLoader, JAR, file) - Generate manifest.txt in BundleLspServerTask listing all bundled files - Add version-based staleness check to avoid partial extractions Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * #49 Resolve project-resolver CLI through nadle symlink for pnpm support Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 5033d42 commit 30f89e5

File tree

13 files changed

+682
-140
lines changed

13 files changed

+682
-140
lines changed

build.gradle.kts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,13 @@ abstract class BundleLspServerTask : DefaultTask() {
148148
File(serverPkg, "lib").listFiles()?.filter { it.name.endsWith(".js") }?.forEach {
149149
it.copyTo(File(libDir, it.name), overwrite = true)
150150
}
151+
152+
// Write manifest listing all files for runtime extraction
153+
val files = mutableListOf("server.mjs", "lib/package.json")
154+
File(serverPkg, "lib").listFiles()?.filter { it.name.endsWith(".js") }?.forEach {
155+
files.add("lib/${it.name}")
156+
}
157+
File(outputDir, "manifest.txt").writeText(files.joinToString("\n"))
151158
}
152159
}
153160

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"private": true,
33
"devDependencies": {
4-
"@nadle/language-server": "https://pkg.pr.new/nadlejs/nadle/@nadle/language-server@bd64301"
4+
"@nadle/language-server": "https://pkg.pr.new/nadlejs/nadle/@nadle/language-server@4e92eba",
5+
"@nadle/project-resolver": "https://pkg.pr.new/nadlejs/nadle/@nadle/project-resolver@4e92eba"
56
}
67
}

pnpm-lock.yaml

Lines changed: 152 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main/kotlin/com/github/nadlejs/intellij/plugin/lsp/NadleLspServerDescriptor.kt

Lines changed: 2 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import com.intellij.openapi.project.Project
88
import com.intellij.openapi.vfs.VirtualFile
99
import com.intellij.platform.lsp.api.ProjectWideLspServerDescriptor
1010
import java.nio.file.Files
11-
import java.nio.file.Path
1211

1312
class NadleLspServerDescriptor(
1413
project: Project
@@ -28,51 +27,20 @@ class NadleLspServerDescriptor(
2827
val serverPath = resolveServerPath()
2928
?: throw IllegalStateException(
3029
"Nadle language server not found. " +
31-
"Install @nadle/language-server as a project dependency " +
32-
"or globally."
30+
"Please reinstall the plugin."
3331
)
3432

3533
return GeneralCommandLine(nodePath, serverPath)
3634
}
3735

3836
private fun resolveServerPath(): String? {
39-
val basePath = project.basePath
40-
41-
if (basePath != null) {
42-
val projectCandidates = listOf(
43-
// Consuming project: installed as dependency
44-
Path.of(basePath, "node_modules", "@nadle", "language-server", "server.mjs"),
45-
// Monorepo workspace: packages/language-server/
46-
Path.of(basePath, "packages", "language-server", "server.mjs")
47-
)
48-
49-
for (candidate in projectCandidates) {
50-
if (Files.exists(candidate)) {
51-
LOG.info("Found Nadle language server at: $candidate")
52-
return candidate.toString()
53-
}
54-
}
55-
}
56-
57-
// Use bundled language server extracted from plugin resources
5837
val bundled = NadleLspServerExtractor.getServerPath()
5938
if (bundled != null && Files.exists(bundled)) {
6039
LOG.info("Using bundled Nadle language server at: $bundled")
6140
return bundled.toString()
6241
}
6342

64-
// Try global resolution via which/where
65-
return try {
66-
val process = ProcessBuilder("which", "nadle-language-server")
67-
.redirectErrorStream(true)
68-
.start()
69-
val output = process.inputStream.bufferedReader().readText().trim()
70-
val exitCode = process.waitFor()
71-
if (exitCode == 0 && output.isNotBlank()) output else null
72-
} catch (e: Exception) {
73-
LOG.warn("Could not resolve global nadle-language-server", e)
74-
null
75-
}
43+
return null
7644
}
7745

7846
companion object {

0 commit comments

Comments
 (0)