diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index 0c28b15..0000000
--- a/.gitmodules
+++ /dev/null
@@ -1,6 +0,0 @@
-[submodule "tree-sitter-java"]
- path = tree-sitter-java
- url = https://github.com/tree-sitter/tree-sitter-java
-[submodule "tree-sitter-groovy"]
- path = tree-sitter-groovy
- url = https://github.com/murtaza64/tree-sitter-groovy.git
diff --git a/Cargo.lock b/Cargo.lock
index 5fa659e..938c437 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2,6 +2,18 @@
# It is not intended for manual editing.
version = 4
+[[package]]
+name = "ahash"
+version = "0.8.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "version_check",
+ "zerocopy",
+]
+
[[package]]
name = "aho-corasick"
version = "1.1.4"
@@ -11,6 +23,12 @@ dependencies = [
"memchr",
]
+[[package]]
+name = "allocator-api2"
+version = "0.2.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
+
[[package]]
name = "android_system_properties"
version = "0.1.5"
@@ -70,6 +88,12 @@ dependencies = [
"windows-sys 0.61.2",
]
+[[package]]
+name = "anyhow"
+version = "1.0.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
+
[[package]]
name = "async-trait"
version = "0.1.89"
@@ -104,38 +128,16 @@ version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
-[[package]]
-name = "aws-lc-rs"
-version = "1.15.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e84ce723ab67259cfeb9877c6a639ee9eb7a27b28123abd71db7f0d5d0cc9d86"
-dependencies = [
- "aws-lc-sys",
- "zeroize",
-]
-
-[[package]]
-name = "aws-lc-sys"
-version = "0.36.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43a442ece363113bd4bd4c8b18977a7798dd4d3c3383f34fb61936960e8f4ad8"
-dependencies = [
- "cc",
- "cmake",
- "dunce",
- "fs_extra",
-]
-
[[package]]
name = "axum"
-version = "0.8.8"
+version = "0.7.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8"
+checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f"
dependencies = [
+ "async-trait",
"axum-core",
"base64",
"bytes",
- "form_urlencoded",
"futures-util",
"http",
"http-body",
@@ -148,14 +150,15 @@ dependencies = [
"mime",
"percent-encoding",
"pin-project-lite",
- "serde_core",
+ "rustversion",
+ "serde",
"serde_json",
"serde_path_to_error",
"serde_urlencoded",
"sha1",
"sync_wrapper",
"tokio",
- "tokio-tungstenite",
+ "tokio-tungstenite 0.24.0",
"tower 0.5.3",
"tower-layer",
"tower-service",
@@ -164,17 +167,19 @@ dependencies = [
[[package]]
name = "axum-core"
-version = "0.5.6"
+version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1"
+checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199"
dependencies = [
+ "async-trait",
"bytes",
- "futures-core",
+ "futures-util",
"http",
"http-body",
"http-body-util",
"mime",
"pin-project-lite",
+ "rustversion",
"sync_wrapper",
"tower-layer",
"tower-service",
@@ -233,6 +238,12 @@ version = "0.6.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e"
+[[package]]
+name = "byteorder"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
+
[[package]]
name = "bytes"
version = "1.11.0"
@@ -251,24 +262,12 @@ dependencies = [
"shlex",
]
-[[package]]
-name = "cesu8"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
-
[[package]]
name = "cfg-if"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
-[[package]]
-name = "cfg_aliases"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
-
[[package]]
name = "chrono"
version = "0.4.43"
@@ -323,31 +322,12 @@ version = "0.7.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32"
-[[package]]
-name = "cmake"
-version = "0.1.57"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d"
-dependencies = [
- "cc",
-]
-
[[package]]
name = "colorchoice"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
-[[package]]
-name = "combine"
-version = "4.6.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd"
-dependencies = [
- "bytes",
- "memchr",
-]
-
[[package]]
name = "convert_case"
version = "0.10.0"
@@ -357,26 +337,6 @@ dependencies = [
"unicode-segmentation",
]
-[[package]]
-name = "core-foundation"
-version = "0.9.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
-dependencies = [
- "core-foundation-sys",
- "libc",
-]
-
-[[package]]
-name = "core-foundation"
-version = "0.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6"
-dependencies = [
- "core-foundation-sys",
- "libc",
-]
-
[[package]]
name = "core-foundation-sys"
version = "0.8.7"
@@ -613,12 +573,6 @@ dependencies = [
"litrs",
]
-[[package]]
-name = "dunce"
-version = "1.0.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"
-
[[package]]
name = "dyn-clone"
version = "1.0.20"
@@ -631,15 +585,6 @@ version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
-[[package]]
-name = "encoding_rs"
-version = "0.8.35"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
-dependencies = [
- "cfg-if",
-]
-
[[package]]
name = "equivalent"
version = "1.0.2"
@@ -700,12 +645,6 @@ dependencies = [
"percent-encoding",
]
-[[package]]
-name = "fs_extra"
-version = "1.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c"
-
[[package]]
name = "fsevent-sys"
version = "4.1.0"
@@ -821,10 +760,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
dependencies = [
"cfg-if",
- "js-sys",
"libc",
"wasi",
- "wasm-bindgen",
]
[[package]]
@@ -834,11 +771,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
dependencies = [
"cfg-if",
- "js-sys",
"libc",
"r-efi",
"wasip2",
- "wasm-bindgen",
]
[[package]]
@@ -854,30 +789,16 @@ dependencies = [
"regex-syntax",
]
-[[package]]
-name = "h2"
-version = "0.4.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54"
-dependencies = [
- "atomic-waker",
- "bytes",
- "fnv",
- "futures-core",
- "futures-sink",
- "http",
- "indexmap",
- "slab",
- "tokio",
- "tokio-util",
- "tracing",
-]
-
[[package]]
name = "hashbrown"
version = "0.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
+dependencies = [
+ "ahash",
+ "allocator-api2",
+ "serde",
+]
[[package]]
name = "hashbrown"
@@ -955,7 +876,6 @@ dependencies = [
"bytes",
"futures-channel",
"futures-core",
- "h2",
"http",
"http-body",
"httparse",
@@ -965,23 +885,6 @@ dependencies = [
"pin-utils",
"smallvec",
"tokio",
- "want",
-]
-
-[[package]]
-name = "hyper-rustls"
-version = "0.27.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58"
-dependencies = [
- "http",
- "hyper",
- "hyper-util",
- "rustls",
- "rustls-pki-types",
- "tokio",
- "tokio-rustls",
- "tower-service",
]
[[package]]
@@ -990,24 +893,14 @@ version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f"
dependencies = [
- "base64",
"bytes",
- "futures-channel",
"futures-core",
- "futures-util",
"http",
"http-body",
"hyper",
- "ipnet",
- "libc",
- "percent-encoding",
"pin-project-lite",
- "socket2",
- "system-configuration",
"tokio",
"tower-service",
- "tracing",
- "windows-registry",
]
[[package]]
@@ -1166,6 +1059,8 @@ checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017"
dependencies = [
"equivalent",
"hashbrown 0.16.1",
+ "serde",
+ "serde_core",
]
[[package]]
@@ -1188,22 +1083,6 @@ dependencies = [
"libc",
]
-[[package]]
-name = "ipnet"
-version = "2.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130"
-
-[[package]]
-name = "iri-string"
-version = "0.7.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a"
-dependencies = [
- "memchr",
- "serde",
-]
-
[[package]]
name = "is_terminal_polyfill"
version = "1.70.2"
@@ -1225,28 +1104,6 @@ version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2"
-[[package]]
-name = "jni"
-version = "0.21.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97"
-dependencies = [
- "cesu8",
- "cfg-if",
- "combine",
- "jni-sys",
- "log",
- "thiserror 1.0.69",
- "walkdir",
- "windows-sys 0.45.0",
-]
-
-[[package]]
-name = "jni-sys"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
-
[[package]]
name = "jobserver"
version = "0.1.34"
@@ -1287,6 +1144,17 @@ dependencies = [
"libc",
]
+[[package]]
+name = "lasso"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e14eda50a3494b3bf7b9ce51c52434a761e383d7238ce1dd5dcec2fbc13e9fb"
+dependencies = [
+ "dashmap 6.1.0",
+ "hashbrown 0.14.5",
+ "serde",
+]
+
[[package]]
name = "lazy_static"
version = "1.5.0"
@@ -1342,12 +1210,6 @@ version = "0.4.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
-[[package]]
-name = "lru-slab"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154"
-
[[package]]
name = "lsp-types"
version = "0.94.1"
@@ -1372,9 +1234,9 @@ dependencies = [
[[package]]
name = "matchit"
-version = "0.8.4"
+version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3"
+checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"
[[package]]
name = "memchr"
@@ -1401,42 +1263,153 @@ dependencies = [
]
[[package]]
-name = "naviscope"
-version = "0.2.1"
+name = "naviscope-api"
+version = "0.5.0"
+dependencies = [
+ "async-trait",
+ "lasso",
+ "schemars",
+ "serde",
+ "serde_json",
+ "thiserror 2.0.17",
+]
+
+[[package]]
+name = "naviscope-cli"
+version = "0.5.0"
dependencies = [
- "axum",
- "cc",
"clap",
- "dashmap 6.1.0",
"dirs",
- "futures",
+ "indexmap",
+ "naviscope-api",
+ "naviscope-lsp",
+ "naviscope-mcp",
+ "naviscope-runtime",
+ "nu-ansi-term",
+ "petgraph",
+ "reedline",
+ "serde",
+ "serde_json",
+ "shlex",
+ "tabled",
+ "tokio",
+ "tracing",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "naviscope-core"
+version = "0.5.0"
+dependencies = [
+ "async-trait",
"ignore",
+ "lasso",
"log",
+ "lsp-types",
+ "naviscope-api",
"notify",
- "nu-ansi-term",
+ "once_cell",
"petgraph",
"rayon",
- "reedline",
"regex",
- "reqwest",
- "rmcp",
"rmp-serde",
"schemars",
"serde",
"serde_json",
- "shlex",
- "tabled",
"thiserror 2.0.17",
"tokio",
- "tokio-tungstenite",
"tokio-util",
- "tower-lsp",
"tracing",
"tracing-appender",
"tracing-subscriber",
"tree-sitter",
+ "tree-sitter-java",
+ "url",
"walkdir",
"xxhash-rust",
+ "zstd",
+]
+
+[[package]]
+name = "naviscope-gradle"
+version = "0.5.0"
+dependencies = [
+ "lasso",
+ "naviscope-api",
+ "naviscope-core",
+ "once_cell",
+ "petgraph",
+ "rmp-serde",
+ "serde",
+ "serde_json",
+ "thiserror 2.0.17",
+ "tree-sitter",
+ "tree-sitter-groovy",
+]
+
+[[package]]
+name = "naviscope-java"
+version = "0.5.0"
+dependencies = [
+ "lasso",
+ "lsp-types",
+ "naviscope-api",
+ "naviscope-core",
+ "petgraph",
+ "rmp-serde",
+ "serde",
+ "serde_json",
+ "thiserror 2.0.17",
+ "tree-sitter",
+ "tree-sitter-java",
+]
+
+[[package]]
+name = "naviscope-lsp"
+version = "0.5.0"
+dependencies = [
+ "dashmap 6.1.0",
+ "naviscope-api",
+ "naviscope-mcp",
+ "petgraph",
+ "serde",
+ "serde_json",
+ "tokio",
+ "tokio-util",
+ "tower-lsp",
+ "tracing",
+ "tree-sitter",
+]
+
+[[package]]
+name = "naviscope-mcp"
+version = "0.5.0"
+dependencies = [
+ "anyhow",
+ "axum",
+ "futures",
+ "naviscope-api",
+ "rmcp",
+ "schemars",
+ "serde",
+ "serde_json",
+ "tokio",
+ "tokio-tungstenite 0.28.0",
+ "tokio-util",
+ "tower-lsp",
+ "tracing",
+ "xxhash-rust",
+]
+
+[[package]]
+name = "naviscope-runtime"
+version = "0.5.0"
+dependencies = [
+ "naviscope-api",
+ "naviscope-core",
+ "naviscope-gradle",
+ "naviscope-java",
+ "tracing",
]
[[package]]
@@ -1499,12 +1472,6 @@ version = "1.70.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
-[[package]]
-name = "openssl-probe"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe"
-
[[package]]
name = "option-ext"
version = "0.2.0"
@@ -1602,6 +1569,12 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+[[package]]
+name = "pkg-config"
+version = "0.3.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
+
[[package]]
name = "potential_utf"
version = "0.1.4"
@@ -1658,84 +1631,49 @@ dependencies = [
]
[[package]]
-name = "quinn"
-version = "0.11.9"
+name = "quote"
+version = "1.0.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20"
+checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a"
dependencies = [
- "bytes",
- "cfg_aliases",
- "pin-project-lite",
- "quinn-proto",
- "quinn-udp",
- "rustc-hash",
- "rustls",
- "socket2",
- "thiserror 2.0.17",
- "tokio",
- "tracing",
- "web-time",
+ "proc-macro2",
]
[[package]]
-name = "quinn-proto"
-version = "0.11.13"
+name = "r-efi"
+version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31"
-dependencies = [
- "aws-lc-rs",
- "bytes",
- "getrandom 0.3.4",
- "lru-slab",
- "rand",
- "ring",
- "rustc-hash",
- "rustls",
- "rustls-pki-types",
- "slab",
- "thiserror 2.0.17",
- "tinyvec",
- "tracing",
- "web-time",
-]
+checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
[[package]]
-name = "quinn-udp"
-version = "0.5.14"
+name = "rand"
+version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
dependencies = [
- "cfg_aliases",
"libc",
- "once_cell",
- "socket2",
- "tracing",
- "windows-sys 0.60.2",
+ "rand_chacha 0.3.1",
+ "rand_core 0.6.4",
]
[[package]]
-name = "quote"
-version = "1.0.43"
+name = "rand"
+version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a"
+checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
dependencies = [
- "proc-macro2",
+ "rand_chacha 0.9.0",
+ "rand_core 0.9.5",
]
[[package]]
-name = "r-efi"
-version = "5.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
-
-[[package]]
-name = "rand"
-version = "0.9.2"
+name = "rand_chacha"
+version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [
- "rand_chacha",
- "rand_core",
+ "ppv-lite86",
+ "rand_core 0.6.4",
]
[[package]]
@@ -1745,7 +1683,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
dependencies = [
"ppv-lite86",
- "rand_core",
+ "rand_core 0.9.5",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom 0.2.17",
]
[[package]]
@@ -1864,63 +1811,8 @@ dependencies = [
[[package]]
name = "regex-syntax"
version = "0.8.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58"
-
-[[package]]
-name = "reqwest"
-version = "0.13.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "04e9018c9d814e5f30cc16a0f03271aeab3571e609612d9fe78c1aa8d11c2f62"
-dependencies = [
- "base64",
- "bytes",
- "encoding_rs",
- "futures-core",
- "futures-util",
- "h2",
- "http",
- "http-body",
- "http-body-util",
- "hyper",
- "hyper-rustls",
- "hyper-util",
- "js-sys",
- "log",
- "mime",
- "percent-encoding",
- "pin-project-lite",
- "quinn",
- "rustls",
- "rustls-pki-types",
- "rustls-platform-verifier",
- "sync_wrapper",
- "tokio",
- "tokio-rustls",
- "tokio-util",
- "tower 0.5.3",
- "tower-http",
- "tower-service",
- "url",
- "wasm-bindgen",
- "wasm-bindgen-futures",
- "wasm-streams",
- "web-sys",
-]
-
-[[package]]
-name = "ring"
-version = "0.17.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
-dependencies = [
- "cc",
- "cfg-if",
- "getrandom 0.2.17",
- "libc",
- "untrusted",
- "windows-sys 0.52.0",
-]
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58"
[[package]]
name = "rmcp"
@@ -1976,12 +1868,6 @@ dependencies = [
"serde",
]
-[[package]]
-name = "rustc-hash"
-version = "2.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d"
-
[[package]]
name = "rustc_version"
version = "0.4.1"
@@ -2004,81 +1890,6 @@ dependencies = [
"windows-sys 0.61.2",
]
-[[package]]
-name = "rustls"
-version = "0.23.36"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b"
-dependencies = [
- "aws-lc-rs",
- "once_cell",
- "rustls-pki-types",
- "rustls-webpki",
- "subtle",
- "zeroize",
-]
-
-[[package]]
-name = "rustls-native-certs"
-version = "0.8.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63"
-dependencies = [
- "openssl-probe",
- "rustls-pki-types",
- "schannel",
- "security-framework",
-]
-
-[[package]]
-name = "rustls-pki-types"
-version = "1.14.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd"
-dependencies = [
- "web-time",
- "zeroize",
-]
-
-[[package]]
-name = "rustls-platform-verifier"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784"
-dependencies = [
- "core-foundation 0.10.1",
- "core-foundation-sys",
- "jni",
- "log",
- "once_cell",
- "rustls",
- "rustls-native-certs",
- "rustls-platform-verifier-android",
- "rustls-webpki",
- "security-framework",
- "security-framework-sys",
- "webpki-root-certs",
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "rustls-platform-verifier-android"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f"
-
-[[package]]
-name = "rustls-webpki"
-version = "0.103.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53"
-dependencies = [
- "aws-lc-rs",
- "ring",
- "rustls-pki-types",
- "untrusted",
-]
-
[[package]]
name = "rustversion"
version = "1.0.22"
@@ -2100,15 +1911,6 @@ dependencies = [
"winapi-util",
]
-[[package]]
-name = "schannel"
-version = "0.1.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1"
-dependencies = [
- "windows-sys 0.61.2",
-]
-
[[package]]
name = "schemars"
version = "1.2.0"
@@ -2141,29 +1943,6 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
-[[package]]
-name = "security-framework"
-version = "3.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef"
-dependencies = [
- "bitflags 2.10.0",
- "core-foundation 0.10.1",
- "core-foundation-sys",
- "libc",
- "security-framework-sys",
-]
-
-[[package]]
-name = "security-framework-sys"
-version = "2.15.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0"
-dependencies = [
- "core-foundation-sys",
- "libc",
-]
-
[[package]]
name = "semver"
version = "1.0.27"
@@ -2384,12 +2163,6 @@ dependencies = [
"syn",
]
-[[package]]
-name = "subtle"
-version = "2.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
-
[[package]]
name = "syn"
version = "2.0.114"
@@ -2406,9 +2179,6 @@ name = "sync_wrapper"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
-dependencies = [
- "futures-core",
-]
[[package]]
name = "synstructure"
@@ -2421,27 +2191,6 @@ dependencies = [
"syn",
]
-[[package]]
-name = "system-configuration"
-version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b"
-dependencies = [
- "bitflags 2.10.0",
- "core-foundation 0.9.4",
- "system-configuration-sys",
-]
-
-[[package]]
-name = "system-configuration-sys"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4"
-dependencies = [
- "core-foundation-sys",
- "libc",
-]
-
[[package]]
name = "tabled"
version = "0.20.0"
@@ -2565,21 +2314,6 @@ dependencies = [
"zerovec",
]
-[[package]]
-name = "tinyvec"
-version = "1.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa"
-dependencies = [
- "tinyvec_macros",
-]
-
-[[package]]
-name = "tinyvec_macros"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
-
[[package]]
name = "tokio"
version = "1.49.0"
@@ -2590,6 +2324,7 @@ dependencies = [
"libc",
"mio",
"pin-project-lite",
+ "signal-hook-registry",
"socket2",
"tokio-macros",
"windows-sys 0.61.2",
@@ -2607,13 +2342,15 @@ dependencies = [
]
[[package]]
-name = "tokio-rustls"
-version = "0.26.4"
+name = "tokio-tungstenite"
+version = "0.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61"
+checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9"
dependencies = [
- "rustls",
+ "futures-util",
+ "log",
"tokio",
+ "tungstenite 0.24.0",
]
[[package]]
@@ -2625,7 +2362,7 @@ dependencies = [
"futures-util",
"log",
"tokio",
- "tungstenite",
+ "tungstenite 0.28.0",
]
[[package]]
@@ -2671,24 +2408,6 @@ dependencies = [
"tracing",
]
-[[package]]
-name = "tower-http"
-version = "0.6.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8"
-dependencies = [
- "bitflags 2.10.0",
- "bytes",
- "futures-util",
- "http",
- "http-body",
- "iri-string",
- "pin-project-lite",
- "tower 0.5.3",
- "tower-layer",
- "tower-service",
-]
-
[[package]]
name = "tower-layer"
version = "0.3.3"
@@ -2823,6 +2542,26 @@ dependencies = [
"tree-sitter-language",
]
+[[package]]
+name = "tree-sitter-groovy"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a20016017f0865ba902ca50354f92429de5de8df994e64ab7fae087a13c40ed"
+dependencies = [
+ "cc",
+ "tree-sitter-language",
+]
+
+[[package]]
+name = "tree-sitter-java"
+version = "0.23.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0aa6cbcdc8c679b214e616fd3300da67da0e492e066df01bcf5a5921a71e90d6"
+dependencies = [
+ "cc",
+ "tree-sitter-language",
+]
+
[[package]]
name = "tree-sitter-language"
version = "0.1.6"
@@ -2830,10 +2569,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ae62f7eae5eb549c71b76658648b72cc6111f2d87d24a1e31fa907f4943e3ce"
[[package]]
-name = "try-lock"
-version = "0.2.5"
+name = "tungstenite"
+version = "0.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
+checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a"
+dependencies = [
+ "byteorder",
+ "bytes",
+ "data-encoding",
+ "http",
+ "httparse",
+ "log",
+ "rand 0.8.5",
+ "sha1",
+ "thiserror 1.0.69",
+ "utf-8",
+]
[[package]]
name = "tungstenite"
@@ -2846,7 +2597,7 @@ dependencies = [
"http",
"httparse",
"log",
- "rand",
+ "rand 0.9.2",
"sha1",
"thiserror 2.0.17",
"utf-8",
@@ -2882,12 +2633,6 @@ version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
-[[package]]
-name = "untrusted"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
-
[[package]]
name = "url"
version = "2.5.8"
@@ -2950,15 +2695,6 @@ dependencies = [
"winapi-util",
]
-[[package]]
-name = "want"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
-dependencies = [
- "try-lock",
-]
-
[[package]]
name = "wasi"
version = "0.11.1+wasi-snapshot-preview1"
@@ -2987,20 +2723,6 @@ dependencies = [
"wasm-bindgen-shared",
]
-[[package]]
-name = "wasm-bindgen-futures"
-version = "0.4.58"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f"
-dependencies = [
- "cfg-if",
- "futures-util",
- "js-sys",
- "once_cell",
- "wasm-bindgen",
- "web-sys",
-]
-
[[package]]
name = "wasm-bindgen-macro"
version = "0.2.108"
@@ -3033,48 +2755,6 @@ dependencies = [
"unicode-ident",
]
-[[package]]
-name = "wasm-streams"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65"
-dependencies = [
- "futures-util",
- "js-sys",
- "wasm-bindgen",
- "wasm-bindgen-futures",
- "web-sys",
-]
-
-[[package]]
-name = "web-sys"
-version = "0.3.85"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598"
-dependencies = [
- "js-sys",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "web-time"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb"
-dependencies = [
- "js-sys",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "webpki-root-certs"
-version = "1.0.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36a29fc0408b113f68cf32637857ab740edfafdf460c326cd2afaa2d84cc05dc"
-dependencies = [
- "rustls-pki-types",
-]
-
[[package]]
name = "winapi"
version = "0.3.9"
@@ -3147,17 +2827,6 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
-[[package]]
-name = "windows-registry"
-version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720"
-dependencies = [
- "windows-link",
- "windows-result",
- "windows-strings",
-]
-
[[package]]
name = "windows-result"
version = "0.4.1"
@@ -3176,15 +2845,6 @@ dependencies = [
"windows-link",
]
-[[package]]
-name = "windows-sys"
-version = "0.45.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
-dependencies = [
- "windows-targets 0.42.2",
-]
-
[[package]]
name = "windows-sys"
version = "0.52.0"
@@ -3212,21 +2872,6 @@ dependencies = [
"windows-link",
]
-[[package]]
-name = "windows-targets"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
-dependencies = [
- "windows_aarch64_gnullvm 0.42.2",
- "windows_aarch64_msvc 0.42.2",
- "windows_i686_gnu 0.42.2",
- "windows_i686_msvc 0.42.2",
- "windows_x86_64_gnu 0.42.2",
- "windows_x86_64_gnullvm 0.42.2",
- "windows_x86_64_msvc 0.42.2",
-]
-
[[package]]
name = "windows-targets"
version = "0.52.6"
@@ -3260,12 +2905,6 @@ dependencies = [
"windows_x86_64_msvc 0.53.1",
]
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
-
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.52.6"
@@ -3278,12 +2917,6 @@ version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53"
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
-
[[package]]
name = "windows_aarch64_msvc"
version = "0.52.6"
@@ -3296,12 +2929,6 @@ version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006"
-[[package]]
-name = "windows_i686_gnu"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
-
[[package]]
name = "windows_i686_gnu"
version = "0.52.6"
@@ -3326,12 +2953,6 @@ version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c"
-[[package]]
-name = "windows_i686_msvc"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
-
[[package]]
name = "windows_i686_msvc"
version = "0.52.6"
@@ -3344,12 +2965,6 @@ version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2"
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
-
[[package]]
name = "windows_x86_64_gnu"
version = "0.52.6"
@@ -3362,12 +2977,6 @@ version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499"
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
-
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.52.6"
@@ -3380,12 +2989,6 @@ version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1"
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
-
[[package]]
name = "windows_x86_64_msvc"
version = "0.52.6"
@@ -3480,12 +3083,6 @@ dependencies = [
"synstructure",
]
-[[package]]
-name = "zeroize"
-version = "1.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0"
-
[[package]]
name = "zerotrie"
version = "0.2.3"
@@ -3524,3 +3121,31 @@ name = "zmij"
version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94f63c051f4fe3c1509da62131a678643c5b6fbdc9273b2b79d4378ebda003d2"
+
+[[package]]
+name = "zstd"
+version = "0.13.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a"
+dependencies = [
+ "zstd-safe",
+]
+
+[[package]]
+name = "zstd-safe"
+version = "7.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d"
+dependencies = [
+ "zstd-sys",
+]
+
+[[package]]
+name = "zstd-sys"
+version = "2.0.16+zstd.1.5.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748"
+dependencies = [
+ "cc",
+ "pkg-config",
+]
diff --git a/Cargo.toml b/Cargo.toml
index eb500db..ca4c637 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,9 +1,25 @@
-[package]
-name = "naviscope"
-version = "0.2.1"
-edition = "2024"
+[workspace]
+resolver = "2"
+members = [
+ "crates/core",
+ "crates/lang-java",
+ "crates/lang-gradle",
+ "crates/cli",
+ "crates/lsp",
+ "crates/mcp",
+ "crates/api",
+ "crates/runtime",
+]
+
+[workspace.dependencies]
+naviscope-core = { path = "crates/core" }
+naviscope-java = { path = "crates/lang-java" }
+naviscope-gradle = { path = "crates/lang-gradle" }
+naviscope-lsp = { path = "crates/lsp" }
+naviscope-mcp = { path = "crates/mcp" }
+naviscope-api = { path = "crates/api" }
+naviscope-runtime = { path = "crates/runtime" }
-[dependencies]
petgraph = { version = "0.8", features = ["serde-1"] }
tree-sitter = "0.26"
serde = { version = "1.0", features = ["derive"] }
@@ -11,31 +27,39 @@ serde_json = "1.0"
thiserror = "2.0"
walkdir = "2.5"
log = "0.4"
-clap = { version = "4.5", features = ["derive"] }
ignore = "0.4.25"
rayon = "1.11.0"
notify = "8.2.0"
xxhash-rust = { version = "0.8.15", features = ["xxh3"] }
regex = "1.11.1"
-tokio = { version = "1.49.0", features = ["rt-multi-thread", "macros", "sync", "time"] }
+tokio = { version = "1.49.0", features = ["rt-multi-thread", "macros", "sync", "time", "fs", "net", "signal"] }
schemars = "1.2.0"
-rmcp = { version = "0.13.0", features = ["macros", "server", "transport-io"] }
-tower-lsp = "0.20"
-futures = "0.3"
-dashmap = "6.1.0"
-axum = { version = "0.8.8", features = ["ws"] }
-reqwest = { version = "0.13.1", features = ["stream"] }
-tokio-util = { version = "0.7.18", features = ["io"] }
tracing = "0.1.44"
tracing-subscriber = { version = "0.3.22", features = ["env-filter"] }
tracing-appender = "0.2.4"
-tokio-tungstenite = "0.28.0"
+rmp-serde = "1.3.1"
+once_cell = "1.20"
+tower-lsp = "0.20"
+lsp-types = "0.94"
+cc = "1.2"
+dashmap = "6.1.0"
+tokio-util = "0.7.18"
+anyhow = "1.0"
+clap = { version = "4.5", features = ["derive"] }
reedline = "0.45.0"
dirs = "6.0.0"
nu-ansi-term = "0.50.3"
shlex = "1.3.0"
tabled = "0.20.0"
-rmp-serde = "1.3.1"
+indexmap = { version = "2.1.0", features = ["serde"] }
+axum = { version = "0.7.5", features = ["ws"] }
+futures = "0.3.31"
+tokio-tungstenite = "0.28.0"
+rmcp = { version = "0.13.0", features = ["macros", "server", "transport-io"] }
+lasso = { version = "0.7", features = ["serialize", "multi-threaded"] }
+zstd = "0.13"
+async-trait = "0.1"
+url = "2.5.8"
+tree-sitter-java = "0.23.5"
+tree-sitter-groovy = "0.1.2"
-[build-dependencies]
-cc = "1.2"
diff --git a/README.md b/README.md
index ef2b55b..a120b88 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
**Unified Code Knowledge Graph Engine for AI Agents & Developers**
-Naviscope bridges the gap between AI and IDEs. It builds a comprehensive, graph-based representation of your codebase (connecting micro-level semantics like calls and inheritance with macro-level structures) that powers both **LLM agents** (via MCP) and **code editors** (via LSP).
+Naviscope bridges the gap between AI and IDEs. It builds a comprehensive, graph-based representation of your codebase (connecting micro-level semantics like type relationships and inheritance with macro-level structures) that powers both **LLM agents** (via MCP) and **code editors** (via LSP).
Unlike traditional tools that maintain separate indexes for different purposes, Naviscope provides a **single, unified knowledge graph**, ensuring that what AI agents see is exactly what developers navigate.
@@ -20,10 +20,11 @@ Unlike traditional tools that maintain separate indexes for different purposes,
### 🤖 For AI Agents (MCP Support)
Naviscope implements the [Model Context Protocol](https://modelcontextprotocol.io/), giving LLMs "X-ray vision" into your code structure.
+- **`get_guide`**: Call this first! Get a comprehensive guide on how to use Naviscope tools.
- **`ls`**: Hierarchical exploration of packages, modules, and fields.
-- **`grep`**: Precise symbol search (find "Class definitions", not just string matches).
-- **`inspect`**: Retrieve definition, source code, and metadata for any symbol.
-- **`deps`**: Analyze incoming/outgoing dependencies and call graphs.
+- **`find`**: Precise symbol search (find "Class definitions", not just string matches).
+- **`cat`**: Retrieve definition, source code, and metadata for any symbol.
+- **`deps`**: Analyze incoming/outgoing dependencies and relationships (inheritance, type usage, etc.).
### 👨💻 For Developers (LSP Support)
A lightweight, lightning-fast alternative to standard language servers (like JDTLS).
@@ -38,61 +39,79 @@ A lightweight, lightning-fast alternative to standard language servers (like JDT
```mermaid
graph TD
%% Styles
- classDef layer fill:#e3f2fd,stroke:#1565c0,stroke-width:2px,rx:5,ry:5
- classDef component fill:#fff,stroke:#333,stroke-width:1px
- classDef storage fill:#fff3e0,stroke:#ef6c00,stroke-width:2px,rx:5,ry:5
-
- subgraph Access [Interfaces Layer]
- direction LR
- CLI[CLI Shell]:::component
- MCP["MCP Server
(AI Agents)"]:::component
- LSP["LSP Server
(Editors)"]:::component
+ classDef interface fill:#e3f2fd,stroke:#1565c0,stroke-width:2px,rx:5,ry:5
+ classDef runtime fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px,rx:5,ry:5
+ classDef language fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px,rx:5,ry:5
+ classDef core fill:#fff3e0,stroke:#ef6c00,stroke-width:2px,rx:5,ry:5
+ classDef api fill:#fafafa,stroke:#616161,stroke-width:2px,rx:5,ry:5
+
+ subgraph Interfaces [Interface Layer]
+ CLI["naviscope-cli
(Shell & Main)"]:::interface
+ LSP["naviscope-lsp
(LSP Server)"]:::interface
+ MCP["naviscope-mcp
(MCP Server)"]:::interface
end
- subgraph Service [Query & Analysis Layer]
- direction LR
- Query[Query Engine]:::component
- Search[Semantic Search]:::component
- Deps[Dependency Analysis]:::component
+ subgraph Orchestration [Runtime Layer]
+ Runtime["naviscope-runtime
(Engine Orchestrator)"]:::runtime
end
- subgraph Core [Core Knowledge Graph]
- direction LR
- Graph["Unified Graph
(petgraph)"]:::component
- Index["Symbol Index"]:::component
+ subgraph Strategies [Language Layer]
+ Java["naviscope-java
(Java Analysis)"]:::language
+ Gradle["naviscope-gradle
(Gradle Analysis)"]:::language
end
- subgraph Ingestion [Ingestion Layer]
- direction LR
- Scanner[File Scanner]:::component
- Parser["Parsers
(Tree-sitter)"]:::component
- Resolver["Symbol Resolver
(Java/Gradle)"]:::component
+ subgraph Engine [Core Layer]
+ Core["naviscope-core
(Graph, Index & IO)"]:::core
end
- subgraph Infra [Infrastructure]
- direction LR
- Store[("Persistence")]:::storage
- Watch[File Watcher]:::component
+ subgraph Foundation [API Layer]
+ API["naviscope-api
(Common Traits & Models)"]:::api
end
- %% Connections
- CLI --> Query
- MCP --> Query
- LSP --> Query
+ %% Crate Dependencies
+ CLI --> LSP
+ CLI --> MCP
+ CLI --> Runtime
+ CLI --> API
- Query --> Graph
- Search --> Graph
- Deps --> Graph
+ LSP --> MCP
+ LSP --> API
- Scanner --> Parser
- Parser --> Resolver
- Resolver --> Graph
+ MCP --> API
- Graph -.-> Store
- Watch -.-> Scanner
+ Runtime --> Java
+ Runtime --> Gradle
+ Runtime --> Core
+ Runtime --> API
+
+ Java --> Core
+ Java --> API
+
+ Gradle --> Core
+ Gradle --> API
+
+ Core --> API
```
-Naviscope is built on a **layered architecture** that separates ingestion, core graph logic, and external interfaces. The core is a language-agnostic graph structure populated by language-specific strategies (currently Java/Gradle via Tree-sitter), exposing a unified query engine to both AI agents and developer tools.
+Naviscope is built on a **layered crate architecture** that separates concerns across multiple Rust crates:
+
+- **Interface Layer** (`naviscope-cli`, `naviscope-lsp`, `naviscope-mcp`): Entry points for different use cases (CLI shell, LSP for editors, MCP for AI agents).
+- **Runtime Layer** (`naviscope-runtime`): Orchestrates the engine assembly, registering language plugins and providing a unified factory.
+- **Language Layer** (`naviscope-java`, `naviscope-gradle`): Language-specific analysis plugins that parse and resolve symbols.
+- **Core Layer** (`naviscope-core`): The heart of the system - graph storage, indexing, file scanning, and persistence.
+- **API Layer** (`naviscope-api`): Common traits and models shared across all crates, ensuring a consistent interface.
+
+The core is a language-agnostic graph structure populated by language-specific strategies (currently Java/Gradle via Tree-sitter), exposing a unified query engine to both AI agents and developer tools.
+
+### 🔍 Reference Discovery Strategy
+
+Naviscope uses a **two-phase reference discovery** approach for optimal performance:
+
+1. **Meso-level (Coarse Filtering)**: Uses an inverted `reference_index` (token → files) to quickly identify candidate files that likely contain references to a symbol. This index is built during parsing by extracting all identifier tokens from source files.
+
+2. **Micro-level (Precise Analysis)**: For each candidate file, uses Tree-sitter to parse and verify actual symbol occurrences, ensuring accurate reference locations.
+
+This hybrid approach combines the speed of inverted indexing with the precision of syntax-aware parsing, enabling fast reference discovery even in large codebases.
## 🚀 Quick Start
@@ -109,7 +128,7 @@ cd naviscope
git submodule update --init --recursive
# 2. Install the Naviscope CLI
-cargo install --path .
+cargo install --path crates/cli
# 3. (Optional) Build the VS Code Extension
cd editors/vscode
@@ -124,6 +143,10 @@ npm run package
- `naviscope index `: Build a persistent index for a project.
- `naviscope shell [PATH]`: Start an interactive shell to query the graph.
- `naviscope watch `: Start a background service to keep the index updated.
+- `naviscope clear [PATH]`: Clear built indices (or all indices if path omitted).
+- `naviscope mcp`: Start the MCP server.
+- `naviscope lsp`: Start the LSP server.
+
#### Configure in Cursor (for AI Agents)
1. Open **Cursor Settings** (Cmd + Shift + J) -> **Features** -> **MCP**.
2. Click **+ Add New MCP Server**.
@@ -136,30 +159,55 @@ npm run package
- **VS Code**: Install the extension built in step 3.
- **Other Clients**: Point your LSP client to run `naviscope lsp`.
-## 🛠️ Query DSL Examples
+## 🛠️ Query DSL (Interactive Shell)
-Whether using the CLI shell or MCP tools, the query logic is consistent:
+The `naviscope shell` provides a Unix-like experience for exploring the Code Knowledge Graph:
```bash
-# Find all classes named 'UserService'
-grep "UserService" --kind class
+# Change current context to a package or class
+cd "com.example.service"
+
+# List members in current context
+ls
-# List contents of a package
-ls "com.example.service"
+# List with detailed information
+ls -l
+
+# Find all classes named 'UserService'
+find "UserService" --kind class
# Inspect full details of a symbol (source code, metadata)
-cat "com.example.service.UserService"
+cat "UserService"
+
+# Find who references current symbol?
+deps --rev
-# Who calls 'login'? (Incoming dependencies / Reverse lookups)
-deps --rev "com.example.auth.AuthService.login"
+# Print current FQN context
+pwd
+
+# Clear screen
+clear
```
+## 🔗 Graph Relationships
+
+Naviscope tracks the following relationship types in the knowledge graph:
+
+- **Structural**: `Contains` (package → class, class → method, etc.)
+- **Inheritance**: `InheritsFrom`, `Implements`
+- **Type Usage**: `TypedAs` (field/variable → type)
+- **Annotations**: `DecoratedBy` (class/method → annotation)
+- **Build System**: `UsesDependency` (project → dependency)
+
+Reference discovery (method calls, instantiations) is handled efficiently through the `reference_index` + Tree-sitter two-phase approach, avoiding the need to store explicit call edges for every reference.
+
## 📈 Roadmap
- [x] **Core**: Graph Storage (`petgraph`), Parallel Indexing, Real-time Updates (`notify`).
- [x] **Languages**: Java & Gradle (Tree-sitter driven).
- [x] **Interfaces**: CLI Shell, MCP Server, LSP Server.
- [x] **Editors**: VS Code Extension.
+- [x] **Reference Discovery**: Two-phase approach (reference_index + Tree-sitter).
- [ ] **Upcoming**: Maven Support, Python/Rust Language Strategies.
## 📄 License
diff --git a/build.rs b/build.rs
deleted file mode 100644
index 3c76002..0000000
--- a/build.rs
+++ /dev/null
@@ -1,26 +0,0 @@
-use std::path::Path;
-
-fn main() {
- let grammars = vec![
- ("java", "tree-sitter-java"),
- ("groovy", "tree-sitter-groovy"),
- ];
-
- for (language, dir) in grammars {
- let lang_dir = Path::new(dir);
- let parser_path = lang_dir.join("src").join("parser.c");
- let scanner_path = lang_dir.join("src").join("scanner.c");
-
- println!("cargo:rerun-if-changed={}", parser_path.to_str().unwrap());
- println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap());
-
- let mut build = cc::Build::new();
- build.file(&parser_path).include(lang_dir.join("src"));
-
- if scanner_path.exists() {
- build.file(&scanner_path);
- }
-
- build.compile(format!("tree-sitter-{}", language).as_str());
- }
-}
diff --git a/crates/api/Cargo.toml b/crates/api/Cargo.toml
new file mode 100644
index 0000000..097d610
--- /dev/null
+++ b/crates/api/Cargo.toml
@@ -0,0 +1,12 @@
+[package]
+name = "naviscope-api"
+version = "0.5.0"
+edition = "2024"
+
+[dependencies]
+async-trait = { workspace = true }
+serde = { workspace = true }
+schemars = { workspace = true }
+lasso = { workspace = true }
+thiserror = { workspace = true }
+serde_json = { workspace = true }
diff --git a/crates/api/src/graph.rs b/crates/api/src/graph.rs
new file mode 100644
index 0000000..424bbf2
--- /dev/null
+++ b/crates/api/src/graph.rs
@@ -0,0 +1,25 @@
+pub use crate::models::graph::{GraphQuery, QueryResult};
+use async_trait::async_trait;
+
+#[derive(Debug, thiserror::Error)]
+pub enum GraphError {
+ #[error("Internal error: {0}")]
+ Internal(String),
+}
+
+pub type Result = std::result::Result;
+
+#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
+pub struct GraphStats {
+ pub node_count: usize,
+ pub edge_count: usize,
+}
+
+#[async_trait]
+pub trait GraphService: Send + Sync {
+ async fn query(&self, query: &GraphQuery) -> Result;
+ async fn get_stats(&self) -> Result;
+
+ /// Get a fully hydrated display node by its FQN.
+ async fn get_node_display(&self, fqn: &str) -> Result