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
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vue Single-File Component (SFC) pre-processor.
|
|
3
|
+
*
|
|
4
|
+
* Splits a raw .vue file buffer into typed ProcessedBlock[] so the TypeScript/
|
|
5
|
+
* JavaScript language handlers can parse each script block independently.
|
|
6
|
+
* Template and style blocks are intentionally omitted — they don't contain
|
|
7
|
+
* symbols we want to index.
|
|
8
|
+
*
|
|
9
|
+
* Byte-offset correctness:
|
|
10
|
+
* offsetInOriginal is always computed from Buffer.byteLength(), never from
|
|
11
|
+
* string character indices. This ensures symbols inside multi-byte content
|
|
12
|
+
* that precedes the script block are positioned correctly.
|
|
13
|
+
*/
|
|
14
|
+
import { ParseError } from '../core/errors.js';
|
|
15
|
+
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
16
|
+
/**
|
|
17
|
+
* Split a Vue SFC buffer into its typed script blocks.
|
|
18
|
+
*
|
|
19
|
+
* Returns one ProcessedBlock per <script> / <script setup> block found,
|
|
20
|
+
* with language set to 'typescript' when lang="ts" or lang="tsx" is present,
|
|
21
|
+
* and 'javascript' otherwise.
|
|
22
|
+
*
|
|
23
|
+
* Returns [] for files with no script block (template/style-only SFCs).
|
|
24
|
+
* Throws ParseError for files with mismatched <script> open/close tags.
|
|
25
|
+
*/
|
|
26
|
+
export function splitVueSFC(source, filePath) {
|
|
27
|
+
const str = source.toString('utf8');
|
|
28
|
+
// ── Validate tag balance ──────────────────────────────────────────────────
|
|
29
|
+
const openCount = countMatches(str, /<script\b/gi);
|
|
30
|
+
const closeCount = countMatches(str, /<\/script>/gi);
|
|
31
|
+
if (openCount !== closeCount) {
|
|
32
|
+
throw new ParseError(`Malformed Vue SFC: ${openCount} <script> open tags but ${closeCount} </script> close tags`, filePath);
|
|
33
|
+
}
|
|
34
|
+
if (openCount === 0) {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
// ── Extract script blocks ─────────────────────────────────────────────────
|
|
38
|
+
// Captures: group 1 = attributes (everything between <script and >)
|
|
39
|
+
// group 2 = inner content
|
|
40
|
+
const SCRIPT_RE = /<script([^>]*)>([\s\S]*?)<\/script>/gi;
|
|
41
|
+
const blocks = [];
|
|
42
|
+
let match;
|
|
43
|
+
while ((match = SCRIPT_RE.exec(str)) !== null) {
|
|
44
|
+
const attrs = match[1] ?? '';
|
|
45
|
+
const innerContent = match[2] ?? '';
|
|
46
|
+
// Byte offset of the first character of inner content within the original
|
|
47
|
+
// file. We reconstruct the open tag length in characters and then convert
|
|
48
|
+
// the prefix to bytes so multi-byte characters before this point are
|
|
49
|
+
// accounted for correctly.
|
|
50
|
+
//
|
|
51
|
+
// match.index → char index of '<'
|
|
52
|
+
// 7 → length of '<script'
|
|
53
|
+
// attrs.length → attribute string length in chars
|
|
54
|
+
// 1 → the '>' character
|
|
55
|
+
const contentCharStart = match.index + 7 + attrs.length + 1;
|
|
56
|
+
const offsetInOriginal = Buffer.byteLength(str.slice(0, contentCharStart), 'utf8');
|
|
57
|
+
const language = detectLanguage(attrs);
|
|
58
|
+
blocks.push({
|
|
59
|
+
content: Buffer.from(innerContent, 'utf8'),
|
|
60
|
+
language,
|
|
61
|
+
offsetInOriginal,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return blocks;
|
|
65
|
+
}
|
|
66
|
+
// ─── Internals ────────────────────────────────────────────────────────────────
|
|
67
|
+
/**
|
|
68
|
+
* Determine the block language from the <script> tag attributes string.
|
|
69
|
+
* lang="ts" | lang="tsx" → 'typescript'
|
|
70
|
+
* lang="js" | (no lang) → 'javascript'
|
|
71
|
+
*/
|
|
72
|
+
function detectLanguage(attrs) {
|
|
73
|
+
const langMatch = attrs.match(/\blang=["']([^"']+)["']/i);
|
|
74
|
+
if (!langMatch)
|
|
75
|
+
return 'javascript';
|
|
76
|
+
const lang = langMatch[1].toLowerCase();
|
|
77
|
+
return lang === 'ts' || lang === 'tsx' ? 'typescript' : 'javascript';
|
|
78
|
+
}
|
|
79
|
+
function countMatches(str, re) {
|
|
80
|
+
return (str.match(re) ?? []).length;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=vue-preprocessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vue-preprocessor.js","sourceRoot":"","sources":["../../src/adapters/vue-preprocessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,iFAAiF;AAEjF;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,QAAgB;IAC1D,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEpC,6EAA6E;IAC7E,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACrD,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;QAC7B,MAAM,IAAI,UAAU,CAClB,sBAAsB,SAAS,2BAA2B,UAAU,uBAAuB,EAC3F,QAAQ,CACT,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,6EAA6E;IAC7E,oEAAoE;IACpE,oCAAoC;IACpC,MAAM,SAAS,GAAG,uCAAuC,CAAC;IAC1D,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,IAAI,KAA6B,CAAC;IAElC,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEpC,0EAA0E;QAC1E,2EAA2E;QAC3E,qEAAqE;QACrE,2BAA2B;QAC3B,EAAE;QACF,6CAA6C;QAC7C,+CAA+C;QAC/C,4DAA4D;QAC5D,6CAA6C;QAC7C,MAAM,gBAAgB,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5D,MAAM,gBAAgB,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC,CAAC;QAEnF,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAEvC,MAAM,CAAC,IAAI,CAAC;YACV,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC;YAC1C,QAAQ;YACR,gBAAgB;SACjB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,iFAAiF;AAEjF;;;;GAIG;AACH,SAAS,cAAc,CAAC,KAAa;IACnC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC1D,IAAI,CAAC,SAAS;QAAE,OAAO,YAAY,CAAC;IACpC,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,CAAC;IACzC,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC;AACvE,CAAC;AAED,SAAS,YAAY,CAAC,GAAW,EAAE,EAAU;IAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vue 3 framework adapter.
|
|
3
|
+
*
|
|
4
|
+
* Responsibilities:
|
|
5
|
+
* 1. Detect Vue projects (package.json has `vue` dep, or .vue files present).
|
|
6
|
+
* 2. Pre-process .vue SFCs into typed script blocks via vue-preprocessor.
|
|
7
|
+
* 3. Emit one `component` symbol per .vue file (name derived from filename or
|
|
8
|
+
* from an explicit `defineOptions({ name: '...' })` call).
|
|
9
|
+
* 4. Upgrade exported `useXxx` functions to kind `'composable'` via enrichMetadata.
|
|
10
|
+
*/
|
|
11
|
+
import type { FrameworkAdapter } from '../core/types.js';
|
|
12
|
+
export declare const vueAdapter: FrameworkAdapter;
|
|
13
|
+
//# sourceMappingURL=vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vue.d.ts","sourceRoot":"","sources":["../../src/adapters/vue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAsB,MAAM,kBAAkB,CAAC;AA0C7E,eAAO,MAAM,UAAU,EAAE,gBAqGxB,CAAC"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vue 3 framework adapter.
|
|
3
|
+
*
|
|
4
|
+
* Responsibilities:
|
|
5
|
+
* 1. Detect Vue projects (package.json has `vue` dep, or .vue files present).
|
|
6
|
+
* 2. Pre-process .vue SFCs into typed script blocks via vue-preprocessor.
|
|
7
|
+
* 3. Emit one `component` symbol per .vue file (name derived from filename or
|
|
8
|
+
* from an explicit `defineOptions({ name: '...' })` call).
|
|
9
|
+
* 4. Upgrade exported `useXxx` functions to kind `'composable'` via enrichMetadata.
|
|
10
|
+
*/
|
|
11
|
+
import { createHash } from 'crypto';
|
|
12
|
+
import { basename } from 'path';
|
|
13
|
+
import { readFileSync, readdirSync } from 'fs';
|
|
14
|
+
import { splitVueSFC } from './vue-preprocessor.js';
|
|
15
|
+
import { registerAdapter } from './adapter-registry.js';
|
|
16
|
+
import { logger } from '../core/logger.js';
|
|
17
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
18
|
+
function makeId(filePath, name, kind) {
|
|
19
|
+
return createHash('sha256')
|
|
20
|
+
.update(`${filePath}:${name}:${kind}`)
|
|
21
|
+
.digest('hex')
|
|
22
|
+
.slice(0, 16);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Convert kebab-case or camelCase filename stems to PascalCase.
|
|
26
|
+
* 'my-component' → 'MyComponent'
|
|
27
|
+
* 'userCard' → 'UserCard'
|
|
28
|
+
*/
|
|
29
|
+
function toPascalCase(str) {
|
|
30
|
+
return str
|
|
31
|
+
.replace(/[-_](.)/g, (_, c) => c.toUpperCase())
|
|
32
|
+
.replace(/^(.)/, (_, c) => c.toUpperCase());
|
|
33
|
+
}
|
|
34
|
+
function componentNameFromPath(filePath) {
|
|
35
|
+
return toPascalCase(basename(filePath, '.vue'));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Try to find an explicit component name from `defineOptions({ name: '...' })`.
|
|
39
|
+
* Falls back to the filename-derived PascalCase name.
|
|
40
|
+
*/
|
|
41
|
+
function resolveComponentName(source, filePath) {
|
|
42
|
+
const str = source.toString('utf8');
|
|
43
|
+
const m = str.match(/defineOptions\s*\(\s*\{[^}]*\bname\s*:\s*['"]([^'"]+)['"]/);
|
|
44
|
+
if (m)
|
|
45
|
+
return m[1];
|
|
46
|
+
return componentNameFromPath(filePath);
|
|
47
|
+
}
|
|
48
|
+
// ─── Vue adapter ──────────────────────────────────────────────────────────────
|
|
49
|
+
export const vueAdapter = {
|
|
50
|
+
name: 'vue',
|
|
51
|
+
extensions: () => ['.vue'],
|
|
52
|
+
// ── Detection ───────────────────────────────────────────────────────────────
|
|
53
|
+
async detect(projectRoot) {
|
|
54
|
+
// Primary signal: package.json declares a vue dependency
|
|
55
|
+
try {
|
|
56
|
+
const raw = readFileSync(`${projectRoot}/package.json`, 'utf8');
|
|
57
|
+
const pkg = JSON.parse(raw);
|
|
58
|
+
const deps = Object.assign({}, pkg['dependencies'], pkg['devDependencies']);
|
|
59
|
+
if (Object.keys(deps).some((k) => k === 'vue' || k.startsWith('@vue/'))) {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// No package.json or parse error — fall through to file scan
|
|
65
|
+
}
|
|
66
|
+
// Fallback: presence of .vue files in common source directories
|
|
67
|
+
const scanDirs = [projectRoot, `${projectRoot}/src`, `${projectRoot}/components`];
|
|
68
|
+
for (const dir of scanDirs) {
|
|
69
|
+
try {
|
|
70
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
71
|
+
if (entries.some((e) => e.isFile() && e.name.endsWith('.vue'))) {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Directory doesn't exist — skip
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return false;
|
|
80
|
+
},
|
|
81
|
+
// ── File routing ─────────────────────────────────────────────────────────────
|
|
82
|
+
fileFilter: (filePath) => filePath.endsWith('.vue'),
|
|
83
|
+
// ── Pre-processing ───────────────────────────────────────────────────────────
|
|
84
|
+
preProcess: splitVueSFC,
|
|
85
|
+
// ── Framework symbol extraction ──────────────────────────────────────────────
|
|
86
|
+
/**
|
|
87
|
+
* Emit one `component` symbol per .vue file.
|
|
88
|
+
* `tree` is the parsed AST of the <script> block (or null for template-only SFCs).
|
|
89
|
+
* `source` is the full original .vue file buffer.
|
|
90
|
+
*/
|
|
91
|
+
extractFrameworkSymbols(tree, source, filePath) {
|
|
92
|
+
const name = resolveComponentName(source, filePath);
|
|
93
|
+
return [
|
|
94
|
+
{
|
|
95
|
+
id: makeId(filePath, name, 'component'),
|
|
96
|
+
name,
|
|
97
|
+
kind: 'component',
|
|
98
|
+
filePath,
|
|
99
|
+
startByte: 0,
|
|
100
|
+
endByte: source.length,
|
|
101
|
+
signature: `<${name}>`,
|
|
102
|
+
summary: `Vue component ${name}`,
|
|
103
|
+
frameworkMeta: { vue_component: true },
|
|
104
|
+
},
|
|
105
|
+
];
|
|
106
|
+
},
|
|
107
|
+
// ── Metadata enrichment ──────────────────────────────────────────────────────
|
|
108
|
+
/**
|
|
109
|
+
* Upgrade exported `useXxx` functions/consts to kind `'composable'`.
|
|
110
|
+
* The id is recomputed to reflect the new kind so it remains deterministic.
|
|
111
|
+
*/
|
|
112
|
+
enrichMetadata(symbol) {
|
|
113
|
+
if ((symbol.kind === 'function' || symbol.kind === 'const') &&
|
|
114
|
+
/^use[A-Z]/.test(symbol.name)) {
|
|
115
|
+
return {
|
|
116
|
+
...symbol,
|
|
117
|
+
kind: 'composable',
|
|
118
|
+
id: makeId(symbol.filePath, symbol.name, 'composable'),
|
|
119
|
+
frameworkMeta: { ...symbol.frameworkMeta, vue_composable: true },
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
if (symbol.kind === 'component') {
|
|
123
|
+
return {
|
|
124
|
+
...symbol,
|
|
125
|
+
frameworkMeta: { ...symbol.frameworkMeta, vue_component: true },
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
return symbol;
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
// ─── Self-registration ────────────────────────────────────────────────────────
|
|
132
|
+
registerAdapter(vueAdapter);
|
|
133
|
+
logger.debug("Adapter 'vue' registered");
|
|
134
|
+
//# sourceMappingURL=vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vue.js","sourceRoot":"","sources":["../../src/adapters/vue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `purecontext-mcp config --init`
|
|
3
|
+
* Write a default config.json to ~/.purecontext/config.json.
|
|
4
|
+
* No-op if the file already exists.
|
|
5
|
+
* Prompts the user to opt in to anonymous telemetry.
|
|
6
|
+
*/
|
|
7
|
+
export declare function cmdInit(): Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* `purecontext-mcp --health`
|
|
10
|
+
* Quick self-check: Node.js version, SQLite, grammar files, config, index dir.
|
|
11
|
+
* All output goes to stdout so it is easy to grep/capture.
|
|
12
|
+
* Returns true if all checks passed (exit 0), false if any failed (exit 1).
|
|
13
|
+
*/
|
|
14
|
+
export declare function cmdHealth(write?: (line: string) => void): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* `purecontext-mcp config --check`
|
|
17
|
+
* Validate the current config and verify prerequisites (grammars, SQLite).
|
|
18
|
+
* Returns true if all checks pass.
|
|
19
|
+
*/
|
|
20
|
+
export declare function cmdCheck(): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* `purecontext-mcp config`
|
|
23
|
+
* Print the effective configuration (defaults merged with config.json) as JSON.
|
|
24
|
+
*/
|
|
25
|
+
export declare function cmdShow(): void;
|
|
26
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/config/cli.ts"],"names":[],"mappings":"AAmEA;;;;;GAKG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CA8B7C;AA8BD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAA4C,GAAG,OAAO,CA8ExG;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,IAAI,OAAO,CAoElC;AAED;;;GAGG;AACH,wBAAgB,OAAO,IAAI,IAAI,CAG9B"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { writeFileSync, existsSync, mkdirSync, readFileSync, readdirSync } from 'fs';
|
|
2
|
+
import { dirname, join } from 'path';
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
import { createInterface } from 'readline';
|
|
5
|
+
import { getConfigPath, validateConfig } from './config-schema.js';
|
|
6
|
+
import { loadConfig } from './config-loader.js';
|
|
7
|
+
import { GRAMMARS_DIR } from '../core/parse-dispatcher.js';
|
|
8
|
+
import { openInMemoryDatabase } from '../core/db/schema.js';
|
|
9
|
+
import { VERSION } from '../version.js';
|
|
10
|
+
// ─── Default config template (JSON with explanatory comments) ─────────────────
|
|
11
|
+
const defaultIndexDir = join(homedir(), '.purecontext', 'indexes').replace(/\\/g, '/');
|
|
12
|
+
const CONFIG_TEMPLATE = `{
|
|
13
|
+
// Directory where SQLite index files are stored.
|
|
14
|
+
// Default: ~/.purecontext/indexes/
|
|
15
|
+
"indexDir": "${defaultIndexDir}",
|
|
16
|
+
|
|
17
|
+
// Maximum number of source files to index per project.
|
|
18
|
+
// Set to 0 for unlimited. Raise for large monorepos (e.g. 50000).
|
|
19
|
+
"fileLimit": 10000,
|
|
20
|
+
|
|
21
|
+
// Worker threads for parallel file parsing.
|
|
22
|
+
// Default: number of CPU cores, up to 8. Set to 1 to disable parallelism.
|
|
23
|
+
"concurrency": 4,
|
|
24
|
+
|
|
25
|
+
// Maximum file size in bytes to index. Files larger than this are skipped silently.
|
|
26
|
+
// Default: 524288 (512 KB). Raise if you have large generated files you want indexed.
|
|
27
|
+
"maxFileSizeBytes": 524288,
|
|
28
|
+
|
|
29
|
+
// Debounce window in milliseconds for the file watcher.
|
|
30
|
+
"watchDebounceMs": 2000,
|
|
31
|
+
|
|
32
|
+
// Additional glob patterns to exclude from indexing.
|
|
33
|
+
// Example: ["**/*.generated.ts", "src/vendor/**"]
|
|
34
|
+
"excludePatterns": [],
|
|
35
|
+
|
|
36
|
+
// Framework adapter activation.
|
|
37
|
+
// "auto" — detect from project config files (recommended)
|
|
38
|
+
// "none" — disable all adapters
|
|
39
|
+
// ["vue"] — explicit list
|
|
40
|
+
"adapters": "auto",
|
|
41
|
+
|
|
42
|
+
// AI summarization (Phase 2 feature — keep provider "none" for Phase 1).
|
|
43
|
+
"ai": {
|
|
44
|
+
"provider": "none",
|
|
45
|
+
"allowRemoteAI": false
|
|
46
|
+
},
|
|
47
|
+
|
|
48
|
+
// Transport mode.
|
|
49
|
+
// "stdio" — stdin/stdout (default; required for Claude Code)
|
|
50
|
+
// "http" — HTTP + Streamable HTTP (for web clients)
|
|
51
|
+
// "both" — stdio AND HTTP simultaneously
|
|
52
|
+
"transport": "stdio",
|
|
53
|
+
|
|
54
|
+
// HTTP server settings (used when transport is "http" or "both").
|
|
55
|
+
"http": {
|
|
56
|
+
"port": 3000,
|
|
57
|
+
"host": "127.0.0.1",
|
|
58
|
+
"corsOrigins": ["http://localhost:*"]
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
`;
|
|
62
|
+
// ─── Public commands ──────────────────────────────────────────────────────────
|
|
63
|
+
/**
|
|
64
|
+
* `purecontext-mcp config --init`
|
|
65
|
+
* Write a default config.json to ~/.purecontext/config.json.
|
|
66
|
+
* No-op if the file already exists.
|
|
67
|
+
* Prompts the user to opt in to anonymous telemetry.
|
|
68
|
+
*/
|
|
69
|
+
export async function cmdInit() {
|
|
70
|
+
const path = getConfigPath();
|
|
71
|
+
if (existsSync(path)) {
|
|
72
|
+
console.log(`Config already exists at ${path}`);
|
|
73
|
+
console.log('Delete it first if you want to regenerate defaults.');
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
77
|
+
writeFileSync(path, CONFIG_TEMPLATE, 'utf8');
|
|
78
|
+
console.log(`Created config at ${path}`);
|
|
79
|
+
// ── Telemetry opt-in prompt ────────────────────────────────────────────────
|
|
80
|
+
const telemetryEnabled = await promptTelemetryOptIn();
|
|
81
|
+
// Append the telemetry section to the written config
|
|
82
|
+
try {
|
|
83
|
+
const existing = JSON.parse(readFileSync(path, 'utf8'));
|
|
84
|
+
existing.telemetry = { enabled: telemetryEnabled };
|
|
85
|
+
writeFileSync(path, JSON.stringify(existing, null, 2) + '\n', 'utf8');
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// Non-fatal: if the append fails, telemetry defaults to disabled
|
|
89
|
+
}
|
|
90
|
+
if (telemetryEnabled) {
|
|
91
|
+
console.log('Telemetry enabled. Thank you! You can disable it anytime by setting telemetry.enabled to false.');
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
console.log('Telemetry disabled. You can enable it anytime by setting telemetry.enabled to true in the config.');
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Prompt the user to opt in to anonymous telemetry.
|
|
99
|
+
* Returns true if user answered 'y', false otherwise.
|
|
100
|
+
* Only shown interactively (stdin is a TTY).
|
|
101
|
+
*/
|
|
102
|
+
async function promptTelemetryOptIn() {
|
|
103
|
+
// Skip prompt when running non-interactively (e.g. in CI or piped input)
|
|
104
|
+
if (!process.stdin.isTTY)
|
|
105
|
+
return false;
|
|
106
|
+
process.stdout.write('\nHelp improve PureContext by sharing anonymous usage stats?\n' +
|
|
107
|
+
'This sends only aggregate counts (languages used, file counts, timing).\n' +
|
|
108
|
+
'No code, file names, or personal data is ever collected.\n' +
|
|
109
|
+
'See docs/TELEMETRY.md for the full list of what is sent.\n\n' +
|
|
110
|
+
'Enable telemetry? (y/N): ');
|
|
111
|
+
return new Promise((resolve) => {
|
|
112
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
113
|
+
rl.once('line', (answer) => {
|
|
114
|
+
rl.close();
|
|
115
|
+
resolve(answer.trim().toLowerCase() === 'y');
|
|
116
|
+
});
|
|
117
|
+
// If stdin closes without input, default to false
|
|
118
|
+
rl.once('close', () => resolve(false));
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* `purecontext-mcp --health`
|
|
123
|
+
* Quick self-check: Node.js version, SQLite, grammar files, config, index dir.
|
|
124
|
+
* All output goes to stdout so it is easy to grep/capture.
|
|
125
|
+
* Returns true if all checks passed (exit 0), false if any failed (exit 1).
|
|
126
|
+
*/
|
|
127
|
+
export function cmdHealth(write = (l) => process.stdout.write(l + '\n')) {
|
|
128
|
+
const failures = [];
|
|
129
|
+
// ── Version header ───────────────────────────────────────────────────────
|
|
130
|
+
write(`purecontext-mcp v${VERSION}`);
|
|
131
|
+
// ── Node.js version ──────────────────────────────────────────────────────
|
|
132
|
+
const nodeVersion = process.version.replace(/^v/, '');
|
|
133
|
+
const [nodeMajor] = nodeVersion.split('.').map(Number);
|
|
134
|
+
if (nodeMajor >= 18) {
|
|
135
|
+
write(`✓ Node.js ${nodeVersion} (supported)`);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
write(`✗ Node.js ${nodeVersion} (unsupported — requires >= 18.0.0)`);
|
|
139
|
+
failures.push('node');
|
|
140
|
+
}
|
|
141
|
+
// ── SQLite / better-sqlite3 ──────────────────────────────────────────────
|
|
142
|
+
try {
|
|
143
|
+
const db = openInMemoryDatabase();
|
|
144
|
+
db.prepare('SELECT 1').get();
|
|
145
|
+
db.close();
|
|
146
|
+
write('✓ better-sqlite3 loaded (prebuilt binary)');
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
write('✗ better-sqlite3 failed to load — try: npm rebuild better-sqlite3');
|
|
150
|
+
failures.push('sqlite');
|
|
151
|
+
}
|
|
152
|
+
// ── Grammar WASM files ────────────────────────────────────────────────────
|
|
153
|
+
try {
|
|
154
|
+
const wasmFiles = readdirSync(GRAMMARS_DIR).filter((f) => f.endsWith('.wasm'));
|
|
155
|
+
if (wasmFiles.length > 0) {
|
|
156
|
+
write(`✓ Grammars: ${wasmFiles.length} languages available`);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
write('✗ Grammars: no grammar files found — try: npm install -g purecontext-mcp@latest');
|
|
160
|
+
failures.push('grammars');
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
write('✗ Grammars: grammar directory not found — try: npm install -g purecontext-mcp@latest');
|
|
165
|
+
failures.push('grammars');
|
|
166
|
+
}
|
|
167
|
+
// ── Config file ──────────────────────────────────────────────────────────
|
|
168
|
+
const configPath = getConfigPath();
|
|
169
|
+
if (!existsSync(configPath)) {
|
|
170
|
+
write('✓ Config: defaults in use (no config.json found)');
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
try {
|
|
174
|
+
const raw = JSON.parse(readFileSync(configPath, 'utf8'));
|
|
175
|
+
const { valid, errors } = validateConfig(raw);
|
|
176
|
+
if (valid) {
|
|
177
|
+
write(`✓ Config: ${configPath} (valid)`);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
write(`✗ Config: ${configPath} (${errors.length} error(s) — run 'purecontext-mcp config --check')`);
|
|
181
|
+
failures.push('config');
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
write(`✗ Config: ${configPath} (parse error — run 'purecontext-mcp config --check')`);
|
|
186
|
+
failures.push('config');
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// ── Index directory ───────────────────────────────────────────────────────
|
|
190
|
+
const cfg = loadConfig();
|
|
191
|
+
const indexDir = cfg.indexDir;
|
|
192
|
+
if (!existsSync(indexDir)) {
|
|
193
|
+
write(`✓ Index dir: ${indexDir} (not yet created — will be on first index)`);
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
try {
|
|
197
|
+
const dbFiles = readdirSync(indexDir).filter((f) => f.endsWith('.db'));
|
|
198
|
+
const repoCount = dbFiles.length;
|
|
199
|
+
write(`✓ Index dir: ${indexDir} (exists, ${repoCount} repo${repoCount === 1 ? '' : 's'} indexed)`);
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
write(`✗ Index dir: ${indexDir} (read error)`);
|
|
203
|
+
failures.push('index-dir');
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return failures.length === 0;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* `purecontext-mcp config --check`
|
|
210
|
+
* Validate the current config and verify prerequisites (grammars, SQLite).
|
|
211
|
+
* Returns true if all checks pass.
|
|
212
|
+
*/
|
|
213
|
+
export function cmdCheck() {
|
|
214
|
+
// Show the quick health summary as a preamble
|
|
215
|
+
const healthOk = cmdHealth();
|
|
216
|
+
process.stdout.write('\n');
|
|
217
|
+
const path = getConfigPath();
|
|
218
|
+
const issues = [];
|
|
219
|
+
const passing = [];
|
|
220
|
+
// ── Config file ──────────────────────────────────────────────────────────
|
|
221
|
+
if (!existsSync(path)) {
|
|
222
|
+
passing.push('No config file — defaults in use');
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
try {
|
|
226
|
+
const raw = JSON.parse(readFileSync(path, 'utf8'));
|
|
227
|
+
const { valid, errors } = validateConfig(raw);
|
|
228
|
+
if (valid) {
|
|
229
|
+
passing.push(`Config file valid: ${path}`);
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
for (const e of errors)
|
|
233
|
+
issues.push(`Config: ${e}`);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
catch (err) {
|
|
237
|
+
issues.push(`Config parse error: ${err}`);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// ── Grammar WASM files ────────────────────────────────────────────────────
|
|
241
|
+
const grammars = [
|
|
242
|
+
'tree-sitter-typescript.wasm',
|
|
243
|
+
'tree-sitter-tsx.wasm',
|
|
244
|
+
'tree-sitter-javascript.wasm',
|
|
245
|
+
];
|
|
246
|
+
for (const g of grammars) {
|
|
247
|
+
const gPath = join(GRAMMARS_DIR, g);
|
|
248
|
+
if (existsSync(gPath)) {
|
|
249
|
+
passing.push(`Grammar present: ${g}`);
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
issues.push(`Grammar missing: ${gPath}`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
// ── SQLite sanity check ───────────────────────────────────────────────────
|
|
256
|
+
try {
|
|
257
|
+
const db = openInMemoryDatabase();
|
|
258
|
+
db.prepare('SELECT 1').get();
|
|
259
|
+
db.close();
|
|
260
|
+
passing.push('SQLite working');
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
issues.push(`SQLite error: ${err}`);
|
|
264
|
+
}
|
|
265
|
+
// ── Effective settings ────────────────────────────────────────────────────
|
|
266
|
+
const cfg = loadConfig();
|
|
267
|
+
passing.push(`Index directory: ${cfg.indexDir}`);
|
|
268
|
+
passing.push(`File limit: ${cfg.fileLimit}`);
|
|
269
|
+
passing.push(`Watch debounce: ${cfg.watchDebounceMs}ms`);
|
|
270
|
+
// ── Report ────────────────────────────────────────────────────────────────
|
|
271
|
+
for (const msg of passing)
|
|
272
|
+
console.log(` ✓ ${msg}`);
|
|
273
|
+
for (const msg of issues)
|
|
274
|
+
console.error(` ✗ ${msg}`);
|
|
275
|
+
if (issues.length === 0 && healthOk) {
|
|
276
|
+
console.log('\nAll checks passed.');
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
console.error(`\n${issues.length + (healthOk ? 0 : 1)} check(s) failed.`);
|
|
280
|
+
}
|
|
281
|
+
return issues.length === 0 && healthOk;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* `purecontext-mcp config`
|
|
285
|
+
* Print the effective configuration (defaults merged with config.json) as JSON.
|
|
286
|
+
*/
|
|
287
|
+
export function cmdShow() {
|
|
288
|
+
const cfg = loadConfig();
|
|
289
|
+
console.log(JSON.stringify(cfg, null, 2));
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/config/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type PureContextConfig } from './config-schema.js';
|
|
2
|
+
/**
|
|
3
|
+
* Return the effective configuration.
|
|
4
|
+
*
|
|
5
|
+
* Resolution order (later values win):
|
|
6
|
+
* 1. Built-in defaults
|
|
7
|
+
* 2. `~/.purecontext/config.json` (if it exists)
|
|
8
|
+
*
|
|
9
|
+
* Result is cached after the first call. Call `reloadConfig()` to refresh.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getConfig(): PureContextConfig;
|
|
12
|
+
/**
|
|
13
|
+
* Clear the cached config so the next `getConfig()` call re-reads from disk.
|
|
14
|
+
*/
|
|
15
|
+
export declare function reloadConfig(): void;
|
|
16
|
+
/**
|
|
17
|
+
* Load and merge config without caching. Useful for `config --check`.
|
|
18
|
+
*/
|
|
19
|
+
export declare function loadConfig(configPath?: string): PureContextConfig;
|
|
20
|
+
/**
|
|
21
|
+
* Resolve `'${ENV_VAR}'` notation in a string value.
|
|
22
|
+
* Returns the environment variable value, or the original string if it doesn't
|
|
23
|
+
* match the notation, or an empty string if the variable is unset.
|
|
24
|
+
*/
|
|
25
|
+
export declare function resolveEnvVar(value: string): string;
|
|
26
|
+
//# sourceMappingURL=config-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/config/config-loader.ts"],"names":[],"mappings":"AAKA,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAQ5B;;;;;;;;GAQG;AACH,wBAAgB,SAAS,IAAI,iBAAiB,CAI7C;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,iBAAiB,CA6BjE;AAID;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQnD"}
|