purecontext-mcp 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +207 -0
- package/dist/adapters/actix-web.d.ts +28 -0
- package/dist/adapters/actix-web.d.ts.map +1 -0
- package/dist/adapters/actix-web.js +362 -0
- package/dist/adapters/actix-web.js.map +1 -0
- package/dist/adapters/adapter-registry.d.ts +34 -0
- package/dist/adapters/adapter-registry.d.ts.map +1 -0
- package/dist/adapters/adapter-registry.js +92 -0
- package/dist/adapters/adapter-registry.js.map +1 -0
- package/dist/adapters/angular.d.ts +13 -0
- package/dist/adapters/angular.d.ts.map +1 -0
- package/dist/adapters/angular.js +348 -0
- package/dist/adapters/angular.js.map +1 -0
- package/dist/adapters/axum.d.ts +16 -0
- package/dist/adapters/axum.d.ts.map +1 -0
- package/dist/adapters/axum.js +299 -0
- package/dist/adapters/axum.js.map +1 -0
- package/dist/adapters/django-orm.d.ts +28 -0
- package/dist/adapters/django-orm.d.ts.map +1 -0
- package/dist/adapters/django-orm.js +464 -0
- package/dist/adapters/django-orm.js.map +1 -0
- package/dist/adapters/django.d.ts +16 -0
- package/dist/adapters/django.d.ts.map +1 -0
- package/dist/adapters/django.js +257 -0
- package/dist/adapters/django.js.map +1 -0
- package/dist/adapters/echo.d.ts +15 -0
- package/dist/adapters/echo.d.ts.map +1 -0
- package/dist/adapters/echo.js +142 -0
- package/dist/adapters/echo.js.map +1 -0
- package/dist/adapters/express.d.ts +15 -0
- package/dist/adapters/express.d.ts.map +1 -0
- package/dist/adapters/express.js +126 -0
- package/dist/adapters/express.js.map +1 -0
- package/dist/adapters/fastapi.d.ts +16 -0
- package/dist/adapters/fastapi.d.ts.map +1 -0
- package/dist/adapters/fastapi.js +113 -0
- package/dist/adapters/fastapi.js.map +1 -0
- package/dist/adapters/fastify.d.ts +14 -0
- package/dist/adapters/fastify.d.ts.map +1 -0
- package/dist/adapters/fastify.js +124 -0
- package/dist/adapters/fastify.js.map +1 -0
- package/dist/adapters/fiber.d.ts +15 -0
- package/dist/adapters/fiber.d.ts.map +1 -0
- package/dist/adapters/fiber.js +147 -0
- package/dist/adapters/fiber.js.map +1 -0
- package/dist/adapters/flask.d.ts +18 -0
- package/dist/adapters/flask.d.ts.map +1 -0
- package/dist/adapters/flask.js +175 -0
- package/dist/adapters/flask.js.map +1 -0
- package/dist/adapters/flutter.d.ts +19 -0
- package/dist/adapters/flutter.d.ts.map +1 -0
- package/dist/adapters/flutter.js +251 -0
- package/dist/adapters/flutter.js.map +1 -0
- package/dist/adapters/gin.d.ts +16 -0
- package/dist/adapters/gin.d.ts.map +1 -0
- package/dist/adapters/gin.js +159 -0
- package/dist/adapters/gin.js.map +1 -0
- package/dist/adapters/hibernate.d.ts +24 -0
- package/dist/adapters/hibernate.d.ts.map +1 -0
- package/dist/adapters/hibernate.js +448 -0
- package/dist/adapters/hibernate.js.map +1 -0
- package/dist/adapters/ktor.d.ts +18 -0
- package/dist/adapters/ktor.d.ts.map +1 -0
- package/dist/adapters/ktor.js +219 -0
- package/dist/adapters/ktor.js.map +1 -0
- package/dist/adapters/laravel.d.ts +19 -0
- package/dist/adapters/laravel.d.ts.map +1 -0
- package/dist/adapters/laravel.js +370 -0
- package/dist/adapters/laravel.js.map +1 -0
- package/dist/adapters/micronaut.d.ts +21 -0
- package/dist/adapters/micronaut.d.ts.map +1 -0
- package/dist/adapters/micronaut.js +435 -0
- package/dist/adapters/micronaut.js.map +1 -0
- package/dist/adapters/nestjs.d.ts +12 -0
- package/dist/adapters/nestjs.d.ts.map +1 -0
- package/dist/adapters/nestjs.js +401 -0
- package/dist/adapters/nestjs.js.map +1 -0
- package/dist/adapters/nextjs.d.ts +49 -0
- package/dist/adapters/nextjs.d.ts.map +1 -0
- package/dist/adapters/nextjs.js +412 -0
- package/dist/adapters/nextjs.js.map +1 -0
- package/dist/adapters/nuxt.d.ts +44 -0
- package/dist/adapters/nuxt.d.ts.map +1 -0
- package/dist/adapters/nuxt.js +243 -0
- package/dist/adapters/nuxt.js.map +1 -0
- package/dist/adapters/quarkus.d.ts +21 -0
- package/dist/adapters/quarkus.d.ts.map +1 -0
- package/dist/adapters/quarkus.js +395 -0
- package/dist/adapters/quarkus.js.map +1 -0
- package/dist/adapters/rails.d.ts +18 -0
- package/dist/adapters/rails.d.ts.map +1 -0
- package/dist/adapters/rails.js +363 -0
- package/dist/adapters/rails.js.map +1 -0
- package/dist/adapters/react.d.ts +18 -0
- package/dist/adapters/react.d.ts.map +1 -0
- package/dist/adapters/react.js +95 -0
- package/dist/adapters/react.js.map +1 -0
- package/dist/adapters/rocket.d.ts +19 -0
- package/dist/adapters/rocket.d.ts.map +1 -0
- package/dist/adapters/rocket.js +271 -0
- package/dist/adapters/rocket.js.map +1 -0
- package/dist/adapters/sinatra.d.ts +16 -0
- package/dist/adapters/sinatra.d.ts.map +1 -0
- package/dist/adapters/sinatra.js +114 -0
- package/dist/adapters/sinatra.js.map +1 -0
- package/dist/adapters/spring-boot.d.ts +24 -0
- package/dist/adapters/spring-boot.d.ts.map +1 -0
- package/dist/adapters/spring-boot.js +399 -0
- package/dist/adapters/spring-boot.js.map +1 -0
- package/dist/adapters/spring-kotlin.d.ts +19 -0
- package/dist/adapters/spring-kotlin.d.ts.map +1 -0
- package/dist/adapters/spring-kotlin.js +297 -0
- package/dist/adapters/spring-kotlin.js.map +1 -0
- package/dist/adapters/sqlalchemy.d.ts +28 -0
- package/dist/adapters/sqlalchemy.d.ts.map +1 -0
- package/dist/adapters/sqlalchemy.js +435 -0
- package/dist/adapters/sqlalchemy.js.map +1 -0
- package/dist/adapters/symfony.d.ts +16 -0
- package/dist/adapters/symfony.d.ts.map +1 -0
- package/dist/adapters/symfony.js +242 -0
- package/dist/adapters/symfony.js.map +1 -0
- package/dist/adapters/vapor.d.ts +21 -0
- package/dist/adapters/vapor.d.ts.map +1 -0
- package/dist/adapters/vapor.js +269 -0
- package/dist/adapters/vapor.js.map +1 -0
- package/dist/adapters/vue-preprocessor.d.ts +26 -0
- package/dist/adapters/vue-preprocessor.d.ts.map +1 -0
- package/dist/adapters/vue-preprocessor.js +82 -0
- package/dist/adapters/vue-preprocessor.js.map +1 -0
- package/dist/adapters/vue.d.ts +13 -0
- package/dist/adapters/vue.d.ts.map +1 -0
- package/dist/adapters/vue.js +134 -0
- package/dist/adapters/vue.js.map +1 -0
- package/dist/config/cli.d.ts +26 -0
- package/dist/config/cli.d.ts.map +1 -0
- package/dist/config/cli.js +291 -0
- package/dist/config/cli.js.map +1 -0
- package/dist/config/config-loader.d.ts +26 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +168 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/config-schema.d.ts +228 -0
- package/dist/config/config-schema.d.ts.map +1 -0
- package/dist/config/config-schema.js +400 -0
- package/dist/config/config-schema.js.map +1 -0
- package/dist/config/keys-cli.d.ts +37 -0
- package/dist/config/keys-cli.d.ts.map +1 -0
- package/dist/config/keys-cli.js +179 -0
- package/dist/config/keys-cli.js.map +1 -0
- package/dist/config/workspaces-cli.d.ts +2 -0
- package/dist/config/workspaces-cli.d.ts.map +1 -0
- package/dist/config/workspaces-cli.js +84 -0
- package/dist/config/workspaces-cli.js.map +1 -0
- package/dist/core/db/api-keys.d.ts +95 -0
- package/dist/core/db/api-keys.d.ts.map +1 -0
- package/dist/core/db/api-keys.js +293 -0
- package/dist/core/db/api-keys.js.map +1 -0
- package/dist/core/db/dep-store.d.ts +18 -0
- package/dist/core/db/dep-store.d.ts.map +1 -0
- package/dist/core/db/dep-store.js +155 -0
- package/dist/core/db/dep-store.js.map +1 -0
- package/dist/core/db/embedding-store.d.ts +40 -0
- package/dist/core/db/embedding-store.d.ts.map +1 -0
- package/dist/core/db/embedding-store.js +120 -0
- package/dist/core/db/embedding-store.js.map +1 -0
- package/dist/core/db/file-store.d.ts +27 -0
- package/dist/core/db/file-store.d.ts.map +1 -0
- package/dist/core/db/file-store.js +101 -0
- package/dist/core/db/file-store.js.map +1 -0
- package/dist/core/db/request-log.d.ts +40 -0
- package/dist/core/db/request-log.d.ts.map +1 -0
- package/dist/core/db/request-log.js +90 -0
- package/dist/core/db/request-log.js.map +1 -0
- package/dist/core/db/savings-store.d.ts +9 -0
- package/dist/core/db/savings-store.d.ts.map +1 -0
- package/dist/core/db/savings-store.js +64 -0
- package/dist/core/db/savings-store.js.map +1 -0
- package/dist/core/db/schema.d.ts +14 -0
- package/dist/core/db/schema.d.ts.map +1 -0
- package/dist/core/db/schema.js +235 -0
- package/dist/core/db/schema.js.map +1 -0
- package/dist/core/db/symbol-store.d.ts +64 -0
- package/dist/core/db/symbol-store.d.ts.map +1 -0
- package/dist/core/db/symbol-store.js +243 -0
- package/dist/core/db/symbol-store.js.map +1 -0
- package/dist/core/db/tenants.d.ts +91 -0
- package/dist/core/db/tenants.d.ts.map +1 -0
- package/dist/core/db/tenants.js +219 -0
- package/dist/core/db/tenants.js.map +1 -0
- package/dist/core/errors.d.ts +72 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +140 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/file-discovery.d.ts +17 -0
- package/dist/core/file-discovery.d.ts.map +1 -0
- package/dist/core/file-discovery.js +136 -0
- package/dist/core/file-discovery.js.map +1 -0
- package/dist/core/file-processor.d.ts +21 -0
- package/dist/core/file-processor.d.ts.map +1 -0
- package/dist/core/file-processor.js +110 -0
- package/dist/core/file-processor.js.map +1 -0
- package/dist/core/hash-cache.d.ts +18 -0
- package/dist/core/hash-cache.d.ts.map +1 -0
- package/dist/core/hash-cache.js +35 -0
- package/dist/core/hash-cache.js.map +1 -0
- package/dist/core/index-manager.d.ts +18 -0
- package/dist/core/index-manager.d.ts.map +1 -0
- package/dist/core/index-manager.js +461 -0
- package/dist/core/index-manager.js.map +1 -0
- package/dist/core/indexing-worker.d.ts +60 -0
- package/dist/core/indexing-worker.d.ts.map +1 -0
- package/dist/core/indexing-worker.js +128 -0
- package/dist/core/indexing-worker.js.map +1 -0
- package/dist/core/logger.d.ts +10 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +40 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/parse-dispatcher.d.ts +18 -0
- package/dist/core/parse-dispatcher.d.ts.map +1 -0
- package/dist/core/parse-dispatcher.js +74 -0
- package/dist/core/parse-dispatcher.js.map +1 -0
- package/dist/core/search/query-preprocessor.d.ts +22 -0
- package/dist/core/search/query-preprocessor.d.ts.map +1 -0
- package/dist/core/search/query-preprocessor.js +77 -0
- package/dist/core/search/query-preprocessor.js.map +1 -0
- package/dist/core/search/relevance-ranker.d.ts +34 -0
- package/dist/core/search/relevance-ranker.d.ts.map +1 -0
- package/dist/core/search/relevance-ranker.js +132 -0
- package/dist/core/search/relevance-ranker.js.map +1 -0
- package/dist/core/security.d.ts +40 -0
- package/dist/core/security.d.ts.map +1 -0
- package/dist/core/security.js +133 -0
- package/dist/core/security.js.map +1 -0
- package/dist/core/telemetry.d.ts +19 -0
- package/dist/core/telemetry.d.ts.map +1 -0
- package/dist/core/telemetry.js +101 -0
- package/dist/core/telemetry.js.map +1 -0
- package/dist/core/tenant-context.d.ts +22 -0
- package/dist/core/tenant-context.d.ts.map +1 -0
- package/dist/core/tenant-context.js +16 -0
- package/dist/core/tenant-context.js.map +1 -0
- package/dist/core/token-tracker.d.ts +39 -0
- package/dist/core/token-tracker.d.ts.map +1 -0
- package/dist/core/token-tracker.js +153 -0
- package/dist/core/token-tracker.js.map +1 -0
- package/dist/core/types.d.ts +145 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/watcher/file-watcher.d.ts +18 -0
- package/dist/core/watcher/file-watcher.d.ts.map +1 -0
- package/dist/core/watcher/file-watcher.js +123 -0
- package/dist/core/watcher/file-watcher.js.map +1 -0
- package/dist/core/worker-pool.d.ts +24 -0
- package/dist/core/worker-pool.d.ts.map +1 -0
- package/dist/core/worker-pool.js +92 -0
- package/dist/core/worker-pool.js.map +1 -0
- package/dist/graph/graph-builder.d.ts +16 -0
- package/dist/graph/graph-builder.d.ts.map +1 -0
- package/dist/graph/graph-builder.js +51 -0
- package/dist/graph/graph-builder.js.map +1 -0
- package/dist/graph/graph-traversal.d.ts +57 -0
- package/dist/graph/graph-traversal.d.ts.map +1 -0
- package/dist/graph/graph-traversal.js +144 -0
- package/dist/graph/graph-traversal.js.map +1 -0
- package/dist/graph/path-resolver.d.ts +13 -0
- package/dist/graph/path-resolver.d.ts.map +1 -0
- package/dist/graph/path-resolver.js +161 -0
- package/dist/graph/path-resolver.js.map +1 -0
- package/dist/handlers/c.d.ts +3 -0
- package/dist/handlers/c.d.ts.map +1 -0
- package/dist/handlers/c.js +473 -0
- package/dist/handlers/c.js.map +1 -0
- package/dist/handlers/cpp.d.ts +3 -0
- package/dist/handlers/cpp.d.ts.map +1 -0
- package/dist/handlers/cpp.js +682 -0
- package/dist/handlers/cpp.js.map +1 -0
- package/dist/handlers/csharp.d.ts +3 -0
- package/dist/handlers/csharp.d.ts.map +1 -0
- package/dist/handlers/csharp.js +369 -0
- package/dist/handlers/csharp.js.map +1 -0
- package/dist/handlers/dart.d.ts +3 -0
- package/dist/handlers/dart.d.ts.map +1 -0
- package/dist/handlers/dart.js +596 -0
- package/dist/handlers/dart.js.map +1 -0
- package/dist/handlers/elixir.d.ts +8 -0
- package/dist/handlers/elixir.d.ts.map +1 -0
- package/dist/handlers/elixir.js +412 -0
- package/dist/handlers/elixir.js.map +1 -0
- package/dist/handlers/go.d.ts +3 -0
- package/dist/handlers/go.d.ts.map +1 -0
- package/dist/handlers/go.js +262 -0
- package/dist/handlers/go.js.map +1 -0
- package/dist/handlers/handler-registry.d.ts +20 -0
- package/dist/handlers/handler-registry.d.ts.map +1 -0
- package/dist/handlers/handler-registry.js +69 -0
- package/dist/handlers/handler-registry.js.map +1 -0
- package/dist/handlers/haskell.d.ts +17 -0
- package/dist/handlers/haskell.d.ts.map +1 -0
- package/dist/handlers/haskell.js +356 -0
- package/dist/handlers/haskell.js.map +1 -0
- package/dist/handlers/java.d.ts +3 -0
- package/dist/handlers/java.d.ts.map +1 -0
- package/dist/handlers/java.js +350 -0
- package/dist/handlers/java.js.map +1 -0
- package/dist/handlers/javascript.d.ts +3 -0
- package/dist/handlers/javascript.d.ts.map +1 -0
- package/dist/handlers/javascript.js +232 -0
- package/dist/handlers/javascript.js.map +1 -0
- package/dist/handlers/kotlin.d.ts +3 -0
- package/dist/handlers/kotlin.d.ts.map +1 -0
- package/dist/handlers/kotlin.js +317 -0
- package/dist/handlers/kotlin.js.map +1 -0
- package/dist/handlers/lua.d.ts +3 -0
- package/dist/handlers/lua.d.ts.map +1 -0
- package/dist/handlers/lua.js +328 -0
- package/dist/handlers/lua.js.map +1 -0
- package/dist/handlers/php.d.ts +3 -0
- package/dist/handlers/php.d.ts.map +1 -0
- package/dist/handlers/php.js +343 -0
- package/dist/handlers/php.js.map +1 -0
- package/dist/handlers/python.d.ts +3 -0
- package/dist/handlers/python.d.ts.map +1 -0
- package/dist/handlers/python.js +343 -0
- package/dist/handlers/python.js.map +1 -0
- package/dist/handlers/r.d.ts +9 -0
- package/dist/handlers/r.d.ts.map +1 -0
- package/dist/handlers/r.js +452 -0
- package/dist/handlers/r.js.map +1 -0
- package/dist/handlers/ruby.d.ts +8 -0
- package/dist/handlers/ruby.d.ts.map +1 -0
- package/dist/handlers/ruby.js +271 -0
- package/dist/handlers/ruby.js.map +1 -0
- package/dist/handlers/rust.d.ts +3 -0
- package/dist/handlers/rust.d.ts.map +1 -0
- package/dist/handlers/rust.js +420 -0
- package/dist/handlers/rust.js.map +1 -0
- package/dist/handlers/scala.d.ts +9 -0
- package/dist/handlers/scala.d.ts.map +1 -0
- package/dist/handlers/scala.js +480 -0
- package/dist/handlers/scala.js.map +1 -0
- package/dist/handlers/swift.d.ts +3 -0
- package/dist/handlers/swift.d.ts.map +1 -0
- package/dist/handlers/swift.js +553 -0
- package/dist/handlers/swift.js.map +1 -0
- package/dist/handlers/typescript.d.ts +4 -0
- package/dist/handlers/typescript.d.ts.map +1 -0
- package/dist/handlers/typescript.js +325 -0
- package/dist/handlers/typescript.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +266 -0
- package/dist/index.js.map +1 -0
- package/dist/semantic/embedding-provider.d.ts +66 -0
- package/dist/semantic/embedding-provider.d.ts.map +1 -0
- package/dist/semantic/embedding-provider.js +176 -0
- package/dist/semantic/embedding-provider.js.map +1 -0
- package/dist/semantic/hnsw-index.d.ts +96 -0
- package/dist/semantic/hnsw-index.d.ts.map +1 -0
- package/dist/semantic/hnsw-index.js +364 -0
- package/dist/semantic/hnsw-index.js.map +1 -0
- package/dist/semantic/hybrid-search.d.ts +46 -0
- package/dist/semantic/hybrid-search.d.ts.map +1 -0
- package/dist/semantic/hybrid-search.js +164 -0
- package/dist/semantic/hybrid-search.js.map +1 -0
- package/dist/semantic/query-expansion.d.ts +25 -0
- package/dist/semantic/query-expansion.d.ts.map +1 -0
- package/dist/semantic/query-expansion.js +150 -0
- package/dist/semantic/query-expansion.js.map +1 -0
- package/dist/semantic/semantic-indexer.d.ts +64 -0
- package/dist/semantic/semantic-indexer.d.ts.map +1 -0
- package/dist/semantic/semantic-indexer.js +162 -0
- package/dist/semantic/semantic-indexer.js.map +1 -0
- package/dist/semantic/text-preparation.d.ts +23 -0
- package/dist/semantic/text-preparation.d.ts.map +1 -0
- package/dist/semantic/text-preparation.js +56 -0
- package/dist/semantic/text-preparation.js.map +1 -0
- package/dist/semantic/vector-store.d.ts +81 -0
- package/dist/semantic/vector-store.d.ts.map +1 -0
- package/dist/semantic/vector-store.js +157 -0
- package/dist/semantic/vector-store.js.map +1 -0
- package/dist/server/admin-api.d.ts +88 -0
- package/dist/server/admin-api.d.ts.map +1 -0
- package/dist/server/admin-api.js +661 -0
- package/dist/server/admin-api.js.map +1 -0
- package/dist/server/auth/api-key.d.ts +105 -0
- package/dist/server/auth/api-key.d.ts.map +1 -0
- package/dist/server/auth/api-key.js +276 -0
- package/dist/server/auth/api-key.js.map +1 -0
- package/dist/server/http-server.d.ts +100 -0
- package/dist/server/http-server.d.ts.map +1 -0
- package/dist/server/http-server.js +823 -0
- package/dist/server/http-server.js.map +1 -0
- package/dist/server/mcp-server.d.ts +23 -0
- package/dist/server/mcp-server.d.ts.map +1 -0
- package/dist/server/mcp-server.js +214 -0
- package/dist/server/mcp-server.js.map +1 -0
- package/dist/server/rate-limit-store.d.ts +25 -0
- package/dist/server/rate-limit-store.d.ts.map +1 -0
- package/dist/server/rate-limit-store.js +46 -0
- package/dist/server/rate-limit-store.js.map +1 -0
- package/dist/server/rate-limiter.d.ts +59 -0
- package/dist/server/rate-limiter.d.ts.map +1 -0
- package/dist/server/rate-limiter.js +85 -0
- package/dist/server/rate-limiter.js.map +1 -0
- package/dist/server/tools/_meta.d.ts +24 -0
- package/dist/server/tools/_meta.d.ts.map +1 -0
- package/dist/server/tools/_meta.js +35 -0
- package/dist/server/tools/_meta.js.map +1 -0
- package/dist/server/tools/find-dead-code.d.ts +11 -0
- package/dist/server/tools/find-dead-code.d.ts.map +1 -0
- package/dist/server/tools/find-dead-code.js +45 -0
- package/dist/server/tools/find-dead-code.js.map +1 -0
- package/dist/server/tools/find-importers.d.ts +13 -0
- package/dist/server/tools/find-importers.d.ts.map +1 -0
- package/dist/server/tools/find-importers.js +46 -0
- package/dist/server/tools/find-importers.js.map +1 -0
- package/dist/server/tools/get-blast-radius.d.ts +15 -0
- package/dist/server/tools/get-blast-radius.d.ts.map +1 -0
- package/dist/server/tools/get-blast-radius.js +51 -0
- package/dist/server/tools/get-blast-radius.js.map +1 -0
- package/dist/server/tools/get-context-bundle.d.ts +15 -0
- package/dist/server/tools/get-context-bundle.d.ts.map +1 -0
- package/dist/server/tools/get-context-bundle.js +53 -0
- package/dist/server/tools/get-context-bundle.js.map +1 -0
- package/dist/server/tools/get-file-outline.d.ts +13 -0
- package/dist/server/tools/get-file-outline.d.ts.map +1 -0
- package/dist/server/tools/get-file-outline.js +42 -0
- package/dist/server/tools/get-file-outline.js.map +1 -0
- package/dist/server/tools/get-file-tree.d.ts +11 -0
- package/dist/server/tools/get-file-tree.d.ts.map +1 -0
- package/dist/server/tools/get-file-tree.js +63 -0
- package/dist/server/tools/get-file-tree.js.map +1 -0
- package/dist/server/tools/get-graph.d.ts +46 -0
- package/dist/server/tools/get-graph.d.ts.map +1 -0
- package/dist/server/tools/get-graph.js +168 -0
- package/dist/server/tools/get-graph.js.map +1 -0
- package/dist/server/tools/get-layer-violations.d.ts +37 -0
- package/dist/server/tools/get-layer-violations.d.ts.map +1 -0
- package/dist/server/tools/get-layer-violations.js +138 -0
- package/dist/server/tools/get-layer-violations.js.map +1 -0
- package/dist/server/tools/get-repo-outline.d.ts +13 -0
- package/dist/server/tools/get-repo-outline.d.ts.map +1 -0
- package/dist/server/tools/get-repo-outline.js +72 -0
- package/dist/server/tools/get-repo-outline.js.map +1 -0
- package/dist/server/tools/get-savings-stats.d.ts +11 -0
- package/dist/server/tools/get-savings-stats.d.ts.map +1 -0
- package/dist/server/tools/get-savings-stats.js +56 -0
- package/dist/server/tools/get-savings-stats.js.map +1 -0
- package/dist/server/tools/get-symbol-source.d.ts +13 -0
- package/dist/server/tools/get-symbol-source.d.ts.map +1 -0
- package/dist/server/tools/get-symbol-source.js +93 -0
- package/dist/server/tools/get-symbol-source.js.map +1 -0
- package/dist/server/tools/index-folder.d.ts +15 -0
- package/dist/server/tools/index-folder.d.ts.map +1 -0
- package/dist/server/tools/index-folder.js +45 -0
- package/dist/server/tools/index-folder.js.map +1 -0
- package/dist/server/tools/index-repo.d.ts +26 -0
- package/dist/server/tools/index-repo.d.ts.map +1 -0
- package/dist/server/tools/index-repo.js +164 -0
- package/dist/server/tools/index-repo.js.map +1 -0
- package/dist/server/tools/list-repos.d.ts +11 -0
- package/dist/server/tools/list-repos.d.ts.map +1 -0
- package/dist/server/tools/list-repos.js +60 -0
- package/dist/server/tools/list-repos.js.map +1 -0
- package/dist/server/tools/resolve-repo.d.ts +11 -0
- package/dist/server/tools/resolve-repo.d.ts.map +1 -0
- package/dist/server/tools/resolve-repo.js +44 -0
- package/dist/server/tools/resolve-repo.js.map +1 -0
- package/dist/server/tools/search-semantic.d.ts +56 -0
- package/dist/server/tools/search-semantic.d.ts.map +1 -0
- package/dist/server/tools/search-semantic.js +187 -0
- package/dist/server/tools/search-semantic.js.map +1 -0
- package/dist/server/tools/search-symbols.d.ts +43 -0
- package/dist/server/tools/search-symbols.d.ts.map +1 -0
- package/dist/server/tools/search-symbols.js +197 -0
- package/dist/server/tools/search-symbols.js.map +1 -0
- package/dist/server/tools/search-text.d.ts +21 -0
- package/dist/server/tools/search-text.d.ts.map +1 -0
- package/dist/server/tools/search-text.js +131 -0
- package/dist/server/tools/search-text.js.map +1 -0
- package/dist/server/transport.d.ts +59 -0
- package/dist/server/transport.d.ts.map +1 -0
- package/dist/server/transport.js +92 -0
- package/dist/server/transport.js.map +1 -0
- package/dist/summarizer/ai-summarizer.d.ts +71 -0
- package/dist/summarizer/ai-summarizer.d.ts.map +1 -0
- package/dist/summarizer/ai-summarizer.js +228 -0
- package/dist/summarizer/ai-summarizer.js.map +1 -0
- package/dist/summarizer/docstring-extractor.d.ts +9 -0
- package/dist/summarizer/docstring-extractor.d.ts.map +1 -0
- package/dist/summarizer/docstring-extractor.js +89 -0
- package/dist/summarizer/docstring-extractor.js.map +1 -0
- package/dist/summarizer/embeddings.d.ts +29 -0
- package/dist/summarizer/embeddings.d.ts.map +1 -0
- package/dist/summarizer/embeddings.js +133 -0
- package/dist/summarizer/embeddings.js.map +1 -0
- package/dist/summarizer/summarizer.d.ts +22 -0
- package/dist/summarizer/summarizer.d.ts.map +1 -0
- package/dist/summarizer/summarizer.js +86 -0
- package/dist/summarizer/summarizer.js.map +1 -0
- package/dist/ui/assets/BlastRadius-ccQ3ktbv.js +1 -0
- package/dist/ui/assets/DependencyGraph-BZV40eAE.css +1 -0
- package/dist/ui/assets/DependencyGraph-Ca84q89b.js +27 -0
- package/dist/ui/assets/NotFound-C1wVKP-6.js +1 -0
- package/dist/ui/assets/RepoDetail-B_8qid2Y.js +1 -0
- package/dist/ui/assets/RepoList-BuPu-ODM.js +1 -0
- package/dist/ui/assets/Search-BzZ9Og8E.js +1 -0
- package/dist/ui/assets/SymbolView-FdpKlzql.js +14 -0
- package/dist/ui/assets/client-BANW_tIp.js +1 -0
- package/dist/ui/assets/index-CnwwQi_S.js +61 -0
- package/dist/ui/assets/index-SS2IXr8I.css +1 -0
- package/dist/ui/assets/repoStore-SbGR6YI6.js +1 -0
- package/dist/ui/assets/useSearch-DHyve22h.js +1 -0
- package/dist/ui/index.html +13 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/grammars/tree-sitter-c.wasm +0 -0
- package/grammars/tree-sitter-cpp.wasm +0 -0
- package/grammars/tree-sitter-csharp.wasm +0 -0
- package/grammars/tree-sitter-dart.wasm +0 -0
- package/grammars/tree-sitter-elixir.wasm +0 -0
- package/grammars/tree-sitter-go.wasm +0 -0
- package/grammars/tree-sitter-haskell.wasm +0 -0
- package/grammars/tree-sitter-java.wasm +0 -0
- package/grammars/tree-sitter-javascript.wasm +0 -0
- package/grammars/tree-sitter-kotlin.wasm +0 -0
- package/grammars/tree-sitter-lua.wasm +0 -0
- package/grammars/tree-sitter-php.wasm +0 -0
- package/grammars/tree-sitter-python.wasm +0 -0
- package/grammars/tree-sitter-r.wasm +0 -0
- package/grammars/tree-sitter-ruby.wasm +0 -0
- package/grammars/tree-sitter-rust.wasm +0 -0
- package/grammars/tree-sitter-scala.wasm +0 -0
- package/grammars/tree-sitter-swift.wasm +0 -0
- package/grammars/tree-sitter-tsx.wasm +0 -0
- package/grammars/tree-sitter-typescript.wasm +0 -0
- package/package.json +104 -0
- package/scripts/check-sqlite.js +41 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Goran Ocokoljic
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
# PureContext MCP
|
|
2
|
+
|
|
3
|
+
[](https://github.com/Goran-Ocokoljic/purecontext-mcp/actions/workflows/ci.yml)
|
|
4
|
+
[](https://www.npmjs.com/package/purecontext-mcp)
|
|
5
|
+
[](docs/API_STABILITY.md)
|
|
6
|
+
|
|
7
|
+
Token-efficient source code navigation for AI agents. Indexes TypeScript/JavaScript projects using tree-sitter AST parsing, stores structured symbol metadata in SQLite, and exposes a Model Context Protocol (MCP) server so AI agents can retrieve precisely the code they need — signatures, dependencies, and source — without reading entire files.
|
|
8
|
+
|
|
9
|
+
## What's New in 1.0
|
|
10
|
+
|
|
11
|
+
Version 1.0.0 is the first stable release. The tool API is now under semver — breaking changes require a major version bump. See [CHANGELOG.md](CHANGELOG.md) for the full history and [docs/API_STABILITY.md](docs/API_STABILITY.md) for the public API contract.
|
|
12
|
+
|
|
13
|
+
Highlights since the initial prototype:
|
|
14
|
+
- **16 languages** — TypeScript, JavaScript, Python, Go, Rust, Java, C/C++, C#, Swift, Kotlin, Dart, Elixir, Haskell, Scala, R, PHP, Lua, Ruby
|
|
15
|
+
- **20+ framework adapters** — Vue, Nuxt, React, Next.js, Angular, Express, Fastify, Django, FastAPI, Flask, Spring, and more
|
|
16
|
+
- **FTS5 + semantic search** — keyword search with camelCase splitting and HNSW vector index
|
|
17
|
+
- **Dependency graph tools** — blast radius, context bundle, dead code detection
|
|
18
|
+
- **Worker thread pool** — parallel parsing for 10k–50k file enterprise repos
|
|
19
|
+
- **Zero-build install** — prebuilt `better-sqlite3` binaries for Node 18/20/22 × Windows/macOS/Linux
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Quick Start
|
|
24
|
+
|
|
25
|
+
### Install and connect to Claude Code
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# Add to Claude Code (uses npx to run without global install)
|
|
29
|
+
claude mcp add purecontext-mcp -- npx purecontext-mcp
|
|
30
|
+
|
|
31
|
+
# Or install globally first
|
|
32
|
+
npm install -g purecontext-mcp
|
|
33
|
+
claude mcp add purecontext-mcp -- purecontext-mcp
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Index a project
|
|
37
|
+
|
|
38
|
+
Once connected, tell Claude to index your project:
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
Index my project at /path/to/my-project using the index_folder tool
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Then use any of the tools below to navigate it.
|
|
45
|
+
|
|
46
|
+
### Configuration (optional)
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# Generate a config file with all defaults and comments
|
|
50
|
+
npx purecontext-mcp config --init
|
|
51
|
+
|
|
52
|
+
# Validate config and check prerequisites
|
|
53
|
+
npx purecontext-mcp config --check
|
|
54
|
+
|
|
55
|
+
# Show effective configuration
|
|
56
|
+
npx purecontext-mcp config
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Tool Reference
|
|
62
|
+
|
|
63
|
+
All tools return JSON. Responses include a `_tokenEstimate` field (where applicable) so agents can gauge context size before loading full source.
|
|
64
|
+
|
|
65
|
+
### Indexing
|
|
66
|
+
|
|
67
|
+
| Tool | Description |
|
|
68
|
+
|------|-------------|
|
|
69
|
+
| `index_folder` | Index a project directory. Discovers source files, parses symbols and imports, builds a dependency graph. Returns `repoId` and statistics. |
|
|
70
|
+
| `resolve_repo` | Resolve a local path to its `repoId`. Reports whether the project has been indexed and its metadata. |
|
|
71
|
+
| `list_repos` | List all indexed repositories with their metadata. |
|
|
72
|
+
|
|
73
|
+
### Symbol Search and Retrieval
|
|
74
|
+
|
|
75
|
+
| Tool | Description |
|
|
76
|
+
|------|-------------|
|
|
77
|
+
| `search_symbols` | Search symbols by name fragment. Filters by `kind`, `filePath`, and `limit`. Returns signatures and summaries — no source code. |
|
|
78
|
+
| `get_symbol_source` | Retrieve the raw source of one symbol using its byte offsets. Use after `search_symbols` to drill into a specific definition. |
|
|
79
|
+
| `get_file_outline` | All symbols defined in a file with signatures and summaries. Token-efficient alternative to reading the file. |
|
|
80
|
+
| `get_repo_outline` | All files with their top-level symbols. Useful for understanding project structure. |
|
|
81
|
+
| `get_file_tree` | Directory tree of an indexed project with file counts per directory. |
|
|
82
|
+
|
|
83
|
+
### Dependency Graph
|
|
84
|
+
|
|
85
|
+
| Tool | Description |
|
|
86
|
+
|------|-------------|
|
|
87
|
+
| `get_context_bundle` | Forward-walk from a symbol: returns everything needed to understand it (transitive imports). Includes token estimate. |
|
|
88
|
+
| `get_blast_radius` | Reverse-walk from a symbol: returns all files that (transitively) import it. Use before modifying or deleting a symbol. |
|
|
89
|
+
| `find_importers` | Direct importers of a file, with their symbols. |
|
|
90
|
+
| `find_dead_code` | Exported symbols in files that nothing else imports. Helps identify unused code. |
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Configuration Reference
|
|
95
|
+
|
|
96
|
+
Config file location: `~/.purecontext/config.json`
|
|
97
|
+
|
|
98
|
+
| Field | Type | Default | Description |
|
|
99
|
+
|-------|------|---------|-------------|
|
|
100
|
+
| `indexDir` | `string` | `~/.purecontext/indexes/` | Where SQLite index files are stored |
|
|
101
|
+
| `fileLimit` | `number` | `1000` | Max files indexed per project |
|
|
102
|
+
| `watchDebounceMs` | `number` | `2000` | File watcher debounce window (ms) |
|
|
103
|
+
| `excludePatterns` | `string[]` | `[]` | Additional glob patterns to exclude |
|
|
104
|
+
| `adapters` | `'auto'`\|`'none'`\|`string[]` | `'auto'` | Framework adapter activation |
|
|
105
|
+
| `ai.provider` | `'none'`\|`'anthropic'`\|`'openai'` | `'none'` | AI summarization provider (Phase 2) |
|
|
106
|
+
| `ai.allowRemoteAI` | `boolean` | `false` | Allow outbound AI API calls |
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Team Setup (Shared Server)
|
|
111
|
+
|
|
112
|
+
PureContext can run as an always-on shared server so your whole team queries the same index without each developer re-indexing independently.
|
|
113
|
+
|
|
114
|
+
### 1. Start the server
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
# Docker (recommended)
|
|
118
|
+
docker run -d \
|
|
119
|
+
-p 3000:3000 \
|
|
120
|
+
-v ./data:/data \
|
|
121
|
+
-e PCTX_ADMIN_KEY=your-admin-secret \
|
|
122
|
+
purecontext/purecontext-mcp:latest
|
|
123
|
+
|
|
124
|
+
# Or with npx
|
|
125
|
+
PCTX_ADMIN_KEY=your-admin-secret npx purecontext-mcp --server --host 0.0.0.0 --port 3000
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### 2. Create a workspace and API keys
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
# Create workspace
|
|
132
|
+
curl -s -X POST http://localhost:3000/admin/workspaces \
|
|
133
|
+
-H "Authorization: Bearer your-admin-secret" \
|
|
134
|
+
-H "Content-Type: application/json" \
|
|
135
|
+
-d '{"name": "my-team"}' | jq .
|
|
136
|
+
|
|
137
|
+
# Create a key for each developer
|
|
138
|
+
curl -s -X POST http://localhost:3000/admin/keys \
|
|
139
|
+
-H "Authorization: Bearer your-admin-secret" \
|
|
140
|
+
-H "Content-Type: application/json" \
|
|
141
|
+
-d '{"label": "alice-laptop", "permissions": ["read", "write"]}' | jq .key
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### 3. Index the shared repo (once, on the server)
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
curl -s -X POST http://localhost:3000/mcp/sse \
|
|
148
|
+
-H "Authorization: Bearer pctx_alice_key_here" \
|
|
149
|
+
-H "Accept: application/json, text/event-stream" \
|
|
150
|
+
-H "Content-Type: application/json" \
|
|
151
|
+
-d '{"jsonrpc":"2.0","method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"cli","version":"1.0.0"}},"id":1}'
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Or simply ask Claude Code to index via the remote connection (step 4).
|
|
155
|
+
|
|
156
|
+
### 4. Connect each developer's Claude Code
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
claude mcp add purecontext-remote \
|
|
160
|
+
--transport http \
|
|
161
|
+
--url https://purecontext.mycompany.com/mcp/sse \
|
|
162
|
+
--header "Authorization: Bearer pctx_yourkey"
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Each developer gets their own API key. The server handles concurrent agent sessions independently. See [docs/TEAM_SETUP.md](docs/TEAM_SETUP.md) for the full walkthrough including proxy configuration, TLS, and troubleshooting.
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Architecture Overview
|
|
170
|
+
|
|
171
|
+
PureContext MCP follows a strict three-layer architecture:
|
|
172
|
+
|
|
173
|
+
```
|
|
174
|
+
Adapters (src/adapters/) Framework-specific extraction (Vue, Nuxt, React — Phase 2)
|
|
175
|
+
↓
|
|
176
|
+
Handlers (src/handlers/) Language-specific AST parsing (TypeScript, JavaScript)
|
|
177
|
+
↓
|
|
178
|
+
Core (src/core/) File discovery, SQLite storage, MCP transport
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Dependencies flow strictly downward. Core knows nothing about specific languages or frameworks.
|
|
182
|
+
|
|
183
|
+
### Key components
|
|
184
|
+
|
|
185
|
+
- **Index Manager** (`src/core/index-manager.ts`) — orchestrates the full pipeline: discover → parse → extract → store → graph
|
|
186
|
+
- **Parse Dispatcher** (`src/core/parse-dispatcher.ts`) — routes files to language handlers via web-tree-sitter (WASM)
|
|
187
|
+
- **Graph Traversal** (`src/graph/graph-traversal.ts`) — BFS forward/reverse walks over the dependency graph
|
|
188
|
+
- **File Watcher** (`src/core/watcher/file-watcher.ts`) — chokidar-based incremental re-indexing on file changes
|
|
189
|
+
- **MCP Server** (`src/server/mcp-server.ts`) — registers all tools, handles stdio transport
|
|
190
|
+
|
|
191
|
+
For detailed design decisions and requirements, see `docs/PureContext_MCP_PRD_v1.0.docx`.
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Development
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
npm run build # Compile TypeScript
|
|
199
|
+
npm run dev # Watch mode
|
|
200
|
+
npm run test # Run test suite (vitest)
|
|
201
|
+
npm run lint # ESLint
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Requirements
|
|
205
|
+
|
|
206
|
+
- Node.js >= 18.0.0
|
|
207
|
+
- The `grammars/` directory must contain the bundled `.wasm` grammar files (included in the package)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Actix-web framework adapter (Rust).
|
|
3
|
+
*
|
|
4
|
+
* Extracts route, middleware, and extractor symbols from Actix-web applications.
|
|
5
|
+
* Actix supports two route definition styles:
|
|
6
|
+
*
|
|
7
|
+
* Attribute macros (common):
|
|
8
|
+
* #[get("/users")]
|
|
9
|
+
* async fn list_users() -> impl Responder { ... }
|
|
10
|
+
*
|
|
11
|
+
* Programmatic (web::resource / web::scope):
|
|
12
|
+
* web::resource("/users")
|
|
13
|
+
* .route(web::get().to(list_users))
|
|
14
|
+
* .route(web::post().to(create_user))
|
|
15
|
+
*
|
|
16
|
+
* Scope prefix:
|
|
17
|
+
* web::scope("/api/v2")
|
|
18
|
+
* .service(...)
|
|
19
|
+
*
|
|
20
|
+
* Middleware via .wrap():
|
|
21
|
+
* .wrap(actix_web::middleware::Logger::default())
|
|
22
|
+
*
|
|
23
|
+
* Extractor via impl FromRequest:
|
|
24
|
+
* impl FromRequest for AuthUser { ... }
|
|
25
|
+
*/
|
|
26
|
+
import type { FrameworkAdapter } from '../core/types.js';
|
|
27
|
+
export declare const actixWebAdapter: FrameworkAdapter;
|
|
28
|
+
//# sourceMappingURL=actix-web.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actix-web.d.ts","sourceRoot":"","sources":["../../src/adapters/actix-web.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAsB,MAAM,kBAAkB,CAAC;AAoV7E,eAAO,MAAM,eAAe,EAAE,gBA+C7B,CAAC"}
|
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Actix-web framework adapter (Rust).
|
|
3
|
+
*
|
|
4
|
+
* Extracts route, middleware, and extractor symbols from Actix-web applications.
|
|
5
|
+
* Actix supports two route definition styles:
|
|
6
|
+
*
|
|
7
|
+
* Attribute macros (common):
|
|
8
|
+
* #[get("/users")]
|
|
9
|
+
* async fn list_users() -> impl Responder { ... }
|
|
10
|
+
*
|
|
11
|
+
* Programmatic (web::resource / web::scope):
|
|
12
|
+
* web::resource("/users")
|
|
13
|
+
* .route(web::get().to(list_users))
|
|
14
|
+
* .route(web::post().to(create_user))
|
|
15
|
+
*
|
|
16
|
+
* Scope prefix:
|
|
17
|
+
* web::scope("/api/v2")
|
|
18
|
+
* .service(...)
|
|
19
|
+
*
|
|
20
|
+
* Middleware via .wrap():
|
|
21
|
+
* .wrap(actix_web::middleware::Logger::default())
|
|
22
|
+
*
|
|
23
|
+
* Extractor via impl FromRequest:
|
|
24
|
+
* impl FromRequest for AuthUser { ... }
|
|
25
|
+
*/
|
|
26
|
+
import { createHash } from 'crypto';
|
|
27
|
+
import { readFileSync } from 'fs';
|
|
28
|
+
import { join } from 'path';
|
|
29
|
+
import { registerAdapter } from './adapter-registry.js';
|
|
30
|
+
import { logger } from '../core/logger.js';
|
|
31
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
32
|
+
function makeId(filePath, name, kind) {
|
|
33
|
+
return createHash('sha256')
|
|
34
|
+
.update(`${filePath}:${name}:${kind}`)
|
|
35
|
+
.digest('hex')
|
|
36
|
+
.slice(0, 16);
|
|
37
|
+
}
|
|
38
|
+
// ─── Constants ────────────────────────────────────────────────────────────────
|
|
39
|
+
const ACTIX_HTTP_METHODS = [
|
|
40
|
+
'get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace', 'connect',
|
|
41
|
+
];
|
|
42
|
+
// ─── Argument collector ───────────────────────────────────────────────────────
|
|
43
|
+
/**
|
|
44
|
+
* Collect the full text inside a parenthesised call, handling nested parens
|
|
45
|
+
* and string literals. `pos` must point immediately after the opening `(`.
|
|
46
|
+
* Returns inner text (sans outer parens), or null if unbalanced.
|
|
47
|
+
*/
|
|
48
|
+
function collectArgs(source, pos) {
|
|
49
|
+
let depth = 1;
|
|
50
|
+
const start = pos;
|
|
51
|
+
let inString = false;
|
|
52
|
+
let stringChar = '';
|
|
53
|
+
while (pos < source.length && depth > 0) {
|
|
54
|
+
const ch = source[pos];
|
|
55
|
+
if (inString) {
|
|
56
|
+
if (ch === '\\') {
|
|
57
|
+
pos++;
|
|
58
|
+
}
|
|
59
|
+
else if (ch === stringChar) {
|
|
60
|
+
inString = false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
if (ch === '"' || ch === '\'') {
|
|
65
|
+
inString = true;
|
|
66
|
+
stringChar = ch;
|
|
67
|
+
}
|
|
68
|
+
else if (ch === '(') {
|
|
69
|
+
depth++;
|
|
70
|
+
}
|
|
71
|
+
else if (ch === ')') {
|
|
72
|
+
depth--;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
pos++;
|
|
76
|
+
}
|
|
77
|
+
if (depth !== 0)
|
|
78
|
+
return null;
|
|
79
|
+
return source.slice(start, pos - 1);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Collect a method-chaining expression starting at `pos`. Advances until a
|
|
83
|
+
* semicolon or unmatched closing bracket/paren/brace at depth 0 is reached.
|
|
84
|
+
*/
|
|
85
|
+
function collectMethodChain(source, pos) {
|
|
86
|
+
let depth = 0;
|
|
87
|
+
const start = pos;
|
|
88
|
+
while (pos < source.length) {
|
|
89
|
+
const ch = source[pos];
|
|
90
|
+
if (ch === '(' || ch === '{' || ch === '[') {
|
|
91
|
+
depth++;
|
|
92
|
+
}
|
|
93
|
+
else if (ch === ')' || ch === '}' || ch === ']') {
|
|
94
|
+
if (depth === 0)
|
|
95
|
+
break;
|
|
96
|
+
depth--;
|
|
97
|
+
}
|
|
98
|
+
else if (ch === ';' && depth === 0) {
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
pos++;
|
|
102
|
+
}
|
|
103
|
+
return source.slice(start, pos);
|
|
104
|
+
}
|
|
105
|
+
// ─── Attribute macro route extraction ────────────────────────────────────────
|
|
106
|
+
/**
|
|
107
|
+
* Extract routes defined via Actix attribute macros:
|
|
108
|
+
* #[get("/path")] → GET /path
|
|
109
|
+
* #[actix_web::get("/path")] → GET /path
|
|
110
|
+
* #[route(GET, path = "/path")] is not handled (use programmatic style instead)
|
|
111
|
+
*
|
|
112
|
+
* The attribute immediately precedes an `async fn` or `fn` declaration; the
|
|
113
|
+
* route path is taken from the attribute argument.
|
|
114
|
+
*/
|
|
115
|
+
function extractActixMacroRoutes(source, filePath) {
|
|
116
|
+
const symbols = [];
|
|
117
|
+
const seen = new Set();
|
|
118
|
+
const methodPat = ACTIX_HTTP_METHODS.join('|');
|
|
119
|
+
// Match: #[optional::path::get("/path")]
|
|
120
|
+
const re = new RegExp(`#\\[(?:[\\w]+::)*(${methodPat})\\s*\\(\\s*"([^"]+)"`, 'g');
|
|
121
|
+
let m;
|
|
122
|
+
while ((m = re.exec(source)) !== null) {
|
|
123
|
+
const method = m[1].toUpperCase();
|
|
124
|
+
const routePath = m[2];
|
|
125
|
+
const routeName = `${method} ${routePath}`;
|
|
126
|
+
if (seen.has(routeName))
|
|
127
|
+
continue;
|
|
128
|
+
seen.add(routeName);
|
|
129
|
+
symbols.push({
|
|
130
|
+
id: makeId(filePath, routeName, 'route'),
|
|
131
|
+
name: routeName,
|
|
132
|
+
kind: 'route',
|
|
133
|
+
filePath,
|
|
134
|
+
startByte: 0,
|
|
135
|
+
endByte: 0,
|
|
136
|
+
signature: `#[${m[1]}("${routePath}")]`,
|
|
137
|
+
summary: `Actix route: ${routeName}`,
|
|
138
|
+
frameworkMeta: {
|
|
139
|
+
http_method: method,
|
|
140
|
+
route_path: routePath,
|
|
141
|
+
actix_route: true,
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
return symbols;
|
|
146
|
+
}
|
|
147
|
+
// ─── Programmatic route extraction (web::resource) ────────────────────────────
|
|
148
|
+
/**
|
|
149
|
+
* Extract routes from `web::resource("/path").route(web::METHOD().to(handler))`
|
|
150
|
+
* chains. Collects the full method chain after each `web::resource(...)` call
|
|
151
|
+
* and scans it for `.route(web::METHOD()...)` patterns.
|
|
152
|
+
*/
|
|
153
|
+
function extractActixResourceRoutes(source, filePath) {
|
|
154
|
+
const symbols = [];
|
|
155
|
+
const seen = new Set();
|
|
156
|
+
const methodPat = ACTIX_HTTP_METHODS.join('|');
|
|
157
|
+
// Inner pattern: .route(web::METHOD()...)
|
|
158
|
+
const innerRouteRe = new RegExp(`\\.route\\s*\\(\\s*web::(${methodPat})\\s*\\(`, 'g');
|
|
159
|
+
const resourceRe = /\bweb::resource\s*\(/g;
|
|
160
|
+
let m;
|
|
161
|
+
while ((m = resourceRe.exec(source)) !== null) {
|
|
162
|
+
const pathArgPos = m.index + m[0].length;
|
|
163
|
+
const pathArgs = collectArgs(source, pathArgPos);
|
|
164
|
+
if (!pathArgs)
|
|
165
|
+
continue;
|
|
166
|
+
const pathMatch = pathArgs.match(/^\s*"([^"]+)"\s*$/);
|
|
167
|
+
if (!pathMatch)
|
|
168
|
+
continue;
|
|
169
|
+
const resourcePath = pathMatch[1];
|
|
170
|
+
// Collect the chained .route() calls that follow
|
|
171
|
+
const chainStart = pathArgPos + pathArgs.length + 1; // skip closing )
|
|
172
|
+
const chain = collectMethodChain(source, chainStart);
|
|
173
|
+
innerRouteRe.lastIndex = 0;
|
|
174
|
+
let rm;
|
|
175
|
+
while ((rm = innerRouteRe.exec(chain)) !== null) {
|
|
176
|
+
const method = rm[1].toUpperCase();
|
|
177
|
+
const routeName = `${method} ${resourcePath}`;
|
|
178
|
+
if (seen.has(routeName))
|
|
179
|
+
continue;
|
|
180
|
+
seen.add(routeName);
|
|
181
|
+
symbols.push({
|
|
182
|
+
id: makeId(filePath, routeName, 'route'),
|
|
183
|
+
name: routeName,
|
|
184
|
+
kind: 'route',
|
|
185
|
+
filePath,
|
|
186
|
+
startByte: 0,
|
|
187
|
+
endByte: 0,
|
|
188
|
+
signature: `web::resource("${resourcePath}").route(web::${method.toLowerCase()}().to(...))`,
|
|
189
|
+
summary: `Actix route: ${routeName}`,
|
|
190
|
+
frameworkMeta: {
|
|
191
|
+
http_method: method,
|
|
192
|
+
route_path: resourcePath,
|
|
193
|
+
actix_route: true,
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return symbols;
|
|
199
|
+
}
|
|
200
|
+
// ─── Scope prefix extraction ──────────────────────────────────────────────────
|
|
201
|
+
/**
|
|
202
|
+
* Extract `web::scope("/prefix")` mount points and emit them as route symbols
|
|
203
|
+
* with `actix_scope: true`. The prefix is preserved for URL hierarchy
|
|
204
|
+
* understanding.
|
|
205
|
+
*/
|
|
206
|
+
function extractActixScopes(source, filePath) {
|
|
207
|
+
const symbols = [];
|
|
208
|
+
const seen = new Set();
|
|
209
|
+
const scopeRe = /\bweb::scope\s*\(/g;
|
|
210
|
+
let m;
|
|
211
|
+
while ((m = scopeRe.exec(source)) !== null) {
|
|
212
|
+
const argsPos = m.index + m[0].length;
|
|
213
|
+
const argsText = collectArgs(source, argsPos);
|
|
214
|
+
if (!argsText)
|
|
215
|
+
continue;
|
|
216
|
+
const pathMatch = argsText.match(/^\s*"([^"]+)"\s*$/);
|
|
217
|
+
if (!pathMatch)
|
|
218
|
+
continue;
|
|
219
|
+
const prefix = pathMatch[1];
|
|
220
|
+
if (seen.has(prefix))
|
|
221
|
+
continue;
|
|
222
|
+
seen.add(prefix);
|
|
223
|
+
symbols.push({
|
|
224
|
+
id: makeId(filePath, `SCOPE ${prefix}`, 'route'),
|
|
225
|
+
name: `SCOPE ${prefix}`,
|
|
226
|
+
kind: 'route',
|
|
227
|
+
filePath,
|
|
228
|
+
startByte: 0,
|
|
229
|
+
endByte: 0,
|
|
230
|
+
signature: `web::scope("${prefix}")`,
|
|
231
|
+
summary: `Actix scope prefix: ${prefix}`,
|
|
232
|
+
frameworkMeta: {
|
|
233
|
+
route_path: prefix,
|
|
234
|
+
actix_scope: true,
|
|
235
|
+
},
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
return symbols;
|
|
239
|
+
}
|
|
240
|
+
// ─── Middleware extraction ────────────────────────────────────────────────────
|
|
241
|
+
/**
|
|
242
|
+
* Extract middleware symbols from `.wrap(...)` calls.
|
|
243
|
+
* The middleware name is taken from the first type segment of the argument
|
|
244
|
+
* (e.g. `Logger` from `actix_web::middleware::Logger::default()`).
|
|
245
|
+
*/
|
|
246
|
+
function extractActixMiddleware(source, filePath) {
|
|
247
|
+
const symbols = [];
|
|
248
|
+
const seen = new Set();
|
|
249
|
+
const wrapRe = /\.wrap\s*\(/g;
|
|
250
|
+
let m;
|
|
251
|
+
while ((m = wrapRe.exec(source)) !== null) {
|
|
252
|
+
const argsPos = m.index + m[0].length;
|
|
253
|
+
const argsText = collectArgs(source, argsPos);
|
|
254
|
+
if (!argsText)
|
|
255
|
+
continue;
|
|
256
|
+
// Capture the full path, then pick the first PascalCase segment as the type name.
|
|
257
|
+
// e.g. `actix_web::middleware::Logger::default()` → segments ['actix_web', 'middleware', 'Logger', 'default']
|
|
258
|
+
// first PascalCase → 'Logger'
|
|
259
|
+
// e.g. `AuthMiddleware` → 'AuthMiddleware'
|
|
260
|
+
// e.g. `CorsMiddleware::new()` → 'CorsMiddleware'
|
|
261
|
+
const typeMatch = argsText.trim().match(/^([A-Za-z][A-Za-z0-9_]*(?:::[A-Za-z][A-Za-z0-9_]*)*)/);
|
|
262
|
+
if (!typeMatch)
|
|
263
|
+
continue;
|
|
264
|
+
const segments = typeMatch[1].split('::');
|
|
265
|
+
const typeName = segments.find((s) => /^[A-Z]/.test(s)) ?? segments[0];
|
|
266
|
+
if (seen.has(typeName))
|
|
267
|
+
continue;
|
|
268
|
+
seen.add(typeName);
|
|
269
|
+
symbols.push({
|
|
270
|
+
id: makeId(filePath, typeName, 'middleware'),
|
|
271
|
+
name: typeName,
|
|
272
|
+
kind: 'middleware',
|
|
273
|
+
filePath,
|
|
274
|
+
startByte: 0,
|
|
275
|
+
endByte: 0,
|
|
276
|
+
signature: `.wrap(${argsText.trim().split('(')[0].trim()}(...))`,
|
|
277
|
+
summary: `Actix middleware: ${typeName}`,
|
|
278
|
+
frameworkMeta: {
|
|
279
|
+
actix_middleware: true,
|
|
280
|
+
},
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
return symbols;
|
|
284
|
+
}
|
|
285
|
+
// ─── FromRequest extractor extraction ────────────────────────────────────────
|
|
286
|
+
/**
|
|
287
|
+
* Scan for `impl [<bounds>] [path::]FromRequest for TypeName` and emit a
|
|
288
|
+
* `type` symbol with `actix_extractor: true`.
|
|
289
|
+
*/
|
|
290
|
+
function extractActixExtractors(source, filePath) {
|
|
291
|
+
const symbols = [];
|
|
292
|
+
const seen = new Set();
|
|
293
|
+
// impl [<...>] [path::]FromRequest [<...>] for TypeName
|
|
294
|
+
const implRe = /\bimpl(?:\s*<[^>]*>)?\s+(?:\w+::)*FromRequest(?:\s*<[^>]*>)?\s+for\s+([A-Za-z][A-Za-z0-9_]*)/g;
|
|
295
|
+
let m;
|
|
296
|
+
while ((m = implRe.exec(source)) !== null) {
|
|
297
|
+
const name = m[1];
|
|
298
|
+
if (seen.has(name))
|
|
299
|
+
continue;
|
|
300
|
+
seen.add(name);
|
|
301
|
+
symbols.push({
|
|
302
|
+
id: makeId(filePath, name, 'type'),
|
|
303
|
+
name,
|
|
304
|
+
kind: 'type',
|
|
305
|
+
filePath,
|
|
306
|
+
startByte: 0,
|
|
307
|
+
endByte: 0,
|
|
308
|
+
signature: `impl FromRequest for ${name}`,
|
|
309
|
+
summary: `Actix extractor: ${name}`,
|
|
310
|
+
frameworkMeta: { actix_extractor: true },
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
return symbols;
|
|
314
|
+
}
|
|
315
|
+
// ─── Actix import guard ───────────────────────────────────────────────────────
|
|
316
|
+
/**
|
|
317
|
+
* Quick check — only process files that reference actix_web. Avoids scanning
|
|
318
|
+
* every `.rs` file in projects that use similar patterns.
|
|
319
|
+
*/
|
|
320
|
+
function hasActixUsage(source) {
|
|
321
|
+
return /\bactix_web\b/.test(source);
|
|
322
|
+
}
|
|
323
|
+
// ─── Actix-web adapter ────────────────────────────────────────────────────────
|
|
324
|
+
export const actixWebAdapter = {
|
|
325
|
+
name: 'actix-web',
|
|
326
|
+
/** `.rs` files are handled by the Rust language handler — no new extension. */
|
|
327
|
+
extensions: () => [],
|
|
328
|
+
// ── Detection ─────────────────────────────────────────────────────────────
|
|
329
|
+
async detect(projectRoot) {
|
|
330
|
+
try {
|
|
331
|
+
const cargoToml = readFileSync(join(projectRoot, 'Cargo.toml'), 'utf8');
|
|
332
|
+
// Match `actix-web = "..."` or `actix-web = { version = "..." }`
|
|
333
|
+
return /\bactix-web\s*=/.test(cargoToml);
|
|
334
|
+
}
|
|
335
|
+
catch {
|
|
336
|
+
return false;
|
|
337
|
+
}
|
|
338
|
+
},
|
|
339
|
+
// ── File routing ───────────────────────────────────────────────────────────
|
|
340
|
+
fileFilter: (filePath) => filePath.endsWith('.rs'),
|
|
341
|
+
// ── Framework symbol extraction ────────────────────────────────────────────
|
|
342
|
+
extractFrameworkSymbols(_tree, source, filePath) {
|
|
343
|
+
const sourceStr = source.toString('utf8');
|
|
344
|
+
if (!hasActixUsage(sourceStr))
|
|
345
|
+
return [];
|
|
346
|
+
return [
|
|
347
|
+
...extractActixMacroRoutes(sourceStr, filePath),
|
|
348
|
+
...extractActixResourceRoutes(sourceStr, filePath),
|
|
349
|
+
...extractActixScopes(sourceStr, filePath),
|
|
350
|
+
...extractActixMiddleware(sourceStr, filePath),
|
|
351
|
+
...extractActixExtractors(sourceStr, filePath),
|
|
352
|
+
];
|
|
353
|
+
},
|
|
354
|
+
// ── Metadata enrichment ────────────────────────────────────────────────────
|
|
355
|
+
enrichMetadata(symbol) {
|
|
356
|
+
return symbol;
|
|
357
|
+
},
|
|
358
|
+
};
|
|
359
|
+
// ─── Self-registration ────────────────────────────────────────────────────────
|
|
360
|
+
registerAdapter(actixWebAdapter);
|
|
361
|
+
logger.debug("Adapter 'actix-web' registered");
|
|
362
|
+
//# sourceMappingURL=actix-web.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actix-web.js","sourceRoot":"","sources":["../../src/adapters/actix-web.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter registry — registration and auto-discovery of framework adapters.
|
|
3
|
+
*
|
|
4
|
+
* Adapters self-register by calling `registerAdapter(myAdapter)` at module level.
|
|
5
|
+
* The pipeline calls `discoverAdapters()` at indexing time to get the active set.
|
|
6
|
+
*/
|
|
7
|
+
import type { FrameworkAdapter } from '../core/types.js';
|
|
8
|
+
import type { PureContextConfig } from '../config/config-schema.js';
|
|
9
|
+
/**
|
|
10
|
+
* Register a framework adapter. Adapters call this at module load time.
|
|
11
|
+
* Re-registering the same name overwrites the previous entry.
|
|
12
|
+
*/
|
|
13
|
+
export declare function registerAdapter(adapter: FrameworkAdapter): void;
|
|
14
|
+
/**
|
|
15
|
+
* Return all registered adapters (in registration order).
|
|
16
|
+
*/
|
|
17
|
+
export declare function getRegisteredAdapters(): FrameworkAdapter[];
|
|
18
|
+
/**
|
|
19
|
+
* Resolve which adapters are active for a given project root, honouring the
|
|
20
|
+
* `adapters` config setting:
|
|
21
|
+
* 'auto' — call detect() on every registered adapter
|
|
22
|
+
* 'none' — return []
|
|
23
|
+
* string[] — activate named adapters only (skip detect(), assume active)
|
|
24
|
+
*/
|
|
25
|
+
export declare function discoverAdapters(projectRoot: string, config: Pick<PureContextConfig, 'adapters'>): Promise<FrameworkAdapter[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Collect all additional file extensions declared by a set of active adapters.
|
|
28
|
+
* Used by file discovery to expand the extension allowlist beyond what language
|
|
29
|
+
* handlers cover.
|
|
30
|
+
*/
|
|
31
|
+
export declare function getAdapterExtensions(adapters: FrameworkAdapter[]): string[];
|
|
32
|
+
/** Reset registry to empty — for use in tests only. */
|
|
33
|
+
export declare function _resetForTesting(): void;
|
|
34
|
+
//# sourceMappingURL=adapter-registry.d.ts.map
|